@youdie006/prodex 0.5.0 → 0.6.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.
@@ -0,0 +1,22 @@
1
+ import type { CliIO } from "./cli.js";
2
+ import type { BridgeFile, Receipt } from "./schema.js";
3
+ import { BridgeStore, type ListReceiptsInput } from "./store.js";
4
+ export declare function runTasksCommand(rest: string[], io: CliIO): Promise<number>;
5
+ export declare function runResultsCommand(rest: string[], io: CliIO): Promise<number>;
6
+ export declare function runReceiptsCommand(rest: string[], io: CliIO): Promise<number>;
7
+ export declare function runSessionsCommand(rest: string[], io: CliIO): Promise<number>;
8
+ export declare function formatSession(session: Awaited<ReturnType<BridgeStore["getSession"]>>): string;
9
+ export declare function latestRawResultTaskId(store: BridgeStore): Promise<string>;
10
+ export declare function latestResultTaskId(store: BridgeStore, options?: {
11
+ readOnly?: boolean;
12
+ }): Promise<string>;
13
+ export declare function latestTask(store: BridgeStore, options?: {
14
+ readOnly?: boolean;
15
+ }): Promise<Awaited<ReturnType<BridgeStore["listTasks"]>>[number] | undefined>;
16
+ export declare function listReceiptsForInspection(store: BridgeStore, input?: ListReceiptsInput): Promise<Awaited<ReturnType<BridgeStore["listReceipts"]>>>;
17
+ export declare function listSessionsForInspection(store: BridgeStore, status?: Parameters<BridgeStore["listSessions"]>[0]): Promise<Awaited<ReturnType<BridgeStore["listSessions"]>>>;
18
+ export declare function receiptInspectionListSuffix(receipt: Receipt): string;
19
+ export declare function writeTaskCompleteArtifacts(store: BridgeStore, values: string[]): Promise<BridgeFile[]>;
20
+ export declare function listTasksForInspection(store: BridgeStore, status?: Parameters<BridgeStore["listTasks"]>[0]): Promise<Awaited<ReturnType<BridgeStore["listTasks"]>>>;
21
+ export declare function listResultsForInspection(store: BridgeStore): Promise<Awaited<ReturnType<BridgeStore["listResults"]>>>;
22
+ export declare function listRawResultsForInspection(store: BridgeStore): Promise<Awaited<ReturnType<BridgeStore["listResults"]>>>;
@@ -0,0 +1,343 @@
1
+ import { assertNoExtraArgs, assertOnlyOptions, isHelpSubcommand, printHelpIfRequested, readFlag, readPositionalsWithOptions, readReceiptKindFlag, readRepeatedFlag, readSessionStatusFlag, readTaskStatusFlag, resolveCwdFlag, unknownSubcommandError } from "./cli-args.js";
2
+ import { printReceiptsHelp, printResultsHelp, printSessionsHelp, printTasksHelp } from "./cli-help.js";
3
+ import { sourceAwareResultError } from "./cli-shared.js";
4
+ import { BridgeStore } from "./store.js";
5
+ export async function runTasksCommand(rest, io) {
6
+ const [subcommand, ...taskArgs] = rest;
7
+ if (!subcommand || isHelpSubcommand(subcommand)) {
8
+ assertNoExtraArgs(taskArgs, "tasks help", 0);
9
+ printTasksHelp(io.stdout);
10
+ return 0;
11
+ }
12
+ if (subcommand === "create") {
13
+ if (printHelpIfRequested(taskArgs, "tasks create", io.stdout, printTasksHelp, { valueFlags: ["--cwd", "--title", "--prompt", "--repo-id", "--file"] }))
14
+ return 0;
15
+ assertOnlyOptions(taskArgs, "tasks create", ["--cwd", "--title", "--prompt", "--repo-id", "--file"]);
16
+ const title = readFlag(taskArgs, "--title");
17
+ const prompt = readFlag(taskArgs, "--prompt");
18
+ if (!title || !prompt)
19
+ throw new Error("tasks create requires --title and --prompt");
20
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
21
+ const task = await targetStore.createTask({
22
+ source: "codex",
23
+ title,
24
+ prompt,
25
+ repo_id: readFlag(taskArgs, "--repo-id") ?? "default",
26
+ files: readRepeatedFlag(taskArgs, "--file").map((file) => ({ path: file, role: "context" })),
27
+ provenance: { adapter: "cli", warnings: [] }
28
+ });
29
+ io.stdout(`${task.id}\t${task.status}\t${task.title}`);
30
+ return 0;
31
+ }
32
+ if (subcommand === "list") {
33
+ if (printHelpIfRequested(taskArgs, "tasks list", io.stdout, printTasksHelp, { valueFlags: ["--cwd", "--status"] }))
34
+ return 0;
35
+ assertOnlyOptions(taskArgs, "tasks list", ["--cwd", "--status"]);
36
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
37
+ const status = readTaskStatusFlag(taskArgs);
38
+ const tasks = await listTasksForInspection(targetStore, status);
39
+ for (const task of tasks) {
40
+ io.stdout(`${task.id}\t${task.status}\t${task.title}`);
41
+ }
42
+ return 0;
43
+ }
44
+ if (subcommand === "show") {
45
+ if (printHelpIfRequested(taskArgs, "tasks show", io.stdout, printTasksHelp, { valueFlags: ["--cwd"], maxPositionals: 1 }))
46
+ return 0;
47
+ const [taskId] = readPositionalsWithOptions(taskArgs, "tasks show", 1, ["--cwd"]);
48
+ if (!taskId)
49
+ throw new Error("tasks show requires <task-id|latest>");
50
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
51
+ const task = taskId === "latest" ? await latestTask(targetStore, { readOnly: true }) : await targetStore.getTaskReadOnly(taskId);
52
+ if (!task)
53
+ throw new Error(taskId === "latest" ? "No tasks found" : `Task not found: ${taskId}`);
54
+ io.stdout(JSON.stringify(task, null, 2));
55
+ return 0;
56
+ }
57
+ if (subcommand === "claim") {
58
+ if (printHelpIfRequested(taskArgs, "tasks claim", io.stdout, printTasksHelp, { valueFlags: ["--cwd", "--by"], maxPositionals: 1 }))
59
+ return 0;
60
+ const [taskId] = readPositionalsWithOptions(taskArgs, "tasks claim", 1, ["--cwd", "--by"]);
61
+ if (!taskId)
62
+ throw new Error("tasks claim requires <task-id>");
63
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
64
+ const task = await targetStore.claimTask(taskId, readFlag(taskArgs, "--by") ?? "codex");
65
+ io.stdout(`${task.id}\t${task.status}\t${task.claimed_by ?? ""}`);
66
+ return 0;
67
+ }
68
+ if (subcommand === "complete") {
69
+ if (printHelpIfRequested(taskArgs, "tasks complete", io.stdout, printTasksHelp, {
70
+ valueFlags: ["--cwd", "--summary", "--command", "--artifact"],
71
+ maxPositionals: 1
72
+ })) {
73
+ return 0;
74
+ }
75
+ const [taskId] = readPositionalsWithOptions(taskArgs, "tasks complete", 1, ["--cwd", "--summary", "--command", "--artifact"]);
76
+ if (!taskId)
77
+ throw new Error("tasks complete requires <task-id> --summary");
78
+ const summary = readFlag(taskArgs, "--summary");
79
+ if (!summary)
80
+ throw new Error("tasks complete requires <task-id> --summary");
81
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
82
+ const result = await targetStore.completeTask(taskId, {
83
+ status: "done",
84
+ summary,
85
+ commands: readRepeatedFlag(taskArgs, "--command"),
86
+ artifacts: await writeTaskCompleteArtifacts(targetStore, readRepeatedFlag(taskArgs, "--artifact"))
87
+ });
88
+ io.stdout(`${result.task_id}\t${result.status}\t${result.summary}`);
89
+ return 0;
90
+ }
91
+ if (subcommand === "block") {
92
+ if (printHelpIfRequested(taskArgs, "tasks block", io.stdout, printTasksHelp, {
93
+ valueFlags: ["--cwd", "--summary", "--code", "--next-step", "--command"],
94
+ booleanFlags: ["--retryable"],
95
+ maxPositionals: 1
96
+ })) {
97
+ return 0;
98
+ }
99
+ const [taskId] = readPositionalsWithOptions(taskArgs, "tasks block", 1, ["--cwd", "--summary", "--code", "--next-step", "--command"], ["--retryable"]);
100
+ if (!taskId)
101
+ throw new Error("tasks block requires <task-id> --summary");
102
+ const summary = readFlag(taskArgs, "--summary");
103
+ if (!summary)
104
+ throw new Error("tasks block requires <task-id> --summary");
105
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, taskArgs));
106
+ const result = await targetStore.completeTask(taskId, {
107
+ status: "blocked",
108
+ summary,
109
+ blocker: {
110
+ code: readFlag(taskArgs, "--code") ?? "manual_blocker",
111
+ message: summary,
112
+ retryable: taskArgs.includes("--retryable"),
113
+ next_step: readFlag(taskArgs, "--next-step")
114
+ },
115
+ commands: readRepeatedFlag(taskArgs, "--command")
116
+ });
117
+ io.stdout(`${result.task_id}\t${result.status}\t${result.summary}`);
118
+ return 0;
119
+ }
120
+ throw unknownSubcommandError("tasks", subcommand, ["create", "list", "show", "claim", "complete", "block"]);
121
+ }
122
+ export async function runResultsCommand(rest, io) {
123
+ const [subcommand, ...resultArgs] = rest;
124
+ if (!subcommand || isHelpSubcommand(subcommand)) {
125
+ assertNoExtraArgs(resultArgs, "results help", 0);
126
+ printResultsHelp(io.stdout);
127
+ return 0;
128
+ }
129
+ if (subcommand === "show") {
130
+ if (printHelpIfRequested(resultArgs, "results show", io.stdout, printResultsHelp, { valueFlags: ["--cwd"], maxPositionals: 1 }))
131
+ return 0;
132
+ const [taskId] = readPositionalsWithOptions(resultArgs, "results show", 1, ["--cwd"]);
133
+ if (!taskId)
134
+ throw new Error("results show requires <task-id|latest>");
135
+ const targetCwd = resolveCwdFlag(io.cwd, resultArgs);
136
+ const targetStore = new BridgeStore(targetCwd);
137
+ const resultOptions = { cwd: readFlag(resultArgs, "--cwd") ? targetCwd : undefined };
138
+ try {
139
+ const resolvedTaskId = taskId === "latest" ? await latestResultTaskId(targetStore, { readOnly: true }) : taskId;
140
+ io.stdout(JSON.stringify(await targetStore.getFinalizedResultReadOnly(resolvedTaskId), null, 2));
141
+ }
142
+ catch (error) {
143
+ throw sourceAwareResultError(error, undefined, resultOptions);
144
+ }
145
+ return 0;
146
+ }
147
+ if (subcommand === "artifact") {
148
+ if (printHelpIfRequested(resultArgs, "results artifact", io.stdout, printResultsHelp, { valueFlags: ["--cwd"], maxPositionals: 2 }))
149
+ return 0;
150
+ const [taskId, artifactPath] = readPositionalsWithOptions(resultArgs, "results artifact", 2, ["--cwd"]);
151
+ if (!taskId)
152
+ throw new Error("results artifact requires <task-id> [artifact-path]");
153
+ const targetCwd = resolveCwdFlag(io.cwd, resultArgs);
154
+ const targetStore = new BridgeStore(targetCwd);
155
+ const resultOptions = { cwd: readFlag(resultArgs, "--cwd") ? targetCwd : undefined };
156
+ try {
157
+ const resolvedTaskId = taskId === "latest" ? await latestResultTaskId(targetStore, { readOnly: true }) : taskId;
158
+ const artifact = await targetStore.readFinalizedResultArtifactText(resolvedTaskId, artifactPath);
159
+ io.stdout(artifact.content);
160
+ }
161
+ catch (error) {
162
+ throw sourceAwareResultError(error, undefined, resultOptions);
163
+ }
164
+ return 0;
165
+ }
166
+ if (subcommand === "reseal") {
167
+ if (printHelpIfRequested(resultArgs, "results reseal", io.stdout, printResultsHelp, {
168
+ valueFlags: ["--cwd"],
169
+ booleanFlags: ["--confirm-current-result"],
170
+ maxPositionals: 1
171
+ })) {
172
+ return 0;
173
+ }
174
+ const [taskId] = readPositionalsWithOptions(resultArgs, "results reseal", 1, ["--cwd"], ["--confirm-current-result"]);
175
+ if (!taskId)
176
+ throw new Error("results reseal requires <task-id|latest> --confirm-current-result");
177
+ if (!resultArgs.includes("--confirm-current-result")) {
178
+ throw new Error("results reseal requires --confirm-current-result after you review the current .bridge/results/<task-id>.json payload locally.");
179
+ }
180
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, resultArgs));
181
+ const resolvedTaskId = taskId === "latest" ? await latestRawResultTaskId(targetStore) : taskId;
182
+ const resealed = await targetStore.resealResult(resolvedTaskId);
183
+ io.stdout(`${resealed.result.task_id}\tresealed\t${resealed.receipt.id}\tresult_sha256=${resealed.receipt.metadata.result_sha256}`);
184
+ return 0;
185
+ }
186
+ throw unknownSubcommandError("results", subcommand, ["show", "artifact", "reseal"]);
187
+ }
188
+ export async function runReceiptsCommand(rest, io) {
189
+ const [subcommand, ...receiptArgs] = rest;
190
+ if (!subcommand || isHelpSubcommand(subcommand)) {
191
+ assertNoExtraArgs(receiptArgs, "receipts help", 0);
192
+ printReceiptsHelp(io.stdout);
193
+ return 0;
194
+ }
195
+ if (subcommand === "list") {
196
+ if (printHelpIfRequested(receiptArgs, "receipts list", io.stdout, printReceiptsHelp, { valueFlags: ["--cwd", "--kind", "--task-id"] }))
197
+ return 0;
198
+ assertOnlyOptions(receiptArgs, "receipts list", ["--cwd", "--kind", "--task-id"]);
199
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, receiptArgs));
200
+ const receipts = await listReceiptsForInspection(targetStore, {
201
+ kind: readReceiptKindFlag(receiptArgs),
202
+ task_id: readFlag(receiptArgs, "--task-id")
203
+ });
204
+ for (const receipt of receipts) {
205
+ io.stdout(`${receipt.id}\t${receipt.kind}\t${receipt.summary}${receiptInspectionListSuffix(receipt)}`);
206
+ }
207
+ return 0;
208
+ }
209
+ if (subcommand === "show") {
210
+ if (printHelpIfRequested(receiptArgs, "receipts show", io.stdout, printReceiptsHelp, { valueFlags: ["--cwd"], maxPositionals: 1 }))
211
+ return 0;
212
+ const [receiptId] = readPositionalsWithOptions(receiptArgs, "receipts show", 1, ["--cwd"]);
213
+ if (!receiptId)
214
+ throw new Error("receipts show requires <receipt-id|latest>");
215
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, receiptArgs));
216
+ const receipt = receiptId === "latest" ? (await listReceiptsForInspection(targetStore))[0] : await targetStore.getReceiptForDisplayReadOnly(receiptId);
217
+ if (!receipt)
218
+ throw new Error(receiptId === "latest" ? "No receipts found" : `Receipt not found: ${receiptId}`);
219
+ io.stdout(JSON.stringify(receipt, null, 2));
220
+ return 0;
221
+ }
222
+ if (subcommand === "rotate-key") {
223
+ if (printHelpIfRequested(receiptArgs, "receipts rotate-key", io.stdout, printReceiptsHelp, { valueFlags: ["--cwd"] }))
224
+ return 0;
225
+ assertOnlyOptions(receiptArgs, "receipts rotate-key", ["--cwd"]);
226
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, receiptArgs));
227
+ await targetStore.ensure();
228
+ const rotated = await targetStore.rotateReceiptIntegrityKey();
229
+ io.stdout(`Rotated the local receipt integrity key: ${rotated.keys} key(s) in .bridge/receipt-key.local.`);
230
+ io.stdout("New receipts are signed with the new key; receipts signed before the rotation still verify via the retained legacy keys.");
231
+ return 0;
232
+ }
233
+ throw unknownSubcommandError("receipts", subcommand, ["list", "show", "rotate-key"]);
234
+ }
235
+ export async function runSessionsCommand(rest, io) {
236
+ const [subcommand, ...sessionArgs] = rest;
237
+ if (!subcommand || isHelpSubcommand(subcommand)) {
238
+ assertNoExtraArgs(sessionArgs, "sessions help", 0);
239
+ printSessionsHelp(io.stdout);
240
+ return 0;
241
+ }
242
+ if (subcommand === "list") {
243
+ if (printHelpIfRequested(sessionArgs, "sessions list", io.stdout, printSessionsHelp, { valueFlags: ["--cwd", "--status"] }))
244
+ return 0;
245
+ assertOnlyOptions(sessionArgs, "sessions list", ["--cwd", "--status"]);
246
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, sessionArgs));
247
+ const status = readSessionStatusFlag(sessionArgs);
248
+ const sessions = await listSessionsForInspection(targetStore, status);
249
+ for (const session of sessions) {
250
+ io.stdout(`${session.id}\t${session.status}\t${session.backend}\t${session.direction}`);
251
+ }
252
+ return 0;
253
+ }
254
+ if (subcommand === "show") {
255
+ if (printHelpIfRequested(sessionArgs, "sessions show", io.stdout, printSessionsHelp, { valueFlags: ["--cwd"], maxPositionals: 1 }))
256
+ return 0;
257
+ const [sessionId] = readPositionalsWithOptions(sessionArgs, "sessions show", 1, ["--cwd"]);
258
+ if (!sessionId)
259
+ throw new Error("sessions show requires <session-id|latest>");
260
+ const targetStore = new BridgeStore(resolveCwdFlag(io.cwd, sessionArgs));
261
+ const session = sessionId === "latest" ? (await listSessionsForInspection(targetStore))[0] : await targetStore.getSessionReadOnly(sessionId);
262
+ if (!session)
263
+ throw new Error(sessionId === "latest" ? "No sessions found" : `Session not found: ${sessionId}`);
264
+ io.stdout(formatSession(session));
265
+ return 0;
266
+ }
267
+ throw unknownSubcommandError("sessions", subcommand, ["list", "show"]);
268
+ }
269
+ export function formatSession(session) {
270
+ return JSON.stringify({
271
+ id: session.id,
272
+ status: session.status,
273
+ direction: session.direction,
274
+ backend: session.backend,
275
+ project: session.project,
276
+ thread: session.thread,
277
+ task_id: session.task_id,
278
+ blocker: session.blocker,
279
+ warnings: session.warnings,
280
+ created_at: session.created_at,
281
+ last_used_at: session.last_used_at
282
+ }, null, 2);
283
+ }
284
+ export async function latestRawResultTaskId(store) {
285
+ const result = (await store.listResults()).at(-1);
286
+ if (!result)
287
+ throw new Error("No results found");
288
+ return result.task_id;
289
+ }
290
+ export async function latestResultTaskId(store, options = {}) {
291
+ const results = options.readOnly ? await listResultsForInspection(store) : await store.listResults();
292
+ const result = results.at(-1);
293
+ if (!result)
294
+ throw new Error("No results found");
295
+ return result.task_id;
296
+ }
297
+ export async function latestTask(store, options = {}) {
298
+ const tasks = options.readOnly ? await listTasksForInspection(store) : await store.listTasks();
299
+ return tasks.sort((a, b) => b.created_at.localeCompare(a.created_at) || b.id.localeCompare(a.id))[0];
300
+ }
301
+ export async function listReceiptsForInspection(store, input = {}) {
302
+ return store.listReceiptsReadOnly(input);
303
+ }
304
+ export async function listSessionsForInspection(store, status) {
305
+ return store.listSessionsReadOnly(status);
306
+ }
307
+ export function receiptInspectionListSuffix(receipt) {
308
+ const status = receipt.metadata.integrity_status;
309
+ if (typeof status === "object" &&
310
+ status !== null &&
311
+ "trusted" in status &&
312
+ status.trusted === false) {
313
+ return "\tintegrity=untrusted";
314
+ }
315
+ return "";
316
+ }
317
+ export async function writeTaskCompleteArtifacts(store, values) {
318
+ const artifacts = [];
319
+ for (const value of values) {
320
+ const separator = value.indexOf("=");
321
+ if (separator <= 0) {
322
+ throw new Error("tasks complete --artifact requires path=text");
323
+ }
324
+ const artifactPath = value.slice(0, separator);
325
+ const content = value.slice(separator + 1);
326
+ if (!artifactPath.trim()) {
327
+ throw new Error("tasks complete --artifact requires path=text");
328
+ }
329
+ const storedPath = await store.writeArtifactText(artifactPath, content);
330
+ artifacts.push({ path: storedPath, role: "result" });
331
+ }
332
+ return artifacts;
333
+ }
334
+ export async function listTasksForInspection(store, status) {
335
+ return store.listTasksReadOnly(status);
336
+ }
337
+ export async function listResultsForInspection(store) {
338
+ return store.listFinalizedResultsReadOnly();
339
+ }
340
+ export async function listRawResultsForInspection(store) {
341
+ return store.listResultsReadOnly();
342
+ }
343
+ //# sourceMappingURL=cli-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-ledger.js","sourceRoot":"","sources":["../src/cli-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type ChatGptBrowserLaunch, sendChatGptPrompt } from "./chatgpt-browser.js";
2
+ import { type HelpRequestOptions } from "./cli-args.js";
3
+ import { type BrowserCommandOptions } from "./cli-shared.js";
4
+ import { BridgeStore } from "./store.js";
5
+ import type { CliIO } from "./cli.js";
6
+ export type RunCliFn = (args: string[], io: CliIO) => Promise<number>;
7
+ export declare function runChatgptCommand(rest: string[], io: CliIO): Promise<number>;
8
+ export declare function runProCommand(rest: string[], io: CliIO, runCliFn: RunCliFn): Promise<number>;
9
+ export declare function runConsultsCommand(rest: string[], io: CliIO): Promise<number>;
10
+ export declare function runAskProCommand(rest: string[], io: CliIO): Promise<number>;
11
+ export declare const PRO_BROWSER_SMOKE_TOKEN = "PRODEX_PRO_SMOKE_OK";
12
+ export declare function assertBrowserLaunchStayedAlive(opened: ChatGptBrowserLaunch, timeoutMs?: number): Promise<void>;
13
+ export declare function browserSendBlockerFromError(error: unknown): {
14
+ code: string;
15
+ message: string;
16
+ retryable: boolean;
17
+ next_step?: string;
18
+ };
19
+ export declare function formatProAnswer(consult: ConsultRecord, sourceCli?: string, options?: BrowserCommandOptions): string;
20
+ export declare function formatProConsultArtifact(consult: Awaited<ReturnType<typeof sendChatGptPrompt>>): string;
21
+ export declare function formatProListSummary(consult: ConsultRecord, sourceCli?: string, options?: BrowserCommandOptions): string;
22
+ export declare function getConsult(store: BridgeStore, taskId: string, options?: {
23
+ readOnly?: boolean;
24
+ }): Promise<ConsultRecord | undefined>;
25
+ export declare function latestTrustedConsult(store: BridgeStore, options?: {
26
+ readOnly?: boolean;
27
+ }): Promise<ConsultRecord | undefined>;
28
+ export declare function legacyChatGptNamespaceError(subcommand?: string): Error;
29
+ export declare function listConsultListEntries(store: BridgeStore, options?: {
30
+ readOnly?: boolean;
31
+ }): Promise<ConsultListEntry[]>;
32
+ export declare function printBrowserLoginGuide(stdout: (line: string) => void, input: {
33
+ opened: boolean;
34
+ loginUrl: string;
35
+ profileDir: string;
36
+ port: number;
37
+ sourceCli?: string;
38
+ commandOptions?: BrowserCommandOptions;
39
+ }): void;
40
+ export declare function printProBrowserHelpIfRequested(args: string[], command: string, io: CliIO, options: HelpRequestOptions): boolean;
41
+ export declare function printProductCheck(store: BridgeStore, io: CliIO, args: string[], configCwd?: string): Promise<boolean>;
42
+ export declare function readChatGptBrowserUrlFlag(args: string[]): string;
43
+ export declare function writeSessionBeforeBrowserSend(store: BridgeStore, input: Parameters<BridgeStore["writeSession"]>[0]): Promise<void>;
44
+ export declare function writeSessionBestEffort(store: BridgeStore, input: Parameters<BridgeStore["writeSession"]>[0], io: CliIO): Promise<void>;
45
+ export type ConsultListEntry = {
46
+ kind: "trusted";
47
+ consult: ConsultRecord;
48
+ } | {
49
+ kind: "untrusted";
50
+ task: ConsultRecord["task"];
51
+ result: ConsultRecord["result"];
52
+ error: Error & {
53
+ code: "EUNTRUSTED_RESULT";
54
+ taskId: string;
55
+ };
56
+ };
57
+ export type ConsultRecord = {
58
+ task: Awaited<ReturnType<BridgeStore["listTasks"]>>[number];
59
+ result: Awaited<ReturnType<BridgeStore["listResults"]>>[number];
60
+ };
61
+ export declare function assertNoMissingTerminalConsultResults(tasks: Awaited<ReturnType<BridgeStore["listTasks"]>>, results: Awaited<ReturnType<BridgeStore["listResults"]>>): void;
62
+ export declare function assertNoOrphanConsultResults(tasksById: Map<string, Awaited<ReturnType<BridgeStore["listTasks"]>>[number]>, results: Awaited<ReturnType<BridgeStore["listResults"]>>): void;
63
+ export declare function browserReadinessNextStep(input: {
64
+ loggedInLikely: boolean;
65
+ hasComposer: boolean;
66
+ }): string;
67
+ export declare function formatBrowserEarlyExit(exit: Awaited<ReturnType<ChatGptBrowserLaunch["waitForEarlyExit"]>>): string;
68
+ export declare function formatBrowserModelHints(modelHints: string[]): string | undefined;
69
+ export declare function formatConfigWarningLine(tokenStatus: {
70
+ warning?: string;
71
+ }, sourceCli?: string, setupHintCwd?: string): string | undefined;
72
+ export declare function formatProductCheckLatestProLines(consult: ConsultRecord, sourceCli?: string, options?: BrowserCommandOptions): string[];
73
+ export declare function isConsultRecord(record: ConsultRecord): boolean;
74
+ export declare function isConsultTask(task: Awaited<ReturnType<BridgeStore["listTasks"]>>[number]): boolean;
75
+ export declare function isTerminalTask(task: Awaited<ReturnType<BridgeStore["listTasks"]>>[number]): boolean;
76
+ export declare function missingConsultResultError(task: Awaited<ReturnType<BridgeStore["listTasks"]>>[number]): Error;
77
+ export declare function productCheckBrowserNextStep(nextStep: string | undefined, sourceCli?: string, options?: BrowserCommandOptions): string | undefined;
78
+ export declare function sourceAwareProAnswerBlocker(consult: ConsultRecord, sourceCli?: string, options?: BrowserCommandOptions): ConsultRecord["result"]["blocker"];
79
+ export declare function sourceAwareProAnswerSummary(summary: string, originalBlocker: ConsultRecord["result"]["blocker"], displayedBlocker: ConsultRecord["result"]["blocker"]): string;
80
+ export declare function waitForBrowserLaunchReady(opened: ChatGptBrowserLaunch, timeoutMs?: number): Promise<{
81
+ reachable: true;
82
+ } | {
83
+ reachable: false;
84
+ earlyExit?: Awaited<ReturnType<ChatGptBrowserLaunch["waitForEarlyExit"]>>;
85
+ }>;
86
+ export declare function isConsultResult(result: Awaited<ReturnType<BridgeStore["listResults"]>>[number]): boolean;
87
+ export declare function isSmokeConsultRecord(consult: ConsultRecord): boolean;
88
+ export declare function orphanConsultResultError(taskId: string): Error;
89
+ export declare function sleep(ms: number): Promise<void>;