codex-autorunner 0.1.2__py3-none-any.whl → 1.0.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 (189) hide show
  1. codex_autorunner/__main__.py +4 -0
  2. codex_autorunner/agents/opencode/client.py +68 -35
  3. codex_autorunner/agents/opencode/logging.py +21 -5
  4. codex_autorunner/agents/opencode/run_prompt.py +1 -0
  5. codex_autorunner/agents/opencode/runtime.py +118 -30
  6. codex_autorunner/agents/opencode/supervisor.py +36 -48
  7. codex_autorunner/agents/registry.py +136 -8
  8. codex_autorunner/api.py +25 -0
  9. codex_autorunner/bootstrap.py +16 -35
  10. codex_autorunner/cli.py +157 -139
  11. codex_autorunner/core/about_car.py +44 -32
  12. codex_autorunner/core/adapter_utils.py +21 -0
  13. codex_autorunner/core/app_server_logging.py +7 -3
  14. codex_autorunner/core/app_server_prompts.py +27 -260
  15. codex_autorunner/core/app_server_threads.py +15 -26
  16. codex_autorunner/core/codex_runner.py +6 -0
  17. codex_autorunner/core/config.py +390 -100
  18. codex_autorunner/core/docs.py +10 -2
  19. codex_autorunner/core/drafts.py +82 -0
  20. codex_autorunner/core/engine.py +278 -262
  21. codex_autorunner/core/flows/__init__.py +25 -0
  22. codex_autorunner/core/flows/controller.py +178 -0
  23. codex_autorunner/core/flows/definition.py +82 -0
  24. codex_autorunner/core/flows/models.py +75 -0
  25. codex_autorunner/core/flows/runtime.py +351 -0
  26. codex_autorunner/core/flows/store.py +485 -0
  27. codex_autorunner/core/flows/transition.py +133 -0
  28. codex_autorunner/core/flows/worker_process.py +242 -0
  29. codex_autorunner/core/hub.py +15 -9
  30. codex_autorunner/core/locks.py +4 -0
  31. codex_autorunner/core/prompt.py +15 -7
  32. codex_autorunner/core/redaction.py +29 -0
  33. codex_autorunner/core/review_context.py +5 -8
  34. codex_autorunner/core/run_index.py +6 -0
  35. codex_autorunner/core/runner_process.py +5 -2
  36. codex_autorunner/core/state.py +0 -88
  37. codex_autorunner/core/static_assets.py +55 -0
  38. codex_autorunner/core/supervisor_utils.py +67 -0
  39. codex_autorunner/core/update.py +20 -11
  40. codex_autorunner/core/update_runner.py +2 -0
  41. codex_autorunner/core/utils.py +29 -2
  42. codex_autorunner/discovery.py +2 -4
  43. codex_autorunner/flows/ticket_flow/__init__.py +3 -0
  44. codex_autorunner/flows/ticket_flow/definition.py +91 -0
  45. codex_autorunner/integrations/agents/__init__.py +27 -0
  46. codex_autorunner/integrations/agents/agent_backend.py +142 -0
  47. codex_autorunner/integrations/agents/codex_backend.py +307 -0
  48. codex_autorunner/integrations/agents/opencode_backend.py +325 -0
  49. codex_autorunner/integrations/agents/run_event.py +71 -0
  50. codex_autorunner/integrations/app_server/client.py +576 -92
  51. codex_autorunner/integrations/app_server/supervisor.py +59 -33
  52. codex_autorunner/integrations/telegram/adapter.py +141 -167
  53. codex_autorunner/integrations/telegram/api_schemas.py +120 -0
  54. codex_autorunner/integrations/telegram/config.py +175 -0
  55. codex_autorunner/integrations/telegram/constants.py +16 -1
  56. codex_autorunner/integrations/telegram/dispatch.py +17 -0
  57. codex_autorunner/integrations/telegram/doctor.py +47 -0
  58. codex_autorunner/integrations/telegram/handlers/callbacks.py +0 -4
  59. codex_autorunner/integrations/telegram/handlers/commands/__init__.py +2 -0
  60. codex_autorunner/integrations/telegram/handlers/commands/execution.py +53 -57
  61. codex_autorunner/integrations/telegram/handlers/commands/files.py +2 -6
  62. codex_autorunner/integrations/telegram/handlers/commands/flows.py +227 -0
  63. codex_autorunner/integrations/telegram/handlers/commands/formatting.py +1 -1
  64. codex_autorunner/integrations/telegram/handlers/commands/github.py +41 -582
  65. codex_autorunner/integrations/telegram/handlers/commands/workspace.py +8 -8
  66. codex_autorunner/integrations/telegram/handlers/commands_runtime.py +133 -475
  67. codex_autorunner/integrations/telegram/handlers/commands_spec.py +11 -4
  68. codex_autorunner/integrations/telegram/handlers/messages.py +120 -9
  69. codex_autorunner/integrations/telegram/helpers.py +88 -16
  70. codex_autorunner/integrations/telegram/outbox.py +208 -37
  71. codex_autorunner/integrations/telegram/progress_stream.py +3 -10
  72. codex_autorunner/integrations/telegram/service.py +214 -40
  73. codex_autorunner/integrations/telegram/state.py +100 -2
  74. codex_autorunner/integrations/telegram/ticket_flow_bridge.py +322 -0
  75. codex_autorunner/integrations/telegram/transport.py +36 -3
  76. codex_autorunner/integrations/telegram/trigger_mode.py +53 -0
  77. codex_autorunner/manifest.py +2 -0
  78. codex_autorunner/plugin_api.py +22 -0
  79. codex_autorunner/routes/__init__.py +23 -14
  80. codex_autorunner/routes/analytics.py +239 -0
  81. codex_autorunner/routes/base.py +81 -109
  82. codex_autorunner/routes/file_chat.py +836 -0
  83. codex_autorunner/routes/flows.py +980 -0
  84. codex_autorunner/routes/messages.py +459 -0
  85. codex_autorunner/routes/system.py +6 -1
  86. codex_autorunner/routes/usage.py +87 -0
  87. codex_autorunner/routes/workspace.py +271 -0
  88. codex_autorunner/server.py +2 -1
  89. codex_autorunner/static/agentControls.js +1 -0
  90. codex_autorunner/static/agentEvents.js +248 -0
  91. codex_autorunner/static/app.js +25 -22
  92. codex_autorunner/static/autoRefresh.js +29 -1
  93. codex_autorunner/static/bootstrap.js +1 -0
  94. codex_autorunner/static/bus.js +1 -0
  95. codex_autorunner/static/cache.js +1 -0
  96. codex_autorunner/static/constants.js +20 -4
  97. codex_autorunner/static/dashboard.js +162 -196
  98. codex_autorunner/static/diffRenderer.js +37 -0
  99. codex_autorunner/static/docChatCore.js +324 -0
  100. codex_autorunner/static/docChatStorage.js +65 -0
  101. codex_autorunner/static/docChatVoice.js +65 -0
  102. codex_autorunner/static/docEditor.js +133 -0
  103. codex_autorunner/static/env.js +1 -0
  104. codex_autorunner/static/eventSummarizer.js +166 -0
  105. codex_autorunner/static/fileChat.js +182 -0
  106. codex_autorunner/static/health.js +155 -0
  107. codex_autorunner/static/hub.js +41 -118
  108. codex_autorunner/static/index.html +787 -858
  109. codex_autorunner/static/liveUpdates.js +1 -0
  110. codex_autorunner/static/loader.js +1 -0
  111. codex_autorunner/static/messages.js +470 -0
  112. codex_autorunner/static/mobileCompact.js +2 -1
  113. codex_autorunner/static/settings.js +24 -211
  114. codex_autorunner/static/styles.css +7567 -3865
  115. codex_autorunner/static/tabs.js +28 -5
  116. codex_autorunner/static/terminal.js +14 -0
  117. codex_autorunner/static/terminalManager.js +34 -59
  118. codex_autorunner/static/ticketChatActions.js +333 -0
  119. codex_autorunner/static/ticketChatEvents.js +16 -0
  120. codex_autorunner/static/ticketChatStorage.js +16 -0
  121. codex_autorunner/static/ticketChatStream.js +264 -0
  122. codex_autorunner/static/ticketEditor.js +750 -0
  123. codex_autorunner/static/ticketVoice.js +9 -0
  124. codex_autorunner/static/tickets.js +1315 -0
  125. codex_autorunner/static/utils.js +32 -3
  126. codex_autorunner/static/voice.js +1 -0
  127. codex_autorunner/static/workspace.js +672 -0
  128. codex_autorunner/static/workspaceApi.js +53 -0
  129. codex_autorunner/static/workspaceFileBrowser.js +504 -0
  130. codex_autorunner/tickets/__init__.py +20 -0
  131. codex_autorunner/tickets/agent_pool.py +377 -0
  132. codex_autorunner/tickets/files.py +85 -0
  133. codex_autorunner/tickets/frontmatter.py +55 -0
  134. codex_autorunner/tickets/lint.py +102 -0
  135. codex_autorunner/tickets/models.py +95 -0
  136. codex_autorunner/tickets/outbox.py +232 -0
  137. codex_autorunner/tickets/replies.py +179 -0
  138. codex_autorunner/tickets/runner.py +823 -0
  139. codex_autorunner/tickets/spec_ingest.py +77 -0
  140. codex_autorunner/web/app.py +269 -91
  141. codex_autorunner/web/middleware.py +3 -4
  142. codex_autorunner/web/schemas.py +89 -109
  143. codex_autorunner/web/static_assets.py +1 -44
  144. codex_autorunner/workspace/__init__.py +40 -0
  145. codex_autorunner/workspace/paths.py +319 -0
  146. {codex_autorunner-0.1.2.dist-info → codex_autorunner-1.0.0.dist-info}/METADATA +18 -21
  147. codex_autorunner-1.0.0.dist-info/RECORD +251 -0
  148. {codex_autorunner-0.1.2.dist-info → codex_autorunner-1.0.0.dist-info}/WHEEL +1 -1
  149. codex_autorunner/agents/execution/policy.py +0 -292
  150. codex_autorunner/agents/factory.py +0 -52
  151. codex_autorunner/agents/orchestrator.py +0 -358
  152. codex_autorunner/core/doc_chat.py +0 -1446
  153. codex_autorunner/core/snapshot.py +0 -580
  154. codex_autorunner/integrations/github/chatops.py +0 -268
  155. codex_autorunner/integrations/github/pr_flow.py +0 -1314
  156. codex_autorunner/routes/docs.py +0 -381
  157. codex_autorunner/routes/github.py +0 -327
  158. codex_autorunner/routes/runs.py +0 -250
  159. codex_autorunner/spec_ingest.py +0 -812
  160. codex_autorunner/static/docChatActions.js +0 -287
  161. codex_autorunner/static/docChatEvents.js +0 -300
  162. codex_autorunner/static/docChatRender.js +0 -205
  163. codex_autorunner/static/docChatStream.js +0 -361
  164. codex_autorunner/static/docs.js +0 -20
  165. codex_autorunner/static/docsClipboard.js +0 -69
  166. codex_autorunner/static/docsCrud.js +0 -257
  167. codex_autorunner/static/docsDocUpdates.js +0 -62
  168. codex_autorunner/static/docsDrafts.js +0 -16
  169. codex_autorunner/static/docsElements.js +0 -69
  170. codex_autorunner/static/docsInit.js +0 -285
  171. codex_autorunner/static/docsParse.js +0 -160
  172. codex_autorunner/static/docsSnapshot.js +0 -87
  173. codex_autorunner/static/docsSpecIngest.js +0 -263
  174. codex_autorunner/static/docsState.js +0 -127
  175. codex_autorunner/static/docsThreadRegistry.js +0 -44
  176. codex_autorunner/static/docsUi.js +0 -153
  177. codex_autorunner/static/docsVoice.js +0 -56
  178. codex_autorunner/static/github.js +0 -504
  179. codex_autorunner/static/logs.js +0 -678
  180. codex_autorunner/static/review.js +0 -157
  181. codex_autorunner/static/runs.js +0 -418
  182. codex_autorunner/static/snapshot.js +0 -124
  183. codex_autorunner/static/state.js +0 -94
  184. codex_autorunner/static/todoPreview.js +0 -27
  185. codex_autorunner/workspace.py +0 -16
  186. codex_autorunner-0.1.2.dist-info/RECORD +0 -222
  187. {codex_autorunner-0.1.2.dist-info → codex_autorunner-1.0.0.dist-info}/entry_points.txt +0 -0
  188. {codex_autorunner-0.1.2.dist-info → codex_autorunner-1.0.0.dist-info}/licenses/LICENSE +0 -0
  189. {codex_autorunner-0.1.2.dist-info → codex_autorunner-1.0.0.dist-info}/top_level.txt +0 -0
