gnosys 5.10.0 → 5.11.1

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 (500) hide show
  1. package/README.md +66 -0
  2. package/dist/cli.d.ts +0 -1
  3. package/dist/cli.js +293 -139
  4. package/dist/index.d.ts +5 -1
  5. package/dist/index.js +429 -349
  6. package/dist/lib/archive.d.ts +3 -4
  7. package/dist/lib/archive.js +0 -1
  8. package/dist/lib/ask.d.ts +3 -4
  9. package/dist/lib/ask.js +2 -2
  10. package/dist/lib/atomicWrite.d.ts +7 -0
  11. package/dist/lib/atomicWrite.js +46 -0
  12. package/dist/lib/attachments.d.ts +0 -1
  13. package/dist/lib/attachments.js +0 -1
  14. package/dist/lib/audioExtract.d.ts +0 -1
  15. package/dist/lib/audioExtract.js +0 -1
  16. package/dist/lib/audit.d.ts +0 -1
  17. package/dist/lib/audit.js +0 -1
  18. package/dist/lib/bootstrap.d.ts +1 -2
  19. package/dist/lib/bootstrap.js +0 -1
  20. package/dist/lib/centralize.d.ts +20 -0
  21. package/dist/lib/centralize.js +34 -0
  22. package/dist/lib/chat/SlashPalette.d.ts +2 -3
  23. package/dist/lib/chat/SlashPalette.js +0 -1
  24. package/dist/lib/chat/boot-splash.d.ts +1 -2
  25. package/dist/lib/chat/boot-splash.js +0 -1
  26. package/dist/lib/chat/choose.d.ts +0 -1
  27. package/dist/lib/chat/choose.js +0 -2
  28. package/dist/lib/chat/commands.d.ts +1 -2
  29. package/dist/lib/chat/commands.js +0 -1
  30. package/dist/lib/chat/components/CitationText.d.ts +1 -2
  31. package/dist/lib/chat/components/CitationText.js +0 -1
  32. package/dist/lib/chat/components/MarkdownRenderer.d.ts +0 -1
  33. package/dist/lib/chat/components/MarkdownRenderer.js +0 -1
  34. package/dist/lib/chat/components/ToolCallCard.d.ts +1 -2
  35. package/dist/lib/chat/components/ToolCallCard.js +0 -1
  36. package/dist/lib/chat/focus.d.ts +3 -3
  37. package/dist/lib/chat/focus.js +0 -1
  38. package/dist/lib/chat/index.d.ts +3 -4
  39. package/dist/lib/chat/index.js +2 -2
  40. package/dist/lib/chat/intent.d.ts +1 -17
  41. package/dist/lib/chat/intent.js +2 -3
  42. package/dist/lib/chat/llmTurn.d.ts +5 -6
  43. package/dist/lib/chat/llmTurn.js +0 -1
  44. package/dist/lib/chat/recall.d.ts +2 -3
  45. package/dist/lib/chat/recall.js +1 -2
  46. package/dist/lib/chat/render.d.ts +2 -3
  47. package/dist/lib/chat/render.js +0 -1
  48. package/dist/lib/chat/session.d.ts +0 -1
  49. package/dist/lib/chat/session.js +0 -1
  50. package/dist/lib/chat/theme.d.ts +0 -1
  51. package/dist/lib/chat/theme.js +0 -1
  52. package/dist/lib/chat/toolFence.d.ts +2 -2
  53. package/dist/lib/chat/toolFence.js +0 -1
  54. package/dist/lib/chat/tools.d.ts +0 -1
  55. package/dist/lib/chat/tools.js +0 -1
  56. package/dist/lib/chat/types.d.ts +0 -1
  57. package/dist/lib/chat/types.js +0 -1
  58. package/dist/lib/chat/write.d.ts +5 -5
  59. package/dist/lib/chat/write.js +0 -1
  60. package/dist/lib/chunkSplitter.d.ts +0 -1
  61. package/dist/lib/chunkSplitter.js +0 -1
  62. package/dist/lib/cleanup.d.ts +0 -1
  63. package/dist/lib/cleanup.js +0 -1
  64. package/dist/lib/config.d.ts +0 -1
  65. package/dist/lib/config.js +3 -3
  66. package/dist/lib/dashboard.d.ts +3 -4
  67. package/dist/lib/dashboard.js +0 -1
  68. package/dist/lib/db.d.ts +0 -1
  69. package/dist/lib/db.js +40 -8
  70. package/dist/lib/dbSearch.d.ts +3 -4
  71. package/dist/lib/dbSearch.js +0 -1
  72. package/dist/lib/dbWrite.d.ts +2 -3
  73. package/dist/lib/dbWrite.js +0 -1
  74. package/dist/lib/desktopNotify.d.ts +0 -1
  75. package/dist/lib/desktopNotify.js +0 -1
  76. package/dist/lib/docxExtract.d.ts +0 -1
  77. package/dist/lib/docxExtract.js +22 -1
  78. package/dist/lib/dream.d.ts +2 -3
  79. package/dist/lib/dream.js +2 -2
  80. package/dist/lib/embeddings.d.ts +0 -3
  81. package/dist/lib/embeddings.js +7 -3
  82. package/dist/lib/export.d.ts +6 -2
  83. package/dist/lib/export.js +24 -2
  84. package/dist/lib/exportProject.d.ts +4 -3
  85. package/dist/lib/exportProject.js +3 -1
  86. package/dist/lib/federated.d.ts +1 -2
  87. package/dist/lib/federated.js +0 -1
  88. package/dist/lib/fileDetect.d.ts +0 -1
  89. package/dist/lib/fileDetect.js +0 -1
  90. package/dist/lib/graph.d.ts +4 -4
  91. package/dist/lib/graph.js +0 -1
  92. package/dist/lib/heartbeat.d.ts +0 -13
  93. package/dist/lib/heartbeat.js +1 -2
  94. package/dist/lib/hybridSearch.d.ts +5 -21
  95. package/dist/lib/hybridSearch.js +0 -1
  96. package/dist/lib/idFormat.d.ts +0 -2
  97. package/dist/lib/idFormat.js +1 -2
  98. package/dist/lib/imageExtract.d.ts +0 -1
  99. package/dist/lib/imageExtract.js +0 -1
  100. package/dist/lib/import.d.ts +6 -5
  101. package/dist/lib/import.js +3 -33
  102. package/dist/lib/importProject.d.ts +4 -4
  103. package/dist/lib/importProject.js +1 -2
  104. package/dist/lib/ingest.d.ts +3 -4
  105. package/dist/lib/ingest.js +2 -2
  106. package/dist/lib/lensing.d.ts +1 -2
  107. package/dist/lib/lensing.js +0 -1
  108. package/dist/lib/llm.d.ts +6 -45
  109. package/dist/lib/llm.js +27 -9
  110. package/dist/lib/lock.d.ts +0 -1
  111. package/dist/lib/lock.js +0 -1
  112. package/dist/lib/log.d.ts +4 -0
  113. package/dist/lib/log.js +85 -0
  114. package/dist/lib/machineConfig.d.ts +2 -3
  115. package/dist/lib/machineConfig.js +14 -3
  116. package/dist/lib/machineMigrate.d.ts +0 -1
  117. package/dist/lib/machineMigrate.js +0 -1
  118. package/dist/lib/maintenance.d.ts +4 -5
  119. package/dist/lib/maintenance.js +0 -1
  120. package/dist/lib/mcpClientConfig.d.ts +20 -0
  121. package/dist/lib/mcpClientConfig.js +50 -0
  122. package/dist/lib/mcpHttp.d.ts +52 -0
  123. package/dist/lib/mcpHttp.js +227 -0
  124. package/dist/lib/migrate.d.ts +1 -2
  125. package/dist/lib/migrate.js +1 -1
  126. package/dist/lib/modelValidation.d.ts +0 -1
  127. package/dist/lib/modelValidation.js +0 -1
  128. package/dist/lib/multimodalIngest.d.ts +1 -2
  129. package/dist/lib/multimodalIngest.js +0 -1
  130. package/dist/lib/packageManager.d.ts +5 -0
  131. package/dist/lib/packageManager.js +30 -0
  132. package/dist/lib/paths.d.ts +0 -7
  133. package/dist/lib/paths.js +1 -2
  134. package/dist/lib/pdfExtract.d.ts +0 -1
  135. package/dist/lib/pdfExtract.js +0 -1
  136. package/dist/lib/platform.d.ts +24 -0
  137. package/dist/lib/platform.js +114 -0
  138. package/dist/lib/portfolio.d.ts +1 -2
  139. package/dist/lib/portfolio.js +0 -1
  140. package/dist/lib/portfolioHtml.d.ts +1 -2
  141. package/dist/lib/portfolioHtml.js +0 -1
  142. package/dist/lib/preferences.d.ts +6 -2
  143. package/dist/lib/preferences.js +19 -1
  144. package/dist/lib/progress.d.ts +2 -2
  145. package/dist/lib/progress.js +0 -1
  146. package/dist/lib/projectIdentity.d.ts +1 -2
  147. package/dist/lib/projectIdentity.js +5 -5
  148. package/dist/lib/projectPaths.d.ts +2 -2
  149. package/dist/lib/projectPaths.js +0 -1
  150. package/dist/lib/projectScan.d.ts +2 -2
  151. package/dist/lib/projectScan.js +0 -1
  152. package/dist/lib/recall.d.ts +6 -6
  153. package/dist/lib/recall.js +0 -1
  154. package/dist/lib/remote.d.ts +7 -20
  155. package/dist/lib/remote.js +58 -3
  156. package/dist/lib/remoteWizard.d.ts +1 -2
  157. package/dist/lib/remoteWizard.js +124 -7
  158. package/dist/lib/resolver.d.ts +1 -2
  159. package/dist/lib/resolver.js +2 -3
  160. package/dist/lib/retry.d.ts +0 -1
  161. package/dist/lib/retry.js +1 -2
  162. package/dist/lib/rulesGen.d.ts +2 -8
  163. package/dist/lib/rulesGen.js +1 -2
  164. package/dist/lib/search.d.ts +1 -2
  165. package/dist/lib/search.js +1 -1
  166. package/dist/lib/searchTypes.d.ts +18 -0
  167. package/dist/lib/searchTypes.js +2 -0
  168. package/dist/lib/setup/coldStart.d.ts +0 -1
  169. package/dist/lib/setup/coldStart.js +0 -1
  170. package/dist/lib/setup/configSetRender.d.ts +0 -1
  171. package/dist/lib/setup/configSetRender.js +0 -1
  172. package/dist/lib/setup/dreamRender.d.ts +0 -1
  173. package/dist/lib/setup/dreamRender.js +0 -1
  174. package/dist/lib/setup/dreamState.d.ts +2 -2
  175. package/dist/lib/setup/dreamState.js +0 -1
  176. package/dist/lib/setup/modelsRender.d.ts +0 -1
  177. package/dist/lib/setup/modelsRender.js +0 -1
  178. package/dist/lib/setup/remoteRender.d.ts +0 -1
  179. package/dist/lib/setup/remoteRender.js +0 -1
  180. package/dist/lib/setup/routingRender.d.ts +0 -1
  181. package/dist/lib/setup/routingRender.js +0 -1
  182. package/dist/lib/setup/sections/ides.d.ts +1 -2
  183. package/dist/lib/setup/sections/ides.js +3 -2
  184. package/dist/lib/setup/sections/preferences.d.ts +1 -2
  185. package/dist/lib/setup/sections/preferences.js +3 -2
  186. package/dist/lib/setup/sections/routing.d.ts +1 -2
  187. package/dist/lib/setup/sections/routing.js +0 -1
  188. package/dist/lib/setup/storePath.d.ts +0 -1
  189. package/dist/lib/setup/storePath.js +0 -1
  190. package/dist/lib/setup/summary.d.ts +1 -2
  191. package/dist/lib/setup/summary.js +0 -1
  192. package/dist/lib/setup/syncProjectsRender.d.ts +0 -1
  193. package/dist/lib/setup/syncProjectsRender.js +0 -1
  194. package/dist/lib/setup/ui/diff.d.ts +0 -1
  195. package/dist/lib/setup/ui/diff.js +0 -1
  196. package/dist/lib/setup/ui/footer.d.ts +0 -1
  197. package/dist/lib/setup/ui/footer.js +0 -1
  198. package/dist/lib/setup/ui/header.d.ts +0 -1
  199. package/dist/lib/setup/ui/header.js +0 -1
  200. package/dist/lib/setup/ui/index.d.ts +0 -1
  201. package/dist/lib/setup/ui/index.js +0 -1
  202. package/dist/lib/setup/ui/menu.d.ts +0 -1
  203. package/dist/lib/setup/ui/menu.js +0 -1
  204. package/dist/lib/setup/ui/panel.d.ts +0 -1
  205. package/dist/lib/setup/ui/panel.js +0 -1
  206. package/dist/lib/setup/ui/prompt.d.ts +0 -1
  207. package/dist/lib/setup/ui/prompt.js +0 -1
  208. package/dist/lib/setup/ui/safePrompt.d.ts +0 -1
  209. package/dist/lib/setup/ui/safePrompt.js +0 -1
  210. package/dist/lib/setup/ui/spinner.d.ts +0 -1
  211. package/dist/lib/setup/ui/spinner.js +0 -1
  212. package/dist/lib/setup/ui/status.d.ts +0 -1
  213. package/dist/lib/setup/ui/status.js +0 -1
  214. package/dist/lib/setup/ui/table.d.ts +0 -1
  215. package/dist/lib/setup/ui/table.js +0 -1
  216. package/dist/lib/setup/ui/title.d.ts +0 -1
  217. package/dist/lib/setup/ui/title.js +0 -1
  218. package/dist/lib/setup/ui/tokens.d.ts +0 -1
  219. package/dist/lib/setup/ui/tokens.js +0 -1
  220. package/dist/lib/setup.d.ts +2 -31
  221. package/dist/lib/setup.js +56 -54
  222. package/dist/lib/staticSearch.d.ts +0 -1
  223. package/dist/lib/staticSearch.js +0 -1
  224. package/dist/lib/store.d.ts +0 -1
  225. package/dist/lib/store.js +0 -1
  226. package/dist/lib/structuredIngest.d.ts +0 -1
  227. package/dist/lib/structuredIngest.js +0 -1
  228. package/dist/lib/tags.d.ts +0 -1
  229. package/dist/lib/tags.js +0 -1
  230. package/dist/lib/timeline.d.ts +2 -3
  231. package/dist/lib/timeline.js +3 -4
  232. package/dist/lib/trace.d.ts +1 -16
  233. package/dist/lib/trace.js +0 -1
  234. package/dist/lib/upgrade.d.ts +4 -2
  235. package/dist/lib/upgrade.js +15 -3
  236. package/dist/lib/videoExtract.d.ts +0 -1
  237. package/dist/lib/videoExtract.js +2 -5
  238. package/dist/lib/webIndex.d.ts +1 -3
  239. package/dist/lib/webIndex.js +0 -1
  240. package/dist/lib/webIngest.d.ts +13 -1
  241. package/dist/lib/webIngest.js +98 -24
  242. package/dist/lib/wikilinks.d.ts +3 -3
  243. package/dist/lib/wikilinks.js +0 -1
  244. package/dist/postinstall.d.ts +0 -1
  245. package/dist/postinstall.js +0 -1
  246. package/dist/sandbox/client.d.ts +0 -1
  247. package/dist/sandbox/client.js +0 -1
  248. package/dist/sandbox/helper-template.d.ts +0 -1
  249. package/dist/sandbox/helper-template.js +0 -1
  250. package/dist/sandbox/manager.d.ts +0 -9
  251. package/dist/sandbox/manager.js +2 -3
  252. package/dist/sandbox/server.d.ts +2 -3
  253. package/dist/sandbox/server.js +7 -7
  254. package/docs/logo.svg +25 -0
  255. package/package.json +18 -6
  256. package/prompts/synthesize.md +2 -0
  257. package/dist/cli.d.ts.map +0 -1
  258. package/dist/cli.js.map +0 -1
  259. package/dist/index.d.ts.map +0 -1
  260. package/dist/index.js.map +0 -1
  261. package/dist/lib/archive.d.ts.map +0 -1
  262. package/dist/lib/archive.js.map +0 -1
  263. package/dist/lib/ask.d.ts.map +0 -1
  264. package/dist/lib/ask.js.map +0 -1
  265. package/dist/lib/attachments.d.ts.map +0 -1
  266. package/dist/lib/attachments.js.map +0 -1
  267. package/dist/lib/audioExtract.d.ts.map +0 -1
  268. package/dist/lib/audioExtract.js.map +0 -1
  269. package/dist/lib/audit.d.ts.map +0 -1
  270. package/dist/lib/audit.js.map +0 -1
  271. package/dist/lib/bootstrap.d.ts.map +0 -1
  272. package/dist/lib/bootstrap.js.map +0 -1
  273. package/dist/lib/chat/SlashPalette.d.ts.map +0 -1
  274. package/dist/lib/chat/SlashPalette.js.map +0 -1
  275. package/dist/lib/chat/boot-splash.d.ts.map +0 -1
  276. package/dist/lib/chat/boot-splash.js.map +0 -1
  277. package/dist/lib/chat/choose.d.ts.map +0 -1
  278. package/dist/lib/chat/choose.js.map +0 -1
  279. package/dist/lib/chat/commands.d.ts.map +0 -1
  280. package/dist/lib/chat/commands.js.map +0 -1
  281. package/dist/lib/chat/components/CitationText.d.ts.map +0 -1
  282. package/dist/lib/chat/components/CitationText.js.map +0 -1
  283. package/dist/lib/chat/components/MarkdownRenderer.d.ts.map +0 -1
  284. package/dist/lib/chat/components/MarkdownRenderer.js.map +0 -1
  285. package/dist/lib/chat/components/ToolCallCard.d.ts.map +0 -1
  286. package/dist/lib/chat/components/ToolCallCard.js.map +0 -1
  287. package/dist/lib/chat/focus.d.ts.map +0 -1
  288. package/dist/lib/chat/focus.js.map +0 -1
  289. package/dist/lib/chat/index.d.ts.map +0 -1
  290. package/dist/lib/chat/index.js.map +0 -1
  291. package/dist/lib/chat/intent.d.ts.map +0 -1
  292. package/dist/lib/chat/intent.js.map +0 -1
  293. package/dist/lib/chat/llmTurn.d.ts.map +0 -1
  294. package/dist/lib/chat/llmTurn.js.map +0 -1
  295. package/dist/lib/chat/recall.d.ts.map +0 -1
  296. package/dist/lib/chat/recall.js.map +0 -1
  297. package/dist/lib/chat/render.d.ts.map +0 -1
  298. package/dist/lib/chat/render.js.map +0 -1
  299. package/dist/lib/chat/session.d.ts.map +0 -1
  300. package/dist/lib/chat/session.js.map +0 -1
  301. package/dist/lib/chat/theme.d.ts.map +0 -1
  302. package/dist/lib/chat/theme.js.map +0 -1
  303. package/dist/lib/chat/toolFence.d.ts.map +0 -1
  304. package/dist/lib/chat/toolFence.js.map +0 -1
  305. package/dist/lib/chat/tools.d.ts.map +0 -1
  306. package/dist/lib/chat/tools.js.map +0 -1
  307. package/dist/lib/chat/types.d.ts.map +0 -1
  308. package/dist/lib/chat/types.js.map +0 -1
  309. package/dist/lib/chat/write.d.ts.map +0 -1
  310. package/dist/lib/chat/write.js.map +0 -1
  311. package/dist/lib/chunkSplitter.d.ts.map +0 -1
  312. package/dist/lib/chunkSplitter.js.map +0 -1
  313. package/dist/lib/cleanup.d.ts.map +0 -1
  314. package/dist/lib/cleanup.js.map +0 -1
  315. package/dist/lib/config.d.ts.map +0 -1
  316. package/dist/lib/config.js.map +0 -1
  317. package/dist/lib/dashboard.d.ts.map +0 -1
  318. package/dist/lib/dashboard.js.map +0 -1
  319. package/dist/lib/db.d.ts.map +0 -1
  320. package/dist/lib/db.js.map +0 -1
  321. package/dist/lib/dbSearch.d.ts.map +0 -1
  322. package/dist/lib/dbSearch.js.map +0 -1
  323. package/dist/lib/dbWrite.d.ts.map +0 -1
  324. package/dist/lib/dbWrite.js.map +0 -1
  325. package/dist/lib/desktopNotify.d.ts.map +0 -1
  326. package/dist/lib/desktopNotify.js.map +0 -1
  327. package/dist/lib/docxExtract.d.ts.map +0 -1
  328. package/dist/lib/docxExtract.js.map +0 -1
  329. package/dist/lib/dream.d.ts.map +0 -1
  330. package/dist/lib/dream.js.map +0 -1
  331. package/dist/lib/embeddings.d.ts.map +0 -1
  332. package/dist/lib/embeddings.js.map +0 -1
  333. package/dist/lib/export.d.ts.map +0 -1
  334. package/dist/lib/export.js.map +0 -1
  335. package/dist/lib/exportProject.d.ts.map +0 -1
  336. package/dist/lib/exportProject.js.map +0 -1
  337. package/dist/lib/federated.d.ts.map +0 -1
  338. package/dist/lib/federated.js.map +0 -1
  339. package/dist/lib/fileDetect.d.ts.map +0 -1
  340. package/dist/lib/fileDetect.js.map +0 -1
  341. package/dist/lib/graph.d.ts.map +0 -1
  342. package/dist/lib/graph.js.map +0 -1
  343. package/dist/lib/heartbeat.d.ts.map +0 -1
  344. package/dist/lib/heartbeat.js.map +0 -1
  345. package/dist/lib/history.d.ts +0 -39
  346. package/dist/lib/history.d.ts.map +0 -1
  347. package/dist/lib/history.js +0 -112
  348. package/dist/lib/history.js.map +0 -1
  349. package/dist/lib/hybridSearch.d.ts.map +0 -1
  350. package/dist/lib/hybridSearch.js.map +0 -1
  351. package/dist/lib/idFormat.d.ts.map +0 -1
  352. package/dist/lib/idFormat.js.map +0 -1
  353. package/dist/lib/imageExtract.d.ts.map +0 -1
  354. package/dist/lib/imageExtract.js.map +0 -1
  355. package/dist/lib/import.d.ts.map +0 -1
  356. package/dist/lib/import.js.map +0 -1
  357. package/dist/lib/importProject.d.ts.map +0 -1
  358. package/dist/lib/importProject.js.map +0 -1
  359. package/dist/lib/ingest.d.ts.map +0 -1
  360. package/dist/lib/ingest.js.map +0 -1
  361. package/dist/lib/lensing.d.ts.map +0 -1
  362. package/dist/lib/lensing.js.map +0 -1
  363. package/dist/lib/llm.d.ts.map +0 -1
  364. package/dist/lib/llm.js.map +0 -1
  365. package/dist/lib/lock.d.ts.map +0 -1
  366. package/dist/lib/lock.js.map +0 -1
  367. package/dist/lib/machineConfig.d.ts.map +0 -1
  368. package/dist/lib/machineConfig.js.map +0 -1
  369. package/dist/lib/machineMigrate.d.ts.map +0 -1
  370. package/dist/lib/machineMigrate.js.map +0 -1
  371. package/dist/lib/maintenance.d.ts.map +0 -1
  372. package/dist/lib/maintenance.js.map +0 -1
  373. package/dist/lib/migrate.d.ts.map +0 -1
  374. package/dist/lib/migrate.js.map +0 -1
  375. package/dist/lib/modelValidation.d.ts.map +0 -1
  376. package/dist/lib/modelValidation.js.map +0 -1
  377. package/dist/lib/multimodalIngest.d.ts.map +0 -1
  378. package/dist/lib/multimodalIngest.js.map +0 -1
  379. package/dist/lib/paths.d.ts.map +0 -1
  380. package/dist/lib/paths.js.map +0 -1
  381. package/dist/lib/pdfExtract.d.ts.map +0 -1
  382. package/dist/lib/pdfExtract.js.map +0 -1
  383. package/dist/lib/portfolio.d.ts.map +0 -1
  384. package/dist/lib/portfolio.js.map +0 -1
  385. package/dist/lib/portfolioHtml.d.ts.map +0 -1
  386. package/dist/lib/portfolioHtml.js.map +0 -1
  387. package/dist/lib/preferences.d.ts.map +0 -1
  388. package/dist/lib/preferences.js.map +0 -1
  389. package/dist/lib/progress.d.ts.map +0 -1
  390. package/dist/lib/progress.js.map +0 -1
  391. package/dist/lib/projectIdentity.d.ts.map +0 -1
  392. package/dist/lib/projectIdentity.js.map +0 -1
  393. package/dist/lib/projectPaths.d.ts.map +0 -1
  394. package/dist/lib/projectPaths.js.map +0 -1
  395. package/dist/lib/projectScan.d.ts.map +0 -1
  396. package/dist/lib/projectScan.js.map +0 -1
  397. package/dist/lib/recall.d.ts.map +0 -1
  398. package/dist/lib/recall.js.map +0 -1
  399. package/dist/lib/remote.d.ts.map +0 -1
  400. package/dist/lib/remote.js.map +0 -1
  401. package/dist/lib/remoteWizard.d.ts.map +0 -1
  402. package/dist/lib/remoteWizard.js.map +0 -1
  403. package/dist/lib/resolver.d.ts.map +0 -1
  404. package/dist/lib/resolver.js.map +0 -1
  405. package/dist/lib/retry.d.ts.map +0 -1
  406. package/dist/lib/retry.js.map +0 -1
  407. package/dist/lib/rulesGen.d.ts.map +0 -1
  408. package/dist/lib/rulesGen.js.map +0 -1
  409. package/dist/lib/search.d.ts.map +0 -1
  410. package/dist/lib/search.js.map +0 -1
  411. package/dist/lib/setup/coldStart.d.ts.map +0 -1
  412. package/dist/lib/setup/coldStart.js.map +0 -1
  413. package/dist/lib/setup/configSetRender.d.ts.map +0 -1
  414. package/dist/lib/setup/configSetRender.js.map +0 -1
  415. package/dist/lib/setup/dreamRender.d.ts.map +0 -1
  416. package/dist/lib/setup/dreamRender.js.map +0 -1
  417. package/dist/lib/setup/dreamState.d.ts.map +0 -1
  418. package/dist/lib/setup/dreamState.js.map +0 -1
  419. package/dist/lib/setup/modelsRender.d.ts.map +0 -1
  420. package/dist/lib/setup/modelsRender.js.map +0 -1
  421. package/dist/lib/setup/remoteRender.d.ts.map +0 -1
  422. package/dist/lib/setup/remoteRender.js.map +0 -1
  423. package/dist/lib/setup/routingRender.d.ts.map +0 -1
  424. package/dist/lib/setup/routingRender.js.map +0 -1
  425. package/dist/lib/setup/sections/ides.d.ts.map +0 -1
  426. package/dist/lib/setup/sections/ides.js.map +0 -1
  427. package/dist/lib/setup/sections/preferences.d.ts.map +0 -1
  428. package/dist/lib/setup/sections/preferences.js.map +0 -1
  429. package/dist/lib/setup/sections/routing.d.ts.map +0 -1
  430. package/dist/lib/setup/sections/routing.js.map +0 -1
  431. package/dist/lib/setup/storePath.d.ts.map +0 -1
  432. package/dist/lib/setup/storePath.js.map +0 -1
  433. package/dist/lib/setup/summary.d.ts.map +0 -1
  434. package/dist/lib/setup/summary.js.map +0 -1
  435. package/dist/lib/setup/syncProjectsRender.d.ts.map +0 -1
  436. package/dist/lib/setup/syncProjectsRender.js.map +0 -1
  437. package/dist/lib/setup/ui/diff.d.ts.map +0 -1
  438. package/dist/lib/setup/ui/diff.js.map +0 -1
  439. package/dist/lib/setup/ui/footer.d.ts.map +0 -1
  440. package/dist/lib/setup/ui/footer.js.map +0 -1
  441. package/dist/lib/setup/ui/header.d.ts.map +0 -1
  442. package/dist/lib/setup/ui/header.js.map +0 -1
  443. package/dist/lib/setup/ui/index.d.ts.map +0 -1
  444. package/dist/lib/setup/ui/index.js.map +0 -1
  445. package/dist/lib/setup/ui/menu.d.ts.map +0 -1
  446. package/dist/lib/setup/ui/menu.js.map +0 -1
  447. package/dist/lib/setup/ui/panel.d.ts.map +0 -1
  448. package/dist/lib/setup/ui/panel.js.map +0 -1
  449. package/dist/lib/setup/ui/prompt.d.ts.map +0 -1
  450. package/dist/lib/setup/ui/prompt.js.map +0 -1
  451. package/dist/lib/setup/ui/safePrompt.d.ts.map +0 -1
  452. package/dist/lib/setup/ui/safePrompt.js.map +0 -1
  453. package/dist/lib/setup/ui/spinner.d.ts.map +0 -1
  454. package/dist/lib/setup/ui/spinner.js.map +0 -1
  455. package/dist/lib/setup/ui/status.d.ts.map +0 -1
  456. package/dist/lib/setup/ui/status.js.map +0 -1
  457. package/dist/lib/setup/ui/table.d.ts.map +0 -1
  458. package/dist/lib/setup/ui/table.js.map +0 -1
  459. package/dist/lib/setup/ui/title.d.ts.map +0 -1
  460. package/dist/lib/setup/ui/title.js.map +0 -1
  461. package/dist/lib/setup/ui/tokens.d.ts.map +0 -1
  462. package/dist/lib/setup/ui/tokens.js.map +0 -1
  463. package/dist/lib/setup.d.ts.map +0 -1
  464. package/dist/lib/setup.js.map +0 -1
  465. package/dist/lib/staticSearch.d.ts.map +0 -1
  466. package/dist/lib/staticSearch.js.map +0 -1
  467. package/dist/lib/store.d.ts.map +0 -1
  468. package/dist/lib/store.js.map +0 -1
  469. package/dist/lib/structuredIngest.d.ts.map +0 -1
  470. package/dist/lib/structuredIngest.js.map +0 -1
  471. package/dist/lib/tags.d.ts.map +0 -1
  472. package/dist/lib/tags.js.map +0 -1
  473. package/dist/lib/timeline.d.ts.map +0 -1
  474. package/dist/lib/timeline.js.map +0 -1
  475. package/dist/lib/trace.d.ts.map +0 -1
  476. package/dist/lib/trace.js.map +0 -1
  477. package/dist/lib/upgrade.d.ts.map +0 -1
  478. package/dist/lib/upgrade.js.map +0 -1
  479. package/dist/lib/videoExtract.d.ts.map +0 -1
  480. package/dist/lib/videoExtract.js.map +0 -1
  481. package/dist/lib/webIndex.d.ts.map +0 -1
  482. package/dist/lib/webIndex.js.map +0 -1
  483. package/dist/lib/webIngest.d.ts.map +0 -1
  484. package/dist/lib/webIngest.js.map +0 -1
  485. package/dist/lib/wikilinks.d.ts.map +0 -1
  486. package/dist/lib/wikilinks.js.map +0 -1
  487. package/dist/postinstall.d.ts.map +0 -1
  488. package/dist/postinstall.js.map +0 -1
  489. package/dist/sandbox/client.d.ts.map +0 -1
  490. package/dist/sandbox/client.js.map +0 -1
  491. package/dist/sandbox/helper-template.d.ts.map +0 -1
  492. package/dist/sandbox/helper-template.js.map +0 -1
  493. package/dist/sandbox/index.d.ts +0 -10
  494. package/dist/sandbox/index.d.ts.map +0 -1
  495. package/dist/sandbox/index.js +0 -10
  496. package/dist/sandbox/index.js.map +0 -1
  497. package/dist/sandbox/manager.d.ts.map +0 -1
  498. package/dist/sandbox/manager.js.map +0 -1
  499. package/dist/sandbox/server.d.ts.map +0 -1
  500. package/dist/sandbox/server.js.map +0 -1
