@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,1065 @@
|
|
|
1
|
+
"""`omega` with no args → an interactive whiptail menu.
|
|
2
|
+
|
|
3
|
+
The user wanted "j'aimerais que quand on a Omega installée, si on fait
|
|
4
|
+
``omega`` dans le terminal, ça ouvre Omega et ça nous permet de rentrer
|
|
5
|
+
dans les différents menus pour configurer ça". This is that menu.
|
|
6
|
+
|
|
7
|
+
Design:
|
|
8
|
+
|
|
9
|
+
* **Zero new deps.** Whiptail is already part of the install (used by
|
|
10
|
+
step_mcp + step_claude_plugins + step_llm_clis).
|
|
11
|
+
* **Wraps the existing CLI**, doesn't reimplement. Each menu leaf
|
|
12
|
+
builds and runs the right ``omega ...`` command, captures output,
|
|
13
|
+
shows it in a ``--msgbox`` so the user always lands back in the menu.
|
|
14
|
+
* **Stateless.** No background loops, no daemons. Hit Cancel / Esc to
|
|
15
|
+
exit any submenu; the main loop runs until "Quit".
|
|
16
|
+
* **Discoverable.** Every command in the CLI is reachable from a menu
|
|
17
|
+
— no hidden command surface.
|
|
18
|
+
|
|
19
|
+
This is intentionally a thin facade. Operators who prefer the CLI keep
|
|
20
|
+
using it; ``omega`` (no args) is the on-ramp for everyone else.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import os
|
|
25
|
+
import shutil
|
|
26
|
+
import subprocess
|
|
27
|
+
import sys
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _have(binary: str) -> bool:
|
|
32
|
+
return shutil.which(binary) is not None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _omega_bin() -> str:
|
|
36
|
+
"""Resolve the omega CLI path. Falls back to ``sys.argv[0]`` so the menu
|
|
37
|
+
works whether you invoked the venv binary or via the symlink."""
|
|
38
|
+
from omega_engine import __version__ # noqa: F401 — proves import works
|
|
39
|
+
cand = (
|
|
40
|
+
Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
|
|
41
|
+
/ "Agentik_Tools" / "bin" / "omega"
|
|
42
|
+
)
|
|
43
|
+
if cand.exists():
|
|
44
|
+
return str(cand)
|
|
45
|
+
# Fallback to current invocation
|
|
46
|
+
return sys.argv[0] or "omega"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
# Low-level whiptail wrappers
|
|
51
|
+
# ---------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _whiptail_menu(
|
|
55
|
+
title: str, prompt: str, items: list[tuple[str, str]],
|
|
56
|
+
*, height: int = 22, width: int = 78, list_height: int = 12,
|
|
57
|
+
) -> str | None:
|
|
58
|
+
"""Show a --menu. Returns the chosen tag or None on cancel/escape."""
|
|
59
|
+
args = ["whiptail", "--title", title,
|
|
60
|
+
"--menu", prompt,
|
|
61
|
+
str(height), str(width), str(list_height)]
|
|
62
|
+
for tag, label in items:
|
|
63
|
+
args += [tag, label]
|
|
64
|
+
proc = subprocess.run(args, capture_output=True, text=True)
|
|
65
|
+
if proc.returncode != 0:
|
|
66
|
+
return None
|
|
67
|
+
return proc.stderr.strip() or None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _whiptail_input(title: str, prompt: str,
|
|
71
|
+
default: str = "") -> str | None:
|
|
72
|
+
"""Show an --inputbox. Returns the entered string or None on cancel."""
|
|
73
|
+
proc = subprocess.run(
|
|
74
|
+
["whiptail", "--title", title,
|
|
75
|
+
"--inputbox", prompt, "12", "78", default],
|
|
76
|
+
capture_output=True, text=True,
|
|
77
|
+
)
|
|
78
|
+
if proc.returncode != 0:
|
|
79
|
+
return None
|
|
80
|
+
return proc.stderr.strip()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _whiptail_yesno(title: str, prompt: str) -> bool:
|
|
84
|
+
"""Show a --yesno. Returns True if the user confirms."""
|
|
85
|
+
proc = subprocess.run(
|
|
86
|
+
["whiptail", "--title", title, "--yesno", prompt, "10", "78"],
|
|
87
|
+
capture_output=True, text=True,
|
|
88
|
+
)
|
|
89
|
+
return proc.returncode == 0
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _show_output(title: str, body: str, *, height: int = 22, width: int = 100) -> None:
|
|
93
|
+
"""Display long subprocess output back to the user.
|
|
94
|
+
|
|
95
|
+
We use --msgbox for short outputs and --textbox (via a temp file) for
|
|
96
|
+
longer ones so the user can scroll.
|
|
97
|
+
"""
|
|
98
|
+
if len(body) < 1500 and body.count("\n") < 22:
|
|
99
|
+
subprocess.run(
|
|
100
|
+
["whiptail", "--title", title, "--msgbox", body or "(no output)",
|
|
101
|
+
str(height), str(width)],
|
|
102
|
+
capture_output=True, text=True,
|
|
103
|
+
)
|
|
104
|
+
return
|
|
105
|
+
import tempfile
|
|
106
|
+
with tempfile.NamedTemporaryFile("w", delete=False, suffix=".txt") as fh:
|
|
107
|
+
fh.write(body or "(no output)\n")
|
|
108
|
+
path = fh.name
|
|
109
|
+
try:
|
|
110
|
+
subprocess.run(
|
|
111
|
+
["whiptail", "--title", title, "--scrolltext",
|
|
112
|
+
"--textbox", path, str(height), str(width)],
|
|
113
|
+
capture_output=True, text=True,
|
|
114
|
+
)
|
|
115
|
+
finally:
|
|
116
|
+
try:
|
|
117
|
+
os.unlink(path)
|
|
118
|
+
except OSError:
|
|
119
|
+
pass
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _run_capture(*omega_args: str) -> str:
|
|
123
|
+
"""Run an omega CLI invocation and return the combined output."""
|
|
124
|
+
cmd = [_omega_bin(), *omega_args]
|
|
125
|
+
proc = subprocess.run(cmd, capture_output=True, text=True, timeout=900)
|
|
126
|
+
out = (proc.stdout or "") + (proc.stderr or "")
|
|
127
|
+
return out.rstrip()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
# Sub-menu dispatchers
|
|
132
|
+
# ---------------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _menu_mission() -> None:
|
|
136
|
+
intent = _whiptail_input(
|
|
137
|
+
"Run a mission", "Mission intent (the Oracle will plan it):",
|
|
138
|
+
)
|
|
139
|
+
if not intent:
|
|
140
|
+
return
|
|
141
|
+
if not _whiptail_yesno("Confirm", f"Dispatch a mission with:\n\n{intent[:200]}\n\nProceed?"):
|
|
142
|
+
return
|
|
143
|
+
out = _run_capture("run", intent)
|
|
144
|
+
_show_output("Mission result", out)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _menu_status() -> None:
|
|
148
|
+
out = _run_capture("status")
|
|
149
|
+
_show_output("omega status", out)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _menu_doctor() -> None:
|
|
153
|
+
out = _run_capture("doctor")
|
|
154
|
+
_show_output("omega doctor", out)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _menu_smoke() -> None:
|
|
158
|
+
out = _run_capture("smoke")
|
|
159
|
+
_show_output("omega smoke", out)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _menu_projects() -> None:
|
|
163
|
+
while True:
|
|
164
|
+
choice = _whiptail_menu(
|
|
165
|
+
"Projects", "Project management:",
|
|
166
|
+
items=[
|
|
167
|
+
("new", "Create a new project (+ Telegram topic)"),
|
|
168
|
+
("secret", "Manage per-project secrets"),
|
|
169
|
+
("precommit", "Install/uninstall pre-commit audit hook"),
|
|
170
|
+
("back", "← Back"),
|
|
171
|
+
],
|
|
172
|
+
)
|
|
173
|
+
if choice in (None, "back"):
|
|
174
|
+
return
|
|
175
|
+
if choice == "new":
|
|
176
|
+
name = _whiptail_input("New project", "Project name:")
|
|
177
|
+
if name:
|
|
178
|
+
_show_output("Project created", _run_capture("project", name))
|
|
179
|
+
elif choice == "secret":
|
|
180
|
+
slug = _whiptail_input("Project secret", "Project slug:")
|
|
181
|
+
if not slug:
|
|
182
|
+
continue
|
|
183
|
+
sub = _whiptail_menu(
|
|
184
|
+
"Project secret", f"Slug: {slug}",
|
|
185
|
+
items=[("list", "List secrets"),
|
|
186
|
+
("set", "Set a secret"),
|
|
187
|
+
("get", "Get a secret"),
|
|
188
|
+
("back", "← Back")],
|
|
189
|
+
)
|
|
190
|
+
if sub == "list":
|
|
191
|
+
_show_output("secrets", _run_capture("project", "secret", "list", slug))
|
|
192
|
+
elif sub == "set":
|
|
193
|
+
ref = _whiptail_input("set", "Secret ref:") or ""
|
|
194
|
+
val = _whiptail_input("set", f"Value for {ref}:") or ""
|
|
195
|
+
if ref and val:
|
|
196
|
+
_show_output("set", _run_capture(
|
|
197
|
+
"project", "secret", "set", slug, "--ref", ref, "--value", val,
|
|
198
|
+
))
|
|
199
|
+
elif sub == "get":
|
|
200
|
+
ref = _whiptail_input("get", "Secret ref:") or ""
|
|
201
|
+
if ref:
|
|
202
|
+
_show_output("get", _run_capture(
|
|
203
|
+
"project", "secret", "get", slug, "--ref", ref,
|
|
204
|
+
))
|
|
205
|
+
elif choice == "precommit":
|
|
206
|
+
slug = _whiptail_input("pre-commit", "Project slug:")
|
|
207
|
+
if not slug:
|
|
208
|
+
continue
|
|
209
|
+
sub = _whiptail_menu(
|
|
210
|
+
"pre-commit", f"Slug: {slug}",
|
|
211
|
+
items=[("install", "Install pre-commit audit hook"),
|
|
212
|
+
("uninstall", "Remove the hook"),
|
|
213
|
+
("back", "← Back")],
|
|
214
|
+
)
|
|
215
|
+
if sub in ("install", "uninstall"):
|
|
216
|
+
_show_output(sub, _run_capture("precommit", sub, slug))
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _menu_accounts() -> None:
|
|
220
|
+
while True:
|
|
221
|
+
choice = _whiptail_menu(
|
|
222
|
+
"Claude Max accounts",
|
|
223
|
+
"Manage the OAuth account pool (no API keys — Max only):",
|
|
224
|
+
items=[
|
|
225
|
+
("list", "List the pool"),
|
|
226
|
+
("login", "Add a new Claude Max account"),
|
|
227
|
+
("use", "Change an account's status"),
|
|
228
|
+
("pool", "Edit pool selection / weights"),
|
|
229
|
+
("back", "← Back"),
|
|
230
|
+
],
|
|
231
|
+
)
|
|
232
|
+
if choice in (None, "back"):
|
|
233
|
+
return
|
|
234
|
+
if choice == "list":
|
|
235
|
+
_show_output("accounts", _run_capture("account", "list"))
|
|
236
|
+
elif choice == "login":
|
|
237
|
+
aid = _whiptail_input("account login", "Account id (e.g. max-primary):")
|
|
238
|
+
if aid:
|
|
239
|
+
_show_output("login", _run_capture(
|
|
240
|
+
"account", "login", "--id", aid,
|
|
241
|
+
))
|
|
242
|
+
elif choice == "use":
|
|
243
|
+
aid = _whiptail_input("account use", "Account id:") or ""
|
|
244
|
+
if not aid:
|
|
245
|
+
continue
|
|
246
|
+
status = _whiptail_menu(
|
|
247
|
+
"account use", f"New status for {aid}:",
|
|
248
|
+
items=[("active", "active"),
|
|
249
|
+
("resting", "resting"),
|
|
250
|
+
("disabled", "disabled")],
|
|
251
|
+
)
|
|
252
|
+
if status:
|
|
253
|
+
_show_output("use", _run_capture(
|
|
254
|
+
"account", "use", aid, status,
|
|
255
|
+
))
|
|
256
|
+
elif choice == "pool":
|
|
257
|
+
sel = _whiptail_menu(
|
|
258
|
+
"account pool", "Pool selection strategy:",
|
|
259
|
+
items=[("round-robin", "round-robin"),
|
|
260
|
+
("least-used", "least-used"),
|
|
261
|
+
("by-quota", "by-quota")],
|
|
262
|
+
)
|
|
263
|
+
if sel:
|
|
264
|
+
_show_output("pool", _run_capture(
|
|
265
|
+
"account", "pool", "--selection", sel,
|
|
266
|
+
))
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _menu_audit() -> None:
|
|
270
|
+
while True:
|
|
271
|
+
choice = _whiptail_menu(
|
|
272
|
+
"Audits", "Quality Arsenal — 18 forensic audits:",
|
|
273
|
+
items=[
|
|
274
|
+
("run", "Run one audit"),
|
|
275
|
+
("all", "Run every applicable audit"),
|
|
276
|
+
("history", "Show audit history + trend"),
|
|
277
|
+
("gen", "Regenerate audit SKILL.md from YAMLs"),
|
|
278
|
+
("back", "← Back"),
|
|
279
|
+
],
|
|
280
|
+
)
|
|
281
|
+
if choice in (None, "back"):
|
|
282
|
+
return
|
|
283
|
+
if choice == "run":
|
|
284
|
+
aid = _whiptail_input("audit", "Audit id (e.g. codeaudit):")
|
|
285
|
+
if aid:
|
|
286
|
+
fix = _whiptail_yesno("audit", "Also dispatch fix workers + reaudit?")
|
|
287
|
+
args = ["audit", "run", aid]
|
|
288
|
+
if fix:
|
|
289
|
+
args.append("--fix")
|
|
290
|
+
_show_output(f"audit {aid}", _run_capture(*args))
|
|
291
|
+
elif choice == "all":
|
|
292
|
+
_show_output("audit all", _run_capture("audit", "all"))
|
|
293
|
+
elif choice == "history":
|
|
294
|
+
aid = _whiptail_input("audit history",
|
|
295
|
+
"Audit id (blank = all):") or ""
|
|
296
|
+
args = ["audit", "history"]
|
|
297
|
+
if aid:
|
|
298
|
+
args.append(aid)
|
|
299
|
+
_show_output("audit history", _run_capture(*args))
|
|
300
|
+
elif choice == "gen":
|
|
301
|
+
_show_output("audit gen", _run_capture("audit", "gen"))
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def _menu_skills() -> None:
|
|
305
|
+
while True:
|
|
306
|
+
choice = _whiptail_menu(
|
|
307
|
+
"Skills", "Skill discovery + safety audit:",
|
|
308
|
+
items=[
|
|
309
|
+
("find", "Find skills in the curated catalog"),
|
|
310
|
+
("audit", "Run safety auditor on a SKILL.md"),
|
|
311
|
+
("install", "Install from a GitHub source"),
|
|
312
|
+
("marketplaces", "List trusted marketplaces"),
|
|
313
|
+
("back", "← Back"),
|
|
314
|
+
],
|
|
315
|
+
)
|
|
316
|
+
if choice in (None, "back"):
|
|
317
|
+
return
|
|
318
|
+
if choice == "find":
|
|
319
|
+
q = _whiptail_input("skill find", "Search query (blank = all):") or ""
|
|
320
|
+
args = ["skill", "find"]
|
|
321
|
+
if q:
|
|
322
|
+
args.append(q)
|
|
323
|
+
_show_output("skill find", _run_capture(*args))
|
|
324
|
+
elif choice == "audit":
|
|
325
|
+
path = _whiptail_input("skill audit", "Path to SKILL.md:")
|
|
326
|
+
if path:
|
|
327
|
+
_show_output("skill audit", _run_capture(
|
|
328
|
+
"skill", "audit", path,
|
|
329
|
+
))
|
|
330
|
+
elif choice == "install":
|
|
331
|
+
name = _whiptail_input("skill install", "Local name for the skill:")
|
|
332
|
+
if not name:
|
|
333
|
+
continue
|
|
334
|
+
src = _whiptail_input("skill install",
|
|
335
|
+
"Source (github:<org>/<repo>[/<path>]):")
|
|
336
|
+
if name and src:
|
|
337
|
+
_show_output("install", _run_capture(
|
|
338
|
+
"skill", "install", name, "--from", src,
|
|
339
|
+
))
|
|
340
|
+
elif choice == "marketplaces":
|
|
341
|
+
_show_output("marketplaces",
|
|
342
|
+
_run_capture("skill", "marketplaces"))
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _menu_maintenance() -> None:
|
|
346
|
+
while True:
|
|
347
|
+
choice = _whiptail_menu(
|
|
348
|
+
"Maintenance", "System operations:",
|
|
349
|
+
items=[
|
|
350
|
+
("smoke", "Run synthetic-mission smoke test"),
|
|
351
|
+
("cleanup", "OmegaOS-adapted disk cleanup (6 tiers + --deep)"),
|
|
352
|
+
("prune", "Prune old rows from runtime DBs"),
|
|
353
|
+
("backup", "Create / restore / verify backup"),
|
|
354
|
+
("validate", "Validate provider credentials"),
|
|
355
|
+
("upgrade", "Re-run the installer (preserves runtime)"),
|
|
356
|
+
("update", "Check for a newer omega-os version"),
|
|
357
|
+
("billing", "Per-account token usage"),
|
|
358
|
+
("costs", "Project usage → USD"),
|
|
359
|
+
("back", "← Back"),
|
|
360
|
+
],
|
|
361
|
+
)
|
|
362
|
+
if choice in (None, "back"):
|
|
363
|
+
return
|
|
364
|
+
if choice == "smoke":
|
|
365
|
+
_show_output("smoke", _run_capture("smoke"))
|
|
366
|
+
elif choice == "cleanup":
|
|
367
|
+
deep = _whiptail_yesno("cleanup", "Run deep tiers (staging, transcripts, VACUUM, opensrc, git gc)?")
|
|
368
|
+
apply = _whiptail_yesno("cleanup", "Apply (no = dry-run)?")
|
|
369
|
+
args = ["cleanup"]
|
|
370
|
+
if deep:
|
|
371
|
+
args.append("--deep")
|
|
372
|
+
if apply:
|
|
373
|
+
args.append("--yes")
|
|
374
|
+
_show_output("cleanup", _run_capture(*args))
|
|
375
|
+
elif choice == "prune":
|
|
376
|
+
target = _whiptail_menu(
|
|
377
|
+
"prune", "Target:",
|
|
378
|
+
items=[("events", "events"),
|
|
379
|
+
("audits", "audits"),
|
|
380
|
+
("telegram", "telegram"),
|
|
381
|
+
("sessions", "sessions"),
|
|
382
|
+
("all", "all")],
|
|
383
|
+
)
|
|
384
|
+
if not target:
|
|
385
|
+
continue
|
|
386
|
+
days = _whiptail_input("prune", "Older than (days):", "90") or "90"
|
|
387
|
+
apply = _whiptail_yesno("prune", "Apply (no = dry-run)?")
|
|
388
|
+
args = ["prune", target, "--days", days]
|
|
389
|
+
if apply:
|
|
390
|
+
args.append("--yes")
|
|
391
|
+
_show_output("prune", _run_capture(*args))
|
|
392
|
+
elif choice == "backup":
|
|
393
|
+
sub = _whiptail_menu(
|
|
394
|
+
"backup", "Operation:",
|
|
395
|
+
items=[("create", "Create a backup"),
|
|
396
|
+
("restore", "Restore a backup"),
|
|
397
|
+
("verify", "Verify a backup")],
|
|
398
|
+
)
|
|
399
|
+
if sub == "create":
|
|
400
|
+
enc = _whiptail_yesno("backup", "Encrypt with age?")
|
|
401
|
+
args = ["backup", "create"]
|
|
402
|
+
if enc:
|
|
403
|
+
args.append("--encrypt")
|
|
404
|
+
_show_output("backup", _run_capture(*args))
|
|
405
|
+
elif sub in ("restore", "verify"):
|
|
406
|
+
p = _whiptail_input(f"backup {sub}", "Path to bundle:")
|
|
407
|
+
if p:
|
|
408
|
+
_show_output(f"backup {sub}",
|
|
409
|
+
_run_capture("backup", sub, p))
|
|
410
|
+
elif choice == "validate":
|
|
411
|
+
_show_output("validate providers",
|
|
412
|
+
_run_capture("validate", "providers"))
|
|
413
|
+
elif choice == "upgrade":
|
|
414
|
+
if _whiptail_yesno("upgrade", "Re-run install.sh --force?"):
|
|
415
|
+
_show_output("upgrade", _run_capture("upgrade"))
|
|
416
|
+
elif choice == "update":
|
|
417
|
+
_show_output("update", _run_capture("update", "--check"))
|
|
418
|
+
elif choice == "billing":
|
|
419
|
+
_show_output("billing", _run_capture("billing"))
|
|
420
|
+
elif choice == "costs":
|
|
421
|
+
_show_output("costs", _run_capture("costs"))
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def _menu_settings() -> None:
|
|
425
|
+
while True:
|
|
426
|
+
choice = _whiptail_menu(
|
|
427
|
+
"Settings", "OmegaOS-side configuration:",
|
|
428
|
+
items=[
|
|
429
|
+
("agents", "View resolved agent prompts (debug)"),
|
|
430
|
+
("completions", "Install shell completions"),
|
|
431
|
+
("tools", "List installed MCPs / tools"),
|
|
432
|
+
("webhooks", "List inbound webhooks"),
|
|
433
|
+
("sync", "Project SSOT into Claude Code"),
|
|
434
|
+
("back", "← Back"),
|
|
435
|
+
],
|
|
436
|
+
)
|
|
437
|
+
if choice in (None, "back"):
|
|
438
|
+
return
|
|
439
|
+
if choice == "agents":
|
|
440
|
+
sub = _whiptail_menu(
|
|
441
|
+
"agents", "Agents:",
|
|
442
|
+
items=[("list", "List all known agents"),
|
|
443
|
+
("prompt", "Print the resolved system+user prompt")],
|
|
444
|
+
)
|
|
445
|
+
if sub == "list":
|
|
446
|
+
_show_output("agents", _run_capture("agent", "list"))
|
|
447
|
+
elif sub == "prompt":
|
|
448
|
+
role = _whiptail_input("prompt", "Role (oracle, worker, ...):")
|
|
449
|
+
if role:
|
|
450
|
+
_show_output("prompt",
|
|
451
|
+
_run_capture("agent", "prompt", role))
|
|
452
|
+
elif choice == "completions":
|
|
453
|
+
shell = _whiptail_menu(
|
|
454
|
+
"completions", "Shell:",
|
|
455
|
+
items=[("bash", "bash"),
|
|
456
|
+
("zsh", "zsh"),
|
|
457
|
+
("fish", "fish")],
|
|
458
|
+
)
|
|
459
|
+
if shell:
|
|
460
|
+
_run_capture("completions", "write")
|
|
461
|
+
_show_output("completions",
|
|
462
|
+
_run_capture("completions", "install", shell))
|
|
463
|
+
elif choice == "tools":
|
|
464
|
+
_show_output("tools", _run_capture("tool", "list"))
|
|
465
|
+
elif choice == "webhooks":
|
|
466
|
+
_show_output("webhooks", _run_capture("webhook", "list"))
|
|
467
|
+
elif choice == "sync":
|
|
468
|
+
_show_output("sync", _run_capture("sync"))
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
# ---------------------------------------------------------------------------
|
|
472
|
+
# Main menu loop
|
|
473
|
+
# ---------------------------------------------------------------------------
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
_MAIN_ITEMS = [
|
|
477
|
+
("mission", "Run a mission"),
|
|
478
|
+
("genesis", "New project (vision → market → branding → PRD → features → plan)"),
|
|
479
|
+
("plan", "Plan executor — multi-day autonomous (FSM-enforced)"),
|
|
480
|
+
("worker", "Workers — spawn / status / list / wait"),
|
|
481
|
+
("handoff", "Session handoff — 5-section memo for the next agent"),
|
|
482
|
+
("hermes", "Hermès (L2) — install / link / brief / ask"),
|
|
483
|
+
("hermes-desktop", "Hermes Desktop remote backend (laptop UI on this VPS)"),
|
|
484
|
+
("tmux", "Tmux sessions (AISB / oracles / workers / install conf)"),
|
|
485
|
+
("aisb-chat", "Talk to AISB (Telegram fallback)"),
|
|
486
|
+
("projects", "Manage projects"),
|
|
487
|
+
("accounts", "Manage Claude Max accounts"),
|
|
488
|
+
("audit", "Quality Arsenal — 17 forensic audits"),
|
|
489
|
+
("skills", "Skill discovery + install + workflows"),
|
|
490
|
+
("memory", "Semantic memory across all sessions"),
|
|
491
|
+
("learn", "Smith reflection (self-improvement loop)"),
|
|
492
|
+
("update", "Auto-update OmegaOS (check / apply / banner / auto)"),
|
|
493
|
+
("ua", "Understand-Anything (knowledge-graph plugin)"),
|
|
494
|
+
("ma", "Managed Agents (Anthropic API; opt-in)"),
|
|
495
|
+
("maintenance", "Smoke / prune / backup / cleanup / validate / upgrade"),
|
|
496
|
+
("settings", "Settings & integrations"),
|
|
497
|
+
("status", "Show omega status"),
|
|
498
|
+
("doctor", "Show omega doctor"),
|
|
499
|
+
("quit", "Quit"),
|
|
500
|
+
]
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
def _menu_tmux() -> None:
|
|
504
|
+
while True:
|
|
505
|
+
choice = _whiptail_menu(
|
|
506
|
+
"Tmux sessions", "OmegaOS tmux orchestration:",
|
|
507
|
+
items=[
|
|
508
|
+
("list", "List + browse sessions (categorised)"),
|
|
509
|
+
("attach", "Attach to a session"),
|
|
510
|
+
("spawn", "Spawn a new session (oracle / worker / aisb-chat / shell)"),
|
|
511
|
+
("kill", "Kill a session"),
|
|
512
|
+
("health", "Population summary + stale workers"),
|
|
513
|
+
("cleanup", "Clean up stale worker sessions"),
|
|
514
|
+
("config", "Write recommended tmux.conf (Agentik_Tools/)"),
|
|
515
|
+
("install", "Install tmux.conf into ~/.tmux.conf (with backup)"),
|
|
516
|
+
("back", "← Back"),
|
|
517
|
+
],
|
|
518
|
+
)
|
|
519
|
+
if choice in (None, "back"):
|
|
520
|
+
return
|
|
521
|
+
if choice == "list":
|
|
522
|
+
_show_output("tmux sessions", _run_capture("tmux", "list"))
|
|
523
|
+
elif choice == "attach":
|
|
524
|
+
sessions_out = _run_capture("tmux", "list")
|
|
525
|
+
name = _whiptail_input("attach",
|
|
526
|
+
"Session name (see list below):\n\n" + sessions_out[:300])
|
|
527
|
+
if name:
|
|
528
|
+
cmd = _run_capture("tmux", "attach", name)
|
|
529
|
+
_show_output("attach",
|
|
530
|
+
f"Run this in your terminal to attach:\n\n{cmd}")
|
|
531
|
+
elif choice == "spawn":
|
|
532
|
+
kind = _whiptail_menu(
|
|
533
|
+
"spawn", "Session kind:",
|
|
534
|
+
items=[("session", "Plain shell session"),
|
|
535
|
+
("oracle", "Project Oracle session"),
|
|
536
|
+
("worker", "Worker session (needs --task)"),
|
|
537
|
+
("aisb-chat", "AISB chat fallback")],
|
|
538
|
+
)
|
|
539
|
+
if not kind:
|
|
540
|
+
continue
|
|
541
|
+
if kind == "aisb-chat":
|
|
542
|
+
_show_output("spawn", _run_capture("tmux", "spawn", "aisb-chat", "_"))
|
|
543
|
+
continue
|
|
544
|
+
name = _whiptail_input("spawn", "Name (project for oracle, project for worker):")
|
|
545
|
+
if not name:
|
|
546
|
+
continue
|
|
547
|
+
args = ["tmux", "spawn", kind, name]
|
|
548
|
+
if kind == "worker":
|
|
549
|
+
task = _whiptail_input("spawn", "Task name (worker):") or "task"
|
|
550
|
+
args += ["--task", task]
|
|
551
|
+
_show_output("spawn", _run_capture(*args))
|
|
552
|
+
elif choice == "kill":
|
|
553
|
+
name = _whiptail_input("kill", "Session name to kill:")
|
|
554
|
+
if name and _whiptail_yesno("kill", f"Really kill `{name}`?"):
|
|
555
|
+
_show_output("kill", _run_capture("tmux", "kill", name))
|
|
556
|
+
elif choice == "health":
|
|
557
|
+
_show_output("tmux health", _run_capture("tmux", "health"))
|
|
558
|
+
elif choice == "cleanup":
|
|
559
|
+
hours = _whiptail_input("cleanup", "Stale threshold (hours):", "24") or "24"
|
|
560
|
+
apply = _whiptail_yesno("cleanup", "Apply (no = dry-run)?")
|
|
561
|
+
args = ["tmux", "cleanup", "--hours", hours]
|
|
562
|
+
if apply:
|
|
563
|
+
args.append("--yes")
|
|
564
|
+
_show_output("tmux cleanup", _run_capture(*args))
|
|
565
|
+
elif choice == "config":
|
|
566
|
+
profile = _whiptail_menu(
|
|
567
|
+
"tmux config", "Profile:",
|
|
568
|
+
items=[("minimal", "Minimal (~30 lines)"),
|
|
569
|
+
("pro", "Pro (paste-fix, kill forensics, smart scroll)")],
|
|
570
|
+
) or "minimal"
|
|
571
|
+
_show_output("tmux config",
|
|
572
|
+
_run_capture("tmux", "config", "--profile", profile))
|
|
573
|
+
elif choice == "install":
|
|
574
|
+
profile = _whiptail_menu(
|
|
575
|
+
"tmux install", "Profile (will be installed to ~/.tmux.conf):",
|
|
576
|
+
items=[("pro", "Pro (paste-fix, kill forensics, smart scroll)"),
|
|
577
|
+
("minimal", "Minimal (~30 lines)")],
|
|
578
|
+
) or "pro"
|
|
579
|
+
if _whiptail_yesno(
|
|
580
|
+
"tmux install",
|
|
581
|
+
f"Install '{profile}' profile to ~/.tmux.conf?\n\n"
|
|
582
|
+
"Existing ~/.tmux.conf will be backed up "
|
|
583
|
+
"(<file>.bak.<timestamp>).",
|
|
584
|
+
):
|
|
585
|
+
_show_output("tmux install",
|
|
586
|
+
_run_capture("tmux", "install",
|
|
587
|
+
"--profile", profile))
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def _menu_aisb_chat() -> None:
|
|
591
|
+
# Spawning + attach instructions; the actual conversation happens
|
|
592
|
+
# in the tmux session the operator attaches to.
|
|
593
|
+
out = _run_capture("aisb", "chat")
|
|
594
|
+
_show_output("AISB chat",
|
|
595
|
+
out + "\n\nAttach with the command above, then talk to AISB. "
|
|
596
|
+
"Type /quit to leave, /history to see the last 10 turns.")
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
# ---------------------------------------------------------------------------
|
|
600
|
+
# v0.19+ menus — surface the commands shipped in v0.10–v0.19 that the
|
|
601
|
+
# original 12-entry menu never exposed.
|
|
602
|
+
# ---------------------------------------------------------------------------
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
def _menu_genesis() -> None:
|
|
606
|
+
"""Project genesis pipeline (vision → market → branding → PRD → features → plan)."""
|
|
607
|
+
while True:
|
|
608
|
+
choice = _whiptail_menu(
|
|
609
|
+
"Genesis", "Project genesis pipeline:",
|
|
610
|
+
items=[
|
|
611
|
+
("new", "Initialise a new project"),
|
|
612
|
+
("run", "Advance the pipeline (resume-safe)"),
|
|
613
|
+
("status", "Phase + completed + stack snapshot"),
|
|
614
|
+
("questions", "Stack-picker question list"),
|
|
615
|
+
("delete", "Destroy a project tree (--yes required)"),
|
|
616
|
+
("back", "← Back"),
|
|
617
|
+
],
|
|
618
|
+
)
|
|
619
|
+
if choice in (None, "back"):
|
|
620
|
+
return
|
|
621
|
+
if choice == "new":
|
|
622
|
+
slug = _whiptail_input("genesis new", "Project slug (kebab-case):")
|
|
623
|
+
if not slug:
|
|
624
|
+
continue
|
|
625
|
+
intent = _whiptail_input("genesis new",
|
|
626
|
+
"One-line intent:") or ""
|
|
627
|
+
_show_output("genesis new",
|
|
628
|
+
_run_capture("genesis", "new", slug,
|
|
629
|
+
"--intent", intent,
|
|
630
|
+
"--accept-defaults"))
|
|
631
|
+
elif choice == "run":
|
|
632
|
+
slug = _whiptail_input("genesis run", "Project slug:")
|
|
633
|
+
if slug:
|
|
634
|
+
_show_output(f"genesis run {slug}",
|
|
635
|
+
_run_capture("genesis", "run", slug))
|
|
636
|
+
elif choice == "status":
|
|
637
|
+
slug = _whiptail_input("genesis status", "Project slug:")
|
|
638
|
+
if slug:
|
|
639
|
+
_show_output(f"genesis status {slug}",
|
|
640
|
+
_run_capture("genesis", "status", slug))
|
|
641
|
+
elif choice == "questions":
|
|
642
|
+
_show_output("genesis questions",
|
|
643
|
+
_run_capture("genesis", "questions"))
|
|
644
|
+
elif choice == "delete":
|
|
645
|
+
slug = _whiptail_input("genesis delete", "Project slug:")
|
|
646
|
+
if slug and _whiptail_yesno(
|
|
647
|
+
"genesis delete",
|
|
648
|
+
f"Really destroy project tree {slug!r}?",
|
|
649
|
+
):
|
|
650
|
+
_show_output(f"genesis delete {slug}",
|
|
651
|
+
_run_capture("genesis", "delete", slug,
|
|
652
|
+
"--yes"))
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
def _menu_plan() -> None:
|
|
656
|
+
"""v7 FSM-enforced plan executor."""
|
|
657
|
+
while True:
|
|
658
|
+
choice = _whiptail_menu(
|
|
659
|
+
"Plan v7", "FSM-enforced sequential plan executor:",
|
|
660
|
+
items=[
|
|
661
|
+
("build", "Ingest plan/DAG.json → store"),
|
|
662
|
+
("next", "Show the next eligible task"),
|
|
663
|
+
("run", "Autonomous multi-day loop"),
|
|
664
|
+
("status", "Completion % + per-state counts"),
|
|
665
|
+
("list", "List every task (filter by state)"),
|
|
666
|
+
("retry", "FAILED → PENDING (operator action)"),
|
|
667
|
+
("back", "← Back"),
|
|
668
|
+
],
|
|
669
|
+
)
|
|
670
|
+
if choice in (None, "back"):
|
|
671
|
+
return
|
|
672
|
+
slug = _whiptail_input(f"plan {choice}", "Project slug:")
|
|
673
|
+
if not slug:
|
|
674
|
+
continue
|
|
675
|
+
if choice == "list":
|
|
676
|
+
state = _whiptail_menu(
|
|
677
|
+
"plan list", "Filter by state (or All):",
|
|
678
|
+
items=[("all", "All"),
|
|
679
|
+
("pending", "pending"),
|
|
680
|
+
("in_progress", "in_progress"),
|
|
681
|
+
("claimed_done", "claimed_done"),
|
|
682
|
+
("verified", "verified"),
|
|
683
|
+
("failed", "failed")],
|
|
684
|
+
)
|
|
685
|
+
args = ["plan", "list", slug]
|
|
686
|
+
if state and state != "all":
|
|
687
|
+
args += ["--state", state]
|
|
688
|
+
_show_output(f"plan list {slug}", _run_capture(*args))
|
|
689
|
+
elif choice == "retry":
|
|
690
|
+
tid = _whiptail_input("plan retry", "Task id (e.g. F-003):")
|
|
691
|
+
if tid:
|
|
692
|
+
_show_output(f"plan retry {slug} {tid}",
|
|
693
|
+
_run_capture("plan", "retry", slug, tid))
|
|
694
|
+
else:
|
|
695
|
+
_show_output(f"plan {choice} {slug}",
|
|
696
|
+
_run_capture("plan", choice, slug))
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
def _menu_worker() -> None:
|
|
700
|
+
while True:
|
|
701
|
+
choice = _whiptail_menu(
|
|
702
|
+
"Workers", "Persistent-tmux worker lifecycle:",
|
|
703
|
+
items=[
|
|
704
|
+
("list", "List every worker on disk"),
|
|
705
|
+
("spawn", "Spawn a new worker"),
|
|
706
|
+
("status", "Status of a worker by task_id"),
|
|
707
|
+
("wait", "Block until .done.json"),
|
|
708
|
+
("back", "← Back"),
|
|
709
|
+
],
|
|
710
|
+
)
|
|
711
|
+
if choice in (None, "back"):
|
|
712
|
+
return
|
|
713
|
+
if choice == "list":
|
|
714
|
+
_show_output("worker list", _run_capture("worker", "list"))
|
|
715
|
+
elif choice == "spawn":
|
|
716
|
+
intent = _whiptail_input("worker spawn", "Intent:")
|
|
717
|
+
if intent:
|
|
718
|
+
role = _whiptail_input("worker spawn",
|
|
719
|
+
"Role:", "worker") or "worker"
|
|
720
|
+
_show_output(f"worker spawn",
|
|
721
|
+
_run_capture("worker", "spawn", intent,
|
|
722
|
+
"--role", role))
|
|
723
|
+
elif choice in ("status", "wait"):
|
|
724
|
+
tid = _whiptail_input(f"worker {choice}", "Task id:")
|
|
725
|
+
if tid:
|
|
726
|
+
_show_output(f"worker {choice}",
|
|
727
|
+
_run_capture("worker", choice, tid))
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
def _menu_handoff() -> None:
|
|
731
|
+
while True:
|
|
732
|
+
choice = _whiptail_menu(
|
|
733
|
+
"Handoff", "5-section session memo:",
|
|
734
|
+
items=[
|
|
735
|
+
("read", "Print the latest handoff"),
|
|
736
|
+
("list", "Archive history per project"),
|
|
737
|
+
("template", "Print the canonical template"),
|
|
738
|
+
("from-done","Auto-draft from a task's .done.json"),
|
|
739
|
+
("write", "Write a handoff (interactive)"),
|
|
740
|
+
("back", "← Back"),
|
|
741
|
+
],
|
|
742
|
+
)
|
|
743
|
+
if choice in (None, "back"):
|
|
744
|
+
return
|
|
745
|
+
if choice == "template":
|
|
746
|
+
_show_output("handoff template",
|
|
747
|
+
_run_capture("handoff", "template"))
|
|
748
|
+
continue
|
|
749
|
+
slug = _whiptail_input(f"handoff {choice}", "Project slug:")
|
|
750
|
+
if not slug:
|
|
751
|
+
continue
|
|
752
|
+
if choice == "read":
|
|
753
|
+
_show_output(f"handoff read", _run_capture("handoff", "read",
|
|
754
|
+
"--project", slug))
|
|
755
|
+
elif choice == "list":
|
|
756
|
+
_show_output(f"handoff list {slug}",
|
|
757
|
+
_run_capture("handoff", "list", slug))
|
|
758
|
+
elif choice == "from-done":
|
|
759
|
+
tid = _whiptail_input("from-done", "Task id:")
|
|
760
|
+
if tid:
|
|
761
|
+
_show_output(f"handoff from-done {tid}",
|
|
762
|
+
_run_capture("handoff", "from-done", tid,
|
|
763
|
+
"--project", slug, "--print"))
|
|
764
|
+
elif choice == "write":
|
|
765
|
+
_show_output("handoff write",
|
|
766
|
+
_run_capture("handoff", "write",
|
|
767
|
+
"--project", slug))
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
def _menu_hermes() -> None:
|
|
771
|
+
while True:
|
|
772
|
+
choice = _whiptail_menu(
|
|
773
|
+
"Hermès (Layer 2)", "Autonomous companion bridge:",
|
|
774
|
+
items=[
|
|
775
|
+
("status", "Installed + linked + OAuth + expiry"),
|
|
776
|
+
("install", "Run upstream install.sh (~1 min)"),
|
|
777
|
+
("link", "Bind to live Claude OAuth"),
|
|
778
|
+
("brief-write", "Teach Hermès what OmegaOS is (self-improvement)"),
|
|
779
|
+
("brief-status", "Brief + observation log snapshot"),
|
|
780
|
+
("ask", "One-shot prompt → hermes → stdout"),
|
|
781
|
+
("env", "Print injected env (debug)"),
|
|
782
|
+
("back", "← Back"),
|
|
783
|
+
],
|
|
784
|
+
)
|
|
785
|
+
if choice in (None, "back"):
|
|
786
|
+
return
|
|
787
|
+
if choice == "status":
|
|
788
|
+
_show_output("hermes status", _run_capture("hermes", "status"))
|
|
789
|
+
elif choice == "install":
|
|
790
|
+
_show_output("hermes install",
|
|
791
|
+
_run_capture("hermes", "install", "--yes"))
|
|
792
|
+
elif choice == "link":
|
|
793
|
+
_show_output("hermes link", _run_capture("hermes", "link"))
|
|
794
|
+
elif choice == "brief-write":
|
|
795
|
+
_show_output("hermes brief write",
|
|
796
|
+
_run_capture("hermes", "brief", "write"))
|
|
797
|
+
elif choice == "brief-status":
|
|
798
|
+
_show_output("hermes brief status",
|
|
799
|
+
_run_capture("hermes", "brief", "status"))
|
|
800
|
+
elif choice == "ask":
|
|
801
|
+
prompt = _whiptail_input("hermes ask", "Prompt:")
|
|
802
|
+
if prompt:
|
|
803
|
+
_show_output("hermes ask",
|
|
804
|
+
_run_capture("hermes", "ask", prompt))
|
|
805
|
+
elif choice == "env":
|
|
806
|
+
_show_output("hermes env", _run_capture("hermes", "env"))
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
def _menu_hermes_desktop() -> None:
|
|
810
|
+
while True:
|
|
811
|
+
choice = _whiptail_menu(
|
|
812
|
+
"Hermes Desktop", "Remote backend for the desktop app:",
|
|
813
|
+
items=[
|
|
814
|
+
("status", "Token + port snapshot"),
|
|
815
|
+
("install", "Generate token + print desktop profile"),
|
|
816
|
+
("profile", "Print profile JSON"),
|
|
817
|
+
("serve", "Bind + serve the HTTP adapter (blocking)"),
|
|
818
|
+
("back", "← Back"),
|
|
819
|
+
],
|
|
820
|
+
)
|
|
821
|
+
if choice in (None, "back"):
|
|
822
|
+
return
|
|
823
|
+
if choice in ("status", "install", "profile"):
|
|
824
|
+
_show_output(f"hermes-desktop {choice}",
|
|
825
|
+
_run_capture("hermes-desktop", choice))
|
|
826
|
+
elif choice == "serve":
|
|
827
|
+
_whiptail_msg(
|
|
828
|
+
"hermes-desktop serve",
|
|
829
|
+
"This blocks the menu. Run it in a dedicated tmux session:\n\n"
|
|
830
|
+
" tmux new -d -s omega-hd 'omega hermes-desktop serve'\n\n"
|
|
831
|
+
"Then attach with `tmux a -t omega-hd`.",
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def _menu_memory() -> None:
|
|
836
|
+
while True:
|
|
837
|
+
choice = _whiptail_menu(
|
|
838
|
+
"Semantic memory", "Cross-source memory search:",
|
|
839
|
+
items=[
|
|
840
|
+
("stats", "Index stats"),
|
|
841
|
+
("reindex", "Rebuild the semantic index"),
|
|
842
|
+
("search", "Ranked search across sources"),
|
|
843
|
+
("back", "← Back"),
|
|
844
|
+
],
|
|
845
|
+
)
|
|
846
|
+
if choice in (None, "back"):
|
|
847
|
+
return
|
|
848
|
+
if choice in ("stats", "reindex"):
|
|
849
|
+
_show_output(f"memory {choice}",
|
|
850
|
+
_run_capture("memory", choice))
|
|
851
|
+
elif choice == "search":
|
|
852
|
+
q = _whiptail_input("memory search", "Query:")
|
|
853
|
+
if q:
|
|
854
|
+
_show_output(f"memory search",
|
|
855
|
+
_run_capture("memory", "search", q))
|
|
856
|
+
|
|
857
|
+
|
|
858
|
+
def _menu_learn() -> None:
|
|
859
|
+
while True:
|
|
860
|
+
choice = _whiptail_menu(
|
|
861
|
+
"Smith reflection", "Self-improvement loop:",
|
|
862
|
+
items=[
|
|
863
|
+
("reflect", "Run reflection + write proposals"),
|
|
864
|
+
("report", "JSON dump of the latest reflection"),
|
|
865
|
+
("back", "← Back"),
|
|
866
|
+
],
|
|
867
|
+
)
|
|
868
|
+
if choice in (None, "back"):
|
|
869
|
+
return
|
|
870
|
+
_show_output(f"learn {choice}", _run_capture("learn", choice))
|
|
871
|
+
|
|
872
|
+
|
|
873
|
+
def _menu_update() -> None:
|
|
874
|
+
while True:
|
|
875
|
+
choice = _whiptail_menu(
|
|
876
|
+
"Auto-update", "Update lifecycle:",
|
|
877
|
+
items=[
|
|
878
|
+
("check", "Check npm for a newer version"),
|
|
879
|
+
("apply", "Backup → install → migrate → verify (rollback on fail)"),
|
|
880
|
+
("banner", "Print outdated banner to stderr"),
|
|
881
|
+
("auto-status", "Daily auto-apply charter status"),
|
|
882
|
+
("auto-enable", "Enable daily auto-apply"),
|
|
883
|
+
("auto-disable","Disable daily auto-apply"),
|
|
884
|
+
("back", "← Back"),
|
|
885
|
+
],
|
|
886
|
+
)
|
|
887
|
+
if choice in (None, "back"):
|
|
888
|
+
return
|
|
889
|
+
if choice.startswith("auto-"):
|
|
890
|
+
op = choice.split("-", 1)[1]
|
|
891
|
+
_show_output(f"update auto {op}",
|
|
892
|
+
_run_capture("update", "auto", op))
|
|
893
|
+
else:
|
|
894
|
+
_show_output(f"update {choice}",
|
|
895
|
+
_run_capture("update", choice))
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
def _menu_ua() -> None:
|
|
899
|
+
while True:
|
|
900
|
+
choice = _whiptail_menu(
|
|
901
|
+
"Understand-Anything", "Knowledge-graph plugin bridge:",
|
|
902
|
+
items=[
|
|
903
|
+
("install", "Install the Claude Code plugin (uses Max OAuth)"),
|
|
904
|
+
("run", "Trigger /understand on a project"),
|
|
905
|
+
("consume", "Merge the produced graph into GraphRetriever"),
|
|
906
|
+
("back", "← Back"),
|
|
907
|
+
],
|
|
908
|
+
)
|
|
909
|
+
if choice in (None, "back"):
|
|
910
|
+
return
|
|
911
|
+
if choice == "install":
|
|
912
|
+
_show_output("ua install", _run_capture("ua", "install"))
|
|
913
|
+
else:
|
|
914
|
+
project = _whiptail_input(f"ua {choice}", "Project path:")
|
|
915
|
+
if project:
|
|
916
|
+
_show_output(f"ua {choice}",
|
|
917
|
+
_run_capture("ua", choice, project))
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
def _menu_ma() -> None:
|
|
921
|
+
while True:
|
|
922
|
+
choice = _whiptail_menu(
|
|
923
|
+
"Managed Agents", "Anthropic API (opt-in; needs ANTHROPIC_API_KEY):",
|
|
924
|
+
items=[
|
|
925
|
+
("info", "API key status + cached IDs"),
|
|
926
|
+
("agent", "Manage agents"),
|
|
927
|
+
("env", "Manage environments"),
|
|
928
|
+
("session", "Manage sessions"),
|
|
929
|
+
("run", "One-shot: create + send + stream"),
|
|
930
|
+
("back", "← Back"),
|
|
931
|
+
],
|
|
932
|
+
)
|
|
933
|
+
if choice in (None, "back"):
|
|
934
|
+
return
|
|
935
|
+
if choice == "info":
|
|
936
|
+
_show_output("ma info", _run_capture("ma", "info"))
|
|
937
|
+
elif choice == "run":
|
|
938
|
+
intent = _whiptail_input("ma run", "Intent:")
|
|
939
|
+
if intent:
|
|
940
|
+
_show_output("ma run", _run_capture("ma", "run", intent))
|
|
941
|
+
else:
|
|
942
|
+
_whiptail_msg(
|
|
943
|
+
f"ma {choice}",
|
|
944
|
+
f"Use `omega ma {choice} --help` from the shell for the "
|
|
945
|
+
f"full sub-tree (list/create/get/delete/...). The menu "
|
|
946
|
+
f"surfaces the top-level routes only.",
|
|
947
|
+
)
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
def _text_menu() -> int:
|
|
951
|
+
"""Plain-stdin fallback used when whiptail is missing (a fresh Mac
|
|
952
|
+
that never got `brew install newt`, or any minimal environment).
|
|
953
|
+
|
|
954
|
+
Prints a numbered list of the SAME items the whiptail menu would
|
|
955
|
+
show, reads a number, and dispatches to the same handler. Never
|
|
956
|
+
silently exits — if the user just hits Enter we re-print the menu.
|
|
957
|
+
"""
|
|
958
|
+
from omega_engine import __version__
|
|
959
|
+
handlers: dict[str, callable] = {
|
|
960
|
+
"mission": _menu_mission,
|
|
961
|
+
"genesis": _menu_genesis,
|
|
962
|
+
"plan": _menu_plan,
|
|
963
|
+
"worker": _menu_worker,
|
|
964
|
+
"handoff": _menu_handoff,
|
|
965
|
+
"hermes": _menu_hermes,
|
|
966
|
+
"hermes-desktop": _menu_hermes_desktop,
|
|
967
|
+
"tmux": _menu_tmux,
|
|
968
|
+
"aisb-chat": _menu_aisb_chat,
|
|
969
|
+
"projects": _menu_projects,
|
|
970
|
+
"accounts": _menu_accounts,
|
|
971
|
+
"audit": _menu_audit,
|
|
972
|
+
"skills": _menu_skills,
|
|
973
|
+
"memory": _menu_memory,
|
|
974
|
+
"learn": _menu_learn,
|
|
975
|
+
"update": _menu_update,
|
|
976
|
+
"ua": _menu_ua,
|
|
977
|
+
"ma": _menu_ma,
|
|
978
|
+
"maintenance": _menu_maintenance,
|
|
979
|
+
"settings": _menu_settings,
|
|
980
|
+
"status": _menu_status,
|
|
981
|
+
"doctor": _menu_doctor,
|
|
982
|
+
}
|
|
983
|
+
while True:
|
|
984
|
+
print()
|
|
985
|
+
print(f" Omega OS v{__version__} — text menu")
|
|
986
|
+
print(f" (whiptail not on PATH — install it for the rich UI: "
|
|
987
|
+
f"`brew install newt` on macOS, `apt-get install whiptail` on Linux)")
|
|
988
|
+
print()
|
|
989
|
+
for i, (tag, label) in enumerate(_MAIN_ITEMS, 1):
|
|
990
|
+
if tag == "quit":
|
|
991
|
+
print(f" 0) Quit")
|
|
992
|
+
else:
|
|
993
|
+
print(f" {i:2}) {label}")
|
|
994
|
+
print()
|
|
995
|
+
try:
|
|
996
|
+
raw = input(" pick a number (0 to quit, just Enter to refresh): ").strip()
|
|
997
|
+
except (EOFError, KeyboardInterrupt):
|
|
998
|
+
print()
|
|
999
|
+
return 0
|
|
1000
|
+
if raw == "" or raw == "?":
|
|
1001
|
+
continue
|
|
1002
|
+
if raw in ("0", "q", "quit", "exit"):
|
|
1003
|
+
return 0
|
|
1004
|
+
try:
|
|
1005
|
+
n = int(raw)
|
|
1006
|
+
except ValueError:
|
|
1007
|
+
print(f" not a number: {raw!r}")
|
|
1008
|
+
continue
|
|
1009
|
+
if n < 1 or n > len(_MAIN_ITEMS):
|
|
1010
|
+
print(f" out of range: {n}")
|
|
1011
|
+
continue
|
|
1012
|
+
tag, _ = _MAIN_ITEMS[n - 1]
|
|
1013
|
+
if tag == "quit":
|
|
1014
|
+
return 0
|
|
1015
|
+
fn = handlers.get(tag)
|
|
1016
|
+
if fn is None:
|
|
1017
|
+
print(f" no handler bound for {tag}")
|
|
1018
|
+
continue
|
|
1019
|
+
try:
|
|
1020
|
+
fn()
|
|
1021
|
+
except KeyboardInterrupt:
|
|
1022
|
+
print("\n (interrupted)")
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
def run_menu() -> int:
|
|
1026
|
+
"""Entry point — show the main menu and dispatch until quit.
|
|
1027
|
+
|
|
1028
|
+
Whiptail when available (rich UI), text fallback otherwise. Never
|
|
1029
|
+
returns silently — every machine sees SOMETHING the moment they type
|
|
1030
|
+
`omega`.
|
|
1031
|
+
"""
|
|
1032
|
+
if not _have("whiptail"):
|
|
1033
|
+
return _text_menu()
|
|
1034
|
+
while True:
|
|
1035
|
+
choice = _whiptail_menu(
|
|
1036
|
+
"Omega OS", "What do you want to do?",
|
|
1037
|
+
items=_MAIN_ITEMS,
|
|
1038
|
+
)
|
|
1039
|
+
if choice in (None, "quit"):
|
|
1040
|
+
return 0
|
|
1041
|
+
try:
|
|
1042
|
+
if choice == "mission": _menu_mission()
|
|
1043
|
+
elif choice == "genesis": _menu_genesis()
|
|
1044
|
+
elif choice == "plan": _menu_plan()
|
|
1045
|
+
elif choice == "worker": _menu_worker()
|
|
1046
|
+
elif choice == "handoff": _menu_handoff()
|
|
1047
|
+
elif choice == "hermes": _menu_hermes()
|
|
1048
|
+
elif choice == "hermes-desktop":_menu_hermes_desktop()
|
|
1049
|
+
elif choice == "tmux": _menu_tmux()
|
|
1050
|
+
elif choice == "aisb-chat": _menu_aisb_chat()
|
|
1051
|
+
elif choice == "projects": _menu_projects()
|
|
1052
|
+
elif choice == "accounts": _menu_accounts()
|
|
1053
|
+
elif choice == "audit": _menu_audit()
|
|
1054
|
+
elif choice == "skills": _menu_skills()
|
|
1055
|
+
elif choice == "memory": _menu_memory()
|
|
1056
|
+
elif choice == "learn": _menu_learn()
|
|
1057
|
+
elif choice == "update": _menu_update()
|
|
1058
|
+
elif choice == "ua": _menu_ua()
|
|
1059
|
+
elif choice == "ma": _menu_ma()
|
|
1060
|
+
elif choice == "maintenance": _menu_maintenance()
|
|
1061
|
+
elif choice == "settings": _menu_settings()
|
|
1062
|
+
elif choice == "status": _menu_status()
|
|
1063
|
+
elif choice == "doctor": _menu_doctor()
|
|
1064
|
+
except KeyboardInterrupt:
|
|
1065
|
+
return 0
|