@botiverse/oar 0.21.1 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +11 -0
  2. package/dist/contracts/login.d.ts +91 -0
  3. package/dist/contracts/login.d.ts.map +1 -0
  4. package/dist/contracts/login.js +2 -0
  5. package/dist/contracts/login.js.map +1 -0
  6. package/dist/contracts/runtime.d.ts +5 -0
  7. package/dist/contracts/runtime.d.ts.map +1 -1
  8. package/dist/contracts/runtime.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/observe/tool-activity.d.ts +3 -2
  13. package/dist/observe/tool-activity.d.ts.map +1 -1
  14. package/dist/observe/tool-activity.js +14 -5
  15. package/dist/observe/tool-activity.js.map +1 -1
  16. package/dist/runtimes/claude/auth-status.d.ts +10 -0
  17. package/dist/runtimes/claude/auth-status.d.ts.map +1 -0
  18. package/dist/runtimes/claude/auth-status.js +47 -0
  19. package/dist/runtimes/claude/auth-status.js.map +1 -0
  20. package/dist/runtimes/claude/index.d.ts +4 -0
  21. package/dist/runtimes/claude/index.d.ts.map +1 -1
  22. package/dist/runtimes/claude/index.js +4 -0
  23. package/dist/runtimes/claude/index.js.map +1 -1
  24. package/dist/runtimes/claude/login.d.ts +6 -0
  25. package/dist/runtimes/claude/login.d.ts.map +1 -0
  26. package/dist/runtimes/claude/login.js +209 -0
  27. package/dist/runtimes/claude/login.js.map +1 -0
  28. package/dist/runtimes/codex/app-server-client.d.ts +4 -1
  29. package/dist/runtimes/codex/app-server-client.d.ts.map +1 -1
  30. package/dist/runtimes/codex/app-server-client.js +4 -4
  31. package/dist/runtimes/codex/app-server-client.js.map +1 -1
  32. package/dist/runtimes/codex/index.d.ts +3 -0
  33. package/dist/runtimes/codex/index.d.ts.map +1 -1
  34. package/dist/runtimes/codex/index.js +3 -0
  35. package/dist/runtimes/codex/index.js.map +1 -1
  36. package/dist/runtimes/codex/login.d.ts +16 -0
  37. package/dist/runtimes/codex/login.d.ts.map +1 -0
  38. package/dist/runtimes/codex/login.js +241 -0
  39. package/dist/runtimes/codex/login.js.map +1 -0
  40. package/dist/shared/executable/index.d.ts +2 -2
  41. package/dist/shared/executable/index.d.ts.map +1 -1
  42. package/dist/shared/executable/index.js +1 -1
  43. package/dist/shared/executable/index.js.map +1 -1
  44. package/dist/shared/executable/isolated.d.ts.map +1 -1
  45. package/dist/shared/executable/isolated.js +2 -5
  46. package/dist/shared/executable/isolated.js.map +1 -1
  47. package/dist/shared/executable/process.d.ts +25 -8
  48. package/dist/shared/executable/process.d.ts.map +1 -1
  49. package/dist/shared/executable/process.js +25 -1
  50. package/dist/shared/executable/process.js.map +1 -1
  51. package/dist/shared/executable/run.d.ts +2 -0
  52. package/dist/shared/executable/run.d.ts.map +1 -1
  53. package/dist/shared/executable/run.js +1 -0
  54. package/dist/shared/executable/run.js.map +1 -1
  55. package/dist/shared/installation.d.ts +6 -0
  56. package/dist/shared/installation.d.ts.map +1 -1
  57. package/dist/shared/installation.js +7 -2
  58. package/dist/shared/installation.js.map +1 -1
  59. package/dist/shared/login.d.ts +80 -0
  60. package/dist/shared/login.d.ts.map +1 -0
  61. package/dist/shared/login.js +211 -0
  62. package/dist/shared/login.js.map +1 -0
  63. package/package.json +1 -1
