@agentikos/omega-os 0.19.25 → 0.19.26

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.
@@ -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.25"
191
+ __version__ = "0.19.26"
192
192
 
193
193
  __all__ = [
194
194
  "__version__",
@@ -2856,15 +2856,16 @@ def cmd_menu(_args: argparse.Namespace) -> int:
2856
2856
 
2857
2857
 
2858
2858
  def cmd_menu_tui(_args: argparse.Namespace) -> int:
2859
- """`omega menu-tui` — the fzf action picker that runs INSIDE the
2860
- Omega master tmux session. Don't invoke this directly; use bare
2861
- `omega` which spawns the Omega session and lands you here.
2862
-
2863
- Loops until you pick Quit or hit Esc. Each action either:
2864
- - Spawns a new tmux window in the Omega session (AISB chat,
2865
- Hermes chat, scratch shell)
2866
- - Runs a sub-command inline (status, doctor, vault list)
2867
- - Opens a sub-menu (switch provider, manage account)
2859
+ """`omega menu-tui` — the fzf action picker for the Omega session.
2860
+
2861
+ v0.19.26 actions now run INLINE in the menu pane (not in dead
2862
+ background tmux windows). After every action, "press Enter to
2863
+ return to menu". Sessions (AISB/Hermes) still spawn as separate
2864
+ tmux sessions because they're meant to be talked to long-running.
2865
+
2866
+ Bug fix: previous version used fzf with leading-space labels,
2867
+ then `pick.strip()` killed the spaces, so display matching failed
2868
+ and every pick became a no-op. Both sides stripped now.
2868
2869
  """
2869
2870
  import os
2870
2871
  import shlex
@@ -2881,102 +2882,101 @@ def cmd_menu_tui(_args: argparse.Namespace) -> int:
2881
2882
  "(macOS) or `apt install fzf` (Linux)")
2882
2883
  return 2
2883
2884
 
2884
- # The menu actions. Each entry: (label, action_key).
2885
- # Actions are dispatched in the if/elif block below.
2886
2885
  def _build_menu() -> list[tuple[str, str]]:
2887
2886
  active = _active_provider()
2888
2887
  sessions = tmux.list_sessions(HOME)
2889
- items: list[tuple[str, str]] = [
2890
- ("CHAT", "__separator__"),
2891
- (f" AISB master chat (Claude Max OAuth)", "open:aisb"),
2892
- (f" Hermès meta-companion (Anthropic API)", "open:hermes"),
2893
- (f" Switch LLM provider ({active})", "switch:provider"),
2894
- ("PROJECTS", "__separator__"),
2895
- (f" New project (Genesis pipeline)", "genesis:new"),
2896
- (f" Open project shell", "project:open"),
2897
- ("AUDITS & MISSIONS", "__separator__"),
2898
- (f" Run a mission ({active})", "run:mission"),
2899
- (f" Quality Arsenal — pick an audit", "audit:menu"),
2900
- ("INFRASTRUCTURE", "__separator__"),
2901
- (f" Sessions ({len(sessions)} active) — pick to attach", "sessions:list"),
2902
- (f" Accounts — Claude Max + per-provider auth", "accounts:menu"),
2903
- (f" Vault — secrets", "vault:menu"),
2904
- ("HEALTH", "__separator__"),
2905
- (f" omega doctor", "cmd:doctor"),
2906
- (f" omega status", "cmd:status"),
2907
- ("SCRAPE & SEARCH", "__separator__"),
2908
- (f" Stealth scrape a URL (CloakBrowser)", "scrape:cloak"),
2909
- (f" Fast scrape a URL (Scrapling)", "scrape:scrapling"),
2910
- ("", "__separator__"),
2911
- (f" Detach (Ctrl-b d also works)", "detach"),
2912
- (f" Quit Omega session (kills the tmux session)", "quit:kill"),
2888
+ return [
2889
+ ("── CHAT ─────────────────────", "__sep__"),
2890
+ (f"AISB master chat (Claude Max OAuth)", "open:aisb"),
2891
+ (f"Hermès meta-companion (Anthropic API)", "open:hermes"),
2892
+ (f"Switch LLM provider [{active}]", "switch:provider"),
2893
+ ("── PROJECTS ─────────────────", "__sep__"),
2894
+ (f"New project (Genesis pipeline)", "genesis:new"),
2895
+ (f"Open project shell", "project:open"),
2896
+ ("── AUDITS & MISSIONS ────────", "__sep__"),
2897
+ (f"Run a mission", "run:mission"),
2898
+ (f"Quality Arsenal — list audits", "audit:menu"),
2899
+ ("── INFRASTRUCTURE ───────────", "__sep__"),
2900
+ (f"Sessions ({len(sessions)} active) — pick to attach", "sessions:list"),
2901
+ (f"Accounts — Claude Max + per-provider auth", "accounts:menu"),
2902
+ (f"Vault — secrets", "vault:menu"),
2903
+ ("── HEALTH ───────────────────", "__sep__"),
2904
+ (f"omega doctor", "cmd:doctor"),
2905
+ (f"omega status", "cmd:status"),
2906
+ ("── SCRAPE & SEARCH ──────────", "__sep__"),
2907
+ (f"Stealth scrape a URL (CloakBrowser)", "scrape:cloak"),
2908
+ (f"Fast scrape a URL (Scrapling)", "scrape:scrapling"),
2909
+ ("── EXIT ─────────────────────", "__sep__"),
2910
+ (f"Detach (Ctrl-b d also works)", "detach"),
2911
+ (f"Quit Omega session (kills the tmux session)", "quit:kill"),
2913
2912
  ]
2914
- return items
2915
-
2916
- def _send_in_window(window: str, command: str) -> None:
2917
- """Open (or focus) a window in the Omega session and run command."""
2918
- _, list_out = tmux._tmux("list-windows", "-t", "Omega", "-F", "#W")
2919
- windows = list_out.splitlines() if list_out else []
2920
- if window not in windows:
2921
- tmux._tmux("new-window", "-t", "Omega", "-n", window,
2922
- "-c", str(Path.home()))
2923
- tmux._tmux("send-keys", "-t", f"Omega:{window}", command, "Enter")
2913
+
2914
+ def _run_inline(cmd_argv: list[str] | str, *, shell: bool = False) -> None:
2915
+ """Run a command in the current pane, stream stdout/stderr,
2916
+ then prompt the user to return to the menu."""
2917
+ os.system("clear")
2918
+ print(f" Ω running: {cmd_argv if shell else ' '.join(cmd_argv)}")
2919
+ print(" " + "─" * 60)
2920
+ if shell:
2921
+ subprocess.run(cmd_argv, shell=True)
2924
2922
  else:
2925
- tmux._tmux("send-keys", "-t", f"Omega:{window}", command, "Enter")
2926
- tmux._tmux("select-window", "-t", f"Omega:{window}")
2923
+ subprocess.run(cmd_argv)
2924
+ print()
2925
+ print(" " + "─" * 60)
2926
+ try:
2927
+ input(" press Enter to return to Omega menu… ")
2928
+ except (EOFError, KeyboardInterrupt):
2929
+ pass
2930
+
2931
+ def _prompt(label: str) -> str:
2932
+ try:
2933
+ return input(f" {label}: ").strip()
2934
+ except (EOFError, KeyboardInterrupt):
2935
+ return ""
2927
2936
 
2928
- print(f"\n Omega v{__version__} — type a number to refresh, Ctrl-c to exit.\n")
2929
2937
  while True:
2930
2938
  items = _build_menu()
2931
- # Build fzf input separators are unselectable category headers.
2932
- lines = []
2933
- for label, key in items:
2934
- if key == "__separator__":
2935
- # Visual section header line.
2936
- lines.append(f"── {label} " + "─" * max(0, 50 - len(label)))
2937
- else:
2938
- lines.append(label)
2939
+ lines = [label for label, _ in items]
2939
2940
  fzf_input = "\n".join(lines)
2940
2941
  try:
2941
2942
  proc = subprocess.run(
2942
2943
  ["fzf",
2943
2944
  "--prompt=Ω › ",
2944
- "--header=Omega Session Manager — Enter to pick, Esc to refresh",
2945
+ "--header=Omega — Enter to pick, Esc to refresh, "
2946
+ "Ctrl-c to exit",
2945
2947
  "--layout=reverse",
2946
2948
  "--height=100%",
2947
2949
  "--border=rounded",
2948
2950
  "--no-multi",
2949
- "--info=inline"],
2951
+ "--info=inline",
2952
+ "--ansi"],
2950
2953
  input=fzf_input, capture_output=True, text=True,
2951
2954
  )
2952
2955
  except KeyboardInterrupt:
2953
2956
  return 0
2954
2957
  if proc.returncode != 0:
2955
- # Esc / Ctrl-c → refresh the menu rather than exit immediately.
2956
- # User picks "Quit" or "Detach" explicitly.
2957
- try:
2958
- input("\n (Esc pressed press Enter to refresh, Ctrl-c to quit)\n > ")
2959
- continue
2960
- except (EOFError, KeyboardInterrupt):
2961
- return 0
2962
- pick = proc.stdout.strip()
2958
+ # Esc → refresh.
2959
+ continue
2960
+ # FIX (v0.19.26): match label EXACTLY, no strip — fzf returns the
2961
+ # full line including any chars we put in. Just trim trailing \n.
2962
+ pick = proc.stdout.rstrip("\n")
2963
2963
  action = None
2964
2964
  for label, key in items:
2965
- display = (f"── {label} " + "" * max(0, 50 - len(label))
2966
- if key == "__separator__" else label)
2967
- if display == pick and key != "__separator__":
2965
+ if label == pick and key != "__sep__":
2968
2966
  action = key
2969
2967
  break
2970
2968
  if action is None:
2971
2969
  continue
2972
2970
 
2973
- # Dispatch.
2971
+ # === Dispatch ===
2974
2972
  if action == "detach":
2975
2973
  subprocess.run(["tmux", "detach-client"])
2976
2974
  return 0
2977
2975
  if action == "quit:kill":
2978
2976
  subprocess.run(["tmux", "kill-session", "-t", "Omega"])
2979
2977
  return 0
2978
+
2979
+ # Chat sessions — switch tmux client to the chat session.
2980
2980
  if action == "open:aisb":
2981
2981
  tmux.spawn_aisb_chat(HOME, force_replace=False)
2982
2982
  subprocess.run(["tmux", "switch-client", "-t", "AISB-chat"])
@@ -2985,57 +2985,62 @@ def cmd_menu_tui(_args: argparse.Namespace) -> int:
2985
2985
  tmux.spawn_hermes_chat(HOME, force_replace=False)
2986
2986
  subprocess.run(["tmux", "switch-client", "-t", "Hermes-chat"])
2987
2987
  continue
2988
+
2989
+ # Inline actions — run in the menu pane, prompt to return.
2988
2990
  if action == "switch:provider":
2989
- _send_in_window("switch", f"{shlex.quote(OMEGA_BIN)} switch")
2991
+ _run_inline([OMEGA_BIN, "switch"])
2990
2992
  continue
2991
2993
  if action == "genesis:new":
2992
- _send_in_window("genesis",
2993
- f"{shlex.quote(OMEGA_BIN)} genesis questions")
2994
+ slug = _prompt("project slug (alphanumeric, _-)")
2995
+ if slug:
2996
+ _run_inline([OMEGA_BIN, "genesis", "new", slug])
2994
2997
  continue
2995
2998
  if action == "project:open":
2996
- _send_in_window("project", "ls -la ~/Omega/Agentik_Coding/projects/")
2999
+ _run_inline("ls -la ~/Omega/Agentik_Coding/projects/ 2>/dev/null "
3000
+ "&& echo && echo '(cd into one to start working)'",
3001
+ shell=True)
2997
3002
  continue
2998
3003
  if action == "run:mission":
2999
- _send_in_window("mission",
3000
- f"echo 'usage: omega run \"<intent>\"' && "
3001
- f"echo 'examples: omega run \"fix all linear feedbacks\"'")
3004
+ intent = _prompt("mission intent (free-form)")
3005
+ if intent:
3006
+ _run_inline([OMEGA_BIN, "run", intent])
3002
3007
  continue
3003
3008
  if action == "audit:menu":
3004
- _send_in_window("audit",
3005
- f"echo 'Quality Arsenal — invoke an audit:' && "
3006
- f"echo ' /codeaudit /uiuxaudit /flowaudit /debugaudit' && "
3007
- f"echo ' /featureaudit /perfaudit /secaudit /a11yaudit' && "
3008
- f"echo ' /seoaudit /dataaudit /apiaudit /copyaudit' && "
3009
- f"echo ' /dxaudit /motionaudit /automationaudit' && "
3010
- f"echo ' /logicaudit /retentionaudit /refontaudit' && "
3011
- f"echo 'or: omega audit <id>'")
3009
+ _run_inline(
3010
+ "echo 'Quality Arsenal — 17 forensic audits:' && "
3011
+ "echo ' /codeaudit /uiuxaudit /flowaudit /debugaudit' && "
3012
+ "echo ' /featureaudit /perfaudit /secaudit /a11yaudit' && "
3013
+ "echo ' /seoaudit /dataaudit /apiaudit /copyaudit' && "
3014
+ "echo ' /dxaudit /motionaudit /automationaudit' && "
3015
+ "echo ' /logicaudit /retentionaudit /refontaudit' && "
3016
+ "echo && echo 'invoke from any claude session, or:' && "
3017
+ f"echo ' {OMEGA_BIN} audit <id>'",
3018
+ shell=True)
3012
3019
  continue
3013
3020
  if action == "sessions:list":
3014
- _send_in_window("sessions", "tmux ls")
3021
+ _run_inline("tmux ls", shell=True)
3015
3022
  continue
3016
3023
  if action == "accounts:menu":
3017
- _send_in_window("accounts",
3018
- f"{shlex.quote(OMEGA_BIN)} account list")
3024
+ _run_inline([OMEGA_BIN, "account", "list"])
3019
3025
  continue
3020
3026
  if action == "vault:menu":
3021
- _send_in_window("vault",
3022
- f"{shlex.quote(OMEGA_BIN)} vault status")
3027
+ _run_inline([OMEGA_BIN, "vault", "status"])
3023
3028
  continue
3024
3029
  if action == "cmd:doctor":
3025
- _send_in_window("doctor", f"{shlex.quote(OMEGA_BIN)} doctor")
3030
+ _run_inline([OMEGA_BIN, "doctor"])
3026
3031
  continue
3027
3032
  if action == "cmd:status":
3028
- _send_in_window("status", f"{shlex.quote(OMEGA_BIN)} status")
3033
+ _run_inline([OMEGA_BIN, "status"])
3029
3034
  continue
3030
3035
  if action == "scrape:cloak":
3031
- _send_in_window("scrape",
3032
- "read -p 'URL: ' u && "
3033
- f"{shlex.quote(OMEGA_BIN)} scrape \"$u\"")
3036
+ url = _prompt("URL")
3037
+ if url:
3038
+ _run_inline([OMEGA_BIN, "scrape", url])
3034
3039
  continue
3035
3040
  if action == "scrape:scrapling":
3036
- _send_in_window("scrape",
3037
- "read -p 'URL: ' u && "
3038
- f"{shlex.quote(OMEGA_BIN)} scrape \"$u\" --engine scrapling")
3041
+ url = _prompt("URL")
3042
+ if url:
3043
+ _run_inline([OMEGA_BIN, "scrape", url, "--engine", "scrapling"])
3039
3044
  continue
3040
3045
 
3041
3046
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "omega-engine"
3
- version = "0.19.25"
3
+ version = "0.19.26"
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"
@@ -1 +1 @@
1
- 0.19.25
1
+ 0.19.26
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentikos/omega-os",
3
- "version": "0.19.25",
3
+ "version": "0.19.26",
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"