@agentikos/omega-os 0.2.0 → 0.19.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/README.md +33 -3
  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 +790 -21
  10. package/bootstrap/manifest.example.yaml +87 -1
  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/GAP-ANALYSIS.md +214 -0
  48. package/docs/INSTALL.md +47 -9
  49. package/docs/MCP-AND-PLUGINS.md +31 -4
  50. package/docs/SIMULATION.md +171 -0
  51. package/docs/simulate.sh +211 -0
  52. package/install.sh +164 -17
  53. package/omega/Agentik_Engine/README.md +4 -2
  54. package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
  55. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  105. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  106. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  107. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  108. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  109. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  110. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/account.py +28 -31
  114. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  115. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  116. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  117. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  121. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  122. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  123. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  124. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  125. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  126. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  127. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  128. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  129. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  130. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  131. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  132. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  133. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  134. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  135. package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
  136. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  137. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  138. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  139. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  140. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
  143. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
  144. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  155. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  156. package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
  157. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  158. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  159. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  160. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  161. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  167. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  168. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  169. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  170. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  171. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  172. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  173. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  174. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  175. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  176. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  177. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  178. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  179. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  180. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  181. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  182. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  183. package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
  184. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  185. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  186. package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
  187. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  188. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  189. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  190. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  191. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  192. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  198. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  199. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  203. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  204. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  205. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  206. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  207. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  208. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  209. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  210. package/omega/Agentik_Engine/omega_engine/store.py +88 -41
  211. package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
  212. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  213. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  214. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  215. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  216. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  217. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  218. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  219. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  220. package/omega/Agentik_Engine/pyproject.toml +1 -1
  221. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  222. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  223. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  224. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  225. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  226. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  227. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  228. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
  229. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  230. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  231. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  232. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  233. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  234. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  235. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/test_account.py +8 -3
  304. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  305. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  306. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  307. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  308. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  309. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  310. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  311. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  312. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  313. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  314. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  315. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  316. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  317. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  318. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  319. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  320. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  321. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  322. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  323. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  324. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  325. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  326. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  327. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  328. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  329. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  330. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  331. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  332. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  333. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  334. package/omega/Agentik_Runtime/audits.db +0 -0
  335. package/omega/Agentik_SSOT/VERSION +1 -1
  336. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  337. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  338. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  339. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
  340. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
  341. package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
  342. package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
  343. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  344. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  345. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  346. package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
  347. package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
  348. package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
  349. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  350. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  351. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  352. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  356. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  357. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  359. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  360. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  361. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  362. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  363. package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
  364. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  365. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  366. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  367. package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
  368. package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
  369. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  370. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  371. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  372. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  373. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  374. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  375. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  376. package/package.json +2 -2
