@agentikos/omega-os 0.19.26 → 0.19.28
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/omega/Agentik_Engine/omega_engine/__init__.py +1 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tui.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +24 -10
- package/omega/Agentik_Engine/omega_engine/tmux.py +5 -5
- package/omega/Agentik_Engine/omega_engine/tui.py +457 -0
- package/omega/Agentik_Engine/pyproject.toml +2 -1
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/docs/AUDIT-V0.19.27.md +350 -0
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -2856,16 +2856,27 @@ 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
|
|
2859
|
+
"""`omega menu-tui` — the OmegaOS Textual TUI (v0.19.27+).
|
|
2860
2860
|
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2861
|
+
Modern boxed-layout TUI with slash commands (Hermès-style), sidebar
|
|
2862
|
+
categories, scrollable content log, footer keybindings. Falls back
|
|
2863
|
+
to a plain slash REPL if `textual` isn't installed (e.g. headless
|
|
2864
|
+
or before the engine venv finishes installing deps).
|
|
2865
2865
|
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2866
|
+
Delegates to `omega_engine.tui.run_tui()` which encapsulates both
|
|
2867
|
+
the Textual app and the plain REPL fallback.
|
|
2868
|
+
"""
|
|
2869
|
+
from omega_engine.tui import run_tui
|
|
2870
|
+
return run_tui()
|
|
2871
|
+
|
|
2872
|
+
|
|
2873
|
+
def _legacy_fzf_menu(_args: argparse.Namespace) -> int:
|
|
2874
|
+
"""v0.19.26 fzf menu — kept as fallback. Reachable via `omega menu-fzf`.
|
|
2875
|
+
|
|
2876
|
+
Actions run INLINE in the menu pane (not in dead background tmux
|
|
2877
|
+
windows). After every action, "press Enter to return to menu".
|
|
2878
|
+
Sessions (AISB/Hermes) still spawn as separate tmux sessions because
|
|
2879
|
+
they're meant to be talked to long-running.
|
|
2869
2880
|
"""
|
|
2870
2881
|
import os
|
|
2871
2882
|
import shlex
|
|
@@ -4333,9 +4344,12 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
4333
4344
|
help="open the interactive whiptail menu (legacy)"
|
|
4334
4345
|
).set_defaults(fn=cmd_menu_whiptail)
|
|
4335
4346
|
sub.add_parser("menu-tui",
|
|
4336
|
-
help="the
|
|
4337
|
-
"
|
|
4347
|
+
help="the Textual TUI inside the Omega tmux session "
|
|
4348
|
+
"(don't call directly — bare `omega` lands you here)"
|
|
4338
4349
|
).set_defaults(fn=cmd_menu_tui)
|
|
4350
|
+
sub.add_parser("menu-fzf",
|
|
4351
|
+
help="legacy v0.19.26 fzf menu fallback"
|
|
4352
|
+
).set_defaults(fn=_legacy_fzf_menu)
|
|
4339
4353
|
sub.add_parser("version", help="print the engine version").set_defaults(fn=cmd_version)
|
|
4340
4354
|
|
|
4341
4355
|
# `omega switch <provider>` — hot-swap the LLM CLI used for new chats.
|
|
@@ -533,9 +533,9 @@ bind-key S choose-tree -Zs
|
|
|
533
533
|
# ════════════════════════════════════════════════════════════════════
|
|
534
534
|
# Visual cues per session category
|
|
535
535
|
# ════════════════════════════════════════════════════════════════════
|
|
536
|
-
set -g status-style "bg=#1a1a2e,fg=#
|
|
536
|
+
set -g status-style "bg=#1a1a2e,fg=#eeeeee"
|
|
537
537
|
set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
|
|
538
|
-
set -g status-right "#[fg=#
|
|
538
|
+
set -g status-right "#[fg=#888888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
|
|
539
539
|
"""
|
|
540
540
|
|
|
541
541
|
|
|
@@ -625,15 +625,15 @@ bind-key r source-file ~/.tmux.conf \\; display-message "tmux.conf reloaded"
|
|
|
625
625
|
# ════════════════════════════════════════════════════════════════════
|
|
626
626
|
# Visual cues per session category — colour the status bar by name.
|
|
627
627
|
# ════════════════════════════════════════════════════════════════════
|
|
628
|
-
set -g status-style "bg=#1a1a2e,fg=#
|
|
628
|
+
set -g status-style "bg=#1a1a2e,fg=#eeeeee"
|
|
629
629
|
set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
|
|
630
|
-
set -g status-right "#[fg=#
|
|
630
|
+
set -g status-right "#[fg=#888888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
|
|
631
631
|
set -g status-interval 5
|
|
632
632
|
set -g status-left-length 40
|
|
633
633
|
set -g status-right-length 60
|
|
634
634
|
|
|
635
635
|
# Pane border colour — softer than default red
|
|
636
|
-
set -g pane-border-style "fg=#
|
|
636
|
+
set -g pane-border-style "fg=#333333"
|
|
637
637
|
set -g pane-active-border-style "fg=#7aa2f7"
|
|
638
638
|
"""
|
|
639
639
|
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
"""OmegaOS interactive Textual TUI — the v0.19.27 redesign.
|
|
2
|
+
|
|
3
|
+
User: "l'objectif c'est que ça fonctionne comme
|
|
4
|
+
https://www.agentik-os.com/services/agentik-coding-workflow ! avec notre
|
|
5
|
+
nouveau system omegaOS qui est noramlement une refont de tout ca ! et
|
|
6
|
+
aussi pour ta reponse - le TUI mets tout en place pour OmegaOS"
|
|
7
|
+
|
|
8
|
+
Architecture mirror of the Agentik Coding Workflow v2.5.1 doc:
|
|
9
|
+
|
|
10
|
+
- 4-level hierarchy visible (Human → AISB → Oracle → Worker)
|
|
11
|
+
- Telegram + terminal-native (no web dashboard)
|
|
12
|
+
- Terminal entry = this TUI
|
|
13
|
+
- Sessions exposed via tmux; TUI is the OmegaOS control surface
|
|
14
|
+
|
|
15
|
+
Layout (Textual, mouse + keyboard, slash-command driven like Hermès):
|
|
16
|
+
|
|
17
|
+
┌── Ω Omega OS v0.19.27 • provider: claude_code • sessions: 3 ──┐
|
|
18
|
+
│ CATEGORY │ CONTENT │
|
|
19
|
+
│ ──────── │ ─────── │
|
|
20
|
+
│ ▶ Chat │ (selected category's content here │
|
|
21
|
+
│ Projects │ — sessions list, audit menu, │
|
|
22
|
+
│ Audits │ doctor output, etc.) │
|
|
23
|
+
│ Sessions │ │
|
|
24
|
+
│ Accounts │ │
|
|
25
|
+
│ Vault │ │
|
|
26
|
+
│ Health │ │
|
|
27
|
+
│ Scrape │ │
|
|
28
|
+
│ │ │
|
|
29
|
+
├────────────────────────────┴─────────────────────────────────────┤
|
|
30
|
+
│ Ω › /<slash command> │
|
|
31
|
+
├──────────────────────────────────────────────────────────────────┤
|
|
32
|
+
│ q quit • d detach • ? help • / focus slash input │
|
|
33
|
+
└──────────────────────────────────────────────────────────────────┘
|
|
34
|
+
|
|
35
|
+
Slash commands (Hermès-style):
|
|
36
|
+
/chat aisb /chat hermes /aisb /hermes
|
|
37
|
+
/switch <provider> /switch (show current)
|
|
38
|
+
/audit <id> /mission "<intent>" /scrape <url>
|
|
39
|
+
/genesis <slug> /doctor /status
|
|
40
|
+
/vault [<key>] /accounts /sessions
|
|
41
|
+
/quit /detach /help
|
|
42
|
+
"""
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import os
|
|
46
|
+
import subprocess
|
|
47
|
+
import shlex
|
|
48
|
+
from pathlib import Path
|
|
49
|
+
from typing import Any
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
from textual.app import App, ComposeResult
|
|
53
|
+
from textual.widgets import (
|
|
54
|
+
Header, Footer, Input, RichLog, ListView, ListItem, Label,
|
|
55
|
+
)
|
|
56
|
+
from textual.containers import Horizontal, Vertical
|
|
57
|
+
from textual.binding import Binding
|
|
58
|
+
TEXTUAL_AVAILABLE = True
|
|
59
|
+
except ImportError:
|
|
60
|
+
TEXTUAL_AVAILABLE = False
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# ---------------------------------------------------------------------------
|
|
64
|
+
# Sidebar category map
|
|
65
|
+
# ---------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
CATEGORIES: list[tuple[str, str]] = [
|
|
68
|
+
("chat", "Chat — AISB & Hermès"),
|
|
69
|
+
("projects", "Projects — Genesis & shells"),
|
|
70
|
+
("audits", "Audits — Quality Arsenal (17 forensic)"),
|
|
71
|
+
("missions", "Missions — run with verified completion"),
|
|
72
|
+
("sessions", "Sessions — live tmux sessions"),
|
|
73
|
+
("accounts", "Accounts — Claude Max + provider auth"),
|
|
74
|
+
("vault", "Vault — encrypted secrets"),
|
|
75
|
+
("health", "Health — doctor + status"),
|
|
76
|
+
("scrape", "Scrape — CloakBrowser + Scrapling"),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ---------------------------------------------------------------------------
|
|
81
|
+
# Slash command dispatcher
|
|
82
|
+
# ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class CommandResult:
|
|
86
|
+
"""A command's effect — text to display + optional side-effects."""
|
|
87
|
+
|
|
88
|
+
def __init__(self, *, text: str = "", session_jump: str = "",
|
|
89
|
+
exit_tui: bool = False, detach: bool = False) -> None:
|
|
90
|
+
self.text = text
|
|
91
|
+
self.session_jump = session_jump
|
|
92
|
+
self.exit_tui = exit_tui
|
|
93
|
+
self.detach = detach
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _omega_bin() -> str:
|
|
97
|
+
home = Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
|
|
98
|
+
return str(home / "Agentik_Tools" / "bin" / "omega")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _run_omega(*args: str) -> str:
|
|
102
|
+
"""Shell out to the omega CLI and capture its stdout/stderr."""
|
|
103
|
+
try:
|
|
104
|
+
proc = subprocess.run([_omega_bin(), *args],
|
|
105
|
+
capture_output=True, text=True, timeout=120)
|
|
106
|
+
return (proc.stdout + proc.stderr).rstrip()
|
|
107
|
+
except subprocess.SubprocessError as exc:
|
|
108
|
+
return f" error: {exc}"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _switch_client(target: str) -> None:
|
|
112
|
+
subprocess.run(["tmux", "switch-client", "-t", target],
|
|
113
|
+
capture_output=True)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def dispatch_slash(line: str) -> CommandResult:
|
|
117
|
+
"""Parse a slash command and return the effect to apply."""
|
|
118
|
+
line = line.strip()
|
|
119
|
+
if not line:
|
|
120
|
+
return CommandResult(text="(empty)")
|
|
121
|
+
# Allow both "/foo bar" and "foo bar" inputs.
|
|
122
|
+
if line.startswith("/"):
|
|
123
|
+
line = line[1:]
|
|
124
|
+
try:
|
|
125
|
+
argv = shlex.split(line)
|
|
126
|
+
except ValueError as exc:
|
|
127
|
+
return CommandResult(text=f" parse error: {exc}")
|
|
128
|
+
if not argv:
|
|
129
|
+
return CommandResult(text="(empty)")
|
|
130
|
+
cmd, *rest = argv
|
|
131
|
+
|
|
132
|
+
# Quit / detach
|
|
133
|
+
if cmd in ("quit", "q", "exit"):
|
|
134
|
+
return CommandResult(exit_tui=True)
|
|
135
|
+
if cmd in ("detach", "d"):
|
|
136
|
+
return CommandResult(detach=True)
|
|
137
|
+
|
|
138
|
+
# Chat sessions
|
|
139
|
+
if cmd == "aisb" or (cmd == "chat" and rest and rest[0] == "aisb"):
|
|
140
|
+
from omega_engine import tmux as _tx
|
|
141
|
+
_tx.spawn_aisb_chat(Path(os.environ.get(
|
|
142
|
+
"OMEGA_HOME", str(Path.home() / "Omega"))))
|
|
143
|
+
return CommandResult(
|
|
144
|
+
text=" AISB-chat spawned — switching client…",
|
|
145
|
+
session_jump="AISB-chat",
|
|
146
|
+
)
|
|
147
|
+
if cmd == "hermes" or (cmd == "chat" and rest and rest[0] == "hermes"):
|
|
148
|
+
from omega_engine import tmux as _tx
|
|
149
|
+
_tx.spawn_hermes_chat(Path(os.environ.get(
|
|
150
|
+
"OMEGA_HOME", str(Path.home() / "Omega"))))
|
|
151
|
+
return CommandResult(
|
|
152
|
+
text=" Hermes-chat spawned — switching client…",
|
|
153
|
+
session_jump="Hermes-chat",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Provider hot-swap
|
|
157
|
+
if cmd == "switch":
|
|
158
|
+
if rest:
|
|
159
|
+
return CommandResult(text=_run_omega("switch", rest[0]))
|
|
160
|
+
return CommandResult(text=_run_omega("switch"))
|
|
161
|
+
|
|
162
|
+
# Audits + missions
|
|
163
|
+
if cmd == "audit":
|
|
164
|
+
if rest:
|
|
165
|
+
return CommandResult(text=_run_omega("audit", *rest))
|
|
166
|
+
return CommandResult(text=(
|
|
167
|
+
" Quality Arsenal — 17 forensic audits:\n"
|
|
168
|
+
" /codeaudit /uiuxaudit /flowaudit /debugaudit\n"
|
|
169
|
+
" /featureaudit /perfaudit /secaudit /a11yaudit\n"
|
|
170
|
+
" /seoaudit /dataaudit /apiaudit /copyaudit\n"
|
|
171
|
+
" /dxaudit /motionaudit /automationaudit\n"
|
|
172
|
+
" /logicaudit /retentionaudit /refontaudit\n"
|
|
173
|
+
" invoke from any claude session, or:\n"
|
|
174
|
+
f" omega audit <id>"
|
|
175
|
+
))
|
|
176
|
+
if cmd in ("mission", "run"):
|
|
177
|
+
if not rest:
|
|
178
|
+
return CommandResult(text=" usage: /mission \"<intent>\"")
|
|
179
|
+
return CommandResult(text=_run_omega("run", " ".join(rest)))
|
|
180
|
+
|
|
181
|
+
# Genesis (new project)
|
|
182
|
+
if cmd == "genesis":
|
|
183
|
+
if not rest:
|
|
184
|
+
return CommandResult(text=_run_omega("genesis", "questions"))
|
|
185
|
+
return CommandResult(text=_run_omega("genesis", "new", rest[0]))
|
|
186
|
+
|
|
187
|
+
# Vault
|
|
188
|
+
if cmd == "vault":
|
|
189
|
+
if not rest:
|
|
190
|
+
return CommandResult(text=_run_omega("vault", "status"))
|
|
191
|
+
return CommandResult(text=_run_omega("vault", *rest))
|
|
192
|
+
|
|
193
|
+
# Accounts + sessions
|
|
194
|
+
if cmd == "accounts":
|
|
195
|
+
return CommandResult(text=_run_omega("account", "list"))
|
|
196
|
+
if cmd == "sessions":
|
|
197
|
+
try:
|
|
198
|
+
proc = subprocess.run(["tmux", "ls"],
|
|
199
|
+
capture_output=True, text=True, timeout=10)
|
|
200
|
+
return CommandResult(text=proc.stdout + proc.stderr)
|
|
201
|
+
except subprocess.SubprocessError as exc:
|
|
202
|
+
return CommandResult(text=f" error: {exc}")
|
|
203
|
+
|
|
204
|
+
# Health
|
|
205
|
+
if cmd == "doctor":
|
|
206
|
+
return CommandResult(text=_run_omega("doctor"))
|
|
207
|
+
if cmd == "status":
|
|
208
|
+
return CommandResult(text=_run_omega("status"))
|
|
209
|
+
|
|
210
|
+
# Scrape
|
|
211
|
+
if cmd == "scrape":
|
|
212
|
+
if not rest:
|
|
213
|
+
return CommandResult(text=" usage: /scrape <url> [--engine scrapling]")
|
|
214
|
+
return CommandResult(text=_run_omega("scrape", *rest))
|
|
215
|
+
|
|
216
|
+
# Help
|
|
217
|
+
if cmd in ("help", "?"):
|
|
218
|
+
return CommandResult(text=(
|
|
219
|
+
" SLASH COMMANDS\n"
|
|
220
|
+
" ──────────────\n"
|
|
221
|
+
" /aisb switch to AISB master chat (Max OAuth)\n"
|
|
222
|
+
" /hermes switch to Hermès chat (Anthropic API)\n"
|
|
223
|
+
" /switch <provider> hot-swap LLM provider (Hermes-style)\n"
|
|
224
|
+
" /mission \"<intent>\" run a verified-completion mission\n"
|
|
225
|
+
" /audit <id> run a forensic audit (codeaudit, …)\n"
|
|
226
|
+
" /genesis <slug> start a new project via Genesis pipeline\n"
|
|
227
|
+
" /scrape <url> stealth scrape (CloakBrowser default)\n"
|
|
228
|
+
" /scrape <url> --engine scrapling fast scrape (Scrapling)\n"
|
|
229
|
+
" /sessions list active tmux sessions\n"
|
|
230
|
+
" /accounts list Claude Max account pool\n"
|
|
231
|
+
" /vault [key] vault status or read key\n"
|
|
232
|
+
" /doctor full health check (omega doctor)\n"
|
|
233
|
+
" /status task state (omega status)\n"
|
|
234
|
+
" /detach detach from Omega tmux session\n"
|
|
235
|
+
" /quit quit the TUI (kill Omega session)\n"
|
|
236
|
+
" /help show this help\n"
|
|
237
|
+
"\n"
|
|
238
|
+
" KEYBINDINGS\n"
|
|
239
|
+
" ───────────\n"
|
|
240
|
+
" / focus the slash input\n"
|
|
241
|
+
" ? this help\n"
|
|
242
|
+
" d detach\n"
|
|
243
|
+
" q quit\n"
|
|
244
|
+
" Tab navigate categories"
|
|
245
|
+
))
|
|
246
|
+
|
|
247
|
+
return CommandResult(text=(
|
|
248
|
+
f" unknown command: /{cmd}\n"
|
|
249
|
+
f" type /help for the list of commands"
|
|
250
|
+
))
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# ---------------------------------------------------------------------------
|
|
254
|
+
# The Textual app
|
|
255
|
+
# ---------------------------------------------------------------------------
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
if TEXTUAL_AVAILABLE:
|
|
259
|
+
|
|
260
|
+
class OmegaTUI(App):
|
|
261
|
+
"""OmegaOS Textual TUI — the v0.19.27 control surface."""
|
|
262
|
+
|
|
263
|
+
CSS = """
|
|
264
|
+
Screen {
|
|
265
|
+
background: $background;
|
|
266
|
+
}
|
|
267
|
+
#sidebar {
|
|
268
|
+
width: 32;
|
|
269
|
+
border-right: tall $primary;
|
|
270
|
+
padding: 1 1;
|
|
271
|
+
}
|
|
272
|
+
#content {
|
|
273
|
+
padding: 1 2;
|
|
274
|
+
}
|
|
275
|
+
#slash {
|
|
276
|
+
border-top: tall $primary;
|
|
277
|
+
background: $surface;
|
|
278
|
+
}
|
|
279
|
+
Header {
|
|
280
|
+
background: $primary;
|
|
281
|
+
color: $text;
|
|
282
|
+
}
|
|
283
|
+
ListView > ListItem.--highlight {
|
|
284
|
+
background: $primary;
|
|
285
|
+
color: $text;
|
|
286
|
+
}
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
BINDINGS = [
|
|
290
|
+
Binding("q", "quit_omega", "Quit"),
|
|
291
|
+
Binding("d", "detach_omega", "Detach"),
|
|
292
|
+
Binding("question_mark", "help_omega", "Help"),
|
|
293
|
+
Binding("slash", "focus_slash", "Slash"),
|
|
294
|
+
]
|
|
295
|
+
|
|
296
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
297
|
+
super().__init__(*args, **kwargs)
|
|
298
|
+
self._content: RichLog | None = None
|
|
299
|
+
self._slash: Input | None = None
|
|
300
|
+
|
|
301
|
+
def compose(self) -> ComposeResult:
|
|
302
|
+
from omega_engine import __version__
|
|
303
|
+
yield Header(name=f"Ω Omega OS v{__version__}", show_clock=True)
|
|
304
|
+
with Horizontal():
|
|
305
|
+
with Vertical(id="sidebar"):
|
|
306
|
+
yield Label("Categories", id="sidebar-title")
|
|
307
|
+
items = [ListItem(Label(name)) for _id, name in CATEGORIES]
|
|
308
|
+
yield ListView(*items, id="cats")
|
|
309
|
+
with Vertical(id="content-wrap"):
|
|
310
|
+
log = RichLog(id="content", highlight=True, markup=True,
|
|
311
|
+
wrap=True)
|
|
312
|
+
self._content = log
|
|
313
|
+
yield log
|
|
314
|
+
self._slash = Input(placeholder="Ω › type a slash command "
|
|
315
|
+
"(/help for list, /quit to exit)",
|
|
316
|
+
id="slash")
|
|
317
|
+
yield self._slash
|
|
318
|
+
yield Footer()
|
|
319
|
+
|
|
320
|
+
def on_mount(self) -> None:
|
|
321
|
+
self._write_welcome()
|
|
322
|
+
if self._slash:
|
|
323
|
+
self._slash.focus()
|
|
324
|
+
|
|
325
|
+
def _write_welcome(self) -> None:
|
|
326
|
+
if not self._content:
|
|
327
|
+
return
|
|
328
|
+
from omega_engine import __version__
|
|
329
|
+
self._content.write(
|
|
330
|
+
f"[bold #D97757]Ω Omega OS v{__version__}[/]\n"
|
|
331
|
+
"Type /help to see all slash commands.\n"
|
|
332
|
+
"\n"
|
|
333
|
+
"Quick start:\n"
|
|
334
|
+
" [bold]/aisb[/] chat with the AISB master agent\n"
|
|
335
|
+
" [bold]/hermes[/] chat with Hermès (Anthropic API)\n"
|
|
336
|
+
" [bold]/switch[/] see + hot-swap LLM provider\n"
|
|
337
|
+
" [bold]/mission \"...\"[/] run a verified-completion mission\n"
|
|
338
|
+
" [bold]/scrape <url>[/] stealth scrape via CloakBrowser\n"
|
|
339
|
+
" [bold]/audit <id>[/] run a Quality Arsenal audit\n"
|
|
340
|
+
" [bold]/doctor[/] full health check\n"
|
|
341
|
+
"\n"
|
|
342
|
+
"Click a category in the sidebar, or type a / command.\n"
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
def action_quit_omega(self) -> None:
|
|
346
|
+
subprocess.run(["tmux", "kill-session", "-t", "Omega"],
|
|
347
|
+
capture_output=True)
|
|
348
|
+
self.exit()
|
|
349
|
+
|
|
350
|
+
def action_detach_omega(self) -> None:
|
|
351
|
+
subprocess.run(["tmux", "detach-client"], capture_output=True)
|
|
352
|
+
self.exit()
|
|
353
|
+
|
|
354
|
+
def action_help_omega(self) -> None:
|
|
355
|
+
res = dispatch_slash("/help")
|
|
356
|
+
if self._content:
|
|
357
|
+
self._content.write(res.text)
|
|
358
|
+
|
|
359
|
+
def action_focus_slash(self) -> None:
|
|
360
|
+
if self._slash:
|
|
361
|
+
self._slash.focus()
|
|
362
|
+
|
|
363
|
+
def on_list_view_selected(self, event: Any) -> None:
|
|
364
|
+
"""User clicked a sidebar category — render that category's content."""
|
|
365
|
+
idx = event.list_view.index or 0
|
|
366
|
+
if idx >= len(CATEGORIES):
|
|
367
|
+
return
|
|
368
|
+
cat_id = CATEGORIES[idx][0]
|
|
369
|
+
self._render_category(cat_id)
|
|
370
|
+
|
|
371
|
+
def _render_category(self, cat_id: str) -> None:
|
|
372
|
+
if not self._content:
|
|
373
|
+
return
|
|
374
|
+
mapping = {
|
|
375
|
+
"chat": "/help", # show overall help — chat actions in help
|
|
376
|
+
"projects": "/genesis",
|
|
377
|
+
"audits": "/audit",
|
|
378
|
+
"missions": "/help",
|
|
379
|
+
"sessions": "/sessions",
|
|
380
|
+
"accounts": "/accounts",
|
|
381
|
+
"vault": "/vault",
|
|
382
|
+
"health": "/doctor",
|
|
383
|
+
"scrape": "/help",
|
|
384
|
+
}
|
|
385
|
+
cmd = mapping.get(cat_id, "/help")
|
|
386
|
+
res = dispatch_slash(cmd)
|
|
387
|
+
self._content.write(f"\n[bold #D97757]── {cat_id} ──[/]\n")
|
|
388
|
+
self._content.write(res.text)
|
|
389
|
+
|
|
390
|
+
def on_input_submitted(self, event: Any) -> None:
|
|
391
|
+
"""User typed a slash command."""
|
|
392
|
+
value = event.value
|
|
393
|
+
if not value:
|
|
394
|
+
return
|
|
395
|
+
if self._content:
|
|
396
|
+
self._content.write(f"\n[bold #D97757]Ω ›[/] {value}\n")
|
|
397
|
+
res = dispatch_slash(value)
|
|
398
|
+
if event.input:
|
|
399
|
+
event.input.value = ""
|
|
400
|
+
if res.exit_tui:
|
|
401
|
+
self.action_quit_omega()
|
|
402
|
+
return
|
|
403
|
+
if res.detach:
|
|
404
|
+
self.action_detach_omega()
|
|
405
|
+
return
|
|
406
|
+
if res.text and self._content:
|
|
407
|
+
self._content.write(res.text)
|
|
408
|
+
if res.session_jump:
|
|
409
|
+
_switch_client(res.session_jump)
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def run_tui() -> int:
|
|
413
|
+
"""Entry point — `omega menu-tui` calls this."""
|
|
414
|
+
if not TEXTUAL_AVAILABLE:
|
|
415
|
+
print(" textual not installed — `omega upgrade` or run:")
|
|
416
|
+
print(" pip install textual")
|
|
417
|
+
print()
|
|
418
|
+
print(" Falling back to plain prompt mode.")
|
|
419
|
+
return _plain_repl()
|
|
420
|
+
app = OmegaTUI()
|
|
421
|
+
app.run()
|
|
422
|
+
return 0
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
# ---------------------------------------------------------------------------
|
|
426
|
+
# Plain REPL fallback (when textual isn't installed)
|
|
427
|
+
# ---------------------------------------------------------------------------
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def _plain_repl() -> int:
|
|
431
|
+
"""Slash-command REPL with no textual TUI — same command set."""
|
|
432
|
+
from omega_engine import __version__
|
|
433
|
+
print(f"\n Ω Omega OS v{__version__} — plain REPL mode")
|
|
434
|
+
print(" Type /help for commands, /quit to exit.\n")
|
|
435
|
+
while True:
|
|
436
|
+
try:
|
|
437
|
+
line = input(" Ω › ").strip()
|
|
438
|
+
except (EOFError, KeyboardInterrupt):
|
|
439
|
+
print()
|
|
440
|
+
return 0
|
|
441
|
+
if not line:
|
|
442
|
+
continue
|
|
443
|
+
res = dispatch_slash(line)
|
|
444
|
+
if res.exit_tui:
|
|
445
|
+
subprocess.run(["tmux", "kill-session", "-t", "Omega"],
|
|
446
|
+
capture_output=True)
|
|
447
|
+
return 0
|
|
448
|
+
if res.detach:
|
|
449
|
+
subprocess.run(["tmux", "detach-client"], capture_output=True)
|
|
450
|
+
return 0
|
|
451
|
+
if res.text:
|
|
452
|
+
print()
|
|
453
|
+
for ln in res.text.splitlines():
|
|
454
|
+
print(f" {ln}")
|
|
455
|
+
print()
|
|
456
|
+
if res.session_jump:
|
|
457
|
+
_switch_client(res.session_jump)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "omega-engine"
|
|
3
|
-
version = "0.19.
|
|
3
|
+
version = "0.19.28"
|
|
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"
|
|
7
7
|
license = { text = "MIT" }
|
|
8
8
|
dependencies = [
|
|
9
9
|
"pyyaml>=6.0",
|
|
10
|
+
"textual>=1.0",
|
|
10
11
|
]
|
|
11
12
|
|
|
12
13
|
[project.optional-dependencies]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.19.
|
|
1
|
+
0.19.28
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# OmegaOS — Audit Avant/Après (v0.19.27)
|
|
2
|
+
|
|
3
|
+
> Rapport d'audit profond comparant le **système VPS live** (Agentik OS
|
|
4
|
+
> historique tournant chez Gareth depuis ~14 mois) au **package OmegaOS
|
|
5
|
+
> v0.19.27** (la refonte distribuable au public).
|
|
6
|
+
>
|
|
7
|
+
> Méthode : inventaire en parallèle des deux côtés, mapping fonctionnel,
|
|
8
|
+
> identification des écarts (préservé / adapté / manquant / nouveau),
|
|
9
|
+
> tests fonctionnels + vérification logique de l'architecture.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Comparaison quantitative
|
|
14
|
+
|
|
15
|
+
| Surface | VPS live | OmegaOS v0.19.27 | Notes |
|
|
16
|
+
|---|---:|---:|---|
|
|
17
|
+
| Rules globales (~/.claude/rules/) | 15 | 0 + 3 lois embarquées | Rules condensées dans `personas/OMEGAOS-CONTEXT.md` |
|
|
18
|
+
| Agents | 61 | 13 AISB + 8 Genesis | Le suite AISB est ce qui compte; le reste = noise sur le VPS |
|
|
19
|
+
| Commands / Skills | 142 / 134 | 33 SSOT skills + 18 audits YAML | Refonte : les 17 audits + orchestrators = canon |
|
|
20
|
+
| ~/.aisb/lib scripts | 200 .sh/.py | Engine Python: 60 modules | Refonte : engine remplace les bash scripts ad-hoc |
|
|
21
|
+
| Cron entries | 39 | 1 launchd + autonomous charters | Refonte : systemd/launchd units canoniques + charters YAML |
|
|
22
|
+
| Systemd services | 4 (aisb-bot, reactor, session-tracker, webhook-bridge) | 3 launchd plists (engine, telegram, autonomous) | Réduit à l'essentiel |
|
|
23
|
+
| LLM CLIs disponibles | claude only (officiel) | 13 (Claude/Gemini/Codex/OpenCode/Qwen/Continue/Ollama/LM Studio/Aider/GLM/Copilot + provider configs pour 16 backends) | **Refonte massive** |
|
|
24
|
+
| Scrapers | aucun officiel | CloakBrowser (default) + Scrapling (opt-in) | **Nouveau** |
|
|
25
|
+
| Stacks Genesis | n/a (oracle = pure live) | 8 presets canoniques | **Nouveau** |
|
|
26
|
+
| Persona system | ad-hoc CLAUDE.md éparpillés | 1 canonical → mirroré dans 10 LLM filenames | **Nouveau** |
|
|
27
|
+
| TUI / Menu | tmux-claude session manager popup | Textual app (Hermès-style) + fzf fallback + plain REPL | **Nouveau** |
|
|
28
|
+
| Tests automatisés | 0 officiel | **599 tests** (pytest) | **Refonte qualité** |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Mapping fonctionnel — où vit quoi maintenant
|
|
33
|
+
|
|
34
|
+
### Côté Live VPS (ce qu'on avait)
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
~/.claude/ ← Claude Code config + custom commands
|
|
38
|
+
├── rules/ ← 15 .md "lois" globales
|
|
39
|
+
├── agents/ ← 61 specialist personas
|
|
40
|
+
├── commands/ ← 142 slash command files
|
|
41
|
+
├── skills/ ← 134 skill files
|
|
42
|
+
└── settings.json ← Agent Teams flag, hooks
|
|
43
|
+
|
|
44
|
+
~/.aisb/ ← AISB orchestration state
|
|
45
|
+
├── lib/ ← 200 bash + python scripts ad-hoc
|
|
46
|
+
├── secrets/ ← integrations.env (plain)
|
|
47
|
+
├── state/ ← oracle/worker .done.json + briefs
|
|
48
|
+
├── locks/ ← per-project ship locks
|
|
49
|
+
├── docs/ ← ARCHITECTURE / ORCHESTRATION / CLOUD
|
|
50
|
+
└── heartbeats/ ← keep-alive markers
|
|
51
|
+
|
|
52
|
+
~/VibeCoding/agentic/agentik-monitor/
|
|
53
|
+
├── telegram-bot/ ← bot Python (single token)
|
|
54
|
+
├── bot/ ← SOUL.md + MEMORY.md
|
|
55
|
+
├── dashboard/ ← Next.js dashboard (separate)
|
|
56
|
+
└── mcp-server/ ← MCP integration
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Côté OmegaOS package (ce qu'on distribue)
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
omega/
|
|
63
|
+
├── Agentik_Engine/ ← LE MOTEUR (60 modules Python)
|
|
64
|
+
│ └── omega_engine/
|
|
65
|
+
│ ├── cli.py ← entry point — 70+ subcommands
|
|
66
|
+
│ ├── tui.py ← Textual app + slash dispatcher [NEW v0.19.27]
|
|
67
|
+
│ ├── tmux.py ← spawn AISB/Hermes/Omega/Oracle/Worker
|
|
68
|
+
│ ├── personas.py ← canonical OmegaOS context for 10 LLMs [NEW v0.19.22]
|
|
69
|
+
│ ├── genesis/ ← 8 stack presets + PHASES pipeline
|
|
70
|
+
│ ├── audits/ ← 18 audit YAML → SKILL.md generator
|
|
71
|
+
│ ├── hermes.py + hermes_*.py ← L2 companion bridge
|
|
72
|
+
│ ├── aisb_chat.py ← chat_once() + run_chat_loop()
|
|
73
|
+
│ ├── plan.py ← FSM-enforced multi-day planner
|
|
74
|
+
│ ├── pursue.py ← native /goal replacement
|
|
75
|
+
│ ├── vault.py ← age-encrypted secrets
|
|
76
|
+
│ ├── webhooks.py ← HMAC-signed inbound triggers
|
|
77
|
+
│ └── 50+ more...
|
|
78
|
+
│
|
|
79
|
+
├── Agentik_SSOT/ ← source-of-truth (operator-editable)
|
|
80
|
+
│ ├── skills/ ← 33 skills (17 audits + orchestrators + scrape + switch)
|
|
81
|
+
│ ├── audits/*.yaml ← 18 audit definitions
|
|
82
|
+
│ ├── agents/aisb/ ← (populated at install from bootstrap/templates/aisb)
|
|
83
|
+
│ ├── personas/ ← (populated at install — canonical OMEGAOS-CONTEXT.md)
|
|
84
|
+
│ ├── clis/clis-catalog.yaml ← 27 system CLIs (incl. CloakBrowser + Scrapling) [NEW]
|
|
85
|
+
│ ├── llm-providers/providers-catalog.yaml ← 16 LLM providers (Anthropic/OpenAI/Gemini/GLM/DeepSeek/Qwen/Ollama/LM Studio/OpenRouter/Bedrock/Mistral/xAI/Vercel Gateway/Copilot/OpenAI-compat/ChatGPT sub) [NEW v0.19.23]
|
|
86
|
+
│ ├── mcp/mcp-catalog.yaml ← 16 MCPs (LEGACY — opt-in only since v0.19.21)
|
|
87
|
+
│ ├── claude-plugins/ ← 15 plugins (incl. superpowers, claude-mem, document-skills)
|
|
88
|
+
│ └── docs/ ← LAYERS.md (4-level archi) + USER-JOURNEY.md + this audit
|
|
89
|
+
│
|
|
90
|
+
├── Agentik_Orchestration/
|
|
91
|
+
│ ├── topologies/aisb-oracle-worker.yaml
|
|
92
|
+
│ ├── autonomous/ ← cron-driven charters YAML
|
|
93
|
+
│ └── educators/ ← self-improvement loops
|
|
94
|
+
│
|
|
95
|
+
├── Agentik_Coding/projects/<slug>/ ← strict per-project isolation
|
|
96
|
+
├── Agentik_Providers/ ← (claude/ — sync target)
|
|
97
|
+
├── Agentik_Runtime/ ← live: eventlog/rag.db/sessions/locks
|
|
98
|
+
├── Agentik_Tools/bin/omega ← symlink to engine venv
|
|
99
|
+
└── Agentik_Extra/var/etc/staging/ ← logs, secrets vault, staging
|
|
100
|
+
|
|
101
|
+
bootstrap/
|
|
102
|
+
├── lib/
|
|
103
|
+
│ ├── common.sh ← prompts, banner, NEWT_COLORS, install_venv
|
|
104
|
+
│ ├── steps.sh ← 22 step functions
|
|
105
|
+
│ ├── llm-clis.py ← 13 LLM CLI catalog
|
|
106
|
+
│ ├── claude-code-settings.py ← merge into ~/.claude/settings.json
|
|
107
|
+
│ └── manifest-helpers.py ← read install manifest
|
|
108
|
+
└── templates/
|
|
109
|
+
└── aisb/ ← 15 agent prompts (deployed at step 25)
|
|
110
|
+
|
|
111
|
+
install.sh ← 21 STEPS, plan mode, prompt_yes_no, exec shell at end
|
|
112
|
+
bin/omega-os.js ← npx entry → handoff to install.sh
|
|
113
|
+
package.json ← @agentikos/omega-os@0.19.27
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 3. Diff catégorisé
|
|
119
|
+
|
|
120
|
+
### 3.1 — Préservé / adapté (canon transposé)
|
|
121
|
+
|
|
122
|
+
| Concept Live | OmegaOS canon | Adaptation |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| 13 AISB agent prompts (Niobe/Oracle/Construct/Seraph/Smith/Pythia/...) | `bootstrap/templates/aisb/*.md` → `~/Omega/Agentik_SSOT/agents/aisb/` | Identiques. Step 25 les déploie tel quel. |
|
|
125
|
+
| 17 audits Quality Arsenal | `Agentik_SSOT/audits/*.yaml` + `Agentik_SSOT/skills/*audit/SKILL.md` | YAML structurés + SKILL.md généré au step 27. |
|
|
126
|
+
| Tmux-claude session manager | step 36 lance le canonical installer | Identique — `curl install.sh \| bash` du repo `agentik-os/tmux-claude`. |
|
|
127
|
+
| 3 Laws | Embarqués dans `personas/OMEGAOS-CONTEXT.md` | Chaque LLM (Claude/Gemini/Codex/...) les voit au boot. |
|
|
128
|
+
| Per-project Telegram topic | `Agentik_SSOT/projects/<slug>/registry.yaml` + topic_id map | Topic = project mission scope. |
|
|
129
|
+
| 4-level hiérarchie | Documenté dans `LAYERS.md` + enforcé par engine | Human → AISB → Oracle → Workers. |
|
|
130
|
+
| Claude Max OAuth single-token | Engine reads `~/.claude/.credentials.json` live | AISB+Oracle+Worker partagent. Hermès isolé (Anthropic API). |
|
|
131
|
+
|
|
132
|
+
### 3.2 — Manquant / non porté
|
|
133
|
+
|
|
134
|
+
| Live VPS | OmegaOS v0.19.27 status |
|
|
135
|
+
|---|---|
|
|
136
|
+
| 200 lib scripts ad-hoc (`safe-npm-build.sh`, `dispatch-to-session.sh`, `oracle-ship.sh`, etc.) | Remplacés par engine Python (`omega run`, `omega genesis`, `omega plan run`, etc.). Aucune mention 1:1 dans le package. |
|
|
137
|
+
| 39 cron entries (mémoires SQLite, FFT-flusher, defensive scan, etc.) | Réduit à 0 entries cron — remplacé par 3 launchd services (engine, telegram, autonomous) + autonomous charters YAML. |
|
|
138
|
+
| Shadow Manager (14 signals daemon) | Pas porté. Remplacé par `omega doctor` snapshot + manual ops. |
|
|
139
|
+
| Safety Mesh L1-L4 (brief-replay, CPU Guard, Shadow Manager, Mission Auditor) | Mission Auditor partiellement = audit gate via Stop-hook. Les 3 autres non portés (CPU guard, shadow nudges, brief-replay). |
|
|
140
|
+
| Tracking Reactor (inotify ~129ms stall detection) | Pas porté. |
|
|
141
|
+
| Smart Resurrect Cascade (4 tiers) | Pas porté. |
|
|
142
|
+
|
|
143
|
+
### 3.3 — Nouveau (refonte propre que le live n'a pas)
|
|
144
|
+
|
|
145
|
+
| Ajout OmegaOS | Pourquoi |
|
|
146
|
+
|---|---|
|
|
147
|
+
| **8 Genesis stack presets** (omegaos-canonical / mobile-native / mobile-expo / desktop-tauri / supabase / claude-dashboard / convex-selfhosted / sqlite-local) | Le live n'avait pas de pipeline de "nouveau projet" — opérateur partait du clone à la main. |
|
|
148
|
+
| **Persona system** (canonical OMEGAOS-CONTEXT.md → mirroré dans CLAUDE.md/GEMINI.md/AGENTS.md/...) | Hot-swap LLM possible — chaque CLI voit la même persona automatiquement. |
|
|
149
|
+
| **`omega switch <provider>`** | Hot-swap LLM en une commande. Live = pas de switching. |
|
|
150
|
+
| **Textual TUI** (`omega menu-tui` + slash commands `/aisb /hermes /switch /audit /mission /scrape`) | Le live = pas de TUI, juste tmux + scripts dispersés. |
|
|
151
|
+
| **CloakBrowser scraper** (`omega scrape <url>`) | Le live n'avait pas de scraper officiel — usage ad-hoc de Playwright. |
|
|
152
|
+
| **Scrapling scraper** (optionnel, `--engine scrapling`) | Idem, complément rapide pour les sites non protégés. |
|
|
153
|
+
| **CLI Catalog `clis-catalog.yaml`** (27 system CLIs avec install per-OS, post_install hooks) | Live = installs manuels. |
|
|
154
|
+
| **LLM Provider Catalog** (16 backends — Anthropic/OpenAI/Gemini/GLM/DeepSeek/Qwen/Ollama/LM Studio/OpenRouter/Bedrock/Mistral/xAI/Vercel Gateway/Copilot/OpenAI-compat/ChatGPT sub) | Live = claude only. |
|
|
155
|
+
| **Plan v7 FSM-enforced executor** (PENDING→IN_PROGRESS→CLAIMED_DONE→VERIFIED, plan.db SQLite per-project, `omega plan run` multi-day autonomous loop) | Live = pas d'engine de planning, juste dispatch. |
|
|
156
|
+
| **age-encrypted vault** (`omega vault read/write`) | Live = plain .env files. |
|
|
157
|
+
| **Webhooks HMAC-signés** (`omega webhook handle`) | Live = pas de surface d'entrée webhook canonique. |
|
|
158
|
+
| **Genesis pipeline** (vision → market 5 files → branding 3 files → PRD 9 files → features F-001..F-006 DAG → plan) | Live = aucun. Refonte produit-first. |
|
|
159
|
+
| **2 scrapers + Printing Press CLI factory** | Nouveau écosystème d'agent-CLIs. |
|
|
160
|
+
| **599 pytest tests** | Live = 0 test officiel. |
|
|
161
|
+
| **`@agentikos/omega-os` npm package** distribuable + installer 21 steps avec plan mode | Live = config manuelle, jamais redistribuable. |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 4. Tests fonctionnels exécutés
|
|
166
|
+
|
|
167
|
+
| Test | Résultat |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `python -m pytest -q --tb=no` | **599 passed**, 2 warnings (DeprecationWarning v0.6 backup), 20.8s |
|
|
170
|
+
| `bash -n install.sh bootstrap/lib/{common,steps}.sh` | shell syntax OK |
|
|
171
|
+
| Import canary: `from omega_engine import cli, tui, tmux, personas, genesis, audits` | all imports OK |
|
|
172
|
+
| Slash dispatch: `dispatch_slash("/help")` | 30-line help OK |
|
|
173
|
+
| Slash dispatch: `dispatch_slash("/aisb")` | `session_jump=AISB-chat` OK |
|
|
174
|
+
| Slash dispatch: `dispatch_slash("/hermes")` | `session_jump=Hermes-chat` OK |
|
|
175
|
+
| Slash dispatch: `dispatch_slash("/unknown_cmd")` | "unknown command" message OK |
|
|
176
|
+
| `bash install.sh --dry-run --profile workstation` | 21 steps listed cleanly |
|
|
177
|
+
| `personas.supported_llm_ids()` | 10 ids (claude_code/gemini_cli/codex/opencode/openrouter_cli/deepseek/qwen_code/continue_dev/aider/hermes) |
|
|
178
|
+
| Catalog parse: MCP/CLI/LLM-providers/plugins | All 4 YAMLs parse cleanly, counts correct (16/27/16/15) |
|
|
179
|
+
| npm tarball v0.19.27 contains all 13 LLM CLIs | verified via `npm pack` extraction |
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 5. Vérification de la logique architecture
|
|
184
|
+
|
|
185
|
+
### 5.1 — 4-level hiérarchie
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
Human (Telegram / TUI omega / CLI)
|
|
189
|
+
↓
|
|
190
|
+
AISB (intake — Claude Max OAuth)
|
|
191
|
+
↓ dispatch_oracle
|
|
192
|
+
Oracle (per-project planner — Claude Max OAuth, persistent tmux)
|
|
193
|
+
↓ dispatch_worker
|
|
194
|
+
Worker (executor — short-lived tmux, .done.json signal)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**OmegaOS map :**
|
|
198
|
+
- L1 Human → `omega` TUI + `omega run` CLI + Telegram bot (step 50)
|
|
199
|
+
- L2 AISB → `Agentik_SSOT/agents/aisb/niobe.md` (intake personality) + `aisb_chat.py` + Telegram daemon
|
|
200
|
+
- L3 Oracle → `tmux.spawn_oracle(project, oracle_id)` → persistent session
|
|
201
|
+
- L4 Worker → `tmux.spawn_worker(project, task)` + `done_signal.py` + audit gate
|
|
202
|
+
- L2bis Hermès → optionnel, séparé : `hermes.py` + Anthropic API + own Telegram bot
|
|
203
|
+
|
|
204
|
+
**Verdict :** ✓ Architecture cohérente, enforcée en code (tmux session naming + role aliases dans `prompts.py`).
|
|
205
|
+
|
|
206
|
+
### 5.2 — Provider hot-swap
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
omega switch gemini_cli
|
|
210
|
+
↓
|
|
211
|
+
$OMEGA_HOME/Agentik_Extra/var/active-llm-provider ← "gemini_cli"
|
|
212
|
+
↓
|
|
213
|
+
Next spawn_aisb_chat() reads active provider (planned v0.19.28+)
|
|
214
|
+
↓
|
|
215
|
+
tmux session launches `gemini` instead of `claude`
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**OmegaOS status :** marker écrit (v0.19.22). `spawn_aisb_chat` ne le lit pas encore → utilise toujours `claude`. **Gap connu, v0.19.28.**
|
|
219
|
+
|
|
220
|
+
### 5.3 — Persona system
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
$OMEGA_HOME/Agentik_SSOT/personas/OMEGAOS-CONTEXT.md ← canonical (operator editable)
|
|
224
|
+
↓ _ensure_chat_context_dir()
|
|
225
|
+
$OMEGA_HOME/Agentik_Coding/chat-contexts/aisb-master/
|
|
226
|
+
├── CLAUDE.md ← Anthropic Claude Code reads this
|
|
227
|
+
├── GEMINI.md ← Google Gemini CLI reads this
|
|
228
|
+
├── AGENTS.md ← OpenAI Codex reads this
|
|
229
|
+
├── QWEN.md ← Alibaba Qwen reads this
|
|
230
|
+
├── .opencode/CONTEXT.md ← OpenCode reads this
|
|
231
|
+
├── .continue/CONTEXT.md ← Continue.dev reads this
|
|
232
|
+
├── CONVENTIONS.md ← Aider reads this
|
|
233
|
+
└── HERMES.md ← Hermès reads this
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Verdict :** ✓ Tous les LLM voient le MÊME contexte OmegaOS. Edit `OMEGAOS-CONTEXT.md` une fois → propagé.
|
|
237
|
+
|
|
238
|
+
### 5.4 — Scrapers (CLI surface pour les LLMs)
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
LLM dans une session Claude/Gemini/Codex
|
|
242
|
+
↓ user: "fetch https://stripe.com/docs"
|
|
243
|
+
↓ LLM shell-out:
|
|
244
|
+
omega scrape https://stripe.com/docs ← default CloakBrowser
|
|
245
|
+
OR
|
|
246
|
+
omega scrape <url> --engine scrapling ← fast HTTP-first
|
|
247
|
+
↓
|
|
248
|
+
markdown sur stdout → re-injecté dans le contexte du LLM
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Verdict :** ✓ Tous les LLMs ont accès au même scraper via Bash. Bot detection bypass via CloakBrowser C++ patches.
|
|
252
|
+
|
|
253
|
+
### 5.5 — 21 install steps — séquence vérifiée
|
|
254
|
+
|
|
255
|
+
| # | Step | Dépendances | Verdict |
|
|
256
|
+
|---|---|---|---|
|
|
257
|
+
| 00 | preflight | — | ✓ |
|
|
258
|
+
| 10 | system-deps | brew/apt/dnf + installer venv (uv + Python 3.13 + pyyaml) | ✓ Tahoe-safe via uv |
|
|
259
|
+
| 15 | llm-clis | npm (Node), uv (Python) | ✓ 13 CLIs offerts en multi-select |
|
|
260
|
+
| 20 | structure | `cp -R omega/` | ✓ 8 blocks |
|
|
261
|
+
| 25 | aisb-suite | step 20 done | ✓ 15 agent prompts copiés |
|
|
262
|
+
| 27 | audit-skills | step 20 + 25 + yaml | ✓ 18 SKILL.md générés |
|
|
263
|
+
| 30 | engine | uv venv + uv pip install -e . (incl. textual >= 1.0) | ✓ `omega` binary linké |
|
|
264
|
+
| 33 | claude-code-settings | step 30 + claude installé | ✓ Stop-hook + Agent Teams flag |
|
|
265
|
+
| 32 | accounts | manifest optional | skip si pas de manifest |
|
|
266
|
+
| 35 | providers | manifest optional | skip si pas de manifest |
|
|
267
|
+
| 36 | tmux-config | step 10 (tmux) | ✓ `agentik-os/tmux-claude` installer |
|
|
268
|
+
| 37 | hermes-brief | step 30 | ✓ `~/.hermes/skills/omega/SKILL.md` |
|
|
269
|
+
| 40 | **clis** (refonte v0.19.21 — replaces MCP) | step 30 | ✓ audit + install 10 native + Printing Press |
|
|
270
|
+
| 45 | claude-plugins | claude CLI | ✓ 10 plugins (4 anciennement cassés fixés) |
|
|
271
|
+
| 50 | telegram | curl | ✓ 2-bot model AISB + Hermès optionnel |
|
|
272
|
+
| 55 | autonomous | manifest optional | skip si pas de manifest |
|
|
273
|
+
| 57 | rag | step 30 | leaves defaults |
|
|
274
|
+
| 58 | first-project | manifest optional | skip si pas de manifest |
|
|
275
|
+
| 59 | hermes-session | step 30 + tmux | ✓ AISB-chat tmux toujours-active |
|
|
276
|
+
| 60 | services | systemd/launchd | ✓ 3 plists / units |
|
|
277
|
+
| 70 | doctor | step 30 + tout le reste | verdict READY/PARTIAL/NOT_READY |
|
|
278
|
+
|
|
279
|
+
**Verdict global :** Les 21 steps couvrent install end-to-end. Étapes optionnelles (manifest-driven) gèrent gracieusement l'absence.
|
|
280
|
+
|
|
281
|
+
### 5.6 — Régression historique (du v0.19.x debug saga)
|
|
282
|
+
|
|
283
|
+
| Bug | Version d'origine | Fix | Verdict |
|
|
284
|
+
|---|---|---|---|
|
|
285
|
+
| `import yaml` crash sur macOS Tahoe | v0.19.7- | venv dédié avec uv + Python 3.13 managed | ✓ v0.19.11 |
|
|
286
|
+
| `prompt_yes_no: command not found` | v0.19.1 | helper défini dans common.sh | ✓ v0.19.5 |
|
|
287
|
+
| Banner G illisible (B confusion) | v0.19.0 | row 3 ouvert + arc bottom | ✓ v0.19.5 |
|
|
288
|
+
| `${readiness,,}` bash 3.2 crash macOS | v0.19.4 | `tr` au lieu de `${var,,}` | ✓ v0.19.12 |
|
|
289
|
+
| npx 404 (restricted access) | v0.19.4 | publishConfig.access=public | ✓ v0.19.7 |
|
|
290
|
+
| `omega` ne fait rien sur Mac | v0.19.7 | NEWT_COLORS + text menu fallback | ✓ v0.19.12 |
|
|
291
|
+
| MCP catalog count `(0\n?)` splatter | v0.19.11- | regex avec leading whitespace | ✓ v0.19.15 |
|
|
292
|
+
| 4 MCPs failed (git/fetch/higgsfield/linear) | v0.19.20- | uvx method + correct package names | ✓ v0.19.16 |
|
|
293
|
+
| AISB chat crash "cwd deleted" | v0.19.16- | spawn avec cwd=$HOME | ✓ v0.19.17 |
|
|
294
|
+
| `omega aisb` silent attach to dead session | v0.19.17 | shell-stays-alive via send-keys + force_replace | ✓ v0.19.20 |
|
|
295
|
+
| Claude plugins fail (anthropic-skills marketplace) | v0.19.19- | correct marketplace IDs + drop `-s scope` flag | ✓ v0.19.20 |
|
|
296
|
+
| Bot Telegram DM rejected | v0.19.12- | route DM → AISB chat_once | ✓ v0.19.13 |
|
|
297
|
+
| Source ~/.zshrc oubliée | toujours | `exec $SHELL -l` end of install | ✓ v0.19.20 |
|
|
298
|
+
| Menu actions silently no-op | v0.19.25 | label matching bug + inline execution | ✓ v0.19.26 |
|
|
299
|
+
| Plain fzf menu pas Hermès-grade | toujours | Textual TUI + slash commands | ✓ v0.19.27 |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 6. Ce qui reste (roadmap v0.20+)
|
|
304
|
+
|
|
305
|
+
1. **Streaming async dans le TUI** — actuellement subprocess capture + dump. Hermès = streaming live ligne-par-ligne.
|
|
306
|
+
2. **`spawn_*_chat` provider-aware** — lire `active-llm-provider` et lancer le bon CLI (pas toujours `claude`).
|
|
307
|
+
3. **Per-provider auth wizard** — `omega account login --provider gemini` qui lit `providers-catalog.yaml`.
|
|
308
|
+
4. **Sync skills cross-provider** — translation Claude Code skills → Gemini CLI commands → Codex agents.
|
|
309
|
+
5. **Safety Mesh L1-L4** — porter brief-replay + CPU Guard + Shadow Manager + Mission Auditor depuis le live VPS.
|
|
310
|
+
6. **Tracking Reactor** — inotify stall detection.
|
|
311
|
+
7. **Hermes dedicated daemon** — poll loop pour le bot Hermès séparé.
|
|
312
|
+
8. **CloakBrowser auto-discovery via Claude `.claude/settings.json`** — pour que Claude découvre `omega scrape` sans qu'on lui dise.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 7. Verdict
|
|
317
|
+
|
|
318
|
+
**OmegaOS v0.19.27 = vraie refonte du système live**, pas un copier-coller.
|
|
319
|
+
|
|
320
|
+
- ✓ **Distribuable** : `npx @agentikos/omega-os@0.19.27` install end-to-end en 21 steps.
|
|
321
|
+
- ✓ **Multi-LLM** : 13 CLIs + 16 provider configs + persona system unifié.
|
|
322
|
+
- ✓ **Multi-scraper** : CloakBrowser + Scrapling.
|
|
323
|
+
- ✓ **TUI Hermès-style** : Textual app + slash commands.
|
|
324
|
+
- ✓ **Testé** : 599 tests pytest passent.
|
|
325
|
+
- ✓ **Documentation** : LAYERS.md (architecture) + USER-JOURNEY.md (parcours) + ce rapport.
|
|
326
|
+
|
|
327
|
+
**Gaps connus** :
|
|
328
|
+
- Provider hot-swap incomplet (marker écrit, spawn pas encore lecteur)
|
|
329
|
+
- Safety Mesh non porté
|
|
330
|
+
- Streaming async dans le TUI à venir
|
|
331
|
+
|
|
332
|
+
**Ce qui rend OmegaOS supérieur au live VPS** :
|
|
333
|
+
- Distribuable au public (vs setup manuel chez Gareth)
|
|
334
|
+
- Hot-swap LLM (vs claude-only)
|
|
335
|
+
- Stack Genesis (vs partir de zéro à la main)
|
|
336
|
+
- Vault chiffré (vs .env plain)
|
|
337
|
+
- 599 tests (vs 0)
|
|
338
|
+
- TUI moderne (vs bash scripts dispersés)
|
|
339
|
+
|
|
340
|
+
**Ce que le live VPS a de plus** :
|
|
341
|
+
- Safety Mesh complet (4 layers de protection runtime)
|
|
342
|
+
- 39 cron entries (Smith reflection, defensive scans, etc.)
|
|
343
|
+
- 14 Shadow Manager signals
|
|
344
|
+
- Tracking Reactor (~129ms stall detection)
|
|
345
|
+
|
|
346
|
+
→ La refonte privilégie la **distributabilité** et la **multi-LLM** ; les couches de safety runtime du live restent à porter.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
*Audit produit pour v0.19.27 — 2026-05-25 — testé sur le VPS (Linux x86_64, Python 3.13, uv 0.5+, tmux 3.x, fzf 0.60).*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentikos/omega-os",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.28",
|
|
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"
|