@knowzai/cli 0.1.0 → 0.3.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 (340) hide show
  1. package/assets/portable/.env.example +3 -0
  2. package/assets/portable/docker-compose.yml +18 -0
  3. package/assets/portable/releases.json +22 -0
  4. package/assets/selfhosted/.env.example +19 -0
  5. package/assets/selfhosted/docker-compose.yml +96 -0
  6. package/assets/selfhosted/releases.json +28 -0
  7. package/dist/.tsbuildinfo +1 -1
  8. package/dist/base-command.d.ts +21 -2
  9. package/dist/base-command.d.ts.map +1 -1
  10. package/dist/base-command.js +47 -4
  11. package/dist/base-command.js.map +1 -1
  12. package/dist/commands/ask.d.ts.map +1 -1
  13. package/dist/commands/ask.js +5 -1
  14. package/dist/commands/ask.js.map +1 -1
  15. package/dist/commands/auth/status.d.ts +1 -1
  16. package/dist/commands/auth/status.d.ts.map +1 -1
  17. package/dist/commands/auth/status.js +4 -0
  18. package/dist/commands/auth/status.js.map +1 -1
  19. package/dist/commands/chat.d.ts +5 -0
  20. package/dist/commands/chat.d.ts.map +1 -1
  21. package/dist/commands/chat.js +32 -13
  22. package/dist/commands/chat.js.map +1 -1
  23. package/dist/commands/config/get.d.ts.map +1 -1
  24. package/dist/commands/config/get.js +3 -1
  25. package/dist/commands/config/get.js.map +1 -1
  26. package/dist/commands/config/list.d.ts.map +1 -1
  27. package/dist/commands/config/list.js +12 -4
  28. package/dist/commands/config/list.js.map +1 -1
  29. package/dist/commands/doctor.js +1 -1
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/down.d.ts +9 -0
  32. package/dist/commands/down.d.ts.map +1 -1
  33. package/dist/commands/down.js +16 -1
  34. package/dist/commands/down.js.map +1 -1
  35. package/dist/commands/export.d.ts +27 -0
  36. package/dist/commands/export.d.ts.map +1 -0
  37. package/dist/commands/export.js +155 -0
  38. package/dist/commands/export.js.map +1 -0
  39. package/dist/commands/import.d.ts +27 -0
  40. package/dist/commands/import.d.ts.map +1 -0
  41. package/dist/commands/import.js +124 -0
  42. package/dist/commands/import.js.map +1 -0
  43. package/dist/commands/index/scan.d.ts.map +1 -1
  44. package/dist/commands/index/scan.js +24 -5
  45. package/dist/commands/index/scan.js.map +1 -1
  46. package/dist/commands/knowledge/amend.d.ts +1 -0
  47. package/dist/commands/knowledge/amend.d.ts.map +1 -1
  48. package/dist/commands/knowledge/amend.js +11 -2
  49. package/dist/commands/knowledge/amend.js.map +1 -1
  50. package/dist/commands/knowledge/attach.d.ts +19 -0
  51. package/dist/commands/knowledge/attach.d.ts.map +1 -0
  52. package/dist/commands/knowledge/attach.js +51 -0
  53. package/dist/commands/knowledge/attach.js.map +1 -0
  54. package/dist/commands/knowledge/create.d.ts +9 -1
  55. package/dist/commands/knowledge/create.d.ts.map +1 -1
  56. package/dist/commands/knowledge/create.js +26 -4
  57. package/dist/commands/knowledge/create.js.map +1 -1
  58. package/dist/commands/knowledge/update.d.ts +1 -0
  59. package/dist/commands/knowledge/update.d.ts.map +1 -1
  60. package/dist/commands/knowledge/update.js +4 -1
  61. package/dist/commands/knowledge/update.js.map +1 -1
  62. package/dist/commands/login.d.ts +19 -3
  63. package/dist/commands/login.d.ts.map +1 -1
  64. package/dist/commands/login.js +113 -64
  65. package/dist/commands/login.js.map +1 -1
  66. package/dist/commands/logout.d.ts +2 -0
  67. package/dist/commands/logout.d.ts.map +1 -1
  68. package/dist/commands/logout.js +35 -1
  69. package/dist/commands/logout.js.map +1 -1
  70. package/dist/commands/mcp/serve.d.ts +16 -0
  71. package/dist/commands/mcp/serve.d.ts.map +1 -0
  72. package/dist/commands/mcp/serve.js +50 -0
  73. package/dist/commands/mcp/serve.js.map +1 -0
  74. package/dist/commands/menu.d.ts.map +1 -1
  75. package/dist/commands/menu.js +39 -3
  76. package/dist/commands/menu.js.map +1 -1
  77. package/dist/commands/peer/accept-fingerprint.d.ts +17 -0
  78. package/dist/commands/peer/accept-fingerprint.d.ts.map +1 -0
  79. package/dist/commands/peer/accept-fingerprint.js +35 -0
  80. package/dist/commands/peer/accept-fingerprint.js.map +1 -0
  81. package/dist/commands/peer/add.d.ts +22 -0
  82. package/dist/commands/peer/add.d.ts.map +1 -0
  83. package/dist/commands/peer/add.js +44 -0
  84. package/dist/commands/peer/add.js.map +1 -0
  85. package/dist/commands/peer/cancel.d.ts +13 -0
  86. package/dist/commands/peer/cancel.d.ts.map +1 -0
  87. package/dist/commands/peer/cancel.js +20 -0
  88. package/dist/commands/peer/cancel.js.map +1 -0
  89. package/dist/commands/peer/link.d.ts +16 -0
  90. package/dist/commands/peer/link.d.ts.map +1 -0
  91. package/dist/commands/peer/link.js +32 -0
  92. package/dist/commands/peer/link.js.map +1 -0
  93. package/dist/commands/peer/links.d.ts +12 -0
  94. package/dist/commands/peer/links.d.ts.map +1 -0
  95. package/dist/commands/peer/links.js +25 -0
  96. package/dist/commands/peer/links.js.map +1 -0
  97. package/dist/commands/peer/list.d.ts +10 -0
  98. package/dist/commands/peer/list.d.ts.map +1 -0
  99. package/dist/commands/peer/list.js +22 -0
  100. package/dist/commands/peer/list.js.map +1 -0
  101. package/dist/commands/peer/pull.d.ts +19 -0
  102. package/dist/commands/peer/pull.d.ts.map +1 -0
  103. package/dist/commands/peer/pull.js +30 -0
  104. package/dist/commands/peer/pull.js.map +1 -0
  105. package/dist/commands/peer/push.d.ts +19 -0
  106. package/dist/commands/peer/push.d.ts.map +1 -0
  107. package/dist/commands/peer/push.js +30 -0
  108. package/dist/commands/peer/push.js.map +1 -0
  109. package/dist/commands/peer/remove.d.ts +12 -0
  110. package/dist/commands/peer/remove.d.ts.map +1 -0
  111. package/dist/commands/peer/remove.js +19 -0
  112. package/dist/commands/peer/remove.js.map +1 -0
  113. package/dist/commands/peer/rotate-key.d.ts +14 -0
  114. package/dist/commands/peer/rotate-key.d.ts.map +1 -0
  115. package/dist/commands/peer/rotate-key.js +26 -0
  116. package/dist/commands/peer/rotate-key.js.map +1 -0
  117. package/dist/commands/peer/run.d.ts +13 -0
  118. package/dist/commands/peer/run.d.ts.map +1 -0
  119. package/dist/commands/peer/run.js +31 -0
  120. package/dist/commands/peer/run.js.map +1 -0
  121. package/dist/commands/peer/runs.d.ts +15 -0
  122. package/dist/commands/peer/runs.d.ts.map +1 -0
  123. package/dist/commands/peer/runs.js +32 -0
  124. package/dist/commands/peer/runs.js.map +1 -0
  125. package/dist/commands/peer/test.d.ts +13 -0
  126. package/dist/commands/peer/test.d.ts.map +1 -0
  127. package/dist/commands/peer/test.js +30 -0
  128. package/dist/commands/peer/test.js.map +1 -0
  129. package/dist/commands/peer/unlink.d.ts +13 -0
  130. package/dist/commands/peer/unlink.d.ts.map +1 -0
  131. package/dist/commands/peer/unlink.js +20 -0
  132. package/dist/commands/peer/unlink.js.map +1 -0
  133. package/dist/commands/pg/status.d.ts.map +1 -1
  134. package/dist/commands/pg/status.js +6 -3
  135. package/dist/commands/pg/status.js.map +1 -1
  136. package/dist/commands/pg/up.d.ts.map +1 -1
  137. package/dist/commands/pg/up.js +9 -4
  138. package/dist/commands/pg/up.js.map +1 -1
  139. package/dist/commands/platform/status.d.ts.map +1 -1
  140. package/dist/commands/platform/status.js +4 -4
  141. package/dist/commands/platform/status.js.map +1 -1
  142. package/dist/commands/profile/purge.d.ts +20 -0
  143. package/dist/commands/profile/purge.d.ts.map +1 -0
  144. package/dist/commands/profile/purge.js +43 -0
  145. package/dist/commands/profile/purge.js.map +1 -0
  146. package/dist/commands/repo/context.d.ts.map +1 -1
  147. package/dist/commands/repo/context.js +3 -1
  148. package/dist/commands/repo/context.js.map +1 -1
  149. package/dist/commands/repo/graph.d.ts +3 -6
  150. package/dist/commands/repo/graph.d.ts.map +1 -1
  151. package/dist/commands/repo/graph.js +24 -40
  152. package/dist/commands/repo/graph.js.map +1 -1
  153. package/dist/commands/repo/index/index.d.ts +1 -0
  154. package/dist/commands/repo/index/index.d.ts.map +1 -1
  155. package/dist/commands/repo/index/index.js +100 -12
  156. package/dist/commands/repo/index/index.js.map +1 -1
  157. package/dist/commands/repo/search.d.ts.map +1 -1
  158. package/dist/commands/repo/search.js +2 -0
  159. package/dist/commands/repo/search.js.map +1 -1
  160. package/dist/commands/repo/setup.d.ts +9 -2
  161. package/dist/commands/repo/setup.d.ts.map +1 -1
  162. package/dist/commands/repo/setup.js +84 -8
  163. package/dist/commands/repo/setup.js.map +1 -1
  164. package/dist/commands/status.d.ts +4 -0
  165. package/dist/commands/status.d.ts.map +1 -1
  166. package/dist/commands/status.js +21 -3
  167. package/dist/commands/status.js.map +1 -1
  168. package/dist/commands/transfer.d.ts +30 -0
  169. package/dist/commands/transfer.d.ts.map +1 -0
  170. package/dist/commands/transfer.js +140 -0
  171. package/dist/commands/transfer.js.map +1 -0
  172. package/dist/commands/tui.js +1 -1
  173. package/dist/commands/tui.js.map +1 -1
  174. package/dist/commands/up.d.ts +6 -27
  175. package/dist/commands/up.d.ts.map +1 -1
  176. package/dist/commands/up.js +63 -21
  177. package/dist/commands/up.js.map +1 -1
  178. package/dist/lib/attach.d.ts +48 -0
  179. package/dist/lib/attach.d.ts.map +1 -0
  180. package/dist/lib/attach.js +91 -0
  181. package/dist/lib/attach.js.map +1 -0
  182. package/dist/lib/chat-render.d.ts +39 -0
  183. package/dist/lib/chat-render.d.ts.map +1 -0
  184. package/dist/lib/chat-render.js +77 -0
  185. package/dist/lib/chat-render.js.map +1 -0
  186. package/dist/lib/cmek-guard.d.ts +52 -0
  187. package/dist/lib/cmek-guard.d.ts.map +1 -0
  188. package/dist/lib/cmek-guard.js +73 -0
  189. package/dist/lib/cmek-guard.js.map +1 -0
  190. package/dist/lib/content.d.ts +7 -0
  191. package/dist/lib/content.d.ts.map +1 -1
  192. package/dist/lib/content.js +9 -2
  193. package/dist/lib/content.js.map +1 -1
  194. package/dist/lib/credential-purge.d.ts +52 -0
  195. package/dist/lib/credential-purge.d.ts.map +1 -0
  196. package/dist/lib/credential-purge.js +37 -0
  197. package/dist/lib/credential-purge.js.map +1 -0
  198. package/dist/lib/ingest.d.ts.map +1 -1
  199. package/dist/lib/ingest.js +7 -3
  200. package/dist/lib/ingest.js.map +1 -1
  201. package/dist/lib/local-mcp-server.d.ts +82 -0
  202. package/dist/lib/local-mcp-server.d.ts.map +1 -0
  203. package/dist/lib/local-mcp-server.js +252 -0
  204. package/dist/lib/local-mcp-server.js.map +1 -0
  205. package/dist/lib/local-mcp-stdio.d.ts +8 -0
  206. package/dist/lib/local-mcp-stdio.d.ts.map +1 -0
  207. package/dist/lib/local-mcp-stdio.js +50 -0
  208. package/dist/lib/local-mcp-stdio.js.map +1 -0
  209. package/dist/lib/login-guided.d.ts +20 -0
  210. package/dist/lib/login-guided.d.ts.map +1 -0
  211. package/dist/lib/login-guided.js +89 -0
  212. package/dist/lib/login-guided.js.map +1 -0
  213. package/dist/lib/login.d.ts +58 -12
  214. package/dist/lib/login.d.ts.map +1 -1
  215. package/dist/lib/login.js +170 -12
  216. package/dist/lib/login.js.map +1 -1
  217. package/dist/lib/onboarding.d.ts +56 -0
  218. package/dist/lib/onboarding.d.ts.map +1 -0
  219. package/dist/lib/onboarding.js +67 -0
  220. package/dist/lib/onboarding.js.map +1 -0
  221. package/dist/lib/peer-command.d.ts +51 -0
  222. package/dist/lib/peer-command.d.ts.map +1 -0
  223. package/dist/lib/peer-command.js +120 -0
  224. package/dist/lib/peer-command.js.map +1 -0
  225. package/dist/lib/peer-support.d.ts +67 -0
  226. package/dist/lib/peer-support.d.ts.map +1 -0
  227. package/dist/lib/peer-support.js +154 -0
  228. package/dist/lib/peer-support.js.map +1 -0
  229. package/dist/lib/platform-edition.d.ts +34 -0
  230. package/dist/lib/platform-edition.d.ts.map +1 -0
  231. package/dist/lib/platform-edition.js +47 -0
  232. package/dist/lib/platform-edition.js.map +1 -0
  233. package/dist/lib/platform-frontdoor-runtime.d.ts.map +1 -1
  234. package/dist/lib/platform-frontdoor-runtime.js +32 -1
  235. package/dist/lib/platform-frontdoor-runtime.js.map +1 -1
  236. package/dist/lib/platform-frontdoor.d.ts +26 -2
  237. package/dist/lib/platform-frontdoor.d.ts.map +1 -1
  238. package/dist/lib/platform-frontdoor.js +363 -126
  239. package/dist/lib/platform-frontdoor.js.map +1 -1
  240. package/dist/lib/platform-lifecycle.d.ts +7 -0
  241. package/dist/lib/platform-lifecycle.d.ts.map +1 -1
  242. package/dist/lib/platform-lifecycle.js +14 -3
  243. package/dist/lib/platform-lifecycle.js.map +1 -1
  244. package/dist/lib/platform-onboarding.d.ts +1 -0
  245. package/dist/lib/platform-onboarding.d.ts.map +1 -1
  246. package/dist/lib/platform-onboarding.js +13 -2
  247. package/dist/lib/platform-onboarding.js.map +1 -1
  248. package/dist/lib/platform-profile-purge.d.ts +1 -1
  249. package/dist/lib/platform-profile-purge.d.ts.map +1 -1
  250. package/dist/lib/platform-profile-purge.js +2 -1
  251. package/dist/lib/platform-profile-purge.js.map +1 -1
  252. package/dist/lib/platform-provider-prompt.d.ts +4 -0
  253. package/dist/lib/platform-provider-prompt.d.ts.map +1 -1
  254. package/dist/lib/platform-provider-prompt.js +4 -0
  255. package/dist/lib/platform-provider-prompt.js.map +1 -1
  256. package/dist/lib/platform-release-manifest.d.ts +15 -1
  257. package/dist/lib/platform-release-manifest.d.ts.map +1 -1
  258. package/dist/lib/platform-release-manifest.js +24 -0
  259. package/dist/lib/platform-release-manifest.js.map +1 -1
  260. package/dist/lib/portability-shared.d.ts +49 -0
  261. package/dist/lib/portability-shared.d.ts.map +1 -0
  262. package/dist/lib/portability-shared.js +220 -0
  263. package/dist/lib/portability-shared.js.map +1 -0
  264. package/dist/lib/project-mcp-config.d.ts +14 -0
  265. package/dist/lib/project-mcp-config.d.ts.map +1 -0
  266. package/dist/lib/project-mcp-config.js +78 -0
  267. package/dist/lib/project-mcp-config.js.map +1 -0
  268. package/dist/lib/release-package-graph.d.ts +154 -0
  269. package/dist/lib/release-package-graph.d.ts.map +1 -0
  270. package/dist/lib/release-package-graph.js +249 -0
  271. package/dist/lib/release-package-graph.js.map +1 -0
  272. package/dist/lib/repo-binding.d.ts +7 -2
  273. package/dist/lib/repo-binding.d.ts.map +1 -1
  274. package/dist/lib/repo-binding.js +131 -18
  275. package/dist/lib/repo-binding.js.map +1 -1
  276. package/dist/lib/repo-command-support.d.ts +3 -1
  277. package/dist/lib/repo-command-support.d.ts.map +1 -1
  278. package/dist/lib/repo-command-support.js.map +1 -1
  279. package/dist/lib/repo-local-mcp-backend.d.ts +65 -0
  280. package/dist/lib/repo-local-mcp-backend.d.ts.map +1 -0
  281. package/dist/lib/repo-local-mcp-backend.js +288 -0
  282. package/dist/lib/repo-local-mcp-backend.js.map +1 -0
  283. package/dist/lib/repo-local-mcp-runtime.d.ts +17 -0
  284. package/dist/lib/repo-local-mcp-runtime.d.ts.map +1 -0
  285. package/dist/lib/repo-local-mcp-runtime.js +136 -0
  286. package/dist/lib/repo-local-mcp-runtime.js.map +1 -0
  287. package/dist/lib/repo-scope-migration.d.ts +4 -0
  288. package/dist/lib/repo-scope-migration.d.ts.map +1 -0
  289. package/dist/lib/repo-scope-migration.js +55 -0
  290. package/dist/lib/repo-scope-migration.js.map +1 -0
  291. package/dist/lib/repo-scope.d.ts +9 -0
  292. package/dist/lib/repo-scope.d.ts.map +1 -0
  293. package/dist/lib/repo-scope.js +15 -0
  294. package/dist/lib/repo-scope.js.map +1 -0
  295. package/dist/lib/safe-file.d.ts +141 -0
  296. package/dist/lib/safe-file.d.ts.map +1 -0
  297. package/dist/lib/safe-file.js +296 -0
  298. package/dist/lib/safe-file.js.map +1 -0
  299. package/dist/lib/selfhosted-lifecycle.d.ts +78 -0
  300. package/dist/lib/selfhosted-lifecycle.d.ts.map +1 -0
  301. package/dist/lib/selfhosted-lifecycle.js +195 -0
  302. package/dist/lib/selfhosted-lifecycle.js.map +1 -0
  303. package/dist/lib/setup-console.d.ts +1 -1
  304. package/dist/lib/setup-console.d.ts.map +1 -1
  305. package/dist/lib/setup-console.js +3 -1
  306. package/dist/lib/setup-console.js.map +1 -1
  307. package/dist/lib/setup-page.d.ts.map +1 -1
  308. package/dist/lib/setup-page.js +28 -10
  309. package/dist/lib/setup-page.js.map +1 -1
  310. package/dist/lib/setup-plan.d.ts +4 -1
  311. package/dist/lib/setup-plan.d.ts.map +1 -1
  312. package/dist/lib/setup-plan.js +10 -2
  313. package/dist/lib/setup-plan.js.map +1 -1
  314. package/dist/lib/setup-server.d.ts.map +1 -1
  315. package/dist/lib/setup-server.js +19 -3
  316. package/dist/lib/setup-server.js.map +1 -1
  317. package/dist/lib/sso-login.d.ts +42 -0
  318. package/dist/lib/sso-login.d.ts.map +1 -0
  319. package/dist/lib/sso-login.js +135 -0
  320. package/dist/lib/sso-login.js.map +1 -0
  321. package/dist/lib/transfer.d.ts +80 -0
  322. package/dist/lib/transfer.d.ts.map +1 -0
  323. package/dist/lib/transfer.js +173 -0
  324. package/dist/lib/transfer.js.map +1 -0
  325. package/dist/lib/tui.d.ts +0 -6
  326. package/dist/lib/tui.d.ts.map +1 -1
  327. package/dist/lib/tui.js +6 -1
  328. package/dist/lib/tui.js.map +1 -1
  329. package/dist/lib/ui.js +1 -1
  330. package/dist/lib/ui.js.map +1 -1
  331. package/dist/lib/up-result.d.ts +46 -0
  332. package/dist/lib/up-result.d.ts.map +1 -0
  333. package/dist/lib/up-result.js +25 -0
  334. package/dist/lib/up-result.js.map +1 -0
  335. package/dist/menu/run.d.ts +7 -0
  336. package/dist/menu/run.d.ts.map +1 -1
  337. package/dist/menu/run.js +38 -2
  338. package/dist/menu/run.js.map +1 -1
  339. package/oclif.manifest.json +3585 -1532
  340. package/package.json +19 -13
