codex-chatgpt-control 0.3.0-alpha.1 → 0.5.0-alpha.1

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 (214) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +42 -2
  3. package/contracts/v1/fixtures/backend-capabilities.json +10 -0
  4. package/contracts/v1/fixtures/command-descriptors.json +257 -6
  5. package/contracts/v1/fixtures/describe-runner-run.json +5 -2
  6. package/contracts/v1/fixtures/doctor-scenario-preflight.json +34 -2
  7. package/contracts/v1/fixtures/help-root.json +1 -1
  8. package/contracts/v1/fixtures/output-json-parse-success.json +9 -0
  9. package/contracts/v1/fixtures/run-timeout-partial.json +15 -4
  10. package/contracts/v1/fixtures/stream-in-progress.ndjson +3 -0
  11. package/contracts/v1/fixtures/stream-submitted-completed.ndjson +1 -1
  12. package/contracts/v1/fixtures/surface-chat-legacy.json +35 -0
  13. package/contracts/v1/fixtures/surface-chat-simplified.json +37 -0
  14. package/contracts/v1/fixtures/surface-sidebar-false-positive.json +29 -0
  15. package/contracts/v1/fixtures/surface-work-advanced.json +45 -0
  16. package/contracts/v1/fixtures/surface-work-basic.json +38 -0
  17. package/contracts/v1/fixtures/workflow-ask-success.json +8 -0
  18. package/contracts/v1/manifest.json +32 -1
  19. package/contracts/v1/parity-suite.json +113 -0
  20. package/contracts/v1/schemas/backend-request.schema.json +15 -0
  21. package/contracts/v1/schemas/manifest.schema.json +6 -3
  22. package/contracts/v1/schemas/surface-profile.schema.json +166 -0
  23. package/dist/codex-chatgpt-control-backend.mjs +2045 -227
  24. package/dist/codex-chatgpt-control.bundle.mjs +3817 -1960
  25. package/dist/src/backend/client.d.ts +26 -1
  26. package/dist/src/backend/client.js +23 -1
  27. package/dist/src/backend/protocol.d.ts +1 -1
  28. package/dist/src/backend/protocol.js +10 -0
  29. package/dist/src/backend/session.js +20 -0
  30. package/dist/src/browser/attach.d.ts +1 -0
  31. package/dist/src/browser/attach.js +3 -3
  32. package/dist/src/browser/page-state.js +5 -2
  33. package/dist/src/client.d.ts +31 -1
  34. package/dist/src/client.js +69 -14
  35. package/dist/src/commands/artifacts.js +1 -7
  36. package/dist/src/commands/configuration.d.ts +15 -0
  37. package/dist/src/commands/configuration.js +674 -0
  38. package/dist/src/commands/doctor.js +38 -1
  39. package/dist/src/commands/experience.d.ts +12 -0
  40. package/dist/src/commands/experience.js +288 -0
  41. package/dist/src/commands/files.js +1 -7
  42. package/dist/src/commands/messages.d.ts +2 -1
  43. package/dist/src/commands/messages.js +138 -16
  44. package/dist/src/commands/modes.js +28 -14
  45. package/dist/src/commands/registry.js +69 -7
  46. package/dist/src/commands/response-actions.js +1 -7
  47. package/dist/src/commands/sequence.js +24 -1
  48. package/dist/src/commands/session.d.ts +2 -0
  49. package/dist/src/commands/session.js +50 -1
  50. package/dist/src/commands/threads.js +1 -7
  51. package/dist/src/commands/work.d.ts +6 -0
  52. package/dist/src/commands/work.js +338 -0
  53. package/dist/src/dom/locale/am.d.ts +2 -1
  54. package/dist/src/dom/locale/am.js +2 -1
  55. package/dist/src/dom/locale/ar.d.ts +2 -1
  56. package/dist/src/dom/locale/ar.js +2 -1
  57. package/dist/src/dom/locale/bg.d.ts +2 -1
  58. package/dist/src/dom/locale/bg.js +2 -1
  59. package/dist/src/dom/locale/bn.d.ts +2 -1
  60. package/dist/src/dom/locale/bn.js +2 -1
  61. package/dist/src/dom/locale/bs.d.ts +2 -1
  62. package/dist/src/dom/locale/bs.js +2 -1
  63. package/dist/src/dom/locale/ca.d.ts +2 -1
  64. package/dist/src/dom/locale/ca.js +2 -1
  65. package/dist/src/dom/locale/cs.d.ts +2 -1
  66. package/dist/src/dom/locale/cs.js +2 -1
  67. package/dist/src/dom/locale/da.d.ts +2 -1
  68. package/dist/src/dom/locale/da.js +2 -1
  69. package/dist/src/dom/locale/de.d.ts +4 -3
  70. package/dist/src/dom/locale/de.js +4 -3
  71. package/dist/src/dom/locale/el.d.ts +2 -1
  72. package/dist/src/dom/locale/el.js +2 -1
  73. package/dist/src/dom/locale/en.d.ts +27 -2
  74. package/dist/src/dom/locale/en.js +28 -2
  75. package/dist/src/dom/locale/es-419.d.ts +2 -1
  76. package/dist/src/dom/locale/es-419.js +2 -1
  77. package/dist/src/dom/locale/es-ES.d.ts +2 -1
  78. package/dist/src/dom/locale/es-ES.js +2 -1
  79. package/dist/src/dom/locale/et.d.ts +2 -1
  80. package/dist/src/dom/locale/et.js +2 -1
  81. package/dist/src/dom/locale/fa.d.ts +2 -1
  82. package/dist/src/dom/locale/fa.js +2 -1
  83. package/dist/src/dom/locale/fi.d.ts +2 -1
  84. package/dist/src/dom/locale/fi.js +2 -1
  85. package/dist/src/dom/locale/fr-CA.d.ts +2 -1
  86. package/dist/src/dom/locale/fr-CA.js +2 -1
  87. package/dist/src/dom/locale/fr-FR.d.ts +3 -3
  88. package/dist/src/dom/locale/fr-FR.js +3 -3
  89. package/dist/src/dom/locale/gu.d.ts +2 -1
  90. package/dist/src/dom/locale/gu.js +2 -1
  91. package/dist/src/dom/locale/hi.d.ts +2 -1
  92. package/dist/src/dom/locale/hi.js +2 -1
  93. package/dist/src/dom/locale/hr.d.ts +2 -1
  94. package/dist/src/dom/locale/hr.js +2 -1
  95. package/dist/src/dom/locale/hu.d.ts +2 -1
  96. package/dist/src/dom/locale/hu.js +2 -1
  97. package/dist/src/dom/locale/hy.d.ts +2 -1
  98. package/dist/src/dom/locale/hy.js +2 -1
  99. package/dist/src/dom/locale/id.d.ts +2 -1
  100. package/dist/src/dom/locale/id.js +2 -1
  101. package/dist/src/dom/locale/index.d.ts +17 -2
  102. package/dist/src/dom/locale/index.js +65 -0
  103. package/dist/src/dom/locale/is.d.ts +2 -1
  104. package/dist/src/dom/locale/is.js +2 -1
  105. package/dist/src/dom/locale/it.d.ts +2 -1
  106. package/dist/src/dom/locale/it.js +2 -1
  107. package/dist/src/dom/locale/ja.d.ts +2 -1
  108. package/dist/src/dom/locale/ja.js +2 -1
  109. package/dist/src/dom/locale/ka.d.ts +2 -1
  110. package/dist/src/dom/locale/ka.js +2 -1
  111. package/dist/src/dom/locale/kk.d.ts +2 -1
  112. package/dist/src/dom/locale/kk.js +2 -1
  113. package/dist/src/dom/locale/kn.d.ts +2 -1
  114. package/dist/src/dom/locale/kn.js +2 -1
  115. package/dist/src/dom/locale/ko.d.ts +2 -1
  116. package/dist/src/dom/locale/ko.js +2 -1
  117. package/dist/src/dom/locale/lt.d.ts +2 -1
  118. package/dist/src/dom/locale/lt.js +2 -1
  119. package/dist/src/dom/locale/lv.d.ts +2 -1
  120. package/dist/src/dom/locale/lv.js +2 -1
  121. package/dist/src/dom/locale/mk.d.ts +2 -1
  122. package/dist/src/dom/locale/mk.js +2 -1
  123. package/dist/src/dom/locale/ml.d.ts +2 -1
  124. package/dist/src/dom/locale/ml.js +2 -1
  125. package/dist/src/dom/locale/mn.d.ts +2 -1
  126. package/dist/src/dom/locale/mn.js +2 -1
  127. package/dist/src/dom/locale/mr.d.ts +2 -1
  128. package/dist/src/dom/locale/mr.js +2 -1
  129. package/dist/src/dom/locale/ms.d.ts +2 -1
  130. package/dist/src/dom/locale/ms.js +2 -1
  131. package/dist/src/dom/locale/my.d.ts +2 -1
  132. package/dist/src/dom/locale/my.js +2 -1
  133. package/dist/src/dom/locale/nb.d.ts +2 -1
  134. package/dist/src/dom/locale/nb.js +2 -1
  135. package/dist/src/dom/locale/nl.d.ts +2 -1
  136. package/dist/src/dom/locale/nl.js +2 -1
  137. package/dist/src/dom/locale/pa.d.ts +2 -1
  138. package/dist/src/dom/locale/pa.js +2 -1
  139. package/dist/src/dom/locale/pl.d.ts +2 -1
  140. package/dist/src/dom/locale/pl.js +2 -1
  141. package/dist/src/dom/locale/pt-BR.d.ts +2 -1
  142. package/dist/src/dom/locale/pt-BR.js +2 -1
  143. package/dist/src/dom/locale/pt-PT.d.ts +2 -1
  144. package/dist/src/dom/locale/pt-PT.js +2 -1
  145. package/dist/src/dom/locale/ro.d.ts +2 -1
  146. package/dist/src/dom/locale/ro.js +2 -1
  147. package/dist/src/dom/locale/ru.d.ts +2 -1
  148. package/dist/src/dom/locale/ru.js +2 -1
  149. package/dist/src/dom/locale/sk.d.ts +2 -1
  150. package/dist/src/dom/locale/sk.js +2 -1
  151. package/dist/src/dom/locale/sl.d.ts +2 -1
  152. package/dist/src/dom/locale/sl.js +2 -1
  153. package/dist/src/dom/locale/so.d.ts +2 -1
  154. package/dist/src/dom/locale/so.js +2 -1
  155. package/dist/src/dom/locale/sq.d.ts +2 -1
  156. package/dist/src/dom/locale/sq.js +2 -1
  157. package/dist/src/dom/locale/sr.d.ts +2 -1
  158. package/dist/src/dom/locale/sr.js +2 -1
  159. package/dist/src/dom/locale/sv.d.ts +2 -1
  160. package/dist/src/dom/locale/sv.js +2 -1
  161. package/dist/src/dom/locale/sw.d.ts +2 -1
  162. package/dist/src/dom/locale/sw.js +2 -1
  163. package/dist/src/dom/locale/ta.d.ts +2 -1
  164. package/dist/src/dom/locale/ta.js +2 -1
  165. package/dist/src/dom/locale/te.d.ts +2 -1
  166. package/dist/src/dom/locale/te.js +2 -1
  167. package/dist/src/dom/locale/th.d.ts +2 -1
  168. package/dist/src/dom/locale/th.js +2 -1
  169. package/dist/src/dom/locale/tl.d.ts +4 -5
  170. package/dist/src/dom/locale/tl.js +4 -5
  171. package/dist/src/dom/locale/tr.d.ts +2 -1
  172. package/dist/src/dom/locale/tr.js +2 -1
  173. package/dist/src/dom/locale/types.d.ts +18 -1
  174. package/dist/src/dom/locale/uk.d.ts +2 -1
  175. package/dist/src/dom/locale/uk.js +2 -1
  176. package/dist/src/dom/locale/ur.d.ts +2 -1
  177. package/dist/src/dom/locale/ur.js +2 -1
  178. package/dist/src/dom/locale/vi.d.ts +2 -1
  179. package/dist/src/dom/locale/vi.js +2 -1
  180. package/dist/src/dom/locale/zh-HK.d.ts +2 -1
  181. package/dist/src/dom/locale/zh-HK.js +4 -3
  182. package/dist/src/dom/locale/zh-Hans.d.ts +2 -1
  183. package/dist/src/dom/locale/zh-Hans.js +2 -1
  184. package/dist/src/dom/locale/zh-TW.d.ts +2 -1
  185. package/dist/src/dom/locale/zh-TW.js +2 -1
  186. package/dist/src/dom/selectors.js +6 -1
  187. package/dist/src/index.d.ts +3 -0
  188. package/dist/src/index.js +3 -0
  189. package/dist/src/runner/responses.d.ts +3 -1
  190. package/dist/src/runner/responses.js +16 -1
  191. package/dist/src/runner/result.js +129 -4
  192. package/dist/src/runner/stream.d.ts +1 -1
  193. package/dist/src/runner/stream.js +6 -0
  194. package/dist/src/runner/types.d.ts +35 -1
  195. package/dist/src/safety/risk.d.ts +10 -0
  196. package/dist/src/safety/risk.js +10 -0
  197. package/dist/src/scripts/apply-intelligence-locale-captures.d.ts +6 -0
  198. package/dist/src/scripts/apply-intelligence-locale-captures.js +53 -7
  199. package/dist/src/scripts/capture-intelligence-locales.d.ts +3 -0
  200. package/dist/src/scripts/capture-intelligence-locales.js +372 -3
  201. package/dist/src/scripts/capture-surface-profile.d.ts +23 -0
  202. package/dist/src/scripts/capture-surface-profile.js +304 -0
  203. package/dist/src/scripts/live-smoke/scenarios.js +34 -1
  204. package/dist/src/scripts/live-smoke.js +1 -0
  205. package/dist/src/types.d.ts +245 -2
  206. package/package.json +3 -2
  207. package/references/2026-07-16-chat-work-surfaces.md +87 -0
  208. package/references/agents-runner.md +13 -2
  209. package/references/backend-protocol.md +15 -5
  210. package/references/language-coverage.md +40 -3
  211. package/references/localization.md +34 -6
  212. package/references/python-parity.md +11 -1
  213. package/references/responses-adapter.md +12 -1
  214. package/references/troubleshooting.md +22 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0-alpha.1
