codex-autorunner 0.1.1__tar.gz → 1.0.0__tar.gz

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 (425) hide show
  1. {codex_autorunner-0.1.1/src/codex_autorunner.egg-info → codex_autorunner-1.0.0}/PKG-INFO +20 -21
  2. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/README.md +17 -20
  3. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/pyproject.toml +8 -1
  4. codex_autorunner-1.0.0/src/codex_autorunner/__main__.py +4 -0
  5. codex_autorunner-1.0.0/src/codex_autorunner/agents/__init__.py +21 -0
  6. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/base.py +2 -2
  7. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/codex/harness.py +1 -1
  8. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/opencode/__init__.py +4 -0
  9. codex_autorunner-1.0.0/src/codex_autorunner/agents/opencode/agent_config.py +104 -0
  10. codex_autorunner-1.0.0/src/codex_autorunner/agents/opencode/client.py +586 -0
  11. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/opencode/harness.py +71 -20
  12. codex_autorunner-1.0.0/src/codex_autorunner/agents/opencode/logging.py +225 -0
  13. codex_autorunner-1.0.0/src/codex_autorunner/agents/opencode/run_prompt.py +261 -0
  14. codex_autorunner-1.0.0/src/codex_autorunner/agents/opencode/runtime.py +1579 -0
  15. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/opencode/supervisor.py +194 -68
  16. codex_autorunner-1.0.0/src/codex_autorunner/agents/registry.py +258 -0
  17. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/types.py +2 -2
  18. codex_autorunner-1.0.0/src/codex_autorunner/api.py +25 -0
  19. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/bootstrap.py +19 -40
  20. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/cli.py +234 -151
  21. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/about_car.py +44 -32
  22. codex_autorunner-1.0.0/src/codex_autorunner/core/adapter_utils.py +21 -0
  23. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/app_server_events.py +15 -6
  24. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/app_server_logging.py +55 -15
  25. codex_autorunner-1.0.0/src/codex_autorunner/core/app_server_prompts.py +145 -0
  26. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/app_server_threads.py +15 -26
  27. codex_autorunner-1.0.0/src/codex_autorunner/core/circuit_breaker.py +183 -0
  28. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/codex_runner.py +6 -0
  29. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/config.py +555 -133
  30. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/docs.py +54 -9
  31. codex_autorunner-1.0.0/src/codex_autorunner/core/drafts.py +82 -0
  32. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/engine.py +828 -274
  33. codex_autorunner-1.0.0/src/codex_autorunner/core/exceptions.py +60 -0
  34. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/__init__.py +25 -0
  35. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/controller.py +178 -0
  36. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/definition.py +82 -0
  37. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/models.py +75 -0
  38. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/runtime.py +351 -0
  39. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/store.py +485 -0
  40. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/transition.py +133 -0
  41. codex_autorunner-1.0.0/src/codex_autorunner/core/flows/worker_process.py +242 -0
  42. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/hub.py +21 -13
  43. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/locks.py +118 -1
  44. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/logging_utils.py +9 -6
  45. codex_autorunner-1.0.0/src/codex_autorunner/core/path_utils.py +123 -0
  46. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/prompt.py +15 -7
  47. codex_autorunner-1.0.0/src/codex_autorunner/core/redaction.py +29 -0
  48. codex_autorunner-1.0.0/src/codex_autorunner/core/retry.py +61 -0
  49. codex_autorunner-1.0.0/src/codex_autorunner/core/review.py +888 -0
  50. codex_autorunner-1.0.0/src/codex_autorunner/core/review_context.py +161 -0
  51. codex_autorunner-1.0.0/src/codex_autorunner/core/run_index.py +223 -0
  52. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/runner_controller.py +44 -1
  53. codex_autorunner-1.0.0/src/codex_autorunner/core/runner_process.py +58 -0
  54. codex_autorunner-1.0.0/src/codex_autorunner/core/sqlite_utils.py +32 -0
  55. codex_autorunner-1.0.0/src/codex_autorunner/core/state.py +389 -0
  56. codex_autorunner-1.0.0/src/codex_autorunner/core/static_assets.py +55 -0
  57. codex_autorunner-1.0.0/src/codex_autorunner/core/supervisor_utils.py +67 -0
  58. codex_autorunner-1.0.0/src/codex_autorunner/core/text_delta_coalescer.py +43 -0
  59. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/update.py +20 -11
  60. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/update_runner.py +2 -0
  61. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/usage.py +107 -75
  62. codex_autorunner-1.0.0/src/codex_autorunner/core/utils.py +297 -0
  63. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/discovery.py +3 -3
  64. codex_autorunner-1.0.0/src/codex_autorunner/flows/ticket_flow/__init__.py +3 -0
  65. codex_autorunner-1.0.0/src/codex_autorunner/flows/ticket_flow/definition.py +91 -0
  66. codex_autorunner-1.0.0/src/codex_autorunner/integrations/agents/__init__.py +27 -0
  67. codex_autorunner-1.0.0/src/codex_autorunner/integrations/agents/agent_backend.py +142 -0
  68. codex_autorunner-1.0.0/src/codex_autorunner/integrations/agents/codex_backend.py +307 -0
  69. codex_autorunner-1.0.0/src/codex_autorunner/integrations/agents/opencode_backend.py +325 -0
  70. codex_autorunner-1.0.0/src/codex_autorunner/integrations/agents/run_event.py +71 -0
  71. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/app_server/client.py +708 -153
  72. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/app_server/supervisor.py +59 -33
  73. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/adapter.py +474 -185
  74. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/api_schemas.py +120 -0
  75. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/config.py +239 -1
  76. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/constants.py +19 -1
  77. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/dispatch.py +44 -8
  78. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/doctor.py +47 -0
  79. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/handlers/approvals.py +12 -10
  80. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/handlers/callbacks.py +15 -1
  81. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/__init__.py +29 -0
  82. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/approvals.py +173 -0
  83. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/execution.py +2595 -0
  84. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/files.py +1408 -0
  85. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/flows.py +227 -0
  86. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/formatting.py +81 -0
  87. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/github.py +1688 -0
  88. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/shared.py +190 -0
  89. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/voice.py +112 -0
  90. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands/workspace.py +2043 -0
  91. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands_runtime.py +2741 -0
  92. codex_autorunner-0.1.1/src/codex_autorunner/integrations/telegram/handlers/commands.py → codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/commands_spec.py +11 -4
  93. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/handlers/messages.py +374 -49
  94. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/questions.py +389 -0
  95. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/handlers/selections.py +6 -4
  96. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/handlers/utils.py +171 -0
  97. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/helpers.py +90 -18
  98. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/notifications.py +126 -35
  99. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/outbox.py +366 -0
  100. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/progress_stream.py +42 -19
  101. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/runtime.py +24 -13
  102. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/service.py +500 -129
  103. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/state.py +2216 -0
  104. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/ticket_flow_bridge.py +322 -0
  105. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/transport.py +37 -4
  106. codex_autorunner-1.0.0/src/codex_autorunner/integrations/telegram/trigger_mode.py +53 -0
  107. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/types.py +22 -2
  108. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/voice.py +14 -15
  109. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/manifest.py +2 -0
  110. codex_autorunner-1.0.0/src/codex_autorunner/plugin_api.py +22 -0
  111. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/__init__.py +25 -14
  112. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/agents.py +18 -78
  113. codex_autorunner-1.0.0/src/codex_autorunner/routes/analytics.py +239 -0
  114. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/base.py +142 -113
  115. codex_autorunner-1.0.0/src/codex_autorunner/routes/file_chat.py +836 -0
  116. codex_autorunner-1.0.0/src/codex_autorunner/routes/flows.py +980 -0
  117. codex_autorunner-1.0.0/src/codex_autorunner/routes/messages.py +459 -0
  118. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/repos.py +17 -0
  119. codex_autorunner-1.0.0/src/codex_autorunner/routes/review.py +148 -0
  120. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/sessions.py +16 -8
  121. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/settings.py +22 -0
  122. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/shared.py +33 -3
  123. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/system.py +22 -1
  124. codex_autorunner-1.0.0/src/codex_autorunner/routes/usage.py +87 -0
  125. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/voice.py +5 -13
  126. codex_autorunner-1.0.0/src/codex_autorunner/routes/workspace.py +271 -0
  127. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/server.py +2 -1
  128. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/agentControls.js +9 -1
  129. codex_autorunner-1.0.0/src/codex_autorunner/static/agentEvents.js +248 -0
  130. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/app.js +27 -22
  131. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/autoRefresh.js +29 -1
  132. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/bootstrap.js +1 -0
  133. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/bus.js +1 -0
  134. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/cache.js +1 -0
  135. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/constants.js +20 -4
  136. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/dashboard.js +162 -150
  137. codex_autorunner-1.0.0/src/codex_autorunner/static/diffRenderer.js +37 -0
  138. codex_autorunner-1.0.0/src/codex_autorunner/static/docChatCore.js +324 -0
  139. codex_autorunner-1.0.0/src/codex_autorunner/static/docChatStorage.js +65 -0
  140. codex_autorunner-1.0.0/src/codex_autorunner/static/docChatVoice.js +65 -0
  141. codex_autorunner-1.0.0/src/codex_autorunner/static/docEditor.js +133 -0
  142. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/env.js +1 -0
  143. codex_autorunner-1.0.0/src/codex_autorunner/static/eventSummarizer.js +166 -0
  144. codex_autorunner-1.0.0/src/codex_autorunner/static/fileChat.js +182 -0
  145. codex_autorunner-1.0.0/src/codex_autorunner/static/health.js +155 -0
  146. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/hub.js +67 -126
  147. codex_autorunner-1.0.0/src/codex_autorunner/static/index.html +909 -0
  148. codex_autorunner-1.0.0/src/codex_autorunner/static/liveUpdates.js +59 -0
  149. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/loader.js +1 -0
  150. codex_autorunner-1.0.0/src/codex_autorunner/static/messages.js +470 -0
  151. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/mobileCompact.js +2 -1
  152. codex_autorunner-1.0.0/src/codex_autorunner/static/settings.js +154 -0
  153. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/styles.css +7577 -3758
  154. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/tabs.js +28 -5
  155. codex_autorunner-1.0.0/src/codex_autorunner/static/terminal.js +26 -0
  156. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/terminalManager.js +53 -59
  157. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketChatActions.js +333 -0
  158. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketChatEvents.js +16 -0
  159. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketChatStorage.js +16 -0
  160. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketChatStream.js +264 -0
  161. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketEditor.js +750 -0
  162. codex_autorunner-1.0.0/src/codex_autorunner/static/ticketVoice.js +9 -0
  163. codex_autorunner-1.0.0/src/codex_autorunner/static/tickets.js +1315 -0
  164. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/utils.js +32 -3
  165. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/voice.js +21 -7
  166. codex_autorunner-1.0.0/src/codex_autorunner/static/workspace.js +672 -0
  167. codex_autorunner-1.0.0/src/codex_autorunner/static/workspaceApi.js +53 -0
  168. codex_autorunner-1.0.0/src/codex_autorunner/static/workspaceFileBrowser.js +504 -0
  169. codex_autorunner-1.0.0/src/codex_autorunner/tickets/__init__.py +20 -0
  170. codex_autorunner-1.0.0/src/codex_autorunner/tickets/agent_pool.py +377 -0
  171. codex_autorunner-1.0.0/src/codex_autorunner/tickets/files.py +85 -0
  172. codex_autorunner-1.0.0/src/codex_autorunner/tickets/frontmatter.py +55 -0
  173. codex_autorunner-1.0.0/src/codex_autorunner/tickets/lint.py +102 -0
  174. codex_autorunner-1.0.0/src/codex_autorunner/tickets/models.py +95 -0
  175. codex_autorunner-1.0.0/src/codex_autorunner/tickets/outbox.py +232 -0
  176. codex_autorunner-1.0.0/src/codex_autorunner/tickets/replies.py +179 -0
  177. codex_autorunner-1.0.0/src/codex_autorunner/tickets/runner.py +823 -0
  178. codex_autorunner-1.0.0/src/codex_autorunner/tickets/spec_ingest.py +77 -0
  179. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/capture.py +7 -7
  180. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/service.py +51 -9
  181. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/app.py +419 -199
  182. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/hub_jobs.py +13 -2
  183. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/middleware.py +47 -13
  184. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/pty_session.py +26 -13
  185. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/schemas.py +114 -109
  186. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/static_assets.py +55 -42
  187. codex_autorunner-1.0.0/src/codex_autorunner/web/static_refresh.py +86 -0
  188. codex_autorunner-1.0.0/src/codex_autorunner/workspace/__init__.py +40 -0
  189. codex_autorunner-1.0.0/src/codex_autorunner/workspace/paths.py +319 -0
  190. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0/src/codex_autorunner.egg-info}/PKG-INFO +20 -21
  191. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner.egg-info/SOURCES.txt +124 -49
  192. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner.egg-info/requires.txt +2 -0
  193. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_about_car_terminal_context.py +3 -3
  194. codex_autorunner-1.0.0/tests/test_agent_run_events.py +347 -0
  195. codex_autorunner-1.0.0/tests/test_agents_plugins.py +67 -0
  196. codex_autorunner-1.0.0/tests/test_agents_registry.py +239 -0
  197. codex_autorunner-1.0.0/tests/test_api_contract.py +47 -0
  198. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_app_server_client.py +39 -2
  199. codex_autorunner-1.0.0/tests/test_app_server_event_formatter.py +252 -0
  200. codex_autorunner-1.0.0/tests/test_app_server_prompts.py +36 -0
  201. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_auth_middleware.py +1 -3
  202. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_base_path_static.py +8 -10
  203. codex_autorunner-1.0.0/tests/test_cli_status.py +53 -0
  204. codex_autorunner-1.0.0/tests/test_codex_app_server_integration.py +360 -0
  205. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_config_resolution.py +145 -2
  206. codex_autorunner-1.0.0/tests/test_core_web_boundary.py +18 -0
  207. codex_autorunner-1.0.0/tests/test_engine_end_review.py +102 -0
  208. codex_autorunner-1.0.0/tests/test_file_chat_drafts.py +115 -0
  209. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_hub_create.py +2 -2
  210. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_hub_foundation.py +1 -1
  211. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_hub_supervisor.py +46 -10
  212. codex_autorunner-1.0.0/tests/test_lock_utils.py +62 -0
  213. codex_autorunner-1.0.0/tests/test_opencode_agent_config.py +176 -0
  214. codex_autorunner-1.0.0/tests/test_opencode_client.py +59 -0
  215. codex_autorunner-1.0.0/tests/test_opencode_event_formatter.py +28 -0
  216. codex_autorunner-1.0.0/tests/test_opencode_review_arguments.py +32 -0
  217. codex_autorunner-1.0.0/tests/test_opencode_runtime.py +525 -0
  218. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_patch_utils.py +16 -8
  219. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_prompt.py +3 -5
  220. codex_autorunner-1.0.0/tests/test_redaction.py +60 -0
  221. codex_autorunner-1.0.0/tests/test_request_logging.py +172 -0
  222. codex_autorunner-1.0.0/tests/test_review_context.py +35 -0
  223. codex_autorunner-1.0.0/tests/test_review_service.py +16 -0
  224. codex_autorunner-1.0.0/tests/test_runner_controller.py +295 -0
  225. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_state_lock.py +1 -1
  226. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_state_sessions.py +1 -1
  227. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_static_asset_cache.py +31 -14
  228. codex_autorunner-1.0.0/tests/test_telegram_adapter.py +1047 -0
  229. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_bot_config.py +94 -0
  230. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_bot_integration.py +10 -4
  231. codex_autorunner-1.0.0/tests/test_telegram_codex_feature_flags.py +67 -0
  232. codex_autorunner-1.0.0/tests/test_telegram_fast_ack.py +257 -0
  233. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_handlers_callbacks.py +63 -4
  234. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_handlers_messages.py +37 -11
  235. codex_autorunner-1.0.0/tests/test_telegram_media_batch_failure.py +46 -0
  236. codex_autorunner-1.0.0/tests/test_telegram_opencode_context_cache.py +74 -0
  237. codex_autorunner-1.0.0/tests/test_telegram_opencode_usage.py +53 -0
  238. codex_autorunner-1.0.0/tests/test_telegram_outbox.py +303 -0
  239. codex_autorunner-1.0.0/tests/test_telegram_progress_stream.py +27 -0
  240. codex_autorunner-1.0.0/tests/test_telegram_review_opencode.py +339 -0
  241. codex_autorunner-1.0.0/tests/test_telegram_state.py +34 -0
  242. codex_autorunner-1.0.0/tests/test_telegram_status_rate_limits.py +131 -0
  243. codex_autorunner-1.0.0/tests/test_telegram_topic_queue.py +30 -0
  244. codex_autorunner-1.0.0/tests/test_telegram_trigger_mode.py +45 -0
  245. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_turn_queue.py +16 -7
  246. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_update_dedupe.py +4 -4
  247. codex_autorunner-1.0.0/tests/test_ticket_flow_approval_config.py +125 -0
  248. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_transcribe_endpoint.py +6 -6
  249. codex_autorunner-1.0.0/tests/test_workspace_functional.py +378 -0
  250. codex_autorunner-1.0.0/tests/test_workspace_paths.py +42 -0
  251. codex_autorunner-0.1.1/src/codex_autorunner/agents/__init__.py +0 -1
  252. codex_autorunner-0.1.1/src/codex_autorunner/agents/opencode/client.py +0 -309
  253. codex_autorunner-0.1.1/src/codex_autorunner/agents/opencode/runtime.py +0 -509
  254. codex_autorunner-0.1.1/src/codex_autorunner/core/app_server_prompts.py +0 -376
  255. codex_autorunner-0.1.1/src/codex_autorunner/core/doc_chat.py +0 -1415
  256. codex_autorunner-0.1.1/src/codex_autorunner/core/runner_process.py +0 -29
  257. codex_autorunner-0.1.1/src/codex_autorunner/core/snapshot.py +0 -580
  258. codex_autorunner-0.1.1/src/codex_autorunner/core/state.py +0 -160
  259. codex_autorunner-0.1.1/src/codex_autorunner/core/utils.py +0 -133
  260. codex_autorunner-0.1.1/src/codex_autorunner/integrations/github/chatops.py +0 -268
  261. codex_autorunner-0.1.1/src/codex_autorunner/integrations/github/pr_flow.py +0 -1314
  262. codex_autorunner-0.1.1/src/codex_autorunner/integrations/telegram/handlers/commands_runtime.py +0 -7476
  263. codex_autorunner-0.1.1/src/codex_autorunner/integrations/telegram/outbox.py +0 -195
  264. codex_autorunner-0.1.1/src/codex_autorunner/integrations/telegram/state.py +0 -1268
  265. codex_autorunner-0.1.1/src/codex_autorunner/routes/docs.py +0 -381
  266. codex_autorunner-0.1.1/src/codex_autorunner/routes/github.py +0 -327
  267. codex_autorunner-0.1.1/src/codex_autorunner/routes/runs.py +0 -118
  268. codex_autorunner-0.1.1/src/codex_autorunner/spec_ingest.py +0 -788
  269. codex_autorunner-0.1.1/src/codex_autorunner/static/docChatActions.js +0 -279
  270. codex_autorunner-0.1.1/src/codex_autorunner/static/docChatEvents.js +0 -300
  271. codex_autorunner-0.1.1/src/codex_autorunner/static/docChatRender.js +0 -205
  272. codex_autorunner-0.1.1/src/codex_autorunner/static/docChatStream.js +0 -361
  273. codex_autorunner-0.1.1/src/codex_autorunner/static/docs.js +0 -20
  274. codex_autorunner-0.1.1/src/codex_autorunner/static/docsClipboard.js +0 -69
  275. codex_autorunner-0.1.1/src/codex_autorunner/static/docsCrud.js +0 -257
  276. codex_autorunner-0.1.1/src/codex_autorunner/static/docsDocUpdates.js +0 -62
  277. codex_autorunner-0.1.1/src/codex_autorunner/static/docsDrafts.js +0 -16
  278. codex_autorunner-0.1.1/src/codex_autorunner/static/docsElements.js +0 -69
  279. codex_autorunner-0.1.1/src/codex_autorunner/static/docsInit.js +0 -274
  280. codex_autorunner-0.1.1/src/codex_autorunner/static/docsParse.js +0 -160
  281. codex_autorunner-0.1.1/src/codex_autorunner/static/docsSnapshot.js +0 -87
  282. codex_autorunner-0.1.1/src/codex_autorunner/static/docsSpecIngest.js +0 -263
  283. codex_autorunner-0.1.1/src/codex_autorunner/static/docsState.js +0 -127
  284. codex_autorunner-0.1.1/src/codex_autorunner/static/docsThreadRegistry.js +0 -44
  285. codex_autorunner-0.1.1/src/codex_autorunner/static/docsUi.js +0 -153
  286. codex_autorunner-0.1.1/src/codex_autorunner/static/docsVoice.js +0 -56
  287. codex_autorunner-0.1.1/src/codex_autorunner/static/github.js +0 -442
  288. codex_autorunner-0.1.1/src/codex_autorunner/static/index.html +0 -928
  289. codex_autorunner-0.1.1/src/codex_autorunner/static/logs.js +0 -640
  290. codex_autorunner-0.1.1/src/codex_autorunner/static/runs.js +0 -409
  291. codex_autorunner-0.1.1/src/codex_autorunner/static/settings.js +0 -335
  292. codex_autorunner-0.1.1/src/codex_autorunner/static/snapshot.js +0 -124
  293. codex_autorunner-0.1.1/src/codex_autorunner/static/state.js +0 -86
  294. codex_autorunner-0.1.1/src/codex_autorunner/static/terminal.js +0 -12
  295. codex_autorunner-0.1.1/src/codex_autorunner/static/todoPreview.js +0 -27
  296. codex_autorunner-0.1.1/src/codex_autorunner/workspace.py +0 -16
  297. codex_autorunner-0.1.1/tests/test_api_contract.py +0 -37
  298. codex_autorunner-0.1.1/tests/test_app_server_prompts.py +0 -84
  299. codex_autorunner-0.1.1/tests/test_chatops.py +0 -38
  300. codex_autorunner-0.1.1/tests/test_cli_snapshot.py +0 -37
  301. codex_autorunner-0.1.1/tests/test_doc_chat.py +0 -508
  302. codex_autorunner-0.1.1/tests/test_doc_chat_ui.py +0 -231
  303. codex_autorunner-0.1.1/tests/test_docs_todos.py +0 -15
  304. codex_autorunner-0.1.1/tests/test_docs_validation.py +0 -18
  305. codex_autorunner-0.1.1/tests/test_github_context_hook.py +0 -154
  306. codex_autorunner-0.1.1/tests/test_github_service.py +0 -76
  307. codex_autorunner-0.1.1/tests/test_github_sync_pr_agentic.py +0 -212
  308. codex_autorunner-0.1.1/tests/test_lock_utils.py +0 -20
  309. codex_autorunner-0.1.1/tests/test_opencode_runtime.py +0 -85
  310. codex_autorunner-0.1.1/tests/test_pr_flow.py +0 -191
  311. codex_autorunner-0.1.1/tests/test_request_logging.py +0 -66
  312. codex_autorunner-0.1.1/tests/test_runner_controller.py +0 -46
  313. codex_autorunner-0.1.1/tests/test_snapshot_api.py +0 -70
  314. codex_autorunner-0.1.1/tests/test_snapshot_core.py +0 -52
  315. codex_autorunner-0.1.1/tests/test_snapshot_incremental.py +0 -136
  316. codex_autorunner-0.1.1/tests/test_spec_ingest.py +0 -26
  317. codex_autorunner-0.1.1/tests/test_telegram_adapter.py +0 -475
  318. codex_autorunner-0.1.1/tests/test_telegram_outbox.py +0 -64
  319. codex_autorunner-0.1.1/tests/test_telegram_state.py +0 -11
  320. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/LICENSE +0 -0
  321. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/setup.cfg +0 -0
  322. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/__init__.py +0 -0
  323. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/codex/__init__.py +0 -0
  324. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/agents/opencode/events.py +0 -0
  325. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/codex_cli.py +0 -0
  326. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/codex_runner.py +0 -0
  327. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/__init__.py +0 -0
  328. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/git_utils.py +0 -0
  329. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/injected_context.py +0 -0
  330. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/notifications.py +0 -0
  331. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/optional_dependencies.py +0 -0
  332. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/patch_utils.py +0 -0
  333. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/prompts.py +0 -0
  334. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/core/request_context.py +0 -0
  335. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/housekeeping.py +0 -0
  336. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/__init__.py +0 -0
  337. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/app_server/__init__.py +0 -0
  338. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/app_server/env.py +0 -0
  339. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/github/__init__.py +0 -0
  340. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/github/service.py +0 -0
  341. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/__init__.py +0 -0
  342. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/commands_registry.py +0 -0
  343. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/handlers/__init__.py +0 -0
  344. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/overflow.py +0 -0
  345. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/rendering.py +0 -0
  346. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/integrations/telegram/retry.py +0 -0
  347. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/app_server.py +0 -0
  348. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/routes/terminal_images.py +0 -0
  349. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/LICENSE.xterm +0 -0
  350. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-cyrillic-ext.woff2 +0 -0
  351. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-cyrillic.woff2 +0 -0
  352. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-greek.woff2 +0 -0
  353. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-latin-ext.woff2 +0 -0
  354. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-latin.woff2 +0 -0
  355. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-vietnamese.woff2 +0 -0
  356. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-cyrillic-ext.woff2 +0 -0
  357. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-cyrillic.woff2 +0 -0
  358. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-greek.woff2 +0 -0
  359. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-latin-ext.woff2 +0 -0
  360. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-latin.woff2 +0 -0
  361. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-vietnamese.woff2 +0 -0
  362. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-cyrillic-ext.woff2 +0 -0
  363. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-cyrillic.woff2 +0 -0
  364. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-greek.woff2 +0 -0
  365. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-latin-ext.woff2 +0 -0
  366. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-latin.woff2 +0 -0
  367. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-vietnamese.woff2 +0 -0
  368. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/OFL.txt +0 -0
  369. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/xterm-addon-fit.js +0 -0
  370. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/xterm.css +0 -0
  371. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/static/vendor/xterm.js +0 -0
  372. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/__init__.py +0 -0
  373. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/config.py +0 -0
  374. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/provider.py +0 -0
  375. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/providers/__init__.py +0 -0
  376. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/providers/openai_whisper.py +0 -0
  377. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/voice/resolver.py +0 -0
  378. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/__init__.py +0 -0
  379. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/runner_manager.py +0 -0
  380. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner/web/terminal_sessions.py +0 -0
  381. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner.egg-info/dependency_links.txt +0 -0
  382. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner.egg-info/entry_points.txt +0 -0
  383. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/src/codex_autorunner.egg-info/top_level.txt +0 -0
  384. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_app_server_events.py +0 -0
  385. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_app_server_supervisor.py +0 -0
  386. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_app_server_thread_registry.py +0 -0
  387. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_base_path.py +0 -0
  388. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_cli_init.py +0 -0
  389. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_cli_sessions.py +0 -0
  390. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_codex_cli_flags.py +0 -0
  391. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_codex_runner.py +0 -0
  392. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_engine_app_server.py +0 -0
  393. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_engine_logs.py +0 -0
  394. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_housekeeping.py +0 -0
  395. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_hub_terminal_sessions.py +0 -0
  396. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_hub_ui_escape.py +0 -0
  397. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_logging_utils.py +0 -0
  398. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_notifications.py +0 -0
  399. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_opencode_integration.py +0 -0
  400. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_optional_dependencies.py +0 -0
  401. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_origin_middleware.py +0 -0
  402. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_sse_streams.py +0 -0
  403. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_static.py +0 -0
  404. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_system_update_check.py +0 -0
  405. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_system_update_worker.py +0 -0
  406. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_bot_lock.py +0 -0
  407. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_cache_cleanup.py +0 -0
  408. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_command_registry.py +0 -0
  409. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_interrupt_status.py +0 -0
  410. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_overflow.py +0 -0
  411. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_paths_compatible.py +0 -0
  412. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_task_tracking.py +0 -0
  413. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_thread_paths.py +0 -0
  414. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_transport.py +0 -0
  415. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_telegram_whisper_disclaimer.py +0 -0
  416. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_terminal_idle_timeout.py +0 -0
  417. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_terminal_input_dedupe.py +0 -0
  418. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_usage.py +0 -0
  419. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_capture.py +0 -0
  420. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_config.py +0 -0
  421. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_service.py +0 -0
  422. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_ui.py +0 -0
  423. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_whisper_mime_types.py +0 -0
  424. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_voice_whisper_provider.py +0 -0
  425. {codex_autorunner-0.1.1 → codex_autorunner-1.0.0}/tests/test_workspace_helpers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-autorunner
