codex-chatgpt-control 0.5.0-alpha.1 → 0.5.1-alpha.2

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 (217) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/contracts/v1/fixtures/backend-capabilities.json +1 -0
  3. package/contracts/v1/fixtures/command-descriptors.json +29 -2
  4. package/contracts/v1/fixtures/doctor-bridge-upload.json +2 -2
  5. package/contracts/v1/fixtures/doctor-scenario-preflight.json +26 -4
  6. package/contracts/v1/fixtures/files-attach-indeterminate.json +30 -0
  7. package/contracts/v1/fixtures/help-root.json +1 -1
  8. package/contracts/v1/fixtures/messages-stop-indeterminate.json +31 -0
  9. package/contracts/v1/fixtures/messages-stop-needs-confirmation.json +20 -0
  10. package/contracts/v1/fixtures/messages-stop-noop.json +19 -0
  11. package/contracts/v1/fixtures/messages-stop-success.json +21 -0
  12. package/contracts/v1/fixtures/primitive-bootstrap-blocker.json +3 -3
  13. package/contracts/v1/fixtures/reports-create-redacted.json +3 -3
  14. package/contracts/v1/fixtures/reports-summarize-redacted.json +1 -1
  15. package/contracts/v1/fixtures/run-browser-bridge-blocker.json +12 -12
  16. package/contracts/v1/fixtures/stream-blocked.ndjson +2 -2
  17. package/contracts/v1/manifest.json +25 -0
  18. package/contracts/v1/parity-suite.json +19 -1
  19. package/dist/codex-chatgpt-control-backend.mjs +3654 -603
  20. package/dist/codex-chatgpt-control.bundle.mjs +3627 -546
  21. package/dist/src/backend/client.d.ts +2 -1
  22. package/dist/src/backend/client.js +1 -0
  23. package/dist/src/backend/protocol.d.ts +1 -1
  24. package/dist/src/backend/protocol.js +1 -0
  25. package/dist/src/backend/session.js +2 -0
  26. package/dist/src/browser/attach.d.ts +1 -0
  27. package/dist/src/browser/attach.js +69 -35
  28. package/dist/src/browser/chatgpt-url.d.ts +8 -0
  29. package/dist/src/browser/chatgpt-url.js +28 -0
  30. package/dist/src/browser/downloads.d.ts +1 -1
  31. package/dist/src/browser/downloads.js +13 -4
  32. package/dist/src/browser/page-state.js +211 -4
  33. package/dist/src/client.d.ts +2 -1
  34. package/dist/src/client.js +2 -1
  35. package/dist/src/commands/configuration.js +330 -73
  36. package/dist/src/commands/context.d.ts +5 -1
  37. package/dist/src/commands/context.js +2 -2
  38. package/dist/src/commands/conversation.js +13 -1
  39. package/dist/src/commands/doctor.js +24 -2
  40. package/dist/src/commands/experience.d.ts +1 -0
  41. package/dist/src/commands/experience.js +156 -23
  42. package/dist/src/commands/files.d.ts +1 -0
  43. package/dist/src/commands/files.js +877 -170
  44. package/dist/src/commands/messages.d.ts +2 -1
  45. package/dist/src/commands/messages.js +310 -2
  46. package/dist/src/commands/modes.js +197 -52
  47. package/dist/src/commands/registry.js +8 -0
  48. package/dist/src/commands/sequence.js +3 -1
  49. package/dist/src/commands/session.d.ts +4 -1
  50. package/dist/src/commands/session.js +34 -3
  51. package/dist/src/dom/generation-state.d.ts +6 -1
  52. package/dist/src/dom/generation-state.js +206 -45
  53. package/dist/src/dom/locale/am.d.ts +23 -1
  54. package/dist/src/dom/locale/am.js +23 -1
  55. package/dist/src/dom/locale/ar.d.ts +21 -1
  56. package/dist/src/dom/locale/ar.js +24 -4
  57. package/dist/src/dom/locale/bg.d.ts +19 -1
  58. package/dist/src/dom/locale/bg.js +22 -4
  59. package/dist/src/dom/locale/bn.d.ts +23 -1
  60. package/dist/src/dom/locale/bn.js +23 -1
  61. package/dist/src/dom/locale/bs.d.ts +17 -1
  62. package/dist/src/dom/locale/bs.js +21 -5
  63. package/dist/src/dom/locale/ca.d.ts +20 -1
  64. package/dist/src/dom/locale/ca.js +25 -6
  65. package/dist/src/dom/locale/cs.d.ts +17 -1
  66. package/dist/src/dom/locale/cs.js +17 -1
  67. package/dist/src/dom/locale/da.d.ts +17 -1
  68. package/dist/src/dom/locale/da.js +18 -2
  69. package/dist/src/dom/locale/de.d.ts +16 -1
  70. package/dist/src/dom/locale/de.js +18 -3
  71. package/dist/src/dom/locale/el.d.ts +18 -1
  72. package/dist/src/dom/locale/el.js +21 -4
  73. package/dist/src/dom/locale/en.d.ts +2 -1
  74. package/dist/src/dom/locale/en.js +2 -1
  75. package/dist/src/dom/locale/es-419.d.ts +18 -1
  76. package/dist/src/dom/locale/es-419.js +18 -1
  77. package/dist/src/dom/locale/es-ES.d.ts +18 -1
  78. package/dist/src/dom/locale/es-ES.js +18 -1
  79. package/dist/src/dom/locale/et.d.ts +16 -1
  80. package/dist/src/dom/locale/et.js +16 -1
  81. package/dist/src/dom/locale/fa.d.ts +21 -1
  82. package/dist/src/dom/locale/fa.js +23 -3
  83. package/dist/src/dom/locale/fi.d.ts +18 -1
  84. package/dist/src/dom/locale/fi.js +18 -1
  85. package/dist/src/dom/locale/fr-CA.d.ts +15 -1
  86. package/dist/src/dom/locale/fr-CA.js +15 -1
  87. package/dist/src/dom/locale/fr-FR.d.ts +18 -1
  88. package/dist/src/dom/locale/fr-FR.js +22 -5
  89. package/dist/src/dom/locale/gu.d.ts +23 -1
  90. package/dist/src/dom/locale/gu.js +27 -5
  91. package/dist/src/dom/locale/hi.d.ts +23 -1
  92. package/dist/src/dom/locale/hi.js +25 -3
  93. package/dist/src/dom/locale/hr.d.ts +16 -1
  94. package/dist/src/dom/locale/hr.js +19 -4
  95. package/dist/src/dom/locale/hu.d.ts +17 -1
  96. package/dist/src/dom/locale/hu.js +20 -4
  97. package/dist/src/dom/locale/hy.d.ts +23 -1
  98. package/dist/src/dom/locale/hy.js +26 -4
  99. package/dist/src/dom/locale/id.d.ts +17 -1
  100. package/dist/src/dom/locale/id.js +19 -3
  101. package/dist/src/dom/locale/index.js +1 -0
  102. package/dist/src/dom/locale/is.d.ts +21 -1
  103. package/dist/src/dom/locale/is.js +21 -1
  104. package/dist/src/dom/locale/it.d.ts +15 -1
  105. package/dist/src/dom/locale/it.js +20 -6
  106. package/dist/src/dom/locale/ja.d.ts +19 -1
  107. package/dist/src/dom/locale/ja.js +23 -5
  108. package/dist/src/dom/locale/ka.d.ts +23 -1
  109. package/dist/src/dom/locale/ka.js +23 -1
  110. package/dist/src/dom/locale/kk.d.ts +23 -1
  111. package/dist/src/dom/locale/kk.js +25 -3
  112. package/dist/src/dom/locale/kn.d.ts +22 -1
  113. package/dist/src/dom/locale/kn.js +26 -5
  114. package/dist/src/dom/locale/ko.d.ts +17 -1
  115. package/dist/src/dom/locale/ko.js +17 -1
  116. package/dist/src/dom/locale/lt.d.ts +18 -1
  117. package/dist/src/dom/locale/lt.js +20 -3
  118. package/dist/src/dom/locale/lv.d.ts +18 -1
  119. package/dist/src/dom/locale/lv.js +18 -1
  120. package/dist/src/dom/locale/mk.d.ts +22 -1
  121. package/dist/src/dom/locale/mk.js +26 -5
  122. package/dist/src/dom/locale/ml.d.ts +23 -1
  123. package/dist/src/dom/locale/ml.js +25 -3
  124. package/dist/src/dom/locale/mn.d.ts +23 -1
  125. package/dist/src/dom/locale/mn.js +23 -1
  126. package/dist/src/dom/locale/mr.d.ts +23 -1
  127. package/dist/src/dom/locale/mr.js +25 -3
  128. package/dist/src/dom/locale/ms.d.ts +20 -1
  129. package/dist/src/dom/locale/ms.js +20 -1
  130. package/dist/src/dom/locale/my.d.ts +22 -1
  131. package/dist/src/dom/locale/my.js +24 -3
  132. package/dist/src/dom/locale/nb.d.ts +17 -1
  133. package/dist/src/dom/locale/nb.js +17 -1
  134. package/dist/src/dom/locale/nl.d.ts +20 -2
  135. package/dist/src/dom/locale/nl.js +22 -4
  136. package/dist/src/dom/locale/pa.d.ts +23 -1
  137. package/dist/src/dom/locale/pa.js +27 -5
  138. package/dist/src/dom/locale/pl.d.ts +17 -1
  139. package/dist/src/dom/locale/pl.js +19 -3
  140. package/dist/src/dom/locale/pt-BR.d.ts +18 -1
  141. package/dist/src/dom/locale/pt-BR.js +20 -3
  142. package/dist/src/dom/locale/pt-PT.d.ts +18 -1
  143. package/dist/src/dom/locale/pt-PT.js +22 -5
  144. package/dist/src/dom/locale/ro.d.ts +15 -1
  145. package/dist/src/dom/locale/ro.js +18 -4
  146. package/dist/src/dom/locale/ru.d.ts +23 -1
  147. package/dist/src/dom/locale/ru.js +24 -2
  148. package/dist/src/dom/locale/sk.d.ts +17 -1
  149. package/dist/src/dom/locale/sk.js +19 -3
  150. package/dist/src/dom/locale/sl.d.ts +21 -1
  151. package/dist/src/dom/locale/sl.js +24 -4
  152. package/dist/src/dom/locale/so.d.ts +22 -1
  153. package/dist/src/dom/locale/so.js +24 -3
  154. package/dist/src/dom/locale/sq.d.ts +21 -1
  155. package/dist/src/dom/locale/sq.js +25 -5
  156. package/dist/src/dom/locale/sr.d.ts +24 -1
  157. package/dist/src/dom/locale/sr.js +25 -2
  158. package/dist/src/dom/locale/sv.d.ts +16 -1
  159. package/dist/src/dom/locale/sv.js +16 -1
  160. package/dist/src/dom/locale/sw.d.ts +18 -1
  161. package/dist/src/dom/locale/sw.js +18 -1
  162. package/dist/src/dom/locale/ta.d.ts +23 -1
  163. package/dist/src/dom/locale/ta.js +27 -5
  164. package/dist/src/dom/locale/te.d.ts +23 -1
  165. package/dist/src/dom/locale/te.js +27 -5
  166. package/dist/src/dom/locale/th.d.ts +11 -1
  167. package/dist/src/dom/locale/th.js +11 -1
  168. package/dist/src/dom/locale/tl.d.ts +8 -1
  169. package/dist/src/dom/locale/tl.js +8 -1
  170. package/dist/src/dom/locale/tr.d.ts +21 -1
  171. package/dist/src/dom/locale/tr.js +23 -3
  172. package/dist/src/dom/locale/types.d.ts +1 -1
  173. package/dist/src/dom/locale/uk.d.ts +23 -1
  174. package/dist/src/dom/locale/uk.js +25 -3
  175. package/dist/src/dom/locale/ur.d.ts +22 -1
  176. package/dist/src/dom/locale/ur.js +25 -4
  177. package/dist/src/dom/locale/vi.d.ts +22 -1
  178. package/dist/src/dom/locale/vi.js +25 -4
  179. package/dist/src/dom/locale/zh-HK.d.ts +21 -1
  180. package/dist/src/dom/locale/zh-HK.js +23 -3
  181. package/dist/src/dom/locale/zh-Hans.d.ts +23 -1
  182. package/dist/src/dom/locale/zh-Hans.js +27 -5
  183. package/dist/src/dom/locale/zh-TW.d.ts +23 -1
  184. package/dist/src/dom/locale/zh-TW.js +25 -3
  185. package/dist/src/dom/menus.js +26 -2
  186. package/dist/src/dom/selectors.d.ts +1 -0
  187. package/dist/src/dom/selectors.js +9 -1
  188. package/dist/src/dom/wait-snapshot.d.ts +1 -0
  189. package/dist/src/dom/wait-snapshot.js +45 -22
  190. package/dist/src/errors.d.ts +1 -1
  191. package/dist/src/errors.js +2 -2
  192. package/dist/src/platform/local-paths.d.ts +1 -0
  193. package/dist/src/platform/local-paths.js +7 -3
  194. package/dist/src/safety/risk.d.ts +1 -0
  195. package/dist/src/safety/risk.js +1 -0
  196. package/dist/src/scripts/apply-intelligence-locale-captures.d.ts +10 -1
  197. package/dist/src/scripts/apply-intelligence-locale-captures.js +219 -7
  198. package/dist/src/scripts/capture-intelligence-locales.d.ts +119 -1
  199. package/dist/src/scripts/capture-intelligence-locales.js +653 -232
  200. package/dist/src/scripts/capture-surface-profile.d.ts +3 -1
  201. package/dist/src/scripts/capture-surface-profile.js +75 -25
  202. package/dist/src/scripts/live-smoke/scenarios.d.ts +3 -0
  203. package/dist/src/scripts/live-smoke/scenarios.js +321 -13
  204. package/dist/src/scripts/live-smoke.js +1 -0
  205. package/dist/src/scripts/locale-capture/surface-graph.d.ts +31 -0
  206. package/dist/src/scripts/locale-capture/surface-graph.js +50 -0
  207. package/dist/src/scripts/release-canary-module.d.ts +20 -0
  208. package/dist/src/scripts/release-canary-module.js +86 -0
  209. package/dist/src/types.d.ts +30 -6
  210. package/package.json +8 -2
  211. package/references/2026-07-16-chat-work-surfaces.md +13 -0
  212. package/references/2026-08-08-model-selection-locale-sweep.md +32 -0
  213. package/references/backend-protocol.md +22 -7
  214. package/references/language-coverage.md +24 -13
  215. package/references/localization.md +36 -14
  216. package/references/python-parity.md +9 -3
  217. package/references/troubleshooting.md +26 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1-alpha.2
