codex-chatgpt-control 0.1.0-alpha.1 → 0.3.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.
- package/CHANGELOG.md +14 -0
- package/README.md +55 -0
- package/contracts/v1/fixtures/backend-capabilities.json +8 -0
- package/contracts/v1/fixtures/blocker-explanation-profiles.json +114 -0
- package/contracts/v1/fixtures/command-descriptors.json +224 -16
- package/contracts/v1/fixtures/doctor-bridge-upload.json +8 -0
- package/contracts/v1/fixtures/doctor-scenario-preflight.json +119 -0
- package/contracts/v1/fixtures/existing-tab-diagnostics-blocker.json +57 -0
- package/contracts/v1/fixtures/files-preflight-success.json +32 -0
- package/contracts/v1/fixtures/help-root.json +1 -1
- package/contracts/v1/fixtures/output-json-parse-success.json +17 -2
- package/contracts/v1/fixtures/project-sources-plan-add.json +71 -0
- package/contracts/v1/fixtures/read-latest-clipped.json +31 -0
- package/contracts/v1/fixtures/reports-create-redacted.json +15 -0
- package/contracts/v1/fixtures/responses-basic-success.json +11 -0
- package/contracts/v1/fixtures/run-basic-success.json +15 -0
- package/contracts/v1/fixtures/run-browser-bridge-blocker.json +2 -2
- package/contracts/v1/fixtures/run-timeout-partial.json +2 -2
- package/contracts/v1/fixtures/runner-budget-blocker.json +1 -1
- package/contracts/v1/fixtures/stream-blocked.ndjson +1 -1
- package/contracts/v1/fixtures/stream-submitted-completed.ndjson +1 -1
- package/contracts/v1/manifest.json +30 -0
- package/contracts/v1/parity-suite.json +80 -7
- package/contracts/v1/schemas/backend-request.schema.json +3 -0
- package/contracts/v1/schemas/command-result.schema.json +48 -0
- package/contracts/v1/schemas/response.schema.json +28 -0
- package/contracts/v1/schemas/run-result.schema.json +84 -0
- package/contracts/v1/surface-drift-policy.json +210 -0
- package/dist/codex-chatgpt-control-backend.mjs +7478 -1789
- package/dist/codex-chatgpt-control.bundle.mjs +8023 -2266
- package/dist/src/backend/client.d.ts +6 -1
- package/dist/src/backend/client.js +5 -0
- package/dist/src/backend/protocol.d.ts +1 -1
- package/dist/src/backend/protocol.js +8 -0
- package/dist/src/backend/session.js +16 -0
- package/dist/src/browser/attach.js +128 -20
- package/dist/src/browser/clipboard.d.ts +11 -0
- package/dist/src/browser/clipboard.js +34 -7
- package/dist/src/browser/downloads.js +2 -1
- package/dist/src/browser/page-state.js +18 -5
- package/dist/src/client.d.ts +17 -1
- package/dist/src/client.js +89 -9
- package/dist/src/commands/artifacts.d.ts +5 -0
- package/dist/src/commands/artifacts.js +432 -0
- package/dist/src/commands/context.js +8 -3
- package/dist/src/commands/conversation.d.ts +15 -0
- package/dist/src/commands/conversation.js +44 -0
- package/dist/src/commands/deadline.d.ts +8 -0
- package/dist/src/commands/deadline.js +14 -0
- package/dist/src/commands/doctor.d.ts +10 -2
- package/dist/src/commands/doctor.js +249 -14
- package/dist/src/commands/files.d.ts +2 -1
- package/dist/src/commands/files.js +406 -18
- package/dist/src/commands/messages.d.ts +2 -1
- package/dist/src/commands/messages.js +430 -98
- package/dist/src/commands/modes.d.ts +4 -1
- package/dist/src/commands/modes.js +404 -37
- package/dist/src/commands/probes.d.ts +15 -0
- package/dist/src/commands/probes.js +64 -0
- package/dist/src/commands/project-sources.d.ts +10 -0
- package/dist/src/commands/project-sources.js +643 -0
- package/dist/src/commands/registry.js +108 -14
- package/dist/src/commands/reports.d.ts +9 -0
- package/dist/src/commands/reports.js +84 -7
- package/dist/src/commands/response-actions.js +33 -0
- package/dist/src/commands/sequence.js +14 -0
- package/dist/src/commands/threads.js +4 -25
- package/dist/src/commands/timeouts.d.ts +2 -0
- package/dist/src/commands/timeouts.js +18 -0
- package/dist/src/diagnostics/blockers.d.ts +54 -0
- package/dist/src/diagnostics/blockers.js +299 -0
- package/dist/src/dom/artifacts.d.ts +7 -0
- package/dist/src/dom/artifacts.js +198 -0
- package/dist/src/dom/generation-state.d.ts +15 -0
- package/dist/src/dom/generation-state.js +109 -0
- package/dist/src/dom/label-match.d.ts +3 -0
- package/dist/src/dom/label-match.js +25 -0
- package/dist/src/dom/locale/am.d.ts +34 -0
- package/dist/src/dom/locale/am.js +34 -0
- package/dist/src/dom/locale/ar.d.ts +35 -0
- package/dist/src/dom/locale/ar.js +35 -0
- package/dist/src/dom/locale/bg.d.ts +35 -0
- package/dist/src/dom/locale/bg.js +35 -0
- package/dist/src/dom/locale/bn.d.ts +35 -0
- package/dist/src/dom/locale/bn.js +35 -0
- package/dist/src/dom/locale/bs.d.ts +34 -0
- package/dist/src/dom/locale/bs.js +34 -0
- package/dist/src/dom/locale/ca.d.ts +34 -0
- package/dist/src/dom/locale/ca.js +34 -0
- package/dist/src/dom/locale/cs.d.ts +34 -0
- package/dist/src/dom/locale/cs.js +34 -0
- package/dist/src/dom/locale/da.d.ts +33 -0
- package/dist/src/dom/locale/da.js +33 -0
- package/dist/src/dom/locale/de.d.ts +36 -0
- package/dist/src/dom/locale/de.js +36 -0
- package/dist/src/dom/locale/el.d.ts +34 -0
- package/dist/src/dom/locale/el.js +34 -0
- package/dist/src/dom/locale/en.d.ts +64 -0
- package/dist/src/dom/locale/en.js +71 -0
- package/dist/src/dom/locale/es-419.d.ts +34 -0
- package/dist/src/dom/locale/es-419.js +34 -0
- package/dist/src/dom/locale/es-ES.d.ts +34 -0
- package/dist/src/dom/locale/es-ES.js +34 -0
- package/dist/src/dom/locale/et.d.ts +34 -0
- package/dist/src/dom/locale/et.js +34 -0
- package/dist/src/dom/locale/fa.d.ts +35 -0
- package/dist/src/dom/locale/fa.js +35 -0
- package/dist/src/dom/locale/fi.d.ts +34 -0
- package/dist/src/dom/locale/fi.js +34 -0
- package/dist/src/dom/locale/fr-CA.d.ts +35 -0
- package/dist/src/dom/locale/fr-CA.js +35 -0
- package/dist/src/dom/locale/fr-FR.d.ts +35 -0
- package/dist/src/dom/locale/fr-FR.js +35 -0
- package/dist/src/dom/locale/gu.d.ts +34 -0
- package/dist/src/dom/locale/gu.js +34 -0
- package/dist/src/dom/locale/hi.d.ts +34 -0
- package/dist/src/dom/locale/hi.js +34 -0
- package/dist/src/dom/locale/hr.d.ts +33 -0
- package/dist/src/dom/locale/hr.js +33 -0
- package/dist/src/dom/locale/hu.d.ts +34 -0
- package/dist/src/dom/locale/hu.js +34 -0
- package/dist/src/dom/locale/hy.d.ts +35 -0
- package/dist/src/dom/locale/hy.js +35 -0
- package/dist/src/dom/locale/id.d.ts +34 -0
- package/dist/src/dom/locale/id.js +34 -0
- package/dist/src/dom/locale/index.d.ts +83 -0
- package/dist/src/dom/locale/index.js +239 -0
- package/dist/src/dom/locale/is.d.ts +34 -0
- package/dist/src/dom/locale/is.js +34 -0
- package/dist/src/dom/locale/it.d.ts +33 -0
- package/dist/src/dom/locale/it.js +33 -0
- package/dist/src/dom/locale/ja.d.ts +33 -0
- package/dist/src/dom/locale/ja.js +33 -0
- package/dist/src/dom/locale/ka.d.ts +34 -0
- package/dist/src/dom/locale/ka.js +34 -0
- package/dist/src/dom/locale/kk.d.ts +34 -0
- package/dist/src/dom/locale/kk.js +34 -0
- package/dist/src/dom/locale/kn.d.ts +35 -0
- package/dist/src/dom/locale/kn.js +35 -0
- package/dist/src/dom/locale/ko.d.ts +34 -0
- package/dist/src/dom/locale/ko.js +34 -0
- package/dist/src/dom/locale/lt.d.ts +35 -0
- package/dist/src/dom/locale/lt.js +35 -0
- package/dist/src/dom/locale/lv.d.ts +34 -0
- package/dist/src/dom/locale/lv.js +34 -0
- package/dist/src/dom/locale/mk.d.ts +33 -0
- package/dist/src/dom/locale/mk.js +33 -0
- package/dist/src/dom/locale/ml.d.ts +35 -0
- package/dist/src/dom/locale/ml.js +35 -0
- package/dist/src/dom/locale/mn.d.ts +35 -0
- package/dist/src/dom/locale/mn.js +35 -0
- package/dist/src/dom/locale/mr.d.ts +35 -0
- package/dist/src/dom/locale/mr.js +35 -0
- package/dist/src/dom/locale/ms.d.ts +34 -0
- package/dist/src/dom/locale/ms.js +34 -0
- package/dist/src/dom/locale/my.d.ts +34 -0
- package/dist/src/dom/locale/my.js +34 -0
- package/dist/src/dom/locale/nb.d.ts +34 -0
- package/dist/src/dom/locale/nb.js +34 -0
- package/dist/src/dom/locale/nl.d.ts +34 -0
- package/dist/src/dom/locale/nl.js +34 -0
- package/dist/src/dom/locale/pa.d.ts +35 -0
- package/dist/src/dom/locale/pa.js +35 -0
- package/dist/src/dom/locale/pl.d.ts +34 -0
- package/dist/src/dom/locale/pl.js +34 -0
- package/dist/src/dom/locale/pt-BR.d.ts +34 -0
- package/dist/src/dom/locale/pt-BR.js +34 -0
- package/dist/src/dom/locale/pt-PT.d.ts +34 -0
- package/dist/src/dom/locale/pt-PT.js +34 -0
- package/dist/src/dom/locale/ro.d.ts +33 -0
- package/dist/src/dom/locale/ro.js +33 -0
- package/dist/src/dom/locale/ru.d.ts +31 -0
- package/dist/src/dom/locale/ru.js +31 -0
- package/dist/src/dom/locale/sk.d.ts +34 -0
- package/dist/src/dom/locale/sk.js +34 -0
- package/dist/src/dom/locale/sl.d.ts +34 -0
- package/dist/src/dom/locale/sl.js +34 -0
- package/dist/src/dom/locale/so.d.ts +34 -0
- package/dist/src/dom/locale/so.js +34 -0
- package/dist/src/dom/locale/sq.d.ts +34 -0
- package/dist/src/dom/locale/sq.js +34 -0
- package/dist/src/dom/locale/sr.d.ts +31 -0
- package/dist/src/dom/locale/sr.js +31 -0
- package/dist/src/dom/locale/sv.d.ts +34 -0
- package/dist/src/dom/locale/sv.js +34 -0
- package/dist/src/dom/locale/sw.d.ts +34 -0
- package/dist/src/dom/locale/sw.js +34 -0
- package/dist/src/dom/locale/ta.d.ts +35 -0
- package/dist/src/dom/locale/ta.js +35 -0
- package/dist/src/dom/locale/te.d.ts +35 -0
- package/dist/src/dom/locale/te.js +35 -0
- package/dist/src/dom/locale/th.d.ts +34 -0
- package/dist/src/dom/locale/th.js +34 -0
- package/dist/src/dom/locale/tl.d.ts +28 -0
- package/dist/src/dom/locale/tl.js +28 -0
- package/dist/src/dom/locale/tr.d.ts +34 -0
- package/dist/src/dom/locale/tr.js +34 -0
- package/dist/src/dom/locale/types.d.ts +52 -0
- package/dist/src/dom/locale/types.js +1 -0
- package/dist/src/dom/locale/uk.d.ts +34 -0
- package/dist/src/dom/locale/uk.js +34 -0
- package/dist/src/dom/locale/ur.d.ts +34 -0
- package/dist/src/dom/locale/ur.js +34 -0
- package/dist/src/dom/locale/vi.d.ts +34 -0
- package/dist/src/dom/locale/vi.js +34 -0
- package/dist/src/dom/locale/zh-HK.d.ts +35 -0
- package/dist/src/dom/locale/zh-HK.js +35 -0
- package/dist/src/dom/locale/zh-Hans.d.ts +35 -0
- package/dist/src/dom/locale/zh-Hans.js +35 -0
- package/dist/src/dom/locale/zh-TW.d.ts +36 -0
- package/dist/src/dom/locale/zh-TW.js +36 -0
- package/dist/src/dom/locale-labels.d.ts +26 -0
- package/dist/src/dom/locale-labels.js +26 -0
- package/dist/src/dom/menus.d.ts +6 -0
- package/dist/src/dom/menus.js +47 -10
- package/dist/src/dom/message-format.d.ts +2 -1
- package/dist/src/dom/message-format.js +67 -10
- package/dist/src/dom/messages.d.ts +2 -1
- package/dist/src/dom/messages.js +2 -4
- package/dist/src/dom/selectors.d.ts +1 -0
- package/dist/src/dom/selectors.js +42 -15
- package/dist/src/dom/wait-snapshot.d.ts +43 -0
- package/dist/src/dom/wait-snapshot.js +127 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/platform/local-paths.d.ts +4 -0
- package/dist/src/platform/local-paths.js +20 -0
- package/dist/src/runner/interruptions.js +15 -4
- package/dist/src/runner/responses.js +18 -1
- package/dist/src/runner/result.js +15 -0
- package/dist/src/runner/resume.js +1 -0
- package/dist/src/runner/types.d.ts +3 -0
- package/dist/src/safety/risk.d.ts +8 -0
- package/dist/src/safety/risk.js +8 -0
- package/dist/src/safety/untrusted-output.d.ts +73 -0
- package/dist/src/safety/untrusted-output.js +199 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.d.ts +1 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.js +270 -0
- package/dist/src/scripts/capture-intelligence-locales.d.ts +25 -0
- package/dist/src/scripts/capture-intelligence-locales.js +669 -0
- package/dist/src/scripts/check-surface-drift.d.ts +1 -0
- package/dist/src/scripts/check-surface-drift.js +11 -0
- package/dist/src/scripts/live-smoke/scenarios.js +84 -0
- package/dist/src/scripts/locale-capture/language-coverage.d.ts +10 -0
- package/dist/src/scripts/locale-capture/language-coverage.js +39 -0
- package/dist/src/testing/surface-drift.d.ts +66 -0
- package/dist/src/testing/surface-drift.js +363 -0
- package/dist/src/types.d.ts +229 -2
- package/package.json +3 -2
- package/references/backend-protocol.md +96 -2
- package/references/language-coverage.md +142 -0
- package/references/localization.md +257 -0
- package/references/python-parity.md +67 -3
- package/references/safety.md +2 -0
- package/references/troubleshooting.md +83 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0-alpha.1
|
|
4
|
+
|
|
5
|
+
- Hardens mode-menu detection and selection against thread/sidebar action menus, with locale-registry-backed thread-action vetoes and container-scoped menu enumeration.
|
|
6
|
+
- Adds the `modes.get` primitive and post-selection verification warnings on `modes.set`.
|
|
7
|
+
- Rewrites wait polling around a single combined DOM snapshot per poll; response text is fetched once at completion instead of every poll.
|
|
8
|
+
- Adds Windows and Linux clipboard capture with DOM fallback.
|
|
9
|
+
- Fixes report `createdAt` to honor the injected clock for deterministic fixtures.
|
|
10
|
+
|
|
11
|
+
## 0.2.0-alpha.1
|
|
12
|
+
|
|
13
|
+
- Adds Windows-safe host path validation and cross-platform backend gates.
|
|
14
|
+
- Adds localized ChatGPT selector support through the locale-label registry.
|
|
15
|
+
- Adds untrusted-output safety envelopes and integrity sidecar verification helpers.
|
|
16
|
+
|
|
3
17
|
## 0.1.0-alpha.1
|
|
4
18
|
|
|
5
19
|
- Initial public alpha package metadata and source layout.
|
package/README.md
CHANGED
|
@@ -40,6 +40,59 @@ await chatgpt.askInThread({
|
|
|
40
40
|
});
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
Attach local files with host-local absolute paths:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
const preflight = await chatgpt.files.preflight({
|
|
47
|
+
paths: ["/absolute/host/path/to/report.pdf"]
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await chatgpt.askWithFiles({
|
|
51
|
+
files: ["/absolute/host/path/to/report.pdf"],
|
|
52
|
+
prompt: "Summarize this report.",
|
|
53
|
+
wait: true,
|
|
54
|
+
read: { format: "markdown" }
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await chatgpt.askWithFiles({
|
|
58
|
+
files: [String.raw`C:\Users\you\Documents\report.pdf`],
|
|
59
|
+
prompt: "Summarize this report.",
|
|
60
|
+
wait: true,
|
|
61
|
+
read: { format: "markdown" }
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Use the second example only when the backend process itself is running on Windows. If the backend runs in WSL/Linux, pass the WSL/Linux path, such as `/home/you/Documents/report.pdf`.
|
|
66
|
+
|
|
67
|
+
Plan append-only ChatGPT Project Sources changes before mutating a project:
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
const plan = await chatgpt.projects.sources.planAdd({
|
|
71
|
+
projectUrl: "https://chatgpt.com/g/g-p-example/project",
|
|
72
|
+
files: ["/absolute/host/path/to/source.md"]
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const added = await chatgpt.projects.sources.add({
|
|
76
|
+
projectUrl: "https://chatgpt.com/g/g-p-example/project",
|
|
77
|
+
files: ["/absolute/host/path/to/source.md"],
|
|
78
|
+
confirmMutation: true
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`planAdd` validates explicit local file metadata without reading file contents or opening ChatGPT. `add` is append-only and returns `needs_confirmation` unless `confirmMutation: true` is supplied.
|
|
83
|
+
|
|
84
|
+
Explain structured blockers before deciding whether to retry:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const result = await chatgpt.session.bootstrap({ existingTab: true });
|
|
88
|
+
if (!result.ok) {
|
|
89
|
+
const explanation = chatgpt.explainBlocker(result, { command: "session.bootstrap" });
|
|
90
|
+
console.log(explanation.markdown);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`explainBlocker` preserves the original `result.blocker` fields and adds conservative retry/resume guidance. Existing-tab blockers include metadata such as requested target, candidate tab IDs, URLs, titles, conversation IDs, and mismatch reason; they do not include page text or chat content.
|
|
95
|
+
|
|
43
96
|
## Validation
|
|
44
97
|
|
|
45
98
|
Run deterministic gates:
|
|
@@ -50,5 +103,7 @@ npm run build
|
|
|
50
103
|
npm run bundle
|
|
51
104
|
npm run bundle:backend
|
|
52
105
|
npm run contract:validate
|
|
106
|
+
npm run docs:drift
|
|
53
107
|
npm run parity:fixtures
|
|
108
|
+
npm run parity:suite
|
|
54
109
|
```
|
|
@@ -35,9 +35,17 @@
|
|
|
35
35
|
"messages.wait",
|
|
36
36
|
"messages.readLatest",
|
|
37
37
|
"messages.waitAndRead",
|
|
38
|
+
"artifacts.listLatest",
|
|
39
|
+
"artifacts.wait",
|
|
40
|
+
"artifacts.downloadLatest",
|
|
41
|
+
"files.preflight",
|
|
38
42
|
"files.attach",
|
|
39
43
|
"files.downloadLatest",
|
|
44
|
+
"projects.sources.list",
|
|
45
|
+
"projects.sources.planAdd",
|
|
46
|
+
"projects.sources.add",
|
|
40
47
|
"modes.set",
|
|
48
|
+
"modes.get",
|
|
41
49
|
"tools.select",
|
|
42
50
|
"response.copy"
|
|
43
51
|
],
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ok": true,
|
|
3
|
+
"requestId": "req_blocker_explanation_profiles",
|
|
4
|
+
"result": {
|
|
5
|
+
"profiles": [
|
|
6
|
+
{
|
|
7
|
+
"category": "environment",
|
|
8
|
+
"kind": "browser_bridge_unavailable",
|
|
9
|
+
"severity": "blocked",
|
|
10
|
+
"title": "Browser bridge unavailable",
|
|
11
|
+
"userActionRequired": false
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"category": "auth",
|
|
15
|
+
"kind": "login_required",
|
|
16
|
+
"severity": "action_required",
|
|
17
|
+
"title": "Login required",
|
|
18
|
+
"userActionRequired": true
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"category": "auth",
|
|
22
|
+
"kind": "captcha",
|
|
23
|
+
"severity": "action_required",
|
|
24
|
+
"title": "Captcha or human verification required",
|
|
25
|
+
"userActionRequired": true
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"category": "auth",
|
|
29
|
+
"kind": "rate_limit",
|
|
30
|
+
"severity": "action_required",
|
|
31
|
+
"title": "Rate limited",
|
|
32
|
+
"userActionRequired": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"category": "runtime",
|
|
36
|
+
"kind": "modal",
|
|
37
|
+
"severity": "action_required",
|
|
38
|
+
"title": "Modal is blocking the page",
|
|
39
|
+
"userActionRequired": true
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"category": "permission",
|
|
43
|
+
"kind": "permission",
|
|
44
|
+
"severity": "action_required",
|
|
45
|
+
"title": "Permission required",
|
|
46
|
+
"userActionRequired": true
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"category": "user_confirmation",
|
|
50
|
+
"kind": "confirmation",
|
|
51
|
+
"severity": "action_required",
|
|
52
|
+
"title": "Confirmation required",
|
|
53
|
+
"userActionRequired": true
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"category": "ui_drift",
|
|
57
|
+
"kind": "selector_drift",
|
|
58
|
+
"severity": "blocked",
|
|
59
|
+
"title": "Selector drift",
|
|
60
|
+
"userActionRequired": false
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"category": "artifact",
|
|
64
|
+
"kind": "artifact_unavailable",
|
|
65
|
+
"severity": "warning",
|
|
66
|
+
"title": "Artifact unavailable",
|
|
67
|
+
"userActionRequired": false
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"category": "ui_drift",
|
|
71
|
+
"kind": "artifact_selector_drift",
|
|
72
|
+
"severity": "blocked",
|
|
73
|
+
"title": "Artifact selector drift",
|
|
74
|
+
"userActionRequired": false
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"category": "download",
|
|
78
|
+
"kind": "artifact_download_unavailable",
|
|
79
|
+
"severity": "warning",
|
|
80
|
+
"title": "Artifact download unavailable",
|
|
81
|
+
"userActionRequired": false
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"category": "download",
|
|
85
|
+
"kind": "download_unavailable",
|
|
86
|
+
"severity": "warning",
|
|
87
|
+
"title": "Download unavailable",
|
|
88
|
+
"userActionRequired": false
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"category": "upload",
|
|
92
|
+
"kind": "upload_failed",
|
|
93
|
+
"severity": "action_required",
|
|
94
|
+
"title": "Upload failed",
|
|
95
|
+
"userActionRequired": true
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"category": "not_found",
|
|
99
|
+
"kind": "not_found",
|
|
100
|
+
"severity": "warning",
|
|
101
|
+
"title": "Target not found",
|
|
102
|
+
"userActionRequired": false
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"category": "unknown",
|
|
106
|
+
"kind": "unknown",
|
|
107
|
+
"severity": "blocked",
|
|
108
|
+
"title": "Unknown blocker",
|
|
109
|
+
"userActionRequired": false
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
"schemaVersion": "chatgpt.browser_control.backend_response.v1"
|
|
114
|
+
}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"args": {
|
|
68
68
|
"existingTab": "true or explicit policy to claim a user-open Chrome tab instead of opening a replacement",
|
|
69
69
|
"files": "absolute local file paths to attach before submitting",
|
|
70
|
-
"mode": "optional visible mode selection, e.g. {
|
|
70
|
+
"mode": "optional visible mode selection, e.g. { model: \"Pro\" } or { intelligence: \"Pro\", modelVersion: \"5.4\" }",
|
|
71
71
|
"prompt": "message to send after files are attached",
|
|
72
72
|
"read": "true or read options such as { format: \"markdown\" }; defaults to Markdown",
|
|
73
73
|
"report": "optional redacted report settings",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
},
|
|
90
90
|
"defaultTimeoutMs": 120000,
|
|
91
91
|
"examples": [
|
|
92
|
-
"await chatgpt.askWithFiles({ thread: { type: \"url\", url: \"https://chatgpt.com/c/<conversation-id>\" }, existingTab: true, mode: {
|
|
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\" } });"
|
|
93
93
|
],
|
|
94
94
|
"layer": "workflow",
|
|
95
95
|
"name": "askWithFiles",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
},
|
|
120
120
|
"defaultTimeoutMs": 120000,
|
|
121
121
|
"examples": [
|
|
122
|
-
"await chatgpt.askAndDownload({ prompt: \"Create a CSV.\", download: { destDir: \"/
|
|
122
|
+
"await chatgpt.askAndDownload({ prompt: \"Create a CSV.\", download: { destDir: \"/absolute/host/output\" }, wait: true });"
|
|
123
123
|
],
|
|
124
124
|
"layer": "workflow",
|
|
125
125
|
"name": "askAndDownload",
|
|
@@ -371,7 +371,7 @@
|
|
|
371
371
|
},
|
|
372
372
|
"defaultTimeoutMs": 120000,
|
|
373
373
|
"examples": [
|
|
374
|
-
"await chatgpt.runPlan({ name: \"attach-ask-read\", input: { files: [\"/absolute/path.md\"], prompt: \"Summarize.\" } });"
|
|
374
|
+
"await chatgpt.runPlan({ name: \"attach-ask-read\", input: { files: [\"/absolute/host/path.md\"], prompt: \"Summarize.\" } });"
|
|
375
375
|
],
|
|
376
376
|
"layer": "workflow",
|
|
377
377
|
"name": "attach-ask-read",
|
|
@@ -399,7 +399,7 @@
|
|
|
399
399
|
},
|
|
400
400
|
"defaultTimeoutMs": 120000,
|
|
401
401
|
"examples": [
|
|
402
|
-
"await chatgpt.runPlan({ name: \"ask-and-download\", input: { prompt: \"Create a CSV.\", destDir: \"/
|
|
402
|
+
"await chatgpt.runPlan({ name: \"ask-and-download\", input: { prompt: \"Create a CSV.\", destDir: \"/absolute/host/output\" } });"
|
|
403
403
|
],
|
|
404
404
|
"layer": "workflow",
|
|
405
405
|
"name": "ask-and-download",
|
|
@@ -476,7 +476,10 @@
|
|
|
476
476
|
},
|
|
477
477
|
{
|
|
478
478
|
"args": {
|
|
479
|
-
"check": "optional list of readiness checks"
|
|
479
|
+
"check": "optional list of readiness checks",
|
|
480
|
+
"existingTab": "optional exact existing-tab policy for check: [\"existing_tab\"]",
|
|
481
|
+
"files": "optional file paths for check: [\"file_preflight\"]",
|
|
482
|
+
"report": "optional report output policy for check: [\"reports\"]"
|
|
480
483
|
},
|
|
481
484
|
"blockers": [
|
|
482
485
|
"browser_bridge_unavailable",
|
|
@@ -486,13 +489,16 @@
|
|
|
486
489
|
"defaults": {},
|
|
487
490
|
"defaultTimeoutMs": 30000,
|
|
488
491
|
"examples": [
|
|
489
|
-
"await chatgpt.doctor({ check: [\"bridge\", \"login\", \"upload\"] });"
|
|
492
|
+
"await chatgpt.doctor({ check: [\"bridge\", \"login\", \"upload\"] });",
|
|
493
|
+
"await chatgpt.doctor({ check: [\"existing_tab\"], existingTab: { target: { type: \"conversationId\", conversationId: \"<conversation-id>\" }, ifMissing: \"block\" } });",
|
|
494
|
+
"await chatgpt.doctor({ check: [\"file_preflight\"], files: [\"/absolute/host/path.md\"] });",
|
|
495
|
+
"await chatgpt.doctor({ check: [\"localization\", \"reports\"], report: { destDir: \"/absolute/host/reports\" } });"
|
|
490
496
|
],
|
|
491
497
|
"layer": "diagnostic",
|
|
492
498
|
"name": "doctor",
|
|
493
499
|
"retryPolicy": "Return structured readiness checks; retry only after the reported blocker or permission setting changes.",
|
|
494
500
|
"risk": "low",
|
|
495
|
-
"summary": "Preflight browser bridge, login, upload,
|
|
501
|
+
"summary": "Preflight browser bridge, login, upload, local files, existing-tab, artifact, localization, report, and selector readiness."
|
|
496
502
|
},
|
|
497
503
|
{
|
|
498
504
|
"args": {
|
|
@@ -508,7 +514,7 @@
|
|
|
508
514
|
},
|
|
509
515
|
"defaultTimeoutMs": 5000,
|
|
510
516
|
"examples": [
|
|
511
|
-
"await chatgpt.createReport(result, { destDir: \"/
|
|
517
|
+
"await chatgpt.createReport(result, { destDir: \"/absolute/host/reports\" });"
|
|
512
518
|
],
|
|
513
519
|
"layer": "report",
|
|
514
520
|
"name": "createReport",
|
|
@@ -645,7 +651,13 @@
|
|
|
645
651
|
"summary": "Compose, submit, optionally wait, and optionally read."
|
|
646
652
|
},
|
|
647
653
|
{
|
|
648
|
-
"args": {
|
|
654
|
+
"args": {
|
|
655
|
+
"mode": "normal or deep_research",
|
|
656
|
+
"pollMs": "optional polling interval",
|
|
657
|
+
"responseContent": "include for current behavior, metadata to omit assistant text and return chars/hash only",
|
|
658
|
+
"stableMs": "optional stability window before completion",
|
|
659
|
+
"timeoutMs": "optional wait timeout"
|
|
660
|
+
},
|
|
649
661
|
"blockers": [
|
|
650
662
|
"browser_bridge_unavailable",
|
|
651
663
|
"login_required",
|
|
@@ -703,6 +715,102 @@
|
|
|
703
715
|
},
|
|
704
716
|
{
|
|
705
717
|
"args": {
|
|
718
|
+
"kind": "artifact kind; currently image",
|
|
719
|
+
"max": "maximum artifacts to return"
|
|
720
|
+
},
|
|
721
|
+
"blockers": [
|
|
722
|
+
"browser_bridge_unavailable",
|
|
723
|
+
"login_required",
|
|
724
|
+
"artifact_unavailable",
|
|
725
|
+
"artifact_selector_drift",
|
|
726
|
+
"artifact_download_unavailable"
|
|
727
|
+
],
|
|
728
|
+
"defaults": {},
|
|
729
|
+
"defaultTimeoutMs": 30000,
|
|
730
|
+
"examples": [
|
|
731
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
732
|
+
],
|
|
733
|
+
"layer": "primitive",
|
|
734
|
+
"name": "artifacts.listLatest",
|
|
735
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
736
|
+
"risk": "medium",
|
|
737
|
+
"summary": "Detect the latest visible generated ChatGPT artifact, such as an image-only result."
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
"args": {
|
|
741
|
+
"afterArtifactCount": "baseline artifact count",
|
|
742
|
+
"kind": "artifact kind; currently image",
|
|
743
|
+
"requireDownload": "wait until a download affordance is visible"
|
|
744
|
+
},
|
|
745
|
+
"blockers": [
|
|
746
|
+
"browser_bridge_unavailable",
|
|
747
|
+
"login_required",
|
|
748
|
+
"artifact_unavailable",
|
|
749
|
+
"artifact_selector_drift",
|
|
750
|
+
"artifact_download_unavailable"
|
|
751
|
+
],
|
|
752
|
+
"defaults": {},
|
|
753
|
+
"defaultTimeoutMs": 120000,
|
|
754
|
+
"examples": [
|
|
755
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
756
|
+
],
|
|
757
|
+
"layer": "primitive",
|
|
758
|
+
"name": "artifacts.wait",
|
|
759
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
760
|
+
"risk": "low",
|
|
761
|
+
"summary": "Wait for a visible generated ChatGPT artifact to appear and stabilize."
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
"args": {
|
|
765
|
+
"destDir": "download destination directory",
|
|
766
|
+
"prefer": "download_control or visible_image_source"
|
|
767
|
+
},
|
|
768
|
+
"blockers": [
|
|
769
|
+
"browser_bridge_unavailable",
|
|
770
|
+
"login_required",
|
|
771
|
+
"artifact_unavailable",
|
|
772
|
+
"artifact_selector_drift",
|
|
773
|
+
"artifact_download_unavailable"
|
|
774
|
+
],
|
|
775
|
+
"defaults": {},
|
|
776
|
+
"defaultTimeoutMs": 120000,
|
|
777
|
+
"examples": [
|
|
778
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
779
|
+
],
|
|
780
|
+
"layer": "primitive",
|
|
781
|
+
"name": "artifacts.downloadLatest",
|
|
782
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
783
|
+
"risk": "medium",
|
|
784
|
+
"summary": "Download or save the latest visible generated ChatGPT artifact."
|
|
785
|
+
},
|
|
786
|
+
{
|
|
787
|
+
"args": {
|
|
788
|
+
"includeHashes": "optional SHA-256 metadata for diagnostics; file contents are not returned",
|
|
789
|
+
"maxBytesPerFile": "optional local per-file byte limit",
|
|
790
|
+
"maxTotalBytes": "optional local total byte limit",
|
|
791
|
+
"paths": "absolute local file paths"
|
|
792
|
+
},
|
|
793
|
+
"blockers": [
|
|
794
|
+
"not_found",
|
|
795
|
+
"permission",
|
|
796
|
+
"upload_failed"
|
|
797
|
+
],
|
|
798
|
+
"defaults": {},
|
|
799
|
+
"defaultTimeoutMs": 30000,
|
|
800
|
+
"examples": [
|
|
801
|
+
"await chatgpt.files.preflight({ paths: [\"/absolute/host/path.md\"] });",
|
|
802
|
+
"await chatgpt.files.preflight({ paths: [\"/absolute/host/path.md\"], includeHashes: true });"
|
|
803
|
+
],
|
|
804
|
+
"layer": "primitive",
|
|
805
|
+
"name": "files.preflight",
|
|
806
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
807
|
+
"risk": "low",
|
|
808
|
+
"summary": "Validate local file paths, size limits, duplicates, zero-byte files, and extension-based MIME/category guesses without opening ChatGPT."
|
|
809
|
+
},
|
|
810
|
+
{
|
|
811
|
+
"args": {
|
|
812
|
+
"includeDiagnostics": "optional preflight and browser input file-size metadata",
|
|
813
|
+
"includeHashes": "optional SHA-256 metadata inside diagnostics; file contents are not returned",
|
|
706
814
|
"paths": "absolute local file paths"
|
|
707
815
|
},
|
|
708
816
|
"blockers": [
|
|
@@ -714,7 +822,8 @@
|
|
|
714
822
|
"defaults": {},
|
|
715
823
|
"defaultTimeoutMs": 180000,
|
|
716
824
|
"examples": [
|
|
717
|
-
"await chatgpt.files.attach({ paths: [\"/absolute/path.jpg\"] });"
|
|
825
|
+
"await chatgpt.files.attach({ paths: [\"/absolute/host/path.jpg\"] });",
|
|
826
|
+
"// On Windows backend hosts, use paths such as C:\\Users\\you\\Pictures\\image.jpg."
|
|
718
827
|
],
|
|
719
828
|
"layer": "primitive",
|
|
720
829
|
"name": "files.attach",
|
|
@@ -738,6 +847,79 @@
|
|
|
738
847
|
"risk": "medium",
|
|
739
848
|
"summary": "Download the latest visible ChatGPT file affordance."
|
|
740
849
|
},
|
|
850
|
+
{
|
|
851
|
+
"args": {
|
|
852
|
+
"existingTab": "optional exact existing-tab policy",
|
|
853
|
+
"projectUrl": "ChatGPT Project URL such as https://chatgpt.com/g/g-p-.../project",
|
|
854
|
+
"timeoutMs": "optional browser timeout"
|
|
855
|
+
},
|
|
856
|
+
"blockers": [
|
|
857
|
+
"browser_bridge_unavailable",
|
|
858
|
+
"login_required",
|
|
859
|
+
"selector_drift",
|
|
860
|
+
"confirmation",
|
|
861
|
+
"permission",
|
|
862
|
+
"upload_failed"
|
|
863
|
+
],
|
|
864
|
+
"defaults": {},
|
|
865
|
+
"defaultTimeoutMs": 30000,
|
|
866
|
+
"examples": [
|
|
867
|
+
"await chatgpt.projects.sources.list({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\" });"
|
|
868
|
+
],
|
|
869
|
+
"layer": "primitive",
|
|
870
|
+
"name": "projects.sources.list",
|
|
871
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
872
|
+
"risk": "low",
|
|
873
|
+
"summary": "Open or claim a visible ChatGPT Project Sources tab and list source names/statuses without source contents."
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
"args": {
|
|
877
|
+
"batchSize": "optional upload batch size",
|
|
878
|
+
"files": "explicit absolute local file paths",
|
|
879
|
+
"projectUrl": "ChatGPT Project URL"
|
|
880
|
+
},
|
|
881
|
+
"blockers": [
|
|
882
|
+
"not_found",
|
|
883
|
+
"permission",
|
|
884
|
+
"upload_failed"
|
|
885
|
+
],
|
|
886
|
+
"defaults": {},
|
|
887
|
+
"defaultTimeoutMs": 30000,
|
|
888
|
+
"examples": [
|
|
889
|
+
"await chatgpt.projects.sources.planAdd({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\", files: [\"/absolute/host/path.md\"] });"
|
|
890
|
+
],
|
|
891
|
+
"layer": "primitive",
|
|
892
|
+
"name": "projects.sources.planAdd",
|
|
893
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
894
|
+
"risk": "low",
|
|
895
|
+
"summary": "Dry-run an append-only Project Sources file add from explicit local files without opening ChatGPT."
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"args": {
|
|
899
|
+
"batchSize": "optional upload batch size",
|
|
900
|
+
"confirmMutation": "must be true to mutate Project Sources",
|
|
901
|
+
"files": "explicit absolute local file paths",
|
|
902
|
+
"projectUrl": "ChatGPT Project URL"
|
|
903
|
+
},
|
|
904
|
+
"blockers": [
|
|
905
|
+
"browser_bridge_unavailable",
|
|
906
|
+
"login_required",
|
|
907
|
+
"selector_drift",
|
|
908
|
+
"confirmation",
|
|
909
|
+
"permission",
|
|
910
|
+
"upload_failed"
|
|
911
|
+
],
|
|
912
|
+
"defaults": {},
|
|
913
|
+
"defaultTimeoutMs": 180000,
|
|
914
|
+
"examples": [
|
|
915
|
+
"await chatgpt.projects.sources.add({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\", files: [\"/absolute/host/path.md\"], confirmMutation: true });"
|
|
916
|
+
],
|
|
917
|
+
"layer": "primitive",
|
|
918
|
+
"name": "projects.sources.add",
|
|
919
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
920
|
+
"risk": "medium",
|
|
921
|
+
"summary": "Append explicit local files to a visible ChatGPT Project Sources list after confirmMutation: true."
|
|
922
|
+
},
|
|
741
923
|
{
|
|
742
924
|
"args": {
|
|
743
925
|
"format": "markdown, normalized_text, visible_text, html, blocks, or all",
|
|
@@ -761,9 +943,12 @@
|
|
|
761
943
|
},
|
|
762
944
|
{
|
|
763
945
|
"args": {
|
|
764
|
-
"effort": "visible effort label such as Thinking or Extended",
|
|
765
|
-
"
|
|
766
|
-
"
|
|
946
|
+
"effort": "visible legacy effort label such as Thinking or Extended",
|
|
947
|
+
"intelligence": "visible intelligence label such as Medium, High, Extra High, or Pro",
|
|
948
|
+
"model": "visible model label such as Pro, GPT-5.5, or another available model",
|
|
949
|
+
"modelVersion": "visible nested model version such as 5.5, 5.4, 4.5, or o3",
|
|
950
|
+
"timeoutMs": "optional timeout for opening and selecting the visible mode menu",
|
|
951
|
+
"version": "alias for modelVersion"
|
|
767
952
|
},
|
|
768
953
|
"blockers": [
|
|
769
954
|
"browser_bridge_unavailable",
|
|
@@ -773,14 +958,37 @@
|
|
|
773
958
|
"defaults": {},
|
|
774
959
|
"defaultTimeoutMs": 30000,
|
|
775
960
|
"examples": [
|
|
961
|
+
"await chatgpt.modes.set({ model: \"Pro\" });",
|
|
962
|
+
"await chatgpt.modes.set({ intelligence: \"Pro\", modelVersion: \"5.4\" });",
|
|
776
963
|
"await chatgpt.modes.set({ effort: \"Thinking\" });",
|
|
777
|
-
"await chatgpt.askWithFiles({ mode: {
|
|
964
|
+
"await chatgpt.askWithFiles({ mode: { model: \"Pro\" }, files: [\"/absolute/host/path.jpg\"], prompt: \"Describe this image.\", wait: true });"
|
|
778
965
|
],
|
|
779
966
|
"layer": "primitive",
|
|
780
967
|
"name": "modes.set",
|
|
781
968
|
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
782
969
|
"risk": "medium",
|
|
783
|
-
"summary": "Select a visible model
|
|
970
|
+
"summary": "Select a visible model, intelligence, effort, or nested model-version candidate when unambiguous."
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"args": {
|
|
974
|
+
"timeoutMs": "optional timeout for attaching to the ChatGPT page"
|
|
975
|
+
},
|
|
976
|
+
"blockers": [
|
|
977
|
+
"browser_bridge_unavailable",
|
|
978
|
+
"login_required",
|
|
979
|
+
"selector_drift"
|
|
980
|
+
],
|
|
981
|
+
"defaults": {},
|
|
982
|
+
"defaultTimeoutMs": 30000,
|
|
983
|
+
"examples": [
|
|
984
|
+
"await chatgpt.modes.get();",
|
|
985
|
+
"// Verify an expensive Pro consult before submitting: const current = await chatgpt.modes.get();"
|
|
986
|
+
],
|
|
987
|
+
"layer": "primitive",
|
|
988
|
+
"name": "modes.get",
|
|
989
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
990
|
+
"risk": "low",
|
|
991
|
+
"summary": "Read the mode labels shown on the visible composer controls without changing them."
|
|
784
992
|
},
|
|
785
993
|
{
|
|
786
994
|
"args": {},
|
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
"data": {
|
|
7
7
|
"checks": {
|
|
8
8
|
"bridge": {
|
|
9
|
+
"blockerKind": "browser_bridge_unavailable",
|
|
10
|
+
"code": "codex_chrome_bridge_unavailable",
|
|
11
|
+
"details": {
|
|
12
|
+
"category": "environment",
|
|
13
|
+
"severity": "blocked",
|
|
14
|
+
"userActionRequired": true
|
|
15
|
+
},
|
|
9
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.",
|
|
17
|
+
"nextCommand": "session.bootstrap",
|
|
10
18
|
"remediation": [
|
|
11
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.",
|
|
12
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 }).",
|