hoolix 0.0.1-beta.19

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 (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/STABILITY.md +109 -0
  4. package/bin/hoolix.js +50 -0
  5. package/bin/mcp-portal.js +12 -0
  6. package/bin/postinstall.js +61 -0
  7. package/dist/app/contracts.d.ts +105 -0
  8. package/dist/app/contracts.d.ts.map +1 -0
  9. package/dist/app/contracts.js +2 -0
  10. package/dist/app/contracts.js.map +1 -0
  11. package/dist/app/events.d.ts +13 -0
  12. package/dist/app/events.d.ts.map +1 -0
  13. package/dist/app/events.js +13 -0
  14. package/dist/app/events.js.map +1 -0
  15. package/dist/app/services/analytics.d.ts +42 -0
  16. package/dist/app/services/analytics.d.ts.map +1 -0
  17. package/dist/app/services/analytics.js +106 -0
  18. package/dist/app/services/analytics.js.map +1 -0
  19. package/dist/app/services/catalog.d.ts +14 -0
  20. package/dist/app/services/catalog.d.ts.map +1 -0
  21. package/dist/app/services/catalog.js +26 -0
  22. package/dist/app/services/catalog.js.map +1 -0
  23. package/dist/app/services/credentials.d.ts +42 -0
  24. package/dist/app/services/credentials.d.ts.map +1 -0
  25. package/dist/app/services/credentials.js +143 -0
  26. package/dist/app/services/credentials.js.map +1 -0
  27. package/dist/app/services/servers.d.ts +15 -0
  28. package/dist/app/services/servers.d.ts.map +1 -0
  29. package/dist/app/services/servers.js +445 -0
  30. package/dist/app/services/servers.js.map +1 -0
  31. package/dist/catalog/community.d.ts +19 -0
  32. package/dist/catalog/community.d.ts.map +1 -0
  33. package/dist/catalog/community.js +53 -0
  34. package/dist/catalog/community.js.map +1 -0
  35. package/dist/catalog/templates.d.ts +436 -0
  36. package/dist/catalog/templates.d.ts.map +1 -0
  37. package/dist/catalog/templates.js +489 -0
  38. package/dist/catalog/templates.js.map +1 -0
  39. package/dist/commands/audit.d.ts +2 -0
  40. package/dist/commands/audit.d.ts.map +1 -0
  41. package/dist/commands/audit.js +122 -0
  42. package/dist/commands/audit.js.map +1 -0
  43. package/dist/commands/bundle.d.ts +11 -0
  44. package/dist/commands/bundle.d.ts.map +1 -0
  45. package/dist/commands/bundle.js +299 -0
  46. package/dist/commands/bundle.js.map +1 -0
  47. package/dist/commands/clients.d.ts +6 -0
  48. package/dist/commands/clients.d.ts.map +1 -0
  49. package/dist/commands/clients.js +242 -0
  50. package/dist/commands/clients.js.map +1 -0
  51. package/dist/commands/completion.d.ts +18 -0
  52. package/dist/commands/completion.d.ts.map +1 -0
  53. package/dist/commands/completion.js +495 -0
  54. package/dist/commands/completion.js.map +1 -0
  55. package/dist/commands/connect.d.ts +10 -0
  56. package/dist/commands/connect.d.ts.map +1 -0
  57. package/dist/commands/connect.js +463 -0
  58. package/dist/commands/connect.js.map +1 -0
  59. package/dist/commands/create.d.ts +2 -0
  60. package/dist/commands/create.d.ts.map +1 -0
  61. package/dist/commands/create.js +607 -0
  62. package/dist/commands/create.js.map +1 -0
  63. package/dist/commands/delete.d.ts +2 -0
  64. package/dist/commands/delete.d.ts.map +1 -0
  65. package/dist/commands/delete.js +44 -0
  66. package/dist/commands/delete.js.map +1 -0
  67. package/dist/commands/doctor.d.ts +2 -0
  68. package/dist/commands/doctor.d.ts.map +1 -0
  69. package/dist/commands/doctor.js +259 -0
  70. package/dist/commands/doctor.js.map +1 -0
  71. package/dist/commands/export.d.ts +2 -0
  72. package/dist/commands/export.d.ts.map +1 -0
  73. package/dist/commands/export.js +93 -0
  74. package/dist/commands/export.js.map +1 -0
  75. package/dist/commands/gui.d.ts +2 -0
  76. package/dist/commands/gui.d.ts.map +1 -0
  77. package/dist/commands/gui.js +19 -0
  78. package/dist/commands/gui.js.map +1 -0
  79. package/dist/commands/import.d.ts +2 -0
  80. package/dist/commands/import.d.ts.map +1 -0
  81. package/dist/commands/import.js +102 -0
  82. package/dist/commands/import.js.map +1 -0
  83. package/dist/commands/info.d.ts +2 -0
  84. package/dist/commands/info.d.ts.map +1 -0
  85. package/dist/commands/info.js +151 -0
  86. package/dist/commands/info.js.map +1 -0
  87. package/dist/commands/list.d.ts +2 -0
  88. package/dist/commands/list.d.ts.map +1 -0
  89. package/dist/commands/list.js +90 -0
  90. package/dist/commands/list.js.map +1 -0
  91. package/dist/commands/reindex.d.ts +2 -0
  92. package/dist/commands/reindex.d.ts.map +1 -0
  93. package/dist/commands/reindex.js +186 -0
  94. package/dist/commands/reindex.js.map +1 -0
  95. package/dist/commands/rotate.d.ts +2 -0
  96. package/dist/commands/rotate.d.ts.map +1 -0
  97. package/dist/commands/rotate.js +67 -0
  98. package/dist/commands/rotate.js.map +1 -0
  99. package/dist/commands/secrets.d.ts +10 -0
  100. package/dist/commands/secrets.d.ts.map +1 -0
  101. package/dist/commands/secrets.js +293 -0
  102. package/dist/commands/secrets.js.map +1 -0
  103. package/dist/commands/start.d.ts +2 -0
  104. package/dist/commands/start.d.ts.map +1 -0
  105. package/dist/commands/start.js +234 -0
  106. package/dist/commands/start.js.map +1 -0
  107. package/dist/commands/stats.d.ts +2 -0
  108. package/dist/commands/stats.d.ts.map +1 -0
  109. package/dist/commands/stats.js +220 -0
  110. package/dist/commands/stats.js.map +1 -0
  111. package/dist/commands/stop.d.ts +2 -0
  112. package/dist/commands/stop.d.ts.map +1 -0
  113. package/dist/commands/stop.js +24 -0
  114. package/dist/commands/stop.js.map +1 -0
  115. package/dist/commands/templates.d.ts +2 -0
  116. package/dist/commands/templates.d.ts.map +1 -0
  117. package/dist/commands/templates.js +168 -0
  118. package/dist/commands/templates.js.map +1 -0
  119. package/dist/commands/trial.d.ts +2 -0
  120. package/dist/commands/trial.d.ts.map +1 -0
  121. package/dist/commands/trial.js +61 -0
  122. package/dist/commands/trial.js.map +1 -0
  123. package/dist/commands/uninstall.d.ts +2 -0
  124. package/dist/commands/uninstall.d.ts.map +1 -0
  125. package/dist/commands/uninstall.js +114 -0
  126. package/dist/commands/uninstall.js.map +1 -0
  127. package/dist/commands/update.d.ts +2 -0
  128. package/dist/commands/update.d.ts.map +1 -0
  129. package/dist/commands/update.js +104 -0
  130. package/dist/commands/update.js.map +1 -0
  131. package/dist/commands/verify.d.ts +2 -0
  132. package/dist/commands/verify.d.ts.map +1 -0
  133. package/dist/commands/verify.js +301 -0
  134. package/dist/commands/verify.js.map +1 -0
  135. package/dist/core/config.d.ts +25 -0
  136. package/dist/core/config.d.ts.map +1 -0
  137. package/dist/core/config.js +54 -0
  138. package/dist/core/config.js.map +1 -0
  139. package/dist/core/errors.d.ts +25 -0
  140. package/dist/core/errors.d.ts.map +1 -0
  141. package/dist/core/errors.js +53 -0
  142. package/dist/core/errors.js.map +1 -0
  143. package/dist/core/logger.d.ts +3 -0
  144. package/dist/core/logger.d.ts.map +1 -0
  145. package/dist/core/logger.js +12 -0
  146. package/dist/core/logger.js.map +1 -0
  147. package/dist/core/paths.d.ts +15 -0
  148. package/dist/core/paths.d.ts.map +1 -0
  149. package/dist/core/paths.js +51 -0
  150. package/dist/core/paths.js.map +1 -0
  151. package/dist/core/registry.d.ts +474 -0
  152. package/dist/core/registry.d.ts.map +1 -0
  153. package/dist/core/registry.js +186 -0
  154. package/dist/core/registry.js.map +1 -0
  155. package/dist/core/updater.d.ts +16 -0
  156. package/dist/core/updater.d.ts.map +1 -0
  157. package/dist/core/updater.js +317 -0
  158. package/dist/core/updater.js.map +1 -0
  159. package/dist/core/version.d.ts +2 -0
  160. package/dist/core/version.d.ts.map +1 -0
  161. package/dist/core/version.js +3 -0
  162. package/dist/core/version.js.map +1 -0
  163. package/dist/index.d.ts +13 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +270 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/ingestion/chunker.d.ts +13 -0
  168. package/dist/ingestion/chunker.d.ts.map +1 -0
  169. package/dist/ingestion/chunker.js +107 -0
  170. package/dist/ingestion/chunker.js.map +1 -0
  171. package/dist/ingestion/cleaners.d.ts +10 -0
  172. package/dist/ingestion/cleaners.d.ts.map +1 -0
  173. package/dist/ingestion/cleaners.js +61 -0
  174. package/dist/ingestion/cleaners.js.map +1 -0
  175. package/dist/ingestion/detectors.d.ts +5 -0
  176. package/dist/ingestion/detectors.d.ts.map +1 -0
  177. package/dist/ingestion/detectors.js +25 -0
  178. package/dist/ingestion/detectors.js.map +1 -0
  179. package/dist/ingestion/fetchers.d.ts +38 -0
  180. package/dist/ingestion/fetchers.d.ts.map +1 -0
  181. package/dist/ingestion/fetchers.js +296 -0
  182. package/dist/ingestion/fetchers.js.map +1 -0
  183. package/dist/ingestion/github.d.ts +60 -0
  184. package/dist/ingestion/github.d.ts.map +1 -0
  185. package/dist/ingestion/github.js +314 -0
  186. package/dist/ingestion/github.js.map +1 -0
  187. package/dist/ingestion/pipeline.d.ts +3 -0
  188. package/dist/ingestion/pipeline.d.ts.map +1 -0
  189. package/dist/ingestion/pipeline.js +160 -0
  190. package/dist/ingestion/pipeline.js.map +1 -0
  191. package/dist/ingestion/types.d.ts +51 -0
  192. package/dist/ingestion/types.d.ts.map +1 -0
  193. package/dist/ingestion/types.js +2 -0
  194. package/dist/ingestion/types.js.map +1 -0
  195. package/dist/lib/auth.d.ts +2 -0
  196. package/dist/lib/auth.d.ts.map +1 -0
  197. package/dist/lib/auth.js +6 -0
  198. package/dist/lib/auth.js.map +1 -0
  199. package/dist/lib/embedding.d.ts +10 -0
  200. package/dist/lib/embedding.d.ts.map +1 -0
  201. package/dist/lib/embedding.js +21 -0
  202. package/dist/lib/embedding.js.map +1 -0
  203. package/dist/mcp/host.d.ts +16 -0
  204. package/dist/mcp/host.d.ts.map +1 -0
  205. package/dist/mcp/host.js +307 -0
  206. package/dist/mcp/host.js.map +1 -0
  207. package/dist/mcp/proxy-host.d.ts +25 -0
  208. package/dist/mcp/proxy-host.d.ts.map +1 -0
  209. package/dist/mcp/proxy-host.js +393 -0
  210. package/dist/mcp/proxy-host.js.map +1 -0
  211. package/dist/mcp/stdio-host.d.ts +19 -0
  212. package/dist/mcp/stdio-host.d.ts.map +1 -0
  213. package/dist/mcp/stdio-host.js +175 -0
  214. package/dist/mcp/stdio-host.js.map +1 -0
  215. package/dist/process/manager.d.ts +74 -0
  216. package/dist/process/manager.d.ts.map +1 -0
  217. package/dist/process/manager.js +322 -0
  218. package/dist/process/manager.js.map +1 -0
  219. package/dist/rag/models.d.ts +30 -0
  220. package/dist/rag/models.d.ts.map +1 -0
  221. package/dist/rag/models.js +30 -0
  222. package/dist/rag/models.js.map +1 -0
  223. package/dist/rag/store.d.ts +63 -0
  224. package/dist/rag/store.d.ts.map +1 -0
  225. package/dist/rag/store.js +505 -0
  226. package/dist/rag/store.js.map +1 -0
  227. package/dist/rag/types.d.ts +56 -0
  228. package/dist/rag/types.d.ts.map +1 -0
  229. package/dist/rag/types.js +2 -0
  230. package/dist/rag/types.js.map +1 -0
  231. package/dist/sources/plugins.d.ts +25 -0
  232. package/dist/sources/plugins.d.ts.map +1 -0
  233. package/dist/sources/plugins.js +55 -0
  234. package/dist/sources/plugins.js.map +1 -0
  235. package/dist/sources/registry.d.ts +19 -0
  236. package/dist/sources/registry.d.ts.map +1 -0
  237. package/dist/sources/registry.js +183 -0
  238. package/dist/sources/registry.js.map +1 -0
  239. package/dist/sources/types.d.ts +361 -0
  240. package/dist/sources/types.d.ts.map +1 -0
  241. package/dist/sources/types.js +59 -0
  242. package/dist/sources/types.js.map +1 -0
  243. package/dist/tui/index.d.ts +22 -0
  244. package/dist/tui/index.d.ts.map +1 -0
  245. package/dist/tui/index.js +711 -0
  246. package/dist/tui/index.js.map +1 -0
  247. package/dist/ui/format.d.ts +27 -0
  248. package/dist/ui/format.d.ts.map +1 -0
  249. package/dist/ui/format.js +80 -0
  250. package/dist/ui/format.js.map +1 -0
  251. package/dist/ui/help.d.ts +2 -0
  252. package/dist/ui/help.d.ts.map +1 -0
  253. package/dist/ui/help.js +106 -0
  254. package/dist/ui/help.js.map +1 -0
  255. package/dist/web/assets.d.ts +2 -0
  256. package/dist/web/assets.d.ts.map +1 -0
  257. package/dist/web/assets.js +659 -0
  258. package/dist/web/assets.js.map +1 -0
  259. package/dist/web/server.d.ts +9 -0
  260. package/dist/web/server.d.ts.map +1 -0
  261. package/dist/web/server.js +349 -0
  262. package/dist/web/server.js.map +1 -0
  263. package/package.json +105 -0
@@ -0,0 +1,114 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { spawn, execSync } from 'node:child_process';
4
+ import { confirm, isCancel, cancel } from '@clack/prompts';
5
+ import { listServers, deleteServer } from '../core/registry.js';
6
+ import { serverManager } from '../process/manager.js';
7
+ import { getPaths } from '../core/paths.js';
8
+ import { logger } from '../core/logger.js';
9
+ import { printJson } from '../ui/format.js';
10
+ export async function cmdUninstall(args, json) {
11
+ const force = args.includes('--yes') || args.includes('-y');
12
+ if (json && !force) {
13
+ printJson({ ok: false, error: 'Uninstall requires confirmation. Next: pass --yes with --json.' });
14
+ process.exit(1);
15
+ }
16
+ if (!force) {
17
+ const confirmed = await confirm({
18
+ message: 'Permanently uninstall hoolix? This will stop all servers, delete ALL data/servers/configs, remove the binary, and clean up PATH entries (on Windows). Cannot be undone.',
19
+ });
20
+ if (isCancel(confirmed) || !confirmed) {
21
+ cancel('Uninstall cancelled');
22
+ return;
23
+ }
24
+ }
25
+ if (!json)
26
+ logger.info('Starting uninstall...');
27
+ // Stop and delete all servers (best effort)
28
+ try {
29
+ const servers = await listServers();
30
+ for (const s of servers) {
31
+ try {
32
+ const st = await serverManager.getStatus(s.slug);
33
+ if (st.running) {
34
+ await serverManager.stop(s.slug, true);
35
+ if (!json)
36
+ logger.info(`Stopped ${s.slug}`);
37
+ }
38
+ }
39
+ catch { }
40
+ await deleteServer(s.slug, { removeData: true });
41
+ }
42
+ if (servers.length > 0 && !json)
43
+ logger.info(`Removed ${servers.length} server(s)`);
44
+ }
45
+ catch (e) {
46
+ if (!json)
47
+ logger.warn('Some servers could not be cleaned:', e.message);
48
+ }
49
+ // Remove the entire data directory
50
+ try {
51
+ const { data: dataDir } = getPaths();
52
+ if (await fs.pathExists(dataDir)) {
53
+ await fs.remove(dataDir);
54
+ if (!json)
55
+ logger.info(`Removed data directory: ${dataDir}`);
56
+ }
57
+ }
58
+ catch (e) {
59
+ if (!json)
60
+ logger.warn('Could not remove data dir:', e.message);
61
+ }
62
+ const currentExe = process.execPath;
63
+ const isCompiledBinary = !currentExe.includes('node') && !currentExe.includes('bun');
64
+ if (isCompiledBinary) {
65
+ const installDir = path.dirname(currentExe);
66
+ if (process.platform === 'win32') {
67
+ try {
68
+ const escapedDir = installDir.replace(/\\/g, '\\\\');
69
+ const psCmd = `[Environment]::GetEnvironmentVariable('PATH','User') -split ';' | Where-Object { $_.TrimEnd('\\') -ine '${escapedDir}' } | Join-String -Separator ';' | ForEach-Object { [Environment]::SetEnvironmentVariable('PATH', $_, 'User') }`;
70
+ execSync(`powershell -NoProfile -Command "${psCmd}"`, { stdio: 'ignore' });
71
+ if (!json)
72
+ logger.info(`Removed ${installDir} from user PATH.`);
73
+ }
74
+ catch {
75
+ if (!json)
76
+ logger.warn('Could not automatically remove from PATH (edit manually if needed).');
77
+ }
78
+ const batPath = currentExe + '.uninstall.bat';
79
+ const batContent = `@echo off\nsetlocal\ntimeout /t 2 /nobreak >nul 2>&1\nif exist "${currentExe}" del /f /q "${currentExe}" >nul 2>&1\nif exist "${installDir}" rd /s /q "${installDir}" >nul 2>&1\necho hoolix completely uninstalled.\ndel "%~f0" >nul 2>&1\n`;
80
+ await fs.writeFile(batPath, batContent);
81
+ spawn('cmd.exe', ['/c', batPath], { detached: true, stdio: 'ignore', windowsHide: true }).unref();
82
+ if (json)
83
+ printJson({ ok: true, removedData: true, compiledBinary: true, uninstallPrepared: true, installDir });
84
+ else {
85
+ logger.success('Uninstall prepared.');
86
+ logger.info('This process will exit now; the binary and install directory will be removed shortly.');
87
+ }
88
+ await new Promise((r) => setTimeout(r, 150));
89
+ process.exit(0);
90
+ }
91
+ else {
92
+ try {
93
+ await fs.remove(currentExe);
94
+ if (!json)
95
+ logger.info(`Removed binary: ${currentExe}`);
96
+ }
97
+ catch (e) {
98
+ if (!json)
99
+ logger.warn(`Could not remove binary ${currentExe}: ${e.message}`);
100
+ }
101
+ if (!json)
102
+ logger.info('If you manually added the install directory to PATH in your shell config (~/.bashrc etc.), remove the entry there.');
103
+ }
104
+ }
105
+ else {
106
+ if (!json)
107
+ logger.info('Not running as a compiled binary — only data was cleaned. Remove the package/source manually if desired.');
108
+ }
109
+ if (json)
110
+ printJson({ ok: true, removedData: true, compiledBinary: isCompiledBinary });
111
+ else
112
+ logger.success('hoolix has been fully uninstalled and cleaned up.');
113
+ }
114
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdUpdate(args: string[], json: boolean): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E5E"}
@@ -0,0 +1,104 @@
1
+ import { checkForUpdate, performUpdate, getInstallMethod } from '../core/updater.js';
2
+ import { listServers } from '../core/registry.js';
3
+ import { serverManager } from '../process/manager.js';
4
+ import { logger } from '../core/logger.js';
5
+ import { printJson } from '../ui/format.js';
6
+ export async function cmdUpdate(args, json) {
7
+ const noVerify = args.includes('--no-verify');
8
+ const installMethod = getInstallMethod();
9
+ if (!json)
10
+ logger.info('Checking for updates...');
11
+ if (!json && installMethod === 'npm') {
12
+ logger.info('Installed via npm. For updates: npm update -g hoolix');
13
+ }
14
+ const updateInfo = await checkForUpdate();
15
+ if (!updateInfo.isOutdated) {
16
+ if (json)
17
+ printJson({ ok: true, updated: false, installMethod, ...updateInfo });
18
+ else
19
+ logger.success(`You are already on the latest version (${updateInfo.currentVersion}).`);
20
+ return;
21
+ }
22
+ // Stop running servers before update (they may hold binary locks on Windows)
23
+ let restartSlugs = [];
24
+ try {
25
+ const allServers = await listServers();
26
+ for (const s of allServers) {
27
+ const st = await serverManager.getStatus(s.slug);
28
+ if (st.running)
29
+ restartSlugs.push(s.slug);
30
+ }
31
+ }
32
+ catch (e) {
33
+ logger.warn('Failed to enumerate running servers before update:', e.message || e);
34
+ }
35
+ if (restartSlugs.length > 0) {
36
+ if (!json)
37
+ logger.info(`Stopping ${restartSlugs.length} running server(s) before update: ${restartSlugs.join(', ')}`);
38
+ for (const slug of restartSlugs) {
39
+ try {
40
+ await serverManager.stop(slug, true);
41
+ if (!json)
42
+ logger.info(`Stopped ${slug}`);
43
+ }
44
+ catch (e) {
45
+ if (!json)
46
+ logger.warn(`Failed to stop ${slug} before update: ${e.message || e}`);
47
+ }
48
+ }
49
+ }
50
+ try {
51
+ const success = await performUpdate(restartSlugs, { quiet: json, noVerify });
52
+ if (success) {
53
+ if (json)
54
+ printJson({ ok: true, updated: true, ...updateInfo, restarted: restartSlugs });
55
+ else
56
+ logger.success('Update completed successfully!');
57
+ if (restartSlugs.length > 0 && process.platform !== 'win32') {
58
+ if (!json)
59
+ logger.info('Restarting previously running servers...');
60
+ for (const slug of restartSlugs) {
61
+ try {
62
+ await serverManager.start(slug);
63
+ if (!json)
64
+ logger.info(`Restarted ${slug}`);
65
+ }
66
+ catch (e) {
67
+ if (!json)
68
+ logger.warn(`Failed to restart ${slug} after update: ${e.message || e}`);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ else if (json) {
74
+ printJson({
75
+ ok: false,
76
+ updated: false,
77
+ ...updateInfo,
78
+ restarted: restartSlugs,
79
+ error: updateInfo.assetName
80
+ ? 'Auto-update could not be applied. Next: download the release asset manually or run from a compiled binary.'
81
+ : 'No suitable binary asset was found for this platform in the latest release.',
82
+ });
83
+ process.exit(1);
84
+ }
85
+ }
86
+ catch (err) {
87
+ if (json)
88
+ printJson({ ok: false, updated: false, error: err.message || String(err), restarted: restartSlugs });
89
+ else
90
+ logger.error('Update failed:', err.message || err);
91
+ // Best effort: restart servers even if update failed
92
+ if (restartSlugs.length > 0) {
93
+ logger.info('Attempting to restart servers after failed update...');
94
+ for (const slug of restartSlugs) {
95
+ try {
96
+ await serverManager.start(slug);
97
+ }
98
+ catch { }
99
+ }
100
+ }
101
+ process.exit(1);
102
+ }
103
+ }
104
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,IAAa;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;;YAC3E,MAAM,CAAC,OAAO,CAAC,0CAA0C,UAAU,CAAC,cAAc,IAAI,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,WAAW,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,OAAO;gBAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,MAAM,qCAAqC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtH,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,mBAAmB,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;;gBACpF,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC5D,IAAI,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBACnE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,IAAI,CAAC;wBACH,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,IAAI,CAAC,IAAI;4BAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;oBAC9C,CAAC;oBAAC,OAAO,CAAM,EAAE,CAAC;wBAChB,IAAI,CAAC,IAAI;4BAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,kBAAkB,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC;gBACR,EAAE,EAAS,KAAK;gBAChB,OAAO,EAAI,KAAK;gBAChB,GAAG,UAAU;gBACb,SAAS,EAAE,YAAY;gBACvB,KAAK,EAAM,UAAU,CAAC,SAAS;oBAC7B,CAAC,CAAC,4GAA4G;oBAC9G,CAAC,CAAC,6EAA6E;aAClF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;;YAC1G,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QACxD,qDAAqD;QACrD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACpE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC;oBAAC,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACnD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdVerify(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAeA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2M7D"}
@@ -0,0 +1,301 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'node:child_process';
3
+ import { getServerMetadata } from '../core/registry.js';
4
+ import { createRAGForServer } from '../rag/store.js';
5
+ import { logger } from '../core/logger.js';
6
+ import { isHybridModel } from '../rag/models.js';
7
+ import { verifyServer } from '../app/services/servers.js';
8
+ import { loadCredentials } from '../app/services/credentials.js';
9
+ import { getTemplate } from '../app/services/catalog.js';
10
+ import { getFreshness, printTitle, printSection, printDetails, printCommand, truncate, statusText, ui } from '../ui/format.js';
11
+ import { getServerDataDir } from '../core/paths.js';
12
+ import fs from 'fs-extra';
13
+ import path from 'node:path';
14
+ export async function cmdVerify(args) {
15
+ const slug = args[1];
16
+ if (!slug) {
17
+ logger.error('Usage: hoolix verify <slug> [--eval] [--json]');
18
+ process.exit(1);
19
+ }
20
+ let meta;
21
+ try {
22
+ meta = await getServerMetadata(slug);
23
+ }
24
+ catch {
25
+ logger.error(`Server "${slug}" not found.`);
26
+ process.exit(1);
27
+ }
28
+ // ── mcp-server kind: credential + config verification ────────────────────
29
+ if ((meta.serverKind ?? 'docs-rag') === 'mcp-server') {
30
+ await verifMcpServer(slug, meta, args.includes('--json'));
31
+ return;
32
+ }
33
+ // ── JSON output path ──────────────────────────────────────────────────────
34
+ if (args.includes('--json')) {
35
+ try {
36
+ const report = await verifyServer(slug);
37
+ console.log(JSON.stringify({
38
+ slug: report.slug, name: report.name, sourceUrl: report.sourceUrl, chunkCount: report.chunkCount,
39
+ validation: report.validation,
40
+ searchable: report.searchable,
41
+ groundingPercent: report.groundingPercent,
42
+ sourceCoveragePercent: report.sourceCoveragePercent,
43
+ uniqueSourceUrls: report.uniqueSourceUrls,
44
+ totalChars: report.totalChars,
45
+ averageChunkChars: report.averageChunkChars,
46
+ duplicateChunkIds: report.duplicateChunkIds,
47
+ weakQueries: report.weakQueries,
48
+ ingestion: report.ingestion,
49
+ samples: report.samples.map((sample) => ({
50
+ query: sample.query,
51
+ hits: sample.hits,
52
+ top: sample.top,
53
+ grounded: sample.grounded,
54
+ weak: sample.weak,
55
+ })),
56
+ tocEntries: report.tocEntries,
57
+ tocPreview: report.tocPreview,
58
+ embeddingModel: report.embeddingModel,
59
+ freshness: getFreshness(report.freshnessUpdatedAt),
60
+ sourceCount: report.sourceCount,
61
+ sourceLabels: report.sourceLabels,
62
+ template: report.definition.template,
63
+ reliability: {
64
+ sourceFingerprint: !!meta.sourceFingerprint,
65
+ lastReindexAt: meta.lastReindexAt || null,
66
+ reindexSchedule: meta.reindexSchedule || null,
67
+ authenticatedSources: report.definition.sources.filter((source) => source.headers || source.cookie).length,
68
+ persistedRateState: await fs.pathExists(path.join(getServerDataDir(slug), 'rate-state.json')),
69
+ },
70
+ }, null, 2));
71
+ return;
72
+ }
73
+ catch (e) {
74
+ logger.error('Failed to load RAG:', e.message || e);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ // ── Human output path ─────────────────────────────────────────────────────
79
+ printTitle('Verify', `${meta.name} (${slug})`);
80
+ const report = await verifyServer(slug, ['overview', 'install', 'getting started', 'api', 'configuration', 'authentication', 'usage']);
81
+ const v = report.validation;
82
+ printDetails([
83
+ ['Registry chunks', meta.chunkCount.toLocaleString()],
84
+ [report.sourceCount > 1 ? 'Sources' : 'Source', report.sourceCount > 1 ? report.sourceLabels.join(', ') : truncate(meta.sourceUrl, 92)],
85
+ ['Template', report.definition.template ? `${report.definition.template.name} (${report.definition.template.id})` : undefined],
86
+ ['Freshness', getFreshness(meta.lastUpdatedAt).message],
87
+ ['Validation', statusText(v.valid, 'ok', 'issues')],
88
+ ]);
89
+ if (!v.valid)
90
+ v.issues.forEach((issue) => console.log(` ${ui.warning('!')} ${issue}`));
91
+ console.log('');
92
+ let rag;
93
+ try {
94
+ rag = await createRAGForServer(slug, meta.embeddingModel || 'fuse');
95
+ }
96
+ catch (e) {
97
+ logger.error('Failed to load RAG:', e.message || e);
98
+ process.exit(1);
99
+ }
100
+ const sample = await rag.search('overview OR install OR api', { limit: 1 });
101
+ console.log(` ${ui.muted('RAG searchable')} ${statusText(sample.length > 0, 'yes', 'no (empty index?)')}`);
102
+ const ingestionStats = meta.ingestionStats;
103
+ const diagnostics = report.diagnostics;
104
+ const likelyTruncated = report.ingestion.truncated;
105
+ console.log('');
106
+ printSection('Trust signals');
107
+ printDetails([
108
+ ['Source coverage', diagnostics ? `${diagnostics.sourceCoveragePercent}% (${diagnostics.chunksWithUrl}/${diagnostics.totalChunks} chunks have URLs)` : 'unknown'],
109
+ ['Unique source URLs', diagnostics?.uniqueSourceUrls],
110
+ ['Average chunk size', diagnostics ? `${diagnostics.averageChunkChars.toLocaleString()} chars` : undefined],
111
+ ['Duplicate chunk IDs', diagnostics?.duplicateChunkIds],
112
+ ['Ingestion cap', ingestionStats ? `${ingestionStats.totalChunks.toLocaleString()}/${ingestionStats.maxChunks.toLocaleString()} chunks, ${ingestionStats.pagesProcessed.toLocaleString()}/${ingestionStats.maxPages.toLocaleString()} pages` : 'reindex to record cap details'],
113
+ ['Truncated', likelyTruncated ? ui.warning('yes') : ui.success('no')],
114
+ ]);
115
+ if (likelyTruncated)
116
+ console.log(` ${ui.warning('!')} Index hit an ingestion cap. Next: reindex with a narrower source or raise caps.`);
117
+ if (diagnostics && diagnostics.sourceCoveragePercent < 100) {
118
+ console.log(` ${ui.warning('!')} Some chunks are missing source URLs. Next: reindex and inspect ingestion output.`);
119
+ }
120
+ console.log('');
121
+ printSection('Reliability');
122
+ printDetails([
123
+ ['Incremental fingerprint', meta.sourceFingerprint ? 'present' : 'missing (next reindex will record it)'],
124
+ ['Last reindex', meta.lastReindexAt ? new Date(meta.lastReindexAt).toLocaleString() : 'never recorded'],
125
+ ['Schedule', meta.reindexSchedule?.enabled ? `every ${meta.reindexSchedule.intervalHours}h, next ${meta.reindexSchedule.nextRunAt || 'unknown'}` : 'off'],
126
+ ['Authenticated sources', report.definition.sources.filter((source) => source.headers || source.cookie).length],
127
+ ['Persisted rate state', await fs.pathExists(path.join(getServerDataDir(slug), 'rate-state.json')) ? 'present' : 'not created yet'],
128
+ ]);
129
+ console.log('');
130
+ printSection('Sample searches (relevance + grounding)');
131
+ let totalHits = 0;
132
+ const weakQueries = [];
133
+ const queries = ['overview', 'install', 'getting started', 'api', 'configuration', 'authentication', 'usage'];
134
+ for (const sampleReport of report.samples.slice(0, 5)) {
135
+ const q = sampleReport.query;
136
+ const res = sampleReport.results;
137
+ totalHits += res.length;
138
+ if (res.length > 0) {
139
+ const top = res[0];
140
+ const hasGround = !!top.metadata.url;
141
+ const rel = Math.round((top.score || 0.8) * 100);
142
+ if (!hasGround || (top.score ?? 0) < 0.45)
143
+ weakQueries.push(q);
144
+ console.log(` ${ui.accent('›')} ${chalk.bold(q)} ${ui.muted(`${res.length} hit(s)`)} score=${rel}% ${hasGround ? ui.success('grounded') : ui.warning('no url')}`);
145
+ console.log(` ${truncate(top.metadata.sectionPath || top.metadata.title || top.metadata.url, 88)}`);
146
+ console.log(` ${ui.muted(truncate(top.content.replace(/\n/g, ' '), 110))}`);
147
+ console.log(` ${ui.muted('Source')} ${truncate(top.metadata.url, 80)}`);
148
+ }
149
+ else {
150
+ console.log(` ${ui.accent('›')} ${chalk.bold(q)} ${ui.muted('no results')}`);
151
+ weakQueries.push(q);
152
+ }
153
+ }
154
+ const groundingPct = Math.round((report.samples.slice(0, 5).filter((sample) => sample.grounded).length / Math.min(5, queries.length)) * 100);
155
+ console.log(` ${ui.muted('Grounding quality (sample)')} ${groundingPct}% of top results include source URL + section`);
156
+ if (weakQueries.length > 0)
157
+ console.log(` ${ui.muted('Needs attention')} ${weakQueries.join(', ')}`);
158
+ const toc = report.toc;
159
+ console.log('');
160
+ printSection(`Table of contents (${toc.length} entries)`);
161
+ if (toc.length > 0) {
162
+ const top = toc.filter((t) => t.level === 1).slice(0, 4);
163
+ top.forEach((t) => console.log(` ${ui.accent('•')} ${t.title}`));
164
+ if (toc.length > top.length)
165
+ console.log(` ${ui.muted('… and more')}`);
166
+ }
167
+ // ── Eval mode ─────────────────────────────────────────────────────────────
168
+ const doEval = args.includes('--eval') || args.includes('--evaluate');
169
+ if (doEval) {
170
+ console.log('');
171
+ printSection('Eval (relevance proxy + latency + mode comparison)');
172
+ const evalQueries = queries.slice(0, 6);
173
+ const modes = meta.embeddingModel && isHybridModel(meta.embeddingModel)
174
+ ? ['keyword', 'hybrid']
175
+ : ['keyword'];
176
+ for (const m of modes) {
177
+ let sumMs = 0, termHits = 0, g = 0, n = 0;
178
+ for (const q of evalQueries) {
179
+ const t0 = Date.now();
180
+ const res = await rag.search(q, { limit: 3, mode: m });
181
+ sumMs += Date.now() - t0;
182
+ n += res.length || 1;
183
+ if (res[0]) {
184
+ const top = res[0];
185
+ const term = q.split(/\s+/)[0].toLowerCase();
186
+ if (top.content.toLowerCase().includes(term) || (top.metadata.title || '').toLowerCase().includes(term))
187
+ termHits++;
188
+ if (top.metadata.url)
189
+ g++;
190
+ }
191
+ }
192
+ const avgMs = Math.round(sumMs / evalQueries.length);
193
+ const termHit = Math.round((termHits / Math.max(1, evalQueries.length)) * 100);
194
+ const grounded = Math.round((g / Math.max(1, evalQueries.length)) * 100);
195
+ console.log(` ${ui.accent(m.padEnd(8))}: ${avgMs}ms avg term-hit=${termHit}% grounded=${grounded}% (over ${evalQueries.length} queries)`);
196
+ }
197
+ console.log(` ${ui.muted('Eval is a lightweight proxy (term overlap + grounding). For real golden sets use examples/benchmark.ts --eval')}`);
198
+ }
199
+ console.log('');
200
+ if (meta.embeddingModel && isHybridModel(meta.embeddingModel)) {
201
+ console.log(` ${ui.success('✓')} Hybrid embeddings enabled (${meta.embeddingModel}).`);
202
+ console.log(` search supports mode=hybrid|semantic|keyword, alpha (blend), reranker=rrf (advanced relevance).`);
203
+ console.log(` Embeddings cached on disk; query embeds LRU-cached at runtime.`);
204
+ }
205
+ else {
206
+ console.log(` ${ui.muted('Tip')}: Reindex with --hybrid or --embedding-model hybrid-bge-base for semantic + RRF reranking.`);
207
+ }
208
+ console.log('');
209
+ console.log(` ${ui.success('✓')} Verify complete. All results include source URLs for grounding.`);
210
+ }
211
+ // ── mcp-server verification ───────────────────────────────────────────────────
212
+ async function verifMcpServer(slug, meta, json) {
213
+ const templateId = meta.definition?.template?.id ?? 'unknown';
214
+ const credentialKeys = meta.credentialKeys ?? [];
215
+ const checks = [];
216
+ // 1. Template exists in catalog
217
+ let template = null;
218
+ try {
219
+ template = await getTemplate(templateId);
220
+ checks.push({ name: 'Template in catalog', ok: true, detail: template.name });
221
+ }
222
+ catch {
223
+ checks.push({ name: 'Template in catalog', ok: false, detail: `"${templateId}" not found` });
224
+ }
225
+ // 2. Credentials stored
226
+ const storedCreds = await loadCredentials(slug);
227
+ const storedKeys = Object.keys(storedCreds);
228
+ const requiredCreds = template?.credentials.filter((c) => c.required).map((c) => c.name) ?? credentialKeys;
229
+ const missingCreds = requiredCreds.filter((k) => !storedCreds[k]);
230
+ if (requiredCreds.length === 0) {
231
+ checks.push({ name: 'Credentials', ok: true, detail: 'none required' });
232
+ }
233
+ else if (missingCreds.length === 0) {
234
+ checks.push({ name: 'Credentials', ok: true, detail: `${storedKeys.length} stored (${storedKeys.join(', ')})` });
235
+ }
236
+ else {
237
+ checks.push({ name: 'Credentials', ok: false, detail: `missing: ${missingCreds.join(', ')}` });
238
+ }
239
+ // 3. Template inputs present
240
+ const templateInputs = meta.definition?.template?.inputs ?? {};
241
+ const requiredInputs = template?.inputs.filter((i) => i.required).map((i) => i.name) ?? [];
242
+ const missingInputs = requiredInputs.filter((k) => !templateInputs[k]);
243
+ if (requiredInputs.length === 0) {
244
+ checks.push({ name: 'Template inputs', ok: true, detail: 'none required' });
245
+ }
246
+ else if (missingInputs.length === 0) {
247
+ checks.push({ name: 'Template inputs', ok: true, detail: requiredInputs.map((k) => `${k}=${templateInputs[k]}`).join(', ') });
248
+ }
249
+ else {
250
+ checks.push({ name: 'Template inputs', ok: false, detail: `missing: ${missingInputs.join(', ')}` });
251
+ }
252
+ // 4. Runtime tool available
253
+ const command = template?.server?.command ?? 'npx';
254
+ try {
255
+ execSync(`${command === 'npx' ? 'npx --version' : `which ${command}`}`, { stdio: 'ignore' });
256
+ checks.push({ name: `Runtime (${command})`, ok: true, detail: 'available' });
257
+ }
258
+ catch {
259
+ checks.push({ name: `Runtime (${command})`, ok: false, detail: `"${command}" not found — install Node.js / uv as needed` });
260
+ }
261
+ const allOk = checks.every((c) => c.ok);
262
+ if (json) {
263
+ console.log(JSON.stringify({
264
+ slug,
265
+ name: meta.name,
266
+ kind: 'mcp-server',
267
+ templateId,
268
+ checks,
269
+ ok: allOk,
270
+ next: allOk ? `hoolix connect ${slug}` : `Fix issues above, then: hoolix connect ${slug}`,
271
+ }, null, 2));
272
+ return;
273
+ }
274
+ printTitle('Verify', `${meta.name} (${slug})`);
275
+ printDetails([
276
+ ['Kind', 'MCP server'],
277
+ ['Template', `${template?.name ?? templateId} (${templateId})`],
278
+ ['Result', allOk ? ui.success('all checks passed') : ui.warning('issues found')],
279
+ ]);
280
+ console.log('');
281
+ printSection('Checks');
282
+ for (const check of checks) {
283
+ const icon = check.ok ? ui.success('✓') : ui.warning('!');
284
+ console.log(` ${icon} ${check.name.padEnd(24)} ${check.detail}`);
285
+ }
286
+ console.log('');
287
+ if (allOk) {
288
+ console.log(` ${ui.success('✓')} Server is ready to use.`);
289
+ printCommand(`hoolix connect ${slug}`);
290
+ }
291
+ else {
292
+ const missing = checks.filter((c) => !c.ok);
293
+ for (const m of missing) {
294
+ console.log(` ${ui.warning('!')} ${m.name}: ${m.detail}`);
295
+ }
296
+ console.log('');
297
+ console.log(` Fix the issues above, then: hoolix connect ${slug}`);
298
+ }
299
+ console.log('');
300
+ }
301
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export declare const ConfigSchema: z.ZodObject<{
3
+ version: z.ZodDefault<z.ZodString>;
4
+ defaultBasePort: z.ZodDefault<z.ZodNumber>;
5
+ telemetryOptOut: z.ZodDefault<z.ZodBoolean>;
6
+ preferredEmbedding: z.ZodDefault<z.ZodCatch<z.ZodEnum<z.Writeable<any>>>>;
7
+ openaiApiKey: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ version: string;
10
+ defaultBasePort: number;
11
+ telemetryOptOut: boolean;
12
+ preferredEmbedding?: any;
13
+ openaiApiKey?: string | undefined;
14
+ }, {
15
+ version?: string | undefined;
16
+ defaultBasePort?: number | undefined;
17
+ telemetryOptOut?: boolean | undefined;
18
+ preferredEmbedding?: unknown;
19
+ openaiApiKey?: string | undefined;
20
+ }>;
21
+ export type Config = z.infer<typeof ConfigSchema>;
22
+ export declare function loadConfig(): Promise<Config>;
23
+ export declare function saveConfig(config: Config): Promise<void>;
24
+ export declare function updateConfig(updates: Partial<Config>): Promise<Config>;
25
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAWlD,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBlD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5E"}