4
+
5
+ - Adds confirmation-gated, fail-closed `messages.stop` lifecycle control with
6
+ scoped DOM evidence and a single bounded deadline.
7
+ - Hardens uploads, explicit tab reuse, origin checks, localized selectors,
8
+ blocker/mode visibility, and fixture generation against the validated PR
9
+ review findings.
10
+ - Qualifies effort-only simplified Chat profiles and waits for delayed scoped
11
+ artifact previews before selecting their exact Download control.
12
+ - Adds behavioral stop contracts, expanded regression coverage, rebuilt plugin
13
+ runtimes, portable release helpers, and patched transitive dependency locks.
14
+
15
+ ## 0.5.1-alpha.1
16
+
17
+ - Fixes current Chat/Work switching through the visible surface-radio group and
18
+ preserves older selector fallbacks.
19
+ - Correctly identifies checked Work home state, active Work tasks, and the
20
+ current compound Work configuration opener.
21
+ - Adds reusable live-smoke coverage for Chat/Work routing, strict configuration
22
+ verification, Work start/status/wait/read/steer/artifacts, and Work-backed
23
+ Runner and Responses paths.
24
+
3
25
  ## 0.5.0-alpha.1
4
26
 
5
27
  - Adds `experience.detect/open`, `configuration.inspect/apply`, and the Work task lifecycle command group.
