@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,6 +1,6 @@
1
- import { readFileSync, statSync } from 'node:fs';
2
1
  import { createHash } from 'node:crypto';
3
2
  import { grammarForPath } from '@knowzai/indexer';
3
+ import { readSafeFile } from './safe-file.js';
4
4
  const DOC_EXT = new Set(['md', 'markdown', 'txt', 'rst', 'adoc', 'text']);
5
5
  const NON_CODE_GRAMMARS = new Set(['json', 'yaml', 'yml', 'toml', 'html', 'css']);
6
6
  /** Infer a knowledge type from the file extension. */
@@ -18,7 +18,12 @@ export function inferType(path) {
18
18
  * it. The foundation for richer ingestion sources (email/web/watch) later.
19
19
  */
20
20
  export async function ingestFile(indexer, store, path, opts = {}) {
21
- const content = readFileSync(path, 'utf8');
21
+ // H7 an ingested file becomes a knowledge item that `sync push` ships to the
22
+ // cloud, so the same denied-path/symlink/size policy applies here as anywhere
23
+ // else the CLI reads a user-named file. The policy check and the read share
24
+ // one `O_NOFOLLOW` descriptor, and the recorded file state comes from that
25
+ // descriptor's `fstat` rather than a second, re-resolving `statSync`.
26
+ const { content, stat: st } = readSafeFile(path, { operation: 'ingest' });
22
27
  const res = await indexer.indexFile(path, content);
23
28
  const type = opts.type ?? inferType(path);
24
29
  res.item.type = type;
@@ -30,7 +35,6 @@ export async function ingestFile(indexer, store, path, opts = {}) {
30
35
  res.item.syncState = 'new';
31
36
  await store.upsertItem(res.item);
32
37
  await store.putChunks(res.item.id, res.chunks, res.vectors);
33
- const st = statSync(path);
34
38
  await store.setFileState({
35
39
  path,
36
40
  hash: createHash('sha256').update(content).digest('hex'),
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ export declare const LOCAL_MCP_TOOL_NAMES: readonly ["index_status", "index_repository", "repo_search", "repo_graph", "trace_path", "get_architecture", "detect_changes", "get_code_snippet"];
2
+ export type LocalMcpToolName = (typeof LOCAL_MCP_TOOL_NAMES)[number];
3
+ /** An error whose code and message are deliberately safe for the MCP client. */
4
+ export declare class LocalMcpToolError extends Error {
5
+ readonly code: string;
6
+ constructor(code: string, message: string);
7
+ }
8
+ type JsonSchema = {
9
+ type: 'object';
10
+ properties: Record<string, Record<string, unknown>>;
11
+ required?: string[];
12
+ additionalProperties: false;
13
+ };
14
+ export declare const LOCAL_MCP_TOOLS: readonly [{
15
+ readonly name: "index_status";
16
+ readonly description: string;
17
+ readonly inputSchema: JsonSchema;
18
+ }, {
19
+ readonly name: "index_repository";
20
+ readonly description: string;
21
+ readonly inputSchema: JsonSchema;
22
+ }, {
23
+ readonly name: "repo_search";
24
+ readonly description: string;
25
+ readonly inputSchema: JsonSchema;
26
+ }, {
27
+ readonly name: "repo_graph";
28
+ readonly description: string;
29
+ readonly inputSchema: JsonSchema;
30
+ }, {
31
+ readonly name: "trace_path";
32
+ readonly description: string;
33
+ readonly inputSchema: JsonSchema;
34
+ }, {
35
+ readonly name: "get_architecture";
36
+ readonly description: string;
37
+ readonly inputSchema: JsonSchema;
38
+ }, {
39
+ readonly name: "detect_changes";
40
+ readonly description: string;
41
+ readonly inputSchema: JsonSchema;
42
+ }, {
43
+ readonly name: "get_code_snippet";
44
+ readonly description: string;
45
+ readonly inputSchema: JsonSchema;
46
+ }];
47
+ export interface LocalMcpBackend {
48
+ indexStatus(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
49
+ indexRepository(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
50
+ repoSearch(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
51
+ repoGraph(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
52
+ tracePath(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
53
+ getArchitecture(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
54
+ detectChanges(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
55
+ getCodeSnippet(args: Record<string, unknown>, signal: AbortSignal): Promise<unknown>;
56
+ }
57
+ interface JsonRpcResponse {
58
+ jsonrpc: '2.0';
59
+ id: string | number | null;
60
+ result?: unknown;
61
+ error?: {
62
+ code: number;
63
+ message: string;
64
+ };
65
+ }
66
+ export declare class LocalMcpServer {
67
+ private readonly backend;
68
+ private readonly maxChars;
69
+ private readonly maxMessageBytes;
70
+ private callTail;
71
+ private readonly inFlight;
72
+ constructor(backend: LocalMcpBackend, opts?: {
73
+ maxChars?: number;
74
+ maxMessageBytes?: number;
75
+ });
76
+ handleFrame(frame: string): Promise<JsonRpcResponse | undefined>;
77
+ private serializedToolCall;
78
+ private dispatch;
79
+ private boundedJson;
80
+ }
81
+ export {};
82
+ //# sourceMappingURL=local-mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mcp-server.d.ts","sourceRoot":"","sources":["../../src/lib/local-mcp-server.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,oJASvB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,gFAAgF;AAChF,qBAAa,iBAAkB,SAAQ,KAAK;aACd,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI1D;AAED,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,EAAE,KAAK,CAAC;CAC7B,CAAC;AAgBF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8ClB,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjF,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtF;AASD,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsD;gBAG5D,OAAO,EAAE,eAAe,EACzC,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO;IAMtD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;YAqCxD,kBAAkB;IAiChC,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,WAAW;CAMpB"}
@@ -0,0 +1,252 @@
1
+ export const LOCAL_MCP_TOOL_NAMES = [
2
+ 'index_status',
3
+ 'index_repository',
4
+ 'repo_search',
5
+ 'repo_graph',
6
+ 'trace_path',
7
+ 'get_architecture',
8
+ 'detect_changes',
9
+ 'get_code_snippet',
10
+ ];
11
+ /** An error whose code and message are deliberately safe for the MCP client. */
12
+ export class LocalMcpToolError extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = 'LocalMcpToolError';
18
+ }
19
+ }
20
+ const objectSchema = (properties = {}, required) => ({
21
+ type: 'object',
22
+ properties,
23
+ ...(required ? { required } : {}),
24
+ additionalProperties: false,
25
+ });
26
+ const description = (purpose) => `${purpose} Local-only: this server never uploads or writes hosted knowledge. ` +
27
+ 'A client connected to another hosted server can still copy returned text; process separation prevents only this process from acting as a confused deputy.';
28
+ export const LOCAL_MCP_TOOLS = [
29
+ { name: 'index_status', description: description('Check bounded live index freshness.'), inputSchema: objectSchema() },
30
+ {
31
+ name: 'index_repository',
32
+ description: description('Index the confined working tree into repo-local SQLite.'),
33
+ inputSchema: objectSchema({ force: { type: 'boolean' }, dir: { type: 'string' } }),
34
+ },
35
+ {
36
+ name: 'repo_search',
37
+ description: description('Search locally indexed repository chunks.'),
38
+ inputSchema: objectSchema({ query: { type: 'string', minLength: 1, maxLength: 4096 }, limit: { type: 'integer', minimum: 1, maximum: 50 } }, ['query']),
39
+ },
40
+ {
41
+ name: 'repo_graph',
42
+ description: description('Query the local structural graph.'),
43
+ inputSchema: objectSchema({
44
+ symbol: { type: 'string', maxLength: 2048 },
45
+ file: { type: 'string', maxLength: 4096 },
46
+ kind: { type: 'string', enum: ['file', 'function', 'class', 'method', 'interface', 'symbol'] },
47
+ neighborhood: { type: 'string', maxLength: 2048 },
48
+ limit: { type: 'integer', minimum: 1, maximum: 200 },
49
+ offset: { type: 'integer', minimum: 0 },
50
+ }),
51
+ },
52
+ {
53
+ name: 'trace_path',
54
+ description: description('Trace a bounded graph path between two symbols or ids.'),
55
+ inputSchema: objectSchema({
56
+ from: { type: 'string', minLength: 1, maxLength: 1024 },
57
+ to: { type: 'string', minLength: 1, maxLength: 1024 },
58
+ depth: { type: 'integer', minimum: 1, maximum: 5 },
59
+ }, ['from', 'to']),
60
+ },
61
+ { name: 'get_architecture', description: description('Summarize top folders and symbols.'), inputSchema: objectSchema() },
62
+ { name: 'detect_changes', description: description('List confined Git changes by name only.'), inputSchema: objectSchema() },
63
+ {
64
+ name: 'get_code_snippet',
65
+ description: description('Read a fresh, descriptor-bound snippet for an indexed node.'),
66
+ inputSchema: objectSchema({ nodeId: { type: 'string', minLength: 1, maxLength: 2048 } }, ['nodeId']),
67
+ },
68
+ ];
69
+ export class LocalMcpServer {
70
+ backend;
71
+ maxChars;
72
+ maxMessageBytes;
73
+ callTail = Promise.resolve();
74
+ inFlight = new Map();
75
+ constructor(backend, opts = {}) {
76
+ this.backend = backend;
77
+ this.maxChars = opts.maxChars ?? 16_000;
78
+ this.maxMessageBytes = opts.maxMessageBytes ?? 1024 * 1024;
79
+ }
80
+ async handleFrame(frame) {
81
+ if (Buffer.byteLength(frame, 'utf8') > this.maxMessageBytes) {
82
+ return rpcError(null, -32600, 'JSON-RPC message exceeds the configured limit');
83
+ }
84
+ let parsed;
85
+ try {
86
+ parsed = JSON.parse(frame);
87
+ }
88
+ catch {
89
+ return rpcError(null, -32700, 'Parse error');
90
+ }
91
+ if (!isRequest(parsed))
92
+ return rpcError(null, -32600, 'Invalid Request');
93
+ const request = parsed;
94
+ if (request.method === 'notifications/initialized')
95
+ return undefined;
96
+ if (request.method === 'notifications/cancelled') {
97
+ const params = asRecord(request.params);
98
+ const requestId = params?.requestId;
99
+ if (typeof requestId === 'string' || typeof requestId === 'number' || requestId === null) {
100
+ this.inFlight.get(requestId)?.abort(new Error(safeString(params?.reason) ?? 'cancelled'));
101
+ }
102
+ return undefined;
103
+ }
104
+ const id = request.id ?? null;
105
+ if (request.method === 'initialize') {
106
+ const params = asRecord(request.params);
107
+ return rpcResult(id, {
108
+ protocolVersion: safeString(params?.protocolVersion) ?? '2024-11-05',
109
+ capabilities: { tools: {} },
110
+ serverInfo: { name: 'knowz-local', version: '0.1.0' },
111
+ });
112
+ }
113
+ if (request.method === 'tools/list')
114
+ return rpcResult(id, { tools: LOCAL_MCP_TOOLS });
115
+ if (request.method !== 'tools/call')
116
+ return rpcError(id, -32601, 'Method not found');
117
+ if (request.id === undefined)
118
+ return undefined;
119
+ return this.serializedToolCall(request);
120
+ }
121
+ async serializedToolCall(request) {
122
+ let release;
123
+ const prior = this.callTail;
124
+ this.callTail = new Promise((resolve) => { release = resolve; });
125
+ await prior;
126
+ const id = request.id ?? null;
127
+ const controller = new AbortController();
128
+ this.inFlight.set(id, controller);
129
+ try {
130
+ const params = asRecord(request.params);
131
+ const name = params?.name;
132
+ if (typeof name !== 'string' || !LOCAL_MCP_TOOL_NAMES.includes(name)) {
133
+ return rpcResult(id, toolError('unknown_tool', 'Unknown local MCP tool'));
134
+ }
135
+ if (params && 'arguments' in params && asRecord(params.arguments) === undefined) {
136
+ return rpcResult(id, toolError('invalid_arguments', 'arguments must be an object'));
137
+ }
138
+ const args = asRecord(params?.arguments) ?? {};
139
+ const tool = LOCAL_MCP_TOOLS.find((candidate) => candidate.name === name);
140
+ const invalid = validate(args, tool.inputSchema);
141
+ if (invalid)
142
+ return rpcResult(id, toolError('invalid_arguments', invalid));
143
+ const value = await this.dispatch(name, args, controller.signal);
144
+ return rpcResult(id, toolSuccess(this.boundedJson(value)));
145
+ }
146
+ catch (error) {
147
+ if (controller.signal.aborted)
148
+ return rpcError(id, -32800, 'Request cancelled');
149
+ const code = stableErrorCode(error);
150
+ return rpcResult(id, toolError(code, safeErrorMessage(error)));
151
+ }
152
+ finally {
153
+ this.inFlight.delete(id);
154
+ release();
155
+ }
156
+ }
157
+ dispatch(name, args, signal) {
158
+ const method = {
159
+ index_status: 'indexStatus',
160
+ index_repository: 'indexRepository',
161
+ repo_search: 'repoSearch',
162
+ repo_graph: 'repoGraph',
163
+ trace_path: 'tracePath',
164
+ get_architecture: 'getArchitecture',
165
+ detect_changes: 'detectChanges',
166
+ get_code_snippet: 'getCodeSnippet',
167
+ };
168
+ const fn = this.backend[method[name]];
169
+ return fn.call(this.backend, args, signal);
170
+ }
171
+ boundedJson(value) {
172
+ const text = JSON.stringify(value);
173
+ if (text.length <= this.maxChars)
174
+ return text;
175
+ const compact = JSON.stringify({ truncated: true, code: 'result_too_large', nextOffset: 0 });
176
+ return compact.length <= this.maxChars ? compact : '{}';
177
+ }
178
+ }
179
+ function validate(value, schema) {
180
+ for (const key of Object.keys(value)) {
181
+ if (!(key in schema.properties))
182
+ return `Unknown property: ${key}`;
183
+ }
184
+ for (const key of schema.required ?? []) {
185
+ if (!(key in value))
186
+ return `Missing required property: ${key}`;
187
+ }
188
+ for (const [key, rule] of Object.entries(schema.properties)) {
189
+ if (!(key in value))
190
+ continue;
191
+ const candidate = value[key];
192
+ if (rule.type === 'string') {
193
+ if (typeof candidate !== 'string')
194
+ return `${key} must be a string`;
195
+ if (typeof rule.minLength === 'number' && candidate.length < rule.minLength)
196
+ return `${key} is too short`;
197
+ if (typeof rule.maxLength === 'number' && candidate.length > rule.maxLength)
198
+ return `${key} is too long`;
199
+ if (Array.isArray(rule.enum) && !rule.enum.includes(candidate))
200
+ return `${key} is not an allowed value`;
201
+ }
202
+ else if (rule.type === 'boolean' && typeof candidate !== 'boolean')
203
+ return `${key} must be a boolean`;
204
+ else if (rule.type === 'integer') {
205
+ if (!Number.isInteger(candidate))
206
+ return `${key} must be an integer`;
207
+ const number = candidate;
208
+ if (typeof rule.minimum === 'number' && number < rule.minimum)
209
+ return `${key} is below minimum`;
210
+ if (typeof rule.maximum === 'number' && number > rule.maximum)
211
+ return `${key} is above maximum`;
212
+ }
213
+ }
214
+ return undefined;
215
+ }
216
+ function isRequest(value) {
217
+ if (!value || typeof value !== 'object' || Array.isArray(value))
218
+ return false;
219
+ const request = value;
220
+ return request.jsonrpc === '2.0' && typeof request.method === 'string';
221
+ }
222
+ function asRecord(value) {
223
+ return value && typeof value === 'object' && !Array.isArray(value)
224
+ ? value
225
+ : undefined;
226
+ }
227
+ function safeString(value) {
228
+ return typeof value === 'string' ? value.slice(0, 1024) : undefined;
229
+ }
230
+ function safeErrorMessage(error) {
231
+ if (error instanceof LocalMcpToolError)
232
+ return error.message.slice(0, 1024);
233
+ return 'Local tool failed; see stderr diagnostics.';
234
+ }
235
+ function stableErrorCode(error) {
236
+ if (error instanceof LocalMcpToolError)
237
+ return error.code;
238
+ return 'tool_failed';
239
+ }
240
+ function toolSuccess(text) {
241
+ return { content: [{ type: 'text', text }] };
242
+ }
243
+ function toolError(code, message) {
244
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify({ code, message }) }] };
245
+ }
246
+ function rpcResult(id, result) {
247
+ return { jsonrpc: '2.0', id, result };
248
+ }
249
+ function rpcError(id, code, message) {
250
+ return { jsonrpc: '2.0', id, error: { code, message } };
251
+ }
252
+ //# sourceMappingURL=local-mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mcp-server.js","sourceRoot":"","sources":["../../src/lib/local-mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Writable } from 'node:stream';
2
+ import type { LocalMcpServer } from './local-mcp-server.js';
3
+ export declare function runLocalMcpStdio(server: LocalMcpServer, opts?: {
4
+ input?: NodeJS.ReadableStream & AsyncIterable<Buffer | string>;
5
+ output?: Writable;
6
+ maxMessageBytes?: number;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=local-mcp-stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mcp-stdio.d.ts","sourceRoot":"","sources":["../../src/lib/local-mcp-stdio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC/D,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
@@ -0,0 +1,50 @@
1
+ import { StringDecoder } from 'node:string_decoder';
2
+ export async function runLocalMcpStdio(server, opts = {}) {
3
+ const input = opts.input ?? process.stdin;
4
+ const output = opts.output ?? process.stdout;
5
+ const maxMessageBytes = opts.maxMessageBytes ?? 1024 * 1024;
6
+ const pending = new Set();
7
+ let writes = Promise.resolve();
8
+ let buffer = '';
9
+ let overflowed = false;
10
+ const decoder = new StringDecoder('utf8');
11
+ const processFrame = (frame) => {
12
+ const task = server.handleFrame(frame).then((response) => {
13
+ if (!response)
14
+ return;
15
+ const line = `${JSON.stringify(response)}\n`;
16
+ writes = writes.then(() => new Promise((resolve, reject) => {
17
+ output.write(line, (error) => error ? reject(error) : resolve());
18
+ }));
19
+ return writes;
20
+ }).then(() => undefined);
21
+ pending.add(task);
22
+ void task.finally(() => pending.delete(task));
23
+ };
24
+ for await (const chunk of input) {
25
+ if (overflowed)
26
+ continue;
27
+ buffer += typeof chunk === 'string' ? chunk : decoder.write(chunk);
28
+ for (;;) {
29
+ const newline = buffer.indexOf('\n');
30
+ if (newline < 0)
31
+ break;
32
+ const frame = buffer.slice(0, newline).replace(/\r$/, '');
33
+ buffer = buffer.slice(newline + 1);
34
+ if (frame)
35
+ processFrame(frame);
36
+ }
37
+ if (Buffer.byteLength(buffer, 'utf8') > maxMessageBytes) {
38
+ overflowed = true;
39
+ processFrame(buffer);
40
+ buffer = '';
41
+ }
42
+ }
43
+ if (!overflowed)
44
+ buffer += decoder.end();
45
+ if (!overflowed && buffer.trim())
46
+ processFrame(buffer);
47
+ await Promise.all([...pending]);
48
+ await writes;
49
+ }
50
+ //# sourceMappingURL=local-mcp-stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mcp-stdio.js","sourceRoot":"","sources":["../../src/lib/local-mcp-stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type LoginDeps, type LoginInput } from './login.js';
2
+ /** Human-readable validation message for a rejected key (prefix + near-miss hint). */
3
+ export declare function explainKey(key: string): string | true;
4
+ /**
5
+ * Ask before re-pointing a profile that already holds credentials — but only
6
+ * when there is a human at the other end. Scripts and `--json` get no confirmer,
7
+ * so `performLogin` falls back to its non-interactive rule (#669).
8
+ */
9
+ export declare function replaceConfirmer(io: {
10
+ isTty: boolean;
11
+ json: boolean;
12
+ }): LoginDeps['confirmReplace'] | undefined;
13
+ /**
14
+ * Guided sign-in: pick a method, then collect inputs with helpful validation.
15
+ * `force` rides along on every branch — `knowz login --profile X --force` still
16
+ * opens this picker, and dropping the flag here is what let a "successful"
17
+ * guided login leave the profile on its previous tenant (#669).
18
+ */
19
+ export declare function guidedLogin(profile: string, apiUrl: string, force: boolean | undefined, log: (line: string) => void): Promise<LoginInput>;
20
+ //# sourceMappingURL=login-guided.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-guided.d.ts","sourceRoot":"","sources":["../../src/lib/login-guided.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAgBpB,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKrD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAU/G;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GAAG,SAAS,EAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,UAAU,CAAC,CAmDrB"}
@@ -0,0 +1,89 @@
1
+ import { enforceTls, KnowzError, ExitCode, validateKeyFormat } from '@knowzai/core';
2
+ import { tenantLabel, AGE_ELIGIBILITY_TEXT, AGE_ELIGIBILITY_UNDER_13_MESSAGE, } from './login.js';
3
+ /**
4
+ * If a key doesn't start with a known prefix but contains one, the user almost
5
+ * certainly pasted a stray leading character (e.g. "Vukz_…"). Tell them exactly.
6
+ */
7
+ function keyHint(key) {
8
+ for (const prefix of ['kzin_', 'ukz_', 'kz_', 'ksh_', 'sh-']) {
9
+ const i = key.indexOf(prefix);
10
+ if (i > 0) {
11
+ return `it looks like there ${i === 1 ? 'is' : 'are'} ${i} stray character${i === 1 ? '' : 's'} before "${prefix}" — remove the leading "${key.slice(0, i)}"`;
12
+ }
13
+ }
14
+ return undefined;
15
+ }
16
+ /** Human-readable validation message for a rejected key (prefix + near-miss hint). */
17
+ export function explainKey(key) {
18
+ const r = validateKeyFormat(key.trim());
19
+ if (r.ok)
20
+ return true;
21
+ const hint = keyHint(key.trim());
22
+ return `${r.reason}${hint ? ` — ${hint}` : ''}`;
23
+ }
24
+ /**
25
+ * Ask before re-pointing a profile that already holds credentials — but only
26
+ * when there is a human at the other end. Scripts and `--json` get no confirmer,
27
+ * so `performLogin` falls back to its non-interactive rule (#669).
28
+ */
29
+ export function replaceConfirmer(io) {
30
+ if (!io.isTty || io.json)
31
+ return undefined;
32
+ return async (ctx) => {
33
+ const { confirm } = await import('@inquirer/prompts');
34
+ const current = tenantLabel(ctx.current);
35
+ const message = ctx.sameTenant
36
+ ? `Profile '${ctx.profile}' is already registered to ${current}. Replace its stored key?`
37
+ : `Profile '${ctx.profile}' is already registered to ${current}. Replace it with ${tenantLabel(ctx.incoming)}?`;
38
+ return confirm({ message, default: false });
39
+ };
40
+ }
41
+ /**
42
+ * Guided sign-in: pick a method, then collect inputs with helpful validation.
43
+ * `force` rides along on every branch — `knowz login --profile X --force` still
44
+ * opens this picker, and dropping the flag here is what let a "successful"
45
+ * guided login leave the profile on its previous tenant (#669).
46
+ */
47
+ export async function guidedLogin(profile, apiUrl, force, log) {
48
+ const { select, input: ask, password } = await import('@inquirer/prompts');
49
+ log(`\nSign in to Knowz · profile '${profile}' → ${apiUrl}`);
50
+ log("Don't have a key yet? Choose “Browser SSO” or “Register”.\n");
51
+ const method = await select({
52
+ message: 'How do you want to sign in?',
53
+ choices: [
54
+ { name: 'Browser SSO', value: 'sso', description: 'Open a browser, sign in, mint a user API key' },
55
+ { name: 'Paste an existing API key', value: 'paste', description: 'You already have a ukz_ or kz_ key' },
56
+ { name: 'Register a new account', value: 'register', description: 'Create a tenant and get a key' },
57
+ { name: 'Connect a self-hosted instance', value: 'self', description: 'Point at your own Knowz host' },
58
+ ],
59
+ });
60
+ if (method === 'sso') {
61
+ return { profile, apiUrl, mode: 'sso', force };
62
+ }
63
+ if (method === 'register') {
64
+ const { confirm } = await import('@inquirer/prompts');
65
+ const ageAttested = await confirm({ message: AGE_ELIGIBILITY_TEXT, default: false });
66
+ if (!ageAttested)
67
+ throw new KnowzError(AGE_ELIGIBILITY_UNDER_13_MESSAGE, ExitCode.Usage);
68
+ const name = (await ask({ message: 'Your name', required: true })).trim();
69
+ const email = (await ask({ message: 'Email', required: true })).trim();
70
+ // Registration no longer returns a key: the password is what lets the CLI
71
+ // sign in and create one, so it is no longer optional.
72
+ const pw = (await password({
73
+ message: 'Password (used to sign in and create your API key)',
74
+ validate: (v) => (v.trim().length > 0 ? true : 'A password is required to create an API key'),
75
+ })).trim();
76
+ return { profile, apiUrl, mode: 'register', force, register: { name, email, password: pw, ageAttested } };
77
+ }
78
+ let url = apiUrl;
79
+ if (method === 'self') {
80
+ url = (await ask({ message: 'API base URL', default: apiUrl, required: true })).trim();
81
+ enforceTls(url); // fail fast with a clear message before asking for the key
82
+ }
83
+ const key = (await password({
84
+ message: 'Paste your API key (input is hidden; starts with ukz_ or kz_)',
85
+ validate: (v) => explainKey(v),
86
+ })).trim();
87
+ return { profile, apiUrl: url, mode: method === 'self' ? 'self-hosted' : 'paste', key, force };
88
+ }
89
+ //# sourceMappingURL=login-guided.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-guided.js","sourceRoot":"","sources":["../../src/lib/login-guided.ts"],"names":[],"mappings":"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"}