@agentikos/omega-os 0.1.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.
Files changed (379) hide show
  1. package/README.md +56 -14
  2. package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
  3. package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
  4. package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
  5. package/bootstrap/lib/claude-code-settings.py +176 -0
  6. package/bootstrap/lib/common.sh +457 -1
  7. package/bootstrap/lib/llm-clis.py +341 -0
  8. package/bootstrap/lib/manifest-helpers.py +384 -0
  9. package/bootstrap/lib/steps.sh +1000 -26
  10. package/bootstrap/manifest.example.yaml +93 -2
  11. package/bootstrap/templates/aisb/CLAUDE.md +305 -0
  12. package/bootstrap/templates/aisb/architect.md +204 -0
  13. package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
  14. package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
  15. package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
  16. package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
  17. package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
  18. package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
  19. package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
  20. package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
  21. package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
  22. package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
  23. package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
  24. package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
  25. package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
  26. package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
  27. package/bootstrap/templates/aisb/construct.md +135 -0
  28. package/bootstrap/templates/aisb/keymaker.md +227 -0
  29. package/bootstrap/templates/aisb/link.md +170 -0
  30. package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
  31. package/bootstrap/templates/aisb/merovingian.md +159 -0
  32. package/bootstrap/templates/aisb/morpheus.md +243 -0
  33. package/bootstrap/templates/aisb/neo.md +147 -0
  34. package/bootstrap/templates/aisb/niobe.md +197 -0
  35. package/bootstrap/templates/aisb/oracle.md +244 -0
  36. package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
  37. package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
  38. package/bootstrap/templates/aisb/pythia.md +153 -0
  39. package/bootstrap/templates/aisb/seraph.md +315 -0
  40. package/bootstrap/templates/aisb/smith.md +202 -0
  41. package/bootstrap/templates/aisb/zion.md +172 -0
  42. package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
  43. package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
  44. package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
  45. package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
  46. package/docs/AUDITS.md +85 -0
  47. package/docs/COMPLETION-PLAN.md +48 -0
  48. package/docs/GAP-ANALYSIS.md +214 -0
  49. package/docs/INSTALL.md +47 -9
  50. package/docs/MCP-AND-PLUGINS.md +31 -4
  51. package/docs/SIMULATION.md +171 -0
  52. package/docs/simulate.sh +211 -0
  53. package/install.sh +164 -17
  54. package/omega/Agentik_Engine/README.md +27 -10
  55. package/omega/Agentik_Engine/omega_engine/__init__.py +212 -2
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/account.py +502 -0
  105. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  106. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  107. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  108. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  109. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  110. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  114. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  115. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  116. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  117. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  121. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  122. package/omega/Agentik_Engine/omega_engine/autonomous.py +538 -0
  123. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  124. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  125. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  126. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  127. package/omega/Agentik_Engine/omega_engine/cli.py +4564 -56
  128. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  129. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  130. package/omega/Agentik_Engine/omega_engine/daemons/__init__.py +14 -0
  131. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  132. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  133. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  134. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  135. package/omega/Agentik_Engine/omega_engine/daemons/autonomous.py +56 -0
  136. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +236 -0
  137. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +315 -0
  138. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  139. package/omega/Agentik_Engine/omega_engine/educators/__init__.py +51 -0
  140. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  143. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  144. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/artifact.py +65 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/automation.py +76 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/base.py +327 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/claudecode.py +71 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/connection.py +75 -0
  155. package/omega/Agentik_Engine/omega_engine/educators/coworker.py +68 -0
  156. package/omega/Agentik_Engine/omega_engine/educators/loop.py +82 -0
  157. package/omega/Agentik_Engine/omega_engine/educators/prompt.py +68 -0
  158. package/omega/Agentik_Engine/omega_engine/educators/skill.py +69 -0
  159. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  160. package/omega/Agentik_Engine/omega_engine/executor.py +195 -16
  161. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  167. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  168. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  169. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  170. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  171. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  172. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  173. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  174. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  175. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  176. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  177. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  178. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  179. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  180. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  181. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  182. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  183. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  184. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  185. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  186. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  187. package/omega/Agentik_Engine/omega_engine/mission.py +29 -14
  188. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  189. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  190. package/omega/Agentik_Engine/omega_engine/provider.py +408 -13
  191. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  192. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__init__.py +21 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  198. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  199. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/rag/agentic.py +83 -0
  203. package/omega/Agentik_Engine/omega_engine/rag/base.py +42 -0
  204. package/omega/Agentik_Engine/omega_engine/rag/corrective.py +119 -0
  205. package/omega/Agentik_Engine/omega_engine/rag/graph.py +169 -0
  206. package/omega/Agentik_Engine/omega_engine/rag/hybrid.py +205 -0
  207. package/omega/Agentik_Engine/omega_engine/rag/multimodal.py +136 -0
  208. package/omega/Agentik_Engine/omega_engine/rag/router.py +110 -0
  209. package/omega/Agentik_Engine/omega_engine/reducer.py +21 -3
  210. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  211. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  212. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  213. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  214. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  215. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  216. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  217. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  218. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  219. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  220. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  221. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  222. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  223. package/omega/Agentik_Engine/omega_engine/store.py +132 -25
  224. package/omega/Agentik_Engine/omega_engine/sync.py +445 -0
  225. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  226. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  227. package/omega/Agentik_Engine/omega_engine/tools.py +272 -0
  228. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  229. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  230. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  231. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  232. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  233. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  234. package/omega/Agentik_Engine/pyproject.toml +1 -1
  235. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  304. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  305. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  306. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  307. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  308. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  309. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  310. package/omega/Agentik_Engine/tests/test_account.py +338 -0
  311. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  312. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  313. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  314. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  315. package/omega/Agentik_Engine/tests/test_autonomous.py +361 -0
  316. package/omega/Agentik_Engine/tests/test_educators.py +233 -0
  317. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  318. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  319. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  320. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  321. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  322. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  323. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  324. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  325. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  326. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  327. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  328. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  329. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  330. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  331. package/omega/Agentik_Engine/tests/test_rag.py +287 -0
  332. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  333. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  334. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  335. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  336. package/omega/Agentik_Engine/tests/test_snapshot_partial.py +172 -0
  337. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  338. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  339. package/omega/Agentik_Engine/tests/test_tools_and_sync.py +312 -0
  340. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  341. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  342. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  343. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  344. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  345. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  346. package/omega/Agentik_Runtime/audits.db +0 -0
  347. package/omega/Agentik_SSOT/VERSION +1 -1
  348. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  349. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  350. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  351. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  352. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  356. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  357. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  359. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  360. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  361. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  362. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  363. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  364. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  365. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  366. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  367. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  368. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  369. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  370. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  371. package/omega/Agentik_SSOT/skills/rag-route.md +82 -0
  372. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  373. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  374. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  375. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  376. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  377. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  378. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  379. package/package.json +2 -2