@@ -0,0 +1,209 @@
1
+ import { errorMessage, LoginSecrets, loginBounds, loginExecutable, spawnLoginProcess, stoppedResult, } from "../../shared/login.js";
2
+ import { claudeAuthStatus, claudeEnv } from "./auth-status.js";
3
+ /*
4
+ * `claude auth login` over pipes (2.1.288). It prints, on stdout:
5
+ *
6
+ * Opening browser to sign in…
7
+ * If the browser didn't open, visit: <url> (an OSC 8 hyperlink from 2.1.202)
8
+ * Paste code here if prompted > (no newline)
9
+ *
10
+ * and races two ends: the browser's redirect to its localhost listener, and a
11
+ * `code#state` line on stdin, which the page behind <url> shows after the
12
+ * sign-in. A malformed line prints `Invalid code. Please make sure the full
13
+ * code was copied.` to stderr and reading goes on. It ends with
14
+ * `Login successful.` (exit 0, after a few seconds of telemetry flushing) or
15
+ * a failure on stderr (exit 1): `Login failed: <message>`, or a message of
16
+ * its own (a suspended account, an organization or provider that disallows
17
+ * the login). It has no deadline of its own. Reading a pasted code arrived in
18
+ * 2.1.126; `auth login` itself in 2.1.41.
19
+ */
20
+ const PASTE_FLOOR = "2.1.126";
21
+ const LOGIN_TIMEOUT_MS = 15 * 60_000;
22
+ const URL_LINE = /If the browser didn't open, visit:\s*(\S+)/u;
23
+ const PASTE_PROMPT = /Paste code here if prompted\s*>/u;
24
+ /** At the start of a stderr line only: `Login failed: Invalid code verifier` is a failure, not a retry. */
25
+ const INVALID_CODE = /^Invalid code\b/u;
26
+ const SUCCESS = /Login successful\b/u;
27
+ const FAILURE = /Login failed:\s*(.*)$/u;
28
+ /**
29
+ * The status decides once claude has exited 0 or reported success. A query
30
+ * that cannot answer (it failed, or the caller aborted) leaves claude's own
31
+ * report: a success it printed is `logged_in`, an exit 0 without one is not.
32
+ */
33
+ async function confirmed(installation, signal, reportedSuccess) {
34
+ const status = signal?.aborted === true
35
+ ? undefined
36
+ : await claudeAuthStatus(installation, signal === undefined ? {} : { signal });
37
+ if (status?.kind === "logged_in") {
38
+ return { kind: "logged_in", ...(status.account === undefined ? {} : { account: status.account }) };
39
+ }
40
+ if (status?.kind === "logged_out") {
41
+ return { kind: "failed", reason: "not_logged_in", detail: "claude auth login reported success, yet claude auth status says logged out" };
42
+ }
43
+ return reportedSuccess
44
+ ? { kind: "logged_in" }
45
+ : { kind: "failed", reason: "process_failed", detail: "claude auth login exited 0 without reporting success" };
46
+ }
47
+ /** A failed exit, in claude's words where it gave any. */
48
+ function failedExit(exit, flow, secrets) {
49
+ if (exit.error !== undefined) {
50
+ return { kind: "failed", reason: "process_failed", detail: secrets.line(exit.error) };
51
+ }
52
+ if (flow.failure !== undefined) {
53
+ return { kind: "failed", reason: "rejected", detail: secrets.line(flow.failure) };
54
+ }
55
+ // claude exits 1 for a failure it reports, also in words other than `Login failed:`.
56
+ if (exit.exitCode === 1 && flow.lastStderr !== undefined) {
57
+ return { kind: "failed", reason: "rejected", detail: secrets.line(flow.lastStderr) };
58
+ }
59
+ const ended = exit.exitCode === null ? `signal ${exit.signal ?? "unknown"}` : `code ${String(exit.exitCode)}`;
60
+ return {
61
+ kind: "failed",
62
+ reason: "process_failed",
63
+ detail: flow.lastStderr === undefined ? `claude auth login exited with ${ended}` : secrets.line(flow.lastStderr),
64
+ };
65
+ }
66
+ async function runClaudeLogin(installation, command, interaction, timeoutMs) {
67
+ const secrets = new LoginSecrets();
68
+ const interactionFailure = Promise.withResolvers();
69
+ const flow = {
70
+ urlSent: false, pasteOffered: false, promptOpen: false, settled: false, reportedSuccess: false, failure: undefined, lastStderr: undefined,
71
+ };
72
+ let child = null;
73
+ const ended = () => flow.settled;
74
+ /** The caller failed: settled at once, so no answer still in flight reaches claude. */
75
+ const interactionFailed = (error) => {
76
+ flow.settled = true;
77
+ interactionFailure.resolve({ kind: "interaction_failed", message: errorMessage(error) });
78
+ };
79
+ const ask = async (message) => {
80
+ if (flow.promptOpen || flow.settled) {
81
+ return;
82
+ }
83
+ flow.promptOpen = true;
84
+ let answer = "";
85
+ try {
86
+ answer = await interaction.prompt({ kind: "manual_code", message, placeholder: "code#state" });
87
+ }
88
+ catch (error) {
89
+ // A prompt the caller gave up on because it aborted is a cancellation, which the bounds report.
90
+ if (interaction.signal?.aborted !== true) {
91
+ interactionFailed(error);
92
+ }
93
+ return;
94
+ }
95
+ finally {
96
+ flow.promptOpen = false;
97
+ }
98
+ // The code has no whitespace; a pasted line break must not become a second attempt.
99
+ const code = answer.replaceAll(/\s+/gu, "");
100
+ // Read after the wait: the login may have ended while the caller answered.
101
+ if (ended()) {
102
+ return;
103
+ }
104
+ if (code === "") {
105
+ await ask("No code was entered. Paste the code shown after signing in");
106
+ return;
107
+ }
108
+ // The authorization code is the secret part; the state after `#` is already in the sign-in URL.
109
+ secrets.add(code);
110
+ secrets.add(code.split("#")[0] ?? code);
111
+ // Only ever to claude's stdin: never an event, a result or an error.
112
+ child?.write(`${code}\n`);
113
+ };
114
+ const offerPaste = () => {
115
+ if (!flow.pasteOffered) {
116
+ flow.pasteOffered = true;
117
+ void ask("Paste the code shown after signing in");
118
+ }
119
+ };
120
+ try {
121
+ child = spawnLoginProcess(command, ["auth", "login"], claudeEnv(), {
122
+ onLine(line, stream) {
123
+ const url = URL_LINE.exec(line)?.[1];
124
+ if (url !== undefined && !flow.urlSent) {
125
+ flow.urlSent = true;
126
+ try {
127
+ interaction.onEvent({ kind: "auth_url", url, instructions: "Open this URL and sign in; if the page then shows a code, paste it back." });
128
+ }
129
+ catch (error) {
130
+ // A caller that cannot show the URL cannot finish the login.
131
+ interactionFailed(error);
132
+ }
133
+ }
134
+ if (PASTE_PROMPT.test(line)) {
135
+ offerPaste();
136
+ }
137
+ if (stream === "stderr") {
138
+ flow.lastStderr = line;
139
+ if (INVALID_CODE.test(line)) {
140
+ void ask("That code was not accepted. Paste the full code shown after signing in");
141
+ }
142
+ }
143
+ // Unanchored: with no echo of the pasted line, claude's next words continue the prompt's line.
144
+ if (SUCCESS.test(line)) {
145
+ flow.reportedSuccess = true;
146
+ }
147
+ const failed = FAILURE.exec(line)?.[1];
148
+ if (failed !== undefined) {
149
+ flow.failure = failed;
150
+ }
151
+ },
152
+ onPartial(partial) {
153
+ if (PASTE_PROMPT.test(partial)) {
154
+ offerPaste();
155
+ }
156
+ },
157
+ });
158
+ }
159
+ catch (error) {
160
+ return { kind: "failed", reason: "process_failed", detail: secrets.line(errorMessage(error)) };
161
+ }
162
+ const bounds = loginBounds(interaction.signal, timeoutMs);
163
+ try {
164
+ const ending = await Promise.race([
165
+ // oxlint-disable-next-line promise/prefer-await-to-then -- racing three endings
166
+ child.exited.then((exit) => ({ kind: "exit", exit })),
167
+ // oxlint-disable-next-line promise/prefer-await-to-then -- racing three endings
168
+ bounds.stopped.then((stop) => ({ kind: "stop", stop })),
169
+ interactionFailure.promise,
170
+ ]);
171
+ flow.settled = true;
172
+ if (ending.kind !== "exit") {
173
+ child.stop();
174
+ await child.exited;
175
+ }
176
+ // After `Login successful.` the new login is stored; a stop or an odd exit while claude flushes does not undo it.
177
+ if (flow.reportedSuccess) {
178
+ return await confirmed(installation, interaction.signal, true);
179
+ }
180
+ switch (ending.kind) {
181
+ case "stop":
182
+ return stoppedResult(ending.stop, timeoutMs);
183
+ case "interaction_failed":
184
+ return { kind: "failed", reason: "interaction_failed", detail: secrets.line(ending.message) };
185
+ case "exit":
186
+ break;
187
+ }
188
+ return ending.exit.exitCode === 0 && ending.exit.error === undefined
189
+ ? await confirmed(installation, interaction.signal, false)
190
+ : failedExit(ending.exit, flow, secrets);
191
+ }
192
+ finally {
193
+ flow.settled = true;
194
+ bounds.dispose();
195
+ }
196
+ }
197
+ /** Signs claude in with `claude auth login`, relaying its URL and writing the pasted code to its stdin. */
198
+ export async function claudeLogin(installation, interaction, options = {}) {
199
+ const target = loginExecutable(installation, "claude", PASTE_FLOOR);
200
+ if (target.kind === "settled") {
201
+ return target.result;
202
+ }
203
+ if (interaction.signal?.aborted === true) {
204
+ return { kind: "cancelled" };
205
+ }
206
+ const result = await runClaudeLogin(installation, target.installation.command, interaction, options.timeoutMs ?? LOGIN_TIMEOUT_MS);
207
+ return result;
208
+ }
209
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/runtimes/claude/login.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type LineProcessOptions } from "../../shared/executable/index.js";
1
2
  import { type JsonRecord } from "../../shared/json.js";
