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.
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/STABILITY.md +109 -0
- package/bin/hoolix.js +50 -0
- package/bin/mcp-portal.js +12 -0
- package/bin/postinstall.js +61 -0
- package/dist/app/contracts.d.ts +105 -0
- package/dist/app/contracts.d.ts.map +1 -0
- package/dist/app/contracts.js +2 -0
- package/dist/app/contracts.js.map +1 -0
- package/dist/app/events.d.ts +13 -0
- package/dist/app/events.d.ts.map +1 -0
- package/dist/app/events.js +13 -0
- package/dist/app/events.js.map +1 -0
- package/dist/app/services/analytics.d.ts +42 -0
- package/dist/app/services/analytics.d.ts.map +1 -0
- package/dist/app/services/analytics.js +106 -0
- package/dist/app/services/analytics.js.map +1 -0
- package/dist/app/services/catalog.d.ts +14 -0
- package/dist/app/services/catalog.d.ts.map +1 -0
- package/dist/app/services/catalog.js +26 -0
- package/dist/app/services/catalog.js.map +1 -0
- package/dist/app/services/credentials.d.ts +42 -0
- package/dist/app/services/credentials.d.ts.map +1 -0
- package/dist/app/services/credentials.js +143 -0
- package/dist/app/services/credentials.js.map +1 -0
- package/dist/app/services/servers.d.ts +15 -0
- package/dist/app/services/servers.d.ts.map +1 -0
- package/dist/app/services/servers.js +445 -0
- package/dist/app/services/servers.js.map +1 -0
- package/dist/catalog/community.d.ts +19 -0
- package/dist/catalog/community.d.ts.map +1 -0
- package/dist/catalog/community.js +53 -0
- package/dist/catalog/community.js.map +1 -0
- package/dist/catalog/templates.d.ts +436 -0
- package/dist/catalog/templates.d.ts.map +1 -0
- package/dist/catalog/templates.js +489 -0
- package/dist/catalog/templates.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +122 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bundle.d.ts +11 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +299 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/clients.d.ts +6 -0
- package/dist/commands/clients.d.ts.map +1 -0
- package/dist/commands/clients.js +242 -0
- package/dist/commands/clients.js.map +1 -0
- package/dist/commands/completion.d.ts +18 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +495 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/connect.d.ts +10 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +463 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +607 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +44 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +259 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +93 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/gui.d.ts +2 -0
- package/dist/commands/gui.d.ts.map +1 -0
- package/dist/commands/gui.js +19 -0
- package/dist/commands/gui.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +102 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +151 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +90 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/reindex.d.ts +2 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +186 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/rotate.d.ts +2 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +67 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/secrets.d.ts +10 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +293 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +234 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stats.d.ts +2 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +220 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +24 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/templates.d.ts +2 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +168 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/trial.d.ts +2 -0
- package/dist/commands/trial.d.ts.map +1 -0
- package/dist/commands/trial.js +61 -0
- package/dist/commands/trial.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +114 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +104 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +301 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/config.d.ts +25 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +54 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +25 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +53 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +12 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/paths.d.ts +15 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +51 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/registry.d.ts +474 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +186 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/updater.d.ts +16 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +317 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +3 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +13 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +107 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/cleaners.d.ts +10 -0
- package/dist/ingestion/cleaners.d.ts.map +1 -0
- package/dist/ingestion/cleaners.js +61 -0
- package/dist/ingestion/cleaners.js.map +1 -0
- package/dist/ingestion/detectors.d.ts +5 -0
- package/dist/ingestion/detectors.d.ts.map +1 -0
- package/dist/ingestion/detectors.js +25 -0
- package/dist/ingestion/detectors.js.map +1 -0
- package/dist/ingestion/fetchers.d.ts +38 -0
- package/dist/ingestion/fetchers.d.ts.map +1 -0
- package/dist/ingestion/fetchers.js +296 -0
- package/dist/ingestion/fetchers.js.map +1 -0
- package/dist/ingestion/github.d.ts +60 -0
- package/dist/ingestion/github.d.ts.map +1 -0
- package/dist/ingestion/github.js +314 -0
- package/dist/ingestion/github.js.map +1 -0
- package/dist/ingestion/pipeline.d.ts +3 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +160 -0
- package/dist/ingestion/pipeline.js.map +1 -0
- package/dist/ingestion/types.d.ts +51 -0
- package/dist/ingestion/types.d.ts.map +1 -0
- package/dist/ingestion/types.js +2 -0
- package/dist/ingestion/types.js.map +1 -0
- package/dist/lib/auth.d.ts +2 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +6 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/embedding.d.ts +10 -0
- package/dist/lib/embedding.d.ts.map +1 -0
- package/dist/lib/embedding.js +21 -0
- package/dist/lib/embedding.js.map +1 -0
- package/dist/mcp/host.d.ts +16 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +307 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/proxy-host.d.ts +25 -0
- package/dist/mcp/proxy-host.d.ts.map +1 -0
- package/dist/mcp/proxy-host.js +393 -0
- package/dist/mcp/proxy-host.js.map +1 -0
- package/dist/mcp/stdio-host.d.ts +19 -0
- package/dist/mcp/stdio-host.d.ts.map +1 -0
- package/dist/mcp/stdio-host.js +175 -0
- package/dist/mcp/stdio-host.js.map +1 -0
- package/dist/process/manager.d.ts +74 -0
- package/dist/process/manager.d.ts.map +1 -0
- package/dist/process/manager.js +322 -0
- package/dist/process/manager.js.map +1 -0
- package/dist/rag/models.d.ts +30 -0
- package/dist/rag/models.d.ts.map +1 -0
- package/dist/rag/models.js +30 -0
- package/dist/rag/models.js.map +1 -0
- package/dist/rag/store.d.ts +63 -0
- package/dist/rag/store.d.ts.map +1 -0
- package/dist/rag/store.js +505 -0
- package/dist/rag/store.js.map +1 -0
- package/dist/rag/types.d.ts +56 -0
- package/dist/rag/types.d.ts.map +1 -0
- package/dist/rag/types.js +2 -0
- package/dist/rag/types.js.map +1 -0
- package/dist/sources/plugins.d.ts +25 -0
- package/dist/sources/plugins.d.ts.map +1 -0
- package/dist/sources/plugins.js +55 -0
- package/dist/sources/plugins.js.map +1 -0
- package/dist/sources/registry.d.ts +19 -0
- package/dist/sources/registry.d.ts.map +1 -0
- package/dist/sources/registry.js +183 -0
- package/dist/sources/registry.js.map +1 -0
- package/dist/sources/types.d.ts +361 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +59 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/tui/index.d.ts +22 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +711 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/ui/format.d.ts +27 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +80 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/help.d.ts +2 -0
- package/dist/ui/help.d.ts.map +1 -0
- package/dist/ui/help.js +106 -0
- package/dist/ui/help.js.map +1 -0
- package/dist/web/assets.d.ts +2 -0
- package/dist/web/assets.d.ts.map +1 -0
- package/dist/web/assets.js +659 -0
- package/dist/web/assets.js.map +1 -0
- package/dist/web/server.d.ts +9 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +349 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface StartOptions {
|
|
2
|
+
port?: number;
|
|
3
|
+
authKey?: string;
|
|
4
|
+
detach?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ServerStatus {
|
|
7
|
+
running: boolean;
|
|
8
|
+
pid?: number;
|
|
9
|
+
port?: number;
|
|
10
|
+
startedAt?: string;
|
|
11
|
+
mode?: 'http' | 'proxy';
|
|
12
|
+
}
|
|
13
|
+
export interface HostSpawnPlanInput {
|
|
14
|
+
slug: string;
|
|
15
|
+
port: number;
|
|
16
|
+
dataDir: string;
|
|
17
|
+
authKey: string;
|
|
18
|
+
execPath?: string;
|
|
19
|
+
platform?: NodeJS.Platform;
|
|
20
|
+
cwd?: string;
|
|
21
|
+
tsxExists?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface HostSpawnPlan {
|
|
24
|
+
command: string;
|
|
25
|
+
args: string[];
|
|
26
|
+
mode: 'binary' | 'dev-tsx-bin' | 'dev-node-import';
|
|
27
|
+
}
|
|
28
|
+
export declare function buildHostSpawnPlan(input: HostSpawnPlanInput): HostSpawnPlan;
|
|
29
|
+
export interface ProxySpawnPlan {
|
|
30
|
+
command: string;
|
|
31
|
+
args: string[];
|
|
32
|
+
mode: 'binary' | 'dev-tsx-bin' | 'dev-node-import';
|
|
33
|
+
}
|
|
34
|
+
export declare function buildProxySpawnPlan(input: {
|
|
35
|
+
slug: string;
|
|
36
|
+
port: number;
|
|
37
|
+
authKey: string;
|
|
38
|
+
execPath?: string;
|
|
39
|
+
platform?: NodeJS.Platform;
|
|
40
|
+
cwd?: string;
|
|
41
|
+
tsxExists?: boolean;
|
|
42
|
+
}): ProxySpawnPlan;
|
|
43
|
+
export declare class ServerManager {
|
|
44
|
+
/**
|
|
45
|
+
* Start a server by spawning the MCP host (binary or dev tsx path).
|
|
46
|
+
* Handles early runtime marker, health probe, and Windows process checks.
|
|
47
|
+
*/
|
|
48
|
+
start(slug: string, opts?: StartOptions): Promise<{
|
|
49
|
+
port: number;
|
|
50
|
+
authKey: string;
|
|
51
|
+
pid: number;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Start an mcp-server in proxy mode: spawns proxy-host.ts which bridges the
|
|
55
|
+
* underlying stdio server to an authenticated HTTP endpoint.
|
|
56
|
+
*/
|
|
57
|
+
startProxied(slug: string, opts?: StartOptions): Promise<{
|
|
58
|
+
port: number;
|
|
59
|
+
authKey: string;
|
|
60
|
+
pid: number;
|
|
61
|
+
}>;
|
|
62
|
+
stop(slug: string, force?: boolean): Promise<boolean>;
|
|
63
|
+
getStatus(slug: string): Promise<ServerStatus>;
|
|
64
|
+
private getMetadata;
|
|
65
|
+
private readLogTail;
|
|
66
|
+
/** Wait for HTTP /health to respond (authoritative liveness after spawn). */
|
|
67
|
+
private waitForHttpHealth;
|
|
68
|
+
private isProcessAlive;
|
|
69
|
+
/** Real TCP probe (listen briefly on loopback) to find free port. Avoids races. */
|
|
70
|
+
private isPortFree;
|
|
71
|
+
private findFreePort;
|
|
72
|
+
}
|
|
73
|
+
export declare const serverManager: ServerManager;
|
|
74
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,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;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;CACpD;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAgE3E;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;CACpD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,cAAc,CA4BjB;AAED,qBAAa,aAAa;IACxB;;;OAGG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAuE3G;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAmD5G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBnD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YA2BtC,WAAW;YAKX,WAAW;IASzB,6EAA6E;YAE/D,iBAAiB;YAkBjB,cAAc;IAc5B,mFAAmF;YACrE,UAAU;YAcV,YAAY;CAW3B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import net from 'node:net';
|
|
5
|
+
import { getServerRuntimePath, getServerDir, getServerMetadataPath } from '../core/paths.js';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
import treeKill from 'tree-kill';
|
|
8
|
+
import psList from 'ps-list';
|
|
9
|
+
const BASE_PORT = 3456;
|
|
10
|
+
export function buildHostSpawnPlan(input) {
|
|
11
|
+
const currentBin = input.execPath || process.execPath;
|
|
12
|
+
const isNodeOrBun = currentBin.includes('node') || currentBin.includes('bun');
|
|
13
|
+
const root = input.cwd || process.cwd();
|
|
14
|
+
const hostScript = path.resolve(root, 'src/mcp/host.ts');
|
|
15
|
+
if (!isNodeOrBun) {
|
|
16
|
+
return {
|
|
17
|
+
command: currentBin,
|
|
18
|
+
args: [
|
|
19
|
+
'__internal-host',
|
|
20
|
+
'--slug', input.slug,
|
|
21
|
+
'--port', String(input.port),
|
|
22
|
+
'--data-dir', input.dataDir,
|
|
23
|
+
'--auth-key', input.authKey,
|
|
24
|
+
],
|
|
25
|
+
mode: 'binary',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const platform = input.platform || process.platform;
|
|
29
|
+
if (platform === 'win32') {
|
|
30
|
+
return {
|
|
31
|
+
command: currentBin,
|
|
32
|
+
args: [
|
|
33
|
+
'--import', 'tsx',
|
|
34
|
+
hostScript,
|
|
35
|
+
'--slug', input.slug,
|
|
36
|
+
'--port', String(input.port),
|
|
37
|
+
'--data-dir', input.dataDir,
|
|
38
|
+
'--auth-key', input.authKey,
|
|
39
|
+
],
|
|
40
|
+
mode: 'dev-node-import',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const tsxBin = path.resolve(root, 'node_modules', '.bin', 'tsx');
|
|
44
|
+
const tsxExists = input.tsxExists ?? fs.pathExistsSync(tsxBin);
|
|
45
|
+
if (tsxExists) {
|
|
46
|
+
return {
|
|
47
|
+
command: tsxBin,
|
|
48
|
+
args: [
|
|
49
|
+
hostScript,
|
|
50
|
+
'--slug', input.slug,
|
|
51
|
+
'--port', String(input.port),
|
|
52
|
+
'--data-dir', input.dataDir,
|
|
53
|
+
'--auth-key', input.authKey,
|
|
54
|
+
],
|
|
55
|
+
mode: 'dev-tsx-bin',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
command: currentBin,
|
|
60
|
+
args: [
|
|
61
|
+
'--import', 'tsx',
|
|
62
|
+
hostScript,
|
|
63
|
+
'--slug', input.slug,
|
|
64
|
+
'--port', String(input.port),
|
|
65
|
+
'--data-dir', input.dataDir,
|
|
66
|
+
'--auth-key', input.authKey,
|
|
67
|
+
],
|
|
68
|
+
mode: 'dev-node-import',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function buildProxySpawnPlan(input) {
|
|
72
|
+
const currentBin = input.execPath || process.execPath;
|
|
73
|
+
const isNodeOrBun = currentBin.includes('node') || currentBin.includes('bun');
|
|
74
|
+
const root = input.cwd || process.cwd();
|
|
75
|
+
const proxyScript = path.resolve(root, 'src/mcp/proxy-host.ts');
|
|
76
|
+
const proxyArgs = [
|
|
77
|
+
'--slug', input.slug,
|
|
78
|
+
'--port', String(input.port),
|
|
79
|
+
'--auth-key', input.authKey,
|
|
80
|
+
];
|
|
81
|
+
if (!isNodeOrBun) {
|
|
82
|
+
return { command: currentBin, args: ['__internal-proxy', ...proxyArgs], mode: 'binary' };
|
|
83
|
+
}
|
|
84
|
+
const platform = input.platform || process.platform;
|
|
85
|
+
if (platform === 'win32') {
|
|
86
|
+
return { command: currentBin, args: ['--import', 'tsx', proxyScript, ...proxyArgs], mode: 'dev-node-import' };
|
|
87
|
+
}
|
|
88
|
+
const tsxBin = path.resolve(root, 'node_modules', '.bin', 'tsx');
|
|
89
|
+
const tsxExists = input.tsxExists ?? fs.pathExistsSync(tsxBin);
|
|
90
|
+
if (tsxExists) {
|
|
91
|
+
return { command: tsxBin, args: [proxyScript, ...proxyArgs], mode: 'dev-tsx-bin' };
|
|
92
|
+
}
|
|
93
|
+
return { command: currentBin, args: ['--import', 'tsx', proxyScript, ...proxyArgs], mode: 'dev-node-import' };
|
|
94
|
+
}
|
|
95
|
+
export class ServerManager {
|
|
96
|
+
/**
|
|
97
|
+
* Start a server by spawning the MCP host (binary or dev tsx path).
|
|
98
|
+
* Handles early runtime marker, health probe, and Windows process checks.
|
|
99
|
+
*/
|
|
100
|
+
async start(slug, opts = {}) {
|
|
101
|
+
const runtimePath = getServerRuntimePath(slug);
|
|
102
|
+
// Return existing if .runtime.json + ps check says it's alive
|
|
103
|
+
const existing = await this.getStatus(slug);
|
|
104
|
+
if (existing.running && existing.port && existing.pid) {
|
|
105
|
+
const meta = await this.getMetadata(slug);
|
|
106
|
+
return { port: existing.port, authKey: meta.authKey, pid: existing.pid };
|
|
107
|
+
}
|
|
108
|
+
const dataDir = path.join(getServerDir(slug), 'data');
|
|
109
|
+
const meta = await this.getMetadata(slug);
|
|
110
|
+
const port = opts.port || await this.findFreePort(BASE_PORT + Math.floor(Math.random() * 400));
|
|
111
|
+
const authKey = opts.authKey || meta.authKey;
|
|
112
|
+
const hostLogPath = path.join(getServerDir(slug), 'host.log');
|
|
113
|
+
logger.info(`Spawning MCP host for "${slug}" on port ${port}...`);
|
|
114
|
+
// Early "starting" marker so concurrent status checks see progress
|
|
115
|
+
await fs.writeJson(runtimePath, {
|
|
116
|
+
pid: -1,
|
|
117
|
+
port,
|
|
118
|
+
startedAt: new Date().toISOString(),
|
|
119
|
+
status: 'starting',
|
|
120
|
+
}, { spaces: 2 });
|
|
121
|
+
const spawnPlan = buildHostSpawnPlan({ slug, port, dataDir, authKey });
|
|
122
|
+
await fs.ensureFile(hostLogPath);
|
|
123
|
+
await fs.appendFile(hostLogPath, `\n--- ${new Date().toISOString()} start ${slug} on :${port} ---\n`);
|
|
124
|
+
const logFd = fs.openSync(hostLogPath, 'a');
|
|
125
|
+
const child = spawn(spawnPlan.command, spawnPlan.args, {
|
|
126
|
+
stdio: ['ignore', logFd, logFd],
|
|
127
|
+
detached: opts.detach ?? true,
|
|
128
|
+
env: { ...process.env, MCP_PORTAL_LOG_LEVEL: process.env.MCP_PORTAL_LOG_LEVEL || 'info' },
|
|
129
|
+
});
|
|
130
|
+
fs.closeSync(logFd);
|
|
131
|
+
child.on('exit', (code, signal) => {
|
|
132
|
+
if (code !== 0) {
|
|
133
|
+
logger.error(`MCP host for ${slug} exited (code=${code}, signal=${signal})`);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// Wait + HTTP /health probe (more reliable than relying solely on child writing .runtime.json).
|
|
137
|
+
const probeOk = await this.waitForHttpHealth(port, 15000);
|
|
138
|
+
if (!probeOk) {
|
|
139
|
+
try {
|
|
140
|
+
treeKill(child.pid, 'SIGKILL');
|
|
141
|
+
}
|
|
142
|
+
catch { }
|
|
143
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
144
|
+
const tail = await this.readLogTail(hostLogPath);
|
|
145
|
+
throw new Error(`Failed to start "${slug}" — health check on :${port} did not succeed.\nRecent logs:\n${tail}`);
|
|
146
|
+
}
|
|
147
|
+
// Authoritative runtime file written by parent after health confirmed
|
|
148
|
+
const pid = child.pid;
|
|
149
|
+
await fs.writeJson(runtimePath, {
|
|
150
|
+
pid,
|
|
151
|
+
port,
|
|
152
|
+
startedAt: new Date().toISOString(),
|
|
153
|
+
status: 'running',
|
|
154
|
+
}, { spaces: 2 });
|
|
155
|
+
child.unref();
|
|
156
|
+
return { port, authKey, pid };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Start an mcp-server in proxy mode: spawns proxy-host.ts which bridges the
|
|
160
|
+
* underlying stdio server to an authenticated HTTP endpoint.
|
|
161
|
+
*/
|
|
162
|
+
async startProxied(slug, opts = {}) {
|
|
163
|
+
const runtimePath = getServerRuntimePath(slug);
|
|
164
|
+
// Re-use if already running (any mode — caller decides whether to stop first)
|
|
165
|
+
const existing = await this.getStatus(slug);
|
|
166
|
+
if (existing.running && existing.port && existing.pid) {
|
|
167
|
+
const meta = await this.getMetadata(slug);
|
|
168
|
+
return { port: existing.port, authKey: meta.authKey, pid: existing.pid };
|
|
169
|
+
}
|
|
170
|
+
const meta = await this.getMetadata(slug);
|
|
171
|
+
const port = opts.port || await this.findFreePort(BASE_PORT + Math.floor(Math.random() * 400));
|
|
172
|
+
const authKey = opts.authKey || meta.authKey;
|
|
173
|
+
const hostLogPath = path.join(getServerDir(slug), 'host.log');
|
|
174
|
+
logger.info(`Spawning proxy host for "${slug}" on port ${port}...`);
|
|
175
|
+
await fs.writeJson(runtimePath, { pid: -1, port, startedAt: new Date().toISOString(), status: 'starting', mode: 'proxy' }, { spaces: 2 });
|
|
176
|
+
const spawnPlan = buildProxySpawnPlan({ slug, port, authKey });
|
|
177
|
+
await fs.ensureFile(hostLogPath);
|
|
178
|
+
await fs.appendFile(hostLogPath, `\n--- ${new Date().toISOString()} proxy-spawn ${slug} on :${port} ---\n`);
|
|
179
|
+
const logFd = fs.openSync(hostLogPath, 'a');
|
|
180
|
+
const child = spawn(spawnPlan.command, spawnPlan.args, {
|
|
181
|
+
stdio: ['ignore', logFd, logFd],
|
|
182
|
+
detached: opts.detach ?? true,
|
|
183
|
+
env: { ...process.env, MCP_PORTAL_LOG_LEVEL: process.env.MCP_PORTAL_LOG_LEVEL || 'info' },
|
|
184
|
+
});
|
|
185
|
+
fs.closeSync(logFd);
|
|
186
|
+
child.on('exit', (code, signal) => {
|
|
187
|
+
if (code !== 0)
|
|
188
|
+
logger.error(`Proxy host for ${slug} exited (code=${code}, signal=${signal})`);
|
|
189
|
+
});
|
|
190
|
+
const probeOk = await this.waitForHttpHealth(port, 20000);
|
|
191
|
+
if (!probeOk) {
|
|
192
|
+
try {
|
|
193
|
+
treeKill(child.pid, 'SIGKILL');
|
|
194
|
+
}
|
|
195
|
+
catch { }
|
|
196
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
197
|
+
const tail = await this.readLogTail(hostLogPath);
|
|
198
|
+
throw new Error(`Failed to start proxy for "${slug}" — health check on :${port} timed out.\nRecent logs:\n${tail}`);
|
|
199
|
+
}
|
|
200
|
+
const pid = child.pid;
|
|
201
|
+
await fs.writeJson(runtimePath, { pid, port, startedAt: new Date().toISOString(), status: 'running', mode: 'proxy' }, { spaces: 2 });
|
|
202
|
+
child.unref();
|
|
203
|
+
return { port, authKey, pid };
|
|
204
|
+
}
|
|
205
|
+
async stop(slug, force = false) {
|
|
206
|
+
const runtimePath = getServerRuntimePath(slug);
|
|
207
|
+
const status = await this.getStatus(slug);
|
|
208
|
+
if (!status.running || !status.pid) {
|
|
209
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
treeKill(status.pid, force ? 'SIGKILL' : 'SIGTERM', async (err) => {
|
|
214
|
+
if (err) {
|
|
215
|
+
logger.warn(`tree-kill error for ${slug}: ${err.message}`);
|
|
216
|
+
}
|
|
217
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
218
|
+
resolve(true);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
async getStatus(slug) {
|
|
223
|
+
const runtimePath = getServerRuntimePath(slug);
|
|
224
|
+
if (!(await fs.pathExists(runtimePath))) {
|
|
225
|
+
return { running: false };
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const data = await fs.readJson(runtimePath);
|
|
229
|
+
// Verify alive via ps-list (critical on Windows where signals are limited)
|
|
230
|
+
const alive = await this.isProcessAlive(data.pid);
|
|
231
|
+
if (!alive) {
|
|
232
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
233
|
+
return { running: false };
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
running: true,
|
|
237
|
+
pid: data.pid,
|
|
238
|
+
port: data.port,
|
|
239
|
+
startedAt: data.startedAt,
|
|
240
|
+
mode: (data.mode === 'proxy' ? 'proxy' : 'http'),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
245
|
+
return { running: false };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async getMetadata(slug) {
|
|
249
|
+
const metaPath = getServerMetadataPath(slug);
|
|
250
|
+
return fs.readJson(metaPath);
|
|
251
|
+
}
|
|
252
|
+
async readLogTail(logPath) {
|
|
253
|
+
try {
|
|
254
|
+
const log = await fs.readFile(logPath, 'utf8');
|
|
255
|
+
return log.slice(-2000) || '(host log was empty)';
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return '(host log unavailable)';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** Wait for HTTP /health to respond (authoritative liveness after spawn). */
|
|
262
|
+
async waitForHttpHealth(port, timeoutMs) {
|
|
263
|
+
const start = Date.now();
|
|
264
|
+
const url = `http://127.0.0.1:${port}/health`;
|
|
265
|
+
while (Date.now() - start < timeoutMs) {
|
|
266
|
+
try {
|
|
267
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(800) });
|
|
268
|
+
if (res.ok) {
|
|
269
|
+
logger.info(`Health check passed on :${port}`);
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// not ready yet; loop with backoff
|
|
275
|
+
}
|
|
276
|
+
await new Promise(r => setTimeout(r, 400));
|
|
277
|
+
}
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
async isProcessAlive(pid) {
|
|
281
|
+
try {
|
|
282
|
+
const list = await psList();
|
|
283
|
+
return list.some((p) => p.pid === pid);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
try {
|
|
287
|
+
process.kill(pid, 0);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/** Real TCP probe (listen briefly on loopback) to find free port. Avoids races. */
|
|
296
|
+
async isPortFree(port) {
|
|
297
|
+
return new Promise((resolve) => {
|
|
298
|
+
const server = net.createServer();
|
|
299
|
+
server.once('error', () => {
|
|
300
|
+
resolve(false);
|
|
301
|
+
});
|
|
302
|
+
server.once('listening', () => {
|
|
303
|
+
server.close(() => resolve(true));
|
|
304
|
+
});
|
|
305
|
+
// Bind loopback only (matches host bindHost='127.0.0.1')
|
|
306
|
+
server.listen(port, '127.0.0.1');
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async findFreePort(startPort) {
|
|
310
|
+
// Probe range to avoid collisions (real listen probe, not just math).
|
|
311
|
+
for (let p = startPort; p < startPort + 200; p++) {
|
|
312
|
+
if (await this.isPortFree(p)) {
|
|
313
|
+
return p;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Last resort (health probe later will fail loudly if still occupied)
|
|
317
|
+
logger.warn(`Could not find a free port in range ${startPort}-${startPort + 199}; using ${startPort}`);
|
|
318
|
+
return startPort;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
export const serverManager = new ServerManager();
|
|
322
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry for embedding models (DRY source of truth).
|
|
3
|
+
* - 'fuse': pure keyword/fuzzy (no ML)
|
|
4
|
+
* - 'hybrid-*': BGE bi-encoder via @huggingface/transformers (lazy) + cosine + Fuse blend/RRF
|
|
5
|
+
*
|
|
6
|
+
* Adding a new model: just extend the registry + the zod enums in core/config + core/registry
|
|
7
|
+
* (they import SUPPORTED_EMBEDDING_MODELS).
|
|
8
|
+
*
|
|
9
|
+
* All hybrid models follow BGE convention: queries get instruction prefix, passages do not.
|
|
10
|
+
* Model downloads cached by HF transformers.js (~first use only).
|
|
11
|
+
*/
|
|
12
|
+
export type EmbeddingModel = 'fuse' | 'hybrid-bge-small' | 'hybrid-bge-base';
|
|
13
|
+
export interface EmbeddingConfig {
|
|
14
|
+
/** HF model id (Xenova/ for onnx-converted that works in transformers.js) */
|
|
15
|
+
model: string;
|
|
16
|
+
dim: number;
|
|
17
|
+
queryPrefix: string;
|
|
18
|
+
passagePrefix: string;
|
|
19
|
+
normalize: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare const EMBEDDING_REGISTRY: Record<EmbeddingModel, EmbeddingConfig | null>;
|
|
22
|
+
export declare const SUPPORTED_EMBEDDING_MODELS: EmbeddingModel[];
|
|
23
|
+
export declare function getEmbeddingConfig(model: EmbeddingModel): EmbeddingConfig | null;
|
|
24
|
+
export declare function isHybridModel(model: EmbeddingModel | string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Recommended defaults for hybrid search tuning.
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFAULT_HYBRID_ALPHA = 0.7;
|
|
29
|
+
export declare const DEFAULT_RRF_K = 60;
|
|
30
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/rag/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,cAAc,EAAE,eAAe,GAAG,IAAI,CAgBpE,CAAC;AAEX,eAAO,MAAM,0BAA0B,EAAsC,cAAc,EAAE,CAAC;AAE9F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAEhF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAErE;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,aAAa,KAAK,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const EMBEDDING_REGISTRY = {
|
|
2
|
+
fuse: null,
|
|
3
|
+
'hybrid-bge-small': {
|
|
4
|
+
model: 'Xenova/bge-small-en-v1.5',
|
|
5
|
+
dim: 384,
|
|
6
|
+
queryPrefix: 'Represent this sentence for searching relevant passages: ',
|
|
7
|
+
passagePrefix: '',
|
|
8
|
+
normalize: true,
|
|
9
|
+
},
|
|
10
|
+
'hybrid-bge-base': {
|
|
11
|
+
model: 'Xenova/bge-base-en-v1.5',
|
|
12
|
+
dim: 768,
|
|
13
|
+
queryPrefix: 'Represent this sentence for searching relevant passages: ',
|
|
14
|
+
passagePrefix: '',
|
|
15
|
+
normalize: true,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export const SUPPORTED_EMBEDDING_MODELS = Object.keys(EMBEDDING_REGISTRY);
|
|
19
|
+
export function getEmbeddingConfig(model) {
|
|
20
|
+
return EMBEDDING_REGISTRY[model] ?? null;
|
|
21
|
+
}
|
|
22
|
+
export function isHybridModel(model) {
|
|
23
|
+
return typeof model === 'string' && model.startsWith('hybrid-');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Recommended defaults for hybrid search tuning.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_HYBRID_ALPHA = 0.7; // semantic weight in weighted blend (0..1)
|
|
29
|
+
export const DEFAULT_RRF_K = 60;
|
|
30
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/rag/models.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,kBAAkB,GAAmD;IAChF,IAAI,EAAE,IAAI;IACV,kBAAkB,EAAE;QAClB,KAAK,EAAE,0BAA0B;QACjC,GAAG,EAAE,GAAG;QACR,WAAW,EAAE,2DAA2D;QACxE,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,IAAI;KAChB;IACD,iBAAiB,EAAE;QACjB,KAAK,EAAE,yBAAyB;QAChC,GAAG,EAAE,GAAG;QACR,WAAW,EAAE,2DAA2D;QACxE,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,IAAI;KAChB;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAqB,CAAC;AAE9F,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA8B;IAC1D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,CAAC,2CAA2C;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { IngestedChunk } from '../ingestion/types.js';
|
|
2
|
+
import type { SearchResult, ReadPageResult, TableOfContentsItem, RAGDiagnostics, RAGSearchOptions, EmbeddingModel } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pure-JS cosine similarity (no deps). Used for hybrid semantic scores.
|
|
5
|
+
* Returns value in [-1, 1]; higher is better.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
8
|
+
/**
|
|
9
|
+
* Reciprocal Rank Fusion (RRF) — lightweight, model-free reranker for hybrid search.
|
|
10
|
+
* Combines two ranked lists (e.g. keyword + semantic) using rank positions.
|
|
11
|
+
* Often outperforms simple score blending for relevance.
|
|
12
|
+
*/
|
|
13
|
+
export declare function reciprocalRankFusion(listA: Array<{
|
|
14
|
+
id: string;
|
|
15
|
+
}>, listB: Array<{
|
|
16
|
+
id: string;
|
|
17
|
+
}>, k?: number): Map<string, number>;
|
|
18
|
+
export declare class DocumentationRAG {
|
|
19
|
+
private chunks;
|
|
20
|
+
private fuse;
|
|
21
|
+
private embeddings;
|
|
22
|
+
private embedPipeline;
|
|
23
|
+
private activeConfig;
|
|
24
|
+
private queryEmbedCache;
|
|
25
|
+
private readonly QUERY_CACHE_MAX;
|
|
26
|
+
private readonly slug;
|
|
27
|
+
private readonly dataDir;
|
|
28
|
+
private chunksFile;
|
|
29
|
+
private embeddingsFile;
|
|
30
|
+
private embeddingModel;
|
|
31
|
+
constructor(slug: string, embeddingModel?: EmbeddingModel);
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
private loadEmbeddingsIfPresent;
|
|
34
|
+
/** Clear query embed cache (e.g. after big changes, or for testing) */
|
|
35
|
+
clearQueryCache(): void;
|
|
36
|
+
private buildFuseIndex;
|
|
37
|
+
private scoreKeywordMatch;
|
|
38
|
+
/**
|
|
39
|
+
* indexChunks: persist + build Fuse (and optional embeddings for hybrid).
|
|
40
|
+
* options.embeddingModel controls whether to compute/persist BGE vectors (lazy download on first hybrid use).
|
|
41
|
+
* Called from create/reindex; onProgress used for 'embed' stage reporting.
|
|
42
|
+
*
|
|
43
|
+
* Smart caching for embeddings (persistent on disk) + forceReembed opt.
|
|
44
|
+
*/
|
|
45
|
+
indexChunks(chunks: IngestedChunk[], options?: {
|
|
46
|
+
embeddingModel?: EmbeddingModel;
|
|
47
|
+
onProgress?: (p: {
|
|
48
|
+
stage: string;
|
|
49
|
+
message: string;
|
|
50
|
+
current?: number;
|
|
51
|
+
total?: number;
|
|
52
|
+
}) => void;
|
|
53
|
+
forceReembed?: boolean;
|
|
54
|
+
}): Promise<number>;
|
|
55
|
+
private getEmbedder;
|
|
56
|
+
search(query: string, opts?: RAGSearchOptions): Promise<SearchResult[]>;
|
|
57
|
+
readPage(urlOrPath: string, maxChunks?: number): Promise<ReadPageResult | null>;
|
|
58
|
+
getTableOfContents(): Promise<TableOfContentsItem[]>;
|
|
59
|
+
getDiagnostics(): Promise<RAGDiagnostics>;
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export declare function createRAGForServer(slug: string, embeddingModel?: EmbeddingModel): Promise<DocumentationRAG>;
|
|
63
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/rag/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAcjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EAC5B,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EAC5B,CAAC,GAAE,MAAsB,GACxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYrB;AAkDD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAA+C;IAInE,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IAEvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAA0B;gBAEpC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,cAAuB;IAS3D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAWnB,uBAAuB;IAUrC,uEAAuE;IACvE,eAAe,IAAI,IAAI;IAIvB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,iBAAiB;IAgDzB;;;;;;OAMG;IACG,WAAW,CACf,MAAM,EAAE,aAAa,EAAE,EACvB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAC/F,YAAY,CAAC,EAAE,OAAO,CAAC;KACnB,GACL,OAAO,CAAC,MAAM,CAAC;YA6FJ,WAAW;IAenB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsJ3E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwB3E,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA0BpD,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IA6BzC,KAAK;CAGZ;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,cAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAIzH"}
|