@namzu/cli 0.0.2 → 0.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 (365) hide show
  1. package/LICENSE.md +110 -0
  2. package/dist/bin.js +4 -32
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli.d.ts +14 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +124 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/cli.test.d.ts +2 -0
  9. package/dist/cli.test.d.ts.map +1 -0
  10. package/dist/cli.test.js +94 -0
  11. package/dist/cli.test.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +6 -0
  13. package/dist/commands/doctor.d.ts.map +1 -1
  14. package/dist/commands/doctor.js +10 -0
  15. package/dist/commands/doctor.js.map +1 -1
  16. package/dist/commands/providers.d.ts +17 -0
  17. package/dist/commands/providers.d.ts.map +1 -0
  18. package/dist/commands/providers.js +274 -0
  19. package/dist/commands/providers.js.map +1 -0
  20. package/dist/commands/registry.d.ts +11 -0
  21. package/dist/commands/registry.d.ts.map +1 -0
  22. package/dist/commands/registry.js +28 -0
  23. package/dist/commands/registry.js.map +1 -0
  24. package/dist/commands/run.d.ts +14 -0
  25. package/dist/commands/run.d.ts.map +1 -0
  26. package/dist/commands/run.js +73 -0
  27. package/dist/commands/run.js.map +1 -0
  28. package/dist/commands/stubs.d.ts +12 -0
  29. package/dist/commands/stubs.d.ts.map +1 -0
  30. package/dist/commands/stubs.js +32 -0
  31. package/dist/commands/stubs.js.map +1 -0
  32. package/dist/commands/tools.d.ts +16 -0
  33. package/dist/commands/tools.d.ts.map +1 -0
  34. package/dist/commands/tools.js +161 -0
  35. package/dist/commands/tools.js.map +1 -0
  36. package/dist/commands/types.d.ts +25 -0
  37. package/dist/commands/types.d.ts.map +1 -0
  38. package/dist/commands/types.js +2 -0
  39. package/dist/commands/types.js.map +1 -0
  40. package/dist/config/load.d.ts +25 -0
  41. package/dist/config/load.d.ts.map +1 -0
  42. package/dist/config/load.js +92 -0
  43. package/dist/config/load.js.map +1 -0
  44. package/dist/config/load.test.d.ts +2 -0
  45. package/dist/config/load.test.d.ts.map +1 -0
  46. package/dist/config/load.test.js +57 -0
  47. package/dist/config/load.test.js.map +1 -0
  48. package/dist/config/schema.d.ts +29 -0
  49. package/dist/config/schema.d.ts.map +1 -0
  50. package/dist/config/schema.js +13 -0
  51. package/dist/config/schema.js.map +1 -0
  52. package/dist/doctor/registry.d.ts.map +1 -1
  53. package/dist/doctor/registry.js +3 -1
  54. package/dist/doctor/registry.js.map +1 -1
  55. package/dist/doctor/registry.test.js +4 -1
  56. package/dist/doctor/registry.test.js.map +1 -1
  57. package/dist/index.d.ts +6 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +7 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/integrations/clawtool/agents.d.ts +31 -0
  62. package/dist/integrations/clawtool/agents.d.ts.map +1 -0
  63. package/dist/integrations/clawtool/agents.js +30 -0
  64. package/dist/integrations/clawtool/agents.js.map +1 -0
  65. package/dist/integrations/clawtool/agents.test.d.ts +2 -0
  66. package/dist/integrations/clawtool/agents.test.d.ts.map +1 -0
  67. package/dist/integrations/clawtool/agents.test.js +79 -0
  68. package/dist/integrations/clawtool/agents.test.js.map +1 -0
  69. package/dist/integrations/clawtool/auth.d.ts +26 -0
  70. package/dist/integrations/clawtool/auth.d.ts.map +1 -0
  71. package/dist/integrations/clawtool/auth.js +56 -0
  72. package/dist/integrations/clawtool/auth.js.map +1 -0
  73. package/dist/integrations/clawtool/auth.test.d.ts +2 -0
  74. package/dist/integrations/clawtool/auth.test.d.ts.map +1 -0
  75. package/dist/integrations/clawtool/auth.test.js +40 -0
  76. package/dist/integrations/clawtool/auth.test.js.map +1 -0
  77. package/dist/integrations/clawtool/binary.d.ts +25 -0
  78. package/dist/integrations/clawtool/binary.d.ts.map +1 -0
  79. package/dist/integrations/clawtool/binary.js +50 -0
  80. package/dist/integrations/clawtool/binary.js.map +1 -0
  81. package/dist/integrations/clawtool/binary.test.d.ts +2 -0
  82. package/dist/integrations/clawtool/binary.test.d.ts.map +1 -0
  83. package/dist/integrations/clawtool/binary.test.js +42 -0
  84. package/dist/integrations/clawtool/binary.test.js.map +1 -0
  85. package/dist/integrations/clawtool/daemon.d.ts +37 -0
  86. package/dist/integrations/clawtool/daemon.d.ts.map +1 -0
  87. package/dist/integrations/clawtool/daemon.js +109 -0
  88. package/dist/integrations/clawtool/daemon.js.map +1 -0
  89. package/dist/integrations/clawtool/daemon.test.d.ts +11 -0
  90. package/dist/integrations/clawtool/daemon.test.d.ts.map +1 -0
  91. package/dist/integrations/clawtool/daemon.test.js +118 -0
  92. package/dist/integrations/clawtool/daemon.test.js.map +1 -0
  93. package/dist/integrations/clawtool/dispatch.d.ts +33 -0
  94. package/dist/integrations/clawtool/dispatch.d.ts.map +1 -0
  95. package/dist/integrations/clawtool/dispatch.js +155 -0
  96. package/dist/integrations/clawtool/dispatch.js.map +1 -0
  97. package/dist/integrations/clawtool/dispatch.test.d.ts +2 -0
  98. package/dist/integrations/clawtool/dispatch.test.d.ts.map +1 -0
  99. package/dist/integrations/clawtool/dispatch.test.js +138 -0
  100. package/dist/integrations/clawtool/dispatch.test.js.map +1 -0
  101. package/dist/integrations/clawtool/index.d.ts +11 -0
  102. package/dist/integrations/clawtool/index.d.ts.map +1 -0
  103. package/dist/integrations/clawtool/index.js +10 -0
  104. package/dist/integrations/clawtool/index.js.map +1 -0
  105. package/dist/integrations/clawtool/mcp.d.ts +51 -0
  106. package/dist/integrations/clawtool/mcp.d.ts.map +1 -0
  107. package/dist/integrations/clawtool/mcp.js +156 -0
  108. package/dist/integrations/clawtool/mcp.js.map +1 -0
  109. package/dist/integrations/clawtool/mcp.test.d.ts +2 -0
  110. package/dist/integrations/clawtool/mcp.test.d.ts.map +1 -0
  111. package/dist/integrations/clawtool/mcp.test.js +126 -0
  112. package/dist/integrations/clawtool/mcp.test.js.map +1 -0
  113. package/dist/integrations/clawtool/paths.d.ts +8 -0
  114. package/dist/integrations/clawtool/paths.d.ts.map +1 -0
  115. package/dist/integrations/clawtool/paths.js +19 -0
  116. package/dist/integrations/clawtool/paths.js.map +1 -0
  117. package/dist/integrations/clawtool/peers.d.ts +67 -0
  118. package/dist/integrations/clawtool/peers.d.ts.map +1 -0
  119. package/dist/integrations/clawtool/peers.js +150 -0
  120. package/dist/integrations/clawtool/peers.js.map +1 -0
  121. package/dist/integrations/clawtool/plugin.d.ts +42 -0
  122. package/dist/integrations/clawtool/plugin.d.ts.map +1 -0
  123. package/dist/integrations/clawtool/plugin.js +38 -0
  124. package/dist/integrations/clawtool/plugin.js.map +1 -0
  125. package/dist/integrations/clawtool/state.d.ts +11 -0
  126. package/dist/integrations/clawtool/state.d.ts.map +1 -0
  127. package/dist/integrations/clawtool/state.js +41 -0
  128. package/dist/integrations/clawtool/state.js.map +1 -0
  129. package/dist/integrations/clawtool/state.test.d.ts +2 -0
  130. package/dist/integrations/clawtool/state.test.d.ts.map +1 -0
  131. package/dist/integrations/clawtool/state.test.js +38 -0
  132. package/dist/integrations/clawtool/state.test.js.map +1 -0
  133. package/dist/integrations/clawtool/tooling.d.ts +50 -0
  134. package/dist/integrations/clawtool/tooling.d.ts.map +1 -0
  135. package/dist/integrations/clawtool/tooling.js +89 -0
  136. package/dist/integrations/clawtool/tooling.js.map +1 -0
  137. package/dist/integrations/clawtool/tooling.test.d.ts +2 -0
  138. package/dist/integrations/clawtool/tooling.test.d.ts.map +1 -0
  139. package/dist/integrations/clawtool/tooling.test.js +58 -0
  140. package/dist/integrations/clawtool/tooling.test.js.map +1 -0
  141. package/dist/integrations/clawtool/types.d.ts +41 -0
  142. package/dist/integrations/clawtool/types.d.ts.map +1 -0
  143. package/dist/integrations/clawtool/types.js +9 -0
  144. package/dist/integrations/clawtool/types.js.map +1 -0
  145. package/dist/integrations/clipboard/image.d.ts +18 -0
  146. package/dist/integrations/clipboard/image.d.ts.map +1 -0
  147. package/dist/integrations/clipboard/image.js +88 -0
  148. package/dist/integrations/clipboard/image.js.map +1 -0
  149. package/dist/integrations/providers/discover.d.ts +68 -0
  150. package/dist/integrations/providers/discover.d.ts.map +1 -0
  151. package/dist/integrations/providers/discover.js +108 -0
  152. package/dist/integrations/providers/discover.js.map +1 -0
  153. package/dist/integrations/providers/discover.test.d.ts +2 -0
  154. package/dist/integrations/providers/discover.test.d.ts.map +1 -0
  155. package/dist/integrations/providers/discover.test.js +120 -0
  156. package/dist/integrations/providers/discover.test.js.map +1 -0
  157. package/dist/integrations/providers/index.d.ts +10 -0
  158. package/dist/integrations/providers/index.d.ts.map +1 -0
  159. package/dist/integrations/providers/index.js +12 -0
  160. package/dist/integrations/providers/index.js.map +1 -0
  161. package/dist/integrations/providers/keychain.d.ts +44 -0
  162. package/dist/integrations/providers/keychain.d.ts.map +1 -0
  163. package/dist/integrations/providers/keychain.js +154 -0
  164. package/dist/integrations/providers/keychain.js.map +1 -0
  165. package/dist/integrations/providers/keychain.test.d.ts +2 -0
  166. package/dist/integrations/providers/keychain.test.d.ts.map +1 -0
  167. package/dist/integrations/providers/keychain.test.js +21 -0
  168. package/dist/integrations/providers/keychain.test.js.map +1 -0
  169. package/dist/integrations/providers/mask.d.ts +7 -0
  170. package/dist/integrations/providers/mask.d.ts.map +1 -0
  171. package/dist/integrations/providers/mask.js +14 -0
  172. package/dist/integrations/providers/mask.js.map +1 -0
  173. package/dist/integrations/providers/mask.test.d.ts +2 -0
  174. package/dist/integrations/providers/mask.test.d.ts.map +1 -0
  175. package/dist/integrations/providers/mask.test.js +20 -0
  176. package/dist/integrations/providers/mask.test.js.map +1 -0
  177. package/dist/integrations/providers/oauth.d.ts +28 -0
  178. package/dist/integrations/providers/oauth.d.ts.map +1 -0
  179. package/dist/integrations/providers/oauth.js +65 -0
  180. package/dist/integrations/providers/oauth.js.map +1 -0
  181. package/dist/integrations/providers/oauth.test.d.ts +2 -0
  182. package/dist/integrations/providers/oauth.test.d.ts.map +1 -0
  183. package/dist/integrations/providers/oauth.test.js +86 -0
  184. package/dist/integrations/providers/oauth.test.js.map +1 -0
  185. package/dist/integrations/providers/preferences.d.ts +43 -0
  186. package/dist/integrations/providers/preferences.d.ts.map +1 -0
  187. package/dist/integrations/providers/preferences.js +111 -0
  188. package/dist/integrations/providers/preferences.js.map +1 -0
  189. package/dist/integrations/providers/preferences.test.d.ts +2 -0
  190. package/dist/integrations/providers/preferences.test.d.ts.map +1 -0
  191. package/dist/integrations/providers/preferences.test.js +68 -0
  192. package/dist/integrations/providers/preferences.test.js.map +1 -0
  193. package/dist/integrations/providers/registry.d.ts +31 -0
  194. package/dist/integrations/providers/registry.d.ts.map +1 -0
  195. package/dist/integrations/providers/registry.js +79 -0
  196. package/dist/integrations/providers/registry.js.map +1 -0
  197. package/dist/integrations/providers/schema.d.ts +73 -0
  198. package/dist/integrations/providers/schema.d.ts.map +1 -0
  199. package/dist/integrations/providers/schema.js +70 -0
  200. package/dist/integrations/providers/schema.js.map +1 -0
  201. package/dist/integrations/providers/schema.test.d.ts +2 -0
  202. package/dist/integrations/providers/schema.test.d.ts.map +1 -0
  203. package/dist/integrations/providers/schema.test.js +43 -0
  204. package/dist/integrations/providers/schema.test.js.map +1 -0
  205. package/dist/integrations/providers/secrets.d.ts +37 -0
  206. package/dist/integrations/providers/secrets.d.ts.map +1 -0
  207. package/dist/integrations/providers/secrets.js +69 -0
  208. package/dist/integrations/providers/secrets.js.map +1 -0
  209. package/dist/integrations/providers/store.d.ts +32 -0
  210. package/dist/integrations/providers/store.d.ts.map +1 -0
  211. package/dist/integrations/providers/store.js +133 -0
  212. package/dist/integrations/providers/store.js.map +1 -0
  213. package/dist/integrations/providers/store.test.d.ts +2 -0
  214. package/dist/integrations/providers/store.test.d.ts.map +1 -0
  215. package/dist/integrations/providers/store.test.js +127 -0
  216. package/dist/integrations/providers/store.test.js.map +1 -0
  217. package/dist/integrations/sessions/store.d.ts +40 -0
  218. package/dist/integrations/sessions/store.d.ts.map +1 -0
  219. package/dist/integrations/sessions/store.js +90 -0
  220. package/dist/integrations/sessions/store.js.map +1 -0
  221. package/dist/integrations/subagents/runtime.d.ts +37 -0
  222. package/dist/integrations/subagents/runtime.d.ts.map +1 -0
  223. package/dist/integrations/subagents/runtime.js +183 -0
  224. package/dist/integrations/subagents/runtime.js.map +1 -0
  225. package/dist/integrations/trust/store.d.ts +16 -0
  226. package/dist/integrations/trust/store.d.ts.map +1 -0
  227. package/dist/integrations/trust/store.js +59 -0
  228. package/dist/integrations/trust/store.js.map +1 -0
  229. package/dist/integrations/trust/store.test.d.ts +2 -0
  230. package/dist/integrations/trust/store.test.d.ts.map +1 -0
  231. package/dist/integrations/trust/store.test.js +50 -0
  232. package/dist/integrations/trust/store.test.js.map +1 -0
  233. package/dist/integrations/updates.d.ts +27 -0
  234. package/dist/integrations/updates.d.ts.map +1 -0
  235. package/dist/integrations/updates.js +99 -0
  236. package/dist/integrations/updates.js.map +1 -0
  237. package/dist/memory/store.d.ts +29 -0
  238. package/dist/memory/store.d.ts.map +1 -0
  239. package/dist/memory/store.js +74 -0
  240. package/dist/memory/store.js.map +1 -0
  241. package/dist/memory/store.test.d.ts +2 -0
  242. package/dist/memory/store.test.d.ts.map +1 -0
  243. package/dist/memory/store.test.js +63 -0
  244. package/dist/memory/store.test.js.map +1 -0
  245. package/dist/output/formatter.d.ts +30 -0
  246. package/dist/output/formatter.d.ts.map +1 -0
  247. package/dist/output/formatter.js +16 -0
  248. package/dist/output/formatter.js.map +1 -0
  249. package/dist/output/formatter.test.d.ts +2 -0
  250. package/dist/output/formatter.test.d.ts.map +1 -0
  251. package/dist/output/formatter.test.js +88 -0
  252. package/dist/output/formatter.test.js.map +1 -0
  253. package/dist/output/index.d.ts +5 -0
  254. package/dist/output/index.d.ts.map +1 -0
  255. package/dist/output/index.js +22 -0
  256. package/dist/output/index.js.map +1 -0
  257. package/dist/output/json.d.ts +13 -0
  258. package/dist/output/json.d.ts.map +1 -0
  259. package/dist/output/json.js +51 -0
  260. package/dist/output/json.js.map +1 -0
  261. package/dist/output/text.d.ts +13 -0
  262. package/dist/output/text.d.ts.map +1 -0
  263. package/dist/output/text.js +36 -0
  264. package/dist/output/text.js.map +1 -0
  265. package/dist/output/yaml.d.ts +13 -0
  266. package/dist/output/yaml.d.ts.map +1 -0
  267. package/dist/output/yaml.js +26 -0
  268. package/dist/output/yaml.js.map +1 -0
  269. package/dist/skills/store.d.ts +49 -0
  270. package/dist/skills/store.d.ts.map +1 -0
  271. package/dist/skills/store.js +109 -0
  272. package/dist/skills/store.js.map +1 -0
  273. package/dist/skills/store.test.d.ts +2 -0
  274. package/dist/skills/store.test.d.ts.map +1 -0
  275. package/dist/skills/store.test.js +80 -0
  276. package/dist/skills/store.test.js.map +1 -0
  277. package/dist/tui/App.d.ts +18 -0
  278. package/dist/tui/App.d.ts.map +1 -0
  279. package/dist/tui/App.js +742 -0
  280. package/dist/tui/App.js.map +1 -0
  281. package/dist/tui/Composer.d.ts +17 -0
  282. package/dist/tui/Composer.d.ts.map +1 -0
  283. package/dist/tui/Composer.js +123 -0
  284. package/dist/tui/Composer.js.map +1 -0
  285. package/dist/tui/LiveActivity.d.ts +22 -0
  286. package/dist/tui/LiveActivity.d.ts.map +1 -0
  287. package/dist/tui/LiveActivity.js +46 -0
  288. package/dist/tui/LiveActivity.js.map +1 -0
  289. package/dist/tui/Markdown.d.ts +18 -0
  290. package/dist/tui/Markdown.d.ts.map +1 -0
  291. package/dist/tui/Markdown.js +68 -0
  292. package/dist/tui/Markdown.js.map +1 -0
  293. package/dist/tui/PermissionOverlay.d.ts +14 -0
  294. package/dist/tui/PermissionOverlay.d.ts.map +1 -0
  295. package/dist/tui/PermissionOverlay.js +22 -0
  296. package/dist/tui/PermissionOverlay.js.map +1 -0
  297. package/dist/tui/Picker.d.ts +20 -0
  298. package/dist/tui/Picker.d.ts.map +1 -0
  299. package/dist/tui/Picker.js +72 -0
  300. package/dist/tui/Picker.js.map +1 -0
  301. package/dist/tui/ResumePicker.d.ts +12 -0
  302. package/dist/tui/ResumePicker.d.ts.map +1 -0
  303. package/dist/tui/ResumePicker.js +26 -0
  304. package/dist/tui/ResumePicker.js.map +1 -0
  305. package/dist/tui/StatusBar.d.ts +22 -0
  306. package/dist/tui/StatusBar.d.ts.map +1 -0
  307. package/dist/tui/StatusBar.js +73 -0
  308. package/dist/tui/StatusBar.js.map +1 -0
  309. package/dist/tui/Transcript.d.ts +29 -0
  310. package/dist/tui/Transcript.d.ts.map +1 -0
  311. package/dist/tui/Transcript.js +105 -0
  312. package/dist/tui/Transcript.js.map +1 -0
  313. package/dist/tui/TrustPrompt.d.ts +11 -0
  314. package/dist/tui/TrustPrompt.d.ts.map +1 -0
  315. package/dist/tui/TrustPrompt.js +13 -0
  316. package/dist/tui/TrustPrompt.js.map +1 -0
  317. package/dist/tui/agent.d.ts +163 -0
  318. package/dist/tui/agent.d.ts.map +1 -0
  319. package/dist/tui/agent.js +684 -0
  320. package/dist/tui/agent.js.map +1 -0
  321. package/dist/tui/agent.test.d.ts +2 -0
  322. package/dist/tui/agent.test.d.ts.map +1 -0
  323. package/dist/tui/agent.test.js +225 -0
  324. package/dist/tui/agent.test.js.map +1 -0
  325. package/dist/tui/index.d.ts +7 -0
  326. package/dist/tui/index.d.ts.map +1 -0
  327. package/dist/tui/index.js +29 -0
  328. package/dist/tui/index.js.map +1 -0
  329. package/dist/tui/logo.d.ts +23 -0
  330. package/dist/tui/logo.d.ts.map +1 -0
  331. package/dist/tui/logo.js +35 -0
  332. package/dist/tui/logo.js.map +1 -0
  333. package/dist/tui/markdownParser.d.ts +45 -0
  334. package/dist/tui/markdownParser.d.ts.map +1 -0
  335. package/dist/tui/markdownParser.js +127 -0
  336. package/dist/tui/markdownParser.js.map +1 -0
  337. package/dist/tui/markdownParser.test.d.ts +2 -0
  338. package/dist/tui/markdownParser.test.d.ts.map +1 -0
  339. package/dist/tui/markdownParser.test.js +90 -0
  340. package/dist/tui/markdownParser.test.js.map +1 -0
  341. package/dist/tui/mentions.d.ts +22 -0
  342. package/dist/tui/mentions.d.ts.map +1 -0
  343. package/dist/tui/mentions.js +59 -0
  344. package/dist/tui/mentions.js.map +1 -0
  345. package/dist/tui/mentions.test.d.ts +2 -0
  346. package/dist/tui/mentions.test.d.ts.map +1 -0
  347. package/dist/tui/mentions.test.js +35 -0
  348. package/dist/tui/mentions.test.js.map +1 -0
  349. package/dist/tui/slashCommands.d.ts +64 -0
  350. package/dist/tui/slashCommands.d.ts.map +1 -0
  351. package/dist/tui/slashCommands.js +153 -0
  352. package/dist/tui/slashCommands.js.map +1 -0
  353. package/dist/tui/slashCommands.test.d.ts +2 -0
  354. package/dist/tui/slashCommands.test.d.ts.map +1 -0
  355. package/dist/tui/slashCommands.test.js +114 -0
  356. package/dist/tui/slashCommands.test.js.map +1 -0
  357. package/dist/tui/theme.d.ts +34 -0
  358. package/dist/tui/theme.d.ts.map +1 -0
  359. package/dist/tui/theme.js +32 -0
  360. package/dist/tui/theme.js.map +1 -0
  361. package/dist/tui/types.d.ts +27 -0
  362. package/dist/tui/types.d.ts.map +1 -0
  363. package/dist/tui/types.js +7 -0
  364. package/dist/tui/types.js.map +1 -0
  365. package/package.json +67 -57
