@agentikos/omega-os 0.2.0 → 0.19.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -3
- package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
- package/bootstrap/lib/claude-code-settings.py +176 -0
- package/bootstrap/lib/common.sh +457 -1
- package/bootstrap/lib/llm-clis.py +341 -0
- package/bootstrap/lib/manifest-helpers.py +384 -0
- package/bootstrap/lib/steps.sh +790 -21
- package/bootstrap/manifest.example.yaml +87 -1
- package/bootstrap/templates/aisb/CLAUDE.md +305 -0
- package/bootstrap/templates/aisb/architect.md +204 -0
- package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
- package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
- package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
- package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
- package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
- package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
- package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
- package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
- package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
- package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
- package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
- package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
- package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
- package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
- package/bootstrap/templates/aisb/construct.md +135 -0
- package/bootstrap/templates/aisb/keymaker.md +227 -0
- package/bootstrap/templates/aisb/link.md +170 -0
- package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
- package/bootstrap/templates/aisb/merovingian.md +159 -0
- package/bootstrap/templates/aisb/morpheus.md +243 -0
- package/bootstrap/templates/aisb/neo.md +147 -0
- package/bootstrap/templates/aisb/niobe.md +197 -0
- package/bootstrap/templates/aisb/oracle.md +244 -0
- package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
- package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
- package/bootstrap/templates/aisb/pythia.md +153 -0
- package/bootstrap/templates/aisb/seraph.md +315 -0
- package/bootstrap/templates/aisb/smith.md +202 -0
- package/bootstrap/templates/aisb/zion.md +172 -0
- package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
- package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
- package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
- package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
- package/docs/AUDITS.md +85 -0
- package/docs/GAP-ANALYSIS.md +214 -0
- package/docs/INSTALL.md +47 -9
- package/docs/MCP-AND-PLUGINS.md +31 -4
- package/docs/SIMULATION.md +171 -0
- package/docs/simulate.sh +211 -0
- package/install.sh +164 -17
- package/omega/Agentik_Engine/README.md +4 -2
- package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/account.py +28 -31
- package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
- package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
- package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
- package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
- package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
- package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
- package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
- package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
- package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
- package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
- package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
- package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
- package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
- package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
- package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
- package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
- package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
- package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
- package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
- package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
- package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
- package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
- package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
- package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
- package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
- package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
- package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
- package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
- package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
- package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
- package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
- package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/router.py +28 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
- package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
- package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
- package/omega/Agentik_Engine/omega_engine/store.py +88 -41
- package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
- package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
- package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
- package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
- package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
- package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
- package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
- package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
- package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_account.py +8 -3
- package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
- package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
- package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
- package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
- package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
- package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
- package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
- package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
- package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
- package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
- package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
- package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
- package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
- package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
- package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
- package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
- package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
- package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
- package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
- package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
- package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
- package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
- package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
- package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
- package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
- package/omega/Agentik_Engine/tests/test_vault.py +173 -0
- package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
- package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
- package/omega/Agentik_Runtime/audits.db +0 -0
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
- package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
- package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
- package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
- package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
- package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
- package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
- package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
- package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
- package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
- package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
- package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
- package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
- package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
- package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
- package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
- package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
- package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
- package/package.json +2 -2
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"""cadence — recurring / scheduled execution.
|
|
2
|
+
|
|
3
|
+
The Agentik OS native equivalent of a "run this every N" beat. Takes a
|
|
4
|
+
trigger spec and an intent, persists a charter to
|
|
5
|
+
``Agentik_Orchestration/autonomous/cadence-<id>.yaml`` that the existing
|
|
6
|
+
``AutonomousSupervisor`` picks up at its next tick.
|
|
7
|
+
|
|
8
|
+
Three trigger types:
|
|
9
|
+
* ``cron <expr>`` — standard 5-field cron (``*/5 * * * *``)
|
|
10
|
+
* ``delay <seconds>`` — fire once after ``seconds`` from now
|
|
11
|
+
* ``self`` — let the agent self-pace (the supervisor still ticks, but the
|
|
12
|
+
agent decides whether to act)
|
|
13
|
+
|
|
14
|
+
Why this exists:
|
|
15
|
+
Claude Code's bundled ``/loop`` schedules a prompt in the editor. We
|
|
16
|
+
re-implement it as an engine primitive so OmegaOS supervises the beat
|
|
17
|
+
itself — surviving Claude Code sessions, daemons, the whole system.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import time
|
|
23
|
+
import uuid
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
import yaml
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
VALID_TRIGGERS = {"cron", "delay", "self"}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class CadenceCharter:
|
|
36
|
+
id: str
|
|
37
|
+
trigger_type: str # "cron" | "delay" | "self"
|
|
38
|
+
schedule: str # cron expr, delay-secs, or "self"
|
|
39
|
+
intent: str
|
|
40
|
+
role: str = "worker"
|
|
41
|
+
enabled: bool = True
|
|
42
|
+
description: str = ""
|
|
43
|
+
|
|
44
|
+
def to_yaml_dict(self) -> dict[str, Any]:
|
|
45
|
+
return {
|
|
46
|
+
"id": self.id,
|
|
47
|
+
"description": self.description or self.intent,
|
|
48
|
+
"enabled": self.enabled,
|
|
49
|
+
"trigger": {"type": self.trigger_type, "schedule": self.schedule},
|
|
50
|
+
"role": self.role,
|
|
51
|
+
"spec": {"intent": self.intent},
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def schedule_cadence(
|
|
56
|
+
intent: str,
|
|
57
|
+
trigger_type: str,
|
|
58
|
+
schedule: str,
|
|
59
|
+
*,
|
|
60
|
+
omega_home: str | Path | None = None,
|
|
61
|
+
charter_id: str | None = None,
|
|
62
|
+
role: str = "worker",
|
|
63
|
+
description: str | None = None,
|
|
64
|
+
) -> Path:
|
|
65
|
+
"""Persist a charter to the orchestration tree.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
intent: the natural-language thing to do at each beat.
|
|
69
|
+
trigger_type: "cron" | "delay" | "self".
|
|
70
|
+
schedule: trigger-type-specific spec — a cron expression, a
|
|
71
|
+
delay-in-seconds, or the literal "self".
|
|
72
|
+
omega_home: ``$OMEGA_HOME`` (defaults to env or ``~/Omega``).
|
|
73
|
+
charter_id: stable id; one is generated if not given.
|
|
74
|
+
role: provider role to use for each beat (default ``worker``).
|
|
75
|
+
description: optional human description; defaults to the intent.
|
|
76
|
+
|
|
77
|
+
Returns: the path to the persisted charter YAML.
|
|
78
|
+
"""
|
|
79
|
+
if trigger_type not in VALID_TRIGGERS:
|
|
80
|
+
raise ValueError(
|
|
81
|
+
f"trigger_type must be one of {VALID_TRIGGERS}, got {trigger_type!r}"
|
|
82
|
+
)
|
|
83
|
+
if trigger_type == "cron" and not schedule.strip():
|
|
84
|
+
raise ValueError("cron trigger requires a non-empty schedule")
|
|
85
|
+
if trigger_type == "delay":
|
|
86
|
+
try:
|
|
87
|
+
int(schedule)
|
|
88
|
+
except ValueError as exc:
|
|
89
|
+
raise ValueError(f"delay schedule must be an integer (seconds), got {schedule!r}") from exc
|
|
90
|
+
|
|
91
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
92
|
+
Path.home() / "Omega")
|
|
93
|
+
cid = charter_id or "cadence-" + uuid.uuid4().hex[:8]
|
|
94
|
+
|
|
95
|
+
target_dir = home / "Agentik_Orchestration" / "autonomous"
|
|
96
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
97
|
+
charter = CadenceCharter(
|
|
98
|
+
id=cid, trigger_type=trigger_type, schedule=schedule,
|
|
99
|
+
intent=intent, role=role, enabled=True,
|
|
100
|
+
description=description or intent,
|
|
101
|
+
)
|
|
102
|
+
target = target_dir / f"{cid}.yaml"
|
|
103
|
+
target.write_text(yaml.safe_dump(charter.to_yaml_dict(),
|
|
104
|
+
sort_keys=False, default_flow_style=False))
|
|
105
|
+
return target
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def list_cadences(omega_home: str | Path | None = None) -> list[dict[str, Any]]:
|
|
109
|
+
"""Return one summary dict per scheduled cadence on disk."""
|
|
110
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
111
|
+
Path.home() / "Omega")
|
|
112
|
+
target = home / "Agentik_Orchestration" / "autonomous"
|
|
113
|
+
out: list[dict[str, Any]] = []
|
|
114
|
+
if not target.is_dir():
|
|
115
|
+
return out
|
|
116
|
+
for path in sorted(target.glob("cadence-*.yaml")):
|
|
117
|
+
try:
|
|
118
|
+
data = yaml.safe_load(path.read_text()) or {}
|
|
119
|
+
except yaml.YAMLError:
|
|
120
|
+
continue
|
|
121
|
+
out.append({
|
|
122
|
+
"id": data.get("id", path.stem),
|
|
123
|
+
"enabled": bool(data.get("enabled", True)),
|
|
124
|
+
"trigger": data.get("trigger") or {},
|
|
125
|
+
"intent": ((data.get("spec") or {}).get("intent")
|
|
126
|
+
or data.get("description") or ""),
|
|
127
|
+
"path": str(path),
|
|
128
|
+
})
|
|
129
|
+
return out
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def disable_cadence(charter_id: str, *,
|
|
133
|
+
omega_home: str | Path | None = None) -> bool:
|
|
134
|
+
"""Set ``enabled: false`` on a cadence charter. Returns True if changed."""
|
|
135
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
136
|
+
Path.home() / "Omega")
|
|
137
|
+
target = home / "Agentik_Orchestration" / "autonomous" / f"{charter_id}.yaml"
|
|
138
|
+
if not target.exists():
|
|
139
|
+
return False
|
|
140
|
+
data = yaml.safe_load(target.read_text()) or {}
|
|
141
|
+
if not data.get("enabled", True):
|
|
142
|
+
return False
|
|
143
|
+
data["enabled"] = False
|
|
144
|
+
target.write_text(yaml.safe_dump(data, sort_keys=False,
|
|
145
|
+
default_flow_style=False))
|
|
146
|
+
return True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def remove_cadence(charter_id: str, *,
|
|
150
|
+
omega_home: str | Path | None = None) -> bool:
|
|
151
|
+
"""Delete a cadence charter. Returns True if it existed."""
|
|
152
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME") or
|
|
153
|
+
Path.home() / "Omega")
|
|
154
|
+
target = home / "Agentik_Orchestration" / "autonomous" / f"{charter_id}.yaml"
|
|
155
|
+
if not target.exists():
|
|
156
|
+
return False
|
|
157
|
+
target.unlink()
|
|
158
|
+
return True
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Task-complexity classifier — picks the right model for the job.
|
|
2
|
+
|
|
3
|
+
The current router sends every task to one provider with one model. That
|
|
4
|
+
wastes money on a tiny refactor (Sonnet/Opus when Haiku would do) and
|
|
5
|
+
risks quality on a hard architectural task (Haiku when we needed Opus).
|
|
6
|
+
|
|
7
|
+
This module classifies a task description into one of three buckets:
|
|
8
|
+
|
|
9
|
+
* ``simple`` — tiny change, formatting, rename, one-line fix
|
|
10
|
+
* ``moderate`` — implement a feature, fix a bug with context
|
|
11
|
+
* ``complex`` — design, architecture, multi-file refactor, security
|
|
12
|
+
|
|
13
|
+
The classifier is a heuristic-first ladder:
|
|
14
|
+
|
|
15
|
+
1. **Hard signals** — keywords + length + file count. Returns
|
|
16
|
+
immediately when confident.
|
|
17
|
+
2. **Soft signals** — accumulates a score, picks the bucket above a
|
|
18
|
+
threshold.
|
|
19
|
+
3. **Optional LLM refinement** — when ``llm_router`` is provided and
|
|
20
|
+
the heuristic is uncertain, ask a Haiku call to decide. ~1 token
|
|
21
|
+
of cost; mostly free because Haiku is cheap.
|
|
22
|
+
|
|
23
|
+
Returns ``(bucket, confidence, reason)`` so the router can log WHY a
|
|
24
|
+
model was chosen — important for cost transparency.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import re
|
|
29
|
+
from dataclasses import dataclass
|
|
30
|
+
from typing import Any
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
BUCKETS = ("simple", "moderate", "complex")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class Classification:
|
|
38
|
+
bucket: str # "simple" | "moderate" | "complex"
|
|
39
|
+
confidence: str # "low" | "medium" | "high"
|
|
40
|
+
reason: str
|
|
41
|
+
suggested_model: str # e.g. "haiku" | "sonnet" | "opus"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Keywords. Order matters — complex wins ties.
|
|
45
|
+
_COMPLEX_KEYWORDS = {
|
|
46
|
+
"architecture", "redesign", "refactor", "migration", "audit",
|
|
47
|
+
"security", "performance", "concurrency", "race condition",
|
|
48
|
+
"investigate", "analyze", "diagnose", "debug deep",
|
|
49
|
+
"build a", "design a", "implement a system",
|
|
50
|
+
}
|
|
51
|
+
_MODERATE_KEYWORDS = {
|
|
52
|
+
"implement", "build", "add a feature", "fix the bug",
|
|
53
|
+
"add support for", "wire up", "integrate", "extract",
|
|
54
|
+
}
|
|
55
|
+
_SIMPLE_KEYWORDS = {
|
|
56
|
+
"rename", "format", "lint", "fix typo", "fix a typo",
|
|
57
|
+
"update the readme", "add a comment", "change the message",
|
|
58
|
+
"bump version", "one-line", "remove unused",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# File-count signals (extracted from typical intents like "all 12 files")
|
|
62
|
+
_FILE_COUNT_RE = re.compile(r"(\d+)\s+(?:file|tests?)", re.IGNORECASE)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _has_any(text: str, keywords: set[str]) -> bool:
|
|
66
|
+
t = text.lower()
|
|
67
|
+
return any(k in t for k in keywords)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _score(text: str) -> tuple[int, int, int]:
|
|
71
|
+
"""Return (simple_score, moderate_score, complex_score)."""
|
|
72
|
+
t = text.lower()
|
|
73
|
+
s = sum(1 for k in _SIMPLE_KEYWORDS if k in t)
|
|
74
|
+
m = sum(1 for k in _MODERATE_KEYWORDS if k in t)
|
|
75
|
+
c = sum(1 for k in _COMPLEX_KEYWORDS if k in t)
|
|
76
|
+
return s, m, c
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _suggest_model(bucket: str) -> str:
|
|
80
|
+
return {"simple": "haiku", "moderate": "sonnet", "complex": "opus"}.get(
|
|
81
|
+
bucket, "sonnet",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def classify(
|
|
86
|
+
task_description: str,
|
|
87
|
+
*,
|
|
88
|
+
role: str = "worker",
|
|
89
|
+
llm_router=None,
|
|
90
|
+
) -> Classification:
|
|
91
|
+
"""Pick the right complexity bucket + model for a task.
|
|
92
|
+
|
|
93
|
+
Heuristic chain:
|
|
94
|
+
|
|
95
|
+
a) Always-complex roles (architect, oracle planning) get bumped up.
|
|
96
|
+
b) Hard signal: explicit complex keyword present → complex.
|
|
97
|
+
c) Hard signal: explicit simple keyword present + short text → simple.
|
|
98
|
+
d) Length-based fallback: long descriptions are usually complex.
|
|
99
|
+
e) When still uncertain AND llm_router is provided, ask a Haiku
|
|
100
|
+
classification call.
|
|
101
|
+
"""
|
|
102
|
+
text = (task_description or "").strip()
|
|
103
|
+
if not text:
|
|
104
|
+
return Classification(
|
|
105
|
+
"simple", "high",
|
|
106
|
+
"empty task → trivially simple", _suggest_model("simple"),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# (a) Role-driven floor
|
|
110
|
+
if role in ("architect", "smith"):
|
|
111
|
+
# Architecture + reflection always need depth
|
|
112
|
+
return Classification(
|
|
113
|
+
"complex", "high",
|
|
114
|
+
f"role={role!r} → architecture/reflection task",
|
|
115
|
+
_suggest_model("complex"),
|
|
116
|
+
)
|
|
117
|
+
if role in ("oracle", "manager", "aisb"):
|
|
118
|
+
# Planning roles need solid reasoning but not always Opus
|
|
119
|
+
return Classification(
|
|
120
|
+
"moderate", "medium",
|
|
121
|
+
f"role={role!r} → dispatcher; sonnet is the sweet spot",
|
|
122
|
+
_suggest_model("moderate"),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# (b) Hard complex signals
|
|
126
|
+
s_score, m_score, c_score = _score(text)
|
|
127
|
+
if c_score >= 2 or (c_score >= 1 and len(text) > 400):
|
|
128
|
+
return Classification(
|
|
129
|
+
"complex", "high",
|
|
130
|
+
f"{c_score} complex keyword(s) + length={len(text)}",
|
|
131
|
+
_suggest_model("complex"),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# File-count signal
|
|
135
|
+
fc = _FILE_COUNT_RE.search(text)
|
|
136
|
+
if fc and int(fc.group(1)) >= 5:
|
|
137
|
+
return Classification(
|
|
138
|
+
"complex", "high",
|
|
139
|
+
f"task mentions {fc.group(1)}+ files",
|
|
140
|
+
_suggest_model("complex"),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# (c) Hard simple signals
|
|
144
|
+
if s_score >= 1 and len(text) < 250 and c_score == 0:
|
|
145
|
+
return Classification(
|
|
146
|
+
"simple", "high",
|
|
147
|
+
f"{s_score} simple keyword(s), short text",
|
|
148
|
+
_suggest_model("simple"),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# (d) Moderate keyword wins over a short-text "simple" guess —
|
|
152
|
+
# "implement X" is moderate even when phrased tersely.
|
|
153
|
+
word_count = len(text.split())
|
|
154
|
+
if m_score > 0:
|
|
155
|
+
return Classification(
|
|
156
|
+
"moderate", "medium" if m_score >= 2 else "low",
|
|
157
|
+
f"{m_score} moderate keyword(s)",
|
|
158
|
+
_suggest_model("moderate"),
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# (e) Length-based fallback
|
|
162
|
+
if word_count > 80:
|
|
163
|
+
return Classification(
|
|
164
|
+
"complex", "medium",
|
|
165
|
+
f"long description ({word_count} words)",
|
|
166
|
+
_suggest_model("complex"),
|
|
167
|
+
)
|
|
168
|
+
if word_count < 12:
|
|
169
|
+
return Classification(
|
|
170
|
+
"simple", "medium",
|
|
171
|
+
f"short description ({word_count} words)",
|
|
172
|
+
_suggest_model("simple"),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# (f) Uncertain — moderate by default, or ask Haiku to break the tie
|
|
176
|
+
if llm_router is not None:
|
|
177
|
+
try:
|
|
178
|
+
return _llm_refine(text, llm_router)
|
|
179
|
+
except Exception: # noqa: BLE001
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
return Classification(
|
|
183
|
+
"moderate", "low",
|
|
184
|
+
f"no strong signal ({word_count} words, scores={s_score}/{m_score}/{c_score})",
|
|
185
|
+
_suggest_model("moderate"),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _llm_refine(text: str, router) -> Classification:
|
|
190
|
+
"""Last-resort Haiku call for ambiguous cases. ~1 token cost."""
|
|
191
|
+
from omega_engine.provider import AgentRequest
|
|
192
|
+
prompt = (
|
|
193
|
+
"Classify this task into one of: simple, moderate, complex.\n"
|
|
194
|
+
" simple = trivial change, no design decisions\n"
|
|
195
|
+
" moderate = implement/fix with context, single domain\n"
|
|
196
|
+
" complex = architecture, security, cross-cutting, multi-file\n\n"
|
|
197
|
+
f"TASK: {text[:1500]}\n\n"
|
|
198
|
+
"Reply with EXACTLY one word: simple, moderate, or complex."
|
|
199
|
+
)
|
|
200
|
+
provider = router.resolve("classifier")
|
|
201
|
+
result = provider.run(AgentRequest(
|
|
202
|
+
role="classifier", prompt=prompt,
|
|
203
|
+
context={"classifier": True},
|
|
204
|
+
))
|
|
205
|
+
raw = (result.text or "").strip().lower().split()
|
|
206
|
+
bucket = "moderate"
|
|
207
|
+
for w in raw:
|
|
208
|
+
if w in BUCKETS:
|
|
209
|
+
bucket = w
|
|
210
|
+
break
|
|
211
|
+
return Classification(
|
|
212
|
+
bucket, "high",
|
|
213
|
+
"LLM-refined (Haiku 1-token call)",
|
|
214
|
+
_suggest_model(bucket),
|
|
215
|
+
)
|