@@ -1,190 +1,13 @@
1
+ // GENERATED FILE - do not edit directly. Source: static_src/
1
2
  import { api, confirmModal, flash, resolvePath } from "./utils.js";
2
- let modelsCache = [];
3
- let currentSettings = null;
4
3
  const ui = {
5
4
  settingsBtn: document.getElementById("repo-settings"),
6
- modelSelect: document.getElementById("autorunner-model-select"),
7
- effortSelect: document.getElementById("autorunner-effort-select"),
8
- approvalSelect: document.getElementById("autorunner-approval-select"),
9
- sandboxSelect: document.getElementById("autorunner-sandbox-select"),
10
- maxRunsInput: document.getElementById("autorunner-max-runs-input"),
11
- networkToggle: document.getElementById("autorunner-network-toggle"),
12
- networkRow: document.getElementById("autorunner-network-row"),
13
- saveBtn: document.getElementById("autorunner-settings-save"),
14
- reloadBtn: document.getElementById("autorunner-settings-reload"),
15
- warning: document.getElementById("autorunner-settings-warning"),
16
5
  threadList: document.getElementById("thread-tools-list"),
17
6
  threadNew: document.getElementById("thread-new-autorunner"),
18
7
  threadArchive: document.getElementById("thread-archive-autorunner"),
19
8
  threadResetAll: document.getElementById("thread-reset-all"),
20
9
  threadDownload: document.getElementById("thread-backup-download"),
21
10
  };
