@agentikos/omega-os 0.2.0 → 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -3
- package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
- package/bootstrap/lib/claude-code-settings.py +176 -0
- package/bootstrap/lib/common.sh +457 -1
- package/bootstrap/lib/llm-clis.py +341 -0
- package/bootstrap/lib/manifest-helpers.py +384 -0
- package/bootstrap/lib/steps.sh +790 -21
- package/bootstrap/manifest.example.yaml +87 -1
- package/bootstrap/templates/aisb/CLAUDE.md +305 -0
- package/bootstrap/templates/aisb/architect.md +204 -0
- package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
- package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
- package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
- package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
- package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
- package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
- package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
- package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
- package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
- package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
- package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
- package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
- package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
- package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
- package/bootstrap/templates/aisb/construct.md +135 -0
- package/bootstrap/templates/aisb/keymaker.md +227 -0
- package/bootstrap/templates/aisb/link.md +170 -0
- package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
- package/bootstrap/templates/aisb/merovingian.md +159 -0
- package/bootstrap/templates/aisb/morpheus.md +243 -0
- package/bootstrap/templates/aisb/neo.md +147 -0
- package/bootstrap/templates/aisb/niobe.md +197 -0
- package/bootstrap/templates/aisb/oracle.md +244 -0
- package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
- package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
- package/bootstrap/templates/aisb/pythia.md +153 -0
- package/bootstrap/templates/aisb/seraph.md +315 -0
- package/bootstrap/templates/aisb/smith.md +202 -0
- package/bootstrap/templates/aisb/zion.md +172 -0
- package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
- package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
- package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
- package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
- package/docs/AUDITS.md +85 -0
- package/docs/GAP-ANALYSIS.md +214 -0
- package/docs/INSTALL.md +47 -9
- package/docs/MCP-AND-PLUGINS.md +31 -4
- package/docs/SIMULATION.md +171 -0
- package/docs/simulate.sh +211 -0
- package/install.sh +164 -17
- package/omega/Agentik_Engine/README.md +4 -2
- package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/account.py +28 -31
- package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
- package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
- package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
- package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
- package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
- package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
- package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
- package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
- package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
- package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
- package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
- package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
- package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
- package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
- package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
- package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
- package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
- package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
- package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
- package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
- package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
- package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
- package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
- package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
- package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
- package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
- package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
- package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
- package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
- package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
- package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
- package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/router.py +28 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
- package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
- package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
- package/omega/Agentik_Engine/omega_engine/store.py +88 -41
- package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
- package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
- package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
- package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
- package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
- package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
- package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
- package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
- package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_account.py +8 -3
- package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
- package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
- package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
- package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
- package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
- package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
- package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
- package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
- package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
- package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
- package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
- package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
- package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
- package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
- package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
- package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
- package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
- package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
- package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
- package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
- package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
- package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
- package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
- package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
- package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
- package/omega/Agentik_Engine/tests/test_vault.py +173 -0
- package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
- package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
- package/omega/Agentik_Runtime/audits.db +0 -0
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
- package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
- package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
- package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
- package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
- package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
- package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
- package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
- package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
- package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
- package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
- package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
- package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
- package/package.json +2 -2
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
"""Worker dispatcher — spawn each worker as its own persistent `claude`
|
|
2
|
+
session in tmux, mirroring the live VPS pattern.
|
|
3
|
+
|
|
4
|
+
Architecture
|
|
5
|
+
------------
|
|
6
|
+
|
|
7
|
+
Today the executor runs workers synchronously: ``provider.run(...)`` blocks
|
|
8
|
+
until the model responds, then the executor moves on. If the engine /
|
|
9
|
+
Telegram bot / supervisor crashes mid-mission, every in-flight worker
|
|
10
|
+
dies with it.
|
|
11
|
+
|
|
12
|
+
The VPS pattern fixes this: each worker is a complete ``claude`` CLI
|
|
13
|
+
running inside its own tmux session. The session is detached, has its
|
|
14
|
+
own PTY, and survives parent crashes. A 4-hour coding mission keeps
|
|
15
|
+
making progress even if everything else falls over.
|
|
16
|
+
|
|
17
|
+
Protocol
|
|
18
|
+
--------
|
|
19
|
+
|
|
20
|
+
The orchestrator (Oracle, dispatcher, or operator) calls
|
|
21
|
+
``spawn_worker(...)`` with the brief. We:
|
|
22
|
+
|
|
23
|
+
1. Write the brief to
|
|
24
|
+
``Agentik_Runtime/sessions/<task_id>/brief.json``
|
|
25
|
+
2. Create a detached tmux session named
|
|
26
|
+
``<Project>-worker-<N>-<task>``
|
|
27
|
+
3. The session immediately runs ``omega worker run <task_id>`` —
|
|
28
|
+
reads its brief, calls Claude with the envelope, writes the
|
|
29
|
+
``.done.json`` on completion.
|
|
30
|
+
|
|
31
|
+
The orchestrator returns immediately; the mission monitor (or the
|
|
32
|
+
operator) polls ``.done.json`` to know when each worker is done.
|
|
33
|
+
|
|
34
|
+
Why per-call ``claude``, not interactive
|
|
35
|
+
----------------------------------------
|
|
36
|
+
|
|
37
|
+
For predictable completion + structured output, the worker runs:
|
|
38
|
+
|
|
39
|
+
claude -p "<user>" --append-system-prompt "<system>"
|
|
40
|
+
--model "<model>" --output-format json
|
|
41
|
+
--dangerously-skip-permissions
|
|
42
|
+
|
|
43
|
+
This returns one JSON blob with ``result``, ``usage``, ``total_cost_usd``,
|
|
44
|
+
``session_id``. The worker parses it and writes a structured
|
|
45
|
+
``.done.json``. If the operator wants interactive (the worker asks the
|
|
46
|
+
oracle questions mid-task), the same brief.json can drive that mode in
|
|
47
|
+
a later iteration.
|
|
48
|
+
|
|
49
|
+
Model selection
|
|
50
|
+
---------------
|
|
51
|
+
|
|
52
|
+
By default:
|
|
53
|
+
|
|
54
|
+
* role=``oracle`` / ``manager`` / ``aisb`` → ``sonnet`` (fast planner)
|
|
55
|
+
* role=``worker`` / ``construct`` → ``opus`` (1M context coding)
|
|
56
|
+
* role=``audit`` / ``verifier`` / ``seraph`` → ``sonnet``
|
|
57
|
+
* role=``haiku-*`` (cost-routed cheap roles) → ``haiku``
|
|
58
|
+
|
|
59
|
+
This is the smart-routing default — overridable via the brief's ``model``
|
|
60
|
+
field for explicit control.
|
|
61
|
+
"""
|
|
62
|
+
from __future__ import annotations
|
|
63
|
+
|
|
64
|
+
import json
|
|
65
|
+
import os
|
|
66
|
+
import re
|
|
67
|
+
import shlex
|
|
68
|
+
import shutil
|
|
69
|
+
import subprocess
|
|
70
|
+
import sys
|
|
71
|
+
import time
|
|
72
|
+
import uuid
|
|
73
|
+
from dataclasses import dataclass, field
|
|
74
|
+
from pathlib import Path
|
|
75
|
+
from typing import Any
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# ---------------------------------------------------------------------------
|
|
79
|
+
# Hardening — input validation for shell-bound identifiers
|
|
80
|
+
# ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
# task_id is interpolated into a tmux command line + used as a directory
|
|
83
|
+
# name. We accept ONLY a-zA-Z0-9._- — anything else can break out of the
|
|
84
|
+
# argument or escape the path. Bug history: prior to this guard,
|
|
85
|
+
# `--task-id "t; touch /tmp/PWNED"` executed the second command.
|
|
86
|
+
_TASK_ID_RE = re.compile(r"^[A-Za-z0-9._-]{1,128}$")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _validate_task_id(task_id: str) -> str:
|
|
90
|
+
if not isinstance(task_id, str) or not _TASK_ID_RE.match(task_id):
|
|
91
|
+
raise ValueError(
|
|
92
|
+
f"invalid task_id {task_id!r} — must match [A-Za-z0-9._-]{{1,128}}"
|
|
93
|
+
)
|
|
94
|
+
return task_id
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# ---------------------------------------------------------------------------
|
|
98
|
+
# Default model per role
|
|
99
|
+
# ---------------------------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
_ROLE_MODEL: dict[str, str] = {
|
|
102
|
+
# Dispatchers — fast planners
|
|
103
|
+
"oracle": "sonnet",
|
|
104
|
+
"manager": "sonnet",
|
|
105
|
+
"aisb": "sonnet",
|
|
106
|
+
"architect": "sonnet",
|
|
107
|
+
# Executors doing real coding work → opus with 1M context window
|
|
108
|
+
"worker": "claude-opus-4-7[1m]",
|
|
109
|
+
"construct": "claude-opus-4-7[1m]",
|
|
110
|
+
"link": "sonnet",
|
|
111
|
+
# Verifiers — fast structured judgement
|
|
112
|
+
"audit": "sonnet",
|
|
113
|
+
"verifier": "sonnet",
|
|
114
|
+
"seraph": "sonnet",
|
|
115
|
+
# Cheap classifier / triage roles
|
|
116
|
+
"classifier": "haiku",
|
|
117
|
+
"triage": "haiku",
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def default_model_for_role(role: str) -> str:
|
|
122
|
+
"""The default Claude Code Max model for a role. Falls back to sonnet."""
|
|
123
|
+
return _ROLE_MODEL.get(role, "sonnet")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# ---------------------------------------------------------------------------
|
|
127
|
+
# Brief / done.json paths
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _omega_home() -> Path:
|
|
132
|
+
return Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _session_dir(home: Path, task_id: str) -> Path:
|
|
136
|
+
d = home / "Agentik_Runtime" / "sessions" / task_id
|
|
137
|
+
d.mkdir(parents=True, exist_ok=True)
|
|
138
|
+
try:
|
|
139
|
+
os.chmod(d, 0o700)
|
|
140
|
+
except OSError:
|
|
141
|
+
pass
|
|
142
|
+
return d
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def brief_path(home: Path | str, task_id: str) -> Path:
|
|
146
|
+
return _session_dir(Path(home), task_id) / "brief.json"
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def done_path(home: Path | str, task_id: str) -> Path:
|
|
150
|
+
return _session_dir(Path(home), task_id) / ".done.json"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def transcript_path(home: Path | str, task_id: str) -> Path:
|
|
154
|
+
"""Where the raw claude JSON response is stored — useful for debug."""
|
|
155
|
+
return _session_dir(Path(home), task_id) / "transcript.json"
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# ---------------------------------------------------------------------------
|
|
159
|
+
# Brief — what the worker reads to know what to do
|
|
160
|
+
# ---------------------------------------------------------------------------
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass
|
|
164
|
+
class WorkerBrief:
|
|
165
|
+
task_id: str
|
|
166
|
+
role: str # "worker" | "construct" | ...
|
|
167
|
+
intent: str # what the worker should do
|
|
168
|
+
system_prompt: str = "" # the envelope's system component
|
|
169
|
+
user_prompt: str = "" # the envelope's user component (fallback: intent)
|
|
170
|
+
model: str = "" # overrides role default if set
|
|
171
|
+
verify_cmd: str | None = None
|
|
172
|
+
project: str | None = None
|
|
173
|
+
cwd: str | None = None
|
|
174
|
+
spawned_at: int = field(default_factory=lambda: int(time.time()))
|
|
175
|
+
mission_id: str = ""
|
|
176
|
+
# Skill palette for this worker. Empty list → use the role default
|
|
177
|
+
# (resolved by ``resolved_skills()``). Set explicitly to ``None`` is
|
|
178
|
+
# equivalent to empty.
|
|
179
|
+
skills: list[str] = field(default_factory=list)
|
|
180
|
+
|
|
181
|
+
def resolved_model(self) -> str:
|
|
182
|
+
return self.model or default_model_for_role(self.role)
|
|
183
|
+
|
|
184
|
+
def resolved_skills(self) -> list[str]:
|
|
185
|
+
"""Final skill list — explicit > role default. Used by ``run_brief``
|
|
186
|
+
to weave the skill block into ``--append-system-prompt``."""
|
|
187
|
+
if self.skills:
|
|
188
|
+
return list(self.skills)
|
|
189
|
+
try:
|
|
190
|
+
from omega_engine.skill_routing import recommend
|
|
191
|
+
return recommend(self.role)
|
|
192
|
+
except ImportError:
|
|
193
|
+
return []
|
|
194
|
+
|
|
195
|
+
def to_json(self) -> str:
|
|
196
|
+
return json.dumps({
|
|
197
|
+
"task_id": self.task_id, "role": self.role,
|
|
198
|
+
"intent": self.intent,
|
|
199
|
+
"system_prompt": self.system_prompt,
|
|
200
|
+
"user_prompt": self.user_prompt or self.intent,
|
|
201
|
+
"model": self.resolved_model(),
|
|
202
|
+
"skills": self.resolved_skills(),
|
|
203
|
+
"verify_cmd": self.verify_cmd,
|
|
204
|
+
"project": self.project, "cwd": self.cwd,
|
|
205
|
+
"spawned_at": self.spawned_at,
|
|
206
|
+
"mission_id": self.mission_id,
|
|
207
|
+
}, indent=2)
|
|
208
|
+
|
|
209
|
+
@staticmethod
|
|
210
|
+
def from_dict(d: dict[str, Any]) -> "WorkerBrief":
|
|
211
|
+
return WorkerBrief(
|
|
212
|
+
task_id=str(d["task_id"]),
|
|
213
|
+
role=str(d.get("role", "worker")),
|
|
214
|
+
intent=str(d.get("intent", "")),
|
|
215
|
+
system_prompt=str(d.get("system_prompt", "")),
|
|
216
|
+
user_prompt=str(d.get("user_prompt", "")),
|
|
217
|
+
model=str(d.get("model", "")),
|
|
218
|
+
verify_cmd=d.get("verify_cmd"),
|
|
219
|
+
project=d.get("project"),
|
|
220
|
+
cwd=d.get("cwd"),
|
|
221
|
+
spawned_at=int(d.get("spawned_at", time.time())),
|
|
222
|
+
mission_id=str(d.get("mission_id", "")),
|
|
223
|
+
skills=list(d.get("skills") or []),
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def write_brief(home: Path | str, brief: WorkerBrief) -> Path:
|
|
228
|
+
"""Persist the brief atomically. Same temp+rename trick as write_done
|
|
229
|
+
so a polling reader never sees a half-written brief."""
|
|
230
|
+
_validate_task_id(brief.task_id)
|
|
231
|
+
p = brief_path(home, brief.task_id)
|
|
232
|
+
tmp = p.with_suffix(p.suffix + ".tmp")
|
|
233
|
+
tmp.write_text(brief.to_json())
|
|
234
|
+
try:
|
|
235
|
+
fd = os.open(str(tmp), os.O_RDONLY)
|
|
236
|
+
try:
|
|
237
|
+
os.fsync(fd)
|
|
238
|
+
finally:
|
|
239
|
+
os.close(fd)
|
|
240
|
+
except OSError:
|
|
241
|
+
pass
|
|
242
|
+
os.replace(tmp, p)
|
|
243
|
+
return p
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def read_brief(home: Path | str, task_id: str) -> WorkerBrief:
|
|
247
|
+
p = brief_path(home, task_id)
|
|
248
|
+
if not p.exists():
|
|
249
|
+
raise FileNotFoundError(f"no brief at {p}")
|
|
250
|
+
return WorkerBrief.from_dict(json.loads(p.read_text()))
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# ---------------------------------------------------------------------------
|
|
254
|
+
# Spawning the tmux session
|
|
255
|
+
# ---------------------------------------------------------------------------
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def _session_name(brief: WorkerBrief, *, worker_id: int = 1) -> str:
|
|
259
|
+
"""Build the tmux session name following the AISB convention."""
|
|
260
|
+
project = brief.project or "Omega"
|
|
261
|
+
# Sanitise task component (no spaces, max 40 chars)
|
|
262
|
+
task_label = "".join(
|
|
263
|
+
c if c.isalnum() or c in "-_" else "-" for c in brief.intent[:40]
|
|
264
|
+
).strip("-") or "task"
|
|
265
|
+
return f"{project}-worker-{worker_id}-{task_label}"
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def spawn_worker(
|
|
269
|
+
brief: WorkerBrief, *,
|
|
270
|
+
home: Path | str | None = None,
|
|
271
|
+
worker_id: int = 1,
|
|
272
|
+
omega_bin: str | None = None,
|
|
273
|
+
) -> str:
|
|
274
|
+
"""Persist the brief + spawn a detached tmux session that runs the worker.
|
|
275
|
+
|
|
276
|
+
Returns the tmux session name. The orchestrator returns IMMEDIATELY —
|
|
277
|
+
the worker runs asynchronously in its own session. Poll
|
|
278
|
+
``.done.json`` (via :func:`read_done`) to know when it's finished.
|
|
279
|
+
"""
|
|
280
|
+
# SECURITY: refuse shell-injection vectors before they reach tmux.
|
|
281
|
+
_validate_task_id(brief.task_id)
|
|
282
|
+
|
|
283
|
+
home = Path(home or _omega_home())
|
|
284
|
+
write_brief(home, brief)
|
|
285
|
+
name = _session_name(brief, worker_id=worker_id)
|
|
286
|
+
|
|
287
|
+
if shutil.which("tmux") is None:
|
|
288
|
+
raise RuntimeError("tmux not on PATH — workers can't be spawned async")
|
|
289
|
+
|
|
290
|
+
bin_ = omega_bin or str(
|
|
291
|
+
home / "Agentik_Tools" / "bin" / "omega"
|
|
292
|
+
)
|
|
293
|
+
if not Path(bin_).exists():
|
|
294
|
+
bin_ = shutil.which("omega") or "omega"
|
|
295
|
+
|
|
296
|
+
cwd = brief.cwd or os.getcwd()
|
|
297
|
+
# Build the command via shlex.quote so even a future malformed task_id
|
|
298
|
+
# cannot escape its argument slot. _validate_task_id is the first
|
|
299
|
+
# line of defence; this is the second.
|
|
300
|
+
cmd = " ".join([
|
|
301
|
+
f"OMEGA_HOME={shlex.quote(str(home))}",
|
|
302
|
+
shlex.quote(bin_),
|
|
303
|
+
"worker", "run",
|
|
304
|
+
shlex.quote(brief.task_id),
|
|
305
|
+
])
|
|
306
|
+
|
|
307
|
+
# Refuse to overwrite an existing live session — that would be a bug.
|
|
308
|
+
proc = subprocess.run(
|
|
309
|
+
["tmux", "has-session", "-t", name],
|
|
310
|
+
check=False, capture_output=True, timeout=10,
|
|
311
|
+
)
|
|
312
|
+
if proc.returncode == 0:
|
|
313
|
+
# session already exists; treat as idempotent re-spawn.
|
|
314
|
+
return name
|
|
315
|
+
|
|
316
|
+
subprocess.run(
|
|
317
|
+
["tmux", "new-session", "-d", "-s", name, "-c", cwd, cmd],
|
|
318
|
+
check=True, capture_output=True, text=True, timeout=30,
|
|
319
|
+
)
|
|
320
|
+
return name
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
# ---------------------------------------------------------------------------
|
|
324
|
+
# Worker entry point (runs INSIDE the tmux session)
|
|
325
|
+
# ---------------------------------------------------------------------------
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def run_brief(home: Path | str, task_id: str) -> int:
|
|
329
|
+
"""The body of ``omega worker run <task_id>``.
|
|
330
|
+
|
|
331
|
+
Reads the brief, calls ``claude -p`` with the envelope, parses the
|
|
332
|
+
JSON response, writes a structured ``.done.json``. Returns the exit
|
|
333
|
+
code (0 on done_clean, 1 on failure).
|
|
334
|
+
"""
|
|
335
|
+
from omega_engine.done_signal import DoneSignal, write_done
|
|
336
|
+
|
|
337
|
+
home = Path(home)
|
|
338
|
+
try:
|
|
339
|
+
brief = read_brief(home, task_id)
|
|
340
|
+
except FileNotFoundError as exc:
|
|
341
|
+
write_done(home, task_id, DoneSignal(
|
|
342
|
+
status="failed",
|
|
343
|
+
summary=f"worker missing brief: {exc}",
|
|
344
|
+
errors=[str(exc)],
|
|
345
|
+
))
|
|
346
|
+
return 1
|
|
347
|
+
|
|
348
|
+
# Compose the system prompt: explicit system_prompt + the skill block
|
|
349
|
+
# (so the worker knows which slash commands it has access to).
|
|
350
|
+
sys_prompt = brief.system_prompt or ""
|
|
351
|
+
skills = brief.resolved_skills()
|
|
352
|
+
if skills:
|
|
353
|
+
try:
|
|
354
|
+
from omega_engine.skill_routing import format_skill_block
|
|
355
|
+
block = format_skill_block(skills, home=home)
|
|
356
|
+
if block:
|
|
357
|
+
sys_prompt = (sys_prompt + "\n" + block).strip()
|
|
358
|
+
except ImportError:
|
|
359
|
+
pass
|
|
360
|
+
|
|
361
|
+
cmd = [
|
|
362
|
+
"claude", "-p", brief.user_prompt or brief.intent,
|
|
363
|
+
"--output-format", "json",
|
|
364
|
+
"--model", brief.resolved_model(),
|
|
365
|
+
"--dangerously-skip-permissions",
|
|
366
|
+
]
|
|
367
|
+
if sys_prompt:
|
|
368
|
+
cmd += ["--append-system-prompt", sys_prompt]
|
|
369
|
+
if brief.cwd:
|
|
370
|
+
cmd += ["--add-dir", str(brief.cwd)]
|
|
371
|
+
|
|
372
|
+
print(f"omega worker {task_id}: model={brief.resolved_model()} "
|
|
373
|
+
f"cwd={brief.cwd or os.getcwd()}")
|
|
374
|
+
print(f" intent: {brief.intent[:120]}")
|
|
375
|
+
|
|
376
|
+
started = time.time()
|
|
377
|
+
try:
|
|
378
|
+
proc = subprocess.run(
|
|
379
|
+
cmd, check=False, capture_output=True, text=True,
|
|
380
|
+
timeout=3600, # 1 hour cap per claude call
|
|
381
|
+
cwd=brief.cwd or os.getcwd(),
|
|
382
|
+
)
|
|
383
|
+
except subprocess.TimeoutExpired:
|
|
384
|
+
write_done(home, task_id, DoneSignal(
|
|
385
|
+
status="failed",
|
|
386
|
+
summary="claude -p timed out after 3600s",
|
|
387
|
+
errors=["timeout"],
|
|
388
|
+
))
|
|
389
|
+
return 1
|
|
390
|
+
except OSError as exc:
|
|
391
|
+
write_done(home, task_id, DoneSignal(
|
|
392
|
+
status="failed",
|
|
393
|
+
summary=f"claude -p failed to launch: {exc}",
|
|
394
|
+
errors=[str(exc)],
|
|
395
|
+
))
|
|
396
|
+
return 1
|
|
397
|
+
|
|
398
|
+
elapsed = round(time.time() - started, 2)
|
|
399
|
+
|
|
400
|
+
if proc.returncode != 0:
|
|
401
|
+
write_done(home, task_id, DoneSignal(
|
|
402
|
+
status="failed",
|
|
403
|
+
summary=f"claude -p exited {proc.returncode} after {elapsed}s",
|
|
404
|
+
errors=[
|
|
405
|
+
(proc.stderr or proc.stdout or "")[:500],
|
|
406
|
+
],
|
|
407
|
+
))
|
|
408
|
+
return 1
|
|
409
|
+
|
|
410
|
+
# Persist the raw transcript for debug.
|
|
411
|
+
transcript_path(home, task_id).write_text(proc.stdout or "")
|
|
412
|
+
|
|
413
|
+
try:
|
|
414
|
+
data = json.loads(proc.stdout or "{}")
|
|
415
|
+
except json.JSONDecodeError as exc:
|
|
416
|
+
write_done(home, task_id, DoneSignal(
|
|
417
|
+
status="failed",
|
|
418
|
+
summary=f"claude -p returned non-JSON: {exc}",
|
|
419
|
+
errors=[(proc.stdout or "")[:500]],
|
|
420
|
+
))
|
|
421
|
+
return 1
|
|
422
|
+
|
|
423
|
+
text = str(data.get("result", "")).strip()
|
|
424
|
+
usage = data.get("usage", {}) or {}
|
|
425
|
+
cost = float(data.get("total_cost_usd", 0.0) or 0.0)
|
|
426
|
+
sig = DoneSignal(
|
|
427
|
+
status="done_clean",
|
|
428
|
+
summary=text[:1000] or "(no text response)",
|
|
429
|
+
files_changed=[],
|
|
430
|
+
artifacts={
|
|
431
|
+
"session_id": data.get("session_id", ""),
|
|
432
|
+
"model": brief.resolved_model(),
|
|
433
|
+
"elapsed_s": elapsed,
|
|
434
|
+
"usage": {
|
|
435
|
+
"input_tokens": int(usage.get("input_tokens", 0) or 0),
|
|
436
|
+
"output_tokens": int(usage.get("output_tokens", 0) or 0),
|
|
437
|
+
"cost_usd": cost,
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
)
|
|
441
|
+
write_done(home, task_id, sig)
|
|
442
|
+
print(f"omega worker {task_id}: done in {elapsed}s, cost ${cost:.4f}")
|
|
443
|
+
return 0
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
# ---------------------------------------------------------------------------
|
|
447
|
+
# Status / wait / list helpers
|
|
448
|
+
# ---------------------------------------------------------------------------
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def worker_status(home: Path | str, task_id: str) -> dict[str, Any]:
|
|
452
|
+
"""Read .done.json + tmux state. Returns a single status dict."""
|
|
453
|
+
home = Path(home)
|
|
454
|
+
done = done_path(home, task_id)
|
|
455
|
+
if done.exists():
|
|
456
|
+
try:
|
|
457
|
+
data = json.loads(done.read_text())
|
|
458
|
+
return {
|
|
459
|
+
"task_id": task_id,
|
|
460
|
+
"state": data.get("status", "unknown"),
|
|
461
|
+
"summary": data.get("summary", ""),
|
|
462
|
+
"artifacts": data.get("artifacts", {}),
|
|
463
|
+
"tmux_alive": False,
|
|
464
|
+
"source": ".done.json",
|
|
465
|
+
}
|
|
466
|
+
except json.JSONDecodeError:
|
|
467
|
+
pass
|
|
468
|
+
# No done.json — check tmux
|
|
469
|
+
if shutil.which("tmux"):
|
|
470
|
+
from omega_engine import tmux as tx
|
|
471
|
+
for sess in tx.list_sessions(home):
|
|
472
|
+
# Match by task_id in the session name
|
|
473
|
+
if task_id in sess.name:
|
|
474
|
+
return {
|
|
475
|
+
"task_id": task_id,
|
|
476
|
+
"state": "running",
|
|
477
|
+
"tmux_alive": True,
|
|
478
|
+
"tmux_session": sess.name,
|
|
479
|
+
"source": "tmux",
|
|
480
|
+
}
|
|
481
|
+
return {"task_id": task_id, "state": "unknown", "tmux_alive": False,
|
|
482
|
+
"source": "absent"}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def wait_for_done(
|
|
486
|
+
home: Path | str, task_id: str,
|
|
487
|
+
*, timeout_s: int = 3600, poll_s: int = 5,
|
|
488
|
+
) -> dict[str, Any]:
|
|
489
|
+
"""Block until .done.json exists (or timeout). Returns the final status."""
|
|
490
|
+
end = time.time() + timeout_s
|
|
491
|
+
while time.time() < end:
|
|
492
|
+
status = worker_status(home, task_id)
|
|
493
|
+
if status["state"] in ("done_clean", "pending", "failed"):
|
|
494
|
+
return status
|
|
495
|
+
time.sleep(poll_s)
|
|
496
|
+
return {"task_id": task_id, "state": "timeout", "tmux_alive": False,
|
|
497
|
+
"source": "timeout"}
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
def list_workers(home: Path | str) -> list[dict[str, Any]]:
|
|
501
|
+
"""Scan every per-task session dir. One row per task with a brief."""
|
|
502
|
+
home = Path(home)
|
|
503
|
+
sessions_root = home / "Agentik_Runtime" / "sessions"
|
|
504
|
+
if not sessions_root.is_dir():
|
|
505
|
+
return []
|
|
506
|
+
out: list[dict[str, Any]] = []
|
|
507
|
+
for child in sorted(sessions_root.iterdir()):
|
|
508
|
+
if not child.is_dir():
|
|
509
|
+
continue
|
|
510
|
+
b = child / "brief.json"
|
|
511
|
+
if not b.exists():
|
|
512
|
+
continue
|
|
513
|
+
try:
|
|
514
|
+
brief = WorkerBrief.from_dict(json.loads(b.read_text()))
|
|
515
|
+
except (json.JSONDecodeError, OSError):
|
|
516
|
+
continue
|
|
517
|
+
status = worker_status(home, brief.task_id)
|
|
518
|
+
out.append({
|
|
519
|
+
"task_id": brief.task_id, "role": brief.role,
|
|
520
|
+
"model": brief.resolved_model(),
|
|
521
|
+
"intent": brief.intent[:80],
|
|
522
|
+
"project": brief.project, "spawned_at": brief.spawned_at,
|
|
523
|
+
"state": status["state"],
|
|
524
|
+
"tmux_alive": status.get("tmux_alive", False),
|
|
525
|
+
})
|
|
526
|
+
return out
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc
ADDED
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc
ADDED
|
Binary file
|
|
Binary file
|