3
- Version: 0.1.1
3
+ Version: 1.0.0
4
4
  Summary: Codex autorunner CLI per DESIGN-V1
5
5
  Author: Codex
6
6
  License: MIT License
@@ -45,10 +45,12 @@ Requires-Dist: ptyprocess>=0.7
45
45
  Requires-Dist: python-multipart>=0.0.9
46
46
  Requires-Dist: python-dotenv>=1.0
47
47
  Requires-Dist: httpx>=0.27
48
+ Requires-Dist: tenacity>=8.0
48
49
  Provides-Extra: dev
49
50
  Requires-Dist: black==25.11.0; extra == "dev"
50
51
  Requires-Dist: mypy>=1.10; extra == "dev"
51
52
  Requires-Dist: pytest>=7.0; extra == "dev"
53
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
52
54
  Requires-Dist: pytest-timeout>=2.0; extra == "dev"
53
55
  Requires-Dist: ruff>=0.5.0; extra == "dev"
54
56
  Requires-Dist: types-PyYAML; extra == "dev"
@@ -63,11 +65,17 @@ Dynamic: license-file
63
65
  # codex-autorunner
64
66
  [![PyPI](https://img.shields.io/pypi/v/codex-autorunner.svg)](https://pypi.org/project/codex-autorunner/)
65
67
 
66
- An opinionated autorunner that uses the Codex CLI to work on large tasks via a simple loop. On each loop we feed the Codex instance the last one's final output along with core documents.
67
- 1. TODO - Tracks long-horizon tasks
68
- 2. PROGRESS - High level overview of what's been done already that may be relevant for future agents
69
- 3. OPINIONS - Guidelines for how we should approach implementation
70
- 4. SPEC - Source-of-truth requirements and scope for large features/projects
68
+ An opinionated autorunner that uses the Codex app-server as the primary execution backend with OpenCode support to work on large tasks via a simple loop. On each loop we feed the Codex instance the last one's final output along with core documents.
69
+
70
+ In the current model, the primary work surface is **tickets**:
71
+
72
+ - `.codex-autorunner/tickets/TICKET-###.md`
73
+
74
+ Optionally, you can maintain lightweight **workspace docs** (auto-created on write; missing is OK):
75
+
76
+ - `.codex-autorunner/workspace/active_context.md`
77
+ - `.codex-autorunner/workspace/decisions.md`
78
+ - `.codex-autorunner/workspace/spec.md`
71
79
 
72
80
  ## Sneak Peak
73
81
  Run multiple agents on many repositories, with git worktree support
@@ -79,8 +87,7 @@ See the progress of your long running tasks with a high level overview
79
87
  Dive deep into specific agent execution with a rich but readable log
80
88
  ![Desktop logs](docs/screenshots/car-desktop-logs.png)
81
89
 
82
- All memory and opinions are markdown files! Edit them directly or chat with the document!
83
- ![Desktop TODO](docs/screenshots/car-desktop-todo.png)
90
+ Tickets and workspace docs are markdown files. Edit them directly or use the web UI’s file chat to iterate with the agent.
84
91
 
85
92
  Use codex CLI directly for multi-shot problem solving or `/review`
86
93
  ![Desktop terminal](docs/screenshots/car-desktop-terminal.png)
@@ -90,11 +97,10 @@ Mobile-first experience, code on the go with Whisper support (BYOK)
90
97
 
91
98
  ## What it does
92
99
  - Initializes a repo with Codex-friendly docs and config.
93
- - Runs Codex in a loop against the repo, streaming logs.
100
+ - Runs Codex app-server in a loop against the repo, streaming logs via OpenCode runtime.
94
101
  - Tracks state, logs, and config under `.codex-autorunner/`.
95
- - Exposes a power-user HTTP API and web UI for docs, logs, runner control, and a Codex TUI terminal.
102
+ - Exposes a power-user HTTP API and web UI for tickets, workspace docs, file chat, logs, runner control, and a Codex TUI terminal.
96
103
  - Optionally runs a Telegram bot for interactive, user-in-the-loop Codex sessions.
97
- - Generates a pasteable repo snapshot (`.codex-autorunner/SNAPSHOT.md`) for sharing with other LLM chats.
98
104
 
99
105
  CLI commands are available as `codex-autorunner` or the shorter `car`.
100
106
 
@@ -164,7 +170,7 @@ If you set a base path, prefix all checks with it.
164
170
 
165
171
  ## Quick start
166
172
  1) Install (editable): `pip install -e .`
167
- 2) Initialize (hub + repo): `codex-autorunner init --git-init` (or `car init --git-init` if you prefer short). This creates the hub config at `.codex-autorunner/config.yml`, plus state/log files and the docs under `.codex-autorunner/`.
173
+ 2) Initialize (hub + repo): `codex-autorunner init --git-init` (or `car init --git-init` if you prefer short). This creates the hub config at `.codex-autorunner/config.yml`, plus state/log files and starter content under `.codex-autorunner/` (tickets and optional workspace docs).
168
174
  3) Run once: `codex-autorunner once` / `car once`
