| # Odysseus Codex Integration | |
| This directory contains the Codex plugin/skill bundle for Odysseus. | |
| ## User Flow | |
| 1. Open Odysseus Settings > Integrations. | |
| 2. Add a Codex Agent. | |
| 3. Copy the full setup commands shown after the generated token. | |
| 4. Toggle the tools Codex is allowed to use. | |
| 5. Configure the terminal Codex session: | |
| ```bash | |
| export ODYSSEUS_URL=http://your-odysseus-host:7000 | |
| export ODYSSEUS_API_TOKEN=ody_generated_token | |
| mkdir -p ~/plugins | |
| curl -fsSL -H "Authorization: Bearer $ODYSSEUS_API_TOKEN" "$ODYSSEUS_URL/api/codex/plugin.zip" -o /tmp/odysseus-codex-plugin.zip | |
| python3 -m zipfile -e /tmp/odysseus-codex-plugin.zip ~/plugins | |
| python3 - <<'PY' | |
| import json | |
| from pathlib import Path | |
| p = Path.home() / ".agents" / "plugins" / "marketplace.json" | |
| p.parent.mkdir(parents=True, exist_ok=True) | |
| if p.exists(): | |
| data = json.loads(p.read_text()) | |
| else: | |
| data = {"name": "personal", "interface": {"displayName": "Personal"}, "plugins": []} | |
| data.setdefault("name", "personal") | |
| data.setdefault("interface", {}).setdefault("displayName", "Personal") | |
| plugins = data.setdefault("plugins", []) | |
| entry = { | |
| "name": "odysseus", | |
| "source": {"source": "local", "path": "./plugins/odysseus"}, | |
| "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, | |
| "category": "Productivity", | |
| } | |
| data["plugins"] = [item for item in plugins if item.get("name") != "odysseus"] + [entry] | |
| p.write_text(json.dumps(data, indent=2) + "\n") | |
| PY | |
| codex plugin add odysseus@personal | |
| ``` | |
| 6. Verify: | |
| ```bash | |
| python3 ~/plugins/odysseus/scripts/odysseus_api.py capabilities | |
| ``` | |
| Codex must use `/api/codex/*` endpoints. SSH, Docker, direct Python imports, database queries, and MCP internals bypass Odysseus Settings and must not be used for user data access. | |