@perkos/perkos-a2a 0.12.47 → 0.12.49
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/README.md +20 -13
- package/dist/bridge-agent.js +23 -3
- package/dist/bridge-agent.js.map +1 -1
- package/dist/hermes-connect.d.ts +90 -0
- package/dist/hermes-connect.d.ts.map +1 -0
- package/dist/hermes-connect.js +426 -0
- package/dist/hermes-connect.js.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/openclaw-supervisor.d.ts.map +1 -1
- package/dist/openclaw-supervisor.js +3 -0
- package/dist/openclaw-supervisor.js.map +1 -1
- package/dist/platform-heartbeat.d.ts +2 -0
- package/dist/platform-heartbeat.d.ts.map +1 -1
- package/dist/platform-heartbeat.js +4 -0
- package/dist/platform-heartbeat.js.map +1 -1
- package/dist/repair-cli.js +49 -15
- package/dist/repair-cli.js.map +1 -1
- package/dist/runtime-health.d.ts +13 -0
- package/dist/runtime-health.d.ts.map +1 -0
- package/dist/runtime-health.js +38 -0
- package/dist/runtime-health.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
+
import { access, chmod, copyFile, mkdir, readFile, rename, stat, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
const RELAY_URL = "wss://transport.perkos.xyz/a2a";
|
|
9
|
+
const CHAT_URL = "wss://chat.perkos.xyz/chat";
|
|
10
|
+
const API_URL = "https://api.perkos.xyz";
|
|
11
|
+
export class HermesConnectFailure extends Error {
|
|
12
|
+
code;
|
|
13
|
+
phase;
|
|
14
|
+
retryable;
|
|
15
|
+
requiresProductFix;
|
|
16
|
+
constructor(code, message, phase, retryable = false, requiresProductFix = false) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.phase = phase;
|
|
20
|
+
this.retryable = retryable;
|
|
21
|
+
this.requiresProductFix = requiresProductFix;
|
|
22
|
+
this.name = "HermesConnectFailure";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function defaultRunner(file, args, timeoutMs = 120_000) {
|
|
26
|
+
try {
|
|
27
|
+
const result = await execFileAsync(file, args, {
|
|
28
|
+
timeout: timeoutMs,
|
|
29
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
30
|
+
encoding: "utf8",
|
|
31
|
+
});
|
|
32
|
+
return { stdout: result.stdout, stderr: result.stderr };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const err = error;
|
|
36
|
+
const detail = [err.message, err.stderr, err.stdout].filter(Boolean).join("\n").slice(0, 2_000);
|
|
37
|
+
throw new Error(`${file} ${args.join(" ")} failed${err.code ? ` (${err.code})` : ""}: ${detail}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function escapeXml(value) {
|
|
41
|
+
return value
|
|
42
|
+
.replaceAll("&", "&")
|
|
43
|
+
.replaceAll("<", "<")
|
|
44
|
+
.replaceAll(">", ">")
|
|
45
|
+
.replaceAll('"', """)
|
|
46
|
+
.replaceAll("'", "'");
|
|
47
|
+
}
|
|
48
|
+
function envValue(text, key) {
|
|
49
|
+
const line = text.split(/\r?\n/).find((entry) => entry.trimStart().startsWith(`${key}=`));
|
|
50
|
+
if (!line)
|
|
51
|
+
return undefined;
|
|
52
|
+
const raw = line.slice(line.indexOf("=") + 1).trim();
|
|
53
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
54
|
+
return raw.slice(1, -1);
|
|
55
|
+
}
|
|
56
|
+
return raw;
|
|
57
|
+
}
|
|
58
|
+
function quoteEnv(value) {
|
|
59
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
60
|
+
}
|
|
61
|
+
export function updateHermesEnvText(original, generatedKey) {
|
|
62
|
+
const existingKey = envValue(original, "API_SERVER_KEY")?.trim();
|
|
63
|
+
const apiKey = existingKey || generatedKey;
|
|
64
|
+
const parsedPort = Number(envValue(original, "API_SERVER_PORT") || "8642");
|
|
65
|
+
const port = Number.isInteger(parsedPort) && parsedPort > 0 && parsedPort <= 65_535
|
|
66
|
+
? parsedPort
|
|
67
|
+
: 8642;
|
|
68
|
+
const desired = {
|
|
69
|
+
API_SERVER_ENABLED: "true",
|
|
70
|
+
API_SERVER_KEY: quoteEnv(apiKey),
|
|
71
|
+
API_SERVER_HOST: quoteEnv(envValue(original, "API_SERVER_HOST") || "127.0.0.1"),
|
|
72
|
+
API_SERVER_PORT: String(port),
|
|
73
|
+
};
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
const lines = original.split(/\r?\n/).map((line) => {
|
|
76
|
+
for (const [key, value] of Object.entries(desired)) {
|
|
77
|
+
if (line.trimStart().startsWith(`${key}=`)) {
|
|
78
|
+
seen.add(key);
|
|
79
|
+
return `${key}=${value}`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return line;
|
|
83
|
+
});
|
|
84
|
+
for (const [key, value] of Object.entries(desired)) {
|
|
85
|
+
if (!seen.has(key))
|
|
86
|
+
lines.push(`${key}=${value}`);
|
|
87
|
+
}
|
|
88
|
+
const text = `${lines.join("\n").replace(/\n+$/, "")}\n`;
|
|
89
|
+
return { text, apiKey, port, changed: text !== original };
|
|
90
|
+
}
|
|
91
|
+
export function serviceIdentity(agentId) {
|
|
92
|
+
const suffix = createHash("sha256").update(agentId).digest("hex").slice(0, 12);
|
|
93
|
+
return { label: `xyz.perkos.a2a-hermes.${suffix}`, suffix };
|
|
94
|
+
}
|
|
95
|
+
export function servicePorts(agentId) {
|
|
96
|
+
const offset = Number.parseInt(createHash("sha256").update(agentId).digest("hex").slice(0, 4), 16) % 400;
|
|
97
|
+
return {
|
|
98
|
+
a2a: 52_000 + offset,
|
|
99
|
+
chatReply: 53_000 + offset,
|
|
100
|
+
tools: 54_000 + offset,
|
|
101
|
+
board: 55_000 + offset,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function renderHermesBridgeConfig(input) {
|
|
105
|
+
return `${JSON.stringify({
|
|
106
|
+
agentName: input.agentName,
|
|
107
|
+
port: input.a2aPort,
|
|
108
|
+
bindHost: "127.0.0.1",
|
|
109
|
+
mode: "client-only",
|
|
110
|
+
skills: [],
|
|
111
|
+
peers: {},
|
|
112
|
+
relay: { enabled: true, url: RELAY_URL, apiKey: input.relayApiKey },
|
|
113
|
+
runtime: {
|
|
114
|
+
kind: "hermes-api",
|
|
115
|
+
sessionKey: "perkos",
|
|
116
|
+
hermesUrl: input.apiUrl,
|
|
117
|
+
hermesEndpoint: "/v1/responses",
|
|
118
|
+
hermesToken: input.apiKey,
|
|
119
|
+
},
|
|
120
|
+
chat: {
|
|
121
|
+
enabled: true,
|
|
122
|
+
url: CHAT_URL,
|
|
123
|
+
apiKey: input.relayApiKey,
|
|
124
|
+
},
|
|
125
|
+
}, null, 2)}\n`;
|
|
126
|
+
}
|
|
127
|
+
export function renderLaunchAgent(input) {
|
|
128
|
+
const env = {
|
|
129
|
+
PERKOS_AGENT_ID: input.agentId,
|
|
130
|
+
PERKOS_HEARTBEAT_URL: `${API_URL}/agents/${input.agentId}/heartbeat`,
|
|
131
|
+
PERKOS_A2A_VERSION: input.version,
|
|
132
|
+
A2A_RUNTIME: "hermes-api",
|
|
133
|
+
A2A_HERMES_AUTO_REPLY: "true",
|
|
134
|
+
A2A_CHAT_REPLY_PORT: String(input.chatReplyPort),
|
|
135
|
+
A2A_TOOLS_TOKEN_PORT: String(input.toolsPort),
|
|
136
|
+
A2A_BOARD_MCP_PORT: String(input.boardPort),
|
|
137
|
+
};
|
|
138
|
+
const envXml = Object.entries(env)
|
|
139
|
+
.map(([key, value]) => ` <key>${escapeXml(key)}</key>\n <string>${escapeXml(value)}</string>`)
|
|
140
|
+
.join("\n");
|
|
141
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
142
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
143
|
+
<plist version="1.0">
|
|
144
|
+
<dict>
|
|
145
|
+
<key>Label</key><string>${escapeXml(input.label)}</string>
|
|
146
|
+
<key>ProgramArguments</key>
|
|
147
|
+
<array>
|
|
148
|
+
<string>${escapeXml(input.nodePath)}</string>
|
|
149
|
+
<string>${escapeXml(input.bridgePath)}</string>
|
|
150
|
+
<string>--config</string>
|
|
151
|
+
<string>${escapeXml(input.configPath)}</string>
|
|
152
|
+
</array>
|
|
153
|
+
<key>RunAtLoad</key><true/>
|
|
154
|
+
<key>KeepAlive</key><true/>
|
|
155
|
+
<key>ThrottleInterval</key><integer>5</integer>
|
|
156
|
+
<key>EnvironmentVariables</key>
|
|
157
|
+
<dict>
|
|
158
|
+
${envXml}
|
|
159
|
+
</dict>
|
|
160
|
+
<key>StandardOutPath</key><string>${escapeXml(input.logPath)}</string>
|
|
161
|
+
<key>StandardErrorPath</key><string>${escapeXml(input.errorLogPath)}</string>
|
|
162
|
+
</dict>
|
|
163
|
+
</plist>
|
|
164
|
+
`;
|
|
165
|
+
}
|
|
166
|
+
async function pathExists(path) {
|
|
167
|
+
try {
|
|
168
|
+
await access(path);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function atomicPrivateWrite(path, content) {
|
|
176
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
177
|
+
const temp = `${path}.tmp-${process.pid}`;
|
|
178
|
+
await writeFile(temp, content, { mode: 0o600 });
|
|
179
|
+
await chmod(temp, 0o600);
|
|
180
|
+
await rename(temp, path);
|
|
181
|
+
}
|
|
182
|
+
async function packageVersion() {
|
|
183
|
+
const raw = await readFile(new URL("../package.json", import.meta.url), "utf8");
|
|
184
|
+
return String(JSON.parse(raw).version || "").trim();
|
|
185
|
+
}
|
|
186
|
+
async function findHermesBinary(explicit, home) {
|
|
187
|
+
const candidates = [
|
|
188
|
+
explicit,
|
|
189
|
+
process.env.HERMES_BIN,
|
|
190
|
+
join(homedir(), ".local", "bin", "hermes"),
|
|
191
|
+
join(home, "hermes-agent", "venv", "bin", "hermes"),
|
|
192
|
+
"/opt/homebrew/bin/hermes",
|
|
193
|
+
"/usr/local/bin/hermes",
|
|
194
|
+
].filter((entry) => Boolean(entry));
|
|
195
|
+
for (const candidate of candidates) {
|
|
196
|
+
if (await pathExists(candidate))
|
|
197
|
+
return candidate;
|
|
198
|
+
}
|
|
199
|
+
throw new HermesConnectFailure("HERMES_CLI_NOT_FOUND", "Hermes CLI was not found. Install Hermes Agent first, then rerun the same invitation command.", "detect", false);
|
|
200
|
+
}
|
|
201
|
+
async function readGatewayPid(home) {
|
|
202
|
+
try {
|
|
203
|
+
const parsed = JSON.parse(await readFile(join(home, "gateway.pid"), "utf8"));
|
|
204
|
+
return Number.isInteger(parsed.pid) ? parsed.pid : null;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function waitForHermesApi(apiUrl, apiKey, timeoutMs) {
|
|
211
|
+
const deadline = Date.now() + timeoutMs;
|
|
212
|
+
let detail = "not reachable";
|
|
213
|
+
while (Date.now() < deadline) {
|
|
214
|
+
try {
|
|
215
|
+
const health = await fetch(`${apiUrl}/health`, { signal: AbortSignal.timeout(5_000) });
|
|
216
|
+
if (health.ok) {
|
|
217
|
+
const capabilities = await fetch(`${apiUrl}/v1/capabilities`, {
|
|
218
|
+
headers: { authorization: `Bearer ${apiKey}` },
|
|
219
|
+
signal: AbortSignal.timeout(5_000),
|
|
220
|
+
});
|
|
221
|
+
if (capabilities.ok)
|
|
222
|
+
return;
|
|
223
|
+
detail = `capabilities returned ${capabilities.status}`;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
detail = `health returned ${health.status}`;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
detail = error instanceof Error ? error.message : String(error);
|
|
231
|
+
}
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
233
|
+
}
|
|
234
|
+
throw new HermesConnectFailure("HERMES_API_UNAVAILABLE", `Hermes API did not become ready (${detail}). The CLI already preserved a backup of the original Hermes environment.`, "restart-runtime", true);
|
|
235
|
+
}
|
|
236
|
+
async function hermesApiReady(apiUrl, apiKey) {
|
|
237
|
+
try {
|
|
238
|
+
const health = await fetch(`${apiUrl}/health`, { signal: AbortSignal.timeout(5_000) });
|
|
239
|
+
if (!health.ok)
|
|
240
|
+
return false;
|
|
241
|
+
const capabilities = await fetch(`${apiUrl}/v1/capabilities`, {
|
|
242
|
+
headers: { authorization: `Bearer ${apiKey}` },
|
|
243
|
+
signal: AbortSignal.timeout(5_000),
|
|
244
|
+
});
|
|
245
|
+
return capabilities.ok;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async function launchdPid(runner, label) {
|
|
252
|
+
try {
|
|
253
|
+
const result = await runner("/bin/launchctl", ["print", `gui/${process.getuid?.() ?? 0}/${label}`], 15_000);
|
|
254
|
+
const match = result.stdout.match(/\bpid\s*=\s*(\d+)/);
|
|
255
|
+
return match ? Number(match[1]) : null;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function waitForBridge(logPath, errorLogPath, baseline, runner, label, agentName, timeoutMs) {
|
|
262
|
+
const deadline = Date.now() + timeoutMs;
|
|
263
|
+
let observed = "";
|
|
264
|
+
while (Date.now() < deadline) {
|
|
265
|
+
const out = await readFile(logPath, "utf8").catch(() => "");
|
|
266
|
+
const err = await readFile(errorLogPath, "utf8").catch(() => "");
|
|
267
|
+
observed = `${out.slice(baseline.out)}\n${err.slice(baseline.err)}`;
|
|
268
|
+
if (/duplicate registration replaced/i.test(observed)) {
|
|
269
|
+
throw new HermesConnectFailure("DUPLICATE_REGISTRATION", "The official bridge detected a competing registration for this agent identity.", "verify", false, true);
|
|
270
|
+
}
|
|
271
|
+
const checks = {
|
|
272
|
+
relayConnected: /Connected to relay hub/.test(observed),
|
|
273
|
+
relayRegistered: /Registered with relay hub/.test(observed),
|
|
274
|
+
chatAuthenticated: new RegExp(`\\[perkos-chat\\] authed as agent:${agentName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(observed),
|
|
275
|
+
heartbeatAccepted: /\[perkos-heartbeat\].*status=200/.test(observed),
|
|
276
|
+
};
|
|
277
|
+
const pid = await launchdPid(runner, label);
|
|
278
|
+
if (pid && Object.values(checks).every(Boolean))
|
|
279
|
+
return { pid };
|
|
280
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
281
|
+
}
|
|
282
|
+
throw new HermesConnectFailure("BRIDGE_HEALTH_TIMEOUT", "The native bridge did not reach relay + chat + heartbeat healthy state before the timeout. Inspect the secret-free launchd logs reported by the CLI.", "verify", true);
|
|
283
|
+
}
|
|
284
|
+
export async function connectHermes(options, runner = defaultRunner) {
|
|
285
|
+
if (process.platform !== "darwin") {
|
|
286
|
+
throw new HermesConnectFailure("UNSUPPORTED_PLATFORM", "connect-hermes currently supports native macOS launchd. Linux Hermes agents should use the published container workflow.", "detect", false, true);
|
|
287
|
+
}
|
|
288
|
+
const version = await packageVersion();
|
|
289
|
+
if (!version)
|
|
290
|
+
throw new HermesConnectFailure("PACKAGE_VERSION_MISSING", "Package version is missing.", "detect", false, true);
|
|
291
|
+
const home = options.hermesHome || process.env.HERMES_HOME || join(homedir(), ".hermes");
|
|
292
|
+
if (!await pathExists(home)) {
|
|
293
|
+
throw new HermesConnectFailure("HERMES_HOME_NOT_FOUND", `Hermes home was not found at ${home}.`, "detect");
|
|
294
|
+
}
|
|
295
|
+
const hermesBin = await findHermesBinary(options.hermesBin, home);
|
|
296
|
+
await runner(hermesBin, ["--version"], 20_000);
|
|
297
|
+
const root = join(homedir(), ".perkos", "a2a", "hermes", options.agentId);
|
|
298
|
+
const runtimeRoot = join(root, "runtime");
|
|
299
|
+
const configPath = join(root, "a2a.config.json");
|
|
300
|
+
const logsDir = join(root, "logs");
|
|
301
|
+
const logPath = join(logsDir, "bridge.log");
|
|
302
|
+
const errorLogPath = join(logsDir, "bridge.err.log");
|
|
303
|
+
const plistPath = join(homedir(), "Library", "LaunchAgents", `${serviceIdentity(options.agentId).label}.plist`);
|
|
304
|
+
const alreadyInstalled = await pathExists(configPath);
|
|
305
|
+
const envPath = join(home, ".env");
|
|
306
|
+
const originalEnv = await readFile(envPath, "utf8").catch(() => "");
|
|
307
|
+
const envUpdate = updateHermesEnvText(originalEnv, `perkos_${randomBytes(32).toString("hex")}`);
|
|
308
|
+
const previousGatewayPid = await readGatewayPid(home);
|
|
309
|
+
if (envUpdate.changed) {
|
|
310
|
+
if (originalEnv) {
|
|
311
|
+
const backup = `${envPath}.perkos-backup-${new Date().toISOString().replace(/[:.]/g, "-")}`;
|
|
312
|
+
await copyFile(envPath, backup);
|
|
313
|
+
await chmod(backup, 0o600);
|
|
314
|
+
}
|
|
315
|
+
await atomicPrivateWrite(envPath, envUpdate.text);
|
|
316
|
+
}
|
|
317
|
+
const apiUrl = `http://127.0.0.1:${envUpdate.port}`;
|
|
318
|
+
await mkdir(runtimeRoot, { recursive: true, mode: 0o700 });
|
|
319
|
+
await runner("npm", [
|
|
320
|
+
"install",
|
|
321
|
+
"--prefix", runtimeRoot,
|
|
322
|
+
"--omit=dev",
|
|
323
|
+
"--ignore-scripts",
|
|
324
|
+
"--no-audit",
|
|
325
|
+
"--no-fund",
|
|
326
|
+
"--save-exact",
|
|
327
|
+
`@perkos/perkos-a2a@${version}`,
|
|
328
|
+
], Math.max(120_000, options.timeoutMs || 0));
|
|
329
|
+
const bridgePath = join(runtimeRoot, "node_modules", "@perkos", "perkos-a2a", "dist", "bridge-agent.js");
|
|
330
|
+
if (!await pathExists(bridgePath)) {
|
|
331
|
+
throw new HermesConnectFailure("BRIDGE_INSTALL_MISSING", "The exact-version npm install did not contain the bridge entrypoint.", "install-bridge", false, true);
|
|
332
|
+
}
|
|
333
|
+
const ports = servicePorts(options.agentId);
|
|
334
|
+
await atomicPrivateWrite(configPath, renderHermesBridgeConfig({
|
|
335
|
+
agentName: options.agentName,
|
|
336
|
+
relayApiKey: options.relayApiKey,
|
|
337
|
+
apiUrl,
|
|
338
|
+
apiKey: envUpdate.apiKey,
|
|
339
|
+
a2aPort: ports.a2a,
|
|
340
|
+
}));
|
|
341
|
+
await mkdir(logsDir, { recursive: true, mode: 0o700 });
|
|
342
|
+
const baseline = {
|
|
343
|
+
out: (await stat(logPath).catch(() => ({ size: 0 }))).size,
|
|
344
|
+
err: (await stat(errorLogPath).catch(() => ({ size: 0 }))).size,
|
|
345
|
+
};
|
|
346
|
+
const identity = serviceIdentity(options.agentId);
|
|
347
|
+
const plist = renderLaunchAgent({
|
|
348
|
+
label: identity.label,
|
|
349
|
+
nodePath: process.execPath,
|
|
350
|
+
bridgePath,
|
|
351
|
+
configPath,
|
|
352
|
+
logPath,
|
|
353
|
+
errorLogPath,
|
|
354
|
+
agentId: options.agentId,
|
|
355
|
+
version,
|
|
356
|
+
chatReplyPort: ports.chatReply,
|
|
357
|
+
toolsPort: ports.tools,
|
|
358
|
+
boardPort: ports.board,
|
|
359
|
+
});
|
|
360
|
+
await atomicPrivateWrite(plistPath, plist);
|
|
361
|
+
const domain = `gui/${process.getuid?.() ?? 0}`;
|
|
362
|
+
await runner("/bin/launchctl", ["bootout", domain, plistPath], 20_000).catch(() => ({ stdout: "", stderr: "" }));
|
|
363
|
+
await runner("/bin/launchctl", ["bootstrap", domain, plistPath], 30_000);
|
|
364
|
+
await runner("/bin/launchctl", ["kickstart", "-k", `${domain}/${identity.label}`], 30_000);
|
|
365
|
+
const healthy = await waitForBridge(logPath, errorLogPath, baseline, runner, identity.label, options.agentName, options.timeoutMs || 120_000);
|
|
366
|
+
let apiReachable = await hermesApiReady(apiUrl, envUpdate.apiKey);
|
|
367
|
+
let gatewayRestarted = false;
|
|
368
|
+
let restartScheduled = false;
|
|
369
|
+
if (!apiReachable) {
|
|
370
|
+
const gatewayPid = await readGatewayPid(home);
|
|
371
|
+
if (gatewayPid) {
|
|
372
|
+
// The invitation is normally executed by the Hermes agent itself. Calling
|
|
373
|
+
// `hermes gateway restart` from that child is intentionally refused by
|
|
374
|
+
// Hermes, and waiting for the restart would deadlock while the current
|
|
375
|
+
// turn is still active. SIGUSR1 is Hermes' supported graceful self-restart
|
|
376
|
+
// request: the gateway drains this command, returns the JSON below, then
|
|
377
|
+
// restarts and loads the API server configuration without another user
|
|
378
|
+
// action. The already-supervised bridge keeps reconnecting meanwhile.
|
|
379
|
+
try {
|
|
380
|
+
process.kill(gatewayPid, "SIGUSR1");
|
|
381
|
+
restartScheduled = true;
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
throw new HermesConnectFailure("HERMES_RESTART_SIGNAL_FAILED", `Could not schedule the Hermes gateway restart: ${error instanceof Error ? error.message : String(error)}`, "restart-runtime", true);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
await runner(hermesBin, ["gateway", "start"], Math.max(120_000, options.timeoutMs || 0));
|
|
389
|
+
await waitForHermesApi(apiUrl, envUpdate.apiKey, Math.min(options.timeoutMs || 120_000, 180_000));
|
|
390
|
+
apiReachable = true;
|
|
391
|
+
gatewayRestarted = true;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
else if (envUpdate.changed && previousGatewayPid) {
|
|
395
|
+
// The API was already active with the preserved credential, so the extra
|
|
396
|
+
// default-only env normalization does not require disrupting the runtime.
|
|
397
|
+
gatewayRestarted = false;
|
|
398
|
+
}
|
|
399
|
+
return {
|
|
400
|
+
schemaVersion: 1,
|
|
401
|
+
ok: true,
|
|
402
|
+
runtime: "hermes",
|
|
403
|
+
status: restartScheduled ? "restart-scheduled" : "ready",
|
|
404
|
+
version,
|
|
405
|
+
agentName: options.agentName,
|
|
406
|
+
agentId: options.agentId,
|
|
407
|
+
mode: alreadyInstalled ? "repaired" : "installed",
|
|
408
|
+
service: { manager: "launchd", label: identity.label, pid: healthy.pid },
|
|
409
|
+
hermes: {
|
|
410
|
+
executable: hermesBin,
|
|
411
|
+
apiUrl,
|
|
412
|
+
apiReachable,
|
|
413
|
+
gatewayRestarted,
|
|
414
|
+
restartScheduled,
|
|
415
|
+
},
|
|
416
|
+
checks: {
|
|
417
|
+
relayConnected: true,
|
|
418
|
+
relayRegistered: true,
|
|
419
|
+
chatAuthenticated: true,
|
|
420
|
+
heartbeatAccepted: true,
|
|
421
|
+
duplicateRegistration: false,
|
|
422
|
+
},
|
|
423
|
+
secretsRedacted: true,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=hermes-connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-connect.js","sourceRoot":"","sources":["../src/hermes-connect.ts"],"names":[],"mappings":"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"}
|