@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 @@
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7C,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA;AAEnB,SAAS,OAAO;IACf,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAkC,EAAE,EAAoB,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,iBAAiB;IACzB,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,oBAAoB;IAC5B,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CACZ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7C,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;QACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAC9E,wBAAwB,CACxB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CACX,aAAa,CACZ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EACpE,OAAO,EAAE,CACT,CACD,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,oEAAoE;QACpE,gEAAgE;QAChE,gEAAgE;QAChE,iEAAiE;QACjE,wCAAwC;QACxC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;SACtD,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC7E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAqB,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QAC5D,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,CACL,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;YAC1C,iBAAiB,EAAE,UAAU;YAC7B,kBAAkB,EAAE,aAAa;SACjC,CAAC,CACF,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,CACL,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC,CACpF,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Conversation persistence for the TUI, built on the SDK's session
3
+ * hierarchy (`DiskSessionStore`) — no parallel store. Each cwd is one
4
+ * "project" (a `cli.json` pointer keeps its id stable across launches),
5
+ * every conversation is a Session under a fixed CLI thread, and the
6
+ * conversation's messages are appended to the session as turns complete.
7
+ *
8
+ * This is what powers `/resume`: list recent sessions, load a chosen
9
+ * session's messages, and keep chatting in it. The session store roots at
10
+ * `<cwd>/.namzu`, the same root `query()` writes its runs under, so a
11
+ * session's `session.json` and its `runs/` live in one place.
12
+ */
13
+ import { DiskSessionStore, type Message, type ProjectId, type SessionId, type TenantId, type ThreadId } from '@namzu/sdk';
14
+ export interface CliSessions {
15
+ readonly store: DiskSessionStore;
16
+ readonly projectId: ProjectId;
17
+ readonly threadId: ThreadId;
18
+ readonly tenantId: TenantId;
19
+ }
20
+ export interface RecentConversation {
21
+ readonly id: SessionId;
22
+ readonly title: string;
23
+ readonly updatedAt: string;
24
+ readonly count: number;
25
+ }
26
+ /**
27
+ * Open (or initialize) the cwd's CLI project. Returns the handle used by
28
+ * the other helpers. Throws only on unexpected store errors; callers treat
29
+ * failures as "persistence unavailable" and run without it.
30
+ */
31
+ export declare function openSessions(cwd: string): Promise<CliSessions>;
32
+ /** Start a fresh conversation; returns its session id. */
33
+ export declare function startConversation(s: CliSessions): Promise<SessionId>;
34
+ /** Append messages (in order) to a conversation. */
35
+ export declare function appendMessages(s: CliSessions, sessionId: SessionId, messages: readonly Message[]): Promise<void>;
36
+ /** Load a conversation's full message history. */
37
+ export declare function loadConversation(s: CliSessions, sessionId: SessionId): Promise<Message[]>;
38
+ /** Recent non-empty conversations, newest first — for the `/resume` list. */
39
+ export declare function listRecent(s: CliSessions, limit?: number): Promise<RecentConversation[]>;
40
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/integrations/sessions/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACN,gBAAgB,EAChB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEb,MAAM,YAAY,CAAA;AAKnB,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBpE;AAED,0DAA0D;AAC1D,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAM1E;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CACnC,CAAC,EAAE,WAAW,EACd,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,kDAAkD;AAClD,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAE/F;AAED,6EAA6E;AAC7E,wBAAsB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAc1F"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Conversation persistence for the TUI, built on the SDK's session
3
+ * hierarchy (`DiskSessionStore`) — no parallel store. Each cwd is one
4
+ * "project" (a `cli.json` pointer keeps its id stable across launches),
5
+ * every conversation is a Session under a fixed CLI thread, and the
6
+ * conversation's messages are appended to the session as turns complete.
7
+ *
8
+ * This is what powers `/resume`: list recent sessions, load a chosen
9
+ * session's messages, and keep chatting in it. The session store roots at
10
+ * `<cwd>/.namzu`, the same root `query()` writes its runs under, so a
11
+ * session's `session.json` and its `runs/` live in one place.
12
+ */
13
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { DiskSessionStore, UNKNOWN_TENANT_ID, } from '@namzu/sdk';
16
+ const TENANT = UNKNOWN_TENANT_ID;
17
+ const THREAD = 'thd_namzu-cli';
18
+ /**
19
+ * Open (or initialize) the cwd's CLI project. Returns the handle used by
20
+ * the other helpers. Throws only on unexpected store errors; callers treat
21
+ * failures as "persistence unavailable" and run without it.
22
+ */
23
+ export async function openSessions(cwd) {
24
+ const root = join(cwd, '.namzu');
25
+ const store = new DiskSessionStore({ rootDir: root });
26
+ const pointerPath = join(root, 'cli.json');
27
+ let projectId;
28
+ try {
29
+ const ptr = JSON.parse(readFileSync(pointerPath, 'utf8'));
30
+ if (typeof ptr.projectId === 'string')
31
+ projectId = ptr.projectId;
32
+ }
33
+ catch {
34
+ // no pointer yet
35
+ }
36
+ if (projectId && !(await store.getProject(projectId, TENANT))) {
37
+ projectId = undefined; // pointer is stale (dir wiped)
38
+ }
39
+ if (!projectId) {
40
+ const project = await store.createProject({ tenantId: TENANT, name: 'namzu CLI' }, TENANT);
41
+ projectId = project.id;
42
+ mkdirSync(root, { recursive: true });
43
+ writeFileSync(pointerPath, `${JSON.stringify({ projectId }, null, 2)}\n`, { mode: 0o600 });
44
+ }
45
+ return { store, projectId, threadId: THREAD, tenantId: TENANT };
46
+ }
47
+ /** Start a fresh conversation; returns its session id. */
48
+ export async function startConversation(s) {
49
+ const session = await s.store.createSession({ threadId: s.threadId, projectId: s.projectId, currentActor: null }, s.tenantId);
50
+ return session.id;
51
+ }
52
+ /** Append messages (in order) to a conversation. */
53
+ export async function appendMessages(s, sessionId, messages) {
54
+ for (const m of messages) {
55
+ await s.store.appendMessage(sessionId, m, s.tenantId);
56
+ }
57
+ }
58
+ /** Load a conversation's full message history. */
59
+ export async function loadConversation(s, sessionId) {
60
+ return [...(await s.store.loadMessages(sessionId, s.tenantId))];
61
+ }
62
+ /** Recent non-empty conversations, newest first — for the `/resume` list. */
63
+ export async function listRecent(s, limit = 20) {
64
+ const sessions = await s.store.listSessions(s.threadId, s.tenantId);
65
+ const out = [];
66
+ for (const sess of sessions) {
67
+ const messages = await s.store.loadMessages(sess.id, s.tenantId);
68
+ if (messages.length === 0)
69
+ continue;
70
+ out.push({
71
+ id: sess.id,
72
+ title: conversationTitle(messages),
73
+ updatedAt: toIso(sess.updatedAt),
74
+ count: messages.length,
75
+ });
76
+ }
77
+ return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)).slice(0, limit);
78
+ }
79
+ function conversationTitle(messages) {
80
+ const firstUser = messages.find((m) => m.role === 'user');
81
+ const raw = typeof firstUser?.content === 'string' ? firstUser.content : 'Conversation';
82
+ const text = raw.replace(/\s+/g, ' ').trim();
83
+ return text.length > 60 ? `${text.slice(0, 59)}…` : text || 'Conversation';
84
+ }
85
+ function toIso(value) {
86
+ if (value instanceof Date)
87
+ return value.toISOString();
88
+ return typeof value === 'string' ? value : new Date(0).toISOString();
89
+ }
90
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/integrations/sessions/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Sub-agent runtime: the model delegates work via an `Agent` tool that can
3
+ * DEFINE a specialist on the fly — pass a `role` (the persona / system prompt)
4
+ * and namzu spins up a fresh sub-agent with that role at runtime, no
5
+ * pre-registered definition needed. Omit `role` for a general-purpose one.
6
+ * The call blocks until the child finishes and its final text returns as the
7
+ * tool result, so a delegation surfaces in the transcript as a normal
8
+ * `⏺ Agent(...)` call.
9
+ *
10
+ * The runtime is fully self-contained: a dedicated in-memory session/thread
11
+ * store backs the AgentManager, so sub-agent bookkeeping never touches the
12
+ * CLI's on-disk `/resume` conversation store.
13
+ */
14
+ import { type LLMProvider, type RunEvent, type TaskGateway, type ToolDefinition, type ToolRegistryContract, type VerificationGateConfig } from '@namzu/sdk';
15
+ export declare const GENERAL_PURPOSE_SUBAGENT = "general-purpose";
16
+ export interface SubagentRuntimeOptions {
17
+ readonly cwd: string;
18
+ readonly model: string;
19
+ /** Construct a fresh provider for the sub-agent (current credential). */
20
+ readonly buildProvider: () => LLMProvider;
21
+ /** Build the sub-agent's tool registry (its own working set). */
22
+ readonly buildTools: () => ToolRegistryContract;
23
+ readonly verificationGate?: VerificationGateConfig;
24
+ /** Receives the child's RunEvents (lineage-stamped) — for the tree view. */
25
+ readonly onEvent?: (event: RunEvent) => void;
26
+ }
27
+ export interface SubagentRuntime {
28
+ readonly gateway: TaskGateway;
29
+ readonly agentTool: ToolDefinition;
30
+ readonly allowedAgentIds: readonly string[];
31
+ }
32
+ /**
33
+ * Stand up the AgentManager + gateway + `Agent` tool. Returns the tool to
34
+ * register on the parent and the gateway to pass to `query({ taskGateway })`.
35
+ */
36
+ export declare function createSubagentRuntime(opts: SubagentRuntimeOptions): Promise<SubagentRuntime>;
37
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAYN,KAAK,WAAW,EAIhB,KAAK,QAAQ,EAIb,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,sBAAsB,EAI3B,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAczD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,WAAW,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,oBAAoB,CAAA;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAqI1B"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Sub-agent runtime: the model delegates work via an `Agent` tool that can
3
+ * DEFINE a specialist on the fly — pass a `role` (the persona / system prompt)
4
+ * and namzu spins up a fresh sub-agent with that role at runtime, no
5
+ * pre-registered definition needed. Omit `role` for a general-purpose one.
6
+ * The call blocks until the child finishes and its final text returns as the
7
+ * tool result, so a delegation surfaces in the transcript as a normal
8
+ * `⏺ Agent(...)` call.
9
+ *
10
+ * The runtime is fully self-contained: a dedicated in-memory session/thread
11
+ * store backs the AgentManager, so sub-agent bookkeeping never touches the
12
+ * CLI's on-disk `/resume` conversation store.
13
+ */
14
+ import { AgentManager, AgentRegistry, DefaultCapacityValidator, InMemorySessionStore, InMemoryThreadStore, LocalTaskGateway, ReactiveAgent, SessionSummaryMaterializer, ThreadManager, WorkspaceBackendRegistry, defineTool, mcpJsonSchemaToZod, } from '@namzu/sdk';
15
+ export const GENERAL_PURPOSE_SUBAGENT = 'general-purpose';
16
+ const SUBAGENT_PROMPT = [
17
+ 'You are a focused sub-agent dispatched by namzu to complete one self-contained task and report back.',
18
+ 'You cannot see the parent conversation — work only from the prompt you were given.',
19
+ 'Use your tools to actually do the work, then end with a concise summary of what you did and any results the parent needs.',
20
+ 'Be thorough but do not ask the parent questions; make reasonable assumptions and state them.',
21
+ '',
22
+ 'Never fabricate. Only report results you actually produced via tool calls:',
23
+ '- If you write a file, write it with the `write` tool and report the real path; never claim a file exists without writing it.',
24
+ '- If you need to research and have no web tool available, say so plainly and answer from your own knowledge with that caveat — do not invent sources, data, or URLs.',
25
+ '- Do not invent command output or results. If you cannot complete the task, say what blocked you.',
26
+ ].join('\n');
27
+ /**
28
+ * Stand up the AgentManager + gateway + `Agent` tool. Returns the tool to
29
+ * register on the parent and the gateway to pass to `query({ taskGateway })`.
30
+ */
31
+ export async function createSubagentRuntime(opts) {
32
+ const tenantId = 'tnt_namzu-cli';
33
+ const store = new InMemorySessionStore();
34
+ const threadStore = new InMemoryThreadStore();
35
+ const userActor = { kind: 'user', userId: 'usr_namzu', tenantId };
36
+ const project = await store.createProject({ tenantId, name: 'namzu-cli' }, tenantId);
37
+ const thread = await threadStore.createThread({ projectId: project.id, title: 'namzu-cli' }, tenantId);
38
+ const parentSession = await store.createSession({ threadId: thread.id, projectId: project.id, currentActor: userActor }, tenantId);
39
+ await store.updateSession({ ...parentSession, status: 'active' }, tenantId);
40
+ let summaryCounter = 0;
41
+ const materializer = new SessionSummaryMaterializer({
42
+ store,
43
+ generateSummaryId: () => `sum_namzu_${++summaryCounter}`,
44
+ });
45
+ const registry = new AgentRegistry();
46
+ registry.register(buildDefinition(GENERAL_PURPOSE_SUBAGENT, 'A general-purpose sub-agent.', SUBAGENT_PROMPT, opts));
47
+ const threadManager = new ThreadManager({ threadStore, sessionStore: store });
48
+ const manager = new AgentManager(registry, undefined, {
49
+ sessionStore: store,
50
+ summaryMaterializer: materializer,
51
+ workspaceRegistry: new WorkspaceBackendRegistry(),
52
+ capacity: new DefaultCapacityValidator(store),
53
+ threadManager,
54
+ });
55
+ const taskContext = {
56
+ parentRunId: 'run_namzu-cli',
57
+ parentAgentId: 'namzu',
58
+ parentAbortController: new AbortController(),
59
+ depth: 0,
60
+ budgetTracker: { total: 1_000_000, remaining: 1_000_000 },
61
+ tenantId,
62
+ threadId: thread.id,
63
+ sessionId: parentSession.id,
64
+ projectId: project.id,
65
+ parentActor: userActor,
66
+ };
67
+ const gateway = new LocalTaskGateway(manager, taskContext, opts.onEvent);
68
+ // Dynamic `Agent` tool: the model passes an optional `role` (the persona /
69
+ // system prompt) and we register + spawn a fresh specialist for it at call
70
+ // time — no pre-defined agent file needed. Omit `role` → general-purpose.
71
+ let dynCounter = 0;
72
+ const agentTool = defineTool({
73
+ name: 'Agent',
74
+ description: 'Delegate a self-contained task to a sub-agent and get its result back (BLOCKING). ' +
75
+ 'Define the specialist inline with `role` — a system prompt describing who the sub-agent ' +
76
+ 'is and how to behave (e.g. "You are a security auditor; flag vulnerabilities and rate severity"). ' +
77
+ 'Omit `role` for a general-purpose sub-agent. The sub-agent runs in its own context with its own ' +
78
+ 'tools and cannot see this conversation — put everything it needs in `prompt`. Call this multiple ' +
79
+ 'times in one response to run specialists in parallel.',
80
+ inputSchema: mcpJsonSchemaToZod({
81
+ type: 'object',
82
+ properties: {
83
+ description: {
84
+ type: 'string',
85
+ description: 'Short label for tracking (shown to the user).',
86
+ },
87
+ prompt: {
88
+ type: 'string',
89
+ description: 'Self-contained task with all the context the sub-agent needs.',
90
+ },
91
+ role: {
92
+ type: 'string',
93
+ description: 'Optional persona / system prompt that defines this specialist sub-agent. Omit for general-purpose.',
94
+ },
95
+ },
96
+ required: ['description', 'prompt'],
97
+ }),
98
+ category: 'custom',
99
+ permissions: [],
100
+ readOnly: false,
101
+ destructive: false,
102
+ concurrencySafe: true,
103
+ async execute(input) {
104
+ const { prompt, role } = input;
105
+ let agentId = GENERAL_PURPOSE_SUBAGENT;
106
+ const persona = typeof role === 'string' ? role.trim() : '';
107
+ const dynamic = persona.length > 0;
108
+ if (dynamic) {
109
+ agentId = `dyn-${++dynCounter}`;
110
+ registry.register(buildDefinition(agentId, `Dynamic specialist: ${agentId}`, persona, opts));
111
+ }
112
+ try {
113
+ const handle = await gateway.createTask({ agentId, prompt, workingDirectory: opts.cwd });
114
+ const completed = await gateway.waitForTask(handle.taskId);
115
+ const runStatus = completed.result?.status;
116
+ const succeeded = completed.state === 'completed' && (runStatus === undefined || runStatus === 'completed');
117
+ const resultText = typeof completed.result?.result === 'string'
118
+ ? completed.result.result
119
+ : completed.result?.result !== undefined
120
+ ? JSON.stringify(completed.result.result)
121
+ : '';
122
+ if (!succeeded) {
123
+ return {
124
+ success: false,
125
+ output: '',
126
+ error: `Sub-agent ${agentId} ${completed.state}: ${completed.result?.lastError ?? resultText ?? '(no detail)'}`,
127
+ };
128
+ }
129
+ return { success: true, output: resultText || '(sub-agent returned no text)' };
130
+ }
131
+ finally {
132
+ // A per-call dynamic specialist is single-use — drop its definition
133
+ // (and retained persona string) so long sessions don't leak `dyn-N`
134
+ // registrations whether the task succeeded, failed, or threw.
135
+ if (dynamic)
136
+ registry.unregister(agentId);
137
+ }
138
+ },
139
+ });
140
+ return { gateway, agentTool, allowedAgentIds: [GENERAL_PURPOSE_SUBAGENT] };
141
+ }
142
+ /**
143
+ * Build an agent definition with the given id + persona (system prompt). Used
144
+ * for the static `general-purpose` agent and for each dynamically-defined
145
+ * specialist the model creates via the `Agent` tool's `role` argument.
146
+ */
147
+ function buildDefinition(id, description, systemPrompt, opts) {
148
+ const agent = new ReactiveAgent({
149
+ id,
150
+ name: id,
151
+ version: '1.0.0',
152
+ category: 'general',
153
+ description,
154
+ });
155
+ // A specialist persona is layered on top of the anti-fabrication base so a
156
+ // dynamic role can't opt out of the "don't invent results" guardrails.
157
+ const prompt = systemPrompt === SUBAGENT_PROMPT ? SUBAGENT_PROMPT : `${systemPrompt}\n\n${SUBAGENT_PROMPT}`;
158
+ return {
159
+ info: {
160
+ id,
161
+ name: id,
162
+ version: '1.0.0',
163
+ category: 'general',
164
+ description,
165
+ tools: [],
166
+ defaults: { model: opts.model, tokenBudget: 200_000 },
167
+ },
168
+ // ReactiveAgent is Agent<ReactiveAgentConfig,…>; the registry stores the
169
+ // erased Agent<BaseAgentConfig,…>. configBuilder supplies the richer config.
170
+ typedAgent: agent,
171
+ configBuilder: (options) => ({
172
+ model: options.model ?? opts.model,
173
+ tokenBudget: options.tokenBudget ?? 200_000,
174
+ timeoutMs: options.timeoutMs ?? 600_000,
175
+ maxIterations: 40,
176
+ provider: opts.buildProvider(),
177
+ tools: opts.buildTools(),
178
+ systemPrompt: prompt,
179
+ ...(opts.verificationGate ? { verificationGate: opts.verificationGate } : {}),
180
+ }),
181
+ };
182
+ }
183
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Trusted-folder store — `~/.namzu/trust.json`.
3
+ *
4
+ * Claude-Code-style trust gate: before namzu reads, runs commands in, or
5
+ * edits files in a directory, the user must trust it. Trusted directories
6
+ * are remembered here so the prompt only appears once per folder. A folder
7
+ * counts as trusted if it — or any ancestor — has been trusted, so
8
+ * trusting a repo root covers its subfolders.
9
+ */
10
+ export declare function trustFilePath(home?: string): string;
11
+ export declare function readTrustedDirs(home?: string): string[];
12
+ /** True when `dir` or any ancestor is in the trusted list. */
13
+ export declare function isTrusted(dir: string, home?: string): boolean;
14
+ /** Add `dir` to the trusted list (idempotent). */
15
+ export declare function trustDir(dir: string, home?: string): void;
16
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/integrations/trust/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE9D;AAWD,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,EAAE,CAOlE;AAED,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CASxE;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,IAAI,CAQpE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Trusted-folder store — `~/.namzu/trust.json`.
3
+ *
4
+ * Claude-Code-style trust gate: before namzu reads, runs commands in, or
5
+ * edits files in a directory, the user must trust it. Trusted directories
6
+ * are remembered here so the prompt only appears once per folder. A folder
7
+ * counts as trusted if it — or any ancestor — has been trusted, so
8
+ * trusting a repo root covers its subfolders.
9
+ */
10
+ import { mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
11
+ import { homedir } from 'node:os';
12
+ import { dirname, join, resolve, sep } from 'node:path';
13
+ const DIR_MODE = 0o700;
14
+ const FILE_MODE = 0o600;
15
+ const TRUST_FILE_VERSION = 1;
16
+ export function trustFilePath(home = homedir()) {
17
+ return join(home, '.namzu', 'trust.json');
18
+ }
19
+ /** Resolve symlinks + normalize so the same dir isn't trusted twice. */
20
+ function canonical(dir) {
21
+ try {
22
+ return realpathSync(resolve(dir));
23
+ }
24
+ catch {
25
+ return resolve(dir);
26
+ }
27
+ }
28
+ export function readTrustedDirs(home = homedir()) {
29
+ try {
30
+ const parsed = JSON.parse(readFileSync(trustFilePath(home), 'utf8'));
31
+ return Array.isArray(parsed.trusted) ? parsed.trusted.filter((d) => typeof d === 'string') : [];
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ /** True when `dir` or any ancestor is in the trusted list. */
38
+ export function isTrusted(dir, home = homedir()) {
39
+ const target = canonical(dir);
40
+ const trusted = readTrustedDirs(home).map(canonical);
41
+ for (const t of trusted) {
42
+ if (target === t || target.startsWith(t.endsWith(sep) ? t : t + sep)) {
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ /** Add `dir` to the trusted list (idempotent). */
49
+ export function trustDir(dir, home = homedir()) {
50
+ const target = canonical(dir);
51
+ const current = readTrustedDirs(home);
52
+ if (current.map(canonical).includes(target))
53
+ return;
54
+ const next = { version: TRUST_FILE_VERSION, trusted: [...current, target] };
55
+ const path = trustFilePath(home);
56
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
57
+ writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`, { mode: FILE_MODE });
58
+ }
59
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/integrations/trust/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/trust/store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { isTrusted, readTrustedDirs, trustDir } from './store.js';
6
+ let home;
7
+ let work;
8
+ beforeEach(() => {
9
+ home = mkdtempSync(join(tmpdir(), 'namzu-trust-'));
10
+ work = mkdtempSync(join(tmpdir(), 'namzu-proj-'));
11
+ mkdirSync(join(home, '.namzu'), { recursive: true });
12
+ });
13
+ afterEach(() => {
14
+ rmSync(home, { recursive: true, force: true });
15
+ rmSync(work, { recursive: true, force: true });
16
+ });
17
+ describe('trust store', () => {
18
+ it('starts empty and untrusted', () => {
19
+ expect(readTrustedDirs(home)).toEqual([]);
20
+ expect(isTrusted(work, home)).toBe(false);
21
+ });
22
+ it('trusts a directory and persists it', () => {
23
+ trustDir(work, home);
24
+ expect(isTrusted(work, home)).toBe(true);
25
+ expect(readTrustedDirs(home).length).toBe(1);
26
+ });
27
+ it('is idempotent', () => {
28
+ trustDir(work, home);
29
+ trustDir(work, home);
30
+ expect(readTrustedDirs(home).length).toBe(1);
31
+ });
32
+ it('trusting a folder covers its subfolders (ancestor match)', () => {
33
+ const sub = join(work, 'packages', 'cli');
34
+ mkdirSync(sub, { recursive: true });
35
+ trustDir(work, home);
36
+ expect(isTrusted(sub, home)).toBe(true);
37
+ });
38
+ it('does not trust an unrelated sibling', () => {
39
+ const other = mkdtempSync(join(tmpdir(), 'namzu-other-'));
40
+ trustDir(work, home);
41
+ expect(isTrusted(other, home)).toBe(false);
42
+ rmSync(other, { recursive: true, force: true });
43
+ });
44
+ it('does not treat a path-prefix sibling as trusted', () => {
45
+ // /tmp/proj must not match /tmp/proj-2 just by string prefix.
46
+ trustDir(work, home);
47
+ expect(isTrusted(`${work}-2`, home)).toBe(false);
48
+ });
49
+ });
50
+ //# sourceMappingURL=store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/trust/store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Update checks for namzu (npm) and clawtool (`clawtool upgrade --check`),
3
+ * surfaced in the TUI so the user knows when a newer version is out. Both are
4
+ * best-effort with short timeouts: offline / unpublished / no-clawtool just
5
+ * yields `null`, never an error or a hang.
6
+ */
7
+ export interface UpdateInfo {
8
+ readonly name: string;
9
+ readonly current: string;
10
+ readonly latest: string;
11
+ /** How to upgrade, shown to the user. */
12
+ readonly how: string;
13
+ }
14
+ /** Compare dotted numeric versions; >0 if a>b, <0 if a<b, 0 if equal. */
15
+ export declare function compareVersions(a: string, b: string): number;
16
+ /** Newer @namzu/cli on npm, or null when up to date / unreachable. */
17
+ export declare function checkNamzuUpdate(current: string): Promise<UpdateInfo | null>;
18
+ /**
19
+ * Newer clawtool, or null. Prefers the machine-readable
20
+ * `upgrade --check --json` (newer binaries); falls back to parsing the
21
+ * `current -> latest` line in the plain `upgrade --check` output (older
22
+ * binaries that predate `--json`).
23
+ */
24
+ export declare function checkClawtoolUpdate(): Promise<UpdateInfo | null>;
25
+ /** Run both checks in parallel; returns whichever have an update available. */
26
+ export declare function checkUpdates(namzuVersion: string): Promise<readonly UpdateInfo[]>;
27
+ //# sourceMappingURL=updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/integrations/updates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB;AAKD,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED,sEAAsE;AACtE,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkBlF;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA+BtE;AAED,+EAA+E;AAC/E,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAMvF"}