codex-chatgpt-control 0.1.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 (179) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -0
  4. package/contracts/v1/fixtures/backend-capabilities.json +54 -0
  5. package/contracts/v1/fixtures/backend-error-event-missing-stream-input.json +10 -0
  6. package/contracts/v1/fixtures/backend-error-missing-run-input.json +10 -0
  7. package/contracts/v1/fixtures/backend-runner-plan-request.json +12 -0
  8. package/contracts/v1/fixtures/backend-version.json +10 -0
  9. package/contracts/v1/fixtures/command-descriptors.json +803 -0
  10. package/contracts/v1/fixtures/describe-runner-run.json +31 -0
  11. package/contracts/v1/fixtures/doctor-bridge-upload.json +34 -0
  12. package/contracts/v1/fixtures/help-root.json +6 -0
  13. package/contracts/v1/fixtures/named-plan-two-turn.json +39 -0
  14. package/contracts/v1/fixtures/output-json-parse-success.json +115 -0
  15. package/contracts/v1/fixtures/primitive-bootstrap-blocker.json +43 -0
  16. package/contracts/v1/fixtures/report-redaction-default.json +16 -0
  17. package/contracts/v1/fixtures/reports-create-redacted.json +16 -0
  18. package/contracts/v1/fixtures/reports-summarize-redacted.json +26 -0
  19. package/contracts/v1/fixtures/responses-basic-success.json +27 -0
  20. package/contracts/v1/fixtures/responses-hidden-instructions-unsupported.json +22 -0
  21. package/contracts/v1/fixtures/responses-unknown-field-unsupported.json +22 -0
  22. package/contracts/v1/fixtures/responses-unsupported-previous-response-id.json +22 -0
  23. package/contracts/v1/fixtures/responses-unsupported-temperature.json +22 -0
  24. package/contracts/v1/fixtures/run-basic-success.json +36 -0
  25. package/contracts/v1/fixtures/run-browser-bridge-blocker.json +180 -0
  26. package/contracts/v1/fixtures/run-file-attach-success.json +63 -0
  27. package/contracts/v1/fixtures/run-report-redacted.json +52 -0
  28. package/contracts/v1/fixtures/run-selector-drift-blocker.json +60 -0
  29. package/contracts/v1/fixtures/run-timeout-partial.json +81 -0
  30. package/contracts/v1/fixtures/run-two-turn-success.json +83 -0
  31. package/contracts/v1/fixtures/run-upload-permission-blocker.json +56 -0
  32. package/contracts/v1/fixtures/runner-budget-blocker.json +106 -0
  33. package/contracts/v1/fixtures/runner-full-agent-config.json +50 -0
  34. package/contracts/v1/fixtures/runner-input-items-and-files-plan.json +53 -0
  35. package/contracts/v1/fixtures/runner-metadata-only-plan.json +31 -0
  36. package/contracts/v1/fixtures/runner-visible-prefix-plan.json +28 -0
  37. package/contracts/v1/fixtures/runner-visible-setup-plan.json +37 -0
  38. package/contracts/v1/fixtures/stream-basic.ndjson +3 -0
  39. package/contracts/v1/fixtures/stream-blocked.ndjson +2 -0
  40. package/contracts/v1/fixtures/stream-submitted-completed.ndjson +3 -0
  41. package/contracts/v1/fixtures/workflow-ask-success.json +67 -0
  42. package/contracts/v1/manifest.json +210 -0
  43. package/contracts/v1/parity-suite.json +635 -0
  44. package/contracts/v1/schemas/agent.schema.json +52 -0
  45. package/contracts/v1/schemas/backend-event.schema.json +74 -0
  46. package/contracts/v1/schemas/backend-request.schema.json +59 -0
  47. package/contracts/v1/schemas/backend-response.schema.json +42 -0
  48. package/contracts/v1/schemas/capabilities.schema.json +33 -0
  49. package/contracts/v1/schemas/command-descriptor.schema.json +31 -0
  50. package/contracts/v1/schemas/command-result.schema.json +99 -0
  51. package/contracts/v1/schemas/manifest.schema.json +69 -0
  52. package/contracts/v1/schemas/response.schema.json +51 -0
  53. package/contracts/v1/schemas/run-result.schema.json +138 -0
  54. package/contracts/v1/schemas/sequence-plan.schema.json +44 -0
  55. package/contracts/v1/schemas/stream-event.schema.json +25 -0
  56. package/dist/codex-chatgpt-control-backend.mjs +5284 -0
  57. package/dist/codex-chatgpt-control.bundle.mjs +6013 -0
  58. package/dist/src/backend/client.d.ts +129 -0
  59. package/dist/src/backend/client.js +415 -0
  60. package/dist/src/backend/protocol.d.ts +74 -0
  61. package/dist/src/backend/protocol.js +128 -0
  62. package/dist/src/backend/session.d.ts +11 -0
  63. package/dist/src/backend/session.js +223 -0
  64. package/dist/src/backend/stdio-server.d.ts +9 -0
  65. package/dist/src/backend/stdio-server.js +88 -0
  66. package/dist/src/browser/attach.d.ts +8 -0
  67. package/dist/src/browser/attach.js +456 -0
  68. package/dist/src/browser/clipboard.d.ts +2 -0
  69. package/dist/src/browser/clipboard.js +26 -0
  70. package/dist/src/browser/downloads.d.ts +7 -0
  71. package/dist/src/browser/downloads.js +29 -0
  72. package/dist/src/browser/page-state.d.ts +17 -0
  73. package/dist/src/browser/page-state.js +66 -0
  74. package/dist/src/client.d.ts +167 -0
  75. package/dist/src/client.js +666 -0
  76. package/dist/src/commands/confirmations.d.ts +9 -0
  77. package/dist/src/commands/confirmations.js +33 -0
  78. package/dist/src/commands/context.d.ts +2 -0
  79. package/dist/src/commands/context.js +32 -0
  80. package/dist/src/commands/doctor.d.ts +16 -0
  81. package/dist/src/commands/doctor.js +120 -0
  82. package/dist/src/commands/files.d.ts +4 -0
  83. package/dist/src/commands/files.js +314 -0
  84. package/dist/src/commands/helpers.d.ts +16 -0
  85. package/dist/src/commands/helpers.js +128 -0
  86. package/dist/src/commands/messages.d.ts +16 -0
  87. package/dist/src/commands/messages.js +538 -0
  88. package/dist/src/commands/modes.d.ts +9 -0
  89. package/dist/src/commands/modes.js +323 -0
  90. package/dist/src/commands/output.d.ts +5 -0
  91. package/dist/src/commands/output.js +31 -0
  92. package/dist/src/commands/registry.d.ts +17 -0
  93. package/dist/src/commands/registry.js +275 -0
  94. package/dist/src/commands/reports.d.ts +14 -0
  95. package/dist/src/commands/reports.js +47 -0
  96. package/dist/src/commands/response-actions.d.ts +2 -0
  97. package/dist/src/commands/response-actions.js +141 -0
  98. package/dist/src/commands/sequence.d.ts +9 -0
  99. package/dist/src/commands/sequence.js +228 -0
  100. package/dist/src/commands/session.d.ts +2 -0
  101. package/dist/src/commands/session.js +25 -0
  102. package/dist/src/commands/threads.d.ts +6 -0
  103. package/dist/src/commands/threads.js +300 -0
  104. package/dist/src/dom/fixtures.d.ts +1 -0
  105. package/dist/src/dom/fixtures.js +8 -0
  106. package/dist/src/dom/menus.d.ts +8 -0
  107. package/dist/src/dom/menus.js +40 -0
  108. package/dist/src/dom/message-format.d.ts +30 -0
  109. package/dist/src/dom/message-format.js +593 -0
  110. package/dist/src/dom/messages.d.ts +40 -0
  111. package/dist/src/dom/messages.js +127 -0
  112. package/dist/src/dom/selectors.d.ts +20 -0
  113. package/dist/src/dom/selectors.js +72 -0
  114. package/dist/src/dom/visible-text.d.ts +5 -0
  115. package/dist/src/dom/visible-text.js +27 -0
  116. package/dist/src/errors.d.ts +32 -0
  117. package/dist/src/errors.js +127 -0
  118. package/dist/src/index.d.ts +34 -0
  119. package/dist/src/index.js +34 -0
  120. package/dist/src/logger.d.ts +15 -0
  121. package/dist/src/logger.js +25 -0
  122. package/dist/src/runner/agent.d.ts +2 -0
  123. package/dist/src/runner/agent.js +17 -0
  124. package/dist/src/runner/index.d.ts +7 -0
  125. package/dist/src/runner/index.js +7 -0
  126. package/dist/src/runner/interruptions.d.ts +3 -0
  127. package/dist/src/runner/interruptions.js +65 -0
  128. package/dist/src/runner/responses.d.ts +30 -0
  129. package/dist/src/runner/responses.js +171 -0
  130. package/dist/src/runner/result.d.ts +3 -0
  131. package/dist/src/runner/result.js +128 -0
  132. package/dist/src/runner/resume.d.ts +11 -0
  133. package/dist/src/runner/resume.js +26 -0
  134. package/dist/src/runner/stream.d.ts +13 -0
  135. package/dist/src/runner/stream.js +66 -0
  136. package/dist/src/runner/types.d.ts +264 -0
  137. package/dist/src/runner/types.js +1 -0
  138. package/dist/src/safety/blockers.d.ts +7 -0
  139. package/dist/src/safety/blockers.js +60 -0
  140. package/dist/src/safety/redaction.d.ts +2 -0
  141. package/dist/src/safety/redaction.js +18 -0
  142. package/dist/src/safety/report-redaction.d.ts +8 -0
  143. package/dist/src/safety/report-redaction.js +74 -0
  144. package/dist/src/safety/risk.d.ts +26 -0
  145. package/dist/src/safety/risk.js +28 -0
  146. package/dist/src/scripts/backend-server.d.ts +2 -0
  147. package/dist/src/scripts/backend-server.js +7 -0
  148. package/dist/src/scripts/check-parity-suite.d.ts +1 -0
  149. package/dist/src/scripts/check-parity-suite.js +10 -0
  150. package/dist/src/scripts/continue-thread.d.ts +27 -0
  151. package/dist/src/scripts/continue-thread.js +388 -0
  152. package/dist/src/scripts/live-smoke/harness.d.ts +11 -0
  153. package/dist/src/scripts/live-smoke/harness.js +151 -0
  154. package/dist/src/scripts/live-smoke/scenarios.d.ts +3 -0
  155. package/dist/src/scripts/live-smoke/scenarios.js +648 -0
  156. package/dist/src/scripts/live-smoke/types.d.ts +53 -0
  157. package/dist/src/scripts/live-smoke/types.js +1 -0
  158. package/dist/src/scripts/live-smoke-module.d.ts +3 -0
  159. package/dist/src/scripts/live-smoke-module.js +2 -0
  160. package/dist/src/scripts/live-smoke.d.ts +1 -0
  161. package/dist/src/scripts/live-smoke.js +54 -0
  162. package/dist/src/scripts/smoke-attach-file.d.ts +1 -0
  163. package/dist/src/scripts/smoke-attach-file.js +39 -0
  164. package/dist/src/scripts/smoke-hi.d.ts +1 -0
  165. package/dist/src/scripts/smoke-hi.js +25 -0
  166. package/dist/src/scripts/smoke-search-open-read.d.ts +1 -0
  167. package/dist/src/scripts/smoke-search-open-read.js +41 -0
  168. package/dist/src/testing/parity-suite.d.ts +12 -0
  169. package/dist/src/testing/parity-suite.js +213 -0
  170. package/dist/src/types.d.ts +495 -0
  171. package/dist/src/types.js +1 -0
  172. package/package.json +81 -0
  173. package/references/agents-runner.md +32 -0
  174. package/references/backend-protocol.md +238 -0
  175. package/references/python-parity.md +168 -0
  176. package/references/responses-adapter.md +28 -0
  177. package/references/safety.md +14 -0
  178. package/references/streaming.md +15 -0
  179. package/references/troubleshooting.md +91 -0
