codex-autorunner 0.1.2__tar.gz → 1.1.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 (498) hide show
  1. codex_autorunner-1.1.0/PKG-INFO +154 -0
  2. codex_autorunner-1.1.0/README.md +90 -0
  3. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/pyproject.toml +11 -1
  4. codex_autorunner-1.1.0/src/codex_autorunner/__init__.py +14 -0
  5. codex_autorunner-1.1.0/src/codex_autorunner/__main__.py +4 -0
  6. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/codex/harness.py +1 -1
  7. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/client.py +68 -35
  8. codex_autorunner-1.1.0/src/codex_autorunner/agents/opencode/constants.py +3 -0
  9. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/harness.py +6 -1
  10. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/logging.py +21 -5
  11. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/run_prompt.py +1 -0
  12. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/runtime.py +176 -47
  13. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/supervisor.py +36 -48
  14. codex_autorunner-1.1.0/src/codex_autorunner/agents/registry.py +277 -0
  15. codex_autorunner-1.1.0/src/codex_autorunner/api.py +25 -0
  16. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/bootstrap.py +22 -37
  17. codex_autorunner-1.1.0/src/codex_autorunner/cli.py +8 -0
  18. codex_autorunner-1.1.0/src/codex_autorunner/codex_cli.py +20 -0
  19. codex_autorunner-1.1.0/src/codex_autorunner/core/__init__.py +5 -0
  20. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/about_car.py +49 -32
  21. codex_autorunner-1.1.0/src/codex_autorunner/core/adapter_utils.py +21 -0
  22. codex_autorunner-1.1.0/src/codex_autorunner/core/app_server_ids.py +59 -0
  23. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/app_server_logging.py +7 -3
  24. codex_autorunner-1.1.0/src/codex_autorunner/core/app_server_prompts.py +145 -0
  25. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/app_server_threads.py +26 -28
  26. codex_autorunner-0.1.2/src/codex_autorunner/integrations/app_server/env.py → codex_autorunner-1.1.0/src/codex_autorunner/core/app_server_utils.py +71 -16
  27. codex_autorunner-1.1.0/src/codex_autorunner/core/archive.py +349 -0
  28. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/codex_runner.py +12 -2
  29. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/config.py +587 -103
  30. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/docs.py +10 -2
  31. codex_autorunner-1.1.0/src/codex_autorunner/core/drafts.py +136 -0
  32. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/engine.py +1531 -866
  33. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/exceptions.py +4 -0
  34. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/__init__.py +25 -0
  35. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/controller.py +202 -0
  36. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/definition.py +82 -0
  37. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/models.py +88 -0
  38. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/reasons.py +52 -0
  39. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/reconciler.py +131 -0
  40. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/runtime.py +382 -0
  41. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/store.py +568 -0
  42. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/transition.py +138 -0
  43. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/ux_helpers.py +257 -0
  44. codex_autorunner-1.1.0/src/codex_autorunner/core/flows/worker_process.py +242 -0
  45. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/git_utils.py +62 -0
  46. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/hub.py +136 -16
  47. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/locks.py +4 -0
  48. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/notifications.py +14 -2
  49. codex_autorunner-1.1.0/src/codex_autorunner/core/ports/__init__.py +28 -0
  50. codex_autorunner-1.1.0/src/codex_autorunner/core/ports/agent_backend.py +150 -0
  51. codex_autorunner-1.1.0/src/codex_autorunner/core/ports/backend_orchestrator.py +41 -0
  52. codex_autorunner-1.1.0/src/codex_autorunner/core/ports/run_event.py +91 -0
  53. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/prompt.py +15 -7
  54. codex_autorunner-1.1.0/src/codex_autorunner/core/redaction.py +29 -0
  55. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/review_context.py +5 -8
  56. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/run_index.py +6 -0
  57. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/runner_process.py +5 -2
  58. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/state.py +0 -88
  59. codex_autorunner-1.1.0/src/codex_autorunner/core/state_roots.py +57 -0
  60. codex_autorunner-1.1.0/src/codex_autorunner/core/supervisor_protocol.py +15 -0
  61. codex_autorunner-1.1.0/src/codex_autorunner/core/supervisor_utils.py +67 -0
  62. codex_autorunner-1.1.0/src/codex_autorunner/core/text_delta_coalescer.py +97 -0
  63. codex_autorunner-1.1.0/src/codex_autorunner/core/ticket_linter_cli.py +201 -0
  64. codex_autorunner-1.1.0/src/codex_autorunner/core/ticket_manager_cli.py +432 -0
  65. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/update.py +24 -16
  66. codex_autorunner-1.1.0/src/codex_autorunner/core/update_paths.py +28 -0
  67. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/update_runner.py +2 -0
  68. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/usage.py +164 -12
  69. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/utils.py +120 -11
  70. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/discovery.py +2 -4
  71. codex_autorunner-1.1.0/src/codex_autorunner/flows/review/__init__.py +17 -0
  72. codex_autorunner-0.1.2/src/codex_autorunner/core/review.py → codex_autorunner-1.1.0/src/codex_autorunner/flows/review/service.py +15 -10
  73. codex_autorunner-1.1.0/src/codex_autorunner/flows/ticket_flow/__init__.py +3 -0
  74. codex_autorunner-1.1.0/src/codex_autorunner/flows/ticket_flow/definition.py +98 -0
  75. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/__init__.py +17 -0
  76. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/backend_orchestrator.py +284 -0
  77. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/codex_adapter.py +90 -0
  78. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/codex_backend.py +448 -0
  79. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/opencode_adapter.py +108 -0
  80. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/opencode_backend.py +598 -0
  81. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/runner.py +91 -0
  82. codex_autorunner-1.1.0/src/codex_autorunner/integrations/agents/wiring.py +271 -0
  83. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/app_server/client.py +583 -152
  84. codex_autorunner-1.1.0/src/codex_autorunner/integrations/app_server/env.py +5 -0
  85. codex_autorunner-0.1.2/src/codex_autorunner/core/app_server_events.py → codex_autorunner-1.1.0/src/codex_autorunner/integrations/app_server/event_buffer.py +15 -8
  86. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/app_server/supervisor.py +59 -33
  87. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/adapter.py +204 -165
  88. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/api_schemas.py +120 -0
  89. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/config.py +221 -0
  90. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/constants.py +17 -2
  91. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/dispatch.py +17 -0
  92. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/doctor.py +47 -0
  93. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/callbacks.py +7 -4
  94. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/__init__.py +2 -0
  95. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/execution.py +53 -57
  96. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/files.py +2 -6
  97. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/handlers/commands/flows.py +1364 -0
  98. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/formatting.py +1 -1
  99. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/github.py +41 -582
  100. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/workspace.py +8 -8
  101. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands_runtime.py +137 -478
  102. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands_spec.py +17 -4
  103. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/messages.py +121 -9
  104. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/selections.py +61 -1
  105. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/helpers.py +111 -16
  106. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/outbox.py +366 -0
  107. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/progress_stream.py +3 -10
  108. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/service.py +221 -42
  109. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/state.py +100 -2
  110. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/ticket_flow_bridge.py +611 -0
  111. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/transport.py +39 -4
  112. codex_autorunner-1.1.0/src/codex_autorunner/integrations/telegram/trigger_mode.py +53 -0
  113. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/manifest.py +2 -0
  114. codex_autorunner-1.1.0/src/codex_autorunner/plugin_api.py +22 -0
  115. codex_autorunner-1.1.0/src/codex_autorunner/routes/__init__.py +37 -0
  116. codex_autorunner-1.1.0/src/codex_autorunner/routes/agents.py +3 -0
  117. codex_autorunner-1.1.0/src/codex_autorunner/routes/analytics.py +3 -0
  118. codex_autorunner-1.1.0/src/codex_autorunner/routes/app_server.py +3 -0
  119. codex_autorunner-1.1.0/src/codex_autorunner/routes/base.py +3 -0
  120. codex_autorunner-1.1.0/src/codex_autorunner/routes/file_chat.py +7 -0
  121. codex_autorunner-1.1.0/src/codex_autorunner/routes/flows.py +7 -0
  122. codex_autorunner-1.1.0/src/codex_autorunner/routes/messages.py +7 -0
  123. codex_autorunner-1.1.0/src/codex_autorunner/routes/repos.py +3 -0
  124. codex_autorunner-1.1.0/src/codex_autorunner/routes/review.py +3 -0
  125. codex_autorunner-1.1.0/src/codex_autorunner/routes/sessions.py +3 -0
  126. codex_autorunner-1.1.0/src/codex_autorunner/routes/settings.py +3 -0
  127. codex_autorunner-1.1.0/src/codex_autorunner/routes/shared.py +3 -0
  128. codex_autorunner-1.1.0/src/codex_autorunner/routes/system.py +7 -0
  129. codex_autorunner-1.1.0/src/codex_autorunner/routes/usage.py +3 -0
  130. codex_autorunner-1.1.0/src/codex_autorunner/routes/voice.py +3 -0
  131. codex_autorunner-1.1.0/src/codex_autorunner/routes/workspace.py +3 -0
  132. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/server.py +3 -2
  133. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/agentControls.js +41 -11
  134. codex_autorunner-1.1.0/src/codex_autorunner/static/agentEvents.js +248 -0
  135. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/app.js +35 -24
  136. codex_autorunner-1.1.0/src/codex_autorunner/static/archive.js +826 -0
  137. codex_autorunner-1.1.0/src/codex_autorunner/static/archiveApi.js +37 -0
  138. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/autoRefresh.js +36 -8
  139. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/bootstrap.js +1 -0
  140. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/bus.js +1 -0
  141. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/cache.js +1 -0
  142. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/constants.js +20 -4
  143. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/dashboard.js +344 -325
  144. codex_autorunner-1.1.0/src/codex_autorunner/static/diffRenderer.js +37 -0
  145. codex_autorunner-1.1.0/src/codex_autorunner/static/docChatCore.js +324 -0
  146. codex_autorunner-1.1.0/src/codex_autorunner/static/docChatStorage.js +65 -0
  147. codex_autorunner-1.1.0/src/codex_autorunner/static/docChatVoice.js +65 -0
  148. codex_autorunner-1.1.0/src/codex_autorunner/static/docEditor.js +133 -0
  149. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/env.js +1 -0
  150. codex_autorunner-1.1.0/src/codex_autorunner/static/eventSummarizer.js +166 -0
  151. codex_autorunner-1.1.0/src/codex_autorunner/static/fileChat.js +182 -0
  152. codex_autorunner-1.1.0/src/codex_autorunner/static/health.js +155 -0
  153. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/hub.js +126 -185
  154. codex_autorunner-1.1.0/src/codex_autorunner/static/index.html +956 -0
  155. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/liveUpdates.js +1 -0
  156. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/loader.js +1 -0
  157. codex_autorunner-1.1.0/src/codex_autorunner/static/messages.js +873 -0
  158. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/mobileCompact.js +2 -1
  159. codex_autorunner-1.1.0/src/codex_autorunner/static/preserve.js +17 -0
  160. codex_autorunner-1.1.0/src/codex_autorunner/static/settings.js +273 -0
  161. codex_autorunner-1.1.0/src/codex_autorunner/static/smartRefresh.js +52 -0
  162. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/styles.css +8850 -3876
  163. codex_autorunner-1.1.0/src/codex_autorunner/static/tabs.js +205 -0
  164. codex_autorunner-1.1.0/src/codex_autorunner/static/terminal.js +44 -0
  165. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/terminalManager.js +34 -59
  166. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketChatActions.js +333 -0
  167. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketChatEvents.js +16 -0
  168. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketChatStorage.js +16 -0
  169. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketChatStream.js +264 -0
  170. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketEditor.js +844 -0
  171. codex_autorunner-1.1.0/src/codex_autorunner/static/ticketVoice.js +9 -0
  172. codex_autorunner-1.1.0/src/codex_autorunner/static/tickets.js +1988 -0
  173. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/utils.js +43 -3
  174. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/voice.js +1 -0
  175. codex_autorunner-1.1.0/src/codex_autorunner/static/workspace.js +765 -0
  176. codex_autorunner-1.1.0/src/codex_autorunner/static/workspaceApi.js +53 -0
  177. codex_autorunner-1.1.0/src/codex_autorunner/static/workspaceFileBrowser.js +504 -0
  178. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/__init__.py +5 -0
  179. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/cli/__init__.py +6 -0
  180. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/cli}/cli.py +223 -158
  181. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/cli/codex_cli.py +20 -0
  182. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/telegram/__init__.py +3 -0
  183. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/app.py +362 -115
  184. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/hub_jobs.py +2 -2
  185. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/middleware.py +6 -7
  186. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/review.py +6 -0
  187. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/__init__.py +25 -14
  188. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/agents.py +4 -4
  189. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/analytics.py +277 -0
  190. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/app_server.py +4 -4
  191. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/archive.py +357 -0
  192. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/base.py +104 -114
  193. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/file_chat.py +836 -0
  194. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/flows.py +1164 -0
  195. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/messages.py +459 -0
  196. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/repos.py +3 -3
  197. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/review.py +2 -2
  198. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/sessions.py +2 -2
  199. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/settings.py +2 -2
  200. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/shared.py +8 -4
  201. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/system.py +13 -8
  202. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/usage.py +89 -0
  203. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/voice.py +1 -1
  204. codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web/routes/workspace.py +271 -0
  205. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/runner_manager.py +2 -2
  206. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/schemas.py +128 -108
  207. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/static_assets.py +26 -23
  208. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/static_refresh.py +1 -1
  209. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/terminal_sessions.py +1 -1
  210. codex_autorunner-1.1.0/src/codex_autorunner/tickets/__init__.py +27 -0
  211. codex_autorunner-1.1.0/src/codex_autorunner/tickets/agent_pool.py +399 -0
  212. codex_autorunner-1.1.0/src/codex_autorunner/tickets/files.py +89 -0
  213. codex_autorunner-1.1.0/src/codex_autorunner/tickets/frontmatter.py +55 -0
  214. codex_autorunner-1.1.0/src/codex_autorunner/tickets/lint.py +102 -0
  215. codex_autorunner-1.1.0/src/codex_autorunner/tickets/models.py +97 -0
  216. codex_autorunner-1.1.0/src/codex_autorunner/tickets/outbox.py +244 -0
  217. codex_autorunner-1.1.0/src/codex_autorunner/tickets/replies.py +179 -0
  218. codex_autorunner-1.1.0/src/codex_autorunner/tickets/runner.py +881 -0
  219. codex_autorunner-1.1.0/src/codex_autorunner/tickets/spec_ingest.py +77 -0
  220. codex_autorunner-1.1.0/src/codex_autorunner/web/__init__.py +5 -0
  221. codex_autorunner-1.1.0/src/codex_autorunner/web/app.py +3 -0
  222. codex_autorunner-1.1.0/src/codex_autorunner/web/hub_jobs.py +3 -0
  223. codex_autorunner-1.1.0/src/codex_autorunner/web/middleware.py +3 -0
  224. codex_autorunner-1.1.0/src/codex_autorunner/web/pty_session.py +3 -0
  225. codex_autorunner-1.1.0/src/codex_autorunner/web/runner_manager.py +3 -0
  226. codex_autorunner-1.1.0/src/codex_autorunner/web/schemas.py +3 -0
  227. codex_autorunner-1.1.0/src/codex_autorunner/web/static_assets.py +7 -0
  228. codex_autorunner-1.1.0/src/codex_autorunner/web/static_refresh.py +3 -0
  229. codex_autorunner-1.1.0/src/codex_autorunner/web/terminal_sessions.py +3 -0
  230. codex_autorunner-1.1.0/src/codex_autorunner/workspace/__init__.py +40 -0
  231. codex_autorunner-1.1.0/src/codex_autorunner/workspace/paths.py +335 -0
  232. codex_autorunner-1.1.0/src/codex_autorunner.egg-info/PKG-INFO +154 -0
  233. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner.egg-info/SOURCES.txt +151 -58
  234. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_about_car_terminal_context.py +4 -3
  235. codex_autorunner-1.1.0/tests/test_agent_run_events.py +347 -0
  236. codex_autorunner-1.1.0/tests/test_agents_plugins.py +67 -0
  237. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_agents_registry.py +53 -0
  238. codex_autorunner-1.1.0/tests/test_api_contract.py +52 -0
  239. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_app_server_client.py +39 -2
  240. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_app_server_events.py +1 -1
  241. codex_autorunner-1.1.0/tests/test_app_server_prompts.py +36 -0
  242. codex_autorunner-1.1.0/tests/test_archive_worktree.py +121 -0
  243. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_auth_middleware.py +1 -3
  244. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_base_path_static.py +8 -10
  245. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_codex_app_server_integration.py +3 -1
  246. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_config_resolution.py +2 -2
  247. codex_autorunner-1.1.0/tests/test_core_web_boundary.py +18 -0
  248. codex_autorunner-1.1.0/tests/test_engine_app_server.py +198 -0
  249. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_engine_end_review.py +1 -1
  250. codex_autorunner-1.1.0/tests/test_file_chat_drafts.py +115 -0
  251. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_hub_create.py +19 -3
  252. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_hub_supervisor.py +25 -12
  253. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_opencode_agent_config.py +4 -4
  254. codex_autorunner-1.1.0/tests/test_opencode_agent_pool.py +120 -0
  255. codex_autorunner-1.1.0/tests/test_opencode_backend_streaming.py +128 -0
  256. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_opencode_client.py +23 -1
  257. codex_autorunner-1.1.0/tests/test_opencode_event_formatter.py +28 -0
  258. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_opencode_runtime.py +137 -0
  259. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_patch_utils.py +16 -8
  260. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_prompt.py +3 -5
  261. codex_autorunner-1.1.0/tests/test_redaction.py +60 -0
  262. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_request_logging.py +2 -2
  263. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_review_context.py +8 -8
  264. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_review_service.py +3 -3
  265. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_runner_controller.py +30 -1
  266. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_static_asset_cache.py +21 -22
  267. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_adapter.py +425 -0
  268. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_bot_config.py +110 -0
  269. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_bot_integration.py +1 -1
  270. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_cache_cleanup.py +10 -0
  271. codex_autorunner-1.1.0/tests/test_telegram_codex_feature_flags.py +67 -0
  272. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_command_registry.py +9 -0
  273. codex_autorunner-1.1.0/tests/test_telegram_flow_aliases.py +75 -0
  274. codex_autorunner-1.1.0/tests/test_telegram_flow_bootstrap.py +172 -0
  275. codex_autorunner-1.1.0/tests/test_telegram_flow_callback_actions.py +167 -0
  276. codex_autorunner-1.1.0/tests/test_telegram_flow_commands.py +22 -0
  277. codex_autorunner-1.1.0/tests/test_telegram_flow_lifecycle.py +206 -0
  278. codex_autorunner-1.1.0/tests/test_telegram_flow_status.py +191 -0
  279. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_handlers_callbacks.py +49 -0
  280. codex_autorunner-1.1.0/tests/test_telegram_outbox.py +303 -0
  281. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_review_opencode.py +2 -0
  282. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_state.py +17 -0
  283. codex_autorunner-1.1.0/tests/test_telegram_ticket_flow_bridge.py +190 -0
  284. codex_autorunner-1.1.0/tests/test_telegram_trigger_mode.py +45 -0
  285. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_turn_queue.py +1 -0
  286. codex_autorunner-1.1.0/tests/test_ticket_flow_approval_config.py +125 -0
  287. codex_autorunner-1.1.0/tests/test_ticket_linter_cli.py +93 -0
  288. codex_autorunner-1.1.0/tests/test_ticket_manager_cli.py +65 -0
  289. codex_autorunner-1.1.0/tests/test_update_paths.py +28 -0
  290. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_usage.py +94 -0
  291. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_transcribe_endpoint.py +6 -6
  292. codex_autorunner-1.1.0/tests/test_workspace_functional.py +378 -0
  293. codex_autorunner-1.1.0/tests/test_workspace_paths.py +89 -0
  294. codex_autorunner-0.1.2/PKG-INFO +0 -249
  295. codex_autorunner-0.1.2/README.md +0 -185
  296. codex_autorunner-0.1.2/src/codex_autorunner/__init__.py +0 -3
  297. codex_autorunner-0.1.2/src/codex_autorunner/agents/execution/policy.py +0 -292
  298. codex_autorunner-0.1.2/src/codex_autorunner/agents/factory.py +0 -52
  299. codex_autorunner-0.1.2/src/codex_autorunner/agents/orchestrator.py +0 -358
  300. codex_autorunner-0.1.2/src/codex_autorunner/agents/registry.py +0 -130
  301. codex_autorunner-0.1.2/src/codex_autorunner/codex_cli.py +0 -84
  302. codex_autorunner-0.1.2/src/codex_autorunner/core/__init__.py +0 -1
  303. codex_autorunner-0.1.2/src/codex_autorunner/core/app_server_prompts.py +0 -378
  304. codex_autorunner-0.1.2/src/codex_autorunner/core/doc_chat.py +0 -1446
  305. codex_autorunner-0.1.2/src/codex_autorunner/core/snapshot.py +0 -580
  306. codex_autorunner-0.1.2/src/codex_autorunner/core/text_delta_coalescer.py +0 -43
  307. codex_autorunner-0.1.2/src/codex_autorunner/integrations/github/chatops.py +0 -268
  308. codex_autorunner-0.1.2/src/codex_autorunner/integrations/github/pr_flow.py +0 -1314
  309. codex_autorunner-0.1.2/src/codex_autorunner/integrations/telegram/outbox.py +0 -195
  310. codex_autorunner-0.1.2/src/codex_autorunner/routes/docs.py +0 -381
  311. codex_autorunner-0.1.2/src/codex_autorunner/routes/github.py +0 -327
  312. codex_autorunner-0.1.2/src/codex_autorunner/routes/runs.py +0 -250
  313. codex_autorunner-0.1.2/src/codex_autorunner/spec_ingest.py +0 -812
  314. codex_autorunner-0.1.2/src/codex_autorunner/static/docChatActions.js +0 -287
  315. codex_autorunner-0.1.2/src/codex_autorunner/static/docChatEvents.js +0 -300
  316. codex_autorunner-0.1.2/src/codex_autorunner/static/docChatRender.js +0 -205
  317. codex_autorunner-0.1.2/src/codex_autorunner/static/docChatStream.js +0 -361
  318. codex_autorunner-0.1.2/src/codex_autorunner/static/docs.js +0 -20
  319. codex_autorunner-0.1.2/src/codex_autorunner/static/docsClipboard.js +0 -69
  320. codex_autorunner-0.1.2/src/codex_autorunner/static/docsCrud.js +0 -257
  321. codex_autorunner-0.1.2/src/codex_autorunner/static/docsDocUpdates.js +0 -62
  322. codex_autorunner-0.1.2/src/codex_autorunner/static/docsDrafts.js +0 -16
  323. codex_autorunner-0.1.2/src/codex_autorunner/static/docsElements.js +0 -69
  324. codex_autorunner-0.1.2/src/codex_autorunner/static/docsInit.js +0 -285
  325. codex_autorunner-0.1.2/src/codex_autorunner/static/docsParse.js +0 -160
  326. codex_autorunner-0.1.2/src/codex_autorunner/static/docsSnapshot.js +0 -87
  327. codex_autorunner-0.1.2/src/codex_autorunner/static/docsSpecIngest.js +0 -263
  328. codex_autorunner-0.1.2/src/codex_autorunner/static/docsState.js +0 -127
  329. codex_autorunner-0.1.2/src/codex_autorunner/static/docsThreadRegistry.js +0 -44
  330. codex_autorunner-0.1.2/src/codex_autorunner/static/docsUi.js +0 -153
  331. codex_autorunner-0.1.2/src/codex_autorunner/static/docsVoice.js +0 -56
  332. codex_autorunner-0.1.2/src/codex_autorunner/static/github.js +0 -504
  333. codex_autorunner-0.1.2/src/codex_autorunner/static/index.html +0 -980
  334. codex_autorunner-0.1.2/src/codex_autorunner/static/logs.js +0 -678
  335. codex_autorunner-0.1.2/src/codex_autorunner/static/review.js +0 -157
  336. codex_autorunner-0.1.2/src/codex_autorunner/static/runs.js +0 -418
  337. codex_autorunner-0.1.2/src/codex_autorunner/static/settings.js +0 -341
  338. codex_autorunner-0.1.2/src/codex_autorunner/static/snapshot.js +0 -124
  339. codex_autorunner-0.1.2/src/codex_autorunner/static/state.js +0 -94
  340. codex_autorunner-0.1.2/src/codex_autorunner/static/tabs.js +0 -41
  341. codex_autorunner-0.1.2/src/codex_autorunner/static/terminal.js +0 -12
  342. codex_autorunner-0.1.2/src/codex_autorunner/static/todoPreview.js +0 -27
  343. codex_autorunner-0.1.2/src/codex_autorunner/workspace.py +0 -16
  344. codex_autorunner-0.1.2/src/codex_autorunner.egg-info/PKG-INFO +0 -249
  345. codex_autorunner-0.1.2/tests/test_agent_policy.py +0 -258
  346. codex_autorunner-0.1.2/tests/test_api_contract.py +0 -42
  347. codex_autorunner-0.1.2/tests/test_app_server_prompts.py +0 -84
  348. codex_autorunner-0.1.2/tests/test_chatops.py +0 -38
  349. codex_autorunner-0.1.2/tests/test_cli_snapshot.py +0 -37
  350. codex_autorunner-0.1.2/tests/test_doc_chat.py +0 -508
  351. codex_autorunner-0.1.2/tests/test_doc_chat_ui.py +0 -231
  352. codex_autorunner-0.1.2/tests/test_docs_todos.py +0 -148
  353. codex_autorunner-0.1.2/tests/test_docs_validation.py +0 -18
  354. codex_autorunner-0.1.2/tests/test_engine_app_server.py +0 -161
  355. codex_autorunner-0.1.2/tests/test_github_context_hook.py +0 -154
  356. codex_autorunner-0.1.2/tests/test_github_service.py +0 -76
  357. codex_autorunner-0.1.2/tests/test_github_sync_pr_agentic.py +0 -212
  358. codex_autorunner-0.1.2/tests/test_orchestrator.py +0 -600
  359. codex_autorunner-0.1.2/tests/test_pr_flow.py +0 -191
  360. codex_autorunner-0.1.2/tests/test_snapshot_api.py +0 -70
  361. codex_autorunner-0.1.2/tests/test_snapshot_core.py +0 -52
  362. codex_autorunner-0.1.2/tests/test_snapshot_incremental.py +0 -136
  363. codex_autorunner-0.1.2/tests/test_spec_ingest.py +0 -26
  364. codex_autorunner-0.1.2/tests/test_telegram_outbox.py +0 -67
  365. codex_autorunner-0.1.2/tests/test_telegram_pr_flow.py +0 -129
  366. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/LICENSE +0 -0
  367. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/setup.cfg +0 -0
  368. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/__init__.py +0 -0
  369. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/base.py +0 -0
  370. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/codex/__init__.py +0 -0
  371. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/__init__.py +0 -0
  372. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/agent_config.py +0 -0
  373. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/opencode/events.py +0 -0
  374. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/agents/types.py +0 -0
  375. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/codex_runner.py +0 -0
  376. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/circuit_breaker.py +0 -0
  377. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/injected_context.py +0 -0
  378. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/logging_utils.py +0 -0
  379. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/optional_dependencies.py +0 -0
  380. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/patch_utils.py +0 -0
  381. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/path_utils.py +0 -0
  382. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/prompts.py +0 -0
  383. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/request_context.py +0 -0
  384. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/retry.py +0 -0
  385. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/runner_controller.py +0 -0
  386. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/core/sqlite_utils.py +0 -0
  387. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/housekeeping.py +0 -0
  388. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/__init__.py +0 -0
  389. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/app_server/__init__.py +0 -0
  390. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/github/__init__.py +0 -0
  391. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/github/service.py +0 -0
  392. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/__init__.py +0 -0
  393. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/commands_registry.py +0 -0
  394. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/__init__.py +0 -0
  395. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/approvals.py +0 -0
  396. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/approvals.py +0 -0
  397. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/shared.py +0 -0
  398. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/commands/voice.py +0 -0
  399. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/questions.py +0 -0
  400. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/handlers/utils.py +0 -0
  401. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/notifications.py +0 -0
  402. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/overflow.py +0 -0
  403. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/rendering.py +0 -0
  404. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/retry.py +0 -0
  405. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/runtime.py +0 -0
  406. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/types.py +0 -0
  407. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/integrations/telegram/voice.py +0 -0
  408. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/LICENSE.xterm +0 -0
  409. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-cyrillic-ext.woff2 +0 -0
  410. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-cyrillic.woff2 +0 -0
  411. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-greek.woff2 +0 -0
  412. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-latin-ext.woff2 +0 -0
  413. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-latin.woff2 +0 -0
  414. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-400-vietnamese.woff2 +0 -0
  415. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-cyrillic-ext.woff2 +0 -0
  416. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-cyrillic.woff2 +0 -0
  417. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-greek.woff2 +0 -0
  418. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-latin-ext.woff2 +0 -0
  419. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-latin.woff2 +0 -0
  420. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-500-vietnamese.woff2 +0 -0
  421. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-cyrillic-ext.woff2 +0 -0
  422. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-cyrillic.woff2 +0 -0
  423. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-greek.woff2 +0 -0
  424. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-latin-ext.woff2 +0 -0
  425. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-latin.woff2 +0 -0
  426. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/JetBrainsMono-600-vietnamese.woff2 +0 -0
  427. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/fonts/jetbrains-mono/OFL.txt +0 -0
  428. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/xterm-addon-fit.js +0 -0
  429. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/xterm.css +0 -0
  430. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/static/vendor/xterm.js +0 -0
  431. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/__init__.py +0 -0
  432. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces}/web/pty_session.py +0 -0
  433. {codex_autorunner-0.1.2/src/codex_autorunner → codex_autorunner-1.1.0/src/codex_autorunner/surfaces/web}/routes/terminal_images.py +0 -0
  434. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/__init__.py +0 -0
  435. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/capture.py +0 -0
  436. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/config.py +0 -0
  437. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/provider.py +0 -0
  438. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/providers/__init__.py +0 -0
  439. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/providers/openai_whisper.py +0 -0
  440. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/resolver.py +0 -0
  441. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner/voice/service.py +0 -0
  442. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner.egg-info/dependency_links.txt +0 -0
  443. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner.egg-info/entry_points.txt +0 -0
  444. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner.egg-info/requires.txt +0 -0
  445. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/src/codex_autorunner.egg-info/top_level.txt +0 -0
  446. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_app_server_event_formatter.py +0 -0
  447. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_app_server_supervisor.py +0 -0
  448. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_app_server_thread_registry.py +0 -0
  449. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_base_path.py +0 -0
  450. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_cli_init.py +0 -0
  451. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_cli_sessions.py +0 -0
  452. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_cli_status.py +0 -0
  453. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_codex_cli_flags.py +0 -0
  454. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_codex_runner.py +0 -0
  455. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_engine_logs.py +0 -0
  456. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_housekeeping.py +0 -0
  457. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_hub_foundation.py +0 -0
  458. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_hub_terminal_sessions.py +0 -0
  459. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_hub_ui_escape.py +0 -0
  460. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_lock_utils.py +0 -0
  461. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_logging_utils.py +0 -0
  462. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_notifications.py +0 -0
  463. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_opencode_integration.py +0 -0
  464. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_opencode_review_arguments.py +0 -0
  465. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_optional_dependencies.py +0 -0
  466. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_origin_middleware.py +0 -0
  467. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_sse_streams.py +0 -0
  468. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_state_lock.py +0 -0
  469. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_state_sessions.py +0 -0
  470. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_static.py +0 -0
  471. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_system_update_check.py +0 -0
  472. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_system_update_worker.py +0 -0
  473. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_bot_lock.py +0 -0
  474. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_fast_ack.py +0 -0
  475. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_handlers_messages.py +0 -0
  476. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_interrupt_status.py +0 -0
  477. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_media_batch_failure.py +0 -0
  478. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_opencode_context_cache.py +0 -0
  479. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_opencode_usage.py +0 -0
  480. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_overflow.py +0 -0
  481. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_paths_compatible.py +0 -0
  482. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_progress_stream.py +0 -0
  483. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_status_rate_limits.py +0 -0
  484. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_task_tracking.py +0 -0
  485. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_thread_paths.py +0 -0
  486. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_topic_queue.py +0 -0
  487. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_transport.py +0 -0
  488. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_update_dedupe.py +0 -0
  489. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_telegram_whisper_disclaimer.py +0 -0
  490. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_terminal_idle_timeout.py +0 -0
  491. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_terminal_input_dedupe.py +0 -0
  492. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_capture.py +0 -0
  493. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_config.py +0 -0
  494. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_service.py +0 -0
  495. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_ui.py +0 -0
  496. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_whisper_mime_types.py +0 -0
  497. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_voice_whisper_provider.py +0 -0
  498. {codex_autorunner-0.1.2 → codex_autorunner-1.1.0}/tests/test_workspace_helpers.py +0 -0
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.4
2
+ Name: codex-autorunner
3
+ Version: 1.1.0
4
+ Summary: Codex autorunner CLI per DESIGN-V1
5
+ Author: Codex
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 David Zhang
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/Git-on-my-level/codex-autorunner
29
+ Project-URL: Repository, https://github.com/Git-on-my-level/codex-autorunner
30
+ Project-URL: Issues, https://github.com/Git-on-my-level/codex-autorunner/issues
31
+ Keywords: codex,automation,agent,cli,fastapi
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Programming Language :: Python :: 3
34
+ Classifier: Programming Language :: Python :: 3 :: Only
35
+ Classifier: Operating System :: OS Independent
36
+ Requires-Python: >=3.9
37
+ Description-Content-Type: text/markdown
38
+ License-File: LICENSE
39
+ Requires-Dist: typer>=0.9
40
+ Requires-Dist: click<8.2
41
+ Requires-Dist: pyyaml>=6.0
42
+ Requires-Dist: fastapi>=0.111
43
+ Requires-Dist: uvicorn[standard]>=0.30
44
+ Requires-Dist: ptyprocess>=0.7
45
+ Requires-Dist: python-multipart>=0.0.9
46
+ Requires-Dist: python-dotenv>=1.0
47
+ Requires-Dist: httpx>=0.27
48
+ Requires-Dist: tenacity>=8.0
49
+ Provides-Extra: dev
50
+ Requires-Dist: black==25.11.0; extra == "dev"
51
+ Requires-Dist: mypy>=1.10; extra == "dev"
52
+ Requires-Dist: pytest>=7.0; extra == "dev"
53
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
54
+ Requires-Dist: pytest-timeout>=2.0; extra == "dev"
55
+ Requires-Dist: ruff>=0.5.0; extra == "dev"
56
+ Requires-Dist: types-PyYAML; extra == "dev"
57
+ Provides-Extra: telegram
58
+ Requires-Dist: httpx>=0.27; extra == "telegram"
59
+ Provides-Extra: voice
60
+ Requires-Dist: httpx>=0.27; extra == "voice"
61
+ Requires-Dist: python-multipart>=0.0.9; extra == "voice"
62
+ Provides-Extra: github
63
+ Dynamic: license-file
64
+
65
+ # CAR (codex-autorunner)
66
+ [![PyPI](https://img.shields.io/pypi/v/codex-autorunner.svg)](https://pypi.org/project/codex-autorunner/)
67
+
68
+ CAR provides a set of low-opinion agent coordination tools for you to run long complex implementations using the agents you already love.
69
+
70
+ What this looks like in practice:
71
+ - You write a plan, or generate a plan by chatting with your favorite AI
72
+ - You convert the plan (or ask an AI to convert it for you) into CAR compatible tickets (markdown with some frontmatter)
73
+ - Go off and do something else, no need to babysit the agents, they will notify you if they need your input
74
+
75
+ ![CAR Web Hub Screenshot](docs/screenshots/hub.png)
76
+
77
+ ## How it works
78
+ CAR is very simple. At it's core, CAR is a state machine which checks to see if there are any incomplete tickets. If yes, pick the next one and run it against an agent. Tickets can be pre-populated by the user, but agents can also write tickets. _Tickets are the control plane for CAR_.
79
+
80
+ When each agent wakes up, it gets knowledge about CAR and how to operate within CAR, a pre-defined set of context (workspace files), the current ticket, and optionally the final output of the previous agent. This simple loop ensures that agents know enough to use CAR while also focusing them on the task at hand.
81
+
82
+ ## Philosophy
83
+ The philosophy behind CAR is to let the agents do what they do best, and get out of their way. CAR is _very bitter-lesson-pilled_. As models and agents get more powerful, CAR should serve as a form of leverage, and avoid constraining models and their harnesses. This is why we treat the filesystem as the first class data plane and utilize tools and languages the models are already very familiar with (git, python).
84
+
85
+ CAR treats tickets as the control plane and models as the execution layer. This means that we rely on agents to follow the instructions written in the tickets. If you use a sufficiently weak model, CAR may not work well for you. CAR is an amplifier for agent capabilities. Agents who like to scope creep (create too many new tickets) or reward hack (mark a ticket as done despite it being incomplete) are not a good fit for CAR.
86
+
87
+ ## Interaction patterns
88
+ CAR's core is a set of python functions surfaced as a CLI, operating on a file system. There are current 2 UIs built on top of this core.
89
+
90
+ ### Web UI
91
+ The web UI is the main control plane for CAR. From here you can set up new repositories or clone existing ones, chat with agents using their TUI, and run the ticket autorunner. There are many quality-of-life features like Whisper integration, editing documents by chatting with AI (useful for mobile), viewing usage analytics, and much more. The Web UI is the most full featured user-facing interface and a good starting point for trying out CAR.
92
+
93
+ I recommend serving the web UI over Tailscale. There is an auth token option but the system is not very battle tested.
94
+
95
+ ### Telegram
96
+ Telegram is the "on-the-go" and notification hub for CAR. From here you can kick off and monitor existing tickets, set up new tickets, and chat with agents. Your primary UX here is asking the agent to do things for you rather than you doing it yourself like you would on the web UI. This is great for on-the-go work, but it doesn't have full feature parity with the web UI.
97
+
98
+ ## Quickstart
99
+
100
+ The fastest way to get started is to pass [this setup guide](docs/AGENT_SETUP_GUIDE.md) to your favorite AI agent. The agent will walk you through installation and configuration interactively based on your environment.
101
+
102
+ **TL;DR for the impatient:**
103
+
104
+ # Install
105
+ ```
106
+ pipx install codex-autorunner
107
+ ```
108
+ # Initialize in your repo
109
+ ```
110
+ cd /path/to/your/repo
111
+ car init
112
+ ```
113
+ # Verify setup
114
+ ```
115
+ car doctor
116
+ ```
117
+ # Create a ticket and run
118
+ ```
119
+ car run
120
+ ```
121
+
122
+ ## Supported models
123
+ CAR currently supports:
124
+ - Codex
125
+ - Opencode
126
+
127
+ CAR is built to easily integrate any reasonable agent built for Agent Client Protocol (ACP). If you would like to see your agent supported, please reach out or open a PR.
128
+
129
+ ## Examples
130
+ Build out complex features and products by providing a series of tickets assigned to various agents.
131
+ ![CAR Tickets in Progress Screenshot](docs/screenshots/tickets-in-progress.png)
132
+
133
+ Tickets are just markdown files that both you and the agent can edit.
134
+ ![CAR Ticket Markdown Screenshot](docs/screenshots/ticket-markdown.png)
135
+
136
+ You don't have to babysit the agents, they inbox you or ping you on Telegram.
137
+ ![CAR Inbox Screenshot](docs/screenshots/inbox.png)
138
+
139
+ You can collaborate with the agents in a shared workspace, independent of the codebase. Drop context there, extract artifacts, it's like a shared scratchpad.
140
+ ![CAR Workspace Screenshot](docs/screenshots/workspace.png)
141
+
142
+ All core workspace documents are also just markdown files, so you and the agent can easily edit them.
143
+ ![CAR Workspace New MD Screenshot](docs/screenshots/workspace-new-md.png)
144
+
145
+ If you need to do something more custom or granular, you can use your favorite agent TUIs in the built-in terminal.
146
+ ![CAR Terminal Codex Screenshot](docs/screenshots/terminal-codex.png)
147
+ ![CAR Terminal Opencode Screenshot](docs/screenshots/terminal-opencode.png)
148
+
149
+ On the go? The web UI is mobile responsive, or if you prefer you can type or voice chat with your agents on Telegram.
150
+ ![CAR Telegram Media Voice Screenshot](docs/screenshots/telegram-media-voice.PNG)
151
+ ![CAR Telegram Media Image Screenshot](docs/screenshots/telegram-media-image.PNG)
152
+
153
+ ## Star history
154
+ [![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)
@@ -0,0 +1,90 @@
1
+ # CAR (codex-autorunner)
2
+ [![PyPI](https://img.shields.io/pypi/v/codex-autorunner.svg)](https://pypi.org/project/codex-autorunner/)
3
+
4
+ CAR provides a set of low-opinion agent coordination tools for you to run long complex implementations using the agents you already love.
5
+
6
+ What this looks like in practice:
7
+ - You write a plan, or generate a plan by chatting with your favorite AI
8
+ - You convert the plan (or ask an AI to convert it for you) into CAR compatible tickets (markdown with some frontmatter)
9
+ - Go off and do something else, no need to babysit the agents, they will notify you if they need your input
10
+
11
+ ![CAR Web Hub Screenshot](docs/screenshots/hub.png)
12
+
13
+ ## How it works
14
+ CAR is very simple. At it's core, CAR is a state machine which checks to see if there are any incomplete tickets. If yes, pick the next one and run it against an agent. Tickets can be pre-populated by the user, but agents can also write tickets. _Tickets are the control plane for CAR_.
15
+
16
+ When each agent wakes up, it gets knowledge about CAR and how to operate within CAR, a pre-defined set of context (workspace files), the current ticket, and optionally the final output of the previous agent. This simple loop ensures that agents know enough to use CAR while also focusing them on the task at hand.
17
+
18
+ ## Philosophy
19
+ The philosophy behind CAR is to let the agents do what they do best, and get out of their way. CAR is _very bitter-lesson-pilled_. As models and agents get more powerful, CAR should serve as a form of leverage, and avoid constraining models and their harnesses. This is why we treat the filesystem as the first class data plane and utilize tools and languages the models are already very familiar with (git, python).
20
+
21
+ CAR treats tickets as the control plane and models as the execution layer. This means that we rely on agents to follow the instructions written in the tickets. If you use a sufficiently weak model, CAR may not work well for you. CAR is an amplifier for agent capabilities. Agents who like to scope creep (create too many new tickets) or reward hack (mark a ticket as done despite it being incomplete) are not a good fit for CAR.
22
+
23
+ ## Interaction patterns
24
+ CAR's core is a set of python functions surfaced as a CLI, operating on a file system. There are current 2 UIs built on top of this core.
25
+
26
+ ### Web UI
27
+ The web UI is the main control plane for CAR. From here you can set up new repositories or clone existing ones, chat with agents using their TUI, and run the ticket autorunner. There are many quality-of-life features like Whisper integration, editing documents by chatting with AI (useful for mobile), viewing usage analytics, and much more. The Web UI is the most full featured user-facing interface and a good starting point for trying out CAR.
28
+
29
+ I recommend serving the web UI over Tailscale. There is an auth token option but the system is not very battle tested.
30
+
31
+ ### Telegram
32
+ Telegram is the "on-the-go" and notification hub for CAR. From here you can kick off and monitor existing tickets, set up new tickets, and chat with agents. Your primary UX here is asking the agent to do things for you rather than you doing it yourself like you would on the web UI. This is great for on-the-go work, but it doesn't have full feature parity with the web UI.
33
+
34
+ ## Quickstart
35
+
36
+ The fastest way to get started is to pass [this setup guide](docs/AGENT_SETUP_GUIDE.md) to your favorite AI agent. The agent will walk you through installation and configuration interactively based on your environment.
37
+
38
+ **TL;DR for the impatient:**
39
+
40
+ # Install
41
+ ```
42
+ pipx install codex-autorunner
43
+ ```
44
+ # Initialize in your repo
45
+ ```
46
+ cd /path/to/your/repo
47
+ car init
48
+ ```
49
+ # Verify setup
50
+ ```
51
+ car doctor
52
+ ```
53
+ # Create a ticket and run
54
+ ```
55
+ car run
56
+ ```
57
+
58
+ ## Supported models
59
+ CAR currently supports:
60
+ - Codex
61
+ - Opencode
62
+
63
+ CAR is built to easily integrate any reasonable agent built for Agent Client Protocol (ACP). If you would like to see your agent supported, please reach out or open a PR.
64
+
65
+ ## Examples
66
+ Build out complex features and products by providing a series of tickets assigned to various agents.
67
+ ![CAR Tickets in Progress Screenshot](docs/screenshots/tickets-in-progress.png)
68
+
69
+ Tickets are just markdown files that both you and the agent can edit.
70
+ ![CAR Ticket Markdown Screenshot](docs/screenshots/ticket-markdown.png)
71
+
72
+ You don't have to babysit the agents, they inbox you or ping you on Telegram.
73
+ ![CAR Inbox Screenshot](docs/screenshots/inbox.png)
74
+
75
+ You can collaborate with the agents in a shared workspace, independent of the codebase. Drop context there, extract artifacts, it's like a shared scratchpad.
76
+ ![CAR Workspace Screenshot](docs/screenshots/workspace.png)
77
+
78
+ All core workspace documents are also just markdown files, so you and the agent can easily edit them.
79
+ ![CAR Workspace New MD Screenshot](docs/screenshots/workspace-new-md.png)
80
+
81
+ If you need to do something more custom or granular, you can use your favorite agent TUIs in the built-in terminal.
82
+ ![CAR Terminal Codex Screenshot](docs/screenshots/terminal-codex.png)
83
+ ![CAR Terminal Opencode Screenshot](docs/screenshots/terminal-opencode.png)
84
+
85
+ On the go? The web UI is mobile responsive, or if you prefer you can type or voice chat with your agents on Telegram.
86
+ ![CAR Telegram Media Voice Screenshot](docs/screenshots/telegram-media-voice.PNG)
87
+ ![CAR Telegram Media Image Screenshot](docs/screenshots/telegram-media-image.PNG)
88
+
89
+ ## Star history
90
+ [![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.2"
3
+ version = "1.1.0"
4
4
  description = "Codex autorunner CLI per DESIGN-V1"
5
5
  readme = "README.md"
6
6
  license = {file = "LICENSE"}
@@ -82,14 +82,21 @@ completions = true
82
82
  cache_dir = ".codex-autorunner/pytest-cache"
83
83
  asyncio_mode = "auto"
84
84
  asyncio_default_fixture_loop_scope = "function"
85
+ norecursedirs = ["worktrees", ".git", ".venv", ".codex-autorunner"]
85
86
  markers = [
86
87
  "integration: marks tests as integration tests that require external dependencies (deselect with '-m \"not integration\"')",
87
88
  "timeout(seconds): per-test timeout (provided by pytest-timeout)",
88
89
  ]
90
+ filterwarnings = [
91
+ # Cancelled auto-restart tasks can emit noisy unraisable warnings when the event
92
+ # loop shuts down; we explicitly clean these up, so silence the residual notice.
93
+ "ignore::pytest.PytestUnraisableExceptionWarning",
94
+ ]
89
95
 
90
96
  [tool.ruff]
91
97
  line-length = 88
92
98
  target-version = "py39"
99
+ src = ["src"]
93
100
 
94
101
  [tool.ruff.lint]
95
102
  select = ["E", "F", "W", "I", "B"]
@@ -100,8 +107,11 @@ ignore = ["E501"]
100
107
  "src/codex_autorunner/pty_session.py" = ["F403"]
101
108
  "src/codex_autorunner/static_assets.py" = ["F403"]
102
109
  "src/codex_autorunner/cli.py" = ["B008"]
110
+ "src/codex_autorunner/surfaces/cli/cli.py" = ["B008"]
103
111
  "src/codex_autorunner/routes/terminal_images.py" = ["B008"]
112
+ "src/codex_autorunner/surfaces/web/routes/terminal_images.py" = ["B008"]
104
113
  "src/codex_autorunner/routes/voice.py" = ["B008"]
114
+ "src/codex_autorunner/surfaces/web/routes/voice.py" = ["B008"]
105
115
 
106
116
  [tool.mypy]
107
117
  python_version = "3.9"
@@ -0,0 +1,14 @@
1
+ """Codex autorunner package."""
2
+
3
+ __all__ = [
4
+ "cli",
5
+ "core",
6
+ "integrations",
7
+ "routes",
8
+ "server",
9
+ "surfaces",
10
+ "surfaces.web.routes",
11
+ "surfaces.web",
12
+ "voice",
13
+ "web",
14
+ ]
@@ -0,0 +1,4 @@
1
+ from .cli import app
2
+
3
+ if __name__ == "__main__":
4
+ app()
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
  from typing import Any, AsyncIterator, Optional
5
5
 
6
- from ...core.app_server_events import AppServerEventBuffer
6
+ from ...integrations.app_server.event_buffer import AppServerEventBuffer
7
7
  from ...integrations.app_server.supervisor import WorkspaceAppServerSupervisor
8
8
  from ..base import AgentHarness
9
9
  from ..types import AgentId, ConversationRef, ModelCatalog, ModelSpec, TurnRef
@@ -4,6 +4,7 @@ import asyncio
4
4
  import dataclasses
5
5
  import json
6
6
  import logging
7
+ import re
7
8
  from typing import Any, AsyncIterator, Iterable, Optional
8
9
 
9
10
  import httpx
@@ -48,7 +49,18 @@ def _normalize_sse_event(event: SSEEvent) -> SSEEvent:
48
49
  payload_obj = None
49
50
 
50
51
  if isinstance(payload_obj, dict) and isinstance(payload_obj.get("payload"), dict):
51
- payload_obj = payload_obj["payload"]
52
+ outer = payload_obj
53
+ inner = dict(outer.get("payload") or {})
54
+ if "type" not in inner and isinstance(outer.get("type"), str):
55
+ inner["type"] = outer["type"]
56
+ for key in ("sessionID", "sessionId", "session_id"):
57
+ if key in outer and key not in inner:
58
+ inner[key] = outer[key]
59
+ if "session" in outer and "session" not in inner:
60
+ inner["session"] = outer["session"]
61
+ if "properties" in outer and "properties" not in inner:
62
+ inner["properties"] = outer["properties"]
63
+ payload_obj = inner
52
64
 
53
65
  if isinstance(payload_obj, dict):
54
66
  payload_type = payload_obj.get("type")
@@ -505,49 +517,70 @@ class OpenCodeClient:
505
517
 
506
518
  async def fetch_openapi_spec(self) -> dict[str, Any]:
507
519
  """Fetch OpenAPI spec from /doc endpoint for capability negotiation."""
508
- async with self._client.stream("GET", "/doc") as response:
509
- response.raise_for_status()
510
- content = response.content
511
- try:
512
- spec = json.loads(content) if content else {}
513
- log_event(
514
- self._logger,
515
- logging.INFO,
516
- "opencode.openapi.fetched",
517
- paths=len(spec.get("paths", {})) if isinstance(spec, dict) else 0,
518
- has_components=(
519
- "components" in spec if isinstance(spec, dict) else False
520
- ),
521
- )
522
- return spec
523
- except Exception as exc:
524
- log_event(
525
- self._logger,
526
- logging.WARNING,
527
- "opencode.openapi.parse_failed",
528
- exc=exc,
529
- )
530
- raise OpenCodeProtocolError(
531
- f"Failed to parse OpenAPI spec: {exc}",
532
- status_code=response.status_code,
533
- content_type=(
534
- response.headers.get("content-type") if response else None
535
- ),
536
- ) from exc
520
+ response = await self._client.get("/doc")
521
+ response.raise_for_status()
522
+ content = response.content
523
+ try:
524
+ spec = json.loads(content) if content else {}
525
+ log_event(
526
+ self._logger,
527
+ logging.INFO,
528
+ "opencode.openapi.fetched",
529
+ paths=len(spec.get("paths", {})) if isinstance(spec, dict) else 0,
530
+ has_components=(
531
+ "components" in spec if isinstance(spec, dict) else False
532
+ ),
533
+ )
534
+ return spec
535
+ except Exception as exc:
536
+ log_event(
537
+ self._logger,
538
+ logging.WARNING,
539
+ "opencode.openapi.parse_failed",
540
+ exc=exc,
541
+ )
542
+ raise OpenCodeProtocolError(
543
+ f"Failed to parse OpenAPI spec: {exc}",
544
+ status_code=response.status_code,
545
+ content_type=(
546
+ response.headers.get("content-type") if response else None
547
+ ),
548
+ ) from exc
537
549
 
538
550
  def has_endpoint(
539
551
  self, openapi_spec: dict[str, Any], method: str, path: str
540
552
  ) -> bool:
541
- """Check if endpoint is available in OpenAPI spec."""
553
+ """Check if endpoint is available in OpenAPI spec.
554
+
555
+ The OpenAPI spec sometimes uses different template parameter names (e.g.,
556
+ `{sessionID}` vs `{session_id}`). We normalize templates before matching so
557
+ capability detection does not depend on placeholder spelling.
558
+ """
542
559
  if not isinstance(openapi_spec, dict):
543
560
  return False
544
561
  paths = openapi_spec.get("paths", {})
545
562
  if not isinstance(paths, dict):
546
563
  return False
547
- path_info = paths.get(path)
548
- if not isinstance(path_info, dict):
549
- return False
550
- return method in path_info
564
+
565
+ target = _normalize_template_path(path)
566
+ method = method.lower()
567
+
568
+ for candidate_path, info in paths.items():
569
+ if not isinstance(info, dict):
570
+ continue
571
+ if _normalize_template_path(candidate_path) != target:
572
+ continue
573
+ if method in info:
574
+ return True
575
+ return False
576
+
577
+
578
+ def _normalize_template_path(path: str) -> str:
579
+ """Collapse template placeholders to a canonical form.
580
+
581
+ Example: `/session/{sessionID}/prompt_async` -> `/session/{}/prompt_async`
582
+ """
583
+ return re.sub(r"{[^/]+}", "{}", path)
551
584
 
552
585
 
553
586
  __all__ = ["OpenCodeClient", "OpenCodeProtocolError", "OpenCodeApiProfile"]
@@ -0,0 +1,3 @@
1
+ DEFAULT_TICKET_MODEL = "zai-coding-plan/glm-4.7"
2
+
3
+ __all__ = ["DEFAULT_TICKET_MODEL"]
@@ -6,9 +6,10 @@ import logging
6
6
  from pathlib import Path
7
7
  from typing import Any, AsyncIterator, Optional
8
8
 
9
- from ...core.app_server_events import format_sse
9
+ from ...integrations.app_server.event_buffer import format_sse
10
10
  from ..base import AgentHarness
11
11
  from ..types import AgentId, ConversationRef, ModelCatalog, ModelSpec, TurnRef
12
+ from .constants import DEFAULT_TICKET_MODEL
12
13
  from .runtime import (
13
14
  build_turn_id,
14
15
  extract_session_id,
@@ -168,6 +169,8 @@ class OpenCodeHarness(AgentHarness):
168
169
  sandbox_policy: Optional[Any],
169
170
  ) -> TurnRef:
170
171
  client = await self._supervisor.get_client(workspace_root)
172
+ if model is None:
173
+ model = DEFAULT_TICKET_MODEL
171
174
  model_payload = split_model_id(model)
172
175
  await client.prompt_async(
173
176
  conversation_id,
@@ -192,6 +195,8 @@ class OpenCodeHarness(AgentHarness):
192
195
  sandbox_policy: Optional[Any],
193
196
  ) -> TurnRef:
194
197
  client = await self._supervisor.get_client(workspace_root)
198
+ if model is None:
199
+ model = DEFAULT_TICKET_MODEL
195
200
  arguments = prompt if prompt else ""
196
201
 
197
202
  async def _send_review() -> None:
@@ -66,11 +66,6 @@ class OpenCodeEventFormatter:
66
66
  for line in complete_lines:
67
67
  if line.strip():
68
68
  lines.append(f"**{line.strip()}**")
69
-
70
- remaining = coalescer.get_buffer()
71
- if remaining and remaining.strip():
72
- lines.append(f"**{remaining.strip()}**")
73
- coalescer.clear()
74
69
  return lines
75
70
 
76
71
  def _format_tool_part(self, part: dict[str, Any]) -> list[str]:
@@ -120,6 +115,27 @@ class OpenCodeEventFormatter:
120
115
  lines.append("exec")
121
116
  lines.append(f"tool: {tool_name}")
122
117
 
118
+ input_preview: Optional[str] = None
119
+ for key in ("input", "command", "cmd", "script"):
120
+ value = part.get(key)
121
+ if isinstance(value, str) and value.strip():
122
+ input_preview = value.strip()
123
+ break
124
+ if input_preview is None:
125
+ args = part.get("args") or part.get("arguments") or part.get("params")
126
+ if isinstance(args, dict):
127
+ for key in ("command", "cmd", "script", "input"):
128
+ value = args.get(key)
129
+ if isinstance(value, str) and value.strip():
130
+ input_preview = value.strip()
131
+ break
132
+ elif isinstance(args, str) and args.strip():
133
+ input_preview = args.strip()
134
+ if input_preview:
135
+ if len(input_preview) > 240:
136
+ input_preview = input_preview[:240] + "…"
137
+ lines.append(f"input: {input_preview}")
138
+
123
139
  return lines
124
140
 
125
141
  def _format_patch_part(self, part: dict[str, Any]) -> list[str]:
@@ -112,6 +112,7 @@ async def run_opencode_prompt(
112
112
  client,
113
113
  session_id=session_id,
114
114
  workspace_path=config.workspace_root,
115
+ model_payload=model_payload,
115
116
  permission_policy=permission_policy,
116
117
  should_stop=should_stop,
117
118
  ready_event=ready_event,