@@ -1,16 +1,32 @@
1
1
  import { type CredentialStore, type KnowzConfig, type KeyType } from '@knowzai/core';
2
- import type { RegisterResult, VerifyResult } from '@knowzai/types';
3
- export type LoginMode = 'paste' | 'register' | 'self-hosted';
2
+ import type { CreateApiKeyRequest, CreatedApiKey, LoginTokenResult, RegisterResult, RegisterTenantRequest, VerifyResult } from '@knowzai/types';
3
+ export type LoginMode = 'paste' | 'register' | 'self-hosted' | 'sso';
4
+ /**
5
+ * 13+ attestation the API requires on new-account creation. Mirrors
6
+ * `AgeEligibilityCopy` on the server and `AGE_ELIGIBILITY_COPY_VERSION` in the
7
+ * web client — bump together when the copy changes.
8
+ */
9
+ export declare const AGE_ELIGIBILITY_COPY_VERSION = "age_eligibility.v1";
10
+ export declare const AGE_ELIGIBILITY_SURFACE = "cli_register";
11
+ export declare const AGE_ELIGIBILITY_TEXT = "I confirm I am at least 13 years old. Knowz is not available to people under 13.";
12
+ export declare const AGE_ELIGIBILITY_UNDER_13_MESSAGE = "Knowz is not available to people under 13. No account was created.";
13
+ export interface RegisterInput {
14
+ name: string;
15
+ email: string;
16
+ /**
17
+ * Required whenever the server does not hand back an API key at registration
18
+ * (the current contract): the CLI signs in with it and then creates a key.
19
+ */
20
+ password?: string;
21
+ /** The person explicitly confirmed the 13+ attestation. */
22
+ ageAttested?: boolean;
23
+ }
4
24
  export interface LoginInput {
5
25
  profile: string;
6
26
  apiUrl: string;
7
27
  mode: LoginMode;
8
28
  key?: string;
9
- register?: {
10
- name: string;
11
- email: string;
12
- password?: string;
13
- };
29
+ register?: RegisterInput;
14
30
  storeTenantKey?: boolean;
15
31
  force?: boolean;
16
32
  }
