@ouro.bot/cli 0.1.0-alpha.194 → 0.1.0-alpha.196

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/changelog.json CHANGED
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
3
3
  "versions": [
4
+ {
5
+ "version": "0.1.0-alpha.196",
6
+ "changes": [
7
+ "fix: ouro up verifies daemon is alive before reporting started (polls socket for 10s)",
8
+ "fix: daemon-runtime-sync also verifies after replacing a stale daemon"
9
+ ]
10
+ },
11
+ {
12
+ "version": "0.1.0-alpha.195",
13
+ "changes": [
14
+ "fix: failover error message reads model from agent.json instead of stale secrets"
15
+ ]
16
+ },
4
17
  {
5
18
  "version": "0.1.0-alpha.194",
6
19
  "changes": [
@@ -266,15 +266,38 @@ async function ensureDaemonRunning(deps) {
266
266
  },
267
267
  cleanupStaleSocket: deps.cleanupStaleSocket,
268
268
  startDaemonProcess: deps.startDaemonProcess,
269
+ checkSocketAlive: deps.checkSocketAlive,
269
270
  });
270
271
  }
271
272
  deps.cleanupStaleSocket(deps.socketPath);
272
273
  const started = await deps.startDaemonProcess(deps.socketPath);
274
+ const pid = started.pid ?? "unknown";
275
+ // Verify the daemon actually comes up before reporting success
276
+ const verified = await verifyDaemonAlive(deps.checkSocketAlive, deps.socketPath);
277
+ /* v8 ignore start -- daemon liveness failure: requires real daemon crash timing @preserve */
278
+ if (!verified) {
279
+ return {
280
+ alreadyRunning: false,
281
+ message: `daemon spawned (pid ${pid}) but failed to respond within 10s — check \`ouro status\` or daemon logs`,
282
+ };
283
+ }
284
+ /* v8 ignore stop */
273
285
  return {
274
286
  alreadyRunning: false,
275
- message: `daemon started (pid ${started.pid ?? "unknown"})`,
287
+ message: `daemon started (pid ${pid})`,
276
288
  };
277
289
  }
290
+ /* v8 ignore start -- daemon liveness poll: real socket timing untestable in vitest @preserve */
291
+ async function verifyDaemonAlive(checkSocketAlive, socketPath, maxWaitMs = 10_000, pollIntervalMs = 500) {
292
+ const deadline = Date.now() + maxWaitMs;
293
+ while (Date.now() < deadline) {
294
+ await new Promise((r) => setTimeout(r, pollIntervalMs));
295
+ if (await checkSocketAlive(socketPath))
296
+ return true;
297
+ }
298
+ return false;
299
+ }
300
+ /* v8 ignore stop */
278
301
  /**
279
302
  * Extract `--agent <name>` from an args array, returning the agent name and
280
303
  * the remaining args with the flag pair removed.
@@ -2,6 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureCurrentDaemonRuntime = ensureCurrentDaemonRuntime;
4
4
  const runtime_1 = require("../../nerves/runtime");
5
+ /* v8 ignore start -- daemon liveness poll: real socket timing untestable in vitest @preserve */
6
+ async function verifyDaemonStarted(deps) {
7
+ if (!deps.checkSocketAlive)
8
+ return true;
9
+ const maxWaitMs = 10_000;
10
+ const pollIntervalMs = 500;
11
+ const deadline = Date.now() + maxWaitMs;
12
+ while (Date.now() < deadline) {
13
+ await new Promise((r) => setTimeout(r, pollIntervalMs));
14
+ if (await deps.checkSocketAlive(deps.socketPath))
15
+ return true;
16
+ }
17
+ return false;
18
+ }
19
+ /* v8 ignore stop */
5
20
  function isKnownVersion(version) {
6
21
  return version !== "unknown" && version.trim().length > 0;
7
22
  }
@@ -116,11 +131,15 @@ async function ensureCurrentDaemonRuntime(deps) {
116
131
  }
117
132
  deps.cleanupStaleSocket(deps.socketPath);
118
133
  const started = await deps.startDaemonProcess(deps.socketPath);
134
+ const pid = started.pid ?? "unknown";
135
+ const verified = await verifyDaemonStarted(deps);
136
+ /* v8 ignore next -- daemon liveness failure: requires real daemon crash timing @preserve */
137
+ const suffix = verified ? "" : " — but daemon failed to respond, check logs";
119
138
  result = {
120
139
  alreadyRunning: false,
121
140
  message: includesVersionDrift
122
- ? `restarted stale daemon from ${runningVersion} to ${deps.localVersion} (pid ${started.pid ?? "unknown"})`
123
- : `restarted drifted daemon (${driftSummary}) (pid ${started.pid ?? "unknown"})`,
141
+ ? `restarted stale daemon from ${runningVersion} to ${deps.localVersion} (pid ${pid})${suffix}`
142
+ : `restarted drifted daemon (${driftSummary}) (pid ${pid})${suffix}`,
124
143
  };
125
144
  (0, runtime_1.emitNervesEvent)({
126
145
  component: "daemon",
@@ -555,8 +555,8 @@ async function handleInboundTurn(input) {
555
555
  if (typeof model === "string" && model)
556
556
  providerModels[p] = model;
557
557
  }
558
- /* v8 ignore next -- defensive: current provider always in secrets @preserve */
559
- const currentModel = providerModels[currentProvider] ?? "";
558
+ // Use agent.json model (source of truth), not secrets model (may be stale)
559
+ const currentModel = agentConfig.humanFacing.model;
560
560
  const failoverContext = (0, provider_failover_1.buildFailoverContext)(
561
561
  /* v8 ignore next -- defensive: error always set when errored @preserve */
562
562
  result.error?.message ?? "unknown error", classification, currentProvider, currentModel, agentName, inventory, providerModels);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.194",
3
+ "version": "0.1.0-alpha.196",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",