@@ -44,6 +44,7 @@
44
44
  "messages.wait",
45
45
  "messages.readLatest",
46
46
  "messages.status",
47
+ "messages.stop",
47
48
  "messages.waitAndRead",
48
49
  "artifacts.listLatest",
49
50
  "artifacts.wait",
@@ -946,6 +946,27 @@
946
946
  "risk": "medium",
947
947
  "summary": "Read a compact latest-assistant progress snapshot without treating partial text as complete."
948
948
  },
949
+ {
950
+ "args": {
951
+ "confirmStop": "must be true to stop a visible response",
952
+ "timeoutMs": "maximum time to verify generation became inactive"
953
+ },
954
+ "blockers": [
955
+ "browser_bridge_unavailable",
956
+ "login_required",
957
+ "captcha",
958
+ "rate_limit",
959
+ "selector_drift"
960
+ ],
961
+ "defaults": {},
962
+ "defaultTimeoutMs": 5000,
963
+ "examples": [],
964
+ "layer": "primitive",
965
+ "name": "messages.stop",
966
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
967
+ "risk": "medium",
968
+ "summary": "Stop the current visible ChatGPT response after explicit confirmation and verify generation became inactive."
969
+ },
949
970
  {
950
971
  "args": {},
951
972
  "blockers": [
@@ -1083,7 +1104,11 @@
1083
1104
  "summary": "Attach absolute local file paths through visible ChatGPT upload controls."
1084
1105
  },
1085
1106
  {
1086
- "args": {},
1107
+ "args": {
1108
+ "destDir": "download destination directory",
1109
+ "filenamePattern": "optional case-insensitive regular expression for the expected filename",
1110
+ "from": "latest_assistant, visible_conversation, or assistantIndex"
1111
+ },
1087
1112
  "blockers": [
1088
1113
  "browser_bridge_unavailable",
1089
1114
  "login_required",
@@ -1091,7 +1116,9 @@
1091
1116
  ],
1092
1117
  "defaults": {},
1093
1118
  "defaultTimeoutMs": 120000,
1094
- "examples": [],
1119
+ "examples": [
1120
+ "await chatgpt.files.downloadLatest({ destDir: \"/absolute/host/output\", filenamePattern: \"^report\\.csv$\" });"
1121
+ ],
1095
1122
  "layer": "primitive",
1096
1123
  "name": "files.downloadLatest",
1097
1124
  "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
@@ -13,11 +13,11 @@
13
13
  "severity": "blocked",
14
14
  "userActionRequired": true
15
15
  },
16
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
16
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
17
17
  "nextCommand": "session.bootstrap",
18
18
  "remediation": [
19
19
  "Ordinary shell: Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
20
- "Codex Chrome bootstrap: For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
20
+ "Codex Chrome bootstrap: For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
21
21
  "Python live bridge: For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.",
22
22
  "Extension availability: If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying."
23
23
  ],
@@ -70,8 +70,30 @@
70
70
  },
