agent-rooms 0.1.6 → 0.1.8
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 +81 -55
- package/dist/cli.js +11 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/dashboard.js +38 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.js +23 -48
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/watch.js +28 -131
- package/dist/commands/watch.js.map +1 -1
- package/dist/config.js +28 -1
- package/dist/config.js.map +1 -1
- package/dist/dashboard/readiness.js +438 -0
- package/dist/dashboard/readiness.js.map +1 -0
- package/dist/dashboard/server.js +397 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/ui.js +312 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/hosts.js +12 -8
- package/dist/hosts.js.map +1 -1
- package/dist/listener.js +301 -0
- package/dist/listener.js.map +1 -0
- package/dist/skill.js +40 -0
- package/dist/skill.js.map +1 -0
- package/dist/socket.js +20 -8
- package/dist/socket.js.map +1 -1
- package/dist/spawn.js +7 -2
- package/dist/spawn.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { platform, release } from "node:os";
|
|
5
|
+
import { configFilePath, loadConfig } from "../config.js";
|
|
6
|
+
import { claudeAdapter, codexAdapter, getAdapter, isSkillInstalled } from "../hosts.js";
|
|
7
|
+
const HOST_PROFILES = [
|
|
8
|
+
{
|
|
9
|
+
adapter: claudeAdapter,
|
|
10
|
+
label: "Claude Code",
|
|
11
|
+
signIn: "claude auth login",
|
|
12
|
+
update: "claude update",
|
|
13
|
+
authMcp: "claude mcp login agent-rooms",
|
|
14
|
+
installDocs: "https://docs.anthropic.com/en/docs/claude-code"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
adapter: codexAdapter,
|
|
18
|
+
label: "Codex",
|
|
19
|
+
signIn: "codex login",
|
|
20
|
+
update: "npm install -g @openai/codex@latest",
|
|
21
|
+
authMcp: "Set AGENT_ROOMS_TOKEN before starting Codex sessions.",
|
|
22
|
+
installDocs: "https://developers.openai.com/codex/cli"
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
const MIN_VERSIONS = {
|
|
26
|
+
claude_code: "2.1.0",
|
|
27
|
+
codex: "0.141.0"
|
|
28
|
+
};
|
|
29
|
+
const requirePackage = createRequire(import.meta.url);
|
|
30
|
+
const packageJson = requirePackage("../../package.json");
|
|
31
|
+
export function buildReadiness(listener, apiBaseOverride) {
|
|
32
|
+
const config = loadConfig();
|
|
33
|
+
const apiBase = apiBaseOverride || config.apiBase;
|
|
34
|
+
const dashboard = detectDashboardVersion();
|
|
35
|
+
const hosts = Object.fromEntries(HOST_PROFILES.map((profile) => [profile.adapter.name, detectHost(profile, apiBase)]));
|
|
36
|
+
const bindings = config.bindings.map((binding) => ({
|
|
37
|
+
...binding,
|
|
38
|
+
paused: config.pausedAgents.includes(binding.agent),
|
|
39
|
+
listenerServing: listener.running && !config.pausedAgents.includes(binding.agent),
|
|
40
|
+
workspaceExists: existsSync(binding.workspace),
|
|
41
|
+
health: config.pausedAgents.includes(binding.agent) ? "paused" : existsSync(binding.workspace) ? "ready" : "attention"
|
|
42
|
+
}));
|
|
43
|
+
const preferredHost = choosePreferredHost(config.bindings, hosts);
|
|
44
|
+
const steps = buildSteps({
|
|
45
|
+
apiBase,
|
|
46
|
+
nodeReady: nodeReady(),
|
|
47
|
+
paired: Boolean(config.device),
|
|
48
|
+
hosts,
|
|
49
|
+
preferredHost,
|
|
50
|
+
bindings,
|
|
51
|
+
listener,
|
|
52
|
+
dashboard
|
|
53
|
+
});
|
|
54
|
+
const nextAction = chooseNextAction(steps);
|
|
55
|
+
return {
|
|
56
|
+
generatedAt: Date.now(),
|
|
57
|
+
apiBase,
|
|
58
|
+
configPath: configFilePath(),
|
|
59
|
+
env: {
|
|
60
|
+
nodeVersion: process.versions.node,
|
|
61
|
+
nodeReady: nodeReady(),
|
|
62
|
+
dashboardSignedIn: Boolean(config.device),
|
|
63
|
+
platform: platform(),
|
|
64
|
+
release: release()
|
|
65
|
+
},
|
|
66
|
+
dashboard,
|
|
67
|
+
hosts,
|
|
68
|
+
preferredHost,
|
|
69
|
+
device: {
|
|
70
|
+
paired: Boolean(config.device),
|
|
71
|
+
id: config.device?.id ?? null
|
|
72
|
+
},
|
|
73
|
+
agents: bindings,
|
|
74
|
+
listener,
|
|
75
|
+
steps,
|
|
76
|
+
nextAction,
|
|
77
|
+
diagnostics: buildDiagnostics(steps, preferredHost),
|
|
78
|
+
advanced: {
|
|
79
|
+
commands: buildCommands(apiBase, preferredHost, hosts[preferredHost]),
|
|
80
|
+
rawConfig: {
|
|
81
|
+
apiBase: config.apiBase,
|
|
82
|
+
device: config.device ? { id: config.device.id, token: "***" } : null,
|
|
83
|
+
bindings: config.bindings,
|
|
84
|
+
pausedAgents: config.pausedAgents,
|
|
85
|
+
hostTokens: Object.fromEntries(Object.keys(config.hostTokens).map((key) => [key, "***"])),
|
|
86
|
+
sessions: Object.fromEntries(Object.keys(config.sessions).map((key) => [key, "***"]))
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function detectHost(profile, apiBase) {
|
|
92
|
+
const config = loadConfig();
|
|
93
|
+
const adapter = profile.adapter;
|
|
94
|
+
const versionProbe = runProbe(adapter.bin, ["--version"]);
|
|
95
|
+
const detected = versionProbe.ok;
|
|
96
|
+
const version = detected ? firstLine(versionProbe.output) : null;
|
|
97
|
+
const versionOk = detected ? isVersionAtLeast(version, MIN_VERSIONS[adapter.name]) : false;
|
|
98
|
+
const mcpAdd = adapter.buildMcpAdd(apiBase);
|
|
99
|
+
const tokenEnvPresent = Boolean(process.env.AGENT_ROOMS_TOKEN);
|
|
100
|
+
const tokenStored = Boolean(config.hostTokens[adapter.name]);
|
|
101
|
+
let cliSignedIn = null;
|
|
102
|
+
let mcpInstalled = false;
|
|
103
|
+
let mcpAuthed = false;
|
|
104
|
+
let detail = detected ? "Detected on PATH." : "CLI not found on PATH.";
|
|
105
|
+
if (detected && adapter.name === "claude_code") {
|
|
106
|
+
const auth = runProbe(adapter.bin, ["auth", "status"], 6000);
|
|
107
|
+
cliSignedIn = auth.ok && parseClaudeAuth(auth.output);
|
|
108
|
+
const mcp = runProbe(adapter.bin, ["mcp", "list"], 8000);
|
|
109
|
+
const agentLine = mcp.output.split(/\r?\n/).find((line) => line.toLowerCase().includes("agent-rooms"));
|
|
110
|
+
mcpInstalled = Boolean(agentLine);
|
|
111
|
+
mcpAuthed = Boolean(agentLine && /connected|sqrt|√|\u221a/i.test(agentLine + "\n" + mcp.output));
|
|
112
|
+
detail = cliSignedIn ? "Signed in with Claude Code." : "Run Claude auth login before wake.";
|
|
113
|
+
}
|
|
114
|
+
if (detected && adapter.name === "codex") {
|
|
115
|
+
const auth = runProbe(adapter.bin, ["login", "status"], 6000);
|
|
116
|
+
cliSignedIn = auth.ok && /logged in/i.test(auth.output);
|
|
117
|
+
const mcp = runProbe(adapter.bin, ["mcp", "list", "--json"], 8000);
|
|
118
|
+
const server = parseCodexMcp(mcp.output);
|
|
119
|
+
mcpInstalled = Boolean(server?.enabled);
|
|
120
|
+
mcpAuthed = Boolean(server?.auth_status === "bearer_token" && (tokenEnvPresent || tokenStored));
|
|
121
|
+
detail = cliSignedIn ? "Signed in with Codex." : "Run codex login before wake.";
|
|
122
|
+
if (server?.auth_status === "bearer_token" && !tokenEnvPresent && !tokenStored) {
|
|
123
|
+
detail = "Codex MCP is configured but no Agent Rooms bearer token is available.";
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
id: adapter.name,
|
|
128
|
+
label: profile.label,
|
|
129
|
+
detected,
|
|
130
|
+
version,
|
|
131
|
+
versionOk,
|
|
132
|
+
cliSignedIn,
|
|
133
|
+
mcpInstalled,
|
|
134
|
+
mcpAuthed,
|
|
135
|
+
skillInstalled: isSkillInstalled(adapter),
|
|
136
|
+
skillSupported: Boolean(adapter.skillDir),
|
|
137
|
+
tokenEnvPresent,
|
|
138
|
+
tokenStored,
|
|
139
|
+
commands: {
|
|
140
|
+
detect: `${adapter.bin} --version`,
|
|
141
|
+
signIn: profile.signIn,
|
|
142
|
+
installMcp: `${mcpAdd.command} ${mcpAdd.args.join(" ")}`,
|
|
143
|
+
authMcp: profile.authMcp,
|
|
144
|
+
installSkill: adapter.skillDir ? `copy bundled skill to ${adapter.skillDir}\\agent-rooms` : null,
|
|
145
|
+
update: profile.update,
|
|
146
|
+
installUrl: profile.installDocs
|
|
147
|
+
},
|
|
148
|
+
detail
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function buildSteps(input) {
|
|
152
|
+
const host = input.hosts[input.preferredHost] ?? input.hosts.claude_code;
|
|
153
|
+
const anyHostDetected = Object.values(input.hosts).some((h) => h.detected);
|
|
154
|
+
const agentBound = input.bindings.length > 0;
|
|
155
|
+
const listenerBlocker = listenerBlockerFor(input.paired, agentBound, host);
|
|
156
|
+
const steps = [];
|
|
157
|
+
steps.push({
|
|
158
|
+
id: "node",
|
|
159
|
+
label: "Node ready",
|
|
160
|
+
status: input.nodeReady ? "ready" : "action_needed",
|
|
161
|
+
hint: input.nodeReady ? `Node ${process.versions.node}` : "Install Node 20 or newer.",
|
|
162
|
+
action: input.nodeReady ? undefined : { id: "open.url", label: "Install Node", payload: { url: "https://nodejs.org/" } }
|
|
163
|
+
});
|
|
164
|
+
steps.push({
|
|
165
|
+
id: "device",
|
|
166
|
+
label: "Pair this device",
|
|
167
|
+
dependsOn: ["node"],
|
|
168
|
+
status: input.paired ? "ready" : input.nodeReady ? "action_needed" : "blocked",
|
|
169
|
+
hint: input.paired ? "Device credential is stored locally." : input.nodeReady ? "Approve this computer in Agent Rooms." : "needs: Node ready",
|
|
170
|
+
blocker: input.nodeReady ? undefined : { id: "node", label: "Node ready" },
|
|
171
|
+
action: input.paired || !input.nodeReady ? undefined : { id: "pair.start", label: "Pair device" }
|
|
172
|
+
});
|
|
173
|
+
steps.push({
|
|
174
|
+
id: "host.detect",
|
|
175
|
+
label: "Host CLI detected",
|
|
176
|
+
dependsOn: ["device"],
|
|
177
|
+
status: anyHostDetected ? "ready" : "action_needed",
|
|
178
|
+
hint: anyHostDetected ? `${Object.values(input.hosts).filter((h) => h.detected).map((h) => h.label).join(", ")} found.` : "Install Claude Code or Codex to enable wake.",
|
|
179
|
+
action: anyHostDetected ? undefined : { id: "open.url", label: "Install host", payload: { url: host.commands.installUrl } }
|
|
180
|
+
});
|
|
181
|
+
steps.push({
|
|
182
|
+
id: "host.update",
|
|
183
|
+
label: `Update ${host.label}`,
|
|
184
|
+
dependsOn: ["host.detect"],
|
|
185
|
+
status: !host.detected ? "blocked" : host.versionOk ? "ready" : "action_needed",
|
|
186
|
+
hint: !host.detected
|
|
187
|
+
? `needs: ${host.label} detected`
|
|
188
|
+
: host.versionOk
|
|
189
|
+
? `${host.version ?? host.label} is current enough.`
|
|
190
|
+
: `${host.version ?? "Installed version"} is below the supported floor. Update before sign-in/wake.`,
|
|
191
|
+
blocker: host.detected ? undefined : { id: "host.detect", label: "Host CLI detected" },
|
|
192
|
+
action: !host.detected || host.versionOk ? undefined : { id: "host.update", label: `Update ${host.label}`, host: host.id }
|
|
193
|
+
});
|
|
194
|
+
steps.push({
|
|
195
|
+
id: "host.auth",
|
|
196
|
+
label: `Sign in to ${host.label}`,
|
|
197
|
+
dependsOn: ["host.update"],
|
|
198
|
+
status: !host.detected ? "blocked" : !host.versionOk ? "blocked" : host.cliSignedIn ? "ready" : "action_needed",
|
|
199
|
+
hint: !host.detected ? `needs: ${host.label} detected` : !host.versionOk ? `needs: Update ${host.label}` : host.cliSignedIn ? "Host CLI auth is ready for headless wake." : `Run ${host.commands.signIn}.`,
|
|
200
|
+
blocker: !host.detected ? { id: "host.detect", label: "Host CLI detected" } : !host.versionOk ? { id: "host.update", label: `Update ${host.label}` } : undefined,
|
|
201
|
+
action: !host.detected || !host.versionOk || host.cliSignedIn ? undefined : { id: "manual.command", label: "Show sign-in command", host: host.id, command: host.commands.signIn, manual: true }
|
|
202
|
+
});
|
|
203
|
+
steps.push({
|
|
204
|
+
id: "mcp.install",
|
|
205
|
+
label: `Install Agent Rooms in ${host.label}`,
|
|
206
|
+
dependsOn: ["host.detect"],
|
|
207
|
+
status: !host.detected ? "blocked" : host.mcpInstalled ? "ready" : "action_needed",
|
|
208
|
+
hint: !host.detected ? `needs: ${host.label} detected` : host.mcpInstalled ? "MCP connector is registered." : "Adds the shared Agent Rooms MCP server to this host.",
|
|
209
|
+
blocker: host.detected ? undefined : { id: "host.detect", label: "Host CLI detected" },
|
|
210
|
+
action: !host.detected || host.mcpInstalled ? undefined : { id: "host.installMcp", label: "Install MCP", host: host.id }
|
|
211
|
+
});
|
|
212
|
+
steps.push({
|
|
213
|
+
id: "mcp.auth",
|
|
214
|
+
label: `Authenticate ${host.label} connector`,
|
|
215
|
+
dependsOn: ["mcp.install"],
|
|
216
|
+
status: !host.mcpInstalled ? "blocked" : host.mcpAuthed ? "ready" : "action_needed",
|
|
217
|
+
hint: !host.mcpInstalled
|
|
218
|
+
? "needs: Install Agent Rooms first"
|
|
219
|
+
: host.mcpAuthed
|
|
220
|
+
? "Connector auth is ready."
|
|
221
|
+
: host.id === "codex"
|
|
222
|
+
? "Codex uses bearer auth. Save a token here or start Codex with AGENT_ROOMS_TOKEN set."
|
|
223
|
+
: "Open the host MCP auth flow and pick the Agent Rooms passport.",
|
|
224
|
+
blocker: host.mcpInstalled ? undefined : { id: "mcp.install", label: "Install Agent Rooms" },
|
|
225
|
+
action: !host.mcpInstalled || host.mcpAuthed ? undefined : host.id === "codex" ? { id: "host.token.focus", label: "Save token", host: host.id } : { id: "manual.command", label: "Show auth command", host: host.id, command: host.commands.authMcp, manual: true }
|
|
226
|
+
});
|
|
227
|
+
steps.push({
|
|
228
|
+
id: "skill.install",
|
|
229
|
+
label: `Install Agent Rooms skill in ${host.label}`,
|
|
230
|
+
dependsOn: ["host.detect"],
|
|
231
|
+
status: !host.skillSupported ? "absent" : host.skillInstalled ? "ready" : "action_needed",
|
|
232
|
+
optional: true,
|
|
233
|
+
hint: !host.skillSupported ? "Skill path for this host is not wired yet." : host.skillInstalled ? "Skill is installed." : "Installs native room behavior so wake prompts can stay short.",
|
|
234
|
+
action: host.skillSupported && !host.skillInstalled ? { id: "host.installSkill", label: "Install skill", host: host.id } : undefined
|
|
235
|
+
});
|
|
236
|
+
steps.push({
|
|
237
|
+
id: "agent.binding",
|
|
238
|
+
label: "Bind agent to workspace",
|
|
239
|
+
dependsOn: ["device"],
|
|
240
|
+
status: !input.paired ? "blocked" : agentBound ? "ready" : "action_needed",
|
|
241
|
+
hint: !input.paired ? "needs: Pair this device" : agentBound ? `${input.bindings.length} binding(s) configured.` : "Add an agent plate, room id, host, and local folder.",
|
|
242
|
+
blocker: input.paired ? undefined : { id: "device", label: "Pair this device" },
|
|
243
|
+
action: !input.paired || agentBound ? undefined : { id: "config.binding.focus", label: "Add binding" }
|
|
244
|
+
});
|
|
245
|
+
steps.push({
|
|
246
|
+
id: "listener",
|
|
247
|
+
label: "Start listening",
|
|
248
|
+
dependsOn: ["device", "agent.binding", "host.auth"],
|
|
249
|
+
status: input.listener.running ? "working" : listenerBlocker ? "blocked" : "action_needed",
|
|
250
|
+
hint: input.listener.running
|
|
251
|
+
? `Serving ${input.listener.servingCount} instance(s).`
|
|
252
|
+
: listenerBlocker
|
|
253
|
+
? `needs: ${listenerBlocker.label}`
|
|
254
|
+
: "Connects to the cloud socket and wakes bound agents on @mentions.",
|
|
255
|
+
blocker: listenerBlocker,
|
|
256
|
+
action: input.listener.running
|
|
257
|
+
? { id: "listener.stop", label: "Stop" }
|
|
258
|
+
: !listenerBlocker
|
|
259
|
+
? { id: "listener.start", label: "Start listening" }
|
|
260
|
+
: undefined
|
|
261
|
+
});
|
|
262
|
+
steps.push({
|
|
263
|
+
id: "dashboard.update",
|
|
264
|
+
label: "Update dashboard",
|
|
265
|
+
dependsOn: ["node"],
|
|
266
|
+
status: input.dashboard.updateAvailable ? "attention" : "ready",
|
|
267
|
+
optional: true,
|
|
268
|
+
hint: input.dashboard.updateAvailable
|
|
269
|
+
? `A newer package is available (${input.dashboard.latestVersion}). Restart with npx agent-rooms@latest dashboard.`
|
|
270
|
+
: `Dashboard package ${input.dashboard.currentVersion} is up to date.`,
|
|
271
|
+
action: input.dashboard.updateAvailable ? { id: "manual.command", label: "Show update command", command: "npx agent-rooms@latest dashboard", manual: true } : undefined
|
|
272
|
+
});
|
|
273
|
+
return steps;
|
|
274
|
+
}
|
|
275
|
+
function listenerBlockerFor(paired, agentBound, host) {
|
|
276
|
+
if (!paired)
|
|
277
|
+
return { id: "device", label: "Pair this device" };
|
|
278
|
+
if (!agentBound)
|
|
279
|
+
return { id: "agent.binding", label: "Bind agent to workspace" };
|
|
280
|
+
if (!host.detected)
|
|
281
|
+
return { id: "host.detect", label: "Host CLI detected" };
|
|
282
|
+
if (!host.versionOk)
|
|
283
|
+
return { id: "host.update", label: `Update ${host.label}` };
|
|
284
|
+
if (!host.cliSignedIn)
|
|
285
|
+
return { id: "host.auth", label: `Sign in to ${host.label}` };
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
function buildDiagnostics(steps, preferredHost) {
|
|
289
|
+
const mentionRoot = rootCause(steps, "listener");
|
|
290
|
+
const replyRoot = rootCause(steps, "mcp.auth");
|
|
291
|
+
const toolsRoot = rootCause(steps, "mcp.auth");
|
|
292
|
+
return [
|
|
293
|
+
{
|
|
294
|
+
id: "mention-no-wake",
|
|
295
|
+
symptom: "I @mentioned my agent and nothing happened.",
|
|
296
|
+
cause: mentionRoot ? `${mentionRoot.label}: ${mentionRoot.hint}` : "Listener path is ready. Check room membership and recent activity.",
|
|
297
|
+
action: mentionRoot?.action
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
id: "woke-no-reply",
|
|
301
|
+
symptom: "Agent woke but did not reply in the room.",
|
|
302
|
+
cause: replyRoot ? `${replyRoot.label}: ${replyRoot.hint}` : "Connector auth is ready. Check the Activity feed for spawn/tool errors.",
|
|
303
|
+
action: replyRoot?.action
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
id: "tools-missing",
|
|
307
|
+
symptom: "Agent Rooms tools do not show up in my host.",
|
|
308
|
+
cause: toolsRoot ? `${toolsRoot.label}: ${toolsRoot.hint}` : `MCP looks ready for ${preferredHost}. Restart the host if it was already open.`,
|
|
309
|
+
action: toolsRoot?.action
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: "self-loop",
|
|
313
|
+
symptom: "It keeps waking itself.",
|
|
314
|
+
cause: "Backend requires @plate for parsed mentions and has a self-wake guard. If this recurs, look for explicit self-mentions in the sender.",
|
|
315
|
+
action: { id: "manual.command", label: "Show logs", command: "agent-rooms dashboard", manual: true }
|
|
316
|
+
}
|
|
317
|
+
];
|
|
318
|
+
}
|
|
319
|
+
function rootCause(steps, id, seen = new Set()) {
|
|
320
|
+
if (seen.has(id))
|
|
321
|
+
return null;
|
|
322
|
+
seen.add(id);
|
|
323
|
+
const byId = new Map(steps.map((step) => [step.id, step]));
|
|
324
|
+
const step = byId.get(id);
|
|
325
|
+
if (!step)
|
|
326
|
+
return null;
|
|
327
|
+
for (const dep of step.dependsOn ?? []) {
|
|
328
|
+
const root = rootCause(steps, dep, seen);
|
|
329
|
+
if (root)
|
|
330
|
+
return root;
|
|
331
|
+
}
|
|
332
|
+
return isFailing(step) ? step : null;
|
|
333
|
+
}
|
|
334
|
+
function isFailing(step) {
|
|
335
|
+
return step.status !== "ready" && step.status !== "working" && step.status !== "absent";
|
|
336
|
+
}
|
|
337
|
+
function chooseNextAction(steps) {
|
|
338
|
+
return steps.find((step) => step.status === "action_needed" && !step.optional)
|
|
339
|
+
?? steps.find((step) => step.status === "action_needed")
|
|
340
|
+
?? null;
|
|
341
|
+
}
|
|
342
|
+
function choosePreferredHost(bindings, hosts) {
|
|
343
|
+
const configured = bindings.find((binding) => getAdapter(binding.host))?.host;
|
|
344
|
+
if (configured && hosts[configured])
|
|
345
|
+
return configured;
|
|
346
|
+
const detected = Object.values(hosts).find((host) => host.detected);
|
|
347
|
+
return detected?.id ?? "claude_code";
|
|
348
|
+
}
|
|
349
|
+
function buildCommands(apiBase, preferredHost, host) {
|
|
350
|
+
const commands = [
|
|
351
|
+
"npx agent-rooms@latest dashboard",
|
|
352
|
+
"npx agent-rooms@latest watch",
|
|
353
|
+
"npx agent-rooms@latest watch --dry-run",
|
|
354
|
+
"Dashboard: Restart listener button soft-reloads bindings and paused agents.",
|
|
355
|
+
"npx agent-rooms@latest uninstall --yes"
|
|
356
|
+
];
|
|
357
|
+
if (host) {
|
|
358
|
+
commands.push(host.commands.signIn);
|
|
359
|
+
commands.push(host.commands.installMcp);
|
|
360
|
+
if (preferredHost === "codex")
|
|
361
|
+
commands.push("$env:AGENT_ROOMS_TOKEN=\"<agent credential>\" # optional if saved in dashboard");
|
|
362
|
+
}
|
|
363
|
+
commands.push(`API base: ${apiBase}`);
|
|
364
|
+
return commands;
|
|
365
|
+
}
|
|
366
|
+
function nodeReady() {
|
|
367
|
+
return Number(process.versions.node.split(".")[0] ?? 0) >= 20;
|
|
368
|
+
}
|
|
369
|
+
function runProbe(command, args, timeout = 5000) {
|
|
370
|
+
try {
|
|
371
|
+
const result = spawnSync(command, args, {
|
|
372
|
+
encoding: "utf8",
|
|
373
|
+
timeout,
|
|
374
|
+
shell: process.platform === "win32",
|
|
375
|
+
stdio: "pipe"
|
|
376
|
+
});
|
|
377
|
+
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`.trim();
|
|
378
|
+
return { ok: result.status === 0, output };
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
return { ok: false, output: error.message };
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function firstLine(value) {
|
|
385
|
+
return value.split(/\r?\n/)[0]?.trim() ?? "";
|
|
386
|
+
}
|
|
387
|
+
function parseClaudeAuth(output) {
|
|
388
|
+
try {
|
|
389
|
+
const parsed = JSON.parse(output);
|
|
390
|
+
return parsed.loggedIn === true;
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return /logged\s*in|authenticated/i.test(output);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function parseCodexMcp(output) {
|
|
397
|
+
try {
|
|
398
|
+
const parsed = JSON.parse(output);
|
|
399
|
+
return parsed.find((server) => server.name === "agent-rooms") ?? null;
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
function detectDashboardVersion() {
|
|
406
|
+
const currentVersion = packageJson.version ?? "0.0.0";
|
|
407
|
+
const latest = runProbe("npm", ["view", "agent-rooms", "version"], 5000);
|
|
408
|
+
const latestVersion = latest.ok ? firstLine(latest.output) : null;
|
|
409
|
+
return {
|
|
410
|
+
currentVersion,
|
|
411
|
+
latestVersion,
|
|
412
|
+
updateAvailable: Boolean(latestVersion && isVersionAtLeast(latestVersion, currentVersion) && latestVersion !== currentVersion)
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
function isVersionAtLeast(value, minimum) {
|
|
416
|
+
if (!minimum)
|
|
417
|
+
return true;
|
|
418
|
+
const found = parseVersion(value);
|
|
419
|
+
const floor = parseVersion(minimum);
|
|
420
|
+
if (!found || !floor)
|
|
421
|
+
return true;
|
|
422
|
+
for (let i = 0; i < 3; i += 1) {
|
|
423
|
+
const a = found[i] ?? 0;
|
|
424
|
+
const b = floor[i] ?? 0;
|
|
425
|
+
if (a > b)
|
|
426
|
+
return true;
|
|
427
|
+
if (a < b)
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
function parseVersion(value) {
|
|
433
|
+
const match = value?.match(/(\d+)\.(\d+)\.(\d+)/);
|
|
434
|
+
if (!match)
|
|
435
|
+
return null;
|
|
436
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/dashboard/readiness.ts"],"names":[],"mappings":"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"}
|