@namzu/sdk 46.0.0 → 48.0.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 (732) hide show
  1. package/CHANGELOG.md +325 -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 +60 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +13 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +20 -3
  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/index.d.ts +2 -0
  118. package/dist/connector/mcp/index.d.ts.map +1 -1
  119. package/dist/connector/mcp/index.js +11 -0
  120. package/dist/connector/mcp/index.js.map +1 -1
  121. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  122. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  123. package/dist/connector/mcp/mcp-toolset.js +399 -0
  124. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  125. package/dist/connector/tools/index.d.ts +2 -2
  126. package/dist/connector/tools/index.d.ts.map +1 -1
  127. package/dist/connector/tools/index.js +1 -1
  128. package/dist/connector/tools/index.js.map +1 -1
  129. package/dist/connector/tools/router.d.ts +15 -13
  130. package/dist/connector/tools/router.d.ts.map +1 -1
  131. package/dist/connector/tools/router.js +30 -51
  132. package/dist/connector/tools/router.js.map +1 -1
  133. package/dist/contracts/a2a.d.ts +2 -2
  134. package/dist/directory/derive-supervisor.d.ts +2 -2
  135. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  136. package/dist/directory/derive-supervisor.js +6 -7
  137. package/dist/directory/derive-supervisor.js.map +1 -1
  138. package/dist/directory/derive.d.ts.map +1 -1
  139. package/dist/directory/derive.js +5 -5
  140. package/dist/directory/derive.js.map +1 -1
  141. package/dist/execution/code-runtime/types.d.ts +2 -2
  142. package/dist/execution/code-runtime/types.js +1 -1
  143. package/dist/invariants/index.d.ts +2 -1
  144. package/dist/invariants/index.d.ts.map +1 -1
  145. package/dist/invariants/index.js +3 -2
  146. package/dist/invariants/index.js.map +1 -1
  147. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  148. package/dist/manager/agent/lifecycle.js +9 -0
  149. package/dist/manager/agent/lifecycle.js.map +1 -1
  150. package/dist/manager/connector/environment.d.ts +6 -0
  151. package/dist/manager/connector/environment.d.ts.map +1 -1
  152. package/dist/manager/connector/environment.js +11 -4
  153. package/dist/manager/connector/environment.js.map +1 -1
  154. package/dist/manager/connector/index.d.ts +2 -2
  155. package/dist/manager/connector/index.d.ts.map +1 -1
  156. package/dist/manager/connector/index.js +2 -2
  157. package/dist/manager/connector/index.js.map +1 -1
  158. package/dist/manager/connector/tenant.d.ts +6 -0
  159. package/dist/manager/connector/tenant.d.ts.map +1 -1
  160. package/dist/manager/connector/tenant.js +11 -4
  161. package/dist/manager/connector/tenant.js.map +1 -1
  162. package/dist/manager/index.d.ts +2 -2
  163. package/dist/manager/index.d.ts.map +1 -1
  164. package/dist/manager/index.js +2 -2
  165. package/dist/manager/index.js.map +1 -1
  166. package/dist/manager/resident/learning-observation.d.ts +4 -4
  167. package/dist/manager/resident/learning.d.ts +36 -36
  168. package/dist/manager/session/attribution.d.ts +22 -0
  169. package/dist/manager/session/attribution.d.ts.map +1 -0
  170. package/dist/manager/session/attribution.js +64 -0
  171. package/dist/manager/session/attribution.js.map +1 -0
  172. package/dist/manager/session/turn-recorder.d.ts +14 -0
  173. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  174. package/dist/manager/session/turn-recorder.js +208 -55
  175. package/dist/manager/session/turn-recorder.js.map +1 -1
  176. package/dist/peers/address.d.ts +36 -0
  177. package/dist/peers/address.d.ts.map +1 -0
  178. package/dist/peers/address.js +52 -0
  179. package/dist/peers/address.js.map +1 -0
  180. package/dist/peers/client.d.ts +47 -0
  181. package/dist/peers/client.d.ts.map +1 -0
  182. package/dist/peers/client.js +132 -0
  183. package/dist/peers/client.js.map +1 -0
  184. package/dist/peers/dir.d.ts +88 -0
  185. package/dist/peers/dir.d.ts.map +1 -0
  186. package/dist/peers/dir.js +139 -0
  187. package/dist/peers/dir.js.map +1 -0
  188. package/dist/peers/endpoint.d.ts +144 -0
  189. package/dist/peers/endpoint.d.ts.map +1 -0
  190. package/dist/peers/endpoint.js +420 -0
  191. package/dist/peers/endpoint.js.map +1 -0
  192. package/dist/peers/envelope.d.ts +42 -0
  193. package/dist/peers/envelope.d.ts.map +1 -0
  194. package/dist/peers/envelope.js +110 -0
  195. package/dist/peers/envelope.js.map +1 -0
  196. package/dist/peers/index.d.ts +30 -0
  197. package/dist/peers/index.d.ts.map +1 -0
  198. package/dist/peers/index.js +22 -0
  199. package/dist/peers/index.js.map +1 -0
  200. package/dist/peers/protocol.d.ts +645 -0
  201. package/dist/peers/protocol.d.ts.map +1 -0
  202. package/dist/peers/protocol.js +151 -0
  203. package/dist/peers/protocol.js.map +1 -0
  204. package/dist/peers/record.d.ts +71 -0
  205. package/dist/peers/record.d.ts.map +1 -0
  206. package/dist/peers/record.js +45 -0
  207. package/dist/peers/record.js.map +1 -0
  208. package/dist/peers/registry.d.ts +54 -0
  209. package/dist/peers/registry.d.ts.map +1 -0
  210. package/dist/peers/registry.js +213 -0
  211. package/dist/peers/registry.js.map +1 -0
  212. package/dist/plugin/define.d.ts +24 -0
  213. package/dist/plugin/define.d.ts.map +1 -0
  214. package/dist/plugin/define.js +42 -0
  215. package/dist/plugin/define.js.map +1 -0
  216. package/dist/plugin/index.d.ts +2 -0
  217. package/dist/plugin/index.d.ts.map +1 -1
  218. package/dist/plugin/index.js +1 -0
  219. package/dist/plugin/index.js.map +1 -1
  220. package/dist/plugin/lifecycle.d.ts +27 -3
  221. package/dist/plugin/lifecycle.d.ts.map +1 -1
  222. package/dist/plugin/lifecycle.js +242 -92
  223. package/dist/plugin/lifecycle.js.map +1 -1
  224. package/dist/plugin/resolver.d.ts +2 -2
  225. package/dist/plugin/resolver.d.ts.map +1 -1
  226. package/dist/plugin/resolver.js.map +1 -1
  227. package/dist/plugin/shell-hook.d.ts.map +1 -1
  228. package/dist/plugin/shell-hook.js +17 -3
  229. package/dist/plugin/shell-hook.js.map +1 -1
  230. package/dist/probe/errors.d.ts +2 -1
  231. package/dist/probe/errors.d.ts.map +1 -1
  232. package/dist/probe/errors.js +3 -2
  233. package/dist/probe/errors.js.map +1 -1
  234. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  235. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  236. package/dist/prompt/coding-agent-doctrine.js +11 -6
  237. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  238. package/dist/prompt/contributions.d.ts +4 -1
  239. package/dist/prompt/contributions.d.ts.map +1 -1
  240. package/dist/prompt/contributions.js +7 -2
  241. package/dist/prompt/contributions.js.map +1 -1
  242. package/dist/prompt/index.d.ts +1 -1
  243. package/dist/prompt/index.d.ts.map +1 -1
  244. package/dist/prompt/index.js +1 -1
  245. package/dist/prompt/index.js.map +1 -1
  246. package/dist/provider/collect-chat-completion.d.ts +6 -1
  247. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  248. package/dist/provider/collect-chat-completion.js +88 -10
  249. package/dist/provider/collect-chat-completion.js.map +1 -1
  250. package/dist/provider/mock.d.ts.map +1 -1
  251. package/dist/provider/mock.js +23 -6
  252. package/dist/provider/mock.js.map +1 -1
  253. package/dist/provider/registry.d.ts +2 -1
  254. package/dist/provider/registry.d.ts.map +1 -1
  255. package/dist/provider/registry.js +3 -2
  256. package/dist/provider/registry.js.map +1 -1
  257. package/dist/provider/tool-call-framing.d.ts +164 -0
  258. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  259. package/dist/provider/tool-call-framing.js +163 -0
  260. package/dist/provider/tool-call-framing.js.map +1 -0
  261. package/dist/public-runtime.d.ts +24 -11
  262. package/dist/public-runtime.d.ts.map +1 -1
  263. package/dist/public-runtime.js +45 -9
  264. package/dist/public-runtime.js.map +1 -1
  265. package/dist/public-tools.d.ts +6 -4
  266. package/dist/public-tools.d.ts.map +1 -1
  267. package/dist/public-tools.js +8 -3
  268. package/dist/public-tools.js.map +1 -1
  269. package/dist/public-types.d.ts +13 -2
  270. package/dist/public-types.d.ts.map +1 -1
  271. package/dist/read-model/registry.d.ts +2 -1
  272. package/dist/read-model/registry.d.ts.map +1 -1
  273. package/dist/read-model/registry.js +3 -2
  274. package/dist/read-model/registry.js.map +1 -1
  275. package/dist/registry/ManagedRegistry.d.ts +30 -0
  276. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  277. package/dist/registry/ManagedRegistry.js +45 -6
  278. package/dist/registry/ManagedRegistry.js.map +1 -1
  279. package/dist/registry/collision.d.ts +57 -0
  280. package/dist/registry/collision.d.ts.map +1 -0
  281. package/dist/registry/collision.js +41 -0
  282. package/dist/registry/collision.js.map +1 -0
  283. package/dist/registry/command/index.d.ts +5 -3
  284. package/dist/registry/command/index.d.ts.map +1 -1
  285. package/dist/registry/command/index.js +6 -4
  286. package/dist/registry/command/index.js.map +1 -1
  287. package/dist/registry/index.d.ts +3 -4
  288. package/dist/registry/index.d.ts.map +1 -1
  289. package/dist/registry/index.js +2 -2
  290. package/dist/registry/index.js.map +1 -1
  291. package/dist/registry/plugin/index.d.ts.map +1 -1
  292. package/dist/registry/plugin/index.js +14 -1
  293. package/dist/registry/plugin/index.js.map +1 -1
  294. package/dist/registry/tool/callable.d.ts +7 -7
  295. package/dist/registry/tool/callable.d.ts.map +1 -1
  296. package/dist/registry/tool/callable.js +6 -7
  297. package/dist/registry/tool/callable.js.map +1 -1
  298. package/dist/registry/tool/execute.d.ts +14 -77
  299. package/dist/registry/tool/execute.d.ts.map +1 -1
  300. package/dist/registry/tool/execute.js +15 -727
  301. package/dist/registry/tool/execute.js.map +1 -1
  302. package/dist/registry/tool/portable.d.ts +25 -0
  303. package/dist/registry/tool/portable.d.ts.map +1 -1
  304. package/dist/registry/tool/portable.js +50 -0
  305. package/dist/registry/tool/portable.js.map +1 -1
  306. package/dist/registry/tool/presentation.d.ts +6 -5
  307. package/dist/registry/tool/presentation.d.ts.map +1 -1
  308. package/dist/registry/tool/presentation.js +3 -3
  309. package/dist/registry/tool/presentation.js.map +1 -1
  310. package/dist/runtime/bidi/session.d.ts +5 -4
  311. package/dist/runtime/bidi/session.d.ts.map +1 -1
  312. package/dist/runtime/bidi/session.js +18 -1
  313. package/dist/runtime/bidi/session.js.map +1 -1
  314. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  315. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  316. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  317. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  318. package/dist/runtime/query/executor.d.ts +33 -3
  319. package/dist/runtime/query/executor.d.ts.map +1 -1
  320. package/dist/runtime/query/executor.js +86 -10
  321. package/dist/runtime/query/executor.js.map +1 -1
  322. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  323. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  324. package/dist/runtime/query/file-evidence-replay.js +8 -7
  325. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  326. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  327. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  328. package/dist/runtime/query/fork/prepare.js +4 -0
  329. package/dist/runtime/query/fork/prepare.js.map +1 -1
  330. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  331. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  332. package/dist/runtime/query/guardrail-presets.js +4 -3
  333. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  334. package/dist/runtime/query/index.d.ts +23 -10
  335. package/dist/runtime/query/index.d.ts.map +1 -1
  336. package/dist/runtime/query/index.js +149 -70
  337. package/dist/runtime/query/index.js.map +1 -1
  338. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  339. package/dist/runtime/query/iteration/index.js +8 -1
  340. package/dist/runtime/query/iteration/index.js.map +1 -1
  341. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  342. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  343. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  344. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  345. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  346. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  347. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  348. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  350. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  351. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  352. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  353. package/dist/runtime/query/iteration/tool-input.js +291 -0
  354. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  355. package/dist/runtime/query/observation-context.d.ts +2 -2
  356. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  357. package/dist/runtime/query/observation-context.js.map +1 -1
  358. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  359. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  360. package/dist/runtime/query/prelude-lease.js +121 -0
  361. package/dist/runtime/query/prelude-lease.js.map +1 -0
  362. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  363. package/dist/runtime/query/prepare-turn.js +386 -187
  364. package/dist/runtime/query/prepare-turn.js.map +1 -1
  365. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  366. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  367. package/dist/runtime/query/prompt.d.ts +2 -2
  368. package/dist/runtime/query/prompt.d.ts.map +1 -1
  369. package/dist/runtime/query/prompt.js +1 -1
  370. package/dist/runtime/query/prompt.js.map +1 -1
  371. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  372. package/dist/runtime/query/resume-session.js +37 -2
  373. package/dist/runtime/query/resume-session.js.map +1 -1
  374. package/dist/runtime/query/review-policy.d.ts +22 -3
  375. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  376. package/dist/runtime/query/review-policy.js +84 -6
  377. package/dist/runtime/query/review-policy.js.map +1 -1
  378. package/dist/runtime/query/tooling.d.ts +3 -2
  379. package/dist/runtime/query/tooling.d.ts.map +1 -1
  380. package/dist/runtime/query/tooling.js.map +1 -1
  381. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  382. package/dist/runtime/query/turn-state.js +5 -0
  383. package/dist/runtime/query/turn-state.js.map +1 -1
  384. package/dist/runtime/system-events.d.ts +112 -0
  385. package/dist/runtime/system-events.d.ts.map +1 -0
  386. package/dist/runtime/system-events.js +183 -0
  387. package/dist/runtime/system-events.js.map +1 -0
  388. package/dist/scheduler/delegating.d.ts +2 -1
  389. package/dist/scheduler/delegating.d.ts.map +1 -1
  390. package/dist/scheduler/delegating.js +3 -2
  391. package/dist/scheduler/delegating.js.map +1 -1
  392. package/dist/skills/index.d.ts +1 -1
  393. package/dist/skills/index.d.ts.map +1 -1
  394. package/dist/skills/index.js +1 -1
  395. package/dist/skills/index.js.map +1 -1
  396. package/dist/skills/registry.d.ts +12 -0
  397. package/dist/skills/registry.d.ts.map +1 -1
  398. package/dist/skills/registry.js +19 -0
  399. package/dist/skills/registry.js.map +1 -1
  400. package/dist/store/evidence/index-page.d.ts +2 -2
  401. package/dist/store/session-log/conformance.d.ts +1 -1
  402. package/dist/store/session-log/conformance.d.ts.map +1 -1
  403. package/dist/store/session-log/conformance.js +49 -8
  404. package/dist/store/session-log/conformance.js.map +1 -1
  405. package/dist/store/session-log/core.d.ts +8 -3
  406. package/dist/store/session-log/core.d.ts.map +1 -1
  407. package/dist/store/session-log/core.js +2 -1
  408. package/dist/store/session-log/core.js.map +1 -1
  409. package/dist/store/session-log/fold.d.ts +12 -0
  410. package/dist/store/session-log/fold.d.ts.map +1 -1
  411. package/dist/store/session-log/fold.js +57 -7
  412. package/dist/store/session-log/fold.js.map +1 -1
  413. package/dist/store/session-log/index.d.ts +2 -2
  414. package/dist/store/session-log/index.d.ts.map +1 -1
  415. package/dist/store/session-log/index.js +1 -1
  416. package/dist/store/session-log/index.js.map +1 -1
  417. package/dist/test-support/toolset.d.ts +19 -0
  418. package/dist/test-support/toolset.d.ts.map +1 -0
  419. package/dist/test-support/toolset.js +20 -0
  420. package/dist/test-support/toolset.js.map +1 -0
  421. package/dist/tools/builtins/bash.d.ts +29 -0
  422. package/dist/tools/builtins/bash.d.ts.map +1 -1
  423. package/dist/tools/builtins/bash.js +19 -9
  424. package/dist/tools/builtins/bash.js.map +1 -1
  425. package/dist/tools/builtins/browser-url.d.ts +1 -1
  426. package/dist/tools/builtins/browser-url.js +1 -1
  427. package/dist/tools/builtins/browser.d.ts +6 -6
  428. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  429. package/dist/tools/builtins/computer-use.js +19 -11
  430. package/dist/tools/builtins/computer-use.js.map +1 -1
  431. package/dist/tools/builtins/edit.d.ts.map +1 -1
  432. package/dist/tools/builtins/edit.js +9 -1
  433. package/dist/tools/builtins/edit.js.map +1 -1
  434. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  435. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  436. package/dist/tools/builtins/json-string-hint.js +17 -0
  437. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  438. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  439. package/dist/tools/builtins/search-tools.js +7 -15
  440. package/dist/tools/builtins/search-tools.js.map +1 -1
  441. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  442. package/dist/tools/builtins/write-file.js +11 -0
  443. package/dist/tools/builtins/write-file.js.map +1 -1
  444. package/dist/tools/command-shell.d.ts +10 -0
  445. package/dist/tools/command-shell.d.ts.map +1 -1
  446. package/dist/tools/command-shell.js +45 -1
  447. package/dist/tools/command-shell.js.map +1 -1
  448. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  449. package/dist/tools/coordinator/agent.js +5 -0
  450. package/dist/tools/coordinator/agent.js.map +1 -1
  451. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  452. package/dist/tools/coordinator/ask-user-question.js +26 -13
  453. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  454. package/dist/tools/coordinator/index.d.ts.map +1 -1
  455. package/dist/tools/coordinator/index.js +5 -0
  456. package/dist/tools/coordinator/index.js.map +1 -1
  457. package/dist/tools/coordinator/question-options.d.ts +78 -0
  458. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  459. package/dist/tools/coordinator/question-options.js +153 -0
  460. package/dist/tools/coordinator/question-options.js.map +1 -0
  461. package/dist/tools/defineTool.d.ts +10 -0
  462. package/dist/tools/defineTool.d.ts.map +1 -1
  463. package/dist/tools/defineTool.js +17 -0
  464. package/dist/tools/defineTool.js.map +1 -1
  465. package/dist/tools/memory/search.d.ts.map +1 -1
  466. package/dist/tools/memory/search.js +4 -1
  467. package/dist/tools/memory/search.js.map +1 -1
  468. package/dist/tools/memory/update.d.ts.map +1 -1
  469. package/dist/tools/memory/update.js +8 -5
  470. package/dist/tools/memory/update.js.map +1 -1
  471. package/dist/tools/render-nonce.d.ts +47 -0
  472. package/dist/tools/render-nonce.d.ts.map +1 -0
  473. package/dist/tools/render-nonce.js +63 -0
  474. package/dist/tools/render-nonce.js.map +1 -0
  475. package/dist/tools/roster.d.ts +46 -19
  476. package/dist/tools/roster.d.ts.map +1 -1
  477. package/dist/tools/roster.js +63 -33
  478. package/dist/tools/roster.js.map +1 -1
  479. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  480. package/dist/tools/schedules/schedule-tool.js +94 -14
  481. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  482. package/dist/tools/schedules/types.d.ts +52 -6
  483. package/dist/tools/schedules/types.d.ts.map +1 -1
  484. package/dist/tools/trusted-read-only.d.ts +9 -5
  485. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  486. package/dist/tools/trusted-read-only.js +14 -10
  487. package/dist/tools/trusted-read-only.js.map +1 -1
  488. package/dist/tools/untrusted-envelope.d.ts +67 -28
  489. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  490. package/dist/tools/untrusted-envelope.js +108 -59
  491. package/dist/tools/untrusted-envelope.js.map +1 -1
  492. package/dist/toolsets/combine.d.ts +44 -0
  493. package/dist/toolsets/combine.d.ts.map +1 -0
  494. package/dist/toolsets/combine.js +153 -0
  495. package/dist/toolsets/combine.js.map +1 -0
  496. package/dist/toolsets/manager.d.ts +201 -0
  497. package/dist/toolsets/manager.d.ts.map +1 -0
  498. package/dist/toolsets/manager.js +837 -0
  499. package/dist/toolsets/manager.js.map +1 -0
  500. package/dist/toolsets/source-glob.d.ts +15 -0
  501. package/dist/toolsets/source-glob.d.ts.map +1 -0
  502. package/dist/toolsets/source-glob.js +23 -0
  503. package/dist/toolsets/source-glob.js.map +1 -0
  504. package/dist/toolsets/toolset.d.ts +20 -0
  505. package/dist/toolsets/toolset.d.ts.map +1 -0
  506. package/dist/toolsets/toolset.js +28 -0
  507. package/dist/toolsets/toolset.js.map +1 -0
  508. package/dist/toolsets/types.d.ts +128 -0
  509. package/dist/toolsets/types.d.ts.map +1 -0
  510. package/dist/toolsets/types.js +33 -0
  511. package/dist/toolsets/types.js.map +1 -0
  512. package/dist/toolsets/wrappers.d.ts +59 -0
  513. package/dist/toolsets/wrappers.d.ts.map +1 -0
  514. package/dist/toolsets/wrappers.js +165 -0
  515. package/dist/toolsets/wrappers.js.map +1 -0
  516. package/dist/types/agent/base.d.ts +27 -16
  517. package/dist/types/agent/base.d.ts.map +1 -1
  518. package/dist/types/agent/index.d.ts +1 -0
  519. package/dist/types/agent/index.d.ts.map +1 -1
  520. package/dist/types/agent/index.js +1 -0
  521. package/dist/types/agent/index.js.map +1 -1
  522. package/dist/types/agent/pipeline.d.ts +2 -0
  523. package/dist/types/agent/pipeline.d.ts.map +1 -1
  524. package/dist/types/agent/query.d.ts +117 -0
  525. package/dist/types/agent/query.d.ts.map +1 -0
  526. package/dist/types/agent/query.js +2 -0
  527. package/dist/types/agent/query.js.map +1 -0
  528. package/dist/types/agent/reactive.d.ts +2 -129
  529. package/dist/types/agent/reactive.d.ts.map +1 -1
  530. package/dist/types/agent/router.d.ts +2 -0
  531. package/dist/types/agent/router.d.ts.map +1 -1
  532. package/dist/types/agent/supervisor.d.ts +5 -2
  533. package/dist/types/agent/supervisor.d.ts.map +1 -1
  534. package/dist/types/authorization/index.d.ts +49 -12
  535. package/dist/types/authorization/index.d.ts.map +1 -1
  536. package/dist/types/authorization/index.js +6 -0
  537. package/dist/types/authorization/index.js.map +1 -1
  538. package/dist/types/connector/mcp.d.ts +32 -0
  539. package/dist/types/connector/mcp.d.ts.map +1 -1
  540. package/dist/types/errors/index.d.ts +15 -0
  541. package/dist/types/errors/index.d.ts.map +1 -1
  542. package/dist/types/errors/index.js.map +1 -1
  543. package/dist/types/hitl/index.d.ts +57 -0
  544. package/dist/types/hitl/index.d.ts.map +1 -1
  545. package/dist/types/hitl/index.js.map +1 -1
  546. package/dist/types/message/index.d.ts +130 -9
  547. package/dist/types/message/index.d.ts.map +1 -1
  548. package/dist/types/message/index.js +4 -1
  549. package/dist/types/message/index.js.map +1 -1
  550. package/dist/types/plugin/index.d.ts +22 -4
  551. package/dist/types/plugin/index.d.ts.map +1 -1
  552. package/dist/types/plugin/index.js +1 -0
  553. package/dist/types/plugin/index.js.map +1 -1
  554. package/dist/types/provider/chat.d.ts +5 -0
  555. package/dist/types/provider/chat.d.ts.map +1 -1
  556. package/dist/types/provider/config.d.ts +8 -3
  557. package/dist/types/provider/config.d.ts.map +1 -1
  558. package/dist/types/provider/stream.d.ts +39 -0
  559. package/dist/types/provider/stream.d.ts.map +1 -1
  560. package/dist/types/sandbox/index.d.ts +1 -1
  561. package/dist/types/session/events.d.ts +14 -3
  562. package/dist/types/session/events.d.ts.map +1 -1
  563. package/dist/types/session/events.js.map +1 -1
  564. package/dist/types/tool/index.d.ts +152 -91
  565. package/dist/types/tool/index.d.ts.map +1 -1
  566. package/dist/types/tool/index.js.map +1 -1
  567. package/dist/types/toolset/index.d.ts +10 -40
  568. package/dist/types/toolset/index.d.ts.map +1 -1
  569. package/package.json +1 -1
  570. package/src/advisory/history.ts +27 -2
  571. package/src/advisory/index.ts +1 -1
  572. package/src/advisory/registry.ts +33 -0
  573. package/src/agents/AGENTS.md +14 -7
  574. package/src/agents/PipelineAgent.ts +2 -303
  575. package/src/agents/QueryAgent.ts +269 -0
  576. package/src/agents/ReactiveAgent.ts +6 -216
  577. package/src/agents/RouterAgent.ts +2 -337
  578. package/src/agents/SupervisorAgent.ts +3 -476
  579. package/src/agents/defineAgent.ts +13 -2
  580. package/src/agents/examples/PipelineAgent.ts +302 -0
  581. package/src/agents/examples/RouterAgent.ts +338 -0
  582. package/src/agents/examples/SupervisorAgent.ts +472 -0
  583. package/src/agents/explore.ts +6 -3
  584. package/src/agents/forward-options.ts +37 -0
  585. package/src/agents/index.ts +2 -0
  586. package/src/agents/runAgent.ts +144 -37
  587. package/src/authorization/command-line.ts +2 -2
  588. package/src/authorization/gate.ts +21 -1
  589. package/src/authorization/program.ts +773 -0
  590. package/src/authorization/reexec-wrapper.ts +589 -0
  591. package/src/authorization/rules.ts +18 -1
  592. package/src/authorization/shell-lexer.ts +104 -59
  593. package/src/bridge/sse/mapper.ts +6 -0
  594. package/src/capabilities/index.ts +157 -0
  595. package/src/config/registry.ts +4 -1
  596. package/src/connector/index.ts +9 -2
  597. package/src/connector/mcp/adapter.ts +58 -3
  598. package/src/connector/mcp/client.ts +20 -4
  599. package/src/connector/mcp/discovery.ts +60 -0
  600. package/src/connector/mcp/index.ts +13 -0
  601. package/src/connector/mcp/mcp-toolset.ts +515 -0
  602. package/src/connector/tools/index.ts +2 -2
  603. package/src/connector/tools/router.ts +35 -58
  604. package/src/directory/derive-supervisor.ts +12 -8
  605. package/src/directory/derive.ts +8 -5
  606. package/src/execution/code-runtime/types.ts +2 -2
  607. package/src/invariants/index.ts +4 -1
  608. package/src/manager/agent/lifecycle.ts +9 -0
  609. package/src/manager/connector/environment.ts +17 -4
  610. package/src/manager/connector/index.ts +2 -2
  611. package/src/manager/connector/tenant.ts +17 -4
  612. package/src/manager/index.ts +2 -2
  613. package/src/manager/session/attribution.ts +79 -0
  614. package/src/manager/session/turn-recorder.ts +211 -55
  615. package/src/peers/address.ts +58 -0
  616. package/src/peers/client.ts +202 -0
  617. package/src/peers/dir.ts +176 -0
  618. package/src/peers/endpoint.ts +564 -0
  619. package/src/peers/envelope.ts +121 -0
  620. package/src/peers/index.ts +96 -0
  621. package/src/peers/protocol.ts +196 -0
  622. package/src/peers/record.ts +56 -0
  623. package/src/peers/registry.ts +241 -0
  624. package/src/plugin/define.ts +68 -0
  625. package/src/plugin/index.ts +2 -0
  626. package/src/plugin/lifecycle.ts +286 -106
  627. package/src/plugin/resolver.ts +6 -3
  628. package/src/plugin/shell-hook.ts +21 -5
  629. package/src/probe/errors.ts +4 -1
  630. package/src/prompt/coding-agent-doctrine.ts +22 -10
  631. package/src/prompt/contributions.ts +12 -2
  632. package/src/prompt/index.ts +1 -0
  633. package/src/provider/collect-chat-completion.ts +96 -11
  634. package/src/provider/mock.ts +24 -6
  635. package/src/provider/registry.ts +4 -1
  636. package/src/provider/tool-call-framing.ts +226 -0
  637. package/src/public-runtime.ts +136 -7
  638. package/src/public-tools.ts +24 -4
  639. package/src/public-types.ts +60 -6
  640. package/src/read-model/registry.ts +7 -2
  641. package/src/registry/ManagedRegistry.ts +57 -6
  642. package/src/registry/collision.ts +64 -0
  643. package/src/registry/command/index.ts +7 -3
  644. package/src/registry/index.ts +3 -9
  645. package/src/registry/plugin/index.ts +14 -1
  646. package/src/registry/tool/callable.ts +8 -9
  647. package/src/registry/tool/execute.ts +16 -846
  648. package/src/registry/tool/portable.ts +59 -0
  649. package/src/registry/tool/presentation.ts +6 -5
  650. package/src/runtime/bidi/session.ts +24 -5
  651. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  652. package/src/runtime/query/executor.ts +110 -12
  653. package/src/runtime/query/file-evidence-replay.ts +8 -7
  654. package/src/runtime/query/fork/prepare.ts +6 -1
  655. package/src/runtime/query/guardrail-presets.ts +4 -3
  656. package/src/runtime/query/index.ts +199 -101
  657. package/src/runtime/query/iteration/index.ts +13 -3
  658. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  659. package/src/runtime/query/iteration/phases/context.ts +2 -2
  660. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  661. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  662. package/src/runtime/query/iteration/tool-input.ts +284 -0
  663. package/src/runtime/query/observation-context.ts +2 -2
  664. package/src/runtime/query/prelude-lease.ts +132 -0
  665. package/src/runtime/query/prepare-turn.ts +477 -198
  666. package/src/runtime/query/prompt-cache.ts +2 -2
  667. package/src/runtime/query/prompt.ts +4 -4
  668. package/src/runtime/query/resume-session.ts +42 -3
  669. package/src/runtime/query/review-policy.ts +87 -9
  670. package/src/runtime/query/tooling.ts +3 -6
  671. package/src/runtime/query/turn-state.ts +4 -0
  672. package/src/runtime/system-events.ts +246 -0
  673. package/src/scheduler/delegating.ts +7 -2
  674. package/src/skills/index.ts +1 -1
  675. package/src/skills/registry.ts +25 -0
  676. package/src/store/session-log/conformance.ts +51 -8
  677. package/src/store/session-log/core.ts +10 -4
  678. package/src/store/session-log/fold.ts +33 -7
  679. package/src/store/session-log/index.ts +2 -0
  680. package/src/test-support/toolset.ts +23 -0
  681. package/src/tools/builtins/bash.ts +27 -10
  682. package/src/tools/builtins/browser-url.ts +1 -1
  683. package/src/tools/builtins/computer-use.ts +21 -11
  684. package/src/tools/builtins/edit.ts +12 -2
  685. package/src/tools/builtins/json-string-hint.ts +16 -0
  686. package/src/tools/builtins/search-tools.ts +7 -20
  687. package/src/tools/builtins/write-file.ts +12 -0
  688. package/src/tools/command-shell.ts +46 -1
  689. package/src/tools/coordinator/agent.ts +6 -0
  690. package/src/tools/coordinator/ask-user-question.ts +29 -15
  691. package/src/tools/coordinator/index.ts +6 -0
  692. package/src/tools/coordinator/question-options.ts +195 -0
  693. package/src/tools/defineTool.ts +28 -0
  694. package/src/tools/memory/search.ts +4 -1
  695. package/src/tools/memory/update.ts +8 -5
  696. package/src/tools/render-nonce.ts +69 -0
  697. package/src/tools/roster.ts +84 -33
  698. package/src/tools/schedules/schedule-tool.ts +107 -14
  699. package/src/tools/schedules/types.ts +52 -6
  700. package/src/tools/trusted-read-only.ts +19 -10
  701. package/src/tools/untrusted-envelope.ts +121 -57
  702. package/src/toolsets/combine.ts +181 -0
  703. package/src/toolsets/manager.ts +996 -0
  704. package/src/toolsets/source-glob.ts +22 -0
  705. package/src/toolsets/toolset.ts +31 -0
  706. package/src/toolsets/types.ts +154 -0
  707. package/src/toolsets/wrappers.ts +191 -0
  708. package/src/types/agent/base.ts +29 -16
  709. package/src/types/agent/index.ts +1 -0
  710. package/src/types/agent/pipeline.ts +2 -0
  711. package/src/types/agent/query.ts +129 -0
  712. package/src/types/agent/reactive.ts +5 -142
  713. package/src/types/agent/router.ts +2 -0
  714. package/src/types/agent/supervisor.ts +5 -2
  715. package/src/types/authorization/index.ts +12 -0
  716. package/src/types/connector/mcp.ts +32 -0
  717. package/src/types/errors/index.ts +15 -0
  718. package/src/types/hitl/index.ts +57 -0
  719. package/src/types/message/index.ts +135 -7
  720. package/src/types/plugin/index.ts +44 -21
  721. package/src/types/provider/chat.ts +5 -0
  722. package/src/types/provider/config.ts +8 -3
  723. package/src/types/provider/stream.ts +39 -0
  724. package/src/types/sandbox/index.ts +1 -1
  725. package/src/types/session/events.ts +14 -3
  726. package/src/types/tool/index.ts +154 -105
  727. package/src/types/toolset/index.ts +10 -47
  728. package/dist/registry/toolset/catalog.d.ts +0 -42
  729. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  730. package/dist/registry/toolset/catalog.js +0 -234
  731. package/dist/registry/toolset/catalog.js.map +0 -1
  732. package/src/registry/toolset/catalog.ts +0 -308
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The `namzu-peer/1` wire protocol: newline-delimited JSON, one request and
3
+ * one response per connection, a closed set of four operations (design
4
+ * §1.1, §1.3).
5
+ *
6
+ * Two deliberate departures from the design note, both narrow and both
7
+ * documented where they matter most:
8
+ *
9
+ * 1. **`ping` carries no token.** Every other op requires and verifies the
10
+ * recipient's token; `ping` is idempotent, has no side effect, and its
11
+ * answer (`{ok, state}`) discloses nothing the OS-user directory
12
+ * permission does not already gate (design §1.1: "the directory
13
+ * permission is the real gate"). `PeerClient.ping(address)` — the shape
14
+ * the spec's own client API names — takes no record and so has no token
15
+ * to send.
16
+ * 2. **`notice`'s `delivery` kind carries an optional `outcome`.** The design
17
+ * lists `notice`'s payload as `{kind, about, detail?}` with prose detail
18
+ * ("approved" / "denied" / "expired") for a delivery outcome, but gives
19
+ * `formatSystemEvent` a closed status set that a delivery notice must
20
+ * report from (`queued` | `held` | `refused`). `outcome` supplies that
21
+ * machine-readable status without parsing `detail`'s prose.
22
+ *
23
+ * @experimental
24
+ */
25
+ import { z } from 'zod';
26
+ export const PEER_PROTOCOL_VERSION = 'namzu-peer/1';
27
+ /** One request line, or one response line, must not exceed this many bytes. */
28
+ export const MAX_PEER_REQUEST_BYTES = 64 * 1024;
29
+ /** `deliver.text` must not exceed this many UTF-8 bytes. */
30
+ export const MAX_PEER_MESSAGE_TEXT_BYTES = 32 * 1024;
31
+ /** A connection that has not completed one request/response by this deadline is dropped. */
32
+ export const DEFAULT_PEER_READ_DEADLINE_MS = 2_000;
33
+ /** Concurrent connections a `createPeerEndpoint` server accepts before refusing new ones. */
34
+ export const MAX_PEER_CONNECTIONS = 16;
35
+ export const PeerSessionKindSchema = z.enum(['tui', 'exec', 'resident', 'scheduled']);
36
+ export const PeerSessionStateSchema = z.enum(['busy', 'idle', 'awaiting-permission']);
37
+ const REF_PATTERN = /^[0-9a-f]{6}$/;
38
+ /** First 6 hex characters of `sha256(sessionId)` — see `registry.ts` `derivePeerRef`. */
39
+ export const PeerRefSchema = z.string().regex(REF_PATTERN, 'must be 6 lowercase hex characters');
40
+ function byteLimitedString(maxBytes, message) {
41
+ return z
42
+ .string()
43
+ .min(1)
44
+ .refine((value) => Buffer.byteLength(value, 'utf8') <= maxBytes, { message });
45
+ }
46
+ /** The sender's asserted identity, checked by the recipient against its own registry (§1.3). */
47
+ export const PeerFromSchema = z
48
+ .object({
49
+ sessionId: z.string().min(1),
50
+ ref: PeerRefSchema,
51
+ name: z.string(),
52
+ address: z.string().min(1),
53
+ mode: z.string().min(1),
54
+ kind: PeerSessionKindSchema,
55
+ })
56
+ .strict();
57
+ // ─── ping ──────────────────────────────────────────────────────────────────
58
+ export const PingRequestSchema = z
59
+ .object({
60
+ protocol: z.literal(PEER_PROTOCOL_VERSION),
61
+ op: z.literal('ping'),
62
+ })
63
+ .strict();
64
+ export const PingResponseSchema = z
65
+ .object({
66
+ ok: z.boolean(),
67
+ state: PeerSessionStateSchema,
68
+ })
69
+ .strict();
70
+ // ─── deliver ─────────────────────────────────────────────────────────────
71
+ export const DeliverRequestSchema = z
72
+ .object({
73
+ protocol: z.literal(PEER_PROTOCOL_VERSION),
74
+ op: z.literal('deliver'),
75
+ token: z.string().min(1),
76
+ id: z.string().min(1),
77
+ from: PeerFromSchema,
78
+ text: byteLimitedString(MAX_PEER_MESSAGE_TEXT_BYTES, `must be at most ${MAX_PEER_MESSAGE_TEXT_BYTES} UTF-8 bytes`),
79
+ inReplyTo: z.string().min(1).optional(),
80
+ subscribeIdle: z.boolean().optional(),
81
+ })
82
+ .strict();
83
+ export const DeliverStatusSchema = z.enum(['queued', 'held', 'refused']);
84
+ export const DeliverResponseSchema = z
85
+ .object({
86
+ status: DeliverStatusSchema,
87
+ reason: z.string().optional(),
88
+ })
89
+ .strict();
90
+ // ─── subscribe_idle ────────────────────────────────────────────────────────
91
+ export const SubscribeIdleRequestSchema = z
92
+ .object({
93
+ protocol: z.literal(PEER_PROTOCOL_VERSION),
94
+ op: z.literal('subscribe_idle'),
95
+ token: z.string().min(1),
96
+ id: z.string().min(1),
97
+ from: PeerFromSchema,
98
+ })
99
+ .strict();
100
+ export const SubscribeIdleResponseSchema = z
101
+ .object({
102
+ status: z.enum(['subscribed', 'refused']),
103
+ })
104
+ .strict();
105
+ // ─── notice ────────────────────────────────────────────────────────────────
106
+ export const PeerNoticeAboutSchema = z
107
+ .object({
108
+ sessionId: z.string().min(1),
109
+ name: z.string(),
110
+ ref: PeerRefSchema,
111
+ })
112
+ .strict();
113
+ export const NoticeRequestSchema = z
114
+ .object({
115
+ protocol: z.literal(PEER_PROTOCOL_VERSION),
116
+ op: z.literal('notice'),
117
+ token: z.string().min(1),
118
+ /**
119
+ * The sender's asserted identity, checked the same way `deliver` and
120
+ * `subscribe_idle` check theirs (§1.3): the recipient's endpoint runs it
121
+ * through `verifySender` before calling `onNotice`. A notice with no
122
+ * `from` — the shape this protocol shipped with first — is not a
123
+ * well-formed request at all, the same as a `deliver` with no `from`.
124
+ */
125
+ from: PeerFromSchema,
126
+ kind: z.enum(['idle', 'exited', 'delivery']),
127
+ about: PeerNoticeAboutSchema,
128
+ /** Only meaningful, and only ever set, when `kind === 'delivery'`. */
129
+ outcome: DeliverStatusSchema.optional(),
130
+ detail: z.string().optional(),
131
+ })
132
+ .strict();
133
+ export const NoticeResponseSchema = z
134
+ .object({
135
+ ok: z.boolean(),
136
+ })
137
+ .strict();
138
+ /** The notice payload alone, with no envelope — what a host builds and what `formatPeerNotice` renders. */
139
+ export const PeerNoticePayloadSchema = NoticeRequestSchema.omit({
140
+ protocol: true,
141
+ op: true,
142
+ token: true,
143
+ });
144
+ // ─── the closed op set ───────────────────────────────────────────────────
145
+ export const PeerRequestSchema = z.discriminatedUnion('op', [
146
+ PingRequestSchema,
147
+ DeliverRequestSchema,
148
+ SubscribeIdleRequestSchema,
149
+ NoticeRequestSchema,
150
+ ]);
151
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/peers/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The live-session registry record (design §1.2): one JSON file per
3
+ * participating session, written into a hardened runtime directory's
4
+ * `sessions/` subdirectory (`resolvePeerRuntimeDir`, `dir.ts`).
5
+ *
6
+ * Kept separate from `registry.ts` (which reads and writes these files) so
7
+ * `client.ts` can depend on the record SHAPE without depending on file I/O,
8
+ * and `registry.ts` can depend on `client.ts` (to ping a peer for liveness)
9
+ * without a cycle.
10
+ *
11
+ * @experimental
12
+ */
13
+ import { z } from 'zod';
14
+ /** Bumped only if the on-disk record shape changes incompatibly. */
15
+ export declare const PEER_RECORD_VERSION = 1;
16
+ export declare const PeerRecordSchema: z.ZodObject<{
17
+ v: z.ZodLiteral<1>;
18
+ sessionId: z.ZodString;
19
+ /** First 6 hex characters of `sha256(sessionId)`; disambiguates a colliding display name. */
20
+ ref: z.ZodString;
21
+ pid: z.ZodNumber;
22
+ startedAt: z.ZodNumber;
23
+ kind: z.ZodEnum<["tui", "exec", "resident", "scheduled"]>;
24
+ /** Absent until the operator or the host sets one; the display name then falls back (design §1.2). */
25
+ title: z.ZodOptional<z.ZodString>;
26
+ cwd: z.ZodString;
27
+ /** The host's own permission-mode vocabulary; the SDK does not constrain its spelling. */
28
+ permissionMode: z.ZodString;
29
+ state: z.ZodEnum<["busy", "idle", "awaiting-permission"]>;
30
+ acceptsMessages: z.ZodBoolean;
31
+ address: z.ZodString;
32
+ token: z.ZodString;
33
+ protocol: z.ZodLiteral<"namzu-peer/1">;
34
+ cliVersion: z.ZodString;
35
+ }, "strict", z.ZodTypeAny, {
36
+ kind: "resident" | "exec" | "scheduled" | "tui";
37
+ v: 1;
38
+ sessionId: string;
39
+ token: string;
40
+ address: string;
41
+ cwd: string;
42
+ protocol: "namzu-peer/1";
43
+ startedAt: number;
44
+ state: "busy" | "idle" | "awaiting-permission";
45
+ permissionMode: string;
46
+ ref: string;
47
+ pid: number;
48
+ acceptsMessages: boolean;
49
+ cliVersion: string;
50
+ title?: string | undefined;
51
+ }, {
52
+ kind: "resident" | "exec" | "scheduled" | "tui";
53
+ v: 1;
54
+ sessionId: string;
55
+ token: string;
56
+ address: string;
57
+ cwd: string;
58
+ protocol: "namzu-peer/1";
59
+ startedAt: number;
60
+ state: "busy" | "idle" | "awaiting-permission";
61
+ permissionMode: string;
62
+ ref: string;
63
+ pid: number;
64
+ acceptsMessages: boolean;
65
+ cliVersion: string;
66
+ title?: string | undefined;
67
+ }>;
68
+ export type PeerRecord = z.infer<typeof PeerRecordSchema>;
69
+ /** `ref`: the first 6 hex characters of `sha256(sessionId)`, for a short, stable, collision-resistant tag. */
70
+ export declare function derivePeerRef(sessionId: string): string;
71
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/peers/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,eAAO,MAAM,gBAAgB;;;IAI3B,6FAA6F;;;;;IAK7F,sGAAsG;;;IAGtG,0FAA0F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlF,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAIzD,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The live-session registry record (design §1.2): one JSON file per
3
+ * participating session, written into a hardened runtime directory's
4
+ * `sessions/` subdirectory (`resolvePeerRuntimeDir`, `dir.ts`).
5
+ *
6
+ * Kept separate from `registry.ts` (which reads and writes these files) so
7
+ * `client.ts` can depend on the record SHAPE without depending on file I/O,
8
+ * and `registry.ts` can depend on `client.ts` (to ping a peer for liveness)
9
+ * without a cycle.
10
+ *
11
+ * @experimental
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { z } from 'zod';
15
+ import { PEER_PROTOCOL_VERSION, PeerRefSchema, PeerSessionKindSchema, PeerSessionStateSchema, } from './protocol.js';
16
+ /** Bumped only if the on-disk record shape changes incompatibly. */
17
+ export const PEER_RECORD_VERSION = 1;
18
+ export const PeerRecordSchema = z
19
+ .object({
20
+ v: z.literal(PEER_RECORD_VERSION),
21
+ sessionId: z.string().min(1),
22
+ /** First 6 hex characters of `sha256(sessionId)`; disambiguates a colliding display name. */
23
+ ref: PeerRefSchema,
24
+ pid: z.number().int().positive(),
25
+ startedAt: z.number().int().nonnegative(),
26
+ kind: PeerSessionKindSchema,
27
+ /** Absent until the operator or the host sets one; the display name then falls back (design §1.2). */
28
+ title: z.string().optional(),
29
+ cwd: z.string().min(1),
30
+ /** The host's own permission-mode vocabulary; the SDK does not constrain its spelling. */
31
+ permissionMode: z.string().min(1),
32
+ state: PeerSessionStateSchema,
33
+ acceptsMessages: z.boolean(),
34
+ address: z.string().min(1),
35
+ token: z.string().min(1),
36
+ protocol: z.literal(PEER_PROTOCOL_VERSION),
37
+ cliVersion: z.string(),
38
+ })
39
+ .strict();
40
+ const PEER_REF_HEX_LENGTH = 6;
41
+ /** `ref`: the first 6 hex characters of `sha256(sessionId)`, for a short, stable, collision-resistant tag. */
42
+ export function derivePeerRef(sessionId) {
43
+ return createHash('sha256').update(sessionId, 'utf8').digest('hex').slice(0, PEER_REF_HEX_LENGTH);
44
+ }
45
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/peers/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,sBAAsB,GACtB,MAAM,eAAe,CAAA;AAEtB,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACP,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,6FAA6F;IAC7F,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACzC,IAAI,EAAE,qBAAqB;IAC3B,sGAAsG;IACtG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,0FAA0F;IAC1F,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,KAAK,EAAE,sBAAsB;IAC7B,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC;KACD,MAAM,EAAE,CAAA;AAIV,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAE7B,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAA;AAClG,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The live-session registry: one JSON file per participating session under a
3
+ * hardened runtime directory's `sessions/` subdirectory (design §1.2).
4
+ *
5
+ * @experimental
6
+ */
7
+ import { type PeerRecord } from './record.js';
8
+ export declare class PeerRegistryError extends Error {
9
+ readonly name = "PeerRegistryError";
10
+ }
11
+ /** Publish `record` at `<sessionsDir>/<sessionId>.json`: fsynced temporary, then rename, mode 0600. */
12
+ export declare function writePeerRecord(sessionsDir: string, record: PeerRecord): void;
13
+ /** One session's record, or `undefined` if it has none or its file does not parse. */
14
+ export declare function readPeerRecord(sessionsDir: string, sessionId: string): PeerRecord | undefined;
15
+ /**
16
+ * Every registry record in `sessionsDir` that parses.
17
+ *
18
+ * A file that fails to parse (mid-write, truncated, from a newer namzu) is
19
+ * skipped rather than thrown on: one malformed record must not make every
20
+ * other live session invisible to `list_sessions`.
21
+ */
22
+ export declare function readPeerRecords(sessionsDir: string): PeerRecord[];
23
+ /** Remove a session's registry record. Owner-checked: never unlinks a path this uid does not own. */
24
+ export declare function removePeerRecord(sessionsDir: string, sessionId: string, uid: number | undefined): void;
25
+ export interface PeerLivenessOptions {
26
+ /** Default 500ms (design §1.2). */
27
+ readonly pingTimeoutMs?: number;
28
+ /** Injectable for tests. Defaults to `process.kill(pid, 0)`. */
29
+ readonly isPidAlive?: (pid: number) => boolean;
30
+ /** Injectable for tests. Defaults to an unauthenticated `ping` (`pingPeer` in `client.ts`). */
31
+ readonly ping?: (address: string, timeoutMs: number) => Promise<boolean>;
32
+ }
33
+ /**
34
+ * A record is live iff its pid is alive AND its address answers a ping
35
+ * within the timeout (design §1.2). Shared by {@link listLivePeers} and by
36
+ * `createPeerEndpoint`'s default `verifySender` (`endpoint.ts`), so both
37
+ * apply exactly the same definition of "live".
38
+ */
39
+ export declare function isPeerRecordLive(record: PeerRecord, options?: PeerLivenessOptions): Promise<boolean>;
40
+ export interface ListLivePeersOptions extends PeerLivenessOptions {
41
+ readonly sessionsDir: string;
42
+ /** Owner-checks every removal; `undefined` skips the check (tests, or a platform with no uid). */
43
+ readonly uid: number | undefined;
44
+ }
45
+ /**
46
+ * Every record in the registry that is live (see {@link isPeerRecordLive}).
47
+ *
48
+ * A record that is not live is DEAD: its registry file and, if it names a
49
+ * UDS socket, the socket file are removed — but only when owned by this
50
+ * uid, so one user's stale cleanup pass can never touch another's files
51
+ * even if it could somehow see them.
52
+ */
53
+ export declare function listLivePeers(options: ListLivePeersOptions): Promise<PeerRecord[]>;
54
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/peers/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,aAAa,CAAA;AAI/D,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,uBAAsB;CAC5C;AAaD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA0B7E;AAaD,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAS7F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAqBjE;AAmBD,qGAAqG;AACrG,wBAAgB,gBAAgB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,SAAS,GACrB,IAAI,CAEN;AAuCD,MAAM,WAAW,mBAAmB;IACnC,mCAAmC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9C,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACxE;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,kGAAkG;IAClG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAexF"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * The live-session registry: one JSON file per participating session under a
3
+ * hardened runtime directory's `sessions/` subdirectory (design §1.2).
4
+ *
5
+ * @experimental
6
+ */
7
+ import { randomBytes } from 'node:crypto';
8
+ import { closeSync, fsyncSync, lstatSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeSync, } from 'node:fs';
9
+ import { basename, dirname, join } from 'node:path';
10
+ import { parsePeerAddress } from './address.js';
11
+ import { pingPeer } from './client.js';
12
+ import { PeerRecordSchema } from './record.js';
13
+ const RECORD_FILE_MODE = 0o600;
14
+ export class PeerRegistryError extends Error {
15
+ name = 'PeerRegistryError';
16
+ }
17
+ function recordPath(sessionsDir, sessionId) {
18
+ return join(sessionsDir, `${sessionId}.json`);
19
+ }
20
+ function temporaryPathBeside(path) {
21
+ return join(dirname(path), `.${basename(path)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
22
+ }
23
+ /** Publish `record` at `<sessionsDir>/<sessionId>.json`: fsynced temporary, then rename, mode 0600. */
24
+ export function writePeerRecord(sessionsDir, record) {
25
+ const validated = PeerRecordSchema.safeParse(record);
26
+ if (!validated.success) {
27
+ throw new PeerRegistryError(`Invalid peer record: ${validated.error.message}`);
28
+ }
29
+ const parsed = validated.data;
30
+ const path = recordPath(sessionsDir, parsed.sessionId);
31
+ const temporary = temporaryPathBeside(path);
32
+ const fd = openSync(temporary, 'wx', RECORD_FILE_MODE);
33
+ try {
34
+ writeSync(fd, `${JSON.stringify(parsed)}\n`);
35
+ fsyncSync(fd);
36
+ }
37
+ finally {
38
+ closeSync(fd);
39
+ }
40
+ try {
41
+ renameSync(temporary, path);
42
+ }
43
+ catch (error) {
44
+ try {
45
+ unlinkSync(temporary);
46
+ }
47
+ catch {
48
+ // The rename already failed; a leftover temporary file is not this
49
+ // call's failure to report.
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ function parseRecordText(text) {
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(text);
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ const result = PeerRecordSchema.safeParse(parsed);
63
+ return result.success ? result.data : undefined;
64
+ }
65
+ /** One session's record, or `undefined` if it has none or its file does not parse. */
66
+ export function readPeerRecord(sessionsDir, sessionId) {
67
+ let text;
68
+ try {
69
+ text = readFileSync(recordPath(sessionsDir, sessionId), 'utf8');
70
+ }
71
+ catch (error) {
72
+ if (error.code === 'ENOENT')
73
+ return undefined;
74
+ throw error;
75
+ }
76
+ return parseRecordText(text);
77
+ }
78
+ /**
79
+ * Every registry record in `sessionsDir` that parses.
80
+ *
81
+ * A file that fails to parse (mid-write, truncated, from a newer namzu) is
82
+ * skipped rather than thrown on: one malformed record must not make every
83
+ * other live session invisible to `list_sessions`.
84
+ */
85
+ export function readPeerRecords(sessionsDir) {
86
+ let entries;
87
+ try {
88
+ entries = readdirSync(sessionsDir);
89
+ }
90
+ catch (error) {
91
+ if (error.code === 'ENOENT')
92
+ return [];
93
+ throw error;
94
+ }
95
+ const records = [];
96
+ for (const entry of entries) {
97
+ if (!entry.endsWith('.json'))
98
+ continue;
99
+ let text;
100
+ try {
101
+ text = readFileSync(join(sessionsDir, entry), 'utf8');
102
+ }
103
+ catch {
104
+ continue; // Vanished between readdir and read; not this reader's concern.
105
+ }
106
+ const record = parseRecordText(text);
107
+ if (record)
108
+ records.push(record);
109
+ }
110
+ return records;
111
+ }
112
+ /** Remove a path only if it is owned by `uid`; `undefined` skips the check (tests, or a platform with no uid). */
113
+ function removeIfOwned(path, uid) {
114
+ let entry;
115
+ try {
116
+ entry = lstatSync(path);
117
+ }
118
+ catch (error) {
119
+ if (error.code === 'ENOENT')
120
+ return;
121
+ throw error;
122
+ }
123
+ if (uid !== undefined && entry.uid !== uid)
124
+ return;
125
+ try {
126
+ unlinkSync(path);
127
+ }
128
+ catch (error) {
129
+ if (error.code !== 'ENOENT')
130
+ throw error;
131
+ }
132
+ }
133
+ /** Remove a session's registry record. Owner-checked: never unlinks a path this uid does not own. */
134
+ export function removePeerRecord(sessionsDir, sessionId, uid) {
135
+ removeIfOwned(recordPath(sessionsDir, sessionId), uid);
136
+ }
137
+ /** Remove a stale UDS socket file, only when it is a socket owned by `uid`. A `pipe:`/`a2a:` address is left alone. */
138
+ function removeStaleSocketIfOwned(address, uid) {
139
+ let parsed;
140
+ try {
141
+ parsed = parsePeerAddress(address);
142
+ }
143
+ catch {
144
+ return;
145
+ }
146
+ if (parsed.scheme !== 'uds')
147
+ return;
148
+ let entry;
149
+ try {
150
+ entry = lstatSync(parsed.path);
151
+ }
152
+ catch {
153
+ return;
154
+ }
155
+ if (!entry.isSocket())
156
+ return;
157
+ if (uid !== undefined && entry.uid !== uid)
158
+ return;
159
+ try {
160
+ unlinkSync(parsed.path);
161
+ }
162
+ catch {
163
+ // Already gone, or another process just recreated it — either way there
164
+ // is nothing left for this cleanup pass to do.
165
+ }
166
+ }
167
+ function defaultIsPidAlive(pid) {
168
+ try {
169
+ process.kill(pid, 0);
170
+ return true;
171
+ }
172
+ catch (error) {
173
+ // EPERM means the process exists but is owned by someone else, which
174
+ // cannot happen for a uid-owned registry entry under normal operation;
175
+ // treated as alive because this check cannot disprove it either way.
176
+ return error.code === 'EPERM';
177
+ }
178
+ }
179
+ /**
180
+ * A record is live iff its pid is alive AND its address answers a ping
181
+ * within the timeout (design §1.2). Shared by {@link listLivePeers} and by
182
+ * `createPeerEndpoint`'s default `verifySender` (`endpoint.ts`), so both
183
+ * apply exactly the same definition of "live".
184
+ */
185
+ export async function isPeerRecordLive(record, options = {}) {
186
+ const isPidAlive = options.isPidAlive ?? defaultIsPidAlive;
187
+ const ping = options.ping ?? pingPeer;
188
+ const timeoutMs = options.pingTimeoutMs ?? 500;
189
+ return isPidAlive(record.pid) && (await ping(record.address, timeoutMs));
190
+ }
191
+ /**
192
+ * Every record in the registry that is live (see {@link isPeerRecordLive}).
193
+ *
194
+ * A record that is not live is DEAD: its registry file and, if it names a
195
+ * UDS socket, the socket file are removed — but only when owned by this
196
+ * uid, so one user's stale cleanup pass can never touch another's files
197
+ * even if it could somehow see them.
198
+ */
199
+ export async function listLivePeers(options) {
200
+ const records = readPeerRecords(options.sessionsDir);
201
+ const live = [];
202
+ await Promise.all(records.map(async (record) => {
203
+ const alive = await isPeerRecordLive(record, options);
204
+ if (alive) {
205
+ live.push(record);
206
+ return;
207
+ }
208
+ removePeerRecord(options.sessionsDir, record.sessionId, options.uid);
209
+ removeStaleSocketIfOwned(record.address, options.uid);
210
+ }));
211
+ return live;
212
+ }
213
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/peers/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { PluginHookDefinition, PluginMCPServerConfig } from '../types/plugin/index.js';
2
+ import type { ToolDefinition } from '../types/tool/index.js';
3
+ /** A host-authored plugin that needs no manifest file or dynamic import. */
4
+ export interface DefinedPlugin {
5
+ readonly name: string;
6
+ readonly version: string;
7
+ readonly description: string;
8
+ readonly tools: readonly ToolDefinition[];
9
+ readonly hooks: readonly PluginHookDefinition[];
10
+ readonly instructions?: string;
11
+ readonly mcpServers: readonly PluginMCPServerConfig[];
12
+ }
13
+ export interface DefinePluginOptions {
14
+ readonly name: string;
15
+ readonly version?: string;
16
+ readonly description?: string;
17
+ readonly tools?: readonly ToolDefinition[];
18
+ readonly hooks?: readonly PluginHookDefinition[];
19
+ readonly instructions?: string;
20
+ readonly mcpServers?: readonly PluginMCPServerConfig[];
21
+ }
22
+ /** Validate and snapshot a plugin supplied directly by the host. */
23
+ export declare function definePlugin(options: DefinePluginOptions): DefinedPlugin;
24
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/plugin/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAE3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAA;CACrD;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;CACtD;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAyCxE"}
@@ -0,0 +1,42 @@
1
+ import { PluginManifestSchema, assertPluginHookEvent } from '../types/plugin/index.js';
2
+ /** Validate and snapshot a plugin supplied directly by the host. */
3
+ export function definePlugin(options) {
4
+ const version = options.version ?? '0.0.0';
5
+ const description = options.description ?? `In-code plugin ${options.name}`;
6
+ PluginManifestSchema.parse({
7
+ name: options.name,
8
+ version,
9
+ description,
10
+ instructions: options.instructions,
11
+ mcpServers: options.mcpServers,
12
+ });
13
+ for (const hook of options.hooks ?? [])
14
+ assertPluginHookEvent(hook.event);
15
+ const toolNames = new Set();
16
+ for (const tool of options.tools ?? []) {
17
+ if (toolNames.has(tool.name))
18
+ throw new Error(`Plugin "${options.name}" declares tool "${tool.name}" twice.`);
19
+ toolNames.add(tool.name);
20
+ }
21
+ const serverNames = new Set();
22
+ for (const server of options.mcpServers ?? []) {
23
+ if (serverNames.has(server.name)) {
24
+ throw new Error(`Plugin "${options.name}" declares MCP server "${server.name}" twice.`);
25
+ }
26
+ serverNames.add(server.name);
27
+ }
28
+ return Object.freeze({
29
+ name: options.name,
30
+ version,
31
+ description,
32
+ tools: Object.freeze([...(options.tools ?? [])]),
33
+ hooks: Object.freeze([...(options.hooks ?? [])]),
34
+ ...(options.instructions !== undefined ? { instructions: options.instructions } : {}),
35
+ mcpServers: Object.freeze((options.mcpServers ?? []).map((server) => Object.freeze({
36
+ ...server,
37
+ ...(server.args ? { args: Object.freeze([...server.args]) } : {}),
38
+ ...(server.env ? { env: Object.freeze({ ...server.env }) } : {}),
39
+ }))),
40
+ });
41
+ }
42
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/plugin/define.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAwBtF,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAA;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,OAAO,CAAC,IAAI,EAAE,CAAA;IAC3E,oBAAoB,CAAC,KAAK,CAAC;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO;QACP,WAAW;QACX,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;KAC9B,CAAC,CAAA;IACF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;QAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,oBAAoB,IAAI,CAAC,IAAI,UAAU,CAAC,CAAA;QAChF,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IACrC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC/C,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,0BAA0B,MAAM,CAAC,IAAI,UAAU,CAAC,CAAA;QACxF,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO;QACP,WAAW;QACX,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,UAAU,EAAE,MAAM,CAAC,MAAM,CACxB,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACzC,MAAM,CAAC,MAAM,CAAC;YACb,GAAG,MAAM;YACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CACF,CACD;KACD,CAAC,CAAA;AACH,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export { discoverPlugins, loadPluginManifest, discoverAllPluginDirs } from './loader.js';
2
+ export { definePlugin } from './define.js';
3
+ export type { DefinedPlugin, DefinePluginOptions } from './define.js';
2
4
  export type { PluginDiscoveryOptions, PluginEnablementCapabilities } from './loader.js';
3
5
  export { PluginLifecycleManager } from './lifecycle.js';
4
6
  export { PluginResolver } from './resolver.js';