@@ -19,17 +35,47 @@ export interface LoginDeps {
19
35
  config: KnowzConfig;
20
36
  saveConfig: (cfg: KnowzConfig) => void;
21
37
  validateKey: (apiKey: string) => Promise<VerifyResult>;
22
- register: (req: {
23
- name: string;
24
- email: string;
25
- password?: string;
26
- }) => Promise<RegisterResult>;
38
+ register: (req: RegisterTenantRequest) => Promise<RegisterResult>;
39
+ /** Email/password sign-in (`POST /api/v1/users/login`) — yields a bearer token. */
40
+ signIn: (req: {
41
+ usernameOrEmail: string;
42
+ password: string;
43
+ }) => Promise<LoginTokenResult>;
44
+ /** Explicit key creation (`POST /api/v1/api-keys`) authenticated with that token. */
45
+ createApiKey: (req: CreateApiKeyRequest, token: string) => Promise<CreatedApiKey>;
46
+ /**
47
+ * Interactive "replace the credentials this profile already holds?" prompt.
48
+ * Absent means non-interactive (scripts, `--json`, no TTY): a wrong-tenant
49
+ * overwrite is refused outright and a same-tenant key rotation goes through.
50
+ */
51
+ confirmReplace?: (ctx: ReplaceContext) => Promise<boolean>;
52
+ }
53
+ /** Which tenant a profile is bound to, as far as we can name it. */
54
+ export interface TenantRef {
55
+ id?: string;
56
+ name?: string;
57
+ }
58
+ /** What `confirmReplace` is being asked about. Never carries a key. */
59
+ export interface ReplaceContext {
60
+ profile: string;
61
+ /** True when the incoming key belongs to the tenant the profile already holds. */
62
+ sameTenant: boolean;
63
+ current: TenantRef;
64
+ incoming: TenantRef;
27
65
  }
