codex-chatgpt-control 0.1.0-alpha.1 → 0.2.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 +6 -0
- package/README.md +55 -0
- package/contracts/v1/fixtures/backend-capabilities.json +7 -0
- package/contracts/v1/fixtures/blocker-explanation-profiles.json +114 -0
- package/contracts/v1/fixtures/command-descriptors.json +192 -15
- package/contracts/v1/fixtures/doctor-bridge-upload.json +8 -0
- package/contracts/v1/fixtures/doctor-scenario-preflight.json +108 -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 +72 -6
- 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 +5137 -488
- package/dist/codex-chatgpt-control.bundle.mjs +5001 -286
- 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 +7 -0
- package/dist/src/backend/session.js +14 -0
- package/dist/src/browser/attach.js +128 -20
- package/dist/src/browser/downloads.js +2 -1
- package/dist/src/browser/page-state.js +6 -3
- package/dist/src/client.d.ts +16 -1
- package/dist/src/client.js +86 -7
- package/dist/src/commands/artifacts.d.ts +5 -0
- package/dist/src/commands/artifacts.js +432 -0
- package/dist/src/commands/context.js +5 -2
- package/dist/src/commands/doctor.d.ts +10 -2
- package/dist/src/commands/doctor.js +242 -14
- package/dist/src/commands/files.d.ts +2 -1
- package/dist/src/commands/files.js +352 -18
- package/dist/src/commands/messages.d.ts +2 -1
- package/dist/src/commands/messages.js +232 -40
- package/dist/src/commands/modes.js +202 -20
- 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 +76 -14
- package/dist/src/commands/reports.d.ts +9 -0
- package/dist/src/commands/reports.js +83 -6
- package/dist/src/commands/response-actions.js +33 -0
- package/dist/src/commands/sequence.js +14 -0
- package/dist/src/commands/threads.js +2 -1
- 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 +8 -0
- package/dist/src/dom/generation-state.js +103 -0
- package/dist/src/dom/locale/am.d.ts +28 -0
- package/dist/src/dom/locale/am.js +28 -0
- package/dist/src/dom/locale/ar.d.ts +28 -0
- package/dist/src/dom/locale/ar.js +28 -0
- package/dist/src/dom/locale/bg.d.ts +28 -0
- package/dist/src/dom/locale/bg.js +28 -0
- package/dist/src/dom/locale/bn.d.ts +28 -0
- package/dist/src/dom/locale/bn.js +28 -0
- package/dist/src/dom/locale/bs.d.ts +28 -0
- package/dist/src/dom/locale/bs.js +28 -0
- package/dist/src/dom/locale/ca.d.ts +28 -0
- package/dist/src/dom/locale/ca.js +28 -0
- package/dist/src/dom/locale/cs.d.ts +28 -0
- package/dist/src/dom/locale/cs.js +28 -0
- package/dist/src/dom/locale/da.d.ts +28 -0
- package/dist/src/dom/locale/da.js +28 -0
- package/dist/src/dom/locale/de.d.ts +30 -0
- package/dist/src/dom/locale/de.js +30 -0
- package/dist/src/dom/locale/el.d.ts +28 -0
- package/dist/src/dom/locale/el.js +28 -0
- package/dist/src/dom/locale/en.d.ts +50 -0
- package/dist/src/dom/locale/en.js +56 -0
- package/dist/src/dom/locale/es-419.d.ts +28 -0
- package/dist/src/dom/locale/es-419.js +28 -0
- package/dist/src/dom/locale/es-ES.d.ts +28 -0
- package/dist/src/dom/locale/es-ES.js +28 -0
- package/dist/src/dom/locale/et.d.ts +28 -0
- package/dist/src/dom/locale/et.js +28 -0
- package/dist/src/dom/locale/fa.d.ts +28 -0
- package/dist/src/dom/locale/fa.js +28 -0
- package/dist/src/dom/locale/fi.d.ts +28 -0
- package/dist/src/dom/locale/fi.js +28 -0
- package/dist/src/dom/locale/fr-CA.d.ts +29 -0
- package/dist/src/dom/locale/fr-CA.js +29 -0
- package/dist/src/dom/locale/fr-FR.d.ts +30 -0
- package/dist/src/dom/locale/fr-FR.js +30 -0
- package/dist/src/dom/locale/gu.d.ts +28 -0
- package/dist/src/dom/locale/gu.js +28 -0
- package/dist/src/dom/locale/hi.d.ts +28 -0
- package/dist/src/dom/locale/hi.js +28 -0
- package/dist/src/dom/locale/hr.d.ts +28 -0
- package/dist/src/dom/locale/hr.js +28 -0
- package/dist/src/dom/locale/hu.d.ts +28 -0
- package/dist/src/dom/locale/hu.js +28 -0
- package/dist/src/dom/locale/hy.d.ts +28 -0
- package/dist/src/dom/locale/hy.js +28 -0
- package/dist/src/dom/locale/id.d.ts +28 -0
- package/dist/src/dom/locale/id.js +28 -0
- package/dist/src/dom/locale/index.d.ts +79 -0
- package/dist/src/dom/locale/index.js +202 -0
- package/dist/src/dom/locale/is.d.ts +28 -0
- package/dist/src/dom/locale/is.js +28 -0
- package/dist/src/dom/locale/it.d.ts +27 -0
- package/dist/src/dom/locale/it.js +27 -0
- package/dist/src/dom/locale/ja.d.ts +27 -0
- package/dist/src/dom/locale/ja.js +27 -0
- package/dist/src/dom/locale/ka.d.ts +28 -0
- package/dist/src/dom/locale/ka.js +28 -0
- package/dist/src/dom/locale/kk.d.ts +28 -0
- package/dist/src/dom/locale/kk.js +28 -0
- package/dist/src/dom/locale/kn.d.ts +28 -0
- package/dist/src/dom/locale/kn.js +28 -0
- package/dist/src/dom/locale/ko.d.ts +28 -0
- package/dist/src/dom/locale/ko.js +28 -0
- package/dist/src/dom/locale/lt.d.ts +28 -0
- package/dist/src/dom/locale/lt.js +28 -0
- package/dist/src/dom/locale/lv.d.ts +28 -0
- package/dist/src/dom/locale/lv.js +28 -0
- package/dist/src/dom/locale/mk.d.ts +28 -0
- package/dist/src/dom/locale/mk.js +28 -0
- package/dist/src/dom/locale/ml.d.ts +28 -0
- package/dist/src/dom/locale/ml.js +28 -0
- package/dist/src/dom/locale/mn.d.ts +28 -0
- package/dist/src/dom/locale/mn.js +28 -0
- package/dist/src/dom/locale/mr.d.ts +28 -0
- package/dist/src/dom/locale/mr.js +28 -0
- package/dist/src/dom/locale/ms.d.ts +28 -0
- package/dist/src/dom/locale/ms.js +28 -0
- package/dist/src/dom/locale/my.d.ts +28 -0
- package/dist/src/dom/locale/my.js +28 -0
- package/dist/src/dom/locale/nb.d.ts +28 -0
- package/dist/src/dom/locale/nb.js +28 -0
- package/dist/src/dom/locale/nl.d.ts +28 -0
- package/dist/src/dom/locale/nl.js +28 -0
- package/dist/src/dom/locale/pa.d.ts +28 -0
- package/dist/src/dom/locale/pa.js +28 -0
- package/dist/src/dom/locale/pl.d.ts +28 -0
- package/dist/src/dom/locale/pl.js +28 -0
- package/dist/src/dom/locale/pt-BR.d.ts +28 -0
- package/dist/src/dom/locale/pt-BR.js +28 -0
- package/dist/src/dom/locale/pt-PT.d.ts +28 -0
- package/dist/src/dom/locale/pt-PT.js +28 -0
- package/dist/src/dom/locale/ro.d.ts +28 -0
- package/dist/src/dom/locale/ro.js +28 -0
- package/dist/src/dom/locale/ru.d.ts +28 -0
- package/dist/src/dom/locale/ru.js +28 -0
- package/dist/src/dom/locale/sk.d.ts +28 -0
- package/dist/src/dom/locale/sk.js +28 -0
- package/dist/src/dom/locale/sl.d.ts +28 -0
- package/dist/src/dom/locale/sl.js +28 -0
- package/dist/src/dom/locale/so.d.ts +28 -0
- package/dist/src/dom/locale/so.js +28 -0
- package/dist/src/dom/locale/sq.d.ts +28 -0
- package/dist/src/dom/locale/sq.js +28 -0
- package/dist/src/dom/locale/sr.d.ts +28 -0
- package/dist/src/dom/locale/sr.js +28 -0
- package/dist/src/dom/locale/sv.d.ts +28 -0
- package/dist/src/dom/locale/sv.js +28 -0
- package/dist/src/dom/locale/sw.d.ts +28 -0
- package/dist/src/dom/locale/sw.js +28 -0
- package/dist/src/dom/locale/ta.d.ts +28 -0
- package/dist/src/dom/locale/ta.js +28 -0
- package/dist/src/dom/locale/te.d.ts +28 -0
- package/dist/src/dom/locale/te.js +28 -0
- package/dist/src/dom/locale/th.d.ts +28 -0
- package/dist/src/dom/locale/th.js +28 -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 +28 -0
- package/dist/src/dom/locale/tr.js +28 -0
- package/dist/src/dom/locale/types.d.ts +45 -0
- package/dist/src/dom/locale/types.js +1 -0
- package/dist/src/dom/locale/uk.d.ts +28 -0
- package/dist/src/dom/locale/uk.js +28 -0
- package/dist/src/dom/locale/ur.d.ts +28 -0
- package/dist/src/dom/locale/ur.js +28 -0
- package/dist/src/dom/locale/vi.d.ts +28 -0
- package/dist/src/dom/locale/vi.js +28 -0
- package/dist/src/dom/locale/zh-HK.d.ts +28 -0
- package/dist/src/dom/locale/zh-HK.js +28 -0
- package/dist/src/dom/locale/zh-Hans.d.ts +28 -0
- package/dist/src/dom/locale/zh-Hans.js +28 -0
- package/dist/src/dom/locale/zh-TW.d.ts +29 -0
- package/dist/src/dom/locale/zh-TW.js +29 -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 +34 -8
- 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/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 +7 -0
- package/dist/src/safety/risk.js +7 -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 +184 -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 +201 -2
- package/package.json +2 -1
- package/references/backend-protocol.md +93 -1
- package/references/language-coverage.md +142 -0
- package/references/localization.md +247 -0
- package/references/python-parity.md +63 -1
- package/references/safety.md +2 -0
- package/references/troubleshooting.md +58 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0-alpha.1
|
|
4
|
+
|
|
5
|
+
- Adds Windows-safe host path validation and cross-platform backend gates.
|
|
6
|
+
- Adds localized ChatGPT selector support through the locale-label registry.
|
|
7
|
+
- Adds untrusted-output safety envelopes and integrity sidecar verification helpers.
|
|
8
|
+
|
|
3
9
|
## 0.1.0-alpha.1
|
|
4
10
|
|
|
5
11
|
- 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,8 +35,15 @@
|
|
|
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",
|
|
41
48
|
"tools.select",
|
|
42
49
|
"response.copy"
|
|
@@ -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",
|
|
@@ -701,6 +707,98 @@
|
|
|
701
707
|
"risk": "medium",
|
|
702
708
|
"summary": "Wait for completion and read the latest message."
|
|
703
709
|
},
|
|
710
|
+
{
|
|
711
|
+
"args": {
|
|
712
|
+
"kind": "artifact kind; currently image",
|
|
713
|
+
"max": "maximum artifacts to return"
|
|
714
|
+
},
|
|
715
|
+
"blockers": [
|
|
716
|
+
"browser_bridge_unavailable",
|
|
717
|
+
"login_required",
|
|
718
|
+
"artifact_unavailable",
|
|
719
|
+
"artifact_selector_drift",
|
|
720
|
+
"artifact_download_unavailable"
|
|
721
|
+
],
|
|
722
|
+
"defaults": {},
|
|
723
|
+
"defaultTimeoutMs": 30000,
|
|
724
|
+
"examples": [
|
|
725
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
726
|
+
],
|
|
727
|
+
"layer": "primitive",
|
|
728
|
+
"name": "artifacts.listLatest",
|
|
729
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
730
|
+
"risk": "medium",
|
|
731
|
+
"summary": "Detect the latest visible generated ChatGPT artifact, such as an image-only result."
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
"args": {
|
|
735
|
+
"afterArtifactCount": "baseline artifact count",
|
|
736
|
+
"kind": "artifact kind; currently image",
|
|
737
|
+
"requireDownload": "wait until a download affordance is visible"
|
|
738
|
+
},
|
|
739
|
+
"blockers": [
|
|
740
|
+
"browser_bridge_unavailable",
|
|
741
|
+
"login_required",
|
|
742
|
+
"artifact_unavailable",
|
|
743
|
+
"artifact_selector_drift",
|
|
744
|
+
"artifact_download_unavailable"
|
|
745
|
+
],
|
|
746
|
+
"defaults": {},
|
|
747
|
+
"defaultTimeoutMs": 120000,
|
|
748
|
+
"examples": [
|
|
749
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
750
|
+
],
|
|
751
|
+
"layer": "primitive",
|
|
752
|
+
"name": "artifacts.wait",
|
|
753
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
754
|
+
"risk": "low",
|
|
755
|
+
"summary": "Wait for a visible generated ChatGPT artifact to appear and stabilize."
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"args": {
|
|
759
|
+
"destDir": "download destination directory",
|
|
760
|
+
"prefer": "download_control or visible_image_source"
|
|
761
|
+
},
|
|
762
|
+
"blockers": [
|
|
763
|
+
"browser_bridge_unavailable",
|
|
764
|
+
"login_required",
|
|
765
|
+
"artifact_unavailable",
|
|
766
|
+
"artifact_selector_drift",
|
|
767
|
+
"artifact_download_unavailable"
|
|
768
|
+
],
|
|
769
|
+
"defaults": {},
|
|
770
|
+
"defaultTimeoutMs": 120000,
|
|
771
|
+
"examples": [
|
|
772
|
+
"await chatgpt.artifacts.downloadLatest({ destDir: \"/absolute/host/output\" });"
|
|
773
|
+
],
|
|
774
|
+
"layer": "primitive",
|
|
775
|
+
"name": "artifacts.downloadLatest",
|
|
776
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
777
|
+
"risk": "medium",
|
|
778
|
+
"summary": "Download or save the latest visible generated ChatGPT artifact."
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
"args": {
|
|
782
|
+
"maxBytesPerFile": "optional local per-file byte limit",
|
|
783
|
+
"maxTotalBytes": "optional local total byte limit",
|
|
784
|
+
"paths": "absolute local file paths"
|
|
785
|
+
},
|
|
786
|
+
"blockers": [
|
|
787
|
+
"not_found",
|
|
788
|
+
"permission",
|
|
789
|
+
"upload_failed"
|
|
790
|
+
],
|
|
791
|
+
"defaults": {},
|
|
792
|
+
"defaultTimeoutMs": 30000,
|
|
793
|
+
"examples": [
|
|
794
|
+
"await chatgpt.files.preflight({ paths: [\"/absolute/host/path.md\"] });"
|
|
795
|
+
],
|
|
796
|
+
"layer": "primitive",
|
|
797
|
+
"name": "files.preflight",
|
|
798
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
799
|
+
"risk": "low",
|
|
800
|
+
"summary": "Validate local file paths, size limits, duplicates, zero-byte files, and extension-based MIME/category guesses without opening ChatGPT."
|
|
801
|
+
},
|
|
704
802
|
{
|
|
705
803
|
"args": {
|
|
706
804
|
"paths": "absolute local file paths"
|
|
@@ -714,7 +812,8 @@
|
|
|
714
812
|
"defaults": {},
|
|
715
813
|
"defaultTimeoutMs": 180000,
|
|
716
814
|
"examples": [
|
|
717
|
-
"await chatgpt.files.attach({ paths: [\"/absolute/path.jpg\"] });"
|
|
815
|
+
"await chatgpt.files.attach({ paths: [\"/absolute/host/path.jpg\"] });",
|
|
816
|
+
"// On Windows backend hosts, use paths such as C:\\Users\\you\\Pictures\\image.jpg."
|
|
718
817
|
],
|
|
719
818
|
"layer": "primitive",
|
|
720
819
|
"name": "files.attach",
|
|
@@ -738,6 +837,79 @@
|
|
|
738
837
|
"risk": "medium",
|
|
739
838
|
"summary": "Download the latest visible ChatGPT file affordance."
|
|
740
839
|
},
|
|
840
|
+
{
|
|
841
|
+
"args": {
|
|
842
|
+
"existingTab": "optional exact existing-tab policy",
|
|
843
|
+
"projectUrl": "ChatGPT Project URL such as https://chatgpt.com/g/g-p-.../project",
|
|
844
|
+
"timeoutMs": "optional browser timeout"
|
|
845
|
+
},
|
|
846
|
+
"blockers": [
|
|
847
|
+
"browser_bridge_unavailable",
|
|
848
|
+
"login_required",
|
|
849
|
+
"selector_drift",
|
|
850
|
+
"confirmation",
|
|
851
|
+
"permission",
|
|
852
|
+
"upload_failed"
|
|
853
|
+
],
|
|
854
|
+
"defaults": {},
|
|
855
|
+
"defaultTimeoutMs": 30000,
|
|
856
|
+
"examples": [
|
|
857
|
+
"await chatgpt.projects.sources.list({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\" });"
|
|
858
|
+
],
|
|
859
|
+
"layer": "primitive",
|
|
860
|
+
"name": "projects.sources.list",
|
|
861
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
862
|
+
"risk": "low",
|
|
863
|
+
"summary": "Open or claim a visible ChatGPT Project Sources tab and list source names/statuses without source contents."
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
"args": {
|
|
867
|
+
"batchSize": "optional upload batch size",
|
|
868
|
+
"files": "explicit absolute local file paths",
|
|
869
|
+
"projectUrl": "ChatGPT Project URL"
|
|
870
|
+
},
|
|
871
|
+
"blockers": [
|
|
872
|
+
"not_found",
|
|
873
|
+
"permission",
|
|
874
|
+
"upload_failed"
|
|
875
|
+
],
|
|
876
|
+
"defaults": {},
|
|
877
|
+
"defaultTimeoutMs": 30000,
|
|
878
|
+
"examples": [
|
|
879
|
+
"await chatgpt.projects.sources.planAdd({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\", files: [\"/absolute/host/path.md\"] });"
|
|
880
|
+
],
|
|
881
|
+
"layer": "primitive",
|
|
882
|
+
"name": "projects.sources.planAdd",
|
|
883
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
884
|
+
"risk": "low",
|
|
885
|
+
"summary": "Dry-run an append-only Project Sources file add from explicit local files without opening ChatGPT."
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"args": {
|
|
889
|
+
"batchSize": "optional upload batch size",
|
|
890
|
+
"confirmMutation": "must be true to mutate Project Sources",
|
|
891
|
+
"files": "explicit absolute local file paths",
|
|
892
|
+
"projectUrl": "ChatGPT Project URL"
|
|
893
|
+
},
|
|
894
|
+
"blockers": [
|
|
895
|
+
"browser_bridge_unavailable",
|
|
896
|
+
"login_required",
|
|
897
|
+
"selector_drift",
|
|
898
|
+
"confirmation",
|
|
899
|
+
"permission",
|
|
900
|
+
"upload_failed"
|
|
901
|
+
],
|
|
902
|
+
"defaults": {},
|
|
903
|
+
"defaultTimeoutMs": 180000,
|
|
904
|
+
"examples": [
|
|
905
|
+
"await chatgpt.projects.sources.add({ projectUrl: \"https://chatgpt.com/g/g-p-example/project\", files: [\"/absolute/host/path.md\"], confirmMutation: true });"
|
|
906
|
+
],
|
|
907
|
+
"layer": "primitive",
|
|
908
|
+
"name": "projects.sources.add",
|
|
909
|
+
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
910
|
+
"risk": "medium",
|
|
911
|
+
"summary": "Append explicit local files to a visible ChatGPT Project Sources list after confirmMutation: true."
|
|
912
|
+
},
|
|
741
913
|
{
|
|
742
914
|
"args": {
|
|
743
915
|
"format": "markdown, normalized_text, visible_text, html, blocks, or all",
|
|
@@ -761,9 +933,12 @@
|
|
|
761
933
|
},
|
|
762
934
|
{
|
|
763
935
|
"args": {
|
|
764
|
-
"effort": "visible effort label such as Thinking or Extended",
|
|
765
|
-
"
|
|
766
|
-
"
|
|
936
|
+
"effort": "visible legacy effort label such as Thinking or Extended",
|
|
937
|
+
"intelligence": "visible intelligence label such as Medium, High, Extra High, or Pro",
|
|
938
|
+
"model": "visible model label such as Pro, GPT-5.5, or another available model",
|
|
939
|
+
"modelVersion": "visible nested model version such as 5.5, 5.4, 4.5, or o3",
|
|
940
|
+
"timeoutMs": "optional timeout for opening and selecting the visible mode menu",
|
|
941
|
+
"version": "alias for modelVersion"
|
|
767
942
|
},
|
|
768
943
|
"blockers": [
|
|
769
944
|
"browser_bridge_unavailable",
|
|
@@ -773,14 +948,16 @@
|
|
|
773
948
|
"defaults": {},
|
|
774
949
|
"defaultTimeoutMs": 30000,
|
|
775
950
|
"examples": [
|
|
951
|
+
"await chatgpt.modes.set({ model: \"Pro\" });",
|
|
952
|
+
"await chatgpt.modes.set({ intelligence: \"Pro\", modelVersion: \"5.4\" });",
|
|
776
953
|
"await chatgpt.modes.set({ effort: \"Thinking\" });",
|
|
777
|
-
"await chatgpt.askWithFiles({ mode: {
|
|
954
|
+
"await chatgpt.askWithFiles({ mode: { model: \"Pro\" }, files: [\"/absolute/host/path.jpg\"], prompt: \"Describe this image.\", wait: true });"
|
|
778
955
|
],
|
|
779
956
|
"layer": "primitive",
|
|
780
957
|
"name": "modes.set",
|
|
781
958
|
"retryPolicy": "Return structured CommandResult failures; retry only when the blocker is recoverable and no duplicate prompt will be submitted.",
|
|
782
959
|
"risk": "medium",
|
|
783
|
-
"summary": "Select a visible model
|
|
960
|
+
"summary": "Select a visible model, intelligence, effort, or nested model-version candidate when unambiguous."
|
|
784
961
|
},
|
|
785
962
|
{
|
|
786
963
|
"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 }).",
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"result": {
|
|
3
|
+
"context": {
|
|
4
|
+
"timestamp": "2026-06-06T00:00:00.000Z"
|
|
5
|
+
},
|
|
6
|
+
"data": {
|
|
7
|
+
"checks": {
|
|
8
|
+
"existing_tab": {
|
|
9
|
+
"blockerKind": "not_found",
|
|
10
|
+
"code": "existing_tab_not_found",
|
|
11
|
+
"details": {
|
|
12
|
+
"candidates": [
|
|
13
|
+
{
|
|
14
|
+
"label": "tab other - Other Chat - https://chatgpt.com/c/other"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"category": "targeting",
|
|
18
|
+
"existingTab": {
|
|
19
|
+
"candidateTabs": [
|
|
20
|
+
{
|
|
21
|
+
"conversationId": "other",
|
|
22
|
+
"id": "other",
|
|
23
|
+
"title": "Other Chat",
|
|
24
|
+
"url": "https://chatgpt.com/c/other"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"chatgptTabCount": 1,
|
|
28
|
+
"mismatchReason": "conversation_id_mismatch",
|
|
29
|
+
"requestedTarget": {
|
|
30
|
+
"conversationId": "abc-123",
|
|
31
|
+
"type": "conversationId"
|
|
32
|
+
},
|
|
33
|
+
"userOpenTabsAvailable": true
|
|
34
|
+
},
|
|
35
|
+
"severity": "warning",
|
|
36
|
+
"userActionRequired": false
|
|
37
|
+
},
|
|
38
|
+
"message": "No already-open ChatGPT tab matched the requested existing-tab target.",
|
|
39
|
+
"nextCommand": "session.bootstrap",
|
|
40
|
+
"remediation": [
|
|
41
|
+
"Choose an exact tab: Use the selected tab, a ChatGPT conversation URL, conversation ID, or a tab id returned by openTabs().",
|
|
42
|
+
"Allow opening: Rerun with open-if-missing only if it is acceptable to open or create a ChatGPT tab instead of reusing an already-open one."
|
|
43
|
+
],
|
|
44
|
+
"status": "blocked"
|
|
45
|
+
},
|
|
46
|
+
"file_preflight": {
|
|
47
|
+
"details": {
|
|
48
|
+
"files": [
|
|
49
|
+
{
|
|
50
|
+
"bytes": 5,
|
|
51
|
+
"category": "text",
|
|
52
|
+
"extension": ".md",
|
|
53
|
+
"mimeType": "text/markdown",
|
|
54
|
+
"name": "spec.md"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"bytes": 11,
|
|
58
|
+
"category": "data",
|
|
59
|
+
"extension": ".json",
|
|
60
|
+
"mimeType": "application/json",
|
|
61
|
+
"name": "context.json"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"pathCount": 2,
|
|
65
|
+
"totalBytes": 16,
|
|
66
|
+
"warnings": []
|
|
67
|
+
},
|
|
68
|
+
"message": "File preflight completed without blocking local file issues.",
|
|
69
|
+
"status": "ok"
|
|
70
|
+
},
|
|
71
|
+
"localization": {
|
|
72
|
+
"details": {
|
|
73
|
+
"englishCanonicalPresent": true,
|
|
74
|
+
"labelCandidateCount": 1070,
|
|
75
|
+
"missingToolIds": [],
|
|
76
|
+
"pageAvailable": false,
|
|
77
|
+
"requiredKeysMissing": [],
|
|
78
|
+
"runtimeSelectorCoverage": "registry_only_stage_2",
|
|
79
|
+
"toolIds": [
|
|
80
|
+
"web_search",
|
|
81
|
+
"deep_research",
|
|
82
|
+
"create_image"
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
"message": "The locale registry is loaded; localized runtime selector coverage is registry-only in Stage 2 and not fully proven.",
|
|
86
|
+
"status": "unknown"
|
|
87
|
+
},
|
|
88
|
+
"reports": {
|
|
89
|
+
"details": {
|
|
90
|
+
"destDir": "/tmp/codex-chatgpt-control/reports/contract-fixtures/missing-doctor-reports",
|
|
91
|
+
"exists": false,
|
|
92
|
+
"includeContent": false,
|
|
93
|
+
"maxPreviewChars": 240,
|
|
94
|
+
"redactionDefault": true
|
|
95
|
+
},
|
|
96
|
+
"message": "Report destination does not exist yet; createReport will create it when a report is written.",
|
|
97
|
+
"nextCommand": "createReport",
|
|
98
|
+
"status": "unknown"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"ready": false
|
|
102
|
+
},
|
|
103
|
+
"ok": true,
|
|
104
|
+
"status": "ok",
|
|
105
|
+
"warnings": []
|
|
106
|
+
},
|
|
107
|
+
"schemaVersion": "chatgpt.browser_control.command_result.v1"
|
|
108
|
+
}
|