@termlink/cli 0.1.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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/auth/login.d.ts +55 -0
- package/dist/auth/login.d.ts.map +1 -0
- package/dist/auth/login.js +238 -0
- package/dist/auth/login.js.map +1 -0
- package/dist/auth/oauth-defaults.d.ts +9 -0
- package/dist/auth/oauth-defaults.d.ts.map +1 -0
- package/dist/auth/oauth-defaults.js +9 -0
- package/dist/auth/oauth-defaults.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/claude/history.d.ts +15 -0
- package/dist/providers/claude/history.d.ts.map +1 -0
- package/dist/providers/claude/history.js +71 -0
- package/dist/providers/claude/history.js.map +1 -0
- package/dist/providers/claude/input-queue.d.ts +8 -0
- package/dist/providers/claude/input-queue.d.ts.map +1 -0
- package/dist/providers/claude/input-queue.js +34 -0
- package/dist/providers/claude/input-queue.js.map +1 -0
- package/dist/providers/claude/mapper.d.ts +21 -0
- package/dist/providers/claude/mapper.d.ts.map +1 -0
- package/dist/providers/claude/mapper.js +136 -0
- package/dist/providers/claude/mapper.js.map +1 -0
- package/dist/providers/claude/provider.d.ts +46 -0
- package/dist/providers/claude/provider.d.ts.map +1 -0
- package/dist/providers/claude/provider.js +148 -0
- package/dist/providers/claude/provider.js.map +1 -0
- package/dist/providers/claude/session.d.ts +27 -0
- package/dist/providers/claude/session.d.ts.map +1 -0
- package/dist/providers/claude/session.js +353 -0
- package/dist/providers/claude/session.js.map +1 -0
- package/dist/providers/codex/app-server.d.ts +24 -0
- package/dist/providers/codex/app-server.d.ts.map +1 -0
- package/dist/providers/codex/app-server.js +79 -0
- package/dist/providers/codex/app-server.js.map +1 -0
- package/dist/providers/codex/command.d.ts +12 -0
- package/dist/providers/codex/command.d.ts.map +1 -0
- package/dist/providers/codex/command.js +60 -0
- package/dist/providers/codex/command.js.map +1 -0
- package/dist/providers/codex/history.d.ts +5 -0
- package/dist/providers/codex/history.d.ts.map +1 -0
- package/dist/providers/codex/history.js +33 -0
- package/dist/providers/codex/history.js.map +1 -0
- package/dist/providers/codex/mapper.d.ts +13 -0
- package/dist/providers/codex/mapper.d.ts.map +1 -0
- package/dist/providers/codex/mapper.js +83 -0
- package/dist/providers/codex/mapper.js.map +1 -0
- package/dist/providers/codex/protocol.d.ts +223 -0
- package/dist/providers/codex/protocol.d.ts.map +1 -0
- package/dist/providers/codex/protocol.js +11 -0
- package/dist/providers/codex/protocol.js.map +1 -0
- package/dist/providers/codex/provider.d.ts +28 -0
- package/dist/providers/codex/provider.d.ts.map +1 -0
- package/dist/providers/codex/provider.js +116 -0
- package/dist/providers/codex/provider.js.map +1 -0
- package/dist/providers/codex/rpc.d.ts +23 -0
- package/dist/providers/codex/rpc.d.ts.map +1 -0
- package/dist/providers/codex/rpc.js +104 -0
- package/dist/providers/codex/rpc.js.map +1 -0
- package/dist/providers/codex/session.d.ts +16 -0
- package/dist/providers/codex/session.d.ts.map +1 -0
- package/dist/providers/codex/session.js +262 -0
- package/dist/providers/codex/session.js.map +1 -0
- package/dist/providers/display.d.ts +9 -0
- package/dist/providers/display.d.ts.map +1 -0
- package/dist/providers/display.js +21 -0
- package/dist/providers/display.js.map +1 -0
- package/dist/providers/terminal.d.ts +24 -0
- package/dist/providers/terminal.d.ts.map +1 -0
- package/dist/providers/terminal.js +33 -0
- package/dist/providers/terminal.js.map +1 -0
- package/dist/providers/types.d.ts +72 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/relay/api.d.ts +13 -0
- package/dist/relay/api.d.ts.map +1 -0
- package/dist/relay/api.js +75 -0
- package/dist/relay/api.js.map +1 -0
- package/dist/relay/device.d.ts +26 -0
- package/dist/relay/device.d.ts.map +1 -0
- package/dist/relay/device.js +83 -0
- package/dist/relay/device.js.map +1 -0
- package/dist/relay/relay-host.d.ts +41 -0
- package/dist/relay/relay-host.d.ts.map +1 -0
- package/dist/relay/relay-host.js +238 -0
- package/dist/relay/relay-host.js.map +1 -0
- package/dist/server/coalesce.d.ts +15 -0
- package/dist/server/coalesce.d.ts.map +1 -0
- package/dist/server/coalesce.js +50 -0
- package/dist/server/coalesce.js.map +1 -0
- package/dist/server/connection.d.ts +30 -0
- package/dist/server/connection.d.ts.map +1 -0
- package/dist/server/connection.js +182 -0
- package/dist/server/connection.js.map +1 -0
- package/dist/server/local-server.d.ts +27 -0
- package/dist/server/local-server.d.ts.map +1 -0
- package/dist/server/local-server.js +108 -0
- package/dist/server/local-server.js.map +1 -0
- package/dist/session/event-log.d.ts +17 -0
- package/dist/session/event-log.d.ts.map +1 -0
- package/dist/session/event-log.js +21 -0
- package/dist/session/event-log.js.map +1 -0
- package/dist/session/manager.d.ts +62 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +282 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/session.d.ts +43 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +310 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/store.d.ts +22 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +44 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/terminal-session.d.ts +52 -0
- package/dist/session/terminal-session.d.ts.map +1 -0
- package/dist/session/terminal-session.js +210 -0
- package/dist/session/terminal-session.js.map +1 -0
- package/dist/util/id.d.ts +2 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +5 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/lock.d.ts +12 -0
- package/dist/util/lock.d.ts.map +1 -0
- package/dist/util/lock.js +52 -0
- package/dist/util/lock.js.map +1 -0
- package/dist/util/which.d.ts +3 -0
- package/dist/util/which.d.ts.map +1 -0
- package/dist/util/which.js +12 -0
- package/dist/util/which.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Decision, FileChange, Item, ItemStatus } from "@termlink/protocol";
|
|
2
|
+
import type { CommandExecutionStatus, FileUpdateChange, ThreadItem, ToolCallStatus } from "./protocol.js";
|
|
3
|
+
export type Phase = "started" | "completed";
|
|
4
|
+
/** Decision ids are Codex's own decision strings, so the reply needs no lookup table. */
|
|
5
|
+
export declare const APPROVAL_DECISIONS: Decision[];
|
|
6
|
+
export declare function mapStatus(status: CommandExecutionStatus | ToolCallStatus): ItemStatus;
|
|
7
|
+
export declare function mapFileChange(change: FileUpdateChange): FileChange;
|
|
8
|
+
/**
|
|
9
|
+
* Maps a Codex thread item to a TermLink item. Returns null for items the host
|
|
10
|
+
* already reports itself (user messages) or that have nothing to show.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mapItem(item: ThreadItem, phase: Phase): Item | null;
|
|
13
|
+
//# sourceMappingURL=mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE1G,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,WAAW,CAAC;AAE5C,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EAKxC,CAAC;AAEF,wBAAgB,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,cAAc,GAAG,UAAU,CAErF;AAMD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAWlE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAmDnE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { displayCommand } from "../display.js";
|
|
2
|
+
/** Decision ids are Codex's own decision strings, so the reply needs no lookup table. */
|
|
3
|
+
export const APPROVAL_DECISIONS = [
|
|
4
|
+
{ id: "accept", label: "Allow", effect: "allow" },
|
|
5
|
+
{ id: "acceptForSession", label: "Allow for this session", effect: "allow_session" },
|
|
6
|
+
{ id: "decline", label: "Deny", effect: "deny" },
|
|
7
|
+
{ id: "cancel", label: "Deny and stop", effect: "cancel" },
|
|
8
|
+
];
|
|
9
|
+
export function mapStatus(status) {
|
|
10
|
+
return status === "inProgress" ? "in_progress" : status;
|
|
11
|
+
}
|
|
12
|
+
function phaseStatus(phase) {
|
|
13
|
+
return phase === "started" ? "in_progress" : "completed";
|
|
14
|
+
}
|
|
15
|
+
export function mapFileChange(change) {
|
|
16
|
+
switch (change.kind.type) {
|
|
17
|
+
case "add":
|
|
18
|
+
return { path: change.path, action: "add", diff: change.diff };
|
|
19
|
+
case "delete":
|
|
20
|
+
return { path: change.path, action: "delete", diff: change.diff };
|
|
21
|
+
case "update":
|
|
22
|
+
return change.kind.move_path
|
|
23
|
+
? { path: change.path, action: "rename", movePath: change.kind.move_path, diff: change.diff }
|
|
24
|
+
: { path: change.path, action: "modify", diff: change.diff };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Maps a Codex thread item to a TermLink item. Returns null for items the host
|
|
29
|
+
* already reports itself (user messages) or that have nothing to show.
|
|
30
|
+
*/
|
|
31
|
+
export function mapItem(item, phase) {
|
|
32
|
+
switch (item.type) {
|
|
33
|
+
case "userMessage":
|
|
34
|
+
case "contextCompaction":
|
|
35
|
+
return null;
|
|
36
|
+
case "agentMessage":
|
|
37
|
+
case "plan":
|
|
38
|
+
return { id: item.id, kind: "message", role: "assistant", text: item.text, status: phaseStatus(phase) };
|
|
39
|
+
case "reasoning":
|
|
40
|
+
return { id: item.id, kind: "reasoning", text: item.summary.join("\n\n"), status: phaseStatus(phase) };
|
|
41
|
+
case "commandExecution": {
|
|
42
|
+
const display = displayCommand(item.command, item.commandActions);
|
|
43
|
+
return {
|
|
44
|
+
id: item.id,
|
|
45
|
+
kind: "command",
|
|
46
|
+
command: item.command,
|
|
47
|
+
...(display ? { display } : {}),
|
|
48
|
+
cwd: item.cwd,
|
|
49
|
+
...(item.aggregatedOutput === null ? {} : { output: item.aggregatedOutput }),
|
|
50
|
+
exitCode: item.exitCode,
|
|
51
|
+
status: mapStatus(item.status),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
case "fileChange":
|
|
55
|
+
return { id: item.id, kind: "file_change", changes: item.changes.map(mapFileChange), status: mapStatus(item.status) };
|
|
56
|
+
case "mcpToolCall":
|
|
57
|
+
return {
|
|
58
|
+
id: item.id,
|
|
59
|
+
kind: "tool",
|
|
60
|
+
name: `${item.server}/${item.tool}`,
|
|
61
|
+
input: item.arguments,
|
|
62
|
+
output: item.error ? { error: item.error.message } : item.result?.content,
|
|
63
|
+
status: mapStatus(item.status),
|
|
64
|
+
};
|
|
65
|
+
case "dynamicToolCall":
|
|
66
|
+
return {
|
|
67
|
+
id: item.id,
|
|
68
|
+
kind: "tool",
|
|
69
|
+
name: item.tool,
|
|
70
|
+
input: item.arguments,
|
|
71
|
+
output: item.contentItems ?? undefined,
|
|
72
|
+
status: mapStatus(item.status),
|
|
73
|
+
};
|
|
74
|
+
case "webSearch":
|
|
75
|
+
return { id: item.id, kind: "tool", name: "web_search", input: { query: item.query }, status: phaseStatus(phase) };
|
|
76
|
+
default: {
|
|
77
|
+
// Newer or less common item types (hooks, review mode, sub-agents, ...).
|
|
78
|
+
const other = item;
|
|
79
|
+
return { id: other.id, kind: "tool", name: other.type, status: phaseStatus(phase) };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/providers/codex/mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
export type RequestId = string | number;
|
|
2
|
+
export interface InitializeParams {
|
|
3
|
+
clientInfo: {
|
|
4
|
+
name: string;
|
|
5
|
+
title: string | null;
|
|
6
|
+
version: string;
|
|
7
|
+
};
|
|
8
|
+
capabilities: {
|
|
9
|
+
experimentalApi: boolean;
|
|
10
|
+
requestAttestation: boolean;
|
|
11
|
+
} | null;
|
|
12
|
+
}
|
|
13
|
+
export interface InitializeResponse {
|
|
14
|
+
userAgent: string;
|
|
15
|
+
codexHome: string;
|
|
16
|
+
platformFamily: string;
|
|
17
|
+
platformOs: string;
|
|
18
|
+
}
|
|
19
|
+
export type AskForApproval = "untrusted" | "on-request" | "never";
|
|
20
|
+
export type SandboxMode = "read-only" | "workspace-write" | "danger-full-access";
|
|
21
|
+
export interface ThreadStartParams {
|
|
22
|
+
cwd?: string | null;
|
|
23
|
+
approvalPolicy?: AskForApproval | null;
|
|
24
|
+
sandbox?: SandboxMode | null;
|
|
25
|
+
}
|
|
26
|
+
export interface ThreadResumeParams extends ThreadStartParams {
|
|
27
|
+
threadId: string;
|
|
28
|
+
excludeTurns?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Also the shape of the thread/resume response for the fields used here. */
|
|
31
|
+
export interface ThreadStartResponse {
|
|
32
|
+
thread: {
|
|
33
|
+
id: string;
|
|
34
|
+
};
|
|
35
|
+
model: string;
|
|
36
|
+
cwd: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TextInput {
|
|
39
|
+
type: "text";
|
|
40
|
+
text: string;
|
|
41
|
+
text_elements: unknown[];
|
|
42
|
+
}
|
|
43
|
+
export interface TurnStartParams {
|
|
44
|
+
threadId: string;
|
|
45
|
+
input: TextInput[];
|
|
46
|
+
}
|
|
47
|
+
export type TurnStatus = "completed" | "interrupted" | "failed" | "inProgress";
|
|
48
|
+
export interface Turn {
|
|
49
|
+
id: string;
|
|
50
|
+
status: TurnStatus;
|
|
51
|
+
error: {
|
|
52
|
+
message: string;
|
|
53
|
+
} | null;
|
|
54
|
+
/** Filled by thread/turns/list with itemsView "full". */
|
|
55
|
+
items?: ThreadItem[];
|
|
56
|
+
}
|
|
57
|
+
export interface TurnStartResponse {
|
|
58
|
+
turn: Turn;
|
|
59
|
+
}
|
|
60
|
+
export interface TurnInterruptParams {
|
|
61
|
+
threadId: string;
|
|
62
|
+
turnId: string;
|
|
63
|
+
}
|
|
64
|
+
export type CommandExecutionStatus = "inProgress" | "completed" | "failed" | "declined";
|
|
65
|
+
export type PatchApplyStatus = "inProgress" | "completed" | "failed" | "declined";
|
|
66
|
+
export type ToolCallStatus = "inProgress" | "completed" | "failed";
|
|
67
|
+
export interface FileUpdateChange {
|
|
68
|
+
path: string;
|
|
69
|
+
kind: {
|
|
70
|
+
type: "add";
|
|
71
|
+
} | {
|
|
72
|
+
type: "delete";
|
|
73
|
+
} | {
|
|
74
|
+
type: "update";
|
|
75
|
+
move_path: string | null;
|
|
76
|
+
};
|
|
77
|
+
diff: string;
|
|
78
|
+
}
|
|
79
|
+
/** Item types this adapter maps. Others arrive at runtime and fall through to a generic tool item. */
|
|
80
|
+
export type ThreadItem = {
|
|
81
|
+
type: "userMessage";
|
|
82
|
+
id: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: "agentMessage";
|
|
85
|
+
id: string;
|
|
86
|
+
text: string;
|
|
87
|
+
} | {
|
|
88
|
+
type: "plan";
|
|
89
|
+
id: string;
|
|
90
|
+
text: string;
|
|
91
|
+
} | {
|
|
92
|
+
type: "reasoning";
|
|
93
|
+
id: string;
|
|
94
|
+
summary: string[];
|
|
95
|
+
content: string[];
|
|
96
|
+
} | {
|
|
97
|
+
type: "commandExecution";
|
|
98
|
+
id: string;
|
|
99
|
+
command: string;
|
|
100
|
+
cwd: string;
|
|
101
|
+
/** Best-effort parse of the command; each entry carries one sub-command's text. */
|
|
102
|
+
commandActions?: {
|
|
103
|
+
type: string;
|
|
104
|
+
command: string;
|
|
105
|
+
}[];
|
|
106
|
+
status: CommandExecutionStatus;
|
|
107
|
+
aggregatedOutput: string | null;
|
|
108
|
+
exitCode: number | null;
|
|
109
|
+
} | {
|
|
110
|
+
type: "fileChange";
|
|
111
|
+
id: string;
|
|
112
|
+
changes: FileUpdateChange[];
|
|
113
|
+
status: PatchApplyStatus;
|
|
114
|
+
} | {
|
|
115
|
+
type: "mcpToolCall";
|
|
116
|
+
id: string;
|
|
117
|
+
server: string;
|
|
118
|
+
tool: string;
|
|
119
|
+
status: ToolCallStatus;
|
|
120
|
+
arguments: unknown;
|
|
121
|
+
result: {
|
|
122
|
+
content: unknown[];
|
|
123
|
+
} | null;
|
|
124
|
+
error: {
|
|
125
|
+
message: string;
|
|
126
|
+
} | null;
|
|
127
|
+
} | {
|
|
128
|
+
type: "dynamicToolCall";
|
|
129
|
+
id: string;
|
|
130
|
+
tool: string;
|
|
131
|
+
arguments: unknown;
|
|
132
|
+
status: ToolCallStatus;
|
|
133
|
+
contentItems: unknown[] | null;
|
|
134
|
+
} | {
|
|
135
|
+
type: "webSearch";
|
|
136
|
+
id: string;
|
|
137
|
+
query: string;
|
|
138
|
+
} | {
|
|
139
|
+
type: "contextCompaction";
|
|
140
|
+
id: string;
|
|
141
|
+
};
|
|
142
|
+
export interface TurnNotification {
|
|
143
|
+
threadId: string;
|
|
144
|
+
turn: Turn;
|
|
145
|
+
}
|
|
146
|
+
export interface ItemNotification {
|
|
147
|
+
threadId: string;
|
|
148
|
+
turnId: string;
|
|
149
|
+
item: ThreadItem;
|
|
150
|
+
}
|
|
151
|
+
export interface DeltaNotification {
|
|
152
|
+
threadId: string;
|
|
153
|
+
turnId: string;
|
|
154
|
+
itemId: string;
|
|
155
|
+
delta: string;
|
|
156
|
+
}
|
|
157
|
+
export interface ReasoningSummaryPartAddedNotification {
|
|
158
|
+
threadId: string;
|
|
159
|
+
turnId: string;
|
|
160
|
+
itemId: string;
|
|
161
|
+
summaryIndex: number;
|
|
162
|
+
}
|
|
163
|
+
export interface FileChangePatchUpdatedNotification {
|
|
164
|
+
threadId: string;
|
|
165
|
+
turnId: string;
|
|
166
|
+
itemId: string;
|
|
167
|
+
changes: FileUpdateChange[];
|
|
168
|
+
}
|
|
169
|
+
export interface TurnPlanUpdatedNotification {
|
|
170
|
+
threadId: string;
|
|
171
|
+
turnId: string;
|
|
172
|
+
explanation: string | null;
|
|
173
|
+
plan: {
|
|
174
|
+
step: string;
|
|
175
|
+
status: "pending" | "inProgress" | "completed";
|
|
176
|
+
}[];
|
|
177
|
+
}
|
|
178
|
+
export interface TokenUsageBreakdown {
|
|
179
|
+
totalTokens: number;
|
|
180
|
+
inputTokens: number;
|
|
181
|
+
cachedInputTokens: number;
|
|
182
|
+
outputTokens: number;
|
|
183
|
+
reasoningOutputTokens: number;
|
|
184
|
+
}
|
|
185
|
+
export interface ThreadTokenUsageUpdatedNotification {
|
|
186
|
+
threadId: string;
|
|
187
|
+
turnId: string;
|
|
188
|
+
tokenUsage: {
|
|
189
|
+
total: TokenUsageBreakdown;
|
|
190
|
+
last: TokenUsageBreakdown;
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
export interface ErrorNotification {
|
|
194
|
+
threadId: string;
|
|
195
|
+
turnId: string;
|
|
196
|
+
error: {
|
|
197
|
+
message: string;
|
|
198
|
+
};
|
|
199
|
+
willRetry: boolean;
|
|
200
|
+
}
|
|
201
|
+
export interface ServerRequestResolvedNotification {
|
|
202
|
+
threadId: string;
|
|
203
|
+
requestId: RequestId;
|
|
204
|
+
}
|
|
205
|
+
export interface CommandExecutionRequestApprovalParams {
|
|
206
|
+
kind: "command" | "writeStdin";
|
|
207
|
+
threadId: string;
|
|
208
|
+
turnId: string;
|
|
209
|
+
itemId: string;
|
|
210
|
+
reason?: string | null;
|
|
211
|
+
command?: string | null;
|
|
212
|
+
cwd?: string | null;
|
|
213
|
+
}
|
|
214
|
+
export interface FileChangeRequestApprovalParams {
|
|
215
|
+
threadId: string;
|
|
216
|
+
turnId: string;
|
|
217
|
+
itemId: string;
|
|
218
|
+
reason?: string | null;
|
|
219
|
+
grantRoot?: string | null;
|
|
220
|
+
}
|
|
221
|
+
/** Both approval kinds accept these; command approvals also accept policy amendments. */
|
|
222
|
+
export type ApprovalDecision = "accept" | "acceptForSession" | "decline" | "cancel";
|
|
223
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Subset of the codex app-server v2 protocol used by this adapter, copied by hand from
|
|
2
|
+
// `codex app-server generate-ts` output for codex-cli 0.153.4. The generated files use
|
|
3
|
+
// extensionless imports that do not compile under NodeNext, so they are not vendored.
|
|
4
|
+
// When upgrading Codex, run `npm run codex:types -w @termlink/cli` and diff.
|
|
5
|
+
//
|
|
6
|
+
// Wire format: newline-delimited JSON-RPC without a "jsonrpc" field.
|
|
7
|
+
// request {"id", "method", "params"}
|
|
8
|
+
// response {"id", "result"} or {"id", "error": {"code", "message"}}
|
|
9
|
+
// notification {"method", "params"}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/providers/codex/protocol.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,uFAAuF;AACvF,sFAAsF;AACtF,6EAA6E;AAC7E,EAAE;AACF,qEAAqE;AACrE,4CAA4C;AAC5C,0EAA0E;AAC1E,sCAAsC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EventSink, HistoryTurn, ProbeResult, ProviderAdapter, ProviderSession, StartOptions } from "../types.js";
|
|
2
|
+
import { type CodexCommand } from "./command.js";
|
|
3
|
+
import type { AskForApproval, SandboxMode } from "./protocol.js";
|
|
4
|
+
export interface CodexProviderOptions {
|
|
5
|
+
/** How to launch codex. Defaults to the user's install found on PATH; null means none. */
|
|
6
|
+
command?: CodexCommand | null;
|
|
7
|
+
/** Leave unset to use the user's ~/.codex/config.toml. */
|
|
8
|
+
approvalPolicy?: AskForApproval;
|
|
9
|
+
sandbox?: SandboxMode;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Drives Codex through `codex app-server`. The host never touches Codex credentials:
|
|
13
|
+
* the app-server uses whatever `codex login` stored on this machine.
|
|
14
|
+
*/
|
|
15
|
+
export declare class CodexProvider implements ProviderAdapter {
|
|
16
|
+
#private;
|
|
17
|
+
readonly id = "codex";
|
|
18
|
+
readonly kind: "agent";
|
|
19
|
+
readonly label = "Codex";
|
|
20
|
+
readonly resumable = true;
|
|
21
|
+
constructor(options?: CodexProviderOptions);
|
|
22
|
+
probe(): Promise<ProbeResult>;
|
|
23
|
+
start(options: StartOptions, sink: EventSink): Promise<ProviderSession>;
|
|
24
|
+
/** Reads the thread's stored turns without resuming it. */
|
|
25
|
+
history(threadId: string): Promise<HistoryTurn[]>;
|
|
26
|
+
dispose(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAA8D,MAAM,eAAe,CAAC;AAG7H,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAQD;;;GAGG;AACH,qBAAa,aAAc,YAAW,eAAe;;IACnD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,KAAK,WAAW;IACzB,QAAQ,CAAC,SAAS,QAAQ;IAK1B,YAAY,OAAO,GAAE,oBAAyB,EAE7C;IAEK,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAKlC;IAEK,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB5E;IAED,2DAA2D;IACrD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEtD;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7B;CA6CF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { errorMessage } from "../../errors.js";
|
|
3
|
+
import { CodexAppServer } from "./app-server.js";
|
|
4
|
+
import { resolveCodexCommand } from "./command.js";
|
|
5
|
+
import { codexHistory } from "./history.js";
|
|
6
|
+
import { CodexThreadSession } from "./session.js";
|
|
7
|
+
// A good status is kept a minute; a bad one is re-checked soon, since a slow first run
|
|
8
|
+
// can time out once.
|
|
9
|
+
const READY_TTL_MS = 60_000;
|
|
10
|
+
const UNAVAILABLE_TTL_MS = 5_000;
|
|
11
|
+
const PROBE_TIMEOUT_MS = 30_000;
|
|
12
|
+
/**
|
|
13
|
+
* Drives Codex through `codex app-server`. The host never touches Codex credentials:
|
|
14
|
+
* the app-server uses whatever `codex login` stored on this machine.
|
|
15
|
+
*/
|
|
16
|
+
export class CodexProvider {
|
|
17
|
+
id = "codex";
|
|
18
|
+
kind = "agent";
|
|
19
|
+
label = "Codex";
|
|
20
|
+
resumable = true;
|
|
21
|
+
#options;
|
|
22
|
+
#server = null;
|
|
23
|
+
#probe = null;
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
this.#options = options;
|
|
26
|
+
}
|
|
27
|
+
async probe() {
|
|
28
|
+
if (this.#probe && Date.now() < this.#probe.until)
|
|
29
|
+
return this.#probe.status;
|
|
30
|
+
const status = await this.#runProbe();
|
|
31
|
+
this.#probe = { until: Date.now() + (status.available ? READY_TTL_MS : UNAVAILABLE_TTL_MS), status };
|
|
32
|
+
return status;
|
|
33
|
+
}
|
|
34
|
+
async start(options, sink) {
|
|
35
|
+
const server = await this.#getServer();
|
|
36
|
+
const params = {
|
|
37
|
+
cwd: options.cwd,
|
|
38
|
+
...(this.#options.approvalPolicy ? { approvalPolicy: this.#options.approvalPolicy } : {}),
|
|
39
|
+
...(this.#options.sandbox ? { sandbox: this.#options.sandbox } : {}),
|
|
40
|
+
};
|
|
41
|
+
const { thread } = options.resumeProviderSessionId
|
|
42
|
+
? await server.peer.request("thread/resume", {
|
|
43
|
+
...params,
|
|
44
|
+
threadId: options.resumeProviderSessionId,
|
|
45
|
+
excludeTurns: true,
|
|
46
|
+
})
|
|
47
|
+
: await server.peer.request("thread/start", params);
|
|
48
|
+
const session = new CodexThreadSession(server, thread.id, sink);
|
|
49
|
+
server.register(thread.id, session);
|
|
50
|
+
sink.setProviderSessionId(thread.id);
|
|
51
|
+
return session;
|
|
52
|
+
}
|
|
53
|
+
/** Reads the thread's stored turns without resuming it. */
|
|
54
|
+
async history(threadId) {
|
|
55
|
+
return codexHistory(await this.#getServer(), threadId);
|
|
56
|
+
}
|
|
57
|
+
async dispose() {
|
|
58
|
+
const server = this.#server;
|
|
59
|
+
this.#server = null;
|
|
60
|
+
if (server)
|
|
61
|
+
(await server.catch(() => null))?.close();
|
|
62
|
+
}
|
|
63
|
+
#command() {
|
|
64
|
+
return this.#options.command === undefined ? resolveCodexCommand() : this.#options.command;
|
|
65
|
+
}
|
|
66
|
+
#getServer() {
|
|
67
|
+
if (!this.#server) {
|
|
68
|
+
const command = this.#command();
|
|
69
|
+
if (!command)
|
|
70
|
+
return Promise.reject(new Error("codex was not found on PATH"));
|
|
71
|
+
const starting = CodexAppServer.start(command, () => {
|
|
72
|
+
if (this.#server === starting)
|
|
73
|
+
this.#server = null;
|
|
74
|
+
});
|
|
75
|
+
starting.catch(() => {
|
|
76
|
+
if (this.#server === starting)
|
|
77
|
+
this.#server = null;
|
|
78
|
+
});
|
|
79
|
+
this.#server = starting;
|
|
80
|
+
}
|
|
81
|
+
return this.#server;
|
|
82
|
+
}
|
|
83
|
+
async #runProbe() {
|
|
84
|
+
const command = this.#command();
|
|
85
|
+
if (!command) {
|
|
86
|
+
return { available: false, version: null, detail: "codex was not found on PATH" };
|
|
87
|
+
}
|
|
88
|
+
const version = await run(command, ["--version"]);
|
|
89
|
+
if (!version.ok) {
|
|
90
|
+
return { available: false, version: null, detail: `codex failed to run: ${version.output}` };
|
|
91
|
+
}
|
|
92
|
+
const versionText = version.output.split(/\s+/).at(-1) ?? null;
|
|
93
|
+
const login = await run(command, ["login", "status"]);
|
|
94
|
+
const loggedIn = /logged in/i.test(login.output) && !/not logged in/i.test(login.output);
|
|
95
|
+
if (loggedIn) {
|
|
96
|
+
return { available: true, version: versionText, detail: login.output.split(/\r?\n/)[0] ?? null };
|
|
97
|
+
}
|
|
98
|
+
// Only an explicit "not logged in" means logged out; anything else is a failed check.
|
|
99
|
+
return {
|
|
100
|
+
available: false,
|
|
101
|
+
version: versionText,
|
|
102
|
+
detail: /not logged in/i.test(login.output)
|
|
103
|
+
? "not logged in: run `codex login` on this machine"
|
|
104
|
+
: `could not check the Codex login (${login.output || "no answer"})`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function run(command, args) {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
execFile(command.file, [...command.args, ...args], { timeout: PROBE_TIMEOUT_MS, windowsHide: true }, (err, stdout, stderr) => {
|
|
111
|
+
const output = `${stdout}${stderr}`.trim();
|
|
112
|
+
resolve({ ok: !err, output: err && !output ? errorMessage(err) : output });
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/codex/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import type { RequestId } from "./protocol.js";
|
|
3
|
+
export declare class RpcError extends Error {
|
|
4
|
+
readonly code: number;
|
|
5
|
+
constructor(code: number, message: string);
|
|
6
|
+
}
|
|
7
|
+
/** Returned by a request handler when the request was withdrawn and must not be answered. */
|
|
8
|
+
export declare const NO_RESPONSE: unique symbol;
|
|
9
|
+
export type RequestHandler = (method: string, params: unknown, id: RequestId) => Promise<unknown>;
|
|
10
|
+
export type NotificationHandler = (method: string, params: unknown) => void;
|
|
11
|
+
/** JSON-RPC over newline-delimited JSON, as spoken by `codex app-server`. */
|
|
12
|
+
export declare class JsonRpcPeer {
|
|
13
|
+
#private;
|
|
14
|
+
onNotification: NotificationHandler;
|
|
15
|
+
onRequest: RequestHandler;
|
|
16
|
+
onClose: (reason: Error) => void;
|
|
17
|
+
constructor(input: Readable, output: Writable);
|
|
18
|
+
get closed(): boolean;
|
|
19
|
+
request<R>(method: string, params: unknown): Promise<R>;
|
|
20
|
+
notify(method: string, params?: unknown): void;
|
|
21
|
+
close(reason: Error): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/rpc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIxC;CACF;AAED,6FAA6F;AAC7F,eAAO,MAAM,WAAW,EAAE,OAAO,MAA8B,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAClG,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAU5E,6EAA6E;AAC7E,qBAAa,WAAW;;IACtB,cAAc,EAAE,mBAAmB,CAAY;IAC/C,SAAS,EAAE,cAAc,CAEvB;IACF,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAY;IAO5C,YAAY,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAK5C;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAOtD;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAMzB;CAyCF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import { errorMessage } from "../../errors.js";
|
|
3
|
+
export class RpcError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "RpcError";
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Returned by a request handler when the request was withdrawn and must not be answered. */
|
|
12
|
+
export const NO_RESPONSE = Symbol("no-response");
|
|
13
|
+
/** JSON-RPC over newline-delimited JSON, as spoken by `codex app-server`. */
|
|
14
|
+
export class JsonRpcPeer {
|
|
15
|
+
onNotification = () => { };
|
|
16
|
+
onRequest = async (method) => {
|
|
17
|
+
throw new RpcError(-32601, `method not found: ${method}`);
|
|
18
|
+
};
|
|
19
|
+
onClose = () => { };
|
|
20
|
+
#output;
|
|
21
|
+
#pending = new Map();
|
|
22
|
+
#nextId = 1;
|
|
23
|
+
#closed = null;
|
|
24
|
+
constructor(input, output) {
|
|
25
|
+
this.#output = output;
|
|
26
|
+
const lines = createInterface({ input, crlfDelay: Infinity });
|
|
27
|
+
lines.on("line", (line) => this.#receive(line));
|
|
28
|
+
lines.on("close", () => this.close(new Error("connection closed")));
|
|
29
|
+
}
|
|
30
|
+
get closed() {
|
|
31
|
+
return this.#closed !== null;
|
|
32
|
+
}
|
|
33
|
+
request(method, params) {
|
|
34
|
+
if (this.#closed)
|
|
35
|
+
return Promise.reject(this.#closed);
|
|
36
|
+
const id = this.#nextId++;
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
this.#pending.set(id, { resolve: resolve, reject });
|
|
39
|
+
this.#write({ id, method, params });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
notify(method, params) {
|
|
43
|
+
if (!this.#closed)
|
|
44
|
+
this.#write(params === undefined ? { method } : { method, params });
|
|
45
|
+
}
|
|
46
|
+
close(reason) {
|
|
47
|
+
if (this.#closed)
|
|
48
|
+
return;
|
|
49
|
+
this.#closed = reason;
|
|
50
|
+
for (const pending of this.#pending.values())
|
|
51
|
+
pending.reject(reason);
|
|
52
|
+
this.#pending.clear();
|
|
53
|
+
this.onClose(reason);
|
|
54
|
+
}
|
|
55
|
+
#write(message) {
|
|
56
|
+
this.#output.write(`${JSON.stringify(message)}\n`);
|
|
57
|
+
}
|
|
58
|
+
#receive(line) {
|
|
59
|
+
if (!line.trim())
|
|
60
|
+
return;
|
|
61
|
+
let message;
|
|
62
|
+
try {
|
|
63
|
+
message = JSON.parse(line);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (typeof message !== "object" || message === null)
|
|
69
|
+
return;
|
|
70
|
+
const id = typeof message.id === "string" || typeof message.id === "number" ? message.id : undefined;
|
|
71
|
+
if (typeof message.method === "string") {
|
|
72
|
+
if (id === undefined)
|
|
73
|
+
this.onNotification(message.method, message.params);
|
|
74
|
+
else
|
|
75
|
+
void this.#answer(id, message.method, message.params);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (id === undefined)
|
|
79
|
+
return;
|
|
80
|
+
const pending = this.#pending.get(id);
|
|
81
|
+
if (!pending)
|
|
82
|
+
return;
|
|
83
|
+
this.#pending.delete(id);
|
|
84
|
+
if (message.error)
|
|
85
|
+
pending.reject(new RpcError(message.error.code ?? -32000, message.error.message ?? "error"));
|
|
86
|
+
else
|
|
87
|
+
pending.resolve(message.result);
|
|
88
|
+
}
|
|
89
|
+
async #answer(id, method, params) {
|
|
90
|
+
try {
|
|
91
|
+
const result = await this.onRequest(method, params, id);
|
|
92
|
+
if (result === NO_RESPONSE || this.#closed)
|
|
93
|
+
return;
|
|
94
|
+
this.#write({ id, result });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (this.#closed)
|
|
98
|
+
return;
|
|
99
|
+
const code = err instanceof RpcError ? err.code : -32603;
|
|
100
|
+
this.#write({ id, error: { code, message: errorMessage(err) } });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/providers/codex/rpc.ts"],"names":[],"mappings":"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"}
|