@agentikos/omega-os 0.19.32 → 0.19.34
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__/paperclip_bridge.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +102 -0
- package/omega/Agentik_Engine/omega_engine/paperclip_bridge.py +510 -0
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_Engine/tests/__pycache__/test_paperclip_bridge.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_paperclip_bridge.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_paperclip_bridge.py +139 -0
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/docs/AUDIT-V0.19.34.md +143 -0
- package/omega/Agentik_SSOT/docs/FEATURE-MATRIX.md +193 -0
- package/omega/Agentik_SSOT/docs/LAYERS.md +21 -2
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -3171,6 +3171,78 @@ def _set_active_provider(provider_id: str) -> None:
|
|
|
3171
3171
|
p.write_text(provider_id.strip() + "\n")
|
|
3172
3172
|
|
|
3173
3173
|
|
|
3174
|
+
def cmd_paperclip(args: argparse.Namespace) -> int:
|
|
3175
|
+
"""`omega paperclip {status,register,sync,start,heartbeat}` — bridge to
|
|
3176
|
+
paperclipai/paperclip (governance layer L0).
|
|
3177
|
+
|
|
3178
|
+
Lets the Paperclip web dashboard see OmegaOS's 14 agents (Hermès + 13
|
|
3179
|
+
AISB suite), every Genesis project as a workspace, and heartbeats
|
|
3180
|
+
from running tmux sessions. Paperclip stays a parallel system — we
|
|
3181
|
+
don't host Paperclip's server; we just write its config files +
|
|
3182
|
+
drop heartbeats it picks up.
|
|
3183
|
+
"""
|
|
3184
|
+
from omega_engine import paperclip_bridge as PB
|
|
3185
|
+
sub = getattr(args, "paperclip_cmd", None) or "status"
|
|
3186
|
+
|
|
3187
|
+
if sub == "status":
|
|
3188
|
+
st = PB.status()
|
|
3189
|
+
print(f" paperclip installed: {'✓' if st.paperclip_installed else '—'}")
|
|
3190
|
+
print(f" paperclip_home: {st.paperclip_home}")
|
|
3191
|
+
print(f" omegaos company: {'✓' if st.company_registered else '—'} "
|
|
3192
|
+
f"{st.company_dir}")
|
|
3193
|
+
print(f" agents registered: {st.agents_registered} / 14")
|
|
3194
|
+
print(f" workspaces: {st.workspaces_registered}")
|
|
3195
|
+
print(f" heartbeats pending: {st.heartbeats_pending}")
|
|
3196
|
+
print(f" bridge_version: {st.bridge_version}")
|
|
3197
|
+
print(f" omega_version: {st.omega_version}")
|
|
3198
|
+
if st.drift:
|
|
3199
|
+
print(f" {st.drift = !r} — run `omega paperclip register` to refresh")
|
|
3200
|
+
if not st.paperclip_installed:
|
|
3201
|
+
print()
|
|
3202
|
+
print(" paperclip not installed — opt-in CLI:")
|
|
3203
|
+
print(" omega tool install paperclipai")
|
|
3204
|
+
print(" omega paperclip register # register OmegaOS company")
|
|
3205
|
+
print(" omega paperclip start # spin up the web dashboard")
|
|
3206
|
+
return 0
|
|
3207
|
+
|
|
3208
|
+
if sub == "register":
|
|
3209
|
+
summary = PB.register(dry_run=getattr(args, "dry_run", False))
|
|
3210
|
+
for k, v in summary.items():
|
|
3211
|
+
print(f" {k}: {v}")
|
|
3212
|
+
return 0
|
|
3213
|
+
|
|
3214
|
+
if sub == "start":
|
|
3215
|
+
bind = getattr(args, "bind", None) or "loopback"
|
|
3216
|
+
try:
|
|
3217
|
+
pid = PB.start_server(bind=bind, detach=True)
|
|
3218
|
+
print(f" paperclip launched (pid {pid}, bind={bind})")
|
|
3219
|
+
print(" default URL: http://localhost:8080 — check Paperclip output")
|
|
3220
|
+
return 0
|
|
3221
|
+
except RuntimeError as exc:
|
|
3222
|
+
print(f" start failed: {exc}")
|
|
3223
|
+
return 2
|
|
3224
|
+
|
|
3225
|
+
if sub == "heartbeat":
|
|
3226
|
+
# Drop a heartbeat from the current shell — used by `dispatch-to-
|
|
3227
|
+
# session.sh` style scripts so Paperclip sees workers come up + report.
|
|
3228
|
+
from omega_engine import paperclip_bridge as PB2
|
|
3229
|
+
hb = PB2.Heartbeat(
|
|
3230
|
+
agent_id=getattr(args, "agent_id", "unknown"),
|
|
3231
|
+
project=getattr(args, "project", ""),
|
|
3232
|
+
session=getattr(args, "session", os.environ.get("TMUX_PANE", "")),
|
|
3233
|
+
status=getattr(args, "status", "alive"),
|
|
3234
|
+
summary=getattr(args, "summary", ""),
|
|
3235
|
+
cost_so_far_usd=float(getattr(args, "cost", 0.0)),
|
|
3236
|
+
omega_home=os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")),
|
|
3237
|
+
)
|
|
3238
|
+
ok = PB2.send_heartbeat(hb)
|
|
3239
|
+
print(f" heartbeat: {'✓' if ok else '✗'} {hb.agent_id} → {hb.status}")
|
|
3240
|
+
return 0 if ok else 1
|
|
3241
|
+
|
|
3242
|
+
print(f"unknown paperclip subcommand: {sub}")
|
|
3243
|
+
return 2
|
|
3244
|
+
|
|
3245
|
+
|
|
3174
3246
|
def cmd_scrape(args: argparse.Namespace) -> int:
|
|
3175
3247
|
"""`omega scrape <url> [--engine cloak|scrapling] [--out file]` — scraper.
|
|
3176
3248
|
|
|
@@ -4453,6 +4525,36 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
4453
4525
|
help="provider id (omit to print current + available)")
|
|
4454
4526
|
p_sw.set_defaults(fn=cmd_switch)
|
|
4455
4527
|
|
|
4528
|
+
# `omega paperclip` — governance bridge to paperclipai/paperclip (L0).
|
|
4529
|
+
p_pc = sub.add_parser(
|
|
4530
|
+
"paperclip",
|
|
4531
|
+
help="bridge to Paperclip governance layer (register OmegaOS as "
|
|
4532
|
+
"a Paperclip company, sync projects, send heartbeats)",
|
|
4533
|
+
)
|
|
4534
|
+
p_pc.set_defaults(fn=cmd_paperclip)
|
|
4535
|
+
pc_sub = p_pc.add_subparsers(dest="paperclip_cmd")
|
|
4536
|
+
pc_sub.add_parser("status", help="show bridge health + counts")
|
|
4537
|
+
p_pcr = pc_sub.add_parser("register",
|
|
4538
|
+
help="write Paperclip company.json + agents/<id>.json + workspaces/")
|
|
4539
|
+
p_pcr.add_argument("--dry-run", action="store_true")
|
|
4540
|
+
p_pcs = pc_sub.add_parser("start",
|
|
4541
|
+
help="launch the Paperclip web dashboard (npx onboard)")
|
|
4542
|
+
p_pcs.add_argument("--bind", choices=["loopback", "lan", "tailnet"],
|
|
4543
|
+
default="loopback")
|
|
4544
|
+
p_pch = pc_sub.add_parser("heartbeat",
|
|
4545
|
+
help="send a heartbeat from a tmux session (script callable)")
|
|
4546
|
+
p_pch.add_argument("--agent-id", required=True,
|
|
4547
|
+
help="hermes / niobe / oracle / construct / …")
|
|
4548
|
+
p_pch.add_argument("--project", default="",
|
|
4549
|
+
help="project slug if applicable")
|
|
4550
|
+
p_pch.add_argument("--session", default="",
|
|
4551
|
+
help="tmux session name (defaults to $TMUX_PANE)")
|
|
4552
|
+
p_pch.add_argument("--status", default="alive",
|
|
4553
|
+
choices=["alive", "working", "done_clean", "failed"])
|
|
4554
|
+
p_pch.add_argument("--summary", default="")
|
|
4555
|
+
p_pch.add_argument("--cost", default="0",
|
|
4556
|
+
help="cost so far in USD (float)")
|
|
4557
|
+
|
|
4456
4558
|
# `omega scrape <url>` — official OmegaOS web scraper (CloakBrowser
|
|
4457
4559
|
# default, Scrapling optional). Both engines pre-installed at step 40
|
|
4458
4560
|
# when their catalog entry is `recommended: true`.
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
"""Paperclip ↔ OmegaOS bridge (v0.19.33).
|
|
2
|
+
|
|
3
|
+
Registers the OmegaOS agent hierarchy (Hermès + 13 AISB suite) as
|
|
4
|
+
Paperclip agents, mirrors Genesis projects into Paperclip workspaces,
|
|
5
|
+
and sends heartbeats from our tmux sessions into Paperclip's wakeup
|
|
6
|
+
queue. After registration, the Paperclip web dashboard surfaces every
|
|
7
|
+
OmegaOS agent / project / mission with its full org-chart + budget +
|
|
8
|
+
audit trail.
|
|
9
|
+
|
|
10
|
+
Layered model after this bridge lands:
|
|
11
|
+
|
|
12
|
+
Layer 0 — PAPERCLIP governance + org-chart + budgets + UI
|
|
13
|
+
(https://paperclip.dev)
|
|
14
|
+
Layer 1 — HUMAN Telegram / TUI / CLI
|
|
15
|
+
Layer 2 — HERMÈS meta-companion (Anthropic API, own bot)
|
|
16
|
+
Layer 3 — AISB (intake) Telegram-first classifier → oracle dispatch
|
|
17
|
+
Layer 4 — ORACLE per-project planner (Claude Max OAuth)
|
|
18
|
+
Layer 5 — WORKERS executors (one per subtask, .done.json)
|
|
19
|
+
|
|
20
|
+
Paperclip surfaces L1–L5 in its dashboard. Hermès still operates on its
|
|
21
|
+
own Anthropic budget; AISB/Oracle/Workers stay on Max OAuth. Paperclip
|
|
22
|
+
sees BOTH credential domains via its "agent bring own runtime" model.
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
import shutil
|
|
29
|
+
import subprocess
|
|
30
|
+
import time
|
|
31
|
+
from dataclasses import asdict, dataclass, field
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# ---------------------------------------------------------------------------
|
|
37
|
+
# The OmegaOS canonical agent hierarchy
|
|
38
|
+
# ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
# Hermès sits ABOVE AISB in the OmegaOS architecture but reports to no-one
|
|
41
|
+
# inside Paperclip's org chart — it's the "COO" of the company.
|
|
42
|
+
HERMES_AGENT = {
|
|
43
|
+
"id": "hermes",
|
|
44
|
+
"title": "Hermès — Meta-Companion / COO",
|
|
45
|
+
"role": "meta",
|
|
46
|
+
"runtime": "anthropic-api",
|
|
47
|
+
"vault_secret": "ANTHROPIC_API_KEY_HERMES",
|
|
48
|
+
"model_provider": "anthropic",
|
|
49
|
+
"default_model": "claude-opus-4-7",
|
|
50
|
+
"reports_to": None,
|
|
51
|
+
"description": (
|
|
52
|
+
"L2 autonomous companion. Reads Omega state, proposes missions, "
|
|
53
|
+
"dispatches them DOWN into AISB. Runs on its own paid Anthropic "
|
|
54
|
+
"budget — never drains Claude Max."
|
|
55
|
+
),
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# The 13-agent AISB suite — pulled from the canonical
|
|
60
|
+
# bootstrap/templates/aisb/ tree. Each Paperclip agent maps 1:1 with one
|
|
61
|
+
# .md persona file in that tree.
|
|
62
|
+
AISB_AGENTS: list[dict[str, Any]] = [
|
|
63
|
+
{
|
|
64
|
+
"id": "niobe",
|
|
65
|
+
"title": "Niobe — AISB matriarch / intake",
|
|
66
|
+
"role": "intake",
|
|
67
|
+
"reports_to": "hermes",
|
|
68
|
+
"description": (
|
|
69
|
+
"Telegram-first classifier. Reads every inbound message, "
|
|
70
|
+
"decides Simple/Medium/Complex/Epic, dispatches to an oracle "
|
|
71
|
+
"with a structured brief."
|
|
72
|
+
),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "oracle",
|
|
76
|
+
"title": "Oracle — per-project planner",
|
|
77
|
+
"role": "planner",
|
|
78
|
+
"reports_to": "niobe",
|
|
79
|
+
"description": (
|
|
80
|
+
"Owns project context. Reads the brief + project CLAUDE.md, "
|
|
81
|
+
"decomposes into worker subtasks with verify_cmd, dispatches "
|
|
82
|
+
"and verifies completion."
|
|
83
|
+
),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "keymaker",
|
|
87
|
+
"title": "Keymaker — system planner / DAG",
|
|
88
|
+
"role": "system-planner",
|
|
89
|
+
"reports_to": "niobe",
|
|
90
|
+
"description": (
|
|
91
|
+
"Cross-project planning. Builds dependency DAGs for multi-"
|
|
92
|
+
"project missions (Genesis features, refonte programs)."
|
|
93
|
+
),
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "construct",
|
|
97
|
+
"title": "Construct — worker executor",
|
|
98
|
+
"role": "worker",
|
|
99
|
+
"reports_to": "oracle",
|
|
100
|
+
"description": (
|
|
101
|
+
"Short-lived. Receives PLAN + FILES IN SCOPE + DONE CRITERIA + "
|
|
102
|
+
"VERIFY COMMAND. Executes step-by-step. Writes .done.json."
|
|
103
|
+
),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "seraph",
|
|
107
|
+
"title": "Seraph — quality gate / mission auditor",
|
|
108
|
+
"role": "auditor",
|
|
109
|
+
"reports_to": "niobe",
|
|
110
|
+
"description": (
|
|
111
|
+
"Runs 1–3 Quality Arsenal audits at close-gate. Requires "
|
|
112
|
+
"≥85/100 to approve. Falsifies before approving."
|
|
113
|
+
),
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "smith",
|
|
117
|
+
"title": "Smith — learning + reflection",
|
|
118
|
+
"role": "educator",
|
|
119
|
+
"reports_to": "niobe",
|
|
120
|
+
"description": (
|
|
121
|
+
"Writes lessons (approved missions) + mistakes (rejected ≥2 "
|
|
122
|
+
"retries) to SQLite FTS5 memory. Next workers boot with the "
|
|
123
|
+
"5 most-recent lessons for the project."
|
|
124
|
+
),
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "link",
|
|
128
|
+
"title": "Link — secure delivery / IO",
|
|
129
|
+
"role": "io",
|
|
130
|
+
"reports_to": "niobe",
|
|
131
|
+
"description": (
|
|
132
|
+
"Handles all outbound (Telegram, email, webhooks) + signed "
|
|
133
|
+
"inbound. HMAC verification, replay window enforcement."
|
|
134
|
+
),
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "merovingian",
|
|
138
|
+
"title": "Merovingian — librarian / RAG",
|
|
139
|
+
"role": "librarian",
|
|
140
|
+
"reports_to": "niobe",
|
|
141
|
+
"description": (
|
|
142
|
+
"Owns the RAG corpus (hybrid + graph + agentic). Surfaces "
|
|
143
|
+
"context to other agents on demand."
|
|
144
|
+
),
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "morpheus",
|
|
148
|
+
"title": "Morpheus — executor coordinator",
|
|
149
|
+
"role": "coordinator",
|
|
150
|
+
"reports_to": "oracle",
|
|
151
|
+
"description": (
|
|
152
|
+
"Orchestrates parallel workers. Dispatches multi-worker waves, "
|
|
153
|
+
"handles concurrency + dependencies + retry."
|
|
154
|
+
),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"id": "architect",
|
|
158
|
+
"title": "Architect — system design / refactor",
|
|
159
|
+
"role": "architect",
|
|
160
|
+
"reports_to": "oracle",
|
|
161
|
+
"description": (
|
|
162
|
+
"Reads the codebase, finds entities, proposes refactors. "
|
|
163
|
+
"Owns architectural decisions, never executes them directly."
|
|
164
|
+
),
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"id": "neo",
|
|
168
|
+
"title": "Neo — uptime + recovery",
|
|
169
|
+
"role": "ops",
|
|
170
|
+
"reports_to": "niobe",
|
|
171
|
+
"description": (
|
|
172
|
+
"Monitors sessions, resource usage, alert thresholds. "
|
|
173
|
+
"Triggers /resurrect on stall. Never decides — just notifies."
|
|
174
|
+
),
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "pythia",
|
|
178
|
+
"title": "Pythia — watcher / proposals (read-only)",
|
|
179
|
+
"role": "watcher",
|
|
180
|
+
"reports_to": "niobe",
|
|
181
|
+
"description": (
|
|
182
|
+
"Weekly read-only scan of platform docs + GitHub. Produces "
|
|
183
|
+
"gap-analysis proposals. Reports to Architect for triage. "
|
|
184
|
+
"NEVER touches billing/auth scopes."
|
|
185
|
+
),
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "zion",
|
|
189
|
+
"title": "Zion — dashboard / metrics",
|
|
190
|
+
"role": "metrics",
|
|
191
|
+
"reports_to": "niobe",
|
|
192
|
+
"description": (
|
|
193
|
+
"Weekly dashboard generator. Pulls .done.json + audit history "
|
|
194
|
+
"+ session metrics. Produces formatted reports."
|
|
195
|
+
),
|
|
196
|
+
},
|
|
197
|
+
]
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def all_agents() -> list[dict[str, Any]]:
|
|
201
|
+
"""Return Hermès + the 13 AISB suite — 14 agents total."""
|
|
202
|
+
return [HERMES_AGENT] + AISB_AGENTS
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
# ---------------------------------------------------------------------------
|
|
206
|
+
# Paperclip filesystem layout (canonical paths under PAPERCLIP_HOME)
|
|
207
|
+
# ---------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def paperclip_home() -> Path:
|
|
211
|
+
"""Where Paperclip stores its agent configs + DB + secrets.
|
|
212
|
+
|
|
213
|
+
Resolution order:
|
|
214
|
+
1. ``PAPERCLIP_HOME`` env var (operator override)
|
|
215
|
+
2. ``~/.paperclip`` (typical Mac/Linux)
|
|
216
|
+
3. ``$XDG_DATA_HOME/paperclip`` (XDG-conformant Linux)
|
|
217
|
+
"""
|
|
218
|
+
env = os.environ.get("PAPERCLIP_HOME")
|
|
219
|
+
if env:
|
|
220
|
+
return Path(env).expanduser()
|
|
221
|
+
home = Path.home() / ".paperclip"
|
|
222
|
+
return home
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def omegaos_company_dir(home: Path | None = None) -> Path:
|
|
226
|
+
"""Where OmegaOS's company config lives under PAPERCLIP_HOME."""
|
|
227
|
+
base = home or paperclip_home()
|
|
228
|
+
return base / "companies" / "omegaos"
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
# ---------------------------------------------------------------------------
|
|
232
|
+
# Heartbeat sender
|
|
233
|
+
# ---------------------------------------------------------------------------
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
@dataclass
|
|
237
|
+
class Heartbeat:
|
|
238
|
+
"""One heartbeat — sent from an OmegaOS tmux session to Paperclip."""
|
|
239
|
+
|
|
240
|
+
agent_id: str # "construct" / "oracle" / "hermes" / …
|
|
241
|
+
project: str # OmegaOS slug
|
|
242
|
+
session: str # tmux session name
|
|
243
|
+
status: str # "alive" | "working" | "done_clean" | "failed"
|
|
244
|
+
summary: str = "" # 1-line description of current work
|
|
245
|
+
timestamp: float = field(default_factory=time.time)
|
|
246
|
+
cost_so_far_usd: float = 0.0
|
|
247
|
+
omega_home: str = ""
|
|
248
|
+
|
|
249
|
+
def to_dict(self) -> dict[str, Any]:
|
|
250
|
+
return asdict(self)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def send_heartbeat(
|
|
254
|
+
hb: Heartbeat,
|
|
255
|
+
*,
|
|
256
|
+
paperclip_url: str = "",
|
|
257
|
+
paperclip_dir: Path | None = None,
|
|
258
|
+
) -> bool:
|
|
259
|
+
"""Send one heartbeat to Paperclip.
|
|
260
|
+
|
|
261
|
+
Two transport modes:
|
|
262
|
+
1. HTTP POST to ``paperclip_url + /api/heartbeat`` when configured
|
|
263
|
+
2. Filesystem drop into
|
|
264
|
+
``$PAPERCLIP_HOME/companies/omegaos/heartbeats/<agent>-<ts>.json``
|
|
265
|
+
when there's no live Paperclip server (offline-friendly).
|
|
266
|
+
|
|
267
|
+
Returns True when the heartbeat was accepted/recorded.
|
|
268
|
+
"""
|
|
269
|
+
payload = hb.to_dict()
|
|
270
|
+
if paperclip_url:
|
|
271
|
+
try:
|
|
272
|
+
import urllib.request as _urllib
|
|
273
|
+
import urllib.error as _ue
|
|
274
|
+
req = _urllib.Request(
|
|
275
|
+
f"{paperclip_url.rstrip('/')}/api/heartbeat",
|
|
276
|
+
data=json.dumps(payload).encode(),
|
|
277
|
+
headers={"Content-Type": "application/json"},
|
|
278
|
+
method="POST",
|
|
279
|
+
)
|
|
280
|
+
with _urllib.urlopen(req, timeout=5): # noqa: S310
|
|
281
|
+
return True
|
|
282
|
+
except _ue.URLError:
|
|
283
|
+
pass
|
|
284
|
+
except Exception: # noqa: BLE001
|
|
285
|
+
pass
|
|
286
|
+
# Filesystem fallback — Paperclip will pick these up on next boot.
|
|
287
|
+
target_dir = (paperclip_dir or omegaos_company_dir()) / "heartbeats"
|
|
288
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
289
|
+
fname = f"{hb.agent_id}-{int(hb.timestamp)}-{os.getpid()}.json"
|
|
290
|
+
(target_dir / fname).write_text(json.dumps(payload, indent=2))
|
|
291
|
+
return True
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
# ---------------------------------------------------------------------------
|
|
295
|
+
# Registration — write Paperclip's agent + company config from OmegaOS
|
|
296
|
+
# ---------------------------------------------------------------------------
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def register(*,
|
|
300
|
+
omega_home: Path | str | None = None,
|
|
301
|
+
paperclip_dir: Path | None = None,
|
|
302
|
+
dry_run: bool = False) -> dict[str, Any]:
|
|
303
|
+
"""Idempotently write Paperclip's `companies/omegaos/` tree from
|
|
304
|
+
the OmegaOS state.
|
|
305
|
+
|
|
306
|
+
Writes:
|
|
307
|
+
$PAPERCLIP_HOME/companies/omegaos/company.json ← top-level config
|
|
308
|
+
$PAPERCLIP_HOME/companies/omegaos/agents/<id>.json ← per-agent (14 files)
|
|
309
|
+
$PAPERCLIP_HOME/companies/omegaos/workspaces/<slug>.json ← per-project
|
|
310
|
+
$PAPERCLIP_HOME/companies/omegaos/.bridge-version ← versioning marker
|
|
311
|
+
|
|
312
|
+
Returns a summary dict for the caller (and the omega CLI).
|
|
313
|
+
"""
|
|
314
|
+
home = Path(omega_home) if omega_home else Path(
|
|
315
|
+
os.environ.get("OMEGA_HOME", str(Path.home() / "Omega"))
|
|
316
|
+
)
|
|
317
|
+
pdir = paperclip_dir or omegaos_company_dir()
|
|
318
|
+
summary = {
|
|
319
|
+
"company": "omegaos",
|
|
320
|
+
"paperclip_home": str(pdir.parent.parent),
|
|
321
|
+
"company_dir": str(pdir),
|
|
322
|
+
"agents_written": 0,
|
|
323
|
+
"workspaces_written": 0,
|
|
324
|
+
"dry_run": dry_run,
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
agents = all_agents()
|
|
328
|
+
workspaces = _discover_projects(home)
|
|
329
|
+
|
|
330
|
+
if not dry_run:
|
|
331
|
+
pdir.mkdir(parents=True, exist_ok=True)
|
|
332
|
+
(pdir / "agents").mkdir(exist_ok=True)
|
|
333
|
+
(pdir / "workspaces").mkdir(exist_ok=True)
|
|
334
|
+
(pdir / "heartbeats").mkdir(exist_ok=True)
|
|
335
|
+
|
|
336
|
+
# company.json — the master config
|
|
337
|
+
company = {
|
|
338
|
+
"id": "omegaos",
|
|
339
|
+
"name": "Omega OS",
|
|
340
|
+
"tagline": (
|
|
341
|
+
"Verified-completion agentic operating system. "
|
|
342
|
+
"Hermès above, AISB intake, Oracle plans, Workers execute."
|
|
343
|
+
),
|
|
344
|
+
"homepage": "https://github.com/agentik-os/OmegaOS",
|
|
345
|
+
"credential_domains": [
|
|
346
|
+
{
|
|
347
|
+
"id": "claude-max-oauth",
|
|
348
|
+
"label": "Claude Max OAuth (AISB+Oracle+Workers)",
|
|
349
|
+
"source": "~/.claude/.credentials.json",
|
|
350
|
+
"cost_per_call": 0.0,
|
|
351
|
+
"notes": "OAuth token for Claude Code Max — covered by sub",
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"id": "anthropic-api-hermes",
|
|
355
|
+
"label": "Anthropic API (Hermès only)",
|
|
356
|
+
"vault_ref": "ANTHROPIC_API_KEY_HERMES",
|
|
357
|
+
"notes": "Hermès's own paid budget, isolated from Max",
|
|
358
|
+
},
|
|
359
|
+
],
|
|
360
|
+
"verified_completion": {
|
|
361
|
+
"signal": ".done.json",
|
|
362
|
+
"status_values": ["done_clean", "pending", "failed"],
|
|
363
|
+
"audit_gate": "Seraph runs 1-3 Quality Arsenal audits ≥85/100",
|
|
364
|
+
},
|
|
365
|
+
"agent_count": len(agents),
|
|
366
|
+
"workspace_count": len(workspaces),
|
|
367
|
+
"bridge_version": _bridge_version(),
|
|
368
|
+
"registered_at": time.time(),
|
|
369
|
+
}
|
|
370
|
+
(pdir / "company.json").write_text(json.dumps(company, indent=2) + "\n")
|
|
371
|
+
|
|
372
|
+
# Per-agent files
|
|
373
|
+
for agent in agents:
|
|
374
|
+
(pdir / "agents" / f"{agent['id']}.json").write_text(
|
|
375
|
+
json.dumps(agent, indent=2) + "\n"
|
|
376
|
+
)
|
|
377
|
+
summary["agents_written"] += 1
|
|
378
|
+
|
|
379
|
+
# Per-workspace (project) files
|
|
380
|
+
for ws in workspaces:
|
|
381
|
+
(pdir / "workspaces" / f"{ws['slug']}.json").write_text(
|
|
382
|
+
json.dumps(ws, indent=2) + "\n"
|
|
383
|
+
)
|
|
384
|
+
summary["workspaces_written"] += 1
|
|
385
|
+
|
|
386
|
+
# Bridge version marker
|
|
387
|
+
(pdir / ".bridge-version").write_text(_bridge_version() + "\n")
|
|
388
|
+
else:
|
|
389
|
+
summary["agents_written"] = len(agents)
|
|
390
|
+
summary["workspaces_written"] = len(workspaces)
|
|
391
|
+
|
|
392
|
+
return summary
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def _bridge_version() -> str:
|
|
396
|
+
"""Pin to the OmegaOS engine version that wrote the bridge config."""
|
|
397
|
+
try:
|
|
398
|
+
from omega_engine import __version__
|
|
399
|
+
return __version__
|
|
400
|
+
except ImportError:
|
|
401
|
+
return "unknown"
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
def _discover_projects(omega_home: Path) -> list[dict[str, Any]]:
|
|
405
|
+
"""Walk Agentik_Coding/projects/<slug>/ and return Paperclip-shape
|
|
406
|
+
workspace dicts."""
|
|
407
|
+
projects_root = omega_home / "Agentik_Coding" / "projects"
|
|
408
|
+
out: list[dict[str, Any]] = []
|
|
409
|
+
if not projects_root.is_dir():
|
|
410
|
+
return out
|
|
411
|
+
for entry in sorted(projects_root.iterdir()):
|
|
412
|
+
if not entry.is_dir():
|
|
413
|
+
continue
|
|
414
|
+
slug = entry.name
|
|
415
|
+
project_yaml = entry / "PROJECT.yaml"
|
|
416
|
+
meta: dict[str, Any] = {"slug": slug, "path": str(entry)}
|
|
417
|
+
if project_yaml.exists():
|
|
418
|
+
try:
|
|
419
|
+
import yaml as _yaml
|
|
420
|
+
meta.update(_yaml.safe_load(project_yaml.read_text()) or {})
|
|
421
|
+
except Exception: # noqa: BLE001
|
|
422
|
+
pass
|
|
423
|
+
# Paperclip "workspace" shape
|
|
424
|
+
out.append({
|
|
425
|
+
"id": slug,
|
|
426
|
+
"slug": slug,
|
|
427
|
+
"title": meta.get("title") or slug,
|
|
428
|
+
"phase": meta.get("phase") or "unknown",
|
|
429
|
+
"stack": meta.get("stack") or {},
|
|
430
|
+
"path": str(entry),
|
|
431
|
+
"registered_at": time.time(),
|
|
432
|
+
})
|
|
433
|
+
return out
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
# ---------------------------------------------------------------------------
|
|
437
|
+
# Status — does Paperclip know about OmegaOS, and how fresh?
|
|
438
|
+
# ---------------------------------------------------------------------------
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
@dataclass
|
|
442
|
+
class BridgeStatus:
|
|
443
|
+
paperclip_installed: bool
|
|
444
|
+
paperclip_home: str
|
|
445
|
+
company_dir: str
|
|
446
|
+
company_registered: bool
|
|
447
|
+
bridge_version: str
|
|
448
|
+
omega_version: str
|
|
449
|
+
agents_registered: int
|
|
450
|
+
workspaces_registered: int
|
|
451
|
+
heartbeats_pending: int
|
|
452
|
+
drift: bool # bridge_version != omega_version
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def status() -> BridgeStatus:
|
|
456
|
+
"""Return current bridge state — used by `omega paperclip status` +
|
|
457
|
+
`omega doctor`."""
|
|
458
|
+
pdir = omegaos_company_dir()
|
|
459
|
+
binary_present = bool(shutil.which("paperclip"))
|
|
460
|
+
bridge_v = ""
|
|
461
|
+
omega_v = _bridge_version()
|
|
462
|
+
company_present = (pdir / "company.json").exists()
|
|
463
|
+
agents_n = len(list((pdir / "agents").glob("*.json"))) if pdir.exists() else 0
|
|
464
|
+
workspaces_n = (
|
|
465
|
+
len(list((pdir / "workspaces").glob("*.json"))) if pdir.exists() else 0
|
|
466
|
+
)
|
|
467
|
+
heartbeats_n = (
|
|
468
|
+
len(list((pdir / "heartbeats").glob("*.json"))) if pdir.exists() else 0
|
|
469
|
+
)
|
|
470
|
+
if (pdir / ".bridge-version").exists():
|
|
471
|
+
bridge_v = (pdir / ".bridge-version").read_text().strip()
|
|
472
|
+
return BridgeStatus(
|
|
473
|
+
paperclip_installed=binary_present,
|
|
474
|
+
paperclip_home=str(paperclip_home()),
|
|
475
|
+
company_dir=str(pdir),
|
|
476
|
+
company_registered=company_present,
|
|
477
|
+
bridge_version=bridge_v or "(not yet registered)",
|
|
478
|
+
omega_version=omega_v,
|
|
479
|
+
agents_registered=agents_n,
|
|
480
|
+
workspaces_registered=workspaces_n,
|
|
481
|
+
heartbeats_pending=heartbeats_n,
|
|
482
|
+
drift=bool(bridge_v) and bridge_v != omega_v,
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
# ---------------------------------------------------------------------------
|
|
487
|
+
# Paperclip server lifecycle (start/stop the npx onboard process)
|
|
488
|
+
# ---------------------------------------------------------------------------
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def start_server(bind: str = "loopback", *, detach: bool = True) -> int:
|
|
492
|
+
"""Launch the Paperclip onboard server.
|
|
493
|
+
|
|
494
|
+
bind ∈ {"loopback", "lan", "tailnet"}.
|
|
495
|
+
Returns the PID (or 0 if synchronous run requested via detach=False).
|
|
496
|
+
"""
|
|
497
|
+
if not shutil.which("npx"):
|
|
498
|
+
raise RuntimeError("npx not on PATH — install Node 20+")
|
|
499
|
+
args = ["npx", "-y", "paperclipai", "onboard", "--yes"]
|
|
500
|
+
if bind == "lan":
|
|
501
|
+
args += ["--bind", "lan"]
|
|
502
|
+
elif bind == "tailnet":
|
|
503
|
+
args += ["--bind", "tailnet"]
|
|
504
|
+
if detach:
|
|
505
|
+
proc = subprocess.Popen( # noqa: S603
|
|
506
|
+
args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
|
507
|
+
start_new_session=True,
|
|
508
|
+
)
|
|
509
|
+
return proc.pid
|
|
510
|
+
return subprocess.call(args)
|
package/omega/Agentik_Engine/tests/__pycache__/test_paperclip_bridge.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""Regression tests for omega_engine.paperclip_bridge — locks in the
|
|
2
|
+
14-agent contract and the reporting-line invariants documented in
|
|
3
|
+
FEATURE-MATRIX.md §8 (AISB rules)."""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import tempfile
|
|
8
|
+
import unittest
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from omega_engine import paperclip_bridge as P
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestAgentInventory(unittest.TestCase):
|
|
15
|
+
"""Lock in the AISB contract — 14 agents total, fixed reporting."""
|
|
16
|
+
|
|
17
|
+
def test_exactly_14_agents(self):
|
|
18
|
+
"""Hermès + 13 AISB suite = 14. Not 13, not 15."""
|
|
19
|
+
self.assertEqual(len(P.all_agents()), 14,
|
|
20
|
+
"the AISB contract requires exactly 14 agents — "
|
|
21
|
+
"if you added/removed one, update FEATURE-MATRIX.md §8 first")
|
|
22
|
+
|
|
23
|
+
def test_hermes_first_and_top(self):
|
|
24
|
+
agents = P.all_agents()
|
|
25
|
+
self.assertEqual(agents[0]["id"], "hermes")
|
|
26
|
+
self.assertIsNone(agents[0]["reports_to"],
|
|
27
|
+
"Hermès must be at the top of the org chart")
|
|
28
|
+
|
|
29
|
+
def test_aisb_suite_has_13(self):
|
|
30
|
+
self.assertEqual(len(P.AISB_AGENTS), 13)
|
|
31
|
+
|
|
32
|
+
def test_all_reporting_lines_valid(self):
|
|
33
|
+
"""Every non-None reports_to must point to an actual agent_id."""
|
|
34
|
+
agents = P.all_agents()
|
|
35
|
+
ids = {a["id"] for a in agents}
|
|
36
|
+
for a in agents:
|
|
37
|
+
rt = a.get("reports_to")
|
|
38
|
+
if rt is not None:
|
|
39
|
+
self.assertIn(rt, ids,
|
|
40
|
+
f"{a['id']} reports to {rt!r} which is not in the catalog")
|
|
41
|
+
|
|
42
|
+
def test_niobe_reports_to_hermes(self):
|
|
43
|
+
niobe = next(a for a in P.AISB_AGENTS if a["id"] == "niobe")
|
|
44
|
+
self.assertEqual(niobe["reports_to"], "hermes")
|
|
45
|
+
|
|
46
|
+
def test_oracle_reports_to_niobe(self):
|
|
47
|
+
oracle = next(a for a in P.AISB_AGENTS if a["id"] == "oracle")
|
|
48
|
+
self.assertEqual(oracle["reports_to"], "niobe")
|
|
49
|
+
|
|
50
|
+
def test_construct_reports_to_oracle(self):
|
|
51
|
+
c = next(a for a in P.AISB_AGENTS if a["id"] == "construct")
|
|
52
|
+
self.assertEqual(c["reports_to"], "oracle")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class TestCredentialIsolation(unittest.TestCase):
|
|
56
|
+
"""L0-L5 credential domains must not bleed. Specifically:
|
|
57
|
+
- Hermès uses ANTHROPIC_API_KEY_HERMES (vault)
|
|
58
|
+
- The 13 AISB agents must NOT declare any Anthropic API key
|
|
59
|
+
(they share Claude Max OAuth from ~/.claude/.credentials.json)."""
|
|
60
|
+
|
|
61
|
+
def test_hermes_uses_anthropic_key(self):
|
|
62
|
+
self.assertEqual(P.HERMES_AGENT["vault_secret"],
|
|
63
|
+
"ANTHROPIC_API_KEY_HERMES")
|
|
64
|
+
self.assertEqual(P.HERMES_AGENT["runtime"], "anthropic-api")
|
|
65
|
+
|
|
66
|
+
def test_aisb_agents_do_not_declare_api_keys(self):
|
|
67
|
+
for a in P.AISB_AGENTS:
|
|
68
|
+
self.assertNotIn("vault_secret", a,
|
|
69
|
+
f"{a['id']} must not declare its own API key — AISB+Oracle+"
|
|
70
|
+
"Workers share the Claude Max OAuth at the engine level")
|
|
71
|
+
self.assertNotIn("runtime", a,
|
|
72
|
+
f"{a['id']} must not declare a runtime — runs as a "
|
|
73
|
+
"Claude Code subprocess under Max OAuth")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class TestRegisterDryRun(unittest.TestCase):
|
|
77
|
+
"""The register() entry point — dry-run mode must report what it
|
|
78
|
+
would write without touching disk."""
|
|
79
|
+
|
|
80
|
+
def test_dry_run_writes_nothing_to_disk(self):
|
|
81
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
82
|
+
pdir = Path(tmp) / "companies" / "omegaos"
|
|
83
|
+
summary = P.register(paperclip_dir=pdir, dry_run=True)
|
|
84
|
+
self.assertFalse(pdir.exists(),
|
|
85
|
+
"dry_run=True must not create the company dir")
|
|
86
|
+
self.assertEqual(summary["agents_written"], 14)
|
|
87
|
+
|
|
88
|
+
def test_register_writes_14_agent_files(self):
|
|
89
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
90
|
+
pdir = Path(tmp) / "companies" / "omegaos"
|
|
91
|
+
summary = P.register(paperclip_dir=pdir, dry_run=False)
|
|
92
|
+
# company.json
|
|
93
|
+
self.assertTrue((pdir / "company.json").exists())
|
|
94
|
+
company = json.loads((pdir / "company.json").read_text())
|
|
95
|
+
self.assertEqual(company["id"], "omegaos")
|
|
96
|
+
self.assertEqual(company["agent_count"], 14)
|
|
97
|
+
# 14 agent files
|
|
98
|
+
agent_files = list((pdir / "agents").glob("*.json"))
|
|
99
|
+
self.assertEqual(len(agent_files), 14,
|
|
100
|
+
f"register must write 14 agent files (got {len(agent_files)})")
|
|
101
|
+
# .bridge-version
|
|
102
|
+
self.assertTrue((pdir / ".bridge-version").exists())
|
|
103
|
+
self.assertEqual(summary["agents_written"], 14)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class TestHeartbeat(unittest.TestCase):
|
|
107
|
+
"""Heartbeat must drop a JSON file when no HTTP server is configured."""
|
|
108
|
+
|
|
109
|
+
def test_filesystem_fallback_writes_heartbeat(self):
|
|
110
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
111
|
+
pdir = Path(tmp) / "companies" / "omegaos"
|
|
112
|
+
hb = P.Heartbeat(
|
|
113
|
+
agent_id="construct",
|
|
114
|
+
project="test-project",
|
|
115
|
+
session="test-session",
|
|
116
|
+
status="working",
|
|
117
|
+
summary="step 2/5 in progress",
|
|
118
|
+
)
|
|
119
|
+
ok = P.send_heartbeat(hb, paperclip_dir=pdir)
|
|
120
|
+
self.assertTrue(ok)
|
|
121
|
+
files = list((pdir / "heartbeats").glob("construct-*.json"))
|
|
122
|
+
self.assertEqual(len(files), 1)
|
|
123
|
+
payload = json.loads(files[0].read_text())
|
|
124
|
+
self.assertEqual(payload["agent_id"], "construct")
|
|
125
|
+
self.assertEqual(payload["status"], "working")
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class TestStatus(unittest.TestCase):
|
|
129
|
+
"""status() must work even when nothing is registered yet."""
|
|
130
|
+
|
|
131
|
+
def test_status_safe_on_fresh_machine(self):
|
|
132
|
+
# Just call it — should not raise even if PAPERCLIP_HOME is bare.
|
|
133
|
+
st = P.status()
|
|
134
|
+
self.assertIsNotNone(st)
|
|
135
|
+
self.assertEqual(st.omega_version, P._bridge_version())
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
if __name__ == "__main__":
|
|
139
|
+
unittest.main()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.19.
|
|
1
|
+
0.19.34
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# OmegaOS v0.19.34 — deep audit, all bugs & incoherences logged
|
|
2
|
+
|
|
3
|
+
> Run on 2026-05-25 after the v0.19.33 Paperclip bridge ship.
|
|
4
|
+
> Method: parallel checks (pytest, shell syntax, imports, parsers,
|
|
5
|
+
> duplicate scan, version cross-ref, catalog parse, bridge invariants).
|
|
6
|
+
|
|
7
|
+
## 1. Clean (passed)
|
|
8
|
+
|
|
9
|
+
| Check | Result |
|
|
10
|
+
|---|---|
|
|
11
|
+
| pytest full suite | **612 passed** (599 + 13 new bridge tests) |
|
|
12
|
+
| Shell syntax `install.sh + common.sh + steps.sh` | ✓ |
|
|
13
|
+
| 14 internal Python modules importable | ✓ |
|
|
14
|
+
| Version coherent: `__init__.py / pyproject.toml / package.json / VERSION` | 0.19.34 |
|
|
15
|
+
| 4 catalog YAMLs parse cleanly | mcp 16 / plugins 11 / clis 28 / providers 16 |
|
|
16
|
+
| 49 omega subcommands registered in argparse | ✓ |
|
|
17
|
+
| tmux config 3-char hex regression | 0 occurrences (v0.19.28 fix holds) |
|
|
18
|
+
| Paperclip bridge: 14 agents, hermes top, reporting lines | ✓ |
|
|
19
|
+
| Personas: all 8 LLM filenames written by `write_all_personas` | ✓ |
|
|
20
|
+
| Hermès credential isolation (ANTHROPIC_API_KEY_HERMES) | ✓ |
|
|
21
|
+
| Filesystem fallback heartbeat | ✓ |
|
|
22
|
+
|
|
23
|
+
## 2. Bugs found + fixed in v0.19.34
|
|
24
|
+
|
|
25
|
+
| # | Bug | Severity | Fix |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| 1 | `LAYERS.md` didn't mention Paperclip even though the bridge shipped in v0.19.33 | doc gap | Added a v0.19.33+ section at the top with the L0 Paperclip diagram + pointer to FEATURE-MATRIX.md |
|
|
28
|
+
| 2 | No regression tests for `paperclip_bridge` — bridge invariants (14 agents, reporting lines, credential isolation) lived only in code | test gap | Added `tests/test_paperclip_bridge.py` (13 tests, all passing) covering: agent inventory, reporting lines per agent, credential isolation (AISB must NOT declare API keys), dry-run safety, register writes 14 files, heartbeat filesystem fallback, status() on fresh machine |
|
|
29
|
+
|
|
30
|
+
## 3. Code smells (NOT runtime bugs — flagged for future cleanup)
|
|
31
|
+
|
|
32
|
+
### 3.1 `_omega_home` duplicated 10× across modules
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
audit_gate.py def _omega_home() -> Path
|
|
36
|
+
handoff.py def _omega_home(home: str | Path | None) -> Path
|
|
37
|
+
tools.py def _omega_home(explicit: str | Path | None = None) -> Path
|
|
38
|
+
plan.py def _omega_home(explicit: str | Path | None = None) -> Path
|
|
39
|
+
aisb_chat.py def _omega_home() -> Path
|
|
40
|
+
hermes_bootstrap.py def _omega_home(explicit: str | Path | None) -> Path
|
|
41
|
+
mission.py def _omega_home(explicit: str | Path | None = None) -> Path
|
|
42
|
+
cleanup.py def _omega_home(home: str | Path | None) -> Path
|
|
43
|
+
project.py def _omega_home(explicit: str | Path | None = None) -> Path
|
|
44
|
+
daemons/telegram.py def _omega_home() -> Path
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Status**: not a runtime bug. Each module uses its own private helper.
|
|
48
|
+
But **3 different signatures** for the same conceptual function is
|
|
49
|
+
code smell. Refactor: extract to `omega_engine.paths.omega_home(explicit=None)`
|
|
50
|
+
and update all 10 call sites. Scope: ~30 line diff, low risk. **Backlog v0.20.x.**
|
|
51
|
+
|
|
52
|
+
### 3.2 `step_mcp` legacy function unreferenced from STEPS
|
|
53
|
+
|
|
54
|
+
`bootstrap/lib/steps.sh` defines 22 step functions but `install.sh` only
|
|
55
|
+
references 21 in its STEPS array. The orphan is `step_mcp` (deliberately
|
|
56
|
+
retired in v0.19.21 when we switched to `step_clis`).
|
|
57
|
+
|
|
58
|
+
**Status**: not a bug. `step_mcp` is still reachable via `omega tool install <id>`
|
|
59
|
+
as a manual escape hatch. Function header documents this. **Leave as-is.**
|
|
60
|
+
|
|
61
|
+
### 3.3 `cmd_billing` overlaps with `cmd_account*`
|
|
62
|
+
|
|
63
|
+
There's a `cmd_billing` (since pre-v0.19) showing per-account cost
|
|
64
|
+
aggregation, and a `cmd_account` family (list / login / use / pool) for
|
|
65
|
+
account management. User mentioned earlier wanting `/billing` renamed to
|
|
66
|
+
`/account` for Telegram parity, but the CLI subcommand is named `omega
|
|
67
|
+
billing` and that's its purpose (cost surfacing).
|
|
68
|
+
|
|
69
|
+
**Status**: not a bug. They serve adjacent purposes. The Telegram side
|
|
70
|
+
already uses `/account` (per v0.19.x routing). CLI rename would be a
|
|
71
|
+
breaking change for any user/script depending on `omega billing`.
|
|
72
|
+
**Backlog**: alias `omega billing` ↔ `omega account costs`. v0.19.35+
|
|
73
|
+
|
|
74
|
+
### 3.4 Multiple `_atomic_write`, `_have`, `_cache_path` helpers
|
|
75
|
+
|
|
76
|
+
Same pattern as `_omega_home` — local helpers duplicated across modules
|
|
77
|
+
because there's no shared `omega_engine.paths` / `omega_engine.utils`.
|
|
78
|
+
Same refactor as 3.1. **Backlog v0.20.x.**
|
|
79
|
+
|
|
80
|
+
## 4. Architecture invariants verified
|
|
81
|
+
|
|
82
|
+
These come from FEATURE-MATRIX.md §8 (AISB rules). Audit confirms each
|
|
83
|
+
is enforced AT CODE LEVEL, not just at doc level:
|
|
84
|
+
|
|
85
|
+
| Invariant | Where it's enforced |
|
|
86
|
+
|---|---|
|
|
87
|
+
| Exactly 14 agents (Hermès + 13 AISB) | `paperclip_bridge.AISB_AGENTS` (13) + `HERMES_AGENT` (1); locked by `test_exactly_14_agents` |
|
|
88
|
+
| Hermès reports to no-one | `HERMES_AGENT["reports_to"] = None`; locked by `test_hermes_first_and_top` |
|
|
89
|
+
| Niobe reports to Hermès | Catalog + `test_niobe_reports_to_hermes` |
|
|
90
|
+
| Oracle reports to Niobe | Catalog + `test_oracle_reports_to_niobe` |
|
|
91
|
+
| Construct reports to Oracle | Catalog + `test_construct_reports_to_oracle` |
|
|
92
|
+
| Credential domain isolation | `test_aisb_agents_do_not_declare_api_keys` + `test_hermes_uses_anthropic_key` |
|
|
93
|
+
| `.done.json` verified completion | `done_signal.py` write_done() schema |
|
|
94
|
+
| Audit gate ≥85/100 | `audit_gate.py` threshold |
|
|
95
|
+
| Plan first (Oracle writes plan.md before dispatch) | Mission envelope builder + `plan.py` FSM |
|
|
96
|
+
|
|
97
|
+
## 5. Counts (the system's "shape")
|
|
98
|
+
|
|
99
|
+
- **Engine modules**: 60 Python files
|
|
100
|
+
- **AISB suite agent prompts**: 15 .md (13 personas + CLAUDE.md + lmc-protocol.md, + protocols/ + checkers/)
|
|
101
|
+
- **Test files**: 42 (was 41 — added `test_paperclip_bridge.py`)
|
|
102
|
+
- **pytest tests**: 612 (was 599 — added 13)
|
|
103
|
+
- **Install steps**: 21 in install.sh STEPS array
|
|
104
|
+
- **Step functions defined**: 22 in steps.sh (1 legacy: step_mcp)
|
|
105
|
+
- **CLI subcommands**: 49 distinct omega subcommands
|
|
106
|
+
- **MCP catalog entries**: 16 (legacy, opt-in only)
|
|
107
|
+
- **Claude plugins**: 11 (after v0.19.20 cleanup, claude-mem now opt-in)
|
|
108
|
+
- **System CLIs**: 28 (incl. CloakBrowser, Scrapling, Paperclip, …)
|
|
109
|
+
- **LLM providers**: 16 (Anthropic/OpenAI/Google/GLM/DeepSeek/Qwen/Ollama/LM Studio/OpenRouter/Bedrock/Mistral/xAI/Vercel Gateway/Copilot/OpenAI-compat/ChatGPT)
|
|
110
|
+
- **Genesis stack presets**: 8 (canonical/mobile-native/mobile-expo/desktop-tauri/supabase/claude-dashboard/convex-selfhosted/sqlite-local)
|
|
111
|
+
- **Personas supported**: 10 LLM filenames
|
|
112
|
+
- **Quality Arsenal audits**: 17 (Skills as forensic protocols)
|
|
113
|
+
|
|
114
|
+
## 6. Verdict
|
|
115
|
+
|
|
116
|
+
**v0.19.34 is clean** for what it claims to do:
|
|
117
|
+
|
|
118
|
+
- ✓ Multi-LLM ecosystem (13 CLIs + 16 providers + persona system)
|
|
119
|
+
- ✓ Multi-scraper (CloakBrowser + Scrapling)
|
|
120
|
+
- ✓ Tmux-based session orchestration (Omega master + chat windows)
|
|
121
|
+
- ✓ Paperclip bridge (governance roof, 14 agents, idempotent)
|
|
122
|
+
- ✓ Hermès isolated credentials (Anthropic API)
|
|
123
|
+
- ✓ AISB+Oracle+Workers on Max OAuth
|
|
124
|
+
- ✓ Verified completion (.done.json + audit gate)
|
|
125
|
+
- ✓ Light Claude theme (fzf + tmux)
|
|
126
|
+
- ✓ Arrow-key menu (fzf) + session switcher (Option+/)
|
|
127
|
+
- ✓ 612 tests pass
|
|
128
|
+
|
|
129
|
+
**Not yet there** (backlog v0.19.35+):
|
|
130
|
+
|
|
131
|
+
- Auto-heartbeat hook in `tmux.spawn_worker / spawn_oracle`
|
|
132
|
+
- Per-agent budget enforcement from Paperclip
|
|
133
|
+
- HTTP heartbeat transport (currently filesystem only)
|
|
134
|
+
- Refactor `_omega_home` + 4-5 other helpers into `omega_engine.paths`
|
|
135
|
+
- Streaming async in the Textual TUI
|
|
136
|
+
|
|
137
|
+
**Production-ready** for: distribution via npm, end-to-end install on
|
|
138
|
+
macOS/Linux, multi-LLM coding sessions, project genesis, audit-gated
|
|
139
|
+
missions, optional Paperclip governance.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
*Audit run on commit after v0.19.33 ship, before v0.19.34 release.*
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# OmegaOS × Paperclip Feature Matrix (v0.19.33)
|
|
2
|
+
|
|
3
|
+
> Cross-reference between OmegaOS (engine + AISB suite + tooling) and
|
|
4
|
+
> Paperclip (governance + org-chart + UI). Identifies what each system
|
|
5
|
+
> uniquely brings, where they overlap, and what the bridge fills in.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Paperclip — feature inventory
|
|
10
|
+
|
|
11
|
+
| # | Feature | What it does | Maps to OmegaOS as |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| 1 | **Org chart & agents** | Roles, titles, reporting lines, JDs | OmegaOS hierarchy (Hermès / AISB suite) registered as Paperclip agents via `omega paperclip register` |
|
|
14
|
+
| 2 | **Issue-based tasks** | Atomic checkout, dependencies, comments, audit logs | OmegaOS missions (`omega run`) + `.done.json` events |
|
|
15
|
+
| 3 | **Heartbeat execution** | Scheduled wakeups, budget checks, secret injection | `omega paperclip heartbeat --agent-id <…>` from tmux sessions |
|
|
16
|
+
| 4 | **Goal alignment** | Task → project → company → mission | OmegaOS Genesis project YAML carries `purpose` field |
|
|
17
|
+
| 5 | **Budget & cost** | Token/USD per agent/provider/model, hard stops | Per-LLM-provider tracking (claude_code = $0 OAuth; hermes = paid Anthropic; OpenRouter = OpenRouter API) |
|
|
18
|
+
| 6 | **Governance / approvals** | Board review, pause/terminate, config versioning | Maps to Stop-hook audit gate (Seraph ≥85/100 score) |
|
|
19
|
+
| 7 | **Workspaces** | Project workspaces, git worktrees, dev servers | OmegaOS `Agentik_Coding/projects/<slug>/` per-project isolation |
|
|
20
|
+
| 8 | **Routines / schedules** | Cron, webhook, API triggers | OmegaOS autonomous charters in `Agentik_Orchestration/autonomous/` |
|
|
21
|
+
| 9 | **Plugin system** | Instance-wide extensibility | OmegaOS skill catalog (`Agentik_SSOT/skills/`) |
|
|
22
|
+
| 10 | **Secrets storage** | Encrypted local + provider-backed | OmegaOS age vault (`omega vault`) |
|
|
23
|
+
| 11 | **Activity events** | Durable audit log | OmegaOS `Agentik_Runtime/eventlog/omega.db` |
|
|
24
|
+
| 12 | **Company portability** | Export/import org with secret scrubbing | OmegaOS Genesis pipeline + manifest YAML |
|
|
25
|
+
| 13 | **Multi-company support** | One deployment, many tenants | Multi-project under one `~/Omega` |
|
|
26
|
+
| 14 | **Mobile-ready management** | Browser UI for phones | OmegaOS Telegram bot (less rich but works) |
|
|
27
|
+
| 15 | **Web dashboard (React)** | Visual governance UI | Not in OmegaOS — fixed by registering OmegaOS as a Paperclip company |
|
|
28
|
+
| 16 | **PostgreSQL backend** | Production DB | OmegaOS uses SQLite WAL per project (simpler but smaller scale) |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. OmegaOS — feature inventory
|
|
33
|
+
|
|
34
|
+
| # | Feature | What it does | Maps to Paperclip as |
|
|
35
|
+
|---|---|---|---|
|
|
36
|
+
| 1 | **AISB suite (13 agents)** | Niobe/Oracle/Construct/Seraph/Smith/… | 13 agent rows in Paperclip's org chart |
|
|
37
|
+
| 2 | **Hermès L2** | Meta-companion on Anthropic API | Top-of-chart "COO" agent in Paperclip (own credential domain) |
|
|
38
|
+
| 3 | **Genesis project pipeline** | vision→market→branding→PRD→features→plan | Workspace template in Paperclip |
|
|
39
|
+
| 4 | **Verified completion (`.done.json`)** | Worker status signal | Issue completion event with payload |
|
|
40
|
+
| 5 | **17 Quality Arsenal audits** | Forensic Gestalt-Popper audits | Approval workflow stages |
|
|
41
|
+
| 6 | **Plan v7 FSM-enforced executor** | Multi-day autonomous loop | Routines with state machine |
|
|
42
|
+
| 7 | **Claude Code Max OAuth** | Free-with-sub credential | Provider config (credential domain 1) |
|
|
43
|
+
| 8 | **Hermès Anthropic API key** | Isolated paid budget | Provider config (credential domain 2) |
|
|
44
|
+
| 9 | **13 LLM CLIs + hot-swap** | Claude/Gemini/Codex/OpenCode/Qwen/… | Agent runtime flexibility (each agent picks its CLI) |
|
|
45
|
+
| 10 | **16 provider configs** | Anthropic/OpenAI/Google/GLM/DeepSeek/Qwen/Ollama/LM Studio/OpenRouter/Bedrock/Mistral/xAI/Vercel Gateway/Copilot | Multi-provider routing |
|
|
46
|
+
| 11 | **Persona system** | 1 canonical → 10 LLM filenames | Agent prompt portability |
|
|
47
|
+
| 12 | **CloakBrowser scraper** | Stealth web scraping | Available to all Paperclip agents via `omega scrape` |
|
|
48
|
+
| 13 | **Scrapling scraper** | Fast HTTP-first scraping | Same |
|
|
49
|
+
| 14 | **Printing Press CLIs** | Agent-native CLIs (Stripe, Linear, …) | Same — available to all agents |
|
|
50
|
+
| 15 | **Tmux session orchestration** | Persistent sessions for oracles/workers | Workspace runtime backing |
|
|
51
|
+
| 16 | **`omega` TUI** | fzf arrow menu + slash REPL | Terminal-side control surface |
|
|
52
|
+
| 17 | **Telegram bot (AISB)** | Intake + dispatch | Mobile management surface |
|
|
53
|
+
| 18 | **age-encrypted vault** | Secrets storage | Maps to Paperclip's secrets store |
|
|
54
|
+
| 19 | **Autonomous charters** | Cron-driven agent triggers | Paperclip routines |
|
|
55
|
+
| 20 | **Event-sourced FSM** | Per-task state machine | Issue lifecycle in Paperclip |
|
|
56
|
+
| 21 | **`omega switch`** | Hot-swap LLM provider | Per-agent runtime change |
|
|
57
|
+
| 22 | **`omega scrape`** | Unified scraper interface | Tool surface for all agents |
|
|
58
|
+
| 23 | **`omega doctor`** | 30+ health checks | Paperclip dashboard's health view |
|
|
59
|
+
| 24 | **599 pytest tests** | Engine correctness | (Paperclip has its own test suite) |
|
|
60
|
+
| 25 | **Distributable via npm** | `npx @agentikos/omega-os@latest` | Single npm package, multi-platform |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 3. Merger — the bridge fills these gaps
|
|
65
|
+
|
|
66
|
+
What OmegaOS WAS MISSING and Paperclip provides:
|
|
67
|
+
|
|
68
|
+
| OmegaOS gap | Paperclip fills it |
|
|
69
|
+
|---|---|
|
|
70
|
+
| No visual dashboard | Paperclip's React UI surfaces all 14 agents + projects + missions |
|
|
71
|
+
| Per-agent budget enforcement | Paperclip's budget engine (we report; Paperclip enforces) |
|
|
72
|
+
| Cross-LLM cost transparency | Paperclip's per-provider token tracking |
|
|
73
|
+
| Board-level approvals (beyond audit gate) | Paperclip's approval workflows |
|
|
74
|
+
| Company portability with secret scrubbing | Paperclip's export/import |
|
|
75
|
+
|
|
76
|
+
What Paperclip WAS MISSING and OmegaOS provides:
|
|
77
|
+
|
|
78
|
+
| Paperclip gap | OmegaOS fills it |
|
|
79
|
+
|---|---|
|
|
80
|
+
| 13 AISB agent personas | Paperclip company "omegaos" auto-registers them via bridge |
|
|
81
|
+
| Hermès L2 meta-companion | New agent role in Paperclip's chart |
|
|
82
|
+
| Verified-completion contract | OmegaOS's `.done.json` → Paperclip issue close event |
|
|
83
|
+
| Quality Arsenal audits (17 forensic) | Available to all Paperclip agents via `omega audit <id>` |
|
|
84
|
+
| Stealth scraping (CloakBrowser + Scrapling) | Available via `omega scrape <url>` |
|
|
85
|
+
| Hot-swap LLM mid-flight | `omega switch` from any Paperclip agent's runtime |
|
|
86
|
+
| Genesis project pipeline | Stack-aware workspace bootstrap |
|
|
87
|
+
| Age-encrypted vault | More secure than Paperclip's bare encrypted-local |
|
|
88
|
+
| 21-step installer with plan mode | One-line distribution beyond Paperclip's `npx onboard` |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 4. Bridge layer (v0.19.33 ship)
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
┌──────────────────────────────────────────────────────────────────┐
|
|
96
|
+
│ PAPERCLIP — L0 governance (React UI, web dashboard) │
|
|
97
|
+
│ $PAPERCLIP_HOME/companies/omegaos/ │
|
|
98
|
+
│ ├── company.json ← OmegaOS company config │
|
|
99
|
+
│ ├── agents/<id>.json ← 14 agent profiles │
|
|
100
|
+
│ ├── workspaces/<slug>.json ← per-Genesis-project workspace │
|
|
101
|
+
│ └── heartbeats/*.json ← live status from tmux sessions │
|
|
102
|
+
└────────────────────────────────┬─────────────────────────────────┘
|
|
103
|
+
│
|
|
104
|
+
OmegaOS engine writes here via:
|
|
105
|
+
`omega paperclip register`
|
|
106
|
+
`omega paperclip sync`
|
|
107
|
+
`omega paperclip heartbeat`
|
|
108
|
+
│
|
|
109
|
+
┌────────────────────────────────▼─────────────────────────────────┐
|
|
110
|
+
│ OMEGAOS — L1-L5 execution │
|
|
111
|
+
│ Hermès (L2) → AISB (L3) → Oracle (L4) → Workers (L5) │
|
|
112
|
+
│ Engine: ~/Omega/Agentik_Engine/omega_engine/ │
|
|
113
|
+
│ State: ~/Omega/Agentik_Runtime/ │
|
|
114
|
+
└──────────────────────────────────────────────────────────────────┘
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## 5. Bridge commands (v0.19.33)
|
|
118
|
+
|
|
119
|
+
| Command | Effect |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `omega paperclip status` | Show bridge health (agents/workspaces/heartbeats count, version drift) |
|
|
122
|
+
| `omega paperclip register` | Write Paperclip company config (idempotent) |
|
|
123
|
+
| `omega paperclip register --dry-run` | Preview without writing |
|
|
124
|
+
| `omega paperclip start [--bind loopback\|lan\|tailnet]` | Launch Paperclip server via `npx onboard` |
|
|
125
|
+
| `omega paperclip heartbeat --agent-id <id> --status <s>` | Send heartbeat from any tmux session |
|
|
126
|
+
|
|
127
|
+
## 6. Features added to OmegaOS in v0.19.33
|
|
128
|
+
|
|
129
|
+
1. `omega_engine.paperclip_bridge` module (this file).
|
|
130
|
+
2. `omega paperclip` CLI subcommand (4 verbs).
|
|
131
|
+
3. Per-agent profiles for the 13 AISB suite + Hermès, ready to be
|
|
132
|
+
written into Paperclip's `companies/omegaos/agents/` directory.
|
|
133
|
+
4. Workspace discovery — reads `Agentik_Coding/projects/<slug>/PROJECT.yaml`,
|
|
134
|
+
maps each to a Paperclip workspace.
|
|
135
|
+
|
|
136
|
+
## 7. Features still to add (v0.19.34+)
|
|
137
|
+
|
|
138
|
+
1. **Heartbeat sender wired into spawn**: `tmux.spawn_worker()` and
|
|
139
|
+
`tmux.spawn_oracle()` should auto-call `omega paperclip heartbeat
|
|
140
|
+
--agent-id <id> --status alive` on spawn + on exit.
|
|
141
|
+
2. **Per-agent budget enforcement in OmegaOS** mirroring Paperclip's
|
|
142
|
+
limits — read the budget config back from Paperclip and refuse new
|
|
143
|
+
missions when over budget.
|
|
144
|
+
3. **Genesis stack option: "paperclip-managed"** — generates a
|
|
145
|
+
Paperclip company.json at project creation time alongside PROJECT.yaml.
|
|
146
|
+
4. **`omega paperclip import <export.tar.gz>`** — adopt an OmegaOS
|
|
147
|
+
project from a Paperclip company export.
|
|
148
|
+
5. **Heartbeat HTTP transport** — currently writes JSON to disk
|
|
149
|
+
(filesystem fallback). Add live POST to a running Paperclip server
|
|
150
|
+
when the URL is set.
|
|
151
|
+
6. **AISB suite registration depth**: per-agent skills/tools mapping
|
|
152
|
+
so Paperclip's dashboard shows which Quality Arsenal audits Seraph
|
|
153
|
+
owns, which providers Hermès uses, etc.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 8. AISB rules enforced across both systems
|
|
158
|
+
|
|
159
|
+
These are non-negotiable contracts that both OmegaOS code AND
|
|
160
|
+
Paperclip config must respect:
|
|
161
|
+
|
|
162
|
+
1. **14 agents total** (Hermès + 13 AISB suite). The bridge writes
|
|
163
|
+
exactly 14 agent profiles — no more, no less.
|
|
164
|
+
2. **Reporting lines fixed**:
|
|
165
|
+
- Hermès reports to nobody (top)
|
|
166
|
+
- Niobe reports to Hermès (intake matriarch)
|
|
167
|
+
- Oracle/Keymaker/Seraph/Smith/Link/Merovingian/Neo/Pythia/Zion
|
|
168
|
+
report to Niobe (specialists)
|
|
169
|
+
- Construct/Morpheus/Architect report to Oracle (per-project execution)
|
|
170
|
+
3. **Credential domain isolation**:
|
|
171
|
+
- Claude Max OAuth → AISB+Oracle+Workers only (L3-L5)
|
|
172
|
+
- Anthropic API → Hermès only (L2)
|
|
173
|
+
- Paperclip never sees the live tokens, only credential domain refs
|
|
174
|
+
4. **Verified completion contract**:
|
|
175
|
+
- Every Worker writes `.done.json` with `status ∈ {done_clean, pending, failed}`
|
|
176
|
+
- Oracle waits for ALL its workers' `.done.json` before its own
|
|
177
|
+
- Seraph runs 1-3 Quality Arsenal audits with score ≥85/100 to approve
|
|
178
|
+
- Paperclip's issue close event mirrors this state
|
|
179
|
+
5. **Plans are first-class**:
|
|
180
|
+
- Oracle writes `plan.md` in `/project/<slug>/` before dispatching
|
|
181
|
+
- Workers receive PLAN + FILES IN SCOPE + DONE CRITERIA + VERIFY COMMAND
|
|
182
|
+
- Plan deviation = audit gate FAIL
|
|
183
|
+
|
|
184
|
+
These rules are baked into:
|
|
185
|
+
- `omega_engine.envelope` (mission envelope builder)
|
|
186
|
+
- `omega_engine.audit_arsenal` (audit gate)
|
|
187
|
+
- `omega_engine.paperclip_bridge.AISB_AGENTS` (this file's catalog)
|
|
188
|
+
- `Agentik_SSOT/agents/aisb/CLAUDE.md` (master prompt)
|
|
189
|
+
- `Agentik_SSOT/personas/OMEGAOS-CONTEXT.md` (per-LLM context)
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
*Audit produit pour v0.19.33 — 2026-05-25.*
|
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
# OmegaOS Layered Architecture
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> **Six layers** (L0–L5) with Paperclip as the optional governance roof.
|
|
4
|
+
> Two independent credential domains. Two Telegram bots with separate
|
|
5
|
+
> tokens. Hermès above the OmegaOS core; AISB+Oracle+Workers below.
|
|
5
6
|
> Each layer is independently usable.
|
|
6
7
|
|
|
8
|
+
## v0.19.33+ — Paperclip as L0 governance
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌──────────────────────────────────────────────────────────────────────┐
|
|
12
|
+
│ Layer 0 ─ PAPERCLIP (optional, governance roof) │
|
|
13
|
+
│ React dashboard + budget + org chart + approvals. │
|
|
14
|
+
│ Registered via `omega paperclip register` — writes │
|
|
15
|
+
│ ~/.paperclip/companies/omegaos/ with 14 agent profiles. │
|
|
16
|
+
│ Heartbeats from L1-L5 sessions feed this layer. │
|
|
17
|
+
└────────────────────────────────────────┬─────────────────────────────┘
|
|
18
|
+
│
|
|
19
|
+
▼
|
|
20
|
+
[everything below is the original L1-L5 model]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
See `omega/Agentik_SSOT/docs/FEATURE-MATRIX.md` for the full feature
|
|
24
|
+
cross-reference + bridge command list.
|
|
25
|
+
|
|
7
26
|
## The corrected model (v0.19.14)
|
|
8
27
|
|
|
9
28
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentikos/omega-os",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.34",
|
|
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"
|