2
3
  /**
3
4
  * Minimal persistent JSON-RPC client over codex app-server's stdio JSONL
@@ -48,5 +49,7 @@ export interface AppServerClient {
48
49
  onExit(handler: (code: number | null) => void): void;
49
50
  kill(): void;
50
51
  }
51
- export declare function startAppServerClient(command: string, env?: Readonly<Record<string, string>>, configOverrides?: Readonly<Record<string, string>>, cwd?: string): AppServerClient;
52
+ /** How the app-server process is handled: whether its stderr may reach the host's, and whether a kill takes its Windows process tree. */
53
+ export type AppServerProcessOptions = Pick<LineProcessOptions, "inheritStderr" | "killTree">;
54
+ export declare function startAppServerClient(command: string, env?: Readonly<Record<string, string>>, configOverrides?: Readonly<Record<string, string>>, cwd?: string, processOptions?: AppServerProcessOptions): AppServerClient;
52
55
  //# sourceMappingURL=app-server-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-server-client.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG5E;;;;GAIG;AACH,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACpF;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5G,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACjD;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C;;;;;;OAMG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD,IAAI,IAAI,IAAI,CAAC;CACd;AAQD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,EACtD,GAAG,CAAC,EAAE,MAAM,GACX,eAAe,CAIjB"}
