codex-autorunner 1.0.0__py3-none-any.whl → 1.2.0__py3-none-any.whl

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 (227) hide show
  1. codex_autorunner/__init__.py +12 -1
  2. codex_autorunner/agents/codex/harness.py +1 -1
  3. codex_autorunner/agents/opencode/client.py +113 -4
  4. codex_autorunner/agents/opencode/constants.py +3 -0
  5. codex_autorunner/agents/opencode/harness.py +6 -1
  6. codex_autorunner/agents/opencode/runtime.py +59 -18
  7. codex_autorunner/agents/opencode/supervisor.py +4 -0
  8. codex_autorunner/agents/registry.py +36 -7
  9. codex_autorunner/bootstrap.py +226 -4
  10. codex_autorunner/cli.py +5 -1174
  11. codex_autorunner/codex_cli.py +20 -84
  12. codex_autorunner/core/__init__.py +20 -0
  13. codex_autorunner/core/about_car.py +119 -1
  14. codex_autorunner/core/app_server_ids.py +59 -0
  15. codex_autorunner/core/app_server_threads.py +17 -2
  16. codex_autorunner/core/app_server_utils.py +165 -0
  17. codex_autorunner/core/archive.py +349 -0
  18. codex_autorunner/core/codex_runner.py +6 -2
  19. codex_autorunner/core/config.py +433 -4
  20. codex_autorunner/core/context_awareness.py +38 -0
  21. codex_autorunner/core/docs.py +0 -122
  22. codex_autorunner/core/drafts.py +58 -4
  23. codex_autorunner/core/exceptions.py +4 -0
  24. codex_autorunner/core/filebox.py +265 -0
  25. codex_autorunner/core/flows/controller.py +96 -2
  26. codex_autorunner/core/flows/models.py +13 -0
  27. codex_autorunner/core/flows/reasons.py +52 -0
  28. codex_autorunner/core/flows/reconciler.py +134 -0
  29. codex_autorunner/core/flows/runtime.py +57 -4
  30. codex_autorunner/core/flows/store.py +142 -7
  31. codex_autorunner/core/flows/transition.py +27 -15
  32. codex_autorunner/core/flows/ux_helpers.py +272 -0
  33. codex_autorunner/core/flows/worker_process.py +32 -6
  34. codex_autorunner/core/git_utils.py +62 -0
  35. codex_autorunner/core/hub.py +291 -20
  36. codex_autorunner/core/lifecycle_events.py +253 -0
  37. codex_autorunner/core/notifications.py +14 -2
  38. codex_autorunner/core/path_utils.py +2 -1
  39. codex_autorunner/core/pma_audit.py +224 -0
  40. codex_autorunner/core/pma_context.py +496 -0
  41. codex_autorunner/core/pma_dispatch_interceptor.py +284 -0
  42. codex_autorunner/core/pma_lifecycle.py +527 -0
  43. codex_autorunner/core/pma_queue.py +367 -0
  44. codex_autorunner/core/pma_safety.py +221 -0
  45. codex_autorunner/core/pma_state.py +115 -0
  46. codex_autorunner/core/ports/__init__.py +28 -0
  47. codex_autorunner/{integrations/agents → core/ports}/agent_backend.py +13 -8
  48. codex_autorunner/core/ports/backend_orchestrator.py +41 -0
  49. codex_autorunner/{integrations/agents → core/ports}/run_event.py +23 -6
  50. codex_autorunner/core/prompt.py +0 -80
  51. codex_autorunner/core/prompts.py +56 -172
  52. codex_autorunner/core/redaction.py +0 -4
  53. codex_autorunner/core/review_context.py +11 -9
  54. codex_autorunner/core/runner_controller.py +35 -33
  55. codex_autorunner/core/runner_state.py +147 -0
  56. codex_autorunner/core/runtime.py +829 -0
  57. codex_autorunner/core/sqlite_utils.py +13 -4
  58. codex_autorunner/core/state.py +7 -10
  59. codex_autorunner/core/state_roots.py +62 -0
  60. codex_autorunner/core/supervisor_protocol.py +15 -0
  61. codex_autorunner/core/templates/__init__.py +39 -0
  62. codex_autorunner/core/templates/git_mirror.py +234 -0
  63. codex_autorunner/core/templates/provenance.py +56 -0
  64. codex_autorunner/core/templates/scan_cache.py +120 -0
  65. codex_autorunner/core/text_delta_coalescer.py +54 -0
  66. codex_autorunner/core/ticket_linter_cli.py +218 -0
  67. codex_autorunner/core/ticket_manager_cli.py +494 -0
  68. codex_autorunner/core/time_utils.py +11 -0
  69. codex_autorunner/core/types.py +18 -0
  70. codex_autorunner/core/update.py +4 -5
  71. codex_autorunner/core/update_paths.py +28 -0
  72. codex_autorunner/core/usage.py +164 -12
  73. codex_autorunner/core/utils.py +125 -15
  74. codex_autorunner/flows/review/__init__.py +17 -0
  75. codex_autorunner/{core/review.py → flows/review/service.py} +37 -34
  76. codex_autorunner/flows/ticket_flow/definition.py +52 -3
  77. codex_autorunner/integrations/agents/__init__.py +11 -19
  78. codex_autorunner/integrations/agents/backend_orchestrator.py +302 -0
  79. codex_autorunner/integrations/agents/codex_adapter.py +90 -0
  80. codex_autorunner/integrations/agents/codex_backend.py +177 -25
  81. codex_autorunner/integrations/agents/opencode_adapter.py +108 -0
  82. codex_autorunner/integrations/agents/opencode_backend.py +305 -32
  83. codex_autorunner/integrations/agents/runner.py +86 -0
  84. codex_autorunner/integrations/agents/wiring.py +279 -0
  85. codex_autorunner/integrations/app_server/client.py +7 -60
  86. codex_autorunner/integrations/app_server/env.py +2 -107
  87. codex_autorunner/{core/app_server_events.py → integrations/app_server/event_buffer.py} +15 -8
  88. codex_autorunner/integrations/telegram/adapter.py +65 -0
  89. codex_autorunner/integrations/telegram/config.py +46 -0
  90. codex_autorunner/integrations/telegram/constants.py +1 -1
  91. codex_autorunner/integrations/telegram/doctor.py +228 -6
  92. codex_autorunner/integrations/telegram/handlers/callbacks.py +7 -0
  93. codex_autorunner/integrations/telegram/handlers/commands/execution.py +236 -74
  94. codex_autorunner/integrations/telegram/handlers/commands/files.py +314 -75
  95. codex_autorunner/integrations/telegram/handlers/commands/flows.py +1496 -71
  96. codex_autorunner/integrations/telegram/handlers/commands/workspace.py +498 -37
  97. codex_autorunner/integrations/telegram/handlers/commands_runtime.py +206 -48
  98. codex_autorunner/integrations/telegram/handlers/commands_spec.py +20 -3
  99. codex_autorunner/integrations/telegram/handlers/messages.py +27 -1
  100. codex_autorunner/integrations/telegram/handlers/selections.py +61 -1
  101. codex_autorunner/integrations/telegram/helpers.py +22 -1
  102. codex_autorunner/integrations/telegram/runtime.py +9 -4
  103. codex_autorunner/integrations/telegram/service.py +45 -10
  104. codex_autorunner/integrations/telegram/state.py +38 -0
  105. codex_autorunner/integrations/telegram/ticket_flow_bridge.py +338 -43
  106. codex_autorunner/integrations/telegram/transport.py +13 -4
  107. codex_autorunner/integrations/templates/__init__.py +27 -0
  108. codex_autorunner/integrations/templates/scan_agent.py +312 -0
  109. codex_autorunner/routes/__init__.py +37 -76
  110. codex_autorunner/routes/agents.py +2 -137
  111. codex_autorunner/routes/analytics.py +2 -238
  112. codex_autorunner/routes/app_server.py +2 -131
  113. codex_autorunner/routes/base.py +2 -596
  114. codex_autorunner/routes/file_chat.py +4 -833
  115. codex_autorunner/routes/flows.py +4 -977
  116. codex_autorunner/routes/messages.py +4 -456
  117. codex_autorunner/routes/repos.py +2 -196
  118. codex_autorunner/routes/review.py +2 -147
  119. codex_autorunner/routes/sessions.py +2 -175
  120. codex_autorunner/routes/settings.py +2 -168
  121. codex_autorunner/routes/shared.py +2 -275
  122. codex_autorunner/routes/system.py +4 -193
  123. codex_autorunner/routes/usage.py +2 -86
  124. codex_autorunner/routes/voice.py +2 -119
  125. codex_autorunner/routes/workspace.py +2 -270
  126. codex_autorunner/server.py +4 -4
  127. codex_autorunner/static/agentControls.js +61 -16
  128. codex_autorunner/static/app.js +126 -14
  129. codex_autorunner/static/archive.js +826 -0
  130. codex_autorunner/static/archiveApi.js +37 -0
  131. codex_autorunner/static/autoRefresh.js +7 -7
  132. codex_autorunner/static/chatUploads.js +137 -0
  133. codex_autorunner/static/dashboard.js +224 -171
  134. codex_autorunner/static/docChatCore.js +185 -13
  135. codex_autorunner/static/fileChat.js +68 -40
  136. codex_autorunner/static/fileboxUi.js +159 -0
  137. codex_autorunner/static/hub.js +114 -131
  138. codex_autorunner/static/index.html +375 -49
  139. codex_autorunner/static/messages.js +568 -87
  140. codex_autorunner/static/notifications.js +255 -0
  141. codex_autorunner/static/pma.js +1167 -0
  142. codex_autorunner/static/preserve.js +17 -0
  143. codex_autorunner/static/settings.js +128 -6
  144. codex_autorunner/static/smartRefresh.js +52 -0
  145. codex_autorunner/static/streamUtils.js +57 -0
  146. codex_autorunner/static/styles.css +9798 -6143
  147. codex_autorunner/static/tabs.js +152 -11
  148. codex_autorunner/static/templateReposSettings.js +225 -0
  149. codex_autorunner/static/terminal.js +18 -0
  150. codex_autorunner/static/ticketChatActions.js +165 -3
  151. codex_autorunner/static/ticketChatStream.js +17 -119
  152. codex_autorunner/static/ticketEditor.js +137 -15
  153. codex_autorunner/static/ticketTemplates.js +798 -0
  154. codex_autorunner/static/tickets.js +821 -98
  155. codex_autorunner/static/turnEvents.js +27 -0
  156. codex_autorunner/static/turnResume.js +33 -0
  157. codex_autorunner/static/utils.js +39 -0
  158. codex_autorunner/static/workspace.js +389 -82
  159. codex_autorunner/static/workspaceFileBrowser.js +15 -13
  160. codex_autorunner/surfaces/__init__.py +5 -0
  161. codex_autorunner/surfaces/cli/__init__.py +6 -0
  162. codex_autorunner/surfaces/cli/cli.py +2534 -0
  163. codex_autorunner/surfaces/cli/codex_cli.py +20 -0
  164. codex_autorunner/surfaces/cli/pma_cli.py +817 -0
  165. codex_autorunner/surfaces/telegram/__init__.py +3 -0
  166. codex_autorunner/surfaces/web/__init__.py +1 -0
  167. codex_autorunner/surfaces/web/app.py +2223 -0
  168. codex_autorunner/surfaces/web/hub_jobs.py +192 -0
  169. codex_autorunner/surfaces/web/middleware.py +587 -0
  170. codex_autorunner/surfaces/web/pty_session.py +370 -0
  171. codex_autorunner/surfaces/web/review.py +6 -0
  172. codex_autorunner/surfaces/web/routes/__init__.py +82 -0
  173. codex_autorunner/surfaces/web/routes/agents.py +138 -0
  174. codex_autorunner/surfaces/web/routes/analytics.py +284 -0
  175. codex_autorunner/surfaces/web/routes/app_server.py +132 -0
  176. codex_autorunner/surfaces/web/routes/archive.py +357 -0
  177. codex_autorunner/surfaces/web/routes/base.py +615 -0
  178. codex_autorunner/surfaces/web/routes/file_chat.py +1117 -0
  179. codex_autorunner/surfaces/web/routes/filebox.py +227 -0
  180. codex_autorunner/surfaces/web/routes/flows.py +1354 -0
  181. codex_autorunner/surfaces/web/routes/messages.py +490 -0
  182. codex_autorunner/surfaces/web/routes/pma.py +1652 -0
  183. codex_autorunner/surfaces/web/routes/repos.py +197 -0
  184. codex_autorunner/surfaces/web/routes/review.py +148 -0
  185. codex_autorunner/surfaces/web/routes/sessions.py +176 -0
  186. codex_autorunner/surfaces/web/routes/settings.py +169 -0
  187. codex_autorunner/surfaces/web/routes/shared.py +277 -0
  188. codex_autorunner/surfaces/web/routes/system.py +196 -0
  189. codex_autorunner/surfaces/web/routes/templates.py +634 -0
  190. codex_autorunner/surfaces/web/routes/usage.py +89 -0
  191. codex_autorunner/surfaces/web/routes/voice.py +120 -0
  192. codex_autorunner/surfaces/web/routes/workspace.py +271 -0
  193. codex_autorunner/surfaces/web/runner_manager.py +25 -0
  194. codex_autorunner/surfaces/web/schemas.py +469 -0
  195. codex_autorunner/surfaces/web/static_assets.py +490 -0
  196. codex_autorunner/surfaces/web/static_refresh.py +86 -0
  197. codex_autorunner/surfaces/web/terminal_sessions.py +78 -0
  198. codex_autorunner/tickets/__init__.py +8 -1
  199. codex_autorunner/tickets/agent_pool.py +53 -4
  200. codex_autorunner/tickets/files.py +37 -16
  201. codex_autorunner/tickets/lint.py +50 -0
  202. codex_autorunner/tickets/models.py +6 -1
  203. codex_autorunner/tickets/outbox.py +50 -2
  204. codex_autorunner/tickets/runner.py +396 -57
  205. codex_autorunner/web/__init__.py +5 -1
  206. codex_autorunner/web/app.py +2 -1949
  207. codex_autorunner/web/hub_jobs.py +2 -191
  208. codex_autorunner/web/middleware.py +2 -586
  209. codex_autorunner/web/pty_session.py +2 -369
  210. codex_autorunner/web/runner_manager.py +2 -24
  211. codex_autorunner/web/schemas.py +2 -376
  212. codex_autorunner/web/static_assets.py +4 -441
  213. codex_autorunner/web/static_refresh.py +2 -85
  214. codex_autorunner/web/terminal_sessions.py +2 -77
  215. codex_autorunner/workspace/paths.py +49 -33
  216. codex_autorunner-1.2.0.dist-info/METADATA +150 -0
  217. codex_autorunner-1.2.0.dist-info/RECORD +339 -0
  218. codex_autorunner/core/adapter_utils.py +0 -21
  219. codex_autorunner/core/engine.py +0 -2653
  220. codex_autorunner/core/static_assets.py +0 -55
  221. codex_autorunner-1.0.0.dist-info/METADATA +0 -246
  222. codex_autorunner-1.0.0.dist-info/RECORD +0 -251
  223. /codex_autorunner/{routes → surfaces/web/routes}/terminal_images.py +0 -0
  224. {codex_autorunner-1.0.0.dist-info → codex_autorunner-1.2.0.dist-info}/WHEEL +0 -0
  225. {codex_autorunner-1.0.0.dist-info → codex_autorunner-1.2.0.dist-info}/entry_points.txt +0 -0
  226. {codex_autorunner-1.0.0.dist-info → codex_autorunner-1.2.0.dist-info}/licenses/LICENSE +0 -0
  227. {codex_autorunner-1.0.0.dist-info → codex_autorunner-1.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,469 @@
1
+ """
2
+ Pydantic request/response schemas for web and API routes.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Any, Dict, List, Literal, Optional
8
+
9
+ from pydantic import AliasChoices, BaseModel, ConfigDict, Field
10
+
11
+
12
+ class Payload(BaseModel):
13
+ model_config = ConfigDict(extra="ignore", populate_by_name=True)
14
+
15
+
16
+ class ResponseModel(BaseModel):
17
+ model_config = ConfigDict(extra="ignore")
18
+
19
+
20
+ class WorkspaceWriteRequest(Payload):
21
+ content: str = ""
22
+
23
+
24
+ class WorkspaceResponse(ResponseModel):
25
+ active_context: str
26
+ decisions: str
27
+ spec: str
28
+
29
+
30
+ class WorkspaceFileItem(ResponseModel):
31
+ name: str
32
+ path: str
33
+ is_pinned: bool = False
34
+ modified_at: Optional[str] = None
35
+
36
+
37
+ class WorkspaceFileListResponse(ResponseModel):
38
+ files: List[WorkspaceFileItem]
39
+
40
+
41
+ class WorkspaceNode(ResponseModel):
42
+ name: str
43
+ path: str
44
+ type: Literal["file", "folder"]
45
+ is_pinned: bool = False
46
+ modified_at: Optional[str] = None
47
+ size: Optional[int] = None
48
+ children: Optional[List["WorkspaceNode"]] = None
49
+
50
+
51
+ WorkspaceNode.model_rebuild()
52
+
53
+
54
+ class WorkspaceTreeResponse(ResponseModel):
55
+ tree: List[WorkspaceNode]
56
+
57
+
58
+ class WorkspaceUploadedItem(ResponseModel):
59
+ filename: str
60
+ path: str
61
+ size: int
62
+
63
+
64
+ class WorkspaceUploadResponse(ResponseModel):
65
+ status: str
66
+ uploaded: List[WorkspaceUploadedItem]
67
+
68
+
69
+ class ArchiveSnapshotSummary(ResponseModel):
70
+ snapshot_id: str
71
+ worktree_repo_id: str
72
+ created_at: Optional[str] = None
73
+ status: Optional[str] = None
74
+ branch: Optional[str] = None
75
+ head_sha: Optional[str] = None
76
+ note: Optional[str] = None
77
+ summary: Optional[Dict[str, Any]] = None
78
+
79
+
80
+ class ArchiveSnapshotsResponse(ResponseModel):
81
+ snapshots: List[ArchiveSnapshotSummary]
82
+
83
+
84
+ class ArchiveSnapshotDetailResponse(ResponseModel):
85
+ snapshot: ArchiveSnapshotSummary
86
+ meta: Optional[Dict[str, Any]] = None
87
+
88
+
89
+ class ArchiveTreeNode(ResponseModel):
90
+ path: str
91
+ name: str
92
+ type: Literal["file", "folder"]
93
+ size_bytes: Optional[int] = None
94
+ mtime: Optional[float] = None
95
+
96
+
97
+ class ArchiveTreeResponse(ResponseModel):
98
+ path: str
99
+ nodes: List[ArchiveTreeNode]
100
+
101
+
102
+ class SpecIngestTicketsResponse(ResponseModel):
103
+ status: str
104
+ created: int
105
+ first_ticket_path: Optional[str] = None
106
+
107
+
108
+ class RunControlRequest(Payload):
109
+ once: bool = False
110
+ agent: Optional[str] = None
111
+ model: Optional[str] = None
112
+ reasoning: Optional[str] = None
113
+
114
+
115
+ class HubCreateRepoRequest(Payload):
116
+ git_url: Optional[str] = Field(
117
+ default=None, validation_alias=AliasChoices("git_url", "gitUrl")
118
+ )
119
+ repo_id: Optional[str] = Field(
120
+ default=None, validation_alias=AliasChoices("repo_id", "id")
121
+ )
122
+ path: Optional[str] = None
123
+ git_init: bool = True
124
+ force: bool = False
125
+
126
+
127
+ class HubRemoveRepoRequest(Payload):
128
+ force: bool = False
129
+ delete_dir: bool = True
130
+ delete_worktrees: bool = False
131
+
132
+
133
+ class HubCreateWorktreeRequest(Payload):
134
+ base_repo_id: str = Field(
135
+ validation_alias=AliasChoices("base_repo_id", "baseRepoId")
136
+ )
137
+ branch: str
138
+ force: bool = False
139
+ start_point: Optional[str] = Field(
140
+ default=None,
141
+ validation_alias=AliasChoices(
142
+ "start_point", "startPoint", "base_ref", "baseRef"
143
+ ),
144
+ )
145
+
146
+
147
+ class HubCleanupWorktreeRequest(Payload):
148
+ worktree_repo_id: str = Field(
149
+ validation_alias=AliasChoices("worktree_repo_id", "worktreeRepoId")
150
+ )
151
+ delete_branch: bool = False
152
+ delete_remote: bool = False
153
+ archive: bool = True
154
+ force_archive: bool = Field(
155
+ default=False, validation_alias=AliasChoices("force_archive", "forceArchive")
156
+ )
157
+ archive_note: Optional[str] = Field(
158
+ default=None, validation_alias=AliasChoices("archive_note", "archiveNote")
159
+ )
160
+
161
+
162
+ class AppServerThreadResetRequest(Payload):
163
+ key: str = Field(
164
+ validation_alias=AliasChoices("key", "feature", "feature_key", "featureKey")
165
+ )
166
+
167
+
168
+ class AppServerThreadArchiveRequest(Payload):
169
+ thread_id: str = Field(validation_alias=AliasChoices("thread_id", "threadId", "id"))
170
+
171
+
172
+ class SessionSettingsRequest(Payload):
173
+ autorunner_model_override: Optional[str] = None
174
+ autorunner_effort_override: Optional[str] = None
175
+ autorunner_approval_policy: Optional[str] = None
176
+ autorunner_sandbox_mode: Optional[str] = None
177
+ autorunner_workspace_write_network: Optional[bool] = None
178
+ runner_stop_after_runs: Optional[int] = None
179
+
180
+
181
+ class GithubIssueRequest(Payload):
182
+ issue: str
183
+
184
+
185
+ class GithubContextRequest(Payload):
186
+ url: str
187
+
188
+
189
+ class GithubPrSyncRequest(Payload):
190
+ draft: bool = True
191
+ title: Optional[str] = None
192
+ body: Optional[str] = None
193
+ mode: Optional[str] = None
194
+
195
+
196
+ class SessionStopRequest(Payload):
197
+ session_id: Optional[str] = None
198
+ repo_path: Optional[str] = None
199
+
200
+
201
+ class TemplateRepoSummary(ResponseModel):
202
+ id: str
203
+ url: str
204
+ trusted: bool
205
+ default_ref: str
206
+
207
+
208
+ class TemplateReposResponse(ResponseModel):
209
+ enabled: bool
210
+ repos: List[TemplateRepoSummary]
211
+
212
+
213
+ class TemplateRepoCreateRequest(Payload):
214
+ id: str
215
+ url: str
216
+ trusted: bool = False
217
+ default_ref: str = Field(
218
+ default="main", validation_alias=AliasChoices("default_ref", "defaultRef")
219
+ )
220
+
221
+
222
+ class TemplateRepoUpdateRequest(Payload):
223
+ url: Optional[str] = None
224
+ trusted: Optional[bool] = None
225
+ default_ref: Optional[str] = Field(
226
+ default=None, validation_alias=AliasChoices("default_ref", "defaultRef")
227
+ )
228
+
229
+
230
+ class TemplateFetchRequest(Payload):
231
+ template: str
232
+
233
+
234
+ class TemplateFetchResponse(ResponseModel):
235
+ content: str
236
+ repo_id: str
237
+ path: str
238
+ ref: str
239
+ commit_sha: str
240
+ blob_sha: str
241
+ trusted: bool
242
+ scan_decision: Optional[Dict[str, Any]] = None
243
+
244
+
245
+ class TemplateApplyRequest(Payload):
246
+ template: str
247
+ ticket_dir: Optional[str] = Field(
248
+ default=None, validation_alias=AliasChoices("ticket_dir", "ticketDir")
249
+ )
250
+ at: Optional[int] = None
251
+ next_index: bool = Field(
252
+ default=True, validation_alias=AliasChoices("next_index", "nextIndex")
253
+ )
254
+ suffix: Optional[str] = None
255
+ set_agent: Optional[str] = Field(
256
+ default=None, validation_alias=AliasChoices("set_agent", "setAgent")
257
+ )
258
+ include_provenance: bool = Field(
259
+ default=False,
260
+ validation_alias=AliasChoices("include_provenance", "includeProvenance"),
261
+ )
262
+
263
+
264
+ class TemplateApplyResponse(ResponseModel):
265
+ created_path: str
266
+ index: int
267
+ filename: str
268
+ metadata: Dict[str, Any]
269
+
270
+
271
+ class SystemUpdateRequest(Payload):
272
+ target: Optional[str] = None
273
+
274
+
275
+ class HubJobResponse(ResponseModel):
276
+ job_id: str
277
+ kind: str
278
+ status: str
279
+ created_at: str
280
+ started_at: Optional[str]
281
+ finished_at: Optional[str]
282
+ result: Optional[Dict[str, Any]]
283
+ error: Optional[str]
284
+
285
+
286
+ class SessionSettingsResponse(ResponseModel):
287
+ autorunner_model_override: Optional[str]
288
+ autorunner_effort_override: Optional[str]
289
+ autorunner_approval_policy: Optional[str]
290
+ autorunner_sandbox_mode: Optional[str]
291
+ autorunner_workspace_write_network: Optional[bool]
292
+ runner_stop_after_runs: Optional[int]
293
+
294
+
295
+ class VersionResponse(ResponseModel):
296
+ asset_version: Optional[str]
297
+
298
+
299
+ class RunControlResponse(ResponseModel):
300
+ running: bool
301
+ once: bool
302
+
303
+
304
+ class RunStatusResponse(ResponseModel):
305
+ running: bool
306
+
307
+
308
+ class RunResetResponse(ResponseModel):
309
+ status: str
310
+ message: str
311
+
312
+
313
+ class SessionItemResponse(ResponseModel):
314
+ session_id: str
315
+ repo_path: Optional[str]
316
+ abs_repo_path: Optional[str] = None
317
+ created_at: Optional[str]
318
+ last_seen_at: Optional[str]
319
+ status: Optional[str]
320
+ alive: bool
321
+
322
+
323
+ class SessionsResponse(ResponseModel):
324
+ sessions: List[SessionItemResponse]
325
+ repo_to_session: Dict[str, str]
326
+ abs_repo_to_session: Optional[Dict[str, str]] = None
327
+
328
+
329
+ class SessionStopResponse(ResponseModel):
330
+ status: str
331
+ session_id: str
332
+
333
+
334
+ class AppServerThreadsResponse(ResponseModel):
335
+ file_chat: Optional[str] = None
336
+ file_chat_opencode: Optional[str] = None
337
+ autorunner: Optional[str] = None
338
+ autorunner_opencode: Optional[str] = None
339
+ corruption: Optional[Dict[str, Any]] = None
340
+
341
+
342
+ class AppServerThreadResetResponse(ResponseModel):
343
+ status: str
344
+ key: str
345
+ cleared: bool
346
+
347
+
348
+ class AppServerThreadArchiveResponse(ResponseModel):
349
+ status: str
350
+ thread_id: str
351
+ archived: bool
352
+
353
+
354
+ class AppServerThreadResetAllResponse(ResponseModel):
355
+ status: str
356
+ cleared: bool
357
+
358
+
359
+ class TokenTotalsResponse(ResponseModel):
360
+ input_tokens: int
361
+ cached_input_tokens: int
362
+ output_tokens: int
363
+ reasoning_output_tokens: int
364
+ total_tokens: int
365
+
366
+
367
+ class RepoUsageResponse(ResponseModel):
368
+ mode: str
369
+ repo: str
370
+ codex_home: str
371
+ since: Optional[str]
372
+ until: Optional[str]
373
+ status: str
374
+ events: int
375
+ totals: TokenTotalsResponse
376
+ latest_rate_limits: Optional[Dict[str, Any]]
377
+
378
+
379
+ class UsageSeriesEntryResponse(ResponseModel):
380
+ key: str
381
+ model: Optional[str]
382
+ token_type: Optional[str]
383
+ total: int
384
+ values: List[int]
385
+
386
+
387
+ class UsageSeriesResponse(ResponseModel):
388
+ mode: str
389
+ repo: str
390
+ codex_home: str
391
+ since: Optional[str]
392
+ until: Optional[str]
393
+ status: str
394
+ bucket: str
395
+ segment: str
396
+ buckets: List[str]
397
+ series: List[UsageSeriesEntryResponse]
398
+
399
+
400
+ class SystemHealthResponse(ResponseModel):
401
+ status: str
402
+ mode: str
403
+ base_path: str
404
+ asset_version: Optional[str] = None
405
+
406
+
407
+ class SystemUpdateResponse(ResponseModel):
408
+ status: str
409
+ message: str
410
+ target: str
411
+
412
+
413
+ class SystemUpdateStatusResponse(ResponseModel):
414
+ status: str
415
+ message: str
416
+
417
+
418
+ class SystemUpdateCheckResponse(ResponseModel):
419
+ status: str
420
+ update_available: bool
421
+ message: str
422
+ local_commit: Optional[str] = None
423
+ remote_commit: Optional[str] = None
424
+
425
+
426
+ class ReviewStartRequest(Payload):
427
+ agent: Optional[str] = None
428
+ model: Optional[str] = None
429
+ reasoning: Optional[str] = None
430
+ max_wallclock_seconds: Optional[int] = Field(
431
+ default=None,
432
+ validation_alias=AliasChoices("max_wallclock_seconds", "maxWallclockSeconds"),
433
+ )
434
+
435
+
436
+ class ReviewStatusResponse(ResponseModel):
437
+ review: Dict[str, Any]
438
+
439
+
440
+ class ReviewControlResponse(ResponseModel):
441
+ status: str
442
+ detail: Optional[str] = None
443
+
444
+
445
+ # Ticket CRUD schemas
446
+
447
+
448
+ class TicketCreateRequest(Payload):
449
+ agent: str = "codex"
450
+ title: Optional[str] = None
451
+ goal: Optional[str] = None
452
+ body: str = ""
453
+
454
+
455
+ class TicketUpdateRequest(Payload):
456
+ content: str # Full markdown with frontmatter
457
+
458
+
459
+ class TicketResponse(ResponseModel):
460
+ path: str
461
+ index: int
462
+ frontmatter: Dict[str, Any]
463
+ body: str
464
+
465
+
466
+ class TicketDeleteResponse(ResponseModel):
467
+ status: str
468
+ index: int
469
+ path: str