package/dist/cli.js CHANGED
@@ -20,14 +20,15 @@ import { getGnosysHome } from "./lib/paths.js";
20
20
  import { GnosysSearch } from "./lib/search.js";
21
21
  import { GnosysTagRegistry } from "./lib/tags.js";
22
22
  import { applyLens } from "./lib/lensing.js";
23
- import { getFileHistory, rollbackToCommit, hasGitHistory, getFileDiff } from "./lib/history.js";
24
23
  import { computeStats } from "./lib/timeline.js";
25
24
  import { buildLinkGraph, getBacklinks, getOutgoingLinks, formatGraphSummary } from "./lib/wikilinks.js";
26
25
  import { loadConfig, generateConfigTemplate, DEFAULT_CONFIG, writeConfig, resolveTaskModel, ALL_PROVIDERS, getProviderModel } from "./lib/config.js";
27
26
  import { getLLMProvider, isProviderAvailable } from "./lib/llm.js";
28
27
  import { GnosysDB } from "./lib/db.js";
28
+ import { logError } from "./lib/log.js";
29
+ import { getSecureStorageSetupHint } from "./lib/platform.js";
29
30
  import { createProjectIdentity, readProjectIdentity, findProjectIdentity, migrateProject } from "./lib/projectIdentity.js";
