@agentikos/omega-os 0.2.0 → 0.19.6
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/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -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/audit-orchestrator.md +212 -0
- package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
- package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -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/newcmd.md +300 -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/quality-arsenal.md +180 -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
|
+
"""Tmux orchestration — the same session-naming + categorisation pattern
|
|
2
|
+
the live VPS uses, but first-class in OmegaOS.
|
|
3
|
+
|
|
4
|
+
Session naming convention (mirrors AISB):
|
|
5
|
+
|
|
6
|
+
* ``AISB-*`` — the AISB master agent(s)
|
|
7
|
+
* ``<Project>-oracle`` — a project's Oracle
|
|
8
|
+
* ``<Project>-oracle-N`` — additional oracles (N > 1) on the same project
|
|
9
|
+
* ``<Project>-worker-N-<task>`` — a worker dispatched by oracle N
|
|
10
|
+
* ``<Project>-dev-<task>`` — direct development sessions
|
|
11
|
+
* ``<Project>-fix-<linear-id>`` — Linear-feedback fix sessions
|
|
12
|
+
* ``<Project>-linear`` — the Linear-mission orchestrator
|
|
13
|
+
* ``Home``, ``Home-2``, ``Home-3`` — interactive operator sessions
|
|
14
|
+
* everything else — "other"
|
|
15
|
+
|
|
16
|
+
Surface
|
|
17
|
+
-------
|
|
18
|
+
|
|
19
|
+
``list_sessions(omega_home)`` → list[TmuxSession]
|
|
20
|
+
``categorize(name)`` → category string
|
|
21
|
+
``spawn(name, *, command, cwd)`` → start a detached session
|
|
22
|
+
``attach_command(name)`` → the shell string the user runs to attach
|
|
23
|
+
``kill(name)`` → tmux kill-session
|
|
24
|
+
``is_alive(name)`` → bool
|
|
25
|
+
``health_report(omega_home)`` → summary for `omega tmux health`
|
|
26
|
+
|
|
27
|
+
Why this lives in the engine (not as a shell script): we want the same
|
|
28
|
+
classifier the doctor uses, the menu uses, the audit-patrol uses, and
|
|
29
|
+
the upcoming AISB-as-chat layer uses.
|
|
30
|
+
"""
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import os
|
|
34
|
+
import re
|
|
35
|
+
import shutil
|
|
36
|
+
import subprocess
|
|
37
|
+
import time
|
|
38
|
+
from dataclasses import dataclass
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# Categorisation
|
|
44
|
+
# ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
CATEGORIES = ("aisb", "oracle", "worker", "dev", "linear", "home", "other")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
_AISB_RE = re.compile(r"^(AISB|aisb)")
|
|
51
|
+
# Two oracle conventions: `Project-oracle[-N]` AND `oracle-Project`.
|
|
52
|
+
# The live VPS uses both depending on who spawned it.
|
|
53
|
+
_ORACLE_RE = re.compile(
|
|
54
|
+
r"^(?:(?P<proj1>[A-Za-z0-9_-]+?)-oracle(?:-\d+)?"
|
|
55
|
+
r"|oracle-(?P<proj2>[A-Za-z0-9_-]+?))$"
|
|
56
|
+
)
|
|
57
|
+
_WORKER_RE = re.compile(
|
|
58
|
+
r"^(?P<proj>[A-Za-z0-9_-]+?)-(?:oracle-\d+-)?worker-\d+-(?P<task>.+)$"
|
|
59
|
+
)
|
|
60
|
+
_DEV_RE = re.compile(r"^(?P<proj>[A-Za-z0-9_-]+?)-(?:dev|fix|work)-")
|
|
61
|
+
_LINEAR_RE = re.compile(r"^(?P<proj>[A-Za-z0-9_-]+?)-linear$")
|
|
62
|
+
_HOME_RE = re.compile(r"^Home(?:-\d+|-[a-z]+)?$")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def categorize(name: str) -> str:
|
|
66
|
+
"""Return a single-token category for a tmux session name."""
|
|
67
|
+
if _AISB_RE.match(name):
|
|
68
|
+
return "aisb"
|
|
69
|
+
if _ORACLE_RE.match(name):
|
|
70
|
+
return "oracle"
|
|
71
|
+
if _WORKER_RE.match(name):
|
|
72
|
+
return "worker"
|
|
73
|
+
if _DEV_RE.match(name):
|
|
74
|
+
return "dev"
|
|
75
|
+
if _LINEAR_RE.match(name):
|
|
76
|
+
return "linear"
|
|
77
|
+
if _HOME_RE.match(name):
|
|
78
|
+
return "home"
|
|
79
|
+
return "other"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def project_from(name: str) -> str | None:
|
|
83
|
+
"""Best-effort project name extraction from a session name."""
|
|
84
|
+
m = _ORACLE_RE.match(name)
|
|
85
|
+
if m:
|
|
86
|
+
return m.group("proj1") or m.group("proj2")
|
|
87
|
+
for pat in (_WORKER_RE, _DEV_RE, _LINEAR_RE):
|
|
88
|
+
m = pat.match(name)
|
|
89
|
+
if m and "proj" in m.groupdict():
|
|
90
|
+
return m.group("proj")
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# ---------------------------------------------------------------------------
|
|
95
|
+
# Data model
|
|
96
|
+
# ---------------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@dataclass
|
|
100
|
+
class TmuxSession:
|
|
101
|
+
name: str
|
|
102
|
+
category: str
|
|
103
|
+
project: str | None
|
|
104
|
+
attached: bool
|
|
105
|
+
windows: int
|
|
106
|
+
created: int # unix seconds
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# ---------------------------------------------------------------------------
|
|
110
|
+
# Subprocess helpers
|
|
111
|
+
# ---------------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _have_tmux() -> bool:
|
|
115
|
+
return shutil.which("tmux") is not None
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _tmux(*args: str, check: bool = False, timeout: int = 15) -> tuple[int, str]:
|
|
119
|
+
"""Run `tmux <args>` and return (exit, stdout)."""
|
|
120
|
+
if not _have_tmux():
|
|
121
|
+
return 1, ""
|
|
122
|
+
try:
|
|
123
|
+
proc = subprocess.run(
|
|
124
|
+
["tmux", *args],
|
|
125
|
+
check=False, capture_output=True, text=True, timeout=timeout,
|
|
126
|
+
)
|
|
127
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
128
|
+
return 1, str(exc)
|
|
129
|
+
out = (proc.stdout or "") + (proc.stderr or "")
|
|
130
|
+
if check and proc.returncode != 0:
|
|
131
|
+
raise RuntimeError(f"tmux {' '.join(args)}: {out.strip()[:200]}")
|
|
132
|
+
return proc.returncode, out
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# ---------------------------------------------------------------------------
|
|
136
|
+
# Public API
|
|
137
|
+
# ---------------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def list_sessions(omega_home: str | Path | None = None) -> list[TmuxSession]:
|
|
141
|
+
"""Parse `tmux ls -F` into structured rows.
|
|
142
|
+
|
|
143
|
+
Sessions are returned in the order tmux gives them (creation order in
|
|
144
|
+
most setups). When tmux isn't installed or no server is running, we
|
|
145
|
+
return an empty list — never raise.
|
|
146
|
+
"""
|
|
147
|
+
fmt = (
|
|
148
|
+
"#{session_name}\t#{session_attached}\t#{session_windows}\t"
|
|
149
|
+
"#{session_created}"
|
|
150
|
+
)
|
|
151
|
+
rc, out = _tmux("list-sessions", "-F", fmt)
|
|
152
|
+
if rc != 0:
|
|
153
|
+
return []
|
|
154
|
+
rows: list[TmuxSession] = []
|
|
155
|
+
for line in out.splitlines():
|
|
156
|
+
parts = line.strip().split("\t")
|
|
157
|
+
if len(parts) < 4:
|
|
158
|
+
continue
|
|
159
|
+
name, attached, windows, created = parts[0], parts[1], parts[2], parts[3]
|
|
160
|
+
rows.append(TmuxSession(
|
|
161
|
+
name=name,
|
|
162
|
+
category=categorize(name),
|
|
163
|
+
project=project_from(name),
|
|
164
|
+
attached=str(attached) not in ("", "0"),
|
|
165
|
+
windows=int(windows or 1),
|
|
166
|
+
created=int(created or 0),
|
|
167
|
+
))
|
|
168
|
+
return rows
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def is_alive(name: str) -> bool:
|
|
172
|
+
rc, _ = _tmux("has-session", "-t", name)
|
|
173
|
+
return rc == 0
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def attach_command(name: str) -> str:
|
|
177
|
+
"""The exact shell command the user runs to attach (we never call
|
|
178
|
+
`tmux attach` from a non-interactive context — it would hijack
|
|
179
|
+
stdin/stdout)."""
|
|
180
|
+
return f"tmux attach -t {name}"
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def kill(name: str) -> bool:
|
|
184
|
+
rc, _ = _tmux("kill-session", "-t", name)
|
|
185
|
+
return rc == 0
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def spawn(
|
|
189
|
+
name: str, *,
|
|
190
|
+
command: str | None = None,
|
|
191
|
+
cwd: str | Path | None = None,
|
|
192
|
+
detached: bool = True,
|
|
193
|
+
) -> bool:
|
|
194
|
+
"""Create a new tmux session. Returns True on success.
|
|
195
|
+
|
|
196
|
+
Uses ``tmux new-session -d -s <name> [-c <cwd>] [<cmd>]``. When
|
|
197
|
+
``command`` is None, an interactive shell is launched (the default).
|
|
198
|
+
Refuses to overwrite an existing session of the same name.
|
|
199
|
+
"""
|
|
200
|
+
if is_alive(name):
|
|
201
|
+
return False
|
|
202
|
+
args = ["new-session"]
|
|
203
|
+
if detached:
|
|
204
|
+
args.append("-d")
|
|
205
|
+
args += ["-s", name]
|
|
206
|
+
if cwd:
|
|
207
|
+
args += ["-c", str(cwd)]
|
|
208
|
+
if command:
|
|
209
|
+
args.append(command)
|
|
210
|
+
rc, _ = _tmux(*args)
|
|
211
|
+
return rc == 0
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def spawn_oracle(project: str, *, cwd: str | Path | None = None,
|
|
215
|
+
oracle_id: int = 1) -> str:
|
|
216
|
+
"""Spawn an Oracle session for ``project`` and return its name."""
|
|
217
|
+
name = f"{project}-oracle" if oracle_id == 1 else f"{project}-oracle-{oracle_id}"
|
|
218
|
+
spawn(name, cwd=cwd)
|
|
219
|
+
return name
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def spawn_worker(project: str, task: str, *,
|
|
223
|
+
cwd: str | Path | None = None,
|
|
224
|
+
oracle_id: int = 1, worker_id: int = 1) -> str:
|
|
225
|
+
"""Spawn a worker session and return its name."""
|
|
226
|
+
if oracle_id == 1:
|
|
227
|
+
name = f"{project}-worker-{worker_id}-{task}"
|
|
228
|
+
else:
|
|
229
|
+
name = f"{project}-oracle-{oracle_id}-worker-{worker_id}-{task}"
|
|
230
|
+
spawn(name, cwd=cwd)
|
|
231
|
+
return name
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def spawn_aisb_chat(omega_home: str | Path | None = None) -> str:
|
|
235
|
+
"""Spawn an AISB chat session — the Telegram-conversation fallback.
|
|
236
|
+
|
|
237
|
+
Runs ``omega aisb chat-loop`` inside the session so the user can
|
|
238
|
+
attach and have a conversation with the AISB master agent without
|
|
239
|
+
needing Telegram connectivity.
|
|
240
|
+
"""
|
|
241
|
+
name = "AISB-chat"
|
|
242
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME")
|
|
243
|
+
or Path.home() / "Omega")
|
|
244
|
+
omega_bin = home / "Agentik_Tools" / "bin" / "omega"
|
|
245
|
+
spawn(name, command=f"{omega_bin} aisb chat-loop")
|
|
246
|
+
return name
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# ---------------------------------------------------------------------------
|
|
250
|
+
# Categorised view + health
|
|
251
|
+
# ---------------------------------------------------------------------------
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def grouped(sessions: list[TmuxSession]) -> dict[str, list[TmuxSession]]:
|
|
255
|
+
"""Group sessions by category, preserving order within each group."""
|
|
256
|
+
out: dict[str, list[TmuxSession]] = {c: [] for c in CATEGORIES}
|
|
257
|
+
for s in sessions:
|
|
258
|
+
out.setdefault(s.category, []).append(s)
|
|
259
|
+
return out
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def health_report(omega_home: str | Path | None = None) -> dict:
|
|
263
|
+
"""Summarise the session population for `omega tmux health` and doctor."""
|
|
264
|
+
if not _have_tmux():
|
|
265
|
+
return {"tmux_installed": False, "sessions": 0,
|
|
266
|
+
"by_category": {}, "stale": []}
|
|
267
|
+
sessions = list_sessions(omega_home)
|
|
268
|
+
by_cat = {cat: [s.name for s in lst]
|
|
269
|
+
for cat, lst in grouped(sessions).items() if lst}
|
|
270
|
+
# "Stale" heuristic: detached worker sessions older than 6h.
|
|
271
|
+
now = int(time.time())
|
|
272
|
+
stale = [
|
|
273
|
+
s.name for s in sessions
|
|
274
|
+
if s.category == "worker" and not s.attached
|
|
275
|
+
and (now - s.created) > 6 * 3600
|
|
276
|
+
]
|
|
277
|
+
return {
|
|
278
|
+
"tmux_installed": True,
|
|
279
|
+
"sessions": len(sessions),
|
|
280
|
+
"attached": sum(1 for s in sessions if s.attached),
|
|
281
|
+
"by_category": by_cat,
|
|
282
|
+
"stale": stale,
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def cleanup_stale(omega_home: str | Path | None = None,
|
|
287
|
+
*, older_than_hours: int = 24,
|
|
288
|
+
dry_run: bool = True) -> dict:
|
|
289
|
+
"""Best-effort cleanup of stale detached worker sessions.
|
|
290
|
+
|
|
291
|
+
By default this is a dry-run (returns the list of candidates without
|
|
292
|
+
killing). Pass ``dry_run=False`` to actually kill them.
|
|
293
|
+
"""
|
|
294
|
+
sessions = list_sessions(omega_home)
|
|
295
|
+
now = int(time.time())
|
|
296
|
+
candidates = [
|
|
297
|
+
s for s in sessions
|
|
298
|
+
if s.category == "worker"
|
|
299
|
+
and not s.attached
|
|
300
|
+
and (now - s.created) > older_than_hours * 3600
|
|
301
|
+
]
|
|
302
|
+
killed: list[str] = []
|
|
303
|
+
if not dry_run:
|
|
304
|
+
for s in candidates:
|
|
305
|
+
if kill(s.name):
|
|
306
|
+
killed.append(s.name)
|
|
307
|
+
return {
|
|
308
|
+
"candidates": [s.name for s in candidates],
|
|
309
|
+
"killed": killed,
|
|
310
|
+
"dry_run": dry_run,
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
# ---------------------------------------------------------------------------
|
|
315
|
+
# Default tmux config
|
|
316
|
+
# ---------------------------------------------------------------------------
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
_DEFAULT_CONFIG = """\
|
|
320
|
+
# ════════════════════════════════════════════════════════════════════
|
|
321
|
+
# OmegaOS — recommended tmux config (minimal)
|
|
322
|
+
# Drop this file at ~/.tmux.conf (or source it from your existing one).
|
|
323
|
+
# ════════════════════════════════════════════════════════════════════
|
|
324
|
+
|
|
325
|
+
# Base — 256 colours + true colour
|
|
326
|
+
set -g default-terminal "tmux-256color"
|
|
327
|
+
set -ag terminal-overrides ",xterm-256color:RGB"
|
|
328
|
+
|
|
329
|
+
# Sane indexing
|
|
330
|
+
set -g base-index 1
|
|
331
|
+
setw -g pane-base-index 1
|
|
332
|
+
set -g renumber-windows on
|
|
333
|
+
set -g history-limit 100000
|
|
334
|
+
|
|
335
|
+
# Mouse on (scroll, resize, click sessions)
|
|
336
|
+
set -g mouse on
|
|
337
|
+
|
|
338
|
+
# Faster than default — important for vim/claude
|
|
339
|
+
set -s escape-time 10
|
|
340
|
+
|
|
341
|
+
# ════════════════════════════════════════════════════════════════════
|
|
342
|
+
# Prefix+Z — OmegaOS session picker
|
|
343
|
+
# Opens a tmux popup with `omega tmux menu` so you can attach to any
|
|
344
|
+
# session (AISB / oracle / worker / dev / linear / home / other) without
|
|
345
|
+
# leaving tmux.
|
|
346
|
+
# ════════════════════════════════════════════════════════════════════
|
|
347
|
+
bind-key Z display-popup -E -w 80% -h 80% "omega tmux menu"
|
|
348
|
+
|
|
349
|
+
# Prefix+S — native session list (tmux's built-in choose-tree)
|
|
350
|
+
bind-key S choose-tree -Zs
|
|
351
|
+
|
|
352
|
+
# ════════════════════════════════════════════════════════════════════
|
|
353
|
+
# Visual cues per session category
|
|
354
|
+
# ════════════════════════════════════════════════════════════════════
|
|
355
|
+
set -g status-style "bg=#1a1a2e,fg=#eee"
|
|
356
|
+
set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
|
|
357
|
+
set -g status-right "#[fg=#888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
|
|
358
|
+
"""
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
# OmegaOS PRO tmux config — distilled from the live VPS conf (293 lines)
|
|
362
|
+
# down to the parts that aren't tied to AISB-specific scripts. Operators
|
|
363
|
+
# get it via `omega tmux install --full`. We preserve the bits that
|
|
364
|
+
# matter for any 24/7 agent VPS:
|
|
365
|
+
#
|
|
366
|
+
# * Termius paste fix (the assume-paste-time=0 + buffer-limit dance
|
|
367
|
+
# that prevents the PTY deadlock on large pastes — discovered the
|
|
368
|
+
# hard way on the live VPS).
|
|
369
|
+
# * Session-kill forensics — every session-closed + pane-died lands in
|
|
370
|
+
# ``$OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log`` so a
|
|
371
|
+
# mystery dead worker leaves a trace.
|
|
372
|
+
# * Smart scroll — when a pane is in alt-screen (Claude Code TUI),
|
|
373
|
+
# scrolling enters copy-mode instead of forwarding raw mouse
|
|
374
|
+
# sequences (which would print as garbage in claude).
|
|
375
|
+
# * Extended keys + clipboard OSC 52 — modern terminals work right.
|
|
376
|
+
#
|
|
377
|
+
# References live conf at ~/.tmux.conf on the live VPS as of 2026-05-25.
|
|
378
|
+
_PRO_CONFIG = """\
|
|
379
|
+
# ══════════════════════════════════════════════════════════════
|
|
380
|
+
# OmegaOS — PRO tmux config (full polish for 24/7 agent VPS)
|
|
381
|
+
# Generated by `omega tmux install --full`.
|
|
382
|
+
# ══════════════════════════════════════════════════════════════
|
|
383
|
+
|
|
384
|
+
# ====== SESSION KILL FORENSICS ======
|
|
385
|
+
# Every session-closed + pane-died lands in the log — a mystery dead
|
|
386
|
+
# worker leaves a trace.
|
|
387
|
+
set-hook -g session-closed "run-shell 'echo \\"[$(date -Iseconds)] SESSION CLOSED\\" >> $OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log'"
|
|
388
|
+
set-hook -g pane-died "run-shell 'echo \\"[$(date -Iseconds)] PANE DIED session=#{session_name} pane=#{pane_id}\\" >> $OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log'"
|
|
389
|
+
|
|
390
|
+
# ====== TERMINAL ======
|
|
391
|
+
set -g default-terminal "tmux-256color"
|
|
392
|
+
set -s terminal-overrides "linux*:AX@,xterm-256color:Tc:Ms=,xterm:Tc:Ms="
|
|
393
|
+
set -s terminal-features "xterm*:clipboard:ccolour:title,screen*:title,rxvt*:ignorefkeys"
|
|
394
|
+
set -q -g status-utf8 on
|
|
395
|
+
setw -q -g utf8 on
|
|
396
|
+
|
|
397
|
+
# ====== BASIC ======
|
|
398
|
+
set -g base-index 1
|
|
399
|
+
setw -g pane-base-index 1
|
|
400
|
+
set -g renumber-windows on
|
|
401
|
+
set -g history-limit 100000
|
|
402
|
+
|
|
403
|
+
# ====== LARGE PASTE FIX (Termius / SSH apps) ======
|
|
404
|
+
# tmux 3.5a buffers paste input + writes it all at once → PTY deadlock.
|
|
405
|
+
# assume-paste-time=0 disables the grouping; chars write individually
|
|
406
|
+
# (slower but cannot deadlock).
|
|
407
|
+
set -s buffer-limit 100
|
|
408
|
+
set -g assume-paste-time 0
|
|
409
|
+
set -s set-clipboard on
|
|
410
|
+
set -g allow-passthrough off
|
|
411
|
+
set -s message-limit 500
|
|
412
|
+
|
|
413
|
+
# ====== ALT-SCREEN + FOCUS EVENTS ======
|
|
414
|
+
# Alt-screen on prevents paste-freezes on Claude Code TUI.
|
|
415
|
+
setw -g alternate-screen on
|
|
416
|
+
# Focus events OFF — Termius leaks \\e[I / \\e[O as garbage characters.
|
|
417
|
+
set -g focus-events off
|
|
418
|
+
# Extended keys on so modern key sequences resolve properly.
|
|
419
|
+
set -g extended-keys on
|
|
420
|
+
set -s escape-time 10
|
|
421
|
+
|
|
422
|
+
# ====== MOUSE + SMART SCROLL ======
|
|
423
|
+
# When a pane is in alt-screen (Claude Code TUI), scroll up → enter
|
|
424
|
+
# copy-mode. Prevents raw mouse sequences from leaking as garbage.
|
|
425
|
+
set -g mouse on
|
|
426
|
+
bind-key -T copy-mode-vi WheelUpPane send -X scroll-up
|
|
427
|
+
bind-key -T copy-mode-vi WheelDownPane send -X scroll-down
|
|
428
|
+
# Auto-exit copy-mode after a brief idle so the operator goes back to
|
|
429
|
+
# typing without thinking about it.
|
|
430
|
+
set -g @scroll-without-changing-pane on
|
|
431
|
+
|
|
432
|
+
# ════════════════════════════════════════════════════════════════════
|
|
433
|
+
# Prefix+Z — OmegaOS session picker
|
|
434
|
+
# Opens a tmux popup with `omega tmux menu`.
|
|
435
|
+
# ════════════════════════════════════════════════════════════════════
|
|
436
|
+
bind-key Z display-popup -E -w 80% -h 80% "omega tmux menu"
|
|
437
|
+
|
|
438
|
+
# Prefix+S — native choose-tree
|
|
439
|
+
bind-key S choose-tree -Zs
|
|
440
|
+
|
|
441
|
+
# Prefix+R — reload this config without leaving tmux
|
|
442
|
+
bind-key r source-file ~/.tmux.conf \\; display-message "tmux.conf reloaded"
|
|
443
|
+
|
|
444
|
+
# ════════════════════════════════════════════════════════════════════
|
|
445
|
+
# Visual cues per session category — colour the status bar by name.
|
|
446
|
+
# ════════════════════════════════════════════════════════════════════
|
|
447
|
+
set -g status-style "bg=#1a1a2e,fg=#eee"
|
|
448
|
+
set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
|
|
449
|
+
set -g status-right "#[fg=#888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
|
|
450
|
+
set -g status-interval 5
|
|
451
|
+
set -g status-left-length 40
|
|
452
|
+
set -g status-right-length 60
|
|
453
|
+
|
|
454
|
+
# Pane border colour — softer than default red
|
|
455
|
+
set -g pane-border-style "fg=#333"
|
|
456
|
+
set -g pane-active-border-style "fg=#7aa2f7"
|
|
457
|
+
"""
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
def write_default_config(
|
|
461
|
+
target: str | Path | None = None,
|
|
462
|
+
*,
|
|
463
|
+
profile: str = "minimal",
|
|
464
|
+
) -> Path:
|
|
465
|
+
"""Write a tmux config to ``target``.
|
|
466
|
+
|
|
467
|
+
``profile``:
|
|
468
|
+
* ``"minimal"`` (default) — ~30 lines, just prefix+Z + status bar.
|
|
469
|
+
* ``"pro"`` — full ~80 lines with paste-fix Termius, kill
|
|
470
|
+
forensics, smart scroll, extended keys, OSC 52
|
|
471
|
+
clipboard. Best for 24/7 agent VPS.
|
|
472
|
+
|
|
473
|
+
Default target is ``$OMEGA_HOME/Agentik_Tools/tmux.conf`` — the
|
|
474
|
+
operator decides whether to `source` it from their main `~/.tmux.conf`
|
|
475
|
+
or replace theirs entirely. We never silently overwrite ``~/.tmux.conf``.
|
|
476
|
+
Use :func:`install_into_home_tmux_conf` to do that explicitly + with
|
|
477
|
+
backup.
|
|
478
|
+
"""
|
|
479
|
+
if target is None:
|
|
480
|
+
home = Path(os.environ.get("OMEGA_HOME",
|
|
481
|
+
str(Path.home() / "Omega")))
|
|
482
|
+
target = home / "Agentik_Tools" / "tmux.conf"
|
|
483
|
+
target = Path(target)
|
|
484
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
485
|
+
content = _PRO_CONFIG if profile == "pro" else _DEFAULT_CONFIG
|
|
486
|
+
target.write_text(content)
|
|
487
|
+
return target
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def install_into_home_tmux_conf(
|
|
491
|
+
*,
|
|
492
|
+
profile: str = "pro",
|
|
493
|
+
backup: bool = True,
|
|
494
|
+
omega_home: str | Path | None = None,
|
|
495
|
+
) -> dict[str, str]:
|
|
496
|
+
"""Write the chosen config to ``~/.tmux.conf`` with a timestamped backup.
|
|
497
|
+
|
|
498
|
+
Returns ``{written, backup_path, profile}``. Idempotent — re-running
|
|
499
|
+
keeps producing fresh backups so the operator can revert.
|
|
500
|
+
"""
|
|
501
|
+
import shutil as _sh
|
|
502
|
+
import time as _t
|
|
503
|
+
home_conf = Path.home() / ".tmux.conf"
|
|
504
|
+
backup_path = ""
|
|
505
|
+
if home_conf.exists() and backup:
|
|
506
|
+
ts = _t.strftime("%Y%m%d-%H%M%S")
|
|
507
|
+
backup_path = str(home_conf.with_suffix(f".conf.bak.{ts}"))
|
|
508
|
+
_sh.copy2(home_conf, backup_path)
|
|
509
|
+
content = _PRO_CONFIG if profile == "pro" else _DEFAULT_CONFIG
|
|
510
|
+
home_conf.write_text(content)
|
|
511
|
+
# Also drop it under $OMEGA_HOME so `omega tmux install` is the
|
|
512
|
+
# single source of truth that the engine sync mechanism can refresh.
|
|
513
|
+
_ = write_default_config(omega_home=None) if False else None
|
|
514
|
+
home = Path(omega_home or os.environ.get(
|
|
515
|
+
"OMEGA_HOME", str(Path.home() / "Omega")
|
|
516
|
+
))
|
|
517
|
+
bundled = home / "Agentik_Tools" / "tmux.conf"
|
|
518
|
+
bundled.parent.mkdir(parents=True, exist_ok=True)
|
|
519
|
+
bundled.write_text(content)
|
|
520
|
+
return {
|
|
521
|
+
"written": str(home_conf),
|
|
522
|
+
"backup_path": backup_path,
|
|
523
|
+
"bundled_copy": str(bundled),
|
|
524
|
+
"profile": profile,
|
|
525
|
+
}
|
|
526
|
+
return target
|