22
- const DEFAULT_EFFORTS = ["low", "medium", "high"];
23
- function getModelId(model) {
24
- if (!model || typeof model !== "object")
25
- return null;
26
- const modelObj = model;
27
- const keys = ["id", "model", "name", "model_id", "modelId"];
28
- for (const key of keys) {
29
- const value = modelObj[key];
30
- if (typeof value === "string" && value.trim()) {
31
- return value.trim();
32
- }
33
- }
34
- return null;
35
- }
36
- function getModelEfforts(model) {
37
- if (!model || typeof model !== "object")
38
- return null;
39
- const modelObj = model;
40
- const keys = [
41
- "supported_reasoning_efforts",
42
- "supportedReasoningEfforts",
43
- "reasoning_efforts",
44
- "reasoningEfforts",
45
- "supported_efforts",
46
- "supportedEfforts",
47
- "efforts",
48
- ];
49
- for (const key of keys) {
50
- const value = modelObj[key];
51
- if (Array.isArray(value) && value.length) {
52
- return value.map((entry) => String(entry));
53
- }
54
- }
55
- return null;
56
- }
57
- function normalizeModels(raw) {
58
- if (Array.isArray(raw))
59
- return raw;
60
- if (raw && typeof raw === "object") {
61
- const rawObj = raw;
62
- if (Array.isArray(rawObj.models))
63
- return rawObj.models;
64
- if (Array.isArray(rawObj.data))
65
- return rawObj.data;
66
- if (Array.isArray(rawObj.items))
67
- return rawObj.items;
68
- if (Array.isArray(rawObj.results))
69
- return rawObj.results;
70
- }
71
- return [];
72
- }
73
- function setOptions(select, options, selected, placeholder) {
74
- if (!select)
75
- return;
76
- select.innerHTML = "";
77
- const empty = document.createElement("option");
78
- empty.value = "";
79
- empty.textContent = placeholder;
80
- select.appendChild(empty);
81
- options.forEach((opt) => {
82
- const option = document.createElement("option");
83
- option.value = opt.value;
84
- option.textContent = opt.label;
85
- select.appendChild(option);
86
- });
87
- if (selected) {
88
- const exists = options.some((opt) => opt.value === selected);
89
- if (!exists) {
90
- const custom = document.createElement("option");
91
- custom.value = selected;
92
- custom.textContent = `${selected} (custom)`;
93
- select.appendChild(custom);
94
- }
95
- select.value = selected;
96
- }
97
- else {
98
- select.value = "";
99
- }
100
- }
101
- function updateNetworkVisibility() {
102
- if (!ui.networkRow || !ui.sandboxSelect)
103
- return;
104
- const show = ui.sandboxSelect.value === "workspaceWrite";
105
- ui.networkRow.classList.toggle("hidden", !show);
106
- }
107
- async function loadModels() {
108
- try {
109
- const data = await api("/api/app-server/models");
110
- modelsCache = normalizeModels(data);
111
- }
112
- catch (err) {
113
- modelsCache = [];
114
- const error = err;
115
- flash(error.message || "Failed to load models", "error");
116
- }
117
- }
118
- async function loadSessionSettings() {
119
- const data = await api("/api/session/settings");
120
- currentSettings = data;
121
- return data;
122
- }
123
- function renderSettings(settings) {
124
- if (!settings)
125
- return;
126
- const modelOptions = modelsCache
127
- .map((model) => {
128
- const id = getModelId(model);
129
- return id ? { value: id, label: id } : null;
130
- })
131
- .filter((opt) => opt !== null);
132
- setOptions(ui.modelSelect, modelOptions, settings.autorunner_model_override, "Default model");
133
- const selectedModelId = ui.modelSelect?.value || settings.autorunner_model_override;
134
- const selectedModel = modelsCache.find((model) => getModelId(model) === selectedModelId) || null;
135
- const efforts = getModelEfforts(selectedModel) || [...DEFAULT_EFFORTS];
136
- const effortOptions = efforts.map((effort) => ({
137
- value: effort,
138
- label: effort,
139
- }));
140
- setOptions(ui.effortSelect, effortOptions, settings.autorunner_effort_override, "Default effort");
141
- setOptions(ui.approvalSelect, [
142
- { value: "never", label: "Never" },
143
- { value: "unlessTrusted", label: "Unless trusted" },
144
- ], settings.autorunner_approval_policy, "Default approval");
145
- setOptions(ui.sandboxSelect, [
146
- { value: "dangerFullAccess", label: "Full access" },
147
- { value: "workspaceWrite", label: "Workspace write" },
148
- ], settings.autorunner_sandbox_mode, "Default sandbox");
149
- if (ui.networkToggle) {
150
- ui.networkToggle.checked = Boolean(settings.autorunner_workspace_write_network);
151
- }
152
- if (ui.maxRunsInput) {
153
- const maxRuns = settings.runner_stop_after_runs;
154
- ui.maxRunsInput.value = maxRuns ? String(maxRuns) : "";
155
- }
156
- updateNetworkVisibility();
157
- }
158
- async function saveSettings() {
159
- if (!ui.saveBtn)
160
- return;
161
- ui.saveBtn.disabled = true;
162
- ui.saveBtn.classList.add("loading");
163
- try {
164
- const payload = {
165
- autorunner_model_override: ui.modelSelect?.value || null,
166
- autorunner_effort_override: ui.effortSelect?.value || null,
167
- autorunner_approval_policy: ui.approvalSelect?.value || null,
168
- autorunner_sandbox_mode: ui.sandboxSelect?.value || null,
169
- autorunner_workspace_write_network: Boolean(ui.networkToggle?.checked),
170
- runner_stop_after_runs: ui.maxRunsInput?.value ? parseInt(ui.maxRunsInput.value, 10) : null,
171
- };
172
- const data = await api("/api/session/settings", {
173
- method: "POST",
174
- body: payload,
175
- });
176
- currentSettings = data;
177
- flash("Autorunner settings saved", "success");
178
- }
179
- catch (err) {
180
- const error = err;
181
- flash(error.message || "Failed to save settings", "error");
182
- }
183
- finally {
184
- ui.saveBtn.disabled = false;
185
- ui.saveBtn.classList.remove("loading");
186
- }
187
- }
188
11
  function renderThreadTools(data) {
189
12
  if (!ui.threadList)
190
13
  return;
@@ -197,17 +20,25 @@ function renderThreadTools(data) {
197
20
  if (data.autorunner !== undefined) {
198
21
  entries.push({ label: "Autorunner", value: data.autorunner || "—" });
199
22
  }
200
- if (data.spec_ingest !== undefined) {
201
- entries.push({ label: "Spec ingest", value: data.spec_ingest || "—" });
23
+ if (data.file_chat !== undefined) {
24
+ entries.push({ label: "File chat", value: data.file_chat || "—" });
202
25
  }
203
- if (data.doc_chat && typeof data.doc_chat === "object") {
204
- Object.keys(data.doc_chat).forEach((key) => {
205
- entries.push({
206
- label: `Doc chat (${key})`,
207
- value: data.doc_chat[key] || "—",
208
- });
26
+ if (data.file_chat_opencode !== undefined) {
27
+ entries.push({
28
+ label: "File chat (opencode)",
29
+ value: data.file_chat_opencode || "—",
209
30
  });
210
31
  }
32
+ // Render any additional string/number keys to avoid hiding future entries.
33
+ Object.keys(data).forEach((key) => {
34
+ if (["autorunner", "file_chat", "file_chat_opencode", "corruption"].includes(key)) {
35
+ return;
36
+ }
37
+ const value = data[key];
38
+ if (typeof value === "string" || typeof value === "number") {
39
+ entries.push({ label: key, value: value || "—" });
40
+ }
41
+ });
211
42
  if (!entries.length) {
212
43
  ui.threadList.textContent = "No threads recorded.";
213
44
  return;
@@ -239,9 +70,6 @@ async function loadThreadTools() {
239
70
  }
240
71
  }
241
72
  async function refreshSettings() {
242
- await loadModels();
243
- const settings = await loadSessionSettings();
244
- renderSettings(settings);
245
73
  await loadThreadTools();
246
74
  }
247
75
  export function initRepoSettingsPanel() {
@@ -250,28 +78,6 @@ export function initRepoSettingsPanel() {
250
78
  refreshSettings();
251
79
  });
252
80
  }
253
- if (ui.modelSelect) {
254
- ui.modelSelect.addEventListener("change", () => {
255
- if (!currentSettings)
256
- return;
257
- const currentEffort = ui.effortSelect?.value || null;
258
- const updated = {
259
- ...currentSettings,
260
- autorunner_model_override: ui.modelSelect.value || null,
261
- autorunner_effort_override: currentEffort || currentSettings.autorunner_effort_override,
262
- };
263
- renderSettings(updated);
264
- });
265
- }
266
- if (ui.sandboxSelect) {
267
- ui.sandboxSelect.addEventListener("change", updateNetworkVisibility);
268
- }
269
- if (ui.saveBtn) {
270
- ui.saveBtn.addEventListener("click", () => saveSettings());
271
- }
272
- if (ui.reloadBtn) {
273
- ui.reloadBtn.addEventListener("click", () => refreshSettings());
274
- }
275
81
  if (ui.threadNew) {
276
82
  ui.threadNew.addEventListener("click", async () => {
277
83
  try {
@@ -338,4 +144,11 @@ export function initRepoSettingsPanel() {
338
144
  window.location.href = resolvePath("/api/app-server/threads/backup");
339
145
  });
340
146
  }
147
+ // Clear cached logs since log loading is no longer available
148
+ try {
149
+ localStorage.removeItem("logs:tail");
150
+ }
151
+ catch (_err) {
152
+ // ignore
153
+ }
341
154
  }