@botiverse/oar 0.0.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/LICENSE +202 -0
- package/README.md +13 -0
- package/dist/contracts/account-usage.d.ts +33 -0
- package/dist/contracts/account-usage.d.ts.map +1 -0
- package/dist/contracts/account-usage.js +2 -0
- package/dist/contracts/account-usage.js.map +1 -0
- package/dist/contracts/installation.d.ts +27 -0
- package/dist/contracts/installation.d.ts.map +1 -0
- package/dist/contracts/installation.js +2 -0
- package/dist/contracts/installation.js.map +1 -0
- package/dist/contracts/runtime.d.ts +12 -0
- package/dist/contracts/runtime.d.ts.map +1 -0
- package/dist/contracts/runtime.js +4 -0
- package/dist/contracts/runtime.js.map +1 -0
- package/dist/contracts/session.d.ts +188 -0
- package/dist/contracts/session.d.ts.map +1 -0
- package/dist/contracts/session.js +2 -0
- package/dist/contracts/session.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/installation.d.ts +15 -0
- package/dist/installation.d.ts.map +1 -0
- package/dist/installation.js +60 -0
- package/dist/installation.js.map +1 -0
- package/dist/observe/agent-status.d.ts +39 -0
- package/dist/observe/agent-status.d.ts.map +1 -0
- package/dist/observe/agent-status.js +31 -0
- package/dist/observe/agent-status.js.map +1 -0
- package/dist/observe/aggregate-events.d.ts +15 -0
- package/dist/observe/aggregate-events.d.ts.map +1 -0
- package/dist/observe/aggregate-events.js +70 -0
- package/dist/observe/aggregate-events.js.map +1 -0
- package/dist/observe/index.d.ts +17 -0
- package/dist/observe/index.d.ts.map +1 -0
- package/dist/observe/index.js +13 -0
- package/dist/observe/index.js.map +1 -0
- package/dist/observe/observe-agent.d.ts +38 -0
- package/dist/observe/observe-agent.d.ts.map +1 -0
- package/dist/observe/observe-agent.js +61 -0
- package/dist/observe/observe-agent.js.map +1 -0
- package/dist/observe/stall-observer.d.ts +19 -0
- package/dist/observe/stall-observer.d.ts.map +1 -0
- package/dist/observe/stall-observer.js +36 -0
- package/dist/observe/stall-observer.js.map +1 -0
- package/dist/observe/tool-activity.d.ts +21 -0
- package/dist/observe/tool-activity.d.ts.map +1 -0
- package/dist/observe/tool-activity.js +87 -0
- package/dist/observe/tool-activity.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +30 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtimes/claude/account-usage.d.ts +29 -0
- package/dist/runtimes/claude/account-usage.d.ts.map +1 -0
- package/dist/runtimes/claude/account-usage.js +179 -0
- package/dist/runtimes/claude/account-usage.js.map +1 -0
- package/dist/runtimes/claude/context-usage.d.ts +10 -0
- package/dist/runtimes/claude/context-usage.d.ts.map +1 -0
- package/dist/runtimes/claude/context-usage.js +23 -0
- package/dist/runtimes/claude/context-usage.js.map +1 -0
- package/dist/runtimes/claude/index.d.ts +9 -0
- package/dist/runtimes/claude/index.d.ts.map +1 -0
- package/dist/runtimes/claude/index.js +13 -0
- package/dist/runtimes/claude/index.js.map +1 -0
- package/dist/runtimes/claude/installation.d.ts +2 -0
- package/dist/runtimes/claude/installation.d.ts.map +1 -0
- package/dist/runtimes/claude/installation.js +3 -0
- package/dist/runtimes/claude/installation.js.map +1 -0
- package/dist/runtimes/claude/projection.d.ts +46 -0
- package/dist/runtimes/claude/projection.d.ts.map +1 -0
- package/dist/runtimes/claude/projection.js +110 -0
- package/dist/runtimes/claude/projection.js.map +1 -0
- package/dist/runtimes/claude/session.d.ts +3 -0
- package/dist/runtimes/claude/session.d.ts.map +1 -0
- package/dist/runtimes/claude/session.js +166 -0
- package/dist/runtimes/claude/session.js.map +1 -0
- package/dist/runtimes/codex/account-usage.d.ts +40 -0
- package/dist/runtimes/codex/account-usage.d.ts.map +1 -0
- package/dist/runtimes/codex/account-usage.js +185 -0
- package/dist/runtimes/codex/account-usage.js.map +1 -0
- package/dist/runtimes/codex/app-server-client.d.ts +17 -0
- package/dist/runtimes/codex/app-server-client.d.ts.map +1 -0
- package/dist/runtimes/codex/app-server-client.js +68 -0
- package/dist/runtimes/codex/app-server-client.js.map +1 -0
- package/dist/runtimes/codex/context-usage.d.ts +10 -0
- package/dist/runtimes/codex/context-usage.d.ts.map +1 -0
- package/dist/runtimes/codex/context-usage.js +16 -0
- package/dist/runtimes/codex/context-usage.js.map +1 -0
- package/dist/runtimes/codex/index.d.ts +9 -0
- package/dist/runtimes/codex/index.d.ts.map +1 -0
- package/dist/runtimes/codex/index.js +13 -0
- package/dist/runtimes/codex/index.js.map +1 -0
- package/dist/runtimes/codex/installation.d.ts +2 -0
- package/dist/runtimes/codex/installation.d.ts.map +1 -0
- package/dist/runtimes/codex/installation.js +17 -0
- package/dist/runtimes/codex/installation.js.map +1 -0
- package/dist/runtimes/codex/item-detail.d.ts +4 -0
- package/dist/runtimes/codex/item-detail.d.ts.map +1 -0
- package/dist/runtimes/codex/item-detail.js +47 -0
- package/dist/runtimes/codex/item-detail.js.map +1 -0
- package/dist/runtimes/codex/projection.d.ts +28 -0
- package/dist/runtimes/codex/projection.d.ts.map +1 -0
- package/dist/runtimes/codex/projection.js +98 -0
- package/dist/runtimes/codex/projection.js.map +1 -0
- package/dist/runtimes/codex/reasoning.d.ts +4 -0
- package/dist/runtimes/codex/reasoning.d.ts.map +1 -0
- package/dist/runtimes/codex/reasoning.js +23 -0
- package/dist/runtimes/codex/reasoning.js.map +1 -0
- package/dist/runtimes/codex/session.d.ts +3 -0
- package/dist/runtimes/codex/session.d.ts.map +1 -0
- package/dist/runtimes/codex/session.js +199 -0
- package/dist/runtimes/codex/session.js.map +1 -0
- package/dist/runtimes/pi/index.d.ts +12 -0
- package/dist/runtimes/pi/index.d.ts.map +1 -0
- package/dist/runtimes/pi/index.js +15 -0
- package/dist/runtimes/pi/index.js.map +1 -0
- package/dist/runtimes/pi/installation.d.ts +10 -0
- package/dist/runtimes/pi/installation.d.ts.map +1 -0
- package/dist/runtimes/pi/installation.js +33 -0
- package/dist/runtimes/pi/installation.js.map +1 -0
- package/dist/runtimes/pi/projection.d.ts +39 -0
- package/dist/runtimes/pi/projection.d.ts.map +1 -0
- package/dist/runtimes/pi/projection.js +112 -0
- package/dist/runtimes/pi/projection.js.map +1 -0
- package/dist/runtimes/pi/session.d.ts +11 -0
- package/dist/runtimes/pi/session.d.ts.map +1 -0
- package/dist/runtimes/pi/session.js +201 -0
- package/dist/runtimes/pi/session.js.map +1 -0
- package/dist/runtimes/pi/tool-detail.d.ts +4 -0
- package/dist/runtimes/pi/tool-detail.d.ts.map +1 -0
- package/dist/runtimes/pi/tool-detail.js +14 -0
- package/dist/runtimes/pi/tool-detail.js.map +1 -0
- package/dist/shared/diagnostic-text.d.ts +2 -0
- package/dist/shared/diagnostic-text.d.ts.map +1 -0
- package/dist/shared/diagnostic-text.js +15 -0
- package/dist/shared/diagnostic-text.js.map +1 -0
- package/dist/shared/executable/index.d.ts +8 -0
- package/dist/shared/executable/index.d.ts.map +1 -0
- package/dist/shared/executable/index.js +5 -0
- package/dist/shared/executable/index.js.map +1 -0
- package/dist/shared/executable/process.d.ts +27 -0
- package/dist/shared/executable/process.d.ts.map +1 -0
- package/dist/shared/executable/process.js +77 -0
- package/dist/shared/executable/process.js.map +1 -0
- package/dist/shared/executable/resolve.d.ts +16 -0
- package/dist/shared/executable/resolve.d.ts.map +1 -0
- package/dist/shared/executable/resolve.js +63 -0
- package/dist/shared/executable/resolve.js.map +1 -0
- package/dist/shared/executable/run.d.ts +13 -0
- package/dist/shared/executable/run.d.ts.map +1 -0
- package/dist/shared/executable/run.js +26 -0
- package/dist/shared/executable/run.js.map +1 -0
- package/dist/shared/executable/version.d.ts +6 -0
- package/dist/shared/executable/version.d.ts.map +1 -0
- package/dist/shared/executable/version.js +17 -0
- package/dist/shared/executable/version.js.map +1 -0
- package/dist/shared/failure-class.d.ts +8 -0
- package/dist/shared/failure-class.d.ts.map +1 -0
- package/dist/shared/failure-class.js +24 -0
- package/dist/shared/failure-class.js.map +1 -0
- package/dist/shared/installation.d.ts +9 -0
- package/dist/shared/installation.d.ts.map +1 -0
- package/dist/shared/installation.js +53 -0
- package/dist/shared/installation.js.map +1 -0
- package/dist/shared/instant.d.ts +4 -0
- package/dist/shared/instant.d.ts.map +1 -0
- package/dist/shared/instant.js +4 -0
- package/dist/shared/instant.js.map +1 -0
- package/dist/shared/json.d.ts +10 -0
- package/dist/shared/json.d.ts.map +1 -0
- package/dist/shared/json.js +29 -0
- package/dist/shared/json.js.map +1 -0
- package/dist/shared/seal-session.d.ts +8 -0
- package/dist/shared/seal-session.d.ts.map +1 -0
- package/dist/shared/seal-session.js +24 -0
- package/dist/shared/seal-session.js.map +1 -0
- package/dist/shared/session-kernel.d.ts +25 -0
- package/dist/shared/session-kernel.d.ts.map +1 -0
- package/dist/shared/session-kernel.js +64 -0
- package/dist/shared/session-kernel.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { spawnLineProcess } from "../../shared/executable/index.js";
|
|
3
|
+
import { asRecord, parseJson } from "../../shared/json.js";
|
|
4
|
+
import { claudeContextUsageFromResult } from "./context-usage.js";
|
|
5
|
+
import { sealSession } from "../../shared/seal-session.js";
|
|
6
|
+
import { createSessionKernel } from "../../shared/session-kernel.js";
|
|
7
|
+
import { claudeAbortRequested, claudePrompted, foldClaudeStdout, initialClaudeProjection, } from "./projection.js";
|
|
8
|
+
/*
|
|
9
|
+
* Live semantics this adapter is built on (drydock probes, 2026-08-21):
|
|
10
|
+
* - stdin accepts writes at every phase; a mid-turn write is delivered into
|
|
11
|
+
* the ACTIVE turn at the next model-step boundary (steer), or becomes the
|
|
12
|
+
* next turn when no step remains. Landing shows up in the event stream.
|
|
13
|
+
* - each turn is framed by its own system/init … result pair.
|
|
14
|
+
* - `control_request {subtype:"interrupt"}` is acked with control_response and
|
|
15
|
+
* settles the active turn with an error-subtype result.
|
|
16
|
+
* - steer `accepted` here means: the user message was written to stdin.
|
|
17
|
+
* Landing (same turn vs auto-queued next turn) is claude's timing and shows
|
|
18
|
+
* up only in the event stream. Live probe: claude-session-adapter.ts.
|
|
19
|
+
*/
|
|
20
|
+
function userMessage(text) {
|
|
21
|
+
return `${JSON.stringify({
|
|
22
|
+
type: "user",
|
|
23
|
+
message: { role: "user", content: [{ type: "text", text }] },
|
|
24
|
+
})}\n`;
|
|
25
|
+
}
|
|
26
|
+
export const claudeSession = async (installation, options) => {
|
|
27
|
+
if (installation.via !== "executable") {
|
|
28
|
+
throw new Error("The claude session adapter needs an executable installation");
|
|
29
|
+
}
|
|
30
|
+
// Session identity is claude's own: we either choose it up front
|
|
31
|
+
// (--session-id) or reattach to an existing one (--resume), so Session.id
|
|
32
|
+
// is always the runtime-native persistent id.
|
|
33
|
+
const sessionId = options.resume ?? randomUUID();
|
|
34
|
+
const child = spawnLineProcess(installation.command, [
|
|
35
|
+
"-p",
|
|
36
|
+
"--input-format", "stream-json",
|
|
37
|
+
"--output-format", "stream-json",
|
|
38
|
+
"--verbose",
|
|
39
|
+
// YOLO by default (repo policy, 2026-08-24): in embedded/SDK use there is
|
|
40
|
+
// no human at an approval prompt — a permission gate is a hang, not
|
|
41
|
+
// safety. Isolation is the sandbox's job, not the approval flow's.
|
|
42
|
+
"--dangerously-skip-permissions",
|
|
43
|
+
...(options.resume === undefined ? ["--session-id", sessionId] : ["--resume", sessionId]),
|
|
44
|
+
...(options.model === undefined ? [] : ["--model", options.model]),
|
|
45
|
+
...(options.systemPrompt === undefined ? [] : ["--system-prompt", options.systemPrompt]),
|
|
46
|
+
...(options.appendSystemPrompt === undefined ? [] : ["--append-system-prompt", options.appendSystemPrompt]),
|
|
47
|
+
], {
|
|
48
|
+
cwd: options.cwd,
|
|
49
|
+
env: { ...process.env, CLAUDECODE: undefined, ...options.env },
|
|
50
|
+
});
|
|
51
|
+
await child.spawned;
|
|
52
|
+
const kernel = createSessionKernel(sessionId);
|
|
53
|
+
const state = { child, turn: null, projection: initialClaudeProjection, disposed: false };
|
|
54
|
+
let interruptCounter = 0;
|
|
55
|
+
// claude cannot hold input for a LATER turn natively (an active-turn write
|
|
56
|
+
// steers), so queueing is adapter-held: drained one message per turn end.
|
|
57
|
+
const heldQueue = [];
|
|
58
|
+
// Current context fullness snapshot (last-write-wins from the result frame).
|
|
59
|
+
let latestContextUsage = null;
|
|
60
|
+
// Drive the pure projection fold, applying its commands to the kernel. The
|
|
61
|
+
// fold owns turn framing and event translation; this owns only transport.
|
|
62
|
+
child.onLine((line) => {
|
|
63
|
+
const message = asRecord(parseJson(line));
|
|
64
|
+
if (message === null) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (message.type === "result") {
|
|
68
|
+
latestContextUsage = claudeContextUsageFromResult(message) ?? latestContextUsage;
|
|
69
|
+
}
|
|
70
|
+
const { state: nextProjection, commands } = foldClaudeStdout(state.projection, message);
|
|
71
|
+
state.projection = nextProjection;
|
|
72
|
+
let settled = false;
|
|
73
|
+
for (const command of commands) {
|
|
74
|
+
switch (command.kind) {
|
|
75
|
+
case "begin":
|
|
76
|
+
state.turn = kernel.begin();
|
|
77
|
+
break;
|
|
78
|
+
case "emit":
|
|
79
|
+
state.turn?.emit(command.body);
|
|
80
|
+
break;
|
|
81
|
+
case "settle":
|
|
82
|
+
state.turn?.settle(command.outcome);
|
|
83
|
+
state.turn = null;
|
|
84
|
+
settled = true;
|
|
85
|
+
break;
|
|
86
|
+
default:
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (settled && !state.disposed) {
|
|
91
|
+
const next = heldQueue.shift();
|
|
92
|
+
if (next !== undefined) {
|
|
93
|
+
child.write(userMessage(next));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
child.onExit(() => {
|
|
98
|
+
const active = kernel.active();
|
|
99
|
+
if (active !== null && !state.disposed) {
|
|
100
|
+
active.settle({ kind: "failed", reason: "claude process exited", failure: "runtime_exited" });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
const makeTurn = (turn) => ({
|
|
104
|
+
id: turn.id,
|
|
105
|
+
outcome: turn.outcome,
|
|
106
|
+
abort: async () => {
|
|
107
|
+
if (turn.settled()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
state.projection = claudeAbortRequested(state.projection);
|
|
111
|
+
interruptCounter += 1;
|
|
112
|
+
child.write(`${JSON.stringify({
|
|
113
|
+
type: "control_request",
|
|
114
|
+
request_id: `interrupt-${interruptCounter}`,
|
|
115
|
+
request: { subtype: "interrupt" },
|
|
116
|
+
})}\n`);
|
|
117
|
+
await turn.outcome;
|
|
118
|
+
},
|
|
119
|
+
steer: async (input) => {
|
|
120
|
+
await Promise.resolve();
|
|
121
|
+
if (turn.settled()) {
|
|
122
|
+
return { kind: "not_steerable", reason: "turn already ended" };
|
|
123
|
+
}
|
|
124
|
+
child.write(userMessage(input));
|
|
125
|
+
return { kind: "accepted" };
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const session = sealSession({
|
|
129
|
+
id: kernel.sessionId,
|
|
130
|
+
prompt(input) {
|
|
131
|
+
const turn = kernel.begin();
|
|
132
|
+
if (turn === null) {
|
|
133
|
+
return { kind: "busy" };
|
|
134
|
+
}
|
|
135
|
+
state.turn = turn;
|
|
136
|
+
state.projection = claudePrompted();
|
|
137
|
+
child.write(userMessage(input));
|
|
138
|
+
return { kind: "turn", turn: makeTurn(turn) };
|
|
139
|
+
},
|
|
140
|
+
subscribe: (observer) => kernel.subscribe(observer),
|
|
141
|
+
contextUsage: () => latestContextUsage,
|
|
142
|
+
queue: {
|
|
143
|
+
durable: false,
|
|
144
|
+
add: async (input) => {
|
|
145
|
+
await Promise.resolve();
|
|
146
|
+
if (kernel.active() === null) {
|
|
147
|
+
child.write(userMessage(input));
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
heldQueue.push(input);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
dispose: async () => {
|
|
155
|
+
if (state.disposed) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
state.disposed = true;
|
|
159
|
+
kernel.active()?.settle({ kind: "aborted" });
|
|
160
|
+
child.kill();
|
|
161
|
+
await child.exited; // release point for anything the process held
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
return session;
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/claude/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AccountUsageReader, AccountUsageSnapshot } from "../../contracts/account-usage.js";
|
|
2
|
+
/**
|
|
3
|
+
* Native evidence comes from `codex app-server --listen stdio://`, followed by
|
|
4
|
+
* `initialize` and `account/rateLimits/read`. `rateLimits` is the
|
|
5
|
+
* backward-compatible single-bucket view; `rateLimitsByLimitId` is the
|
|
6
|
+
* optional multi-bucket view. A representative response is:
|
|
7
|
+
*
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "rateLimits": {
|
|
11
|
+
* "limitId": "codex",
|
|
12
|
+
* "limitName": null,
|
|
13
|
+
* "primary": { "usedPercent": 50, "windowDurationMins": 10080, "resetsAt": 1787820410 },
|
|
14
|
+
* "secondary": null,
|
|
15
|
+
* "planType": "pro",
|
|
16
|
+
* "rateLimitReachedType": null
|
|
17
|
+
* },
|
|
18
|
+
* "rateLimitsByLimitId": {
|
|
19
|
+
* "codex_bengalfox": {
|
|
20
|
+
* "limitId": "codex_bengalfox",
|
|
21
|
+
* "limitName": "GPT-5.3-Codex-Spark",
|
|
22
|
+
* "primary": { "usedPercent": 0, "windowDurationMins": 300, "resetsAt": 1787322278 },
|
|
23
|
+
* "secondary": { "usedPercent": 0, "windowDurationMins": 10080, "resetsAt": 1787909078 },
|
|
24
|
+
* "planType": "pro"
|
|
25
|
+
* },
|
|
26
|
+
* "codex": {
|
|
27
|
+
* "limitId": "codex",
|
|
28
|
+
* "limitName": null,
|
|
29
|
+
* "primary": { "usedPercent": 50, "windowDurationMins": 10080, "resetsAt": 1787820410 },
|
|
30
|
+
* "secondary": null,
|
|
31
|
+
* "planType": "pro",
|
|
32
|
+
* "rateLimitReachedType": null
|
|
33
|
+
* }
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function projectCodexUsage(result: unknown): AccountUsageSnapshot;
|
|
39
|
+
export declare const codexAccountUsage: AccountUsageReader;
|
|
40
|
+
//# sourceMappingURL=account-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-usage.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/account-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,kCAAkC,CAAC;AA2E1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,oBAAoB,CA4CvE;AA8BD,eAAO,MAAM,iBAAiB,EAAE,kBAgB/B,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { startAppServerClient } from "./app-server-client.js";
|
|
2
|
+
import { asEpochInstant, asNumber, asRecord } from "../../shared/json.js";
|
|
3
|
+
function text(value) {
|
|
4
|
+
if (typeof value !== "string") {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const trimmed = value.trim();
|
|
8
|
+
return trimmed.length > 0 && trimmed.length <= 80 ? trimmed : undefined;
|
|
9
|
+
}
|
|
10
|
+
function windowLabel(value) {
|
|
11
|
+
const minutes = asNumber(value);
|
|
12
|
+
if (minutes === null || minutes <= 0) {
|
|
13
|
+
return "Usage limit";
|
|
14
|
+
}
|
|
15
|
+
if (minutes % (7 * 24 * 60) === 0) {
|
|
16
|
+
const weeks = minutes / (7 * 24 * 60);
|
|
17
|
+
return `${weeks} ${weeks === 1 ? "week" : "weeks"}`;
|
|
18
|
+
}
|
|
19
|
+
if (minutes % (24 * 60) === 0) {
|
|
20
|
+
const days = minutes / (24 * 60);
|
|
21
|
+
return `${days} ${days === 1 ? "day" : "days"}`;
|
|
22
|
+
}
|
|
23
|
+
if (minutes % 60 === 0) {
|
|
24
|
+
const hours = minutes / 60;
|
|
25
|
+
return `${hours} ${hours === 1 ? "hour" : "hours"}`;
|
|
26
|
+
}
|
|
27
|
+
return `${minutes} minutes`;
|
|
28
|
+
}
|
|
29
|
+
function limitLabel(bucket) {
|
|
30
|
+
const name = text(bucket.limitName);
|
|
31
|
+
if (name !== undefined) {
|
|
32
|
+
return name;
|
|
33
|
+
}
|
|
34
|
+
const id = text(bucket.limitId);
|
|
35
|
+
return id === "codex" ? "Codex" : id;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Mirrors Codex TUI's `app_server_rate_limit_snapshots` merge and deduplication.
|
|
39
|
+
* Source (2026-08-22):
|
|
40
|
+
* https://github.com/openai/codex/blob/4f39251a010a8bd7d692d25fb33832ff06f1635a/codex-rs/tui/src/app_server_session.rs#L2084-L2103
|
|
41
|
+
*/
|
|
42
|
+
function rateLimitBuckets(historical, indexed) {
|
|
43
|
+
const primaryLimitId = text(historical?.limitId);
|
|
44
|
+
const buckets = historical === null ? [] : [historical];
|
|
45
|
+
if (indexed === null) {
|
|
46
|
+
return buckets;
|
|
47
|
+
}
|
|
48
|
+
for (const [limitId, value] of Object.entries(indexed)) {
|
|
49
|
+
const bucket = asRecord(value);
|
|
50
|
+
if (bucket === null) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (primaryLimitId !== undefined
|
|
54
|
+
&& (primaryLimitId === limitId || primaryLimitId === text(bucket.limitId))) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
buckets.push(bucket);
|
|
58
|
+
}
|
|
59
|
+
return buckets;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Native evidence comes from `codex app-server --listen stdio://`, followed by
|
|
63
|
+
* `initialize` and `account/rateLimits/read`. `rateLimits` is the
|
|
64
|
+
* backward-compatible single-bucket view; `rateLimitsByLimitId` is the
|
|
65
|
+
* optional multi-bucket view. A representative response is:
|
|
66
|
+
*
|
|
67
|
+
* ```json
|
|
68
|
+
* {
|
|
69
|
+
* "rateLimits": {
|
|
70
|
+
* "limitId": "codex",
|
|
71
|
+
* "limitName": null,
|
|
72
|
+
* "primary": { "usedPercent": 50, "windowDurationMins": 10080, "resetsAt": 1787820410 },
|
|
73
|
+
* "secondary": null,
|
|
74
|
+
* "planType": "pro",
|
|
75
|
+
* "rateLimitReachedType": null
|
|
76
|
+
* },
|
|
77
|
+
* "rateLimitsByLimitId": {
|
|
78
|
+
* "codex_bengalfox": {
|
|
79
|
+
* "limitId": "codex_bengalfox",
|
|
80
|
+
* "limitName": "GPT-5.3-Codex-Spark",
|
|
81
|
+
* "primary": { "usedPercent": 0, "windowDurationMins": 300, "resetsAt": 1787322278 },
|
|
82
|
+
* "secondary": { "usedPercent": 0, "windowDurationMins": 10080, "resetsAt": 1787909078 },
|
|
83
|
+
* "planType": "pro"
|
|
84
|
+
* },
|
|
85
|
+
* "codex": {
|
|
86
|
+
* "limitId": "codex",
|
|
87
|
+
* "limitName": null,
|
|
88
|
+
* "primary": { "usedPercent": 50, "windowDurationMins": 10080, "resetsAt": 1787820410 },
|
|
89
|
+
* "secondary": null,
|
|
90
|
+
* "planType": "pro",
|
|
91
|
+
* "rateLimitReachedType": null
|
|
92
|
+
* }
|
|
93
|
+
* }
|
|
94
|
+
* }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export function projectCodexUsage(result) {
|
|
98
|
+
const root = asRecord(result);
|
|
99
|
+
const historical = asRecord(root?.rateLimits);
|
|
100
|
+
const indexed = asRecord(root?.rateLimitsByLimitId);
|
|
101
|
+
const buckets = rateLimitBuckets(historical, indexed);
|
|
102
|
+
const windows = [];
|
|
103
|
+
let rateLimited = false;
|
|
104
|
+
let plan = undefined;
|
|
105
|
+
for (const bucket of buckets) {
|
|
106
|
+
const sourceLabel = limitLabel(bucket);
|
|
107
|
+
plan ??= text(bucket.planType);
|
|
108
|
+
rateLimited ||= bucket.rateLimitReachedType !== null
|
|
109
|
+
&& bucket.rateLimitReachedType !== undefined;
|
|
110
|
+
for (const kind of ["primary", "secondary"]) {
|
|
111
|
+
const candidate = asRecord(bucket[kind]);
|
|
112
|
+
if (candidate === null) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const usedPercent = asNumber(candidate.usedPercent);
|
|
116
|
+
if (usedPercent === null || usedPercent < 0 || usedPercent > 100) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const resetsAt = asEpochInstant(candidate.resetsAt);
|
|
120
|
+
const durationLabel = windowLabel(candidate.windowDurationMins);
|
|
121
|
+
windows.push({
|
|
122
|
+
label: sourceLabel === undefined ? durationLabel : `${sourceLabel} · ${durationLabel}`,
|
|
123
|
+
usedRatio: Number((usedPercent / 100).toFixed(6)),
|
|
124
|
+
...(resetsAt === null ? {} : { resetsAt }),
|
|
125
|
+
});
|
|
126
|
+
rateLimited ||= usedPercent >= 100;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (windows.length === 0) {
|
|
130
|
+
throw new Error("Codex returned no usable account usage windows");
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
kind: "available",
|
|
134
|
+
...(plan === undefined ? {} : { plan }),
|
|
135
|
+
rateLimited,
|
|
136
|
+
windows,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function readFromAppServer(command, timeoutMs) {
|
|
140
|
+
const client = startAppServerClient(command);
|
|
141
|
+
const deadline = setTimeout(() => {
|
|
142
|
+
client.kill();
|
|
143
|
+
}, timeoutMs);
|
|
144
|
+
try {
|
|
145
|
+
await client.request("initialize", {
|
|
146
|
+
clientInfo: { name: "oar", version: "0.0.0" },
|
|
147
|
+
capabilities: { experimentalApi: true },
|
|
148
|
+
});
|
|
149
|
+
client.notify("initialized", {});
|
|
150
|
+
const result = await client.request("account/rateLimits/read", {});
|
|
151
|
+
return { kind: "ok", result };
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
const message = error instanceof Error ? error.message : "";
|
|
155
|
+
if (/authentication required/iu.test(message)) {
|
|
156
|
+
return { kind: "reauth_required" };
|
|
157
|
+
}
|
|
158
|
+
if (/method not found|not supported/iu.test(message)) {
|
|
159
|
+
return { kind: "unsupported" };
|
|
160
|
+
}
|
|
161
|
+
return { kind: "error" };
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
clearTimeout(deadline);
|
|
165
|
+
client.kill();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export const codexAccountUsage = async (installation, options = {}) => {
|
|
169
|
+
if (installation.via !== "executable") {
|
|
170
|
+
return { kind: "unsupported" };
|
|
171
|
+
}
|
|
172
|
+
const outcome = await readFromAppServer(installation.command, options.timeoutMs ?? 8000);
|
|
173
|
+
switch (outcome.kind) {
|
|
174
|
+
case "ok":
|
|
175
|
+
return projectCodexUsage(outcome.result);
|
|
176
|
+
case "reauth_required":
|
|
177
|
+
return { kind: "reauth_required" };
|
|
178
|
+
case "unsupported":
|
|
179
|
+
return { kind: "unsupported" };
|
|
180
|
+
case "error":
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
throw new Error("Failed to read Codex account usage");
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=account-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-usage.js","sourceRoot":"","sources":["../../../src/runtimes/codex/account-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type JsonRecord } from "../../shared/json.js";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal persistent JSON-RPC client over codex app-server's stdio JSONL
|
|
4
|
+
* transport. Local to the codex runtime until a second consumer earns a
|
|
5
|
+
* shared promotion; process mechanics live in shared/executable.
|
|
6
|
+
*/
|
|
7
|
+
export interface AppServerClient {
|
|
8
|
+
readonly spawned: Promise<void>;
|
|
9
|
+
readonly exited: Promise<number | null>;
|
|
10
|
+
request(method: string, params: JsonRecord): Promise<JsonRecord>;
|
|
11
|
+
notify(method: string, params: JsonRecord): void;
|
|
12
|
+
onNotification(handler: (method: string, params: JsonRecord) => void): void;
|
|
13
|
+
onExit(handler: () => void): void;
|
|
14
|
+
kill(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare function startAppServerClient(command: string, env?: Readonly<Record<string, string>>, configOverrides?: Readonly<Record<string, string>>): AppServerClient;
|
|
17
|
+
//# sourceMappingURL=app-server-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server-client.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;;GAIG;AACH,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,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACjD,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5E,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;CACd;AAOD,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,GACrD,eAAe,CAoEjB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { spawnLineProcess } from "../../shared/executable/index.js";
|
|
2
|
+
import { asRecord, parseJson } from "../../shared/json.js";
|
|
3
|
+
export function startAppServerClient(command, env, configOverrides = {}) {
|
|
4
|
+
// -c KEY=VALUE injects config at launch. This is the ONLY seam that reaches
|
|
5
|
+
// codex's exec tool: thread/start.sandboxMode does not (pinned on a real
|
|
6
|
+
// login — thread param honored for its own turns but exec follows config).
|
|
7
|
+
const overrideArgs = Object.entries(configOverrides).flatMap(([key, value]) => ["-c", `${key}=${value}`]);
|
|
8
|
+
const child = spawnLineProcess(command, ["app-server", ...overrideArgs, "--listen", "stdio://"], env === undefined ? {} : { env: { ...process.env, ...env } });
|
|
9
|
+
const pending = new Map();
|
|
10
|
+
const notificationHandlers = [];
|
|
11
|
+
let nextId = 1;
|
|
12
|
+
child.onLine((line) => {
|
|
13
|
+
const message = asRecord(parseJson(line));
|
|
14
|
+
if (message === null) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (typeof message.id === "number" && pending.has(message.id)) {
|
|
18
|
+
const waiter = pending.get(message.id);
|
|
19
|
+
pending.delete(message.id);
|
|
20
|
+
const error = asRecord(message.error);
|
|
21
|
+
if (error !== null) {
|
|
22
|
+
waiter?.reject(new Error(typeof error.message === "string" ? error.message : "app-server error"));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
waiter?.resolve(asRecord(message.result) ?? {});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (typeof message.method === "string") {
|
|
29
|
+
const params = asRecord(message.params) ?? {};
|
|
30
|
+
for (const handler of notificationHandlers) {
|
|
31
|
+
handler(message.method, params);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
child.onExit(() => {
|
|
36
|
+
for (const waiter of pending.values()) {
|
|
37
|
+
waiter.reject(new Error("app-server exited"));
|
|
38
|
+
}
|
|
39
|
+
pending.clear();
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
spawned: child.spawned,
|
|
43
|
+
exited: child.exited,
|
|
44
|
+
async request(method, params) {
|
|
45
|
+
const id = nextId;
|
|
46
|
+
nextId += 1;
|
|
47
|
+
// oxlint-disable-next-line promise/avoid-new -- settlement is driven by the response pump
|
|
48
|
+
const result = await new Promise((resolve, reject) => {
|
|
49
|
+
pending.set(id, { resolve, reject });
|
|
50
|
+
child.write(`${JSON.stringify({ id, method, params })}\n`);
|
|
51
|
+
});
|
|
52
|
+
return result;
|
|
53
|
+
},
|
|
54
|
+
notify(method, params) {
|
|
55
|
+
child.write(`${JSON.stringify({ method, params })}\n`);
|
|
56
|
+
},
|
|
57
|
+
onNotification(handler) {
|
|
58
|
+
notificationHandlers.push(handler);
|
|
59
|
+
},
|
|
60
|
+
onExit(handler) {
|
|
61
|
+
child.onExit(handler);
|
|
62
|
+
},
|
|
63
|
+
kill() {
|
|
64
|
+
child.kill();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=app-server-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server-client.js","sourceRoot":"","sources":["../../../src/runtimes/codex/app-server-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ContextUsage } from "../../contracts/session.js";
|
|
2
|
+
import { type JsonRecord } from "../../shared/json.js";
|
|
3
|
+
/**
|
|
4
|
+
* Codex reports usage in the streaming thread/tokenUsage/updated notification
|
|
5
|
+
* (cumulative). `total.inputTokens` is the context sent; codex does NOT
|
|
6
|
+
* include the context window in this event, so contextWindow/percent stay
|
|
7
|
+
* null unless a future field carries it. We cache the latest (last-wins).
|
|
8
|
+
*/
|
|
9
|
+
export declare function codexContextUsageFromNotification(params: JsonRecord): ContextUsage | null;
|
|
10
|
+
//# sourceMappingURL=context-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-usage.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/context-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAOzF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { asNumber, asRecord } from "../../shared/json.js";
|
|
2
|
+
/**
|
|
3
|
+
* Codex reports usage in the streaming thread/tokenUsage/updated notification
|
|
4
|
+
* (cumulative). `total.inputTokens` is the context sent; codex does NOT
|
|
5
|
+
* include the context window in this event, so contextWindow/percent stay
|
|
6
|
+
* null unless a future field carries it. We cache the latest (last-wins).
|
|
7
|
+
*/
|
|
8
|
+
export function codexContextUsageFromNotification(params) {
|
|
9
|
+
const total = asRecord(asRecord(params.tokenUsage)?.total);
|
|
10
|
+
if (total === null) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const tokens = asNumber(total.inputTokens);
|
|
14
|
+
return { tokens: tokens ?? null, contextWindow: null, percent: null };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=context-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-usage.js","sourceRoot":"","sources":["../../../src/runtimes/codex/context-usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAkB;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const codexRuntime: {
|
|
2
|
+
readonly id: "codex";
|
|
3
|
+
readonly installation: import("../../index.js").InstallationProbe;
|
|
4
|
+
readonly accountUsage: import("../../index.js").AccountUsageReader;
|
|
5
|
+
readonly session: import("../../index.js").StartSession;
|
|
6
|
+
};
|
|
7
|
+
export { codexAccountUsage, projectCodexUsage } from "./account-usage.js";
|
|
8
|
+
export { codexSession } from "./session.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY;;;;;CAKvB,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineRuntime } from "../../contracts/runtime.js";
|
|
2
|
+
import { codexAccountUsage } from "./account-usage.js";
|
|
3
|
+
import { codexInstallation } from "./installation.js";
|
|
4
|
+
import { codexSession } from "./session.js";
|
|
5
|
+
export const codexRuntime = defineRuntime({
|
|
6
|
+
id: "codex",
|
|
7
|
+
installation: codexInstallation,
|
|
8
|
+
accountUsage: codexAccountUsage,
|
|
9
|
+
session: codexSession,
|
|
10
|
+
});
|
|
11
|
+
export { codexAccountUsage, projectCodexUsage } from "./account-usage.js";
|
|
12
|
+
export { codexSession } from "./session.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/codex/index.ts"],"names":[],"mappings":"AAAA,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,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,EAAE,EAAE,OAAO;IACX,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;IAC/B,OAAO,EAAE,YAAY;CACtB,CAAC,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/installation.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,iBAAiB,4CAK7B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { executableInstallation } from "../../shared/installation.js";
|
|
4
|
+
// The macOS Desktop app bundles the Codex CLI instead of putting it on PATH.
|
|
5
|
+
// OpenAI relocated the app from Codex.app to ChatGPT.app, so the new bundle is
|
|
6
|
+
// tried before the legacy one, and system installs before per-user installs.
|
|
7
|
+
const desktopBundles = process.platform === "darwin"
|
|
8
|
+
? [
|
|
9
|
+
"/Applications/ChatGPT.app/Contents/Resources/codex",
|
|
10
|
+
"/Applications/Codex.app/Contents/Resources/codex",
|
|
11
|
+
path.join(os.homedir(), "Applications", "ChatGPT.app", "Contents", "Resources", "codex"),
|
|
12
|
+
path.join(os.homedir(), "Applications", "Codex.app", "Contents", "Resources", "codex"),
|
|
13
|
+
]
|
|
14
|
+
: [];
|
|
15
|
+
// OAR drives Codex through its app-server surface; a codex without it is unsupported.
|
|
16
|
+
export const codexInstallation = executableInstallation("OAR_CODEX_BIN", "codex", desktopBundles, ["app-server", "--help"]);
|
|
17
|
+
//# sourceMappingURL=installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../../../src/runtimes/codex/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAClD,CAAC,CAAC;QACE,oDAAoD;QACpD,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;KACvF;IACH,CAAC,CAAC,EAAE,CAAC;AAEP,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CACrD,eAAe,EACf,OAAO,EACP,cAAc,EACd,CAAC,YAAY,EAAE,QAAQ,CAAC,CACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-detail.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/item-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAenE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CA4BpE"}
|