@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,526 @@
1
+ """Worker dispatcher — spawn each worker as its own persistent `claude`
2
+ session in tmux, mirroring the live VPS pattern.
3
+
4
+ Architecture
5
+ ------------
6
+
7
+ Today the executor runs workers synchronously: ``provider.run(...)`` blocks
8
+ until the model responds, then the executor moves on. If the engine /
9
+ Telegram bot / supervisor crashes mid-mission, every in-flight worker
10
+ dies with it.
11
+
12
+ The VPS pattern fixes this: each worker is a complete ``claude`` CLI
13
+ running inside its own tmux session. The session is detached, has its
14
+ own PTY, and survives parent crashes. A 4-hour coding mission keeps
15
+ making progress even if everything else falls over.
16
+
17
+ Protocol
18
+ --------
19
+
20
+ The orchestrator (Oracle, dispatcher, or operator) calls
21
+ ``spawn_worker(...)`` with the brief. We:
22
+
23
+ 1. Write the brief to
24
+ ``Agentik_Runtime/sessions/<task_id>/brief.json``
25
+ 2. Create a detached tmux session named
26
+ ``<Project>-worker-<N>-<task>``
27
+ 3. The session immediately runs ``omega worker run <task_id>`` —
28
+ reads its brief, calls Claude with the envelope, writes the
29
+ ``.done.json`` on completion.
30
+
31
+ The orchestrator returns immediately; the mission monitor (or the
32
+ operator) polls ``.done.json`` to know when each worker is done.
33
+
34
+ Why per-call ``claude``, not interactive
35
+ ----------------------------------------
36
+
37
+ For predictable completion + structured output, the worker runs:
38
+
39
+ claude -p "<user>" --append-system-prompt "<system>"
40
+ --model "<model>" --output-format json
41
+ --dangerously-skip-permissions
42
+
43
+ This returns one JSON blob with ``result``, ``usage``, ``total_cost_usd``,
44
+ ``session_id``. The worker parses it and writes a structured
45
+ ``.done.json``. If the operator wants interactive (the worker asks the
46
+ oracle questions mid-task), the same brief.json can drive that mode in
47
+ a later iteration.
48
+
49
+ Model selection
50
+ ---------------
51
+
52
+ By default:
53
+
54
+ * role=``oracle`` / ``manager`` / ``aisb`` → ``sonnet`` (fast planner)
55
+ * role=``worker`` / ``construct`` → ``opus`` (1M context coding)
56
+ * role=``audit`` / ``verifier`` / ``seraph`` → ``sonnet``
57
+ * role=``haiku-*`` (cost-routed cheap roles) → ``haiku``
58
+
59
+ This is the smart-routing default — overridable via the brief's ``model``
60
+ field for explicit control.
61
+ """
62
+ from __future__ import annotations
63
+
64
+ import json
65
+ import os
66
+ import re
67
+ import shlex
68
+ import shutil
69
+ import subprocess
70
+ import sys
71
+ import time
72
+ import uuid
73
+ from dataclasses import dataclass, field
74
+ from pathlib import Path
75
+ from typing import Any
76
+
77
+
78
+ # ---------------------------------------------------------------------------
79
+ # Hardening — input validation for shell-bound identifiers
80
+ # ---------------------------------------------------------------------------
81
+
82
+ # task_id is interpolated into a tmux command line + used as a directory
83
+ # name. We accept ONLY a-zA-Z0-9._- — anything else can break out of the
84
+ # argument or escape the path. Bug history: prior to this guard,
85
+ # `--task-id "t; touch /tmp/PWNED"` executed the second command.
86
+ _TASK_ID_RE = re.compile(r"^[A-Za-z0-9._-]{1,128}$")
87
+
88
+
89
+ def _validate_task_id(task_id: str) -> str:
90
+ if not isinstance(task_id, str) or not _TASK_ID_RE.match(task_id):
91
+ raise ValueError(
92
+ f"invalid task_id {task_id!r} — must match [A-Za-z0-9._-]{{1,128}}"
93
+ )
94
+ return task_id
95
+
96
+
97
+ # ---------------------------------------------------------------------------
98
+ # Default model per role
99
+ # ---------------------------------------------------------------------------
100
+
101
+ _ROLE_MODEL: dict[str, str] = {
102
+ # Dispatchers — fast planners
103
+ "oracle": "sonnet",
104
+ "manager": "sonnet",
105
+ "aisb": "sonnet",
106
+ "architect": "sonnet",
107
+ # Executors doing real coding work → opus with 1M context window
108
+ "worker": "claude-opus-4-7[1m]",
109
+ "construct": "claude-opus-4-7[1m]",
110
+ "link": "sonnet",
111
+ # Verifiers — fast structured judgement
112
+ "audit": "sonnet",
113
+ "verifier": "sonnet",
114
+ "seraph": "sonnet",
115
+ # Cheap classifier / triage roles
116
+ "classifier": "haiku",
117
+ "triage": "haiku",
118
+ }
119
+
120
+
121
+ def default_model_for_role(role: str) -> str:
122
+ """The default Claude Code Max model for a role. Falls back to sonnet."""
123
+ return _ROLE_MODEL.get(role, "sonnet")
124
+
125
+
126
+ # ---------------------------------------------------------------------------
127
+ # Brief / done.json paths
128
+ # ---------------------------------------------------------------------------
129
+
130
+
131
+ def _omega_home() -> Path:
132
+ return Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
133
+
134
+
135
+ def _session_dir(home: Path, task_id: str) -> Path:
136
+ d = home / "Agentik_Runtime" / "sessions" / task_id
137
+ d.mkdir(parents=True, exist_ok=True)
138
+ try:
139
+ os.chmod(d, 0o700)
140
+ except OSError:
141
+ pass
142
+ return d
143
+
144
+
145
+ def brief_path(home: Path | str, task_id: str) -> Path:
146
+ return _session_dir(Path(home), task_id) / "brief.json"
147
+
148
+
149
+ def done_path(home: Path | str, task_id: str) -> Path:
150
+ return _session_dir(Path(home), task_id) / ".done.json"
151
+
152
+
153
+ def transcript_path(home: Path | str, task_id: str) -> Path:
154
+ """Where the raw claude JSON response is stored — useful for debug."""
155
+ return _session_dir(Path(home), task_id) / "transcript.json"
156
+
157
+
158
+ # ---------------------------------------------------------------------------
159
+ # Brief — what the worker reads to know what to do
160
+ # ---------------------------------------------------------------------------
161
+
162
+
163
+ @dataclass
164
+ class WorkerBrief:
165
+ task_id: str
166
+ role: str # "worker" | "construct" | ...
167
+ intent: str # what the worker should do
168
+ system_prompt: str = "" # the envelope's system component
169
+ user_prompt: str = "" # the envelope's user component (fallback: intent)
170
+ model: str = "" # overrides role default if set
171
+ verify_cmd: str | None = None
172
+ project: str | None = None
173
+ cwd: str | None = None
174
+ spawned_at: int = field(default_factory=lambda: int(time.time()))
175
+ mission_id: str = ""
176
+ # Skill palette for this worker. Empty list → use the role default
177
+ # (resolved by ``resolved_skills()``). Set explicitly to ``None`` is
178
+ # equivalent to empty.
179
+ skills: list[str] = field(default_factory=list)
180
+
181
+ def resolved_model(self) -> str:
182
+ return self.model or default_model_for_role(self.role)
183
+
184
+ def resolved_skills(self) -> list[str]:
185
+ """Final skill list — explicit > role default. Used by ``run_brief``
186
+ to weave the skill block into ``--append-system-prompt``."""
187
+ if self.skills:
188
+ return list(self.skills)
189
+ try:
190
+ from omega_engine.skill_routing import recommend
191
+ return recommend(self.role)
192
+ except ImportError:
193
+ return []
194
+
195
+ def to_json(self) -> str:
196
+ return json.dumps({
197
+ "task_id": self.task_id, "role": self.role,
198
+ "intent": self.intent,
199
+ "system_prompt": self.system_prompt,
200
+ "user_prompt": self.user_prompt or self.intent,
201
+ "model": self.resolved_model(),
202
+ "skills": self.resolved_skills(),
203
+ "verify_cmd": self.verify_cmd,
204
+ "project": self.project, "cwd": self.cwd,
205
+ "spawned_at": self.spawned_at,
206
+ "mission_id": self.mission_id,
207
+ }, indent=2)
208
+
209
+ @staticmethod
210
+ def from_dict(d: dict[str, Any]) -> "WorkerBrief":
211
+ return WorkerBrief(
212
+ task_id=str(d["task_id"]),
213
+ role=str(d.get("role", "worker")),
214
+ intent=str(d.get("intent", "")),
215
+ system_prompt=str(d.get("system_prompt", "")),
216
+ user_prompt=str(d.get("user_prompt", "")),
217
+ model=str(d.get("model", "")),
218
+ verify_cmd=d.get("verify_cmd"),
219
+ project=d.get("project"),
220
+ cwd=d.get("cwd"),
221
+ spawned_at=int(d.get("spawned_at", time.time())),
222
+ mission_id=str(d.get("mission_id", "")),
223
+ skills=list(d.get("skills") or []),
224
+ )
225
+
226
+
227
+ def write_brief(home: Path | str, brief: WorkerBrief) -> Path:
228
+ """Persist the brief atomically. Same temp+rename trick as write_done
229
+ so a polling reader never sees a half-written brief."""
230
+ _validate_task_id(brief.task_id)
231
+ p = brief_path(home, brief.task_id)
232
+ tmp = p.with_suffix(p.suffix + ".tmp")
233
+ tmp.write_text(brief.to_json())
234
+ try:
235
+ fd = os.open(str(tmp), os.O_RDONLY)
236
+ try:
237
+ os.fsync(fd)
238
+ finally:
239
+ os.close(fd)
240
+ except OSError:
241
+ pass
242
+ os.replace(tmp, p)
243
+ return p
244
+
245
+
246
+ def read_brief(home: Path | str, task_id: str) -> WorkerBrief:
247
+ p = brief_path(home, task_id)
248
+ if not p.exists():
249
+ raise FileNotFoundError(f"no brief at {p}")
250
+ return WorkerBrief.from_dict(json.loads(p.read_text()))
251
+
252
+
253
+ # ---------------------------------------------------------------------------
254
+ # Spawning the tmux session
255
+ # ---------------------------------------------------------------------------
256
+
257
+
258
+ def _session_name(brief: WorkerBrief, *, worker_id: int = 1) -> str:
259
+ """Build the tmux session name following the AISB convention."""
260
+ project = brief.project or "Omega"
261
+ # Sanitise task component (no spaces, max 40 chars)
262
+ task_label = "".join(
263
+ c if c.isalnum() or c in "-_" else "-" for c in brief.intent[:40]
264
+ ).strip("-") or "task"
265
+ return f"{project}-worker-{worker_id}-{task_label}"
266
+
267
+
268
+ def spawn_worker(
269
+ brief: WorkerBrief, *,
270
+ home: Path | str | None = None,
271
+ worker_id: int = 1,
272
+ omega_bin: str | None = None,
273
+ ) -> str:
274
+ """Persist the brief + spawn a detached tmux session that runs the worker.
275
+
276
+ Returns the tmux session name. The orchestrator returns IMMEDIATELY —
277
+ the worker runs asynchronously in its own session. Poll
278
+ ``.done.json`` (via :func:`read_done`) to know when it's finished.
279
+ """
280
+ # SECURITY: refuse shell-injection vectors before they reach tmux.
281
+ _validate_task_id(brief.task_id)
282
+
283
+ home = Path(home or _omega_home())
284
+ write_brief(home, brief)
285
+ name = _session_name(brief, worker_id=worker_id)
286
+
287
+ if shutil.which("tmux") is None:
288
+ raise RuntimeError("tmux not on PATH — workers can't be spawned async")
289
+
290
+ bin_ = omega_bin or str(
291
+ home / "Agentik_Tools" / "bin" / "omega"
292
+ )
293
+ if not Path(bin_).exists():
294
+ bin_ = shutil.which("omega") or "omega"
295
+
296
+ cwd = brief.cwd or os.getcwd()
297
+ # Build the command via shlex.quote so even a future malformed task_id
298
+ # cannot escape its argument slot. _validate_task_id is the first
299
+ # line of defence; this is the second.
300
+ cmd = " ".join([
301
+ f"OMEGA_HOME={shlex.quote(str(home))}",
302
+ shlex.quote(bin_),
303
+ "worker", "run",
304
+ shlex.quote(brief.task_id),
305
+ ])
306
+
307
+ # Refuse to overwrite an existing live session — that would be a bug.
308
+ proc = subprocess.run(
309
+ ["tmux", "has-session", "-t", name],
310
+ check=False, capture_output=True, timeout=10,
311
+ )
312
+ if proc.returncode == 0:
313
+ # session already exists; treat as idempotent re-spawn.
314
+ return name
315
+
316
+ subprocess.run(
317
+ ["tmux", "new-session", "-d", "-s", name, "-c", cwd, cmd],
318
+ check=True, capture_output=True, text=True, timeout=30,
319
+ )
320
+ return name
321
+
322
+
323
+ # ---------------------------------------------------------------------------
324
+ # Worker entry point (runs INSIDE the tmux session)
325
+ # ---------------------------------------------------------------------------
326
+
327
+
328
+ def run_brief(home: Path | str, task_id: str) -> int:
329
+ """The body of ``omega worker run <task_id>``.
330
+
331
+ Reads the brief, calls ``claude -p`` with the envelope, parses the
332
+ JSON response, writes a structured ``.done.json``. Returns the exit
333
+ code (0 on done_clean, 1 on failure).
334
+ """
335
+ from omega_engine.done_signal import DoneSignal, write_done
336
+
337
+ home = Path(home)
338
+ try:
339
+ brief = read_brief(home, task_id)
340
+ except FileNotFoundError as exc:
341
+ write_done(home, task_id, DoneSignal(
342
+ status="failed",
343
+ summary=f"worker missing brief: {exc}",
344
+ errors=[str(exc)],
345
+ ))
346
+ return 1
347
+
348
+ # Compose the system prompt: explicit system_prompt + the skill block
349
+ # (so the worker knows which slash commands it has access to).
350
+ sys_prompt = brief.system_prompt or ""
351
+ skills = brief.resolved_skills()
352
+ if skills:
353
+ try:
354
+ from omega_engine.skill_routing import format_skill_block
355
+ block = format_skill_block(skills, home=home)
356
+ if block:
357
+ sys_prompt = (sys_prompt + "\n" + block).strip()
358
+ except ImportError:
359
+ pass
360
+
361
+ cmd = [
362
+ "claude", "-p", brief.user_prompt or brief.intent,
363
+ "--output-format", "json",
364
+ "--model", brief.resolved_model(),
365
+ "--dangerously-skip-permissions",
366
+ ]
367
+ if sys_prompt:
368
+ cmd += ["--append-system-prompt", sys_prompt]
369
+ if brief.cwd:
370
+ cmd += ["--add-dir", str(brief.cwd)]
371
+
372
+ print(f"omega worker {task_id}: model={brief.resolved_model()} "
373
+ f"cwd={brief.cwd or os.getcwd()}")
374
+ print(f" intent: {brief.intent[:120]}")
375
+
376
+ started = time.time()
377
+ try:
378
+ proc = subprocess.run(
379
+ cmd, check=False, capture_output=True, text=True,
380
+ timeout=3600, # 1 hour cap per claude call
381
+ cwd=brief.cwd or os.getcwd(),
382
+ )
383
+ except subprocess.TimeoutExpired:
384
+ write_done(home, task_id, DoneSignal(
385
+ status="failed",
386
+ summary="claude -p timed out after 3600s",
387
+ errors=["timeout"],
388
+ ))
389
+ return 1
390
+ except OSError as exc:
391
+ write_done(home, task_id, DoneSignal(
392
+ status="failed",
393
+ summary=f"claude -p failed to launch: {exc}",
394
+ errors=[str(exc)],
395
+ ))
396
+ return 1
397
+
398
+ elapsed = round(time.time() - started, 2)
399
+
400
+ if proc.returncode != 0:
401
+ write_done(home, task_id, DoneSignal(
402
+ status="failed",
403
+ summary=f"claude -p exited {proc.returncode} after {elapsed}s",
404
+ errors=[
405
+ (proc.stderr or proc.stdout or "")[:500],
406
+ ],
407
+ ))
408
+ return 1
409
+
410
+ # Persist the raw transcript for debug.
411
+ transcript_path(home, task_id).write_text(proc.stdout or "")
412
+
413
+ try:
414
+ data = json.loads(proc.stdout or "{}")
415
+ except json.JSONDecodeError as exc:
416
+ write_done(home, task_id, DoneSignal(
417
+ status="failed",
418
+ summary=f"claude -p returned non-JSON: {exc}",
419
+ errors=[(proc.stdout or "")[:500]],
420
+ ))
421
+ return 1
422
+
423
+ text = str(data.get("result", "")).strip()
424
+ usage = data.get("usage", {}) or {}
425
+ cost = float(data.get("total_cost_usd", 0.0) or 0.0)
426
+ sig = DoneSignal(
427
+ status="done_clean",
428
+ summary=text[:1000] or "(no text response)",
429
+ files_changed=[],
430
+ artifacts={
431
+ "session_id": data.get("session_id", ""),
432
+ "model": brief.resolved_model(),
433
+ "elapsed_s": elapsed,
434
+ "usage": {
435
+ "input_tokens": int(usage.get("input_tokens", 0) or 0),
436
+ "output_tokens": int(usage.get("output_tokens", 0) or 0),
437
+ "cost_usd": cost,
438
+ },
439
+ },
440
+ )
441
+ write_done(home, task_id, sig)
442
+ print(f"omega worker {task_id}: done in {elapsed}s, cost ${cost:.4f}")
443
+ return 0
444
+
445
+
446
+ # ---------------------------------------------------------------------------
447
+ # Status / wait / list helpers
448
+ # ---------------------------------------------------------------------------
449
+
450
+
451
+ def worker_status(home: Path | str, task_id: str) -> dict[str, Any]:
452
+ """Read .done.json + tmux state. Returns a single status dict."""
453
+ home = Path(home)
454
+ done = done_path(home, task_id)
455
+ if done.exists():
456
+ try:
457
+ data = json.loads(done.read_text())
458
+ return {
459
+ "task_id": task_id,
460
+ "state": data.get("status", "unknown"),
461
+ "summary": data.get("summary", ""),
462
+ "artifacts": data.get("artifacts", {}),
463
+ "tmux_alive": False,
464
+ "source": ".done.json",
465
+ }
466
+ except json.JSONDecodeError:
467
+ pass
468
+ # No done.json — check tmux
469
+ if shutil.which("tmux"):
470
+ from omega_engine import tmux as tx
471
+ for sess in tx.list_sessions(home):
472
+ # Match by task_id in the session name
473
+ if task_id in sess.name:
474
+ return {
475
+ "task_id": task_id,
476
+ "state": "running",
477
+ "tmux_alive": True,
478
+ "tmux_session": sess.name,
479
+ "source": "tmux",
480
+ }
481
+ return {"task_id": task_id, "state": "unknown", "tmux_alive": False,
482
+ "source": "absent"}
483
+
484
+
485
+ def wait_for_done(
486
+ home: Path | str, task_id: str,
487
+ *, timeout_s: int = 3600, poll_s: int = 5,
488
+ ) -> dict[str, Any]:
489
+ """Block until .done.json exists (or timeout). Returns the final status."""
490
+ end = time.time() + timeout_s
491
+ while time.time() < end:
492
+ status = worker_status(home, task_id)
493
+ if status["state"] in ("done_clean", "pending", "failed"):
494
+ return status
495
+ time.sleep(poll_s)
496
+ return {"task_id": task_id, "state": "timeout", "tmux_alive": False,
497
+ "source": "timeout"}
498
+
499
+
500
+ def list_workers(home: Path | str) -> list[dict[str, Any]]:
501
+ """Scan every per-task session dir. One row per task with a brief."""
502
+ home = Path(home)
503
+ sessions_root = home / "Agentik_Runtime" / "sessions"
504
+ if not sessions_root.is_dir():
505
+ return []
506
+ out: list[dict[str, Any]] = []
507
+ for child in sorted(sessions_root.iterdir()):
508
+ if not child.is_dir():
509
+ continue
510
+ b = child / "brief.json"
511
+ if not b.exists():
512
+ continue
513
+ try:
514
+ brief = WorkerBrief.from_dict(json.loads(b.read_text()))
515
+ except (json.JSONDecodeError, OSError):
516
+ continue
517
+ status = worker_status(home, brief.task_id)
518
+ out.append({
519
+ "task_id": brief.task_id, "role": brief.role,
520
+ "model": brief.resolved_model(),
521
+ "intent": brief.intent[:80],
522
+ "project": brief.project, "spawned_at": brief.spawned_at,
523
+ "state": status["state"],
524
+ "tmux_alive": status.get("tmux_alive", False),
525
+ })
526
+ return out
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "omega-engine"
3
- version = "0.1.0"
3
+ version = "0.19.5"
4
4
  description = "The Omega OS orchestration engine — event-sourced, verified-completion agent graphs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"