4
+
5
+ - Adds `experience.detect/open`, `configuration.inspect/apply`, and the Work task lifecycle command group.
6
+ - Adds scoped Chat/Work selector profiles, strict configuration postcondition verification, and sanitized profile fixtures.
7
+ - Adds runner/Responses experience and configuration inputs plus milestone events.
8
+ - Preserves existing `mode`, `modes.set/get`, commands, package imports, and wire fields for backward compatibility.
9
+
3
10
  ## 0.3.0-alpha.1
4
11
 
5
12
  - Hardens mode-menu detection and selection against thread/sidebar action menus, with locale-registry-backed thread-action vetoes and container-scoped menu enumeration.
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # codex-chatgpt-control
2
2
 
3
- TypeScript runtime for Codex agents controlling visible ChatGPT web sessions through a compatible browser bridge.
3
+ TypeScript runtime for controlling visible ChatGPT Chat and Work through a compatible browser bridge.
4
4
 
5
5
  Unofficial project: not affiliated with, endorsed by, or sponsored by OpenAI. This is not an OpenAI API wrapper and does not call hidden or private ChatGPT endpoints. Browser-required calls need a visible session and should fail with a clear machine-readable reason when the bridge is unavailable.
6
6
 
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm install codex-chatgpt-control
10
+ npm install codex-chatgpt-control@next
11
11
  ```
12
12
 
13
13
  ## Usage
@@ -24,10 +24,50 @@ const reviewer = chatgpt.agent({
24
24
  const result = await chatgpt.runner.run(reviewer, {
25
25
  input: "Review this design.",
26
26
  thread: { type: "new" },
27
+ experience: "chat",
27
28
  response: { format: "markdown" }
28
29
  });
29
30
  ```
