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 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,IAAI,MAAM,CAGxC"}
@@ -0,0 +1,6 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ export function generateAuthKey() {
3
+ // Cryptographically secure; prefixed for easy identification in auth headers.
4
+ return 'mcp_' + randomBytes(24).toString('hex');
5
+ }
6
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,eAAe;IAC7B,8EAA8E;IAC9E,OAAO,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { isHybridModel } from '../rag/models.js';
2
+ import type { EmbeddingModel } from '../rag/models.js';
3
+ import type { Config } from '../core/config.js';
4
+ /**
5
+ * Resolves the embedding model from CLI args and config.
6
+ * Priority: --embedding-model > --hybrid > config.preferredEmbedding > 'fuse'
7
+ */
8
+ export declare function resolveEmbeddingModel(args: string[], cfg: Config): EmbeddingModel;
9
+ export { isHybridModel };
10
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/lib/embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAWjF;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { SUPPORTED_EMBEDDING_MODELS, isHybridModel } from '../rag/models.js';
2
+ /**
3
+ * Resolves the embedding model from CLI args and config.
4
+ * Priority: --embedding-model > --hybrid > config.preferredEmbedding > 'fuse'
5
+ */
6
+ export function resolveEmbeddingModel(args, cfg) {
7
+ const emIdx = args.indexOf('--embedding-model');
8
+ if (emIdx !== -1 && args[emIdx + 1]) {
9
+ const cand = args[emIdx + 1];
10
+ if (SUPPORTED_EMBEDDING_MODELS.includes(cand))
11
+ return cand;
12
+ }
13
+ if (args.includes('--hybrid'))
14
+ return 'hybrid-bge-small';
15
+ if (SUPPORTED_EMBEDDING_MODELS.includes(cfg.preferredEmbedding)) {
16
+ return cfg.preferredEmbedding;
17
+ }
18
+ return 'fuse';
19
+ }
20
+ export { isHybridModel };
21
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/lib/embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAI7E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,GAAW;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAmB,CAAC;QAC/C,IAAK,0BAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACzD,IAAK,0BAAuC,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,CAAC,kBAAoC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Server Host (Streamable HTTP transport).
3
+ *
4
+ * Standalone runnable (for dev/manual) or invoked internally by packaged binary via __internal-host.
5
+ * See AGENTS.md "Host Execution Model".
6
+ */
7
+ export interface HostOptions {
8
+ slug: string;
9
+ port: number;
10
+ dataDir: string;
11
+ authKey: string;
12
+ bindHost?: string;
13
+ }
14
+ declare function startHostedServer(opts: HostOptions): Promise<void>;
15
+ export { startHostedServer };
16
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/mcp/host.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmFD,iBAAe,iBAAiB,CAAC,IAAI,EAAE,WAAW,iBA4NjD;AA4BD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * MCP Server Host (Streamable HTTP transport).
3
+ *
4
+ * Standalone runnable (for dev/manual) or invoked internally by packaged binary via __internal-host.
5
+ * See AGENTS.md "Host Execution Model".
6
+ */
7
+ import { Hono } from 'hono';
8
+ import { serve } from '@hono/node-server';
9
+ import { McpServer, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
10
+ import * as z from 'zod';
11
+ import { createRAGForServer } from '../rag/store.js';
12
+ import { logger } from '../core/logger.js';
13
+ import fs from 'fs-extra';
14
+ import { getServerRuntimePath, getServerDataDir } from '../core/paths.js';
15
+ import path from 'node:path';
16
+ import { getServerMetadata } from '../core/registry.js';
17
+ const DEFAULT_TOOL_TIMEOUT_MS = 15_000;
18
+ function maskSecret(value, visible = 6) {
19
+ if (!value)
20
+ return '';
21
+ if (value.length <= visible * 2)
22
+ return `${value.slice(0, 2)}...`;
23
+ return `${value.slice(0, visible)}...${value.slice(-visible)}`;
24
+ }
25
+ function getToolTimeoutMs() {
26
+ const parsed = parseInt(process.env.MCP_TOOL_TIMEOUT_MS || '', 10);
27
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_TOOL_TIMEOUT_MS;
28
+ }
29
+ async function withToolTimeout(tool, op) {
30
+ const timeoutMs = getToolTimeoutMs();
31
+ let timer;
32
+ const timeout = new Promise((_, reject) => {
33
+ timer = setTimeout(() => {
34
+ reject(new Error(`${tool} timed out after ${timeoutMs}ms. Next: retry with a narrower query or lower limit.`));
35
+ }, timeoutMs);
36
+ });
37
+ try {
38
+ return await Promise.race([op, timeout]);
39
+ }
40
+ finally {
41
+ if (timer)
42
+ clearTimeout(timer);
43
+ }
44
+ }
45
+ function toolErrorResponse(message) {
46
+ return {
47
+ content: [{ type: 'text', text: message }],
48
+ };
49
+ }
50
+ function formatResultSource(metadata) {
51
+ const prefix = metadata.sourceLabel ? `Source (${metadata.sourceLabel})` : 'Source';
52
+ const type = metadata.sourceType ? ` [${metadata.sourceType}]` : '';
53
+ return `${prefix}${type}: ${metadata.url}`;
54
+ }
55
+ function tokenBudget(args, fallbackTokens) {
56
+ const maxTokens = Number(args?.maxTokens || 0);
57
+ const contextWindowTokens = Number(args?.contextWindowTokens || 0);
58
+ const fromContext = contextWindowTokens > 0 ? Math.floor(contextWindowTokens * 0.25) : fallbackTokens;
59
+ const budget = maxTokens > 0 ? Math.min(maxTokens, fromContext) : fromContext;
60
+ return Math.max(500, Math.min(12000, budget));
61
+ }
62
+ function truncateToTokenBudget(text, budgetTokens) {
63
+ const maxChars = budgetTokens * 4;
64
+ if (text.length <= maxChars)
65
+ return text;
66
+ return text.slice(0, maxChars) + `\n... (truncated to ~${budgetTokens} tokens; pass maxTokens or use read_documentation_page for more)`;
67
+ }
68
+ async function parseArgs() {
69
+ const args = process.argv.slice(2);
70
+ const get = (name) => {
71
+ const idx = args.indexOf(`--${name}`);
72
+ return idx !== -1 ? args[idx + 1] : undefined;
73
+ };
74
+ const slug = get('slug');
75
+ const portStr = get('port');
76
+ const dataDir = get('data-dir');
77
+ const authKey = get('auth-key');
78
+ if (!slug || !portStr || !dataDir || !authKey) {
79
+ console.error('Usage: host.ts --slug <name> --port <number> --data-dir <path> --auth-key <key>');
80
+ process.exit(1);
81
+ }
82
+ return {
83
+ slug,
84
+ port: parseInt(portStr, 10),
85
+ dataDir,
86
+ authKey,
87
+ bindHost: '127.0.0.1',
88
+ };
89
+ }
90
+ async function startHostedServer(opts) {
91
+ const { slug, port, dataDir: _dataDir, authKey, bindHost = '127.0.0.1' } = opts;
92
+ logger.info(`Starting MCP host for "${slug}" on ${bindHost}:${port}`);
93
+ // Load RAG (Fuse default; hybrid if server was indexed that way)
94
+ const rag = await createRAGForServer(slug);
95
+ const meta = await getServerMetadata(slug).catch(() => null);
96
+ // In-memory rate limiter (per-server; token-bucket style with fixed window for simplicity).
97
+ // 120 req / 60s default. Configurable via env for advanced use (MCP_RATE_LIMIT, MCP_RATE_WINDOW_SEC).
98
+ // Returns true if allowed; callers handle 429 + Retry-After.
99
+ const RATE_LIMIT = Math.max(1, parseInt(process.env.MCP_RATE_LIMIT || '120', 10));
100
+ const RATE_WINDOW_MS = Math.max(1000, (parseInt(process.env.MCP_RATE_WINDOW_SEC || '60', 10)) * 1000);
101
+ const rateStatePath = path.join(getServerDataDir(slug), 'rate-state.json');
102
+ let reqCount = 0;
103
+ let windowStart = Date.now();
104
+ try {
105
+ const state = await fs.readJson(rateStatePath);
106
+ if (typeof state.windowStart === 'number' && typeof state.reqCount === 'number') {
107
+ reqCount = state.reqCount;
108
+ windowStart = state.windowStart;
109
+ }
110
+ }
111
+ catch { }
112
+ async function saveRateState() {
113
+ await fs.writeJson(rateStatePath, { windowStart, reqCount, limit: RATE_LIMIT, windowMs: RATE_WINDOW_MS }).catch(() => { });
114
+ }
115
+ async function checkRateLimit() {
116
+ const now = Date.now();
117
+ if (now - windowStart > RATE_WINDOW_MS) {
118
+ reqCount = 0;
119
+ windowStart = now;
120
+ }
121
+ reqCount += 1;
122
+ await saveRateState();
123
+ return reqCount <= RATE_LIMIT;
124
+ }
125
+ const auditPath = path.join(getServerDataDir(slug), 'audit.log');
126
+ const MAX_AUDIT_LINES = 5000; // keep last N lines to prevent unbounded growth (advanced audit rotation)
127
+ async function audit(tool, details) {
128
+ try {
129
+ const line = JSON.stringify({ ts: new Date().toISOString(), tool, ...details }) + '\n';
130
+ await fs.appendFile(auditPath, line).catch(() => { });
131
+ // Simple rotation/trim for production hygiene (no external deps, cross-platform)
132
+ try {
133
+ const content = await fs.readFile(auditPath, 'utf8').catch(() => '');
134
+ const lines = content.split('\n').filter(Boolean);
135
+ if (lines.length > MAX_AUDIT_LINES) {
136
+ const kept = lines.slice(-Math.floor(MAX_AUDIT_LINES * 0.8)).join('\n') + '\n';
137
+ await fs.writeFile(auditPath, kept).catch(() => { });
138
+ logger.debug(`Rotated audit.log for ${slug} (kept last ~${Math.floor(MAX_AUDIT_LINES * 0.8)} entries)`);
139
+ }
140
+ }
141
+ catch { }
142
+ }
143
+ catch { }
144
+ }
145
+ const server = new McpServer({
146
+ name: `hoolix-${slug}`,
147
+ version: '1.0.0',
148
+ });
149
+ // search_documentation tool
150
+ server.registerTool('search_documentation', {
151
+ description: 'Search the docs (keyword + optional hybrid semantic via BGE). Supports mode (keyword|semantic|hybrid), plus advanced tuning (alpha, reranker=rrf) for production relevance. Always includes Source URLs.',
152
+ inputSchema: z.object({
153
+ query: z.string().min(2).describe('Natural language or keyword query'),
154
+ limit: z.number().int().min(1).max(20).default(8),
155
+ mode: z.enum(['semantic', 'keyword', 'hybrid']).default('hybrid'),
156
+ maxTokens: z.number().int().min(500).max(12000).optional().describe('Approximate output token budget for this response'),
157
+ contextWindowTokens: z.number().int().min(1000).max(1000000).optional().describe('Client context window size; hoolix uses about 25% for search output'),
158
+ }),
159
+ }, async (args) => {
160
+ const { query, limit, mode } = args || {};
161
+ try {
162
+ return await withToolTimeout('search_documentation', (async () => {
163
+ const results = await rag.search(query, { limit, mode });
164
+ await audit('search_documentation', { query: String(query).slice(0, 120), limit, mode, hits: results.length });
165
+ let formatted = results.map((r, i) => `[${i + 1}] ${r.metadata.title || r.metadata.url}\n${r.content}\n${formatResultSource(r.metadata)}\n`).join('\n---\n');
166
+ formatted = truncateToTokenBudget(formatted, tokenBudget(args, 4500));
167
+ return {
168
+ content: [{ type: 'text', text: formatted || 'No relevant documentation found.' }],
169
+ };
170
+ })());
171
+ }
172
+ catch (e) {
173
+ await audit('tool_error', { toolName: 'search_documentation', reason: e?.message || String(e) });
174
+ return toolErrorResponse(e?.message || 'search_documentation failed. Next: retry with a narrower query.');
175
+ }
176
+ });
177
+ // read_documentation_page tool
178
+ server.registerTool('read_documentation_page', {
179
+ description: 'Retrieve the full or substantial content of a specific documentation page by its URL or path.',
180
+ inputSchema: z.object({
181
+ urlOrPath: z.string().describe('URL or path fragment to read'),
182
+ maxChunks: z.number().int().min(1).max(30).default(15),
183
+ maxTokens: z.number().int().min(500).max(20000).optional().describe('Approximate output token budget for this response'),
184
+ contextWindowTokens: z.number().int().min(1000).max(1000000).optional().describe('Client context window size; hoolix uses about 35% for page reads'),
185
+ }),
186
+ }, async (args) => {
187
+ const { urlOrPath, maxChunks } = args || {};
188
+ try {
189
+ return await withToolTimeout('read_documentation_page', (async () => {
190
+ const page = await rag.readPage(urlOrPath, maxChunks);
191
+ if (!page) {
192
+ await audit('read_documentation_page', { urlOrPath: String(urlOrPath).slice(0, 200), found: false });
193
+ return { content: [{ type: 'text', text: `Page not found: ${urlOrPath}` }] };
194
+ }
195
+ await audit('read_documentation_page', { urlOrPath: String(urlOrPath).slice(0, 200), found: true, chunks: page.chunks?.length || 0 });
196
+ const text = `# ${page.title}\n\nSource: ${page.url}${meta?.definition?.template ? `\nTemplate: ${meta.definition.template.name}` : ''}\n\n${page.content}`;
197
+ return { content: [{ type: 'text', text: truncateToTokenBudget(text, tokenBudget(args, 7000)) }] };
198
+ })());
199
+ }
200
+ catch (e) {
201
+ await audit('tool_error', { toolName: 'read_documentation_page', reason: e?.message || String(e) });
202
+ return toolErrorResponse(e?.message || 'read_documentation_page failed. Next: retry with a smaller maxChunks value.');
203
+ }
204
+ });
205
+ // get_table_of_contents tool
206
+ server.registerTool('get_table_of_contents', {
207
+ description: 'Returns a reconstructed table of contents / outline of the entire documentation set.',
208
+ }, async () => {
209
+ try {
210
+ return await withToolTimeout('get_table_of_contents', (async () => {
211
+ const toc = await rag.getTableOfContents();
212
+ await audit('get_table_of_contents', { entries: toc.length });
213
+ const text = toc
214
+ .map(item => `${' '.repeat(item.level - 1)}- ${item.title}${item.url ? `\n${' '.repeat(item.level)}Source: ${item.url}` : ''}`)
215
+ .join('\n');
216
+ return { content: [{ type: 'text', text: text || 'No table of contents available.' }] };
217
+ })());
218
+ }
219
+ catch (e) {
220
+ await audit('tool_error', { toolName: 'get_table_of_contents', reason: e?.message || String(e) });
221
+ return toolErrorResponse(e?.message || 'get_table_of_contents failed. Next: retry after reindexing this server.');
222
+ }
223
+ });
224
+ // Hono + Streamable HTTP transport setup
225
+ const app = new Hono();
226
+ // Health (unauthenticated) must be registered before the /mcp auth middleware
227
+ app.get('/health', async (c) => {
228
+ let hasData = false;
229
+ try {
230
+ hasData = (await rag.search('test', { limit: 1 })).length > 0;
231
+ }
232
+ catch { }
233
+ return c.json({ status: 'ok', server: slug, chunks: hasData ? 'indexed' : 'empty' });
234
+ });
235
+ // Auth middleware (Bearer or X-MCP-Key). Registered only on /mcp; /health stays public.
236
+ app.use('/mcp', async (c, next) => {
237
+ const authHeader = c.req.header('Authorization');
238
+ const headerKey = (authHeader?.startsWith('Bearer ') || authHeader?.startsWith('bearer '))
239
+ ? authHeader.replace(/^Bearer\s+/i, '')
240
+ : c.req.header('X-MCP-Key');
241
+ if (!headerKey || headerKey !== authKey) {
242
+ return c.json({ error: 'Unauthorized. Provide valid Authorization: Bearer <key> or X-MCP-Key header.' }, 401);
243
+ }
244
+ if (!(await checkRateLimit())) {
245
+ await audit('rate_limited', { path: c.req.path, limit: RATE_LIMIT, windowSec: Math.floor(RATE_WINDOW_MS / 1000) });
246
+ // Retry-After for clients (and MCP hosts) — advanced rate limiting surface
247
+ c.header('Retry-After', String(Math.ceil(RATE_WINDOW_MS / 1000)));
248
+ return c.json({ error: 'Rate limit exceeded. Try again later.' }, 429);
249
+ }
250
+ await next();
251
+ return;
252
+ });
253
+ const transport = new WebStandardStreamableHTTPServerTransport();
254
+ await server.connect(transport);
255
+ app.all('/mcp', (c) => transport.handleRequest(c.req.raw));
256
+ // Write .runtime.json for parent process liveness + port discovery
257
+ const runtimePath = getServerRuntimePath(slug);
258
+ await fs.writeJson(runtimePath, {
259
+ pid: process.pid,
260
+ port,
261
+ startedAt: new Date().toISOString(),
262
+ status: 'running',
263
+ }, { spaces: 2 });
264
+ // Graceful shutdown (remove runtime marker)
265
+ const shutdown = async () => {
266
+ logger.info('Shutting down MCP host...');
267
+ try {
268
+ await fs.remove(runtimePath);
269
+ }
270
+ catch { }
271
+ process.exit(0);
272
+ };
273
+ process.on('SIGTERM', shutdown);
274
+ process.on('SIGINT', shutdown);
275
+ logger.info(`MCP server ready at http://${bindHost}:${port}/mcp`);
276
+ logger.info(`Auth header required: Authorization: Bearer ${maskSecret(authKey)}`);
277
+ serve({
278
+ fetch: app.fetch,
279
+ port,
280
+ hostname: bindHost,
281
+ });
282
+ }
283
+ /**
284
+ * Direct execution guard for host mode.
285
+ *
286
+ * Only activates the host parser+server when the four --slug/--port/--data-dir/--auth-key
287
+ * args are present. This reliably distinguishes:
288
+ * - `tsx src/mcp/host.ts --slug ...` (manual/dev)
289
+ * - `node --import tsx ...`
290
+ * - compiled-binary __internal-host self-spawn
291
+ *
292
+ * Prevents the main CLI bundle from ever entering host logic accidentally.
293
+ */
294
+ if (!process.argv.includes('__internal-host') &&
295
+ process.argv.includes('--slug') &&
296
+ process.argv.includes('--port') &&
297
+ process.argv.includes('--data-dir') &&
298
+ process.argv.includes('--auth-key')) {
299
+ parseArgs()
300
+ .then(startHostedServer)
301
+ .catch((err) => {
302
+ console.error('Fatal error starting MCP host:', err);
303
+ process.exit(1);
304
+ });
305
+ }
306
+ export { startHostedServer };
307
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/mcp/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MCP Proxy Host — bridges a stdio MCP server process to Hono + Streamable HTTP.
3
+ *
4
+ * Spawns the underlying stdio MCP server (defined in the server's template run config)
5
+ * as a persistent child process, then exposes it over authenticated HTTP with the same
6
+ * auth, rate-limiting, and audit middleware as host.ts.
7
+ *
8
+ * Features:
9
+ * - Auto-restart on child exit (exponential backoff, max MAX_RESTARTS attempts)
10
+ * - 30-second health ping to detect silent child hangs
11
+ * - SSE response wrapping: when client sends Accept: text/event-stream, the
12
+ * synchronous JSON-RPC response is streamed as an SSE event (phase 1 compatibility)
13
+ * - Batch JSON-RPC requests supported
14
+ * - Notifications (no id) forwarded without response
15
+ *
16
+ * See AGENTS.md Rule 9 "Two-Kind Template System" and "Proxy Mode".
17
+ */
18
+ export interface ProxyHostOptions {
19
+ slug: string;
20
+ port: number;
21
+ authKey: string;
22
+ bindHost?: string;
23
+ }
24
+ export declare function startProxyHost(opts: ProxyHostOptions): Promise<void>;
25
+ //# sourceMappingURL=proxy-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-host.d.ts","sourceRoot":"","sources":["../../src/mcp/proxy-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6MD,wBAAsB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwL1E"}