@agentikos/omega-os 0.2.0 → 0.19.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/README.md +33 -3
  2. package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
  3. package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
  4. package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
  5. package/bootstrap/lib/claude-code-settings.py +176 -0
  6. package/bootstrap/lib/common.sh +457 -1
  7. package/bootstrap/lib/llm-clis.py +341 -0
  8. package/bootstrap/lib/manifest-helpers.py +384 -0
  9. package/bootstrap/lib/steps.sh +790 -21
  10. package/bootstrap/manifest.example.yaml +87 -1
  11. package/bootstrap/templates/aisb/CLAUDE.md +305 -0
  12. package/bootstrap/templates/aisb/architect.md +204 -0
  13. package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
  14. package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
  15. package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
  16. package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
  17. package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
  18. package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
  19. package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
  20. package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
  21. package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
  22. package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
  23. package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
  24. package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
  25. package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
  26. package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
  27. package/bootstrap/templates/aisb/construct.md +135 -0
  28. package/bootstrap/templates/aisb/keymaker.md +227 -0
  29. package/bootstrap/templates/aisb/link.md +170 -0
  30. package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
  31. package/bootstrap/templates/aisb/merovingian.md +159 -0
  32. package/bootstrap/templates/aisb/morpheus.md +243 -0
  33. package/bootstrap/templates/aisb/neo.md +147 -0
  34. package/bootstrap/templates/aisb/niobe.md +197 -0
  35. package/bootstrap/templates/aisb/oracle.md +244 -0
  36. package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
  37. package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
  38. package/bootstrap/templates/aisb/pythia.md +153 -0
  39. package/bootstrap/templates/aisb/seraph.md +315 -0
  40. package/bootstrap/templates/aisb/smith.md +202 -0
  41. package/bootstrap/templates/aisb/zion.md +172 -0
  42. package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
  43. package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
  44. package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
  45. package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
  46. package/docs/AUDITS.md +85 -0
  47. package/docs/GAP-ANALYSIS.md +214 -0
  48. package/docs/INSTALL.md +47 -9
  49. package/docs/MCP-AND-PLUGINS.md +31 -4
  50. package/docs/SIMULATION.md +171 -0
  51. package/docs/simulate.sh +211 -0
  52. package/install.sh +164 -17
  53. package/omega/Agentik_Engine/README.md +4 -2
  54. package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
  55. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  105. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  106. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  107. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  108. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  109. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  110. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/account.py +28 -31
  114. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  115. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  116. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  117. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  121. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  122. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  123. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  124. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  125. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  126. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  127. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  128. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  129. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  130. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  131. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  132. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  133. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  134. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  135. package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
  136. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  137. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  138. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  139. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  140. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
  143. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
  144. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  155. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  156. package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
  157. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  158. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  159. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  160. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  161. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  167. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  168. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  169. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  170. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  171. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  172. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  173. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  174. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  175. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  176. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  177. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  178. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  179. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  180. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  181. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  182. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  183. package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
  184. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  185. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  186. package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
  187. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  188. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  189. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  190. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  191. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  192. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  198. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  199. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  203. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  204. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  205. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  206. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  207. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  208. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  209. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  210. package/omega/Agentik_Engine/omega_engine/store.py +88 -41
  211. package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
  212. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  213. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  214. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  215. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  216. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  217. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  218. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  219. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  220. package/omega/Agentik_Engine/pyproject.toml +1 -1
  221. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  222. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  223. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  224. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  225. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  226. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  227. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  228. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
  229. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  230. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  231. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  232. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  233. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  234. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  235. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/test_account.py +8 -3
  304. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  305. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  306. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  307. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  308. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  309. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  310. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  311. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  312. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  313. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  314. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  315. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  316. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  317. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  318. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  319. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  320. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  321. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  322. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  323. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  324. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  325. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  326. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  327. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  328. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  329. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  330. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  331. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  332. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  333. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  334. package/omega/Agentik_Runtime/audits.db +0 -0
  335. package/omega/Agentik_SSOT/VERSION +1 -1
  336. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  337. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  338. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  339. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
  340. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
  341. package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
  342. package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
  343. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  344. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  345. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  346. package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
  347. package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
  348. package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
  349. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  350. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  351. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  352. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  356. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  357. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  359. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  360. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  361. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  362. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  363. package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
  364. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  365. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  366. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  367. package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
  368. package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
  369. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  370. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  371. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  372. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  373. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  374. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  375. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  376. package/package.json +2 -2