@@ -0,0 +1,803 @@
1
+ {
2
+ "ok": true,
3
+ "requestId": "req_commands",
4
+ "result": [
5
+ {
6
+ "args": {
7
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
8
+ "prompt": "message to send or workflow-specific input",
9
+ "report": "optional redacted report settings",
10
+ "thread": "optional thread selector"
11
+ },
12
+ "blockers": [
13
+ "browser_bridge_unavailable",
14
+ "login_required",
15
+ "captcha",
16
+ "rate_limit",
17
+ "selector_drift"
18
+ ],
19
+ "defaults": {
20
+ "read": {
21
+ "format": "markdown"
22
+ },
23
+ "wait": true
24
+ },
25
+ "defaultTimeoutMs": 120000,
26
+ "examples": [
27
+ "await chatgpt.ask({ prompt: \"reply with the word hi\", wait: true, read: true });"
28
+ ],
29
+ "layer": "workflow",
30
+ "name": "ask",
31
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
32
+ "risk": "medium",
33
+ "summary": "Ask ChatGPT in a new or selected thread, optionally with files, wait/read, downloads, and reports."
34
+ },
35
+ {
36
+ "args": {
37
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
38
+ "prompt": "message to send or workflow-specific input",
39
+ "report": "optional redacted report settings",
40
+ "thread": "optional thread selector"
41
+ },
42
+ "blockers": [
43
+ "browser_bridge_unavailable",
44
+ "login_required",
45
+ "captcha",
46
+ "rate_limit",
47
+ "selector_drift"
48
+ ],
49
+ "defaults": {
50
+ "read": {
51
+ "format": "markdown"
52
+ },
53
+ "wait": true
54
+ },
55
+ "defaultTimeoutMs": 120000,
56
+ "examples": [
57
+ "await chatgpt.askInThread({ thread: { type: \"search\", query: \"Naming macOS Utility\" }, prompt: \"Continue.\" });",
58
+ "await chatgpt.askInThread({ thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true, prompt: \"Continue.\" });"
59
+ ],
60
+ "layer": "workflow",
61
+ "name": "askInThread",
62
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
63
+ "risk": "medium",
64
+ "summary": "Open or claim an existing thread by URL, conversation id, title, or search query, then ask and read."
65
+ },
66
+ {
67
+ "args": {
68
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
69
+ "files": "absolute local file paths to attach before submitting",
70
+ "mode": "optional visible mode selection, e.g. { effort: \"Thinking\" }",
71
+ "prompt": "message to send after files are attached",
72
+ "read": "true or read options such as { format: \"markdown\" }; defaults to Markdown",
73
+ "report": "optional redacted report settings",
74
+ "thread": "optional thread selector",
75
+ "wait": "true or wait options; defaults to true"
76
+ },
77
+ "blockers": [
78
+ "browser_bridge_unavailable",
79
+ "login_required",
80
+ "captcha",
81
+ "rate_limit",
82
+ "selector_drift"
83
+ ],
84
+ "defaults": {
85
+ "read": {
86
+ "format": "markdown"
87
+ },
88
+ "wait": true
89
+ },
90
+ "defaultTimeoutMs": 120000,
91
+ "examples": [
92
+ "await chatgpt.askWithFiles({ thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true, mode: { effort: \"Thinking\" }, files: [\"/absolute/path/brief.md\"], prompt: \"Summarize this.\", wait: true, read: { format: \"markdown\" } });"
93
+ ],
94
+ "layer": "workflow",
95
+ "name": "askWithFiles",
96
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
97
+ "risk": "medium",
98
+ "summary": "Attach absolute local file paths, optionally set mode, ask, wait, and read."
99
+ },
100
+ {
101
+ "args": {
102
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
103
+ "prompt": "message to send or workflow-specific input",
104
+ "report": "optional redacted report settings",
105
+ "thread": "optional thread selector"
106
+ },
107
+ "blockers": [
108
+ "browser_bridge_unavailable",
109
+ "login_required",
110
+ "captcha",
111
+ "rate_limit",
112
+ "selector_drift"
113
+ ],
114
+ "defaults": {
115
+ "read": {
116
+ "format": "markdown"
117
+ },
118
+ "wait": true
119
+ },
120
+ "defaultTimeoutMs": 120000,
121
+ "examples": [
122
+ "await chatgpt.askAndDownload({ prompt: \"Create a CSV.\", download: { destDir: \"/tmp/out\" }, wait: true });"
123
+ ],
124
+ "layer": "workflow",
125
+ "name": "askAndDownload",
126
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
127
+ "risk": "medium",
128
+ "summary": "Ask ChatGPT to produce a visible downloadable output and save the latest exposed file."
129
+ },
130
+ {
131
+ "args": {
132
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
133
+ "prompt": "message to send or workflow-specific input",
134
+ "report": "optional redacted report settings",
135
+ "thread": "optional thread selector"
136
+ },
137
+ "blockers": [
138
+ "browser_bridge_unavailable",
139
+ "login_required",
140
+ "captcha",
141
+ "rate_limit",
142
+ "selector_drift"
143
+ ],
144
+ "defaults": {
145
+ "read": {
146
+ "format": "markdown"
147
+ },
148
+ "wait": true
149
+ },
150
+ "defaultTimeoutMs": 120000,
151
+ "examples": [
152
+ "await chatgpt.runMessages({ messages: [{ id: \"first\", prompt: \"alpha\" }, { id: \"second\", prompt: \"beta\" }] });"
153
+ ],
154
+ "layer": "workflow",
155
+ "name": "runMessages",
156
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
157
+ "risk": "medium",
158
+ "summary": "Run sequential prompts where later prompts can use earlier step data."
159
+ },
160
+ {
161
+ "args": {
162
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
163
+ "prompt": "message to send or workflow-specific input",
164
+ "report": "optional redacted report settings",
165
+ "thread": "optional thread selector"
166
+ },
167
+ "blockers": [
168
+ "browser_bridge_unavailable",
169
+ "login_required",
170
+ "captcha",
171
+ "rate_limit",
172
+ "selector_drift"
173
+ ],
174
+ "defaults": {
175
+ "read": {
176
+ "format": "markdown"
177
+ },
178
+ "wait": true
179
+ },
180
+ "defaultTimeoutMs": 120000,
181
+ "examples": [
182
+ "const agent = chatgpt.agent({ name: \"reviewer\", instructions: \"Review deeply.\" }); await chatgpt.runner.run(agent, { input: \"Review this.\", thread: { type: \"new\" } });",
183
+ "await chatgpt.runner.run(agent, { input: \"Continue.\", thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true });"
184
+ ],
185
+ "layer": "workflow",
186
+ "name": "runner.run",
187
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
188
+ "risk": "medium",
189
+ "summary": "Agents-style facade: run a visible ChatGPT browser-control agent against input, files, thread, existing-tab, mode, and response options."
190
+ },
191
+ {
192
+ "args": {
193
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
194
+ "prompt": "message to send or workflow-specific input",
195
+ "report": "optional redacted report settings",
196
+ "thread": "optional thread selector"
197
+ },
198
+ "blockers": [
199
+ "browser_bridge_unavailable",
200
+ "login_required",
201
+ "captcha",
202
+ "rate_limit",
203
+ "selector_drift"
204
+ ],
205
+ "defaults": {
206
+ "read": {
207
+ "format": "markdown"
208
+ },
209
+ "wait": true
210
+ },
211
+ "defaultTimeoutMs": 120000,
212
+ "examples": [
213
+ "await chatgpt.responses.create({ input: \"Summarize.\", thread: { type: \"current\" }, text: { format: \"markdown\" }, stream: false });"
214
+ ],
215
+ "layer": "workflow",
216
+ "name": "responses.create",
217
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
218
+ "risk": "medium",
219
+ "summary": "Narrow Responses-shaped adapter over the visible ChatGPT browser-control runner; rejects unsupported API-only fields before prompt submission."
220
+ },
221
+ {
222
+ "args": {
223
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
224
+ "prompt": "message to send or workflow-specific input",
225
+ "report": "optional redacted report settings",
226
+ "thread": "optional thread selector"
227
+ },
228
+ "blockers": [
229
+ "browser_bridge_unavailable",
230
+ "login_required",
231
+ "captcha",
232
+ "rate_limit",
233
+ "selector_drift"
234
+ ],
235
+ "defaults": {
236
+ "format": "markdown",
237
+ "prefer": "clipboard"
238
+ },
239
+ "defaultTimeoutMs": 120000,
240
+ "examples": [
241
+ "await chatgpt.copyLatest({ prefer: \"clipboard\" });"
242
+ ],
243
+ "layer": "workflow",
244
+ "name": "copyLatest",
245
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
246
+ "risk": "medium",
247
+ "summary": "Copy or DOM-read the latest assistant response with Markdown-first fidelity."
248
+ },
249
+ {
250
+ "args": {
251
+ "existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
252
+ "prompt": "message to send or workflow-specific input",
253
+ "report": "optional redacted report settings",
254
+ "thread": "optional thread selector"
255
+ },
256
+ "blockers": [
257
+ "browser_bridge_unavailable",
258
+ "login_required",
259
+ "captcha",
260
+ "rate_limit",
261
+ "selector_drift"
262
+ ],
263
+ "defaults": {},
264
+ "defaultTimeoutMs": 120000,
265
+ "examples": [
266
+ "await chatgpt.runPlan({ name: \"new-ask-read\", input: { prompt: \"hi\" } });"
267
+ ],
268
+ "layer": "workflow",
269
+ "name": "runPlan",
270
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
271
+ "risk": "medium",
272
+ "summary": "Execute an inline SequencePlan or named macro through the existing sequence engine."
273
+ },
274
+ {
275
+ "args": {
276
+ "prompt": "message to send"
277
+ },
278
+ "blockers": [
279
+ "browser_bridge_unavailable",
280
+ "login_required",
281
+ "captcha",
282
+ "rate_limit",
283
+ "selector_drift"
284
+ ],
285
+ "defaults": {
286
+ "read": {
287
+ "format": "markdown"
288
+ },
289
+ "wait": true
290
+ },
291
+ "defaultTimeoutMs": 120000,
292
+ "examples": [
293
+ "await chatgpt.runPlan({ name: \"new-ask-read\", input: { prompt: \"hi\" } });"
294
+ ],
295
+ "layer": "workflow",
296
+ "name": "new-ask-read",
297
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
298
+ "risk": "medium",
299
+ "summary": "Named macro: open a new thread, ask, wait, and read Markdown."
300
+ },
301
+ {
302
+ "args": {
303
+ "prompt": "message to send",
304
+ "query": "history search query"
305
+ },
306
+ "blockers": [
307
+ "browser_bridge_unavailable",
308
+ "login_required",
309
+ "captcha",
310
+ "rate_limit",
311
+ "selector_drift"
312
+ ],
313
+ "defaults": {
314
+ "read": {
315
+ "format": "markdown"
316
+ },
317
+ "wait": true
318
+ },
319
+ "defaultTimeoutMs": 120000,
320
+ "examples": [
321
+ "await chatgpt.runPlan({ name: \"find-open-ask-read\", input: { query: \"SDK Design Proposal\", prompt: \"Continue.\" } });"
322
+ ],
323
+ "layer": "workflow",
324
+ "name": "find-open-ask-read",
325
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
326
+ "risk": "medium",
327
+ "summary": "Named macro: search history, open the first match, ask, wait, and read Markdown."
328
+ },
329
+ {
330
+ "args": {
331
+ "query": "history search query"
332
+ },
333
+ "blockers": [
334
+ "browser_bridge_unavailable",
335
+ "login_required",
336
+ "captcha",
337
+ "rate_limit",
338
+ "selector_drift"
339
+ ],
340
+ "defaults": {
341
+ "format": "markdown",
342
+ "prefer": "clipboard"
343
+ },
344
+ "defaultTimeoutMs": 120000,
345
+ "examples": [
346
+ "await chatgpt.runPlan({ name: \"find-open-copy-latest\", input: { query: \"SDK Design Proposal\" } });"
347
+ ],
348
+ "layer": "workflow",
349
+ "name": "find-open-copy-latest",
350
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
351
+ "risk": "medium",
352
+ "summary": "Named macro: search history, open the first match, and copy/read the latest response."
353
+ },
354
+ {
355
+ "args": {
356
+ "files": "absolute local file paths",
357
+ "prompt": "message to send"
358
+ },
359
+ "blockers": [
360
+ "browser_bridge_unavailable",
361
+ "login_required",
362
+ "captcha",
363
+ "rate_limit",
364
+ "selector_drift"
365
+ ],
366
+ "defaults": {
367
+ "read": {
368
+ "format": "markdown"
369
+ },
370
+ "wait": true
371
+ },
372
+ "defaultTimeoutMs": 120000,
373
+ "examples": [
374
+ "await chatgpt.runPlan({ name: \"attach-ask-read\", input: { files: [\"/absolute/path.md\"], prompt: \"Summarize.\" } });"
375
+ ],
376
+ "layer": "workflow",
377
+ "name": "attach-ask-read",
378
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
379
+ "risk": "medium",
380
+ "summary": "Named macro: open a new thread, attach files, ask, wait, and read Markdown."
381
+ },
382
+ {
383
+ "args": {
384
+ "destDir": "download destination directory",
385
+ "prompt": "message to send"
386
+ },
387
+ "blockers": [
388
+ "browser_bridge_unavailable",
389
+ "login_required",
390
+ "captcha",
391
+ "rate_limit",
392
+ "selector_drift"
393
+ ],
394
+ "defaults": {
395
+ "read": {
396
+ "format": "markdown"
397
+ },
398
+ "wait": true
399
+ },
400
+ "defaultTimeoutMs": 120000,
401
+ "examples": [
402
+ "await chatgpt.runPlan({ name: \"ask-and-download\", input: { prompt: \"Create a CSV.\", destDir: \"/tmp/out\" } });"
403
+ ],
404
+ "layer": "workflow",
405
+ "name": "ask-and-download",
406
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
407
+ "risk": "medium",
408
+ "summary": "Named macro: ask in a new thread and download the latest file affordance."
409
+ },
410
+ {
411
+ "args": {
412
+ "first": "first message",
413
+ "second": "second message"
414
+ },
415
+ "blockers": [
416
+ "browser_bridge_unavailable",
417
+ "login_required",
418
+ "captcha",
419
+ "rate_limit",
420
+ "selector_drift"
421
+ ],
422
+ "defaults": {
423
+ "read": {
424
+ "format": "markdown"
425
+ },
426
+ "wait": true
427
+ },
428
+ "defaultTimeoutMs": 120000,
429
+ "examples": [
430
+ "await chatgpt.runPlan({ name: \"two-turn\", input: { first: \"alpha\", second: \"beta\" } });"
431
+ ],
432
+ "layer": "workflow",
433
+ "name": "two-turn",
434
+ "retryPolicy": "Return structured CommandResult failures; do not resubmit prompts unless the sequence policy permits unmatched-turn recovery.",
435
+ "risk": "medium",
436
+ "summary": "Named macro: run two sequential prompts in a new thread."
437
+ },
438
+ {
439
+ "args": {},
440
+ "blockers": [
441
+ "browser_bridge_unavailable",
442
+ "login_required",
443
+ "selector_drift"
444
+ ],
445
+ "defaults": {},
446
+ "defaultTimeoutMs": 30000,
447
+ "examples": [
448
+ "await chatgpt.runPlan({ name: \"doctor-upload\" });"
449
+ ],
450
+ "layer": "diagnostic",
451
+ "name": "doctor-upload",
452
+ "retryPolicy": "Return structured readiness checks; retry only after the reported blocker or permission setting changes.",
453
+ "risk": "low",
454
+ "summary": "Named macro: preflight bridge, login, and upload permission remediation."
455
+ },
456
+ {
457
+ "args": {
458
+ "result": "CommandResult to persist"
459
+ },
460
+ "blockers": [
461
+ "permission"
462
+ ],
463
+ "defaults": {
464
+ "includeContent": false,
465
+ "maxPreviewChars": 240
466
+ },
467
+ "defaultTimeoutMs": 5000,
468
+ "examples": [
469
+ "await chatgpt.runPlan({ name: \"redacted-run-report\", input: { result } });"
470
+ ],
471
+ "layer": "report",
472
+ "name": "redacted-run-report",
473
+ "retryPolicy": "Do not retry blindly; preserve redaction defaults and report filesystem errors as CommandResult failures.",
474
+ "risk": "low",
475
+ "summary": "Named macro: create a redacted report for a supplied CommandResult."
476
+ },
477
+ {
478
+ "args": {
479
+ "check": "optional list of readiness checks"
480
+ },
481
+ "blockers": [
482
+ "browser_bridge_unavailable",
483
+ "login_required",
484
+ "selector_drift"
485
+ ],
486
+ "defaults": {},
487
+ "defaultTimeoutMs": 30000,
488
+ "examples": [
489
+ "await chatgpt.doctor({ check: [\"bridge\", \"login\", \"upload\"] });"
490
+ ],
491
+ "layer": "diagnostic",
492
+ "name": "doctor",
493
+ "retryPolicy": "Return structured readiness checks; retry only after the reported blocker or permission setting changes.",
494
+ "risk": "low",
495
+ "summary": "Preflight browser bridge, login, upload, download, clipboard, mode, and tool readiness."
496
+ },
497
+ {
498
+ "args": {
499
+ "destDir": "optional report directory",
500
+ "result": "CommandResult to persist"
501
+ },
502
+ "blockers": [
503
+ "permission"
504
+ ],
505
+ "defaults": {
506
+ "includeContent": false,
507
+ "maxPreviewChars": 240
508
+ },
509
+ "defaultTimeoutMs": 5000,
510
+ "examples": [
511
+ "await chatgpt.createReport(result, { destDir: \"/tmp/reports\" });"
512
+ ],
513
+ "layer": "report",
514
+ "name": "createReport",
515
+ "retryPolicy": "Do not retry blindly; preserve redaction defaults and report filesystem errors as CommandResult failures.",
516
+ "risk": "low",
517
+ "summary": "Write a durable redacted run report for a command result."
518
+ },
519
+ {
520
+ "args": {},
521
+ "blockers": [
522
+ "browser_bridge_unavailable",
523
+ "login_required",
524
+ "captcha",
525
+ "rate_limit",
526
+ "selector_drift"
527
+ ],
528
+ "defaults": {},
529
+ "defaultTimeoutMs": 30000,
530
+ "examples": [],
531
+ "layer": "primitive",
532
+ "name": "session.bootstrap",
533
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
534
+ "risk": "low",
535
+ "summary": "Attach to ChatGPT in Chrome and detect login/blocker state."
536
+ },
537
+ {
538
+ "args": {},
539
+ "blockers": [
540
+ "browser_bridge_unavailable",
541
+ "login_required",
542
+ "captcha",
543
+ "rate_limit",
544
+ "selector_drift"
545
+ ],
546
+ "defaults": {},
547
+ "defaultTimeoutMs": 30000,
548
+ "examples": [],
549
+ "layer": "primitive",
550
+ "name": "threads.new",
551
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
552
+ "risk": "low",
553
+ "summary": "Open a new ChatGPT thread."
554
+ },
555
+ {
556
+ "args": {
557
+ "query": "history search query"
558
+ },
559
+ "blockers": [
560
+ "browser_bridge_unavailable",
561
+ "login_required",
562
+ "captcha",
563
+ "rate_limit",
564
+ "selector_drift"
565
+ ],
566
+ "defaults": {},
567
+ "defaultTimeoutMs": 30000,
568
+ "examples": [],
569
+ "layer": "primitive",
570
+ "name": "threads.search",
571
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
572
+ "risk": "medium",
573
+ "summary": "Search visible ChatGPT history by query."
574
+ },
575
+ {
576
+ "args": {},
577
+ "blockers": [
578
+ "browser_bridge_unavailable",
579
+ "login_required",
580
+ "captcha",
581
+ "rate_limit",
582
+ "selector_drift"
583
+ ],
584
+ "defaults": {},
585
+ "defaultTimeoutMs": 30000,
586
+ "examples": [],
587
+ "layer": "primitive",
588
+ "name": "threads.open",
589
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
590
+ "risk": "medium",
591
+ "summary": "Open a thread by URL, conversation id, title, or search result."
592
+ },
593
+ {
594
+ "args": {},
595
+ "blockers": [
596
+ "browser_bridge_unavailable",
597
+ "login_required",
598
+ "captcha",
599
+ "rate_limit",
600
+ "selector_drift"
601
+ ],
602
+ "defaults": {},
603
+ "defaultTimeoutMs": 30000,
604
+ "examples": [],
605
+ "layer": "primitive",
606
+ "name": "messages.compose",
607
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
608
+ "risk": "low",
609
+ "summary": "Fill the composer without submitting."
610
+ },
611
+ {
612
+ "args": {},
613
+ "blockers": [
614
+ "browser_bridge_unavailable",
615
+ "login_required",
616
+ "captcha",
617
+ "rate_limit",
618
+ "selector_drift"
619
+ ],
620
+ "defaults": {},
621
+ "defaultTimeoutMs": 30000,
622
+ "examples": [],
623
+ "layer": "primitive",
624
+ "name": "messages.submit",
625
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
626
+ "risk": "medium",
627
+ "summary": "Submit the current composer contents."
628
+ },
629
+ {
630
+ "args": {},
631
+ "blockers": [
632
+ "browser_bridge_unavailable",
633
+ "login_required",
634
+ "captcha",
635
+ "rate_limit",
636
+ "selector_drift"
637
+ ],
638
+ "defaults": {},
639
+ "defaultTimeoutMs": 120000,
640
+ "examples": [],
641
+ "layer": "primitive",
642
+ "name": "messages.ask",
643
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
644
+ "risk": "medium",
645
+ "summary": "Compose, submit, optionally wait, and optionally read."
646
+ },
647
+ {
648
+ "args": {},
649
+ "blockers": [
650
+ "browser_bridge_unavailable",
651
+ "login_required",
652
+ "captcha",
653
+ "rate_limit",
654
+ "selector_drift"
655
+ ],
656
+ "defaults": {},
657
+ "defaultTimeoutMs": 120000,
658
+ "examples": [],
659
+ "layer": "primitive",
660
+ "name": "messages.wait",
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": "Wait for the latest assistant response to stabilize."
664
+ },
665
+ {
666
+ "args": {
667
+ "format": "markdown, normalized_text, visible_text, html, blocks, or all",
668
+ "role": "assistant or user"
669
+ },
670
+ "blockers": [
671
+ "browser_bridge_unavailable",
672
+ "login_required",
673
+ "captcha",
674
+ "rate_limit",
675
+ "selector_drift"
676
+ ],
677
+ "defaults": {},
678
+ "defaultTimeoutMs": 30000,
679
+ "examples": [],
680
+ "layer": "primitive",
681
+ "name": "messages.readLatest",
682
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
683
+ "risk": "medium",
684
+ "summary": "Read the latest message as Markdown, normalized text, blocks, or HTML."
685
+ },
686
+ {
687
+ "args": {},
688
+ "blockers": [
689
+ "browser_bridge_unavailable",
690
+ "login_required",
691
+ "captcha",
692
+ "rate_limit",
693
+ "selector_drift"
694
+ ],
695
+ "defaults": {},
696
+ "defaultTimeoutMs": 120000,
697
+ "examples": [],
698
+ "layer": "primitive",
699
+ "name": "messages.waitAndRead",
700
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
701
+ "risk": "medium",
702
+ "summary": "Wait for completion and read the latest message."
703
+ },
704
+ {
705
+ "args": {
706
+ "paths": "absolute local file paths"
707
+ },
708
+ "blockers": [
709
+ "browser_bridge_unavailable",
710
+ "login_required",
711
+ "permission",
712
+ "upload_failed"
713
+ ],
714
+ "defaults": {},
715
+ "defaultTimeoutMs": 180000,
716
+ "examples": [
717
+ "await chatgpt.files.attach({ paths: [\"/absolute/path.jpg\"] });"
718
+ ],
719
+ "layer": "primitive",
720
+ "name": "files.attach",
721
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
722
+ "risk": "medium",
723
+ "summary": "Attach absolute local file paths through visible ChatGPT upload controls."
724
+ },
725
+ {
726
+ "args": {},
727
+ "blockers": [
728
+ "browser_bridge_unavailable",
729
+ "login_required",
730
+ "download_unavailable"
731
+ ],
732
+ "defaults": {},
733
+ "defaultTimeoutMs": 120000,
734
+ "examples": [],
735
+ "layer": "primitive",
736
+ "name": "files.downloadLatest",
737
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
738
+ "risk": "medium",
739
+ "summary": "Download the latest visible ChatGPT file affordance."
740
+ },
741
+ {
742
+ "args": {
743
+ "format": "markdown, normalized_text, visible_text, html, blocks, or all",
744
+ "prefer": "clipboard or dom"
745
+ },
746
+ "blockers": [
747
+ "browser_bridge_unavailable",
748
+ "login_required",
749
+ "captcha",
750
+ "rate_limit",
751
+ "selector_drift"
752
+ ],
753
+ "defaults": {},
754
+ "defaultTimeoutMs": 5000,
755
+ "examples": [],
756
+ "layer": "primitive",
757
+ "name": "response.copy",
758
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
759
+ "risk": "medium",
760
+ "summary": "Click Copy response and return clipboard Markdown, with DOM fallback."
761
+ },
762
+ {
763
+ "args": {
764
+ "effort": "visible effort label such as Thinking or Extended",
765
+ "model": "visible model label such as Instant, Pro, or another available model",
766
+ "timeoutMs": "optional timeout for opening and selecting the visible mode menu"
767
+ },
768
+ "blockers": [
769
+ "browser_bridge_unavailable",
770
+ "login_required",
771
+ "selector_drift"
772
+ ],
773
+ "defaults": {},
774
+ "defaultTimeoutMs": 30000,
775
+ "examples": [
776
+ "await chatgpt.modes.set({ effort: \"Thinking\" });",
777
+ "await chatgpt.askWithFiles({ mode: { effort: \"Thinking\" }, files: [\"/absolute/path.jpg\"], prompt: \"Describe this image.\", wait: true });"
778
+ ],
779
+ "layer": "primitive",
780
+ "name": "modes.set",
781
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
782
+ "risk": "medium",
783
+ "summary": "Select a visible model or effort candidate when unambiguous."
784
+ },
785
+ {
786
+ "args": {},
787
+ "blockers": [
788
+ "browser_bridge_unavailable",
789
+ "login_required",
790
+ "selector_drift"
791
+ ],
792
+ "defaults": {},
793
+ "defaultTimeoutMs": 30000,
794
+ "examples": [],
795
+ "layer": "primitive",
796
+ "name": "tools.select",
797
+ "retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
798
+ "risk": "medium",
799
+ "summary": "Select a visible ChatGPT tool when unambiguous."
800
+ }
801
+ ],
802
+ "schemaVersion": "chatgpt.browser_control.backend_response.v1"
803
+ }