66
+ /** "Alex Space (0f0…)"-style label: name when the server gave us one, else the id. */
67
+ export declare function tenantLabel(ref: TenantRef | undefined): string;
28
68
  export interface LoginResult {
29
69
  profile: string;
30
70
  keyType?: KeyType;
31
71
  tenantId?: string;
72
+ /** Display name of the tenant, when the server reported one. */
73
+ tenantName?: string;
32
74
  email?: string;
75
+ /** True when the key was minted explicitly after registering (the normal path). */
76
+ createdApiKey?: boolean;
77
+ /** True when the profile already held a key for this same tenant (rotation). */
78
+ alreadyRegistered?: boolean;
33
79
  }
34
80
  /**
35
81
  * Verify-on-login, persist-after-verify (S-N3-6). Never returns or logs the key.
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAsD3F"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"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"}
package/dist/lib/login.js CHANGED
@@ -1,4 +1,118 @@
1
- import { KnowzError, ExitCode, enforceTls, validateKeyFormat, keyType, } from '@knowzai/core';
1
+ import { KnowzError, ExitCode, enforceTls, registerSecret, validateKeyFormat, keyType, } from '@knowzai/core';
2
+ import { quoteArg } from './claude-hooks.js';
3
+ /**
4
+ * 13+ attestation the API requires on new-account creation. Mirrors
5
+ * `AgeEligibilityCopy` on the server and `AGE_ELIGIBILITY_COPY_VERSION` in the
6
+ * web client — bump together when the copy changes.
7
+ */
8
+ export const AGE_ELIGIBILITY_COPY_VERSION = 'age_eligibility.v1';
9
+ export const AGE_ELIGIBILITY_SURFACE = 'cli_register';
10
+ export const AGE_ELIGIBILITY_TEXT = 'I confirm I am at least 13 years old. Knowz is not available to people under 13.';
11
+ export const AGE_ELIGIBILITY_UNDER_13_MESSAGE = 'Knowz is not available to people under 13. No account was created.';
12
+ /** "Alex Space (0f0…)"-style label: name when the server gave us one, else the id. */
13
+ export function tenantLabel(ref) {
14
+ const name = ref?.name?.trim();
15
+ const id = ref?.id?.trim();
16
+ if (name && id)
17
+ return `${name} (${id})`;
18
+ return name || id || 'an unknown tenant';
19
+ }
20
+ /** Label the key carries in the workspace's key list, so it is recognizable there. */
21
+ function apiKeyName(profile) {
22
+ return `knowz CLI (${profile})`;
23
+ }
24
+ /**
25
+ * Register, then obtain a real API key. Registration no longer returns one
26
+ * (#661: `PersonalApiKey` is documented as always null), so the CLI signs in
27
+ * with the password and calls `POST /api/v1/api-keys`. A legacy build that
28
+ * still mints keys is honored as-is — no second key is created.
29
+ */
30
+ async function keyForRegistration(input, deps, reg) {
31
+ const wantTenantKey = Boolean(input.storeTenantKey);
32
+ const res = await deps
33
+ .register({
34
+ name: reg.name,
35
+ email: reg.email,
36
+ ...(reg.password === undefined ? {} : { password: reg.password }),
37
+ // Only sent when the person actually attested — never auto-checked.
38
+ ...(reg.ageAttested
39
+ ? {
40
+ ageEligibilityAttested: true,
41
+ ageEligibilityCopyVersion: AGE_ELIGIBILITY_COPY_VERSION,
42
+ ageEligibilitySurface: AGE_ELIGIBILITY_SURFACE,
43
+ }
44
+ : {}),
45
+ })
46
+ .catch((e) => {
47
+ // The server enforces the 13+ gate; point at the flag that satisfies it.
48
+ const text = e instanceof Error ? e.message : String(e);
49
+ if (!reg.ageAttested && /at least 13|age confirmation|AGE_ELIGIBILITY/i.test(text)) {
50
+ throw new KnowzError(`${text} Pass --age-13-plus to confirm.`, ExitCode.Usage);
51
+ }
52
+ throw e;
53
+ });
54
+ const legacy = wantTenantKey ? res.apiKey : res.userApiKey;
55
+ if (legacy && validateKeyFormat(legacy.trim()).ok) {
56
+ return { key: legacy.trim(), created: false, tenantId: res.tenantId, userId: res.userId };
57
+ }
58
+ // No usable key in the response → sign in (or reuse a token the register
59
+ // endpoint issued) and create one explicitly.
60
+ let token = res.token;
61
+ let tenantId = res.tenantId;
62
+ let userId = res.userId;
63
+ if (!token) {
64
+ if (!reg.password) {
65
+ throw new KnowzError('Registration does not return an API key any more; the CLI has to sign in and create one. ' +
66
+ 'Re-run with --password (it is also the password for the web app).', ExitCode.Usage);
67
+ }
68
+ const session = await deps.signIn({ usernameOrEmail: reg.email, password: reg.password });
69
+ token = session.token;
70
+ tenantId = session.tenantId || tenantId;
71
+ userId = session.userId ?? userId;
72
+ }
73
+ registerSecret(token);
74
+ const wanted = wantTenantKey ? 'tenant' : 'user';
75
+ const created = await deps.createApiKey({ name: apiKeyName(input.profile), keyType: wanted }, token);
76
+ const key = created.key?.trim();
77
+ if (!key) {
78
+ throw new KnowzError('Creating an API key after registration failed: the server returned no key.', ExitCode.Auth);
79
+ }
80
+ const fmt = validateKeyFormat(key);
81
+ if (!fmt.ok) {
82
+ throw new KnowzError(`Creating an API key after registration failed: ${fmt.reason}`, ExitCode.Auth);
83
+ }
84
+ return { key, created: true, tenantId, userId };
85
+ }
86
+ /**
87
+ * Best-effort display name for the tenant a profile is already bound to. The
88
+ * stored key is the only thing that knows it, so we re-validate it — but a
89
+ * revoked/offline key must not turn an explanatory message into a failure, so
90
+ * every error degrades to "no name" and the caller falls back to the id.
91
+ */
92
+ async function storedTenantName(storedKey, storedTenantId, deps) {
93
+ try {
94
+ const v = await deps.validateKey(storedKey);
95
+ if (!v.isValid)
96
+ return undefined;
97
+ // Guard against a stale binding: only trust the name if it is this tenant.
98
+ if (storedTenantId && v.tenant?.id && v.tenant.id !== storedTenantId)
99
+ return undefined;
100
+ return v.tenant?.name;
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ function sameApiUrl(left, right) {
107
+ if (!left)
108
+ return false;
109
+ try {
110
+ return new URL(left).href.replace(/\/+$/u, '') === new URL(right).href.replace(/\/+$/u, '');
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
2
116
  /**
3
117
  * Verify-on-login, persist-after-verify (S-N3-6). Never returns or logs the key.
4
118
  * Throws KnowzError(Auth) on rejected credentials, KnowzError(Usage) on bad
@@ -9,14 +123,22 @@ export async function performLogin(input, deps) {
9
123
  let key;
10
124
  let verify;
11
125
  let email;
126
+ let createdApiKey = false;
127
+ if (input.mode === 'sso') {
128
+ throw new KnowzError('SSO login must mint a key before persist', ExitCode.Usage);
129
+ }
12
130
  if (input.mode === 'register') {
13
131
  if (!input.register?.email || !input.register?.name) {
14
132
  throw new KnowzError('register requires --email and --name', ExitCode.Usage);
15
133
  }
16
- const res = await deps.register(input.register);
17
- key = input.storeTenantKey ? res.apiKey : res.userApiKey;
134
+ const reg = await keyForRegistration(input, deps, input.register);
135
+ key = reg.key;
136
+ createdApiKey = reg.created;
18
137
  email = input.register.email;
19
- verify = { isValid: true, tenant: { id: res.tenantId }, user: { id: '', email } };
138
+ // The key was just issued by an authenticated call, so it needs no second
139
+ // round-trip to validate — re-verifying would also fail on a tenant that
140
+ // starts in the Pending activation state.
141
+ verify = { isValid: true, tenant: { id: reg.tenantId ?? '' }, user: { id: reg.userId ?? '', email } };
20
142
  }
21
143
  else {
22
144
  if (!input.key)
@@ -31,26 +153,62 @@ export async function performLogin(input, deps) {
31
153
  }
32
154
  email = verify.user?.email;
33
155
  }
34
- // Wrong-tenant overwrite guard (S-N3-6).
156
+ registerSecret(key);
157
+ // Already-registered guard (S-N3-6, #669). A profile that already holds a key
158
+ // is never silently re-pointed: a different tenant is refused without --force,
159
+ // and even a same-tenant rotation asks first when there is someone to ask.
35
160
  const existing = await deps.store.getSecret(input.profile);
36
- if (existing && !input.force) {
37
- const existingTenant = deps.config.profiles[input.profile]?.tenantId;
38
- const newTenant = verify.tenant?.id;
39
- if (existingTenant && newTenant && existingTenant !== newTenant) {
40
- throw new KnowzError(`Profile '${input.profile}' already holds credentials for a different tenant. Pass --force to overwrite.`, ExitCode.Usage);
161
+ const existingTenantId = deps.config.profiles[input.profile]?.tenantId;
162
+ const incoming = { id: verify.tenant?.id, name: verify.tenant?.name };
163
+ const sameTenant = Boolean(existing && existingTenantId && incoming.id && existingTenantId === incoming.id);
164
+ const differentTenant = Boolean(existing && existingTenantId && incoming.id && existingTenantId !== incoming.id);
165
+ // Without a prompt, a same-tenant rotation needs no decision and no explanation,
166
+ // so it must not pay for the extra round-trip the tenant name costs.
167
+ const needsDecision = !input.force && (sameTenant || differentTenant) && (Boolean(deps.confirmReplace) || differentTenant);
168
+ if (needsDecision) {
169
+ // Only now is a name worth a round-trip: we are about to talk to a human.
170
+ const storedApiUrl = deps.config.profiles[input.profile]?.apiUrl;
171
+ const current = {
172
+ id: existingTenantId,
173
+ name: sameApiUrl(storedApiUrl, input.apiUrl)
174
+ ? await storedTenantName(existing, existingTenantId, deps)
175
+ : undefined,
176
+ };
177
+ const ctx = { profile: input.profile, sameTenant, current, incoming };
178
+ const confirmed = deps.confirmReplace
179
+ ? await deps.confirmReplace(ctx)
180
+ : // No prompt available: rotating the same tenant's key is safe, moving the
181
+ // profile to another tenant is not.
182
+ sameTenant;
183
+ if (!confirmed) {
184
+ const quotedProfile = quoteArg(input.profile);
185
+ throw new KnowzError(differentTenant
186
+ ? `Profile '${input.profile}' is already registered to tenant ${tenantLabel(current)}. ` +
187
+ `The key you provided belongs to tenant ${tenantLabel(incoming)}. ` +
188
+ `Nothing was changed. To replace it, re-run: knowz login --profile ${quotedProfile} --force`
189
+ : `Profile '${input.profile}' is already registered to tenant ${tenantLabel(current)}. ` +
190
+ `The stored key was left unchanged. To replace it, re-run: knowz login --profile ${quotedProfile} --force`, ExitCode.Usage);
41
191
  }
42
192
  }
43
193
  await deps.store.setSecret(input.profile, key);
44
194
  const prev = deps.config.profiles[input.profile];
45
195
  deps.config.profiles[input.profile] = {
46
196
  apiUrl: input.apiUrl,
47
- tenantId: verify.tenant?.id ?? prev?.tenantId,
197
+ tenantId: verify.tenant?.id || prev?.tenantId,
48
198
  email: email ?? prev?.email,
49
199
  label: prev?.label,
50
200
  defaultVaultId: prev?.defaultVaultId,
51
201
  };
52
202
  deps.config.activeProfile = input.profile;
53
203
  deps.saveConfig(deps.config);
54
- return { profile: input.profile, keyType: keyType(key), tenantId: verify.tenant?.id, email };
204
+ return {
205
+ profile: input.profile,
206
+ keyType: keyType(key),
207
+ tenantId: verify.tenant?.id || undefined,
208
+ ...(verify.tenant?.name ? { tenantName: verify.tenant.name } : {}),
209
+ email,
210
+ ...(createdApiKey ? { createdApiKey: true } : {}),
211
+ ...(sameTenant ? { alreadyRegistered: true } : {}),
212
+ };
55
213
  }
56
214
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/lib/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * First-run onboarding + the client-side auth gate.
3
+ *
4
+ * Two problems this module owns:
5
+ *
6
+ * 1. A freshly installed CLI had no idea whether you were signed in. Every
7
+ * cloud command built an *anonymous* api-client, fired the request, and let
8
+ * the server answer 401. That is a slow, confusing "it let me do it and
9
+ * then it didn't" experience — and in an interactive terminal there was
10
+ * nothing telling the user that `knowz login` even exists.
11
+ * 2. Nothing ever offered to sign you in. Login was buried at
12
+ * Settings → Authentication → Log in.
13
+ *
14
+ * The decision logic lives here as pure functions so it is unit-testable
15
+ * without a TTY, a keychain, or a network. `base-command.ts` and `menu.ts` are
16
+ * the only IO shells that consume it.
17
+ */
18
+ /** Everything the gate needs to know about the current invocation. */
19
+ export interface AuthGateContext {
20
+ /** A credential is present for the resolved profile. */
21
+ authenticated: boolean;
22
+ /** Both stdin and stdout are TTYs — we may prompt. */
23
+ interactive: boolean;
24
+ /** `--json` was passed: output must stay a single machine-readable document. */
25
+ jsonMode: boolean;
26
+ }
27
+ /**
28
+ * What a command needing the cloud API should do.
29
+ * - `proceed` — a credential exists, carry on.
30
+ * - `prompt` — interactive human terminal: offer guided login inline, then retry.
31
+ * - `fail` — script/CI/`--json`: never block on stdin, fail fast with exit 3.
32
+ */
33
+ export type AuthGateDecision = 'proceed' | 'prompt' | 'fail';
34
+ export declare function decideAuthGate(ctx: AuthGateContext): AuthGateDecision;
35
+ /** True when both standard streams are a terminal, i.e. a human is watching. */
36
+ export declare function isInteractiveTty(streams?: {
37
+ stdin?: unknown;
38
+ stdout?: unknown;
39
+ }): boolean;
40
+ /**
41
+ * The message shown when we cannot (or must not) prompt. It names the profile
42
+ * and backend deliberately: the single most common support question is "why is
43
+ * my data missing", and the answer is almost always that the CLI is pointed at
44
+ * a different estate than the user assumed.
45
+ */
46
+ export declare function notAuthenticatedMessage(profile: string, apiUrl: string): string;
47
+ /** The inline offer shown in an interactive terminal before the guided login. */
48
+ export declare function loginInvitation(profile: string, apiUrl: string): string;
49
+ /**
50
+ * Whether the interactive shell should open onboarding instead of the normal
51
+ * menu. Kept separate from `decideAuthGate` because the menu tolerates an
52
+ * anonymous session (you must be able to reach "Log in" without being logged
53
+ * in) — it just shouldn't *start* there silently on a fresh install.
54
+ */
55
+ export declare function shouldOnboard(ctx: AuthGateContext): boolean;
56
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAIrE;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAY,GAAG,OAAO,CAGlG;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/E;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * First-run onboarding + the client-side auth gate.
3
+ *
4
+ * Two problems this module owns:
5
+ *
6
+ * 1. A freshly installed CLI had no idea whether you were signed in. Every
7
+ * cloud command built an *anonymous* api-client, fired the request, and let
8
+ * the server answer 401. That is a slow, confusing "it let me do it and
9
+ * then it didn't" experience — and in an interactive terminal there was
10
+ * nothing telling the user that `knowz login` even exists.
11
+ * 2. Nothing ever offered to sign you in. Login was buried at
12
+ * Settings → Authentication → Log in.
13
+ *
14
+ * The decision logic lives here as pure functions so it is unit-testable
15
+ * without a TTY, a keychain, or a network. `base-command.ts` and `menu.ts` are
16
+ * the only IO shells that consume it.
17
+ */
18
+ export function decideAuthGate(ctx) {
19
+ if (ctx.authenticated)
20
+ return 'proceed';
21
+ if (ctx.jsonMode || !ctx.interactive)
22
+ return 'fail';
23
+ return 'prompt';
24
+ }
25
+ /** True when both standard streams are a terminal, i.e. a human is watching. */
26
+ export function isInteractiveTty(streams = process) {
27
+ const s = streams;
28
+ return Boolean(s.stdin?.isTTY) && Boolean(s.stdout?.isTTY);
29
+ }
30
+ /**
31
+ * The message shown when we cannot (or must not) prompt. It names the profile
32
+ * and backend deliberately: the single most common support question is "why is
33
+ * my data missing", and the answer is almost always that the CLI is pointed at
34
+ * a different estate than the user assumed.
35
+ */
36
+ export function notAuthenticatedMessage(profile, apiUrl) {
37
+ let host = apiUrl;
38
+ try {
39
+ host = new URL(apiUrl).host;
40
+ }
41
+ catch {
42
+ /* keep the raw string when it isn't a URL */
43
+ }
44
+ return (`Not signed in — profile '${profile}' (${host}) has no stored API key. ` +
45
+ `Run \`knowz login\` to sign in, register, or connect a self-hosted instance.`);
46
+ }
47
+ /** The inline offer shown in an interactive terminal before the guided login. */
48
+ export function loginInvitation(profile, apiUrl) {
49
+ let host = apiUrl;
50
+ try {
51
+ host = new URL(apiUrl).host;
52
+ }
53
+ catch {
54
+ /* keep the raw string when it isn't a URL */
55
+ }
56
+ return `You're not signed in yet (profile '${profile}' → ${host}). Let's fix that.`;
57
+ }
58
+ /**
59
+ * Whether the interactive shell should open onboarding instead of the normal
60
+ * menu. Kept separate from `decideAuthGate` because the menu tolerates an
61
+ * anonymous session (you must be able to reach "Log in" without being logged
62
+ * in) — it just shouldn't *start* there silently on a fresh install.
63
+ */
64
+ export function shouldOnboard(ctx) {
65
+ return !ctx.authenticated && ctx.interactive && !ctx.jsonMode;
66
+ }
67
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoBH,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,UAAiD,OAAO;IACvF,MAAM,CAAC,GAAG,OAAwE,CAAC;IACnF,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,CACL,4BAA4B,OAAO,MAAM,IAAI,2BAA2B;QACxE,8EAA8E,CAC/E,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc;IAC7D,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,sCAAsC,OAAO,OAAO,IAAI,oBAAoB,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAoB;IAChD,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChE,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { type KnowzApiClient, type FederationPeer, type FederationSyncOptionsInput } from '@knowzai/api-client';
2
+ import { BaseCommand, type GlobalFlags } from '../base-command.js';
3
+ export interface PeerGlobalFlags extends GlobalFlags {
4
+ email?: string;
5
+ }
6
+ /**
7
+ * Shared shell for every `knowz peer` command (CLI_InstanceTransfer R8):
8
+ * builds a per-invocation Bearer-token client via `users/login` — the
9
+ * federation plane is JWT-only, the stored API key cannot reach it — and
10
+ * decorates federation refusals with actionable hints (R10). The credential
11
+ * store keeps holding ONLY the API key; the password/token never persist.
12
+ */
13
+ export declare abstract class PeerCommand extends BaseCommand {
14
+ static readonly peerAuthFlags: {
15
+ email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ };
17
+ protected peerInteractive(): boolean;
18
+ /** Bearer-token client for the active profile (R8). */
19
+ protected peerApiClient(flags: PeerGlobalFlags): Promise<KnowzApiClient>;
20
+ /** Attach the R10 follow-up hint to federation refusals, then rethrow. */
21
+ protected withFederationHints<T>(fn: () => Promise<T>): Promise<T>;
22
+ /** Resolve `<peerRef>` (GUID or slug) to the peer row. */
23
+ protected resolvePeer(client: KnowzApiClient, ref: string): Promise<FederationPeer>;
24
+ /** Source + preflight the peer credential (R9). */
25
+ protected resolveKeyInput(keyFlag: string | undefined): Promise<string>;
26
+ /** Compact human rendering for a peer row. */
27
+ protected describePeer(peer: FederationPeer): string;
28
+ /**
29
+ * Shared `peer pull` / `peer push` body (R12): 202 + runId; `--wait` polls
30
+ * every 2 s to a terminal status; exit 0 ONLY on Succeeded/NoOp — the server
31
+ * status is trusted, never re-interpreted.
32
+ */
33
+ protected enqueueSyncRun(direction: 'pull' | 'push', input: {
34
+ client: KnowzApiClient;
35
+ peerRef: string;
36
+ vaultLinkId: string;
37
+ options: FederationSyncOptionsInput;
38
+ wait: boolean;
39
+ timeoutSeconds: number;
40
+ }): Promise<unknown>;
41
+ }
42
+ /** Flag set shared by `peer pull` and `peer push`. */
43
+ export declare const syncRunFlags: {
44
+ link: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
45
+ since: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
46
+ 'skip-re-enrichment': import("@oclif/core/interfaces").BooleanFlag<boolean>;
47
+ 'max-file-mb': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
48
+ wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
49
+ timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
50
+ };
51
+ //# sourceMappingURL=peer-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-command.d.ts","sourceRoot":"","sources":["../../src/lib/peer-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAanE,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,8BAAsB,WAAY,SAAQ,WAAW;IACnD,MAAM,CAAC,QAAQ,CAAC,aAAa;;MAI3B;IAEF,SAAS,CAAC,eAAe,IAAI,OAAO;IAIpC,uDAAuD;cACvC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAuB9E,0EAA0E;cAC1D,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAUxE,0DAA0D;IAC1D,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAInF,mDAAmD;IACnD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvE,8CAA8C;IAC9C,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAMpD;;;;OAIG;cACa,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,KAAK,EAAE;QACL,MAAM,EAAE,cAAc,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,0BAA0B,CAAC;QACpC,IAAI,EAAE,OAAO,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;KACxB,GACA,OAAO,CAAC,OAAO,CAAC;CA4BpB;AAED,sDAAsD;AACtD,eAAO,MAAM,YAAY;;;;;;;CAOxB,CAAC"}