30
- import { setPreference, getPreference, getAllPreferences, deletePreference } from "./lib/preferences.js";
31
+ import { setPreference, getPreference, getAllPreferences, deletePreference, KNOWN_PREFERENCE_KEYS, suggestPreferenceKey } from "./lib/preferences.js";
31
32
  import { syncToTarget } from "./lib/rulesGen.js";
32
33
  // Lazy-loaded inside action handlers (each ~200ms-2.5s on cold cache):
33
34
  // - ./lib/embeddings.js (@huggingface/transformers — 80MB)
@@ -209,6 +210,45 @@ program
209
210
  .description("Read a specific memory. Supports layer prefix (e.g., project:decisions/auth.md)")
210
211
  .option("--json", "Output as JSON")
211
212
  .action(async (memoryPath, opts) => {
213
+ const centralDb = GnosysDB.openCentral();
214
+ if (centralDb.isAvailable()) {
215
+ const dbMem = centralDb.getMemory(memoryPath);
216
+ if (dbMem) {
217
+ try {
218
+ const tags = dbMem.tags || "[]";
219
+ const headerLines = [
220
+ `---`,
221
+ `id: ${dbMem.id}`,
222
+ `title: '${dbMem.title}'`,
223
+ `category: ${dbMem.category}`,
224
+ `tags: ${tags}`,
225
+ `relevance: ${dbMem.relevance}`,
226
+ `author: ${dbMem.author}`,
227
+ `authority: ${dbMem.authority}`,
228
+ `confidence: ${dbMem.confidence}`,
229
+ `status: ${dbMem.status}`,
230
+ `tier: ${dbMem.tier}`,
231
+ `created: '${dbMem.created}'`,
232
+ `modified: '${dbMem.modified}'`,
233
+ ];
234
+ if (dbMem.source_file) {
235
+ headerLines.push(`source_file: ${dbMem.source_file}${dbMem.source_page != null ? ` (page ${Number(dbMem.source_page)})` : ""}`);
236
+ }
237
+ if (dbMem.source_path)
238
+ headerLines.push(`source_path: ${dbMem.source_path}`);
239
+ headerLines.push(`---`);
240
+ const raw = `[Source: gnosys.db]\n\n${headerLines.join("\n")}\n\n${dbMem.content}`;
241
+ outputResult(!!opts.json, { path: memoryPath, source: "gnosys.db", content: raw, memory: dbMem }, () => {
242
+ console.log(raw);
243
+ });
244
+ return;
245
+ }
246
+ finally {
247
+ centralDb.close();
248
+ }
249
+ }
250
+ }
251
+ centralDb.close();
212
252
  const resolver = await getResolver();
213
253
  const memory = await resolver.readMemory(memoryPath);
214
254
  if (!memory) {
@@ -262,7 +302,7 @@ program
262
302
  });
263
303
  }
