@namzu/sdk 46.0.0 → 48.1.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 (768) hide show
  1. package/CHANGELOG.md +351 -8
  2. package/README.md +7 -8
  3. package/dist/advisory/history.d.ts.map +1 -1
  4. package/dist/advisory/history.js +21 -1
  5. package/dist/advisory/history.js.map +1 -1
  6. package/dist/advisory/index.d.ts +1 -1
  7. package/dist/advisory/index.d.ts.map +1 -1
  8. package/dist/advisory/index.js +1 -1
  9. package/dist/advisory/index.js.map +1 -1
  10. package/dist/advisory/registry.d.ts +17 -0
  11. package/dist/advisory/registry.d.ts.map +1 -1
  12. package/dist/advisory/registry.js +26 -0
  13. package/dist/advisory/registry.js.map +1 -1
  14. package/dist/agents/PipelineAgent.d.ts +2 -46
  15. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  16. package/dist/agents/PipelineAgent.js +2 -242
  17. package/dist/agents/PipelineAgent.js.map +1 -1
  18. package/dist/agents/QueryAgent.d.ts +21 -0
  19. package/dist/agents/QueryAgent.d.ts.map +1 -0
  20. package/dist/agents/QueryAgent.js +214 -0
  21. package/dist/agents/QueryAgent.js.map +1 -0
  22. package/dist/agents/ReactiveAgent.d.ts +4 -16
  23. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  24. package/dist/agents/ReactiveAgent.js +4 -183
  25. package/dist/agents/ReactiveAgent.js.map +1 -1
  26. package/dist/agents/RouterAgent.d.ts +2 -20
  27. package/dist/agents/RouterAgent.d.ts.map +1 -1
  28. package/dist/agents/RouterAgent.js +2 -266
  29. package/dist/agents/RouterAgent.js.map +1 -1
  30. package/dist/agents/SupervisorAgent.d.ts +3 -43
  31. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  32. package/dist/agents/SupervisorAgent.js +3 -418
  33. package/dist/agents/SupervisorAgent.js.map +1 -1
  34. package/dist/agents/defineAgent.d.ts +2 -1
  35. package/dist/agents/defineAgent.d.ts.map +1 -1
  36. package/dist/agents/defineAgent.js +6 -1
  37. package/dist/agents/defineAgent.js.map +1 -1
  38. package/dist/agents/examples/PipelineAgent.d.ts +46 -0
  39. package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
  40. package/dist/agents/examples/PipelineAgent.js +242 -0
  41. package/dist/agents/examples/PipelineAgent.js.map +1 -0
  42. package/dist/agents/examples/RouterAgent.d.ts +22 -0
  43. package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
  44. package/dist/agents/examples/RouterAgent.js +268 -0
  45. package/dist/agents/examples/RouterAgent.js.map +1 -0
  46. package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
  47. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
  48. package/dist/agents/examples/SupervisorAgent.js +406 -0
  49. package/dist/agents/examples/SupervisorAgent.js.map +1 -0
  50. package/dist/agents/explore.d.ts +6 -3
  51. package/dist/agents/explore.d.ts.map +1 -1
  52. package/dist/agents/explore.js +6 -3
  53. package/dist/agents/explore.js.map +1 -1
  54. package/dist/agents/forward-options.d.ts +11 -0
  55. package/dist/agents/forward-options.d.ts.map +1 -0
  56. package/dist/agents/forward-options.js +15 -0
  57. package/dist/agents/forward-options.js.map +1 -0
  58. package/dist/agents/index.d.ts +1 -0
  59. package/dist/agents/index.d.ts.map +1 -1
  60. package/dist/agents/index.js +2 -0
  61. package/dist/agents/index.js.map +1 -1
  62. package/dist/agents/runAgent.d.ts +19 -8
  63. package/dist/agents/runAgent.d.ts.map +1 -1
  64. package/dist/agents/runAgent.js +99 -29
  65. package/dist/agents/runAgent.js.map +1 -1
  66. package/dist/authorization/command-line.d.ts +2 -0
  67. package/dist/authorization/command-line.d.ts.map +1 -1
  68. package/dist/authorization/command-line.js +2 -2
  69. package/dist/authorization/command-line.js.map +1 -1
  70. package/dist/authorization/gate.d.ts +8 -0
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +12 -1
  73. package/dist/authorization/gate.js.map +1 -1
  74. package/dist/authorization/program.d.ts +151 -0
  75. package/dist/authorization/program.d.ts.map +1 -0
  76. package/dist/authorization/program.js +713 -0
  77. package/dist/authorization/program.js.map +1 -0
  78. package/dist/authorization/reexec-wrapper.d.ts +106 -0
  79. package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
  80. package/dist/authorization/reexec-wrapper.js +532 -0
  81. package/dist/authorization/reexec-wrapper.js.map +1 -0
  82. package/dist/authorization/rules.d.ts +9 -0
  83. package/dist/authorization/rules.d.ts.map +1 -1
  84. package/dist/authorization/rules.js +8 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +19 -4
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +91 -65
  89. package/dist/authorization/shell-lexer.js.map +1 -1
  90. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  91. package/dist/bridge/sse/mapper.js +6 -0
  92. package/dist/bridge/sse/mapper.js.map +1 -1
  93. package/dist/capabilities/index.d.ts +54 -0
  94. package/dist/capabilities/index.d.ts.map +1 -0
  95. package/dist/capabilities/index.js +92 -0
  96. package/dist/capabilities/index.js.map +1 -0
  97. package/dist/config/registry.d.ts +2 -1
  98. package/dist/config/registry.d.ts.map +1 -1
  99. package/dist/config/registry.js +3 -2
  100. package/dist/config/registry.js.map +1 -1
  101. package/dist/connector/index.d.ts +4 -4
  102. package/dist/connector/index.d.ts.map +1 -1
  103. package/dist/connector/index.js +3 -3
  104. package/dist/connector/index.js.map +1 -1
  105. package/dist/connector/mcp/adapter.d.ts +16 -1
  106. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  107. package/dist/connector/mcp/adapter.js +71 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +32 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +383 -5
  112. package/dist/connector/mcp/client.js.map +1 -1
  113. package/dist/connector/mcp/discovery.d.ts +24 -1
  114. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  115. package/dist/connector/mcp/discovery.js +44 -0
  116. package/dist/connector/mcp/discovery.js.map +1 -1
  117. package/dist/connector/mcp/era.d.ts.map +1 -1
  118. package/dist/connector/mcp/era.js +7 -0
  119. package/dist/connector/mcp/era.js.map +1 -1
  120. package/dist/connector/mcp/index.d.ts +2 -0
  121. package/dist/connector/mcp/index.d.ts.map +1 -1
  122. package/dist/connector/mcp/index.js +11 -0
  123. package/dist/connector/mcp/index.js.map +1 -1
  124. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  125. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  126. package/dist/connector/mcp/mcp-toolset.js +399 -0
  127. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  128. package/dist/connector/mcp/streamable-http.d.ts +15 -0
  129. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  130. package/dist/connector/mcp/streamable-http.js +281 -6
  131. package/dist/connector/mcp/streamable-http.js.map +1 -1
  132. package/dist/connector/tools/index.d.ts +2 -2
  133. package/dist/connector/tools/index.d.ts.map +1 -1
  134. package/dist/connector/tools/index.js +1 -1
  135. package/dist/connector/tools/index.js.map +1 -1
  136. package/dist/connector/tools/router.d.ts +15 -13
  137. package/dist/connector/tools/router.d.ts.map +1 -1
  138. package/dist/connector/tools/router.js +30 -51
  139. package/dist/connector/tools/router.js.map +1 -1
  140. package/dist/contracts/a2a.d.ts +2 -2
  141. package/dist/directory/derive-supervisor.d.ts +2 -2
  142. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  143. package/dist/directory/derive-supervisor.js +6 -7
  144. package/dist/directory/derive-supervisor.js.map +1 -1
  145. package/dist/directory/derive.d.ts.map +1 -1
  146. package/dist/directory/derive.js +5 -5
  147. package/dist/directory/derive.js.map +1 -1
  148. package/dist/execution/code-runtime/types.d.ts +2 -2
  149. package/dist/execution/code-runtime/types.js +1 -1
  150. package/dist/invariants/index.d.ts +2 -1
  151. package/dist/invariants/index.d.ts.map +1 -1
  152. package/dist/invariants/index.js +3 -2
  153. package/dist/invariants/index.js.map +1 -1
  154. package/dist/manager/agent/lifecycle.d.ts +1 -0
  155. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  156. package/dist/manager/agent/lifecycle.js +146 -18
  157. package/dist/manager/agent/lifecycle.js.map +1 -1
  158. package/dist/manager/connector/environment.d.ts +6 -0
  159. package/dist/manager/connector/environment.d.ts.map +1 -1
  160. package/dist/manager/connector/environment.js +11 -4
  161. package/dist/manager/connector/environment.js.map +1 -1
  162. package/dist/manager/connector/index.d.ts +2 -2
  163. package/dist/manager/connector/index.d.ts.map +1 -1
  164. package/dist/manager/connector/index.js +2 -2
  165. package/dist/manager/connector/index.js.map +1 -1
  166. package/dist/manager/connector/tenant.d.ts +6 -0
  167. package/dist/manager/connector/tenant.d.ts.map +1 -1
  168. package/dist/manager/connector/tenant.js +11 -4
  169. package/dist/manager/connector/tenant.js.map +1 -1
  170. package/dist/manager/index.d.ts +2 -2
  171. package/dist/manager/index.d.ts.map +1 -1
  172. package/dist/manager/index.js +2 -2
  173. package/dist/manager/index.js.map +1 -1
  174. package/dist/manager/resident/initiative.d.ts +6 -6
  175. package/dist/manager/resident/learning-observation.d.ts +4 -4
  176. package/dist/manager/resident/learning.d.ts +36 -36
  177. package/dist/manager/resident/outbox.d.ts +4 -4
  178. package/dist/manager/session/attribution.d.ts +22 -0
  179. package/dist/manager/session/attribution.d.ts.map +1 -0
  180. package/dist/manager/session/attribution.js +64 -0
  181. package/dist/manager/session/attribution.js.map +1 -0
  182. package/dist/manager/session/turn-recorder.d.ts +14 -0
  183. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  184. package/dist/manager/session/turn-recorder.js +208 -55
  185. package/dist/manager/session/turn-recorder.js.map +1 -1
  186. package/dist/peers/address.d.ts +36 -0
  187. package/dist/peers/address.d.ts.map +1 -0
  188. package/dist/peers/address.js +52 -0
  189. package/dist/peers/address.js.map +1 -0
  190. package/dist/peers/client.d.ts +47 -0
  191. package/dist/peers/client.d.ts.map +1 -0
  192. package/dist/peers/client.js +132 -0
  193. package/dist/peers/client.js.map +1 -0
  194. package/dist/peers/dir.d.ts +88 -0
  195. package/dist/peers/dir.d.ts.map +1 -0
  196. package/dist/peers/dir.js +139 -0
  197. package/dist/peers/dir.js.map +1 -0
  198. package/dist/peers/endpoint.d.ts +144 -0
  199. package/dist/peers/endpoint.d.ts.map +1 -0
  200. package/dist/peers/endpoint.js +420 -0
  201. package/dist/peers/endpoint.js.map +1 -0
  202. package/dist/peers/envelope.d.ts +42 -0
  203. package/dist/peers/envelope.d.ts.map +1 -0
  204. package/dist/peers/envelope.js +110 -0
  205. package/dist/peers/envelope.js.map +1 -0
  206. package/dist/peers/index.d.ts +30 -0
  207. package/dist/peers/index.d.ts.map +1 -0
  208. package/dist/peers/index.js +22 -0
  209. package/dist/peers/index.js.map +1 -0
  210. package/dist/peers/protocol.d.ts +645 -0
  211. package/dist/peers/protocol.d.ts.map +1 -0
  212. package/dist/peers/protocol.js +151 -0
  213. package/dist/peers/protocol.js.map +1 -0
  214. package/dist/peers/record.d.ts +71 -0
  215. package/dist/peers/record.d.ts.map +1 -0
  216. package/dist/peers/record.js +45 -0
  217. package/dist/peers/record.js.map +1 -0
  218. package/dist/peers/registry.d.ts +54 -0
  219. package/dist/peers/registry.d.ts.map +1 -0
  220. package/dist/peers/registry.js +213 -0
  221. package/dist/peers/registry.js.map +1 -0
  222. package/dist/plugin/define.d.ts +24 -0
  223. package/dist/plugin/define.d.ts.map +1 -0
  224. package/dist/plugin/define.js +42 -0
  225. package/dist/plugin/define.js.map +1 -0
  226. package/dist/plugin/index.d.ts +2 -0
  227. package/dist/plugin/index.d.ts.map +1 -1
  228. package/dist/plugin/index.js +1 -0
  229. package/dist/plugin/index.js.map +1 -1
  230. package/dist/plugin/lifecycle.d.ts +27 -3
  231. package/dist/plugin/lifecycle.d.ts.map +1 -1
  232. package/dist/plugin/lifecycle.js +242 -92
  233. package/dist/plugin/lifecycle.js.map +1 -1
  234. package/dist/plugin/resolver.d.ts +2 -2
  235. package/dist/plugin/resolver.d.ts.map +1 -1
  236. package/dist/plugin/resolver.js.map +1 -1
  237. package/dist/plugin/shell-hook.d.ts.map +1 -1
  238. package/dist/plugin/shell-hook.js +17 -3
  239. package/dist/plugin/shell-hook.js.map +1 -1
  240. package/dist/probe/errors.d.ts +2 -1
  241. package/dist/probe/errors.d.ts.map +1 -1
  242. package/dist/probe/errors.js +3 -2
  243. package/dist/probe/errors.js.map +1 -1
  244. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  245. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  246. package/dist/prompt/coding-agent-doctrine.js +11 -6
  247. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  248. package/dist/prompt/contributions.d.ts +4 -1
  249. package/dist/prompt/contributions.d.ts.map +1 -1
  250. package/dist/prompt/contributions.js +7 -2
  251. package/dist/prompt/contributions.js.map +1 -1
  252. package/dist/prompt/index.d.ts +1 -1
  253. package/dist/prompt/index.d.ts.map +1 -1
  254. package/dist/prompt/index.js +1 -1
  255. package/dist/prompt/index.js.map +1 -1
  256. package/dist/provider/collect-chat-completion.d.ts +6 -1
  257. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  258. package/dist/provider/collect-chat-completion.js +88 -10
  259. package/dist/provider/collect-chat-completion.js.map +1 -1
  260. package/dist/provider/mock.d.ts.map +1 -1
  261. package/dist/provider/mock.js +23 -6
  262. package/dist/provider/mock.js.map +1 -1
  263. package/dist/provider/registry.d.ts +2 -1
  264. package/dist/provider/registry.d.ts.map +1 -1
  265. package/dist/provider/registry.js +3 -2
  266. package/dist/provider/registry.js.map +1 -1
  267. package/dist/provider/tool-call-framing.d.ts +164 -0
  268. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  269. package/dist/provider/tool-call-framing.js +163 -0
  270. package/dist/provider/tool-call-framing.js.map +1 -0
  271. package/dist/public-runtime.d.ts +24 -11
  272. package/dist/public-runtime.d.ts.map +1 -1
  273. package/dist/public-runtime.js +45 -9
  274. package/dist/public-runtime.js.map +1 -1
  275. package/dist/public-tools.d.ts +6 -4
  276. package/dist/public-tools.d.ts.map +1 -1
  277. package/dist/public-tools.js +8 -3
  278. package/dist/public-tools.js.map +1 -1
  279. package/dist/public-types.d.ts +13 -2
  280. package/dist/public-types.d.ts.map +1 -1
  281. package/dist/read-model/registry.d.ts +2 -1
  282. package/dist/read-model/registry.d.ts.map +1 -1
  283. package/dist/read-model/registry.js +3 -2
  284. package/dist/read-model/registry.js.map +1 -1
  285. package/dist/registry/ManagedRegistry.d.ts +30 -0
  286. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  287. package/dist/registry/ManagedRegistry.js +45 -6
  288. package/dist/registry/ManagedRegistry.js.map +1 -1
  289. package/dist/registry/collision.d.ts +57 -0
  290. package/dist/registry/collision.d.ts.map +1 -0
  291. package/dist/registry/collision.js +41 -0
  292. package/dist/registry/collision.js.map +1 -0
  293. package/dist/registry/command/index.d.ts +5 -3
  294. package/dist/registry/command/index.d.ts.map +1 -1
  295. package/dist/registry/command/index.js +6 -4
  296. package/dist/registry/command/index.js.map +1 -1
  297. package/dist/registry/index.d.ts +3 -4
  298. package/dist/registry/index.d.ts.map +1 -1
  299. package/dist/registry/index.js +2 -2
  300. package/dist/registry/index.js.map +1 -1
  301. package/dist/registry/plugin/index.d.ts.map +1 -1
  302. package/dist/registry/plugin/index.js +14 -1
  303. package/dist/registry/plugin/index.js.map +1 -1
  304. package/dist/registry/tool/callable.d.ts +7 -7
  305. package/dist/registry/tool/callable.d.ts.map +1 -1
  306. package/dist/registry/tool/callable.js +6 -7
  307. package/dist/registry/tool/callable.js.map +1 -1
  308. package/dist/registry/tool/execute.d.ts +14 -77
  309. package/dist/registry/tool/execute.d.ts.map +1 -1
  310. package/dist/registry/tool/execute.js +15 -727
  311. package/dist/registry/tool/execute.js.map +1 -1
  312. package/dist/registry/tool/portable.d.ts +25 -0
  313. package/dist/registry/tool/portable.d.ts.map +1 -1
  314. package/dist/registry/tool/portable.js +50 -0
  315. package/dist/registry/tool/portable.js.map +1 -1
  316. package/dist/registry/tool/presentation.d.ts +6 -5
  317. package/dist/registry/tool/presentation.d.ts.map +1 -1
  318. package/dist/registry/tool/presentation.js +3 -3
  319. package/dist/registry/tool/presentation.js.map +1 -1
  320. package/dist/runtime/bidi/session.d.ts +5 -4
  321. package/dist/runtime/bidi/session.d.ts.map +1 -1
  322. package/dist/runtime/bidi/session.js +18 -1
  323. package/dist/runtime/bidi/session.js.map +1 -1
  324. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  325. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  326. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  327. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  328. package/dist/runtime/query/executor.d.ts +33 -3
  329. package/dist/runtime/query/executor.d.ts.map +1 -1
  330. package/dist/runtime/query/executor.js +86 -10
  331. package/dist/runtime/query/executor.js.map +1 -1
  332. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  333. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  334. package/dist/runtime/query/file-evidence-replay.js +8 -7
  335. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  336. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  337. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  338. package/dist/runtime/query/fork/prepare.js +4 -0
  339. package/dist/runtime/query/fork/prepare.js.map +1 -1
  340. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  341. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  342. package/dist/runtime/query/guardrail-presets.js +4 -3
  343. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  344. package/dist/runtime/query/index.d.ts +23 -10
  345. package/dist/runtime/query/index.d.ts.map +1 -1
  346. package/dist/runtime/query/index.js +149 -70
  347. package/dist/runtime/query/index.js.map +1 -1
  348. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/index.js +8 -1
  350. package/dist/runtime/query/iteration/index.js.map +1 -1
  351. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  352. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  353. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  354. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  355. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  356. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  357. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  358. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  359. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  360. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  361. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  362. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  363. package/dist/runtime/query/iteration/tool-input.js +291 -0
  364. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  365. package/dist/runtime/query/observation-context.d.ts +2 -2
  366. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  367. package/dist/runtime/query/observation-context.js.map +1 -1
  368. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  369. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  370. package/dist/runtime/query/prelude-lease.js +121 -0
  371. package/dist/runtime/query/prelude-lease.js.map +1 -0
  372. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  373. package/dist/runtime/query/prepare-turn.js +386 -187
  374. package/dist/runtime/query/prepare-turn.js.map +1 -1
  375. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  376. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  377. package/dist/runtime/query/prompt.d.ts +2 -2
  378. package/dist/runtime/query/prompt.d.ts.map +1 -1
  379. package/dist/runtime/query/prompt.js +1 -1
  380. package/dist/runtime/query/prompt.js.map +1 -1
  381. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  382. package/dist/runtime/query/resume-session.js +37 -2
  383. package/dist/runtime/query/resume-session.js.map +1 -1
  384. package/dist/runtime/query/review-policy.d.ts +22 -3
  385. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  386. package/dist/runtime/query/review-policy.js +84 -6
  387. package/dist/runtime/query/review-policy.js.map +1 -1
  388. package/dist/runtime/query/tooling.d.ts +3 -2
  389. package/dist/runtime/query/tooling.d.ts.map +1 -1
  390. package/dist/runtime/query/tooling.js.map +1 -1
  391. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  392. package/dist/runtime/query/turn-state.js +5 -0
  393. package/dist/runtime/query/turn-state.js.map +1 -1
  394. package/dist/runtime/system-events.d.ts +112 -0
  395. package/dist/runtime/system-events.d.ts.map +1 -0
  396. package/dist/runtime/system-events.js +183 -0
  397. package/dist/runtime/system-events.js.map +1 -0
  398. package/dist/scheduler/delegating.d.ts +2 -1
  399. package/dist/scheduler/delegating.d.ts.map +1 -1
  400. package/dist/scheduler/delegating.js +3 -2
  401. package/dist/scheduler/delegating.js.map +1 -1
  402. package/dist/scheduler/local.d.ts.map +1 -1
  403. package/dist/scheduler/local.js +2 -0
  404. package/dist/scheduler/local.js.map +1 -1
  405. package/dist/session/retention/archive.js +1 -1
  406. package/dist/session/retention/archive.js.map +1 -1
  407. package/dist/skills/index.d.ts +1 -1
  408. package/dist/skills/index.d.ts.map +1 -1
  409. package/dist/skills/index.js +1 -1
  410. package/dist/skills/index.js.map +1 -1
  411. package/dist/skills/registry.d.ts +12 -0
  412. package/dist/skills/registry.d.ts.map +1 -1
  413. package/dist/skills/registry.js +19 -0
  414. package/dist/skills/registry.js.map +1 -1
  415. package/dist/store/evidence/index-page.d.ts +2 -2
  416. package/dist/store/session/disk.d.ts.map +1 -1
  417. package/dist/store/session/disk.js +2 -0
  418. package/dist/store/session/disk.js.map +1 -1
  419. package/dist/store/session-log/conformance.d.ts +1 -1
  420. package/dist/store/session-log/conformance.d.ts.map +1 -1
  421. package/dist/store/session-log/conformance.js +49 -8
  422. package/dist/store/session-log/conformance.js.map +1 -1
  423. package/dist/store/session-log/core.d.ts +8 -3
  424. package/dist/store/session-log/core.d.ts.map +1 -1
  425. package/dist/store/session-log/core.js +2 -1
  426. package/dist/store/session-log/core.js.map +1 -1
  427. package/dist/store/session-log/fold.d.ts +12 -0
  428. package/dist/store/session-log/fold.d.ts.map +1 -1
  429. package/dist/store/session-log/fold.js +57 -7
  430. package/dist/store/session-log/fold.js.map +1 -1
  431. package/dist/store/session-log/index.d.ts +2 -2
  432. package/dist/store/session-log/index.d.ts.map +1 -1
  433. package/dist/store/session-log/index.js +1 -1
  434. package/dist/store/session-log/index.js.map +1 -1
  435. package/dist/test-support/toolset.d.ts +19 -0
  436. package/dist/test-support/toolset.d.ts.map +1 -0
  437. package/dist/test-support/toolset.js +20 -0
  438. package/dist/test-support/toolset.js.map +1 -0
  439. package/dist/tools/builtins/bash.d.ts +29 -0
  440. package/dist/tools/builtins/bash.d.ts.map +1 -1
  441. package/dist/tools/builtins/bash.js +19 -9
  442. package/dist/tools/builtins/bash.js.map +1 -1
  443. package/dist/tools/builtins/browser-url.d.ts +1 -1
  444. package/dist/tools/builtins/browser-url.js +1 -1
  445. package/dist/tools/builtins/browser.d.ts +6 -6
  446. package/dist/tools/builtins/browser.js +2 -2
  447. package/dist/tools/builtins/browser.js.map +1 -1
  448. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  449. package/dist/tools/builtins/computer-use.js +19 -11
  450. package/dist/tools/builtins/computer-use.js.map +1 -1
  451. package/dist/tools/builtins/edit.d.ts.map +1 -1
  452. package/dist/tools/builtins/edit.js +9 -1
  453. package/dist/tools/builtins/edit.js.map +1 -1
  454. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  455. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  456. package/dist/tools/builtins/json-string-hint.js +17 -0
  457. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  458. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  459. package/dist/tools/builtins/search-tools.js +7 -15
  460. package/dist/tools/builtins/search-tools.js.map +1 -1
  461. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  462. package/dist/tools/builtins/write-file.js +11 -0
  463. package/dist/tools/builtins/write-file.js.map +1 -1
  464. package/dist/tools/command-shell.d.ts +10 -0
  465. package/dist/tools/command-shell.d.ts.map +1 -1
  466. package/dist/tools/command-shell.js +45 -1
  467. package/dist/tools/command-shell.js.map +1 -1
  468. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  469. package/dist/tools/coordinator/agent.js +5 -0
  470. package/dist/tools/coordinator/agent.js.map +1 -1
  471. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  472. package/dist/tools/coordinator/ask-user-question.js +26 -13
  473. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  474. package/dist/tools/coordinator/index.d.ts.map +1 -1
  475. package/dist/tools/coordinator/index.js +5 -0
  476. package/dist/tools/coordinator/index.js.map +1 -1
  477. package/dist/tools/coordinator/question-options.d.ts +78 -0
  478. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  479. package/dist/tools/coordinator/question-options.js +153 -0
  480. package/dist/tools/coordinator/question-options.js.map +1 -0
  481. package/dist/tools/defineTool.d.ts +10 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +17 -0
  484. package/dist/tools/defineTool.js.map +1 -1
  485. package/dist/tools/memory/search.d.ts.map +1 -1
  486. package/dist/tools/memory/search.js +4 -1
  487. package/dist/tools/memory/search.js.map +1 -1
  488. package/dist/tools/memory/update.d.ts.map +1 -1
  489. package/dist/tools/memory/update.js +8 -5
  490. package/dist/tools/memory/update.js.map +1 -1
  491. package/dist/tools/render-nonce.d.ts +47 -0
  492. package/dist/tools/render-nonce.d.ts.map +1 -0
  493. package/dist/tools/render-nonce.js +63 -0
  494. package/dist/tools/render-nonce.js.map +1 -0
  495. package/dist/tools/roster.d.ts +46 -19
  496. package/dist/tools/roster.d.ts.map +1 -1
  497. package/dist/tools/roster.js +63 -33
  498. package/dist/tools/roster.js.map +1 -1
  499. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  500. package/dist/tools/schedules/schedule-tool.js +94 -14
  501. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  502. package/dist/tools/schedules/types.d.ts +52 -6
  503. package/dist/tools/schedules/types.d.ts.map +1 -1
  504. package/dist/tools/trusted-read-only.d.ts +9 -5
  505. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  506. package/dist/tools/trusted-read-only.js +14 -10
  507. package/dist/tools/trusted-read-only.js.map +1 -1
  508. package/dist/tools/untrusted-envelope.d.ts +67 -28
  509. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  510. package/dist/tools/untrusted-envelope.js +108 -59
  511. package/dist/tools/untrusted-envelope.js.map +1 -1
  512. package/dist/toolsets/combine.d.ts +44 -0
  513. package/dist/toolsets/combine.d.ts.map +1 -0
  514. package/dist/toolsets/combine.js +153 -0
  515. package/dist/toolsets/combine.js.map +1 -0
  516. package/dist/toolsets/manager.d.ts +201 -0
  517. package/dist/toolsets/manager.d.ts.map +1 -0
  518. package/dist/toolsets/manager.js +837 -0
  519. package/dist/toolsets/manager.js.map +1 -0
  520. package/dist/toolsets/source-glob.d.ts +15 -0
  521. package/dist/toolsets/source-glob.d.ts.map +1 -0
  522. package/dist/toolsets/source-glob.js +23 -0
  523. package/dist/toolsets/source-glob.js.map +1 -0
  524. package/dist/toolsets/toolset.d.ts +20 -0
  525. package/dist/toolsets/toolset.d.ts.map +1 -0
  526. package/dist/toolsets/toolset.js +28 -0
  527. package/dist/toolsets/toolset.js.map +1 -0
  528. package/dist/toolsets/types.d.ts +128 -0
  529. package/dist/toolsets/types.d.ts.map +1 -0
  530. package/dist/toolsets/types.js +33 -0
  531. package/dist/toolsets/types.js.map +1 -0
  532. package/dist/toolsets/wrappers.d.ts +59 -0
  533. package/dist/toolsets/wrappers.d.ts.map +1 -0
  534. package/dist/toolsets/wrappers.js +165 -0
  535. package/dist/toolsets/wrappers.js.map +1 -0
  536. package/dist/types/agent/base.d.ts +27 -16
  537. package/dist/types/agent/base.d.ts.map +1 -1
  538. package/dist/types/agent/index.d.ts +1 -0
  539. package/dist/types/agent/index.d.ts.map +1 -1
  540. package/dist/types/agent/index.js +1 -0
  541. package/dist/types/agent/index.js.map +1 -1
  542. package/dist/types/agent/pipeline.d.ts +2 -0
  543. package/dist/types/agent/pipeline.d.ts.map +1 -1
  544. package/dist/types/agent/query.d.ts +117 -0
  545. package/dist/types/agent/query.d.ts.map +1 -0
  546. package/dist/types/agent/query.js +2 -0
  547. package/dist/types/agent/query.js.map +1 -0
  548. package/dist/types/agent/reactive.d.ts +2 -129
  549. package/dist/types/agent/reactive.d.ts.map +1 -1
  550. package/dist/types/agent/router.d.ts +2 -0
  551. package/dist/types/agent/router.d.ts.map +1 -1
  552. package/dist/types/agent/scheduler.d.ts +6 -1
  553. package/dist/types/agent/scheduler.d.ts.map +1 -1
  554. package/dist/types/agent/supervisor.d.ts +5 -2
  555. package/dist/types/agent/supervisor.d.ts.map +1 -1
  556. package/dist/types/agent/task.d.ts +19 -1
  557. package/dist/types/agent/task.d.ts.map +1 -1
  558. package/dist/types/agent/task.js.map +1 -1
  559. package/dist/types/authorization/index.d.ts +49 -12
  560. package/dist/types/authorization/index.d.ts.map +1 -1
  561. package/dist/types/authorization/index.js +6 -0
  562. package/dist/types/authorization/index.js.map +1 -1
  563. package/dist/types/connector/mcp.d.ts +45 -0
  564. package/dist/types/connector/mcp.d.ts.map +1 -1
  565. package/dist/types/errors/index.d.ts +15 -0
  566. package/dist/types/errors/index.d.ts.map +1 -1
  567. package/dist/types/errors/index.js.map +1 -1
  568. package/dist/types/hitl/index.d.ts +57 -0
  569. package/dist/types/hitl/index.d.ts.map +1 -1
  570. package/dist/types/hitl/index.js.map +1 -1
  571. package/dist/types/message/index.d.ts +130 -9
  572. package/dist/types/message/index.d.ts.map +1 -1
  573. package/dist/types/message/index.js +4 -1
  574. package/dist/types/message/index.js.map +1 -1
  575. package/dist/types/plugin/index.d.ts +22 -4
  576. package/dist/types/plugin/index.d.ts.map +1 -1
  577. package/dist/types/plugin/index.js +1 -0
  578. package/dist/types/plugin/index.js.map +1 -1
  579. package/dist/types/provider/chat.d.ts +5 -0
  580. package/dist/types/provider/chat.d.ts.map +1 -1
  581. package/dist/types/provider/config.d.ts +8 -3
  582. package/dist/types/provider/config.d.ts.map +1 -1
  583. package/dist/types/provider/stream.d.ts +39 -0
  584. package/dist/types/provider/stream.d.ts.map +1 -1
  585. package/dist/types/sandbox/index.d.ts +1 -1
  586. package/dist/types/session/events.d.ts +14 -3
  587. package/dist/types/session/events.d.ts.map +1 -1
  588. package/dist/types/session/events.js.map +1 -1
  589. package/dist/types/session/sub-session.d.ts +2 -0
  590. package/dist/types/session/sub-session.d.ts.map +1 -1
  591. package/dist/types/tool/index.d.ts +152 -91
  592. package/dist/types/tool/index.d.ts.map +1 -1
  593. package/dist/types/tool/index.js.map +1 -1
  594. package/dist/types/toolset/index.d.ts +10 -40
  595. package/dist/types/toolset/index.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/src/advisory/history.ts +27 -2
  598. package/src/advisory/index.ts +1 -1
  599. package/src/advisory/registry.ts +33 -0
  600. package/src/agents/AGENTS.md +14 -7
  601. package/src/agents/PipelineAgent.ts +2 -303
  602. package/src/agents/QueryAgent.ts +269 -0
  603. package/src/agents/ReactiveAgent.ts +6 -216
  604. package/src/agents/RouterAgent.ts +2 -337
  605. package/src/agents/SupervisorAgent.ts +3 -476
  606. package/src/agents/defineAgent.ts +13 -2
  607. package/src/agents/examples/PipelineAgent.ts +302 -0
  608. package/src/agents/examples/RouterAgent.ts +338 -0
  609. package/src/agents/examples/SupervisorAgent.ts +472 -0
  610. package/src/agents/explore.ts +6 -3
  611. package/src/agents/forward-options.ts +37 -0
  612. package/src/agents/index.ts +2 -0
  613. package/src/agents/runAgent.ts +144 -37
  614. package/src/authorization/command-line.ts +2 -2
  615. package/src/authorization/gate.ts +21 -1
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +18 -1
  619. package/src/authorization/shell-lexer.ts +104 -59
  620. package/src/bridge/sse/mapper.ts +6 -0
  621. package/src/capabilities/index.ts +157 -0
  622. package/src/config/registry.ts +4 -1
  623. package/src/connector/index.ts +9 -2
  624. package/src/connector/mcp/adapter.ts +73 -3
  625. package/src/connector/mcp/client.ts +425 -6
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/era.ts +7 -0
  628. package/src/connector/mcp/index.ts +13 -0
  629. package/src/connector/mcp/mcp-toolset.ts +515 -0
  630. package/src/connector/mcp/streamable-http.ts +302 -5
  631. package/src/connector/tools/index.ts +2 -2
  632. package/src/connector/tools/router.ts +35 -58
  633. package/src/directory/derive-supervisor.ts +12 -8
  634. package/src/directory/derive.ts +8 -5
  635. package/src/execution/code-runtime/types.ts +2 -2
  636. package/src/invariants/index.ts +4 -1
  637. package/src/manager/agent/lifecycle.ts +167 -19
  638. package/src/manager/connector/environment.ts +17 -4
  639. package/src/manager/connector/index.ts +2 -2
  640. package/src/manager/connector/tenant.ts +17 -4
  641. package/src/manager/index.ts +2 -2
  642. package/src/manager/session/attribution.ts +79 -0
  643. package/src/manager/session/turn-recorder.ts +211 -55
  644. package/src/peers/address.ts +58 -0
  645. package/src/peers/client.ts +202 -0
  646. package/src/peers/dir.ts +176 -0
  647. package/src/peers/endpoint.ts +564 -0
  648. package/src/peers/envelope.ts +121 -0
  649. package/src/peers/index.ts +96 -0
  650. package/src/peers/protocol.ts +196 -0
  651. package/src/peers/record.ts +56 -0
  652. package/src/peers/registry.ts +241 -0
  653. package/src/plugin/define.ts +68 -0
  654. package/src/plugin/index.ts +2 -0
  655. package/src/plugin/lifecycle.ts +286 -106
  656. package/src/plugin/resolver.ts +6 -3
  657. package/src/plugin/shell-hook.ts +21 -5
  658. package/src/probe/errors.ts +4 -1
  659. package/src/prompt/coding-agent-doctrine.ts +22 -10
  660. package/src/prompt/contributions.ts +12 -2
  661. package/src/prompt/index.ts +1 -0
  662. package/src/provider/collect-chat-completion.ts +96 -11
  663. package/src/provider/mock.ts +24 -6
  664. package/src/provider/registry.ts +4 -1
  665. package/src/provider/tool-call-framing.ts +226 -0
  666. package/src/public-runtime.ts +136 -7
  667. package/src/public-tools.ts +24 -4
  668. package/src/public-types.ts +60 -6
  669. package/src/read-model/registry.ts +7 -2
  670. package/src/registry/ManagedRegistry.ts +57 -6
  671. package/src/registry/collision.ts +64 -0
  672. package/src/registry/command/index.ts +7 -3
  673. package/src/registry/index.ts +3 -9
  674. package/src/registry/plugin/index.ts +14 -1
  675. package/src/registry/tool/callable.ts +8 -9
  676. package/src/registry/tool/execute.ts +16 -846
  677. package/src/registry/tool/portable.ts +59 -0
  678. package/src/registry/tool/presentation.ts +6 -5
  679. package/src/runtime/bidi/session.ts +24 -5
  680. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  681. package/src/runtime/query/executor.ts +110 -12
  682. package/src/runtime/query/file-evidence-replay.ts +8 -7
  683. package/src/runtime/query/fork/prepare.ts +6 -1
  684. package/src/runtime/query/guardrail-presets.ts +4 -3
  685. package/src/runtime/query/index.ts +199 -101
  686. package/src/runtime/query/iteration/index.ts +13 -3
  687. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  688. package/src/runtime/query/iteration/phases/context.ts +2 -2
  689. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  690. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  691. package/src/runtime/query/iteration/tool-input.ts +284 -0
  692. package/src/runtime/query/observation-context.ts +2 -2
  693. package/src/runtime/query/prelude-lease.ts +132 -0
  694. package/src/runtime/query/prepare-turn.ts +477 -198
  695. package/src/runtime/query/prompt-cache.ts +2 -2
  696. package/src/runtime/query/prompt.ts +4 -4
  697. package/src/runtime/query/resume-session.ts +42 -3
  698. package/src/runtime/query/review-policy.ts +87 -9
  699. package/src/runtime/query/tooling.ts +3 -6
  700. package/src/runtime/query/turn-state.ts +4 -0
  701. package/src/runtime/system-events.ts +246 -0
  702. package/src/scheduler/delegating.ts +7 -2
  703. package/src/scheduler/local.ts +2 -0
  704. package/src/session/retention/archive.ts +1 -1
  705. package/src/skills/index.ts +1 -1
  706. package/src/skills/registry.ts +25 -0
  707. package/src/store/session/disk.ts +3 -0
  708. package/src/store/session-log/conformance.ts +51 -8
  709. package/src/store/session-log/core.ts +10 -4
  710. package/src/store/session-log/fold.ts +33 -7
  711. package/src/store/session-log/index.ts +2 -0
  712. package/src/test-support/toolset.ts +23 -0
  713. package/src/tools/builtins/bash.ts +27 -10
  714. package/src/tools/builtins/browser-url.ts +1 -1
  715. package/src/tools/builtins/browser.ts +2 -2
  716. package/src/tools/builtins/computer-use.ts +21 -11
  717. package/src/tools/builtins/edit.ts +12 -2
  718. package/src/tools/builtins/json-string-hint.ts +16 -0
  719. package/src/tools/builtins/search-tools.ts +7 -20
  720. package/src/tools/builtins/write-file.ts +12 -0
  721. package/src/tools/command-shell.ts +46 -1
  722. package/src/tools/coordinator/agent.ts +6 -0
  723. package/src/tools/coordinator/ask-user-question.ts +29 -15
  724. package/src/tools/coordinator/index.ts +6 -0
  725. package/src/tools/coordinator/question-options.ts +195 -0
  726. package/src/tools/defineTool.ts +28 -0
  727. package/src/tools/memory/search.ts +4 -1
  728. package/src/tools/memory/update.ts +8 -5
  729. package/src/tools/render-nonce.ts +69 -0
  730. package/src/tools/roster.ts +84 -33
  731. package/src/tools/schedules/schedule-tool.ts +107 -14
  732. package/src/tools/schedules/types.ts +52 -6
  733. package/src/tools/trusted-read-only.ts +19 -10
  734. package/src/tools/untrusted-envelope.ts +121 -57
  735. package/src/toolsets/combine.ts +181 -0
  736. package/src/toolsets/manager.ts +996 -0
  737. package/src/toolsets/source-glob.ts +22 -0
  738. package/src/toolsets/toolset.ts +31 -0
  739. package/src/toolsets/types.ts +154 -0
  740. package/src/toolsets/wrappers.ts +191 -0
  741. package/src/types/agent/base.ts +29 -16
  742. package/src/types/agent/index.ts +1 -0
  743. package/src/types/agent/pipeline.ts +2 -0
  744. package/src/types/agent/query.ts +129 -0
  745. package/src/types/agent/reactive.ts +5 -142
  746. package/src/types/agent/router.ts +2 -0
  747. package/src/types/agent/scheduler.ts +6 -1
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/agent/task.ts +21 -1
  750. package/src/types/authorization/index.ts +12 -0
  751. package/src/types/connector/mcp.ts +46 -0
  752. package/src/types/errors/index.ts +15 -0
  753. package/src/types/hitl/index.ts +57 -0
  754. package/src/types/message/index.ts +135 -7
  755. package/src/types/plugin/index.ts +44 -21
  756. package/src/types/provider/chat.ts +5 -0
  757. package/src/types/provider/config.ts +8 -3
  758. package/src/types/provider/stream.ts +39 -0
  759. package/src/types/sandbox/index.ts +1 -1
  760. package/src/types/session/events.ts +14 -3
  761. package/src/types/session/sub-session.ts +2 -0
  762. package/src/types/tool/index.ts +154 -105
  763. package/src/types/toolset/index.ts +10 -47
  764. package/dist/registry/toolset/catalog.d.ts +0 -42
  765. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  766. package/dist/registry/toolset/catalog.js +0 -234
  767. package/dist/registry/toolset/catalog.js.map +0 -1
  768. package/src/registry/toolset/catalog.ts +0 -308
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Peer addresses are URIs so a later cross-machine transport can be added
3
+ * without redesigning the registry or the protocol: `uds:<path>` and
4
+ * `pipe:<name>` today, `a2a:https://…` later (design §1.1). Only the two
5
+ * local schemes are ever SERVED or DIALED by this package; `a2a:` addresses
6
+ * are recognised so a reader can tell them apart, not connected to.
7
+ *
8
+ * @experimental
9
+ */
10
+ import { join } from 'node:path';
11
+ import { peerSocketFileName } from './dir.js';
12
+ export class PeerAddressError extends Error {
13
+ name = 'PeerAddressError';
14
+ }
15
+ /** The `uds:<path>` address for a session's socket inside a hardened runtime directory. */
16
+ export function udsPeerAddress(runtimeDir, sessionId) {
17
+ return `uds:${join(runtimeDir, peerSocketFileName(sessionId))}`;
18
+ }
19
+ /**
20
+ * The `pipe:<name>` address for a session's Windows named pipe.
21
+ *
22
+ * `<name>` is the full pipe path Node's `net` module dials directly
23
+ * (`\\.\pipe\namzu-<uid-hash>-<session-short>`, design §1.1) — coded here for
24
+ * completeness; this package does not run its tests on win32, so the shape
25
+ * is reviewed rather than exercised.
26
+ */
27
+ export function pipePeerAddress(uidHash, sessionShort) {
28
+ return `pipe:\\\\.\\pipe\\namzu-${uidHash}-${sessionShort}`;
29
+ }
30
+ /** Parse a peer address URI. Throws {@link PeerAddressError} on an unrecognised or empty scheme. */
31
+ export function parsePeerAddress(address) {
32
+ if (address.startsWith('uds:')) {
33
+ const path = address.slice('uds:'.length);
34
+ if (path.length === 0)
35
+ throw new PeerAddressError(`Empty uds: address: ${address}`);
36
+ return { scheme: 'uds', path };
37
+ }
38
+ if (address.startsWith('pipe:')) {
39
+ const path = address.slice('pipe:'.length);
40
+ if (path.length === 0)
41
+ throw new PeerAddressError(`Empty pipe: address: ${address}`);
42
+ return { scheme: 'pipe', path };
43
+ }
44
+ if (address.startsWith('a2a:')) {
45
+ const url = address.slice('a2a:'.length);
46
+ if (url.length === 0)
47
+ throw new PeerAddressError(`Empty a2a: address: ${address}`);
48
+ return { scheme: 'a2a', url };
49
+ }
50
+ throw new PeerAddressError(`Unrecognised peer address scheme: ${address}`);
51
+ }
52
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/peers/address.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAO7C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACxB,IAAI,GAAG,kBAAkB,CAAA;CAC3C;AAED,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,SAAiB;IACnE,OAAO,OAAO,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAA;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,YAAoB;IACpE,OAAO,2BAA2B,OAAO,IAAI,YAAY,EAAE,CAAA;AAC5D,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAA;QACnF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAA;QACpF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAChC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAA;QAClF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IAC9B,CAAC;IACD,MAAM,IAAI,gBAAgB,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAA;AAC3E,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * A client for one connection of `namzu-peer/1`: connect, write one request
3
+ * line, read one response line, close. Mirrors the shape of this
4
+ * repository's other local control clients (`queryRunner` in
5
+ * `packages/cli/src/integrations/resident/runner-control.ts`,
6
+ * `callEndpoint` in `packages/cli/src/schedule/daemon/endpoint.ts`): an
7
+ * authenticated response PROVES responsiveness, and its absence never proves
8
+ * the peer is dead — only that this attempt could not reach it.
9
+ *
10
+ * @experimental
11
+ */
12
+ import { type DeliverRequest, type DeliverResponse, type NoticeRequest, type NoticeResponse, type PingResponse, type SubscribeIdleRequest, type SubscribeIdleResponse } from './protocol.js';
13
+ import type { PeerRecord } from './record.js';
14
+ export declare class PeerClientError extends Error {
15
+ readonly name = "PeerClientError";
16
+ }
17
+ /** An authenticated reply proves responsiveness; every other outcome names why none arrived. */
18
+ export type PeerClientResult<T> = ({
19
+ readonly kind: 'responded';
20
+ } & T) | {
21
+ readonly kind: 'unreachable';
22
+ readonly reason: string;
23
+ };
24
+ export interface PeerClientOptions {
25
+ /** Default 2000ms. */
26
+ readonly timeoutMs?: number;
27
+ }
28
+ /**
29
+ * `ping`, `deliver`, `subscribe_idle` and `notice` over `namzu-peer/1`.
30
+ *
31
+ * `deliver`/`subscribeIdle`/`notice` read the RECIPIENT's token from the
32
+ * `PeerRecord` passed in — the wire's token is always the recipient's own,
33
+ * asserted by the caller and verified by the server (design §1.1, §1.3).
34
+ * `ping` takes a bare address and carries no token; see the file header for
35
+ * why.
36
+ */
37
+ export declare class PeerClient {
38
+ private readonly timeoutMs;
39
+ constructor(options?: PeerClientOptions);
40
+ ping(address: string, timeoutMs?: number): Promise<PeerClientResult<PingResponse>>;
41
+ deliver(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<DeliverRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<DeliverResponse>>;
42
+ subscribeIdle(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<SubscribeIdleRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<SubscribeIdleResponse>>;
43
+ notice(record: Pick<PeerRecord, 'address' | 'token'>, message: Omit<NoticeRequest, 'protocol' | 'op' | 'token'>): Promise<PeerClientResult<NoticeResponse>>;
44
+ }
45
+ /** A bare liveness probe: `true` iff an unauthenticated `ping` answers within `timeoutMs`. Used by `listLivePeers`. */
46
+ export declare function pingPeer(address: string, timeoutMs?: number): Promise<boolean>;
47
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/peers/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,KAAK,aAAa,EAClB,KAAK,cAAc,EAInB,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE1B,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,qBAAa,eAAgB,SAAQ,KAAK;IACzC,SAAkB,IAAI,qBAAoB;CAC1C;AAED,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC3B,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,CAAC,CAAC,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAsE5D,MAAM,WAAW,iBAAiB;IACjC,sBAAsB;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,OAAO,GAAE,iBAAsB;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAK1F,OAAO,CACN,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GACxD,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAe7C,aAAa,CACZ,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GAC9D,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAenD,MAAM,CACL,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GACvD,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CAc5C;AAED,uHAAuH;AACvH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1F"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * A client for one connection of `namzu-peer/1`: connect, write one request
3
+ * line, read one response line, close. Mirrors the shape of this
4
+ * repository's other local control clients (`queryRunner` in
5
+ * `packages/cli/src/integrations/resident/runner-control.ts`,
6
+ * `callEndpoint` in `packages/cli/src/schedule/daemon/endpoint.ts`): an
7
+ * authenticated response PROVES responsiveness, and its absence never proves
8
+ * the peer is dead — only that this attempt could not reach it.
9
+ *
10
+ * @experimental
11
+ */
12
+ import { createConnection } from 'node:net';
13
+ import { parsePeerAddress } from './address.js';
14
+ import { DeliverResponseSchema, MAX_PEER_REQUEST_BYTES, NoticeResponseSchema, PEER_PROTOCOL_VERSION, PingResponseSchema, SubscribeIdleResponseSchema, } from './protocol.js';
15
+ const DEFAULT_TIMEOUT_MS = 2_000;
16
+ export class PeerClientError extends Error {
17
+ name = 'PeerClientError';
18
+ }
19
+ function connectPath(address) {
20
+ const parsed = parsePeerAddress(address);
21
+ if (parsed.scheme === 'a2a') {
22
+ throw new PeerClientError(`PeerClient cannot dial an a2a: address directly: ${address}`);
23
+ }
24
+ return parsed.path;
25
+ }
26
+ /** One request, one response, one connection. */
27
+ function sendPeerRequest(address, request, parseResponse, timeoutMs) {
28
+ return new Promise((resolve) => {
29
+ let settled = false;
30
+ const finish = (result) => {
31
+ if (settled)
32
+ return;
33
+ settled = true;
34
+ clearTimeout(timer);
35
+ socket.destroy();
36
+ resolve(result);
37
+ };
38
+ const unreachable = (error) => finish({
39
+ kind: 'unreachable',
40
+ reason: error instanceof Error ? error.message : String(error),
41
+ });
42
+ const timer = setTimeout(() => unreachable(new Error('Peer request timed out.')), timeoutMs);
43
+ let path;
44
+ try {
45
+ path = connectPath(address);
46
+ }
47
+ catch (error) {
48
+ clearTimeout(timer);
49
+ resolve({
50
+ kind: 'unreachable',
51
+ reason: error instanceof Error ? error.message : String(error),
52
+ });
53
+ return;
54
+ }
55
+ const socket = createConnection({ path });
56
+ let buffered = Buffer.alloc(0);
57
+ socket.once('error', unreachable);
58
+ socket.once('close', () => unreachable(new Error('Peer connection closed before a response arrived.')));
59
+ socket.once('connect', () => {
60
+ socket.write(`${JSON.stringify(request)}\n`);
61
+ });
62
+ socket.on('data', (chunk) => {
63
+ if (buffered.length + chunk.length > MAX_PEER_REQUEST_BYTES) {
64
+ unreachable(new Error('Peer response exceeded the size limit.'));
65
+ return;
66
+ }
67
+ buffered = Buffer.concat([buffered, chunk]);
68
+ const newline = buffered.indexOf(10);
69
+ if (newline < 0)
70
+ return;
71
+ try {
72
+ const parsed = JSON.parse(buffered.subarray(0, newline).toString('utf8'));
73
+ finish({ kind: 'responded', ...parseResponse(parsed) });
74
+ }
75
+ catch (error) {
76
+ unreachable(error);
77
+ }
78
+ });
79
+ });
80
+ }
81
+ /**
82
+ * `ping`, `deliver`, `subscribe_idle` and `notice` over `namzu-peer/1`.
83
+ *
84
+ * `deliver`/`subscribeIdle`/`notice` read the RECIPIENT's token from the
85
+ * `PeerRecord` passed in — the wire's token is always the recipient's own,
86
+ * asserted by the caller and verified by the server (design §1.1, §1.3).
87
+ * `ping` takes a bare address and carries no token; see the file header for
88
+ * why.
89
+ */
90
+ export class PeerClient {
91
+ timeoutMs;
92
+ constructor(options = {}) {
93
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
94
+ }
95
+ ping(address, timeoutMs = this.timeoutMs) {
96
+ const request = { protocol: PEER_PROTOCOL_VERSION, op: 'ping' };
97
+ return sendPeerRequest(address, request, (value) => PingResponseSchema.parse(value), timeoutMs);
98
+ }
99
+ deliver(record, message) {
100
+ const request = {
101
+ protocol: PEER_PROTOCOL_VERSION,
102
+ op: 'deliver',
103
+ token: record.token,
104
+ ...message,
105
+ };
106
+ return sendPeerRequest(record.address, request, (value) => DeliverResponseSchema.parse(value), this.timeoutMs);
107
+ }
108
+ subscribeIdle(record, message) {
109
+ const request = {
110
+ protocol: PEER_PROTOCOL_VERSION,
111
+ op: 'subscribe_idle',
112
+ token: record.token,
113
+ ...message,
114
+ };
115
+ return sendPeerRequest(record.address, request, (value) => SubscribeIdleResponseSchema.parse(value), this.timeoutMs);
116
+ }
117
+ notice(record, message) {
118
+ const request = {
119
+ protocol: PEER_PROTOCOL_VERSION,
120
+ op: 'notice',
121
+ token: record.token,
122
+ ...message,
123
+ };
124
+ return sendPeerRequest(record.address, request, (value) => NoticeResponseSchema.parse(value), this.timeoutMs);
125
+ }
126
+ }
127
+ /** A bare liveness probe: `true` iff an unauthenticated `ping` answers within `timeoutMs`. Used by `listLivePeers`. */
128
+ export function pingPeer(address, timeoutMs = DEFAULT_TIMEOUT_MS) {
129
+ const request = { protocol: PEER_PROTOCOL_VERSION, op: 'ping' };
130
+ return sendPeerRequest(address, request, (value) => PingResponseSchema.parse(value), timeoutMs).then((result) => result.kind === 'responded');
131
+ }
132
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/peers/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The private per-user runtime directory peer sockets and the live-session
3
+ * registry live in.
4
+ *
5
+ * Boundary = the OS user (design: cross-session messaging §1.1). Any process
6
+ * of the same user can already read the user's files, so the directory only
7
+ * has to keep OTHER users and the network out, and every candidate is
8
+ * checked the same way: created 0700, refused if it turns out to be a
9
+ * symlink, and — on POSIX — verified by `lstat` to really be owned by this
10
+ * uid and to carry no group/other permission.
11
+ *
12
+ * The SDK cannot depend on the CLI's `ensurePrivateStateDirectory`
13
+ * (`packages/cli/src/integrations/state/private-directory.ts`, which also
14
+ * tightens a Windows ACL); {@link hardenPeerRuntimeDir} is the small subset
15
+ * of that contract this module needs, reimplemented here so the dependency
16
+ * direction (`sdk` never imports `cli`) holds. A caller with its own
17
+ * directory-hardening policy may supply `hardenDirectory` instead.
18
+ *
19
+ * @experimental
20
+ */
21
+ export declare class PeerDirectoryError extends Error {
22
+ readonly name = "PeerDirectoryError";
23
+ }
24
+ /**
25
+ * Session ids are UUIDv7 (`generateSessionId`, `utils/id.ts`): 36 characters.
26
+ * `.sock` is the longest suffix {@link peerSocketFileName} ever appends, so
27
+ * this is the longest socket filename the peers module creates — the figure
28
+ * {@link resolvePeerRuntimeDir} subtracts from the platform's
29
+ * `sockaddr_un.sun_path` limit before choosing a runtime directory.
30
+ */
31
+ export declare const LONGEST_PEER_SOCKET_FILE_NAME_LENGTH: number;
32
+ /** The socket filename for one session, placed directly inside the runtime directory. */
33
+ export declare function peerSocketFileName(sessionId: string): string;
34
+ /** Harden one directory in place; see {@link hardenPeerRuntimeDir}. Injectable for tests. */
35
+ export type HardenPeerDirectory = (path: string, uid: number | undefined) => void;
36
+ /**
37
+ * Create (or re-verify) a private directory for peer sockets and registry
38
+ * records.
39
+ *
40
+ * Existing directories are tightened (`chmod`) on POSIX, then re-checked by
41
+ * `lstat` — tightening a directory this uid does not own would fail, which is
42
+ * exactly the outcome wanted, so the check afterward is the real gate. Skips
43
+ * the POSIX-only steps on win32, where `chmod` only toggles the read-only
44
+ * attribute and there is no uid to compare (`process.getuid` does not exist).
45
+ */
46
+ export declare function hardenPeerRuntimeDir(path: string, uid: number | undefined): void;
47
+ export interface ResolvePeerRuntimeDirOptions {
48
+ readonly env: NodeJS.ProcessEnv;
49
+ readonly namzuHome: string;
50
+ /** `undefined` models a platform with no uid (win32; `process.getuid` does not exist there). */
51
+ readonly uid: number | undefined;
52
+ /** Default `process.platform`; override for tests. */
53
+ readonly platform?: NodeJS.Platform;
54
+ /** Default `os.tmpdir()`; override for tests, matching `TempRootOptions.tmpdir` in `session/paths.ts`. */
55
+ readonly tmpDir?: string;
56
+ /** Overrides {@link hardenPeerRuntimeDir}; primarily for tests that need to fabricate a failure. */
57
+ readonly hardenDirectory?: HardenPeerDirectory;
58
+ }
59
+ export interface PeerRuntimeDir {
60
+ /** The directory sockets are created in. */
61
+ readonly path: string;
62
+ /** `<path>/sessions`, holding one registry record per live session. */
63
+ readonly sessionsDir: string;
64
+ }
65
+ /**
66
+ * Choose and harden the per-session peer runtime directory.
67
+ *
68
+ * Candidates, in order: `$XDG_RUNTIME_DIR/namzu`, `$NAMZU_HOME/run`,
69
+ * `$TMPDIR/namzu-<uid>`. Every candidate whose resulting socket paths fit
70
+ * this platform's `sockaddr_un` limit is a length-eligible candidate; among
71
+ * those, the first that can actually be created and hardened 0700 (see
72
+ * {@link hardenPeerRuntimeDir}), along with its `sessions/` subdirectory, is
73
+ * the one used.
74
+ *
75
+ * Fitting the length budget and being hardenable are different failure
76
+ * modes, so they get different handling. A candidate that is too long for
77
+ * this platform's socket path is never even attempted — trying it would
78
+ * only fail later, at `listen()`, with a less useful error. A candidate
79
+ * that DOES fit but cannot be hardened (owned by another uid, a symlink, a
80
+ * permission this process cannot chmod away) is skipped in favour of the
81
+ * next length-eligible candidate rather than failing the whole call: a
82
+ * hostile or merely misconfigured `$XDG_RUNTIME_DIR` should not deny peer
83
+ * messaging to a session that could perfectly well fall back to
84
+ * `$NAMZU_HOME/run`. Only when every length-eligible candidate has failed to
85
+ * harden does this throw, naming each one and why.
86
+ */
87
+ export declare function resolvePeerRuntimeDir(options: ResolvePeerRuntimeDirOptions): PeerRuntimeDir;
88
+ //# sourceMappingURL=dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir.d.ts","sourceRoot":"","sources":["../../src/peers/dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,wBAAuB;CAC7C;AAID;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,QAAsB,CAAA;AAEvE,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAqBD,6FAA6F;AAC7F,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;AAEjF;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAsBhF;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IACnC,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,oGAAoG;IACpG,QAAQ,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAA;CAC9C;AAED,MAAM,WAAW,cAAc;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC5B;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,cAAc,CAwB3F"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * The private per-user runtime directory peer sockets and the live-session
3
+ * registry live in.
4
+ *
5
+ * Boundary = the OS user (design: cross-session messaging §1.1). Any process
6
+ * of the same user can already read the user's files, so the directory only
7
+ * has to keep OTHER users and the network out, and every candidate is
8
+ * checked the same way: created 0700, refused if it turns out to be a
9
+ * symlink, and — on POSIX — verified by `lstat` to really be owned by this
10
+ * uid and to carry no group/other permission.
11
+ *
12
+ * The SDK cannot depend on the CLI's `ensurePrivateStateDirectory`
13
+ * (`packages/cli/src/integrations/state/private-directory.ts`, which also
14
+ * tightens a Windows ACL); {@link hardenPeerRuntimeDir} is the small subset
15
+ * of that contract this module needs, reimplemented here so the dependency
16
+ * direction (`sdk` never imports `cli`) holds. A caller with its own
17
+ * directory-hardening policy may supply `hardenDirectory` instead.
18
+ *
19
+ * @experimental
20
+ */
21
+ import { chmodSync, lstatSync, mkdirSync } from 'node:fs';
22
+ import { tmpdir } from 'node:os';
23
+ import { join } from 'node:path';
24
+ export class PeerDirectoryError extends Error {
25
+ name = 'PeerDirectoryError';
26
+ }
27
+ const PRIVATE_DIR_MODE = 0o700;
28
+ /**
29
+ * Session ids are UUIDv7 (`generateSessionId`, `utils/id.ts`): 36 characters.
30
+ * `.sock` is the longest suffix {@link peerSocketFileName} ever appends, so
31
+ * this is the longest socket filename the peers module creates — the figure
32
+ * {@link resolvePeerRuntimeDir} subtracts from the platform's
33
+ * `sockaddr_un.sun_path` limit before choosing a runtime directory.
34
+ */
35
+ export const LONGEST_PEER_SOCKET_FILE_NAME_LENGTH = 36 + '.sock'.length;
36
+ /** The socket filename for one session, placed directly inside the runtime directory. */
37
+ export function peerSocketFileName(sessionId) {
38
+ return `${sessionId}.sock`;
39
+ }
40
+ const DARWIN_SUN_PATH_LIMIT = 104;
41
+ /** Linux, and every other POSIX platform this runs on. */
42
+ const DEFAULT_SUN_PATH_LIMIT = 108;
43
+ function platformSocketPathLimit(platform) {
44
+ return platform === 'darwin' ? DARWIN_SUN_PATH_LIMIT : DEFAULT_SUN_PATH_LIMIT;
45
+ }
46
+ /**
47
+ * Whether a socket file directly inside `dir` fits the platform's
48
+ * `sockaddr_un.sun_path`. Windows named pipes live in a virtual namespace,
49
+ * not the filesystem, so no directory ever fails this check there.
50
+ */
51
+ function fitsSocketPath(dir, platform) {
52
+ if (platform === 'win32')
53
+ return true;
54
+ // +1 for the path separator joining `dir` to the socket filename.
55
+ return dir.length + 1 + LONGEST_PEER_SOCKET_FILE_NAME_LENGTH <= platformSocketPathLimit(platform);
56
+ }
57
+ /**
58
+ * Create (or re-verify) a private directory for peer sockets and registry
59
+ * records.
60
+ *
61
+ * Existing directories are tightened (`chmod`) on POSIX, then re-checked by
62
+ * `lstat` — tightening a directory this uid does not own would fail, which is
63
+ * exactly the outcome wanted, so the check afterward is the real gate. Skips
64
+ * the POSIX-only steps on win32, where `chmod` only toggles the read-only
65
+ * attribute and there is no uid to compare (`process.getuid` does not exist).
66
+ */
67
+ export function hardenPeerRuntimeDir(path, uid) {
68
+ mkdirSync(path, { recursive: true, mode: PRIVATE_DIR_MODE });
69
+ const created = lstatSync(path);
70
+ if (created.isSymbolicLink()) {
71
+ throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it is a symbolic link.`);
72
+ }
73
+ if (!created.isDirectory()) {
74
+ throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it is not a directory.`);
75
+ }
76
+ if (process.platform === 'win32')
77
+ return;
78
+ chmodSync(path, PRIVATE_DIR_MODE);
79
+ const entry = lstatSync(path);
80
+ if (uid !== undefined && entry.uid !== uid) {
81
+ throw new PeerDirectoryError(`Refusing peer runtime path ${path}: it belongs to uid ${entry.uid}, not ${uid}.`);
82
+ }
83
+ if ((entry.mode & 0o777) !== PRIVATE_DIR_MODE) {
84
+ throw new PeerDirectoryError(`Refusing peer runtime path ${path}: mode ${(entry.mode & 0o777).toString(8)} is not 0700.`);
85
+ }
86
+ }
87
+ function peerRuntimeDirCandidates(options) {
88
+ const candidates = [];
89
+ if (options.env.XDG_RUNTIME_DIR)
90
+ candidates.push(join(options.env.XDG_RUNTIME_DIR, 'namzu'));
91
+ candidates.push(join(options.namzuHome, 'run'));
92
+ candidates.push(join(options.tmpDir ?? tmpdir(), `namzu-${options.uid ?? 'user'}`));
93
+ return candidates;
94
+ }
95
+ /**
96
+ * Choose and harden the per-session peer runtime directory.
97
+ *
98
+ * Candidates, in order: `$XDG_RUNTIME_DIR/namzu`, `$NAMZU_HOME/run`,
99
+ * `$TMPDIR/namzu-<uid>`. Every candidate whose resulting socket paths fit
100
+ * this platform's `sockaddr_un` limit is a length-eligible candidate; among
101
+ * those, the first that can actually be created and hardened 0700 (see
102
+ * {@link hardenPeerRuntimeDir}), along with its `sessions/` subdirectory, is
103
+ * the one used.
104
+ *
105
+ * Fitting the length budget and being hardenable are different failure
106
+ * modes, so they get different handling. A candidate that is too long for
107
+ * this platform's socket path is never even attempted — trying it would
108
+ * only fail later, at `listen()`, with a less useful error. A candidate
109
+ * that DOES fit but cannot be hardened (owned by another uid, a symlink, a
110
+ * permission this process cannot chmod away) is skipped in favour of the
111
+ * next length-eligible candidate rather than failing the whole call: a
112
+ * hostile or merely misconfigured `$XDG_RUNTIME_DIR` should not deny peer
113
+ * messaging to a session that could perfectly well fall back to
114
+ * `$NAMZU_HOME/run`. Only when every length-eligible candidate has failed to
115
+ * harden does this throw, naming each one and why.
116
+ */
117
+ export function resolvePeerRuntimeDir(options) {
118
+ const platform = options.platform ?? process.platform;
119
+ const harden = options.hardenDirectory ?? hardenPeerRuntimeDir;
120
+ const candidates = peerRuntimeDirCandidates(options);
121
+ const fitting = candidates.filter((candidate) => fitsSocketPath(candidate, platform));
122
+ if (fitting.length === 0) {
123
+ throw new PeerDirectoryError(`No candidate peer runtime directory fits this platform's socket path limit (${platformSocketPathLimit(platform)} bytes): ${candidates.join(', ')}`);
124
+ }
125
+ const failures = [];
126
+ for (const candidate of fitting) {
127
+ try {
128
+ harden(candidate, options.uid);
129
+ const sessionsDir = join(candidate, 'sessions');
130
+ harden(sessionsDir, options.uid);
131
+ return { path: candidate, sessionsDir };
132
+ }
133
+ catch (error) {
134
+ failures.push(`${candidate}: ${error instanceof Error ? error.message : String(error)}`);
135
+ }
136
+ }
137
+ throw new PeerDirectoryError(`No candidate peer runtime directory could be hardened:\n${failures.join('\n')}`);
138
+ }
139
+ //# sourceMappingURL=dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir.js","sourceRoot":"","sources":["../../src/peers/dir.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * The `namzu-peer/1` server: one UDS path (POSIX) or named pipe (win32) per
3
+ * session, newline-delimited JSON framing, a closed op set (design §1.1,
4
+ * §1.3). Mirrors the shape of this repository's other local control
5
+ * endpoints (`startEndpoint` in
6
+ * `packages/cli/src/schedule/daemon/endpoint.ts`, `createRunnerControlServer`
7
+ * in `packages/cli/src/integrations/resident/runner-control.ts`): a total
8
+ * read deadline per connection (not an inactivity timer a slow sender can
9
+ * reset), a bounded connection count, and a destroyed socket rather than an
10
+ * error response for anything malformed — request bytes and tokens are
11
+ * never logged, so there is nothing to say about a bad request beyond
12
+ * closing the connection.
13
+ *
14
+ * This package tests only the POSIX (UDS) path; the win32 branch is written
15
+ * and reviewed, not exercised, since this environment cannot run a win32
16
+ * test.
17
+ *
18
+ * @experimental
19
+ */
20
+ import { type Logger } from '../utils/logger.js';
21
+ import { type DeliverRequest, type DeliverResponse, type NoticeRequest, type PeerFrom, type PeerSessionState, type SubscribeIdleRequest, type SubscribeIdleResponse } from './protocol.js';
22
+ export declare class PeerEndpointError extends Error {
23
+ readonly name = "PeerEndpointError";
24
+ }
25
+ export interface CreatePeerEndpointOptions {
26
+ readonly address: string;
27
+ /** This session's own token; compared against every request but `ping` with `timingSafeEqual`. */
28
+ readonly token: string;
29
+ /** `undefined` models a platform with no uid (win32). Gates the stale-socket removal below. */
30
+ readonly uid?: number;
31
+ /** Answered verbatim on every `ping`; `ping` has no other way to learn the current state. */
32
+ readonly getState: () => PeerSessionState;
33
+ /**
34
+ * Directory holding the live-session registry (`sessions/<id>.json`),
35
+ * used by the DEFAULT `verifySender`. Not read at all if `verifySender`
36
+ * is supplied.
37
+ */
38
+ readonly sessionsDir?: string;
39
+ readonly onDeliver: (request: DeliverRequest) => Promise<DeliverResponse> | DeliverResponse;
40
+ readonly onSubscribeIdle: (request: SubscribeIdleRequest) => Promise<SubscribeIdleResponse> | SubscribeIdleResponse;
41
+ readonly onNotice: (request: NoticeRequest) => Promise<void> | void;
42
+ /**
43
+ * Verify a sender's asserted identity, and return the identity the
44
+ * recipient should actually use — which is never simply `from` handed
45
+ * back, because a value the recipient uses for a decision (`mode`,
46
+ * `kind`) or shows the operator (`name`, `ref`) must come from something
47
+ * the sender does not control on this one connection. `false` refuses.
48
+ *
49
+ * Default ({@link defaultVerifySender}): the sender's registry record
50
+ * exists, is live ({@link isPeerRecordLive}), its `address` equals
51
+ * `from.address`, and its `permissionMode`/`kind` equal `from.mode`/
52
+ * `from.kind` (design §1.3) — so a process cannot claim to be a session
53
+ * it does not own, and a session cannot claim a mode or kind other than
54
+ * the one it registered. The identity returned on success is built
55
+ * entirely from the record: `name` is the record's own display name
56
+ * (`title`, or the last path segment of `cwd` when unset), never the
57
+ * wire's `from.name`.
58
+ */
59
+ readonly verifySender?: (from: PeerFrom) => Promise<PeerFrom | false> | PeerFrom | false;
60
+ /** Default 2000ms; override for tests so a deadline test does not have to wait 2 real seconds. */
61
+ readonly readDeadlineMs?: number;
62
+ /** Default 16; override for tests. */
63
+ readonly maxConnections?: number;
64
+ /** Default 64 KiB; override for tests. */
65
+ readonly maxRequestBytes?: number;
66
+ /** Default 500ms; the timeout the default `verifySender`'s liveness ping uses. */
67
+ readonly livenessPingTimeoutMs?: number;
68
+ /** Default {@link MAX_OUTSTANDING_PEERS}; override for tests. */
69
+ readonly maxOutstandingPeers?: number;
70
+ /** Default {@link MAX_OUTSTANDING_PER_PEER}; override for tests. */
71
+ readonly maxOutstandingPerPeer?: number;
72
+ /** Default {@link OUTSTANDING_EXPIRY_MS}; override for tests. */
73
+ readonly outstandingExpiryMs?: number;
74
+ /** Default `Date.now`; injectable so an expiry test does not have to wait 24 real hours. */
75
+ readonly now?: () => number;
76
+ /**
77
+ * Discards when absent ({@link resolveLogger}). Used only to warn, at
78
+ * most once per peer per minute, when the outstanding-delivery or
79
+ * outstanding-subscription table drops a registration at the per-peer
80
+ * cap or evicts one to stay under the peer-count cap — never for
81
+ * anything else this endpoint does, and never with message content.
82
+ */
83
+ readonly logger?: Logger;
84
+ }
85
+ export interface PeerEndpoint {
86
+ readonly address: string;
87
+ /** Refuse new connections and destroy remaining sockets before resolving. */
88
+ close(): Promise<void>;
89
+ /**
90
+ * Record that THIS session sent a `deliver` to `peerSessionId` and so
91
+ * expects a `delivery` notice back about it. A `notice` naming a peer
92
+ * with no outstanding delivery is refused (§1.3): a session that never
93
+ * dealt with this recipient cannot manufacture an outcome for a message
94
+ * that was never sent. Counted, not boolean — several messages to the
95
+ * same peer may be outstanding at once, and each accepted notice
96
+ * consumes exactly one. Bounded and expiring
97
+ * ({@link MAX_OUTSTANDING_PEERS} distinct peers, {@link
98
+ * MAX_OUTSTANDING_PER_PEER} per peer, {@link OUTSTANDING_EXPIRY_MS}
99
+ * idle), so a peer that never answers cannot pin memory forever and a
100
+ * session cannot be driven to register unbounded distinct peer ids.
101
+ */
102
+ registerOutstandingDelivery(peerSessionId: string): void;
103
+ /**
104
+ * Record that THIS session subscribed (directly, or via
105
+ * `deliver.subscribeIdle`) to `peerSessionId`'s idle/exit notice. An
106
+ * `idle`/`exited` notice naming a peer with no outstanding subscription
107
+ * is refused, the same reasoning as {@link registerOutstandingDelivery},
108
+ * with the same bound and expiry.
109
+ */
110
+ registerOutstandingSubscription(peerSessionId: string): void;
111
+ }
112
+ /**
113
+ * Distinct peer sessions an endpoint's outstanding-delivery or
114
+ * outstanding-subscription table tracks at once, before the oldest is
115
+ * evicted to make room. A session that talks to hundreds of distinct peers
116
+ * without ever hearing back from most of them is already an anomaly this
117
+ * table should not have to hold unbounded memory for.
118
+ */
119
+ export declare const MAX_OUTSTANDING_PEERS = 256;
120
+ /**
121
+ * Outstanding relationships tracked for any ONE peer at once, before further
122
+ * registrations for that same peer stop increasing the count. Generous
123
+ * enough for many messages or resubscriptions in flight to a single busy
124
+ * peer; still a bound, so one peer cannot itself grow this table's memory
125
+ * without limit by being registered against repeatedly.
126
+ */
127
+ export declare const MAX_OUTSTANDING_PER_PEER = 64;
128
+ /**
129
+ * How long an outstanding delivery or subscription is honoured with no
130
+ * activity before it is swept away on its own, matching the design's
131
+ * `notify_when_idle` subscription expiry (§1.7): a peer that never answers —
132
+ * crashed, or simply never will — must not pin memory forever.
133
+ */
134
+ export declare const OUTSTANDING_EXPIRY_MS: number;
135
+ /**
136
+ * Start serving `namzu-peer/1` on `options.address`.
137
+ *
138
+ * The four business-decision callbacks (`onDeliver`, `onSubscribeIdle`,
139
+ * `onNotice`, and the default-overriding `verifySender`) decide outcomes;
140
+ * this function owns only the transport: framing, the size/connection/
141
+ * deadline limits, the closed op set, and token comparison.
142
+ */
143
+ export declare function createPeerEndpoint(options: CreatePeerEndpointOptions): Promise<PeerEndpoint>;
144
+ //# sourceMappingURL=endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/peers/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAG/D,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEb,KAAK,gBAAgB,EAErB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,MAAM,eAAe,CAAA;AAItB,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,uBAAsB;CAC5C;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,kGAAkG;IAClG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAC3F,QAAQ,CAAC,eAAe,EAAE,CACzB,OAAO,EAAE,oBAAoB,KACzB,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnE;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAA;IACxF,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,sCAAsC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,kFAAkF;IAClF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,oEAAoE;IACpE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,6EAA6E;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACxD;;;;;;OAMG;IACH,+BAA+B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5D;AAyCD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAsB,CAAA;AAqJxD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,yBAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CAwMvB"}