30
31
 
32
+ Inspect the visible surface and apply verified configuration:
33
+
34
+ ```ts
35
+ const surface = await chatgpt.experience.detect();
36
+ const capabilities = await chatgpt.configuration.inspect();
37
+
38
+ await chatgpt.configuration.apply({
39
+ experience: "work",
40
+ desired: {
41
+ model: "GPT-5.6 Sol",
42
+ effort: "High",
43
+ speed: "Standard"
44
+ },
45
+ strict: true
46
+ });
47
+ ```
48
+
49
+ Start a fresh Work task once, then poll or steer it:
50
+
51
+ ```ts
52
+ await chatgpt.work.start({
53
+ prompt: "Produce a decision-ready implementation brief.",
54
+ newTask: true,
55
+ wait: false,
56
+ read: false
57
+ });
58
+
59
+ await chatgpt.work.status({ includeArtifacts: true });
60
+ await chatgpt.work.steer({
61
+ prompt: "Add a prioritized migration sequence.",
62
+ wait: false,
63
+ read: false
64
+ });
65
+ ```
66
+
67
+ Legacy `mode` inputs and `modes.set/get` remain supported. New code should use
68
+ `experience` and strict `configuration` because Chat and Work expose different
69
+ nested axes.
70
+
31
71
  Reuse a user-open ChatGPT thread without replacing the tab:
32
72
 
33
73
  ```ts
@@ -26,6 +26,15 @@
26
26
  "describe",
27
27
  "help",
28
28
  "session.bootstrap",
29
+ "experience.detect",
30
+ "experience.open",
31
+ "configuration.inspect",
32
+ "configuration.apply",
33
+ "work.start",
34
+ "work.status",
35
+ "work.wait",
36
+ "work.steer",
37
+ "work.readLatest",
29
38
  "threads.new",
30
39
  "threads.search",
31
40
  "threads.open",
@@ -34,6 +43,7 @@
34
43
  "messages.ask",
35
44
  "messages.wait",
36
45
  "messages.readLatest",
46
+ "messages.status",
37
47
  "messages.waitAndRead",
38
48
  "artifacts.listLatest",
39
49
  "artifacts.wait",
@@ -4,7 +4,10 @@
4
4
  "result": [
5
5
  {
6
6
  "args": {
7
+ "configuration": "optional surface-aware visible configuration",
7
8
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
9
+ "experience": "optional chat or work surface",
10
+ "mode": "legacy visible mode preference",
8
11
  "prompt": "message to send or workflow-specific input",
9
12
  "report": "optional redacted report settings",
10
13
  "thread": "optional thread selector"
@@ -34,7 +37,10 @@
34
37
  },
35
38
  {
36
39
  "args": {
40
+ "configuration": "optional surface-aware visible configuration",
37
41
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
42
+ "experience": "optional chat or work surface",
43
+ "mode": "legacy visible mode preference",
38
44
  "prompt": "message to send or workflow-specific input",
39
45
  "report": "optional redacted report settings",
40
46
  "thread": "optional thread selector"
@@ -65,7 +71,9 @@
65
71
  },
66
72
  {
67
73
  "args": {
74
+ "configuration": "optional strict visible configuration such as { intelligence: \"Pro\" } or Work model/effort/speed",
68
75
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
76
+ "experience": "optional chat or work surface",
69
77
  "files": "absolute local file paths to attach before submitting",
70
78
  "mode": "optional visible mode selection, e.g. { model: \"Pro\" } or { intelligence: \"Pro\", modelVersion: \"5.4\" }",
71
79
  "prompt": "message to send after files are attached",
@@ -89,17 +97,21 @@
89
97
  },
90
98
  "defaultTimeoutMs": 120000,
91
99
  "examples": [
92
- "await chatgpt.askWithFiles({ thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true, mode: { model: \"Pro\" }, files: [\"/absolute/host/path/brief.md\"], prompt: \"Summarize this.\", wait: true, read: { format: \"markdown\" } });"
100
+ "await chatgpt.askWithFiles({ thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true, experience: \"chat\", configuration: { intelligence: \"Pro\" }, files: [\"/absolute/host/path/brief.md\"], prompt: \"Summarize this.\", wait: true, read: { format: \"markdown\" } });",
101
+ "await chatgpt.askWithFiles({ mode: { model: \"Pro\" }, files: [\"/absolute/host/path/image.jpg\"], prompt: \"Describe this image.\", wait: true });"
93
102
  ],
94
103
  "layer": "workflow",
95
104
  "name": "askWithFiles",
96
105
  "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
97
106
  "risk": "medium",
98
- "summary": "Attach absolute local file paths, optionally set mode, ask, wait, and read."
107
+ "summary": "Attach absolute local file paths, optionally open/configure Chat or Work, ask, wait, and read."
99
108
  },
100
109
  {
101
110
  "args": {
111
+ "configuration": "optional surface-aware visible configuration",
102
112
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
113
+ "experience": "optional chat or work surface",
114
+ "mode": "legacy visible mode preference",
103
115
  "prompt": "message to send or workflow-specific input",
104
116
  "report": "optional redacted report settings",
105
117
  "thread": "optional thread selector"
@@ -129,7 +141,10 @@
129
141
  },
130
142
  {
131
143
  "args": {
144
+ "configuration": "optional surface-aware visible configuration",
132
145
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
146
+ "experience": "optional chat or work surface",
147
+ "mode": "legacy visible mode preference",
133
148
  "prompt": "message to send or workflow-specific input",
134
149
  "report": "optional redacted report settings",
135
150
  "thread": "optional thread selector"
@@ -159,7 +174,10 @@
159
174
  },
160
175
  {
161
176
  "args": {
177
+ "configuration": "optional surface-aware visible configuration",
162
178
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
179
+ "experience": "optional chat or work surface",
180
+ "mode": "legacy visible mode preference",
163
181
  "prompt": "message to send or workflow-specific input",
164
182
  "report": "optional redacted report settings",
165
183
  "thread": "optional thread selector"
@@ -179,18 +197,21 @@
179
197
  },
180
198
  "defaultTimeoutMs": 120000,
181
199
  "examples": [
182
- "const agent = chatgpt.agent({ name: \"reviewer\", instructions: \"Review deeply.\" }); await chatgpt.runner.run(agent, { input: \"Review this.\", thread: { type: \"new\" } });",
200
+ "const agent = chatgpt.agent({ name: \"reviewer\", instructions: \"Review deeply.\" }); await chatgpt.runner.run(agent, { input: \"Review this.\", thread: { type: \"new\" }, experience: \"chat\" });",
183
201
  "await chatgpt.runner.run(agent, { input: \"Continue.\", thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true });"
184
202
  ],
185
203
  "layer": "workflow",
186
204
  "name": "runner.run",
187
205
  "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
188
206
  "risk": "medium",
189
- "summary": "Agents-style facade: run a visible ChatGPT browser-control agent against input, files, thread, existing-tab, mode, and response options."
207
+ "summary": "Agents-style facade: run a visible ChatGPT agent against input, files, thread, existing-tab, experience, configuration, legacy mode, and response options."
190
208
  },
191
209
  {
192
210
  "args": {
211
+ "configuration": "optional surface-aware visible configuration",
193
212
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
213
+ "experience": "optional chat or work surface",
214
+ "mode": "legacy visible mode preference",
194
215
  "prompt": "message to send or workflow-specific input",
195
216
  "report": "optional redacted report settings",
196
217
  "thread": "optional thread selector"
@@ -220,7 +241,42 @@
220
241
  },
221
242
  {
222
243
  "args": {
244
+ "configuration": "optional Work model, effort, and speed values",
245
+ "files": "optional absolute local file paths",
246
+ "newTask": "start from a blank Work task; defaults to true",
247
+ "prompt": "visible Work task prompt",
248
+ "read": "optional response capture behavior",
249
+ "wait": "optional wait behavior"
250
+ },
251
+ "blockers": [
252
+ "browser_bridge_unavailable",
253
+ "login_required",
254
+ "captcha",
255
+ "rate_limit",
256
+ "selector_drift"
257
+ ],
258
+ "defaults": {
259
+ "read": {
260
+ "format": "markdown"
261
+ },
262
+ "wait": true
263
+ },
264
+ "defaultTimeoutMs": 120000,
265
+ "examples": [
266
+ "await chatgpt.work.start({ prompt: \"Analyze the attached package.\", files: [\"/absolute/path/package.tgz\"], configuration: { model: \"GPT-5.6 Sol\", effort: \"High\", speed: \"Fast\" }, wait: true, read: { format: \"markdown\" } });"
267
+ ],
268
+ "layer": "workflow",
269
+ "name": "work.start",
270
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
271
+ "risk": "medium",
272
+ "summary": "Open Work, optionally apply model/effort/speed configuration, submit one task, and optionally wait/read without blind resubmission."
273
+ },
274
+ {
275
+ "args": {
276
+ "configuration": "optional surface-aware visible configuration",
223
277
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
278
+ "experience": "optional chat or work surface",
279
+ "mode": "legacy visible mode preference",
224
280
  "prompt": "message to send or workflow-specific input",
225
281
  "report": "optional redacted report settings",
226
282
  "thread": "optional thread selector"
@@ -248,7 +304,10 @@
248
304
  },
249
305
  {
250
306
  "args": {
307
+ "configuration": "optional surface-aware visible configuration",
251
308
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
309
+ "experience": "optional chat or work surface",
310
+ "mode": "legacy visible mode preference",
252
311
  "prompt": "message to send or workflow-specific input",
253
312
  "report": "optional redacted report settings",
254
313
  "thread": "optional thread selector"
@@ -540,6 +599,178 @@
540
599
  "risk": "low",
541
600
  "summary": "Attach to ChatGPT in Chrome and detect login/blocker state."
542
601
  },
602
+ {
603
+ "args": {
604
+ "timeoutMs": "optional timeout for attaching to the ChatGPT page"
605
+ },
606
+ "blockers": [
607
+ "browser_bridge_unavailable",
608
+ "login_required",
609
+ "selector_drift"
610
+ ],
611
+ "defaults": {},
612
+ "defaultTimeoutMs": 30000,
613
+ "examples": [
614
+ "await chatgpt.experience.detect();"
615
+ ],
616
+ "layer": "primitive",
617
+ "name": "experience.detect",
618
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
619
+ "risk": "low",
620
+ "summary": "Detect whether the scoped visible composer is Chat, Work, or unknown and return its selector profile."
621
+ },
622
+ {
623
+ "args": {
624
+ "experience": "chat or work",
625
+ "timeoutMs": "optional verified-switch timeout"
626
+ },
627
+ "blockers": [
628
+ "browser_bridge_unavailable",
629
+ "login_required",
630
+ "selector_drift"
631
+ ],
632
+ "defaults": {},
633
+ "defaultTimeoutMs": 30000,
634
+ "examples": [
635
+ "await chatgpt.experience.open({ experience: \"work\" });"
636
+ ],
637
+ "layer": "primitive",
638
+ "name": "experience.open",
639
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
640
+ "risk": "medium",
641
+ "summary": "Open Chat or Work and verify the target surface from scoped composer evidence."
642
+ },
643
+ {
644
+ "args": {
645
+ "experience": "optional expected chat or work surface",
646
+ "includeOptions": "open visible axis menus to enumerate options; defaults to true",
647
+ "timeoutMs": "optional inspection timeout"
648
+ },
649
+ "blockers": [
650
+ "browser_bridge_unavailable",
651
+ "login_required",
652
+ "selector_drift"
653
+ ],
654
+ "defaults": {},
655
+ "defaultTimeoutMs": 30000,
656
+ "examples": [
657
+ "await chatgpt.configuration.inspect({ experience: \"work\" });"
658
+ ],
659
+ "layer": "primitive",
660
+ "name": "configuration.inspect",
661
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
662
+ "risk": "low",
663
+ "summary": "Inspect the active Chat or Work selector profile, axes, options, and selected values."
664
+ },
665
+ {
666
+ "args": {
667
+ "desired": "model, intelligence, effort, speed, and/or modelVersion values",
668
+ "experience": "optional target chat or work surface",
669
+ "strict": "fail when visible postconditions are not verified; defaults to true",
670
+ "timeoutMs": "optional selection timeout"
671
+ },
672
+ "blockers": [
673
+ "browser_bridge_unavailable",
674
+ "login_required",
675
+ "selector_drift"
676
+ ],
677
+ "defaults": {},
678
+ "defaultTimeoutMs": 30000,
679
+ "examples": [
680
+ "await chatgpt.configuration.apply({ experience: \"work\", desired: { model: \"GPT-5.6 Sol\", effort: \"High\", speed: \"Fast\" }, strict: true });"
681
+ ],
682
+ "layer": "primitive",
683
+ "name": "configuration.apply",
684
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
685
+ "risk": "medium",
686
+ "summary": "Apply model/intelligence/effort/speed configuration one axis at a time and verify the final visible state."
687
+ },
688
+ {
689
+ "args": {
690
+ "includeArtifacts": "include the latest visible artifact inventory; defaults to false for lightweight polling",
691
+ "maxPreviewChars": "maximum assistant preview characters"
692
+ },
693
+ "blockers": [
694
+ "browser_bridge_unavailable",
695
+ "login_required",
696
+ "selector_drift"
697
+ ],
698
+ "defaults": {},
699
+ "defaultTimeoutMs": 5000,
700
+ "examples": [
701
+ "await chatgpt.work.status();"
702
+ ],
703
+ "layer": "primitive",
704
+ "name": "work.status",
705
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
706
+ "risk": "medium",
707
+ "summary": "Read current Work task progress and optionally enumerate visible artifacts."
708
+ },
709
+ {
710
+ "args": {
711
+ "pollMs": "polling interval",
712
+ "stableMs": "required response stability window",
713
+ "timeoutMs": "optional Work wait timeout"
714
+ },
715
+ "blockers": [
716
+ "browser_bridge_unavailable",
717
+ "login_required",
718
+ "selector_drift"
719
+ ],
720
+ "defaults": {},
721
+ "defaultTimeoutMs": 120000,
722
+ "examples": [
723
+ "await chatgpt.work.wait({ timeoutMs: 600000 });"
724
+ ],
725
+ "layer": "primitive",
726
+ "name": "work.wait",
727
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
728
+ "risk": "low",
729
+ "summary": "Wait for the current Work task response to stabilize."
730
+ },
731
+ {
732
+ "args": {
733
+ "prompt": "visible steering message for the current task",
734
+ "read": "optional response capture behavior",
735
+ "wait": "optional wait behavior"
736
+ },
737
+ "blockers": [
738
+ "browser_bridge_unavailable",
739
+ "login_required",
740
+ "selector_drift"
741
+ ],
742
+ "defaults": {},
743
+ "defaultTimeoutMs": 120000,
744
+ "examples": [
745
+ "await chatgpt.work.steer({ prompt: \"Focus the comparison on deployment ergonomics.\" });"
746
+ ],
747
+ "layer": "primitive",
748
+ "name": "work.steer",
749
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
750
+ "risk": "medium",
751
+ "summary": "Submit a visible steering message to the current Work task without opening a new task."
752
+ },
753
+ {
754
+ "args": {
755
+ "format": "markdown, normalized_text, visible_text, html, blocks, or all",
756
+ "maxChars": "optional capture limit"
757
+ },
758
+ "blockers": [
759
+ "browser_bridge_unavailable",
760
+ "login_required",
761
+ "selector_drift"
762
+ ],
763
+ "defaults": {},
764
+ "defaultTimeoutMs": 30000,
765
+ "examples": [
766
+ "await chatgpt.work.readLatest({ format: \"markdown\" });"
767
+ ],
768
+ "layer": "primitive",
769
+ "name": "work.readLatest",
770
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
771
+ "risk": "medium",
772
+ "summary": "Read the latest response from the current Work task."
773
+ },
543
774
  {
544
775
  "args": {},
545
776
  "blockers": [
@@ -695,6 +926,26 @@
695
926
  "risk": "medium",
696
927
  "summary": "Read the latest message as Markdown, normalized text, blocks, or HTML."
697
928
  },
929
+ {
930
+ "args": {
931
+ "maxPreviewChars": "maximum latest-assistant preview characters to return; defaults to 240"
932
+ },
933
+ "blockers": [
934
+ "browser_bridge_unavailable",
935
+ "login_required",
936
+ "captcha",
937
+ "rate_limit",
938
+ "selector_drift"
939
+ ],
940
+ "defaults": {},
941
+ "defaultTimeoutMs": 5000,
942
+ "examples": [],
943
+ "layer": "primitive",
944
+ "name": "messages.status",
945
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
946
+ "risk": "medium",
947
+ "summary": "Read a compact latest-assistant progress snapshot without treating partial text as complete."
948
+ },
698
949
  {
699
950
  "args": {},
700
951
  "blockers": [
@@ -967,7 +1218,7 @@
967
1218
  "name": "modes.set",
968
1219
  "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
969
1220
  "risk": "medium",
970
- "summary": "Select a visible model, intelligence, effort, or nested model-version candidate when unambiguous."
1221
+ "summary": "Legacy compatibility command: select a visible model/intelligence/effort/version candidate with historical warning-oriented verification."
971
1222
  },
972
1223
  {
973
1224
  "args": {
@@ -988,7 +1239,7 @@
988
1239
  "name": "modes.get",
989
1240
  "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
990
1241
  "risk": "low",
991
- "summary": "Read the mode labels shown on the visible composer controls without changing them."
1242
+ "summary": "Legacy compatibility command: read mode labels shown on visible composer controls without changing them."
992
1243
  },
993
1244
  {
994
1245
  "args": {},
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "args": {
3
+ "configuration": "optional surface-aware visible configuration",
3
4
  "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
5
+ "experience": "optional chat or work surface",
6
+ "mode": "legacy visible mode preference",
4
7
  "prompt": "message to send or workflow-specific input",
5
8
  "report": "optional redacted report settings",
6
9
  "thread": "optional thread selector"
@@ -20,12 +23,12 @@
20
23
  },
21
24
  "defaultTimeoutMs": 120000,
22
25
  "examples": [
23
- "const agent = chatgpt.agent({ name: \"reviewer\", instructions: \"Review deeply.\" }); await chatgpt.runner.run(agent, { input: \"Review this.\", thread: { type: \"new\" } });",
26
+ "const agent = chatgpt.agent({ name: \"reviewer\", instructions: \"Review deeply.\" }); await chatgpt.runner.run(agent, { input: \"Review this.\", thread: { type: \"new\" }, experience: \"chat\" });",
24
27
  "await chatgpt.runner.run(agent, { input: \"Continue.\", thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true });"
25
28
  ],
26
29
  "layer": "workflow",
27
30
  "name": "runner.run",
28
31
  "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
29
32
  "risk": "medium",
30
- "summary": "Agents-style facade: run a visible ChatGPT browser-control agent against input, files, thread, existing-tab, mode, and response options."
33
+ "summary": "Agents-style facade: run a visible ChatGPT agent against input, files, thread, existing-tab, experience, configuration, legacy mode, and response options."
31
34
  }
@@ -71,7 +71,7 @@
71
71
  "localization": {
72
72
  "details": {
73
73
  "englishCanonicalPresent": true,
74
- "labelCandidateCount": 1542,
74
+ "labelCandidateCount": 1544,
75
75
  "missingModeOptionIds": [],
76
76
  "missingToolIds": [],
77
77
  "modeOptionIds": [
@@ -85,15 +85,47 @@
85
85
  "pro"
86
86
  ],
87
87
  "pageAvailable": false,
88
+ "proAliases": [
89
+ "Pro",
90
+ "Pro Extended",
91
+ "Pro • Extended",
92
+ "Extended Pro",
93
+ "專業",
94
+ "احترافي",
95
+ "Про",
96
+ "حرفه‌ای",
97
+ "Պրո",
98
+ "ಪ್ರೊ",
99
+ "Profesionalus",
100
+ "专业",
101
+ "പ്രോ",
102
+ "ਪ੍ਰੋ",
103
+ "प्रो",
104
+ "ప్రో",
105
+ "প্রো",
106
+ "ப்ரோ"
107
+ ],
88
108
  "requiredKeysMissing": [],
109
+ "runningStateLabelCoverage": {
110
+ "nonEnglishLocaleCount": 64,
111
+ "nonEnglishStopControlLocaleCount": 64,
112
+ "nonEnglishStoppedAssistantLocaleCount": 0,
113
+ "registeredLocaleCount": 65,
114
+ "stopControlCandidateCount": 65,
115
+ "stopControlLocaleCount": 65,
116
+ "stoppedAssistantCandidateCount": 3,
117
+ "stoppedAssistantLocaleCount": 1,
118
+ "support": "partial"
119
+ },
89
120
  "runtimeSelectorCoverage": "registry_only_stage_2",
121
+ "supportsProExtendedAlias": true,
90
122
  "toolIds": [
91
123
  "web_search",
92
124
  "deep_research",
93
125
  "create_image"
94
126
  ]
95
127
  },
96
- "message": "The locale registry is loaded; localized runtime selector coverage is registry-only in Stage 2 and not fully proven.",
128
+ "message": "The locale registry is loaded; localized runtime selector coverage is registry-only in Stage 2 and running-state labels are partially localized.",
97
129
  "status": "unknown"
98
130
  },
99
131
  "reports": {
@@ -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 set mode, 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 browser-control agent against input, files, thread, existing-tab, 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- 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- 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.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: Select a visible model, intelligence, effort, or nested model-version candidate when unambiguous.\n- modes.get: Read the mode labels shown on the 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.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
  }
@@ -9,11 +9,14 @@
9
9
  "url": "https://chatgpt.com/"
10
10
  },
11
11
  "data": {
12
+ "completionState": "complete",
12
13
  "finalOutput": {
13
14
  "score": 1,
14
15
  "verdict": "ok"
15
16
  },
17
+ "generationActive": false,
16
18
  "outputText": "{\"verdict\":\"ok\",\"score\":1}",
19
+ "submissionState": "submitted",
17
20
  "thread": {
18
21
  "title": "ChatGPT",
19
22
  "url": "https://chatgpt.com/"
@@ -67,8 +70,10 @@
67
70
  ],
68
71
  "output_text": "{\"verdict\":\"ok\",\"score\":1}",
69
72
  "state": {
73
+ "completionState": "complete",
70
74
  "id": "run_fixed",
71
75
  "resumable": false,
76
+ "submissionState": "submitted",
72
77
  "thread": {
73
78
  "title": "ChatGPT",
74
79
  "url": "https://chatgpt.com/"
@@ -108,8 +113,12 @@
108
113
  "command": "messages.ask",
109
114
  "dataPreview": {
110
115
  "complete": true,
116
+ "completionState": "complete",
117
+ "generationActive": false,
118
+ "generationSignals": [],
111
119
  "prompt": "Return a JSON verdict.",
112
120
  "responseText": "{\"verdict\":\"ok\",\"score\":1}",
121
+ "submissionState": "submitted",
113
122
  "title": "ChatGPT"
114
123
  },
115
124
  "endedAt": "2026-06-06T00:00:00.000Z",