169
175
  4) Continuous loop: `codex-autorunner run` / `car run`
170
176
  5) If stuck: `codex-autorunner kill` then `codex-autorunner resume` (or the `car` equivalents)
@@ -229,19 +235,12 @@ If you set `server.auth_token_env`, the API requires `Authorization: Bearer <tok
229
235
  - `run` / `once` — run the loop (continuous or single iteration).
230
236
  - `resume` — clear stale lock/state and restart; `--once` for a single run.
231
237
  - `kill` — SIGTERM the running loop and mark state error.
232
- - `status` — show current state and outstanding TODO count.
238
+ - `status` — show current state.
233
239
  - `sessions` — list terminal sessions (server-backed when available).
234
240
  - `stop-session` — stop a terminal session by repo (`--repo`) or id (`--session`).
235
241
  - `log` — view logs (tail or specific run).
236
- - `edit` — open TODO/PROGRESS/OPINIONS/SPEC in `$EDITOR`.
237
- - `ingest-spec` — generate TODO/PROGRESS/OPINIONS from SPEC using Codex (use `--force` to overwrite).
238
- - `clear-docs` — reset TODO/PROGRESS/OPINIONS to empty templates (type CLEAR to confirm).
239
- - `snapshot` — generate/update `.codex-autorunner/SNAPSHOT.md` (incremental by default when one exists; use `--from-scratch` to regenerate).
242
+ - `edit` — open `active_context|decisions|spec` in `$EDITOR`.
240
243
  - `serve` — start the HTTP API (FastAPI) on host/port from config (defaults 127.0.0.1:4173).
241
244
 
242
- ## Snapshot (repo briefing)
243
- - Web UI: open the Snapshot tab. If no snapshot exists, you’ll see “Generate snapshot”; otherwise you’ll see “Update snapshot (incremental)” and “Regenerate snapshot (from scratch)”, plus “Copy to clipboard”.
244
- - CLI: `codex-autorunner snapshot` (or `car snapshot`) writes `.codex-autorunner/SNAPSHOT.md` and `.codex-autorunner/snapshot_state.json`.
245
-
246
245
  ## Star history
247
246
  [![Star History Chart](https://api.star-history.com/svg?repos=Git-on-my-level/codex-autorunner&type=Date)](https://star-history.com/#Git-on-my-level/codex-autorunner&Date)
@@ -1,11 +1,17 @@
1
1
  # codex-autorunner
2
2
  [![PyPI](https://img.shields.io/pypi/v/codex-autorunner.svg)](https://pypi.org/project/codex-autorunner/)
3
3
 
4
- An opinionated autorunner that uses the Codex CLI to work on large tasks via a simple loop. On each loop we feed the Codex instance the last one's final output along with core documents.
5
- 1. TODO - Tracks long-horizon tasks
6
- 2. PROGRESS - High level overview of what's been done already that may be relevant for future agents
7
- 3. OPINIONS - Guidelines for how we should approach implementation
8
- 4. SPEC - Source-of-truth requirements and scope for large features/projects
4
+ An opinionated autorunner that uses the Codex app-server as the primary execution backend with OpenCode support to work on large tasks via a simple loop. On each loop we feed the Codex instance the last one's final output along with core documents.
5
+
6
+ In the current model, the primary work surface is **tickets**:
7
+
8
+ - `.codex-autorunner/tickets/TICKET-###.md`
9
+
10
+ Optionally, you can maintain lightweight **workspace docs** (auto-created on write; missing is OK):
11
+
12
+ - `.codex-autorunner/workspace/active_context.md`
13
+ - `.codex-autorunner/workspace/decisions.md`
14
+ - `.codex-autorunner/workspace/spec.md`
9
15
 
