@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAkCjD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,OAAgB,WAAW,SACgE;IAC3F,OAAgB,QAAQ,WAOtB;IACF,OAAgB,KAAK;;;;;;;;MAiBnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;YAcf,SAAS;IA8DvB,mGAAmG;YACrF,WAAW;IAiDzB,uFAAuF;IACvF,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,155 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { KnowzError, ExitCode } from '@knowzai/core';
3
+ import { ApiError } from '@knowzai/api-client';
4
+ import { BaseCommand } from '../base-command.js';
5
+ import { resolveVaultRef } from '../lib/vault.js';
6
+ import { pollUntilTerminal } from '../lib/poll.js';
7
+ import { inferExportScope, resolveExportOutPath, partOutPath, shouldSkipExistingPart, isJobComplete, isJobFailed, makeDownloadProgress, assertPortabilityKeyKind, mapPortabilityAuthError, } from '../lib/portability-shared.js';
8
+ /**
9
+ * CLI_PortabilityTransfer — `knowz export`: sync export streamed to disk, with
10
+ * automatic fall-forward to the async job path on 413 (R5), `--async` to force
11
+ * job mode, and `--job <id>` to resume an existing job with part-level resume.
12
+ */
13
+ export default class Export extends BaseCommand {
14
+ static description = 'Export knowledge data to a portable package (Full ZIP with file bytes, or Light JSON).';
15
+ static examples = [
16
+ '<%= config.bin %> export',
17
+ '<%= config.bin %> export --mode light --out backup.json',
18
+ '<%= config.bin %> export --vault "Family Memories" --out exports/',
19
+ '<%= config.bin %> export --items 3f2a9c1e 7be10d44',
20
+ '<%= config.bin %> export --async',
21
+ '<%= config.bin %> export --job 7f3d2c1b --out backup.zip',
22
+ ];
23
+ static flags = {
24
+ out: Flags.string({ description: 'Output file or existing directory' }),
25
+ mode: Flags.string({
26
+ options: ['full', 'light'],
27
+ default: 'full',
28
+ description: 'full = ZIP incl. file bytes (default — a silent metadata-only export would be dishonest); light = JSON metadata only',
29
+ }),
30
+ items: Flags.string({ multiple: true, description: 'Knowledge item id(s) to export' }),
31
+ scope: Flags.string({
32
+ options: ['tenant', 'vault', 'vault-with-children', 'items'],
33
+ description: 'Explicit export scope (inferred from --vault/--items when omitted)',
34
+ }),
35
+ async: Flags.boolean({ description: 'Force the async multi-part export job path' }),
36
+ job: Flags.string({ description: 'Resume an existing export job by id (part-level resume)' }),
37
+ 'acknowledge-share-caution': Flags.string({
38
+ description: 'Share-caution acknowledgement copy version (passed through verbatim)',
39
+ }),
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(Export);
43
+ const client = await this.apiClient(flags);
44
+ // Smoke MED — portability resolves a USER identity; a tenant kz_ key would
45
+ // 401 despite the profile being logged in. Reject locally with the fix named.
46
+ const auth = await this.authState(flags);
47
+ assertPortabilityKeyKind(await auth.store.getSecret(auth.profile), auth.profile);
48
+ try {
49
+ return await this.runExport(client, flags);
50
+ }
51
+ catch (e) {
52
+ throw mapPortabilityAuthError(e) ?? e; // opaque credential → map the 401 to the same guidance
53
+ }
54
+ }
55
+ async runExport(client, flags) {
56
+ const mode = flags.mode === 'light' ? 'Light' : 'Full';
57
+ const schema = await client.portability.getSchema();
58
+ if (schema.dialect === 'selfhosted') {
59
+ const rejected = [
60
+ flags.vault && '--vault',
61
+ flags.items?.length && '--items',
62
+ flags.scope && '--scope',
63
+ flags.async && '--async',
64
+ flags.job && '--job',
65
+ // L2 — the selfhosted GET export has no body, so the acknowledgement could
66
+ // only be silently dropped; refuse instead.
67
+ flags['acknowledge-share-caution'] && '--acknowledge-share-caution',
68
+ ].filter(Boolean);
69
+ if (rejected.length) {
70
+ throw new KnowzError(`The selfhosted portability dialect exports the whole tenant only — ${rejected.join(', ')} ` +
71
+ 'are not supported there.', ExitCode.Usage);
72
+ }
73
+ }
74
+ const vaultId = flags.vault ? await resolveVaultRef(client, flags.vault) : undefined;
75
+ const scope = inferExportScope({ scope: flags.scope, vaultId, itemIds: flags.items });
76
+ const outPath = resolveExportOutPath(flags.out, mode);
77
+ const onProgress = makeDownloadProgress(this.jsonEnabled());
78
+ const ack = flags['acknowledge-share-caution'];
79
+ if (flags.job)
80
+ return this.downloadJob(client, flags.job, outPath, onProgress);
81
+ if (flags.async) {
82
+ const job = await client.portability.createExportJob({ ...scope, mode, acknowledgementCopyVersion: ack });
83
+ this.note(`Export job ${job.jobId} queued (${job.estimatedItems} item(s) estimated).`);
84
+ return this.downloadJob(client, job.jobId, outPath, onProgress);
85
+ }
86
+ try {
87
+ const result = await client.portability.exportToFile({
88
+ ...scope,
89
+ mode,
90
+ outPath,
91
+ acknowledgementCopyVersion: ack,
92
+ onProgress,
93
+ });
94
+ this.endProgress();
95
+ if (!this.jsonEnabled())
96
+ this.log(`Exported to ${result.path} (${result.bytes} bytes, ${result.kind}).`);
97
+ return { mode, ...result };
98
+ }
99
+ catch (e) {
100
+ this.endProgress();
101
+ // R5 — 413 means "too big for a single download": fall forward to the job path and say so.
102
+ if (e instanceof ApiError && e.status === 413) {
103
+ this.note('Export exceeds the single-download limit — falling forward to a multi-part export job.');
104
+ const job = await client.portability.createExportJob({ ...scope, mode, acknowledgementCopyVersion: ack });
105
+ this.note(`Export job ${job.jobId} queued (${job.estimatedItems} item(s) estimated).`);
106
+ return this.downloadJob(client, job.jobId, outPath, onProgress);
107
+ }
108
+ throw e; // 409 lock / 403 / share-caution rejection surface the server's message verbatim (R11)
109
+ }
110
+ }
111
+ /** Poll the job to terminal, then download every part sequentially with part-level resume (R5). */
112
+ async downloadJob(client, jobId, outPath, onProgress) {
113
+ const status = await pollUntilTerminal(() => client.portability.getExportJob(jobId), (s) => isJobComplete(s.status) || isJobFailed(s.status), { max: 900, intervalMs: 2000, label: `export job ${jobId}` });
114
+ if (isJobFailed(status.status)) {
115
+ throw new KnowzError(`Export job ${jobId} ${status.status}${status.errorMessage ? `: ${status.errorMessage}` : '.'}`, ExitCode.Api);
116
+ }
117
+ const parts = [...(status.parts ?? [])].sort((a, b) => a.partNumber - b.partNumber);
118
+ if (!parts.length) {
119
+ throw new KnowzError(`Export job ${jobId} completed but reported no downloadable parts.`, ExitCode.Api);
120
+ }
121
+ const results = [];
122
+ for (const part of parts) {
123
+ const path = partOutPath(outPath, part.partNumber);
124
+ if (shouldSkipExistingPart(path, part.sizeBytes)) {
125
+ this.note(`Part ${part.partNumber}: ${path} already complete (${part.sizeBytes} bytes) — skipped (resume).`);
126
+ results.push({ partNumber: part.partNumber, path, bytes: part.sizeBytes, skipped: true });
127
+ continue;
128
+ }
129
+ const dl = await client.portability.downloadExportPart({
130
+ jobId,
131
+ partNumber: part.partNumber,
132
+ outPath: path,
133
+ onProgress,
134
+ });
135
+ this.endProgress();
136
+ this.note(`Part ${part.partNumber}: ${path} (${dl.bytes} bytes).`);
137
+ results.push({ partNumber: part.partNumber, path, bytes: dl.bytes, skipped: false });
138
+ }
139
+ if (!this.jsonEnabled()) {
140
+ this.log(`Export job ${jobId} downloaded: ${results.length} part(s).`);
141
+ for (const r of results)
142
+ this.log(` ${r.path}${r.skipped ? ' (resumed/skipped)' : ''}`);
143
+ }
144
+ return { jobId, totalItems: status.totalItems, parts: results };
145
+ }
146
+ /** Progress + notices go to stderr so `--json` stdout stays a single document (R4). */
147
+ note(message) {
148
+ process.stderr.write(`${message}\n`);
149
+ }
150
+ endProgress() {
151
+ if (!this.jsonEnabled() && process.stderr.isTTY)
152
+ process.stderr.write('\r');
153
+ }
154
+ }
155
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { BaseCommand } from '../base-command.js';
2
+ /**
3
+ * CLI_PortabilityTransfer — `knowz import`: validate-first, honest about
4
+ * conflicts (R8), honest about results (R9). Payload kind is detected by magic
5
+ * bytes, never by extension. Default strategy is `skip` — the only choice that
6
+ * cannot destroy or mutate existing destination data.
7
+ */
8
+ export default class Import extends BaseCommand {
9
+ static description: string;
10
+ static examples: string[];
11
+ static args: {
12
+ file: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
13
+ };
14
+ static flags: {
15
+ strategy: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ 'target-vault': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ 'validate-only': import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
19
+ };
20
+ run(): Promise<unknown>;
21
+ private runImport;
22
+ private importJson;
23
+ private importZip;
24
+ /** VERIFY-7 — non-TTY/--json with conflicts and no --yes exits non-zero WITHOUT importing. */
25
+ private gate;
26
+ }
27
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAcjD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,OAAgB,WAAW,SAAwE;IACnG,OAAgB,QAAQ,WAKtB;IACF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;MASnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;YAgBf,SAAS;YAkCT,UAAU;YAsCV,SAAS;IAiBvB,8FAA8F;YAChF,IAAI;CAkBnB"}
@@ -0,0 +1,124 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { KnowzError, ExitCode } from '@knowzai/core';
4
+ import { BaseCommand } from '../base-command.js';
5
+ import { resolveVaultRef } from '../lib/vault.js';
6
+ import { isInteractiveTty } from '../lib/onboarding.js';
7
+ import { detectPackageKind, decideImportGate, totalConflicts, renderValidationPreview, renderImportOutcome, shouldWarnLargeJson, assertPortabilityKeyKind, mapPortabilityAuthError, } from '../lib/portability-shared.js';
8
+ /**
9
+ * CLI_PortabilityTransfer — `knowz import`: validate-first, honest about
10
+ * conflicts (R8), honest about results (R9). Payload kind is detected by magic
11
+ * bytes, never by extension. Default strategy is `skip` — the only choice that
12
+ * cannot destroy or mutate existing destination data.
13
+ */
14
+ export default class Import extends BaseCommand {
15
+ static description = 'Import a portable export package (JSON or ZIP) into this instance.';
16
+ static examples = [
17
+ '<%= config.bin %> import knowz-export-20260831-120000.zip',
18
+ '<%= config.bin %> import backup.json --strategy merge',
19
+ '<%= config.bin %> import backup.json --target-vault "Restored" --yes',
20
+ '<%= config.bin %> import backup.json --validate-only',
21
+ ];
22
+ static args = {
23
+ file: Args.string({ required: true, description: 'Package file (JSON or ZIP; detected by content)' }),
24
+ };
25
+ static flags = {
26
+ strategy: Flags.string({
27
+ options: ['skip', 'overwrite', 'merge'],
28
+ default: 'skip',
29
+ description: 'Conflict strategy (skip = keep existing, overwrite = replace, merge = fill missing fields)',
30
+ }),
31
+ 'target-vault': Flags.string({ description: 'Import everything into this vault (id or name)' }),
32
+ 'validate-only': Flags.boolean({ description: 'Stop after the server-side dry-run preview' }),
33
+ yes: Flags.boolean({ description: 'Skip the conflict confirmation' }),
34
+ };
35
+ async run() {
36
+ const { args, flags } = await this.parse(Import);
37
+ const strategy = flags.strategy;
38
+ const kind = detectPackageKind(args.file);
39
+ const client = await this.apiClient(flags);
40
+ // Smoke MED — portability resolves a USER identity; reject a tenant kz_ key
41
+ // locally (actionable copy) instead of letting the server 401 "while logged in".
42
+ const auth = await this.authState(flags);
43
+ assertPortabilityKeyKind(await auth.store.getSecret(auth.profile), auth.profile);
44
+ try {
45
+ return await this.runImport(client, args.file, kind, strategy, flags);
46
+ }
47
+ catch (e) {
48
+ throw mapPortabilityAuthError(e) ?? e; // opaque credential → map the 401 to the same guidance
49
+ }
50
+ }
51
+ async runImport(client, file, kind, strategy, flags) {
52
+ const schema = await client.portability.getSchema();
53
+ let targetVaultId;
54
+ if (flags['target-vault']) {
55
+ if (schema.dialect === 'selfhosted') {
56
+ throw new KnowzError('The selfhosted portability dialect has no --target-vault — imports land in their original vaults.', ExitCode.Usage);
57
+ }
58
+ targetVaultId = await resolveVaultRef(client, flags['target-vault']);
59
+ }
60
+ const interactive = isInteractiveTty() && !this.jsonEnabled();
61
+ const outcome = kind === 'json'
62
+ ? await this.importJson(client, file, { strategy, targetVaultId, interactive, yes: flags.yes, validateOnly: flags['validate-only'] })
63
+ : await this.importZip(client, file, { strategy, targetVaultId, interactive, yes: flags.yes, validateOnly: flags['validate-only'] });
64
+ if (outcome && typeof outcome === 'object' && 'success' in outcome) {
65
+ for (const line of renderImportOutcome(outcome))
66
+ this.log(line);
67
+ if (!outcome.success)
68
+ process.exitCode = ExitCode.Api; // R9 — never a cheerful partial
69
+ }
70
+ return outcome;
71
+ }
72
+ async importJson(client, file, opts) {
73
+ // R10 — central /import runs under Kestrel's ~28 MB default body cap.
74
+ if (shouldWarnLargeJson(statSync(file).size)) {
75
+ process.stderr.write('Warning: this JSON package exceeds 25 MB — the server may reject it. ' +
76
+ 'Prefer a Full (ZIP) export/import, which allows up to 500 MB.\n');
77
+ }
78
+ let pkg;
79
+ try {
80
+ pkg = JSON.parse(readFileSync(file, 'utf8'));
81
+ }
82
+ catch (e) {
83
+ throw new KnowzError(`${file} is not valid JSON: ${e instanceof Error ? e.message : String(e)}`, ExitCode.Usage);
84
+ }
85
+ // R8 — validate first, always.
86
+ const validation = await client.portability.validateImport(pkg);
87
+ for (const line of renderValidationPreview(validation))
88
+ this.log(line);
89
+ if (opts.validateOnly) {
90
+ if (!validation.isValid)
91
+ process.exitCode = ExitCode.Api;
92
+ return validation;
93
+ }
94
+ const conflicts = totalConflicts(validation);
95
+ const confirmationRequired = conflicts > 0 || !validation.isValid;
96
+ await this.gate(confirmationRequired, opts, () => conflicts > 0
97
+ ? `${conflicts} conflict(s) will be resolved with strategy '${opts.strategy}'. Continue?`
98
+ : `Validation FAILED — the server will likely refuse this import. Attempt it anyway?`);
99
+ return client.portability.importPackage(pkg, { strategy: opts.strategy, targetVaultId: opts.targetVaultId });
100
+ }
101
+ async importZip(client, file, opts) {
102
+ if (opts.validateOnly) {
103
+ throw new KnowzError('Dry-run is unavailable for ZIP packages (the server has no /import/zip validate twin).', ExitCode.Usage);
104
+ }
105
+ // R8 — no server-side dry-run exists for ZIP; be honest and require consent.
106
+ this.log(`Dry-run unavailable for ZIP packages; conflicts will be resolved with strategy '${opts.strategy}'.`);
107
+ await this.gate(true, opts, () => `Import ${file} with strategy '${opts.strategy}'?`);
108
+ return client.portability.importZip({ path: file, strategy: opts.strategy, targetVaultId: opts.targetVaultId });
109
+ }
110
+ /** VERIFY-7 — non-TTY/--json with conflicts and no --yes exits non-zero WITHOUT importing. */
111
+ async gate(confirmationRequired, opts, message) {
112
+ const decision = decideImportGate({ confirmationRequired, interactive: opts.interactive, yes: opts.yes });
113
+ if (decision === 'proceed')
114
+ return;
115
+ if (decision === 'refuse') {
116
+ throw new KnowzError('Refusing to import without confirmation in a non-interactive run — re-run with --yes to consent.', ExitCode.Usage);
117
+ }
118
+ const { confirm } = await import('@inquirer/prompts');
119
+ if (!(await confirm({ message: message(), default: false }))) {
120
+ throw new KnowzError('Import cancelled.', ExitCode.Usage);
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/index/scan.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,EAAE,SAAgB;IAClC,OAAgB,WAAW,SACgE;IAC3F,OAAgB,QAAQ,WAAoF;IAC5G,OAAgB,IAAI;;MAA6E;IACjG,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CA8BtI"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/index/scan.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,EAAE,SAAgB;IAClC,OAAgB,WAAW,SACgE;IAC3F,OAAgB,QAAQ,WAAoF;IAC5G,OAAgB,IAAI;;MAA6E;IACjG,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CA8CtI"}
@@ -6,6 +6,7 @@ import { graphPath } from '@knowzai/local-store';
6
6
  import { loadConfig, resolveProfileName } from '@knowzai/core';
7
7
  import { BaseCommand } from '../../base-command.js';
8
8
  import { isGuid } from '../../lib/vault.js';
9
+ import { isSafeToIndex } from '../../lib/safe-file.js';
9
10
  export default class IndexScan extends BaseCommand {
10
11
  static id = 'index:scan';
11
12
  static description = 'Index local code into the local store (tree-sitter intelligent chunking + code graph).';
@@ -19,17 +20,35 @@ export default class IndexScan extends BaseCommand {
19
20
  const { args, flags } = await this.parse(IndexScan);
20
21
  const cfg = loadConfig();
21
22
  const profile = resolveProfileName({ profileFlag: flags.profile }, cfg);
22
- const indexer = new TreeSitterIndexer();
23
+ // H7 a denied path is SKIPPED rather than fatal: a scan over a large tree
24
+ // should step over one credential file, not abort.
25
+ const indexer = new TreeSitterIndexer({ pathFilter: isSafeToIndex });
23
26
  const store = await this.localStore(flags, { db: flags.db, dim: indexer.dim });
24
27
  const vaultId = flags.vault && !isGuid(flags.vault)
25
28
  ? await this.resolveVaultId(await this.apiClient(flags), flags)
26
29
  : flags.vault;
27
- const report = await indexer.indexDirectory(args.path, store, { vaultId, force: flags.force });
28
- await store.close();
30
+ let report;
31
+ let graphJson;
32
+ let stats;
33
+ try {
34
+ report = await indexer.indexDirectory(args.path, store, { vaultId, force: flags.force });
35
+ if (vaultId) {
36
+ graphJson = await store.exportGraphJson(vaultId);
37
+ const committed = await store.graphStats(vaultId);
38
+ stats = { nodes: committed.nodeCount, edges: committed.edgeCount };
39
+ }
40
+ else {
41
+ graphJson = report.graph.toJSON();
42
+ const delta = report.graph.stats();
43
+ stats = { nodes: delta.nodes, edges: delta.edges };
44
+ }
45
+ }
46
+ finally {
47
+ await store.close();
48
+ }
29
49
  const gpath = graphPath(profile, flags.db);
30
50
  mkdirSync(dirname(gpath), { recursive: true }); // dir may not exist in Postgres mode
31
- writeFileSync(gpath, JSON.stringify(report.graph.toJSON()));
32
- const stats = report.graph.stats();
51
+ writeFileSync(gpath, JSON.stringify(graphJson));
33
52
  const out = {
34
53
  filesIndexed: report.filesIndexed,
35
54
  filesSkipped: report.filesSkipped,
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/index/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/index/scan.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export default class KnowledgeAmend extends BaseCommand {
10
10
  };
11
11
  static flags: {
12
12
  wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<AmendStatus | {
15
16
  amendRequestId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"amend.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/amend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,OAAgB,EAAE,SAAqB;IACvC,OAAgB,WAAW,SAA0F;IACrH,OAAgB,QAAQ,WAAuF;IAC/G,OAAgB,IAAI;;;MAGlB;IACF,OAAgB,KAAK;;MAAiF;IAEhG,GAAG,IAAI,OAAO,CAAC,WAAW,GAAG;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAe/E"}
1
+ {"version":3,"file":"amend.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/amend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,OAAgB,EAAE,SAAqB;IACvC,OAAgB,WAAW,SAGkF;IAC7G,OAAgB,QAAQ,WAAuF;IAC/G,OAAgB,IAAI;;;MAGlB;IACF,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,WAAW,GAAG;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAkB/E"}
@@ -1,17 +1,26 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
2
  import { BaseCommand } from '../../base-command.js';
3
+ import { assertNoCloudAmendUnderCmek } from '../../lib/cmek-guard.js';
3
4
  import { pollUntilTerminal, isTerminalStatus } from '../../lib/poll.js';
4
5
  export default class KnowledgeAmend extends BaseCommand {
5
6
  static id = 'knowledge:amend';
6
- static description = 'Amend a knowledge item with a natural-language instruction (async; optionally wait).';
7
+ static description = 'Amend a knowledge item with a natural-language instruction (async; optionally wait). ' +
8
+ 'Blocked on CMEK-enabled profiles: the cloud applies the amendment and holds only ciphertext, ' +
9
+ 'and no encrypted-amendment envelope format exists yet — edit locally and use `knowledge update` instead.';
7
10
  static examples = ['<%= config.bin %> knowledge amend <id> "fix the dates and add a summary" --wait'];
8
11
  static args = {
9
12
  id: Args.string({ description: 'Knowledge id', required: true }),
10
13
  instruction: Args.string({ description: 'Amendment instruction', required: true }),
11
14
  };
12
- static flags = { wait: Flags.boolean({ description: 'Poll until the amendment finishes' }) };
15
+ static flags = {
16
+ wait: Flags.boolean({ description: 'Poll until the amendment finishes' }),
17
+ passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
18
+ };
13
19
  async run() {
14
20
  const { args, flags } = await this.parse(KnowledgeAmend);
21
+ // H4 — the cloud applies this amendment to stored content it cannot read
22
+ // under CMEK. Refuse rather than downgrade the ciphertext-only guarantee.
23
+ assertNoCloudAmendUnderCmek(this.cmekEncryptor(flags), 'knowledge amend');
15
24
  const client = await this.apiClient(flags);
16
25
  const env = await client.amend.request(args.id, args.instruction);
17
26
  if (!this.jsonEnabled())
@@ -1 +1 @@
1
- {"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../src/commands/knowledge/amend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAU,EAAE,GAAG,iBAAiB,CAAC;IACvC,MAAM,CAAU,WAAW,GAAG,sFAAsF,CAAC;IACrH,MAAM,CAAU,QAAQ,GAAG,CAAC,iFAAiF,CAAC,CAAC;IAC/G,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnF,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,EAAE,CAAC;IAEtG,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QAE5B,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAC/B,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,EACtD,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,EACnC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAChC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC"}
1
+ {"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../src/commands/knowledge/amend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAU,EAAE,GAAG,iBAAiB,CAAC;IACvC,MAAM,CAAU,WAAW,GACzB,uFAAuF;QACvF,+FAA+F;QAC/F,0GAA0G,CAAC;IAC7G,MAAM,CAAU,QAAQ,GAAG,CAAC,iFAAiF,CAAC,CAAC;IAC/G,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnF,CAAC;IACF,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;QACzE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;KAC9F,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzD,yEAAyE;QACzE,0EAA0E;QAC1E,2BAA2B,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QAE5B,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAC/B,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,EACtD,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,EACnC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAChC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ import { type AttachResult } from '../../lib/attach.js';
3
+ export default class KnowledgeAttach extends BaseCommand {
4
+ static id: string;
5
+ static description: string;
6
+ static strict: boolean;
7
+ static usage: string;
8
+ static examples: string[];
9
+ static args: {
10
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
11
+ files: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
12
+ };
13
+ static flags: {
14
+ 'content-type': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ };
17
+ run(): Promise<AttachResult[]>;
18
+ }
19
+ //# sourceMappingURL=attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/attach.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAgB,EAAE,SAAsB;IACxC,OAAgB,WAAW,SAC2C;IACtE,OAAgB,MAAM,UAAS;IAC/B,OAAgB,KAAK,SAAsC;IAC3D,OAAgB,QAAQ,WAItB;IAEF,OAAgB,IAAI;;;MAGlB;IACF,OAAgB,KAAK;;;MAKnB;IAEI,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAwBrC"}
@@ -0,0 +1,51 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { KnowzError, ExitCode } from '@knowzai/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ import { uploadAndAttach, assertReadableFiles, applyAttachExitCode, } from '../../lib/attach.js';
5
+ import { assertNoRawUploadUnderCmek } from '../../lib/cmek-guard.js';
6
+ export default class KnowledgeAttach extends BaseCommand {
7
+ static id = 'knowledge:attach';
8
+ static description = 'Upload local files and attach them to an existing knowledge item.';
9
+ static strict = false; // accept variadic file paths
10
+ static usage = 'knowledge attach <id> <files...>';
11
+ static examples = [
12
+ '<%= config.bin %> knowledge attach 3f2a9c1e report.pdf',
13
+ '<%= config.bin %> knowledge attach 3f2a9c1e slide-1.png slide-2.png',
14
+ '<%= config.bin %> knowledge attach 3f2a9c1e capture.bin --content-type audio/mp4',
15
+ ];
16
+ // Declared for `--help`; presence is validated below so a bad invocation exits 2.
17
+ static args = {
18
+ id: Args.string({ description: 'Knowledge item id to attach to' }),
19
+ files: Args.string({ description: 'One or more local file paths (files...)' }),
20
+ };
21
+ static flags = {
22
+ 'content-type': Flags.string({
23
+ description: 'Override the inferred MIME type for every file',
24
+ }),
25
+ passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
26
+ };
27
+ async run() {
28
+ const { argv, flags } = await this.parse(KnowledgeAttach);
29
+ const [id, ...paths] = argv;
30
+ if (!id)
31
+ throw new KnowzError('A knowledge item id is required.', ExitCode.Usage);
32
+ if (!paths.length) {
33
+ throw new KnowzError('Provide at least one file path to attach.', ExitCode.Usage);
34
+ }
35
+ // H4 — raw bytes have no CMEK envelope format; refuse rather than upload
36
+ // plaintext under a feature that promises the cloud only sees ciphertext.
37
+ assertNoRawUploadUnderCmek(this.cmekEncryptor(flags), 'knowledge attach');
38
+ assertReadableFiles(paths);
39
+ const client = await this.apiClient(flags);
40
+ const results = await uploadAndAttach(client, id, paths, {
41
+ contentType: flags['content-type'],
42
+ });
43
+ applyAttachExitCode(results);
44
+ if (this.jsonEnabled())
45
+ return results;
46
+ const attached = results.filter((r) => r.ok).length;
47
+ this.log(`attached ${attached}/${results.length} file(s) to ${id}`);
48
+ return results;
49
+ }
50
+ }
51
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../src/commands/knowledge/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAU,EAAE,GAAG,kBAAkB,CAAC;IACxC,MAAM,CAAU,WAAW,GACzB,mEAAmE,CAAC;IACtE,MAAM,CAAU,MAAM,GAAG,KAAK,CAAC,CAAC,6BAA6B;IAC7D,MAAM,CAAU,KAAK,GAAG,kCAAkC,CAAC;IAC3D,MAAM,CAAU,QAAQ,GAAG;QACzB,wDAAwD;QACxD,qEAAqE;QACrE,kFAAkF;KACnF,CAAC;IACF,kFAAkF;IAClF,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;QAClE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;KAC/E,CAAC;IACF,MAAM,CAAU,KAAK,GAAG;QACtB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;YAC3B,WAAW,EAAE,gDAAgD;SAC9D,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;KAC9F,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAgB,CAAC;QACxC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,kCAAkC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClF,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,UAAU,CAAC,2CAA2C,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpF,CAAC;QACD,yEAAyE;QACzE,0EAA0E;QAC1E,0BAA0B,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC1E,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE;YACvD,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;SACnC,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,OAAO,CAAC;QAEvC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,YAAY,QAAQ,IAAI,OAAO,CAAC,MAAM,eAAe,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC"}
@@ -1,5 +1,10 @@
1
1
  import type { KnowledgeDetail, KnowledgeStatus } from '@knowzai/types';
2
2
  import { BaseCommand } from '../../base-command.js';
3
+ import { type AttachResult } from '../../lib/attach.js';
4
+ /** `attachments` is present only when `--attach` was used, so the plain create output is unchanged. */
5
+ type CreateResult = (KnowledgeDetail | KnowledgeStatus) & {
6
+ attachments?: AttachResult[];
7
+ };
3
8
  export default class KnowledgeCreate extends BaseCommand {
4
9
  static description: string;
5
10
  static args: {
@@ -11,8 +16,11 @@ export default class KnowledgeCreate extends BaseCommand {
11
16
  file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
17
  type: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
18
  tag: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ attach: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
21
  wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
22
  };
16
- run(): Promise<KnowledgeDetail | KnowledgeStatus>;
23
+ run(): Promise<CreateResult>;
17
24
  }
25
+ export {};
18
26
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAgB,WAAW,SAAyE;IACpG,OAAgB,IAAI;;MAA8D;IAClF,OAAgB,KAAK;;;;;;;MAOnB;IAEI,GAAG,IAAI,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;CA+BxD"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/knowledge/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAK7B,uGAAuG;AACvG,KAAK,YAAY,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAE3F,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAgB,WAAW,SAAyE;IACpG,OAAgB,IAAI;;MAA8D;IAClF,OAAgB,KAAK;;;;;;;;;MAanB;IAEI,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;CA8CnC"}