omnius 1.0.621 → 1.0.622

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/dist/index.js CHANGED
@@ -734,24 +734,31 @@ async function runVerifiedUpdateTransaction(initial, dependencies, paths = resol
734
734
  executable_version: evidence.executableVersion
735
735
  }, paths);
736
736
  state2 = transition(state2, { phase: "daemon_restarting" }, paths);
737
- if (!await dependencies.restartDaemon(target)) {
738
- throw new Error(
739
- `The daemon restart at ${state2.daemon_endpoint ?? "the configured endpoint"} did not produce Omnius v${target}`
740
- );
737
+ let daemon = null;
738
+ let restartAcknowledged = false;
739
+ for (let attempt = 1; attempt <= 3; attempt++) {
740
+ restartAcknowledged = await dependencies.restartDaemon(target, evidence.executablePath) || restartAcknowledged;
741
+ daemon = await dependencies.observeDaemon();
742
+ if (daemon?.bootVersion === target && daemon.bootPackageHash === evidence.packageHash) {
743
+ break;
744
+ }
745
+ if (attempt < 3) await new Promise((resolve88) => setTimeout(resolve88, 1e3));
741
746
  }
742
- daemonQuiesced = false;
743
- const daemon = await dependencies.observeDaemon();
744
747
  if (!daemon || daemon.bootVersion !== target) {
745
- throw new Error(`Daemon verification failed: expected ${target}, observed ${daemon?.bootVersion ?? "unreachable"}`);
748
+ const observed = daemon?.bootVersion ?? "unreachable";
749
+ throw new Error(
750
+ restartAcknowledged ? `Daemon verification failed after 3 recovery attempts: expected ${target}, observed ${observed}` : `The daemon at ${state2.daemon_endpoint ?? "the configured endpoint"} could not be restarted from the verified Omnius v${target} executable after 3 attempts`
751
+ );
746
752
  }
747
753
  if (!daemon.bootPackageHash) {
748
- throw new Error("Daemon package verification failed: the restarted runtime did not report a boot package hash");
754
+ throw new Error("Daemon package verification failed after 3 recovery attempts: the restarted runtime did not report a boot package hash");
749
755
  }
750
756
  if (daemon.bootPackageHash !== evidence.packageHash) {
751
757
  throw new Error(
752
- `Daemon package verification failed: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
758
+ `Daemon package verification failed after 3 recovery attempts: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
753
759
  );
754
760
  }
761
+ daemonQuiesced = false;
755
762
  state2 = transition(state2, {
756
763
  phase: "runtime_verified",
757
764
  daemon_version: daemon.bootVersion,
@@ -832,6 +839,23 @@ function launchWorkerInTransientUserService(input) {
832
839
  });
833
840
  return launched.status === 0;
834
841
  }
842
+ function waitForUpdateWorkerAdoption(operationId, paths, timeoutMs = 1e4) {
843
+ const deadline = Date.now() + timeoutMs;
844
+ const sleeper = new Int32Array(new SharedArrayBuffer(4));
845
+ while (Date.now() < deadline) {
846
+ const observed = readUpdateState(paths);
847
+ if (observed?.operation_id === operationId) {
848
+ if (observed.status === "failed") {
849
+ throw new Error(observed.error || "The detached update worker failed before package installation");
850
+ }
851
+ if (observed.status === "completed" || isPidAlive(observed.pid) && observed.pid !== process.pid) {
852
+ return observed;
853
+ }
854
+ }
855
+ Atomics.wait(sleeper, 0, 0, 100);
856
+ }
857
+ throw new Error("The detached update worker did not adopt the transaction within 10 seconds; the package was not modified");
858
+ }
835
859
  function startDetachedGlobalUpdate(input, paths = resolveUpdatePaths()) {
836
860
  const targetVersion = assertExactUpdateTarget(input.targetVersion, input.fromVersion);
837
861
  const operationId = randomUUID();
@@ -904,6 +928,7 @@ function startDetachedGlobalUpdate(input, paths = resolveUpdatePaths()) {
904
928
  if (!child.pid) throw new Error("Detached update worker did not return a PID");
905
929
  child.unref();
906
930
  }
931
+ state2 = waitForUpdateWorkerAdoption(operationId, paths);
907
932
  return { state: state2, pollUrl: "/v1/update" };
908
933
  } catch (error) {
909
934
  state2 = {
@@ -679524,9 +679549,9 @@ async function resolveActiveDaemonRuntime(preferredEndpoint, dependencies = DEFA
679524
679549
  function systemdQuote(value2) {
679525
679550
  return /[\s"\\]/.test(value2) ? `"${value2.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value2;
679526
679551
  }
679527
- async function repairManagedDaemonUnit(port) {
679552
+ async function repairManagedDaemonUnit(port, preferredEntrypoint) {
679528
679553
  if (process.platform !== "linux") return false;
679529
- const command = await resolveDaemonCommand(process.execPath);
679554
+ const command = await resolveDaemonCommand(process.execPath, preferredEntrypoint);
679530
679555
  if (!command) return false;
679531
679556
  try {
679532
679557
  const configHome2 = process.env["XDG_CONFIG_HOME"] || join130(homedir39(), ".config");
@@ -679728,7 +679753,7 @@ async function reclaimOwnedDaemonListener(port = getDaemonPort(), dependencies =
679728
679753
  }
679729
679754
  return { ok: true, action: "cleared", port, clearedPids, blockedPids: [] };
679730
679755
  }
679731
- async function restartDaemon(port, expectedVersion) {
679756
+ async function restartDaemon(port, expectedVersion, preferredEntrypoint) {
679732
679757
  const p2 = port ?? getDaemonPort();
679733
679758
  const managed = await managedDaemonServiceMatchesPort(p2);
679734
679759
  if (managed) {
@@ -679737,12 +679762,14 @@ async function restartDaemon(port, expectedVersion) {
679737
679762
  if (!reclaimed.ok) return false;
679738
679763
  await reclaimStaleDaemonEndpointClaim(p2);
679739
679764
  }
679765
+ await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
679740
679766
  const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
679741
679767
  if (restarted.ok && (await waitForDaemonReady(p2, expectedVersion)).ok) return true;
679742
- const repaired = await repairManagedDaemonUnit(p2);
679768
+ const repaired = await repairManagedDaemonUnit(p2, preferredEntrypoint);
679743
679769
  if (repaired) {
679744
679770
  await runUserSystemctl(["stop", "omnius-daemon.service"]);
679745
679771
  await waitForDaemonStopped(p2);
679772
+ await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
679746
679773
  const started = await runUserSystemctl(["start", "omnius-daemon.service"]);
679747
679774
  if (started.ok && (await waitForDaemonReady(p2, expectedVersion)).ok) return true;
679748
679775
  }
@@ -679757,7 +679784,7 @@ async function restartDaemon(port, expectedVersion) {
679757
679784
  if (!reclaimed.ok) return false;
679758
679785
  }
679759
679786
  if (!await reclaimStaleDaemonEndpointClaim(p2)) return false;
679760
- const pid = await startDaemon(p2);
679787
+ const pid = await startDaemon(p2, preferredEntrypoint);
679761
679788
  if (!pid) return false;
679762
679789
  return (await waitForDaemonReady(p2, expectedVersion)).ok;
679763
679790
  }
@@ -679792,8 +679819,9 @@ function commandForEntrypoint(path16, nodeExe) {
679792
679819
  }
679793
679820
  return { command: path16, args };
679794
679821
  }
679795
- async function resolveDaemonCommand(nodeExe) {
679822
+ async function resolveDaemonCommand(nodeExe, preferredEntrypoint) {
679796
679823
  const candidates = [];
679824
+ if (preferredEntrypoint) candidates.push(preferredEntrypoint);
679797
679825
  const thisDir = dirname44(fileURLToPath18(import.meta.url));
679798
679826
  candidates.push(join130(thisDir, "index.js"));
679799
679827
  if (process.argv[1]) candidates.push(process.argv[1]);
@@ -679816,13 +679844,13 @@ async function resolveDaemonCommand(nodeExe) {
679816
679844
  }
679817
679845
  return null;
679818
679846
  }
679819
- async function startDaemon(port = getDaemonPort()) {
679847
+ async function startDaemon(port = getDaemonPort(), preferredEntrypoint) {
679820
679848
  mkdirSync70(OMNIUS_DIR, { recursive: true });
679821
679849
  const daemonPort = port;
679822
679850
  const endpointClaim = claimDaemonEndpoint(daemonPort);
679823
679851
  if (!endpointClaim) return null;
679824
679852
  const nodeExe = process.execPath;
679825
- const daemonCommand = await resolveDaemonCommand(nodeExe);
679853
+ const daemonCommand = await resolveDaemonCommand(nodeExe, preferredEntrypoint);
679826
679854
  if (!daemonCommand) {
679827
679855
  releaseDaemonEndpointClaim(endpointClaim);
679828
679856
  return null;
@@ -293776,9 +293776,9 @@ async function managedDaemonServiceOwnsPort(port, dependencies = {
293776
293776
  function systemdQuote(value) {
293777
293777
  return /[\s"\\]/.test(value) ? `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value;
293778
293778
  }
293779
- async function repairManagedDaemonUnit(port) {
293779
+ async function repairManagedDaemonUnit(port, preferredEntrypoint) {
293780
293780
  if (process.platform !== "linux") return false;
293781
- const command = await resolveDaemonCommand(process.execPath);
293781
+ const command = await resolveDaemonCommand(process.execPath, preferredEntrypoint);
293782
293782
  if (!command) return false;
293783
293783
  try {
293784
293784
  const configHome = process.env["XDG_CONFIG_HOME"] || join14(homedir14(), ".config");
@@ -293990,7 +293990,7 @@ async function reclaimOwnedDaemonListener(port = getDaemonPort(), dependencies =
293990
293990
  }
293991
293991
  return { ok: true, action: "cleared", port, clearedPids, blockedPids: [] };
293992
293992
  }
293993
- async function restartDaemon(port, expectedVersion) {
293993
+ async function restartDaemon(port, expectedVersion, preferredEntrypoint) {
293994
293994
  const p = port ?? getDaemonPort();
293995
293995
  const managed = await managedDaemonServiceMatchesPort(p);
293996
293996
  if (managed) {
@@ -293999,12 +293999,14 @@ async function restartDaemon(port, expectedVersion) {
293999
293999
  if (!reclaimed.ok) return false;
294000
294000
  await reclaimStaleDaemonEndpointClaim(p);
294001
294001
  }
294002
+ await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
294002
294003
  const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
294003
294004
  if (restarted.ok && (await waitForDaemonReady(p, expectedVersion)).ok) return true;
294004
- const repaired = await repairManagedDaemonUnit(p);
294005
+ const repaired = await repairManagedDaemonUnit(p, preferredEntrypoint);
294005
294006
  if (repaired) {
294006
294007
  await runUserSystemctl(["stop", "omnius-daemon.service"]);
294007
294008
  await waitForDaemonStopped(p);
294009
+ await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
294008
294010
  const started = await runUserSystemctl(["start", "omnius-daemon.service"]);
294009
294011
  if (started.ok && (await waitForDaemonReady(p, expectedVersion)).ok) return true;
294010
294012
  }
@@ -294019,7 +294021,7 @@ async function restartDaemon(port, expectedVersion) {
294019
294021
  if (!reclaimed.ok) return false;
294020
294022
  }
294021
294023
  if (!await reclaimStaleDaemonEndpointClaim(p)) return false;
294022
- const pid = await startDaemon(p);
294024
+ const pid = await startDaemon(p, preferredEntrypoint);
294023
294025
  if (!pid) return false;
294024
294026
  return (await waitForDaemonReady(p, expectedVersion)).ok;
294025
294027
  }
@@ -294039,8 +294041,9 @@ function commandForEntrypoint(path, nodeExe) {
294039
294041
  }
294040
294042
  return { command: path, args };
294041
294043
  }
294042
- async function resolveDaemonCommand(nodeExe) {
294044
+ async function resolveDaemonCommand(nodeExe, preferredEntrypoint) {
294043
294045
  const candidates = [];
294046
+ if (preferredEntrypoint) candidates.push(preferredEntrypoint);
294044
294047
  const thisDir = dirname8(fileURLToPath2(import.meta.url));
294045
294048
  candidates.push(join14(thisDir, "index.js"));
294046
294049
  if (process.argv[1]) candidates.push(process.argv[1]);
@@ -294063,13 +294066,13 @@ async function resolveDaemonCommand(nodeExe) {
294063
294066
  }
294064
294067
  return null;
294065
294068
  }
294066
- async function startDaemon(port = getDaemonPort()) {
294069
+ async function startDaemon(port = getDaemonPort(), preferredEntrypoint) {
294067
294070
  mkdirSync3(OMNIUS_DIR, { recursive: true });
294068
294071
  const daemonPort = port;
294069
294072
  const endpointClaim = claimDaemonEndpoint(daemonPort);
294070
294073
  if (!endpointClaim) return null;
294071
294074
  const nodeExe = process.execPath;
294072
- const daemonCommand = await resolveDaemonCommand(nodeExe);
294075
+ const daemonCommand = await resolveDaemonCommand(nodeExe, preferredEntrypoint);
294073
294076
  if (!daemonCommand) {
294074
294077
  releaseDaemonEndpointClaim(endpointClaim);
294075
294078
  return null;
@@ -294496,24 +294499,31 @@ async function runVerifiedUpdateTransaction(initial, dependencies, paths = resol
294496
294499
  executable_version: evidence.executableVersion
294497
294500
  }, paths);
294498
294501
  state = transition(state, { phase: "daemon_restarting" }, paths);
294499
- if (!await dependencies.restartDaemon(target)) {
294500
- throw new Error(
294501
- `The daemon restart at ${state.daemon_endpoint ?? "the configured endpoint"} did not produce Omnius v${target}`
294502
- );
294502
+ let daemon = null;
294503
+ let restartAcknowledged = false;
294504
+ for (let attempt = 1; attempt <= 3; attempt++) {
294505
+ restartAcknowledged = await dependencies.restartDaemon(target, evidence.executablePath) || restartAcknowledged;
294506
+ daemon = await dependencies.observeDaemon();
294507
+ if (daemon?.bootVersion === target && daemon.bootPackageHash === evidence.packageHash) {
294508
+ break;
294509
+ }
294510
+ if (attempt < 3) await new Promise((resolve12) => setTimeout(resolve12, 1e3));
294503
294511
  }
294504
- daemonQuiesced = false;
294505
- const daemon = await dependencies.observeDaemon();
294506
294512
  if (!daemon || daemon.bootVersion !== target) {
294507
- throw new Error(`Daemon verification failed: expected ${target}, observed ${daemon?.bootVersion ?? "unreachable"}`);
294513
+ const observed = daemon?.bootVersion ?? "unreachable";
294514
+ throw new Error(
294515
+ restartAcknowledged ? `Daemon verification failed after 3 recovery attempts: expected ${target}, observed ${observed}` : `The daemon at ${state.daemon_endpoint ?? "the configured endpoint"} could not be restarted from the verified Omnius v${target} executable after 3 attempts`
294516
+ );
294508
294517
  }
294509
294518
  if (!daemon.bootPackageHash) {
294510
- throw new Error("Daemon package verification failed: the restarted runtime did not report a boot package hash");
294519
+ throw new Error("Daemon package verification failed after 3 recovery attempts: the restarted runtime did not report a boot package hash");
294511
294520
  }
294512
294521
  if (daemon.bootPackageHash !== evidence.packageHash) {
294513
294522
  throw new Error(
294514
- `Daemon package verification failed: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
294523
+ `Daemon package verification failed after 3 recovery attempts: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
294515
294524
  );
294516
294525
  }
294526
+ daemonQuiesced = false;
294517
294527
  state = transition(state, {
294518
294528
  phase: "runtime_verified",
294519
294529
  daemon_version: daemon.bootVersion,
@@ -294865,8 +294875,8 @@ async function main() {
294865
294875
  state,
294866
294876
  {
294867
294877
  quiesceDaemon: () => quiesceDaemonForUpdate(port),
294868
- restartDaemon: (expected) => restartDaemon(port, expected),
294869
- recoverDaemon: () => restartDaemon(port),
294878
+ restartDaemon: (expected, executable) => restartDaemon(port, expected, executable),
294879
+ recoverDaemon: () => restartDaemon(port, target),
294870
294880
  observeDaemon: async () => {
294871
294881
  const identity = await getDaemonReportedIdentity(port);
294872
294882
  return identity ? { bootVersion: identity.bootVersion, bootPackageHash: identity.bootPackageHash } : null;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.621",
3
+ "version": "1.0.622",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.621",
9
+ "version": "1.0.622",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.621",
3
+ "version": "1.0.622",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/library.js",