1
+ {"version":3,"file":"app-server-client.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE7F,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG5E;;;;GAIG;AACH,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACpF;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5G,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACjD;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C;;;;;;OAMG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD,IAAI,IAAI,IAAI,CAAC;CACd;AAQD,yIAAyI;AACzI,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,EAAE,eAAe,GAAG,UAAU,CAAC,CAAC;AAE7F,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,EACtD,GAAG,CAAC,EAAE,MAAM,EACZ,cAAc,GAAE,uBAA4B,GAC3C,eAAe,CAIjB"}
@@ -2,17 +2,17 @@ import { spawnLineProcess } from "../../shared/executable/index.js";
2
2
  import { processFailure } from "../../shared/executable/diagnostics.js";
3
3
  import { asRecord, parseJson } from "../../shared/json.js";
4
4
  import { coordinateHomeInitialization } from "./home-initialization.js";
5
- export function startAppServerClient(command, env, configOverrides = {}, cwd) {
5
+ export function startAppServerClient(command, env, configOverrides = {}, cwd, processOptions = {}) {
6
6
  const environment = { ...process.env, ...env };
7
7
  const directory = cwd ?? process.cwd();
8
- return coordinateHomeInitialization(environment, directory, () => createAppServerClient(command, environment, configOverrides, directory));
8
+ return coordinateHomeInitialization(environment, directory, () => createAppServerClient(command, environment, configOverrides, directory, processOptions));
9
9
  }
10
- function createAppServerClient(command, env, configOverrides, cwd) {
10
+ function createAppServerClient(command, env, configOverrides, cwd, processOptions) {
11
11
  // -c KEY=VALUE injects config at launch. This is the ONLY seam that reaches
12
12
  // codex's exec tool: thread/start.sandboxMode does not (pinned on a real
13
13
  // login: thread param honored for its own turns but exec follows config).
14
14
  const overrideArgs = Object.entries(configOverrides).flatMap(([key, value]) => ["-c", `${key}=${value}`]);
15
- const child = spawnLineProcess(command, ["app-server", ...overrideArgs, "--listen", "stdio://"], { cwd, env });
15
+ const child = spawnLineProcess(command, ["app-server", ...overrideArgs, "--listen", "stdio://"], { cwd, env, ...processOptions });
16
16
  // Session initialization observes spawn failures through its pending RPC.
17
17
  // Mark this parallel promise handled while preserving its rejection for
18
18
  // callers that explicitly await spawned.
@@ -1 +1 @@
1
- {"version":3,"file":"app-server-client.js","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-server-client.js","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { codexAuthStatus, codexLogin } from "./login.js";
1
2
  import { codexCheckUpdate, codexUpgrade } from "./update.js";
2
3
  export declare const codexRuntime: {
3
4
  readonly id: "codex";
@@ -17,6 +18,8 @@ export declare const codexRuntime: {
17
18
  readonly listModels: import("../../index.js").ModelLister;
18
19
  readonly checkUpdate: typeof codexCheckUpdate;
19
20
  readonly upgrade: typeof codexUpgrade;
21
+ readonly login: typeof codexLogin;
22
+ readonly authStatus: typeof codexAuthStatus;
20
23
  readonly session: import("../../index.js").StartSession;
21
24
  } & import("../../index.js").RuntimeInventories & {
22
25
  readonly brand: import("../../brands.js").RuntimeBrand;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;CAYvB,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAcvB,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { runtimeBrands } from "../../brands.js";
2
2
  import { codexSkills, codexMcpServers, codexTools } from "./inventory.js";
3
3
  import { defineRuntime } from "../../contracts/runtime.js";
4
+ import { codexAuthStatus, codexLogin } from "./login.js";
4
5
  import { codexAccountUsage } from "./account-usage.js";
5
6
  import { codexInstallation } from "./installation.js";
6
7
  import { codexListModels } from "./list-models.js";
@@ -17,6 +18,8 @@ export const codexRuntime = defineRuntime({
17
18
  listModels: codexListModels,
18
19
  checkUpdate: codexCheckUpdate,
19
20
  upgrade: codexUpgrade,
21
+ login: codexLogin,
22
+ authStatus: codexAuthStatus,
20
23
  session: codexSession,
21
24
  });
22
25
  export { codexAccountUsage, projectCodexUsage } from "./account-usage.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,aAAa,CAAC,KAAK;IAC1B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,UAAU;IACjB,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;CACtB,CAAC,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,aAAa,CAAC,KAAK;IAC1B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,UAAU;IACjB,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,YAAY;CACtB,CAAC,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AvailableInstallation } from "../../contracts/installation.js";
2
+ import type { AuthStatus, AuthStatusOptions, LoginAccount, LoginOptions, LoginResult } from "../../contracts/login.js";
3
+ import type { ProviderLoginInteraction } from "../../contracts/provider-auth.js";
4
+ /**
5
+ * `codex login status` prints to stderr and exits 0 when logged in
6
+ * (`Logged in using ChatGPT`, or `Logged in using an API key - <masked>`),
7
+ * 1 with `Not logged in` when logged out, and 1 with another message when
8
+ * it cannot tell (an unreadable configuration or credential store).
9
+ */
10
+ export declare function projectCodexLoginStatus(exitCode: number | null, output: string): AuthStatus;
11
+ export declare function codexAuthStatus(installation: AvailableInstallation, options?: AuthStatusOptions): Promise<AuthStatus>;
12
+ /** `account/read` after the sign-in; null when codex reports no account. */
13
+ export declare function projectCodexAccount(result: unknown): LoginAccount | null;
14
+ /** Signs codex in with the app-server's ChatGPT device code flow, relaying the code and its URL. */
15
+ export declare function codexLogin(installation: AvailableInstallation, interaction: ProviderLoginInteraction, options?: LoginOptions): Promise<LoginResult>;
16
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAyCjF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAc3F;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,qBAAqB,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAM/H;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAaxE;AA4KD,oGAAoG;AACpG,wBAAsB,UAAU,CAC9B,YAAY,EAAE,qBAAqB,EACnC,WAAW,EAAE,wBAAwB,EACrC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAUtB"}
@@ -0,0 +1,241 @@
1
+ import { runExecutable } from "../../shared/executable/index.js";
2
+ import { asRecord } from "../../shared/json.js";
3
+ import { errorMessage, LoginSecrets, loginBounds, loginExecutable, stoppedResult, } from "../../shared/login.js";
4
+ import { startAppServerClient } from "./app-server-client.js";
5
+ /*
6
+ * Codex signs in over its app-server (0.160.0 schema), never through
7
+ * `codex login`, whose browser and device flows both clear the stored
8
+ * credentials before the new sign-in completes:
9
+ *
10
+ * → account/login/start { type: "chatgptDeviceCode" }
11
+ * ← { type: "chatgptDeviceCode", loginId, verificationUrl, userCode }
12
+ * ← account/login/completed { loginId, success, error } (notification)
13
+ * → account/read {} ← { account: { type, email, planType } | null, ... }
14
+ *
15
+ * The app-server polls on its own and writes the credential store only once
16
+ * the new tokens are exchanged, so a failure, a cancel or the expiry leaves
17
+ * the stored login untouched; the code expires after 15 minutes. The
18
+ * `chatgptDeviceCode` login type arrived in 0.118.0. Device code sign-in
19
+ * must be allowed in the ChatGPT account's security settings (a workspace
20
+ * admin's permission for workspace accounts).
21
+ */
22
+ const DEVICE_CODE_FLOOR = "0.118.0";
23
+ /** Past the code's 15 minutes, so codex reports the expiry itself. */
24
+ const LOGIN_TIMEOUT_MS = 16 * 60_000;
25
+ const STATUS_TIMEOUT_MS = 20_000;
26
+ const STATUS_SOURCE = "codex login status";
27
+ const DEVICE_CODE_SETTING = "Device code sign-in must be allowed in your ChatGPT security settings (for a workspace account, by its admin).";
28
+ function text(value) {
29
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
30
+ }
31
+ /**
32
+ * `codex login status` prints to stderr and exits 0 when logged in
33
+ * (`Logged in using ChatGPT`, or `Logged in using an API key - <masked>`),
34
+ * 1 with `Not logged in` when logged out, and 1 with another message when
35
+ * it cannot tell (an unreadable configuration or credential store).
36
+ */
37
+ export function projectCodexLoginStatus(exitCode, output) {
38
+ if (exitCode === 0) {
39
+ const method = /Logged in using ChatGPT/u.test(output) ? "chatgpt" : (/Logged in using an API key/u.test(output) ? "apiKey" : undefined);
40
+ return { kind: "logged_in", ...(method === undefined ? {} : { account: { method } }), source: STATUS_SOURCE };
41
+ }
42
+ if (exitCode === 1 && /^Not logged in\b/mu.test(output)) {
43
+ return { kind: "logged_out", source: STATUS_SOURCE };
44
+ }
45
+ const line = output.trim().split(/\r?\n/u).at(-1) ?? "";
46
+ return {
47
+ kind: "unknown",
48
+ detail: new LoginSecrets().redact(line === "" ? `exit ${String(exitCode)}` : line),
49
+ source: STATUS_SOURCE,
50
+ };
51
+ }
52
+ export async function codexAuthStatus(installation, options = {}) {
53
+ if (installation.via !== "executable") {
54
+ return { kind: "unknown", detail: "not a machine-installed executable" };
55
+ }
56
+ const result = await runExecutable(installation.command, ["login", "status"], { timeoutMs: options.timeoutMs ?? STATUS_TIMEOUT_MS });
57
+ return projectCodexLoginStatus(result.ok ? 0 : result.exitCode, `${result.stdout}\n${result.stderr}`);
58
+ }
59
+ /** `account/read` after the sign-in; null when codex reports no account. */
60
+ export function projectCodexAccount(result) {
61
+ const account = asRecord(asRecord(result)?.account);
62
+ if (account === null) {
63
+ return null;
64
+ }
65
+ const email = text(account.email);
66
+ const plan = text(account.planType);
67
+ const method = text(account.type);
68
+ return {
69
+ ...(email === undefined ? {} : { email }),
70
+ ...(plan === undefined ? {} : { plan }),
71
+ ...(method === undefined ? {} : { method }),
72
+ };
73
+ }
74
+ /** `account/read` on the same app-server, bounded by the status deadline and the caller's abort; undefined when it gave no answer. */
75
+ async function readAccount(client, signal) {
76
+ if (signal?.aborted === true) {
77
+ return undefined;
78
+ }
79
+ const bounds = loginBounds(signal, STATUS_TIMEOUT_MS);
80
+ try {
81
+ const answer = await Promise.race([
82
+ // oxlint-disable-next-line promise/prefer-await-to-then -- a late rejection (the app-server stopped) is no answer
83
+ client.request("account/read", {}).catch(() => undefined),
84
+ // oxlint-disable-next-line promise/prefer-await-to-then -- the deadline and abort race the read
85
+ bounds.stopped.then(() => undefined),
86
+ ]);
87
+ return answer;
88
+ }
89
+ finally {
90
+ bounds.dispose();
91
+ }
92
+ }
93
+ /** After codex reported success: logged in, with the account when `account/read` names one. */
94
+ async function confirmed(client, signal) {
95
+ const read = await readAccount(client, signal);
96
+ if (read === undefined) {
97
+ return { kind: "logged_in" };
98
+ }
99
+ const account = projectCodexAccount(read);
100
+ return account === null
101
+ ? { kind: "failed", reason: "not_logged_in", detail: "codex reported success, yet account/read shows no account" }
102
+ : { kind: "logged_in", ...(Object.keys(account).length === 0 ? {} : { account }) };
103
+ }
104
+ function exitDetail(code) {
105
+ return `codex app-server exited${code === null || code === undefined ? "" : ` with code ${String(code)}`}`;
106
+ }
107
+ async function runCodexLogin(command, interaction, timeoutMs) {
108
+ const secrets = new LoginSecrets();
109
+ let client = null;
110
+ try {
111
+ // Its stderr never reaches the host's, and a stop takes its Windows process tree too.
112
+ client = startAppServerClient(command, undefined, {}, undefined, { inheritStderr: false, killTree: true });
113
+ }
114
+ catch (error) {
115
+ return { kind: "failed", reason: "process_failed", detail: secrets.line(errorMessage(error)) };
116
+ }
117
+ const app = client;
118
+ const completion = Promise.withResolvers();
119
+ const flow = { loginId: undefined, early: [], exitCode: undefined, settled: false, confirmation: undefined };
120
+ const ours = (params) => {
121
+ const id = params.loginId;
122
+ return id === undefined || id === null || id === flow.loginId;
123
+ };
124
+ const complete = (params) => {
125
+ if (params.success === true) {
126
+ flow.confirmation ??= confirmed(app, interaction.signal);
127
+ }
128
+ completion.resolve({ kind: "completed", params });
129
+ };
130
+ app.onExit((code) => {
131
+ flow.exitCode = code;
132
+ completion.resolve({ kind: "exited", code });
133
+ });
134
+ app.handle({
135
+ onNotification(method, params) {
136
+ if (method !== "account/login/completed") {
137
+ return;
138
+ }
139
+ if (flow.loginId === undefined) {
140
+ flow.early.push(params);
141
+ }
142
+ else if (ours(params)) {
143
+ complete(params);
144
+ }
145
+ },
146
+ onServerRequest() {
147
+ // A login asks the client nothing.
148
+ },
149
+ });
150
+ const run = async () => {
151
+ try {
152
+ await app.spawned;
153
+ }
154
+ catch (error) {
155
+ // An executable that cannot run (found, yet not startable) says so in Node's words.
156
+ return { kind: "failed", reason: "process_failed", detail: secrets.line(errorMessage(error)) };
157
+ }
158
+ try {
159
+ await app.request("initialize", { clientInfo: { name: "oar", version: "0.0.0" }, capabilities: { experimentalApi: true } });
160
+ app.notify("initialized", {});
161
+ const started = await app.request("account/login/start", { type: "chatgptDeviceCode" }, (outcome) => {
162
+ if (outcome.kind === "result") {
163
+ flow.loginId = text(outcome.result.loginId);
164
+ for (const params of flow.early.splice(0)) {
165
+ if (ours(params)) {
166
+ complete(params);
167
+ }
168
+ }
169
+ }
170
+ });
171
+ const verificationUri = text(started.verificationUrl);
172
+ const userCode = text(started.userCode);
173
+ if (flow.loginId === undefined || verificationUri === undefined || userCode === undefined) {
174
+ return { kind: "failed", reason: "process_failed", detail: "codex answered account/login/start without a device code" };
175
+ }
176
+ // A success that came before the start reply is final: nothing left to show the person.
177
+ const early = flow.confirmation;
178
+ if (early !== undefined) {
179
+ return await early;
180
+ }
181
+ if (!flow.settled) {
182
+ try {
183
+ interaction.onEvent({ kind: "device_code", userCode, verificationUri });
184
+ interaction.onEvent({ kind: "info", message: DEVICE_CODE_SETTING });
185
+ }
186
+ catch (error) {
187
+ // A caller that cannot show the code cannot finish the login.
188
+ return { kind: "failed", reason: "interaction_failed", detail: secrets.line(errorMessage(error)) };
189
+ }
190
+ }
191
+ const done = await completion.promise;
192
+ if (flow.confirmation !== undefined) {
193
+ return await flow.confirmation;
194
+ }
195
+ if (done.kind === "exited") {
196
+ return { kind: "failed", reason: "process_failed", detail: `${exitDetail(done.code)} before the sign-in completed` };
197
+ }
198
+ return { kind: "failed", reason: "rejected", detail: secrets.line(text(done.params.error) ?? "codex reported that the sign-in failed") };
199
+ }
200
+ catch (error) {
201
+ // An exit's error carries the app-server's stderr tail: only the exit is reported, never that tail.
202
+ return flow.exitCode === undefined
203
+ ? { kind: "failed", reason: "rejected", detail: secrets.line(errorMessage(error)) }
204
+ : { kind: "failed", reason: "process_failed", detail: exitDetail(flow.exitCode) };
205
+ }
206
+ };
207
+ const bounds = loginBounds(interaction.signal, timeoutMs);
208
+ try {
209
+ const ending = await Promise.race([
210
+ run(),
211
+ // oxlint-disable-next-line promise/prefer-await-to-then -- the deadline and abort race the flow
212
+ bounds.stopped.then((stop) => stop),
213
+ ]);
214
+ flow.settled = true;
215
+ if (typeof ending !== "string") {
216
+ return ending;
217
+ }
218
+ // Codex reported success before the stop: the login is stored.
219
+ return flow.confirmation === undefined ? stoppedResult(ending, timeoutMs) : await flow.confirmation;
220
+ }
221
+ finally {
222
+ flow.settled = true;
223
+ bounds.dispose();
224
+ // The pending login lives in the app-server; stopping it (and its group or tree) ends the polling.
225
+ app.kill();
226
+ await app.exited;
227
+ }
228
+ }
229
+ /** Signs codex in with the app-server's ChatGPT device code flow, relaying the code and its URL. */
230
+ export async function codexLogin(installation, interaction, options = {}) {
231
+ const target = loginExecutable(installation, "codex", DEVICE_CODE_FLOOR);
232
+ if (target.kind === "settled") {
233
+ return target.result;
234
+ }
235
+ if (interaction.signal?.aborted === true) {
236
+ return { kind: "cancelled" };
237
+ }
238
+ const result = await runCodexLogin(target.installation.command, interaction, options.timeoutMs ?? LOGIN_TIMEOUT_MS);
239
+ return result;
240
+ }
241
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/runtimes/codex/login.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@ export { runIsolated, type IsolatedResult } from "./isolated.js";
3
3
  export type { ExecutableResult, ExecutableRunner, ExecutableRunOptions } from "./run.js";
4
4
  export { runExecutable } from "./run.js";
5
5
  export { readExecutableVersion, type VersionReader } from "./version.js";
6
- export type { LineProcess } from "./process.js";
7
- export { KILL_GRACE_MS, killGraceMs, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, } from "./process.js";
6
+ export type { LineProcess, LineProcessOptions } from "./process.js";
7
+ export { KILL_GRACE_MS, killGraceMs, killProcessTree, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, } from "./process.js";
8
8
  //# sourceMappingURL=index.d.ts.map