@agentikos/omega-os 0.2.0 → 0.19.5
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/README.md +33 -3
- package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
- package/bootstrap/lib/claude-code-settings.py +176 -0
- package/bootstrap/lib/common.sh +457 -1
- package/bootstrap/lib/llm-clis.py +341 -0
- package/bootstrap/lib/manifest-helpers.py +384 -0
- package/bootstrap/lib/steps.sh +790 -21
- package/bootstrap/manifest.example.yaml +87 -1
- package/bootstrap/templates/aisb/CLAUDE.md +305 -0
- package/bootstrap/templates/aisb/architect.md +204 -0
- package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
- package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
- package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
- package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
- package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
- package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
- package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
- package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
- package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
- package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
- package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
- package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
- package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
- package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
- package/bootstrap/templates/aisb/construct.md +135 -0
- package/bootstrap/templates/aisb/keymaker.md +227 -0
- package/bootstrap/templates/aisb/link.md +170 -0
- package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
- package/bootstrap/templates/aisb/merovingian.md +159 -0
- package/bootstrap/templates/aisb/morpheus.md +243 -0
- package/bootstrap/templates/aisb/neo.md +147 -0
- package/bootstrap/templates/aisb/niobe.md +197 -0
- package/bootstrap/templates/aisb/oracle.md +244 -0
- package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
- package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
- package/bootstrap/templates/aisb/pythia.md +153 -0
- package/bootstrap/templates/aisb/seraph.md +315 -0
- package/bootstrap/templates/aisb/smith.md +202 -0
- package/bootstrap/templates/aisb/zion.md +172 -0
- package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
- package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
- package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
- package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
- package/docs/AUDITS.md +85 -0
- package/docs/GAP-ANALYSIS.md +214 -0
- package/docs/INSTALL.md +47 -9
- package/docs/MCP-AND-PLUGINS.md +31 -4
- package/docs/SIMULATION.md +171 -0
- package/docs/simulate.sh +211 -0
- package/install.sh +164 -17
- package/omega/Agentik_Engine/README.md +4 -2
- package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.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__/completions.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.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__/tools.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/account.py +28 -31
- package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
- package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
- package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
- package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
- package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
- package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
- package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
- package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
- package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
- package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
- package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
- package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
- package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
- package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
- package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
- package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
- package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
- package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
- package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
- package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
- package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
- package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
- package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
- package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
- package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
- package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
- package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
- package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
- package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
- package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
- package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
- package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/router.py +28 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
- package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
- package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
- package/omega/Agentik_Engine/omega_engine/store.py +88 -41
- package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
- package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
- package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
- package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
- package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
- package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
- package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
- package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
- package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_account.py +8 -3
- package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
- package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
- package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
- package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
- package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
- package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
- package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
- package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
- package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
- package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
- package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
- package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
- package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
- package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
- package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
- package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
- package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
- package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
- package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
- package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
- package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
- package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
- package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
- package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
- package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
- package/omega/Agentik_Engine/tests/test_vault.py +173 -0
- package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
- package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
- package/omega/Agentik_Runtime/audits.db +0 -0
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
- package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
- package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
- package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
- package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
- package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
- package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
- package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
- package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
- package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
- package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
- package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
- package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
- package/package.json +2 -2
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
"""Hermes Desktop adapter — expose OmegaOS as a remote backend.
|
|
2
|
+
|
|
3
|
+
Hermes Desktop (https://github.com/fathah/hermes-desktop) is an
|
|
4
|
+
Electron native app that connects to a Hermes Agent backend. The
|
|
5
|
+
default backend runs at ``http://127.0.0.1:8642``; the app also supports
|
|
6
|
+
**remote backends**: point it at any HTTP server that speaks the same
|
|
7
|
+
``/api/...`` protocol, plug an API key.
|
|
8
|
+
|
|
9
|
+
This module ships a tiny HTTP server that lets Hermes Desktop drive a
|
|
10
|
+
remote OmegaOS VPS as if it were a local Hermes process. The result:
|
|
11
|
+
|
|
12
|
+
* Operator runs Hermes Desktop on their laptop.
|
|
13
|
+
* Adds a profile pointing at ``https://<vps-domain>:8642`` with the
|
|
14
|
+
bearer token written by ``omega hermes-desktop install``.
|
|
15
|
+
* Every chat message from the desktop UI travels to the VPS, gets
|
|
16
|
+
classified, and is either answered by Hermès directly OR delegated
|
|
17
|
+
down to AISB/Oracle/Workers via ``omega run``.
|
|
18
|
+
|
|
19
|
+
This is the OPPOSITE of Hermes Desktop's default flow (which runs
|
|
20
|
+
Hermès locally). Here Hermès runs on the VPS, the desktop is just a
|
|
21
|
+
window onto it. Why: the operator's heavy AI work happens on the
|
|
22
|
+
24/7 VPS where the Claude OAuth lives, the audit history accumulates,
|
|
23
|
+
and tmux sessions survive laptop sleep.
|
|
24
|
+
|
|
25
|
+
Routes (Hermes-compatible subset)
|
|
26
|
+
---------------------------------
|
|
27
|
+
|
|
28
|
+
GET /api/health ok
|
|
29
|
+
GET /api/version {hermes_version, omega_version}
|
|
30
|
+
POST /api/chat {messages, stream} → SSE or JSON
|
|
31
|
+
GET /api/sessions list omega missions
|
|
32
|
+
GET /api/sessions/<id> mission detail
|
|
33
|
+
POST /api/sessions create new mission (delegates to omega run)
|
|
34
|
+
GET /api/skills merged hermes + omega skill catalog
|
|
35
|
+
GET /api/status omega doctor + hermes status snapshot
|
|
36
|
+
|
|
37
|
+
Security
|
|
38
|
+
--------
|
|
39
|
+
|
|
40
|
+
Bearer-token auth via ``Authorization: Bearer <token>``. Token is
|
|
41
|
+
generated at install time and stored at
|
|
42
|
+
``$OMEGA_HOME/Agentik_Extra/etc/hermes-desktop.token`` (mode 0600).
|
|
43
|
+
Operator copies it into the Hermes Desktop "API key" field.
|
|
44
|
+
|
|
45
|
+
Bound to ``127.0.0.1`` by default — operator MUST forward via SSH
|
|
46
|
+
tunnel or reverse proxy to expose it. We refuse to bind to ``0.0.0.0``
|
|
47
|
+
unless ``--unsafe-public`` is passed (with a loud warning).
|
|
48
|
+
"""
|
|
49
|
+
from __future__ import annotations
|
|
50
|
+
|
|
51
|
+
import http.server
|
|
52
|
+
import json
|
|
53
|
+
import os
|
|
54
|
+
import secrets
|
|
55
|
+
import socket
|
|
56
|
+
import socketserver
|
|
57
|
+
import threading
|
|
58
|
+
import time
|
|
59
|
+
from dataclasses import dataclass
|
|
60
|
+
from pathlib import Path
|
|
61
|
+
from typing import Any
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
_DEFAULT_PORT = 8642 # same as Hermes Desktop's default backend port
|
|
65
|
+
_TOKEN_FILE = "hermes-desktop.token"
|
|
66
|
+
_PROFILE_DIR = "Agentik_Extra/etc"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _omega_home(explicit: str | Path | None = None) -> Path:
|
|
70
|
+
if explicit is not None:
|
|
71
|
+
return Path(explicit)
|
|
72
|
+
return Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def token_path(omega_home: str | Path | None = None) -> Path:
|
|
76
|
+
return _omega_home(omega_home) / _PROFILE_DIR / _TOKEN_FILE
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
# Token management
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def generate_token(omega_home: str | Path | None = None) -> str:
|
|
85
|
+
"""Create + persist a fresh bearer token (40 hex chars)."""
|
|
86
|
+
p = token_path(omega_home)
|
|
87
|
+
p.parent.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
tok = secrets.token_hex(20)
|
|
89
|
+
p.write_text(tok)
|
|
90
|
+
try:
|
|
91
|
+
os.chmod(p, 0o600)
|
|
92
|
+
except OSError:
|
|
93
|
+
pass
|
|
94
|
+
return tok
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def read_token(omega_home: str | Path | None = None) -> str | None:
|
|
98
|
+
p = token_path(omega_home)
|
|
99
|
+
if not p.exists():
|
|
100
|
+
return None
|
|
101
|
+
try:
|
|
102
|
+
return p.read_text().strip() or None
|
|
103
|
+
except OSError:
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# ---------------------------------------------------------------------------
|
|
108
|
+
# Profile manifest — what Hermes Desktop should paste into its config
|
|
109
|
+
# ---------------------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@dataclass
|
|
113
|
+
class DesktopProfile:
|
|
114
|
+
name: str
|
|
115
|
+
base_url: str
|
|
116
|
+
api_key: str
|
|
117
|
+
description: str
|
|
118
|
+
|
|
119
|
+
def to_dict(self) -> dict[str, Any]:
|
|
120
|
+
from dataclasses import asdict
|
|
121
|
+
return asdict(self)
|
|
122
|
+
|
|
123
|
+
def to_json(self) -> str:
|
|
124
|
+
return json.dumps(self.to_dict(), indent=2)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def build_profile(
|
|
128
|
+
*,
|
|
129
|
+
public_url: str | None = None,
|
|
130
|
+
port: int = _DEFAULT_PORT,
|
|
131
|
+
omega_home: str | Path | None = None,
|
|
132
|
+
) -> DesktopProfile:
|
|
133
|
+
"""Build the profile JSON the operator pastes into Hermes Desktop."""
|
|
134
|
+
tok = read_token(omega_home) or generate_token(omega_home)
|
|
135
|
+
base = public_url or f"http://127.0.0.1:{port}"
|
|
136
|
+
return DesktopProfile(
|
|
137
|
+
name="OmegaOS VPS",
|
|
138
|
+
base_url=base,
|
|
139
|
+
api_key=tok,
|
|
140
|
+
description=(
|
|
141
|
+
"OmegaOS-backed Hermès — chat hits the VPS, which delegates "
|
|
142
|
+
"engineering work to AISB → Oracle → Workers (Layer 3-5)."
|
|
143
|
+
),
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# ---------------------------------------------------------------------------
|
|
148
|
+
# HTTP server
|
|
149
|
+
# ---------------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class _Handler(http.server.BaseHTTPRequestHandler):
|
|
153
|
+
"""Hermes-compatible request handler.
|
|
154
|
+
|
|
155
|
+
Implements a SAFE subset of the Hermes API:
|
|
156
|
+
|
|
157
|
+
* /api/health
|
|
158
|
+
* /api/version
|
|
159
|
+
* /api/status
|
|
160
|
+
* /api/skills
|
|
161
|
+
* /api/sessions (GET = list, POST = create)
|
|
162
|
+
* /api/sessions/<id> (GET = detail)
|
|
163
|
+
* /api/chat (POST → JSON for now; SSE streaming is a follow-up)
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
# Bearer-token shared across the whole server instance (set on the
|
|
167
|
+
# serve_forever helper below before binding).
|
|
168
|
+
expected_token: str = ""
|
|
169
|
+
omega_home: Path = _omega_home(None)
|
|
170
|
+
quiet: bool = True
|
|
171
|
+
|
|
172
|
+
# ---- Internal helpers --------------------------------------------------
|
|
173
|
+
|
|
174
|
+
def log_message(self, fmt: str, *args: Any) -> None: # noqa: A003
|
|
175
|
+
if not self.quiet:
|
|
176
|
+
super().log_message(fmt, *args)
|
|
177
|
+
|
|
178
|
+
def _check_auth(self) -> bool:
|
|
179
|
+
if not self.expected_token:
|
|
180
|
+
return True # auth disabled (only --unsafe-public)
|
|
181
|
+
got = self.headers.get("Authorization") or ""
|
|
182
|
+
if not got.startswith("Bearer "):
|
|
183
|
+
return False
|
|
184
|
+
return secrets.compare_digest(got[7:].strip(), self.expected_token)
|
|
185
|
+
|
|
186
|
+
def _send_json(self, status: int, payload: dict[str, Any]) -> None:
|
|
187
|
+
body = json.dumps(payload).encode("utf-8")
|
|
188
|
+
self.send_response(status)
|
|
189
|
+
self.send_header("Content-Type", "application/json; charset=utf-8")
|
|
190
|
+
self.send_header("Content-Length", str(len(body)))
|
|
191
|
+
self.send_header("Cache-Control", "no-store")
|
|
192
|
+
self.end_headers()
|
|
193
|
+
self.wfile.write(body)
|
|
194
|
+
|
|
195
|
+
def _read_json(self) -> dict[str, Any] | None:
|
|
196
|
+
length = int(self.headers.get("Content-Length") or 0)
|
|
197
|
+
if length <= 0:
|
|
198
|
+
return None
|
|
199
|
+
raw = self.rfile.read(length)
|
|
200
|
+
try:
|
|
201
|
+
return json.loads(raw.decode("utf-8"))
|
|
202
|
+
except (ValueError, UnicodeDecodeError):
|
|
203
|
+
return None
|
|
204
|
+
|
|
205
|
+
# ---- Route dispatch ---------------------------------------------------
|
|
206
|
+
|
|
207
|
+
def do_GET(self) -> None: # noqa: N802
|
|
208
|
+
path = self.path.split("?", 1)[0]
|
|
209
|
+
if path == "/api/health":
|
|
210
|
+
return self._send_json(200, {"status": "ok"})
|
|
211
|
+
if not self._check_auth():
|
|
212
|
+
return self._send_json(401, {"error": "missing or bad bearer token"})
|
|
213
|
+
|
|
214
|
+
if path == "/api/version":
|
|
215
|
+
return self._send_json(200, self._version())
|
|
216
|
+
if path == "/api/status":
|
|
217
|
+
return self._send_json(200, self._status())
|
|
218
|
+
if path == "/api/skills":
|
|
219
|
+
return self._send_json(200, {"skills": self._skills()})
|
|
220
|
+
if path == "/api/sessions":
|
|
221
|
+
return self._send_json(200, {"sessions": self._sessions_list()})
|
|
222
|
+
if path.startswith("/api/sessions/"):
|
|
223
|
+
sid = path[len("/api/sessions/"):]
|
|
224
|
+
d = self._session_detail(sid)
|
|
225
|
+
if d is None:
|
|
226
|
+
return self._send_json(404, {"error": "no such session"})
|
|
227
|
+
return self._send_json(200, d)
|
|
228
|
+
|
|
229
|
+
return self._send_json(404, {"error": f"no route {path}"})
|
|
230
|
+
|
|
231
|
+
def do_POST(self) -> None: # noqa: N802
|
|
232
|
+
path = self.path.split("?", 1)[0]
|
|
233
|
+
if not self._check_auth():
|
|
234
|
+
return self._send_json(401, {"error": "missing or bad bearer token"})
|
|
235
|
+
body = self._read_json() or {}
|
|
236
|
+
|
|
237
|
+
if path == "/api/sessions":
|
|
238
|
+
intent = (body.get("intent") or body.get("message") or "").strip()
|
|
239
|
+
if not intent:
|
|
240
|
+
return self._send_json(400, {"error": "intent required"})
|
|
241
|
+
slug = body.get("project") or None
|
|
242
|
+
return self._send_json(202, self._create_session(intent, slug))
|
|
243
|
+
|
|
244
|
+
if path == "/api/chat":
|
|
245
|
+
messages = body.get("messages") or []
|
|
246
|
+
if not isinstance(messages, list) or not messages:
|
|
247
|
+
return self._send_json(400, {"error": "messages[] required"})
|
|
248
|
+
user_text = messages[-1].get("content", "").strip()
|
|
249
|
+
if not user_text:
|
|
250
|
+
return self._send_json(400, {"error": "last message empty"})
|
|
251
|
+
return self._send_json(200, self._chat(user_text))
|
|
252
|
+
|
|
253
|
+
return self._send_json(404, {"error": f"no route {path}"})
|
|
254
|
+
|
|
255
|
+
# ---- Endpoint implementations -----------------------------------------
|
|
256
|
+
|
|
257
|
+
def _version(self) -> dict[str, Any]:
|
|
258
|
+
from omega_engine import __version__
|
|
259
|
+
return {
|
|
260
|
+
"omega_version": __version__,
|
|
261
|
+
"hermes_compat": "1.x",
|
|
262
|
+
"api_routes": [
|
|
263
|
+
"GET /api/health", "GET /api/version", "GET /api/status",
|
|
264
|
+
"GET /api/skills", "GET /api/sessions",
|
|
265
|
+
"GET /api/sessions/<id>", "POST /api/sessions", "POST /api/chat",
|
|
266
|
+
],
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
def _status(self) -> dict[str, Any]:
|
|
270
|
+
# Lightweight — don't run the full doctor (too slow). Quick
|
|
271
|
+
# snapshot of OmegaOS + Hermès bridge.
|
|
272
|
+
out: dict[str, Any] = {"omega_home": str(self.omega_home)}
|
|
273
|
+
try:
|
|
274
|
+
from omega_engine import hermes_bootstrap as HB
|
|
275
|
+
out["hermes_bootstrap"] = HB.status()
|
|
276
|
+
except Exception as exc: # noqa: BLE001
|
|
277
|
+
out["hermes_bootstrap_error"] = str(exc)
|
|
278
|
+
try:
|
|
279
|
+
from omega_engine import hermes as H
|
|
280
|
+
st = H.status()
|
|
281
|
+
out["hermes_bridge"] = {
|
|
282
|
+
"installed": st.installed,
|
|
283
|
+
"oauth_token_present": st.oauth_token_present,
|
|
284
|
+
"subscription": st.oauth_subscription,
|
|
285
|
+
}
|
|
286
|
+
except Exception as exc: # noqa: BLE001
|
|
287
|
+
out["hermes_bridge_error"] = str(exc)
|
|
288
|
+
return out
|
|
289
|
+
|
|
290
|
+
def _skills(self) -> list[dict[str, Any]]:
|
|
291
|
+
from omega_engine.skill_routing import (
|
|
292
|
+
catalog_for_home, POWER_SKILLS, recommend,
|
|
293
|
+
)
|
|
294
|
+
cat = catalog_for_home(self.omega_home)
|
|
295
|
+
return [
|
|
296
|
+
{
|
|
297
|
+
"name": s, "source": "omega-ssot",
|
|
298
|
+
"power_skill": s in POWER_SKILLS,
|
|
299
|
+
}
|
|
300
|
+
for s in cat
|
|
301
|
+
] + [
|
|
302
|
+
{
|
|
303
|
+
"name": role, "source": "role-palette",
|
|
304
|
+
"skills": recommend(role),
|
|
305
|
+
}
|
|
306
|
+
for role in ("worker", "oracle", "audit", "worker_ui")
|
|
307
|
+
]
|
|
308
|
+
|
|
309
|
+
def _sessions_list(self) -> list[dict[str, Any]]:
|
|
310
|
+
# Surface OmegaOS missions + per-task workers as "sessions"
|
|
311
|
+
out: list[dict[str, Any]] = []
|
|
312
|
+
try:
|
|
313
|
+
from omega_engine import worker as W
|
|
314
|
+
for w in W.list_workers(self.omega_home):
|
|
315
|
+
out.append({
|
|
316
|
+
"id": w["task_id"], "title": w["intent"],
|
|
317
|
+
"kind": "worker", "state": w["state"],
|
|
318
|
+
"project": w.get("project"),
|
|
319
|
+
})
|
|
320
|
+
except Exception: # noqa: BLE001
|
|
321
|
+
pass
|
|
322
|
+
return out
|
|
323
|
+
|
|
324
|
+
def _session_detail(self, session_id: str) -> dict[str, Any] | None:
|
|
325
|
+
try:
|
|
326
|
+
from omega_engine import worker as W
|
|
327
|
+
from omega_engine.done_signal import read_done
|
|
328
|
+
status = W.worker_status(self.omega_home, session_id)
|
|
329
|
+
done = read_done(self.omega_home, session_id)
|
|
330
|
+
return {
|
|
331
|
+
"id": session_id, "status": status,
|
|
332
|
+
"done": done.to_dict() if done else None,
|
|
333
|
+
}
|
|
334
|
+
except FileNotFoundError:
|
|
335
|
+
return None
|
|
336
|
+
except Exception as exc: # noqa: BLE001
|
|
337
|
+
return {"id": session_id, "error": str(exc)}
|
|
338
|
+
|
|
339
|
+
def _create_session(
|
|
340
|
+
self, intent: str, slug: str | None,
|
|
341
|
+
) -> dict[str, Any]:
|
|
342
|
+
"""Dispatch a mission via omega run (synchronous for now)."""
|
|
343
|
+
import subprocess
|
|
344
|
+
# We DO NOT run heavy work in the HTTP thread — emit the command
|
|
345
|
+
# asynchronously via a detached subprocess + return the mission
|
|
346
|
+
# id immediately. The Desktop client polls /api/sessions for
|
|
347
|
+
# progress.
|
|
348
|
+
env = {**os.environ, "OMEGA_HOME": str(self.omega_home)}
|
|
349
|
+
cmd = ["omega", "run", intent]
|
|
350
|
+
if slug:
|
|
351
|
+
cmd += ["--project", slug]
|
|
352
|
+
try:
|
|
353
|
+
subprocess.Popen(
|
|
354
|
+
cmd, env=env,
|
|
355
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
|
356
|
+
start_new_session=True,
|
|
357
|
+
)
|
|
358
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
359
|
+
return {"error": f"dispatch failed: {exc}"}
|
|
360
|
+
return {
|
|
361
|
+
"dispatched": True, "intent": intent,
|
|
362
|
+
"project": slug,
|
|
363
|
+
"note": "poll /api/sessions for progress",
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
def _chat(self, user_text: str) -> dict[str, Any]:
|
|
367
|
+
"""Send the user text through the local Hermès binary (if installed),
|
|
368
|
+
else delegate via omega ask + return the text."""
|
|
369
|
+
from omega_engine import hermes as H
|
|
370
|
+
try:
|
|
371
|
+
if H.is_installed():
|
|
372
|
+
rc, stdout, stderr = H.ask(user_text, timeout_s=180)
|
|
373
|
+
return {
|
|
374
|
+
"rc": rc,
|
|
375
|
+
"text": stdout.strip() or stderr.strip(),
|
|
376
|
+
}
|
|
377
|
+
except H.HermesError as exc:
|
|
378
|
+
return {"rc": 2, "text": f"hermes error: {exc}"}
|
|
379
|
+
return {
|
|
380
|
+
"rc": 1,
|
|
381
|
+
"text": "hermes binary not installed on the VPS — "
|
|
382
|
+
"run `omega hermes install` first.",
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
# ---------------------------------------------------------------------------
|
|
387
|
+
# Server lifecycle
|
|
388
|
+
# ---------------------------------------------------------------------------
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
class _ThreadedTCPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
|
|
392
|
+
daemon_threads = True
|
|
393
|
+
allow_reuse_address = True
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
@dataclass
|
|
397
|
+
class ServerStatus:
|
|
398
|
+
bound: str
|
|
399
|
+
port: int
|
|
400
|
+
pid: int
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
_RUNNING_LOCK = threading.Lock()
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def serve(
|
|
407
|
+
*,
|
|
408
|
+
host: str = "127.0.0.1",
|
|
409
|
+
port: int = _DEFAULT_PORT,
|
|
410
|
+
omega_home: str | Path | None = None,
|
|
411
|
+
token: str | None = None,
|
|
412
|
+
quiet: bool = True,
|
|
413
|
+
unsafe_public: bool = False,
|
|
414
|
+
) -> _ThreadedTCPServer:
|
|
415
|
+
"""Bind + serve. Returns the server object so callers can shut down.
|
|
416
|
+
|
|
417
|
+
NOT a daemon — for systemd / detached tmux, use ``serve_forever``.
|
|
418
|
+
"""
|
|
419
|
+
if host == "0.0.0.0" and not unsafe_public:
|
|
420
|
+
raise RuntimeError(
|
|
421
|
+
"refusing to bind 0.0.0.0 — pass unsafe_public=True if you "
|
|
422
|
+
"really want public, but you almost certainly want SSH "
|
|
423
|
+
"tunneling instead"
|
|
424
|
+
)
|
|
425
|
+
tok = token if token is not None else (
|
|
426
|
+
read_token(omega_home) or generate_token(omega_home)
|
|
427
|
+
)
|
|
428
|
+
# Subclass the handler so attributes don't bleed across servers.
|
|
429
|
+
handler = type("_BoundHandler", (_Handler,), {
|
|
430
|
+
"expected_token": tok,
|
|
431
|
+
"omega_home": _omega_home(omega_home),
|
|
432
|
+
"quiet": quiet,
|
|
433
|
+
})
|
|
434
|
+
server = _ThreadedTCPServer((host, port), handler)
|
|
435
|
+
return server
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def serve_forever(
|
|
439
|
+
*,
|
|
440
|
+
host: str = "127.0.0.1",
|
|
441
|
+
port: int = _DEFAULT_PORT,
|
|
442
|
+
omega_home: str | Path | None = None,
|
|
443
|
+
token: str | None = None,
|
|
444
|
+
quiet: bool = True,
|
|
445
|
+
unsafe_public: bool = False,
|
|
446
|
+
) -> None:
|
|
447
|
+
"""Blocking serve. Best run inside a tmux session or systemd unit."""
|
|
448
|
+
s = serve(host=host, port=port, omega_home=omega_home, token=token,
|
|
449
|
+
quiet=quiet, unsafe_public=unsafe_public)
|
|
450
|
+
try:
|
|
451
|
+
s.serve_forever()
|
|
452
|
+
except KeyboardInterrupt:
|
|
453
|
+
pass
|
|
454
|
+
finally:
|
|
455
|
+
try:
|
|
456
|
+
s.shutdown()
|
|
457
|
+
s.server_close()
|
|
458
|
+
except OSError:
|
|
459
|
+
pass
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def is_port_free(port: int = _DEFAULT_PORT, host: str = "127.0.0.1") -> bool:
|
|
463
|
+
"""Probe whether ``host:port`` can be bound. Useful for the install check."""
|
|
464
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
465
|
+
try:
|
|
466
|
+
sock.bind((host, port))
|
|
467
|
+
return True
|
|
468
|
+
except OSError:
|
|
469
|
+
return False
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Third-party integrations — thin wrappers around external CLI tools.
|
|
2
|
+
|
|
3
|
+
Each integration is opt-in: if the upstream binary is missing the wrapper
|
|
4
|
+
raises a typed error, never crashes the engine. The wrappers translate the
|
|
5
|
+
tool's native output into the engine's own shapes (Documents, graph edges,
|
|
6
|
+
Tool registry entries) so the rest of the system stays binary-free.
|
|
7
|
+
"""
|
|
8
|
+
from omega_engine.integrations.graphify import (
|
|
9
|
+
GraphifyError,
|
|
10
|
+
GraphifyGraphMissing,
|
|
11
|
+
GraphifyNotInstalled,
|
|
12
|
+
GraphifyReport,
|
|
13
|
+
graphify_install_skill,
|
|
14
|
+
graphify_into_rag,
|
|
15
|
+
graphify_load_graph,
|
|
16
|
+
graphify_version,
|
|
17
|
+
is_graphify_installed,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"GraphifyError",
|
|
22
|
+
"GraphifyGraphMissing",
|
|
23
|
+
"GraphifyNotInstalled",
|
|
24
|
+
"GraphifyReport",
|
|
25
|
+
"graphify_install_skill",
|
|
26
|
+
"graphify_into_rag",
|
|
27
|
+
"graphify_load_graph",
|
|
28
|
+
"graphify_version",
|
|
29
|
+
"is_graphify_installed",
|
|
30
|
+
]
|
|
Binary file
|