@ouro.bot/cli 0.1.0-alpha.20 → 0.1.0-alpha.21

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.
@@ -55,6 +55,7 @@ const specialist_orchestrator_1 = require("./specialist-orchestrator");
55
55
  const specialist_prompt_1 = require("./specialist-prompt");
56
56
  const specialist_tools_1 = require("./specialist-tools");
57
57
  const runtime_metadata_1 = require("./runtime-metadata");
58
+ const daemon_runtime_sync_1 = require("./daemon-runtime-sync");
58
59
  function stringField(value) {
59
60
  return typeof value === "string" ? value : null;
60
61
  }
@@ -195,10 +196,21 @@ function formatDaemonStatusOutput(response, fallback) {
195
196
  async function ensureDaemonRunning(deps) {
196
197
  const alive = await deps.checkSocketAlive(deps.socketPath);
197
198
  if (alive) {
198
- return {
199
- alreadyRunning: true,
200
- message: `daemon already running (${deps.socketPath})`,
201
- };
199
+ const localRuntime = (0, runtime_metadata_1.getRuntimeMetadata)();
200
+ return (0, daemon_runtime_sync_1.ensureCurrentDaemonRuntime)({
201
+ socketPath: deps.socketPath,
202
+ localVersion: localRuntime.version,
203
+ fetchRunningVersion: async () => {
204
+ const status = await deps.sendCommand(deps.socketPath, { kind: "daemon.status" });
205
+ const payload = parseStatusPayload(status.data);
206
+ return payload?.overview.version ?? "unknown";
207
+ },
208
+ stopDaemon: async () => {
209
+ await deps.sendCommand(deps.socketPath, { kind: "daemon.stop" });
210
+ },
211
+ cleanupStaleSocket: deps.cleanupStaleSocket,
212
+ startDaemonProcess: deps.startDaemonProcess,
213
+ });
202
214
  }
203
215
  deps.cleanupStaleSocket(deps.socketPath);
204
216
  const started = await deps.startDaemonProcess(deps.socketPath);
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureCurrentDaemonRuntime = ensureCurrentDaemonRuntime;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ function isKnownVersion(version) {
6
+ return version !== "unknown" && version.trim().length > 0;
7
+ }
8
+ function formatErrorReason(error) {
9
+ return error instanceof Error ? error.message : String(error);
10
+ }
11
+ async function ensureCurrentDaemonRuntime(deps) {
12
+ try {
13
+ const runningVersion = await deps.fetchRunningVersion();
14
+ let result;
15
+ if (isKnownVersion(deps.localVersion) &&
16
+ isKnownVersion(runningVersion) &&
17
+ runningVersion !== deps.localVersion) {
18
+ try {
19
+ await deps.stopDaemon();
20
+ }
21
+ catch (error) {
22
+ const reason = formatErrorReason(error);
23
+ result = {
24
+ alreadyRunning: true,
25
+ message: `daemon already running (${deps.socketPath}; could not replace stale daemon ${runningVersion} -> ${deps.localVersion}: ${reason})`,
26
+ };
27
+ (0, runtime_1.emitNervesEvent)({
28
+ level: "warn",
29
+ component: "daemon",
30
+ event: "daemon.runtime_sync_decision",
31
+ message: "evaluated daemon runtime sync outcome",
32
+ meta: { socketPath: deps.socketPath, localVersion: deps.localVersion, runningVersion, action: "stale_replace_failed", reason },
33
+ });
34
+ return result;
35
+ }
36
+ deps.cleanupStaleSocket(deps.socketPath);
37
+ const started = await deps.startDaemonProcess(deps.socketPath);
38
+ result = {
39
+ alreadyRunning: false,
40
+ message: `restarted stale daemon from ${runningVersion} to ${deps.localVersion} (pid ${started.pid ?? "unknown"})`,
41
+ };
42
+ (0, runtime_1.emitNervesEvent)({
43
+ component: "daemon",
44
+ event: "daemon.runtime_sync_decision",
45
+ message: "evaluated daemon runtime sync outcome",
46
+ meta: { socketPath: deps.socketPath, localVersion: deps.localVersion, runningVersion, action: "stale_restarted", pid: started.pid ?? null },
47
+ });
48
+ return result;
49
+ }
50
+ if (!isKnownVersion(deps.localVersion) || !isKnownVersion(runningVersion)) {
51
+ result = {
52
+ alreadyRunning: true,
53
+ message: `daemon already running (${deps.socketPath}; unable to verify version)`,
54
+ };
55
+ (0, runtime_1.emitNervesEvent)({
56
+ component: "daemon",
57
+ event: "daemon.runtime_sync_decision",
58
+ message: "evaluated daemon runtime sync outcome",
59
+ meta: { socketPath: deps.socketPath, localVersion: deps.localVersion, runningVersion, action: "unknown_version" },
60
+ });
61
+ return result;
62
+ }
63
+ }
64
+ catch (error) {
65
+ const reason = formatErrorReason(error);
66
+ const result = {
67
+ alreadyRunning: true,
68
+ message: `daemon already running (${deps.socketPath}; unable to verify version: ${reason})`,
69
+ };
70
+ (0, runtime_1.emitNervesEvent)({
71
+ level: "warn",
72
+ component: "daemon",
73
+ event: "daemon.runtime_sync_decision",
74
+ message: "evaluated daemon runtime sync outcome",
75
+ meta: { socketPath: deps.socketPath, localVersion: deps.localVersion, action: "status_lookup_failed", reason },
76
+ });
77
+ return result;
78
+ }
79
+ const result = {
80
+ alreadyRunning: true,
81
+ message: `daemon already running (${deps.socketPath})`,
82
+ };
83
+ (0, runtime_1.emitNervesEvent)({
84
+ component: "daemon",
85
+ event: "daemon.runtime_sync_decision",
86
+ message: "evaluated daemon runtime sync outcome",
87
+ meta: { socketPath: deps.socketPath, localVersion: deps.localVersion, action: "already_current" },
88
+ });
89
+ return result;
90
+ }
@@ -38,8 +38,9 @@ const fs = __importStar(require("fs"));
38
38
  const os = __importStar(require("os"));
39
39
  const path = __importStar(require("path"));
40
40
  const runtime_1 = require("../../nerves/runtime");
41
+ const CLI_PACKAGE_SPECIFIER = "@ouro.bot/cli@alpha";
41
42
  const WRAPPER_SCRIPT = `#!/bin/sh
42
- exec npx --yes ouro.bot "$@"
43
+ exec npx --yes ${CLI_PACKAGE_SPECIFIER} "$@"
43
44
  `;
44
45
  function detectShellProfile(homeDir, shell) {
45
46
  if (!shell)
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assessWrapperPublishSync = assessWrapperPublishSync;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ function wrapperPackageChanged(changedFiles) {
6
+ return changedFiles.some((file) => file.startsWith("packages/ouro.bot/"));
7
+ }
8
+ function assessWrapperPublishSync(input) {
9
+ let result;
10
+ if (!wrapperPackageChanged(input.changedFiles)) {
11
+ result = {
12
+ ok: true,
13
+ message: "wrapper package unchanged",
14
+ };
15
+ (0, runtime_1.emitNervesEvent)({
16
+ component: "daemon",
17
+ event: "daemon.wrapper_publish_guard_checked",
18
+ message: "evaluated wrapper publish sync",
19
+ meta: { changed: false, localVersion: input.localVersion, publishedVersion: input.publishedVersion, ok: result.ok },
20
+ });
21
+ return result;
22
+ }
23
+ if (input.publishedVersion === input.localVersion) {
24
+ result = {
25
+ ok: false,
26
+ message: `ouro.bot wrapper changed but ouro.bot@${input.localVersion} is already published; bump packages/ouro.bot/package.json before merging`,
27
+ };
28
+ (0, runtime_1.emitNervesEvent)({
29
+ level: "warn",
30
+ component: "daemon",
31
+ event: "daemon.wrapper_publish_guard_checked",
32
+ message: "evaluated wrapper publish sync",
33
+ meta: { changed: true, localVersion: input.localVersion, publishedVersion: input.publishedVersion, ok: result.ok },
34
+ });
35
+ return result;
36
+ }
37
+ result = {
38
+ ok: true,
39
+ message: "wrapper package changed and local wrapper version is unpublished",
40
+ };
41
+ (0, runtime_1.emitNervesEvent)({
42
+ component: "daemon",
43
+ event: "daemon.wrapper_publish_guard_checked",
44
+ message: "evaluated wrapper publish sync",
45
+ meta: { changed: true, localVersion: input.localVersion, publishedVersion: input.publishedVersion, ok: result.ok },
46
+ });
47
+ return result;
48
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.20",
3
+ "version": "0.1.0-alpha.21",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",