@agentikos/omega-os 0.1.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 +56 -14
- 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 +1000 -26
- package/bootstrap/manifest.example.yaml +93 -2
- 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/COMPLETION-PLAN.md +48 -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 +27 -10
- package/omega/Agentik_Engine/omega_engine/__init__.py +212 -2
- 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_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__/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__/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__/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__/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__/sync.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 +502 -0
- 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/autonomous.py +538 -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 +4564 -56
- 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/__init__.py +14 -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/autonomous.py +56 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +236 -0
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +315 -0
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__init__.py +51 -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/educators/artifact.py +65 -0
- package/omega/Agentik_Engine/omega_engine/educators/automation.py +76 -0
- package/omega/Agentik_Engine/omega_engine/educators/base.py +327 -0
- package/omega/Agentik_Engine/omega_engine/educators/claudecode.py +71 -0
- package/omega/Agentik_Engine/omega_engine/educators/connection.py +75 -0
- package/omega/Agentik_Engine/omega_engine/educators/coworker.py +68 -0
- package/omega/Agentik_Engine/omega_engine/educators/loop.py +82 -0
- package/omega/Agentik_Engine/omega_engine/educators/prompt.py +68 -0
- package/omega/Agentik_Engine/omega_engine/educators/skill.py +69 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +195 -16
- 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 +29 -14
- 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 +408 -13
- 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/__init__.py +21 -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/rag/agentic.py +83 -0
- package/omega/Agentik_Engine/omega_engine/rag/base.py +42 -0
- package/omega/Agentik_Engine/omega_engine/rag/corrective.py +119 -0
- package/omega/Agentik_Engine/omega_engine/rag/graph.py +169 -0
- package/omega/Agentik_Engine/omega_engine/rag/hybrid.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/multimodal.py +136 -0
- package/omega/Agentik_Engine/omega_engine/rag/router.py +110 -0
- package/omega/Agentik_Engine/omega_engine/reducer.py +21 -3
- 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 +132 -25
- package/omega/Agentik_Engine/omega_engine/sync.py +445 -0
- 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/tools.py +272 -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_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_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_progress.cpython-313-pytest-8.4.2.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_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_report.cpython-313-pytest-8.4.2.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 +338 -0
- 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_autonomous.py +361 -0
- package/omega/Agentik_Engine/tests/test_educators.py +233 -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_rag.py +287 -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_snapshot_partial.py +172 -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_tools_and_sync.py +312 -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 +82 -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,151 @@
|
|
|
1
|
+
"""`omega prune` — bound the growth of runtime SQLite stores.
|
|
2
|
+
|
|
3
|
+
Three stores grow forever today:
|
|
4
|
+
|
|
5
|
+
* ``Agentik_Runtime/eventlog/omega.db`` (mission events)
|
|
6
|
+
* ``Agentik_Runtime/audits.db`` (forensic-audit history)
|
|
7
|
+
* ``Agentik_Runtime/telegram-history.db`` (per-topic chat history)
|
|
8
|
+
|
|
9
|
+
Plus the per-task ``Agentik_Runtime/sessions/<task_id>/`` directories.
|
|
10
|
+
|
|
11
|
+
This module is the bounded-growth control. Every operation has:
|
|
12
|
+
* A ``dry_run`` mode that reports what WOULD be deleted (default
|
|
13
|
+
behaviour from the CLI is dry-run; ``--yes`` enacts).
|
|
14
|
+
* An explicit "older than" cutoff (no implicit "keep last N").
|
|
15
|
+
* Per-DB transaction so a crash mid-prune leaves the DB consistent.
|
|
16
|
+
|
|
17
|
+
Tests cover both modes: a dry-run never mutates, and a real prune drops
|
|
18
|
+
exactly the rows we promised.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import shutil
|
|
23
|
+
import sqlite3
|
|
24
|
+
import time
|
|
25
|
+
from dataclasses import dataclass
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class PruneReport:
|
|
31
|
+
target: str
|
|
32
|
+
rows_deleted: int = 0
|
|
33
|
+
files_deleted: int = 0
|
|
34
|
+
bytes_freed: int = 0
|
|
35
|
+
dry_run: bool = False
|
|
36
|
+
detail: str = ""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _prune_table(
|
|
40
|
+
db_path: Path, table: str, cutoff_seconds: int,
|
|
41
|
+
*, time_column: str = "timestamp", dry_run: bool = False,
|
|
42
|
+
) -> int:
|
|
43
|
+
"""Delete rows older than `cutoff_seconds` from `table`. Returns rowcount."""
|
|
44
|
+
if not db_path.exists():
|
|
45
|
+
return 0
|
|
46
|
+
cutoff = int(time.time()) - cutoff_seconds
|
|
47
|
+
conn = sqlite3.connect(str(db_path))
|
|
48
|
+
try:
|
|
49
|
+
if dry_run:
|
|
50
|
+
cur = conn.execute(
|
|
51
|
+
f"SELECT COUNT(*) FROM {table} WHERE {time_column} < ?",
|
|
52
|
+
(cutoff,),
|
|
53
|
+
)
|
|
54
|
+
return int(cur.fetchone()[0])
|
|
55
|
+
cur = conn.execute(
|
|
56
|
+
f"DELETE FROM {table} WHERE {time_column} < ?",
|
|
57
|
+
(cutoff,),
|
|
58
|
+
)
|
|
59
|
+
conn.commit()
|
|
60
|
+
return cur.rowcount or 0
|
|
61
|
+
except sqlite3.OperationalError:
|
|
62
|
+
# Table missing — nothing to prune.
|
|
63
|
+
return 0
|
|
64
|
+
finally:
|
|
65
|
+
conn.close()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def prune_events(
|
|
69
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
70
|
+
) -> PruneReport:
|
|
71
|
+
"""Drop mission events older than `older_than_days`."""
|
|
72
|
+
home = Path(omega_home)
|
|
73
|
+
db = home / "Agentik_Runtime" / "eventlog" / "omega.db"
|
|
74
|
+
n = _prune_table(db, "events", older_than_days * 86400,
|
|
75
|
+
time_column="ts", dry_run=dry_run)
|
|
76
|
+
return PruneReport(
|
|
77
|
+
target="events", rows_deleted=n, dry_run=dry_run,
|
|
78
|
+
detail=f"older_than={older_than_days}d",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def prune_audits(
|
|
83
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
84
|
+
) -> PruneReport:
|
|
85
|
+
home = Path(omega_home)
|
|
86
|
+
db = home / "Agentik_Runtime" / "audits.db"
|
|
87
|
+
n = _prune_table(db, "audit_runs", older_than_days * 86400,
|
|
88
|
+
time_column="timestamp", dry_run=dry_run)
|
|
89
|
+
return PruneReport(
|
|
90
|
+
target="audits", rows_deleted=n, dry_run=dry_run,
|
|
91
|
+
detail=f"older_than={older_than_days}d",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def prune_telegram(
|
|
96
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
97
|
+
) -> PruneReport:
|
|
98
|
+
home = Path(omega_home)
|
|
99
|
+
db = home / "Agentik_Runtime" / "telegram-history.db"
|
|
100
|
+
n = _prune_table(db, "messages", older_than_days * 86400,
|
|
101
|
+
time_column="timestamp", dry_run=dry_run)
|
|
102
|
+
return PruneReport(
|
|
103
|
+
target="telegram", rows_deleted=n, dry_run=dry_run,
|
|
104
|
+
detail=f"older_than={older_than_days}d",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def prune_sessions(
|
|
109
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
110
|
+
) -> PruneReport:
|
|
111
|
+
"""Remove per-task session dirs whose newest file is older than the cutoff."""
|
|
112
|
+
home = Path(omega_home)
|
|
113
|
+
sess_root = home / "Agentik_Runtime" / "sessions"
|
|
114
|
+
if not sess_root.is_dir():
|
|
115
|
+
return PruneReport(target="sessions", dry_run=dry_run)
|
|
116
|
+
cutoff = time.time() - older_than_days * 86400
|
|
117
|
+
n = 0
|
|
118
|
+
bytes_freed = 0
|
|
119
|
+
for child in sess_root.iterdir():
|
|
120
|
+
if not child.is_dir():
|
|
121
|
+
continue
|
|
122
|
+
# newest file mtime under this dir
|
|
123
|
+
newest = max(
|
|
124
|
+
(p.stat().st_mtime for p in child.rglob("*") if p.is_file()),
|
|
125
|
+
default=child.stat().st_mtime,
|
|
126
|
+
)
|
|
127
|
+
if newest >= cutoff:
|
|
128
|
+
continue
|
|
129
|
+
# measure size before delete (for dry-run)
|
|
130
|
+
sz = sum(p.stat().st_size for p in child.rglob("*") if p.is_file())
|
|
131
|
+
if not dry_run:
|
|
132
|
+
shutil.rmtree(child, ignore_errors=True)
|
|
133
|
+
n += 1
|
|
134
|
+
bytes_freed += sz
|
|
135
|
+
return PruneReport(
|
|
136
|
+
target="sessions", files_deleted=n, bytes_freed=bytes_freed,
|
|
137
|
+
dry_run=dry_run, detail=f"older_than={older_than_days}d",
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def prune_all(
|
|
142
|
+
omega_home: str | Path, *, older_than_days: int = 90,
|
|
143
|
+
dry_run: bool = False,
|
|
144
|
+
) -> list[PruneReport]:
|
|
145
|
+
"""One call to prune everything to the same cutoff."""
|
|
146
|
+
return [
|
|
147
|
+
prune_events(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
148
|
+
prune_audits(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
149
|
+
prune_telegram(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
150
|
+
prune_sessions(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
151
|
+
]
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""pursue — goal-driven execution loop.
|
|
2
|
+
|
|
3
|
+
The Agentik OS native equivalent of a goal-driven worker. Takes a
|
|
4
|
+
``verify_cmd`` and an ``intent``. Iterates: ask the provider to act, run
|
|
5
|
+
``verify_cmd``, if exit 0 → success; otherwise feed the failure back and
|
|
6
|
+
iterate. Caps at ``max_iterations`` and writes a per-iteration log.
|
|
7
|
+
|
|
8
|
+
Why this exists:
|
|
9
|
+
Claude Code's bundled ``/goal`` does this in the editor. We rebuild it
|
|
10
|
+
as a portable engine primitive so OmegaOS workers (running in any
|
|
11
|
+
context — daemon, CLI, autonomous charter) can use the same loop without
|
|
12
|
+
depending on a specific bundled skill we don't control.
|
|
13
|
+
|
|
14
|
+
Output:
|
|
15
|
+
Each iteration appends to ``Agentik_Runtime/sessions/<task_id>/pursue.log``
|
|
16
|
+
with ``{iteration, attempted_change, verify_exit, verify_tail}``.
|
|
17
|
+
On success, writes a ``done.json`` (via ``omega_engine.done_signal``)
|
|
18
|
+
with ``status=done_clean`` and a summary. On budget exhaustion, the same
|
|
19
|
+
but with ``status=failed`` and the cumulative attempts as ``errors``.
|
|
20
|
+
|
|
21
|
+
The provider used is the engine's normal ModelRouter — works with the
|
|
22
|
+
MockProvider in tests and with ClaudeProvider in production.
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
import shlex
|
|
29
|
+
import subprocess
|
|
30
|
+
import time
|
|
31
|
+
import uuid
|
|
32
|
+
from dataclasses import dataclass, field
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
from typing import Any
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class PursueResult:
|
|
39
|
+
task_id: str
|
|
40
|
+
status: str # "done_clean" | "failed"
|
|
41
|
+
iterations: int
|
|
42
|
+
final_verify_exit: int | None
|
|
43
|
+
log_path: Path
|
|
44
|
+
done_path: Path
|
|
45
|
+
artifacts: dict[str, Any] = field(default_factory=dict)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _run_verify(verify_cmd: str, *, cwd: str | None = None,
|
|
49
|
+
timeout: int = 600) -> tuple[int, str]:
|
|
50
|
+
"""Run the verify command in a shell and capture (exit_code, tail-of-output).
|
|
51
|
+
|
|
52
|
+
Returns a 2-tuple. ``tail`` is the last ~80 lines of stdout+stderr so we
|
|
53
|
+
can feed it back to the provider as the iteration's "what broke" context.
|
|
54
|
+
"""
|
|
55
|
+
try:
|
|
56
|
+
proc = subprocess.run(
|
|
57
|
+
verify_cmd, shell=True, check=False, capture_output=True,
|
|
58
|
+
text=True, timeout=timeout, cwd=cwd,
|
|
59
|
+
)
|
|
60
|
+
except subprocess.TimeoutExpired:
|
|
61
|
+
return 124, "(verify_cmd timed out)"
|
|
62
|
+
out = (proc.stdout or "") + (proc.stderr or "")
|
|
63
|
+
tail = "\n".join(out.splitlines()[-80:])
|
|
64
|
+
return proc.returncode, tail
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def pursue(
|
|
68
|
+
intent: str,
|
|
69
|
+
verify_cmd: str,
|
|
70
|
+
*,
|
|
71
|
+
omega_home: str | Path | None = None,
|
|
72
|
+
task_id: str | None = None,
|
|
73
|
+
project: str | None = None,
|
|
74
|
+
max_iterations: int = 20,
|
|
75
|
+
cwd: str | None = None,
|
|
76
|
+
role: str = "worker",
|
|
77
|
+
timeout_per_iter: int = 600,
|
|
78
|
+
router=None,
|
|
79
|
+
) -> PursueResult:
|
|
80
|
+
"""Drive an agent toward a goal until ``verify_cmd`` exits 0.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
intent: the natural-language goal the agent is pursuing.
|
|
84
|
+
verify_cmd: the shell command that proves the goal is met (exit 0).
|
|
85
|
+
omega_home: ``$OMEGA_HOME`` (defaults to env or ``~/Omega``).
|
|
86
|
+
task_id: optional id; one is generated if not provided.
|
|
87
|
+
project: project slug; if set, the cwd defaults to that project's
|
|
88
|
+
directory and per-project artefacts live there.
|
|
89
|
+
max_iterations: hard cap on attempts (default 20).
|
|
90
|
+
cwd: working directory for ``verify_cmd``. Defaults to project path
|
|
91
|
+
when ``project`` is set, else current directory.
|
|
92
|
+
role: provider role to use (default ``worker``).
|
|
93
|
+
timeout_per_iter: timeout (seconds) per provider call + verify pair.
|
|
94
|
+
router: an ``omega_engine.router.ModelRouter`` — defaults to one
|
|
95
|
+
built from env (mock if no real provider configured).
|
|
96
|
+
|
|
97
|
+
Returns: a ``PursueResult`` describing the outcome.
|
|
98
|
+
"""
|
|
99
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
100
|
+
Path.home() / "Omega")
|
|
101
|
+
task_id = task_id or "pur-" + uuid.uuid4().hex[:8]
|
|
102
|
+
|
|
103
|
+
# Local imports — keep this module's import-cost low.
|
|
104
|
+
from omega_engine.done_signal import DoneSignal, session_dir, write_done
|
|
105
|
+
from omega_engine.envelope import EnvelopeContext, build_envelope
|
|
106
|
+
from omega_engine.provider import AgentRequest
|
|
107
|
+
|
|
108
|
+
if router is None:
|
|
109
|
+
from omega_engine.router import ModelRouter
|
|
110
|
+
from omega_engine.provider import MockProvider
|
|
111
|
+
router = ModelRouter.single(MockProvider())
|
|
112
|
+
|
|
113
|
+
# Resolve cwd from project if not explicit.
|
|
114
|
+
if cwd is None and project:
|
|
115
|
+
cwd = str(home / "Agentik_Coding" / "projects" / project)
|
|
116
|
+
cwd = cwd or os.getcwd()
|
|
117
|
+
|
|
118
|
+
sess = session_dir(home, task_id)
|
|
119
|
+
log_path = sess / "pursue.log"
|
|
120
|
+
done_p = sess / ".done.json"
|
|
121
|
+
|
|
122
|
+
def log_iter(payload: dict[str, Any]) -> None:
|
|
123
|
+
with open(log_path, "a") as fh:
|
|
124
|
+
fh.write(json.dumps({"ts": int(time.time()), **payload}) + "\n")
|
|
125
|
+
|
|
126
|
+
provider = router.resolve(role)
|
|
127
|
+
last_exit: int | None = None
|
|
128
|
+
last_tail: str = ""
|
|
129
|
+
attempts: list[dict[str, Any]] = []
|
|
130
|
+
|
|
131
|
+
for i in range(1, max_iterations + 1):
|
|
132
|
+
# Build a rich envelope: the agent sees the goal, the verify_cmd,
|
|
133
|
+
# the previous failure tail, and its done.json contract.
|
|
134
|
+
ctx = EnvelopeContext(
|
|
135
|
+
role=role,
|
|
136
|
+
intent=(
|
|
137
|
+
f"GOAL: {intent}\n\n"
|
|
138
|
+
f"VERIFY: `{verify_cmd}` (must exit 0 to be done).\n\n"
|
|
139
|
+
+ (f"PREVIOUS FAILURE (iter {i - 1}, exit {last_exit}):\n"
|
|
140
|
+
f"```\n{last_tail}\n```\n" if i > 1 else "")
|
|
141
|
+
+ f"This is iteration {i} of {max_iterations}. "
|
|
142
|
+
f"Make one focused, surgical change."
|
|
143
|
+
),
|
|
144
|
+
task_id=task_id,
|
|
145
|
+
verify_cmd=verify_cmd,
|
|
146
|
+
done_json_path=str(done_p),
|
|
147
|
+
project={"slug": project, "path": cwd} if project else None,
|
|
148
|
+
)
|
|
149
|
+
envelope = build_envelope(home, ctx)
|
|
150
|
+
request = AgentRequest(
|
|
151
|
+
role=role, prompt=envelope["user"], context={
|
|
152
|
+
"task": intent, "verify_cmd": verify_cmd,
|
|
153
|
+
}, system=envelope["system"],
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
result = provider.run(request)
|
|
158
|
+
except Exception as exc: # noqa: BLE001
|
|
159
|
+
log_iter({"iter": i, "provider_error": str(exc)[:300]})
|
|
160
|
+
attempts.append({"iter": i, "error": str(exc)[:300]})
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
# Run verify after the provider's turn.
|
|
164
|
+
exit_code, tail = _run_verify(
|
|
165
|
+
verify_cmd, cwd=cwd, timeout=timeout_per_iter,
|
|
166
|
+
)
|
|
167
|
+
last_exit = exit_code
|
|
168
|
+
last_tail = tail
|
|
169
|
+
log_iter({
|
|
170
|
+
"iter": i, "verify_exit": exit_code,
|
|
171
|
+
"provider_text": (result.text or "")[:300],
|
|
172
|
+
"verify_tail": tail[-400:],
|
|
173
|
+
})
|
|
174
|
+
attempts.append({"iter": i, "exit": exit_code})
|
|
175
|
+
|
|
176
|
+
if exit_code == 0:
|
|
177
|
+
sig = DoneSignal(
|
|
178
|
+
status="done_clean",
|
|
179
|
+
summary=f"goal '{intent}' verified by `{verify_cmd}` in {i} iter(s)",
|
|
180
|
+
artifacts={"attempts": attempts, "log": str(log_path)},
|
|
181
|
+
files_changed=list(result.artifacts.get("files") or []),
|
|
182
|
+
)
|
|
183
|
+
write_done(home, task_id, sig)
|
|
184
|
+
return PursueResult(
|
|
185
|
+
task_id=task_id, status="done_clean", iterations=i,
|
|
186
|
+
final_verify_exit=0, log_path=log_path, done_path=done_p,
|
|
187
|
+
artifacts=dict(sig.artifacts),
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# Budget exhausted — honest failure.
|
|
191
|
+
sig = DoneSignal(
|
|
192
|
+
status="failed",
|
|
193
|
+
summary=(
|
|
194
|
+
f"goal '{intent}' not met after {max_iterations} iterations "
|
|
195
|
+
f"(last exit {last_exit})"
|
|
196
|
+
),
|
|
197
|
+
artifacts={"attempts": attempts, "log": str(log_path)},
|
|
198
|
+
errors=[f"final verify exit: {last_exit}", last_tail[-200:]],
|
|
199
|
+
)
|
|
200
|
+
write_done(home, task_id, sig)
|
|
201
|
+
return PursueResult(
|
|
202
|
+
task_id=task_id, status="failed", iterations=max_iterations,
|
|
203
|
+
final_verify_exit=last_exit, log_path=log_path, done_path=done_p,
|
|
204
|
+
artifacts=dict(sig.artifacts),
|
|
205
|
+
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Omega OS multi-RAG subsystem — five strategies behind one Protocol.
|
|
2
|
+
|
|
3
|
+
`base.Retriever` is the contract every strategy honours. The Corrective RAG
|
|
4
|
+
envelope (corrective.CorrectiveRetriever) wraps the chosen strategy; the
|
|
5
|
+
router picks which strategy runs.
|
|
6
|
+
|
|
7
|
+
See docs/ARCHITECTURE.md §7 for the full design.
|
|
8
|
+
"""
|
|
9
|
+
from omega_engine.rag.agentic import AgenticRetriever
|
|
10
|
+
from omega_engine.rag.base import Document, RetrievalResult, Retriever
|
|
11
|
+
from omega_engine.rag.corrective import CorrectiveRetriever
|
|
12
|
+
from omega_engine.rag.graph import GraphRetriever
|
|
13
|
+
from omega_engine.rag.hybrid import HybridRetriever
|
|
14
|
+
from omega_engine.rag.multimodal import MultimodalRetriever
|
|
15
|
+
from omega_engine.rag.router import RAGRouter
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"Document", "RetrievalResult", "Retriever",
|
|
19
|
+
"HybridRetriever", "GraphRetriever", "AgenticRetriever",
|
|
20
|
+
"CorrectiveRetriever", "MultimodalRetriever", "RAGRouter",
|
|
21
|
+
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Agentic retriever — multi-hop retrieval steered by a provider.
|
|
2
|
+
|
|
3
|
+
After every hop, the provider (role "rag-agent") looks at the current
|
|
4
|
+
context and decides: keep going (return a refined `next_query`) or stop
|
|
5
|
+
(`done: true`). The retriever loops up to `max_hops` and returns the
|
|
6
|
+
accumulated, de-duplicated documents.
|
|
7
|
+
|
|
8
|
+
This is the strategy for "decompose then dig" queries — questions where the
|
|
9
|
+
first retrieval surfaces a clue, and the second clue is buried inside what
|
|
10
|
+
the first one found.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from omega_engine.provider import AgentProvider, AgentRequest
|
|
15
|
+
from omega_engine.rag.base import Document, RetrievalResult, Retriever
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AgenticRetriever:
|
|
19
|
+
"""Multi-hop on top of any underlying retriever."""
|
|
20
|
+
|
|
21
|
+
strategy = "agentic"
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
inner: Retriever,
|
|
26
|
+
provider: AgentProvider,
|
|
27
|
+
*,
|
|
28
|
+
max_hops: int = 3,
|
|
29
|
+
k_per_hop: int = 4,
|
|
30
|
+
) -> None:
|
|
31
|
+
self.inner = inner
|
|
32
|
+
self.provider = provider
|
|
33
|
+
self.max_hops = max_hops
|
|
34
|
+
self.k_per_hop = k_per_hop
|
|
35
|
+
|
|
36
|
+
def retrieve(self, query: str, k: int = 5) -> RetrievalResult:
|
|
37
|
+
seen_ids: set[str] = set()
|
|
38
|
+
accumulated: list[Document] = []
|
|
39
|
+
current = query
|
|
40
|
+
last_score = 0.0
|
|
41
|
+
|
|
42
|
+
for hop in range(self.max_hops):
|
|
43
|
+
partial = self.inner.retrieve(current, k=self.k_per_hop)
|
|
44
|
+
last_score = partial.score
|
|
45
|
+
for d in partial.documents:
|
|
46
|
+
if d.id in seen_ids:
|
|
47
|
+
continue
|
|
48
|
+
seen_ids.add(d.id)
|
|
49
|
+
meta = dict(d.metadata)
|
|
50
|
+
meta["hop"] = hop
|
|
51
|
+
accumulated.append(Document(id=d.id, text=d.text, metadata=meta))
|
|
52
|
+
|
|
53
|
+
# Ask the provider whether to stop or refine.
|
|
54
|
+
ctx_snippets = [d.text[:200] for d in partial.documents[:3]]
|
|
55
|
+
decision = self.provider.run(AgentRequest(
|
|
56
|
+
role="rag-agent",
|
|
57
|
+
prompt=(
|
|
58
|
+
f"Original query: {query}\n"
|
|
59
|
+
f"Current hop: {hop}\n"
|
|
60
|
+
f"Just-retrieved snippets:\n- " + "\n- ".join(ctx_snippets)
|
|
61
|
+
),
|
|
62
|
+
context={
|
|
63
|
+
"original_query": query,
|
|
64
|
+
"current_query": current,
|
|
65
|
+
"hop": hop,
|
|
66
|
+
"snippets": ctx_snippets,
|
|
67
|
+
},
|
|
68
|
+
))
|
|
69
|
+
artifacts = decision.artifacts or {}
|
|
70
|
+
if artifacts.get("done"):
|
|
71
|
+
break
|
|
72
|
+
next_q = artifacts.get("next_query")
|
|
73
|
+
if not next_q or next_q == current:
|
|
74
|
+
break
|
|
75
|
+
current = str(next_q)
|
|
76
|
+
|
|
77
|
+
# Final ranking: keep accumulation order (earlier hops first), trim to k.
|
|
78
|
+
return RetrievalResult(
|
|
79
|
+
query=query,
|
|
80
|
+
documents=accumulated[:k],
|
|
81
|
+
score=last_score,
|
|
82
|
+
strategy=self.strategy,
|
|
83
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Shared contracts for every retriever — Document, RetrievalResult, Retriever.
|
|
2
|
+
|
|
3
|
+
The whole RAG subsystem talks to these three types. A retriever is anything
|
|
4
|
+
with `retrieve(query, k) -> RetrievalResult`. Strategies plug in behind the
|
|
5
|
+
same interface, the router picks between them, and the Corrective envelope
|
|
6
|
+
wraps any of them.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Any, Protocol, runtime_checkable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class Document:
|
|
16
|
+
"""A single retrievable unit — text + provenance.
|
|
17
|
+
|
|
18
|
+
`metadata` is free-form: source path, modality, chunk index, score,
|
|
19
|
+
captions for images, anything a strategy wants to surface upward.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: str
|
|
23
|
+
text: str
|
|
24
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class RetrievalResult:
|
|
29
|
+
"""What every retriever returns. The router fans these up; the corrective
|
|
30
|
+
envelope grades them; the caller reads `documents`."""
|
|
31
|
+
|
|
32
|
+
query: str
|
|
33
|
+
documents: list[Document]
|
|
34
|
+
score: float = 0.0 # aggregate confidence in [0, 1]
|
|
35
|
+
strategy: str = "" # which retriever produced this result
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@runtime_checkable
|
|
39
|
+
class Retriever(Protocol):
|
|
40
|
+
"""The whole RAG subsystem speaks this Protocol."""
|
|
41
|
+
|
|
42
|
+
def retrieve(self, query: str, k: int = 5) -> RetrievalResult: ...
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Corrective RAG (CRAG) — the envelope every strategy wears.
|
|
2
|
+
|
|
3
|
+
For each retrieval, the provider (role "rag-grader") scores every doc 0-100.
|
|
4
|
+
If the average is below `threshold`, the provider (role "rag-agent") produces
|
|
5
|
+
a refined query and we re-retrieve. Bounded retries — never an infinite loop.
|
|
6
|
+
|
|
7
|
+
This is the user's explicit design: corrective wraps the chosen strategy.
|
|
8
|
+
The router resolves WHICH retriever runs; the corrective layer ensures the
|
|
9
|
+
RESULT meets a quality floor.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from omega_engine.provider import AgentProvider, AgentRequest
|
|
14
|
+
from omega_engine.rag.base import Document, RetrievalResult, Retriever
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CorrectiveRetriever:
|
|
18
|
+
"""Grade → if low, refine query and retry. Bounded by `max_retries`."""
|
|
19
|
+
|
|
20
|
+
strategy = "corrective"
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
inner: Retriever,
|
|
25
|
+
provider: AgentProvider,
|
|
26
|
+
*,
|
|
27
|
+
threshold: float = 70.0,
|
|
28
|
+
max_retries: int = 2,
|
|
29
|
+
) -> None:
|
|
30
|
+
self.inner = inner
|
|
31
|
+
self.provider = provider
|
|
32
|
+
self.threshold = threshold
|
|
33
|
+
self.max_retries = max_retries
|
|
34
|
+
|
|
35
|
+
def retrieve(self, query: str, k: int = 5) -> RetrievalResult:
|
|
36
|
+
current = query
|
|
37
|
+
last: RetrievalResult | None = None
|
|
38
|
+
|
|
39
|
+
for attempt in range(self.max_retries + 1):
|
|
40
|
+
result = self.inner.retrieve(current, k=k)
|
|
41
|
+
last = result
|
|
42
|
+
if not result.documents:
|
|
43
|
+
break
|
|
44
|
+
|
|
45
|
+
grade_avg = self._grade(current, result.documents)
|
|
46
|
+
# Stamp the grade onto every document so the caller can see it.
|
|
47
|
+
for d in result.documents:
|
|
48
|
+
d.metadata["grader_avg"] = grade_avg
|
|
49
|
+
result.score = max(result.score, grade_avg / 100.0)
|
|
50
|
+
|
|
51
|
+
if grade_avg >= self.threshold or attempt == self.max_retries:
|
|
52
|
+
# Either good enough OR we've used up our retries.
|
|
53
|
+
inner_strategy = result.strategy
|
|
54
|
+
return RetrievalResult(
|
|
55
|
+
query=query,
|
|
56
|
+
documents=result.documents,
|
|
57
|
+
score=result.score,
|
|
58
|
+
strategy=f"corrective+{inner_strategy}",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Below threshold AND retries remain — ask provider for a refined
|
|
62
|
+
# query and try again.
|
|
63
|
+
current = self._refine(query, current, result.documents)
|
|
64
|
+
|
|
65
|
+
# Defensive fallback — exhausted retries but never returned (e.g.
|
|
66
|
+
# zero docs from inner). Surface what we have, untouched.
|
|
67
|
+
if last is None:
|
|
68
|
+
return RetrievalResult(query=query, documents=[], score=0.0,
|
|
69
|
+
strategy="corrective+empty")
|
|
70
|
+
return RetrievalResult(
|
|
71
|
+
query=query,
|
|
72
|
+
documents=last.documents,
|
|
73
|
+
score=last.score,
|
|
74
|
+
strategy=f"corrective+{last.strategy}",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# ----- internals -----
|
|
78
|
+
|
|
79
|
+
def _grade(self, query: str, docs: list[Document]) -> float:
|
|
80
|
+
"""Average grader score in 0-100. Bounded; missing scores → 0."""
|
|
81
|
+
result = self.provider.run(AgentRequest(
|
|
82
|
+
role="rag-grader",
|
|
83
|
+
prompt=f"Score relevance 0-100 for query: {query}",
|
|
84
|
+
context={
|
|
85
|
+
"query": query,
|
|
86
|
+
"documents": [
|
|
87
|
+
{"id": d.id, "text": d.text[:300]} for d in docs
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
))
|
|
91
|
+
raw = (result.artifacts or {}).get("scores", [])
|
|
92
|
+
scores = [float(s) for s in raw if isinstance(s, (int, float))]
|
|
93
|
+
if not scores:
|
|
94
|
+
return 0.0
|
|
95
|
+
avg = sum(scores) / len(scores)
|
|
96
|
+
return max(0.0, min(100.0, avg))
|
|
97
|
+
|
|
98
|
+
def _refine(self, original: str, current: str, docs: list[Document]) -> str:
|
|
99
|
+
"""Ask the provider for a refined query. Fallback: append context."""
|
|
100
|
+
result = self.provider.run(AgentRequest(
|
|
101
|
+
role="rag-agent",
|
|
102
|
+
prompt=(
|
|
103
|
+
f"Original query: {original}\n"
|
|
104
|
+
f"Current query: {current}\n"
|
|
105
|
+
"These docs scored below the relevance threshold. "
|
|
106
|
+
"Suggest a better query."
|
|
107
|
+
),
|
|
108
|
+
context={
|
|
109
|
+
"original_query": original,
|
|
110
|
+
"current_query": current,
|
|
111
|
+
"snippets": [d.text[:200] for d in docs[:3]],
|
|
112
|
+
},
|
|
113
|
+
))
|
|
114
|
+
next_q = (result.artifacts or {}).get("next_query")
|
|
115
|
+
if next_q and next_q != current:
|
|
116
|
+
return str(next_q)
|
|
117
|
+
# Provider had nothing useful — perturb the query so the inner
|
|
118
|
+
# retriever sees something different.
|
|
119
|
+
return f"{current} context"
|