@hermespilot/link 0.2.3 → 0.2.5
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/dist/{chunk-HIQBCPY4.js → chunk-N4CZ2ASZ.js} +3292 -2203
- package/dist/cli/index.js +1 -2
- package/dist/http/app.d.ts +41 -0
- package/dist/http/app.js +1 -2
- package/package.json +2 -2
- package/dist/chunk-HIQBCPY4.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/http/app.js.map +0 -1
package/dist/cli/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/autostart/autostart.ts","../../src/i18n.ts","../../src/pairing/preflight.ts","../../src/runtime/browser.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander'\nimport qrcode from 'qrcode-terminal'\nimport { LINK_COMMAND, LINK_VERSION } from '../constants.js'\nimport { enableAutostart, disableAutostart, getAutostartStatus } from '../autostart/autostart.js'\nimport { loadConfig } from '../config/config.js'\nimport {\n getDaemonStatus,\n startDaemonProcess,\n stopDaemonProcess,\n daemonLogFile,\n probeLocalLinkService,\n runDaemonSupervisor,\n} from '../daemon/process.js'\nimport { startLinkService, type LinkService } from '../daemon/service.js'\nimport { ensureHermesApiServerConfig } from '../hermes/config.js'\nimport { ensureHermesApiServerAvailable } from '../hermes/gateway.js'\nimport { ensureIdentity, getIdentityStatus, loadIdentity } from '../identity/identity.js'\nimport { detectSystemLanguage, localizeErrorMessage, resolveLanguage, translate } from '../i18n.js'\nimport { clearPairingClaim, preparePairing, readPairingClaim } from '../pairing/pairing.js'\nimport { assertPairingPreflightReady } from '../pairing/preflight.js'\nimport { getLinkLogFile } from '../runtime/logger.js'\nimport { openSystemBrowser } from '../runtime/browser.js'\nimport { resolveRuntimePaths, type RuntimePaths } from '../runtime/paths.js'\nimport { hasActiveDevices } from '../security/devices.js'\n\nconst program = new Command()\nconst helpLanguage = detectSystemLanguage()\nconst helpText = translate.bind(null, helpLanguage)\n\nprogram\n .name(LINK_COMMAND)\n .description(helpText('program.description'))\n .version(LINK_VERSION, '-v, --version', helpText('program.version'))\n\nprogram\n .command('status')\n .option('--json', helpText('status.json'))\n .description(helpText('status.description'))\n .action(async (options: { json?: boolean }) => {\n const paths = resolveRuntimePaths()\n const [identity, config] = await Promise.all([loadIdentity(paths), loadConfig(paths)])\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const payload = {\n version: LINK_VERSION,\n runtimeHome: paths.homeDir,\n paired: Boolean(identity?.link_id),\n mode: identity?.link_id ? 'paired' : 'local-only',\n port: config.port,\n identity: identity ? getIdentityStatus(identity) : null,\n relay: {\n configured: Boolean(config.relayBaseUrl),\n connected: false,\n },\n }\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n return\n }\n console.log(`Hermes Link ${payload.version}`)\n console.log(t('status.runtime', { value: payload.runtimeHome }))\n console.log(t('status.mode', { value: payload.mode }))\n console.log(t('status.port', { value: payload.port }))\n console.log(t('status.linkId', { value: payload.identity?.linkId ?? t('status.notPaired') }))\n })\n\nprogram\n .command('start')\n .description(helpText('start.description'))\n .action(async () => {\n const [config, status] = await Promise.all([loadConfig(), getDaemonStatus()])\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n if (status.running && status.pid) {\n console.log(t('start.alreadyRunning', { pid: status.pid }))\n return\n }\n const nextStatus = await startDaemonProcess()\n console.log(t('start.backgroundStarted', { pid: nextStatus.pid ?? 'unknown' }))\n })\n\nprogram\n .command('stop')\n .description(helpText('stop.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const before = await getDaemonStatus()\n if (!before.running) {\n console.log(t('stop.notRunning'))\n return\n }\n await stopDaemonProcess()\n console.log(t('stop.stopped'))\n })\n\nprogram\n .command('restart')\n .description(helpText('restart.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n await stopDaemonProcess()\n const status = await startDaemonProcess()\n console.log(t('start.backgroundStarted', { pid: status.pid ?? 'unknown' }))\n })\n\nprogram\n .command('daemon')\n .option('--foreground', 'run in foreground')\n .description(helpText('daemon.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const service = await startLinkService({ writePidFile: true })\n console.log(t('daemon.foreground'))\n await waitForShutdown(async () => {\n await service.close()\n })\n process.exit(0)\n })\n\nprogram\n .command('daemon-supervisor', { hidden: true })\n .action(async () => {\n process.exitCode = await runDaemonSupervisor()\n })\n\nprogram\n .command('pair')\n .description(helpText('pair.description'))\n .action(async () => {\n const paths = resolveRuntimePaths()\n const config = await loadConfig(paths)\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n console.log(t('pair.preflight'))\n const preflight = await assertPairingPreflightReady({ paths })\n console.log(t('pair.hermesHome', { path: preflight.hermesHome }))\n console.log(t('pair.apiReady', { port: preflight.apiServer.port ?? 'unknown' }))\n console.log(t('pair.preparing'))\n console.log(t('pair.server', { url: config.serverBaseUrl }))\n console.log(t('pair.relay', { url: config.relayBaseUrl }))\n await ensureIdentity(paths)\n const hadActiveDevices = await hasActiveDevices(paths)\n const probeBeforePair = await probeLocalLinkService({ port: config.port })\n const prepared = await preparePairing(paths)\n await clearPairingClaim(prepared.sessionId, paths)\n const probe = await probeLocalLinkService({ port: config.port, linkId: prepared.linkId })\n if (probe.reachable && !probe.reusable) {\n throw new Error(\n `Local Hermes Link on port ${config.port} belongs to ${probe.linkId ?? 'an unassigned Link'}, not ${prepared.linkId}.`,\n )\n }\n const reusedRunningService = probe.reusable\n const restartReusedServiceAfterClaim = reusedRunningService && !probeBeforePair.linkId\n const service: LinkService | null = reusedRunningService ? null : await startLinkService({ paths })\n const qrValue = JSON.stringify(prepared.qrPayload)\n const pairingPageUrl = `http://127.0.0.1:${config.port}/pair?session_id=${encodeURIComponent(prepared.sessionId)}`\n console.log(t('pair.linkId', { value: prepared.linkId }))\n console.log(t('pair.code', { value: prepared.code }))\n console.log(t('pair.localApi', { port: config.port }))\n if (!reusedRunningService) {\n console.log(t('start.listening', { port: config.port }))\n }\n console.log(t('pair.scan'))\n console.log(`Pairing page: ${pairingPageUrl}`)\n void openSystemBrowser(pairingPageUrl)\n qrcode.generate(qrValue, { small: true })\n console.log(t('pair.expires'))\n const result = await waitForPairingOrShutdown(prepared.sessionId, paths)\n if (service) {\n await service.close()\n }\n if (result === 'claimed') {\n await clearPairingClaim(prepared.sessionId, paths)\n console.log(t(reusedRunningService ? 'pair.claimedRunning' : 'pair.claimed'))\n try {\n if (hadActiveDevices) {\n console.log(t('pair.autostartUnchanged'))\n } else {\n const currentAutostart = await getAutostartStatus()\n if (currentAutostart.supported && currentAutostart.enabled) {\n console.log(\n t('autostart.alreadyEnabled', {\n method: currentAutostart.method,\n path: currentAutostart.filePath ?? '',\n }),\n )\n } else {\n const autostart = await enableAutostart()\n if (autostart.supported && autostart.enabled) {\n console.log(t('autostart.enabled', { method: autostart.method, path: autostart.filePath ?? '' }))\n }\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.log(t('pair.autostartFailed', { message }))\n }\n if (restartReusedServiceAfterClaim) {\n await stopDaemonProcess(paths)\n const status = await startDaemonProcess(paths)\n console.log(t('start.backgroundStarted', { pid: status.pid ?? 'unknown' }))\n } else if (!reusedRunningService) {\n const status = await startDaemonProcess(paths)\n console.log(t('start.backgroundStarted', { pid: status.pid ?? 'unknown' }))\n }\n }\n })\n\nconst autostart = program.command('autostart').description(helpText('autostart.description'))\n\nautostart\n .command('on')\n .description(helpText('autostart.on.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const status = await enableAutostart()\n if (!status.supported) {\n console.log(t('autostart.unsupported'))\n return\n }\n console.log(t('autostart.enabled', { method: status.method, path: status.filePath ?? '' }))\n })\n\nautostart\n .command('off')\n .description(helpText('autostart.off.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n await disableAutostart()\n console.log(t('autostart.disabled'))\n })\n\nautostart\n .command('status')\n .description(helpText('autostart.status.description'))\n .action(async () => {\n const config = await loadConfig()\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const status = await getAutostartStatus()\n if (!status.supported) {\n console.log(t('autostart.unsupported'))\n return\n }\n console.log(\n t(status.enabled ? 'autostart.status.enabled' : 'autostart.status.disabled', {\n method: status.method,\n path: status.filePath ?? '',\n }),\n )\n })\n\nprogram\n .command('logs')\n .description(helpText('logs.description'))\n .action(async () => {\n const paths = resolveRuntimePaths()\n const config = await loadConfig(paths)\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n console.log(t('logs.servicePath', { path: getLinkLogFile(paths) }))\n console.log(t('logs.daemonPath', { path: daemonLogFile(paths) }))\n })\n\nprogram\n .command('doctor')\n .description(helpText('doctor.description'))\n .action(async () => {\n const [identity, config] = await Promise.all([ensureIdentity(), loadConfig()])\n const language = resolveLanguage(config.language)\n const t = translate.bind(null, language)\n const hermesConfig = await ensureHermesApiServerConfig()\n console.log(t('doctor.identityOk'))\n console.log(t('doctor.installId', { value: identity.install_id }))\n console.log(t('doctor.linkId', { value: identity.link_id ?? t('doctor.notAssigned') }))\n if (hermesConfig.notice) {\n console.log(hermesConfig.notice)\n if (hermesConfig.backupPath) {\n console.log(`Hermes config backup: ${hermesConfig.backupPath}`)\n }\n }\n try {\n const availability = await ensureHermesApiServerAvailable({ timeoutMs: 5_000 })\n console.log(t(availability.started ? 'doctor.apiStarted' : 'doctor.apiReady'))\n } catch (error) {\n console.log(t('doctor.apiUnavailable', { message: error instanceof Error ? error.message : String(error) }))\n }\n })\n\nprogram.parseAsync(process.argv).catch(async (error) => {\n const language = await loadCliLanguage().catch(() => detectSystemLanguage())\n console.error(localizeErrorMessage(error, language))\n process.exitCode = 1\n})\n\nasync function loadCliLanguage() {\n const config = await loadConfig()\n return resolveLanguage(config.language)\n}\n\nasync function waitForShutdown(cleanup: () => Promise<void>): Promise<void> {\n await new Promise<void>((resolve) => {\n const stop = () => resolve()\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n })\n await cleanup()\n}\n\nasync function waitForPairingOrShutdown(\n sessionId: string,\n paths: RuntimePaths,\n): Promise<'claimed' | 'shutdown'> {\n let shutdownRequested = false\n const stop = () => {\n shutdownRequested = true\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n try {\n while (!shutdownRequested) {\n const record = await readPairingClaim(sessionId, paths)\n if (record) {\n return 'claimed'\n }\n await sleep(250)\n }\n return 'shutdown'\n } finally {\n process.off('SIGINT', stop)\n process.off('SIGTERM', stop)\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { execFile } from 'node:child_process'\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { promisify } from 'node:util'\nimport { currentCliScriptPath } from '../daemon/process.js'\n\nconst execFileAsync = promisify(execFile)\nconst MACOS_LABEL = 'com.hermespilot.link'\n\nexport interface AutostartStatus {\n supported: boolean\n enabled: boolean\n method: 'launchd' | 'systemd-user' | 'xdg-autostart' | 'windows-startup' | 'unsupported'\n filePath: string | null\n}\n\nexport async function enableAutostart(): Promise<AutostartStatus> {\n const definition = await resolveAutostartDefinition()\n if (!definition) {\n return unsupportedStatus()\n }\n await mkdir(path.dirname(definition.filePath), { recursive: true, mode: 0o700 })\n await writeFile(definition.filePath, definition.content, { mode: 0o600 })\n if (definition.method === 'systemd-user') {\n await execFileAsync('systemctl', ['--user', 'enable', path.basename(definition.filePath)]).catch(async () => {\n await rm(definition.filePath, { force: true }).catch(() => undefined)\n const fallback = xdgAutostartDefinition()\n await mkdir(path.dirname(fallback.filePath), { recursive: true, mode: 0o700 })\n await writeFile(fallback.filePath, fallback.content, { mode: 0o600 })\n })\n }\n return await getAutostartStatus()\n}\n\nexport async function disableAutostart(): Promise<AutostartStatus> {\n const definitions = await allAutostartDefinitions()\n for (const definition of definitions) {\n if (definition.method === 'systemd-user') {\n await execFileAsync('systemctl', ['--user', 'disable', path.basename(definition.filePath)]).catch(() => undefined)\n }\n await rm(definition.filePath, { force: true }).catch(() => undefined)\n }\n return await getAutostartStatus()\n}\n\nexport async function getAutostartStatus(): Promise<AutostartStatus> {\n const definitions = await allAutostartDefinitions()\n if (definitions.length === 0) {\n return unsupportedStatus()\n }\n for (const definition of definitions) {\n const content = await readFile(definition.filePath, 'utf8').catch(() => null)\n if (content !== null) {\n return {\n supported: true,\n enabled: true,\n method: definition.method,\n filePath: definition.filePath,\n }\n }\n }\n const primary = definitions[0]\n return {\n supported: true,\n enabled: false,\n method: primary.method,\n filePath: primary.filePath,\n }\n}\n\nasync function resolveAutostartDefinition(): Promise<AutostartDefinition | null> {\n if (process.platform === 'darwin') {\n return launchdDefinition()\n }\n if (process.platform === 'win32') {\n return windowsStartupDefinition()\n }\n if (process.platform === 'linux') {\n return await hasSystemctlUser() ? systemdUserDefinition() : xdgAutostartDefinition()\n }\n return null\n}\n\nasync function allAutostartDefinitions(): Promise<AutostartDefinition[]> {\n if (process.platform === 'darwin') {\n return [launchdDefinition()]\n }\n if (process.platform === 'win32') {\n return [windowsStartupDefinition()]\n }\n if (process.platform === 'linux') {\n return [systemdUserDefinition(), xdgAutostartDefinition()]\n }\n return []\n}\n\nasync function hasSystemctlUser(): Promise<boolean> {\n try {\n await execFileAsync('systemctl', ['--user', 'show-environment'])\n return true\n } catch {\n return false\n }\n}\n\nfunction launchdDefinition(): AutostartDefinition {\n const filePath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${MACOS_LABEL}.plist`)\n return {\n method: 'launchd',\n filePath,\n content: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${MACOS_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${xmlEscape(process.execPath)}</string>\n <string>${xmlEscape(currentCliScriptPath())}</string>\n <string>daemon-supervisor</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <false/>\n</dict>\n</plist>\n`,\n }\n}\n\nfunction systemdUserDefinition(): AutostartDefinition {\n const filePath = path.join(os.homedir(), '.config', 'systemd', 'user', 'hermeslink.service')\n return {\n method: 'systemd-user',\n filePath,\n content: `[Unit]\nDescription=Hermes Link\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=${systemdQuote(process.execPath)} ${systemdQuote(currentCliScriptPath())} daemon-supervisor\nRestart=no\n\n[Install]\nWantedBy=default.target\n`,\n }\n}\n\nfunction xdgAutostartDefinition(): AutostartDefinition {\n const filePath = path.join(os.homedir(), '.config', 'autostart', 'hermeslink.desktop')\n return {\n method: 'xdg-autostart',\n filePath,\n content: `[Desktop Entry]\nType=Application\nName=Hermes Link\nExec=${desktopQuote(process.execPath)} ${desktopQuote(currentCliScriptPath())} daemon-supervisor\nTerminal=false\nX-GNOME-Autostart-enabled=true\n`,\n }\n}\n\nfunction windowsStartupDefinition(): AutostartDefinition {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming')\n const filePath = path.join(appData, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup', 'HermesLink.cmd')\n return {\n method: 'windows-startup',\n filePath,\n content: `@echo off\\r\\nstart \"\" /min \"${process.execPath}\" \"${currentCliScriptPath()}\" daemon-supervisor\\r\\n`,\n }\n}\n\nfunction unsupportedStatus(): AutostartStatus {\n return {\n supported: false,\n enabled: false,\n method: 'unsupported',\n filePath: null,\n }\n}\n\nfunction xmlEscape(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n}\n\nfunction systemdQuote(value: string): string {\n return `\"${value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')}\"`\n}\n\nfunction desktopQuote(value: string): string {\n return `\"${value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')}\"`\n}\n\ninterface AutostartDefinition {\n method: AutostartStatus['method']\n filePath: string\n content: string\n}\n","export type SupportedLanguage = 'zh-CN' | 'en'\nexport type ConfiguredLanguage = SupportedLanguage | 'auto'\n\nconst messages = {\n en: {\n 'program.description': 'Hermes Link companion service',\n 'program.version': 'print Hermes Link version',\n 'status.description': 'Show local Hermes Link status',\n 'status.json': 'print machine-readable status',\n 'status.runtime': 'Runtime: {value}',\n 'status.mode': 'Mode: {value}',\n 'status.port': 'Local port: {value}',\n 'status.linkId': 'Link ID: {value}',\n 'status.notPaired': 'not paired',\n 'start.description': 'Start Hermes Link daemon',\n 'start.backgroundStarted': 'Hermes Link is running in the background. PID: {pid}',\n 'start.alreadyRunning': 'Hermes Link is already running. PID: {pid}',\n 'start.notPaired': 'Hermes Link is not paired yet. Starting in local-only maintenance mode.',\n 'start.notPaired.detail':\n 'Relay, Server polling, and LAN entrypoints stay disabled until you run `hermeslink pair`.',\n 'start.listening': 'Hermes Link API listening on http://127.0.0.1:{port}',\n 'start.relayConnecting': 'Relay control connecting for {linkId}',\n 'stop.description': 'Stop the background Hermes Link daemon',\n 'stop.stopped': 'Hermes Link stopped.',\n 'stop.notRunning': 'Hermes Link is not running.',\n 'restart.description': 'Restart the background Hermes Link daemon',\n 'daemon.description': 'Run Hermes Link in the foreground',\n 'daemon.foreground': 'Hermes Link foreground daemon is running. Press Ctrl+C to stop.',\n 'logs.description': 'Show Hermes Link log paths',\n 'logs.servicePath': 'Service log: {path}',\n 'logs.daemonPath': 'Daemon stdout/stderr log: {path}',\n 'autostart.description': 'Manage boot autostart',\n 'autostart.on.description': 'Enable boot autostart',\n 'autostart.off.description': 'Disable boot autostart',\n 'autostart.status.description': 'Show boot autostart status',\n 'autostart.enabled': 'Boot autostart enabled via {method}: {path}',\n 'autostart.disabled': 'Boot autostart disabled.',\n 'autostart.status.enabled': 'Boot autostart: enabled via {method}: {path}',\n 'autostart.status.disabled': 'Boot autostart: disabled. Method: {method}. File: {path}',\n 'autostart.unsupported': 'Boot autostart is not supported on this platform yet.',\n 'autostart.alreadyEnabled': 'Boot autostart is already enabled via {method}: {path}',\n 'pair.description': 'Create a Hermes Link pairing session',\n 'pair.preflight': 'Checking local Hermes configuration before pairing...',\n 'pair.hermesHome': 'Hermes home: {path}',\n 'pair.apiReady': 'Hermes API Server is ready on 127.0.0.1:{port}',\n 'pair.preparing': 'Preparing pairing session through HermesPilot Server and Relay...',\n 'pair.server': 'Server: {url}',\n 'pair.relay': 'Relay: {url}',\n 'pair.linkId': 'Hermes Link ID: {value}',\n 'pair.code': 'Pairing code: {value}',\n 'pair.localApi': 'Local API: http://127.0.0.1:{port}',\n 'pair.scan': 'Open this pairing page in the HermesPilot App or scan the QR code below:',\n 'pair.expires': 'Pairing expires in 10 minutes. Press Ctrl+C to cancel waiting.',\n 'pair.claimed': 'Pairing succeeded. Starting Hermes Link in the background...',\n 'pair.claimedRunning': 'Pairing succeeded. Hermes Link is already running in the background.',\n 'pair.autostartUnchanged': 'Existing paired devices found. Boot autostart settings were left unchanged.',\n 'pair.autostartFailed': 'Pairing succeeded, but boot autostart could not be enabled: {message}',\n 'doctor.description': 'Run local diagnostics',\n 'doctor.identityOk': 'Runtime identity: OK',\n 'doctor.installId': 'Install ID: {value}',\n 'doctor.linkId': 'Link ID: {value}',\n 'doctor.notAssigned': 'not assigned',\n 'doctor.apiReady': 'Hermes API Server: ready',\n 'doctor.apiStarted': 'Hermes API Server: started and ready',\n 'doctor.apiUnavailable': 'Hermes API Server: unavailable. {message}',\n 'error.relayPublicKeyMismatch':\n 'Relay rejected the pairing request because the Server-issued bootstrap token does not match this Link public key. Make sure Server and Relay are deployed with the same bootstrap key configuration, then run `hermeslink pair` again.',\n 'error.relayChallengeInvalid': 'Relay did not return a valid install challenge.',\n 'error.relayLinkInvalid': 'Relay did not return a valid link_id.',\n 'error.relayEmpty': 'Relay returned an empty response.',\n 'error.serverHttp': 'HermesPilot Server request failed with HTTP {status}.',\n 'error.portInUse':\n 'Local port {port} is already in use by another process. Stop that process or change the Hermes Link port, then run `hermeslink pair` again.',\n 'error.pairingRequires':\n 'Pairing needs HermesPilot Server and Relay, but this command could not start a complete pairing session.',\n 'error.pairingRequires.detail':\n 'The deployed services may be healthy, but the installed Link package must call Server for a short-lived relay bootstrap token before it can request a link_id.',\n },\n 'zh-CN': {\n 'program.description': 'Hermes Link 本地伴随服务',\n 'program.version': '输出 Hermes Link 版本号',\n 'status.description': '查看本机 Hermes Link 状态',\n 'status.json': '输出机器可读的状态 JSON',\n 'status.runtime': '运行目录:{value}',\n 'status.mode': '模式:{value}',\n 'status.port': '本地端口:{value}',\n 'status.linkId': 'Link ID:{value}',\n 'status.notPaired': '尚未配对',\n 'start.description': '启动 Hermes Link 服务',\n 'start.backgroundStarted': 'Hermes Link 已在后台运行。PID:{pid}',\n 'start.alreadyRunning': 'Hermes Link 已经在运行。PID:{pid}',\n 'start.notPaired': 'Hermes Link 还没有配对,将以本地维护模式启动。',\n 'start.notPaired.detail': '在你运行 `hermeslink pair` 前,Relay、Server 轮询和局域网入口都会保持关闭。',\n 'start.listening': 'Hermes Link API 正在监听 http://127.0.0.1:{port}',\n 'start.relayConnecting': '正在为 {linkId} 连接 Relay 控制通道',\n 'stop.description': '停止后台 Hermes Link 服务',\n 'stop.stopped': 'Hermes Link 已停止。',\n 'stop.notRunning': 'Hermes Link 没有在运行。',\n 'restart.description': '重启后台 Hermes Link 服务',\n 'daemon.description': '以前台方式运行 Hermes Link',\n 'daemon.foreground': 'Hermes Link 前台服务正在运行。按 Ctrl+C 停止。',\n 'logs.description': '显示 Hermes Link 日志路径',\n 'logs.servicePath': '服务日志:{path}',\n 'logs.daemonPath': 'Daemon 标准输出/错误日志:{path}',\n 'autostart.description': '管理开机自启',\n 'autostart.on.description': '启用开机自启',\n 'autostart.off.description': '关闭开机自启',\n 'autostart.status.description': '查看开机自启状态',\n 'autostart.enabled': '已启用开机自启,方式:{method},文件:{path}',\n 'autostart.disabled': '已关闭开机自启。',\n 'autostart.status.enabled': '开机自启:已启用,方式:{method},文件:{path}',\n 'autostart.status.disabled': '开机自启:未启用。方式:{method},文件:{path}',\n 'autostart.unsupported': '当前平台暂不支持开机自启。',\n 'autostart.alreadyEnabled': '开机自启已启用,方式:{method},文件:{path}',\n 'pair.description': '创建 Hermes Link 配对会话',\n 'pair.preflight': '正在配对前检查本机 Hermes 配置...',\n 'pair.hermesHome': 'Hermes 数据目录:{path}',\n 'pair.apiReady': 'Hermes API Server 已就绪:127.0.0.1:{port}',\n 'pair.preparing': '正在通过 HermesPilot Server 和 Relay 创建配对会话...',\n 'pair.server': 'Server:{url}',\n 'pair.relay': 'Relay:{url}',\n 'pair.linkId': 'Hermes Link ID:{value}',\n 'pair.code': '配对码:{value}',\n 'pair.localApi': '本地 API:http://127.0.0.1:{port}',\n 'pair.scan': '请在 HermesPilot App 中打开这个配对页,或扫描下面的二维码:',\n 'pair.expires': '配对会话 10 分钟后过期。按 Ctrl+C 退出等待。',\n 'pair.claimed': '配对已成功。正在把 Hermes Link 切换到后台运行...',\n 'pair.claimedRunning': '配对已成功。Hermes Link 已在后台持续运行。',\n 'pair.autostartUnchanged': '检测到已有配对设备,开机自启设置保持不变。',\n 'pair.autostartFailed': '配对已成功,但启用开机自启失败:{message}',\n 'doctor.description': '运行本机诊断',\n 'doctor.identityOk': '运行身份:正常',\n 'doctor.installId': 'Install ID:{value}',\n 'doctor.linkId': 'Link ID:{value}',\n 'doctor.notAssigned': '尚未分配',\n 'doctor.apiReady': 'Hermes API Server:已就绪',\n 'doctor.apiStarted': 'Hermes API Server:已自动启动并就绪',\n 'doctor.apiUnavailable': 'Hermes API Server:不可用。{message}',\n 'error.relayPublicKeyMismatch':\n 'Relay 拒绝了配对请求:Server 签发的 bootstrap token 与本机 Link 公钥不匹配。请确认 Server 和 Relay 使用同一套 bootstrap key 配置,然后重新运行 `hermeslink pair`。',\n 'error.relayChallengeInvalid': 'Relay 没有返回有效的安装挑战。',\n 'error.relayLinkInvalid': 'Relay 没有返回有效的 link_id。',\n 'error.relayEmpty': 'Relay 返回了空响应。',\n 'error.serverHttp': 'HermesPilot Server 请求失败,HTTP 状态码:{status}。',\n 'error.portInUse':\n '本地端口 {port} 已被其他进程占用。请先停止占用该端口的程序,或调整 Hermes Link 端口后重新运行 `hermeslink pair`。',\n 'error.pairingRequires': '配对需要 HermesPilot Server 和 Relay,但当前命令没有能启动完整配对会话。',\n 'error.pairingRequires.detail':\n '云端服务可以是已部署且健康的;本机 Link 仍必须先向 Server 申请短期 relay bootstrap token,才能再向 Relay 申请 link_id。',\n },\n} satisfies Record<SupportedLanguage, Record<string, string>>\n\nexport type MessageKey = keyof (typeof messages)['en']\n\nexport function detectSystemLanguage(env: NodeJS.ProcessEnv = process.env): SupportedLanguage {\n const candidates = [\n env.HERMESLINK_LANG,\n env.HERMESLINK_LANGUAGE,\n env.LC_ALL,\n env.LC_MESSAGES,\n env.LANG,\n env.LANGUAGE?.split(':')[0],\n Intl.DateTimeFormat().resolvedOptions().locale,\n ]\n for (const candidate of candidates) {\n const language = parseLanguage(candidate)\n if (language) {\n return language\n }\n }\n return 'en'\n}\n\nexport function resolveLanguage(setting?: ConfiguredLanguage | string | null): SupportedLanguage {\n const configured = parseLanguage(setting)\n if (configured) {\n return configured\n }\n return detectSystemLanguage()\n}\n\nexport function translate(\n language: SupportedLanguage,\n key: MessageKey,\n values: Record<string, string | number> = {},\n): string {\n const template = messages[language][key] ?? messages.en[key]\n return template.replace(/\\{(\\w+)\\}/gu, (_, name: string) => String(values[name] ?? ''))\n}\n\nexport function localizeErrorMessage(error: unknown, language: SupportedLanguage): string {\n const message = error instanceof Error ? error.message : String(error)\n if (language === 'en') {\n return message\n }\n const mapped = translateKnownError(message, language)\n return mapped ?? message\n}\n\nfunction translateKnownError(message: string, language: SupportedLanguage): string | null {\n if (message === 'Relay bootstrap token does not match public key') {\n return translate(language, 'error.relayPublicKeyMismatch')\n }\n if (message === 'Relay did not return a valid install challenge') {\n return translate(language, 'error.relayChallengeInvalid')\n }\n if (message === 'Relay did not return a valid link_id') {\n return translate(language, 'error.relayLinkInvalid')\n }\n if (message === 'Relay returned an empty response') {\n return translate(language, 'error.relayEmpty')\n }\n const portInUse = /^listen EADDRINUSE: address already in use .*:(?<port>\\d+)$/u.exec(message)\n if (portInUse?.groups?.port) {\n return translate(language, 'error.portInUse', { port: portInUse.groups.port })\n }\n const serverHttp = /^HermesPilot Server request failed with HTTP (?<status>\\d+)$/u.exec(message)\n if (serverHttp?.groups?.status) {\n return translate(language, 'error.serverHttp', { status: serverHttp.groups.status })\n }\n if (message.includes('Pairing requires HermesPilot Server and Relay')) {\n return [translate(language, 'error.pairingRequires'), translate(language, 'error.pairingRequires.detail')].join('\\n')\n }\n return null\n}\n\nfunction parseLanguage(value: string | null | undefined): SupportedLanguage | null {\n const normalized = value?.trim().replace('_', '-').toLowerCase()\n if (!normalized || normalized === 'auto' || normalized === 'c' || normalized === 'posix') {\n return null\n }\n if (normalized.startsWith('zh')) {\n return 'zh-CN'\n }\n if (normalized.startsWith('en')) {\n return 'en'\n }\n return null\n}\n","import { access, stat } from 'node:fs/promises'\nimport path from 'node:path'\nimport { LinkHttpError } from '../core/errors.js'\nimport {\n readHermesApiServerConfig,\n resolveHermesConfigPath,\n resolveHermesProfileDir,\n} from '../hermes/config.js'\nimport {\n ensureHermesApiServerAvailable,\n type EnsureHermesApiAvailableOptions,\n} from '../hermes/gateway.js'\nimport type { RuntimePaths } from '../runtime/paths.js'\n\nexport interface PairingPreflightResult {\n profileName: string\n hermesHome: string\n configPath: string\n envPath: string\n apiServer: {\n available: true\n started: boolean\n host: string | null\n port: number | null\n }\n}\n\nexport interface PairingPreflightOptions {\n profileName?: string\n paths?: RuntimePaths\n fetchImpl?: typeof fetch\n ensureApiServerAvailable?: (\n options: EnsureHermesApiAvailableOptions,\n ) => Promise<Awaited<ReturnType<typeof ensureHermesApiServerAvailable>>>\n}\n\nexport async function assertPairingPreflightReady(\n options: PairingPreflightOptions = {},\n): Promise<PairingPreflightResult> {\n const profileName = normalizeProfileName(options.profileName)\n const hermesHome = resolveHermesProfileDir(profileName)\n const configPath = resolveHermesConfigPath(profileName)\n const envPath = path.join(hermesHome, '.env')\n const failures: PairingPreflightFailure[] = []\n\n if (!(await isDirectory(hermesHome))) {\n failures.push({\n code: 'hermes_home_missing',\n zh: `没有找到当前 Hermes 数据目录:${hermesHome}`,\n en: `Current Hermes home was not found: ${hermesHome}`,\n actionZh:\n '请先运行 `hermes setup` 初始化 Hermes;如果 Hermes 在 Docker、WSL 或另一个 Windows 环境中运行,请在启动 Link 前设置 HERMES_HOME 指向 Link 能访问到的同一个目录。',\n actionEn:\n 'Run `hermes setup` first. If Hermes runs in Docker, WSL, or another Windows environment, start Link with HERMES_HOME pointing to the same directory that Link can access.',\n })\n }\n\n if (!(await isReadableFile(configPath))) {\n failures.push({\n code: 'hermes_config_missing',\n zh: `没有找到 Hermes 配置文件:${configPath}`,\n en: `Hermes config file was not found: ${configPath}`,\n actionZh:\n '请先运行 `hermes setup` 生成配置,或确认 Link 与 Hermes 使用的是同一个 HERMES_HOME。',\n actionEn:\n 'Run `hermes setup` to create the config, or make sure Link and Hermes use the same HERMES_HOME.',\n })\n }\n\n if (!(await isReadableFile(envPath))) {\n failures.push({\n code: 'hermes_env_missing',\n zh: `没有找到 Hermes 环境配置文件:${envPath}`,\n en: `Hermes environment file was not found: ${envPath}`,\n actionZh:\n '请先运行 `hermes setup` 创建 `.env` 并配置模型/API Key;Link 需要能读取它,才能复用 Hermes 的实际配置。',\n actionEn:\n 'Run `hermes setup` to create `.env` and configure model/API keys. Link must be able to read it to reuse Hermes settings.',\n })\n }\n\n if (failures.length > 0) {\n throwPairingPreflightError(failures)\n }\n\n const apiServerConfig = await readHermesApiServerConfig(profileName, configPath)\n if (apiServerConfig.enabled !== true) {\n throwPairingPreflightError([\n {\n code: 'hermes_api_server_disabled',\n zh: 'Hermes API Server 还没有开启。',\n en: 'Hermes API Server is not enabled.',\n actionZh:\n '请运行 `hermeslink doctor` 让 Link 自动补齐 API Server 配置,或在 Hermes 配置中启用 platforms.api_server。',\n actionEn:\n 'Run `hermeslink doctor` so Link can prepare the API Server config, or enable platforms.api_server in Hermes config.',\n },\n ])\n }\n\n try {\n const ensureAvailable =\n options.ensureApiServerAvailable ?? ensureHermesApiServerAvailable\n const availability = await ensureAvailable({\n paths: options.paths,\n profileName,\n fetchImpl: options.fetchImpl,\n timeoutMs: 5_000,\n autoStart: true,\n })\n return {\n profileName,\n hermesHome,\n configPath,\n envPath,\n apiServer: {\n available: true,\n started: availability.started,\n host: availability.configResult.apiServer.host ?? null,\n port: availability.configResult.apiServer.port ?? null,\n },\n }\n } catch (error) {\n throwPairingPreflightError([\n {\n code: 'hermes_api_server_unavailable',\n zh: 'Hermes API Server 当前不可用,Link 不能确认 App 配对后可以发送消息。',\n en: 'Hermes API Server is not available, so Link cannot confirm that the App will be able to send messages after pairing.',\n actionZh:\n '请先运行 `hermes gateway run --replace` 或 `hermeslink doctor`,确认 /health 可以访问后再重新执行 `hermeslink pair`。',\n actionEn:\n 'Run `hermes gateway run --replace` or `hermeslink doctor` first, then retry `hermeslink pair` after /health is reachable.',\n detail: error instanceof Error ? error.message : String(error),\n },\n ])\n }\n}\n\ninterface PairingPreflightFailure {\n code: string\n zh: string\n en: string\n actionZh: string\n actionEn: string\n detail?: string\n}\n\nfunction throwPairingPreflightError(failures: PairingPreflightFailure[]): never {\n throw new LinkHttpError(\n 503,\n failures[0]?.code ?? 'pairing_preflight_failed',\n formatPairingPreflightMessage(failures),\n )\n}\n\nfunction formatPairingPreflightMessage(failures: PairingPreflightFailure[]): string {\n const lines = [\n '配对前检查没有通过,暂时不会向 HermesPilot Server 或 Relay 申请配对二维码/配对码。',\n 'Pairing preflight failed. Link did not request a pairing QR code or pairing code from HermesPilot Server or Relay.',\n '',\n ]\n failures.forEach((failure, index) => {\n const prefix = failures.length > 1 ? `${index + 1}. ` : ''\n lines.push(`${prefix}${failure.zh}`)\n lines.push(` ${failure.en}`)\n lines.push(` 处理建议:${failure.actionZh}`)\n lines.push(` Suggested fix: ${failure.actionEn}`)\n if (failure.detail) {\n lines.push(` Detail: ${failure.detail}`)\n }\n })\n return lines.join('\\n')\n}\n\nasync function isDirectory(filePath: string): Promise<boolean> {\n return stat(filePath)\n .then((value) => value.isDirectory())\n .catch(() => false)\n}\n\nasync function isReadableFile(filePath: string): Promise<boolean> {\n return access(filePath)\n .then(() => stat(filePath))\n .then((value) => value.isFile())\n .catch(() => false)\n}\n\nfunction normalizeProfileName(profileName?: string): string {\n const value = profileName?.trim() || 'default'\n if (!/^[a-zA-Z0-9._-]{1,64}$/u.test(value)) {\n throw new LinkHttpError(\n 400,\n 'invalid_profile_name',\n 'invalid profile name',\n )\n }\n return value\n}\n","import { spawn } from 'node:child_process'\n\nexport async function openSystemBrowser(url: string): Promise<boolean> {\n const platform = process.platform\n if (platform === 'win32') {\n return await spawnDetached('cmd', ['/c', 'start', '', url])\n }\n if (platform === 'darwin') {\n return await spawnDetached('open', [url])\n }\n return await spawnDetached('xdg-open', [url])\n}\n\nasync function spawnDetached(command: string, args: string[]): Promise<boolean> {\n try {\n const child = spawn(command, args, {\n detached: true,\n stdio: 'ignore',\n })\n child.unref()\n return true\n } catch {\n return false\n }\n}\n"],"mappings":"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","names":["path","path","autostart"]}
|
package/dist/http/app.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|