@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,151 @@
1
+ """`omega prune` — bound the growth of runtime SQLite stores.
2
+
3
+ Three stores grow forever today:
4
+
5
+ * ``Agentik_Runtime/eventlog/omega.db`` (mission events)
6
+ * ``Agentik_Runtime/audits.db`` (forensic-audit history)
7
+ * ``Agentik_Runtime/telegram-history.db`` (per-topic chat history)
8
+
9
+ Plus the per-task ``Agentik_Runtime/sessions/<task_id>/`` directories.
10
+
11
+ This module is the bounded-growth control. Every operation has:
12
+ * A ``dry_run`` mode that reports what WOULD be deleted (default
13
+ behaviour from the CLI is dry-run; ``--yes`` enacts).
14
+ * An explicit "older than" cutoff (no implicit "keep last N").
15
+ * Per-DB transaction so a crash mid-prune leaves the DB consistent.
16
+
17
+ Tests cover both modes: a dry-run never mutates, and a real prune drops
18
+ exactly the rows we promised.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import shutil
23
+ import sqlite3
24
+ import time
25
+ from dataclasses import dataclass
26
+ from pathlib import Path
27
+
28
+
29
+ @dataclass
30
+ class PruneReport:
31
+ target: str
32
+ rows_deleted: int = 0
33
+ files_deleted: int = 0
34
+ bytes_freed: int = 0
35
+ dry_run: bool = False
36
+ detail: str = ""
37
+
38
+
39
+ def _prune_table(
40
+ db_path: Path, table: str, cutoff_seconds: int,
41
+ *, time_column: str = "timestamp", dry_run: bool = False,
42
+ ) -> int:
43
+ """Delete rows older than `cutoff_seconds` from `table`. Returns rowcount."""
44
+ if not db_path.exists():
45
+ return 0
46
+ cutoff = int(time.time()) - cutoff_seconds
47
+ conn = sqlite3.connect(str(db_path))
48
+ try:
49
+ if dry_run:
50
+ cur = conn.execute(
51
+ f"SELECT COUNT(*) FROM {table} WHERE {time_column} < ?",
52
+ (cutoff,),
53
+ )
54
+ return int(cur.fetchone()[0])
55
+ cur = conn.execute(
56
+ f"DELETE FROM {table} WHERE {time_column} < ?",
57
+ (cutoff,),
58
+ )
59
+ conn.commit()
60
+ return cur.rowcount or 0
61
+ except sqlite3.OperationalError:
62
+ # Table missing — nothing to prune.
63
+ return 0
64
+ finally:
65
+ conn.close()
66
+
67
+
68
+ def prune_events(
69
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
70
+ ) -> PruneReport:
71
+ """Drop mission events older than `older_than_days`."""
72
+ home = Path(omega_home)
73
+ db = home / "Agentik_Runtime" / "eventlog" / "omega.db"
74
+ n = _prune_table(db, "events", older_than_days * 86400,
75
+ time_column="ts", dry_run=dry_run)
76
+ return PruneReport(
77
+ target="events", rows_deleted=n, dry_run=dry_run,
78
+ detail=f"older_than={older_than_days}d",
79
+ )
80
+
81
+
82
+ def prune_audits(
83
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
84
+ ) -> PruneReport:
85
+ home = Path(omega_home)
86
+ db = home / "Agentik_Runtime" / "audits.db"
87
+ n = _prune_table(db, "audit_runs", older_than_days * 86400,
88
+ time_column="timestamp", dry_run=dry_run)
89
+ return PruneReport(
90
+ target="audits", rows_deleted=n, dry_run=dry_run,
91
+ detail=f"older_than={older_than_days}d",
92
+ )
93
+
94
+
95
+ def prune_telegram(
96
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
97
+ ) -> PruneReport:
98
+ home = Path(omega_home)
99
+ db = home / "Agentik_Runtime" / "telegram-history.db"
100
+ n = _prune_table(db, "messages", older_than_days * 86400,
101
+ time_column="timestamp", dry_run=dry_run)
102
+ return PruneReport(
103
+ target="telegram", rows_deleted=n, dry_run=dry_run,
104
+ detail=f"older_than={older_than_days}d",
105
+ )
106
+
107
+
108
+ def prune_sessions(
109
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
110
+ ) -> PruneReport:
111
+ """Remove per-task session dirs whose newest file is older than the cutoff."""
112
+ home = Path(omega_home)
113
+ sess_root = home / "Agentik_Runtime" / "sessions"
114
+ if not sess_root.is_dir():
115
+ return PruneReport(target="sessions", dry_run=dry_run)
116
+ cutoff = time.time() - older_than_days * 86400
117
+ n = 0
118
+ bytes_freed = 0
119
+ for child in sess_root.iterdir():
120
+ if not child.is_dir():
121
+ continue
122
+ # newest file mtime under this dir
123
+ newest = max(
124
+ (p.stat().st_mtime for p in child.rglob("*") if p.is_file()),
125
+ default=child.stat().st_mtime,
126
+ )
127
+ if newest >= cutoff:
128
+ continue
129
+ # measure size before delete (for dry-run)
130
+ sz = sum(p.stat().st_size for p in child.rglob("*") if p.is_file())
131
+ if not dry_run:
132
+ shutil.rmtree(child, ignore_errors=True)
133
+ n += 1
134
+ bytes_freed += sz
135
+ return PruneReport(
136
+ target="sessions", files_deleted=n, bytes_freed=bytes_freed,
137
+ dry_run=dry_run, detail=f"older_than={older_than_days}d",
138
+ )
139
+
140
+
141
+ def prune_all(
142
+ omega_home: str | Path, *, older_than_days: int = 90,
143
+ dry_run: bool = False,
144
+ ) -> list[PruneReport]:
145
+ """One call to prune everything to the same cutoff."""
146
+ return [
147
+ prune_events(omega_home, older_than_days=older_than_days, dry_run=dry_run),
148
+ prune_audits(omega_home, older_than_days=older_than_days, dry_run=dry_run),
149
+ prune_telegram(omega_home, older_than_days=older_than_days, dry_run=dry_run),
150
+ prune_sessions(omega_home, older_than_days=older_than_days, dry_run=dry_run),
151
+ ]
@@ -0,0 +1,205 @@
1
+ """pursue — goal-driven execution loop.
2
+
3
+ The Agentik OS native equivalent of a goal-driven worker. Takes a
4
+ ``verify_cmd`` and an ``intent``. Iterates: ask the provider to act, run
5
+ ``verify_cmd``, if exit 0 → success; otherwise feed the failure back and
6
+ iterate. Caps at ``max_iterations`` and writes a per-iteration log.
7
+
8
+ Why this exists:
9
+ Claude Code's bundled ``/goal`` does this in the editor. We rebuild it
10
+ as a portable engine primitive so OmegaOS workers (running in any
11
+ context — daemon, CLI, autonomous charter) can use the same loop without
12
+ depending on a specific bundled skill we don't control.
13
+
14
+ Output:
15
+ Each iteration appends to ``Agentik_Runtime/sessions/<task_id>/pursue.log``
16
+ with ``{iteration, attempted_change, verify_exit, verify_tail}``.
17
+ On success, writes a ``done.json`` (via ``omega_engine.done_signal``)
18
+ with ``status=done_clean`` and a summary. On budget exhaustion, the same
19
+ but with ``status=failed`` and the cumulative attempts as ``errors``.
20
+
21
+ The provider used is the engine's normal ModelRouter — works with the
22
+ MockProvider in tests and with ClaudeProvider in production.
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import json
27
+ import os
28
+ import shlex
29
+ import subprocess
30
+ import time
31
+ import uuid
32
+ from dataclasses import dataclass, field
33
+ from pathlib import Path
34
+ from typing import Any
35
+
36
+
37
+ @dataclass
38
+ class PursueResult:
39
+ task_id: str
40
+ status: str # "done_clean" | "failed"
41
+ iterations: int
42
+ final_verify_exit: int | None
43
+ log_path: Path
44
+ done_path: Path
45
+ artifacts: dict[str, Any] = field(default_factory=dict)
46
+
47
+
48
+ def _run_verify(verify_cmd: str, *, cwd: str | None = None,
49
+ timeout: int = 600) -> tuple[int, str]:
50
+ """Run the verify command in a shell and capture (exit_code, tail-of-output).
51
+
52
+ Returns a 2-tuple. ``tail`` is the last ~80 lines of stdout+stderr so we
53
+ can feed it back to the provider as the iteration's "what broke" context.
54
+ """
55
+ try:
56
+ proc = subprocess.run(
57
+ verify_cmd, shell=True, check=False, capture_output=True,
58
+ text=True, timeout=timeout, cwd=cwd,
59
+ )
60
+ except subprocess.TimeoutExpired:
61
+ return 124, "(verify_cmd timed out)"
62
+ out = (proc.stdout or "") + (proc.stderr or "")
63
+ tail = "\n".join(out.splitlines()[-80:])
64
+ return proc.returncode, tail
65
+
66
+
67
+ def pursue(
68
+ intent: str,
69
+ verify_cmd: str,
70
+ *,
71
+ omega_home: str | Path | None = None,
72
+ task_id: str | None = None,
73
+ project: str | None = None,
74
+ max_iterations: int = 20,
75
+ cwd: str | None = None,
76
+ role: str = "worker",
77
+ timeout_per_iter: int = 600,
78
+ router=None,
79
+ ) -> PursueResult:
80
+ """Drive an agent toward a goal until ``verify_cmd`` exits 0.
81
+
82
+ Args:
83
+ intent: the natural-language goal the agent is pursuing.
84
+ verify_cmd: the shell command that proves the goal is met (exit 0).
85
+ omega_home: ``$OMEGA_HOME`` (defaults to env or ``~/Omega``).
86
+ task_id: optional id; one is generated if not provided.
87
+ project: project slug; if set, the cwd defaults to that project's
88
+ directory and per-project artefacts live there.
89
+ max_iterations: hard cap on attempts (default 20).
90
+ cwd: working directory for ``verify_cmd``. Defaults to project path
91
+ when ``project`` is set, else current directory.
92
+ role: provider role to use (default ``worker``).
93
+ timeout_per_iter: timeout (seconds) per provider call + verify pair.
94
+ router: an ``omega_engine.router.ModelRouter`` — defaults to one
95
+ built from env (mock if no real provider configured).
96
+
97
+ Returns: a ``PursueResult`` describing the outcome.
98
+ """
99
+ home = Path(omega_home or os.environ.get("OMEGA_HOME") or
100
+ Path.home() / "Omega")
101
+ task_id = task_id or "pur-" + uuid.uuid4().hex[:8]
102
+
103
+ # Local imports — keep this module's import-cost low.
104
+ from omega_engine.done_signal import DoneSignal, session_dir, write_done
105
+ from omega_engine.envelope import EnvelopeContext, build_envelope
106
+ from omega_engine.provider import AgentRequest
107
+
108
+ if router is None:
109
+ from omega_engine.router import ModelRouter
110
+ from omega_engine.provider import MockProvider
111
+ router = ModelRouter.single(MockProvider())
112
+
113
+ # Resolve cwd from project if not explicit.
114
+ if cwd is None and project:
115
+ cwd = str(home / "Agentik_Coding" / "projects" / project)
116
+ cwd = cwd or os.getcwd()
117
+
118
+ sess = session_dir(home, task_id)
119
+ log_path = sess / "pursue.log"
120
+ done_p = sess / ".done.json"
121
+
122
+ def log_iter(payload: dict[str, Any]) -> None:
123
+ with open(log_path, "a") as fh:
124
+ fh.write(json.dumps({"ts": int(time.time()), **payload}) + "\n")
125
+
126
+ provider = router.resolve(role)
127
+ last_exit: int | None = None
128
+ last_tail: str = ""
129
+ attempts: list[dict[str, Any]] = []
130
+
131
+ for i in range(1, max_iterations + 1):
132
+ # Build a rich envelope: the agent sees the goal, the verify_cmd,
133
+ # the previous failure tail, and its done.json contract.
134
+ ctx = EnvelopeContext(
135
+ role=role,
136
+ intent=(
137
+ f"GOAL: {intent}\n\n"
138
+ f"VERIFY: `{verify_cmd}` (must exit 0 to be done).\n\n"
139
+ + (f"PREVIOUS FAILURE (iter {i - 1}, exit {last_exit}):\n"
140
+ f"```\n{last_tail}\n```\n" if i > 1 else "")
141
+ + f"This is iteration {i} of {max_iterations}. "
142
+ f"Make one focused, surgical change."
143
+ ),
144
+ task_id=task_id,
145
+ verify_cmd=verify_cmd,
146
+ done_json_path=str(done_p),
147
+ project={"slug": project, "path": cwd} if project else None,
148
+ )
149
+ envelope = build_envelope(home, ctx)
150
+ request = AgentRequest(
151
+ role=role, prompt=envelope["user"], context={
152
+ "task": intent, "verify_cmd": verify_cmd,
153
+ }, system=envelope["system"],
154
+ )
155
+
156
+ try:
157
+ result = provider.run(request)
158
+ except Exception as exc: # noqa: BLE001
159
+ log_iter({"iter": i, "provider_error": str(exc)[:300]})
160
+ attempts.append({"iter": i, "error": str(exc)[:300]})
161
+ continue
162
+
163
+ # Run verify after the provider's turn.
164
+ exit_code, tail = _run_verify(
165
+ verify_cmd, cwd=cwd, timeout=timeout_per_iter,
166
+ )
167
+ last_exit = exit_code
168
+ last_tail = tail
169
+ log_iter({
170
+ "iter": i, "verify_exit": exit_code,
171
+ "provider_text": (result.text or "")[:300],
172
+ "verify_tail": tail[-400:],
173
+ })
174
+ attempts.append({"iter": i, "exit": exit_code})
175
+
176
+ if exit_code == 0:
177
+ sig = DoneSignal(
178
+ status="done_clean",
179
+ summary=f"goal '{intent}' verified by `{verify_cmd}` in {i} iter(s)",
180
+ artifacts={"attempts": attempts, "log": str(log_path)},
181
+ files_changed=list(result.artifacts.get("files") or []),
182
+ )
183
+ write_done(home, task_id, sig)
184
+ return PursueResult(
185
+ task_id=task_id, status="done_clean", iterations=i,
186
+ final_verify_exit=0, log_path=log_path, done_path=done_p,
187
+ artifacts=dict(sig.artifacts),
188
+ )
189
+
190
+ # Budget exhausted — honest failure.
191
+ sig = DoneSignal(
192
+ status="failed",
193
+ summary=(
194
+ f"goal '{intent}' not met after {max_iterations} iterations "
195
+ f"(last exit {last_exit})"
196
+ ),
197
+ artifacts={"attempts": attempts, "log": str(log_path)},
198
+ errors=[f"final verify exit: {last_exit}", last_tail[-200:]],
199
+ )
200
+ write_done(home, task_id, sig)
201
+ return PursueResult(
202
+ task_id=task_id, status="failed", iterations=max_iterations,
203
+ final_verify_exit=last_exit, log_path=log_path, done_path=done_p,
204
+ artifacts=dict(sig.artifacts),
205
+ )
@@ -0,0 +1,21 @@
1
+ """Omega OS multi-RAG subsystem — five strategies behind one Protocol.
2
+
3
+ `base.Retriever` is the contract every strategy honours. The Corrective RAG
4
+ envelope (corrective.CorrectiveRetriever) wraps the chosen strategy; the
5
+ router picks which strategy runs.
6
+
7
+ See docs/ARCHITECTURE.md §7 for the full design.
8
+ """
9
+ from omega_engine.rag.agentic import AgenticRetriever
10
+ from omega_engine.rag.base import Document, RetrievalResult, Retriever
11
+ from omega_engine.rag.corrective import CorrectiveRetriever
12
+ from omega_engine.rag.graph import GraphRetriever
13
+ from omega_engine.rag.hybrid import HybridRetriever
14
+ from omega_engine.rag.multimodal import MultimodalRetriever
15
+ from omega_engine.rag.router import RAGRouter
16
+
17
+ __all__ = [
18
+ "Document", "RetrievalResult", "Retriever",
19
+ "HybridRetriever", "GraphRetriever", "AgenticRetriever",
20
+ "CorrectiveRetriever", "MultimodalRetriever", "RAGRouter",
21
+ ]
@@ -0,0 +1,83 @@
1
+ """Agentic retriever — multi-hop retrieval steered by a provider.
2
+
3
+ After every hop, the provider (role "rag-agent") looks at the current
4
+ context and decides: keep going (return a refined `next_query`) or stop
5
+ (`done: true`). The retriever loops up to `max_hops` and returns the
6
+ accumulated, de-duplicated documents.
7
+
8
+ This is the strategy for "decompose then dig" queries — questions where the
9
+ first retrieval surfaces a clue, and the second clue is buried inside what
10
+ the first one found.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ from omega_engine.provider import AgentProvider, AgentRequest
15
+ from omega_engine.rag.base import Document, RetrievalResult, Retriever
16
+
17
+
18
+ class AgenticRetriever:
19
+ """Multi-hop on top of any underlying retriever."""
20
+
21
+ strategy = "agentic"
22
+
23
+ def __init__(
24
+ self,
25
+ inner: Retriever,
26
+ provider: AgentProvider,
27
+ *,
28
+ max_hops: int = 3,
29
+ k_per_hop: int = 4,
30
+ ) -> None:
31
+ self.inner = inner
32
+ self.provider = provider
33
+ self.max_hops = max_hops
34
+ self.k_per_hop = k_per_hop
35
+
36
+ def retrieve(self, query: str, k: int = 5) -> RetrievalResult:
37
+ seen_ids: set[str] = set()
38
+ accumulated: list[Document] = []
39
+ current = query
40
+ last_score = 0.0
41
+
42
+ for hop in range(self.max_hops):
43
+ partial = self.inner.retrieve(current, k=self.k_per_hop)
44
+ last_score = partial.score
45
+ for d in partial.documents:
46
+ if d.id in seen_ids:
47
+ continue
48
+ seen_ids.add(d.id)
49
+ meta = dict(d.metadata)
50
+ meta["hop"] = hop
51
+ accumulated.append(Document(id=d.id, text=d.text, metadata=meta))
52
+
53
+ # Ask the provider whether to stop or refine.
54
+ ctx_snippets = [d.text[:200] for d in partial.documents[:3]]
55
+ decision = self.provider.run(AgentRequest(
56
+ role="rag-agent",
57
+ prompt=(
58
+ f"Original query: {query}\n"
59
+ f"Current hop: {hop}\n"
60
+ f"Just-retrieved snippets:\n- " + "\n- ".join(ctx_snippets)
61
+ ),
62
+ context={
63
+ "original_query": query,
64
+ "current_query": current,
65
+ "hop": hop,
66
+ "snippets": ctx_snippets,
67
+ },
68
+ ))
69
+ artifacts = decision.artifacts or {}
70
+ if artifacts.get("done"):
71
+ break
72
+ next_q = artifacts.get("next_query")
73
+ if not next_q or next_q == current:
74
+ break
75
+ current = str(next_q)
76
+
77
+ # Final ranking: keep accumulation order (earlier hops first), trim to k.
78
+ return RetrievalResult(
79
+ query=query,
80
+ documents=accumulated[:k],
81
+ score=last_score,
82
+ strategy=self.strategy,
83
+ )
@@ -0,0 +1,42 @@
1
+ """Shared contracts for every retriever — Document, RetrievalResult, Retriever.
2
+
3
+ The whole RAG subsystem talks to these three types. A retriever is anything
4
+ with `retrieve(query, k) -> RetrievalResult`. Strategies plug in behind the
5
+ same interface, the router picks between them, and the Corrective envelope
6
+ wraps any of them.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass, field
11
+ from typing import Any, Protocol, runtime_checkable
12
+
13
+
14
+ @dataclass
15
+ class Document:
16
+ """A single retrievable unit — text + provenance.
17
+
18
+ `metadata` is free-form: source path, modality, chunk index, score,
19
+ captions for images, anything a strategy wants to surface upward.
20
+ """
21
+
22
+ id: str
23
+ text: str
24
+ metadata: dict[str, Any] = field(default_factory=dict)
25
+
26
+
27
+ @dataclass
28
+ class RetrievalResult:
29
+ """What every retriever returns. The router fans these up; the corrective
30
+ envelope grades them; the caller reads `documents`."""
31
+
32
+ query: str
33
+ documents: list[Document]
34
+ score: float = 0.0 # aggregate confidence in [0, 1]
35
+ strategy: str = "" # which retriever produced this result
36
+
37
+
38
+ @runtime_checkable
39
+ class Retriever(Protocol):
40
+ """The whole RAG subsystem speaks this Protocol."""
41
+
42
+ def retrieve(self, query: str, k: int = 5) -> RetrievalResult: ...
@@ -0,0 +1,119 @@
1
+ """Corrective RAG (CRAG) — the envelope every strategy wears.
2
+
3
+ For each retrieval, the provider (role "rag-grader") scores every doc 0-100.
4
+ If the average is below `threshold`, the provider (role "rag-agent") produces
5
+ a refined query and we re-retrieve. Bounded retries — never an infinite loop.
6
+
7
+ This is the user's explicit design: corrective wraps the chosen strategy.
8
+ The router resolves WHICH retriever runs; the corrective layer ensures the
9
+ RESULT meets a quality floor.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ from omega_engine.provider import AgentProvider, AgentRequest
14
+ from omega_engine.rag.base import Document, RetrievalResult, Retriever
15
+
16
+
17
+ class CorrectiveRetriever:
18
+ """Grade → if low, refine query and retry. Bounded by `max_retries`."""
19
+
20
+ strategy = "corrective"
21
+
22
+ def __init__(
23
+ self,
24
+ inner: Retriever,
25
+ provider: AgentProvider,
26
+ *,
27
+ threshold: float = 70.0,
28
+ max_retries: int = 2,
29
+ ) -> None:
30
+ self.inner = inner
31
+ self.provider = provider
32
+ self.threshold = threshold
33
+ self.max_retries = max_retries
34
+
35
+ def retrieve(self, query: str, k: int = 5) -> RetrievalResult:
36
+ current = query
37
+ last: RetrievalResult | None = None
38
+
39
+ for attempt in range(self.max_retries + 1):
40
+ result = self.inner.retrieve(current, k=k)
41
+ last = result
42
+ if not result.documents:
43
+ break
44
+
45
+ grade_avg = self._grade(current, result.documents)
46
+ # Stamp the grade onto every document so the caller can see it.
47
+ for d in result.documents:
48
+ d.metadata["grader_avg"] = grade_avg
49
+ result.score = max(result.score, grade_avg / 100.0)
50
+
51
+ if grade_avg >= self.threshold or attempt == self.max_retries:
52
+ # Either good enough OR we've used up our retries.
53
+ inner_strategy = result.strategy
54
+ return RetrievalResult(
55
+ query=query,
56
+ documents=result.documents,
57
+ score=result.score,
58
+ strategy=f"corrective+{inner_strategy}",
59
+ )
60
+
61
+ # Below threshold AND retries remain — ask provider for a refined
62
+ # query and try again.
63
+ current = self._refine(query, current, result.documents)
64
+
65
+ # Defensive fallback — exhausted retries but never returned (e.g.
66
+ # zero docs from inner). Surface what we have, untouched.
67
+ if last is None:
68
+ return RetrievalResult(query=query, documents=[], score=0.0,
69
+ strategy="corrective+empty")
70
+ return RetrievalResult(
71
+ query=query,
72
+ documents=last.documents,
73
+ score=last.score,
74
+ strategy=f"corrective+{last.strategy}",
75
+ )
76
+
77
+ # ----- internals -----
78
+
79
+ def _grade(self, query: str, docs: list[Document]) -> float:
80
+ """Average grader score in 0-100. Bounded; missing scores → 0."""
81
+ result = self.provider.run(AgentRequest(
82
+ role="rag-grader",
83
+ prompt=f"Score relevance 0-100 for query: {query}",
84
+ context={
85
+ "query": query,
86
+ "documents": [
87
+ {"id": d.id, "text": d.text[:300]} for d in docs
88
+ ],
89
+ },
90
+ ))
91
+ raw = (result.artifacts or {}).get("scores", [])
92
+ scores = [float(s) for s in raw if isinstance(s, (int, float))]
93
+ if not scores:
94
+ return 0.0
95
+ avg = sum(scores) / len(scores)
96
+ return max(0.0, min(100.0, avg))
97
+
98
+ def _refine(self, original: str, current: str, docs: list[Document]) -> str:
99
+ """Ask the provider for a refined query. Fallback: append context."""
100
+ result = self.provider.run(AgentRequest(
101
+ role="rag-agent",
102
+ prompt=(
103
+ f"Original query: {original}\n"
104
+ f"Current query: {current}\n"
105
+ "These docs scored below the relevance threshold. "
106
+ "Suggest a better query."
107
+ ),
108
+ context={
109
+ "original_query": original,
110
+ "current_query": current,
111
+ "snippets": [d.text[:200] for d in docs[:3]],
112
+ },
113
+ ))
114
+ next_q = (result.artifacts or {}).get("next_query")
115
+ if next_q and next_q != current:
116
+ return str(next_q)
117
+ # Provider had nothing useful — perturb the query so the inner
118
+ # retriever sees something different.
119
+ return f"{current} context"