@@ -0,0 +1,10 @@
1
+ export { listAgents } from './agents.js';
2
+ export { ClawtoolAuthError, readToken, tryReadToken } from './auth.js';
3
+ export { ClawtoolBinaryError, findBinary } from './binary.js';
4
+ export { ensureDaemon, ClawtoolDaemonError } from './daemon.js';
5
+ export { sendMessage } from './dispatch.js';
6
+ export { ClawtoolMcpClient, MCP_PROTOCOL_VERSION, McpProtocolError, } from './mcp.js';
7
+ export { clawtoolConfigDir, daemonStatePath, listenerTokenPath, } from './paths.js';
8
+ export { createClawtoolPlugin, } from './plugin.js';
9
+ export { readDaemonState } from './state.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAA0B,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAA;AACrF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAA4B,MAAM,aAAa,CAAA;AACzF,OAAO,EAAsB,WAAW,EAA2B,MAAM,eAAe,CAAA;AACxF,OAAO,EACN,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GAEhB,MAAM,UAAU,CAAA;AACjB,OAAO,EACN,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACN,oBAAoB,GAIpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Minimal MCP-over-Streamable-HTTP client for clawtool's `/mcp` endpoint.
3
+ *
4
+ * We deliberately do not reuse `@namzu/sdk`'s `MCPClient` http-sse
5
+ * transport — that implementation targets the older MCP HTTP+SSE
6
+ * transport (separate /sse + /message channels), whereas clawtool uses
7
+ * the newer **Streamable HTTP** transport (single POST that may return
8
+ * a chunked SSE response with one or more `data:` events). Wire details
9
+ * verified against clawtool/internal/server/{http.go,mcp_headers.go}.
10
+ *
11
+ * Scope: `initialize` → `notifications/initialized` handshake, then
12
+ * `tools/list` and `tools/call`. Streaming multi-event responses are
13
+ * read fully before resolving (clawtool's current handlers return a
14
+ * single event per call).
15
+ */
16
+ import type { McpCallResult, McpToolDescriptor } from './types.js';
17
+ export declare const MCP_PROTOCOL_VERSION = "2024-11-05";
18
+ export declare class McpProtocolError extends Error {
19
+ readonly code?: number | undefined;
20
+ constructor(message: string, code?: number | undefined);
21
+ }
22
+ export interface McpClientOptions {
23
+ readonly endpoint: string;
24
+ readonly token: string;
25
+ readonly clientInfo?: {
26
+ name: string;
27
+ version: string;
28
+ };
29
+ /** Override `fetch` for tests. */
30
+ readonly fetch?: typeof fetch;
31
+ /** Per-request timeout in ms. Default 30s. */
32
+ readonly timeoutMs?: number;
33
+ }
34
+ export declare class ClawtoolMcpClient {
35
+ private readonly opts;
36
+ private id;
37
+ private initialized;
38
+ private sessionId;
39
+ private readonly fetchFn;
40
+ private readonly timeoutMs;
41
+ constructor(opts: McpClientOptions);
42
+ initialize(): Promise<void>;
43
+ listTools(): Promise<McpToolDescriptor[]>;
44
+ callTool(name: string, args: Record<string, unknown>): Promise<McpCallResult>;
45
+ private rpc;
46
+ private notify;
47
+ private captureSessionId;
48
+ private headers;
49
+ private readEnvelope;
50
+ }
51
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAElE,eAAO,MAAM,oBAAoB,eAAe,CAAA;AAEhD,qBAAa,gBAAiB,SAAQ,KAAK;IAGzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;gBADtB,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA;CAKvB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACvD,kCAAkC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAoBD,qBAAa,iBAAiB;IAOjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,EAAE,CAAI;IACd,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEL,IAAI,EAAE,gBAAgB;IAK7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAMzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YAKrE,GAAG;YAqCH,MAAM;IAWpB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,OAAO;YAoBD,YAAY;CAQ1B"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Minimal MCP-over-Streamable-HTTP client for clawtool's `/mcp` endpoint.
3
+ *
4
+ * We deliberately do not reuse `@namzu/sdk`'s `MCPClient` http-sse
5
+ * transport — that implementation targets the older MCP HTTP+SSE
6
+ * transport (separate /sse + /message channels), whereas clawtool uses
7
+ * the newer **Streamable HTTP** transport (single POST that may return
8
+ * a chunked SSE response with one or more `data:` events). Wire details
9
+ * verified against clawtool/internal/server/{http.go,mcp_headers.go}.
10
+ *
11
+ * Scope: `initialize` → `notifications/initialized` handshake, then
12
+ * `tools/list` and `tools/call`. Streaming multi-event responses are
13
+ * read fully before resolving (clawtool's current handlers return a
14
+ * single event per call).
15
+ */
16
+ export const MCP_PROTOCOL_VERSION = '2024-11-05';
17
+ export class McpProtocolError extends Error {
18
+ code;
19
+ constructor(message, code) {
20
+ super(message);
21
+ this.code = code;
22
+ this.name = 'McpProtocolError';
23
+ }
24
+ }
25
+ export class ClawtoolMcpClient {
26
+ opts;
27
+ id = 0;
28
+ initialized = false;
29
+ sessionId = null;
30
+ fetchFn;
31
+ timeoutMs;
32
+ constructor(opts) {
33
+ this.opts = opts;
34
+ this.fetchFn = opts.fetch ?? globalThis.fetch;
35
+ this.timeoutMs = opts.timeoutMs ?? 30_000;
36
+ }
37
+ async initialize() {
38
+ if (this.initialized)
39
+ return;
40
+ await this.rpc('initialize', {
41
+ protocolVersion: MCP_PROTOCOL_VERSION,
42
+ capabilities: {},
43
+ clientInfo: this.opts.clientInfo ?? { name: 'namzu', version: '0.0.0' },
44
+ });
45
+ // `notifications/initialized` is a notification — JSON-RPC with no
46
+ // `id`, no response expected. Fire and forget over the same endpoint.
47
+ await this.notify('notifications/initialized', {});
48
+ this.initialized = true;
49
+ }
50
+ async listTools() {
51
+ await this.initialize();
52
+ const result = await this.rpc('tools/list', {});
53
+ return result.tools;
54
+ }
55
+ async callTool(name, args) {
56
+ await this.initialize();
57
+ return this.rpc('tools/call', { name, arguments: args });
58
+ }
59
+ async rpc(method, params) {
60
+ const id = ++this.id;
61
+ const body = { jsonrpc: '2.0', id, method, params };
62
+ const url = `${this.opts.endpoint.replace(/\/$/, '')}/mcp`;
63
+ const controller = new AbortController();
64
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
65
+ let response;
66
+ try {
67
+ response = await this.fetchFn(url, {
68
+ method: 'POST',
69
+ headers: this.headers(method, params),
70
+ body: JSON.stringify(body),
71
+ signal: controller.signal,
72
+ });
73
+ }
74
+ finally {
75
+ clearTimeout(timer);
76
+ }
77
+ this.captureSessionId(response);
78
+ if (!response.ok) {
79
+ throw new McpProtocolError(`clawtool MCP request to ${method} failed: HTTP ${response.status}`, response.status);
80
+ }
81
+ const envelope = await this.readEnvelope(response);
82
+ if (envelope.error) {
83
+ throw new McpProtocolError(`clawtool MCP method ${method} returned error: ${envelope.error.message}`, envelope.error.code);
84
+ }
85
+ if (envelope.result === undefined) {
86
+ throw new McpProtocolError(`clawtool MCP method ${method} returned no result`);
87
+ }
88
+ return envelope.result;
89
+ }
90
+ async notify(method, params) {
91
+ const body = { jsonrpc: '2.0', method, params };
92
+ const url = `${this.opts.endpoint.replace(/\/$/, '')}/mcp`;
93
+ const response = await this.fetchFn(url, {
94
+ method: 'POST',
95
+ headers: this.headers(method, params),
96
+ body: JSON.stringify(body),
97
+ });
98
+ this.captureSessionId(response);
99
+ }
100
+ captureSessionId(response) {
101
+ // MCP Streamable HTTP issues a session ID on `initialize` and expects
102
+ // it echoed on every subsequent request. clawtool returns it via the
103
+ // `Mcp-Session-Id` header (see internal/server/http.go + mark3labs/mcp-go).
104
+ const sid = response.headers.get('mcp-session-id') ?? response.headers.get('Mcp-Session-Id');
105
+ if (sid && sid.length > 0) {
106
+ this.sessionId = sid;
107
+ }
108
+ }
109
+ headers(method, params) {
110
+ const headers = {
111
+ 'Content-Type': 'application/json',
112
+ Accept: 'application/json, text/event-stream',
113
+ 'Mcp-Method': method,
114
+ };
115
+ // Empty token = `--no-auth` daemon; omit Authorization entirely.
116
+ if (this.opts.token.length > 0) {
117
+ headers.Authorization = `Bearer ${this.opts.token}`;
118
+ }
119
+ if (this.sessionId) {
120
+ headers['Mcp-Session-Id'] = this.sessionId;
121
+ }
122
+ const name = typeof params.name === 'string' ? params.name : undefined;
123
+ if (name && (method === 'tools/call' || method === 'prompts/get')) {
124
+ headers['Mcp-Name'] = name;
125
+ }
126
+ return headers;
127
+ }
128
+ async readEnvelope(response) {
129
+ const ct = response.headers.get('content-type') ?? '';
130
+ const text = await response.text();
131
+ if (ct.includes('text/event-stream')) {
132
+ return parseSseSingleEvent(text);
133
+ }
134
+ return JSON.parse(text);
135
+ }
136
+ }
137
+ function parseSseSingleEvent(raw) {
138
+ // Streamable HTTP responses look like:
139
+ // data: {"jsonrpc":"2.0", ...}
140
+ // (blank line terminator)
141
+ // We accept multiple events but only return the last well-formed JSON
142
+ // envelope — clawtool's current handlers emit exactly one.
143
+ const lines = raw.split('\n');
144
+ let last;
145
+ for (const line of lines) {
146
+ const trimmed = line.replace(/\r$/, '');
147
+ if (trimmed.startsWith('data:')) {
148
+ last = trimmed.slice('data:'.length).trim();
149
+ }
150
+ }
151
+ if (!last) {
152
+ throw new McpProtocolError('clawtool MCP SSE response had no data event');
153
+ }
154
+ return JSON.parse(last);
155
+ }
156
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/mcp.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { ClawtoolMcpClient, McpProtocolError } from './mcp.js';
3
+ /** Build a Response stub that mimics clawtool's Streamable HTTP SSE shape. */
4
+ function sseResponse(body, sessionId) {
5
+ const headers = new Headers({ 'content-type': 'text/event-stream' });
6
+ if (sessionId)
7
+ headers.set('Mcp-Session-Id', sessionId);
8
+ const text = `data: ${JSON.stringify(body)}\n\n`;
9
+ return new Response(text, { status: 200, headers });
10
+ }
11
+ function jsonResponse(body, status = 200) {
12
+ return new Response(JSON.stringify(body), {
13
+ status,
14
+ headers: { 'content-type': 'application/json' },
15
+ });
16
+ }
17
+ describe('ClawtoolMcpClient', () => {
18
+ it('initialize → tools/list issues the right wire calls and threads the session id', async () => {
19
+ const fetchMock = vi.fn();
20
+ // 1: initialize
21
+ fetchMock.mockResolvedValueOnce(sseResponse({
22
+ jsonrpc: '2.0',
23
+ id: 1,
24
+ result: {
25
+ protocolVersion: '2024-11-05',
26
+ capabilities: {},
27
+ serverInfo: { name: 'clawtool', version: '0.0.0' },
28
+ },
29
+ }, 'sid-xyz'));
30
+ // 2: notifications/initialized (no body matters)
31
+ fetchMock.mockResolvedValueOnce(jsonResponse({ jsonrpc: '2.0' }));
32
+ // 3: tools/list
33
+ fetchMock.mockResolvedValueOnce(sseResponse({
34
+ jsonrpc: '2.0',
35
+ id: 2,
36
+ result: { tools: [{ name: 'Bash', description: 'shell', inputSchema: {} }] },
37
+ }));
38
+ const client = new ClawtoolMcpClient({
39
+ endpoint: 'http://localhost:1234',
40
+ token: 'tok',
41
+ fetch: fetchMock,
42
+ });
43
+ const tools = await client.listTools();
44
+ expect(tools).toEqual([{ name: 'Bash', description: 'shell', inputSchema: {} }]);
45
+ // All three calls hit /mcp.
46
+ expect(fetchMock).toHaveBeenCalledTimes(3);
47
+ for (const call of fetchMock.mock.calls) {
48
+ expect(call[0]).toBe('http://localhost:1234/mcp');
49
+ }
50
+ // Initialize carried the bearer + method headers, no session id yet.
51
+ const initHeaders = fetchMock.mock.calls[0]?.[1]?.headers;
52
+ expect(initHeaders.Authorization).toBe('Bearer tok');
53
+ expect(initHeaders['Mcp-Method']).toBe('initialize');
54
+ expect(initHeaders['Mcp-Session-Id']).toBeUndefined();
55
+ // Subsequent calls echo the session id captured from the initialize response.
56
+ const notifyHeaders = fetchMock.mock.calls[1]?.[1]?.headers;
57
+ expect(notifyHeaders['Mcp-Session-Id']).toBe('sid-xyz');
58
+ const listHeaders = fetchMock.mock.calls[2]?.[1]?.headers;
59
+ expect(listHeaders['Mcp-Session-Id']).toBe('sid-xyz');
60
+ expect(listHeaders['Mcp-Method']).toBe('tools/list');
61
+ });
62
+ it('omits the Authorization header when the token is empty (no-auth daemon)', async () => {
63
+ const fetchMock = vi.fn();
64
+ fetchMock.mockResolvedValue(sseResponse({
65
+ jsonrpc: '2.0',
66
+ id: 1,
67
+ result: { protocolVersion: '2024-11-05', capabilities: {}, serverInfo: {} },
68
+ }, 'sid-noauth'));
69
+ const client = new ClawtoolMcpClient({
70
+ endpoint: 'http://localhost:1234',
71
+ token: '',
72
+ fetch: fetchMock,
73
+ });
74
+ await client.initialize();
75
+ const headers = fetchMock.mock.calls[0]?.[1]?.headers;
76
+ expect(headers.Authorization).toBeUndefined();
77
+ });
78
+ it('tools/call adds the Mcp-Name header for the tool dispatch', async () => {
79
+ const fetchMock = vi.fn();
80
+ fetchMock.mockResolvedValueOnce(sseResponse({
81
+ jsonrpc: '2.0',
82
+ id: 1,
83
+ result: { protocolVersion: '2024-11-05', capabilities: {}, serverInfo: {} },
84
+ }, 'sid-call'));
85
+ fetchMock.mockResolvedValueOnce(jsonResponse({ jsonrpc: '2.0' }));
86
+ fetchMock.mockResolvedValueOnce(sseResponse({
87
+ jsonrpc: '2.0',
88
+ id: 2,
89
+ result: { content: [{ type: 'text', text: 'ok' }] },
90
+ }));
91
+ const client = new ClawtoolMcpClient({
92
+ endpoint: 'http://localhost:1234',
93
+ token: 'tok',
94
+ fetch: fetchMock,
95
+ });
96
+ const result = await client.callTool('Bash', { command: 'echo hi' });
97
+ expect(result.content[0]).toEqual({ type: 'text', text: 'ok' });
98
+ const callHeaders = fetchMock.mock.calls[2]?.[1]?.headers;
99
+ expect(callHeaders['Mcp-Name']).toBe('Bash');
100
+ });
101
+ it('throws McpProtocolError on non-2xx responses', async () => {
102
+ const fetchMock = vi.fn();
103
+ fetchMock.mockResolvedValue(new Response('', { status: 404 }));
104
+ const client = new ClawtoolMcpClient({
105
+ endpoint: 'http://localhost:1234',
106
+ token: '',
107
+ fetch: fetchMock,
108
+ });
109
+ await expect(client.initialize()).rejects.toThrow(McpProtocolError);
110
+ });
111
+ it('throws McpProtocolError when the envelope reports a JSON-RPC error', async () => {
112
+ const fetchMock = vi.fn();
113
+ fetchMock.mockResolvedValueOnce(sseResponse({
114
+ jsonrpc: '2.0',
115
+ id: 1,
116
+ error: { code: -32601, message: 'method not found' },
117
+ }));
118
+ const client = new ClawtoolMcpClient({
119
+ endpoint: 'http://localhost:1234',
120
+ token: '',
121
+ fetch: fetchMock,
122
+ });
123
+ await expect(client.initialize()).rejects.toThrow(/method not found/);
124
+ });
125
+ });
126
+ //# sourceMappingURL=mcp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/mcp.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolve clawtool's XDG-style config directory, honoring `XDG_CONFIG_HOME`.
3
+ * Mirrors clawtool's Go `internal/daemon/daemon.go:75-77` behavior.
4
+ */
5
+ export declare function clawtoolConfigDir(env?: NodeJS.ProcessEnv): string;
6
+ export declare function daemonStatePath(env?: NodeJS.ProcessEnv): string;
7
+ export declare function listenerTokenPath(env?: NodeJS.ProcessEnv): string;
8
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/paths.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI9E;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,19 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Resolve clawtool's XDG-style config directory, honoring `XDG_CONFIG_HOME`.
5
+ * Mirrors clawtool's Go `internal/daemon/daemon.go:75-77` behavior.
6
+ */
7
+ export function clawtoolConfigDir(env = process.env) {
8
+ const xdg = env.XDG_CONFIG_HOME;
9
+ if (xdg && xdg.trim().length > 0)
10
+ return join(xdg, 'clawtool');
11
+ return join(homedir(), '.config', 'clawtool');
12
+ }
13
+ export function daemonStatePath(env = process.env) {
14
+ return join(clawtoolConfigDir(env), 'daemon.json');
15
+ }
16
+ export function listenerTokenPath(env = process.env) {
17
+ return join(clawtoolConfigDir(env), 'listener-token');
18
+ }
19
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAA;IAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAC9D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAA;AACtD,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Client for clawtool's BIAM peer registry (`/v1/peers`) — the canonical
3
+ * cross-terminal / cross-host agent coordination layer. namzu registers
4
+ * itself here as a peer so any orchestrator (clawtool's dashboard, another
5
+ * namzu's `/agents`) can see it, and messages it via the same registry.
6
+ *
7
+ * namzu does NOT run its own session daemon for this — clawtool already owns
8
+ * peer presence, heartbeats, messaging, broadcast, mDNS LAN discovery, and a
9
+ * dashboard. We just register + list + send through it.
10
+ *
11
+ * Every call is best-effort: with no reachable clawtool daemon the helpers
12
+ * return null / [] / false so the TUI works the same with or without it.
13
+ */
14
+ import { type EnsureDaemonOptions } from './daemon.js';
15
+ export interface Peer {
16
+ readonly peer_id: string;
17
+ readonly display_name: string;
18
+ readonly backend: string;
19
+ readonly circle?: string;
20
+ readonly role?: string;
21
+ readonly status?: string;
22
+ readonly session_id?: string;
23
+ readonly pid?: number;
24
+ readonly path?: string;
25
+ readonly last_seen?: string;
26
+ }
27
+ export interface RegisterPeerInput {
28
+ readonly display_name: string;
29
+ readonly backend: string;
30
+ readonly path?: string;
31
+ readonly session_id?: string;
32
+ readonly pid?: number;
33
+ readonly circle?: string;
34
+ readonly metadata?: Record<string, string>;
35
+ }
36
+ /** Register (or refresh) this process as a BIAM peer; returns its peer_id. */
37
+ export declare function registerPeer(input: RegisterPeerInput, opts?: EnsureDaemonOptions): Promise<string | null>;
38
+ export declare function heartbeatPeer(peerId: string, opts?: EnsureDaemonOptions): Promise<void>;
39
+ export declare function deregisterPeer(peerId: string, opts?: EnsureDaemonOptions): Promise<void>;
40
+ export declare function listPeers(opts?: EnsureDaemonOptions): Promise<readonly Peer[]>;
41
+ /** A message in a peer's BIAM inbox (clawtool `a2a.Message`). */
42
+ export interface InboxMessage {
43
+ readonly id: string;
44
+ readonly type?: string;
45
+ readonly from_peer: string;
46
+ readonly to_peer?: string;
47
+ readonly text: string;
48
+ readonly correlation_id?: string;
49
+ readonly timestamp?: string;
50
+ }
51
+ /**
52
+ * Drain this peer's inbox — returns + clears pending messages other agents
53
+ * sent to us. namzu polls this so clawtool / another agent can talk TO it,
54
+ * not just be listed. (`peek` leaves messages in place; default drains.)
55
+ */
56
+ export declare function drainInbox(peerId: string, opts?: EnsureDaemonOptions & {
57
+ peek?: boolean;
58
+ }): Promise<readonly InboxMessage[]>;
59
+ /**
60
+ * Send a message to another peer's BIAM inbox. `from` is our own peer id so
61
+ * the recipient knows who sent it (and can reply) — clawtool stamps it as the
62
+ * message's `from_peer`.
63
+ */
64
+ export declare function sendPeerMessage(peerId: string, text: string, opts?: EnsureDaemonOptions & {
65
+ from?: string;
66
+ }): Promise<boolean>;
67
+ //# sourceMappingURL=peers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/peers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,aAAa,CAAA;AAEpE,MAAM,WAAW,IAAI;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAmBD,8EAA8E;AAC9E,wBAAsB,YAAY,CACjC,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,mBAAwB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAejG;AAED,wBAAsB,cAAc,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,mBAAwB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAgBxF;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,mBAAmB,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAiBlC;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACpC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,mBAAmB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,OAAO,CAAC,CAelB"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Client for clawtool's BIAM peer registry (`/v1/peers`) — the canonical
3
+ * cross-terminal / cross-host agent coordination layer. namzu registers
4
+ * itself here as a peer so any orchestrator (clawtool's dashboard, another
5
+ * namzu's `/agents`) can see it, and messages it via the same registry.
6
+ *
7
+ * namzu does NOT run its own session daemon for this — clawtool already owns
8
+ * peer presence, heartbeats, messaging, broadcast, mDNS LAN discovery, and a
9
+ * dashboard. We just register + list + send through it.
10
+ *
11
+ * Every call is best-effort: with no reachable clawtool daemon the helpers
12
+ * return null / [] / false so the TUI works the same with or without it.
13
+ */
14
+ import { ensureDaemon } from './daemon.js';
15
+ async function endpoint(opts) {
16
+ try {
17
+ return await ensureDaemon(opts);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function authHeaders(token, withBody) {
24
+ const h = {};
25
+ if (token.length > 0)
26
+ h.Authorization = `Bearer ${token}`;
27
+ if (withBody)
28
+ h['content-type'] = 'application/json';
29
+ return h;
30
+ }
31
+ /** Register (or refresh) this process as a BIAM peer; returns its peer_id. */
32
+ export async function registerPeer(input, opts = {}) {
33
+ const ep = await endpoint(opts);
34
+ if (!ep)
35
+ return null;
36
+ const fetchFn = opts.fetch ?? globalThis.fetch;
37
+ try {
38
+ const res = await fetchFn(new URL('/v1/peers/register', ep.baseUrl).toString(), {
39
+ method: 'POST',
40
+ headers: authHeaders(ep.token, true),
41
+ body: JSON.stringify(input),
42
+ });
43
+ if (!res.ok)
44
+ return null;
45
+ const peer = (await res.json());
46
+ return typeof peer.peer_id === 'string' ? peer.peer_id : null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ export async function heartbeatPeer(peerId, opts = {}) {
53
+ const ep = await endpoint(opts);
54
+ if (!ep)
55
+ return;
56
+ const fetchFn = opts.fetch ?? globalThis.fetch;
57
+ try {
58
+ await fetchFn(new URL(`/v1/peers/${encodeURIComponent(peerId)}/heartbeat`, ep.baseUrl).toString(), {
59
+ method: 'POST',
60
+ headers: authHeaders(ep.token, false),
61
+ });
62
+ }
63
+ catch {
64
+ // best-effort
65
+ }
66
+ }
67
+ export async function deregisterPeer(peerId, opts = {}) {
68
+ const ep = await endpoint(opts);
69
+ if (!ep)
70
+ return;
71
+ const fetchFn = opts.fetch ?? globalThis.fetch;
72
+ try {
73
+ await fetchFn(new URL(`/v1/peers/${encodeURIComponent(peerId)}`, ep.baseUrl).toString(), {
74
+ method: 'DELETE',
75
+ headers: authHeaders(ep.token, false),
76
+ });
77
+ }
78
+ catch {
79
+ // best-effort
80
+ }
81
+ }
82
+ export async function listPeers(opts = {}) {
83
+ const ep = await endpoint(opts);
84
+ if (!ep)
85
+ return [];
86
+ const fetchFn = opts.fetch ?? globalThis.fetch;
87
+ try {
88
+ const res = await fetchFn(new URL('/v1/peers', ep.baseUrl).toString(), {
89
+ method: 'GET',
90
+ headers: authHeaders(ep.token, false),
91
+ });
92
+ if (!res.ok)
93
+ return [];
94
+ const data = (await res.json());
95
+ const peers = Array.isArray(data) ? data : data.peers;
96
+ return Array.isArray(peers) ? peers : [];
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ /**
103
+ * Drain this peer's inbox — returns + clears pending messages other agents
104
+ * sent to us. namzu polls this so clawtool / another agent can talk TO it,
105
+ * not just be listed. (`peek` leaves messages in place; default drains.)
106
+ */
107
+ export async function drainInbox(peerId, opts = {}) {
108
+ const ep = await endpoint(opts);
109
+ if (!ep)
110
+ return [];
111
+ const fetchFn = opts.fetch ?? globalThis.fetch;
112
+ try {
113
+ const url = new URL(`/v1/peers/${encodeURIComponent(peerId)}/messages`, ep.baseUrl);
114
+ if (opts.peek)
115
+ url.searchParams.set('peek', '1');
116
+ const res = await fetchFn(url.toString(), {
117
+ method: 'GET',
118
+ headers: authHeaders(ep.token, false),
119
+ });
120
+ if (!res.ok)
121
+ return [];
122
+ const data = (await res.json());
123
+ return Array.isArray(data.messages) ? data.messages : [];
124
+ }
125
+ catch {
126
+ return [];
127
+ }
128
+ }
129
+ /**
130
+ * Send a message to another peer's BIAM inbox. `from` is our own peer id so
131
+ * the recipient knows who sent it (and can reply) — clawtool stamps it as the
132
+ * message's `from_peer`.
133
+ */
134
+ export async function sendPeerMessage(peerId, text, opts = {}) {
135
+ const ep = await endpoint(opts);
136
+ if (!ep)
137
+ return false;
138
+ const fetchFn = opts.fetch ?? globalThis.fetch;
139
+ const body = { text };
140
+ if (opts.from)
141
+ body.from_peer = opts.from;
142
+ try {
143
+ const res = await fetchFn(new URL(`/v1/peers/${encodeURIComponent(peerId)}/messages`, ep.baseUrl).toString(), { method: 'POST', headers: authHeaders(ep.token, true), body: JSON.stringify(body) });
144
+ return res.ok;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
150
+ //# sourceMappingURL=peers.js.map