10
16
  ## Sneak Peak
11
17
  Run multiple agents on many repositories, with git worktree support
@@ -17,8 +23,7 @@ See the progress of your long running tasks with a high level overview
17
23
  Dive deep into specific agent execution with a rich but readable log
18
24
  ![Desktop logs](docs/screenshots/car-desktop-logs.png)
19
25
 
20
- All memory and opinions are markdown files! Edit them directly or chat with the document!
21
- ![Desktop TODO](docs/screenshots/car-desktop-todo.png)
26
+ Tickets and workspace docs are markdown files. Edit them directly or use the web UI’s file chat to iterate with the agent.
22
27
 
23
28
  Use codex CLI directly for multi-shot problem solving or `/review`
24
29
  ![Desktop terminal](docs/screenshots/car-desktop-terminal.png)
@@ -28,11 +33,10 @@ Mobile-first experience, code on the go with Whisper support (BYOK)
28
33
 
29
34
  ## What it does
30
35
  - Initializes a repo with Codex-friendly docs and config.
31
- - Runs Codex in a loop against the repo, streaming logs.
36
+ - Runs Codex app-server in a loop against the repo, streaming logs via OpenCode runtime.
32
37
  - Tracks state, logs, and config under `.codex-autorunner/`.
33
- - Exposes a power-user HTTP API and web UI for docs, logs, runner control, and a Codex TUI terminal.
38
+ - Exposes a power-user HTTP API and web UI for tickets, workspace docs, file chat, logs, runner control, and a Codex TUI terminal.
34
39
  - Optionally runs a Telegram bot for interactive, user-in-the-loop Codex sessions.
