mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-28 11:32:22 +00:00
Bring apps/desktop and ui-tui to a clean state for typecheck, eslint,
and prettier:
- Run prettier across both trees (printWidth/wrap drift; prettier is not
CI-enforced for these JS projects, so main had accumulated drift).
- Apply eslint --fix for padding-line-between-statements and perfectionist
import/export sorting.
- Manual fixes for non-auto-fixable rules:
- remove unused node:net import in electron/main.cjs (uses Electron net)
- replace inline `typeof import(...)` annotations with top-level
`import type * as EnvModule` in two ui-tui test files
- scoped eslint-disable no-control-regex on intentional sentinel/ANSI
regexes (mathUnicode.ts, text.ts)
- resolve react-hooks/exhaustive-deps per-case: correct swapped/missing
deps, collapse redundant session.* members, and justified disables on
settings mount-only data-load effects to preserve run-once behavior
No behavior changes; test pass/fail counts are unchanged from the main
baseline.
58 lines
2 KiB
JavaScript
58 lines
2 KiB
JavaScript
/**
|
|
* Pure helpers for choosing a remote URL during passive update checks.
|
|
*
|
|
* A public install can end up with `origin=git@github.com:NousResearch/hermes-agent.git`.
|
|
* If the user's GitHub SSH key is FIDO2/passkey-backed, a background `git fetch
|
|
* origin` triggers an unexplained hardware-touch prompt. For passive checks
|
|
* against the official repo we substitute the public HTTPS `ls-remote` path,
|
|
* which needs no auth and cannot prompt. Active update/apply flows are left
|
|
* unchanged.
|
|
*
|
|
* Extracted from main.cjs so the security-critical remote detection is unit
|
|
* testable without booting Electron (main.cjs requires('electron') at load).
|
|
*/
|
|
|
|
const OFFICIAL_REPO_HTTPS_URL = 'https://github.com/NousResearch/hermes-agent.git'
|
|
const OFFICIAL_REPO_CANONICAL = 'github.com/nousresearch/hermes-agent'
|
|
|
|
// Normalize common GitHub remote URL forms to `host/owner/repo` (lowercased,
|
|
// no trailing slash, no .git suffix) so SSH and HTTPS forms of the same repo
|
|
// compare equal.
|
|
function canonicalGitHubRemote(url) {
|
|
if (!url) return ''
|
|
let value = String(url).trim()
|
|
if (value.startsWith('git@github.com:')) {
|
|
value = `github.com/${value.slice('git@github.com:'.length)}`
|
|
} else if (value.startsWith('ssh://git@github.com/')) {
|
|
value = `github.com/${value.slice('ssh://git@github.com/'.length)}`
|
|
} else {
|
|
try {
|
|
const parsed = new URL(value)
|
|
if (parsed.hostname && parsed.pathname) value = `${parsed.hostname}${parsed.pathname}`
|
|
} catch {
|
|
// Leave non-URL forms unchanged.
|
|
}
|
|
}
|
|
value = value.trim().replace(/\/+$/, '')
|
|
if (value.endsWith('.git')) value = value.slice(0, -4)
|
|
return value.toLowerCase()
|
|
}
|
|
|
|
function isSshRemote(url) {
|
|
const value = String(url || '')
|
|
.trim()
|
|
.toLowerCase()
|
|
return value.startsWith('git@') || value.startsWith('ssh://')
|
|
}
|
|
|
|
function isOfficialSshRemote(url) {
|
|
return isSshRemote(url) && canonicalGitHubRemote(url) === OFFICIAL_REPO_CANONICAL
|
|
}
|
|
|
|
module.exports = {
|
|
OFFICIAL_REPO_HTTPS_URL,
|
|
OFFICIAL_REPO_CANONICAL,
|
|
canonicalGitHubRemote,
|
|
isSshRemote,
|
|
isOfficialSshRemote
|
|
}
|