264
304
  catch (err) {
265
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
305
+ logError(err, { module: "cli", op: "discover" });
266
306
  process.exit(1);
267
307
  }
268
308
  finally {
@@ -302,7 +342,7 @@ program
302
342
  });
303
343
  }
304
344
  catch (err) {
305
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
345
+ logError(err, { module: "cli", op: "discover" });
306
346
  process.exit(1);
307
347
  }
308
348
  finally {
@@ -354,7 +394,7 @@ program
354
394
  });
355
395
  }
356
396
  catch (err) {
357
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
397
+ logError(err, { module: "cli", op: "search" });
358
398
  process.exit(1);
359
399
  }
360
400
  finally {
@@ -393,7 +433,7 @@ program
393
433
  });
394
434
  }
395
435
  catch (err) {
396
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
436
+ logError(err, { module: "cli", op: "search" });
397
437
  process.exit(1);
398
438
  }
399
439
  finally {
@@ -468,7 +508,7 @@ program
468
508
  });
469
509
  }
470
510
  catch (err) {
471
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
511
+ logError(err, { module: "cli", op: "list" });
472
512
  process.exit(1);
473
513
  }
474
514
  finally {
@@ -1961,6 +2001,7 @@ program
1961
2001
  .option("--modified-after <date>", "Modified after ISO date")
1962
2002
  .option("--modified-before <date>", "Modified before ISO date")
1963
2003
  .option("--or", "Combine filters with OR instead of AND (default: AND)")
2004
+ .option("--json", "Output as JSON")
1964
2005
  .action(async (opts) => {
1965
2006
  const resolver = await getResolver();
1966
2007
  const allMemories = await resolver.getAllMemories();
@@ -1990,82 +2031,73 @@ program
1990
2031
  if (opts.modifiedBefore)
1991
2032
  lens.modifiedBefore = opts.modifiedBefore;
1992
2033
  const result = applyLens(allMemories, lens);
1993
- if (result.length === 0) {
1994
- console.log("No memories match the lens filter.");
1995
- return;
1996
- }
1997
- console.log(`${result.length} memories match:\n`);
1998
- for (const m of result) {
1999
- const src = m.sourceLabel || "";
2000
- console.log(` [${m.frontmatter.status}] ${m.frontmatter.title} (${m.frontmatter.confidence})`);
2001
- console.log(` ${src ? src + ":" : ""}${m.relativePath}`);
2002
- console.log();
2003
- }
2034
+ const items = result.map((m) => ({
2035
+ title: m.frontmatter.title,
2036
+ status: m.frontmatter.status,
2037
+ confidence: m.frontmatter.confidence,
2038
+ sourceLabel: m.sourceLabel || "",
2039
+ relativePath: m.relativePath,
2040
+ }));
2041
+ outputResult(!!opts.json, { count: items.length, items }, () => {
2042
+ if (result.length === 0) {
2043
+ console.log("No memories match the lens filter.");
2044
+ return;
2045
+ }
2046
+ console.log(`${result.length} memories match:\n`);
2047
+ for (const m of result) {
2048
+ const src = m.sourceLabel || "";
2049
+ console.log(` [${m.frontmatter.status}] ${m.frontmatter.title} (${m.frontmatter.confidence})`);
2050
+ console.log(` ${src ? src + ":" : ""}${m.relativePath}`);
2051
+ console.log();
2052
+ }
2053
+ });
2004
2054
  });
2005
2055
  // ─── gnosys history <path> ───────────────────────────────────────────────
2006
2056
  program
2007
2057
  .command("history <memoryPath>")
2008
- .description("Show version history for a memory (git-backed)")
2058
+ .description("Show audit history for a memory")
2009
2059
  .option("-n, --limit <number>", "Max entries", "20")
2010
- .option("--diff <hash>", "Show diff from this commit to current")
2060
+ .option("--json", "Output as JSON")
2011
2061
  .action(async (memPath, opts) => {
2012
- const resolver = await getResolver();
2013
- const memory = await resolver.readMemory(memPath);
2014
- if (!memory) {
2015
- console.error(`Memory not found: ${memPath}`);
2016
- process.exit(1);
2017
- }
2018
- const sourceStore = resolver.getStores().find((s) => s.label === memory.sourceLabel);
2019
- if (!sourceStore) {
2020
- console.error("Could not locate source store.");
2021
- process.exit(1);
2022
- }
2023
- if (!hasGitHistory(sourceStore.path)) {
2024
- console.error("No git history available for this store.");
2062
+ const centralDb = GnosysDB.openCentral();
2063
+ if (!centralDb.isAvailable()) {
2064
+ console.error("Central DB not available.");
2025
2065
  process.exit(1);
2026
2066
  }
2027
- if (opts.diff) {
2028
- const diff = getFileDiff(sourceStore.path, memory.relativePath, opts.diff, "HEAD");
2029
- if (!diff) {
2030
- console.error("Could not generate diff.");
2067
+ try {
2068
+ const dbMem = centralDb.getMemory(memPath);
2069
+ if (!dbMem) {
2070
+ console.error(`Memory not found: ${memPath}`);
2031
2071
  process.exit(1);
2032
2072
  }
2033
- console.log(diff);
2034
- return;
2035
- }
2036
- const history = getFileHistory(sourceStore.path, memory.relativePath, parseInt(opts.limit));
2037
- if (history.length === 0) {
2038
- console.log("No history found for this memory.");
2039
- return;
2040
- }
2041
- console.log(`History for ${memory.frontmatter.title}:\n`);
2042
- for (const entry of history) {
2043
- console.log(` ${entry.commitHash.substring(0, 7)} ${entry.date} ${entry.message}`);
2044
- }
2045
- });
2046
- // ─── gnosys rollback <path> <hash> ──────────────────────────────────────
2047
- program
2048
- .command("rollback <memoryPath> <commitHash>")
2049
- .description("Rollback a memory to its state at a specific commit")
2050
- .action(async (memPath, commitHash) => {
2051
- const resolver = await getResolver();
2052
- const memory = await resolver.readMemory(memPath);
2053
- if (!memory) {
2054
- console.error(`Memory not found: ${memPath}`);
2055
- process.exit(1);
2056
- }
2057
- const sourceStore = resolver.getStores().find((s) => s.label === memory.sourceLabel);
2058
- if (!sourceStore?.writable) {
2059
- console.error("Cannot rollback: store is read-only.");
2060
- process.exit(1);
2061
- }
2062
- const success = rollbackToCommit(sourceStore.path, memory.relativePath, commitHash);
2063
- if (success) {
2064
- console.log(`Rolled back ${memory.frontmatter.title} to commit ${commitHash.substring(0, 7)}.`);
2073
+ const limit = parseInt(opts.limit, 10) || 20;
2074
+ const audits = centralDb.getAuditLog(dbMem.id, limit);
2075
+ outputResult(!!opts.json, {
2076
+ memoryId: dbMem.id,
2077
+ title: dbMem.title,
2078
+ created: dbMem.created,
2079
+ modified: dbMem.modified,
2080
+ entries: audits,
2081
+ }, () => {
2082
+ if (audits.length === 0) {
2083
+ console.log(`Memory: ${dbMem.title} (${dbMem.id})`);
2084
+ console.log(`Created: ${dbMem.created}`);
2085
+ console.log(`Modified: ${dbMem.modified}`);
2086
+ console.log("No audit history recorded.");
2087
+ return;
2088
+ }
2089
+ console.log(`History for ${dbMem.title} (${dbMem.id}, ${audits.length} entries):\n`);
2090
+ console.log(`Created: ${dbMem.created}`);
2091
+ console.log(`Modified: ${dbMem.modified}\n`);
2092
+ for (const entry of audits) {
2093
+ const date = entry.timestamp.split("T")[0];
2094
+ const detail = entry.details ? ` (${entry.details})` : "";
2095
+ console.log(` ${date} ${entry.operation}${detail}`);
2096
+ }
2097
+ });
2065
2098
  }
2066
- else {
2067
- console.error(`Rollback failed. Check that the commit hash is valid.`);
2068
- process.exit(1);
2099
+ finally {
2100
+ centralDb.close();
2069
2101
  }
2070
2102
  });
2071
2103
  // ─── gnosys timeline ────────────────────────────────────────────────────
@@ -2075,6 +2107,7 @@ program
2075
2107
  .option("-p, --period <period>", "Group by: day, week, month (default), year", "month")
2076
2108
  .option("--project <id>", "Filter to a specific project ID (default: all projects)")
2077
2109
  .option("--limit-titles <n>", "Show titles inline when an entry has <= N memories (default 5)", "5")
2110
+ .option("--json", "Output as JSON")
2078
2111
  .action(async (opts) => {
2079
2112
  const { groupDbByPeriod } = await import("./lib/timeline.js");
2080
2113
  const centralDb = GnosysDB.openCentral();
@@ -2087,25 +2120,29 @@ program
2087
2120
  ? centralDb.getMemoriesByProject(opts.project)
2088
2121
  : centralDb.getActiveMemories();
2089
2122
  if (memories.length === 0) {
2090
- console.log("No memories found.");
2123
+ outputResult(!!opts.json, { period: opts.period, count: 0, entries: [] }, () => {
2124
+ console.log("No memories found.");
2125
+ });
2091
2126
  return;
2092
2127
  }
2093
2128
  const entries = groupDbByPeriod(memories, opts.period);
2094
2129
  const titleLimit = Math.max(0, parseInt(opts.limitTitles, 10) || 5);
2095
- console.log(`Knowledge Timeline (by ${opts.period}, ${memories.length} memories):\n`);
2096
- for (const entry of entries) {
2097
- const parts = [];
2098
- if (entry.created > 0)
2099
- parts.push(`${entry.created} created`);
2100
- if (entry.modified > 0)
2101
- parts.push(`${entry.modified} modified`);
2102
- console.log(` ${entry.period}: ${parts.join(", ")}`);
2103
- if (entry.titles.length > 0 && entry.titles.length <= titleLimit) {
2104
- for (const t of entry.titles) {
2105
- console.log(` + ${t}`);
2130
+ outputResult(!!opts.json, { period: opts.period, count: memories.length, entries }, () => {
2131
+ console.log(`Knowledge Timeline (by ${opts.period}, ${memories.length} memories):\n`);
2132
+ for (const entry of entries) {
2133
+ const parts = [];
2134
+ if (entry.created > 0)
2135
+ parts.push(`${entry.created} created`);
2136
+ if (entry.modified > 0)
2137
+ parts.push(`${entry.modified} modified`);
2138
+ console.log(` ${entry.period}: ${parts.join(", ")}`);
2139
+ if (entry.titles.length > 0 && entry.titles.length <= titleLimit) {
2140
+ for (const t of entry.titles) {
2141
+ console.log(` + ${t}`);
2142
+ }
2106
2143
  }
2107
2144
  }
2108
- }
2145
+ });
2109
2146
  }
2110
2147
  finally {
2111
2148
  centralDb.close();
@@ -2253,7 +2290,8 @@ program
2253
2290
  program
2254
2291
  .command("links <memoryPath>")
2255
2292
  .description("Show wikilinks for a memory — both outgoing [[links]] and backlinks from other memories")
2256
- .action(async (memPath) => {
2293
+ .option("--json", "Output as JSON")
2294
+ .action(async (memPath, opts) => {
2257
2295
  const resolver = await getResolver();
2258
2296
  const memory = await resolver.readMemory(memPath);
2259
2297
  if (!memory) {
@@ -2263,33 +2301,41 @@ program
2263
2301
  const allMemories = await resolver.getAllMemories();
2264
2302
  const outgoing = getOutgoingLinks(allMemories, memory.relativePath);
2265
2303
  const backlinks = getBacklinks(allMemories, memory.relativePath);
2266
- console.log(`Links for ${memory.frontmatter.title}:\n`);
2267
- if (outgoing.length > 0) {
2268
- console.log(` Outgoing (${outgoing.length}):`);
2269
- for (const link of outgoing) {
2270
- const display = link.displayText ? ` (${link.displayText})` : "";
2271
- console.log(` [[${link.target}]]${display}`);
2304
+ outputResult(!!opts.json, {
2305
+ memoryPath: memPath,
2306
+ title: memory.frontmatter.title,
2307
+ outgoing,
2308
+ backlinks,
2309
+ }, () => {
2310
+ console.log(`Links for ${memory.frontmatter.title}:\n`);
2311
+ if (outgoing.length > 0) {
2312
+ console.log(` Outgoing (${outgoing.length}):`);
2313
+ for (const link of outgoing) {
2314
+ const display = link.displayText ? ` (${link.displayText})` : "";
2315
+ console.log(` → [[${link.target}]]${display}`);
2316
+ }
2272
2317
  }
2273
- }
2274
- else {
2275
- console.log(" No outgoing links.");
2276
- }
2277
- console.log();
2278
- if (backlinks.length > 0) {
2279
- console.log(` Backlinks (${backlinks.length}):`);
2280
- for (const link of backlinks) {
2281
- console.log(` ← ${link.sourceTitle} (${link.sourcePath})`);
2318
+ else {
2319
+ console.log(" No outgoing links.");
2282
2320
  }
2283
- }
2284
- else {
2285
- console.log(" No backlinks.");
2286
- }
2321
+ console.log();
2322
+ if (backlinks.length > 0) {
2323
+ console.log(` Backlinks (${backlinks.length}):`);
2324
+ for (const link of backlinks) {
2325
+ console.log(` ← ${link.sourceTitle} (${link.sourcePath})`);
2326
+ }
2327
+ }
2328
+ else {
2329
+ console.log(" No backlinks.");
2330
+ }
2331
+ });
2287
2332
  });
2288
2333
  // ─── gnosys graph ───────────────────────────────────────────────────────
2289
2334
  program
2290
2335
  .command("graph")
2291
2336
  .description("Show the [[wikilink]] cross-reference graph between memories. Empty until you start using [[Title]] in memory content — then this shows which memories reference each other.")
2292
- .action(async () => {
2337
+ .option("--json", "Output as JSON")
2338
+ .action(async (opts) => {
2293
2339
  // v5.4.1: Query the central DB directly. Previously this used the
2294
2340
  // filesystem resolver, which returns nothing in v5.x DB-only mode
2295
2341
  // because memories no longer live as markdown files.
@@ -2302,7 +2348,9 @@ program
2302
2348
  }
2303
2349
  const dbMemories = centralDb.getAllMemories();
2304
2350
  if (dbMemories.length === 0) {
2305
- console.log("No memories found.");
2351
+ outputResult(!!opts.json, { totalLinks: 0, orphanedLinks: [], nodes: [] }, () => {
2352
+ console.log("No memories found.");
2353
+ });
2306
2354
  return;
2307
2355
  }
2308
2356
  // Adapt DbMemory → legacy Memory shape that buildLinkGraph expects.
@@ -2339,7 +2387,13 @@ program
2339
2387
  };
2340
2388
  });
2341
2389
  const graph = buildLinkGraph(adapted);
2342
- console.log(formatGraphSummary(graph));
2390
+ outputResult(!!opts.json, {
2391
+ totalLinks: graph.totalLinks,
2392
+ orphanedLinks: graph.orphanedLinks,
2393
+ nodes: Array.from(graph.nodes.values()),
2394
+ }, () => {
2395
+ console.log(formatGraphSummary(graph));
2396
+ });
2343
2397
  }
2344
2398
  finally {
2345
2399
  centralDb?.close();
@@ -2689,6 +2743,7 @@ program
2689
2743
  .command("semantic-search <query>")
2690
2744
  .description("Search using semantic similarity only (requires embeddings)")
2691
2745
  .option("-l, --limit <n>", "Max results", "15")
2746
+ .option("--json", "Output as JSON")
2692
2747
  .action(async (query, opts) => {
2693
2748
  const resolver = await getResolver();
2694
2749
  const stores = resolver.getStores();
@@ -2707,10 +2762,20 @@ program
2707
2762
  const embeddings = new GnosysEmbeddings(storePath);
2708
2763
  const hybridSearch = new GnosysHybridSearch(search, embeddings, resolver, storePath);
2709
2764
  const results = await hybridSearch.hybridSearch(query, parseInt(opts.limit), "semantic");
2710
- if (results.length === 0) {
2711
- console.log(`No semantic results for "${query}". Run gnosys reindex first.`);
2712
- }
2713
- else {
2765
+ outputResult(!!opts.json, {
2766
+ query,
2767
+ count: results.length,
2768
+ results: results.map((r) => ({
2769
+ title: r.title,
2770
+ relativePath: r.relativePath,
2771
+ score: r.score,
2772
+ snippet: r.snippet,
2773
+ })),
2774
+ }, () => {
2775
+ if (results.length === 0) {
2776
+ console.log(`No semantic results for "${query}". Run gnosys reindex first.`);
2777
+ return;
2778
+ }
2714
2779
  console.log(`Found ${results.length} semantic results for "${query}":\n`);
2715
2780
  for (const r of results) {
2716
2781
  console.log(` ${r.title}`);
@@ -2718,7 +2783,7 @@ program
2718
2783
  console.log(` Similarity: ${r.score.toFixed(4)}`);
2719
2784
  console.log(` ${r.snippet.substring(0, 120)}...\n`);
2720
2785
  }
2721
- }
2786
+ });
2722
2787
  search.close();
2723
2788
  embeddings.close();
2724
2789
  });
@@ -2732,6 +2797,7 @@ program
2732
2797
  .option("--federated", "Use federated search with tier boosting (project > user > global)")
2733
2798
  .option("--scope <scope>", "Filter by scope: project, user, global (comma-separated)")
2734
2799
  .option("-d, --directory <dir>", "Project directory for context")
2800
+ .option("--json", "Output as JSON")
2735
2801
  .action(async (question, opts) => {
2736
2802
  const resolver = await getResolver();
2737
2803
  const stores = resolver.getStores();
@@ -2771,7 +2837,7 @@ program
2771
2837
  const envVar = envVarMap[providerName];
2772
2838
  if (envVar) {
2773
2839
  console.error(`No LLM provider available. Configured default is "${providerName}" but its key wasn't found. ` +
2774
- `Set ${envVar}, run 'gnosys setup' to store one in the macOS Keychain, or add llm.${providerName}.apiKey to gnosys.json.`);
2840
+ `Set ${envVar}, run 'gnosys setup' to store one in ${getSecureStorageSetupHint()}, or add llm.${providerName}.apiKey to gnosys.json.`);
2775
2841
  }
2776
2842
  else {
2777
2843
  console.error(`No LLM provider available. Provider "${providerName}" is not reachable. Run 'gnosys setup' to configure one.`);
@@ -2808,7 +2874,7 @@ program
2808
2874
  }
2809
2875
  }
2810
2876
  const mode = opts.mode;
2811
- const useStream = opts.stream !== false;
2877
+ const useStream = opts.stream !== false && !opts.json;
2812
2878
  try {
2813
2879
  const result = await ask.ask(question, {
2814
2880
  limit: parseInt(opts.limit),
@@ -2827,25 +2893,35 @@ program
2827
2893
  }
2828
2894
  : undefined,
2829
2895
  });
2830
- if (!useStream) {
2831
- console.log(result.answer);
2832
- }
2833
- // Print sources
2834
- if (result.sources.length > 0) {
2835
- console.log("\n\n--- Sources ---");
2836
- for (const s of result.sources) {
2837
- console.log(` [[${s.relativePath.split("/").pop()}]] ${s.title}`);
2896
+ outputResult(!!opts.json, {
2897
+ question,
2898
+ answer: result.answer,
2899
+ sources: result.sources.map((s) => ({
2900
+ title: s.title,
2901
+ relativePath: s.relativePath,
2902
+ })),
2903
+ deepQueryUsed: result.deepQueryUsed ?? false,
2904
+ }, () => {
2905
+ if (!useStream) {
2906
+ console.log(result.answer);
2907
+ }
2908
+ if (result.sources.length > 0) {
2909
+ console.log("\n\n--- Sources ---");
2910
+ for (const s of result.sources) {
2911
+ console.log(` [[${s.relativePath.split("/").pop()}]] — ${s.title}`);
2912
+ }
2913
+ }
2914
+ if (result.deepQueryUsed) {
2915
+ console.log("\n(Deep query was used — a follow-up search expanded the context)");
2838
2916
  }
2839
- // Reinforce used memories (best-effort)
2917
+ });
2918
+ if (result.sources.length > 0) {
2840
2919
  const writeTarget = resolver.getWriteTarget();
2841
2920
  if (writeTarget) {
2842
2921
  const { GnosysMaintenanceEngine } = await import("./lib/maintenance.js");
2843
2922
  await GnosysMaintenanceEngine.reinforceBatch(writeTarget.store, result.sources.map((s) => s.relativePath)).catch(() => { });
2844
2923
  }
2845
2924
  }
2846
- if (result.deepQueryUsed) {
2847
- console.log("\n(Deep query was used — a follow-up search expanded the context)");
2848
- }
2849
2925
  }
2850
2926
  catch (err) {
2851
2927
  console.error(`Ask failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -3254,7 +3330,7 @@ program
3254
3330
  }
3255
3331
  const archive = new GnosysArchive(writeTarget.path);
3256
3332
  if (!archive.isAvailable()) {
3257
- console.error("Archive not available. Is better-sqlite3 installed?");
3333
+ console.error("Archive not available. Install it with: npm install better-sqlite3");
3258
3334
  process.exit(1);
3259
3335
  }
3260
3336
  const results = archive.searchArchive(query, parseInt(opts.limit));
@@ -3598,20 +3674,27 @@ program
3598
3674
  // global binary (see src/lib/upgrade.ts).
3599
3675
  program
3600
3676
  .command("upgrade")
3601
- .description("Upgrade gnosys itself (npm install -g gnosys@latest) and signal running MCP servers to restart. After upgrading, suggests running 'gnosys setup sync-projects'.")
3677
+ .description("Upgrade gnosys itself and signal running MCP servers to restart. After upgrading, suggests running 'gnosys setup sync-projects'.")
3602
3678
  .option("--yes", "Skip the post-upgrade sync-projects prompt and exit")
3603
3679
  .option("--no-sync", "Don't suggest running sync-projects afterward")
3604
3680
  .action(async (opts) => {
3605
3681
  const currentVersion = pkg.version;
3606
3682
  console.log(`Gnosys CLI: currently v${currentVersion}`);
3607
- console.log(`Running: npm install -g gnosys@latest ...`);
3683
+ const { detectPackageManager, upgradeCommand } = await import("./lib/packageManager.js");
3684
+ const pm = detectPackageManager();
3685
+ const cmd = upgradeCommand(pm);
3686
+ if (!cmd) {
3687
+ console.log("Running under npx — there's no global install to upgrade. Use `npx gnosys@latest` to run the latest.");
3688
+ return;
3689
+ }
3690
+ console.log(`Running: ${cmd} ...`);
3608
3691
  const { execSync } = await import("child_process");
3609
3692
  try {
3610
- execSync("npm install -g gnosys@latest", { stdio: "inherit" });
3693
+ execSync(cmd, { stdio: "inherit" });
3611
3694
  }
3612
3695
  catch (err) {
3613
3696
  console.error(`\nUpgrade failed: ${err instanceof Error ? err.message : err}`);
3614
- console.error(`Try running 'npm install -g gnosys@latest' manually.`);
3697
+ console.error(`Try running '${cmd}' manually.`);
3615
3698
  process.exit(1);
3616
3699
  }
3617
3700
  // Read the newly-installed version (best-effort — we may still be the
@@ -3898,6 +3981,7 @@ async function isLegacyStoreSafeToRemove(localDbPath) {
3898
3981
  try {
3899
3982
  const Database = (await import("better-sqlite3")).default;
3900
3983
  const localDb = new Database(localDbPath, { readonly: true });
3984
+ localDb.pragma("busy_timeout = 5000");
3901
3985
  let localIds = [];
3902
3986
  try {
3903
3987
  const rows = localDb.prepare("SELECT id FROM memories").all();
@@ -4322,6 +4406,9 @@ exportCmd
4322
4406
  const ratio = (result.compressedBytes / result.uncompressedBytes * 100).toFixed(1);
4323
4407
  console.log(`Exported project ${projectId}`);
4324
4408
  console.log(` Memories: ${result.memoryCount}`);
4409
+ if (result.archivedExcluded > 0) {
4410
+ console.log(` Archived: ${result.archivedExcluded} excluded — re-run with --include-archived for a full backup`);
4411
+ }
4325
4412
  console.log(` Relationships: ${result.relationshipCount}`);
4326
4413
  console.log(` Audit entries: ${result.auditEntryCount}`);
4327
4414
  console.log(` Bundle: ${result.outputPath}`);
@@ -4337,7 +4424,18 @@ program
4337
4424
  .command("serve")
4338
4425
  .description("Start the MCP server (stdio mode). Used by IDE integrations — Claude Code/Desktop, Cursor, Codex, etc. spawn this command in the background to talk to gnosys via the Model Context Protocol. You don't normally invoke this yourself; `gnosys init <ide>` wires it into the IDE config.")
4339
4426
  .option("--with-maintenance", "Run maintenance every 6 hours in background")
4427
+ .option("--transport <mode>", "Transport: 'stdio' (default) or 'http' (central-server topology)", "stdio")
4428
+ .option("--host <addr>", "HTTP bind address — http transport (default 127.0.0.1; use a tailnet addr to share)", "127.0.0.1")
4429
+ .option("--port <n>", "HTTP port — http transport", "7777")
4430
+ .option("--token <token>", "Require 'Authorization: Bearer <token>' — http transport")
4340
4431
  .action(async (opts) => {
4432
+ if (opts.transport === "http") {
4433
+ process.env.GNOSYS_TRANSPORT = "http";
4434
+ process.env.GNOSYS_HTTP_HOST = opts.host || "127.0.0.1";
4435
+ process.env.GNOSYS_HTTP_PORT = String(opts.port || "7777");
4436
+ if (opts.token)
4437
+ process.env.GNOSYS_SERVE_TOKEN = opts.token;
4438
+ }
4341
4439
  if (opts.withMaintenance) {
4342
4440
  // Start background maintenance loop
4343
4441
  const SIX_HOURS = 6 * 60 * 60 * 1000;
@@ -4363,7 +4461,8 @@ program
4363
4461
  setInterval(runMaintenance, SIX_HOURS);
4364
4462
  console.error("[maintenance] Background maintenance enabled (every 6 hours)");
4365
4463
  }
4366
- await import("./index.js");
4464
+ const { startMcpServer } = await import("./index.js");
4465
+ await startMcpServer();
4367
4466
  });
4368
4467
  // ─── gnosys recall ───────────────────────────────────────────────────────
4369
4468
  program
@@ -4715,6 +4814,55 @@ program
4715
4814
  function isDeadProjectDir(dir) {
4716
4815
  return !existsSync(dir);
4717
4816
  }
4817
+ program
4818
+ .command("connect")
4819
+ .description("Point an IDE at a remote gnosys server (central-server topology) instead of spawning a local one")
4820
+ .requiredOption("--url <url>", "Remote MCP URL, e.g. http://studio.tailnet.ts.net:7777/mcp")
4821
+ .option("--token <token>", "Bearer token if the server requires auth")
4822
+ .option("--ide <ide>", "IDE config to write: cursor | claude-desktop", "cursor")
4823
+ .option("--dir <dir>", "Project dir for cursor config (default: cwd)")
4824
+ .option("--print", "Print the config snippet instead of writing files")
4825
+ .action(async (opts) => {
4826
+ const m = await import("./lib/mcpClientConfig.js");
4827
+ const remote = { url: opts.url, token: opts.token };
4828
+ if (opts.print) {
4829
+ console.log(JSON.stringify({ mcpServers: { gnosys: m.remoteMcpEntry(remote) } }, null, 2));
4830
+ return;
4831
+ }
4832
+ const ide = opts.ide === "claude-desktop" ? "claude-desktop" : "cursor";
4833
+ try {
4834
+ const file = await m.writeRemoteClientConfig(ide, opts.dir || process.cwd(), remote);
4835
+ console.log(`✓ Pointed ${ide} at ${opts.url}`);
4836
+ console.log(` wrote: ${file}${opts.token ? " (bearer token included)" : ""}`);
4837
+ console.log(" Restart the IDE / MCP servers to pick it up.");
4838
+ }
4839
+ catch (e) {
4840
+ console.error(`connect failed: ${e instanceof Error ? e.message : e}`);
4841
+ process.exit(1);
4842
+ }
4843
+ });
4844
+ program
4845
+ .command("centralize")
4846
+ .description("Copy this machine's local brain (~/.gnosys/gnosys.db) to seed a central server — a Docker volume or another host")
4847
+ .requiredOption("--to <dir>", "Target directory to write gnosys.db into (e.g. a mounted volume)")
4848
+ .option("--from-local", "Source is this machine's local brain (default)")
4849
+ .option("--force", "Overwrite an existing gnosys.db at the target")
4850
+ .action(async (opts) => {
4851
+ const { centralizeDb } = await import("./lib/centralize.js");
4852
+ try {
4853
+ const r = await centralizeDb({ to: opts.to, force: opts.force });
4854
+ const mb = (r.bytes / 1024 / 1024).toFixed(1);
4855
+ console.log("✓ Seeded central brain:");
4856
+ console.log(` from: ${r.source}`);
4857
+ console.log(` to: ${r.target} (${mb} MB)`);
4858
+ console.log("");
4859
+ console.log(`Run the server against it with GNOSYS_HOME=${opts.to}, or mount this dir as the container's /data volume.`);
4860
+ }
4861
+ catch (e) {
4862
+ console.error(`centralize failed: ${e instanceof Error ? e.message : e}`);
4863
+ process.exit(1);
4864
+ }
4865
+ });
4718
4866
  const machineCmd = program
4719
4867
  .command("machine")
4720
4868
  .description("Manage this machine's local config (machine.json: machineId, roots, remote)");
@@ -4954,6 +5102,13 @@ prefCmd
4954
5102
  console.error("Central DB not available (better-sqlite3 missing).");
4955
5103
  process.exit(1);
4956
5104
  }
5105
+ if (!KNOWN_PREFERENCE_KEYS.includes(key)) {
5106
+ const suggestion = suggestPreferenceKey(key);
5107
+ if (suggestion) {
5108
+ console.error(`Unknown preference key \`${key}\` — did you mean \`${suggestion}\`?`);
5109
+ process.exit(1);
5110
+ }
5111
+ }
4957
5112
  const tags = opts.tags ? opts.tags.split(",").map((t) => t.trim()) : undefined;
4958
5113
  const pref = setPreference(centralDb, key, value, { title: opts.title, tags });
4959
5114
  console.log(`Preference set: ${pref.title}`);
@@ -5394,8 +5549,8 @@ program
5394
5549
  const dashboardPath = path.join(home, "gnosys-dashboard.html");
5395
5550
  const { writeFileSync } = await import("fs");
5396
5551
  writeFileSync(dashboardPath, generatePortfolioHtml(report, dashboardPath), "utf-8");
5397
- const { exec } = await import("child_process");
5398
- exec(`open "${dashboardPath}"`);
5552
+ const { execFile } = await import("child_process");
5553
+ execFile("open", [dashboardPath]);
5399
5554
  console.log(`Dashboard opened: ${dashboardPath}`);
5400
5555
  return;
5401
5556
  }
@@ -5729,7 +5884,7 @@ program
5729
5884
  const dbDir = GnosysDB.getCentralDbDir();
5730
5885
  const db = new GnosysDB(dbDir);
5731
5886
  if (!db.isAvailable()) {
5732
- console.error("Error: GnosysDB not available. Is better-sqlite3 installed?");
5887
+ console.error("Error: GnosysDB not available. Install it with: npm install better-sqlite3");
5733
5888
  process.exit(1);
5734
5889
  }
5735
5890
  const result = traceCodebase(db, directory, {
@@ -5774,7 +5929,7 @@ program
5774
5929
  const dbDir = GnosysDB.getCentralDbDir();
5775
5930
  const db = new GnosysDB(dbDir);
5776
5931
  if (!db.isAvailable()) {
5777
- console.error("Error: GnosysDB not available. Is better-sqlite3 installed?");
5932
+ console.error("Error: GnosysDB not available. Install it with: npm install better-sqlite3");
5778
5933
  process.exit(1);
5779
5934
  }
5780
5935
  const params = {
@@ -5834,7 +5989,7 @@ program
5834
5989
  const dbDir = GnosysDB.getCentralDbDir();
5835
5990
  const db = new GnosysDB(dbDir);
5836
5991
  if (!db.isAvailable()) {
5837
- console.error("Error: GnosysDB not available. Is better-sqlite3 installed?");
5992
+ console.error("Error: GnosysDB not available. Install it with: npm install better-sqlite3");
5838
5993
  process.exit(1);
5839
5994
  }
5840
5995
  const params = {
@@ -6571,4 +6726,3 @@ if (!isTestEnv()) {
6571
6726
  }
6572
6727
  }
6573
6728
  program.parse();
6574
- //# sourceMappingURL=cli.js.map