@namzu/cli 0.0.3 → 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 (364) hide show
  1. package/dist/bin.js +4 -32
  2. package/dist/bin.js.map +1 -1
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +124 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cli.test.d.ts +2 -0
  8. package/dist/cli.test.d.ts.map +1 -0
  9. package/dist/cli.test.js +94 -0
  10. package/dist/cli.test.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +6 -0
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +10 -0
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/providers.d.ts +17 -0
  16. package/dist/commands/providers.d.ts.map +1 -0
  17. package/dist/commands/providers.js +274 -0
  18. package/dist/commands/providers.js.map +1 -0
  19. package/dist/commands/registry.d.ts +11 -0
  20. package/dist/commands/registry.d.ts.map +1 -0
  21. package/dist/commands/registry.js +28 -0
  22. package/dist/commands/registry.js.map +1 -0
  23. package/dist/commands/run.d.ts +14 -0
  24. package/dist/commands/run.d.ts.map +1 -0
  25. package/dist/commands/run.js +73 -0
  26. package/dist/commands/run.js.map +1 -0
  27. package/dist/commands/stubs.d.ts +12 -0
  28. package/dist/commands/stubs.d.ts.map +1 -0
  29. package/dist/commands/stubs.js +32 -0
  30. package/dist/commands/stubs.js.map +1 -0
  31. package/dist/commands/tools.d.ts +16 -0
  32. package/dist/commands/tools.d.ts.map +1 -0
  33. package/dist/commands/tools.js +161 -0
  34. package/dist/commands/tools.js.map +1 -0
  35. package/dist/commands/types.d.ts +25 -0
  36. package/dist/commands/types.d.ts.map +1 -0
  37. package/dist/commands/types.js +2 -0
  38. package/dist/commands/types.js.map +1 -0
  39. package/dist/config/load.d.ts +25 -0
  40. package/dist/config/load.d.ts.map +1 -0
  41. package/dist/config/load.js +92 -0
  42. package/dist/config/load.js.map +1 -0
  43. package/dist/config/load.test.d.ts +2 -0
  44. package/dist/config/load.test.d.ts.map +1 -0
  45. package/dist/config/load.test.js +57 -0
  46. package/dist/config/load.test.js.map +1 -0
  47. package/dist/config/schema.d.ts +29 -0
  48. package/dist/config/schema.d.ts.map +1 -0
  49. package/dist/config/schema.js +13 -0
  50. package/dist/config/schema.js.map +1 -0
  51. package/dist/doctor/registry.d.ts.map +1 -1
  52. package/dist/doctor/registry.js +3 -1
  53. package/dist/doctor/registry.js.map +1 -1
  54. package/dist/doctor/registry.test.js +4 -1
  55. package/dist/doctor/registry.test.js.map +1 -1
  56. package/dist/index.d.ts +6 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +7 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/integrations/clawtool/agents.d.ts +31 -0
  61. package/dist/integrations/clawtool/agents.d.ts.map +1 -0
  62. package/dist/integrations/clawtool/agents.js +30 -0
  63. package/dist/integrations/clawtool/agents.js.map +1 -0
  64. package/dist/integrations/clawtool/agents.test.d.ts +2 -0
  65. package/dist/integrations/clawtool/agents.test.d.ts.map +1 -0
  66. package/dist/integrations/clawtool/agents.test.js +79 -0
  67. package/dist/integrations/clawtool/agents.test.js.map +1 -0
  68. package/dist/integrations/clawtool/auth.d.ts +26 -0
  69. package/dist/integrations/clawtool/auth.d.ts.map +1 -0
  70. package/dist/integrations/clawtool/auth.js +56 -0
  71. package/dist/integrations/clawtool/auth.js.map +1 -0
  72. package/dist/integrations/clawtool/auth.test.d.ts +2 -0
  73. package/dist/integrations/clawtool/auth.test.d.ts.map +1 -0
  74. package/dist/integrations/clawtool/auth.test.js +40 -0
  75. package/dist/integrations/clawtool/auth.test.js.map +1 -0
  76. package/dist/integrations/clawtool/binary.d.ts +25 -0
  77. package/dist/integrations/clawtool/binary.d.ts.map +1 -0
  78. package/dist/integrations/clawtool/binary.js +50 -0
  79. package/dist/integrations/clawtool/binary.js.map +1 -0
  80. package/dist/integrations/clawtool/binary.test.d.ts +2 -0
  81. package/dist/integrations/clawtool/binary.test.d.ts.map +1 -0
  82. package/dist/integrations/clawtool/binary.test.js +42 -0
  83. package/dist/integrations/clawtool/binary.test.js.map +1 -0
  84. package/dist/integrations/clawtool/daemon.d.ts +37 -0
  85. package/dist/integrations/clawtool/daemon.d.ts.map +1 -0
  86. package/dist/integrations/clawtool/daemon.js +109 -0
  87. package/dist/integrations/clawtool/daemon.js.map +1 -0
  88. package/dist/integrations/clawtool/daemon.test.d.ts +11 -0
  89. package/dist/integrations/clawtool/daemon.test.d.ts.map +1 -0
  90. package/dist/integrations/clawtool/daemon.test.js +118 -0
  91. package/dist/integrations/clawtool/daemon.test.js.map +1 -0
  92. package/dist/integrations/clawtool/dispatch.d.ts +33 -0
  93. package/dist/integrations/clawtool/dispatch.d.ts.map +1 -0
  94. package/dist/integrations/clawtool/dispatch.js +155 -0
  95. package/dist/integrations/clawtool/dispatch.js.map +1 -0
  96. package/dist/integrations/clawtool/dispatch.test.d.ts +2 -0
  97. package/dist/integrations/clawtool/dispatch.test.d.ts.map +1 -0
  98. package/dist/integrations/clawtool/dispatch.test.js +138 -0
  99. package/dist/integrations/clawtool/dispatch.test.js.map +1 -0
  100. package/dist/integrations/clawtool/index.d.ts +11 -0
  101. package/dist/integrations/clawtool/index.d.ts.map +1 -0
  102. package/dist/integrations/clawtool/index.js +10 -0
  103. package/dist/integrations/clawtool/index.js.map +1 -0
  104. package/dist/integrations/clawtool/mcp.d.ts +51 -0
  105. package/dist/integrations/clawtool/mcp.d.ts.map +1 -0
  106. package/dist/integrations/clawtool/mcp.js +156 -0
  107. package/dist/integrations/clawtool/mcp.js.map +1 -0
  108. package/dist/integrations/clawtool/mcp.test.d.ts +2 -0
  109. package/dist/integrations/clawtool/mcp.test.d.ts.map +1 -0
  110. package/dist/integrations/clawtool/mcp.test.js +126 -0
  111. package/dist/integrations/clawtool/mcp.test.js.map +1 -0
  112. package/dist/integrations/clawtool/paths.d.ts +8 -0
  113. package/dist/integrations/clawtool/paths.d.ts.map +1 -0
  114. package/dist/integrations/clawtool/paths.js +19 -0
  115. package/dist/integrations/clawtool/paths.js.map +1 -0
  116. package/dist/integrations/clawtool/peers.d.ts +67 -0
  117. package/dist/integrations/clawtool/peers.d.ts.map +1 -0
  118. package/dist/integrations/clawtool/peers.js +150 -0
  119. package/dist/integrations/clawtool/peers.js.map +1 -0
  120. package/dist/integrations/clawtool/plugin.d.ts +42 -0
  121. package/dist/integrations/clawtool/plugin.d.ts.map +1 -0
  122. package/dist/integrations/clawtool/plugin.js +38 -0
  123. package/dist/integrations/clawtool/plugin.js.map +1 -0
  124. package/dist/integrations/clawtool/state.d.ts +11 -0
  125. package/dist/integrations/clawtool/state.d.ts.map +1 -0
  126. package/dist/integrations/clawtool/state.js +41 -0
  127. package/dist/integrations/clawtool/state.js.map +1 -0
  128. package/dist/integrations/clawtool/state.test.d.ts +2 -0
  129. package/dist/integrations/clawtool/state.test.d.ts.map +1 -0
  130. package/dist/integrations/clawtool/state.test.js +38 -0
  131. package/dist/integrations/clawtool/state.test.js.map +1 -0
  132. package/dist/integrations/clawtool/tooling.d.ts +50 -0
  133. package/dist/integrations/clawtool/tooling.d.ts.map +1 -0
  134. package/dist/integrations/clawtool/tooling.js +89 -0
  135. package/dist/integrations/clawtool/tooling.js.map +1 -0
  136. package/dist/integrations/clawtool/tooling.test.d.ts +2 -0
  137. package/dist/integrations/clawtool/tooling.test.d.ts.map +1 -0
  138. package/dist/integrations/clawtool/tooling.test.js +58 -0
  139. package/dist/integrations/clawtool/tooling.test.js.map +1 -0
  140. package/dist/integrations/clawtool/types.d.ts +41 -0
  141. package/dist/integrations/clawtool/types.d.ts.map +1 -0
  142. package/dist/integrations/clawtool/types.js +9 -0
  143. package/dist/integrations/clawtool/types.js.map +1 -0
  144. package/dist/integrations/clipboard/image.d.ts +18 -0
  145. package/dist/integrations/clipboard/image.d.ts.map +1 -0
  146. package/dist/integrations/clipboard/image.js +88 -0
  147. package/dist/integrations/clipboard/image.js.map +1 -0
  148. package/dist/integrations/providers/discover.d.ts +68 -0
  149. package/dist/integrations/providers/discover.d.ts.map +1 -0
  150. package/dist/integrations/providers/discover.js +108 -0
  151. package/dist/integrations/providers/discover.js.map +1 -0
  152. package/dist/integrations/providers/discover.test.d.ts +2 -0
  153. package/dist/integrations/providers/discover.test.d.ts.map +1 -0
  154. package/dist/integrations/providers/discover.test.js +120 -0
  155. package/dist/integrations/providers/discover.test.js.map +1 -0
  156. package/dist/integrations/providers/index.d.ts +10 -0
  157. package/dist/integrations/providers/index.d.ts.map +1 -0
  158. package/dist/integrations/providers/index.js +12 -0
  159. package/dist/integrations/providers/index.js.map +1 -0
  160. package/dist/integrations/providers/keychain.d.ts +44 -0
  161. package/dist/integrations/providers/keychain.d.ts.map +1 -0
  162. package/dist/integrations/providers/keychain.js +154 -0
  163. package/dist/integrations/providers/keychain.js.map +1 -0
  164. package/dist/integrations/providers/keychain.test.d.ts +2 -0
  165. package/dist/integrations/providers/keychain.test.d.ts.map +1 -0
  166. package/dist/integrations/providers/keychain.test.js +21 -0
  167. package/dist/integrations/providers/keychain.test.js.map +1 -0
  168. package/dist/integrations/providers/mask.d.ts +7 -0
  169. package/dist/integrations/providers/mask.d.ts.map +1 -0
  170. package/dist/integrations/providers/mask.js +14 -0
  171. package/dist/integrations/providers/mask.js.map +1 -0
  172. package/dist/integrations/providers/mask.test.d.ts +2 -0
  173. package/dist/integrations/providers/mask.test.d.ts.map +1 -0
  174. package/dist/integrations/providers/mask.test.js +20 -0
  175. package/dist/integrations/providers/mask.test.js.map +1 -0
  176. package/dist/integrations/providers/oauth.d.ts +28 -0
  177. package/dist/integrations/providers/oauth.d.ts.map +1 -0
  178. package/dist/integrations/providers/oauth.js +65 -0
  179. package/dist/integrations/providers/oauth.js.map +1 -0
  180. package/dist/integrations/providers/oauth.test.d.ts +2 -0
  181. package/dist/integrations/providers/oauth.test.d.ts.map +1 -0
  182. package/dist/integrations/providers/oauth.test.js +86 -0
  183. package/dist/integrations/providers/oauth.test.js.map +1 -0
  184. package/dist/integrations/providers/preferences.d.ts +43 -0
  185. package/dist/integrations/providers/preferences.d.ts.map +1 -0
  186. package/dist/integrations/providers/preferences.js +111 -0
  187. package/dist/integrations/providers/preferences.js.map +1 -0
  188. package/dist/integrations/providers/preferences.test.d.ts +2 -0
  189. package/dist/integrations/providers/preferences.test.d.ts.map +1 -0
  190. package/dist/integrations/providers/preferences.test.js +68 -0
  191. package/dist/integrations/providers/preferences.test.js.map +1 -0
  192. package/dist/integrations/providers/registry.d.ts +31 -0
  193. package/dist/integrations/providers/registry.d.ts.map +1 -0
  194. package/dist/integrations/providers/registry.js +79 -0
  195. package/dist/integrations/providers/registry.js.map +1 -0
  196. package/dist/integrations/providers/schema.d.ts +73 -0
  197. package/dist/integrations/providers/schema.d.ts.map +1 -0
  198. package/dist/integrations/providers/schema.js +70 -0
  199. package/dist/integrations/providers/schema.js.map +1 -0
  200. package/dist/integrations/providers/schema.test.d.ts +2 -0
  201. package/dist/integrations/providers/schema.test.d.ts.map +1 -0
  202. package/dist/integrations/providers/schema.test.js +43 -0
  203. package/dist/integrations/providers/schema.test.js.map +1 -0
  204. package/dist/integrations/providers/secrets.d.ts +37 -0
  205. package/dist/integrations/providers/secrets.d.ts.map +1 -0
  206. package/dist/integrations/providers/secrets.js +69 -0
  207. package/dist/integrations/providers/secrets.js.map +1 -0
  208. package/dist/integrations/providers/store.d.ts +32 -0
  209. package/dist/integrations/providers/store.d.ts.map +1 -0
  210. package/dist/integrations/providers/store.js +133 -0
  211. package/dist/integrations/providers/store.js.map +1 -0
  212. package/dist/integrations/providers/store.test.d.ts +2 -0
  213. package/dist/integrations/providers/store.test.d.ts.map +1 -0
  214. package/dist/integrations/providers/store.test.js +127 -0
  215. package/dist/integrations/providers/store.test.js.map +1 -0
  216. package/dist/integrations/sessions/store.d.ts +40 -0
  217. package/dist/integrations/sessions/store.d.ts.map +1 -0
  218. package/dist/integrations/sessions/store.js +90 -0
  219. package/dist/integrations/sessions/store.js.map +1 -0
  220. package/dist/integrations/subagents/runtime.d.ts +37 -0
  221. package/dist/integrations/subagents/runtime.d.ts.map +1 -0
  222. package/dist/integrations/subagents/runtime.js +183 -0
  223. package/dist/integrations/subagents/runtime.js.map +1 -0
  224. package/dist/integrations/trust/store.d.ts +16 -0
  225. package/dist/integrations/trust/store.d.ts.map +1 -0
  226. package/dist/integrations/trust/store.js +59 -0
  227. package/dist/integrations/trust/store.js.map +1 -0
  228. package/dist/integrations/trust/store.test.d.ts +2 -0
  229. package/dist/integrations/trust/store.test.d.ts.map +1 -0
  230. package/dist/integrations/trust/store.test.js +50 -0
  231. package/dist/integrations/trust/store.test.js.map +1 -0
  232. package/dist/integrations/updates.d.ts +27 -0
  233. package/dist/integrations/updates.d.ts.map +1 -0
  234. package/dist/integrations/updates.js +99 -0
  235. package/dist/integrations/updates.js.map +1 -0
  236. package/dist/memory/store.d.ts +29 -0
  237. package/dist/memory/store.d.ts.map +1 -0
  238. package/dist/memory/store.js +74 -0
  239. package/dist/memory/store.js.map +1 -0
  240. package/dist/memory/store.test.d.ts +2 -0
  241. package/dist/memory/store.test.d.ts.map +1 -0
  242. package/dist/memory/store.test.js +63 -0
  243. package/dist/memory/store.test.js.map +1 -0
  244. package/dist/output/formatter.d.ts +30 -0
  245. package/dist/output/formatter.d.ts.map +1 -0
  246. package/dist/output/formatter.js +16 -0
  247. package/dist/output/formatter.js.map +1 -0
  248. package/dist/output/formatter.test.d.ts +2 -0
  249. package/dist/output/formatter.test.d.ts.map +1 -0
  250. package/dist/output/formatter.test.js +88 -0
  251. package/dist/output/formatter.test.js.map +1 -0
  252. package/dist/output/index.d.ts +5 -0
  253. package/dist/output/index.d.ts.map +1 -0
  254. package/dist/output/index.js +22 -0
  255. package/dist/output/index.js.map +1 -0
  256. package/dist/output/json.d.ts +13 -0
  257. package/dist/output/json.d.ts.map +1 -0
  258. package/dist/output/json.js +51 -0
  259. package/dist/output/json.js.map +1 -0
  260. package/dist/output/text.d.ts +13 -0
  261. package/dist/output/text.d.ts.map +1 -0
  262. package/dist/output/text.js +36 -0
  263. package/dist/output/text.js.map +1 -0
  264. package/dist/output/yaml.d.ts +13 -0
  265. package/dist/output/yaml.d.ts.map +1 -0
  266. package/dist/output/yaml.js +26 -0
  267. package/dist/output/yaml.js.map +1 -0
  268. package/dist/skills/store.d.ts +49 -0
  269. package/dist/skills/store.d.ts.map +1 -0
  270. package/dist/skills/store.js +109 -0
  271. package/dist/skills/store.js.map +1 -0
  272. package/dist/skills/store.test.d.ts +2 -0
  273. package/dist/skills/store.test.d.ts.map +1 -0
  274. package/dist/skills/store.test.js +80 -0
  275. package/dist/skills/store.test.js.map +1 -0
  276. package/dist/tui/App.d.ts +18 -0
  277. package/dist/tui/App.d.ts.map +1 -0
  278. package/dist/tui/App.js +742 -0
  279. package/dist/tui/App.js.map +1 -0
  280. package/dist/tui/Composer.d.ts +17 -0
  281. package/dist/tui/Composer.d.ts.map +1 -0
  282. package/dist/tui/Composer.js +123 -0
  283. package/dist/tui/Composer.js.map +1 -0
  284. package/dist/tui/LiveActivity.d.ts +22 -0
  285. package/dist/tui/LiveActivity.d.ts.map +1 -0
  286. package/dist/tui/LiveActivity.js +46 -0
  287. package/dist/tui/LiveActivity.js.map +1 -0
  288. package/dist/tui/Markdown.d.ts +18 -0
  289. package/dist/tui/Markdown.d.ts.map +1 -0
  290. package/dist/tui/Markdown.js +68 -0
  291. package/dist/tui/Markdown.js.map +1 -0
  292. package/dist/tui/PermissionOverlay.d.ts +14 -0
  293. package/dist/tui/PermissionOverlay.d.ts.map +1 -0
  294. package/dist/tui/PermissionOverlay.js +22 -0
  295. package/dist/tui/PermissionOverlay.js.map +1 -0
  296. package/dist/tui/Picker.d.ts +20 -0
  297. package/dist/tui/Picker.d.ts.map +1 -0
  298. package/dist/tui/Picker.js +72 -0
  299. package/dist/tui/Picker.js.map +1 -0
  300. package/dist/tui/ResumePicker.d.ts +12 -0
  301. package/dist/tui/ResumePicker.d.ts.map +1 -0
  302. package/dist/tui/ResumePicker.js +26 -0
  303. package/dist/tui/ResumePicker.js.map +1 -0
  304. package/dist/tui/StatusBar.d.ts +22 -0
  305. package/dist/tui/StatusBar.d.ts.map +1 -0
  306. package/dist/tui/StatusBar.js +73 -0
  307. package/dist/tui/StatusBar.js.map +1 -0
  308. package/dist/tui/Transcript.d.ts +29 -0
  309. package/dist/tui/Transcript.d.ts.map +1 -0
  310. package/dist/tui/Transcript.js +105 -0
  311. package/dist/tui/Transcript.js.map +1 -0
  312. package/dist/tui/TrustPrompt.d.ts +11 -0
  313. package/dist/tui/TrustPrompt.d.ts.map +1 -0
  314. package/dist/tui/TrustPrompt.js +13 -0
  315. package/dist/tui/TrustPrompt.js.map +1 -0
  316. package/dist/tui/agent.d.ts +163 -0
  317. package/dist/tui/agent.d.ts.map +1 -0
  318. package/dist/tui/agent.js +684 -0
  319. package/dist/tui/agent.js.map +1 -0
  320. package/dist/tui/agent.test.d.ts +2 -0
  321. package/dist/tui/agent.test.d.ts.map +1 -0
  322. package/dist/tui/agent.test.js +225 -0
  323. package/dist/tui/agent.test.js.map +1 -0
  324. package/dist/tui/index.d.ts +7 -0
  325. package/dist/tui/index.d.ts.map +1 -0
  326. package/dist/tui/index.js +29 -0
  327. package/dist/tui/index.js.map +1 -0
  328. package/dist/tui/logo.d.ts +23 -0
  329. package/dist/tui/logo.d.ts.map +1 -0
  330. package/dist/tui/logo.js +35 -0
  331. package/dist/tui/logo.js.map +1 -0
  332. package/dist/tui/markdownParser.d.ts +45 -0
  333. package/dist/tui/markdownParser.d.ts.map +1 -0
  334. package/dist/tui/markdownParser.js +127 -0
  335. package/dist/tui/markdownParser.js.map +1 -0
  336. package/dist/tui/markdownParser.test.d.ts +2 -0
  337. package/dist/tui/markdownParser.test.d.ts.map +1 -0
  338. package/dist/tui/markdownParser.test.js +90 -0
  339. package/dist/tui/markdownParser.test.js.map +1 -0
  340. package/dist/tui/mentions.d.ts +22 -0
  341. package/dist/tui/mentions.d.ts.map +1 -0
  342. package/dist/tui/mentions.js +59 -0
  343. package/dist/tui/mentions.js.map +1 -0
  344. package/dist/tui/mentions.test.d.ts +2 -0
  345. package/dist/tui/mentions.test.d.ts.map +1 -0
  346. package/dist/tui/mentions.test.js +35 -0
  347. package/dist/tui/mentions.test.js.map +1 -0
  348. package/dist/tui/slashCommands.d.ts +64 -0
  349. package/dist/tui/slashCommands.d.ts.map +1 -0
  350. package/dist/tui/slashCommands.js +153 -0
  351. package/dist/tui/slashCommands.js.map +1 -0
  352. package/dist/tui/slashCommands.test.d.ts +2 -0
  353. package/dist/tui/slashCommands.test.d.ts.map +1 -0
  354. package/dist/tui/slashCommands.test.js +114 -0
  355. package/dist/tui/slashCommands.test.js.map +1 -0
  356. package/dist/tui/theme.d.ts +34 -0
  357. package/dist/tui/theme.d.ts.map +1 -0
  358. package/dist/tui/theme.js +32 -0
  359. package/dist/tui/theme.js.map +1 -0
  360. package/dist/tui/types.d.ts +27 -0
  361. package/dist/tui/types.d.ts.map +1 -0
  362. package/dist/tui/types.js +7 -0
  363. package/dist/tui/types.js.map +1 -0
  364. package/package.json +13 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../../src/integrations/providers/mask.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiC,EAAE,IAAI,GAAG,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,MAAM,IAAI,EAAE,CAAA;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mask.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/mask.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { maskSecret } from './mask.js';
