codex-chatgpt-control 0.3.0-alpha.1 → 0.5.1-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 +17 -0
- package/README.md +42 -2
- package/contracts/v1/fixtures/backend-capabilities.json +10 -0
- package/contracts/v1/fixtures/command-descriptors.json +265 -8
- package/contracts/v1/fixtures/describe-runner-run.json +5 -2
- package/contracts/v1/fixtures/doctor-scenario-preflight.json +34 -2
- package/contracts/v1/fixtures/help-root.json +1 -1
- package/contracts/v1/fixtures/output-json-parse-success.json +9 -0
- package/contracts/v1/fixtures/run-timeout-partial.json +15 -4
- package/contracts/v1/fixtures/stream-in-progress.ndjson +3 -0
- package/contracts/v1/fixtures/stream-submitted-completed.ndjson +1 -1
- package/contracts/v1/fixtures/surface-chat-legacy.json +35 -0
- package/contracts/v1/fixtures/surface-chat-simplified.json +37 -0
- package/contracts/v1/fixtures/surface-sidebar-false-positive.json +29 -0
- package/contracts/v1/fixtures/surface-work-advanced.json +45 -0
- package/contracts/v1/fixtures/surface-work-basic.json +38 -0
- package/contracts/v1/fixtures/workflow-ask-success.json +8 -0
- package/contracts/v1/manifest.json +32 -1
- package/contracts/v1/parity-suite.json +124 -0
- package/contracts/v1/schemas/backend-request.schema.json +15 -0
- package/contracts/v1/schemas/manifest.schema.json +6 -3
- package/contracts/v1/schemas/surface-profile.schema.json +166 -0
- package/dist/codex-chatgpt-control-backend.mjs +3475 -367
- package/dist/codex-chatgpt-control.bundle.mjs +5249 -2102
- package/dist/src/backend/client.d.ts +26 -1
- package/dist/src/backend/client.js +23 -1
- package/dist/src/backend/protocol.d.ts +1 -1
- package/dist/src/backend/protocol.js +10 -0
- package/dist/src/backend/session.js +20 -0
- package/dist/src/browser/attach.d.ts +1 -0
- package/dist/src/browser/attach.js +3 -3
- package/dist/src/browser/downloads.d.ts +1 -1
- package/dist/src/browser/downloads.js +13 -4
- package/dist/src/browser/page-state.js +5 -2
- package/dist/src/client.d.ts +31 -1
- package/dist/src/client.js +69 -14
- package/dist/src/commands/artifacts.js +1 -7
- package/dist/src/commands/configuration.d.ts +15 -0
- package/dist/src/commands/configuration.js +897 -0
- package/dist/src/commands/doctor.js +38 -1
- package/dist/src/commands/experience.d.ts +13 -0
- package/dist/src/commands/experience.js +421 -0
- package/dist/src/commands/files.js +160 -10
- package/dist/src/commands/messages.d.ts +2 -1
- package/dist/src/commands/messages.js +138 -16
- package/dist/src/commands/modes.js +28 -14
- package/dist/src/commands/registry.js +74 -7
- package/dist/src/commands/response-actions.js +1 -7
- package/dist/src/commands/sequence.js +24 -1
- package/dist/src/commands/session.d.ts +2 -0
- package/dist/src/commands/session.js +50 -1
- package/dist/src/commands/threads.js +1 -7
- package/dist/src/commands/work.d.ts +6 -0
- package/dist/src/commands/work.js +338 -0
- package/dist/src/dom/locale/am.d.ts +15 -1
- package/dist/src/dom/locale/am.js +15 -1
- package/dist/src/dom/locale/ar.d.ts +15 -1
- package/dist/src/dom/locale/ar.js +18 -4
- package/dist/src/dom/locale/bg.d.ts +15 -1
- package/dist/src/dom/locale/bg.js +18 -4
- package/dist/src/dom/locale/bn.d.ts +15 -1
- package/dist/src/dom/locale/bn.js +15 -1
- package/dist/src/dom/locale/bs.d.ts +14 -1
- package/dist/src/dom/locale/bs.js +18 -5
- package/dist/src/dom/locale/ca.d.ts +14 -1
- package/dist/src/dom/locale/ca.js +19 -6
- package/dist/src/dom/locale/cs.d.ts +14 -1
- package/dist/src/dom/locale/cs.js +14 -1
- package/dist/src/dom/locale/da.d.ts +14 -1
- package/dist/src/dom/locale/da.js +15 -2
- package/dist/src/dom/locale/de.d.ts +16 -3
- package/dist/src/dom/locale/de.js +18 -5
- package/dist/src/dom/locale/el.d.ts +15 -1
- package/dist/src/dom/locale/el.js +18 -4
- package/dist/src/dom/locale/en.d.ts +27 -2
- package/dist/src/dom/locale/en.js +28 -2
- package/dist/src/dom/locale/es-419.d.ts +15 -1
- package/dist/src/dom/locale/es-419.js +15 -1
- package/dist/src/dom/locale/es-ES.d.ts +15 -1
- package/dist/src/dom/locale/es-ES.js +15 -1
- package/dist/src/dom/locale/et.d.ts +14 -1
- package/dist/src/dom/locale/et.js +14 -1
- package/dist/src/dom/locale/fa.d.ts +14 -1
- package/dist/src/dom/locale/fa.js +16 -3
- package/dist/src/dom/locale/fi.d.ts +15 -1
- package/dist/src/dom/locale/fi.js +15 -1
- package/dist/src/dom/locale/fr-CA.d.ts +13 -1
- package/dist/src/dom/locale/fr-CA.js +13 -1
- package/dist/src/dom/locale/fr-FR.d.ts +16 -3
- package/dist/src/dom/locale/fr-FR.js +20 -7
- package/dist/src/dom/locale/gu.d.ts +15 -1
- package/dist/src/dom/locale/gu.js +19 -5
- package/dist/src/dom/locale/hi.d.ts +15 -1
- package/dist/src/dom/locale/hi.js +17 -3
- package/dist/src/dom/locale/hr.d.ts +14 -1
- package/dist/src/dom/locale/hr.js +17 -4
- package/dist/src/dom/locale/hu.d.ts +15 -1
- package/dist/src/dom/locale/hu.js +18 -4
- package/dist/src/dom/locale/hy.d.ts +15 -1
- package/dist/src/dom/locale/hy.js +18 -4
- package/dist/src/dom/locale/id.d.ts +14 -1
- package/dist/src/dom/locale/id.js +16 -3
- package/dist/src/dom/locale/index.d.ts +17 -2
- package/dist/src/dom/locale/index.js +65 -0
- package/dist/src/dom/locale/is.d.ts +14 -1
- package/dist/src/dom/locale/is.js +14 -1
- package/dist/src/dom/locale/it.d.ts +13 -1
- package/dist/src/dom/locale/it.js +17 -5
- package/dist/src/dom/locale/ja.d.ts +15 -1
- package/dist/src/dom/locale/ja.js +19 -5
- package/dist/src/dom/locale/ka.d.ts +15 -1
- package/dist/src/dom/locale/ka.js +15 -1
- package/dist/src/dom/locale/kk.d.ts +15 -1
- package/dist/src/dom/locale/kk.js +17 -3
- package/dist/src/dom/locale/kn.d.ts +15 -1
- package/dist/src/dom/locale/kn.js +19 -5
- package/dist/src/dom/locale/ko.d.ts +13 -1
- package/dist/src/dom/locale/ko.js +13 -1
- package/dist/src/dom/locale/lt.d.ts +15 -1
- package/dist/src/dom/locale/lt.js +17 -3
- package/dist/src/dom/locale/lv.d.ts +15 -1
- package/dist/src/dom/locale/lv.js +15 -1
- package/dist/src/dom/locale/mk.d.ts +15 -1
- package/dist/src/dom/locale/mk.js +19 -5
- package/dist/src/dom/locale/ml.d.ts +15 -1
- package/dist/src/dom/locale/ml.js +17 -3
- package/dist/src/dom/locale/mn.d.ts +15 -1
- package/dist/src/dom/locale/mn.js +15 -1
- package/dist/src/dom/locale/mr.d.ts +15 -1
- package/dist/src/dom/locale/mr.js +17 -3
- package/dist/src/dom/locale/ms.d.ts +13 -1
- package/dist/src/dom/locale/ms.js +13 -1
- package/dist/src/dom/locale/my.d.ts +15 -1
- package/dist/src/dom/locale/my.js +17 -3
- package/dist/src/dom/locale/nb.d.ts +14 -1
- package/dist/src/dom/locale/nb.js +14 -1
- package/dist/src/dom/locale/nl.d.ts +14 -1
- package/dist/src/dom/locale/nl.js +16 -3
- package/dist/src/dom/locale/pa.d.ts +15 -1
- package/dist/src/dom/locale/pa.js +19 -5
- package/dist/src/dom/locale/pl.d.ts +14 -1
- package/dist/src/dom/locale/pl.js +16 -3
- package/dist/src/dom/locale/pt-BR.d.ts +15 -1
- package/dist/src/dom/locale/pt-BR.js +17 -3
- package/dist/src/dom/locale/pt-PT.d.ts +15 -1
- package/dist/src/dom/locale/pt-PT.js +19 -5
- package/dist/src/dom/locale/ro.d.ts +13 -1
- package/dist/src/dom/locale/ro.js +16 -4
- package/dist/src/dom/locale/ru.d.ts +17 -1
- package/dist/src/dom/locale/ru.js +18 -2
- package/dist/src/dom/locale/sk.d.ts +14 -1
- package/dist/src/dom/locale/sk.js +16 -3
- package/dist/src/dom/locale/sl.d.ts +14 -1
- package/dist/src/dom/locale/sl.js +17 -4
- package/dist/src/dom/locale/so.d.ts +15 -1
- package/dist/src/dom/locale/so.js +17 -3
- package/dist/src/dom/locale/sq.d.ts +13 -1
- package/dist/src/dom/locale/sq.js +17 -5
- package/dist/src/dom/locale/sr.d.ts +17 -1
- package/dist/src/dom/locale/sr.js +18 -2
- package/dist/src/dom/locale/sv.d.ts +14 -1
- package/dist/src/dom/locale/sv.js +14 -1
- package/dist/src/dom/locale/sw.d.ts +15 -1
- package/dist/src/dom/locale/sw.js +15 -1
- package/dist/src/dom/locale/ta.d.ts +15 -1
- package/dist/src/dom/locale/ta.js +19 -5
- package/dist/src/dom/locale/te.d.ts +15 -1
- package/dist/src/dom/locale/te.js +19 -5
- package/dist/src/dom/locale/th.d.ts +7 -1
- package/dist/src/dom/locale/th.js +7 -1
- package/dist/src/dom/locale/tl.d.ts +11 -5
- package/dist/src/dom/locale/tl.js +11 -5
- package/dist/src/dom/locale/tr.d.ts +14 -1
- package/dist/src/dom/locale/tr.js +16 -3
- package/dist/src/dom/locale/types.d.ts +18 -1
- package/dist/src/dom/locale/uk.d.ts +15 -1
- package/dist/src/dom/locale/uk.js +17 -3
- package/dist/src/dom/locale/ur.d.ts +15 -1
- package/dist/src/dom/locale/ur.js +18 -4
- package/dist/src/dom/locale/vi.d.ts +15 -1
- package/dist/src/dom/locale/vi.js +18 -4
- package/dist/src/dom/locale/zh-HK.d.ts +15 -1
- package/dist/src/dom/locale/zh-HK.js +17 -3
- package/dist/src/dom/locale/zh-Hans.d.ts +15 -1
- package/dist/src/dom/locale/zh-Hans.js +19 -5
- package/dist/src/dom/locale/zh-TW.d.ts +15 -1
- package/dist/src/dom/locale/zh-TW.js +17 -3
- package/dist/src/dom/menus.js +26 -2
- package/dist/src/dom/selectors.js +6 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -0
- package/dist/src/platform/local-paths.d.ts +1 -0
- package/dist/src/platform/local-paths.js +7 -3
- package/dist/src/runner/responses.d.ts +3 -1
- package/dist/src/runner/responses.js +16 -1
- package/dist/src/runner/result.js +129 -4
- package/dist/src/runner/stream.d.ts +1 -1
- package/dist/src/runner/stream.js +6 -0
- package/dist/src/runner/types.d.ts +35 -1
- package/dist/src/safety/risk.d.ts +10 -0
- package/dist/src/safety/risk.js +10 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.d.ts +15 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.js +225 -7
- package/dist/src/scripts/capture-intelligence-locales.d.ts +8 -0
- package/dist/src/scripts/capture-intelligence-locales.js +663 -6
- package/dist/src/scripts/capture-surface-profile.d.ts +25 -0
- package/dist/src/scripts/capture-surface-profile.js +354 -0
- package/dist/src/scripts/live-smoke/scenarios.d.ts +2 -0
- package/dist/src/scripts/live-smoke/scenarios.js +347 -5
- package/dist/src/scripts/live-smoke.js +2 -0
- package/dist/src/scripts/locale-capture/surface-graph.d.ts +26 -0
- package/dist/src/scripts/locale-capture/surface-graph.js +43 -0
- package/dist/src/scripts/release-canary-module.d.ts +20 -0
- package/dist/src/scripts/release-canary-module.js +86 -0
- package/dist/src/types.d.ts +248 -2
- package/package.json +9 -3
- package/references/2026-07-16-chat-work-surfaces.md +100 -0
- package/references/agents-runner.md +13 -2
- package/references/backend-protocol.md +26 -9
- package/references/language-coverage.md +51 -3
- package/references/localization.md +52 -6
- package/references/python-parity.md +12 -2
- package/references/responses-adapter.md +12 -1
- package/references/troubleshooting.md +38 -4
|
@@ -6,7 +6,7 @@ import type { ChatGPTResponsesCreateArgs } from "../runner/responses.js";
|
|
|
6
6
|
import type { ChatGPTRunStream } from "../runner/stream.js";
|
|
7
7
|
import type { ChatGPTAgent, ChatGPTAgentConfig, ChatGPTResponse, ChatGPTRunInput, ChatGPTRunResult } from "../runner/types.js";
|
|
8
8
|
import type { ReportRedactionOptions } from "../safety/report-redaction.js";
|
|
9
|
-
import type { ArtifactDownloadArgs, ArtifactWaitArgs, BootstrapArgs, CommandResult, CopyResponseArgs, DownloadLatestArgs, ListArtifactsArgs, NewThreadArgs, OpenThreadArgs, ReadLatestArgs, SearchThreadsArgs, SelectToolArgs, SequencePlan, SetModeArgs, WaitArgs } from "../types.js";
|
|
9
|
+
import type { ArtifactDownloadArgs, ArtifactWaitArgs, ApplyConfigurationData, ApplyConfigurationArgs, BootstrapArgs, ChatGPTExperience, CommandResult, ConfigurationInspectionData, CopyResponseArgs, DetectExperienceArgs, DetectExperienceData, DownloadLatestArgs, GetModeArgs, GetModeData, InspectConfigurationArgs, ListArtifactsArgs, MessageStatusArgs, NewThreadArgs, OpenThreadArgs, OpenExperienceData, ReadLatestArgs, ReadWorkLatestArgs, ReadWorkLatestData, SearchThreadsArgs, SelectToolArgs, SequencePlan, SetModeArgs, StartWorkArgs, StartWorkData, SteerWorkArgs, SteerWorkData, WaitArgs, WorkStatusArgs, WorkStatusData, WorkWaitArgs, WorkWaitData } from "../types.js";
|
|
10
10
|
import { type BackendEvent, type BackendRequest, type BackendResponse } from "./protocol.js";
|
|
11
11
|
export type BackendTransport = {
|
|
12
12
|
request(request: BackendRequest): Promise<BackendResponse>;
|
|
@@ -60,6 +60,29 @@ export type ChatGPTBackendClient = {
|
|
|
60
60
|
session: {
|
|
61
61
|
bootstrap(args?: BootstrapArgs): Promise<CommandResult<unknown>>;
|
|
62
62
|
};
|
|
63
|
+
experience: {
|
|
64
|
+
detect(args?: DetectExperienceArgs): Promise<CommandResult<DetectExperienceData>>;
|
|
65
|
+
open(args: {
|
|
66
|
+
experience: Exclude<ChatGPTExperience, "unknown">;
|
|
67
|
+
timeoutMs?: number;
|
|
68
|
+
}): Promise<CommandResult<OpenExperienceData>>;
|
|
69
|
+
};
|
|
70
|
+
configuration: {
|
|
71
|
+
inspect(args?: InspectConfigurationArgs): Promise<CommandResult<ConfigurationInspectionData>>;
|
|
72
|
+
apply(args: ApplyConfigurationArgs): Promise<CommandResult<ApplyConfigurationData>>;
|
|
73
|
+
};
|
|
74
|
+
work: {
|
|
75
|
+
start(args: StartWorkArgs): Promise<CommandResult<StartWorkData>>;
|
|
76
|
+
status(args?: WorkStatusArgs): Promise<CommandResult<WorkStatusData>>;
|
|
77
|
+
wait(args?: WorkWaitArgs): Promise<CommandResult<WorkWaitData>>;
|
|
78
|
+
steer(args: SteerWorkArgs): Promise<CommandResult<SteerWorkData>>;
|
|
79
|
+
readLatest(args?: ReadWorkLatestArgs): Promise<CommandResult<ReadWorkLatestData>>;
|
|
80
|
+
artifacts: {
|
|
81
|
+
listLatest(args?: ListArtifactsArgs): Promise<CommandResult<unknown>>;
|
|
82
|
+
wait(args?: ArtifactWaitArgs): Promise<CommandResult<unknown>>;
|
|
83
|
+
downloadLatest(args: ArtifactDownloadArgs): Promise<CommandResult<unknown>>;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
63
86
|
threads: {
|
|
64
87
|
"new"(args?: NewThreadArgs): Promise<CommandResult<unknown>>;
|
|
65
88
|
search(args: SearchThreadsArgs): Promise<CommandResult<unknown>>;
|
|
@@ -84,6 +107,7 @@ export type ChatGPTBackendClient = {
|
|
|
84
107
|
}): Promise<CommandResult<unknown>>;
|
|
85
108
|
wait(args?: WaitArgs): Promise<CommandResult<unknown>>;
|
|
86
109
|
readLatest(args?: ReadLatestArgs): Promise<CommandResult<unknown>>;
|
|
110
|
+
status(args?: MessageStatusArgs): Promise<CommandResult<unknown>>;
|
|
87
111
|
waitAndRead(args?: WaitArgs & ReadLatestArgs): Promise<CommandResult<unknown>>;
|
|
88
112
|
};
|
|
89
113
|
files: {
|
|
@@ -95,6 +119,7 @@ export type ChatGPTBackendClient = {
|
|
|
95
119
|
};
|
|
96
120
|
modes: {
|
|
97
121
|
set(args: SetModeArgs): Promise<CommandResult<unknown>>;
|
|
122
|
+
get(args?: GetModeArgs): Promise<CommandResult<GetModeData>>;
|
|
98
123
|
};
|
|
99
124
|
tools: {
|
|
100
125
|
select(args: SelectToolArgs): Promise<CommandResult<unknown>>;
|
|
@@ -63,6 +63,26 @@ export function createChatGPTBackendClient(transport) {
|
|
|
63
63
|
session: {
|
|
64
64
|
bootstrap: args => request("session.bootstrap", args ?? {})
|
|
65
65
|
},
|
|
66
|
+
experience: {
|
|
67
|
+
detect: args => request("experience.detect", args ?? {}),
|
|
68
|
+
open: args => request("experience.open", args)
|
|
69
|
+
},
|
|
70
|
+
configuration: {
|
|
71
|
+
inspect: args => request("configuration.inspect", args ?? {}),
|
|
72
|
+
apply: args => request("configuration.apply", args)
|
|
73
|
+
},
|
|
74
|
+
work: {
|
|
75
|
+
start: args => request("work.start", args),
|
|
76
|
+
status: args => request("work.status", args ?? {}),
|
|
77
|
+
wait: args => request("work.wait", args ?? {}),
|
|
78
|
+
steer: args => request("work.steer", args),
|
|
79
|
+
readLatest: args => request("work.readLatest", args ?? {}),
|
|
80
|
+
artifacts: {
|
|
81
|
+
listLatest: args => request("artifacts.listLatest", args ?? {}),
|
|
82
|
+
wait: args => request("artifacts.wait", args ?? {}),
|
|
83
|
+
downloadLatest: args => request("artifacts.downloadLatest", args)
|
|
84
|
+
}
|
|
85
|
+
},
|
|
66
86
|
threads: {
|
|
67
87
|
new: args => request("threads.new", args ?? {}),
|
|
68
88
|
search: args => request("threads.search", args),
|
|
@@ -74,6 +94,7 @@ export function createChatGPTBackendClient(transport) {
|
|
|
74
94
|
ask: args => request("messages.ask", args),
|
|
75
95
|
wait: args => request("messages.wait", args ?? {}),
|
|
76
96
|
readLatest: args => request("messages.readLatest", args ?? {}),
|
|
97
|
+
status: args => request("messages.status", args ?? {}),
|
|
77
98
|
waitAndRead: args => request("messages.waitAndRead", args)
|
|
78
99
|
},
|
|
79
100
|
artifacts: {
|
|
@@ -86,7 +107,8 @@ export function createChatGPTBackendClient(transport) {
|
|
|
86
107
|
downloadLatest: args => request("files.downloadLatest", args)
|
|
87
108
|
},
|
|
88
109
|
modes: {
|
|
89
|
-
set: args => request("modes.set", args)
|
|
110
|
+
set: args => request("modes.set", args),
|
|
111
|
+
get: args => request("modes.get", args ?? {})
|
|
90
112
|
},
|
|
91
113
|
tools: {
|
|
92
114
|
select: args => request("tools.select", args)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const BACKEND_REQUEST_SCHEMA_VERSION: "chatgpt.browser_control.backend_request.v1";
|
|
2
2
|
export declare const BACKEND_RESPONSE_SCHEMA_VERSION: "chatgpt.browser_control.backend_response.v1";
|
|
3
3
|
export declare const BACKEND_EVENT_SCHEMA_VERSION: "chatgpt.browser_control.backend_event.v1";
|
|
4
|
-
export declare const backendCommands: readonly ["backend.version", "backend.health", "backend.capabilities", "runner.run", "runner.plan", "runner.stream", "responses.create", "ask", "askInThread", "askWithFiles", "askAndDownload", "runMessages", "openThread", "readLatest", "copyLatest", "downloadLatest", "runPlan", "doctor", "createReport", "reports.create", "reports.redact", "reports.summarize", "commands", "describe", "help", "session.bootstrap", "threads.new", "threads.search", "threads.open", "messages.compose", "messages.submit", "messages.ask", "messages.wait", "messages.readLatest", "messages.waitAndRead", "artifacts.listLatest", "artifacts.wait", "artifacts.downloadLatest", "files.preflight", "files.attach", "files.downloadLatest", "projects.sources.list", "projects.sources.planAdd", "projects.sources.add", "modes.set", "modes.get", "tools.select", "response.copy"];
|
|
4
|
+
export declare const backendCommands: readonly ["backend.version", "backend.health", "backend.capabilities", "runner.run", "runner.plan", "runner.stream", "responses.create", "ask", "askInThread", "askWithFiles", "askAndDownload", "runMessages", "openThread", "readLatest", "copyLatest", "downloadLatest", "runPlan", "doctor", "createReport", "reports.create", "reports.redact", "reports.summarize", "commands", "describe", "help", "session.bootstrap", "experience.detect", "experience.open", "configuration.inspect", "configuration.apply", "work.start", "work.status", "work.wait", "work.steer", "work.readLatest", "threads.new", "threads.search", "threads.open", "messages.compose", "messages.submit", "messages.ask", "messages.wait", "messages.readLatest", "messages.status", "messages.waitAndRead", "artifacts.listLatest", "artifacts.wait", "artifacts.downloadLatest", "files.preflight", "files.attach", "files.downloadLatest", "projects.sources.list", "projects.sources.planAdd", "projects.sources.add", "modes.set", "modes.get", "tools.select", "response.copy"];
|
|
5
5
|
export type BackendCommand = typeof backendCommands[number];
|
|
6
6
|
export type BackendRequest = {
|
|
7
7
|
schemaVersion: typeof BACKEND_REQUEST_SCHEMA_VERSION;
|
|
@@ -28,6 +28,15 @@ export const backendCommands = [
|
|
|
28
28
|
"describe",
|
|
29
29
|
"help",
|
|
30
30
|
"session.bootstrap",
|
|
31
|
+
"experience.detect",
|
|
32
|
+
"experience.open",
|
|
33
|
+
"configuration.inspect",
|
|
34
|
+
"configuration.apply",
|
|
35
|
+
"work.start",
|
|
36
|
+
"work.status",
|
|
37
|
+
"work.wait",
|
|
38
|
+
"work.steer",
|
|
39
|
+
"work.readLatest",
|
|
31
40
|
"threads.new",
|
|
32
41
|
"threads.search",
|
|
33
42
|
"threads.open",
|
|
@@ -36,6 +45,7 @@ export const backendCommands = [
|
|
|
36
45
|
"messages.ask",
|
|
37
46
|
"messages.wait",
|
|
38
47
|
"messages.readLatest",
|
|
48
|
+
"messages.status",
|
|
39
49
|
"messages.waitAndRead",
|
|
40
50
|
"artifacts.listLatest",
|
|
41
51
|
"artifacts.wait",
|
|
@@ -123,6 +123,24 @@ async function dispatchBackendCommand(client, request) {
|
|
|
123
123
|
return client.reports.summarize(requiredRecord(payload, "result"), optionalRecord(payload, "args"));
|
|
124
124
|
case "session.bootstrap":
|
|
125
125
|
return client.session.bootstrap(emptyToUndefined(payload));
|
|
126
|
+
case "experience.detect":
|
|
127
|
+
return client.experience.detect(emptyToUndefined(payload));
|
|
128
|
+
case "experience.open":
|
|
129
|
+
return client.experience.open(payload);
|
|
130
|
+
case "configuration.inspect":
|
|
131
|
+
return client.configuration.inspect(emptyToUndefined(payload));
|
|
132
|
+
case "configuration.apply":
|
|
133
|
+
return client.configuration.apply(payload);
|
|
134
|
+
case "work.start":
|
|
135
|
+
return client.work.start(payload);
|
|
136
|
+
case "work.status":
|
|
137
|
+
return client.work.status(emptyToUndefined(payload));
|
|
138
|
+
case "work.wait":
|
|
139
|
+
return client.work.wait(emptyToUndefined(payload));
|
|
140
|
+
case "work.steer":
|
|
141
|
+
return client.work.steer(payload);
|
|
142
|
+
case "work.readLatest":
|
|
143
|
+
return client.work.readLatest(emptyToUndefined(payload));
|
|
126
144
|
case "threads.new":
|
|
127
145
|
return client.threads.new(emptyToUndefined(payload));
|
|
128
146
|
case "threads.search":
|
|
@@ -139,6 +157,8 @@ async function dispatchBackendCommand(client, request) {
|
|
|
139
157
|
return client.messages.wait(emptyToUndefined(payload));
|
|
140
158
|
case "messages.readLatest":
|
|
141
159
|
return client.messages.readLatest(emptyToUndefined(payload));
|
|
160
|
+
case "messages.status":
|
|
161
|
+
return client.messages.status(emptyToUndefined(payload));
|
|
142
162
|
case "messages.waitAndRead":
|
|
143
163
|
return client.messages.waitAndRead(payload);
|
|
144
164
|
case "artifacts.listLatest":
|
|
@@ -16,7 +16,7 @@ export async function attachChatGPTBrowser(env, args = {}) {
|
|
|
16
16
|
page,
|
|
17
17
|
browserName: browser.name ?? "chrome"
|
|
18
18
|
};
|
|
19
|
-
const tabId =
|
|
19
|
+
const tabId = tabIdFromPage(page);
|
|
20
20
|
if (tabId !== undefined) {
|
|
21
21
|
attached.tabId = tabId;
|
|
22
22
|
}
|
|
@@ -332,7 +332,7 @@ function mismatchReasonForNoMatches(policy, tabs, chatgptTabs) {
|
|
|
332
332
|
async function pageMatchesExistingTarget(page, policy) {
|
|
333
333
|
const url = await Promise.resolve(page.url?.()).catch(() => undefined);
|
|
334
334
|
const title = await Promise.resolve(page.title?.()).catch(() => undefined);
|
|
335
|
-
const tab = { id:
|
|
335
|
+
const tab = { id: tabIdFromPage(page) ?? "" };
|
|
336
336
|
if (url !== undefined)
|
|
337
337
|
tab.url = url;
|
|
338
338
|
if (title !== undefined)
|
|
@@ -557,7 +557,7 @@ function normalizePage(pageOrTab) {
|
|
|
557
557
|
}
|
|
558
558
|
return pageOrTab;
|
|
559
559
|
}
|
|
560
|
-
function
|
|
560
|
+
export function tabIdFromPage(page) {
|
|
561
561
|
const maybe = page;
|
|
562
562
|
const id = maybe.id ?? maybe.tabId;
|
|
563
563
|
return typeof id === "string" ? id : undefined;
|
|
@@ -4,4 +4,4 @@ export type DownloadLike = {
|
|
|
4
4
|
saveAs?: (path: string) => Promise<void>;
|
|
5
5
|
path?: () => Promise<string | null>;
|
|
6
6
|
};
|
|
7
|
-
export declare function waitForDownloadFromClick(page: PageLike, click: () => Promise<void>, destDir: string, timeoutMs: number): Promise<DownloadedFile>;
|
|
7
|
+
export declare function waitForDownloadFromClick(page: PageLike, click: () => Promise<void>, destDir: string, timeoutMs: number, filenameHint?: string): Promise<DownloadedFile>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { mkdir, stat } from "node:fs/promises";
|
|
1
|
+
import { copyFile, mkdir, stat } from "node:fs/promises";
|
|
2
2
|
import { basename, join, resolve } from "node:path";
|
|
3
3
|
import { localGuardTimeout, withTimeout } from "../commands/timeouts.js";
|
|
4
|
-
export async function waitForDownloadFromClick(page, click, destDir, timeoutMs) {
|
|
4
|
+
export async function waitForDownloadFromClick(page, click, destDir, timeoutMs, filenameHint) {
|
|
5
5
|
const absoluteDest = resolve(destDir);
|
|
6
6
|
await mkdir(absoluteDest, { recursive: true });
|
|
7
7
|
const downloadPromise = page.waitForEvent?.("download", { timeout: timeoutMs, timeoutMs });
|
|
@@ -10,13 +10,22 @@ export async function waitForDownloadFromClick(page, click, destDir, timeoutMs)
|
|
|
10
10
|
}
|
|
11
11
|
await withTimeout(click(), localGuardTimeout(timeoutMs, 10000), "Download control click did not complete before the local guard timeout.");
|
|
12
12
|
const download = await downloadPromise;
|
|
13
|
-
const
|
|
13
|
+
const sourcePath = typeof download.path === "function" ? await download.path() : null;
|
|
14
|
+
const suggestedFilename = filenameHint
|
|
15
|
+
?? download.suggestedFilename?.()
|
|
16
|
+
?? (sourcePath === null ? undefined : basename(sourcePath))
|
|
17
|
+
?? `chatgpt-download-${Date.now()}`;
|
|
14
18
|
const targetPath = join(absoluteDest, basename(suggestedFilename));
|
|
15
19
|
if (typeof download.saveAs === "function") {
|
|
16
20
|
await download.saveAs(targetPath);
|
|
17
21
|
}
|
|
22
|
+
else if (sourcePath !== null) {
|
|
23
|
+
if (resolve(sourcePath) !== resolve(targetPath)) {
|
|
24
|
+
await copyFile(sourcePath, targetPath);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
18
27
|
else {
|
|
19
|
-
throw new Error("The browser download object
|
|
28
|
+
throw new Error("The browser download object exposes neither saveAs() nor a completed local path().");
|
|
20
29
|
}
|
|
21
30
|
const saved = await stat(targetPath);
|
|
22
31
|
if (saved.size <= 0) {
|
|
@@ -22,8 +22,11 @@ export async function readPageState(page) {
|
|
|
22
22
|
const rawTitle = typeof page.title === "function" ? await page.title().catch(() => undefined) : undefined;
|
|
23
23
|
const title = typeof rawTitle === "string" ? rawTitle : undefined;
|
|
24
24
|
const visibleText = await readVisibleText(page);
|
|
25
|
-
const
|
|
26
|
-
const
|
|
25
|
+
const signedIn = isLikelySignedIn(visibleText);
|
|
26
|
+
const classifiedBlocker = classifyVisibleText(visibleText);
|
|
27
|
+
const blocker = classifiedBlocker?.kind === "login_required" && signedIn
|
|
28
|
+
? undefined
|
|
29
|
+
: classifiedBlocker;
|
|
27
30
|
const conversationId = parseConversationId(url);
|
|
28
31
|
const state = {
|
|
29
32
|
url,
|
package/dist/src/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AskArgs, ArtifactDownloadArgs, ArtifactWaitArgs, AttachFilesArgs, BootstrapArgs, CommandResult, CopyResponseArgs, DownloadLatestArgs, FilePreflightArgs, FilePreflightData, GetModeArgs, GetModeData, ListArtifactsArgs, NewThreadArgs, OpenThreadArgs, ProjectSourcesAddArgs, ProjectSourcesAddData, ProjectSourcesAddPlanData, ProjectSourcesListArgs, ProjectSourcesListData, ProjectSourcesPlanAddArgs, ReadLatestArgs, RuntimeEnv, SearchThreadsArgs, SelectToolArgs, SequencePlan, SetModeArgs, ThreadTarget, WaitArgs } from "./types.js";
|
|
1
|
+
import type { AskArgs, ArtifactDownloadArgs, ArtifactWaitArgs, ApplyConfigurationData, ApplyConfigurationArgs, AttachFilesArgs, BootstrapArgs, ChatGPTExperience, CommandResult, ConfigurationInspectionData, ConfigurationSelection, CopyResponseArgs, DetectExperienceArgs, DetectExperienceData, DownloadLatestArgs, FilePreflightArgs, FilePreflightData, GetModeArgs, GetModeData, InspectConfigurationArgs, ListArtifactsArgs, MessageStatusArgs, NewThreadArgs, OpenThreadArgs, OpenExperienceData, ProjectSourcesAddArgs, ProjectSourcesAddData, ProjectSourcesAddPlanData, ProjectSourcesListArgs, ProjectSourcesListData, ProjectSourcesPlanAddArgs, ReadLatestArgs, RuntimeEnv, ReadWorkLatestArgs, ReadWorkLatestData, SearchThreadsArgs, SelectToolArgs, SequencePlan, SetModeArgs, StartWorkArgs, StartWorkData, SteerWorkArgs, SteerWorkData, ThreadTarget, WaitArgs, WorkStatusArgs, WorkStatusData, WorkWaitArgs, WorkWaitData } from "./types.js";
|
|
2
2
|
import { type DoctorArgs, type DoctorReport } from "./commands/doctor.js";
|
|
3
3
|
import { type RunReportData, type RunReportOptions } from "./commands/reports.js";
|
|
4
4
|
import { type CommandDescriptor } from "./commands/registry.js";
|
|
@@ -8,6 +8,8 @@ import { type ReportRedactionOptions } from "./safety/report-redaction.js";
|
|
|
8
8
|
import { type BlockerExplanation, type ExplainBlockerOptions } from "./diagnostics/blockers.js";
|
|
9
9
|
export type ChatGPTClientOptions = RuntimeEnv & {
|
|
10
10
|
defaults?: {
|
|
11
|
+
experience?: Exclude<ChatGPTExperience, "unknown">;
|
|
12
|
+
configuration?: ConfigurationSelection;
|
|
11
13
|
mode?: SetModeArgs;
|
|
12
14
|
wait?: boolean | WaitArgs;
|
|
13
15
|
read?: boolean | ReadLatestArgs;
|
|
@@ -59,6 +61,8 @@ export type AskWorkflowArgs = {
|
|
|
59
61
|
thread?: WorkflowThread;
|
|
60
62
|
existingTab?: BootstrapArgs["existingTab"];
|
|
61
63
|
preferExistingTab?: boolean;
|
|
64
|
+
experience?: Exclude<ChatGPTExperience, "unknown">;
|
|
65
|
+
configuration?: ConfigurationSelection;
|
|
62
66
|
mode?: SetModeArgs;
|
|
63
67
|
tools?: SelectToolArgs[];
|
|
64
68
|
files?: FileInput[];
|
|
@@ -83,6 +87,8 @@ export type RunMessagesArgs = {
|
|
|
83
87
|
thread?: WorkflowThread;
|
|
84
88
|
existingTab?: BootstrapArgs["existingTab"];
|
|
85
89
|
preferExistingTab?: boolean;
|
|
90
|
+
experience?: Exclude<ChatGPTExperience, "unknown">;
|
|
91
|
+
configuration?: ConfigurationSelection;
|
|
86
92
|
mode?: SetModeArgs;
|
|
87
93
|
messages: Array<{
|
|
88
94
|
id?: string;
|
|
@@ -136,6 +142,29 @@ export type ChatGPTClient = {
|
|
|
136
142
|
session: {
|
|
137
143
|
bootstrap(args?: BootstrapArgs): Promise<CommandResult<unknown>>;
|
|
138
144
|
};
|
|
145
|
+
experience: {
|
|
146
|
+
detect(args?: DetectExperienceArgs): Promise<CommandResult<DetectExperienceData>>;
|
|
147
|
+
open(args: {
|
|
148
|
+
experience: Exclude<ChatGPTExperience, "unknown">;
|
|
149
|
+
timeoutMs?: number;
|
|
150
|
+
}): Promise<CommandResult<OpenExperienceData>>;
|
|
151
|
+
};
|
|
152
|
+
configuration: {
|
|
153
|
+
inspect(args?: InspectConfigurationArgs): Promise<CommandResult<ConfigurationInspectionData>>;
|
|
154
|
+
apply(args: ApplyConfigurationArgs): Promise<CommandResult<ApplyConfigurationData>>;
|
|
155
|
+
};
|
|
156
|
+
work: {
|
|
157
|
+
start(args: StartWorkArgs): Promise<CommandResult<StartWorkData>>;
|
|
158
|
+
status(args?: WorkStatusArgs): Promise<CommandResult<WorkStatusData>>;
|
|
159
|
+
wait(args?: WorkWaitArgs): Promise<CommandResult<WorkWaitData>>;
|
|
160
|
+
steer(args: SteerWorkArgs): Promise<CommandResult<SteerWorkData>>;
|
|
161
|
+
readLatest(args?: ReadWorkLatestArgs): Promise<CommandResult<ReadWorkLatestData>>;
|
|
162
|
+
artifacts: {
|
|
163
|
+
listLatest(args?: ListArtifactsArgs): Promise<CommandResult<unknown>>;
|
|
164
|
+
wait(args?: ArtifactWaitArgs): Promise<CommandResult<unknown>>;
|
|
165
|
+
downloadLatest(args: ArtifactDownloadArgs): Promise<CommandResult<unknown>>;
|
|
166
|
+
};
|
|
167
|
+
};
|
|
139
168
|
threads: {
|
|
140
169
|
"new"(args?: NewThreadArgs): Promise<CommandResult<unknown>>;
|
|
141
170
|
search(args: SearchThreadsArgs): Promise<CommandResult<unknown>>;
|
|
@@ -155,6 +184,7 @@ export type ChatGPTClient = {
|
|
|
155
184
|
ask(args: AskArgs): Promise<CommandResult<unknown>>;
|
|
156
185
|
wait(args?: WaitArgs): Promise<CommandResult<unknown>>;
|
|
157
186
|
readLatest(args?: ReadLatestArgs): Promise<CommandResult<unknown>>;
|
|
187
|
+
status(args?: MessageStatusArgs): Promise<CommandResult<unknown>>;
|
|
158
188
|
waitAndRead(args?: WaitArgs & ReadLatestArgs): Promise<CommandResult<unknown>>;
|
|
159
189
|
};
|
|
160
190
|
files: {
|
package/dist/src/client.js
CHANGED
|
@@ -2,14 +2,17 @@ import { downloadLatestArtifact, listLatestArtifacts, waitForArtifact } from "./
|
|
|
2
2
|
import { attachFiles, downloadLatestFile, preflightFiles } from "./commands/files.js";
|
|
3
3
|
import { addProjectSources, buildProjectSourceAddPlan, listProjectSources } from "./commands/project-sources.js";
|
|
4
4
|
import { doctor } from "./commands/doctor.js";
|
|
5
|
-
import { askMessage, composeMessage, readLatest, submitMessage, waitAndRead, waitForMessage } from "./commands/messages.js";
|
|
5
|
+
import { askMessage, composeMessage, messageStatus, readLatest, submitMessage, waitAndRead, waitForMessage } from "./commands/messages.js";
|
|
6
6
|
import { getMode, selectTool, setMode } from "./commands/modes.js";
|
|
7
|
+
import { applyConfiguration, inspectConfiguration } from "./commands/configuration.js";
|
|
8
|
+
import { detectExperience, openExperience } from "./commands/experience.js";
|
|
7
9
|
import { createRunReport } from "./commands/reports.js";
|
|
8
10
|
import { copyResponse } from "./commands/response-actions.js";
|
|
9
11
|
import { commandDescriptors, describeCommand, helpText } from "./commands/registry.js";
|
|
10
12
|
import { runSequence } from "./commands/sequence.js";
|
|
11
13
|
import { bootstrap } from "./commands/session.js";
|
|
12
14
|
import { newThread, openThread, searchThreads } from "./commands/threads.js";
|
|
15
|
+
import { readLatestWork, startWork, steerWork, waitForWork, workStatus } from "./commands/work.js";
|
|
13
16
|
import { resultError, resultOk } from "./errors.js";
|
|
14
17
|
import { createChatGPTAgent } from "./runner/agent.js";
|
|
15
18
|
import { toRunResult } from "./runner/result.js";
|
|
@@ -60,6 +63,26 @@ export function createChatGPT(options = {}) {
|
|
|
60
63
|
session: {
|
|
61
64
|
bootstrap: args => bootstrap(env, args)
|
|
62
65
|
},
|
|
66
|
+
experience: {
|
|
67
|
+
detect: args => detectExperience(env, args),
|
|
68
|
+
open: args => openExperience(env, args)
|
|
69
|
+
},
|
|
70
|
+
configuration: {
|
|
71
|
+
inspect: args => inspectConfiguration(env, args),
|
|
72
|
+
apply: args => applyConfiguration(env, args)
|
|
73
|
+
},
|
|
74
|
+
work: {
|
|
75
|
+
start: args => startWork(env, args),
|
|
76
|
+
status: args => workStatus(env, args),
|
|
77
|
+
wait: args => waitForWork(env, args),
|
|
78
|
+
steer: args => steerWork(env, args),
|
|
79
|
+
readLatest: args => readLatestWork(env, args),
|
|
80
|
+
artifacts: {
|
|
81
|
+
listLatest: args => listLatestArtifacts(env, args),
|
|
82
|
+
wait: args => waitForArtifact(env, args),
|
|
83
|
+
downloadLatest: args => downloadLatestArtifact(env, args)
|
|
84
|
+
}
|
|
85
|
+
},
|
|
63
86
|
threads: {
|
|
64
87
|
new: args => newThread(env, args),
|
|
65
88
|
search: args => searchThreads(env, args),
|
|
@@ -71,6 +94,7 @@ export function createChatGPT(options = {}) {
|
|
|
71
94
|
ask: args => askMessage(env, args),
|
|
72
95
|
wait: args => waitForMessage(env, args),
|
|
73
96
|
readLatest: args => readLatest(env, args),
|
|
97
|
+
status: args => messageStatus(env, args),
|
|
74
98
|
waitAndRead: args => waitAndRead(env, args)
|
|
75
99
|
},
|
|
76
100
|
files: {
|
|
@@ -166,6 +190,30 @@ function pathsFromAttachStep(step) {
|
|
|
166
190
|
const paths = step.args.paths;
|
|
167
191
|
return paths.every(item => typeof item === "string") ? paths : [];
|
|
168
192
|
}
|
|
193
|
+
function appendSurfaceConfigurationSteps(steps, preferences) {
|
|
194
|
+
if (preferences.experience !== undefined) {
|
|
195
|
+
steps.push({
|
|
196
|
+
id: "experience",
|
|
197
|
+
command: "experience.open",
|
|
198
|
+
args: { experience: preferences.experience }
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (preferences.configuration !== undefined) {
|
|
202
|
+
steps.push({
|
|
203
|
+
id: "configuration",
|
|
204
|
+
command: "configuration.apply",
|
|
205
|
+
args: {
|
|
206
|
+
...(preferences.experience === undefined ? {} : { experience: preferences.experience }),
|
|
207
|
+
desired: preferences.configuration,
|
|
208
|
+
strict: true
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (preferences.mode !== undefined) {
|
|
214
|
+
steps.push({ id: "mode", command: "modes.set", args: preferences.mode });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
169
217
|
function normalizeLimits(limits) {
|
|
170
218
|
return {
|
|
171
219
|
maxPromptsPerRun: limits?.maxPromptsPerRun ?? 5,
|
|
@@ -178,7 +226,7 @@ function normalizeLimits(limits) {
|
|
|
178
226
|
function checkRunBudget(plan, limits) {
|
|
179
227
|
const prompts = plan.steps.filter(step => step.command === "messages.ask" || step.command === "messages.submit").length;
|
|
180
228
|
const threads = plan.steps.filter(step => step.command === "threads.new" || step.command === "threads.open").length;
|
|
181
|
-
const reads = plan.steps.filter(step => step.command === "messages.readLatest" || step.command === "messages.waitAndRead" || step.command === "response.copy").length
|
|
229
|
+
const reads = plan.steps.filter(step => step.command === "messages.readLatest" || step.command === "messages.status" || step.command === "messages.waitAndRead" || step.command === "response.copy").length
|
|
182
230
|
+ plan.steps.filter(step => step.command === "messages.ask" && askStepReads(step.args)).length;
|
|
183
231
|
const violations = [];
|
|
184
232
|
if (prompts > limits.maxPromptsPerRun)
|
|
@@ -270,10 +318,11 @@ function planAgentWorkflowFromNormalized(agent, input, defaults = {}) {
|
|
|
270
318
|
bootstrapStepForWorkflow(thread, input.existingTab ?? agent.defaults.existingTab ?? defaults.existingTab, input.preferExistingTab ?? agent.defaults.preferExistingTab ?? defaults.preferExistingTab),
|
|
271
319
|
...threadSteps(thread)
|
|
272
320
|
];
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
321
|
+
appendSurfaceConfigurationSteps(steps, {
|
|
322
|
+
experience: input.experience ?? agent.defaults.experience ?? defaults.experience,
|
|
323
|
+
configuration: input.configuration ?? agent.defaults.configuration ?? defaults.configuration,
|
|
324
|
+
mode: input.mode ?? agent.defaults.mode ?? defaults.mode
|
|
325
|
+
});
|
|
277
326
|
for (const [index, tool] of input.tools.entries()) {
|
|
278
327
|
steps.push({ id: `tool${index + 1}`, command: "tools.select", args: tool });
|
|
279
328
|
}
|
|
@@ -338,6 +387,10 @@ function normalizeRunnerInput(agent, input) {
|
|
|
338
387
|
normalized.existingTab = args.existingTab;
|
|
339
388
|
if (args.preferExistingTab !== undefined)
|
|
340
389
|
normalized.preferExistingTab = args.preferExistingTab;
|
|
390
|
+
if (args.experience !== undefined)
|
|
391
|
+
normalized.experience = args.experience;
|
|
392
|
+
if (args.configuration !== undefined)
|
|
393
|
+
normalized.configuration = args.configuration;
|
|
341
394
|
if (mode !== undefined)
|
|
342
395
|
normalized.mode = mode;
|
|
343
396
|
if (args.response !== undefined)
|
|
@@ -458,10 +511,11 @@ function planAskWorkflow(args, defaults = {}) {
|
|
|
458
511
|
bootstrapStepForWorkflow(thread, args.existingTab ?? defaults.existingTab, args.preferExistingTab ?? defaults.preferExistingTab),
|
|
459
512
|
...threadSteps(thread)
|
|
460
513
|
];
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
514
|
+
appendSurfaceConfigurationSteps(steps, {
|
|
515
|
+
experience: args.experience ?? defaults.experience,
|
|
516
|
+
configuration: args.configuration ?? defaults.configuration,
|
|
517
|
+
mode: args.mode ?? defaults.mode
|
|
518
|
+
});
|
|
465
519
|
for (const [index, tool] of (args.tools ?? []).entries()) {
|
|
466
520
|
steps.push({ id: `tool${index + 1}`, command: "tools.select", args: tool });
|
|
467
521
|
}
|
|
@@ -529,10 +583,11 @@ function planRunMessages(args, defaults = {}) {
|
|
|
529
583
|
bootstrapStepForWorkflow(thread, args.existingTab ?? defaults.existingTab, args.preferExistingTab ?? defaults.preferExistingTab),
|
|
530
584
|
...threadSteps(thread)
|
|
531
585
|
];
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
586
|
+
appendSurfaceConfigurationSteps(steps, {
|
|
587
|
+
experience: args.experience ?? defaults.experience,
|
|
588
|
+
configuration: args.configuration ?? defaults.configuration,
|
|
589
|
+
mode: args.mode ?? defaults.mode
|
|
590
|
+
});
|
|
536
591
|
args.messages.forEach((message, index) => {
|
|
537
592
|
steps.push({
|
|
538
593
|
id: message.id ?? `message${index + 1}`,
|
|
@@ -7,7 +7,7 @@ import { cssSelectors, requiredLocator } from "../dom/selectors.js";
|
|
|
7
7
|
import { localeLabels } from "../dom/locale-labels.js";
|
|
8
8
|
import { resultOk } from "../errors.js";
|
|
9
9
|
import { contextFromPage } from "./context.js";
|
|
10
|
-
import {
|
|
10
|
+
import { ensurePage } from "./session.js";
|
|
11
11
|
import { localGuardTimeout, withTimeout } from "./timeouts.js";
|
|
12
12
|
export async function listLatestArtifacts(env, args = {}) {
|
|
13
13
|
const boot = await ensurePage(env);
|
|
@@ -408,12 +408,6 @@ function artifactDownloadBlocker(error, context) {
|
|
|
408
408
|
context
|
|
409
409
|
};
|
|
410
410
|
}
|
|
411
|
-
async function ensurePage(env) {
|
|
412
|
-
if (env.page !== undefined) {
|
|
413
|
-
return resultOk({}, await contextFromPage(env.page));
|
|
414
|
-
}
|
|
415
|
-
return bootstrap(env, { preferExistingTab: true });
|
|
416
|
-
}
|
|
417
411
|
async function hasStopControl(page, timeoutMs) {
|
|
418
412
|
if (typeof page.evaluate !== "function")
|
|
419
413
|
return false;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type MenuItem } from "../dom/menus.js";
|
|
2
|
+
import type { ApplyConfigurationArgs, ApplyConfigurationData, ChatGPTExperience, CommandResult, ConfigurationAxis, ConfigurationInspectionData, ConfigurationSelection, InspectConfigurationArgs, RuntimeEnv, SurfaceSelectorProfile } from "../types.js";
|
|
3
|
+
export type ConfigurationPanelSnapshot = {
|
|
4
|
+
openerLabel?: string;
|
|
5
|
+
axisRows: Array<{
|
|
6
|
+
axis: ConfigurationAxis;
|
|
7
|
+
label: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
}>;
|
|
10
|
+
advancedVisible: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function inspectConfiguration(env: RuntimeEnv, args?: InspectConfigurationArgs): Promise<CommandResult<ConfigurationInspectionData>>;
|
|
13
|
+
export declare function applyConfiguration(env: RuntimeEnv, args: ApplyConfigurationArgs): Promise<CommandResult<ApplyConfigurationData>>;
|
|
14
|
+
export declare function configurationInspectionFromSurface(experience: ChatGPTExperience, detectedProfile: SurfaceSelectorProfile, evidence: ConfigurationInspectionData["evidence"], panel: ConfigurationPanelSnapshot, menuItems: MenuItem[]): ConfigurationInspectionData;
|
|
15
|
+
export declare function configurationMatchesSelection(inspection: ConfigurationInspectionData, desired: ConfigurationSelection): boolean;
|