@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,370 @@
|
|
|
1
|
+
"""Tests for the v0.6.0 hardening batch — every new module gets coverage.
|
|
2
|
+
|
|
3
|
+
We don't hit any real provider APIs in tests (no network). For
|
|
4
|
+
validate.py and updater.py we monkeypatch urlopen; for smoke we run
|
|
5
|
+
against MockProvider; for prune/backup/costs/audit_diff we exercise the
|
|
6
|
+
pure-data paths.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import sqlite3
|
|
13
|
+
import sys
|
|
14
|
+
import tempfile
|
|
15
|
+
import time
|
|
16
|
+
import unittest
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from unittest import mock
|
|
19
|
+
|
|
20
|
+
import yaml
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
HERE = Path(__file__).resolve().parent
|
|
24
|
+
sys.path.insert(0, str(HERE.parent))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# validate.py
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TestValidate(unittest.TestCase):
|
|
33
|
+
def test_validate_claude_no_key_returns_clean_fail(self):
|
|
34
|
+
from omega_engine.validate import validate_one
|
|
35
|
+
with tempfile.TemporaryDirectory() as td:
|
|
36
|
+
r = validate_one(td, "claude")
|
|
37
|
+
self.assertFalse(r.ok)
|
|
38
|
+
self.assertIn("no API key", r.detail)
|
|
39
|
+
|
|
40
|
+
def test_validate_unknown_provider(self):
|
|
41
|
+
from omega_engine.validate import validate_one
|
|
42
|
+
with tempfile.TemporaryDirectory() as td:
|
|
43
|
+
r = validate_one(td, "aliens")
|
|
44
|
+
self.assertFalse(r.ok)
|
|
45
|
+
self.assertIn("no validator", r.detail)
|
|
46
|
+
|
|
47
|
+
def test_validate_all_reads_router(self):
|
|
48
|
+
from omega_engine.validate import validate_all
|
|
49
|
+
with tempfile.TemporaryDirectory() as td:
|
|
50
|
+
home = Path(td)
|
|
51
|
+
(home / "Agentik_SSOT" / "providers").mkdir(parents=True)
|
|
52
|
+
(home / "Agentik_SSOT" / "providers" / "router.yaml").write_text(
|
|
53
|
+
yaml.safe_dump({"providers": [
|
|
54
|
+
{"id": "claude", "enabled": True, "secret_ref": "CLAUDE_API_KEY"},
|
|
55
|
+
{"id": "glm", "enabled": False, "secret_ref": "GLM_API_KEY"},
|
|
56
|
+
]}))
|
|
57
|
+
results = validate_all(home)
|
|
58
|
+
# Only enabled providers are validated.
|
|
59
|
+
self.assertEqual([r.provider for r in results], ["claude"])
|
|
60
|
+
|
|
61
|
+
def test_validate_claude_with_mock_http_200(self):
|
|
62
|
+
from omega_engine.validate import _validate_claude
|
|
63
|
+
with mock.patch("urllib.request.urlopen") as fake_open:
|
|
64
|
+
fake_resp = mock.MagicMock()
|
|
65
|
+
fake_resp.__enter__ = lambda s: s
|
|
66
|
+
fake_resp.__exit__ = lambda *args: None
|
|
67
|
+
fake_resp.read = lambda: b'{"ok": true}'
|
|
68
|
+
fake_open.return_value = fake_resp
|
|
69
|
+
r = _validate_claude("sk-key")
|
|
70
|
+
self.assertTrue(r.ok)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# completions.py
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class TestCompletions(unittest.TestCase):
|
|
79
|
+
def test_extract_tree_from_parser(self):
|
|
80
|
+
from omega_engine.cli import _build_parser
|
|
81
|
+
from omega_engine.completions import extract_tree
|
|
82
|
+
tree = extract_tree(_build_parser())
|
|
83
|
+
self.assertEqual(tree.name, "omega")
|
|
84
|
+
names = {n.name for n in tree.subcommands}
|
|
85
|
+
# A handful of the commands we know must be there.
|
|
86
|
+
for expected in ("doctor", "audit", "skill", "pursue", "cadence",
|
|
87
|
+
"smoke", "backup", "validate"):
|
|
88
|
+
self.assertIn(expected, names)
|
|
89
|
+
|
|
90
|
+
def test_render_bash_contains_top_commands(self):
|
|
91
|
+
from omega_engine.cli import _build_parser
|
|
92
|
+
from omega_engine.completions import extract_tree, render_bash
|
|
93
|
+
text = render_bash(extract_tree(_build_parser()))
|
|
94
|
+
self.assertIn("complete -F _omega_complete omega", text)
|
|
95
|
+
self.assertIn("doctor", text)
|
|
96
|
+
self.assertIn("audit", text)
|
|
97
|
+
|
|
98
|
+
def test_write_all_creates_files(self):
|
|
99
|
+
from omega_engine.cli import _build_parser
|
|
100
|
+
from omega_engine.completions import extract_tree, write_all
|
|
101
|
+
with tempfile.TemporaryDirectory() as td:
|
|
102
|
+
paths = write_all(td, extract_tree(_build_parser()))
|
|
103
|
+
for shell in ("bash", "zsh", "fish"):
|
|
104
|
+
self.assertTrue(paths[shell].exists())
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# ---------------------------------------------------------------------------
|
|
108
|
+
# updater.py
|
|
109
|
+
# ---------------------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class TestUpdater(unittest.TestCase):
|
|
113
|
+
def test_parse_semver_handles_prerelease(self):
|
|
114
|
+
from omega_engine.updater import _parse_semver
|
|
115
|
+
self.assertEqual(_parse_semver("1.2.3"), (1, 2, 3))
|
|
116
|
+
self.assertEqual(_parse_semver("1.2.3-beta.1"), (1, 2, 3))
|
|
117
|
+
self.assertEqual(_parse_semver("v0.4.0"), (0, 4, 0)) # leading v → 0
|
|
118
|
+
self.assertEqual(_parse_semver("garbage"), (0, 0, 0))
|
|
119
|
+
|
|
120
|
+
def test_check_returns_outdated_when_newer(self):
|
|
121
|
+
from omega_engine.updater import check_for_updates
|
|
122
|
+
with mock.patch("urllib.request.urlopen") as fake_open:
|
|
123
|
+
fake_resp = mock.MagicMock()
|
|
124
|
+
fake_resp.__enter__ = lambda s: s
|
|
125
|
+
fake_resp.__exit__ = lambda *args: None
|
|
126
|
+
fake_resp.read = lambda: json.dumps({
|
|
127
|
+
"dist-tags": {"latest": "1.0.0"},
|
|
128
|
+
}).encode()
|
|
129
|
+
fake_open.return_value = fake_resp
|
|
130
|
+
info = check_for_updates("0.5.0")
|
|
131
|
+
self.assertTrue(info.is_outdated)
|
|
132
|
+
self.assertEqual(info.latest, "1.0.0")
|
|
133
|
+
|
|
134
|
+
def test_check_returns_uptodate(self):
|
|
135
|
+
from omega_engine.updater import check_for_updates
|
|
136
|
+
with mock.patch("urllib.request.urlopen") as fake_open:
|
|
137
|
+
fake_resp = mock.MagicMock()
|
|
138
|
+
fake_resp.__enter__ = lambda s: s
|
|
139
|
+
fake_resp.__exit__ = lambda *args: None
|
|
140
|
+
fake_resp.read = lambda: json.dumps({
|
|
141
|
+
"dist-tags": {"latest": "0.5.0"},
|
|
142
|
+
}).encode()
|
|
143
|
+
fake_open.return_value = fake_resp
|
|
144
|
+
info = check_for_updates("0.5.0")
|
|
145
|
+
self.assertFalse(info.is_outdated)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
# ---------------------------------------------------------------------------
|
|
149
|
+
# smoke.py
|
|
150
|
+
# ---------------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestSmoke(unittest.TestCase):
|
|
154
|
+
def test_smoke_passes_against_mock(self):
|
|
155
|
+
from omega_engine.smoke import run_smoke
|
|
156
|
+
with tempfile.TemporaryDirectory() as td:
|
|
157
|
+
result = run_smoke(omega_home=td)
|
|
158
|
+
self.assertTrue(result.passed,
|
|
159
|
+
msg=f"smoke failed: {result.detail}")
|
|
160
|
+
self.assertEqual(result.final_state, "completed")
|
|
161
|
+
self.assertGreater(result.events_recorded, 0)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# ---------------------------------------------------------------------------
|
|
165
|
+
# prune.py
|
|
166
|
+
# ---------------------------------------------------------------------------
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class TestPrune(unittest.TestCase):
|
|
170
|
+
def _seed_telegram_history(self, home: Path, *, old_count: int, new_count: int):
|
|
171
|
+
from omega_engine.telegram_history import _connect, record_inbound
|
|
172
|
+
# Now-recent messages.
|
|
173
|
+
for i in range(new_count):
|
|
174
|
+
record_inbound(home, topic_id=1, text=f"new-{i}")
|
|
175
|
+
# Artificially old rows.
|
|
176
|
+
conn = _connect(home)
|
|
177
|
+
for i in range(old_count):
|
|
178
|
+
conn.execute(
|
|
179
|
+
"INSERT INTO messages (topic_id, role, text, message_id, timestamp) "
|
|
180
|
+
"VALUES (?, ?, ?, ?, ?)",
|
|
181
|
+
(1, "user", f"old-{i}", None, 0),
|
|
182
|
+
)
|
|
183
|
+
conn.commit()
|
|
184
|
+
conn.close()
|
|
185
|
+
|
|
186
|
+
def test_prune_telegram_dry_run_doesnt_delete(self):
|
|
187
|
+
from omega_engine.prune import prune_telegram
|
|
188
|
+
with tempfile.TemporaryDirectory() as td:
|
|
189
|
+
self._seed_telegram_history(Path(td), old_count=3, new_count=2)
|
|
190
|
+
report = prune_telegram(td, older_than_days=30, dry_run=True)
|
|
191
|
+
self.assertEqual(report.rows_deleted, 3)
|
|
192
|
+
self.assertTrue(report.dry_run)
|
|
193
|
+
# Verify nothing was actually deleted.
|
|
194
|
+
from omega_engine.telegram_history import recent_messages
|
|
195
|
+
still = recent_messages(td, topic_id=1, limit=100)
|
|
196
|
+
self.assertEqual(len(still), 5)
|
|
197
|
+
|
|
198
|
+
def test_prune_telegram_yes_actually_deletes(self):
|
|
199
|
+
from omega_engine.prune import prune_telegram
|
|
200
|
+
from omega_engine.telegram_history import recent_messages
|
|
201
|
+
with tempfile.TemporaryDirectory() as td:
|
|
202
|
+
self._seed_telegram_history(Path(td), old_count=3, new_count=2)
|
|
203
|
+
report = prune_telegram(td, older_than_days=30, dry_run=False)
|
|
204
|
+
self.assertEqual(report.rows_deleted, 3)
|
|
205
|
+
still = recent_messages(td, topic_id=1, limit=100)
|
|
206
|
+
self.assertEqual(len(still), 2)
|
|
207
|
+
|
|
208
|
+
def test_prune_all_returns_one_per_target(self):
|
|
209
|
+
from omega_engine.prune import prune_all
|
|
210
|
+
with tempfile.TemporaryDirectory() as td:
|
|
211
|
+
reports = prune_all(td, older_than_days=30, dry_run=True)
|
|
212
|
+
targets = [r.target for r in reports]
|
|
213
|
+
self.assertEqual(targets, ["events", "audits", "telegram", "sessions"])
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# ---------------------------------------------------------------------------
|
|
217
|
+
# backup.py
|
|
218
|
+
# ---------------------------------------------------------------------------
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class TestBackup(unittest.TestCase):
|
|
222
|
+
def _seed_tree(self, home: Path) -> None:
|
|
223
|
+
# Minimal backupable structure
|
|
224
|
+
(home / "Agentik_Runtime" / "eventlog").mkdir(parents=True)
|
|
225
|
+
(home / "Agentik_Runtime" / "eventlog" / "omega.db").write_text("fake-db")
|
|
226
|
+
(home / "Agentik_Extra" / "etc" / "secrets").mkdir(parents=True)
|
|
227
|
+
(home / "Agentik_Extra" / "etc" / "secrets" / "x.age").write_text("encrypted")
|
|
228
|
+
(home / "Agentik_SSOT").mkdir(parents=True)
|
|
229
|
+
(home / "Agentik_SSOT" / "VERSION").write_text("0.5.0")
|
|
230
|
+
(home / "Agentik_Coding").mkdir(parents=True)
|
|
231
|
+
(home / "Agentik_Coding" / "projects.json").write_text("[]")
|
|
232
|
+
|
|
233
|
+
def test_backup_creates_tarball(self):
|
|
234
|
+
from omega_engine.backup import backup
|
|
235
|
+
with tempfile.TemporaryDirectory() as td:
|
|
236
|
+
home = Path(td) / "Omega"
|
|
237
|
+
home.mkdir()
|
|
238
|
+
self._seed_tree(home)
|
|
239
|
+
result = backup(home, out_dir=Path(td))
|
|
240
|
+
self.assertTrue(result.bundle.exists())
|
|
241
|
+
self.assertGreater(result.bytes, 0)
|
|
242
|
+
self.assertFalse(result.encrypted)
|
|
243
|
+
|
|
244
|
+
def test_backup_then_restore_roundtrip(self):
|
|
245
|
+
from omega_engine.backup import backup, restore
|
|
246
|
+
with tempfile.TemporaryDirectory() as td:
|
|
247
|
+
home = Path(td) / "Omega"
|
|
248
|
+
home.mkdir()
|
|
249
|
+
self._seed_tree(home)
|
|
250
|
+
result = backup(home, out_dir=Path(td))
|
|
251
|
+
|
|
252
|
+
# Restore into a clean tree.
|
|
253
|
+
target = Path(td) / "restored"
|
|
254
|
+
target.mkdir()
|
|
255
|
+
r = restore(result.bundle, target=target)
|
|
256
|
+
self.assertGreater(r.files, 0)
|
|
257
|
+
self.assertTrue((target / "Agentik_SSOT" / "VERSION").exists())
|
|
258
|
+
self.assertEqual(
|
|
259
|
+
(target / "Agentik_SSOT" / "VERSION").read_text(), "0.5.0",
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
def test_verify_passes_on_clean_bundle(self):
|
|
263
|
+
from omega_engine.backup import backup, verify
|
|
264
|
+
with tempfile.TemporaryDirectory() as td:
|
|
265
|
+
home = Path(td) / "Omega"
|
|
266
|
+
home.mkdir()
|
|
267
|
+
self._seed_tree(home)
|
|
268
|
+
result = backup(home, out_dir=Path(td))
|
|
269
|
+
v = verify(result.bundle)
|
|
270
|
+
self.assertTrue(v["ok"])
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
# ---------------------------------------------------------------------------
|
|
274
|
+
# costs.py
|
|
275
|
+
# ---------------------------------------------------------------------------
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
class TestCosts(unittest.TestCase):
|
|
279
|
+
def test_estimate_cost_claude(self):
|
|
280
|
+
from omega_engine.costs import estimate_cost
|
|
281
|
+
# 1M in + 1M out on claude-sonnet → 3 + 15 = 18 USD
|
|
282
|
+
cost = estimate_cost(
|
|
283
|
+
"claude", input_tokens=1_000_000, output_tokens=1_000_000,
|
|
284
|
+
model="claude-sonnet-4-6",
|
|
285
|
+
)
|
|
286
|
+
self.assertAlmostEqual(cost, 18.0, places=2)
|
|
287
|
+
|
|
288
|
+
def test_estimate_cost_unknown_provider_zero(self):
|
|
289
|
+
from omega_engine.costs import estimate_cost
|
|
290
|
+
self.assertEqual(
|
|
291
|
+
estimate_cost("not-real", input_tokens=1000, output_tokens=1000),
|
|
292
|
+
0.0,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
def test_rate_card_summary_includes_known_providers(self):
|
|
296
|
+
from omega_engine.costs import rate_card_summary
|
|
297
|
+
s = rate_card_summary()
|
|
298
|
+
for p in ("claude", "openai", "glm", "deepseek"):
|
|
299
|
+
self.assertIn(p, s["providers"])
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
# ---------------------------------------------------------------------------
|
|
303
|
+
# audit_diff.py
|
|
304
|
+
# ---------------------------------------------------------------------------
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class TestAuditDiff(unittest.TestCase):
|
|
308
|
+
def test_diff_classifies_fixed_new_persist_regressed(self):
|
|
309
|
+
from omega_engine.audit_diff import diff_runs
|
|
310
|
+
from omega_engine.audits.history import (
|
|
311
|
+
AuditRun, make_run_id, now, record_run,
|
|
312
|
+
)
|
|
313
|
+
with tempfile.TemporaryDirectory() as td:
|
|
314
|
+
base = now()
|
|
315
|
+
f_fixed = {"phase": "p", "location": "a.py:1",
|
|
316
|
+
"message": "bug A", "severity": "high"}
|
|
317
|
+
f_persist = {"phase": "p", "location": "b.py:1",
|
|
318
|
+
"message": "bug B", "severity": "medium"}
|
|
319
|
+
f_regressed1 = {"phase": "p", "location": "c.py:1",
|
|
320
|
+
"message": "bug C", "severity": "low"}
|
|
321
|
+
f_regressed2 = {"phase": "p", "location": "c.py:1",
|
|
322
|
+
"message": "bug C", "severity": "high"}
|
|
323
|
+
f_new = {"phase": "p", "location": "d.py:1",
|
|
324
|
+
"message": "bug D", "severity": "medium"}
|
|
325
|
+
|
|
326
|
+
record_run(td, AuditRun(
|
|
327
|
+
run_id="ar-1", audit_id="codeaudit", scope=".",
|
|
328
|
+
timestamp=base, score=70, verified=False, finding_count=3,
|
|
329
|
+
verdict={"findings": [f_fixed, f_persist, f_regressed1]},
|
|
330
|
+
))
|
|
331
|
+
record_run(td, AuditRun(
|
|
332
|
+
run_id="ar-2", audit_id="codeaudit", scope=".",
|
|
333
|
+
timestamp=base + 1, score=80, verified=False, finding_count=3,
|
|
334
|
+
verdict={"findings": [f_persist, f_regressed2, f_new]},
|
|
335
|
+
))
|
|
336
|
+
d = diff_runs(td, "ar-1", "ar-2")
|
|
337
|
+
self.assertEqual(d.delta, 10)
|
|
338
|
+
self.assertEqual(len(d.fixed), 1)
|
|
339
|
+
self.assertEqual(d.fixed[0]["location"], "a.py:1")
|
|
340
|
+
self.assertEqual(len(d.new), 1)
|
|
341
|
+
self.assertEqual(d.new[0]["location"], "d.py:1")
|
|
342
|
+
self.assertEqual(len(d.persist), 2) # b.py + c.py both in both runs
|
|
343
|
+
self.assertEqual(len(d.regressed), 1)
|
|
344
|
+
self.assertEqual(d.regressed[0]["location"], "c.py:1")
|
|
345
|
+
|
|
346
|
+
def test_diff_unknown_run_raises(self):
|
|
347
|
+
from omega_engine.audit_diff import diff_runs
|
|
348
|
+
with tempfile.TemporaryDirectory() as td:
|
|
349
|
+
with self.assertRaises(KeyError):
|
|
350
|
+
diff_runs(td, "missing-1", "missing-2")
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
# ---------------------------------------------------------------------------
|
|
354
|
+
# ssh-key-rotate template ships
|
|
355
|
+
# ---------------------------------------------------------------------------
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
class TestSshRotateTemplate(unittest.TestCase):
|
|
359
|
+
def test_template_present_and_parseable(self):
|
|
360
|
+
REPO = Path(__file__).resolve().parents[3]
|
|
361
|
+
tmpl = REPO / "bootstrap" / "templates" / "autonomous" / "ssh-key-rotate.yaml"
|
|
362
|
+
self.assertTrue(tmpl.exists())
|
|
363
|
+
data = yaml.safe_load(tmpl.read_text())
|
|
364
|
+
self.assertEqual(data["id"], "ssh-key-rotate")
|
|
365
|
+
self.assertFalse(data["enabled"]) # opt-in by design
|
|
366
|
+
self.assertEqual(data["trigger"]["type"], "cron")
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
if __name__ == "__main__":
|
|
370
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"""Tests for the encrypted secrets vault.
|
|
2
|
+
|
|
3
|
+
Two backends to exercise:
|
|
4
|
+
|
|
5
|
+
* **plain** — always runs (the fallback when `age` is not installed).
|
|
6
|
+
* **age** — runs only when `age` and `age-keygen` are both on PATH.
|
|
7
|
+
We skip the age-specific cases otherwise so CI on minimal
|
|
8
|
+
hosts doesn't go red.
|
|
9
|
+
|
|
10
|
+
Also exercises the path-traversal refusal and the round-trip invariant
|
|
11
|
+
(write then read returns the same value).
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import shutil
|
|
17
|
+
import sys
|
|
18
|
+
import tempfile
|
|
19
|
+
import unittest
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from unittest import mock
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
HERE = Path(__file__).resolve().parent
|
|
25
|
+
sys.path.insert(0, str(HERE.parent))
|
|
26
|
+
|
|
27
|
+
from omega_engine.vault import ( # noqa: E402
|
|
28
|
+
_safe_ref,
|
|
29
|
+
vault_init,
|
|
30
|
+
vault_read,
|
|
31
|
+
vault_status,
|
|
32
|
+
vault_write,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
AGE_AVAILABLE = bool(shutil.which("age")) and bool(shutil.which("age-keygen"))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class TestSafeRef(unittest.TestCase):
|
|
40
|
+
def test_rejects_empty(self):
|
|
41
|
+
with self.assertRaises(ValueError):
|
|
42
|
+
_safe_ref("")
|
|
43
|
+
|
|
44
|
+
def test_rejects_path_traversal(self):
|
|
45
|
+
for bad in ("../escape", "a/b", "x\\y", ".hidden"):
|
|
46
|
+
with self.assertRaises(ValueError):
|
|
47
|
+
_safe_ref(bad)
|
|
48
|
+
|
|
49
|
+
def test_accepts_flat_names(self):
|
|
50
|
+
for good in ("CLAUDE_OAUTH", "max-primary_TOKEN", "abc123"):
|
|
51
|
+
self.assertEqual(_safe_ref(good), good)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TestPlainBackend(unittest.TestCase):
|
|
55
|
+
"""The fallback backend, always available."""
|
|
56
|
+
|
|
57
|
+
def test_init_with_no_age_picks_plain(self):
|
|
58
|
+
with tempfile.TemporaryDirectory() as td:
|
|
59
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
60
|
+
info = vault_init(td)
|
|
61
|
+
self.assertEqual(info["backend"], "plain")
|
|
62
|
+
self.assertFalse(info["age_installed"])
|
|
63
|
+
sec = Path(td) / "Agentik_Extra" / "etc" / "secrets"
|
|
64
|
+
self.assertTrue(sec.is_dir())
|
|
65
|
+
# secrets dir is mode 700
|
|
66
|
+
mode = sec.stat().st_mode & 0o777
|
|
67
|
+
self.assertEqual(mode, 0o700)
|
|
68
|
+
|
|
69
|
+
def test_round_trip_plain(self):
|
|
70
|
+
with tempfile.TemporaryDirectory() as td:
|
|
71
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
72
|
+
path = vault_write(td, "MY_TOKEN", "s3cret-value")
|
|
73
|
+
# mode 600
|
|
74
|
+
mode = path.stat().st_mode & 0o777
|
|
75
|
+
self.assertEqual(mode, 0o600)
|
|
76
|
+
# file is named without .age suffix in plain mode
|
|
77
|
+
self.assertTrue(path.name.endswith("MY_TOKEN"))
|
|
78
|
+
self.assertFalse(path.name.endswith(".age"))
|
|
79
|
+
|
|
80
|
+
got = vault_read(td, "MY_TOKEN")
|
|
81
|
+
self.assertEqual(got, "s3cret-value")
|
|
82
|
+
|
|
83
|
+
def test_read_returns_none_when_missing(self):
|
|
84
|
+
with tempfile.TemporaryDirectory() as td:
|
|
85
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
86
|
+
self.assertIsNone(vault_read(td, "ABSENT"))
|
|
87
|
+
|
|
88
|
+
def test_overwrite_rotates_in_place(self):
|
|
89
|
+
with tempfile.TemporaryDirectory() as td:
|
|
90
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
91
|
+
vault_write(td, "TOK", "v1")
|
|
92
|
+
vault_write(td, "TOK", "v2")
|
|
93
|
+
self.assertEqual(vault_read(td, "TOK"), "v2")
|
|
94
|
+
|
|
95
|
+
def test_status_counts_plain(self):
|
|
96
|
+
with tempfile.TemporaryDirectory() as td:
|
|
97
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
98
|
+
vault_write(td, "A", "1")
|
|
99
|
+
vault_write(td, "B", "2")
|
|
100
|
+
status = vault_status(td)
|
|
101
|
+
self.assertEqual(status["backend"], "plain")
|
|
102
|
+
self.assertEqual(status["plaintext_count"], 2)
|
|
103
|
+
self.assertEqual(status["encrypted_count"], 0)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@unittest.skipUnless(AGE_AVAILABLE, "age + age-keygen not installed on this host")
|
|
107
|
+
class TestAgeBackend(unittest.TestCase):
|
|
108
|
+
"""Exercised only when age is installed (CI may or may not have it)."""
|
|
109
|
+
|
|
110
|
+
def test_init_generates_keypair(self):
|
|
111
|
+
with tempfile.TemporaryDirectory() as td:
|
|
112
|
+
info = vault_init(td)
|
|
113
|
+
self.assertEqual(info["backend"], "age")
|
|
114
|
+
key = Path(info["key_path"])
|
|
115
|
+
pub = Path(info["pub_path"])
|
|
116
|
+
self.assertTrue(key.exists())
|
|
117
|
+
self.assertTrue(pub.exists())
|
|
118
|
+
self.assertEqual(key.stat().st_mode & 0o777, 0o600)
|
|
119
|
+
# public key file starts with "age1"
|
|
120
|
+
self.assertTrue(pub.read_text().strip().startswith("age1"))
|
|
121
|
+
|
|
122
|
+
def test_init_is_idempotent(self):
|
|
123
|
+
with tempfile.TemporaryDirectory() as td:
|
|
124
|
+
a = vault_init(td)
|
|
125
|
+
b = vault_init(td)
|
|
126
|
+
self.assertEqual(a["key_path"], b["key_path"])
|
|
127
|
+
self.assertEqual(a["pub_path"], b["pub_path"])
|
|
128
|
+
|
|
129
|
+
def test_round_trip_age(self):
|
|
130
|
+
with tempfile.TemporaryDirectory() as td:
|
|
131
|
+
path = vault_write(td, "OAUTH_X", "abc-DEF-123")
|
|
132
|
+
self.assertTrue(path.name.endswith(".age"))
|
|
133
|
+
mode = path.stat().st_mode & 0o777
|
|
134
|
+
self.assertEqual(mode, 0o600)
|
|
135
|
+
got = vault_read(td, "OAUTH_X")
|
|
136
|
+
self.assertEqual(got, "abc-DEF-123")
|
|
137
|
+
|
|
138
|
+
def test_status_counts_encrypted(self):
|
|
139
|
+
with tempfile.TemporaryDirectory() as td:
|
|
140
|
+
vault_write(td, "A", "1")
|
|
141
|
+
vault_write(td, "B", "2")
|
|
142
|
+
status = vault_status(td)
|
|
143
|
+
self.assertEqual(status["backend"], "age")
|
|
144
|
+
self.assertEqual(status["encrypted_count"], 2)
|
|
145
|
+
self.assertEqual(status["plaintext_count"], 0)
|
|
146
|
+
|
|
147
|
+
def test_write_cleans_up_old_plaintext(self):
|
|
148
|
+
with tempfile.TemporaryDirectory() as td:
|
|
149
|
+
# Pre-seed a plaintext file as if from a legacy install.
|
|
150
|
+
with mock.patch("omega_engine.vault._age_available", return_value=False):
|
|
151
|
+
vault_write(td, "LEGACY", "old")
|
|
152
|
+
# Now write through the age backend.
|
|
153
|
+
vault_write(td, "LEGACY", "new")
|
|
154
|
+
sec = Path(td) / "Agentik_Extra" / "etc" / "secrets"
|
|
155
|
+
self.assertTrue((sec / "LEGACY.age").exists())
|
|
156
|
+
self.assertFalse((sec / "LEGACY").exists(),
|
|
157
|
+
"old plaintext should have been cleaned up")
|
|
158
|
+
self.assertEqual(vault_read(td, "LEGACY"), "new")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class TestAccountUsesVault(unittest.TestCase):
|
|
162
|
+
"""`account.write_token` / `read_token` must round-trip through the vault."""
|
|
163
|
+
|
|
164
|
+
def test_account_token_round_trip(self):
|
|
165
|
+
from omega_engine.account import read_token, write_token
|
|
166
|
+
|
|
167
|
+
with tempfile.TemporaryDirectory() as td:
|
|
168
|
+
write_token(td, "MAX_PRIMARY", "claude-token-xyz")
|
|
169
|
+
self.assertEqual(read_token(td, "MAX_PRIMARY"), "claude-token-xyz")
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
if __name__ == "__main__":
|
|
173
|
+
unittest.main(verbosity=2)
|