3
+ describe('maskSecret', () => {
4
+ it('returns null for null / undefined / empty', () => {
5
+ expect(maskSecret(null)).toBeNull();
6
+ expect(maskSecret(undefined)).toBeNull();
7
+ expect(maskSecret('')).toBeNull();
8
+ });
9
+ it('returns *** for secrets shorter than the keep window', () => {
10
+ expect(maskSecret('abc', 4)).toBe('***');
11
+ expect(maskSecret('abcd', 4)).toBe('***');
12
+ });
13
+ it('keeps the last N characters by default', () => {
14
+ expect(maskSecret('sk-ant-deadbeef1234')).toBe('***1234');
15
+ });
16
+ it('honors a custom keep length', () => {
17
+ expect(maskSecret('sk-ant-deadbeef1234', 6)).toBe('***ef1234');
18
+ });
19
+ });
20
+ //# sourceMappingURL=mask.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/mask.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACnC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACxC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Claude Code OAuth token refresh.
3
+ *
4
+ * The access token discovered from the macOS Keychain (or a clawtool secret)
5
+ * is short-lived (~8h). When it lapses, Anthropic answers 401 and the agent
6
+ * stream dies. Claude Code refreshes proactively against its public OAuth
7
+ * token endpoint using the long-lived refresh token; we do the same so a
8
+ * stale token is silently renewed before the session starts instead of
9
+ * surfacing as an authentication error.
10
+ *
11
+ * Non-throwing: any failure (no refresh token, network down, endpoint error)
12
+ * returns the existing token unchanged — at worst the caller hits the same
13
+ * 401 it would have hit anyway, never a crash.
14
+ */
15
+ import { type ClaudeCodeOAuthCredential } from './keychain.js';
16
+ export interface OAuthMetadata {
17
+ readonly refreshToken?: string;
18
+ readonly expiresAt?: number;
19
+ }
20
+ /**
21
+ * Return a non-expired access token, refreshing first if the current one is
22
+ * lapsed/about-to-lapse and a refresh token is available. On a successful
23
+ * refresh the new credential is persisted back to the Keychain (best-effort).
24
+ */
25
+ export declare function ensureFreshAnthropicToken(accessToken: string, oauth: OAuthMetadata): Promise<string>;
26
+ /** Exchange a refresh token for a new credential, or `null` on any failure. */
27
+ export declare function refreshClaudeCodeToken(refreshToken: string): Promise<ClaudeCodeOAuthCredential | null>;
28
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,yBAAyB,EAAqC,MAAM,eAAe,CAAA;AASjG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC9C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC3C,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CA2B3C"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Claude Code OAuth token refresh.
3
+ *
4
+ * The access token discovered from the macOS Keychain (or a clawtool secret)
5
+ * is short-lived (~8h). When it lapses, Anthropic answers 401 and the agent
6
+ * stream dies. Claude Code refreshes proactively against its public OAuth
7
+ * token endpoint using the long-lived refresh token; we do the same so a
8
+ * stale token is silently renewed before the session starts instead of
9
+ * surfacing as an authentication error.
10
+ *
11
+ * Non-throwing: any failure (no refresh token, network down, endpoint error)
12
+ * returns the existing token unchanged — at worst the caller hits the same
13
+ * 401 it would have hit anyway, never a crash.
14
+ */
15
+ import { writeClaudeCodeKeychainCredential } from './keychain.js';
16
+ /** Public Claude Code OAuth client id + token endpoint. */
17
+ const CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
18
+ const TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
19
+ /** Refresh a few seconds early so an about-to-expire token isn't used. */
20
+ const EXPIRY_SKEW_MS = 60_000;
21
+ /**
22
+ * Return a non-expired access token, refreshing first if the current one is
23
+ * lapsed/about-to-lapse and a refresh token is available. On a successful
24
+ * refresh the new credential is persisted back to the Keychain (best-effort).
25
+ */
26
+ export async function ensureFreshAnthropicToken(accessToken, oauth) {
27
+ const fresh = oauth.expiresAt === undefined || oauth.expiresAt - Date.now() > EXPIRY_SKEW_MS;
28
+ if (fresh)
29
+ return accessToken;
30
+ if (!oauth.refreshToken)
31
+ return accessToken;
32
+ const refreshed = await refreshClaudeCodeToken(oauth.refreshToken);
33
+ if (!refreshed)
34
+ return accessToken;
35
+ writeClaudeCodeKeychainCredential(refreshed);
36
+ return refreshed.accessToken;
37
+ }
38
+ /** Exchange a refresh token for a new credential, or `null` on any failure. */
39
+ export async function refreshClaudeCodeToken(refreshToken) {
40
+ try {
41
+ const res = await fetch(TOKEN_URL, {
42
+ method: 'POST',
43
+ headers: { 'content-type': 'application/json' },
44
+ body: JSON.stringify({
45
+ grant_type: 'refresh_token',
46
+ refresh_token: refreshToken,
47
+ client_id: CLIENT_ID,
48
+ }),
49
+ });
50
+ if (!res.ok)
51
+ return null;
52
+ const data = (await res.json());
53
+ if (typeof data.access_token !== 'string' || data.access_token.length === 0)
54
+ return null;
55
+ return {
56
+ accessToken: data.access_token,
57
+ refreshToken: typeof data.refresh_token === 'string' ? data.refresh_token : refreshToken,
58
+ expiresAt: typeof data.expires_in === 'number' ? Date.now() + data.expires_in * 1_000 : undefined,
59
+ };
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAkC,iCAAiC,EAAE,MAAM,eAAe,CAAA;AAEjG,2DAA2D;AAC3D,MAAM,SAAS,GAAG,sCAAsC,CAAA;AACxD,MAAM,SAAS,GAAG,8CAA8C,CAAA;AAEhE,0EAA0E;AAC1E,MAAM,cAAc,GAAG,MAAM,CAAA;AAO7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,WAAmB,EACnB,KAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAA;IAC5F,IAAI,KAAK;QAAE,OAAO,WAAW,CAAA;IAC7B,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,WAAW,CAAA;IAE3C,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAA;IAClC,iCAAiC,CAAC,SAAS,CAAC,CAAA;IAC5C,OAAO,SAAS,CAAC,WAAW,CAAA;AAC7B,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,YAAoB;IAEpB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,SAAS;aACpB,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAA;QACD,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACxF,OAAO;YACN,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;YACxF,SAAS,EACR,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS;SACvF,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=oauth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ // Stub the Keychain write so an expired-token refresh under test never touches
3
+ // the real macOS Keychain (this suite can run on the developer's own machine).
4
+ vi.mock('./keychain.js', async (importOriginal) => {
5
+ const actual = await importOriginal();
6
+ return { ...actual, writeClaudeCodeKeychainCredential: vi.fn(() => false) };
7
+ });
8
+ import { ensureFreshAnthropicToken, refreshClaudeCodeToken } from './oauth.js';
9
+ function mockFetch(impl) {
10
+ vi.stubGlobal('fetch', impl);
11
+ }
12
+ afterEach(() => {
13
+ vi.unstubAllGlobals();
14
+ });
15
+ describe('refreshClaudeCodeToken', () => {
16
+ it('exchanges the refresh token and maps the response', async () => {
17
+ mockFetch((async () => new Response(JSON.stringify({
18
+ access_token: 'cc-new-access',
19
+ refresh_token: 'rt-new',
20
+ expires_in: 3600,
21
+ }), { status: 200 })));
22
+ const before = Date.now();
23
+ const cred = await refreshClaudeCodeToken('rt-old');
24
+ expect(cred?.accessToken).toBe('cc-new-access');
25
+ expect(cred?.refreshToken).toBe('rt-new');
26
+ expect(cred?.expiresAt).toBeGreaterThanOrEqual(before + 3600 * 1000);
27
+ });
28
+ it('keeps the old refresh token when the response omits one', async () => {
29
+ mockFetch((async () => new Response(JSON.stringify({ access_token: 'cc-new' }), { status: 200 })));
30
+ const cred = await refreshClaudeCodeToken('rt-old');
31
+ expect(cred?.accessToken).toBe('cc-new');
32
+ expect(cred?.refreshToken).toBe('rt-old');
33
+ });
34
+ it('returns null on a non-2xx response', async () => {
35
+ mockFetch((async () => new Response('nope', { status: 401 })));
36
+ expect(await refreshClaudeCodeToken('rt')).toBeNull();
37
+ });
38
+ it('returns null when fetch throws', async () => {
39
+ mockFetch((async () => {
40
+ throw new Error('network down');
41
+ }));
42
+ expect(await refreshClaudeCodeToken('rt')).toBeNull();
43
+ });
44
+ it('returns null when the payload lacks an access token', async () => {
45
+ mockFetch((async () => new Response(JSON.stringify({ foo: 'bar' }), { status: 200 })));
46
+ expect(await refreshClaudeCodeToken('rt')).toBeNull();
47
+ });
48
+ });
49
+ describe('ensureFreshAnthropicToken', () => {
50
+ it('returns the current token when it is not near expiry (no refresh attempted)', async () => {
51
+ const spy = vi.fn();
52
+ mockFetch(spy);
53
+ const token = await ensureFreshAnthropicToken('cc-current', {
54
+ refreshToken: 'rt',
55
+ expiresAt: Date.now() + 60 * 60 * 1000,
56
+ });
57
+ expect(token).toBe('cc-current');
58
+ expect(spy).not.toHaveBeenCalled();
59
+ });
60
+ it('returns the current token when there is no refresh token', async () => {
61
+ const spy = vi.fn();
62
+ mockFetch(spy);
63
+ const token = await ensureFreshAnthropicToken('cc-current', { expiresAt: 0 });
64
+ expect(token).toBe('cc-current');
65
+ expect(spy).not.toHaveBeenCalled();
66
+ });
67
+ it('refreshes an expired token', async () => {
68
+ mockFetch((async () => new Response(JSON.stringify({ access_token: 'cc-fresh', expires_in: 3600 }), {
69
+ status: 200,
70
+ })));
71
+ const token = await ensureFreshAnthropicToken('cc-stale', {
72
+ refreshToken: 'rt',
73
+ expiresAt: Date.now() - 1000,
74
+ });
75
+ expect(token).toBe('cc-fresh');
76
+ });
77
+ it('falls back to the stale token when refresh fails', async () => {
78
+ mockFetch((async () => new Response('err', { status: 500 })));
79
+ const token = await ensureFreshAnthropicToken('cc-stale', {
80
+ refreshToken: 'rt',
81
+ expiresAt: Date.now() - 1000,
82
+ });
83
+ expect(token).toBe('cc-stale');
84
+ });
85
+ });
86
+ //# sourceMappingURL=oauth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `~/.namzu/preferences.json` — the user's primary-chat picker selection.
3
+ *
4
+ * Schema (current = v2):
5
+ * {
6
+ * "version": 2,
7
+ * "provider": "anthropic", // ProviderId
8
+ * "model": "claude-opus-4-7", // optional model override
9
+ * "subagents": { "active": [...] } // clawtool peer instances reserved for subagent dispatch
10
+ * }
11
+ *
12
+ * The previous schema (v1) stored a clawtool peer instance as the
13
+ * default — a different primitive (subagent dispatch, not primary
14
+ * chat). On-disk v1 files trigger a forced re-pick rather than an
15
+ * auto-migration: mapping between the two semantics would surprise
16
+ * more than help.
17
+ */
18
+ import type { ProviderId } from './registry.js';
19
+ export declare const PREFERENCES_FILE_VERSION: 2;
20
+ export interface Preferences {
21
+ readonly version: 2;
22
+ readonly provider: ProviderId;
23
+ readonly model?: string;
24
+ readonly subagents?: {
25
+ readonly active: readonly string[];
26
+ };
27
+ }
28
+ export type ReadResult = {
29
+ readonly status: 'ok';
30
+ readonly prefs: Preferences;
31
+ } | {
32
+ readonly status: 'missing';
33
+ } | {
34
+ readonly status: 'needs-repick';
35
+ readonly reason: string;
36
+ };
37
+ export declare class PreferencesError extends Error {
38
+ constructor(message: string);
39
+ }
40
+ export declare function preferencesPath(home?: string): string;
41
+ export declare function readPreferences(home?: string): ReadResult;
42
+ export declare function writePreferences(prefs: Preferences, home?: string): void;
43
+ //# sourceMappingURL=preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI/C,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAA;CAC3D;AAED,MAAM,MAAM,UAAU,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/D,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI3B;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEhE;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAkB,GAAG,UAAU,CAwCpE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,GAAE,MAAkB,GAAG,IAAI,CAgBnF"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * `~/.namzu/preferences.json` — the user's primary-chat picker selection.
3
+ *
4
+ * Schema (current = v2):
5
+ * {
6
+ * "version": 2,
7
+ * "provider": "anthropic", // ProviderId
8
+ * "model": "claude-opus-4-7", // optional model override
9
+ * "subagents": { "active": [...] } // clawtool peer instances reserved for subagent dispatch
10
+ * }
11
+ *
12
+ * The previous schema (v1) stored a clawtool peer instance as the
13
+ * default — a different primitive (subagent dispatch, not primary
14
+ * chat). On-disk v1 files trigger a forced re-pick rather than an
15
+ * auto-migration: mapping between the two semantics would surprise
16
+ * more than help.
17
+ */
18
+ import { randomBytes } from 'node:crypto';
19
+ import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
20
+ import { homedir } from 'node:os';
21
+ import { dirname, join } from 'node:path';
22
+ const FILE_MODE = 0o600;
23
+ const DIR_MODE = 0o700;
24
+ export const PREFERENCES_FILE_VERSION = 2;
25
+ export class PreferencesError extends Error {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = 'PreferencesError';
29
+ }
30
+ }
31
+ export function preferencesPath(home = homedir()) {
32
+ return join(home, '.namzu', 'preferences.json');
33
+ }
34
+ export function readPreferences(home = homedir()) {
35
+ const path = preferencesPath(home);
36
+ let raw;
37
+ try {
38
+ raw = readFileSync(path, 'utf8');
39
+ }
40
+ catch (err) {
41
+ if (err.code === 'ENOENT')
42
+ return { status: 'missing' };
43
+ throw new PreferencesError(`could not read ${path}: ${err instanceof Error ? err.message : String(err)}`);
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(raw);
48
+ }
49
+ catch (err) {
50
+ throw new PreferencesError(`${path} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
51
+ }
52
+ if (typeof parsed !== 'object' || parsed === null) {
53
+ throw new PreferencesError(`${path} top-level must be an object`);
54
+ }
55
+ const v = parsed;
56
+ if (v.version === 1) {
57
+ return {
58
+ status: 'needs-repick',
59
+ reason: 'preferences file uses an older schema (v1) — namzu now picks an LLM provider client directly. Please re-pick.',
60
+ };
61
+ }
62
+ if (v.version !== PREFERENCES_FILE_VERSION) {
63
+ return {
64
+ status: 'needs-repick',
65
+ reason: `preferences file at unsupported version ${String(v.version)} — please re-pick.`,
66
+ };
67
+ }
68
+ if (!isPreferences(parsed)) {
69
+ throw new PreferencesError(`${path} has an unexpected shape`);
70
+ }
71
+ return { status: 'ok', prefs: parsed };
72
+ }
73
+ export function writePreferences(prefs, home = homedir()) {
74
+ if (prefs.version !== PREFERENCES_FILE_VERSION) {
75
+ throw new PreferencesError(`unsupported preferences version: ${String(prefs.version)} (expected ${PREFERENCES_FILE_VERSION})`);
76
+ }
77
+ if (typeof prefs.provider !== 'string' || prefs.provider.length === 0) {
78
+ throw new PreferencesError('preferences.provider is required');
79
+ }
80
+ const path = preferencesPath(home);
81
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
82
+ const body = `${JSON.stringify(prefs, null, 2)}\n`;
83
+ const tmp = `${path}.tmp.${process.pid}.${randomBytes(4).toString('hex')}`;
84
+ writeFileSync(tmp, body, { mode: FILE_MODE });
85
+ chmodSync(tmp, FILE_MODE);
86
+ renameSync(tmp, path);
87
+ }
88
+ function isPreferences(value) {
89
+ if (typeof value !== 'object' || value === null)
90
+ return false;
91
+ const v = value;
92
+ if (v.version !== PREFERENCES_FILE_VERSION)
93
+ return false;
94
+ if (typeof v.provider !== 'string' || v.provider.length === 0)
95
+ return false;
96
+ if (v.model !== undefined && typeof v.model !== 'string')
97
+ return false;
98
+ if (v.subagents !== undefined) {
99
+ if (typeof v.subagents !== 'object' || v.subagents === null)
100
+ return false;
101
+ const sa = v.subagents;
102
+ if (!Array.isArray(sa.active))
103
+ return false;
104
+ for (const item of sa.active) {
105
+ if (typeof item !== 'string')
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=preferences.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { mkdirSync, mkdtempSync, statSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { PreferencesError, preferencesPath, readPreferences, writePreferences, } from './preferences.js';
6
+ function tmpHome() {
7
+ return mkdtempSync(join(tmpdir(), 'namzu-prefs-v2-'));
8
+ }
9
+ describe('readPreferences', () => {
10
+ it('reports missing when the file is absent', () => {
11
+ expect(readPreferences(tmpHome())).toEqual({ status: 'missing' });
12
+ });
13
+ it('detects a v1 file as needs-repick (legacy schema)', () => {
14
+ const home = tmpHome();
15
+ mkdirSync(join(home, '.namzu'));
16
+ writeFileSync(join(home, '.namzu', 'preferences.json'), JSON.stringify({ version: 1, default: 'claude', active: ['claude'] }));
17
+ const r = readPreferences(home);
18
+ expect(r.status).toBe('needs-repick');
19
+ if (r.status === 'needs-repick') {
20
+ expect(r.reason).toMatch(/older schema/);
21
+ }
22
+ });
23
+ it('round-trips a v2 selection', () => {
24
+ const home = tmpHome();
25
+ writePreferences({ version: 2, provider: 'anthropic', model: 'claude-opus-4-7' }, home);
26
+ const r = readPreferences(home);
27
+ expect(r.status).toBe('ok');
28
+ if (r.status === 'ok') {
29
+ expect(r.prefs.provider).toBe('anthropic');
30
+ expect(r.prefs.model).toBe('claude-opus-4-7');
31
+ }
32
+ });
33
+ it('throws on unparseable JSON', () => {
34
+ const home = tmpHome();
35
+ mkdirSync(join(home, '.namzu'));
36
+ writeFileSync(join(home, '.namzu', 'preferences.json'), '{ not json');
37
+ expect(() => readPreferences(home)).toThrow(PreferencesError);
38
+ });
39
+ });
40
+ describe('writePreferences', () => {
41
+ it('enforces mode 0600 on file and 0700 on dir', () => {
42
+ const home = tmpHome();
43
+ writePreferences({ version: 2, provider: 'openai' }, home);
44
+ const fileMode = statSync(preferencesPath(home)).mode & 0o777;
45
+ const dirMode = statSync(join(home, '.namzu')).mode & 0o777;
46
+ expect(fileMode).toBe(0o600);
47
+ expect(dirMode).toBe(0o700);
48
+ });
49
+ it('rejects an empty provider', () => {
50
+ expect(() => writePreferences({ version: 2, provider: '' }, tmpHome())).toThrow(PreferencesError);
51
+ });
52
+ it('preserves subagents.active when present', () => {
53
+ const home = tmpHome();
54
+ writePreferences({
55
+ version: 2,
56
+ provider: 'anthropic',
57
+ subagents: { active: ['claude', 'codex'] },
58
+ }, home);
59
+ const r = readPreferences(home);
60
+ if (r.status === 'ok') {
61
+ expect(r.prefs.subagents?.active).toEqual(['claude', 'codex']);
62
+ }
63
+ else {
64
+ throw new Error('expected ok status');
65
+ }
66
+ });
67
+ });
68
+ //# sourceMappingURL=preferences.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Declarative LLM provider registry — the single source of truth that
3
+ * discovery, picker labeling, and runtime construction all derive from.
4
+ *
5
+ * Pattern lifted from NousResearch hermes-agent's `PROVIDER_REGISTRY`
6
+ * (`hermes_cli/auth.py:183-457`). Adding a provider = adding one entry
7
+ * here; nothing else in this layer needs to change.
8
+ */
9
+ export type ProviderId = 'anthropic' | 'openai' | 'openrouter' | 'ollama' | 'lmstudio' | 'bedrock' | 'http';
10
+ /** SDK type passed to `ProviderRegistry.create({type, ...})`. */
11
+ export type SdkProviderType = ProviderId;
12
+ export interface ProviderRegistryEntry {
13
+ readonly id: ProviderId;
14
+ readonly label: string;
15
+ /** Env vars searched in order for an API key. First non-empty wins. */
16
+ readonly envVars: readonly string[];
17
+ /** Default base URL if the provider has one (else SDK default). */
18
+ readonly defaultBaseUrl?: string;
19
+ /**
20
+ * Probe URL for ambient detection (e.g. local server). When set, the
21
+ * discoverer issues a HEAD/GET and treats 2xx as "available".
22
+ */
23
+ readonly probeUrl?: string;
24
+ /** Default model when the user does not pick one in the picker. */
25
+ readonly defaultModel: string;
26
+ /** Does this provider require an apiKey? `false` for purely local. */
27
+ readonly requiresApiKey: boolean;
28
+ }
29
+ export declare const PROVIDER_REGISTRY: Readonly<Record<ProviderId, ProviderRegistryEntry>>;
30
+ export declare const ALL_PROVIDER_IDS: readonly ProviderId[];
31
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,UAAU,GACnB,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,CAAA;AAET,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,UAAU,CAAA;AAExC,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CAChC;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CA8DjF,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAQvC,CAAA"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Declarative LLM provider registry — the single source of truth that
3
+ * discovery, picker labeling, and runtime construction all derive from.
4
+ *
5
+ * Pattern lifted from NousResearch hermes-agent's `PROVIDER_REGISTRY`
6
+ * (`hermes_cli/auth.py:183-457`). Adding a provider = adding one entry
7
+ * here; nothing else in this layer needs to change.
8
+ */
9
+ export const PROVIDER_REGISTRY = Object.freeze({
10
+ anthropic: {
11
+ id: 'anthropic',
12
+ label: 'Anthropic (Claude)',
13
+ // Order mirrors hermes: explicit anthropic key, then anthropic-token
14
+ // variant, then claude-code's OAuth env (often present when the user
15
+ // has claude-code installed).
16
+ envVars: ['ANTHROPIC_API_KEY', 'ANTHROPIC_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN'],
17
+ defaultModel: 'claude-opus-4-7',
18
+ requiresApiKey: true,
19
+ },
20
+ openai: {
21
+ id: 'openai',
22
+ label: 'OpenAI',
23
+ envVars: ['OPENAI_API_KEY'],
24
+ defaultModel: 'gpt-4o',
25
+ requiresApiKey: true,
26
+ },
27
+ openrouter: {
28
+ id: 'openrouter',
29
+ label: 'OpenRouter',
30
+ envVars: ['OPENROUTER_API_KEY'],
31
+ defaultBaseUrl: 'https://openrouter.ai/api/v1',
32
+ defaultModel: 'anthropic/claude-opus-4-7',
33
+ requiresApiKey: true,
34
+ },
35
+ ollama: {
36
+ id: 'ollama',
37
+ label: 'Ollama (local)',
38
+ envVars: [],
39
+ defaultBaseUrl: 'http://localhost:11434',
40
+ probeUrl: 'http://localhost:11434/api/tags',
41
+ defaultModel: 'llama3.2',
42
+ requiresApiKey: false,
43
+ },
44
+ lmstudio: {
45
+ id: 'lmstudio',
46
+ label: 'LM Studio (local)',
47
+ envVars: [],
48
+ defaultBaseUrl: 'http://localhost:1234/v1',
49
+ probeUrl: 'http://localhost:1234/v1/models',
50
+ defaultModel: 'auto',
51
+ requiresApiKey: false,
52
+ },
53
+ bedrock: {
54
+ id: 'bedrock',
55
+ label: 'AWS Bedrock',
56
+ envVars: ['AWS_ACCESS_KEY_ID'], // SDK reads the rest from the AWS chain
57
+ defaultModel: 'anthropic.claude-opus-4-7-v1:0',
58
+ requiresApiKey: true,
59
+ },
60
+ http: {
61
+ id: 'http',
62
+ label: 'Custom HTTP (OpenAI-compatible)',
63
+ // http is never auto-discovered; reserved for an explicit /provider
64
+ // flow that lets the user enter a base URL + key.
65
+ envVars: [],
66
+ defaultModel: 'gpt-4o',
67
+ requiresApiKey: true,
68
+ },
69
+ });
70
+ export const ALL_PROVIDER_IDS = Object.freeze([
71
+ 'anthropic',
72
+ 'openai',
73
+ 'openrouter',
74
+ 'ollama',
75
+ 'lmstudio',
76
+ 'bedrock',
77
+ 'http',
78
+ ]);
79
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgCH,MAAM,CAAC,MAAM,iBAAiB,GAAwD,MAAM,CAAC,MAAM,CAClG;IACC,SAAS,EAAE;QACV,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,oBAAoB;QAC3B,qEAAqE;QACrE,qEAAqE;QACrE,8BAA8B;QAC9B,OAAO,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,yBAAyB,CAAC;QAC5E,YAAY,EAAE,iBAAiB;QAC/B,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;IACD,UAAU,EAAE;QACX,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,cAAc,EAAE,8BAA8B;QAC9C,YAAY,EAAE,2BAA2B;QACzC,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,wBAAwB;QACxC,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,KAAK;KACrB;IACD,QAAQ,EAAE;QACT,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,0BAA0B;QAC1C,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,MAAM;QACpB,cAAc,EAAE,KAAK;KACrB;IACD,OAAO,EAAE;QACR,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,wCAAwC;QACxE,YAAY,EAAE,gCAAgC;QAC9C,cAAc,EAAE,IAAI;KACpB;IACD,IAAI,EAAE;QACL,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,iCAAiC;QACxC,oEAAoE;QACpE,kDAAkD;QAClD,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;CACD,CACD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA0B,MAAM,CAAC,MAAM,CAAC;IACpE,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;CACG,CAAC,CAAA"}