@@ -0,0 +1,158 @@
1
+ """Agent prompt loader — the bridge between SSOT and the provider.
2
+
3
+ Every role in the engine (oracle, worker, architect, keymaker, …) has a
4
+ fully-written system prompt living in ``Agentik_SSOT/agents/<suite>/<role>.md``.
5
+ This module locates the file, strips any YAML frontmatter, and returns the
6
+ prompt text for the provider to inject as the ``system`` message.
7
+
8
+ The AISB suite — 13 named agents + the LMC protocol + per-agent checkers —
9
+ is shipped by the installer from ``bootstrap/templates/aisb/``. New suites
10
+ drop into ``Agentik_SSOT/agents/<name>/`` and are picked up by id.
11
+
12
+ Resolution order for a role:
13
+ 1. ``Agentik_SSOT/agents/aisb/<role>.md`` (the AISB suite)
14
+ 2. ``Agentik_SSOT/agents/<any-suite>/<role>.md`` (any other suite)
15
+ 3. None — the provider falls back to a minimal generic envelope.
16
+
17
+ The LMC protocol + shared protocols are concatenated into every agent's
18
+ system prompt so they always know the contract.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import re
23
+ from functools import lru_cache
24
+ from pathlib import Path
25
+
26
+
27
+ _FRONTMATTER_RE = re.compile(r"^---\s*\n.*?\n---\s*\n", re.DOTALL)
28
+
29
+
30
+ def _strip_frontmatter(text: str) -> str:
31
+ """Drop the leading YAML frontmatter block if present."""
32
+ match = _FRONTMATTER_RE.match(text)
33
+ return text[match.end():] if match else text
34
+
35
+
36
+ def _agents_root(omega_home: Path) -> Path:
37
+ return Path(omega_home) / "Agentik_SSOT" / "agents"
38
+
39
+
40
+ # Topology-name → AISB-suite-name aliases.
41
+ # The orchestration topology YAMLs use generic role names (`aisb`, `oracle`,
42
+ # `manager`, `worker`, `audit`) but the AISB suite ships its own canonical
43
+ # names (`niobe`, `oracle`, `keymaker`, `construct`, `seraph`). Without
44
+ # this map, ``load_agent_prompt("worker")`` returns None and the worker
45
+ # spawns with the engine's generic fallback envelope — losing the rich
46
+ # identity Gareth's home system relies on.
47
+ #
48
+ # Direction is topology → suite. Add entries here when a topology introduces
49
+ # a new role name that maps to an existing suite agent.
50
+ _ROLE_ALIASES: dict[str, str] = {
51
+ "aisb": "niobe", # the matriarch / root scope
52
+ "manager": "keymaker", # the planner
53
+ "worker": "construct", # the executor
54
+ "audit": "seraph", # the verifier
55
+ "verifier": "seraph", # synonym used by some topologies
56
+ "link": "link", # already canonical
57
+ }
58
+
59
+
60
+ @lru_cache(maxsize=64)
61
+ def _read_agent_file(path: str) -> str | None:
62
+ p = Path(path)
63
+ if not p.exists():
64
+ return None
65
+ try:
66
+ return _strip_frontmatter(p.read_text()).strip()
67
+ except OSError:
68
+ return None
69
+
70
+
71
+ def find_agent_file(omega_home: str | Path, role: str) -> Path | None:
72
+ """Return the on-disk path for a role's agent prompt, or None.
73
+
74
+ Resolution order:
75
+ 1. Direct match on the role name in the AISB suite.
76
+ 2. Alias-mapped name (e.g. ``worker`` → ``construct``).
77
+ 3. Direct match in any other suite.
78
+ 4. Alias-mapped match in any other suite.
79
+ """
80
+ root = _agents_root(Path(omega_home))
81
+ if not root.is_dir():
82
+ return None
83
+
84
+ candidates_for_role: list[str] = [role]
85
+ aliased = _ROLE_ALIASES.get(role)
86
+ if aliased and aliased != role:
87
+ candidates_for_role.append(aliased)
88
+
89
+ # 1+2. AISB suite first (the master), with alias fallback.
90
+ aisb_dir = root / "aisb"
91
+ if aisb_dir.is_dir():
92
+ for cand in candidates_for_role:
93
+ p = aisb_dir / f"{cand}.md"
94
+ if p.exists():
95
+ return p
96
+
97
+ # 3+4. Any other suite that names a file after the role (or its alias).
98
+ for suite in sorted(root.iterdir()):
99
+ if not suite.is_dir() or suite.name == "aisb":
100
+ continue
101
+ for cand in candidates_for_role:
102
+ p = suite / f"{cand}.md"
103
+ if p.exists():
104
+ return p
105
+ return None
106
+
107
+
108
+ def load_agent_prompt(omega_home: str | Path, role: str) -> str | None:
109
+ """Return the agent's full system prompt, or None if not shipped.
110
+
111
+ Includes the LMC + shared protocols when found, so every loaded agent
112
+ knows the contract without us repeating it in every file.
113
+ """
114
+ path = find_agent_file(omega_home, role)
115
+ if path is None:
116
+ return None
117
+ text = _read_agent_file(str(path))
118
+ if text is None:
119
+ return None
120
+
121
+ # Append any protocol files that live next to the agent.
122
+ suite_dir = path.parent
123
+ extras: list[str] = []
124
+ for proto in ("lmc-protocol.md",):
125
+ proto_path = suite_dir / proto
126
+ body = _read_agent_file(str(proto_path))
127
+ if body:
128
+ extras.append(f"\n\n--- PROTOCOL: {proto} ---\n\n{body}")
129
+ shared = suite_dir / "protocols" / "shared-protocol.md"
130
+ body = _read_agent_file(str(shared))
131
+ if body:
132
+ extras.append(f"\n\n--- SHARED PROTOCOL ---\n\n{body}")
133
+ return text + "".join(extras)
134
+
135
+
136
+ def list_available_agents(omega_home: str | Path) -> dict[str, list[str]]:
137
+ """Return ``{suite: [roles]}`` for every agent file shipped under
138
+ Agentik_SSOT/agents/."""
139
+ root = _agents_root(Path(omega_home))
140
+ out: dict[str, list[str]] = {}
141
+ if not root.is_dir():
142
+ return out
143
+ for suite in sorted(root.iterdir()):
144
+ if not suite.is_dir():
145
+ continue
146
+ roles = sorted(
147
+ p.stem for p in suite.glob("*.md")
148
+ if not p.stem.startswith(("checker-", "lmc-", "handoff-",
149
+ "shared-", "CLAUDE"))
150
+ )
151
+ if roles:
152
+ out[suite.name] = roles
153
+ return out
154
+
155
+
156
+ def clear_cache() -> None:
157
+ """Drop the prompt-file cache. Useful in tests and after re-installs."""
158
+ _read_agent_file.cache_clear()
@@ -22,8 +22,10 @@ from typing import Any, Protocol, runtime_checkable
22
22
  @dataclass
23
23
  class AgentRequest:
24
24
  role: str # "aisb" | "oracle" | "worker" | ...
25
- prompt: str
25
+ prompt: str # the user-facing message
26
26
  context: dict[str, Any] = field(default_factory=dict)
27
+ system: str | None = None # the role-aware system prompt
28
+ # (built by omega_engine.envelope)
27
29
 
28
30
 
29
31
  @dataclass
@@ -44,6 +46,144 @@ class AgentProvider(Protocol):
44
46
  def run(self, req: AgentRequest) -> AgentResult: ...
45
47
 
46
48
 
49
+ class ClaudeMaxProvider:
50
+ """The Claude Code Max subprocess provider — uses the operator's OAuth,
51
+ NOT an API key.
52
+
53
+ Spawns ``claude -p "<prompt>" --output-format json --model <model>`` and
54
+ parses the structured response. Authentication is whatever the
55
+ operator did via ``claude /login`` — no ANTHROPIC_API_KEY needed.
56
+ Token usage AND a real ``total_cost_usd`` are returned directly by
57
+ the Claude Code CLI (calculated against Max account billing).
58
+
59
+ System prompts go via ``--append-system-prompt`` so the envelope's
60
+ rich role-aware prompt still drives the agent.
61
+
62
+ Sessions: when ``session_id`` is set on the request context, we use
63
+ ``--resume <session-id>`` so multi-turn conversations work. The CLI's
64
+ own session-id is returned in the result and propagated back as
65
+ ``result.artifacts["session_id"]``.
66
+
67
+ Use this on any machine where ``claude`` CLI is installed and the
68
+ operator is logged in (verified via ``claude --version``).
69
+ """
70
+
71
+ id = "claude-max"
72
+
73
+ def __init__(
74
+ self,
75
+ model: str = "sonnet",
76
+ timeout_s: int = 600,
77
+ bin_path: str = "claude",
78
+ ) -> None:
79
+ self._model = model
80
+ self._timeout_s = timeout_s
81
+ self._bin = bin_path
82
+
83
+ def _model_for(self, role: str) -> str:
84
+ """Resolve the model for a role — explicit > role default > self."""
85
+ # Allow the request itself to override via context.model
86
+ try:
87
+ from omega_engine.worker import default_model_for_role
88
+ role_model = default_model_for_role(role)
89
+ except ImportError:
90
+ role_model = self._model
91
+ return role_model
92
+
93
+ @staticmethod
94
+ def is_available(bin_path: str = "claude") -> bool:
95
+ """True iff `claude` CLI is on PATH and answers --version."""
96
+ import shutil
97
+ if shutil.which(bin_path) is None:
98
+ return False
99
+ try:
100
+ import subprocess
101
+ proc = subprocess.run(
102
+ [bin_path, "--version"],
103
+ check=False, capture_output=True, text=True, timeout=15,
104
+ )
105
+ return proc.returncode == 0
106
+ except (OSError, subprocess.SubprocessError):
107
+ return False
108
+
109
+ def run(self, req: AgentRequest) -> AgentResult:
110
+ import subprocess
111
+ # Per-request model: explicit context.model > role default > self default
112
+ model = (req.context or {}).get("model") or self._model_for(req.role)
113
+ cmd = [
114
+ self._bin, "-p", req.prompt,
115
+ "--output-format", "json",
116
+ "--model", model,
117
+ # bypass tool-permission dialogs in headless mode — operator
118
+ # already set the default permission mode via settings.json
119
+ "--dangerously-skip-permissions",
120
+ ]
121
+ # The envelope's `system` becomes an --append-system-prompt so the
122
+ # default Claude Code system prompt + our role-specific identity +
123
+ # contract all merge.
124
+ if req.system:
125
+ cmd += ["--append-system-prompt", req.system]
126
+ # If the caller passes a session_id in the context, resume that
127
+ # session — turns the provider into a stateful conversation.
128
+ sid = (req.context or {}).get("session_id")
129
+ if sid:
130
+ cmd += ["--resume", str(sid)]
131
+
132
+ try:
133
+ proc = subprocess.run(
134
+ cmd, check=False, capture_output=True, text=True,
135
+ timeout=self._timeout_s,
136
+ )
137
+ except subprocess.TimeoutExpired:
138
+ raise RuntimeError(
139
+ f"claude -p timed out after {self._timeout_s}s"
140
+ )
141
+ if proc.returncode != 0:
142
+ raise RuntimeError(
143
+ f"claude -p exit {proc.returncode}: "
144
+ f"{(proc.stderr or proc.stdout or '').strip()[:500]}"
145
+ )
146
+
147
+ raw_text = (proc.stdout or "").strip()
148
+ try:
149
+ data = json.loads(raw_text)
150
+ except json.JSONDecodeError:
151
+ raise RuntimeError(
152
+ f"claude -p returned non-JSON: {raw_text[:200]}"
153
+ )
154
+
155
+ text = str(data.get("result", ""))
156
+ usage_in = data.get("usage", {}) or {}
157
+ artifacts: dict[str, Any] = {
158
+ "session_id": data.get("session_id", ""),
159
+ "stop_reason": data.get("stop_reason", ""),
160
+ "num_turns": int(data.get("num_turns", 0) or 0),
161
+ "duration_ms": int(data.get("duration_ms", 0) or 0),
162
+ "total_cost_usd": float(data.get("total_cost_usd", 0.0) or 0.0),
163
+ }
164
+ # Dispatcher roles still need to surface a plan when they
165
+ # produced one. Try a JSON parse of the text body.
166
+ plan = (
167
+ _extract_plan(text)
168
+ if req.role in ("aisb", "oracle", "manager") else []
169
+ )
170
+ return AgentResult(
171
+ text=text, claimed_done=True, plan=plan, artifacts=artifacts,
172
+ usage={
173
+ "input_tokens": int(usage_in.get("input_tokens", 0) or 0),
174
+ "output_tokens": int(usage_in.get("output_tokens", 0) or 0),
175
+ "cache_read_input_tokens": int(
176
+ usage_in.get("cache_read_input_tokens", 0) or 0
177
+ ),
178
+ "cache_creation_input_tokens": int(
179
+ usage_in.get("cache_creation_input_tokens", 0) or 0
180
+ ),
181
+ # Real Max cost — calculated by Claude Code itself.
182
+ "cost_usd": float(data.get("total_cost_usd", 0.0) or 0.0),
183
+ },
184
+ )
185
+
186
+
47
187
  class MockProvider:
48
188
  """Deterministic provider — makes the executor fully testable with no API.
