@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,469 @@
1
+ """Hermes Desktop adapter — expose OmegaOS as a remote backend.
2
+
3
+ Hermes Desktop (https://github.com/fathah/hermes-desktop) is an
4
+ Electron native app that connects to a Hermes Agent backend. The
5
+ default backend runs at ``http://127.0.0.1:8642``; the app also supports
6
+ **remote backends**: point it at any HTTP server that speaks the same
7
+ ``/api/...`` protocol, plug an API key.
8
+
9
+ This module ships a tiny HTTP server that lets Hermes Desktop drive a
10
+ remote OmegaOS VPS as if it were a local Hermes process. The result:
11
+
12
+ * Operator runs Hermes Desktop on their laptop.
13
+ * Adds a profile pointing at ``https://<vps-domain>:8642`` with the
14
+ bearer token written by ``omega hermes-desktop install``.
15
+ * Every chat message from the desktop UI travels to the VPS, gets
16
+ classified, and is either answered by Hermès directly OR delegated
17
+ down to AISB/Oracle/Workers via ``omega run``.
18
+
19
+ This is the OPPOSITE of Hermes Desktop's default flow (which runs
20
+ Hermès locally). Here Hermès runs on the VPS, the desktop is just a
21
+ window onto it. Why: the operator's heavy AI work happens on the
22
+ 24/7 VPS where the Claude OAuth lives, the audit history accumulates,
23
+ and tmux sessions survive laptop sleep.
24
+
25
+ Routes (Hermes-compatible subset)
26
+ ---------------------------------
27
+
28
+ GET /api/health ok
29
+ GET /api/version {hermes_version, omega_version}
30
+ POST /api/chat {messages, stream} → SSE or JSON
31
+ GET /api/sessions list omega missions
32
+ GET /api/sessions/<id> mission detail
33
+ POST /api/sessions create new mission (delegates to omega run)
34
+ GET /api/skills merged hermes + omega skill catalog
35
+ GET /api/status omega doctor + hermes status snapshot
36
+
37
+ Security
38
+ --------
39
+
40
+ Bearer-token auth via ``Authorization: Bearer <token>``. Token is
41
+ generated at install time and stored at
42
+ ``$OMEGA_HOME/Agentik_Extra/etc/hermes-desktop.token`` (mode 0600).
43
+ Operator copies it into the Hermes Desktop "API key" field.
44
+
45
+ Bound to ``127.0.0.1`` by default — operator MUST forward via SSH
46
+ tunnel or reverse proxy to expose it. We refuse to bind to ``0.0.0.0``
47
+ unless ``--unsafe-public`` is passed (with a loud warning).
48
+ """
49
+ from __future__ import annotations
50
+
51
+ import http.server
52
+ import json
53
+ import os
54
+ import secrets
55
+ import socket
56
+ import socketserver
57
+ import threading
58
+ import time
59
+ from dataclasses import dataclass
60
+ from pathlib import Path
61
+ from typing import Any
62
+
63
+
64
+ _DEFAULT_PORT = 8642 # same as Hermes Desktop's default backend port
65
+ _TOKEN_FILE = "hermes-desktop.token"
66
+ _PROFILE_DIR = "Agentik_Extra/etc"
67
+
68
+
69
+ def _omega_home(explicit: str | Path | None = None) -> Path:
70
+ if explicit is not None:
71
+ return Path(explicit)
72
+ return Path(os.environ.get("OMEGA_HOME", str(Path.home() / "Omega")))
73
+
74
+
75
+ def token_path(omega_home: str | Path | None = None) -> Path:
76
+ return _omega_home(omega_home) / _PROFILE_DIR / _TOKEN_FILE
77
+
78
+
79
+ # ---------------------------------------------------------------------------
80
+ # Token management
81
+ # ---------------------------------------------------------------------------
82
+
83
+
84
+ def generate_token(omega_home: str | Path | None = None) -> str:
85
+ """Create + persist a fresh bearer token (40 hex chars)."""
86
+ p = token_path(omega_home)
87
+ p.parent.mkdir(parents=True, exist_ok=True)
88
+ tok = secrets.token_hex(20)
89
+ p.write_text(tok)
90
+ try:
91
+ os.chmod(p, 0o600)
92
+ except OSError:
93
+ pass
94
+ return tok
95
+
96
+
97
+ def read_token(omega_home: str | Path | None = None) -> str | None:
98
+ p = token_path(omega_home)
99
+ if not p.exists():
100
+ return None
101
+ try:
102
+ return p.read_text().strip() or None
103
+ except OSError:
104
+ return None
105
+
106
+
107
+ # ---------------------------------------------------------------------------
108
+ # Profile manifest — what Hermes Desktop should paste into its config
109
+ # ---------------------------------------------------------------------------
110
+
111
+
112
+ @dataclass
113
+ class DesktopProfile:
114
+ name: str
115
+ base_url: str
116
+ api_key: str
117
+ description: str
118
+
119
+ def to_dict(self) -> dict[str, Any]:
120
+ from dataclasses import asdict
121
+ return asdict(self)
122
+
123
+ def to_json(self) -> str:
124
+ return json.dumps(self.to_dict(), indent=2)
125
+
126
+
127
+ def build_profile(
128
+ *,
129
+ public_url: str | None = None,
130
+ port: int = _DEFAULT_PORT,
131
+ omega_home: str | Path | None = None,
132
+ ) -> DesktopProfile:
133
+ """Build the profile JSON the operator pastes into Hermes Desktop."""
134
+ tok = read_token(omega_home) or generate_token(omega_home)
135
+ base = public_url or f"http://127.0.0.1:{port}"
136
+ return DesktopProfile(
137
+ name="OmegaOS VPS",
138
+ base_url=base,
139
+ api_key=tok,
140
+ description=(
141
+ "OmegaOS-backed Hermès — chat hits the VPS, which delegates "
142
+ "engineering work to AISB → Oracle → Workers (Layer 3-5)."
143
+ ),
144
+ )
145
+
146
+
147
+ # ---------------------------------------------------------------------------
148
+ # HTTP server
149
+ # ---------------------------------------------------------------------------
150
+
151
+
152
+ class _Handler(http.server.BaseHTTPRequestHandler):
153
+ """Hermes-compatible request handler.
154
+
155
+ Implements a SAFE subset of the Hermes API:
156
+
157
+ * /api/health
158
+ * /api/version
159
+ * /api/status
160
+ * /api/skills
161
+ * /api/sessions (GET = list, POST = create)
162
+ * /api/sessions/<id> (GET = detail)
163
+ * /api/chat (POST → JSON for now; SSE streaming is a follow-up)
164
+ """
165
+
166
+ # Bearer-token shared across the whole server instance (set on the
167
+ # serve_forever helper below before binding).
168
+ expected_token: str = ""
169
+ omega_home: Path = _omega_home(None)
170
+ quiet: bool = True
171
+
172
+ # ---- Internal helpers --------------------------------------------------
173
+
174
+ def log_message(self, fmt: str, *args: Any) -> None: # noqa: A003
175
+ if not self.quiet:
176
+ super().log_message(fmt, *args)
177
+
178
+ def _check_auth(self) -> bool:
179
+ if not self.expected_token:
180
+ return True # auth disabled (only --unsafe-public)
181
+ got = self.headers.get("Authorization") or ""
182
+ if not got.startswith("Bearer "):
183
+ return False
184
+ return secrets.compare_digest(got[7:].strip(), self.expected_token)
185
+
186
+ def _send_json(self, status: int, payload: dict[str, Any]) -> None:
187
+ body = json.dumps(payload).encode("utf-8")
188
+ self.send_response(status)
189
+ self.send_header("Content-Type", "application/json; charset=utf-8")
190
+ self.send_header("Content-Length", str(len(body)))
191
+ self.send_header("Cache-Control", "no-store")
192
+ self.end_headers()
193
+ self.wfile.write(body)
194
+
195
+ def _read_json(self) -> dict[str, Any] | None:
196
+ length = int(self.headers.get("Content-Length") or 0)
197
+ if length <= 0:
198
+ return None
199
+ raw = self.rfile.read(length)
200
+ try:
201
+ return json.loads(raw.decode("utf-8"))
202
+ except (ValueError, UnicodeDecodeError):
203
+ return None
204
+
205
+ # ---- Route dispatch ---------------------------------------------------
206
+
207
+ def do_GET(self) -> None: # noqa: N802
208
+ path = self.path.split("?", 1)[0]
209
+ if path == "/api/health":
210
+ return self._send_json(200, {"status": "ok"})
211
+ if not self._check_auth():
212
+ return self._send_json(401, {"error": "missing or bad bearer token"})
213
+
214
+ if path == "/api/version":
215
+ return self._send_json(200, self._version())
216
+ if path == "/api/status":
217
+ return self._send_json(200, self._status())
218
+ if path == "/api/skills":
219
+ return self._send_json(200, {"skills": self._skills()})
220
+ if path == "/api/sessions":
221
+ return self._send_json(200, {"sessions": self._sessions_list()})
222
+ if path.startswith("/api/sessions/"):
223
+ sid = path[len("/api/sessions/"):]
224
+ d = self._session_detail(sid)
225
+ if d is None:
226
+ return self._send_json(404, {"error": "no such session"})
227
+ return self._send_json(200, d)
228
+
229
+ return self._send_json(404, {"error": f"no route {path}"})
230
+
231
+ def do_POST(self) -> None: # noqa: N802
232
+ path = self.path.split("?", 1)[0]
233
+ if not self._check_auth():
234
+ return self._send_json(401, {"error": "missing or bad bearer token"})
235
+ body = self._read_json() or {}
236
+
237
+ if path == "/api/sessions":
238
+ intent = (body.get("intent") or body.get("message") or "").strip()
239
+ if not intent:
240
+ return self._send_json(400, {"error": "intent required"})
241
+ slug = body.get("project") or None
242
+ return self._send_json(202, self._create_session(intent, slug))
243
+
244
+ if path == "/api/chat":
245
+ messages = body.get("messages") or []
246
+ if not isinstance(messages, list) or not messages:
247
+ return self._send_json(400, {"error": "messages[] required"})
248
+ user_text = messages[-1].get("content", "").strip()
249
+ if not user_text:
250
+ return self._send_json(400, {"error": "last message empty"})
251
+ return self._send_json(200, self._chat(user_text))
252
+
253
+ return self._send_json(404, {"error": f"no route {path}"})
254
+
255
+ # ---- Endpoint implementations -----------------------------------------
256
+
257
+ def _version(self) -> dict[str, Any]:
258
+ from omega_engine import __version__
259
+ return {
260
+ "omega_version": __version__,
261
+ "hermes_compat": "1.x",
262
+ "api_routes": [
263
+ "GET /api/health", "GET /api/version", "GET /api/status",
264
+ "GET /api/skills", "GET /api/sessions",
265
+ "GET /api/sessions/<id>", "POST /api/sessions", "POST /api/chat",
266
+ ],
267
+ }
268
+
269
+ def _status(self) -> dict[str, Any]:
270
+ # Lightweight — don't run the full doctor (too slow). Quick
271
+ # snapshot of OmegaOS + Hermès bridge.
272
+ out: dict[str, Any] = {"omega_home": str(self.omega_home)}
273
+ try:
274
+ from omega_engine import hermes_bootstrap as HB
275
+ out["hermes_bootstrap"] = HB.status()
276
+ except Exception as exc: # noqa: BLE001
277
+ out["hermes_bootstrap_error"] = str(exc)
278
+ try:
279
+ from omega_engine import hermes as H
280
+ st = H.status()
281
+ out["hermes_bridge"] = {
282
+ "installed": st.installed,
283
+ "oauth_token_present": st.oauth_token_present,
284
+ "subscription": st.oauth_subscription,
285
+ }
286
+ except Exception as exc: # noqa: BLE001
287
+ out["hermes_bridge_error"] = str(exc)
288
+ return out
289
+
290
+ def _skills(self) -> list[dict[str, Any]]:
291
+ from omega_engine.skill_routing import (
292
+ catalog_for_home, POWER_SKILLS, recommend,
293
+ )
294
+ cat = catalog_for_home(self.omega_home)
295
+ return [
296
+ {
297
+ "name": s, "source": "omega-ssot",
298
+ "power_skill": s in POWER_SKILLS,
299
+ }
300
+ for s in cat
301
+ ] + [
302
+ {
303
+ "name": role, "source": "role-palette",
304
+ "skills": recommend(role),
305
+ }
306
+ for role in ("worker", "oracle", "audit", "worker_ui")
307
+ ]
308
+
309
+ def _sessions_list(self) -> list[dict[str, Any]]:
310
+ # Surface OmegaOS missions + per-task workers as "sessions"
311
+ out: list[dict[str, Any]] = []
312
+ try:
313
+ from omega_engine import worker as W
314
+ for w in W.list_workers(self.omega_home):
315
+ out.append({
316
+ "id": w["task_id"], "title": w["intent"],
317
+ "kind": "worker", "state": w["state"],
318
+ "project": w.get("project"),
319
+ })
320
+ except Exception: # noqa: BLE001
321
+ pass
322
+ return out
323
+
324
+ def _session_detail(self, session_id: str) -> dict[str, Any] | None:
325
+ try:
326
+ from omega_engine import worker as W
327
+ from omega_engine.done_signal import read_done
328
+ status = W.worker_status(self.omega_home, session_id)
329
+ done = read_done(self.omega_home, session_id)
330
+ return {
331
+ "id": session_id, "status": status,
332
+ "done": done.to_dict() if done else None,
333
+ }
334
+ except FileNotFoundError:
335
+ return None
336
+ except Exception as exc: # noqa: BLE001
337
+ return {"id": session_id, "error": str(exc)}
338
+
339
+ def _create_session(
340
+ self, intent: str, slug: str | None,
341
+ ) -> dict[str, Any]:
342
+ """Dispatch a mission via omega run (synchronous for now)."""
343
+ import subprocess
344
+ # We DO NOT run heavy work in the HTTP thread — emit the command
345
+ # asynchronously via a detached subprocess + return the mission
346
+ # id immediately. The Desktop client polls /api/sessions for
347
+ # progress.
348
+ env = {**os.environ, "OMEGA_HOME": str(self.omega_home)}
349
+ cmd = ["omega", "run", intent]
350
+ if slug:
351
+ cmd += ["--project", slug]
352
+ try:
353
+ subprocess.Popen(
354
+ cmd, env=env,
355
+ stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
356
+ start_new_session=True,
357
+ )
358
+ except (OSError, subprocess.SubprocessError) as exc:
359
+ return {"error": f"dispatch failed: {exc}"}
360
+ return {
361
+ "dispatched": True, "intent": intent,
362
+ "project": slug,
363
+ "note": "poll /api/sessions for progress",
364
+ }
365
+
366
+ def _chat(self, user_text: str) -> dict[str, Any]:
367
+ """Send the user text through the local Hermès binary (if installed),
368
+ else delegate via omega ask + return the text."""
369
+ from omega_engine import hermes as H
370
+ try:
371
+ if H.is_installed():
372
+ rc, stdout, stderr = H.ask(user_text, timeout_s=180)
373
+ return {
374
+ "rc": rc,
375
+ "text": stdout.strip() or stderr.strip(),
376
+ }
377
+ except H.HermesError as exc:
378
+ return {"rc": 2, "text": f"hermes error: {exc}"}
379
+ return {
380
+ "rc": 1,
381
+ "text": "hermes binary not installed on the VPS — "
382
+ "run `omega hermes install` first.",
383
+ }
384
+
385
+
386
+ # ---------------------------------------------------------------------------
387
+ # Server lifecycle
388
+ # ---------------------------------------------------------------------------
389
+
390
+
391
+ class _ThreadedTCPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
392
+ daemon_threads = True
393
+ allow_reuse_address = True
394
+
395
+
396
+ @dataclass
397
+ class ServerStatus:
398
+ bound: str
399
+ port: int
400
+ pid: int
401
+
402
+
403
+ _RUNNING_LOCK = threading.Lock()
404
+
405
+
406
+ def serve(
407
+ *,
408
+ host: str = "127.0.0.1",
409
+ port: int = _DEFAULT_PORT,
410
+ omega_home: str | Path | None = None,
411
+ token: str | None = None,
412
+ quiet: bool = True,
413
+ unsafe_public: bool = False,
414
+ ) -> _ThreadedTCPServer:
415
+ """Bind + serve. Returns the server object so callers can shut down.
416
+
417
+ NOT a daemon — for systemd / detached tmux, use ``serve_forever``.
418
+ """
419
+ if host == "0.0.0.0" and not unsafe_public:
420
+ raise RuntimeError(
421
+ "refusing to bind 0.0.0.0 — pass unsafe_public=True if you "
422
+ "really want public, but you almost certainly want SSH "
423
+ "tunneling instead"
424
+ )
425
+ tok = token if token is not None else (
426
+ read_token(omega_home) or generate_token(omega_home)
427
+ )
428
+ # Subclass the handler so attributes don't bleed across servers.
429
+ handler = type("_BoundHandler", (_Handler,), {
430
+ "expected_token": tok,
431
+ "omega_home": _omega_home(omega_home),
432
+ "quiet": quiet,
433
+ })
434
+ server = _ThreadedTCPServer((host, port), handler)
435
+ return server
436
+
437
+
438
+ def serve_forever(
439
+ *,
440
+ host: str = "127.0.0.1",
441
+ port: int = _DEFAULT_PORT,
442
+ omega_home: str | Path | None = None,
443
+ token: str | None = None,
444
+ quiet: bool = True,
445
+ unsafe_public: bool = False,
446
+ ) -> None:
447
+ """Blocking serve. Best run inside a tmux session or systemd unit."""
448
+ s = serve(host=host, port=port, omega_home=omega_home, token=token,
449
+ quiet=quiet, unsafe_public=unsafe_public)
450
+ try:
451
+ s.serve_forever()
452
+ except KeyboardInterrupt:
453
+ pass
454
+ finally:
455
+ try:
456
+ s.shutdown()
457
+ s.server_close()
458
+ except OSError:
459
+ pass
460
+
461
+
462
+ def is_port_free(port: int = _DEFAULT_PORT, host: str = "127.0.0.1") -> bool:
463
+ """Probe whether ``host:port`` can be bound. Useful for the install check."""
464
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
465
+ try:
466
+ sock.bind((host, port))
467
+ return True
468
+ except OSError:
469
+ return False
@@ -0,0 +1,30 @@
1
+ """Third-party integrations — thin wrappers around external CLI tools.
2
+
3
+ Each integration is opt-in: if the upstream binary is missing the wrapper
4
+ raises a typed error, never crashes the engine. The wrappers translate the
5
+ tool's native output into the engine's own shapes (Documents, graph edges,
6
+ Tool registry entries) so the rest of the system stays binary-free.
7
+ """
8
+ from omega_engine.integrations.graphify import (
9
+ GraphifyError,
10
+ GraphifyGraphMissing,
11
+ GraphifyNotInstalled,
12
+ GraphifyReport,
13
+ graphify_install_skill,
14
+ graphify_into_rag,
15
+ graphify_load_graph,
16
+ graphify_version,
17
+ is_graphify_installed,
18
+ )
19
+
20
+ __all__ = [
21
+ "GraphifyError",
22
+ "GraphifyGraphMissing",
23
+ "GraphifyNotInstalled",
24
+ "GraphifyReport",
25
+ "graphify_install_skill",
26
+ "graphify_into_rag",
27
+ "graphify_load_graph",
28
+ "graphify_version",
29
+ "is_graphify_installed",
30
+ ]