@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,215 @@
|
|
|
1
|
+
"""`omega backup` + `omega restore` — disaster-recovery for an OmegaOS deployment.
|
|
2
|
+
|
|
3
|
+
What we back up by default:
|
|
4
|
+
|
|
5
|
+
* ``Agentik_Runtime/`` (event log, audits, telegram history, sessions)
|
|
6
|
+
* ``Agentik_Extra/etc/secrets/`` (encrypted vault — the .age files +
|
|
7
|
+
the .vault-key)
|
|
8
|
+
* ``Agentik_SSOT/`` (operator-edited skills, audits, charters,
|
|
9
|
+
webhooks — anything modified post-install)
|
|
10
|
+
* ``Agentik_Coding/projects.json`` (project registry)
|
|
11
|
+
|
|
12
|
+
What we do NOT back up:
|
|
13
|
+
|
|
14
|
+
* The engine venv (regenerated by re-running install.sh)
|
|
15
|
+
* MCP binaries (installed by step 40, idempotent)
|
|
16
|
+
* Cache + tmp dirs
|
|
17
|
+
|
|
18
|
+
The bundle is a tar.gz at ``~/omega-backup-<timestamp>.tar.gz`` by
|
|
19
|
+
default. When the operator passes ``--encrypt``, the tarball is then
|
|
20
|
+
piped through ``age -r <pub>`` so the bundle itself is at-rest
|
|
21
|
+
encrypted. The recipient defaults to the operator's existing
|
|
22
|
+
``.vault-pub`` so they need no extra key management.
|
|
23
|
+
|
|
24
|
+
``omega backup verify <path>`` extracts the bundle into a temp dir and
|
|
25
|
+
re-runs ``omega doctor`` against it. Pass = the backup actually
|
|
26
|
+
restores; fail = the bundle is corrupt or incomplete.
|
|
27
|
+
"""
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import os
|
|
31
|
+
import shutil
|
|
32
|
+
import subprocess
|
|
33
|
+
import tarfile
|
|
34
|
+
import tempfile
|
|
35
|
+
import time
|
|
36
|
+
from dataclasses import dataclass
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
BACKUP_ROOTS = [
|
|
41
|
+
"Agentik_Runtime",
|
|
42
|
+
"Agentik_Extra/etc/secrets",
|
|
43
|
+
"Agentik_SSOT",
|
|
44
|
+
"Agentik_Coding/projects.json",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class BackupResult:
|
|
50
|
+
bundle: Path
|
|
51
|
+
bytes: int
|
|
52
|
+
encrypted: bool
|
|
53
|
+
duration_s: float
|
|
54
|
+
detail: str = ""
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class RestoreResult:
|
|
59
|
+
bundle: Path
|
|
60
|
+
target: Path
|
|
61
|
+
files: int
|
|
62
|
+
duration_s: float
|
|
63
|
+
detail: str = ""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _have(binary: str) -> bool:
|
|
67
|
+
return shutil.which(binary) is not None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def backup(
|
|
71
|
+
omega_home: str | Path,
|
|
72
|
+
*,
|
|
73
|
+
out_dir: str | Path | None = None,
|
|
74
|
+
encrypt: bool = False,
|
|
75
|
+
recipient_path: str | Path | None = None,
|
|
76
|
+
) -> BackupResult:
|
|
77
|
+
"""Create a tarball of the live tree's recoverable subset."""
|
|
78
|
+
home = Path(omega_home)
|
|
79
|
+
if not home.is_dir():
|
|
80
|
+
raise FileNotFoundError(f"OMEGA_HOME not found: {home}")
|
|
81
|
+
out_dir = Path(out_dir) if out_dir else Path.home()
|
|
82
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
83
|
+
ts = int(time.time())
|
|
84
|
+
bundle = out_dir / f"omega-backup-{ts}.tar.gz"
|
|
85
|
+
|
|
86
|
+
start = time.time()
|
|
87
|
+
with tarfile.open(bundle, "w:gz") as tar:
|
|
88
|
+
for relpath in BACKUP_ROOTS:
|
|
89
|
+
full = home / relpath
|
|
90
|
+
if not full.exists():
|
|
91
|
+
continue
|
|
92
|
+
tar.add(full, arcname=relpath)
|
|
93
|
+
elapsed = time.time() - start
|
|
94
|
+
|
|
95
|
+
if encrypt:
|
|
96
|
+
if not _have("age"):
|
|
97
|
+
raise RuntimeError("age not on PATH — install it or drop --encrypt")
|
|
98
|
+
rec_file = (
|
|
99
|
+
Path(recipient_path) if recipient_path
|
|
100
|
+
else home / "Agentik_Extra" / "etc" / "secrets" / ".vault-pub"
|
|
101
|
+
)
|
|
102
|
+
if not rec_file.exists():
|
|
103
|
+
raise RuntimeError(
|
|
104
|
+
f"no recipient public key at {rec_file} — provide --recipient-path"
|
|
105
|
+
)
|
|
106
|
+
recipient = rec_file.read_text().strip()
|
|
107
|
+
enc_bundle = bundle.with_suffix(bundle.suffix + ".age")
|
|
108
|
+
with bundle.open("rb") as inp, enc_bundle.open("wb") as out:
|
|
109
|
+
proc = subprocess.run(
|
|
110
|
+
["age", "-r", recipient], stdin=inp, stdout=out,
|
|
111
|
+
check=False, capture_output=False, timeout=600,
|
|
112
|
+
)
|
|
113
|
+
if proc.returncode != 0:
|
|
114
|
+
raise RuntimeError(f"age encrypt exit {proc.returncode}")
|
|
115
|
+
bundle.unlink() # drop the plaintext tarball
|
|
116
|
+
bundle = enc_bundle
|
|
117
|
+
|
|
118
|
+
return BackupResult(
|
|
119
|
+
bundle=bundle, bytes=bundle.stat().st_size,
|
|
120
|
+
encrypted=encrypt, duration_s=round(elapsed, 2),
|
|
121
|
+
detail=f"{len(BACKUP_ROOTS)} root(s) archived",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def restore(
|
|
126
|
+
bundle: str | Path,
|
|
127
|
+
*,
|
|
128
|
+
target: str | Path,
|
|
129
|
+
age_identity: str | Path | None = None,
|
|
130
|
+
) -> RestoreResult:
|
|
131
|
+
"""Restore a bundle into ``target`` (typically ``$OMEGA_HOME``)."""
|
|
132
|
+
bundle = Path(bundle)
|
|
133
|
+
if not bundle.exists():
|
|
134
|
+
raise FileNotFoundError(f"bundle not found: {bundle}")
|
|
135
|
+
target = Path(target)
|
|
136
|
+
target.mkdir(parents=True, exist_ok=True)
|
|
137
|
+
|
|
138
|
+
start = time.time()
|
|
139
|
+
# If encrypted, decrypt to a temp file first.
|
|
140
|
+
tar_source: Path = bundle
|
|
141
|
+
cleanup_tmp: Path | None = None
|
|
142
|
+
if bundle.suffix == ".age":
|
|
143
|
+
if not _have("age"):
|
|
144
|
+
raise RuntimeError("age not on PATH — cannot decrypt bundle")
|
|
145
|
+
identity = (
|
|
146
|
+
Path(age_identity) if age_identity
|
|
147
|
+
else target / "Agentik_Extra" / "etc" / "secrets" / ".vault-key"
|
|
148
|
+
)
|
|
149
|
+
if not identity.exists():
|
|
150
|
+
raise RuntimeError(
|
|
151
|
+
f"no age identity at {identity} — provide --identity"
|
|
152
|
+
)
|
|
153
|
+
cleanup_tmp = Path(tempfile.mkstemp(suffix=".tar.gz")[1])
|
|
154
|
+
with cleanup_tmp.open("wb") as out:
|
|
155
|
+
proc = subprocess.run(
|
|
156
|
+
["age", "-d", "-i", str(identity), str(bundle)],
|
|
157
|
+
stdout=out, check=False, timeout=600,
|
|
158
|
+
)
|
|
159
|
+
if proc.returncode != 0:
|
|
160
|
+
cleanup_tmp.unlink(missing_ok=True)
|
|
161
|
+
raise RuntimeError(f"age decrypt exit {proc.returncode}")
|
|
162
|
+
tar_source = cleanup_tmp
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
with tarfile.open(tar_source, "r:gz") as tar:
|
|
166
|
+
members = tar.getmembers()
|
|
167
|
+
for m in members:
|
|
168
|
+
# Reject absolute paths + path traversal.
|
|
169
|
+
if m.name.startswith("/") or ".." in m.name.split("/"):
|
|
170
|
+
raise RuntimeError(f"unsafe path in bundle: {m.name}")
|
|
171
|
+
tar.extractall(path=target)
|
|
172
|
+
files = sum(1 for m in members if m.isfile())
|
|
173
|
+
finally:
|
|
174
|
+
if cleanup_tmp is not None:
|
|
175
|
+
cleanup_tmp.unlink(missing_ok=True)
|
|
176
|
+
|
|
177
|
+
return RestoreResult(
|
|
178
|
+
bundle=bundle, target=target, files=files,
|
|
179
|
+
duration_s=round(time.time() - start, 2),
|
|
180
|
+
detail=f"{files} file(s) extracted",
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def verify(
|
|
185
|
+
bundle: str | Path,
|
|
186
|
+
*,
|
|
187
|
+
age_identity: str | Path | None = None,
|
|
188
|
+
) -> dict:
|
|
189
|
+
"""Restore the bundle into a temp dir + run a minimal sanity check.
|
|
190
|
+
|
|
191
|
+
Returns ``{ok: bool, files: int, detail: str}``. We do NOT run the
|
|
192
|
+
full ``omega doctor`` here because that would touch the operator's
|
|
193
|
+
real environment; we just confirm the bundle extracts cleanly and
|
|
194
|
+
looks like an OmegaOS tree.
|
|
195
|
+
"""
|
|
196
|
+
bundle = Path(bundle)
|
|
197
|
+
with tempfile.TemporaryDirectory() as td:
|
|
198
|
+
result = restore(bundle, target=td, age_identity=age_identity)
|
|
199
|
+
# Smoke check: the well-known subset should be in there.
|
|
200
|
+
target = Path(td)
|
|
201
|
+
missing = [
|
|
202
|
+
root for root in BACKUP_ROOTS
|
|
203
|
+
if not (target / root).exists()
|
|
204
|
+
]
|
|
205
|
+
if missing:
|
|
206
|
+
return {
|
|
207
|
+
"ok": False,
|
|
208
|
+
"files": result.files,
|
|
209
|
+
"detail": f"missing in bundle: {missing}",
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
"ok": True,
|
|
213
|
+
"files": result.files,
|
|
214
|
+
"detail": f"all {len(BACKUP_ROOTS)} root(s) present + extracted",
|
|
215
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"""cadence — recurring / scheduled execution.
|
|
2
|
+
|
|
3
|
+
The Agentik OS native equivalent of a "run this every N" beat. Takes a
|
|
4
|
+
trigger spec and an intent, persists a charter to
|
|
5
|
+
``Agentik_Orchestration/autonomous/cadence-<id>.yaml`` that the existing
|
|
6
|
+
``AutonomousSupervisor`` picks up at its next tick.
|
|
7
|
+
|
|
8
|
+
Three trigger types:
|
|
9
|
+
* ``cron <expr>`` — standard 5-field cron (``*/5 * * * *``)
|
|
10
|
+
* ``delay <seconds>`` — fire once after ``seconds`` from now
|
|
11
|
+
* ``self`` — let the agent self-pace (the supervisor still ticks, but the
|
|
12
|
+
agent decides whether to act)
|
|
13
|
+
|
|
14
|
+
Why this exists:
|
|
15
|
+
Claude Code's bundled ``/loop`` schedules a prompt in the editor. We
|
|
16
|
+
re-implement it as an engine primitive so OmegaOS supervises the beat
|
|
17
|
+
itself — surviving Claude Code sessions, daemons, the whole system.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import time
|
|
23
|
+
import uuid
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
import yaml
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
VALID_TRIGGERS = {"cron", "delay", "self"}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class CadenceCharter:
|
|
36
|
+
id: str
|
|
37
|
+
trigger_type: str # "cron" | "delay" | "self"
|
|
38
|
+
schedule: str # cron expr, delay-secs, or "self"
|
|
39
|
+
intent: str
|
|
40
|
+
role: str = "worker"
|
|
41
|
+
enabled: bool = True
|
|
42
|
+
description: str = ""
|
|
43
|
+
|
|
44
|
+
def to_yaml_dict(self) -> dict[str, Any]:
|
|
45
|
+
return {
|
|
46
|
+
"id": self.id,
|
|
47
|
+
"description": self.description or self.intent,
|
|
48
|
+
"enabled": self.enabled,
|
|
49
|
+
"trigger": {"type": self.trigger_type, "schedule": self.schedule},
|
|
50
|
+
"role": self.role,
|
|
51
|
+
"spec": {"intent": self.intent},
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def schedule_cadence(
|
|
56
|
+
intent: str,
|
|
57
|
+
trigger_type: str,
|
|
58
|
+
schedule: str,
|
|
59
|
+
*,
|
|
60
|
+
omega_home: str | Path | None = None,
|
|
61
|
+
charter_id: str | None = None,
|
|
62
|
+
role: str = "worker",
|
|
63
|
+
description: str | None = None,
|
|
64
|
+
) -> Path:
|
|
65
|
+
"""Persist a charter to the orchestration tree.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
intent: the natural-language thing to do at each beat.
|
|
69
|
+
trigger_type: "cron" | "delay" | "self".
|
|
70
|
+
schedule: trigger-type-specific spec — a cron expression, a
|
|
71
|
+
delay-in-seconds, or the literal "self".
|
|
72
|
+
omega_home: ``$OMEGA_HOME`` (defaults to env or ``~/Omega``).
|
|
73
|
+
charter_id: stable id; one is generated if not given.
|
|
74
|
+
role: provider role to use for each beat (default ``worker``).
|
|
75
|
+
description: optional human description; defaults to the intent.
|
|
76
|
+
|
|
77
|
+
Returns: the path to the persisted charter YAML.
|
|
78
|
+
"""
|
|
79
|
+
if trigger_type not in VALID_TRIGGERS:
|
|
80
|
+
raise ValueError(
|
|
81
|
+
f"trigger_type must be one of {VALID_TRIGGERS}, got {trigger_type!r}"
|
|
82
|
+
)
|
|
83
|
+
if trigger_type == "cron" and not schedule.strip():
|
|
84
|
+
raise ValueError("cron trigger requires a non-empty schedule")
|
|
85
|
+
if trigger_type == "delay":
|
|
86
|
+
try:
|
|
87
|
+
int(schedule)
|
|
88
|
+
except ValueError as exc:
|
|
89
|
+
raise ValueError(f"delay schedule must be an integer (seconds), got {schedule!r}") from exc
|
|
90
|
+
|
|
91
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
92
|
+
Path.home() / "Omega")
|
|
93
|
+
cid = charter_id or "cadence-" + uuid.uuid4().hex[:8]
|
|
94
|
+
|
|
95
|
+
target_dir = home / "Agentik_Orchestration" / "autonomous"
|
|
96
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
97
|
+
charter = CadenceCharter(
|
|
98
|
+
id=cid, trigger_type=trigger_type, schedule=schedule,
|
|
99
|
+
intent=intent, role=role, enabled=True,
|
|
100
|
+
description=description or intent,
|
|
101
|
+
)
|
|
102
|
+
target = target_dir / f"{cid}.yaml"
|
|
103
|
+
target.write_text(yaml.safe_dump(charter.to_yaml_dict(),
|
|
104
|
+
sort_keys=False, default_flow_style=False))
|
|
105
|
+
return target
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def list_cadences(omega_home: str | Path | None = None) -> list[dict[str, Any]]:
|
|
109
|
+
"""Return one summary dict per scheduled cadence on disk."""
|
|
110
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
111
|
+
Path.home() / "Omega")
|
|
112
|
+
target = home / "Agentik_Orchestration" / "autonomous"
|
|
113
|
+
out: list[dict[str, Any]] = []
|
|
114
|
+
if not target.is_dir():
|
|
115
|
+
return out
|
|
116
|
+
for path in sorted(target.glob("cadence-*.yaml")):
|
|
117
|
+
try:
|
|
118
|
+
data = yaml.safe_load(path.read_text()) or {}
|
|
119
|
+
except yaml.YAMLError:
|
|
120
|
+
continue
|
|
121
|
+
out.append({
|
|
122
|
+
"id": data.get("id", path.stem),
|
|
123
|
+
"enabled": bool(data.get("enabled", True)),
|
|
124
|
+
"trigger": data.get("trigger") or {},
|
|
125
|
+
"intent": ((data.get("spec") or {}).get("intent")
|
|
126
|
+
or data.get("description") or ""),
|
|
127
|
+
"path": str(path),
|
|
128
|
+
})
|
|
129
|
+
return out
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def disable_cadence(charter_id: str, *,
|
|
133
|
+
omega_home: str | Path | None = None) -> bool:
|
|
134
|
+
"""Set ``enabled: false`` on a cadence charter. Returns True if changed."""
|
|
135
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
136
|
+
Path.home() / "Omega")
|
|
137
|
+
target = home / "Agentik_Orchestration" / "autonomous" / f"{charter_id}.yaml"
|
|
138
|
+
if not target.exists():
|
|
139
|
+
return False
|
|
140
|
+
data = yaml.safe_load(target.read_text()) or {}
|
|
141
|
+
if not data.get("enabled", True):
|
|
142
|
+
return False
|
|
143
|
+
data["enabled"] = False
|
|
144
|
+
target.write_text(yaml.safe_dump(data, sort_keys=False,
|
|
145
|
+
default_flow_style=False))
|
|
146
|
+
return True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def remove_cadence(charter_id: str, *,
|
|
150
|
+
omega_home: str | Path | None = None) -> bool:
|
|
151
|
+
"""Delete a cadence charter. Returns True if it existed."""
|
|
152
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
153
|
+
Path.home() / "Omega")
|
|
154
|
+
target = home / "Agentik_Orchestration" / "autonomous" / f"{charter_id}.yaml"
|
|
155
|
+
if not target.exists():
|
|
156
|
+
return False
|
|
157
|
+
target.unlink()
|
|
158
|
+
return True
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Task-complexity classifier — picks the right model for the job.
|
|
2
|
+
|
|
3
|
+
The current router sends every task to one provider with one model. That
|
|
4
|
+
wastes money on a tiny refactor (Sonnet/Opus when Haiku would do) and
|
|
5
|
+
risks quality on a hard architectural task (Haiku when we needed Opus).
|
|
6
|
+
|
|
7
|
+
This module classifies a task description into one of three buckets:
|
|
8
|
+
|
|
9
|
+
* ``simple`` — tiny change, formatting, rename, one-line fix
|
|
10
|
+
* ``moderate`` — implement a feature, fix a bug with context
|
|
11
|
+
* ``complex`` — design, architecture, multi-file refactor, security
|
|
12
|
+
|
|
13
|
+
The classifier is a heuristic-first ladder:
|
|
14
|
+
|
|
15
|
+
1. **Hard signals** — keywords + length + file count. Returns
|
|
16
|
+
immediately when confident.
|
|
17
|
+
2. **Soft signals** — accumulates a score, picks the bucket above a
|
|
18
|
+
threshold.
|
|
19
|
+
3. **Optional LLM refinement** — when ``llm_router`` is provided and
|
|
20
|
+
the heuristic is uncertain, ask a Haiku call to decide. ~1 token
|
|
21
|
+
of cost; mostly free because Haiku is cheap.
|
|
22
|
+
|
|
23
|
+
Returns ``(bucket, confidence, reason)`` so the router can log WHY a
|
|
24
|
+
model was chosen — important for cost transparency.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import re
|
|
29
|
+
from dataclasses import dataclass
|
|
30
|
+
from typing import Any
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
BUCKETS = ("simple", "moderate", "complex")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class Classification:
|
|
38
|
+
bucket: str # "simple" | "moderate" | "complex"
|
|
39
|
+
confidence: str # "low" | "medium" | "high"
|
|
40
|
+
reason: str
|
|
41
|
+
suggested_model: str # e.g. "haiku" | "sonnet" | "opus"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Keywords. Order matters — complex wins ties.
|
|
45
|
+
_COMPLEX_KEYWORDS = {
|
|
46
|
+
"architecture", "redesign", "refactor", "migration", "audit",
|
|
47
|
+
"security", "performance", "concurrency", "race condition",
|
|
48
|
+
"investigate", "analyze", "diagnose", "debug deep",
|
|
49
|
+
"build a", "design a", "implement a system",
|
|
50
|
+
}
|
|
51
|
+
_MODERATE_KEYWORDS = {
|
|
52
|
+
"implement", "build", "add a feature", "fix the bug",
|
|
53
|
+
"add support for", "wire up", "integrate", "extract",
|
|
54
|
+
}
|
|
55
|
+
_SIMPLE_KEYWORDS = {
|
|
56
|
+
"rename", "format", "lint", "fix typo", "fix a typo",
|
|
57
|
+
"update the readme", "add a comment", "change the message",
|
|
58
|
+
"bump version", "one-line", "remove unused",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# File-count signals (extracted from typical intents like "all 12 files")
|
|
62
|
+
_FILE_COUNT_RE = re.compile(r"(\d+)\s+(?:file|tests?)", re.IGNORECASE)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _has_any(text: str, keywords: set[str]) -> bool:
|
|
66
|
+
t = text.lower()
|
|
67
|
+
return any(k in t for k in keywords)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _score(text: str) -> tuple[int, int, int]:
|
|
71
|
+
"""Return (simple_score, moderate_score, complex_score)."""
|
|
72
|
+
t = text.lower()
|
|
73
|
+
s = sum(1 for k in _SIMPLE_KEYWORDS if k in t)
|
|
74
|
+
m = sum(1 for k in _MODERATE_KEYWORDS if k in t)
|
|
75
|
+
c = sum(1 for k in _COMPLEX_KEYWORDS if k in t)
|
|
76
|
+
return s, m, c
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _suggest_model(bucket: str) -> str:
|
|
80
|
+
return {"simple": "haiku", "moderate": "sonnet", "complex": "opus"}.get(
|
|
81
|
+
bucket, "sonnet",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def classify(
|
|
86
|
+
task_description: str,
|
|
87
|
+
*,
|
|
88
|
+
role: str = "worker",
|
|
89
|
+
llm_router=None,
|
|
90
|
+
) -> Classification:
|
|
91
|
+
"""Pick the right complexity bucket + model for a task.
|
|
92
|
+
|
|
93
|
+
Heuristic chain:
|
|
94
|
+
|
|
95
|
+
a) Always-complex roles (architect, oracle planning) get bumped up.
|
|
96
|
+
b) Hard signal: explicit complex keyword present → complex.
|
|
97
|
+
c) Hard signal: explicit simple keyword present + short text → simple.
|
|
98
|
+
d) Length-based fallback: long descriptions are usually complex.
|
|
99
|
+
e) When still uncertain AND llm_router is provided, ask a Haiku
|
|
100
|
+
classification call.
|
|
101
|
+
"""
|
|
102
|
+
text = (task_description or "").strip()
|
|
103
|
+
if not text:
|
|
104
|
+
return Classification(
|
|
105
|
+
"simple", "high",
|
|
106
|
+
"empty task → trivially simple", _suggest_model("simple"),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# (a) Role-driven floor
|
|
110
|
+
if role in ("architect", "smith"):
|
|
111
|
+
# Architecture + reflection always need depth
|
|
112
|
+
return Classification(
|
|
113
|
+
"complex", "high",
|
|
114
|
+
f"role={role!r} → architecture/reflection task",
|
|
115
|
+
_suggest_model("complex"),
|
|
116
|
+
)
|
|
117
|
+
if role in ("oracle", "manager", "aisb"):
|
|
118
|
+
# Planning roles need solid reasoning but not always Opus
|
|
119
|
+
return Classification(
|
|
120
|
+
"moderate", "medium",
|
|
121
|
+
f"role={role!r} → dispatcher; sonnet is the sweet spot",
|
|
122
|
+
_suggest_model("moderate"),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# (b) Hard complex signals
|
|
126
|
+
s_score, m_score, c_score = _score(text)
|
|
127
|
+
if c_score >= 2 or (c_score >= 1 and len(text) > 400):
|
|
128
|
+
return Classification(
|
|
129
|
+
"complex", "high",
|
|
130
|
+
f"{c_score} complex keyword(s) + length={len(text)}",
|
|
131
|
+
_suggest_model("complex"),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# File-count signal
|
|
135
|
+
fc = _FILE_COUNT_RE.search(text)
|
|
136
|
+
if fc and int(fc.group(1)) >= 5:
|
|
137
|
+
return Classification(
|
|
138
|
+
"complex", "high",
|
|
139
|
+
f"task mentions {fc.group(1)}+ files",
|
|
140
|
+
_suggest_model("complex"),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# (c) Hard simple signals
|
|
144
|
+
if s_score >= 1 and len(text) < 250 and c_score == 0:
|
|
145
|
+
return Classification(
|
|
146
|
+
"simple", "high",
|
|
147
|
+
f"{s_score} simple keyword(s), short text",
|
|
148
|
+
_suggest_model("simple"),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# (d) Moderate keyword wins over a short-text "simple" guess —
|
|
152
|
+
# "implement X" is moderate even when phrased tersely.
|
|
153
|
+
word_count = len(text.split())
|
|
154
|
+
if m_score > 0:
|
|
155
|
+
return Classification(
|
|
156
|
+
"moderate", "medium" if m_score >= 2 else "low",
|
|
157
|
+
f"{m_score} moderate keyword(s)",
|
|
158
|
+
_suggest_model("moderate"),
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# (e) Length-based fallback
|
|
162
|
+
if word_count > 80:
|
|
163
|
+
return Classification(
|
|
164
|
+
"complex", "medium",
|
|
165
|
+
f"long description ({word_count} words)",
|
|
166
|
+
_suggest_model("complex"),
|
|
167
|
+
)
|
|
168
|
+
if word_count < 12:
|
|
169
|
+
return Classification(
|
|
170
|
+
"simple", "medium",
|
|
171
|
+
f"short description ({word_count} words)",
|
|
172
|
+
_suggest_model("simple"),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# (f) Uncertain — moderate by default, or ask Haiku to break the tie
|
|
176
|
+
if llm_router is not None:
|
|
177
|
+
try:
|
|
178
|
+
return _llm_refine(text, llm_router)
|
|
179
|
+
except Exception: # noqa: BLE001
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
return Classification(
|
|
183
|
+
"moderate", "low",
|
|
184
|
+
f"no strong signal ({word_count} words, scores={s_score}/{m_score}/{c_score})",
|
|
185
|
+
_suggest_model("moderate"),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _llm_refine(text: str, router) -> Classification:
|
|
190
|
+
"""Last-resort Haiku call for ambiguous cases. ~1 token cost."""
|
|
191
|
+
from omega_engine.provider import AgentRequest
|
|
192
|
+
prompt = (
|
|
193
|
+
"Classify this task into one of: simple, moderate, complex.\n"
|
|
194
|
+
" simple = trivial change, no design decisions\n"
|
|
195
|
+
" moderate = implement/fix with context, single domain\n"
|
|
196
|
+
" complex = architecture, security, cross-cutting, multi-file\n\n"
|
|
197
|
+
f"TASK: {text[:1500]}\n\n"
|
|
198
|
+
"Reply with EXACTLY one word: simple, moderate, or complex."
|
|
199
|
+
)
|
|
200
|
+
provider = router.resolve("classifier")
|
|
201
|
+
result = provider.run(AgentRequest(
|
|
202
|
+
role="classifier", prompt=prompt,
|
|
203
|
+
context={"classifier": True},
|
|
204
|
+
))
|
|
205
|
+
raw = (result.text or "").strip().lower().split()
|
|
206
|
+
bucket = "moderate"
|
|
207
|
+
for w in raw:
|
|
208
|
+
if w in BUCKETS:
|
|
209
|
+
bucket = w
|
|
210
|
+
break
|
|
211
|
+
return Classification(
|
|
212
|
+
bucket, "high",
|
|
213
|
+
"LLM-refined (Haiku 1-token call)",
|
|
214
|
+
_suggest_model(bucket),
|
|
215
|
+
)
|