@@ -0,0 +1,215 @@
1
+ """`omega backup` + `omega restore` — disaster-recovery for an OmegaOS deployment.
2
+
3
+ What we back up by default:
4
+
5
+ * ``Agentik_Runtime/`` (event log, audits, telegram history, sessions)
6
+ * ``Agentik_Extra/etc/secrets/`` (encrypted vault — the .age files +
7
+ the .vault-key)
8
+ * ``Agentik_SSOT/`` (operator-edited skills, audits, charters,
9
+ webhooks — anything modified post-install)
10
+ * ``Agentik_Coding/projects.json`` (project registry)
11
+
12
+ What we do NOT back up:
13
+
14
+ * The engine venv (regenerated by re-running install.sh)
15
+ * MCP binaries (installed by step 40, idempotent)
16
+ * Cache + tmp dirs
17
+
18
+ The bundle is a tar.gz at ``~/omega-backup-<timestamp>.tar.gz`` by
19
+ default. When the operator passes ``--encrypt``, the tarball is then
20
+ piped through ``age -r <pub>`` so the bundle itself is at-rest
21
+ encrypted. The recipient defaults to the operator's existing
22
+ ``.vault-pub`` so they need no extra key management.
23
+
24
+ ``omega backup verify <path>`` extracts the bundle into a temp dir and
25
+ re-runs ``omega doctor`` against it. Pass = the backup actually
26
+ restores; fail = the bundle is corrupt or incomplete.
27
+ """
28
+ from __future__ import annotations
29
+
30
+ import os
31
+ import shutil
32
+ import subprocess
33
+ import tarfile
34
+ import tempfile
35
+ import time
36
+ from dataclasses import dataclass
37
+ from pathlib import Path
38
+
39
+
40
+ BACKUP_ROOTS = [
41
+ "Agentik_Runtime",
42
+ "Agentik_Extra/etc/secrets",
43
+ "Agentik_SSOT",
44
+ "Agentik_Coding/projects.json",
45
+ ]
46
+
47
+
48
+ @dataclass
49
+ class BackupResult:
50
+ bundle: Path
51
+ bytes: int
52
+ encrypted: bool
53
+ duration_s: float
54
+ detail: str = ""
55
+
56
+
57
+ @dataclass
58
+ class RestoreResult:
59
+ bundle: Path
60
+ target: Path
61
+ files: int
62
+ duration_s: float
63
+ detail: str = ""
64
+
65
+
66
+ def _have(binary: str) -> bool:
67
+ return shutil.which(binary) is not None
68
+
69
+
70
+ def backup(
71
+ omega_home: str | Path,
72
+ *,
73
+ out_dir: str | Path | None = None,
74
+ encrypt: bool = False,
75
+ recipient_path: str | Path | None = None,
76
+ ) -> BackupResult:
77
+ """Create a tarball of the live tree's recoverable subset."""
78
+ home = Path(omega_home)
79
+ if not home.is_dir():
80
+ raise FileNotFoundError(f"OMEGA_HOME not found: {home}")
81
+ out_dir = Path(out_dir) if out_dir else Path.home()
82
+ out_dir.mkdir(parents=True, exist_ok=True)
83
+ ts = int(time.time())
84
+ bundle = out_dir / f"omega-backup-{ts}.tar.gz"
85
+
86
+ start = time.time()
87
+ with tarfile.open(bundle, "w:gz") as tar:
88
+ for relpath in BACKUP_ROOTS:
89
+ full = home / relpath
90
+ if not full.exists():
91
+ continue
92
+ tar.add(full, arcname=relpath)
93
+ elapsed = time.time() - start
94
+
95
+ if encrypt:
96
+ if not _have("age"):
97
+ raise RuntimeError("age not on PATH — install it or drop --encrypt")
98
+ rec_file = (
99
+ Path(recipient_path) if recipient_path
100
+ else home / "Agentik_Extra" / "etc" / "secrets" / ".vault-pub"
101
+ )
102
+ if not rec_file.exists():
103
+ raise RuntimeError(
104
+ f"no recipient public key at {rec_file} — provide --recipient-path"
105
+ )
106
+ recipient = rec_file.read_text().strip()
107
+ enc_bundle = bundle.with_suffix(bundle.suffix + ".age")
108
+ with bundle.open("rb") as inp, enc_bundle.open("wb") as out:
109
+ proc = subprocess.run(
110
+ ["age", "-r", recipient], stdin=inp, stdout=out,
111
+ check=False, capture_output=False, timeout=600,
112
+ )
113
+ if proc.returncode != 0:
114
+ raise RuntimeError(f"age encrypt exit {proc.returncode}")
115
+ bundle.unlink() # drop the plaintext tarball
116
+ bundle = enc_bundle
117
+
118
+ return BackupResult(
119
+ bundle=bundle, bytes=bundle.stat().st_size,
120
+ encrypted=encrypt, duration_s=round(elapsed, 2),
121
+ detail=f"{len(BACKUP_ROOTS)} root(s) archived",
122
+ )
123
+
124
+
125
+ def restore(
126
+ bundle: str | Path,
127
+ *,
128
+ target: str | Path,
129
+ age_identity: str | Path | None = None,
130
+ ) -> RestoreResult:
131
+ """Restore a bundle into ``target`` (typically ``$OMEGA_HOME``)."""
132
+ bundle = Path(bundle)
133
+ if not bundle.exists():
134
+ raise FileNotFoundError(f"bundle not found: {bundle}")
135
+ target = Path(target)
136
+ target.mkdir(parents=True, exist_ok=True)
137
+
138
+ start = time.time()
139
+ # If encrypted, decrypt to a temp file first.
140
+ tar_source: Path = bundle
141
+ cleanup_tmp: Path | None = None
142
+ if bundle.suffix == ".age":
143
+ if not _have("age"):
144
+ raise RuntimeError("age not on PATH — cannot decrypt bundle")
145
+ identity = (
146
+ Path(age_identity) if age_identity
147
+ else target / "Agentik_Extra" / "etc" / "secrets" / ".vault-key"
148
+ )
149
+ if not identity.exists():
150
+ raise RuntimeError(
151
+ f"no age identity at {identity} — provide --identity"
152
+ )
153
+ cleanup_tmp = Path(tempfile.mkstemp(suffix=".tar.gz")[1])
154
+ with cleanup_tmp.open("wb") as out:
155
+ proc = subprocess.run(
156
+ ["age", "-d", "-i", str(identity), str(bundle)],
157
+ stdout=out, check=False, timeout=600,
158
+ )
159
+ if proc.returncode != 0:
160
+ cleanup_tmp.unlink(missing_ok=True)
161
+ raise RuntimeError(f"age decrypt exit {proc.returncode}")
162
+ tar_source = cleanup_tmp
163
+
164
+ try:
165
+ with tarfile.open(tar_source, "r:gz") as tar:
166
+ members = tar.getmembers()
167
+ for m in members:
168
+ # Reject absolute paths + path traversal.
169
+ if m.name.startswith("/") or ".." in m.name.split("/"):
170
+ raise RuntimeError(f"unsafe path in bundle: {m.name}")
171
+ tar.extractall(path=target)
172
+ files = sum(1 for m in members if m.isfile())
173
+ finally:
174
+ if cleanup_tmp is not None:
175
+ cleanup_tmp.unlink(missing_ok=True)
176
+
177
+ return RestoreResult(
178
+ bundle=bundle, target=target, files=files,
179
+ duration_s=round(time.time() - start, 2),
180
+ detail=f"{files} file(s) extracted",
181
+ )
182
+
183
+
184
+ def verify(
185
+ bundle: str | Path,
186
+ *,
187
+ age_identity: str | Path | None = None,
188
+ ) -> dict:
189
+ """Restore the bundle into a temp dir + run a minimal sanity check.
190
+
191
+ Returns ``{ok: bool, files: int, detail: str}``. We do NOT run the
192
+ full ``omega doctor`` here because that would touch the operator's
193
+ real environment; we just confirm the bundle extracts cleanly and
194
+ looks like an OmegaOS tree.
195
+ """
196
+ bundle = Path(bundle)
197
+ with tempfile.TemporaryDirectory() as td:
198
+ result = restore(bundle, target=td, age_identity=age_identity)
199
+ # Smoke check: the well-known subset should be in there.
200
+ target = Path(td)
201
+ missing = [
202
+ root for root in BACKUP_ROOTS
203
+ if not (target / root).exists()
204
+ ]
205
+ if missing:
206
+ return {
207
+ "ok": False,
208
+ "files": result.files,
209
+ "detail": f"missing in bundle: {missing}",
210
+ }
211
+ return {
212
+ "ok": True,
213
+ "files": result.files,
214
+ "detail": f"all {len(BACKUP_ROOTS)} root(s) present + extracted",
215
+ }
@@ -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
+ )