35
- - Generates a pasteable repo snapshot (`.codex-autorunner/SNAPSHOT.md`) for sharing with other LLM chats.
36
40
 
37
41
  CLI commands are available as `codex-autorunner` or the shorter `car`.
38
42
 
@@ -102,7 +106,7 @@ If you set a base path, prefix all checks with it.
102
106
 
103
107
  ## Quick start
104
108
  1) Install (editable): `pip install -e .`
105
- 2) Initialize (hub + repo): `codex-autorunner init --git-init` (or `car init --git-init` if you prefer short). This creates the hub config at `.codex-autorunner/config.yml`, plus state/log files and the docs under `.codex-autorunner/`.
109
+ 2) Initialize (hub + repo): `codex-autorunner init --git-init` (or `car init --git-init` if you prefer short). This creates the hub config at `.codex-autorunner/config.yml`, plus state/log files and starter content under `.codex-autorunner/` (tickets and optional workspace docs).
106
110
  3) Run once: `codex-autorunner once` / `car once`
107
111
  4) Continuous loop: `codex-autorunner run` / `car run`
108
112
  5) If stuck: `codex-autorunner kill` then `codex-autorunner resume` (or the `car` equivalents)
@@ -167,19 +171,12 @@ If you set `server.auth_token_env`, the API requires `Authorization: Bearer <tok
167
171
  - `run` / `once` — run the loop (continuous or single iteration).
168
172
  - `resume` — clear stale lock/state and restart; `--once` for a single run.
169
173
  - `kill` — SIGTERM the running loop and mark state error.
170
- - `status` — show current state and outstanding TODO count.
174
+ - `status` — show current state.
171
175
  - `sessions` — list terminal sessions (server-backed when available).
172
176
  - `stop-session` — stop a terminal session by repo (`--repo`) or id (`--session`).
173
177
  - `log` — view logs (tail or specific run).
174
- - `edit` — open TODO/PROGRESS/OPINIONS/SPEC in `$EDITOR`.
175
- - `ingest-spec` — generate TODO/PROGRESS/OPINIONS from SPEC using Codex (use `--force` to overwrite).
176
- - `clear-docs` — reset TODO/PROGRESS/OPINIONS to empty templates (type CLEAR to confirm).
177
- - `snapshot` — generate/update `.codex-autorunner/SNAPSHOT.md` (incremental by default when one exists; use `--from-scratch` to regenerate).
178
+ - `edit` — open `active_context|decisions|spec` in `$EDITOR`.
178
179
  - `serve` — start the HTTP API (FastAPI) on host/port from config (defaults 127.0.0.1:4173).
179
180
 
180
- ## Snapshot (repo briefing)
181
- - Web UI: open the Snapshot tab. If no snapshot exists, you’ll see “Generate snapshot”; otherwise you’ll see “Update snapshot (incremental)” and “Regenerate snapshot (from scratch)”, plus “Copy to clipboard”.
182
- - CLI: `codex-autorunner snapshot` (or `car snapshot`) writes `.codex-autorunner/SNAPSHOT.md` and `.codex-autorunner/snapshot_state.json`.
183
-
184
181
  ## Star history
185
182
  [![Star History Chart](https://api.star-history.com/svg?repos=Git-on-my-level/codex-autorunner&type=Date)](https://star-history.com/#Git-on-my-level/codex-autorunner&Date)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codex-autorunner"
3
- version = "0.1.1"
3
+ version = "1.0.0"
4
4
  description = "Codex autorunner CLI per DESIGN-V1"
5
5
  readme = "README.md"
6
6
  license = {file = "LICENSE"}
@@ -16,6 +16,7 @@ dependencies = [
16
16
  "python-multipart>=0.0.9",
17
17
  "python-dotenv>=1.0",
18
18
  "httpx>=0.27",
19
+ "tenacity>=8.0",
19
20
  ]
20
21
  classifiers = [
21
22
  "License :: OSI Approved :: MIT License",
@@ -35,6 +36,7 @@ dev = [
35
36
  "black==25.11.0",
36
37
  "mypy>=1.10",
37
38
  "pytest>=7.0",
39
+ "pytest-asyncio>=0.23",
38
40
  "pytest-timeout>=2.0",
39
41
  "ruff>=0.5.0",
40
42
  "types-PyYAML",
@@ -84,6 +86,11 @@ markers = [
84
86
  "integration: marks tests as integration tests that require external dependencies (deselect with '-m \"not integration\"')",
85
87
  "timeout(seconds): per-test timeout (provided by pytest-timeout)",
86
88
  ]
89
+ filterwarnings = [
90
+ # Cancelled auto-restart tasks can emit noisy unraisable warnings when the event
91
+ # loop shuts down; we explicitly clean these up, so silence the residual notice.
92
+ "ignore::pytest.PytestUnraisableExceptionWarning",
93
+ ]
87
94
 
88
95
  [tool.ruff]
89
96
  line-length = 88
@@ -0,0 +1,4 @@
1
+ from .cli import app
2
+
3
+ if __name__ == "__main__":
4
+ app()
@@ -0,0 +1,21 @@
1
+ """Agent harness abstractions."""
2
+
3
+ from .registry import (
4
+ AgentCapability,
5
+ AgentDescriptor,
6
+ get_agent_descriptor,
7
+ get_available_agents,
8
+ get_registered_agents,
9
+ has_capability,
10
+ validate_agent_id,
11
+ )
12
+
13
+ __all__ = [
14
+ "AgentCapability",
15
+ "AgentDescriptor",
16
+ "get_registered_agents",
17
+ "get_available_agents",
18
+ "get_agent_descriptor",
19
+ "validate_agent_id",
20
+ "has_capability",
21
+ ]
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
  from typing import Any, AsyncIterator, Optional, Protocol
5
5
 
6
- from .types import ConversationRef, ModelCatalog, TurnRef
6
+ from .types import AgentId, ConversationRef, ModelCatalog, TurnRef
7
7
 
8
8
 
9
9
  class AgentHarness(Protocol):
10
- agent_id: str
10
+ agent_id: AgentId
11
11
  display_name: str
12
12
 
13
13
  async def ensure_ready(self, workspace_root: Path) -> None: ...
@@ -73,7 +73,7 @@ def _coerce_reasoning_efforts(entry: dict[str, Any]) -> list[str]:
73
73
 
74
74
 
75
75
  class CodexHarness(AgentHarness):
76
- agent_id: AgentId = "codex"
76
+ agent_id: AgentId = AgentId("codex")
77
77
  display_name = "Codex"
78
78
 
79
79
  def __init__(
@@ -3,12 +3,16 @@
3
3
  from .client import OpenCodeClient
4
4
  from .events import SSEEvent, parse_sse_lines
5
5
  from .harness import OpenCodeHarness
6
+ from .run_prompt import OpenCodeRunConfig, OpenCodeRunResult, run_opencode_prompt
6
7
  from .supervisor import OpenCodeSupervisor
7
8
 
8
9
  __all__ = [
9
10
  "OpenCodeClient",
10
11
  "OpenCodeHarness",
12
+ "OpenCodeRunConfig",
13
+ "OpenCodeRunResult",
11
14
  "OpenCodeSupervisor",
12
15
  "SSEEvent",
13
16
  "parse_sse_lines",
17
+ "run_opencode_prompt",
14
18
  ]
@@ -0,0 +1,104 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ from pathlib import Path
6
+ from typing import Optional
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ async def ensure_agent_config(
12
+ workspace_root: Path,
13
+ agent_id: str,
14
+ model: Optional[str],
15
+ title: Optional[str] = None,
16
+ description: Optional[str] = None,
17
+ ) -> None:
18
+ """Ensure .opencode/agent/<agent_id>.md exists with frontmatter config.
19
+
20
+ Args:
21
+ workspace_root: Path to the workspace root
22
+ agent_id: Agent ID (e.g., "subagent")
23
+ model: Model ID in format "providerID/modelID" (e.g., "zai-coding-plan/glm-4.7-flashx")
24
+ title: Optional title for the agent
25
+ description: Optional description for the agent
26
+ """
27
+ if model is None:
28
+ logger.debug(f"Skipping agent config for {agent_id}: no model configured")
29
+ return
30
+
31
+ agent_dir = workspace_root / ".opencode" / "agent"
32
+ agent_file = agent_dir / f"{agent_id}.md"
33
+
34
+ # Check if file already exists and has the correct model
35
+ if agent_file.exists():
36
+ existing_content = agent_file.read_text(encoding="utf-8")
37
+ existing_model = _extract_model_from_frontmatter(existing_content)
38
+ if existing_model == model:
39
+ logger.debug(f"Agent config already exists for {agent_id}: {agent_file}")
40
+ return
41
+
42
+ # Create agent directory if needed
43
+ await asyncio.to_thread(agent_dir.mkdir, parents=True, exist_ok=True)
44
+
45
+ # Build agent markdown with frontmatter
46
+ content = _build_agent_md(
47
+ agent_id=agent_id,
48
+ model=model,
49
+ title=title or agent_id,
50
+ description=description or f"Subagent for {agent_id} tasks",
51
+ )
52
+
53
+ # Write atomically
54
+ await asyncio.to_thread(agent_file.write_text, content, encoding="utf-8")
55
+ logger.info(f"Created agent config: {agent_file} with model {model}")
56
+
57
+
58
+ def _build_agent_md(
59
+ agent_id: str,
60
+ model: str,
61
+ title: str,
62
+ description: str,
63
+ ) -> str:
64
+ """Generate markdown with YAML frontmatter.
65
+
66
+ Frontmatter format per OpenCode config schema:
67
+ ---
68
+ agent: <agent_id>
69
+ title: "<title>"
70
+ description: "<description>"
71
+ model: <providerID>/<modelID>
72
+ ---
73
+
74
+ <Optional agent instructions go here>
75
+ """
76
+ return f"""---
77
+ agent: {agent_id}
78
+ title: "{title}"
79
+ description: "{description}"
80
+ model: {model}
81
+ ---
82
+ """
83
+
84
+
85
+ def _extract_model_from_frontmatter(content: str) -> Optional[str]:
86
+ """Extract model value from YAML frontmatter.
87
+
88
+ Returns None if frontmatter or model field is not found.
89
+ """
90
+ lines = content.splitlines()
91
+ if not lines or not lines[0].startswith("---"):
92
+ return None
93
+
94
+ for _i, line in enumerate(lines[1:], start=1):
95
+ if line.startswith("---"):
96
+ break
97
+ if line.startswith("model:"):
98
+ model = line.split(":", 1)[1].strip()
99
+ return model if model else None
100
+
101
+ return None
102
+
103
+
104
+ __all__ = ["ensure_agent_config"]