omnius 1.0.617 → 1.0.618

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
@@ -679198,6 +679198,8 @@ __export(daemon_exports, {
679198
679198
  getDaemonStatus: () => getDaemonStatus,
679199
679199
  getLocalCliVersion: () => getLocalCliVersion,
679200
679200
  isDaemonRunning: () => isDaemonRunning,
679201
+ managedDaemonServiceOwnsPort: () => managedDaemonServiceOwnsPort,
679202
+ pidIsInManagedDaemonUnit: () => pidIsInManagedDaemonUnit,
679201
679203
  quiesceDaemonForUpdate: () => quiesceDaemonForUpdate,
679202
679204
  reclaimOwnedDaemonListener: () => reclaimOwnedDaemonListener,
679203
679205
  recoverDaemonVersionBoundedly: () => recoverDaemonVersionBoundedly,
@@ -679442,6 +679444,27 @@ async function managedDaemonServiceMatchesPort(port) {
679442
679444
  if (environment === null) return false;
679443
679445
  return daemonServiceMatchesPort(port, environment);
679444
679446
  }
679447
+ function pidIsInManagedDaemonUnit(pid, readCgroup = defaultReadProcCgroup) {
679448
+ const cgroup = readCgroup(pid);
679449
+ return cgroup === null ? false : cgroup.includes("omnius-daemon.service");
679450
+ }
679451
+ function defaultReadProcCgroup(pid) {
679452
+ try {
679453
+ return readFileSync95(`/proc/${pid}/cgroup`, "utf8");
679454
+ } catch {
679455
+ return null;
679456
+ }
679457
+ }
679458
+ async function managedDaemonServiceOwnsPort(port, dependencies = {
679459
+ holderPids: (value2) => portHolderPids(value2),
679460
+ pidInUnit: (pid) => pidIsInManagedDaemonUnit(pid)
679461
+ }) {
679462
+ const holders = await dependencies.holderPids(port);
679463
+ if (holders === null) return false;
679464
+ const uniqueHolders = [...new Set(holders.filter((pid) => pid > 0 && pid !== process.pid))];
679465
+ if (uniqueHolders.length === 0) return true;
679466
+ return uniqueHolders.every((pid) => dependencies.pidInUnit(pid));
679467
+ }
679445
679468
  async function managedDaemonServicePort() {
679446
679469
  if (!await hasManagedDaemonService()) return null;
679447
679470
  const environment = await readUserSystemctl([
@@ -679718,6 +679741,11 @@ async function restartDaemon(port, expectedVersion) {
679718
679741
  const p2 = port ?? getDaemonPort();
679719
679742
  const managed = await managedDaemonServiceMatchesPort(p2);
679720
679743
  if (managed) {
679744
+ if (!await managedDaemonServiceOwnsPort(p2)) {
679745
+ const reclaimed = await reclaimOwnedDaemonListener(p2);
679746
+ if (!reclaimed.ok) return false;
679747
+ await reclaimStaleDaemonEndpointClaim(p2);
679748
+ }
679721
679749
  const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
679722
679750
  if (restarted.ok && (await waitForDaemonReady(p2, expectedVersion)).ok) return true;
679723
679751
  const repaired = await repairManagedDaemonUnit(p2);
@@ -679903,7 +679931,7 @@ async function stopDaemonAtPort(port = getDaemonPort()) {
679903
679931
  async function quiesceDaemonForUpdate(port = getDaemonPort()) {
679904
679932
  if (await managedDaemonServiceMatchesPort(port)) {
679905
679933
  const stopped = await runUserSystemctl(["stop", "omnius-daemon.service"]);
679906
- return stopped.ok && await waitForDaemonStopped(port);
679934
+ if (stopped.ok && await waitForDaemonStopped(port)) return true;
679907
679935
  }
679908
679936
  if (!await isDaemonRunning(port)) {
679909
679937
  return daemonPortIsFree(port);
@@ -680023,6 +680051,13 @@ async function ensureDaemonVersion(expectedVersion = getLocalCliVersion(), port
680023
680051
  return finish(false, "failed", null, 0, process.platform === "linux");
680024
680052
  }
680025
680053
  getDaemonPid();
680054
+ if (await managedDaemonServiceMatchesPort(port)) {
680055
+ const started = await runUserSystemctl(["start", "omnius-daemon.service"]);
680056
+ if (started.ok) {
680057
+ const ready2 = await waitForDaemonReady(port, expectedVersion);
680058
+ if (ready2.ok) return finish(true, "started", ready2.observedVersion);
680059
+ }
680060
+ }
680026
680061
  const pid = await startDaemon(port);
680027
680062
  if (!pid) {
680028
680063
  for (let i2 = 0; i2 < 20; i2++) {
@@ -751174,17 +751209,12 @@ async function handleUpdate(subcommand, ctx3) {
751174
751209
  daemonUpgrade = await ensureDaemonVersion2(expectedDaemonVersion);
751175
751210
  }
751176
751211
  }
751177
- if (!daemonUpgrade.ok) {
751178
- installOverlay.stop("Update installed, but daemon upgrade was not verified");
751179
- await new Promise((r2) => setTimeout(r2, 1200));
751180
- installOverlay.dismiss();
751181
- renderError(
751182
- `Updated CLI to ${expectedDaemonVersion}, but the shared daemon still reports ${daemonUpgrade.observedVersion ?? "unavailable"} after ${daemonUpgrade.recoveryAttempts} verified recovery round(s). A privileged owner was ${daemonUpgrade.requiresPrivilegedMigration ? "not safely migratable" : "not detected"}; no arbitrary port holder was terminated.`
751183
- );
751184
- return;
751212
+ const daemonUpgradeFailure = daemonUpgrade.ok ? null : `The shared daemon still reports ${daemonUpgrade.observedVersion ?? "unavailable"} after ${daemonUpgrade.recoveryAttempts} verified recovery round(s). A privileged owner was ${daemonUpgrade.requiresPrivilegedMigration ? "not safely migratable" : "not detected"}; no arbitrary port holder was terminated. Restarting this session on ${expectedDaemonVersion} anyway — run /daemon restart to retry the daemon.`;
751213
+ if (daemonUpgradeFailure) {
751214
+ renderWarning(daemonUpgradeFailure);
751185
751215
  }
751186
751216
  installOverlay.setStatus(
751187
- daemonUpgrade.action === "restarted" ? `Daemon upgraded to ${expectedDaemonVersion}` : `Daemon verified at ${expectedDaemonVersion}`
751217
+ !daemonUpgrade.ok ? `Daemon still at ${daemonUpgrade.observedVersion ?? "unknown"} — restarting client anyway` : daemonUpgrade.action === "restarted" ? `Daemon upgraded to ${expectedDaemonVersion}` : `Daemon verified at ${expectedDaemonVersion}`
751188
751218
  );
751189
751219
  ctx3.contextSave?.();
751190
751220
  const hadActiveTask = ctx3.savePendingTaskState?.() ?? false;
@@ -828090,6 +828120,14 @@ This is an independent background session started from /background.`
828090
828120
  }, 1500);
828091
828121
  return;
828092
828122
  }
828123
+ setTimeout(() => {
828124
+ if (statusBar.isActive)
828125
+ writeContent(
828126
+ () => renderWarning(
828127
+ `Shared daemon on port ${apiPort} reports ${daemon.observedVersion ?? "unavailable"}, expected ${daemon.expectedVersion}. Run /daemon restart to retry it.`
828128
+ )
828129
+ );
828130
+ }, 1500);
828093
828131
  const { startApiServer: startApiServer2 } = await Promise.resolve().then(() => (init_serve(), serve_exports));
828094
828132
  const apiServer = startApiServer2({
828095
828133
  port: apiPort,
@@ -293764,6 +293764,27 @@ async function managedDaemonServiceMatchesPort(port) {
293764
293764
  if (environment === null) return false;
293765
293765
  return daemonServiceMatchesPort(port, environment);
293766
293766
  }
293767
+ function pidIsInManagedDaemonUnit(pid, readCgroup = defaultReadProcCgroup) {
293768
+ const cgroup = readCgroup(pid);
293769
+ return cgroup === null ? false : cgroup.includes("omnius-daemon.service");
293770
+ }
293771
+ function defaultReadProcCgroup(pid) {
293772
+ try {
293773
+ return readFileSync4(`/proc/${pid}/cgroup`, "utf8");
293774
+ } catch {
293775
+ return null;
293776
+ }
293777
+ }
293778
+ async function managedDaemonServiceOwnsPort(port, dependencies = {
293779
+ holderPids: (value) => portHolderPids(value),
293780
+ pidInUnit: (pid) => pidIsInManagedDaemonUnit(pid)
293781
+ }) {
293782
+ const holders = await dependencies.holderPids(port);
293783
+ if (holders === null) return false;
293784
+ const uniqueHolders = [...new Set(holders.filter((pid) => pid > 0 && pid !== process.pid))];
293785
+ if (uniqueHolders.length === 0) return true;
293786
+ return uniqueHolders.every((pid) => dependencies.pidInUnit(pid));
293787
+ }
293767
293788
  function systemdQuote(value) {
293768
293789
  return /[\s"\\]/.test(value) ? `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value;
293769
293790
  }
@@ -293985,6 +294006,11 @@ async function restartDaemon(port, expectedVersion) {
293985
294006
  const p = port ?? getDaemonPort();
293986
294007
  const managed = await managedDaemonServiceMatchesPort(p);
293987
294008
  if (managed) {
294009
+ if (!await managedDaemonServiceOwnsPort(p)) {
294010
+ const reclaimed = await reclaimOwnedDaemonListener(p);
294011
+ if (!reclaimed.ok) return false;
294012
+ await reclaimStaleDaemonEndpointClaim(p);
294013
+ }
293988
294014
  const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
293989
294015
  if (restarted.ok && (await waitForDaemonReady(p, expectedVersion)).ok) return true;
293990
294016
  const repaired = await repairManagedDaemonUnit(p);
@@ -294130,7 +294156,7 @@ async function stopDaemonAtPort(port = getDaemonPort()) {
294130
294156
  async function quiesceDaemonForUpdate(port = getDaemonPort()) {
294131
294157
  if (await managedDaemonServiceMatchesPort(port)) {
294132
294158
  const stopped = await runUserSystemctl(["stop", "omnius-daemon.service"]);
294133
- return stopped.ok && await waitForDaemonStopped(port);
294159
+ if (stopped.ok && await waitForDaemonStopped(port)) return true;
294134
294160
  }
294135
294161
  if (!await isDaemonRunning(port)) {
294136
294162
  return daemonPortIsFree(port);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.617",
3
+ "version": "1.0.618",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.617",
9
+ "version": "1.0.618",
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.617",
3
+ "version": "1.0.618",
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",