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,16 @@
|
|
|
1
|
+
export interface UpdateCheckResult {
|
|
2
|
+
currentVersion: string;
|
|
3
|
+
latestVersion: string;
|
|
4
|
+
isOutdated: boolean;
|
|
5
|
+
assetUrl?: string;
|
|
6
|
+
assetName?: string;
|
|
7
|
+
checksumUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Detect whether the current process is a compiled Bun binary or an npm global install. */
|
|
10
|
+
export declare function getInstallMethod(): 'binary' | 'npm' | 'dev';
|
|
11
|
+
export declare function checkForUpdate(): Promise<UpdateCheckResult>;
|
|
12
|
+
export declare function performUpdate(restartSlugs?: string[], options?: {
|
|
13
|
+
quiet?: boolean;
|
|
14
|
+
noVerify?: boolean;
|
|
15
|
+
}): Promise<boolean>;
|
|
16
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/core/updater.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK,CAmB3D;AAqBD,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAyCjE;AAkCD,wBAAsB,aAAa,CACjC,YAAY,GAAE,MAAM,EAAO,EAC3B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAqJlB"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { VERSION } from './version.js';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
const REPO = 'JayLLM/hoolix'; // GitHub repo (keep stable); product branded as Hoolix
|
|
6
|
+
const GITHUB_RELEASES_API = `https://api.github.com/repos/${REPO}/releases`;
|
|
7
|
+
/** Detect whether the current process is a compiled Bun binary or an npm global install. */
|
|
8
|
+
export function getInstallMethod() {
|
|
9
|
+
const execPath = process.execPath;
|
|
10
|
+
// Compiled bun binary: execPath is the hoolix binary itself
|
|
11
|
+
if (!execPath.includes('node') && !execPath.includes('bun') && !execPath.includes('tsx')) {
|
|
12
|
+
return 'binary';
|
|
13
|
+
}
|
|
14
|
+
// npm global install: dist/index.js loaded in same process
|
|
15
|
+
// Heuristic: package.json dist/index.js is on the resolved import.meta path
|
|
16
|
+
// We check if __dirname from the entry point is inside node_modules or a global prefix
|
|
17
|
+
try {
|
|
18
|
+
const npmGlobal = process.env.npm_config_prefix || process.env.npm_global_prefix;
|
|
19
|
+
if (npmGlobal)
|
|
20
|
+
return 'npm';
|
|
21
|
+
// Another heuristic: if we have node in execPath and no tsx, likely npm global
|
|
22
|
+
if (execPath.includes('node') && !execPath.includes('tsx')) {
|
|
23
|
+
// Check if we're inside a project dev dir (src/ exists next to dist/)
|
|
24
|
+
return 'npm'; // best-effort for npm global context
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
return 'dev';
|
|
29
|
+
}
|
|
30
|
+
function getPlatformAssetName() {
|
|
31
|
+
const platform = process.platform;
|
|
32
|
+
const arch = process.arch;
|
|
33
|
+
if (platform === 'win32') {
|
|
34
|
+
if (arch === 'x64')
|
|
35
|
+
return 'hoolix-windows-x64.exe';
|
|
36
|
+
if (arch === 'arm64')
|
|
37
|
+
return 'hoolix-windows-x64.exe'; // x64 via emulation
|
|
38
|
+
}
|
|
39
|
+
if (platform === 'darwin') {
|
|
40
|
+
if (arch === 'x64')
|
|
41
|
+
return 'hoolix-darwin-x64';
|
|
42
|
+
if (arch === 'arm64')
|
|
43
|
+
return 'hoolix-darwin-arm64';
|
|
44
|
+
}
|
|
45
|
+
if (platform === 'linux') {
|
|
46
|
+
if (arch === 'x64')
|
|
47
|
+
return 'hoolix-linux-x64';
|
|
48
|
+
if (arch === 'arm64')
|
|
49
|
+
return 'hoolix-linux-arm64';
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
export async function checkForUpdate() {
|
|
54
|
+
const currentVersion = VERSION.replace(/^v/, '');
|
|
55
|
+
const currentIsPrerelease = parseVersion(currentVersion).prerelease.length > 0;
|
|
56
|
+
try {
|
|
57
|
+
const res = await fetch(`${GITHUB_RELEASES_API}?per_page=20`, {
|
|
58
|
+
headers: { 'User-Agent': 'hoolix-updater' },
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok)
|
|
61
|
+
throw new Error(`GitHub API returned ${res.status}`);
|
|
62
|
+
const releases = (await res.json());
|
|
63
|
+
const candidates = releases
|
|
64
|
+
.filter((release) => !release.draft)
|
|
65
|
+
.filter((release) => currentIsPrerelease || !release.prerelease)
|
|
66
|
+
.sort((a, b) => compareVersions(b.tag_name, a.tag_name));
|
|
67
|
+
const release = candidates[0];
|
|
68
|
+
if (!release) {
|
|
69
|
+
return { currentVersion, latestVersion: currentVersion, isOutdated: false };
|
|
70
|
+
}
|
|
71
|
+
const latestVersion = release.tag_name.replace(/^v/, '');
|
|
72
|
+
const isOutdated = compareVersions(currentVersion, latestVersion) < 0;
|
|
73
|
+
const assetName = getPlatformAssetName();
|
|
74
|
+
const asset = assetName ? release.assets.find((a) => a.name === assetName) : undefined;
|
|
75
|
+
const checksumAsset = release.assets.find((a) => a.name === 'SHA256SUMS');
|
|
76
|
+
return {
|
|
77
|
+
currentVersion,
|
|
78
|
+
latestVersion,
|
|
79
|
+
isOutdated,
|
|
80
|
+
assetUrl: asset?.browser_download_url,
|
|
81
|
+
assetName: asset?.name,
|
|
82
|
+
checksumUrl: checksumAsset?.browser_download_url,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
logger.debug('Update check failed:', err.message);
|
|
87
|
+
return { currentVersion, latestVersion: currentVersion, isOutdated: false };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Download the SHA256SUMS file and verify the given binary matches.
|
|
91
|
+
* Returns { ok: boolean, verified: boolean }.
|
|
92
|
+
* verified=false means the checksum file was not available (non-fatal). */
|
|
93
|
+
async function verifyChecksum(binaryPath, assetName, checksumUrl) {
|
|
94
|
+
if (!checksumUrl)
|
|
95
|
+
return { ok: true, verified: false };
|
|
96
|
+
try {
|
|
97
|
+
const res = await fetch(checksumUrl, { headers: { 'User-Agent': 'hoolix-updater' } });
|
|
98
|
+
if (!res.ok)
|
|
99
|
+
return { ok: true, verified: false };
|
|
100
|
+
const text = await res.text();
|
|
101
|
+
// SHA256SUMS format: "<hash> <filename>" (sha256sum) or "<hash> <filename>" (shasum)
|
|
102
|
+
const line = text.split('\n').find((l) => l.includes(assetName));
|
|
103
|
+
if (!line)
|
|
104
|
+
return { ok: true, verified: false };
|
|
105
|
+
const expectedHash = line.trim().split(/\s+/)[0];
|
|
106
|
+
if (!expectedHash || expectedHash.length !== 64)
|
|
107
|
+
return { ok: true, verified: false };
|
|
108
|
+
const data = await fs.readFile(binaryPath);
|
|
109
|
+
const actualHash = createHash('sha256').update(data).digest('hex');
|
|
110
|
+
return { ok: actualHash === expectedHash, verified: true };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
logger.debug('Checksum verification failed:', err.message);
|
|
114
|
+
return { ok: true, verified: false }; // non-fatal — proceed without verification
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export async function performUpdate(restartSlugs = [], options = {}) {
|
|
118
|
+
const log = {
|
|
119
|
+
info: (...args) => { if (!options.quiet)
|
|
120
|
+
logger.info(...args); },
|
|
121
|
+
warn: (...args) => { if (!options.quiet)
|
|
122
|
+
logger.warn(...args); },
|
|
123
|
+
error: (...args) => { if (!options.quiet)
|
|
124
|
+
logger.error(...args); },
|
|
125
|
+
success: (...args) => { if (!options.quiet)
|
|
126
|
+
logger.success(...args); },
|
|
127
|
+
};
|
|
128
|
+
const updateInfo = await checkForUpdate();
|
|
129
|
+
if (!updateInfo.isOutdated) {
|
|
130
|
+
log.success(`You are already on the latest version (${updateInfo.currentVersion}).`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (!updateInfo.assetUrl || !updateInfo.assetName) {
|
|
134
|
+
log.error('No suitable binary found for your platform in the latest release.');
|
|
135
|
+
log.info('For npm users: npm update -g hoolix');
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const currentExe = process.execPath;
|
|
139
|
+
const isCompiledBinary = !currentExe.includes('node') && !currentExe.includes('bun');
|
|
140
|
+
if (!isCompiledBinary) {
|
|
141
|
+
// npm global install: advise `npm update -g` instead of binary self-replace
|
|
142
|
+
log.warn(`Auto-update is for compiled binaries. You appear to be running via npm.`);
|
|
143
|
+
log.info(`Run: npm update -g hoolix (or: npm install -g hoolix@${updateInfo.latestVersion})`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
log.info(`Updating from ${updateInfo.currentVersion} → ${updateInfo.latestVersion}...`);
|
|
147
|
+
const tmpPath = currentExe + '.tmp';
|
|
148
|
+
const backupPath = currentExe + '.old';
|
|
149
|
+
try {
|
|
150
|
+
// ── Download ─────────────────────────────────────────────────────────────
|
|
151
|
+
log.info('Downloading new version...');
|
|
152
|
+
const res = await fetch(updateInfo.assetUrl);
|
|
153
|
+
if (!res.ok || !res.body)
|
|
154
|
+
throw new Error('Failed to download update');
|
|
155
|
+
const fileStream = fs.createWriteStream(tmpPath);
|
|
156
|
+
await new Promise((resolve, reject) => {
|
|
157
|
+
res.body.pipeTo(new WritableStream({
|
|
158
|
+
write(chunk) { fileStream.write(chunk); },
|
|
159
|
+
close() { fileStream.end(resolve); },
|
|
160
|
+
abort(err) { fileStream.end(); reject(err); },
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
if (process.platform !== 'win32') {
|
|
164
|
+
await fs.chmod(tmpPath, 0o755);
|
|
165
|
+
}
|
|
166
|
+
// ── SHA-256 checksum verification ────────────────────────────────────────
|
|
167
|
+
if (!options.noVerify) {
|
|
168
|
+
log.info('Verifying SHA-256 checksum...');
|
|
169
|
+
const { ok, verified } = await verifyChecksum(tmpPath, updateInfo.assetName, updateInfo.checksumUrl);
|
|
170
|
+
if (!ok) {
|
|
171
|
+
await fs.remove(tmpPath).catch(() => { });
|
|
172
|
+
throw new Error('SHA-256 checksum mismatch — the downloaded binary does not match the expected hash. ' +
|
|
173
|
+
'This could indicate a corrupted download or a tampered release. ' +
|
|
174
|
+
'Run with --no-verify to skip this check.');
|
|
175
|
+
}
|
|
176
|
+
if (verified) {
|
|
177
|
+
log.success('SHA-256 checksum verified.');
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
log.warn('Checksum file not available for this release — proceeding without verification.');
|
|
181
|
+
log.warn('Use `npm install -g hoolix` for npm-provenance-verified installs.');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
log.warn('Checksum verification skipped (--no-verify).');
|
|
186
|
+
}
|
|
187
|
+
// ── Apply ────────────────────────────────────────────────────────────────
|
|
188
|
+
log.info('Applying update...');
|
|
189
|
+
if (process.platform === 'win32') {
|
|
190
|
+
// Windows: use detached batch helper — cannot overwrite a running exe in-place
|
|
191
|
+
const batPath = currentExe + '.update.bat';
|
|
192
|
+
let restartPart = '';
|
|
193
|
+
if (restartSlugs.length > 0) {
|
|
194
|
+
restartPart = restartSlugs
|
|
195
|
+
.map((slug) => `start /b "" "${currentExe}" start ${slug}`)
|
|
196
|
+
.join('\r\n');
|
|
197
|
+
}
|
|
198
|
+
const batContent = `@echo off
|
|
199
|
+
setlocal
|
|
200
|
+
timeout /t 2 /nobreak >nul 2>&1
|
|
201
|
+
if exist "${currentExe}" (
|
|
202
|
+
move /y "${currentExe}" "${backupPath}" >nul 2>&1
|
|
203
|
+
)
|
|
204
|
+
if exist "${tmpPath}" (
|
|
205
|
+
move /y "${tmpPath}" "${currentExe}" >nul 2>&1
|
|
206
|
+
)
|
|
207
|
+
if exist "${backupPath}" (
|
|
208
|
+
del /f /q "${backupPath}" >nul 2>&1
|
|
209
|
+
)
|
|
210
|
+
echo hoolix updated successfully.
|
|
211
|
+
if exist "${currentExe}" (
|
|
212
|
+
start "" "${currentExe}" %*
|
|
213
|
+
)
|
|
214
|
+
${restartPart}
|
|
215
|
+
del "%~f0" >nul 2>&1
|
|
216
|
+
`;
|
|
217
|
+
await fs.writeFile(batPath, batContent);
|
|
218
|
+
const { spawn } = await import('node:child_process');
|
|
219
|
+
const child = spawn('cmd.exe', ['/c', batPath], {
|
|
220
|
+
detached: true,
|
|
221
|
+
stdio: 'ignore',
|
|
222
|
+
windowsHide: true,
|
|
223
|
+
});
|
|
224
|
+
child.unref();
|
|
225
|
+
log.success(`Update to ${updateInfo.latestVersion} prepared — applying after exit.`);
|
|
226
|
+
await new Promise((r) => setTimeout(r, 150));
|
|
227
|
+
process.exit(0);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Non-Windows: standard atomic rename
|
|
231
|
+
if (await fs.pathExists(currentExe)) {
|
|
232
|
+
await fs.rename(currentExe, backupPath).catch(() => { });
|
|
233
|
+
}
|
|
234
|
+
await fs.rename(tmpPath, currentExe);
|
|
235
|
+
await fs.remove(backupPath).catch(() => { });
|
|
236
|
+
log.success(`Updated to ${updateInfo.latestVersion}!`);
|
|
237
|
+
log.warn('Restart hoolix for the update to take effect.');
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
log.error('Update failed:', err.message);
|
|
243
|
+
if (await fs.pathExists(backupPath)) {
|
|
244
|
+
try {
|
|
245
|
+
await fs.rename(backupPath, currentExe);
|
|
246
|
+
log.info('Rolled back to previous version.');
|
|
247
|
+
}
|
|
248
|
+
catch { }
|
|
249
|
+
}
|
|
250
|
+
await fs.remove(tmpPath).catch(() => { });
|
|
251
|
+
if (process.platform === 'win32') {
|
|
252
|
+
await fs.remove(currentExe + '.update.bat').catch(() => { });
|
|
253
|
+
}
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// ── Version comparison helpers ────────────────────────────────────────────────
|
|
258
|
+
function parseVersion(version) {
|
|
259
|
+
const clean = version.replace(/^v/, '');
|
|
260
|
+
const [core, prereleaseText = ''] = clean.split('-', 2);
|
|
261
|
+
const [major = 0, minor = 0, patch = 0] = core
|
|
262
|
+
.split('.')
|
|
263
|
+
.map((part) => Number.parseInt(part, 10))
|
|
264
|
+
.map((part) => (Number.isFinite(part) ? part : 0));
|
|
265
|
+
return {
|
|
266
|
+
major, minor, patch,
|
|
267
|
+
prerelease: prereleaseText ? prereleaseText.split('.') : [],
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function comparePrerelease(a, b) {
|
|
271
|
+
if (a.length === 0 && b.length === 0)
|
|
272
|
+
return 0;
|
|
273
|
+
if (a.length === 0)
|
|
274
|
+
return 1;
|
|
275
|
+
if (b.length === 0)
|
|
276
|
+
return -1;
|
|
277
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
278
|
+
const ai = a[i];
|
|
279
|
+
const bi = b[i];
|
|
280
|
+
if (ai === undefined)
|
|
281
|
+
return -1;
|
|
282
|
+
if (bi === undefined)
|
|
283
|
+
return 1;
|
|
284
|
+
const an = Number.parseInt(ai, 10);
|
|
285
|
+
const bn = Number.parseInt(bi, 10);
|
|
286
|
+
const aiNumeric = ai === String(an);
|
|
287
|
+
const biNumeric = bi === String(bn);
|
|
288
|
+
if (aiNumeric && biNumeric) {
|
|
289
|
+
if (an > bn)
|
|
290
|
+
return 1;
|
|
291
|
+
if (an < bn)
|
|
292
|
+
return -1;
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (aiNumeric)
|
|
296
|
+
return -1;
|
|
297
|
+
if (biNumeric)
|
|
298
|
+
return 1;
|
|
299
|
+
if (ai > bi)
|
|
300
|
+
return 1;
|
|
301
|
+
if (ai < bi)
|
|
302
|
+
return -1;
|
|
303
|
+
}
|
|
304
|
+
return 0;
|
|
305
|
+
}
|
|
306
|
+
function compareVersions(a, b) {
|
|
307
|
+
const pa = parseVersion(a);
|
|
308
|
+
const pb = parseVersion(b);
|
|
309
|
+
for (const key of ['major', 'minor', 'patch']) {
|
|
310
|
+
if (pa[key] > pb[key])
|
|
311
|
+
return 1;
|
|
312
|
+
if (pa[key] < pb[key])
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
315
|
+
return comparePrerelease(pa.prerelease, pb.prerelease);
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/core/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hoolix — CLI entry point and dispatcher.
|
|
4
|
+
*
|
|
5
|
+
* This file is intentionally thin: it boots the runtime, fires the background
|
|
6
|
+
* update check, then delegates every command to its module under src/commands/.
|
|
7
|
+
* Adding a new command means adding one file there and one case here.
|
|
8
|
+
*
|
|
9
|
+
* See AGENTS.md for architectural invariants (binary exec model, lazy imports,
|
|
10
|
+
* cross-platform constraints, etc.)
|
|
11
|
+
*/
|
|
12
|
+
export { generateAuthKey } from './lib/auth.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AASH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hoolix — CLI entry point and dispatcher.
|
|
4
|
+
*
|
|
5
|
+
* This file is intentionally thin: it boots the runtime, fires the background
|
|
6
|
+
* update check, then delegates every command to its module under src/commands/.
|
|
7
|
+
* Adding a new command means adding one file there and one case here.
|
|
8
|
+
*
|
|
9
|
+
* See AGENTS.md for architectural invariants (binary exec model, lazy imports,
|
|
10
|
+
* cross-platform constraints, etc.)
|
|
11
|
+
*/
|
|
12
|
+
import { logger } from './core/logger.js';
|
|
13
|
+
import { ensureDirectories } from './core/paths.js';
|
|
14
|
+
import { loadConfig } from './core/config.js';
|
|
15
|
+
import { checkForUpdate } from './core/updater.js';
|
|
16
|
+
import { VERSION } from './core/version.js';
|
|
17
|
+
// Re-export for backwards compatibility (host.ts and tests may import this)
|
|
18
|
+
export { generateAuthKey } from './lib/auth.js';
|
|
19
|
+
// Static imports keep the bundler happy when building a self-contained binary.
|
|
20
|
+
// These modules are only executed when the corresponding __internal-* flag is present.
|
|
21
|
+
import { startHostedServer } from './mcp/host.js';
|
|
22
|
+
import { startProxyHost } from './mcp/proxy-host.js';
|
|
23
|
+
async function main() {
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const cmd = args[0] || 'tui';
|
|
26
|
+
const jsonOutput = args.includes('--json');
|
|
27
|
+
await ensureDirectories();
|
|
28
|
+
await loadConfig();
|
|
29
|
+
// Background update check — non-blocking, best-effort, suppressed in --json mode.
|
|
30
|
+
if (!jsonOutput && cmd !== 'update' && cmd !== '__internal-host' && cmd !== '__internal-proxy' && cmd !== 'completion' && process.env.MCP_PORTAL_SKIP_UPDATE_CHECK !== '1') {
|
|
31
|
+
checkForUpdate().then((info) => {
|
|
32
|
+
if (info.isOutdated) {
|
|
33
|
+
logger.warn(`A new version of hoolix is available: ${info.latestVersion} (you have ${info.currentVersion})`);
|
|
34
|
+
logger.info('Run "hoolix update" to upgrade.');
|
|
35
|
+
}
|
|
36
|
+
}).catch(() => { });
|
|
37
|
+
}
|
|
38
|
+
switch (cmd) {
|
|
39
|
+
// ── Meta ──────────────────────────────────────────────────────────────
|
|
40
|
+
case 'version':
|
|
41
|
+
case '--version':
|
|
42
|
+
case '-v':
|
|
43
|
+
console.log(VERSION);
|
|
44
|
+
return;
|
|
45
|
+
case 'help':
|
|
46
|
+
case '--help':
|
|
47
|
+
case '-h': {
|
|
48
|
+
const { printHelp } = await import('./ui/help.js');
|
|
49
|
+
printHelp();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// ── Server lifecycle ──────────────────────────────────────────────────
|
|
53
|
+
case 'list': {
|
|
54
|
+
const { cmdList } = await import('./commands/list.js');
|
|
55
|
+
await cmdList(jsonOutput);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
case 'create':
|
|
59
|
+
case 'install': {
|
|
60
|
+
// 'install' is sugar for 'create --template <id>' (mcp-server mental model)
|
|
61
|
+
const { cmdCreate } = await import('./commands/create.js');
|
|
62
|
+
await cmdCreate(args, jsonOutput);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
case 'trial':
|
|
66
|
+
case 'try': {
|
|
67
|
+
const { cmdTrial } = await import('./commands/trial.js');
|
|
68
|
+
await cmdTrial(args, jsonOutput);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
case 'delete': {
|
|
72
|
+
const { cmdDelete } = await import('./commands/delete.js');
|
|
73
|
+
await cmdDelete(args, jsonOutput);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
case 'start': {
|
|
77
|
+
const { cmdStart } = await import('./commands/start.js');
|
|
78
|
+
await cmdStart(args, jsonOutput);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
case 'stop': {
|
|
82
|
+
const { cmdStop } = await import('./commands/stop.js');
|
|
83
|
+
await cmdStop(args, jsonOutput);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
case 'info': {
|
|
87
|
+
const { cmdInfo } = await import('./commands/info.js');
|
|
88
|
+
await cmdInfo(args, jsonOutput);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
case 'reindex': {
|
|
92
|
+
const { cmdReindex } = await import('./commands/reindex.js');
|
|
93
|
+
await cmdReindex(args, jsonOutput);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
case 'verify': {
|
|
97
|
+
const { cmdVerify } = await import('./commands/verify.js');
|
|
98
|
+
await cmdVerify(args);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
case 'templates':
|
|
102
|
+
case 'template':
|
|
103
|
+
case 'catalog': {
|
|
104
|
+
const { cmdTemplates } = await import('./commands/templates.js');
|
|
105
|
+
await cmdTemplates(args, jsonOutput);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// ── Integration ───────────────────────────────────────────────────────
|
|
109
|
+
case 'connect': {
|
|
110
|
+
const { cmdConnect } = await import('./commands/connect.js');
|
|
111
|
+
await cmdConnect(args, jsonOutput);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
case 'clients':
|
|
115
|
+
case 'client': {
|
|
116
|
+
const { cmdClients } = await import('./commands/clients.js');
|
|
117
|
+
await cmdClients(args, jsonOutput);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
case 'secrets':
|
|
121
|
+
case 'secret': {
|
|
122
|
+
const { cmdSecrets } = await import('./commands/secrets.js');
|
|
123
|
+
await cmdSecrets(args, jsonOutput);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
case 'rotate':
|
|
127
|
+
case 'rotate-key': {
|
|
128
|
+
const { cmdRotateKey } = await import('./commands/rotate.js');
|
|
129
|
+
await cmdRotateKey(args, jsonOutput);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
case 'audit':
|
|
133
|
+
case 'audit-log': {
|
|
134
|
+
const { cmdAudit } = await import('./commands/audit.js');
|
|
135
|
+
await cmdAudit(args);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
case 'stats': {
|
|
139
|
+
const { cmdStats } = await import('./commands/stats.js');
|
|
140
|
+
await cmdStats(args, jsonOutput);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
case 'export': {
|
|
144
|
+
const { cmdExport } = await import('./commands/export.js');
|
|
145
|
+
await cmdExport(args, jsonOutput);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
case 'import': {
|
|
149
|
+
const { cmdImport } = await import('./commands/import.js');
|
|
150
|
+
await cmdImport(args, jsonOutput);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
case 'bundle': {
|
|
154
|
+
const { cmdBundle } = await import('./commands/bundle.js');
|
|
155
|
+
await cmdBundle(args, jsonOutput);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// ── System ────────────────────────────────────────────────────────────
|
|
159
|
+
case 'completion':
|
|
160
|
+
case 'completions': {
|
|
161
|
+
const { cmdCompletion } = await import('./commands/completion.js');
|
|
162
|
+
await cmdCompletion(args);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
case 'doctor': {
|
|
166
|
+
const { cmdDoctor } = await import('./commands/doctor.js');
|
|
167
|
+
await cmdDoctor(jsonOutput);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
case 'update': {
|
|
171
|
+
const { cmdUpdate } = await import('./commands/update.js');
|
|
172
|
+
await cmdUpdate(args, jsonOutput);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
case 'uninstall': {
|
|
176
|
+
const { cmdUninstall } = await import('./commands/uninstall.js');
|
|
177
|
+
await cmdUninstall(args, jsonOutput);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
case 'gui':
|
|
181
|
+
case 'web':
|
|
182
|
+
case 'dashboard': {
|
|
183
|
+
const { cmdGui } = await import('./commands/gui.js');
|
|
184
|
+
await cmdGui(args);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// ── Internal host/proxy mode (binary self-spawn — never call directly) ──
|
|
188
|
+
case '__internal-host':
|
|
189
|
+
await runInternalHost(args);
|
|
190
|
+
return;
|
|
191
|
+
case '__internal-proxy':
|
|
192
|
+
await runInternalProxy(args);
|
|
193
|
+
return;
|
|
194
|
+
// ── TUI (default when no command given) ───────────────────────────────
|
|
195
|
+
case 'tui':
|
|
196
|
+
default: {
|
|
197
|
+
// Probe raw-mode support before importing the TUI module.
|
|
198
|
+
// This prevents failures in packaged Windows exes on certain terminals.
|
|
199
|
+
let rawModeProbeOk = true;
|
|
200
|
+
if (process.env.MCP_PORTAL_TUI_TEST_MODE === '1') {
|
|
201
|
+
rawModeProbeOk = true;
|
|
202
|
+
}
|
|
203
|
+
else if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
204
|
+
try {
|
|
205
|
+
process.stdin.setRawMode?.(true);
|
|
206
|
+
process.stdin.setRawMode?.(false);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
rawModeProbeOk = false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
rawModeProbeOk = false;
|
|
214
|
+
}
|
|
215
|
+
if (!rawModeProbeOk) {
|
|
216
|
+
await launchDashboardPlaceholder();
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const { launchTUI } = await import('./tui/index.js');
|
|
221
|
+
await launchTUI();
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
logger.warn('TUI failed to launch (falling back to help):', e?.message || e);
|
|
225
|
+
await launchDashboardPlaceholder();
|
|
226
|
+
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async function runInternalHost(args) {
|
|
232
|
+
const getArg = (name) => {
|
|
233
|
+
const idx = args.indexOf(`--${name}`);
|
|
234
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
235
|
+
};
|
|
236
|
+
const slug = getArg('slug');
|
|
237
|
+
const portStr = getArg('port');
|
|
238
|
+
const dataDir = getArg('data-dir');
|
|
239
|
+
const authKey = getArg('auth-key');
|
|
240
|
+
if (!slug || !portStr || !dataDir || !authKey) {
|
|
241
|
+
console.error('Internal host mode requires --slug, --port, --data-dir, --auth-key');
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
const options = { slug, port: parseInt(portStr, 10), dataDir, authKey };
|
|
245
|
+
await startHostedServer(options);
|
|
246
|
+
}
|
|
247
|
+
async function runInternalProxy(args) {
|
|
248
|
+
const getArg = (name) => {
|
|
249
|
+
const idx = args.indexOf(`--${name}`);
|
|
250
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
251
|
+
};
|
|
252
|
+
const slug = getArg('slug');
|
|
253
|
+
const portStr = getArg('port');
|
|
254
|
+
const authKey = getArg('auth-key');
|
|
255
|
+
if (!slug || !portStr || !authKey) {
|
|
256
|
+
console.error('Internal proxy mode requires --slug, --port, --auth-key');
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
const options = { slug, port: parseInt(portStr, 10), authKey };
|
|
260
|
+
await startProxyHost(options);
|
|
261
|
+
}
|
|
262
|
+
async function launchDashboardPlaceholder() {
|
|
263
|
+
const { printHelp } = await import('./ui/help.js');
|
|
264
|
+
printHelp();
|
|
265
|
+
}
|
|
266
|
+
main().catch((err) => {
|
|
267
|
+
logger.error('Fatal error:', err);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
});
|
|
270
|
+
//# sourceMappingURL=index.js.map
|