71
71
  "localization": {
72
72
  "details": {
73
+ "configurationAxisIds": [
74
+ "power",
75
+ "model",
76
+ "intelligence",
77
+ "effort",
78
+ "speed",
79
+ "advanced"
80
+ ],
81
+ "configurationOptionIds": [
82
+ "instant",
83
+ "light",
84
+ "medium",
85
+ "high",
86
+ "extraHigh",
87
+ "max",
88
+ "ultra",
89
+ "pro",
90
+ "standard",
91
+ "fast"
92
+ ],
73
93
  "englishCanonicalPresent": true,
74
- "labelCandidateCount": 1544,
94
+ "labelCandidateCount": 2439,
95
+ "missingConfigurationAxisIds": [],
96
+ "missingConfigurationOptionIds": [],
75
97
  "missingModeOptionIds": [],
76
98
  "missingToolIds": [],
77
99
  "modeOptionIds": [
@@ -108,11 +130,11 @@
108
130
  "requiredKeysMissing": [],
109
131
  "runningStateLabelCoverage": {
110
132
  "nonEnglishLocaleCount": 64,
111
- "nonEnglishStopControlLocaleCount": 64,
133
+ "nonEnglishStopControlLocaleCount": 63,
112
134
  "nonEnglishStoppedAssistantLocaleCount": 0,
113
135
  "registeredLocaleCount": 65,
114
- "stopControlCandidateCount": 65,
115
- "stopControlLocaleCount": 65,
136
+ "stopControlCandidateCount": 63,
137
+ "stopControlLocaleCount": 64,
116
138
  "stoppedAssistantCandidateCount": 3,
117
139
  "stoppedAssistantLocaleCount": 1,
118
140
  "support": "partial"
@@ -0,0 +1,30 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_files_attach_indeterminate",
4
+ "result": {
5
+ "blocker": {
6
+ "code": "attachment_outcome_indeterminate",
7
+ "kind": "upload_failed",
8
+ "message": "The native file handoff started, but its outcome could not be verified. The browser request is no longer in flight, though the file may already be present. Inspect the current composer; do not submit or retry automatically.",
9
+ "resumable": false
10
+ },
11
+ "context": {
12
+ "timestamp": "2026-06-06T00:00:00.000Z"
13
+ },
14
+ "data": {
15
+ "files": [
16
+ {
17
+ "bytes": 18,
18
+ "name": "handoff.txt",
19
+ "path": "/tmp/contract-fixtures/handoff.txt"
20
+ }
21
+ ]
22
+ },
23
+ "ok": false,
24
+ "status": "partial",
25
+ "warnings": [
26
+ "File-chooser handoff exceeded the single attachment deadline."
27
+ ]
28
+ },
29
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
30
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "ok": true,
3
3
  "requestId": "req_help",
4
- "result": "ChatGPT browser-control SDK commands\n\nworkflow:\n- ask: Ask ChatGPT in a new or selected thread, optionally with files, wait/read, downloads, and reports.\n- askInThread: Open or claim an existing thread by URL, conversation id, title, or search query, then ask and read.\n- askWithFiles: Attach absolute local file paths, optionally open/configure Chat or Work, ask, wait, and read.\n- askAndDownload: Ask ChatGPT to produce a visible downloadable output and save the latest exposed file.\n- runMessages: Run sequential prompts where later prompts can use earlier step data.\n- runner.run: Agents-style facade: run a visible ChatGPT agent against input, files, thread, existing-tab, experience, configuration, legacy mode, and response options.\n- responses.create: Narrow Responses-shaped adapter over the visible ChatGPT browser-control runner; rejects unsupported API-only fields before prompt submission.\n- work.start: Open Work, optionally apply model/effort/speed configuration, submit one task, and optionally wait/read without blind resubmission.\n- copyLatest: Copy or DOM-read the latest assistant response with Markdown-first fidelity.\n- runPlan: Execute an inline SequencePlan or named macro through the existing sequence engine.\n- new-ask-read: Named macro: open a new thread, ask, wait, and read Markdown.\n- find-open-ask-read: Named macro: search history, open the first match, ask, wait, and read Markdown.\n- find-open-copy-latest: Named macro: search history, open the first match, and copy/read the latest response.\n- attach-ask-read: Named macro: open a new thread, attach files, ask, wait, and read Markdown.\n- ask-and-download: Named macro: ask in a new thread and download the latest file affordance.\n- two-turn: Named macro: run two sequential prompts in a new thread.\ndiagnostic:\n- doctor-upload: Named macro: preflight bridge, login, and upload permission remediation.\n- doctor: Preflight browser bridge, login, upload, local files, existing-tab, artifact, localization, report, and selector readiness.\nreport:\n- redacted-run-report: Named macro: create a redacted report for a supplied CommandResult.\n- createReport: Write a durable redacted run report for a command result.\nprimitive:\n- session.bootstrap: Attach to ChatGPT in Chrome and detect login/blocker state.\n- experience.detect: Detect whether the scoped visible composer is Chat, Work, or unknown and return its selector profile.\n- experience.open: Open Chat or Work and verify the target surface from scoped composer evidence.\n- configuration.inspect: Inspect the active Chat or Work selector profile, axes, options, and selected values.\n- configuration.apply: Apply model/intelligence/effort/speed configuration one axis at a time and verify the final visible state.\n- work.status: Read current Work task progress and optionally enumerate visible artifacts.\n- work.wait: Wait for the current Work task response to stabilize.\n- work.steer: Submit a visible steering message to the current Work task without opening a new task.\n- work.readLatest: Read the latest response from the current Work task.\n- threads.new: Open a new ChatGPT thread.\n- threads.search: Search visible ChatGPT history by query.\n- threads.open: Open a thread by URL, conversation id, title, or search result.\n- messages.compose: Fill the composer without submitting.\n- messages.submit: Submit the current composer contents.\n- messages.ask: Compose, submit, optionally wait, and optionally read.\n- messages.wait: Wait for the latest assistant response to stabilize.\n- messages.readLatest: Read the latest message as Markdown, normalized text, blocks, or HTML.\n- messages.status: Read a compact latest-assistant progress snapshot without treating partial text as complete.\n- messages.waitAndRead: Wait for completion and read the latest message.\n- artifacts.listLatest: Detect the latest visible generated ChatGPT artifact, such as an image-only result.\n- artifacts.wait: Wait for a visible generated ChatGPT artifact to appear and stabilize.\n- artifacts.downloadLatest: Download or save the latest visible generated ChatGPT artifact.\n- files.preflight: Validate local file paths, size limits, duplicates, zero-byte files, and extension-based MIME/category guesses without opening ChatGPT.\n- files.attach: Attach absolute local file paths through visible ChatGPT upload controls.\n- files.downloadLatest: Download the latest visible ChatGPT file affordance.\n- projects.sources.list: Open or claim a visible ChatGPT Project Sources tab and list source names/statuses without source contents.\n- projects.sources.planAdd: Dry-run an append-only Project Sources file add from explicit local files without opening ChatGPT.\n- projects.sources.add: Append explicit local files to a visible ChatGPT Project Sources list after confirmMutation: true.\n- response.copy: Click Copy response and return clipboard Markdown, with DOM fallback.\n- modes.set: Legacy compatibility command: select a visible model/intelligence/effort/version candidate with historical warning-oriented verification.\n- modes.get: Legacy compatibility command: read mode labels shown on visible composer controls without changing them.\n- tools.select: Select a visible ChatGPT tool when unambiguous.",
4
+ "result": "ChatGPT browser-control SDK commands\n\nworkflow:\n- ask: Ask ChatGPT in a new or selected thread, optionally with files, wait/read, downloads, and reports.\n- askInThread: Open or claim an existing thread by URL, conversation id, title, or search query, then ask and read.\n- askWithFiles: Attach absolute local file paths, optionally open/configure Chat or Work, ask, wait, and read.\n- askAndDownload: Ask ChatGPT to produce a visible downloadable output and save the latest exposed file.\n- runMessages: Run sequential prompts where later prompts can use earlier step data.\n- runner.run: Agents-style facade: run a visible ChatGPT agent against input, files, thread, existing-tab, experience, configuration, legacy mode, and response options.\n- responses.create: Narrow Responses-shaped adapter over the visible ChatGPT browser-control runner; rejects unsupported API-only fields before prompt submission.\n- work.start: Open Work, optionally apply model/effort/speed configuration, submit one task, and optionally wait/read without blind resubmission.\n- copyLatest: Copy or DOM-read the latest assistant response with Markdown-first fidelity.\n- runPlan: Execute an inline SequencePlan or named macro through the existing sequence engine.\n- new-ask-read: Named macro: open a new thread, ask, wait, and read Markdown.\n- find-open-ask-read: Named macro: search history, open the first match, ask, wait, and read Markdown.\n- find-open-copy-latest: Named macro: search history, open the first match, and copy/read the latest response.\n- attach-ask-read: Named macro: open a new thread, attach files, ask, wait, and read Markdown.\n- ask-and-download: Named macro: ask in a new thread and download the latest file affordance.\n- two-turn: Named macro: run two sequential prompts in a new thread.\ndiagnostic:\n- doctor-upload: Named macro: preflight bridge, login, and upload permission remediation.\n- doctor: Preflight browser bridge, login, upload, local files, existing-tab, artifact, localization, report, and selector readiness.\nreport:\n- redacted-run-report: Named macro: create a redacted report for a supplied CommandResult.\n- createReport: Write a durable redacted run report for a command result.\nprimitive:\n- session.bootstrap: Attach to ChatGPT in Chrome and detect login/blocker state.\n- experience.detect: Detect whether the scoped visible composer is Chat, Work, or unknown and return its selector profile.\n- experience.open: Open Chat or Work and verify the target surface from scoped composer evidence.\n- configuration.inspect: Inspect the active Chat or Work selector profile, axes, options, and selected values.\n- configuration.apply: Apply model/intelligence/effort/speed configuration one axis at a time and verify the final visible state.\n- work.status: Read current Work task progress and optionally enumerate visible artifacts.\n- work.wait: Wait for the current Work task response to stabilize.\n- work.steer: Submit a visible steering message to the current Work task without opening a new task.\n- work.readLatest: Read the latest response from the current Work task.\n- threads.new: Open a new ChatGPT thread.\n- threads.search: Search visible ChatGPT history by query.\n- threads.open: Open a thread by URL, conversation id, title, or search result.\n- messages.compose: Fill the composer without submitting.\n- messages.submit: Submit the current composer contents.\n- messages.ask: Compose, submit, optionally wait, and optionally read.\n- messages.wait: Wait for the latest assistant response to stabilize.\n- messages.readLatest: Read the latest message as Markdown, normalized text, blocks, or HTML.\n- messages.status: Read a compact latest-assistant progress snapshot without treating partial text as complete.\n- messages.stop: Stop the current visible ChatGPT response after explicit confirmation and verify generation became inactive.\n- messages.waitAndRead: Wait for completion and read the latest message.\n- artifacts.listLatest: Detect the latest visible generated ChatGPT artifact, such as an image-only result.\n- artifacts.wait: Wait for a visible generated ChatGPT artifact to appear and stabilize.\n- artifacts.downloadLatest: Download or save the latest visible generated ChatGPT artifact.\n- files.preflight: Validate local file paths, size limits, duplicates, zero-byte files, and extension-based MIME/category guesses without opening ChatGPT.\n- files.attach: Attach absolute local file paths through visible ChatGPT upload controls.\n- files.downloadLatest: Download the latest visible ChatGPT file affordance.\n- projects.sources.list: Open or claim a visible ChatGPT Project Sources tab and list source names/statuses without source contents.\n- projects.sources.planAdd: Dry-run an append-only Project Sources file add from explicit local files without opening ChatGPT.\n- projects.sources.add: Append explicit local files to a visible ChatGPT Project Sources list after confirmMutation: true.\n- response.copy: Click Copy response and return clipboard Markdown, with DOM fallback.\n- modes.set: Legacy compatibility command: select a visible model/intelligence/effort/version candidate with historical warning-oriented verification.\n- modes.get: Legacy compatibility command: read mode labels shown on visible composer controls without changing them.\n- tools.select: Select a visible ChatGPT tool when unambiguous.",
5
5
  "schemaVersion": "chatgpt.browser_control.backend_response.v1"
6
6
  }
@@ -0,0 +1,31 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_messages_stop_indeterminate",
4
+ "result": {
5
+ "blocker": {
6
+ "code": "stop_generation_unverified",
7
+ "kind": "selector_drift",
8
+ "message": "Stop activation reached its browser-native deadline and was terminated, but the click may already have taken effect. Inspect the visible generation state and do not retry automatically.",
9
+ "resumable": false
10
+ },
11
+ "context": {
12
+ "timestamp": "2026-06-06T00:00:00.000Z"
13
+ },
14
+ "data": {
15
+ "signalsAfter": [
16
+ "stop answering"
17
+ ],
18
+ "signalsBefore": [
19
+ "stop answering"
20
+ ],
21
+ "stopped": false,
22
+ "wasGenerating": true
23
+ },
24
+ "ok": false,
25
+ "status": "timeout",
26
+ "warnings": [
27
+ "Stop control click could not complete before the messages.stop deadline."
28
+ ]
29
+ },
30
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
31
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_messages_stop",
4
+ "result": {
5
+ "blocker": {
6
+ "code": "stop_generation_confirmation_required",
7
+ "fieldPath": "confirmStop",
8
+ "kind": "confirmation",
9
+ "message": "Stopping the visible ChatGPT response requires an explicit caller decision.",
10
+ "resumable": true
11
+ },
12
+ "context": {
13
+ "timestamp": "2026-06-06T00:00:00.000Z"
14
+ },
15
+ "ok": false,
16
+ "status": "needs_confirmation",
17
+ "warnings": []
18
+ },
19
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_messages_stop",
4
+ "result": {
5
+ "context": {
6
+ "timestamp": "2026-06-06T00:00:00.000Z"
7
+ },
8
+ "data": {
9
+ "signalsAfter": [],
10
+ "signalsBefore": [],
11
+ "stopped": false,
12
+ "wasGenerating": false
13
+ },
14
+ "ok": true,
15
+ "status": "ok",
16
+ "warnings": []
17
+ },
18
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
19
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_messages_stop",
4
+ "result": {
5
+ "context": {
6
+ "timestamp": "2026-06-06T00:00:00.000Z"
7
+ },
8
+ "data": {
9
+ "signalsAfter": [],
10
+ "signalsBefore": [
11
+ "stop answering"
12
+ ],
13
+ "stopped": true,
14
+ "wasGenerating": true
15
+ },
16
+ "ok": true,
17
+ "status": "ok",
18
+ "warnings": []
19
+ },
20
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
21
+ }
@@ -3,7 +3,7 @@
3
3
  "blocker": {
4
4
  "code": "codex_chrome_bridge_unavailable",
5
5
  "kind": "browser_bridge_unavailable",
6
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
6
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
7
7
  "remediation": [
8
8
  {
9
9
  "instruction": "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
@@ -11,7 +11,7 @@
11
11
  "userActionRequired": false
12
12
  },
13
13
  {
14
- "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
14
+ "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
15
15
  "label": "Codex Chrome bootstrap",
16
16
  "userActionRequired": false
17
17
  },
@@ -31,7 +31,7 @@
31
31
  "timestamp": "2026-06-06T00:00:00.000Z"
32
32
  },
33
33
  "error": {
34
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
34
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
35
35
  "name": "BrowserBridgeUnavailableError",
36
36
  "recoverable": true
37
37
  },
@@ -9,15 +9,15 @@
9
9
  "integrity": {
10
10
  "inputs": [],
11
11
  "output": {
12
- "bytes": 96,
13
- "sha256": "850670117a5a33720b6f91ac79ce20cefe23ed760d6c47ec78f71cac06eba360",
12
+ "bytes": 82,
13
+ "sha256": "d8cd174ddee7b33b70c9c5534ccbd745f46e4bfdc3b884cfb4632e1982e94081",
14
14
  "untrusted": true
15
15
  },
16
16
  "schemaVersion": "chatgpt.browser_control.integrity.v1",
17
17
  "target": {
18
18
  "bytes": 335,
19
19
  "path": "/tmp/codex-chatgpt-control/reports/contract-fixtures/fixed-contract-report.json",
20
- "sha256": "27edafba40f11bcbd8fbda81c36b7caae4f677e4311426086d8bcd3d26aed92a"
20
+ "sha256": "f187607ac2a07ea75ae308a9b2cc796f68fe1c9f5ffafef9cbaa3ad6934f6047"
21
21
  }
22
22
  },
23
23
  "metaPath": "/tmp/codex-chatgpt-control/reports/contract-fixtures/fixed-contract-report.json.meta.json",
@@ -6,7 +6,7 @@
6
6
  "data": {
7
7
  "blocker": {
8
8
  "kind": "[redacted:26 chars]",
9
- "message": "[redacted:258 chars]",
9
+ "message": "[redacted:245 chars]",
10
10
  "visibleText": "[redacted:19 chars]"
11
11
  },
12
12
  "context": {
@@ -4,7 +4,7 @@
4
4
  "blocker": {
5
5
  "code": "codex_chrome_bridge_unavailable",
6
6
  "kind": "browser_bridge_unavailable",
7
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
7
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
8
8
  "remediation": [
9
9
  {
10
10
  "instruction": "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
@@ -12,7 +12,7 @@
12
12
  "userActionRequired": false
13
13
  },
14
14
  {
15
- "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
15
+ "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
16
16
  "label": "Codex Chrome bootstrap",
17
17
  "userActionRequired": false
18
18
  },
@@ -35,7 +35,7 @@
35
35
  "outputText": ""
36
36
  },
37
37
  "error": {
38
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
38
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
39
39
  "name": "BrowserBridgeUnavailableError",
40
40
  "recoverable": true
41
41
  },
@@ -44,7 +44,7 @@
44
44
  "blocker": {
45
45
  "code": "codex_chrome_bridge_unavailable",
46
46
  "kind": "browser_bridge_unavailable",
47
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
47
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
48
48
  "remediation": [
49
49
  {
50
50
  "instruction": "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
@@ -52,7 +52,7 @@
52
52
  "userActionRequired": false
53
53
  },
54
54
  {
55
- "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
55
+ "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
56
56
  "label": "Codex Chrome bootstrap",
57
57
  "userActionRequired": false
58
58
  },
@@ -73,14 +73,14 @@
73
73
  "fix": {
74
74
  "steps": [
75
75
  "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
76
- "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
76
+ "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
77
77
  "For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.",
78
78
  "If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying."
79
79
  ],
80
- "summary": "browser_bridge_unavailable (codex_chrome_bridge_unavailable): Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent."
80
+ "summary": "browser_bridge_unavailable (codex_chrome_bridge_unavailable): Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it."
81
81
  },
82
82
  "id": "interruption_fixed",
83
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
83
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
84
84
  "resume": {
85
85
  "reason": "The underlying browser-control command did not mark this blocker as resumable.",
86
86
  "supported": false
@@ -95,7 +95,7 @@
95
95
  "blocker": {
96
96
  "code": "codex_chrome_bridge_unavailable",
97
97
  "kind": "browser_bridge_unavailable",
98
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
98
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
99
99
  "remediation": [
100
100
  {
101
101
  "instruction": "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
@@ -103,7 +103,7 @@
103
103
  "userActionRequired": false
104
104
  },
105
105
  {
106
- "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
106
+ "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
107
107
  "label": "Codex Chrome bootstrap",
108
108
  "userActionRequired": false
109
109
  },
@@ -129,7 +129,7 @@
129
129
  "blocker": {
130
130
  "code": "codex_chrome_bridge_unavailable",
131
131
  "kind": "browser_bridge_unavailable",
132
- "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.",
132
+ "message": "Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.",
133
133
  "remediation": [
134
134
  {
135
135
  "instruction": "Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.",
@@ -137,7 +137,7 @@
137
137
  "userActionRequired": false
138
138
  },
139
139
  {
140
- "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
140
+ "instruction": "For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).",
141
141
  "label": "Codex Chrome bootstrap",
142
142
  "userActionRequired": false
143
143
  },
@@ -1,2 +1,2 @@
1
- {"item":{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"},"name":"run_blocked","requestId":"req_runner_stream","schemaVersion":"chatgpt.browser_control.backend_event.v1","type":"run_item_stream_event"}
2
- {"requestId":"req_runner_stream","result":{"activeAgentName":"reviewer","blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}]},"context":{"timestamp":"2026-06-06T00:00:00.000Z"},"data":{"outputText":""},"error":{"message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","name":"BrowserBridgeUnavailableError","recoverable":true},"interruptions":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"command":"session.bootstrap","fix":{"steps":["Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying."],"summary":"browser_bridge_unavailable (codex_chrome_bridge_unavailable): Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent."},"id":"interruption_fixed","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","resume":{"reason":"The underlying browser-control command did not mark this blocker as resumable.","supported":false},"status":"partial","type":"timeout"}],"lastAgentName":"reviewer","newItems":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"}],"ok":false,"output":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, bootstrap the Chrome plugin runtime with setupBrowserRuntime({ globals: globalThis }) before using globalThis.agent.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with setupBrowserRuntime({ globals: globalThis }), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"}],"output_text":"","state":{"id":"run_fixed","resumable":false},"status":"partial","steps":[{"command":"session.bootstrap","endedAt":"2026-06-06T00:00:00.000Z","id":"bootstrap","ok":false,"startedAt":"2026-06-06T00:00:00.000Z","status":"blocked","warnings":[]}],"warnings":[]},"schemaVersion":"chatgpt.browser_control.backend_event.v1","type":"completed"}
1
+ {"item":{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"},"name":"run_blocked","requestId":"req_runner_stream","schemaVersion":"chatgpt.browser_control.backend_event.v1","type":"run_item_stream_event"}
2
+ {"requestId":"req_runner_stream","result":{"activeAgentName":"reviewer","blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}]},"context":{"timestamp":"2026-06-06T00:00:00.000Z"},"data":{"outputText":""},"error":{"message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","name":"BrowserBridgeUnavailableError","recoverable":true},"interruptions":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"command":"session.bootstrap","fix":{"steps":["Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying."],"summary":"browser_bridge_unavailable (codex_chrome_bridge_unavailable): Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it."},"id":"interruption_fixed","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","resume":{"reason":"The underlying browser-control command did not mark this blocker as resumable.","supported":false},"status":"partial","type":"timeout"}],"lastAgentName":"reviewer","newItems":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"}],"ok":false,"output":[{"blocker":{"code":"codex_chrome_bridge_unavailable","kind":"browser_bridge_unavailable","message":"Codex cannot access the ChatGPT browser bridge from this backend process. In an ordinary shell this is expected; for a live Codex Chrome run, assign the Chrome plugin runtime returned by setupBrowserRuntime() to globalThis.agent before using it.","remediation":[{"instruction":"Treat browser_bridge_unavailable from a plain shell as an expected protocol/blocker-path result, not proof that Chrome, ChatGPT, or the Codex extension is broken.","label":"Ordinary shell","userActionRequired":false},{"instruction":"For a live run, initialize the Chrome plugin runtime in node_repl with globalThis.agent = await setupBrowserRuntime(), then set globalThis.browser = await agent.browsers.get(\"extension\") before calling createChatGPT({ agent: globalThis.agent }).","label":"Codex Chrome bootstrap","userActionRequired":false},{"instruction":"For Python browser-bridge smokes, keep the bridge-hosted Node backend JS execution alive and run scripts/http_stdio_relay.mjs with CHATGPT_BROWSER_BACKEND_HTTP_URL; a plain Python-spawned Node subprocess cannot inherit globalThis.agent.","label":"Python live bridge","userActionRequired":false},{"instruction":"If this command was already running inside a bootstrapped bridge host, verify the Codex Chrome extension is installed and enabled, then restart Chrome or Codex before retrying.","label":"Extension availability","userActionRequired":true}],"resumable":false},"type":"run.blocked"}],"output_text":"","state":{"id":"run_fixed","resumable":false},"status":"partial","steps":[{"command":"session.bootstrap","endedAt":"2026-06-06T00:00:00.000Z","id":"bootstrap","ok":false,"startedAt":"2026-06-06T00:00:00.000Z","status":"blocked","warnings":[]}],"warnings":[]},"schemaVersion":"chatgpt.browser_control.backend_event.v1","type":"completed"}
@@ -56,6 +56,11 @@
56
56
  "file": "existing-tab-diagnostics-blocker.json",
57
57
  "schema": "commandResult"
58
58
  },
59
+ {
60
+ "case": "files_attach_indeterminate",
61
+ "file": "files-attach-indeterminate.json",
62
+ "schema": "backendResponse"
63
+ },
59
64
  {
60
65
  "case": "files_preflight_success",
61
66
  "file": "files-preflight-success.json",
@@ -66,6 +71,26 @@
66
71
  "file": "help-root.json",
67
72
  "schema": "backendResponse"
68
73
  },
74
+ {
75
+ "case": "messages_stop_indeterminate",
76
+ "file": "messages-stop-indeterminate.json",
77
+ "schema": "backendResponse"
78
+ },
79
+ {
80
+ "case": "messages_stop_needs_confirmation",
81
+ "file": "messages-stop-needs-confirmation.json",
82
+ "schema": "backendResponse"
83
+ },
84
+ {
85
+ "case": "messages_stop_noop",
86
+ "file": "messages-stop-noop.json",
87
+ "schema": "backendResponse"
88
+ },
89
+ {
90
+ "case": "messages_stop_success",
91
+ "file": "messages-stop-success.json",
92
+ "schema": "backendResponse"
93
+ },
69
94
  {
70
95
  "case": "named_plan_two_turn",
71
96
  "file": "named-plan-two-turn.json",