@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
+ """Tmux orchestration — the same session-naming + categorisation pattern
2
+ the live VPS uses, but first-class in OmegaOS.
3
+
4
+ Session naming convention (mirrors AISB):
5
+
6
+ * ``AISB-*`` — the AISB master agent(s)
7
+ * ``<Project>-oracle`` — a project's Oracle
8
+ * ``<Project>-oracle-N`` — additional oracles (N > 1) on the same project
9
+ * ``<Project>-worker-N-<task>`` — a worker dispatched by oracle N
10
+ * ``<Project>-dev-<task>`` — direct development sessions
11
+ * ``<Project>-fix-<linear-id>`` — Linear-feedback fix sessions
12
+ * ``<Project>-linear`` — the Linear-mission orchestrator
13
+ * ``Home``, ``Home-2``, ``Home-3`` — interactive operator sessions
14
+ * everything else — "other"
15
+
16
+ Surface
17
+ -------
18
+
19
+ ``list_sessions(omega_home)`` → list[TmuxSession]
20
+ ``categorize(name)`` → category string
21
+ ``spawn(name, *, command, cwd)`` → start a detached session
22
+ ``attach_command(name)`` → the shell string the user runs to attach
23
+ ``kill(name)`` → tmux kill-session
24
+ ``is_alive(name)`` → bool
25
+ ``health_report(omega_home)`` → summary for `omega tmux health`
26
+
27
+ Why this lives in the engine (not as a shell script): we want the same
28
+ classifier the doctor uses, the menu uses, the audit-patrol uses, and
29
+ the upcoming AISB-as-chat layer uses.
30
+ """
31
+ from __future__ import annotations
32
+
33
+ import os
34
+ import re
35
+ import shutil
36
+ import subprocess
37
+ import time
38
+ from dataclasses import dataclass
39
+ from pathlib import Path
40
+
41
+
42
+ # ---------------------------------------------------------------------------
43
+ # Categorisation
44
+ # ---------------------------------------------------------------------------
45
+
46
+
47
+ CATEGORIES = ("aisb", "oracle", "worker", "dev", "linear", "home", "other")
48
+
49
+
50
+ _AISB_RE = re.compile(r"^(AISB|aisb)")
51
+ # Two oracle conventions: `Project-oracle[-N]` AND `oracle-Project`.
52
+ # The live VPS uses both depending on who spawned it.
53
+ _ORACLE_RE = re.compile(
54
+ r"^(?:(?P<proj1>[A-Za-z0-9_-]+?)-oracle(?:-\d+)?"
55
+ r"|oracle-(?P<proj2>[A-Za-z0-9_-]+?))$"
56
+ )
57
+ _WORKER_RE = re.compile(
58
+ r"^(?P<proj>[A-Za-z0-9_-]+?)-(?:oracle-\d+-)?worker-\d+-(?P<task>.+)$"
59
+ )
60
+ _DEV_RE = re.compile(r"^(?P<proj>[A-Za-z0-9_-]+?)-(?:dev|fix|work)-")
61
+ _LINEAR_RE = re.compile(r"^(?P<proj>[A-Za-z0-9_-]+?)-linear$")
62
+ _HOME_RE = re.compile(r"^Home(?:-\d+|-[a-z]+)?$")
63
+
64
+
65
+ def categorize(name: str) -> str:
66
+ """Return a single-token category for a tmux session name."""
67
+ if _AISB_RE.match(name):
68
+ return "aisb"
69
+ if _ORACLE_RE.match(name):
70
+ return "oracle"
71
+ if _WORKER_RE.match(name):
72
+ return "worker"
73
+ if _DEV_RE.match(name):
74
+ return "dev"
75
+ if _LINEAR_RE.match(name):
76
+ return "linear"
77
+ if _HOME_RE.match(name):
78
+ return "home"
79
+ return "other"
80
+
81
+
82
+ def project_from(name: str) -> str | None:
83
+ """Best-effort project name extraction from a session name."""
84
+ m = _ORACLE_RE.match(name)
85
+ if m:
86
+ return m.group("proj1") or m.group("proj2")
87
+ for pat in (_WORKER_RE, _DEV_RE, _LINEAR_RE):
88
+ m = pat.match(name)
89
+ if m and "proj" in m.groupdict():
90
+ return m.group("proj")
91
+ return None
92
+
93
+
94
+ # ---------------------------------------------------------------------------
95
+ # Data model
96
+ # ---------------------------------------------------------------------------
97
+
98
+
99
+ @dataclass
100
+ class TmuxSession:
101
+ name: str
102
+ category: str
103
+ project: str | None
104
+ attached: bool
105
+ windows: int
106
+ created: int # unix seconds
107
+
108
+
109
+ # ---------------------------------------------------------------------------
110
+ # Subprocess helpers
111
+ # ---------------------------------------------------------------------------
112
+
113
+
114
+ def _have_tmux() -> bool:
115
+ return shutil.which("tmux") is not None
116
+
117
+
118
+ def _tmux(*args: str, check: bool = False, timeout: int = 15) -> tuple[int, str]:
119
+ """Run `tmux <args>` and return (exit, stdout)."""
120
+ if not _have_tmux():
121
+ return 1, ""
122
+ try:
123
+ proc = subprocess.run(
124
+ ["tmux", *args],
125
+ check=False, capture_output=True, text=True, timeout=timeout,
126
+ )
127
+ except (OSError, subprocess.SubprocessError) as exc:
128
+ return 1, str(exc)
129
+ out = (proc.stdout or "") + (proc.stderr or "")
130
+ if check and proc.returncode != 0:
131
+ raise RuntimeError(f"tmux {' '.join(args)}: {out.strip()[:200]}")
132
+ return proc.returncode, out
133
+
134
+
135
+ # ---------------------------------------------------------------------------
136
+ # Public API
137
+ # ---------------------------------------------------------------------------
138
+
139
+
140
+ def list_sessions(omega_home: str | Path | None = None) -> list[TmuxSession]:
141
+ """Parse `tmux ls -F` into structured rows.
142
+
143
+ Sessions are returned in the order tmux gives them (creation order in
144
+ most setups). When tmux isn't installed or no server is running, we
145
+ return an empty list — never raise.
146
+ """
147
+ fmt = (
148
+ "#{session_name}\t#{session_attached}\t#{session_windows}\t"
149
+ "#{session_created}"
150
+ )
151
+ rc, out = _tmux("list-sessions", "-F", fmt)
152
+ if rc != 0:
153
+ return []
154
+ rows: list[TmuxSession] = []
155
+ for line in out.splitlines():
156
+ parts = line.strip().split("\t")
157
+ if len(parts) < 4:
158
+ continue
159
+ name, attached, windows, created = parts[0], parts[1], parts[2], parts[3]
160
+ rows.append(TmuxSession(
161
+ name=name,
162
+ category=categorize(name),
163
+ project=project_from(name),
164
+ attached=str(attached) not in ("", "0"),
165
+ windows=int(windows or 1),
166
+ created=int(created or 0),
167
+ ))
168
+ return rows
169
+
170
+
171
+ def is_alive(name: str) -> bool:
172
+ rc, _ = _tmux("has-session", "-t", name)
173
+ return rc == 0
174
+
175
+
176
+ def attach_command(name: str) -> str:
177
+ """The exact shell command the user runs to attach (we never call
178
+ `tmux attach` from a non-interactive context — it would hijack
179
+ stdin/stdout)."""
180
+ return f"tmux attach -t {name}"
181
+
182
+
183
+ def kill(name: str) -> bool:
184
+ rc, _ = _tmux("kill-session", "-t", name)
185
+ return rc == 0
186
+
187
+
188
+ def spawn(
189
+ name: str, *,
190
+ command: str | None = None,
191
+ cwd: str | Path | None = None,
192
+ detached: bool = True,
193
+ ) -> bool:
194
+ """Create a new tmux session. Returns True on success.
195
+
196
+ Uses ``tmux new-session -d -s <name> [-c <cwd>] [<cmd>]``. When
197
+ ``command`` is None, an interactive shell is launched (the default).
198
+ Refuses to overwrite an existing session of the same name.
199
+ """
200
+ if is_alive(name):
201
+ return False
202
+ args = ["new-session"]
203
+ if detached:
204
+ args.append("-d")
205
+ args += ["-s", name]
206
+ if cwd:
207
+ args += ["-c", str(cwd)]
208
+ if command:
209
+ args.append(command)
210
+ rc, _ = _tmux(*args)
211
+ return rc == 0
212
+
213
+
214
+ def spawn_oracle(project: str, *, cwd: str | Path | None = None,
215
+ oracle_id: int = 1) -> str:
216
+ """Spawn an Oracle session for ``project`` and return its name."""
217
+ name = f"{project}-oracle" if oracle_id == 1 else f"{project}-oracle-{oracle_id}"
218
+ spawn(name, cwd=cwd)
219
+ return name
220
+
221
+
222
+ def spawn_worker(project: str, task: str, *,
223
+ cwd: str | Path | None = None,
224
+ oracle_id: int = 1, worker_id: int = 1) -> str:
225
+ """Spawn a worker session and return its name."""
226
+ if oracle_id == 1:
227
+ name = f"{project}-worker-{worker_id}-{task}"
228
+ else:
229
+ name = f"{project}-oracle-{oracle_id}-worker-{worker_id}-{task}"
230
+ spawn(name, cwd=cwd)
231
+ return name
232
+
233
+
234
+ def spawn_aisb_chat(omega_home: str | Path | None = None) -> str:
235
+ """Spawn an AISB chat session — the Telegram-conversation fallback.
236
+
237
+ Runs ``omega aisb chat-loop`` inside the session so the user can
238
+ attach and have a conversation with the AISB master agent without
239
+ needing Telegram connectivity.
240
+ """
241
+ name = "AISB-chat"
242
+ home = Path(omega_home or os.environ.get("OMEGA_HOME")
243
+ or Path.home() / "Omega")
244
+ omega_bin = home / "Agentik_Tools" / "bin" / "omega"
245
+ spawn(name, command=f"{omega_bin} aisb chat-loop")
246
+ return name
247
+
248
+
249
+ # ---------------------------------------------------------------------------
250
+ # Categorised view + health
251
+ # ---------------------------------------------------------------------------
252
+
253
+
254
+ def grouped(sessions: list[TmuxSession]) -> dict[str, list[TmuxSession]]:
255
+ """Group sessions by category, preserving order within each group."""
256
+ out: dict[str, list[TmuxSession]] = {c: [] for c in CATEGORIES}
257
+ for s in sessions:
258
+ out.setdefault(s.category, []).append(s)
259
+ return out
260
+
261
+
262
+ def health_report(omega_home: str | Path | None = None) -> dict:
263
+ """Summarise the session population for `omega tmux health` and doctor."""
264
+ if not _have_tmux():
265
+ return {"tmux_installed": False, "sessions": 0,
266
+ "by_category": {}, "stale": []}
267
+ sessions = list_sessions(omega_home)
268
+ by_cat = {cat: [s.name for s in lst]
269
+ for cat, lst in grouped(sessions).items() if lst}
270
+ # "Stale" heuristic: detached worker sessions older than 6h.
271
+ now = int(time.time())
272
+ stale = [
273
+ s.name for s in sessions
274
+ if s.category == "worker" and not s.attached
275
+ and (now - s.created) > 6 * 3600
276
+ ]
277
+ return {
278
+ "tmux_installed": True,
279
+ "sessions": len(sessions),
280
+ "attached": sum(1 for s in sessions if s.attached),
281
+ "by_category": by_cat,
282
+ "stale": stale,
283
+ }
284
+
285
+
286
+ def cleanup_stale(omega_home: str | Path | None = None,
287
+ *, older_than_hours: int = 24,
288
+ dry_run: bool = True) -> dict:
289
+ """Best-effort cleanup of stale detached worker sessions.
290
+
291
+ By default this is a dry-run (returns the list of candidates without
292
+ killing). Pass ``dry_run=False`` to actually kill them.
293
+ """
294
+ sessions = list_sessions(omega_home)
295
+ now = int(time.time())
296
+ candidates = [
297
+ s for s in sessions
298
+ if s.category == "worker"
299
+ and not s.attached
300
+ and (now - s.created) > older_than_hours * 3600
301
+ ]
302
+ killed: list[str] = []
303
+ if not dry_run:
304
+ for s in candidates:
305
+ if kill(s.name):
306
+ killed.append(s.name)
307
+ return {
308
+ "candidates": [s.name for s in candidates],
309
+ "killed": killed,
310
+ "dry_run": dry_run,
311
+ }
312
+
313
+
314
+ # ---------------------------------------------------------------------------
315
+ # Default tmux config
316
+ # ---------------------------------------------------------------------------
317
+
318
+
319
+ _DEFAULT_CONFIG = """\
320
+ # ════════════════════════════════════════════════════════════════════
321
+ # OmegaOS — recommended tmux config (minimal)
322
+ # Drop this file at ~/.tmux.conf (or source it from your existing one).
323
+ # ════════════════════════════════════════════════════════════════════
324
+
325
+ # Base — 256 colours + true colour
326
+ set -g default-terminal "tmux-256color"
327
+ set -ag terminal-overrides ",xterm-256color:RGB"
328
+
329
+ # Sane indexing
330
+ set -g base-index 1
331
+ setw -g pane-base-index 1
332
+ set -g renumber-windows on
333
+ set -g history-limit 100000
334
+
335
+ # Mouse on (scroll, resize, click sessions)
336
+ set -g mouse on
337
+
338
+ # Faster than default — important for vim/claude
339
+ set -s escape-time 10
340
+
341
+ # ════════════════════════════════════════════════════════════════════
342
+ # Prefix+Z — OmegaOS session picker
343
+ # Opens a tmux popup with `omega tmux menu` so you can attach to any
344
+ # session (AISB / oracle / worker / dev / linear / home / other) without
345
+ # leaving tmux.
346
+ # ════════════════════════════════════════════════════════════════════
347
+ bind-key Z display-popup -E -w 80% -h 80% "omega tmux menu"
348
+
349
+ # Prefix+S — native session list (tmux's built-in choose-tree)
350
+ bind-key S choose-tree -Zs
351
+
352
+ # ════════════════════════════════════════════════════════════════════
353
+ # Visual cues per session category
354
+ # ════════════════════════════════════════════════════════════════════
355
+ set -g status-style "bg=#1a1a2e,fg=#eee"
356
+ set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
357
+ set -g status-right "#[fg=#888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
358
+ """
359
+
360
+
361
+ # OmegaOS PRO tmux config — distilled from the live VPS conf (293 lines)
362
+ # down to the parts that aren't tied to AISB-specific scripts. Operators
363
+ # get it via `omega tmux install --full`. We preserve the bits that
364
+ # matter for any 24/7 agent VPS:
365
+ #
366
+ # * Termius paste fix (the assume-paste-time=0 + buffer-limit dance
367
+ # that prevents the PTY deadlock on large pastes — discovered the
368
+ # hard way on the live VPS).
369
+ # * Session-kill forensics — every session-closed + pane-died lands in
370
+ # ``$OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log`` so a
371
+ # mystery dead worker leaves a trace.
372
+ # * Smart scroll — when a pane is in alt-screen (Claude Code TUI),
373
+ # scrolling enters copy-mode instead of forwarding raw mouse
374
+ # sequences (which would print as garbage in claude).
375
+ # * Extended keys + clipboard OSC 52 — modern terminals work right.
376
+ #
377
+ # References live conf at ~/.tmux.conf on the live VPS as of 2026-05-25.
378
+ _PRO_CONFIG = """\
379
+ # ══════════════════════════════════════════════════════════════
380
+ # OmegaOS — PRO tmux config (full polish for 24/7 agent VPS)
381
+ # Generated by `omega tmux install --full`.
382
+ # ══════════════════════════════════════════════════════════════
383
+
384
+ # ====== SESSION KILL FORENSICS ======
385
+ # Every session-closed + pane-died lands in the log — a mystery dead
386
+ # worker leaves a trace.
387
+ set-hook -g session-closed "run-shell 'echo \\"[$(date -Iseconds)] SESSION CLOSED\\" >> $OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log'"
388
+ set-hook -g pane-died "run-shell 'echo \\"[$(date -Iseconds)] PANE DIED session=#{session_name} pane=#{pane_id}\\" >> $OMEGA_HOME/Agentik_Extra/var/logs/tmux-session-kills.log'"
389
+
390
+ # ====== TERMINAL ======
391
+ set -g default-terminal "tmux-256color"
392
+ set -s terminal-overrides "linux*:AX@,xterm-256color:Tc:Ms=,xterm:Tc:Ms="
393
+ set -s terminal-features "xterm*:clipboard:ccolour:title,screen*:title,rxvt*:ignorefkeys"
394
+ set -q -g status-utf8 on
395
+ setw -q -g utf8 on
396
+
397
+ # ====== BASIC ======
398
+ set -g base-index 1
399
+ setw -g pane-base-index 1
400
+ set -g renumber-windows on
401
+ set -g history-limit 100000
402
+
403
+ # ====== LARGE PASTE FIX (Termius / SSH apps) ======
404
+ # tmux 3.5a buffers paste input + writes it all at once → PTY deadlock.
405
+ # assume-paste-time=0 disables the grouping; chars write individually
406
+ # (slower but cannot deadlock).
407
+ set -s buffer-limit 100
408
+ set -g assume-paste-time 0
409
+ set -s set-clipboard on
410
+ set -g allow-passthrough off
411
+ set -s message-limit 500
412
+
413
+ # ====== ALT-SCREEN + FOCUS EVENTS ======
414
+ # Alt-screen on prevents paste-freezes on Claude Code TUI.
415
+ setw -g alternate-screen on
416
+ # Focus events OFF — Termius leaks \\e[I / \\e[O as garbage characters.
417
+ set -g focus-events off
418
+ # Extended keys on so modern key sequences resolve properly.
419
+ set -g extended-keys on
420
+ set -s escape-time 10
421
+
422
+ # ====== MOUSE + SMART SCROLL ======
423
+ # When a pane is in alt-screen (Claude Code TUI), scroll up → enter
424
+ # copy-mode. Prevents raw mouse sequences from leaking as garbage.
425
+ set -g mouse on
426
+ bind-key -T copy-mode-vi WheelUpPane send -X scroll-up
427
+ bind-key -T copy-mode-vi WheelDownPane send -X scroll-down
428
+ # Auto-exit copy-mode after a brief idle so the operator goes back to
429
+ # typing without thinking about it.
430
+ set -g @scroll-without-changing-pane on
431
+
432
+ # ════════════════════════════════════════════════════════════════════
433
+ # Prefix+Z — OmegaOS session picker
434
+ # Opens a tmux popup with `omega tmux menu`.
435
+ # ════════════════════════════════════════════════════════════════════
436
+ bind-key Z display-popup -E -w 80% -h 80% "omega tmux menu"
437
+
438
+ # Prefix+S — native choose-tree
439
+ bind-key S choose-tree -Zs
440
+
441
+ # Prefix+R — reload this config without leaving tmux
442
+ bind-key r source-file ~/.tmux.conf \\; display-message "tmux.conf reloaded"
443
+
444
+ # ════════════════════════════════════════════════════════════════════
445
+ # Visual cues per session category — colour the status bar by name.
446
+ # ════════════════════════════════════════════════════════════════════
447
+ set -g status-style "bg=#1a1a2e,fg=#eee"
448
+ set -g status-left "#[fg=#7aa2f7,bold]#S #[fg=default]│ "
449
+ set -g status-right "#[fg=#888]%H:%M │ #(omega tmux count 2>/dev/null) sessions"
450
+ set -g status-interval 5
451
+ set -g status-left-length 40
452
+ set -g status-right-length 60
453
+
454
+ # Pane border colour — softer than default red
455
+ set -g pane-border-style "fg=#333"
456
+ set -g pane-active-border-style "fg=#7aa2f7"
457
+ """
458
+
459
+
460
+ def write_default_config(
461
+ target: str | Path | None = None,
462
+ *,
463
+ profile: str = "minimal",
464
+ ) -> Path:
465
+ """Write a tmux config to ``target``.
466
+
467
+ ``profile``:
468
+ * ``"minimal"`` (default) — ~30 lines, just prefix+Z + status bar.
469
+ * ``"pro"`` — full ~80 lines with paste-fix Termius, kill
470
+ forensics, smart scroll, extended keys, OSC 52
471
+ clipboard. Best for 24/7 agent VPS.
472
+
473
+ Default target is ``$OMEGA_HOME/Agentik_Tools/tmux.conf`` — the
474
+ operator decides whether to `source` it from their main `~/.tmux.conf`
475
+ or replace theirs entirely. We never silently overwrite ``~/.tmux.conf``.
476
+ Use :func:`install_into_home_tmux_conf` to do that explicitly + with
477
+ backup.
478
+ """
479
+ if target is None:
480
+ home = Path(os.environ.get("OMEGA_HOME",
481
+ str(Path.home() / "Omega")))
482
+ target = home / "Agentik_Tools" / "tmux.conf"
483
+ target = Path(target)
484
+ target.parent.mkdir(parents=True, exist_ok=True)
485
+ content = _PRO_CONFIG if profile == "pro" else _DEFAULT_CONFIG
486
+ target.write_text(content)
487
+ return target
488
+
489
+
490
+ def install_into_home_tmux_conf(
491
+ *,
492
+ profile: str = "pro",
493
+ backup: bool = True,
494
+ omega_home: str | Path | None = None,
495
+ ) -> dict[str, str]:
496
+ """Write the chosen config to ``~/.tmux.conf`` with a timestamped backup.
497
+
498
+ Returns ``{written, backup_path, profile}``. Idempotent — re-running
499
+ keeps producing fresh backups so the operator can revert.
500
+ """
501
+ import shutil as _sh
502
+ import time as _t
503
+ home_conf = Path.home() / ".tmux.conf"
504
+ backup_path = ""
505
+ if home_conf.exists() and backup:
506
+ ts = _t.strftime("%Y%m%d-%H%M%S")
507
+ backup_path = str(home_conf.with_suffix(f".conf.bak.{ts}"))
508
+ _sh.copy2(home_conf, backup_path)
509
+ content = _PRO_CONFIG if profile == "pro" else _DEFAULT_CONFIG
510
+ home_conf.write_text(content)
511
+ # Also drop it under $OMEGA_HOME so `omega tmux install` is the
512
+ # single source of truth that the engine sync mechanism can refresh.
513
+ _ = write_default_config(omega_home=None) if False else None
514
+ home = Path(omega_home or os.environ.get(
515
+ "OMEGA_HOME", str(Path.home() / "Omega")
516
+ ))
517
+ bundled = home / "Agentik_Tools" / "tmux.conf"
518
+ bundled.parent.mkdir(parents=True, exist_ok=True)
519
+ bundled.write_text(content)
520
+ return {
521
+ "written": str(home_conf),
522
+ "backup_path": backup_path,
523
+ "bundled_copy": str(bundled),
524
+ "profile": profile,
525
+ }
526
+ return target