@agentikos/omega-os 0.19.53 → 0.19.55

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.
@@ -116,6 +116,11 @@ def apply_settings(
116
116
  agent_teams = bool(cfg.get("experimental_agent_teams", True))
117
117
  bypass = bool(cfg.get("bypass_permissions", True))
118
118
  audit_gate = bool(cfg.get("audit_gate", True))
119
+ # v0.19.55 — default model is OPUS (was: whatever the user had —
120
+ # which on fresh Claude Code installs is sonnet). Gareth's CLAUDE.md
121
+ # is explicit: "Always opus — unlimited." For Max OAuth there's no
122
+ # per-call cost, so opus everywhere is the right default.
123
+ default_model = cfg.get("default_model", "opus")
119
124
 
120
125
  settings_file.parent.mkdir(parents=True, exist_ok=True)
121
126
  if settings_file.exists():
@@ -142,6 +147,11 @@ def apply_settings(
142
147
  # We previously set it; revert to "default" so the per-tool dialog returns.
143
148
  perms["defaultMode"] = "default"
144
149
 
150
+ # 2b. Default model — opus by default (Gareth's "Always opus" rule).
151
+ # Operator can override via manifest: `default_model: sonnet|haiku`.
152
+ if default_model and isinstance(default_model, str):
153
+ settings["model"] = default_model
154
+
145
155
  # 3. Stop hook.
146
156
  hooks = _ensure_dict(settings, "hooks")
147
157
  stop_entries = _ensure_list(hooks, "Stop")
@@ -427,6 +427,15 @@ step_claude_code_settings() {
427
427
  }
428
428
 
429
429
  step_engine() {
430
+ # v0.19.54 — neutralize broken claude-mem here too, NOT just in
431
+ # step_claude_plugins. The plugins step can be skipped/idempotent on
432
+ # re-install, but step_engine ALWAYS re-runs on version drift (it's
433
+ # in the force-rerun list). This guarantees the broken plugin is
434
+ # disabled on every upgrade, even if step 45 is somehow skipped.
435
+ if declare -f _disable_broken_claude_plugins >/dev/null 2>&1; then
436
+ _disable_broken_claude_plugins
437
+ fi
438
+
430
439
  local uv_bin; uv_bin="$(command -v uv || echo "$HOME/.local/bin/uv")"
431
440
  [ -x "$uv_bin" ] || { err "uv not found after step 10"; return 1; }
432
441
  cd "$OMEGA_HOME/Agentik_Engine" || { err "engine block missing"; return 1; }
@@ -1103,27 +1112,31 @@ _disable_broken_claude_plugins() {
1103
1112
  esac
1104
1113
  # Disable if EITHER signal fires.
1105
1114
  if [ "$broken_by_content" = "1" ] || [ "$broken_by_version" = "1" ]; then
1106
- local disabled="${cm%/}.disabled-by-omegaos"
1107
- if [ ! -d "$disabled" ]; then
1108
- if mv "$cm" "$disabled" 2>/dev/null; then
1109
- local reason=""
1110
- [ "$broken_by_content" = "1" ] && reason="zod/v3 import"
1111
- [ "$broken_by_version" = "1" ] && reason="${reason:+$reason + }known-broken 13.x"
1112
- info " neutralized claude-mem $version_dir ($reason)"
1113
- info " → SessionStart hook will no longer crash on \`claude\` start"
1114
- found=1
1115
- else
1116
- warn " could not disable claude-mem at $cm — manual: \`mv $cm $disabled\`"
1117
- fi
1115
+ # v0.19.55 — NUKE the plugin dir entirely (rm -rf), not just rename.
1116
+ # Renaming wasn't enough: Claude Code's marketplace re-resolver was
1117
+ # finding the renamed dir as a "stale ghost" and re-loading it. With
1118
+ # a complete delete + a .do-not-install marker, Claude Code can no
1119
+ # longer load it from cache. User can re-install via the marketplace
1120
+ # when upstream ships the zod 4 fix.
1121
+ if rm -rf "$cm" 2>/dev/null; then
1122
+ local reason=""
1123
+ [ "$broken_by_content" = "1" ] && reason="zod/v3 import"
1124
+ [ "$broken_by_version" = "1" ] && reason="${reason:+$reason + }known-broken 13.x"
1125
+ info " removed claude-mem $version_dir ($reason)"
1126
+ info " → SessionStart hook will no longer crash on \`claude\` start"
1127
+ # Drop a marker so we can detect if claude re-installs it
1128
+ # automatically and tell the user.
1129
+ mkdir -p "${HOME}/.claude/plugins" 2>/dev/null
1130
+ touch "${HOME}/.claude/plugins/.claude-mem-disabled-by-omegaos"
1131
+ found=1
1118
1132
  else
1119
- info " claude-mem $version_dir already neutralized"
1133
+ warn " could not remove claude-mem at $cm manual: \`rm -rf $cm\`"
1120
1134
  fi
1121
1135
  fi
1122
1136
  done
1123
1137
  if [ "$found" = "1" ]; then
1124
- info " → re-enable later (when upstream ships zod 4 fix):"
1125
- info " mv ${cache_dir}/thedotmack/claude-mem.*.disabled-by-omegaos \\"
1126
- info " ${cache_dir}/thedotmack/claude-mem/<version>"
1138
+ info " → re-install when upstream ships zod 4 fix:"
1139
+ info " claude plugin install claude-mem@thedotmack"
1127
1140
  fi
1128
1141
  return 0
1129
1142
  }
@@ -27,7 +27,7 @@ from __future__ import annotations
27
27
  import importlib
28
28
  from typing import Any
29
29
 
30
- __version__ = "0.19.53"
30
+ __version__ = "0.19.55"
31
31
 
32
32
  # Public-name → (module_path, attribute_name) map.
33
33
  # ``attribute_name = None`` means "return the whole module" (used for the
@@ -2949,11 +2949,28 @@ def _attach_or_spawn_chat(session_name: str, *,
2949
2949
  print(f" could not spawn {label}: {exc}")
2950
2950
  print(f" try manually: tmux new -d -s {session_name}")
2951
2951
  return 2
2952
- # Inside tmux already? Tell the user to switch (we can't from here).
2952
+ # Inside tmux already? Do the switch ourselves v0.19.54 fix.
2953
+ # Previously we PRINTED instructions ("Switch with: tmux switch-client
2954
+ # -t Omega:hermes") and exited, leaving the user staring at a useless
2955
+ # hint. Same bug pattern as cmd_menu had in v0.19.40 (fixed v0.19.41).
2956
+ # tmux switch-client works fine from inside a tmux client and is
2957
+ # exactly what the user wants.
2953
2958
  if os.environ.get("TMUX"):
2954
- print(f" already inside tmux — switch with:")
2955
- print(f" tmux switch-client -t {session_name}")
2956
- print(f" or detach (Ctrl-b d) then `omega` again.")
2959
+ import subprocess as _sp
2960
+ # Window of Omega session, or standalone session — try
2961
+ # select-window first (for Omega:<name>), then switch-client.
2962
+ if ":" in session_name:
2963
+ sess, win = session_name.split(":", 1)
2964
+ rc = _sp.run(["tmux", "select-window", "-t", session_name],
2965
+ capture_output=True).returncode
2966
+ if rc != 0:
2967
+ _sp.run(["tmux", "switch-client", "-t", sess],
2968
+ capture_output=True)
2969
+ _sp.run(["tmux", "select-window", "-t", session_name],
2970
+ capture_output=True)
2971
+ else:
2972
+ _sp.run(["tmux", "switch-client", "-t", session_name],
2973
+ capture_output=True)
2957
2974
  return 0
2958
2975
  # Outside tmux — replace this process with `tmux attach`.
2959
2976
  print(f" attaching to {label} ({session_name})…")
@@ -615,6 +615,19 @@ def _arrow_menu() -> int:
615
615
 
616
616
  items.append(("", "__sep__"))
617
617
 
618
+ # ── + NEW LLM SESSION ──────────────────────────────────────────
619
+ # v0.19.55 — direct access to every supported LLM CLI.
620
+ items.append((_section("+ NEW LLM SESSION"), "__sep__"))
621
+ items.append((_label("+ Claude Code", "Anthropic · Max OAuth"), "open:llm:claude_code"))
622
+ items.append((_label("+ Gemini CLI", "Google AI"), "open:llm:gemini_cli"))
623
+ items.append((_label("+ Codex", "OpenAI"), "open:llm:codex"))
624
+ items.append((_label("+ GLM", "Zhipu (zhipuai SDK)"), "open:llm:glm_sdk"))
625
+ items.append((_label("+ Qwen Code", "Alibaba"), "open:llm:qwen_code"))
626
+ items.append((_label("+ OpenCode", "multi-provider gateway"), "open:llm:opencode"))
627
+ items.append((_label("+ Aider", "AI pair programmer"), "open:llm:aider"))
628
+ items.append((_label("+ Continue.dev", "VS Code-style"), "open:llm:continue_dev"))
629
+ items.append(("", "__sep__"))
630
+
618
631
  # ── QUICK ACTIONS ───────────────────────────────────────────────
619
632
  items.append((_section("QUICK ACTIONS"), "__sep__"))
620
633
  items.append((_label("+ New AISB chat", "fresh session"), "open:aisb:new"))
@@ -665,6 +678,10 @@ def _arrow_menu() -> int:
665
678
  (_label("Accounts", "Claude Max pool"), "accounts:menu"),
666
679
  (_label("Vault", "encrypted secrets"), "vault:menu"),
667
680
  ("", "__sep__"),
681
+ # v0.19.55 — Telegram bot setup wizard.
682
+ (_label("Telegram bot", "configure bot token + webhook"), "telegram:setup"),
683
+ (_label("Hermès API key", "set ANTHROPIC_API_KEY_HERMES"), "hermes:setkey"),
684
+ ("", "__sep__"),
668
685
  (_label("← back"), "back"),
669
686
  ]
670
687
  if name == "infra":
@@ -895,6 +912,42 @@ def _arrow_menu() -> int:
895
912
  if audit_id:
896
913
  _run_inline([OMEGA_BIN, "audit", audit_id])
897
914
  continue
915
+ # v0.19.55 — generic LLM spawn: open:llm:<cli_id>
916
+ if action.startswith("open:llm:"):
917
+ llm_id = action.split(":", 2)[2]
918
+ # Map LLM id → bin name (matches bootstrap/lib/llm-clis.py catalog)
919
+ _LLM_BIN = {
920
+ "claude_code": "claude", "gemini_cli": "gemini",
921
+ "codex": "codex", "glm_sdk": "python3 -c 'import zhipuai'",
922
+ "qwen_code": "qwen", "opencode": "opencode",
923
+ "aider": "aider", "continue_dev": "cn",
924
+ }
925
+ bin_cmd = _LLM_BIN.get(llm_id, llm_id)
926
+ if not shutil.which(bin_cmd.split()[0]):
927
+ _run_inline(
928
+ f"echo ' {llm_id} ({bin_cmd}) not installed. Run:' && "
929
+ f"echo ' {OMEGA_BIN} tool install {llm_id}'",
930
+ shell=True,
931
+ )
932
+ continue
933
+ # Spawn as Omega window with the CLI's persona context dir.
934
+ persona = HOME / "Agentik_SSOT" / "agents" / "aisb" / "CLAUDE.md"
935
+ ctx_dir = tmux._ensure_chat_context_dir(HOME, llm_id, persona)
936
+ tmux.spawn_chat_in_omega(
937
+ llm_id, ctx_dir=ctx_dir, run_command=bin_cmd,
938
+ force_replace=False,
939
+ )
940
+ subprocess.run(["tmux", "select-window", "-t", f"Omega:{llm_id}"])
941
+ continue
942
+ if action == "telegram:setup":
943
+ _run_inline([OMEGA_BIN, "telegram", "setup"])
944
+ continue
945
+ if action == "hermes:setkey":
946
+ key = _prompt("ANTHROPIC_API_KEY_HERMES (sk-ant-…)")
947
+ if key:
948
+ _run_inline([OMEGA_BIN, "vault", "write",
949
+ "ANTHROPIC_API_KEY_HERMES", key])
950
+ continue
898
951
  # (v0.19.31 open:aisb / open:hermes legacy handlers removed in
899
952
  # v0.19.39 — the new unified handlers above (which accept both
900
953
  # plain and `:new` variants) cover the same surface.)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "omega-engine"
3
- version = "0.19.53"
3
+ version = "0.19.55"
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.53
1
+ 0.19.55
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentikos/omega-os",
3
- "version": "0.19.53",
3
+ "version": "0.19.55",
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"