49
189
 
@@ -173,17 +313,26 @@ class ClaudeProvider:
173
313
  ) from exc
174
314
 
175
315
  client = anthropic.Anthropic(api_key=self._api_key) # reads env if None
176
- prompt = req.prompt
177
- if req.role in ("oracle", "manager", "aisb"):
178
- prompt += (
179
- "\n\nRespond with a JSON array of subtasks, each "
180
- '{"role":"worker","spec":{"task":"..."}}. JSON only.'
181
- )
182
- msg = client.messages.create(
183
- model=self._model,
184
- max_tokens=4096,
185
- messages=[{"role": "user", "content": prompt}],
186
- )
316
+ # Envelope path: when the executor passes an explicit `system`, use it
317
+ # verbatim and send the user prompt as-is. Otherwise fall back to the
318
+ # legacy single-message form so old callers keep working.
319
+ kwargs: dict[str, Any] = {
320
+ "model": self._model,
321
+ "max_tokens": 4096,
322
+ "messages": [{"role": "user", "content": req.prompt}],
323
+ }
324
+ if req.system:
325
+ kwargs["system"] = req.system
326
+ elif req.role in ("oracle", "manager", "aisb"):
327
+ # Legacy minimal dispatcher hint, only when no envelope was built.
328
+ kwargs["messages"] = [{
329
+ "role": "user",
330
+ "content": req.prompt + (
331
+ "\n\nRespond with a JSON array of subtasks, each "
332
+ '{"role":"worker","spec":{"task":"..."}}. JSON only.'
333
+ ),
334
+ }]
335
+ msg = client.messages.create(**kwargs)
187
336
  text = "".join(
188
337
  b.text for b in msg.content if getattr(b, "type", "") == "text"
189
338
  )
