@agentikos/omega-os 0.19.48 → 0.19.50

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.
@@ -444,6 +444,32 @@ step_engine() {
444
444
  mkdir -p "$OMEGA_HOME/Agentik_Tools/bin"
445
445
  ln -sf "$OMEGA_HOME/Agentik_Engine/.venv/bin/omega" "$OMEGA_HOME/Agentik_Tools/bin/omega"
446
446
  ok "engine installed — omega CLI at Agentik_Tools/bin/omega"
447
+
448
+ # v0.19.49 — also drop a GLOBAL symlink so `omega` works in any shell
449
+ # without depending on the PATH wire to ~/.zshrc / ~/.bashrc. Try
450
+ # /usr/local/bin first (preferred, default macOS PATH), then ~/.local/bin
451
+ # (no sudo needed), then ~/bin. Skip if none writable — the PATH wire
452
+ # still provides the command, just requires a shell reload.
453
+ local global_target=""
454
+ if [ -d /usr/local/bin ] && [ -w /usr/local/bin ]; then
455
+ global_target=/usr/local/bin/omega
456
+ elif sudo -n true 2>/dev/null && [ -d /usr/local/bin ]; then
457
+ # Have passwordless sudo — install globally for the whole machine.
458
+ sudo ln -sf "$OMEGA_HOME/Agentik_Tools/bin/omega" /usr/local/bin/omega \
459
+ && global_target=/usr/local/bin/omega
460
+ elif [ -d "$HOME/.local/bin" ] || mkdir -p "$HOME/.local/bin"; then
461
+ global_target="$HOME/.local/bin/omega"
462
+ fi
463
+ if [ -n "$global_target" ]; then
464
+ # /usr/local/bin path may need sudo if not writable by user — we
465
+ # already checked write access above, so this is safe.
466
+ if [ -w "$(dirname "$global_target")" ]; then
467
+ ln -sf "$OMEGA_HOME/Agentik_Tools/bin/omega" "$global_target"
468
+ ok "global symlink: $global_target → $OMEGA_HOME/Agentik_Tools/bin/omega"
469
+ fi
470
+ else
471
+ info "could not install a global symlink (none of /usr/local/bin, ~/.local/bin writable) — use PATH wire from .zshrc"
472
+ fi
447
473
  # The engine is now importable — initialise the vault while we're here.
448
474
  python3 "$OMEGA_REPO/bootstrap/lib/manifest-helpers.py" init-vault "$OMEGA_HOME" \
449
475
  | sed 's/^/ /' || true
@@ -188,7 +188,7 @@ from omega_engine.genesis import (
188
188
  )
189
189
  from omega_engine import plan as plan_v7
190
190
 
191
- __version__ = "0.19.48"
191
+ __version__ = "0.19.50"
192
192
 
193
193
  __all__ = [
194
194
  "__version__",
@@ -528,11 +528,17 @@ def _arrow_menu() -> int:
528
528
  3. MENU — sub-menus (audits, setup, infra, health)
529
529
  4. EXIT
530
530
  """
531
+ # v0.19.50 — DO NOT call tmux during menu render. Tmux probes
532
+ # were hanging on macOS during server initialization (cold-start
533
+ # tmux client → server fork → config load → potentially slow on
534
+ # APFS). The user pressed Ctrl-C every time. Render the menu
535
+ # IMMEDIATELY with no status dots, then actions can probe tmux
536
+ # if needed (after the user picks one).
531
537
  provider = _active_provider()
532
- aisb_alive = tmux.omega_window_alive("aisb")
533
- hermes_alive = tmux.omega_window_alive("hermes")
534
- oracles, workers = _active_oracles_and_workers()
535
- paperclip_alive, paperclip_hint = _paperclip_status_quick()
538
+ aisb_alive = False # rendered as ○ until user opens; cheap
539
+ hermes_alive = False
540
+ oracles, workers = [], []
541
+ paperclip_alive, paperclip_hint = False, ""
536
542
 
537
543
  items: list[tuple[str, str]] = []
538
544
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "omega-engine"
3
- version = "0.19.48"
3
+ version = "0.19.50"
4
4
  description = "The Omega OS orchestration engine — event-sourced, verified-completion agent graphs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -245,28 +245,49 @@ class TestChatFirstRedesign(unittest.TestCase):
245
245
  "switch-client" in src or "select-window" in src,
246
246
  "attach handler must use tmux select-window / switch-client")
247
247
 
248
- def test_omega_window_alive_helper_used(self):
249
- """The TUI status dots for AISB / Hermès rely on the
250
- tmux.omega_window_alive() helper added in v0.19.39 — without it
251
- we have no way to know if those windows are running."""
248
+ def test_menu_does_not_call_tmux_during_render(self):
249
+ """v0.19.50 RENAMED from test_omega_window_alive_helper_used.
250
+
251
+ Previously the menu called tmux.omega_window_alive() on every
252
+ render to set the ●/○ status dots. On macOS this hung for many
253
+ seconds during cold-start tmux server initialization, and the
254
+ user Ctrl-C'd every time. v0.19.50 removes those probes — the
255
+ menu MUST render instantly with no tmux calls."""
252
256
  import inspect
253
257
  from omega_engine.tui import _arrow_menu
254
258
  src = inspect.getsource(_arrow_menu)
255
- self.assertIn("omega_window_alive", src,
256
- "menu must call tmux.omega_window_alive() to render the "
259
+ # Look at the _build_items function specifically — that's the
260
+ # hot path called on every render.
261
+ m_start = src.find("def _build_items")
262
+ self.assertGreater(m_start, 0, "_build_items function must exist")
263
+ m_end = src.find("def ", m_start + 10) # next def OR end
264
+ body = src[m_start:m_end if m_end > 0 else len(src)]
265
+ # CRITICAL: no synchronous tmux calls in the render hot path.
266
+ for forbidden in ("tmux.omega_window_alive",
267
+ "tmux.list_sessions",
268
+ "_active_oracles_and_workers()"):
269
+ self.assertNotIn(forbidden, body,
270
+ f"_build_items MUST NOT call {forbidden} — it hangs the "
271
+ f"menu on cold-start tmux. v0.19.50 removed it for "
272
+ "instant render.")
273
+ # Belt-and-suspenders: the existing helper still exists in the
274
+ # tmux module (some other code path may call it), just not
275
+ # during menu render.
276
+ from omega_engine.tmux import omega_window_alive
277
+ self.assertTrue(callable(omega_window_alive),
278
+ "tmux.omega_window_alive must remain callable (used "
257
279
  "AISB / Hermès status dots")
258
280
 
259
- def test_paperclip_status_dot_inline_in_main_menu(self):
260
- """The Paperclip dashboard row in QUICK ACTIONS must show a
261
- live status dot the user must see at-a-glance whether the
262
- Paperclip daemon is running."""
281
+ def test_paperclip_dashboard_entry_in_main_menu(self):
282
+ """v0.19.50 paperclip dashboard entry must exist in the menu.
283
+ The status dot has been removed (it was a sync probe that could
284
+ hang) replaced with a fixed ○ that becomes ● only after the
285
+ user picks the action and we know paperclip is up."""
263
286
  import inspect
264
287
  from omega_engine.tui import _arrow_menu
265
288
  src = inspect.getsource(_arrow_menu)
266
- self.assertIn("_paperclip_status_quick", src,
267
- "menu must use the inline Paperclip probe to render its dot")
268
- # Must integrate the new chantier-4 is_running() probe.
269
- self.assertIn("paperclip_bridge", src)
289
+ self.assertIn("paperclip:dashboard", src,
290
+ "menu must wire paperclip:dashboard as an action key")
270
291
 
271
292
 
272
293
  class TestPixelPalette(unittest.TestCase):
@@ -1 +1 @@
1
- 0.19.48
1
+ 0.19.50
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentikos/omega-os",
3
- "version": "0.19.48",
3
+ "version": "0.19.50",
4
4
  "description": "Omega OS — installable agentic operating system with verified-completion orchestration. Event-sourced engine, 8-block rack, autonomous agents, MCP.",
5
5
  "bin": {
6
6
  "omega-os": "bin/omega-os.js"