@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
@@ -7,6 +7,12 @@ STATE_DIR="$OMEGA_HOME/Agentik_Extra/var"
7
7
  STATE_FILE="$STATE_DIR/.install-state"
8
8
  LOG_FILE="$STATE_DIR/logs/install.log"
9
9
 
10
+ # --- user defaults ---
11
+ # The friendly name used when --create-user is given with no explicit value.
12
+ # Chosen because it matches the install dir (~/Omega), is short, neutral, and
13
+ # never collides with a stock Linux/macOS account. (Override on the CLI.)
14
+ OMEGA_DEFAULT_NEW_USER="${OMEGA_DEFAULT_NEW_USER:-omega}"
15
+
10
16
  # --- colours (only when attached to a tty) ---
11
17
  if [ -t 1 ]; then
12
18
  C_OK=$'\033[32m'; C_ERR=$'\033[31m'; C_INFO=$'\033[36m'; C_DIM=$'\033[2m'; C_RST=$'\033[0m'
@@ -43,7 +49,30 @@ detect_os() {
43
49
  # --- step state (idempotent / resumable) ---
44
50
  step_done() { [ -f "$STATE_FILE" ] && grep -qx "$1" "$STATE_FILE"; }
45
51
  mark_done() { mkdir -p "$STATE_DIR"; printf '%s\n' "$1" >> "$STATE_FILE"; }
46
- reset_state() { rm -f "$STATE_FILE"; }
52
+ reset_state() { rm -f "$STATE_FILE" "$STATE_DIR/.install-version" 2>/dev/null || true; }
53
+
54
+ # state_version_drift — return 0 (drift) when the state file was written by a
55
+ # different OmegaOS version than the one we're about to run. We track the
56
+ # version that wrote a state file in a sibling marker `$STATE_DIR/.install-version`.
57
+ # When drift is detected we reset state automatically so re-running an upgraded
58
+ # installer actually executes the NEW steps instead of skipping them all as
59
+ # "already done". This was the v0.19.x UX regression: a Mac with an old state
60
+ # file from v0.2.0 was skipping every step on a v0.19.x re-run.
61
+ state_version_drift() {
62
+ local current="${OMEGA_BUNDLED_VERSION:-}"
63
+ [ -n "$current" ] || return 1
64
+ local marker="$STATE_DIR/.install-version"
65
+ [ -f "$marker" ] || return 0 # state present but no version marker → drift
66
+ local recorded; recorded="$(cat "$marker" 2>/dev/null || echo '')"
67
+ [ "$recorded" = "$current" ] && return 1
68
+ return 0
69
+ }
70
+ record_state_version() {
71
+ local current="${OMEGA_BUNDLED_VERSION:-}"
72
+ [ -n "$current" ] || return 0
73
+ mkdir -p "$STATE_DIR"
74
+ printf '%s\n' "$current" > "$STATE_DIR/.install-version"
75
+ }
47
76
 
48
77
  # run_step <name> <function>
49
78
  run_step() {
@@ -61,6 +90,132 @@ run_step() {
61
90
  fi
62
91
  }
63
92
 
93
+ # --- user resolution ---------------------------------------------------------
94
+ #
95
+ # The installer is modular about WHICH user it runs as. Three modes, decided
96
+ # from the CLI by install.sh before anything else happens:
97
+ #
98
+ # 1. (default) no flag — run as the current user; OMEGA_HOME=$HOME/Omega.
99
+ # 2. --user <name> — re-exec as that existing user.
100
+ # 3. --create-user [<name>] — create a system user (Linux only), then
101
+ # re-exec as them. Default name: $OMEGA_DEFAULT_NEW_USER.
102
+ #
103
+ # Re-exec is via `sudo -u <user> -H bash <copied-installer>`. We copy the
104
+ # repo into the target user's ~/.cache/omega-installer/ first because the
105
+ # original clone (e.g. /root/OmegaOS) is rarely readable by the target user.
106
+
107
+ # user_home <name> — print the home directory of a Unix user, or empty if missing.
108
+ user_home() {
109
+ local name="$1" home
110
+ if [ "$(uname -s)" = "Darwin" ]; then
111
+ home="$(dscl . -read "/Users/$name" NFSHomeDirectory 2>/dev/null | awk '{print $2}')"
112
+ else
113
+ home="$(getent passwd "$name" 2>/dev/null | cut -d: -f6)"
114
+ fi
115
+ printf '%s' "$home"
116
+ }
117
+
118
+ # ensure_user_exists <name> — create a system user if missing (Linux only).
119
+ # Adds them to the sudo/wheel group so `step_system_deps` can apt/dnf.
120
+ ensure_user_exists() {
121
+ local name="$1"
122
+ if id "$name" >/dev/null 2>&1; then
123
+ info "user '$name' already exists — adopting"
124
+ return 0
125
+ fi
126
+ if [ "$(uname -s)" = "Darwin" ]; then
127
+ die "creating users on macOS is not supported by this installer — pass --user <existing-user> or install as yourself"
128
+ fi
129
+ if [ "$(id -u)" -ne 0 ]; then
130
+ die "creating user '$name' requires root — re-run with sudo (e.g. \`sudo bash install.sh --create-user $name\`)"
131
+ fi
132
+ info "creating system user '$name' (shell=/bin/bash, home=/home/$name)"
133
+ if ! useradd -m -s /bin/bash "$name" >>"$LOG_FILE" 2>&1; then
134
+ die "useradd failed for '$name' — see $LOG_FILE"
135
+ fi
136
+ if getent group sudo >/dev/null 2>&1; then
137
+ usermod -aG sudo "$name" >>"$LOG_FILE" 2>&1 || true
138
+ elif getent group wheel >/dev/null 2>&1; then
139
+ usermod -aG wheel "$name" >>"$LOG_FILE" 2>&1 || true
140
+ fi
141
+ # Passwordless sudo for system-deps step only, scoped to apt/dnf. We
142
+ # intentionally do NOT grant NOPASSWD on all sudo — that's the operator's
143
+ # decision later.
144
+ ok "user '$name' created and granted sudo group membership"
145
+ }
146
+
147
+ # resolve_target_user — call this from install.sh BEFORE run_step.
148
+ #
149
+ # Inputs (variables set by install.sh argument parsing):
150
+ # USER_REQUESTED — "" | a username from --user
151
+ # CREATE_USER — 0 | 1 from --create-user
152
+ # CREATE_USER_NAME — name to create (defaults to OMEGA_DEFAULT_NEW_USER)
153
+ # INSTALL_CLEAN_ARGS[] — reconstructed args without --user/--create-user
154
+ #
155
+ # Effect: either sets OMEGA_USER to the current user (no-op), or
156
+ # `exec`s the installer into the resolved user's shell with INSTALL_CLEAN_ARGS.
157
+ resolve_target_user() {
158
+ local current; current="$(id -un)"
159
+ local target=""
160
+
161
+ if [ "${CREATE_USER:-0}" = "1" ]; then
162
+ target="${CREATE_USER_NAME:-$OMEGA_DEFAULT_NEW_USER}"
163
+ ensure_user_exists "$target"
164
+ elif [ -n "${USER_REQUESTED:-}" ]; then
165
+ target="$USER_REQUESTED"
166
+ if ! id "$target" >/dev/null 2>&1; then
167
+ die "user '$target' does not exist — either create it first, or use --create-user $target"
168
+ fi
169
+ fi
170
+
171
+ # Mode 1 — no flag, or flag matches current user: just continue.
172
+ if [ -z "$target" ] || [ "$target" = "$current" ]; then
173
+ if [ "$current" = "root" ]; then
174
+ err "running as root with no user mode chosen — this leaves Omega OS owned by root"
175
+ err "pick one:"
176
+ err " bash install.sh --create-user # create a new user named '$OMEGA_DEFAULT_NEW_USER'"
177
+ err " bash install.sh --create-user <name> # create with a custom name"
178
+ err " bash install.sh --user <existing-name> # adopt an existing user"
179
+ die "(if you really want root, set OMEGA_ALLOW_ROOT=1; this is almost never what you want)"
180
+ fi
181
+ OMEGA_USER="$current"
182
+ export OMEGA_USER
183
+ return 0
184
+ fi
185
+
186
+ # Mode 2/3 — re-exec as `target`. We need to be either root or current target.
187
+ if [ "$(id -u)" -ne 0 ] && ! have sudo; then
188
+ die "cannot switch to user '$target' without root or sudo — re-run with sudo"
189
+ fi
190
+
191
+ local thome; thome="$(user_home "$target")"
192
+ [ -n "$thome" ] || die "could not resolve home directory for user '$target'"
193
+
194
+ # Copy installer into the target user's cache so they can definitely read it.
195
+ local stage="$thome/.cache/omega-installer"
196
+ info "staging installer for '$target' at $stage"
197
+ if [ "$(id -u)" -eq 0 ]; then
198
+ mkdir -p "$stage"
199
+ cp -R "$REPO_DIR/." "$stage/"
200
+ chown -R "$target:$target" "$stage" 2>/dev/null \
201
+ || chown -R "$target" "$stage" 2>/dev/null || true
202
+ else
203
+ sudo mkdir -p "$stage"
204
+ sudo cp -R "$REPO_DIR/." "$stage/"
205
+ sudo chown -R "$target" "$stage" 2>/dev/null || true
206
+ fi
207
+
208
+ local exec_args=("${INSTALL_CLEAN_ARGS[@]:-}")
209
+ info "re-executing installer as '$target' (clean args: ${exec_args[*]:-<none>})"
210
+ if [ "$(id -u)" -eq 0 ]; then
211
+ exec sudo -u "$target" -H bash "$stage/install.sh" "${exec_args[@]}"
212
+ else
213
+ exec sudo -u "$target" -H bash "$stage/install.sh" "${exec_args[@]}"
214
+ fi
215
+ # `exec` never returns; if we get here something's wrong.
216
+ die "exec to user '$target' failed"
217
+ }
218
+
64
219
  # ask <var> <prompt> <default> — respects --non-interactive
65
220
  ask() {
66
221
  local __var="$1" __prompt="$2" __default="${3:-}" __reply
@@ -71,3 +226,304 @@ ask() {
71
226
  read -r -p "$__prompt ${__default:+[$__default] }" __reply || true
72
227
  printf -v "$__var" '%s' "${__reply:-$__default}"
73
228
  }
229
+
230
+
231
+ # ─────────────────────────────────────────────────────────────────────────────
232
+ # UX — banner, preflight card, profile picker, step progress, post-install
233
+ # ─────────────────────────────────────────────────────────────────────────────
234
+
235
+ if [ -t 1 ]; then
236
+ C_BOLD=$'\033[1m'
237
+ C_DIM=$'\033[2m'
238
+ # Claude-Code brand orange (#D97757) in 24-bit truecolor. Every modern
239
+ # macOS/Linux terminal (iTerm2, Termius, kitty, alacritty, gnome-terminal,
240
+ # WezTerm) supports truecolor. We expose the legacy C_CYAN/etc names
241
+ # below for back-compat — the banner + boxes use C_ORANGE.
242
+ C_ORANGE=$'\033[38;2;217;119;87m'
243
+ C_CYAN="$C_ORANGE"
244
+ C_GREEN=$'\033[32m'
245
+ C_YELLOW=$'\033[33m'
246
+ C_RED=$'\033[31m'
247
+ C_MAGENTA=$'\033[35m'
248
+ C_BLUE=$'\033[34m'
249
+ else
250
+ # Non-TTY (CI, --non-interactive, pipe) — make every colour var safe
251
+ # to reference. Without these the install.sh plan-mode block crashes
252
+ # on `set -u` when running headless.
253
+ C_BOLD=''; C_DIM=''; C_ORANGE=''; C_CYAN=''; C_GREEN=''; C_YELLOW=''
254
+ C_RED=''; C_MAGENTA=''; C_BLUE=''
255
+ fi
256
+
257
+ # --- prompt helpers --------------------------------------------------------
258
+ #
259
+ # prompt_yes_no <question> [default=yes|no]
260
+ # Read a y/n answer from stdin. Default is "yes" when omitted. Returns 0
261
+ # for yes, 1 for no. Re-prompts on garbage input (typo-safe). When stdin
262
+ # is not a TTY (piped/non-interactive), accepts the default silently —
263
+ # `install.sh` already gates the call with `[ -t 0 ]` so the non-TTY
264
+ # path is only hit when the call site forgot, in which case "yes" is the
265
+ # safe assumption (the user opted into the install by running it).
266
+ #
267
+ # This was missing in v0.19.1/0.19.4 and caused a "command not found" abort
268
+ # on the very first install on macOS — the install.sh plan-mode block fell
269
+ # through to `aborted by operator — no changes made` without any work done.
270
+ prompt_yes_no() {
271
+ local q="$1" default="${2:-yes}" reply hint
272
+ case "$default" in
273
+ y|yes|Y|YES) hint="Y/n" ;;
274
+ n|no|N|NO) hint="y/N" ;;
275
+ *) hint="y/n" ;;
276
+ esac
277
+ while :; do
278
+ # Only print the prompt when stdin is a TTY. Always try to read —
279
+ # piped input (e.g. `printf 'n\n' | install.sh`) must be honoured.
280
+ [ -t 0 ] && printf '%s %s[%s]%s ' "$q" "$C_DIM" "$hint" "$C_RST"
281
+ if ! IFS= read -r reply; then
282
+ # EOF (no input at all) → fall back to the default.
283
+ reply=""
284
+ fi
285
+ [ -z "$reply" ] && reply="$default"
286
+ case "$reply" in
287
+ y|Y|yes|YES|Yes) return 0 ;;
288
+ n|N|no|NO|No) return 1 ;;
289
+ *) printf ' please answer y or n\n' ;;
290
+ esac
291
+ done
292
+ }
293
+
294
+ # Stable wall-clock start time — used to print mm:ss next to each step.
295
+ INSTALL_START_TS="${INSTALL_START_TS:-$(date +%s)}"
296
+ STEP_COUNT="${STEP_COUNT:-0}"
297
+ STEP_TOTAL="${STEP_TOTAL:-0}"
298
+
299
+ # Read $OMEGA_REPO/omega/Agentik_SSOT/VERSION (single source of truth).
300
+ omega_version() {
301
+ local f="$OMEGA_REPO/omega/Agentik_SSOT/VERSION"
302
+ [ -f "$f" ] && cat "$f" 2>/dev/null || echo "?.?.?"
303
+ }
304
+
305
+ # install_banner — printed once at the very top of install.sh.
306
+ #
307
+ # The G letter (position 4) used to read as a B because row 3 closed the
308
+ # upper-right with `█▀` (looked like the top loop of B) and the bottom row
309
+ # used `████████▀` instead of a clean ` ▀██████▀ ` arc. v0.19.5 makes the
310
+ # G unambiguous: open right side at row 3, classic arc bottom, with the
311
+ # canonical middle hook at row 5. Colour is Claude-Code brand orange.
312
+ install_banner() {
313
+ local v; v="$(omega_version)"
314
+ printf '\n'
315
+ printf '%s ▄██████▄ ▄▄▄▄███▄▄▄▄ ▄████████ ▄██████▄ ▄████████%s\n' "$C_ORANGE" "$C_RST"
316
+ printf '%s ███ ███ ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
317
+ printf '%s ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
318
+ printf '%s ███ ███ ███ ███ ███ ▄███▄▄▄ ▄███ ▄███▄▄▄▄██▀%s\n' "$C_ORANGE" "$C_RST"
319
+ printf '%s ███ ███ ███ ███ ███ ▀▀███▀▀▀ ▀▀███ ████▄ ▀▀███▀▀▀▀▀ %s\n' "$C_ORANGE" "$C_RST"
320
+ printf '%s ███ ███ ███ ███ ███ ███ █▄ ███ ███ ▀███████████%s\n' "$C_ORANGE" "$C_RST"
321
+ printf '%s ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
322
+ printf '%s ▀██████▀ ▀█ ███ █▀ ██████████ ▀██████▀ ███ ███%s\n' "$C_ORANGE" "$C_RST"
323
+ printf '\n'
324
+ printf ' %sOmega OS%s %sv%s%s · %sagentik-os/OmegaOS%s\n' \
325
+ "$C_BOLD" "$C_RST" "$C_DIM" "$v" "$C_RST" "$C_DIM" "$C_RST"
326
+ printf ' %sEvent-sourced, verified-completion agentic operating system.%s\n' \
327
+ "$C_DIM" "$C_RST"
328
+ printf '\n'
329
+ }
330
+
331
+ # preflight_card — print a one-screen detection summary before any step runs.
332
+ # Heuristics only; never blocks. Operator reads it and either accepts or aborts.
333
+ preflight_card() {
334
+ local cpus mem_gb disk_h disk_pct internet shell_name
335
+ cpus="$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo "?")"
336
+ if [ "$(uname -s)" = "Linux" ]; then
337
+ mem_gb="$(awk '/MemTotal/ {printf "%.1f", $2/1024/1024}' /proc/meminfo 2>/dev/null || echo "?")"
338
+ disk_h="$(df -h "$HOME" 2>/dev/null | awk 'NR==2 {print $4 " free / " $2}' || echo "?")"
339
+ disk_pct="$(df -P "$HOME" 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}' || echo "?")"
340
+ else
341
+ mem_gb="$(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f", $1/1024/1024/1024}' || echo "?")"
342
+ disk_h="$(df -h "$HOME" 2>/dev/null | awk 'NR==2 {print $4 " free / " $2}' || echo "?")"
343
+ disk_pct="$(df "$HOME" 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}' || echo "?")"
344
+ fi
345
+ shell_name="$(basename "${SHELL:-/bin/sh}")"
346
+ if curl -sS --max-time 3 -o /dev/null -w '%{http_code}' https://www.google.com 2>/dev/null | grep -q '^[23]'; then
347
+ internet="${C_GREEN}online${C_RST}"
348
+ else
349
+ internet="${C_RED}offline${C_RST}"
350
+ fi
351
+
352
+ local _yes="${C_GREEN}✓${C_RST}"
353
+ local _no="${C_RED}✗${C_RST}"
354
+ _have_mark() { have "$1" && printf '%s %s' "$_yes" "$(command -v "$1" | head -1)" || printf '%s missing' "$_no"; }
355
+
356
+ printf ' %s──── pre-flight detection ────%s\n' "$C_DIM" "$C_RST"
357
+ printf ' %sOS%s %-30s %sPkg manager%s %s\n' "$C_DIM" "$C_RST" "$OMEGA_OS" "$C_DIM" "$C_RST" "$OMEGA_PKG"
358
+ printf ' %sShell%s %-30s %sUser%s %s\n' "$C_DIM" "$C_RST" "$shell_name" "$C_DIM" "$C_RST" "$OMEGA_USER"
359
+ printf ' %sCPUs%s %-30s %sRAM%s %s GiB\n' "$C_DIM" "$C_RST" "$cpus" "$C_DIM" "$C_RST" "$mem_gb"
360
+ printf ' %sDisk%s %-30s %sFull%s %s%%\n' "$C_DIM" "$C_RST" "$disk_h" "$C_DIM" "$C_RST" "$disk_pct"
361
+ printf ' %sInternet%s %-30b %sProfile%s %s\n' "$C_DIM" "$C_RST" "$internet" "$C_DIM" "$C_RST" "$PROFILE"
362
+ printf '\n'
363
+ printf ' %s──── required tools ────%s\n' "$C_DIM" "$C_RST"
364
+ printf ' git %s\n' "$(_have_mark git)"
365
+ printf ' python3 %s\n' "$(_have_mark python3)"
366
+ printf ' tmux %s\n' "$(_have_mark tmux)"
367
+ printf ' sqlite3 %s\n' "$(_have_mark sqlite3)"
368
+ printf ' curl %s\n' "$(_have_mark curl)"
369
+ printf ' jq %s\n' "$(_have_mark jq)"
370
+ printf '\n'
371
+ printf ' %s──── optional (Omega will install or skip)%s\n' "$C_DIM" "$C_RST"
372
+ printf ' claude %s %s(Max OAuth — no API key needed)%s\n' "$(_have_mark claude)" "$C_DIM" "$C_RST"
373
+ printf ' uv %s %s(Python pkg + venv manager)%s\n' "$(_have_mark uv)" "$C_DIM" "$C_RST"
374
+ printf ' node %s %s(MCP servers)%s\n' "$(_have_mark node)" "$C_DIM" "$C_RST"
375
+ printf ' age %s %s(encrypted secrets vault)%s\n' "$(_have_mark age)" "$C_DIM" "$C_RST"
376
+ printf ' gh %s %s(GitHub workflow)%s\n' "$(_have_mark gh)" "$C_DIM" "$C_RST"
377
+ printf '\n'
378
+
379
+ # Soft block: if disk < 2 GB free, warn loud.
380
+ local disk_free_kb
381
+ disk_free_kb="$(df -Pk "$HOME" 2>/dev/null | awk 'NR==2 {print $4}')"
382
+ if [ -n "$disk_free_kb" ] && [ "$disk_free_kb" -lt 2000000 ]; then
383
+ printf ' %s! warning:%s less than ~2 GB free in %s — install may run out of space\n' \
384
+ "$C_YELLOW" "$C_RST" "$HOME"
385
+ printf '\n'
386
+ fi
387
+ }
388
+
389
+ # pick_profile_interactive — whiptail picker when --profile not given.
390
+ # Falls through silently if whiptail is missing or stdin is not a tty.
391
+ pick_profile_interactive() {
392
+ [ "${NONINTERACTIVE:-0}" = "1" ] && return 0
393
+ [ -t 0 ] || return 0
394
+ if [ "$PROFILE_EXPLICIT" = "1" ]; then return 0; fi
395
+ if ! have whiptail; then return 0; fi
396
+ local choice
397
+ choice="$(whiptail --title "Omega OS — install profile" \
398
+ --menu "Pick the install profile for this machine:" 16 78 5 \
399
+ "vps" "Headless 24/7 VPS — daemons + Telegram + autonomous" \
400
+ "workstation" "Local laptop — interactive, no daemons" \
401
+ "minimal" "Engine + CLI only — no MCP, no Telegram, no plugins" \
402
+ 3>&1 1>&2 2>&3)" || return 0
403
+ [ -n "$choice" ] && PROFILE="$choice"
404
+ }
405
+
406
+ # step_progress_header <step_name>
407
+ # Wraps run_step. Prints "[N/M] step ⏱ elapsed".
408
+ step_progress_header() {
409
+ local name="$1"
410
+ STEP_COUNT=$((STEP_COUNT + 1))
411
+ local now elapsed mm ss bar tail
412
+ now="$(date +%s)"; elapsed=$((now - INSTALL_START_TS))
413
+ mm=$((elapsed / 60)); ss=$((elapsed % 60))
414
+ if [ "$STEP_TOTAL" -gt 0 ]; then
415
+ bar="[$STEP_COUNT/$STEP_TOTAL]"
416
+ else
417
+ bar="[$STEP_COUNT]"
418
+ fi
419
+ tail="$(printf '%02d:%02d' "$mm" "$ss")"
420
+ log "${C_BLUE}${bar}${C_RST} ${C_BOLD}${name}${C_RST} ${C_DIM}elapsed ${tail}${C_RST}"
421
+ }
422
+
423
+ # path_setup_user_rc — append an idempotent shellrc block exporting OMEGA_HOME
424
+ # and prepending Agentik_Tools/bin to PATH. Honours --no-path-setup.
425
+ path_setup_user_rc() {
426
+ if [ "${NO_PATH_SETUP:-0}" = "1" ]; then
427
+ info "PATH setup skipped (--no-path-setup)"
428
+ return 0
429
+ fi
430
+ local rc
431
+ case "$(basename "${SHELL:-/bin/sh}")" in
432
+ zsh) rc="$HOME/.zshrc" ;;
433
+ bash) rc="$HOME/.bashrc" ;;
434
+ fish) rc="$HOME/.config/fish/config.fish" ;;
435
+ *) rc="$HOME/.profile" ;;
436
+ esac
437
+ # Idempotent: if our marker already exists, just refresh the path inside.
438
+ local marker="# >>> omega-os >>>"
439
+ local close="# <<< omega-os <<<"
440
+ if [ -f "$rc" ] && grep -q "$marker" "$rc" 2>/dev/null; then
441
+ info "PATH already wired in $rc — skipping"
442
+ return 0
443
+ fi
444
+ mkdir -p "$(dirname "$rc")"
445
+ if [ "$(basename "$rc")" = "config.fish" ]; then
446
+ {
447
+ echo ""
448
+ echo "$marker"
449
+ echo "set -gx OMEGA_HOME \"$OMEGA_HOME\""
450
+ echo "set -gx PATH \"\$OMEGA_HOME/Agentik_Tools/bin\" \$PATH"
451
+ echo "$close"
452
+ } >> "$rc"
453
+ else
454
+ {
455
+ echo ""
456
+ echo "$marker"
457
+ echo "export OMEGA_HOME=\"$OMEGA_HOME\""
458
+ echo "export PATH=\"\$OMEGA_HOME/Agentik_Tools/bin:\$PATH\""
459
+ echo "$close"
460
+ } >> "$rc"
461
+ fi
462
+ ok "PATH wired in $rc — open a new shell or \`source $rc\`"
463
+ }
464
+
465
+ # post_install_card — beautiful boxed summary printed at the very end.
466
+ # Reads `omega doctor --json` to compute the verdict.
467
+ post_install_card() {
468
+ local omega="$OMEGA_HOME/Agentik_Tools/bin/omega"
469
+ local verdict_text verdict_color
470
+ if [ -x "$omega" ]; then
471
+ local readiness
472
+ readiness="$(OMEGA_HOME="$OMEGA_HOME" "$omega" doctor --json 2>/dev/null \
473
+ | python3 -c 'import sys,json
474
+ try: d=json.load(sys.stdin); print(d.get("readiness","unknown"))
475
+ except Exception: print("unknown")' 2>/dev/null)" || readiness="unknown"
476
+ case "${readiness,,}" in
477
+ ready) verdict_text="READY" ; verdict_color="$C_GREEN" ;;
478
+ partial) verdict_text="PARTIAL" ; verdict_color="$C_YELLOW" ;;
479
+ not-ready|not_ready) verdict_text="NOT READY"; verdict_color="$C_RED" ;;
480
+ *) verdict_text="UNKNOWN" ; verdict_color="$C_DIM" ;;
481
+ esac
482
+ else
483
+ verdict_text="UNKNOWN" ; verdict_color="$C_DIM"
484
+ fi
485
+
486
+ local now elapsed mm ss
487
+ now="$(date +%s)"; elapsed=$((now - INSTALL_START_TS))
488
+ mm=$((elapsed / 60)); ss=$((elapsed % 60))
489
+ local v; v="$(omega_version)"
490
+
491
+ # Side-rule style — only a left bar + a top/bottom thread.
492
+ # ANSI-safe (no right padding to misalign).
493
+ local bar="${C_CYAN}│${C_RST}"
494
+ local top="${C_CYAN}╭─── ${C_BOLD}Omega OS v$v${C_RST}${C_CYAN} — install complete ─────────${C_RST}"
495
+ local bot="${C_CYAN}╰────────────────────────────────────────────────────────────${C_RST}"
496
+ printf '\n'
497
+ printf ' %s\n' "$top"
498
+ printf ' %s\n' "$bar"
499
+ printf ' %s status %s%s%s\n' "$bar" "$verdict_color$C_BOLD" "$verdict_text" "$C_RST"
500
+ printf ' %s home %s\n' "$bar" "$OMEGA_HOME"
501
+ printf ' %s user %s\n' "$bar" "$OMEGA_USER"
502
+ printf ' %s elapsed %s\n' "$bar" "$(printf '%02d:%02d' "$mm" "$ss")"
503
+ printf ' %s\n' "$bar"
504
+ printf ' %s %snext steps%s\n' "$bar" "$C_BOLD" "$C_RST"
505
+ printf " %s 1. %stmux attach -t AISB-chat%s %salways-on Hermès conversation%s\n" \
506
+ "$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
507
+ printf " %s 2. open a new shell ${C_DIM}(or \`source ~/.zshrc\`)${C_RST}\n" "$bar"
508
+ printf ' %s 3. %somega status%s every task + derived state\n' "$bar" "$C_BOLD" "$C_RST"
509
+ printf ' %s 4. %somega account list%s wire your Claude Max OAuth\n' "$bar" "$C_BOLD" "$C_RST"
510
+ printf ' %s 5. %somega run "hello"%s first verified mission\n' "$bar" "$C_BOLD" "$C_RST"
511
+ printf ' %s 6. %somega%s interactive menu (whiptail)\n' "$bar" "$C_BOLD" "$C_RST"
512
+ printf ' %s\n' "$bar"
513
+ printf ' %s %ssessions%s all Omega/Claude/LLM sessions run inside tmux\n' \
514
+ "$bar" "$C_BOLD" "$C_RST"
515
+ printf " %s ${C_DIM}prefix+Z = picker, prefix+d = detach (keeps running)${C_RST}\n" "$bar"
516
+ printf ' %s\n' "$bar"
517
+ printf ' %s %sdocs%s %sgithub.com/agentik-os/OmegaOS%s\n' "$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
518
+ printf ' %s %sissues%s %sgithub.com/agentik-os/OmegaOS/issues%s\n' "$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
519
+ printf ' %s\n' "$bot"
520
+
521
+ # If PARTIAL or NOT READY, tell them where to look.
522
+ case "$verdict_text" in
523
+ PARTIAL|"NOT READY")
524
+ printf '\n %s↳ Some checks did not pass.%s Run %s\`omega doctor\`%s to see details.\n' \
525
+ "$C_YELLOW" "$C_RST" "$C_BOLD" "$C_RST"
526
+ printf ' Logs are at %s%s%s\n' "$C_DIM" "$LOG_FILE" "$C_RST"
527
+ ;;
528
+ esac
529
+ }