@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,158 @@
|
|
|
1
|
+
"""Agent prompt loader — the bridge between SSOT and the provider.
|
|
2
|
+
|
|
3
|
+
Every role in the engine (oracle, worker, architect, keymaker, …) has a
|
|
4
|
+
fully-written system prompt living in ``Agentik_SSOT/agents/<suite>/<role>.md``.
|
|
5
|
+
This module locates the file, strips any YAML frontmatter, and returns the
|
|
6
|
+
prompt text for the provider to inject as the ``system`` message.
|
|
7
|
+
|
|
8
|
+
The AISB suite — 13 named agents + the LMC protocol + per-agent checkers —
|
|
9
|
+
is shipped by the installer from ``bootstrap/templates/aisb/``. New suites
|
|
10
|
+
drop into ``Agentik_SSOT/agents/<name>/`` and are picked up by id.
|
|
11
|
+
|
|
12
|
+
Resolution order for a role:
|
|
13
|
+
1. ``Agentik_SSOT/agents/aisb/<role>.md`` (the AISB suite)
|
|
14
|
+
2. ``Agentik_SSOT/agents/<any-suite>/<role>.md`` (any other suite)
|
|
15
|
+
3. None — the provider falls back to a minimal generic envelope.
|
|
16
|
+
|
|
17
|
+
The LMC protocol + shared protocols are concatenated into every agent's
|
|
18
|
+
system prompt so they always know the contract.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import re
|
|
23
|
+
from functools import lru_cache
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
_FRONTMATTER_RE = re.compile(r"^---\s*\n.*?\n---\s*\n", re.DOTALL)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _strip_frontmatter(text: str) -> str:
|
|
31
|
+
"""Drop the leading YAML frontmatter block if present."""
|
|
32
|
+
match = _FRONTMATTER_RE.match(text)
|
|
33
|
+
return text[match.end():] if match else text
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _agents_root(omega_home: Path) -> Path:
|
|
37
|
+
return Path(omega_home) / "Agentik_SSOT" / "agents"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Topology-name → AISB-suite-name aliases.
|
|
41
|
+
# The orchestration topology YAMLs use generic role names (`aisb`, `oracle`,
|
|
42
|
+
# `manager`, `worker`, `audit`) but the AISB suite ships its own canonical
|
|
43
|
+
# names (`niobe`, `oracle`, `keymaker`, `construct`, `seraph`). Without
|
|
44
|
+
# this map, ``load_agent_prompt("worker")`` returns None and the worker
|
|
45
|
+
# spawns with the engine's generic fallback envelope — losing the rich
|
|
46
|
+
# identity Gareth's home system relies on.
|
|
47
|
+
#
|
|
48
|
+
# Direction is topology → suite. Add entries here when a topology introduces
|
|
49
|
+
# a new role name that maps to an existing suite agent.
|
|
50
|
+
_ROLE_ALIASES: dict[str, str] = {
|
|
51
|
+
"aisb": "niobe", # the matriarch / root scope
|
|
52
|
+
"manager": "keymaker", # the planner
|
|
53
|
+
"worker": "construct", # the executor
|
|
54
|
+
"audit": "seraph", # the verifier
|
|
55
|
+
"verifier": "seraph", # synonym used by some topologies
|
|
56
|
+
"link": "link", # already canonical
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@lru_cache(maxsize=64)
|
|
61
|
+
def _read_agent_file(path: str) -> str | None:
|
|
62
|
+
p = Path(path)
|
|
63
|
+
if not p.exists():
|
|
64
|
+
return None
|
|
65
|
+
try:
|
|
66
|
+
return _strip_frontmatter(p.read_text()).strip()
|
|
67
|
+
except OSError:
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def find_agent_file(omega_home: str | Path, role: str) -> Path | None:
|
|
72
|
+
"""Return the on-disk path for a role's agent prompt, or None.
|
|
73
|
+
|
|
74
|
+
Resolution order:
|
|
75
|
+
1. Direct match on the role name in the AISB suite.
|
|
76
|
+
2. Alias-mapped name (e.g. ``worker`` → ``construct``).
|
|
77
|
+
3. Direct match in any other suite.
|
|
78
|
+
4. Alias-mapped match in any other suite.
|
|
79
|
+
"""
|
|
80
|
+
root = _agents_root(Path(omega_home))
|
|
81
|
+
if not root.is_dir():
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
candidates_for_role: list[str] = [role]
|
|
85
|
+
aliased = _ROLE_ALIASES.get(role)
|
|
86
|
+
if aliased and aliased != role:
|
|
87
|
+
candidates_for_role.append(aliased)
|
|
88
|
+
|
|
89
|
+
# 1+2. AISB suite first (the master), with alias fallback.
|
|
90
|
+
aisb_dir = root / "aisb"
|
|
91
|
+
if aisb_dir.is_dir():
|
|
92
|
+
for cand in candidates_for_role:
|
|
93
|
+
p = aisb_dir / f"{cand}.md"
|
|
94
|
+
if p.exists():
|
|
95
|
+
return p
|
|
96
|
+
|
|
97
|
+
# 3+4. Any other suite that names a file after the role (or its alias).
|
|
98
|
+
for suite in sorted(root.iterdir()):
|
|
99
|
+
if not suite.is_dir() or suite.name == "aisb":
|
|
100
|
+
continue
|
|
101
|
+
for cand in candidates_for_role:
|
|
102
|
+
p = suite / f"{cand}.md"
|
|
103
|
+
if p.exists():
|
|
104
|
+
return p
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def load_agent_prompt(omega_home: str | Path, role: str) -> str | None:
|
|
109
|
+
"""Return the agent's full system prompt, or None if not shipped.
|
|
110
|
+
|
|
111
|
+
Includes the LMC + shared protocols when found, so every loaded agent
|
|
112
|
+
knows the contract without us repeating it in every file.
|
|
113
|
+
"""
|
|
114
|
+
path = find_agent_file(omega_home, role)
|
|
115
|
+
if path is None:
|
|
116
|
+
return None
|
|
117
|
+
text = _read_agent_file(str(path))
|
|
118
|
+
if text is None:
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
# Append any protocol files that live next to the agent.
|
|
122
|
+
suite_dir = path.parent
|
|
123
|
+
extras: list[str] = []
|
|
124
|
+
for proto in ("lmc-protocol.md",):
|
|
125
|
+
proto_path = suite_dir / proto
|
|
126
|
+
body = _read_agent_file(str(proto_path))
|
|
127
|
+
if body:
|
|
128
|
+
extras.append(f"\n\n--- PROTOCOL: {proto} ---\n\n{body}")
|
|
129
|
+
shared = suite_dir / "protocols" / "shared-protocol.md"
|
|
130
|
+
body = _read_agent_file(str(shared))
|
|
131
|
+
if body:
|
|
132
|
+
extras.append(f"\n\n--- SHARED PROTOCOL ---\n\n{body}")
|
|
133
|
+
return text + "".join(extras)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def list_available_agents(omega_home: str | Path) -> dict[str, list[str]]:
|
|
137
|
+
"""Return ``{suite: [roles]}`` for every agent file shipped under
|
|
138
|
+
Agentik_SSOT/agents/."""
|
|
139
|
+
root = _agents_root(Path(omega_home))
|
|
140
|
+
out: dict[str, list[str]] = {}
|
|
141
|
+
if not root.is_dir():
|
|
142
|
+
return out
|
|
143
|
+
for suite in sorted(root.iterdir()):
|
|
144
|
+
if not suite.is_dir():
|
|
145
|
+
continue
|
|
146
|
+
roles = sorted(
|
|
147
|
+
p.stem for p in suite.glob("*.md")
|
|
148
|
+
if not p.stem.startswith(("checker-", "lmc-", "handoff-",
|
|
149
|
+
"shared-", "CLAUDE"))
|
|
150
|
+
)
|
|
151
|
+
if roles:
|
|
152
|
+
out[suite.name] = roles
|
|
153
|
+
return out
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def clear_cache() -> None:
|
|
157
|
+
"""Drop the prompt-file cache. Useful in tests and after re-installs."""
|
|
158
|
+
_read_agent_file.cache_clear()
|
|
@@ -22,8 +22,10 @@ from typing import Any, Protocol, runtime_checkable
|
|
|
22
22
|
@dataclass
|
|
23
23
|
class AgentRequest:
|
|
24
24
|
role: str # "aisb" | "oracle" | "worker" | ...
|
|
25
|
-
prompt: str
|
|
25
|
+
prompt: str # the user-facing message
|
|
26
26
|
context: dict[str, Any] = field(default_factory=dict)
|
|
27
|
+
system: str | None = None # the role-aware system prompt
|
|
28
|
+
# (built by omega_engine.envelope)
|
|
27
29
|
|
|
28
30
|
|
|
29
31
|
@dataclass
|
|
@@ -44,6 +46,144 @@ class AgentProvider(Protocol):
|
|
|
44
46
|
def run(self, req: AgentRequest) -> AgentResult: ...
|
|
45
47
|
|
|
46
48
|
|
|
49
|
+
class ClaudeMaxProvider:
|
|
50
|
+
"""The Claude Code Max subprocess provider — uses the operator's OAuth,
|
|
51
|
+
NOT an API key.
|
|
52
|
+
|
|
53
|
+
Spawns ``claude -p "<prompt>" --output-format json --model <model>`` and
|
|
54
|
+
parses the structured response. Authentication is whatever the
|
|
55
|
+
operator did via ``claude /login`` — no ANTHROPIC_API_KEY needed.
|
|
56
|
+
Token usage AND a real ``total_cost_usd`` are returned directly by
|
|
57
|
+
the Claude Code CLI (calculated against Max account billing).
|
|
58
|
+
|
|
59
|
+
System prompts go via ``--append-system-prompt`` so the envelope's
|
|
60
|
+
rich role-aware prompt still drives the agent.
|
|
61
|
+
|
|
62
|
+
Sessions: when ``session_id`` is set on the request context, we use
|
|
63
|
+
``--resume <session-id>`` so multi-turn conversations work. The CLI's
|
|
64
|
+
own session-id is returned in the result and propagated back as
|
|
65
|
+
``result.artifacts["session_id"]``.
|
|
66
|
+
|
|
67
|
+
Use this on any machine where ``claude`` CLI is installed and the
|
|
68
|
+
operator is logged in (verified via ``claude --version``).
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
id = "claude-max"
|
|
72
|
+
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
model: str = "sonnet",
|
|
76
|
+
timeout_s: int = 600,
|
|
77
|
+
bin_path: str = "claude",
|
|
78
|
+
) -> None:
|
|
79
|
+
self._model = model
|
|
80
|
+
self._timeout_s = timeout_s
|
|
81
|
+
self._bin = bin_path
|
|
82
|
+
|
|
83
|
+
def _model_for(self, role: str) -> str:
|
|
84
|
+
"""Resolve the model for a role — explicit > role default > self."""
|
|
85
|
+
# Allow the request itself to override via context.model
|
|
86
|
+
try:
|
|
87
|
+
from omega_engine.worker import default_model_for_role
|
|
88
|
+
role_model = default_model_for_role(role)
|
|
89
|
+
except ImportError:
|
|
90
|
+
role_model = self._model
|
|
91
|
+
return role_model
|
|
92
|
+
|
|
93
|
+
@staticmethod
|
|
94
|
+
def is_available(bin_path: str = "claude") -> bool:
|
|
95
|
+
"""True iff `claude` CLI is on PATH and answers --version."""
|
|
96
|
+
import shutil
|
|
97
|
+
if shutil.which(bin_path) is None:
|
|
98
|
+
return False
|
|
99
|
+
try:
|
|
100
|
+
import subprocess
|
|
101
|
+
proc = subprocess.run(
|
|
102
|
+
[bin_path, "--version"],
|
|
103
|
+
check=False, capture_output=True, text=True, timeout=15,
|
|
104
|
+
)
|
|
105
|
+
return proc.returncode == 0
|
|
106
|
+
except (OSError, subprocess.SubprocessError):
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
def run(self, req: AgentRequest) -> AgentResult:
|
|
110
|
+
import subprocess
|
|
111
|
+
# Per-request model: explicit context.model > role default > self default
|
|
112
|
+
model = (req.context or {}).get("model") or self._model_for(req.role)
|
|
113
|
+
cmd = [
|
|
114
|
+
self._bin, "-p", req.prompt,
|
|
115
|
+
"--output-format", "json",
|
|
116
|
+
"--model", model,
|
|
117
|
+
# bypass tool-permission dialogs in headless mode — operator
|
|
118
|
+
# already set the default permission mode via settings.json
|
|
119
|
+
"--dangerously-skip-permissions",
|
|
120
|
+
]
|
|
121
|
+
# The envelope's `system` becomes an --append-system-prompt so the
|
|
122
|
+
# default Claude Code system prompt + our role-specific identity +
|
|
123
|
+
# contract all merge.
|
|
124
|
+
if req.system:
|
|
125
|
+
cmd += ["--append-system-prompt", req.system]
|
|
126
|
+
# If the caller passes a session_id in the context, resume that
|
|
127
|
+
# session — turns the provider into a stateful conversation.
|
|
128
|
+
sid = (req.context or {}).get("session_id")
|
|
129
|
+
if sid:
|
|
130
|
+
cmd += ["--resume", str(sid)]
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
proc = subprocess.run(
|
|
134
|
+
cmd, check=False, capture_output=True, text=True,
|
|
135
|
+
timeout=self._timeout_s,
|
|
136
|
+
)
|
|
137
|
+
except subprocess.TimeoutExpired:
|
|
138
|
+
raise RuntimeError(
|
|
139
|
+
f"claude -p timed out after {self._timeout_s}s"
|
|
140
|
+
)
|
|
141
|
+
if proc.returncode != 0:
|
|
142
|
+
raise RuntimeError(
|
|
143
|
+
f"claude -p exit {proc.returncode}: "
|
|
144
|
+
f"{(proc.stderr or proc.stdout or '').strip()[:500]}"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
raw_text = (proc.stdout or "").strip()
|
|
148
|
+
try:
|
|
149
|
+
data = json.loads(raw_text)
|
|
150
|
+
except json.JSONDecodeError:
|
|
151
|
+
raise RuntimeError(
|
|
152
|
+
f"claude -p returned non-JSON: {raw_text[:200]}"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
text = str(data.get("result", ""))
|
|
156
|
+
usage_in = data.get("usage", {}) or {}
|
|
157
|
+
artifacts: dict[str, Any] = {
|
|
158
|
+
"session_id": data.get("session_id", ""),
|
|
159
|
+
"stop_reason": data.get("stop_reason", ""),
|
|
160
|
+
"num_turns": int(data.get("num_turns", 0) or 0),
|
|
161
|
+
"duration_ms": int(data.get("duration_ms", 0) or 0),
|
|
162
|
+
"total_cost_usd": float(data.get("total_cost_usd", 0.0) or 0.0),
|
|
163
|
+
}
|
|
164
|
+
# Dispatcher roles still need to surface a plan when they
|
|
165
|
+
# produced one. Try a JSON parse of the text body.
|
|
166
|
+
plan = (
|
|
167
|
+
_extract_plan(text)
|
|
168
|
+
if req.role in ("aisb", "oracle", "manager") else []
|
|
169
|
+
)
|
|
170
|
+
return AgentResult(
|
|
171
|
+
text=text, claimed_done=True, plan=plan, artifacts=artifacts,
|
|
172
|
+
usage={
|
|
173
|
+
"input_tokens": int(usage_in.get("input_tokens", 0) or 0),
|
|
174
|
+
"output_tokens": int(usage_in.get("output_tokens", 0) or 0),
|
|
175
|
+
"cache_read_input_tokens": int(
|
|
176
|
+
usage_in.get("cache_read_input_tokens", 0) or 0
|
|
177
|
+
),
|
|
178
|
+
"cache_creation_input_tokens": int(
|
|
179
|
+
usage_in.get("cache_creation_input_tokens", 0) or 0
|
|
180
|
+
),
|
|
181
|
+
# Real Max cost — calculated by Claude Code itself.
|
|
182
|
+
"cost_usd": float(data.get("total_cost_usd", 0.0) or 0.0),
|
|
183
|
+
},
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
47
187
|
class MockProvider:
|
|
48
188
|
"""Deterministic provider — makes the executor fully testable with no API.
|
|
49
189
|
|
|
@@ -173,17 +313,26 @@ class ClaudeProvider:
|
|
|
173
313
|
) from exc
|
|
174
314
|
|
|
175
315
|
client = anthropic.Anthropic(api_key=self._api_key) # reads env if None
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
)
|
|
316
|
+
# Envelope path: when the executor passes an explicit `system`, use it
|
|
317
|
+
# verbatim and send the user prompt as-is. Otherwise fall back to the
|
|
318
|
+
# legacy single-message form so old callers keep working.
|
|
319
|
+
kwargs: dict[str, Any] = {
|
|
320
|
+
"model": self._model,
|
|
321
|
+
"max_tokens": 4096,
|
|
322
|
+
"messages": [{"role": "user", "content": req.prompt}],
|
|
323
|
+
}
|
|
324
|
+
if req.system:
|
|
325
|
+
kwargs["system"] = req.system
|
|
326
|
+
elif req.role in ("oracle", "manager", "aisb"):
|
|
327
|
+
# Legacy minimal dispatcher hint, only when no envelope was built.
|
|
328
|
+
kwargs["messages"] = [{
|
|
329
|
+
"role": "user",
|
|
330
|
+
"content": req.prompt + (
|
|
331
|
+
"\n\nRespond with a JSON array of subtasks, each "
|
|
332
|
+
'{"role":"worker","spec":{"task":"..."}}. JSON only.'
|
|
333
|
+
),
|
|
334
|
+
}]
|
|
335
|
+
msg = client.messages.create(**kwargs)
|
|
187
336
|
text = "".join(
|
|
188
337
|
b.text for b in msg.content if getattr(b, "type", "") == "text"
|
|
189
338
|
)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""`omega prune` — bound the growth of runtime SQLite stores.
|
|
2
|
+
|
|
3
|
+
Three stores grow forever today:
|
|
4
|
+
|
|
5
|
+
* ``Agentik_Runtime/eventlog/omega.db`` (mission events)
|
|
6
|
+
* ``Agentik_Runtime/audits.db`` (forensic-audit history)
|
|
7
|
+
* ``Agentik_Runtime/telegram-history.db`` (per-topic chat history)
|
|
8
|
+
|
|
9
|
+
Plus the per-task ``Agentik_Runtime/sessions/<task_id>/`` directories.
|
|
10
|
+
|
|
11
|
+
This module is the bounded-growth control. Every operation has:
|
|
12
|
+
* A ``dry_run`` mode that reports what WOULD be deleted (default
|
|
13
|
+
behaviour from the CLI is dry-run; ``--yes`` enacts).
|
|
14
|
+
* An explicit "older than" cutoff (no implicit "keep last N").
|
|
15
|
+
* Per-DB transaction so a crash mid-prune leaves the DB consistent.
|
|
16
|
+
|
|
17
|
+
Tests cover both modes: a dry-run never mutates, and a real prune drops
|
|
18
|
+
exactly the rows we promised.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import shutil
|
|
23
|
+
import sqlite3
|
|
24
|
+
import time
|
|
25
|
+
from dataclasses import dataclass
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class PruneReport:
|
|
31
|
+
target: str
|
|
32
|
+
rows_deleted: int = 0
|
|
33
|
+
files_deleted: int = 0
|
|
34
|
+
bytes_freed: int = 0
|
|
35
|
+
dry_run: bool = False
|
|
36
|
+
detail: str = ""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _prune_table(
|
|
40
|
+
db_path: Path, table: str, cutoff_seconds: int,
|
|
41
|
+
*, time_column: str = "timestamp", dry_run: bool = False,
|
|
42
|
+
) -> int:
|
|
43
|
+
"""Delete rows older than `cutoff_seconds` from `table`. Returns rowcount."""
|
|
44
|
+
if not db_path.exists():
|
|
45
|
+
return 0
|
|
46
|
+
cutoff = int(time.time()) - cutoff_seconds
|
|
47
|
+
conn = sqlite3.connect(str(db_path))
|
|
48
|
+
try:
|
|
49
|
+
if dry_run:
|
|
50
|
+
cur = conn.execute(
|
|
51
|
+
f"SELECT COUNT(*) FROM {table} WHERE {time_column} < ?",
|
|
52
|
+
(cutoff,),
|
|
53
|
+
)
|
|
54
|
+
return int(cur.fetchone()[0])
|
|
55
|
+
cur = conn.execute(
|
|
56
|
+
f"DELETE FROM {table} WHERE {time_column} < ?",
|
|
57
|
+
(cutoff,),
|
|
58
|
+
)
|
|
59
|
+
conn.commit()
|
|
60
|
+
return cur.rowcount or 0
|
|
61
|
+
except sqlite3.OperationalError:
|
|
62
|
+
# Table missing — nothing to prune.
|
|
63
|
+
return 0
|
|
64
|
+
finally:
|
|
65
|
+
conn.close()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def prune_events(
|
|
69
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
70
|
+
) -> PruneReport:
|
|
71
|
+
"""Drop mission events older than `older_than_days`."""
|
|
72
|
+
home = Path(omega_home)
|
|
73
|
+
db = home / "Agentik_Runtime" / "eventlog" / "omega.db"
|
|
74
|
+
n = _prune_table(db, "events", older_than_days * 86400,
|
|
75
|
+
time_column="ts", dry_run=dry_run)
|
|
76
|
+
return PruneReport(
|
|
77
|
+
target="events", rows_deleted=n, dry_run=dry_run,
|
|
78
|
+
detail=f"older_than={older_than_days}d",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def prune_audits(
|
|
83
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
84
|
+
) -> PruneReport:
|
|
85
|
+
home = Path(omega_home)
|
|
86
|
+
db = home / "Agentik_Runtime" / "audits.db"
|
|
87
|
+
n = _prune_table(db, "audit_runs", older_than_days * 86400,
|
|
88
|
+
time_column="timestamp", dry_run=dry_run)
|
|
89
|
+
return PruneReport(
|
|
90
|
+
target="audits", rows_deleted=n, dry_run=dry_run,
|
|
91
|
+
detail=f"older_than={older_than_days}d",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def prune_telegram(
|
|
96
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
97
|
+
) -> PruneReport:
|
|
98
|
+
home = Path(omega_home)
|
|
99
|
+
db = home / "Agentik_Runtime" / "telegram-history.db"
|
|
100
|
+
n = _prune_table(db, "messages", older_than_days * 86400,
|
|
101
|
+
time_column="timestamp", dry_run=dry_run)
|
|
102
|
+
return PruneReport(
|
|
103
|
+
target="telegram", rows_deleted=n, dry_run=dry_run,
|
|
104
|
+
detail=f"older_than={older_than_days}d",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def prune_sessions(
|
|
109
|
+
omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
|
|
110
|
+
) -> PruneReport:
|
|
111
|
+
"""Remove per-task session dirs whose newest file is older than the cutoff."""
|
|
112
|
+
home = Path(omega_home)
|
|
113
|
+
sess_root = home / "Agentik_Runtime" / "sessions"
|
|
114
|
+
if not sess_root.is_dir():
|
|
115
|
+
return PruneReport(target="sessions", dry_run=dry_run)
|
|
116
|
+
cutoff = time.time() - older_than_days * 86400
|
|
117
|
+
n = 0
|
|
118
|
+
bytes_freed = 0
|
|
119
|
+
for child in sess_root.iterdir():
|
|
120
|
+
if not child.is_dir():
|
|
121
|
+
continue
|
|
122
|
+
# newest file mtime under this dir
|
|
123
|
+
newest = max(
|
|
124
|
+
(p.stat().st_mtime for p in child.rglob("*") if p.is_file()),
|
|
125
|
+
default=child.stat().st_mtime,
|
|
126
|
+
)
|
|
127
|
+
if newest >= cutoff:
|
|
128
|
+
continue
|
|
129
|
+
# measure size before delete (for dry-run)
|
|
130
|
+
sz = sum(p.stat().st_size for p in child.rglob("*") if p.is_file())
|
|
131
|
+
if not dry_run:
|
|
132
|
+
shutil.rmtree(child, ignore_errors=True)
|
|
133
|
+
n += 1
|
|
134
|
+
bytes_freed += sz
|
|
135
|
+
return PruneReport(
|
|
136
|
+
target="sessions", files_deleted=n, bytes_freed=bytes_freed,
|
|
137
|
+
dry_run=dry_run, detail=f"older_than={older_than_days}d",
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def prune_all(
|
|
142
|
+
omega_home: str | Path, *, older_than_days: int = 90,
|
|
143
|
+
dry_run: bool = False,
|
|
144
|
+
) -> list[PruneReport]:
|
|
145
|
+
"""One call to prune everything to the same cutoff."""
|
|
146
|
+
return [
|
|
147
|
+
prune_events(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
148
|
+
prune_audits(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
149
|
+
prune_telegram(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
150
|
+
prune_sessions(omega_home, older_than_days=older_than_days, dry_run=dry_run),
|
|
151
|
+
]
|