@@ -0,0 +1,370 @@
1
+ """Tests for the v0.6.0 hardening batch — every new module gets coverage.
2
+
3
+ We don't hit any real provider APIs in tests (no network). For
4
+ validate.py and updater.py we monkeypatch urlopen; for smoke we run
5
+ against MockProvider; for prune/backup/costs/audit_diff we exercise the
6
+ pure-data paths.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import os
12
+ import sqlite3
13
+ import sys
14
+ import tempfile
15
+ import time
16
+ import unittest
17
+ from pathlib import Path
18
+ from unittest import mock
19
+
20
+ import yaml
21
+
22
+
23
+ HERE = Path(__file__).resolve().parent
24
+ sys.path.insert(0, str(HERE.parent))
25
+
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # validate.py
29
+ # ---------------------------------------------------------------------------
30
+
31
+
32
+ class TestValidate(unittest.TestCase):
33
+ def test_validate_claude_no_key_returns_clean_fail(self):
34
+ from omega_engine.validate import validate_one
35
+ with tempfile.TemporaryDirectory() as td:
36
+ r = validate_one(td, "claude")
37
+ self.assertFalse(r.ok)
38
+ self.assertIn("no API key", r.detail)
39
+
40
+ def test_validate_unknown_provider(self):
41
+ from omega_engine.validate import validate_one
42
+ with tempfile.TemporaryDirectory() as td:
43
+ r = validate_one(td, "aliens")
44
+ self.assertFalse(r.ok)
45
+ self.assertIn("no validator", r.detail)
46
+
47
+ def test_validate_all_reads_router(self):
48
+ from omega_engine.validate import validate_all
49
+ with tempfile.TemporaryDirectory() as td:
50
+ home = Path(td)
51
+ (home / "Agentik_SSOT" / "providers").mkdir(parents=True)
52
+ (home / "Agentik_SSOT" / "providers" / "router.yaml").write_text(
53
+ yaml.safe_dump({"providers": [
54
+ {"id": "claude", "enabled": True, "secret_ref": "CLAUDE_API_KEY"},
55
+ {"id": "glm", "enabled": False, "secret_ref": "GLM_API_KEY"},
56
+ ]}))
57
+ results = validate_all(home)
58
+ # Only enabled providers are validated.
59
+ self.assertEqual([r.provider for r in results], ["claude"])
60
+
61
+ def test_validate_claude_with_mock_http_200(self):
62
+ from omega_engine.validate import _validate_claude
63
+ with mock.patch("urllib.request.urlopen") as fake_open:
64
+ fake_resp = mock.MagicMock()
65
+ fake_resp.__enter__ = lambda s: s
66
+ fake_resp.__exit__ = lambda *args: None
67
+ fake_resp.read = lambda: b'{"ok": true}'
68
+ fake_open.return_value = fake_resp
69
+ r = _validate_claude("sk-key")
70
+ self.assertTrue(r.ok)
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # completions.py
75
+ # ---------------------------------------------------------------------------
76
+
77
+
78
+ class TestCompletions(unittest.TestCase):
79
+ def test_extract_tree_from_parser(self):
80
+ from omega_engine.cli import _build_parser
81
+ from omega_engine.completions import extract_tree
82
+ tree = extract_tree(_build_parser())
83
+ self.assertEqual(tree.name, "omega")
84
+ names = {n.name for n in tree.subcommands}
85
+ # A handful of the commands we know must be there.
86
+ for expected in ("doctor", "audit", "skill", "pursue", "cadence",
87
+ "smoke", "backup", "validate"):
88
+ self.assertIn(expected, names)
89
+
90
+ def test_render_bash_contains_top_commands(self):
91
+ from omega_engine.cli import _build_parser
92
+ from omega_engine.completions import extract_tree, render_bash
93
+ text = render_bash(extract_tree(_build_parser()))
94
+ self.assertIn("complete -F _omega_complete omega", text)
95
+ self.assertIn("doctor", text)
96
+ self.assertIn("audit", text)
97
+
98
+ def test_write_all_creates_files(self):
99
+ from omega_engine.cli import _build_parser
100
+ from omega_engine.completions import extract_tree, write_all
101
+ with tempfile.TemporaryDirectory() as td:
102
+ paths = write_all(td, extract_tree(_build_parser()))
103
+ for shell in ("bash", "zsh", "fish"):
104
+ self.assertTrue(paths[shell].exists())
105
+
106
+
107
+ # ---------------------------------------------------------------------------
108
+ # updater.py
109
+ # ---------------------------------------------------------------------------
110
+
111
+
112
+ class TestUpdater(unittest.TestCase):
113
+ def test_parse_semver_handles_prerelease(self):
114
+ from omega_engine.updater import _parse_semver
115
+ self.assertEqual(_parse_semver("1.2.3"), (1, 2, 3))
116
+ self.assertEqual(_parse_semver("1.2.3-beta.1"), (1, 2, 3))
117
+ self.assertEqual(_parse_semver("v0.4.0"), (0, 4, 0)) # leading v → 0
118
+ self.assertEqual(_parse_semver("garbage"), (0, 0, 0))
119
+
120
+ def test_check_returns_outdated_when_newer(self):
121
+ from omega_engine.updater import check_for_updates
122
+ with mock.patch("urllib.request.urlopen") as fake_open:
123
+ fake_resp = mock.MagicMock()
124
+ fake_resp.__enter__ = lambda s: s
125
+ fake_resp.__exit__ = lambda *args: None
126
+ fake_resp.read = lambda: json.dumps({
127
+ "dist-tags": {"latest": "1.0.0"},
128
+ }).encode()
129
+ fake_open.return_value = fake_resp
130
+ info = check_for_updates("0.5.0")
131
+ self.assertTrue(info.is_outdated)
132
+ self.assertEqual(info.latest, "1.0.0")
133
+
134
+ def test_check_returns_uptodate(self):
135
+ from omega_engine.updater import check_for_updates
136
+ with mock.patch("urllib.request.urlopen") as fake_open:
137
+ fake_resp = mock.MagicMock()
138
+ fake_resp.__enter__ = lambda s: s
139
+ fake_resp.__exit__ = lambda *args: None
140
+ fake_resp.read = lambda: json.dumps({
141
+ "dist-tags": {"latest": "0.5.0"},
142
+ }).encode()
143
+ fake_open.return_value = fake_resp
144
+ info = check_for_updates("0.5.0")
145
+ self.assertFalse(info.is_outdated)
146
+
147
+
148
+ # ---------------------------------------------------------------------------
149
+ # smoke.py
150
+ # ---------------------------------------------------------------------------
151
+
152
+
153
+ class TestSmoke(unittest.TestCase):
154
+ def test_smoke_passes_against_mock(self):
155
+ from omega_engine.smoke import run_smoke
156
+ with tempfile.TemporaryDirectory() as td:
157
+ result = run_smoke(omega_home=td)
158
+ self.assertTrue(result.passed,
159
+ msg=f"smoke failed: {result.detail}")
160
+ self.assertEqual(result.final_state, "completed")
161
+ self.assertGreater(result.events_recorded, 0)
162
+
163
+
164
+ # ---------------------------------------------------------------------------
165
+ # prune.py
166
+ # ---------------------------------------------------------------------------
167
+
168
+
169
+ class TestPrune(unittest.TestCase):
170
+ def _seed_telegram_history(self, home: Path, *, old_count: int, new_count: int):
171
+ from omega_engine.telegram_history import _connect, record_inbound
172
+ # Now-recent messages.
173
+ for i in range(new_count):
174
+ record_inbound(home, topic_id=1, text=f"new-{i}")
175
+ # Artificially old rows.
176
+ conn = _connect(home)
177
+ for i in range(old_count):
178
+ conn.execute(
179
+ "INSERT INTO messages (topic_id, role, text, message_id, timestamp) "
180
+ "VALUES (?, ?, ?, ?, ?)",
181
+ (1, "user", f"old-{i}", None, 0),
182
+ )
183
+ conn.commit()
184
+ conn.close()
185
+
186
+ def test_prune_telegram_dry_run_doesnt_delete(self):
187
+ from omega_engine.prune import prune_telegram
188
+ with tempfile.TemporaryDirectory() as td:
189
+ self._seed_telegram_history(Path(td), old_count=3, new_count=2)
190
+ report = prune_telegram(td, older_than_days=30, dry_run=True)
191
+ self.assertEqual(report.rows_deleted, 3)
192
+ self.assertTrue(report.dry_run)
193
+ # Verify nothing was actually deleted.
194
+ from omega_engine.telegram_history import recent_messages
195
+ still = recent_messages(td, topic_id=1, limit=100)
196
+ self.assertEqual(len(still), 5)
197
+
198
+ def test_prune_telegram_yes_actually_deletes(self):
199
+ from omega_engine.prune import prune_telegram
200
+ from omega_engine.telegram_history import recent_messages
201
+ with tempfile.TemporaryDirectory() as td:
202
+ self._seed_telegram_history(Path(td), old_count=3, new_count=2)
203
+ report = prune_telegram(td, older_than_days=30, dry_run=False)
204
+ self.assertEqual(report.rows_deleted, 3)
205
+ still = recent_messages(td, topic_id=1, limit=100)
206
+ self.assertEqual(len(still), 2)
207
+
208
+ def test_prune_all_returns_one_per_target(self):
209
+ from omega_engine.prune import prune_all
210
+ with tempfile.TemporaryDirectory() as td:
211
+ reports = prune_all(td, older_than_days=30, dry_run=True)
212
+ targets = [r.target for r in reports]
213
+ self.assertEqual(targets, ["events", "audits", "telegram", "sessions"])
214
+
215
+
216
+ # ---------------------------------------------------------------------------
217
+ # backup.py
218
+ # ---------------------------------------------------------------------------
219
+
220
+
221
+ class TestBackup(unittest.TestCase):
222
+ def _seed_tree(self, home: Path) -> None:
223
+ # Minimal backupable structure
224
+ (home / "Agentik_Runtime" / "eventlog").mkdir(parents=True)
225
+ (home / "Agentik_Runtime" / "eventlog" / "omega.db").write_text("fake-db")
226
+ (home / "Agentik_Extra" / "etc" / "secrets").mkdir(parents=True)
227
+ (home / "Agentik_Extra" / "etc" / "secrets" / "x.age").write_text("encrypted")
228
+ (home / "Agentik_SSOT").mkdir(parents=True)
229
+ (home / "Agentik_SSOT" / "VERSION").write_text("0.5.0")
230
+ (home / "Agentik_Coding").mkdir(parents=True)
231
+ (home / "Agentik_Coding" / "projects.json").write_text("[]")
232
+
233
+ def test_backup_creates_tarball(self):
234
+ from omega_engine.backup import backup
235
+ with tempfile.TemporaryDirectory() as td:
236
+ home = Path(td) / "Omega"
237
+ home.mkdir()
238
+ self._seed_tree(home)
239
+ result = backup(home, out_dir=Path(td))
240
+ self.assertTrue(result.bundle.exists())
241
+ self.assertGreater(result.bytes, 0)
242
+ self.assertFalse(result.encrypted)
243
+
244
+ def test_backup_then_restore_roundtrip(self):
245
+ from omega_engine.backup import backup, restore
246
+ with tempfile.TemporaryDirectory() as td:
247
+ home = Path(td) / "Omega"
248
+ home.mkdir()
249
+ self._seed_tree(home)
250
+ result = backup(home, out_dir=Path(td))
251
+
252
+ # Restore into a clean tree.
253
+ target = Path(td) / "restored"
254
+ target.mkdir()
255
+ r = restore(result.bundle, target=target)
256
+ self.assertGreater(r.files, 0)
257
+ self.assertTrue((target / "Agentik_SSOT" / "VERSION").exists())
258
+ self.assertEqual(
259
+ (target / "Agentik_SSOT" / "VERSION").read_text(), "0.5.0",
260
+ )
261
+
262
+ def test_verify_passes_on_clean_bundle(self):
263
+ from omega_engine.backup import backup, verify
264
+ with tempfile.TemporaryDirectory() as td:
265
+ home = Path(td) / "Omega"
266
+ home.mkdir()
267
+ self._seed_tree(home)
268
+ result = backup(home, out_dir=Path(td))
269
+ v = verify(result.bundle)
270
+ self.assertTrue(v["ok"])
271
+
272
+
273
+ # ---------------------------------------------------------------------------
274
+ # costs.py
275
+ # ---------------------------------------------------------------------------
276
+
277
+
278
+ class TestCosts(unittest.TestCase):
279
+ def test_estimate_cost_claude(self):
280
+ from omega_engine.costs import estimate_cost
281
+ # 1M in + 1M out on claude-sonnet → 3 + 15 = 18 USD
282
+ cost = estimate_cost(
283
+ "claude", input_tokens=1_000_000, output_tokens=1_000_000,
284
+ model="claude-sonnet-4-6",
285
+ )
286
+ self.assertAlmostEqual(cost, 18.0, places=2)
287
+
288
+ def test_estimate_cost_unknown_provider_zero(self):
289
+ from omega_engine.costs import estimate_cost
290
+ self.assertEqual(
291
+ estimate_cost("not-real", input_tokens=1000, output_tokens=1000),
292
+ 0.0,
293
+ )
294
+
295
+ def test_rate_card_summary_includes_known_providers(self):
296
+ from omega_engine.costs import rate_card_summary
297
+ s = rate_card_summary()
298
+ for p in ("claude", "openai", "glm", "deepseek"):
299
+ self.assertIn(p, s["providers"])
300
+
301
+
302
+ # ---------------------------------------------------------------------------
303
+ # audit_diff.py
304
+ # ---------------------------------------------------------------------------
305
+
306
+
307
+ class TestAuditDiff(unittest.TestCase):
308
+ def test_diff_classifies_fixed_new_persist_regressed(self):
309
+ from omega_engine.audit_diff import diff_runs
310
+ from omega_engine.audits.history import (
311
+ AuditRun, make_run_id, now, record_run,
312
+ )
313
+ with tempfile.TemporaryDirectory() as td:
314
+ base = now()
315
+ f_fixed = {"phase": "p", "location": "a.py:1",
316
+ "message": "bug A", "severity": "high"}
317
+ f_persist = {"phase": "p", "location": "b.py:1",
318
+ "message": "bug B", "severity": "medium"}
319
+ f_regressed1 = {"phase": "p", "location": "c.py:1",
320
+ "message": "bug C", "severity": "low"}
321
+ f_regressed2 = {"phase": "p", "location": "c.py:1",
322
+ "message": "bug C", "severity": "high"}
323
+ f_new = {"phase": "p", "location": "d.py:1",
324
+ "message": "bug D", "severity": "medium"}
325
+
326
+ record_run(td, AuditRun(
327
+ run_id="ar-1", audit_id="codeaudit", scope=".",
328
+ timestamp=base, score=70, verified=False, finding_count=3,
329
+ verdict={"findings": [f_fixed, f_persist, f_regressed1]},
330
+ ))
331
+ record_run(td, AuditRun(
332
+ run_id="ar-2", audit_id="codeaudit", scope=".",
333
+ timestamp=base + 1, score=80, verified=False, finding_count=3,
334
+ verdict={"findings": [f_persist, f_regressed2, f_new]},
335
+ ))
336
+ d = diff_runs(td, "ar-1", "ar-2")
337
+ self.assertEqual(d.delta, 10)
338
+ self.assertEqual(len(d.fixed), 1)
339
+ self.assertEqual(d.fixed[0]["location"], "a.py:1")
340
+ self.assertEqual(len(d.new), 1)
341
+ self.assertEqual(d.new[0]["location"], "d.py:1")
342
+ self.assertEqual(len(d.persist), 2) # b.py + c.py both in both runs
343
+ self.assertEqual(len(d.regressed), 1)
344
+ self.assertEqual(d.regressed[0]["location"], "c.py:1")
345
+
346
+ def test_diff_unknown_run_raises(self):
347
+ from omega_engine.audit_diff import diff_runs
348
+ with tempfile.TemporaryDirectory() as td:
349
+ with self.assertRaises(KeyError):
350
+ diff_runs(td, "missing-1", "missing-2")
351
+
352
+
353
+ # ---------------------------------------------------------------------------
354
+ # ssh-key-rotate template ships
355
+ # ---------------------------------------------------------------------------
356
+
357
+
358
+ class TestSshRotateTemplate(unittest.TestCase):
359
+ def test_template_present_and_parseable(self):
360
+ REPO = Path(__file__).resolve().parents[3]
361
+ tmpl = REPO / "bootstrap" / "templates" / "autonomous" / "ssh-key-rotate.yaml"
362
+ self.assertTrue(tmpl.exists())
363
+ data = yaml.safe_load(tmpl.read_text())
364
+ self.assertEqual(data["id"], "ssh-key-rotate")
365
+ self.assertFalse(data["enabled"]) # opt-in by design
366
+ self.assertEqual(data["trigger"]["type"], "cron")
367
+
368
+
369
+ if __name__ == "__main__":
370
+ unittest.main(verbosity=2)
@@ -0,0 +1,173 @@
1
+ """Tests for the encrypted secrets vault.
2
+
3
+ Two backends to exercise:
4
+
5
+ * **plain** — always runs (the fallback when `age` is not installed).
6
+ * **age** — runs only when `age` and `age-keygen` are both on PATH.
7
+ We skip the age-specific cases otherwise so CI on minimal
8
+ hosts doesn't go red.
9
+
10
+ Also exercises the path-traversal refusal and the round-trip invariant
11
+ (write then read returns the same value).
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import os
16
+ import shutil
17
+ import sys
18
+ import tempfile
19
+ import unittest
20
+ from pathlib import Path
21
+ from unittest import mock
22
+
23
+
24
+ HERE = Path(__file__).resolve().parent
25
+ sys.path.insert(0, str(HERE.parent))
26
+
27
+ from omega_engine.vault import ( # noqa: E402
28
+ _safe_ref,
29
+ vault_init,
30
+ vault_read,
31
+ vault_status,
32
+ vault_write,
33
+ )
34
+
35
+
36
+ AGE_AVAILABLE = bool(shutil.which("age")) and bool(shutil.which("age-keygen"))
37
+
38
+
39
+ class TestSafeRef(unittest.TestCase):
40
+ def test_rejects_empty(self):
41
+ with self.assertRaises(ValueError):
42
+ _safe_ref("")
43
+
44
+ def test_rejects_path_traversal(self):
45
+ for bad in ("../escape", "a/b", "x\\y", ".hidden"):
46
+ with self.assertRaises(ValueError):
47
+ _safe_ref(bad)
48
+
49
+ def test_accepts_flat_names(self):
50
+ for good in ("CLAUDE_OAUTH", "max-primary_TOKEN", "abc123"):
51
+ self.assertEqual(_safe_ref(good), good)
52
+
53
+
54
+ class TestPlainBackend(unittest.TestCase):
55
+ """The fallback backend, always available."""
56
+
57
+ def test_init_with_no_age_picks_plain(self):
58
+ with tempfile.TemporaryDirectory() as td:
59
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
60
+ info = vault_init(td)
61
+ self.assertEqual(info["backend"], "plain")
62
+ self.assertFalse(info["age_installed"])
63
+ sec = Path(td) / "Agentik_Extra" / "etc" / "secrets"
64
+ self.assertTrue(sec.is_dir())
65
+ # secrets dir is mode 700
66
+ mode = sec.stat().st_mode & 0o777
67
+ self.assertEqual(mode, 0o700)
68
+
69
+ def test_round_trip_plain(self):
70
+ with tempfile.TemporaryDirectory() as td:
71
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
72
+ path = vault_write(td, "MY_TOKEN", "s3cret-value")
73
+ # mode 600
74
+ mode = path.stat().st_mode & 0o777
75
+ self.assertEqual(mode, 0o600)
76
+ # file is named without .age suffix in plain mode
77
+ self.assertTrue(path.name.endswith("MY_TOKEN"))
78
+ self.assertFalse(path.name.endswith(".age"))
79
+
80
+ got = vault_read(td, "MY_TOKEN")
81
+ self.assertEqual(got, "s3cret-value")
82
+
83
+ def test_read_returns_none_when_missing(self):
84
+ with tempfile.TemporaryDirectory() as td:
85
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
86
+ self.assertIsNone(vault_read(td, "ABSENT"))
87
+
88
+ def test_overwrite_rotates_in_place(self):
89
+ with tempfile.TemporaryDirectory() as td:
90
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
91
+ vault_write(td, "TOK", "v1")
92
+ vault_write(td, "TOK", "v2")
93
+ self.assertEqual(vault_read(td, "TOK"), "v2")
94
+
95
+ def test_status_counts_plain(self):
96
+ with tempfile.TemporaryDirectory() as td:
97
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
98
+ vault_write(td, "A", "1")
99
+ vault_write(td, "B", "2")
100
+ status = vault_status(td)
101
+ self.assertEqual(status["backend"], "plain")
102
+ self.assertEqual(status["plaintext_count"], 2)
103
+ self.assertEqual(status["encrypted_count"], 0)
104
+
105
+
106
+ @unittest.skipUnless(AGE_AVAILABLE, "age + age-keygen not installed on this host")
107
+ class TestAgeBackend(unittest.TestCase):
108
+ """Exercised only when age is installed (CI may or may not have it)."""
109
+
110
+ def test_init_generates_keypair(self):
111
+ with tempfile.TemporaryDirectory() as td:
112
+ info = vault_init(td)
113
+ self.assertEqual(info["backend"], "age")
114
+ key = Path(info["key_path"])
115
+ pub = Path(info["pub_path"])
116
+ self.assertTrue(key.exists())
117
+ self.assertTrue(pub.exists())
118
+ self.assertEqual(key.stat().st_mode & 0o777, 0o600)
119
+ # public key file starts with "age1"
120
+ self.assertTrue(pub.read_text().strip().startswith("age1"))
121
+
122
+ def test_init_is_idempotent(self):
123
+ with tempfile.TemporaryDirectory() as td:
124
+ a = vault_init(td)
125
+ b = vault_init(td)
126
+ self.assertEqual(a["key_path"], b["key_path"])
127
+ self.assertEqual(a["pub_path"], b["pub_path"])
128
+
129
+ def test_round_trip_age(self):
130
+ with tempfile.TemporaryDirectory() as td:
131
+ path = vault_write(td, "OAUTH_X", "abc-DEF-123")
132
+ self.assertTrue(path.name.endswith(".age"))
133
+ mode = path.stat().st_mode & 0o777
134
+ self.assertEqual(mode, 0o600)
135
+ got = vault_read(td, "OAUTH_X")
136
+ self.assertEqual(got, "abc-DEF-123")
137
+
138
+ def test_status_counts_encrypted(self):
139
+ with tempfile.TemporaryDirectory() as td:
140
+ vault_write(td, "A", "1")
141
+ vault_write(td, "B", "2")
142
+ status = vault_status(td)
143
+ self.assertEqual(status["backend"], "age")
144
+ self.assertEqual(status["encrypted_count"], 2)
145
+ self.assertEqual(status["plaintext_count"], 0)
146
+
147
+ def test_write_cleans_up_old_plaintext(self):
148
+ with tempfile.TemporaryDirectory() as td:
149
+ # Pre-seed a plaintext file as if from a legacy install.
150
+ with mock.patch("omega_engine.vault._age_available", return_value=False):
151
+ vault_write(td, "LEGACY", "old")
152
+ # Now write through the age backend.
153
+ vault_write(td, "LEGACY", "new")
154
+ sec = Path(td) / "Agentik_Extra" / "etc" / "secrets"
155
+ self.assertTrue((sec / "LEGACY.age").exists())
156
+ self.assertFalse((sec / "LEGACY").exists(),
157
+ "old plaintext should have been cleaned up")
158
+ self.assertEqual(vault_read(td, "LEGACY"), "new")
159
+
160
+
161
+ class TestAccountUsesVault(unittest.TestCase):
162
+ """`account.write_token` / `read_token` must round-trip through the vault."""
163
+
164
+ def test_account_token_round_trip(self):
165
+ from omega_engine.account import read_token, write_token
166
+
167
+ with tempfile.TemporaryDirectory() as td:
168
+ write_token(td, "MAX_PRIMARY", "claude-token-xyz")
169
+ self.assertEqual(read_token(td, "MAX_PRIMARY"), "claude-token-xyz")
170
+
171
+
172
+ if __name__ == "__main__":
173
+ unittest.main(verbosity=2)