@@ -0,0 +1,151 @@
1
+ """`omega prune` — bound the growth of runtime SQLite stores.
2
+
3
+ Three stores grow forever today:
4
+
5
+ * ``Agentik_Runtime/eventlog/omega.db`` (mission events)
6
+ * ``Agentik_Runtime/audits.db`` (forensic-audit history)
7
+ * ``Agentik_Runtime/telegram-history.db`` (per-topic chat history)
8
+
9
+ Plus the per-task ``Agentik_Runtime/sessions/<task_id>/`` directories.
10
+
11
+ This module is the bounded-growth control. Every operation has:
12
+ * A ``dry_run`` mode that reports what WOULD be deleted (default
13
+ behaviour from the CLI is dry-run; ``--yes`` enacts).
14
+ * An explicit "older than" cutoff (no implicit "keep last N").
15
+ * Per-DB transaction so a crash mid-prune leaves the DB consistent.
16
+
17
+ Tests cover both modes: a dry-run never mutates, and a real prune drops
18
+ exactly the rows we promised.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import shutil
23
+ import sqlite3
24
+ import time
25
+ from dataclasses import dataclass
26
+ from pathlib import Path
27
+
28
+
29
+ @dataclass
30
+ class PruneReport:
31
+ target: str
32
+ rows_deleted: int = 0
33
+ files_deleted: int = 0
34
+ bytes_freed: int = 0
35
+ dry_run: bool = False
36
+ detail: str = ""
37
+
38
+
39
+ def _prune_table(
40
+ db_path: Path, table: str, cutoff_seconds: int,
41
+ *, time_column: str = "timestamp", dry_run: bool = False,
42
+ ) -> int:
43
+ """Delete rows older than `cutoff_seconds` from `table`. Returns rowcount."""
44
+ if not db_path.exists():
45
+ return 0
46
+ cutoff = int(time.time()) - cutoff_seconds
47
+ conn = sqlite3.connect(str(db_path))
48
+ try:
49
+ if dry_run:
50
+ cur = conn.execute(
51
+ f"SELECT COUNT(*) FROM {table} WHERE {time_column} < ?",
52
+ (cutoff,),
53
+ )
54
+ return int(cur.fetchone()[0])
55
+ cur = conn.execute(
56
+ f"DELETE FROM {table} WHERE {time_column} < ?",
57
+ (cutoff,),
58
+ )
59
+ conn.commit()
60
+ return cur.rowcount or 0
61
+ except sqlite3.OperationalError:
62
+ # Table missing — nothing to prune.
63
+ return 0
64
+ finally:
65
+ conn.close()
66
+
67
+
68
+ def prune_events(
69
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
70
+ ) -> PruneReport:
71
+ """Drop mission events older than `older_than_days`."""
72
+ home = Path(omega_home)
73
+ db = home / "Agentik_Runtime" / "eventlog" / "omega.db"
74
+ n = _prune_table(db, "events", older_than_days * 86400,
75
+ time_column="ts", dry_run=dry_run)
76
+ return PruneReport(
77
+ target="events", rows_deleted=n, dry_run=dry_run,
78
+ detail=f"older_than={older_than_days}d",
79
+ )
80
+
81
+
82
+ def prune_audits(
83
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
84
+ ) -> PruneReport:
85
+ home = Path(omega_home)
86
+ db = home / "Agentik_Runtime" / "audits.db"
87
+ n = _prune_table(db, "audit_runs", older_than_days * 86400,
88
+ time_column="timestamp", dry_run=dry_run)
89
+ return PruneReport(
90
+ target="audits", rows_deleted=n, dry_run=dry_run,
91
+ detail=f"older_than={older_than_days}d",
92
+ )
93
+
94
+
95
+ def prune_telegram(
96
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
97
+ ) -> PruneReport:
98
+ home = Path(omega_home)
99
+ db = home / "Agentik_Runtime" / "telegram-history.db"
100
+ n = _prune_table(db, "messages", older_than_days * 86400,
101
+ time_column="timestamp", dry_run=dry_run)
102
+ return PruneReport(
103
+ target="telegram", rows_deleted=n, dry_run=dry_run,
104
+ detail=f"older_than={older_than_days}d",
105
+ )
106
+
107
+
108
+ def prune_sessions(
109
+ omega_home: str | Path, *, older_than_days: int, dry_run: bool = False,
110
+ ) -> PruneReport:
111
+ """Remove per-task session dirs whose newest file is older than the cutoff."""
112
+ home = Path(omega_home)
113
+ sess_root = home / "Agentik_Runtime" / "sessions"
114
+ if not sess_root.is_dir():
115
+ return PruneReport(target="sessions", dry_run=dry_run)
116
+ cutoff = time.time() - older_than_days * 86400
117
+ n = 0
118
+ bytes_freed = 0
119
+ for child in sess_root.iterdir():
120
+ if not child.is_dir():
121
+ continue
122
+ # newest file mtime under this dir
123
+ newest = max(
124
+ (p.stat().st_mtime for p in child.rglob("*") if p.is_file()),
125
+ default=child.stat().st_mtime,
126
+ )
127
+ if newest >= cutoff:
128
+ continue
129
+ # measure size before delete (for dry-run)
130
+ sz = sum(p.stat().st_size for p in child.rglob("*") if p.is_file())
131
+ if not dry_run:
132
+ shutil.rmtree(child, ignore_errors=True)
133
+ n += 1
134
+ bytes_freed += sz
135
+ return PruneReport(
136
+ target="sessions", files_deleted=n, bytes_freed=bytes_freed,
137
+ dry_run=dry_run, detail=f"older_than={older_than_days}d",
138
+ )
139
+
140
+
141
+ def prune_all(
142
+ omega_home: str | Path, *, older_than_days: int = 90,
143
+ dry_run: bool = False,
144
+ ) -> list[PruneReport]:
145
+ """One call to prune everything to the same cutoff."""
146
+ return [
147
+ prune_events(omega_home, older_than_days=older_than_days, dry_run=dry_run),
148
+ prune_audits(omega_home, older_than_days=older_than_days, dry_run=dry_run),
149
+ prune_telegram(omega_home, older_than_days=older_than_days, dry_run=dry_run),
150
+ prune_sessions(omega_home, older_than_days=older_than_days, dry_run=dry_run),
151
+ ]