@scotthuang/agent-knock-knock 0.1.1 → 0.2.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/CHANGELOG.md +18 -0
- package/README.md +31 -0
- package/dist/src/agent-session-provider.d.ts +25 -0
- package/dist/src/agent-session-provider.js +2 -0
- package/dist/src/agent-session-provider.js.map +1 -0
- package/dist/src/cli.js +1142 -25
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex-local-session-provider.d.ts +18 -0
- package/dist/src/codex-local-session-provider.js +87 -0
- package/dist/src/codex-local-session-provider.js.map +1 -0
- package/dist/src/codex-session-provider.d.ts +95 -0
- package/dist/src/codex-session-provider.js +304 -0
- package/dist/src/codex-session-provider.js.map +1 -0
- package/dist/src/codex-store-adapter.d.ts +27 -0
- package/dist/src/codex-store-adapter.js +124 -0
- package/dist/src/codex-store-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin.js +159 -2
- package/dist/src/openclaw-plugin.js.map +1 -1
- package/dist/src/protocol.d.ts +1 -1
- package/dist/src/session-takeover-planner.d.ts +49 -0
- package/dist/src/session-takeover-planner.js +80 -0
- package/dist/src/session-takeover-planner.js.map +1 -0
- package/package.json +1 -1
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +30 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export type CodexSessionCapability = "full" | "metadata_only" | "unavailable";
|
|
2
|
+
export type CodexProcessKind = "codex_cli" | "codex_acp";
|
|
3
|
+
export type DiscoveryConfidence = "high" | "medium" | "low";
|
|
4
|
+
export interface CodexThreadRow {
|
|
5
|
+
id?: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
rollout_path?: string;
|
|
8
|
+
rolloutPath?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
preview?: string;
|
|
11
|
+
first_user_message?: string;
|
|
12
|
+
firstUserMessage?: string;
|
|
13
|
+
updated_at_ms?: number;
|
|
14
|
+
updatedAtMs?: number;
|
|
15
|
+
archived?: number | boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface CodexSessionSummary {
|
|
18
|
+
id: string;
|
|
19
|
+
cwd: string;
|
|
20
|
+
rolloutPath?: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
preview?: string;
|
|
23
|
+
firstUserMessage?: string;
|
|
24
|
+
updatedAtMs?: number;
|
|
25
|
+
archived: boolean;
|
|
26
|
+
capability: CodexSessionCapability;
|
|
27
|
+
capabilityReason?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CodexSessionModelInfo {
|
|
30
|
+
model: string;
|
|
31
|
+
acpxModel: string;
|
|
32
|
+
source: "turn_context" | "session_meta";
|
|
33
|
+
}
|
|
34
|
+
export interface CodexProcessSnapshot {
|
|
35
|
+
pid: number;
|
|
36
|
+
ppid?: number;
|
|
37
|
+
command: string;
|
|
38
|
+
cwd?: string;
|
|
39
|
+
elapsed?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ActiveCodexProcess {
|
|
42
|
+
pid: number;
|
|
43
|
+
ppid?: number;
|
|
44
|
+
command: string;
|
|
45
|
+
cwd?: string;
|
|
46
|
+
elapsed?: string;
|
|
47
|
+
kind: CodexProcessKind;
|
|
48
|
+
sessionId?: string;
|
|
49
|
+
confidence: DiscoveryConfidence;
|
|
50
|
+
reason: string;
|
|
51
|
+
}
|
|
52
|
+
export interface RolloutMessageExcerpt {
|
|
53
|
+
role: "user" | "assistant" | "tool";
|
|
54
|
+
text: string;
|
|
55
|
+
timestamp?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface RolloutCommandSummary {
|
|
58
|
+
command: string;
|
|
59
|
+
cwd?: string;
|
|
60
|
+
status?: string;
|
|
61
|
+
timestamp?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface RolloutExcerpt {
|
|
64
|
+
messages: RolloutMessageExcerpt[];
|
|
65
|
+
commands: RolloutCommandSummary[];
|
|
66
|
+
skippedLines: number;
|
|
67
|
+
truncated: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface ForkContextPackage {
|
|
70
|
+
source: {
|
|
71
|
+
agent: "codex";
|
|
72
|
+
sessionId: string;
|
|
73
|
+
cwd: string;
|
|
74
|
+
title?: string;
|
|
75
|
+
updatedAtMs?: number;
|
|
76
|
+
};
|
|
77
|
+
messages: RolloutMessageExcerpt[];
|
|
78
|
+
commands: RolloutCommandSummary[];
|
|
79
|
+
truncated: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface RolloutExcerptOptions {
|
|
82
|
+
maxMessages?: number;
|
|
83
|
+
maxCommands?: number;
|
|
84
|
+
maxTextLength?: number;
|
|
85
|
+
}
|
|
86
|
+
export declare function codexSessionsFromThreadRows(rows: CodexThreadRow[]): CodexSessionSummary[];
|
|
87
|
+
export declare function codexSessionFromThreadRow(row: CodexThreadRow): CodexSessionSummary | undefined;
|
|
88
|
+
export declare function discoverCodexProcesses(processes: CodexProcessSnapshot[]): ActiveCodexProcess[];
|
|
89
|
+
export declare function listActiveCodexCli(processes: CodexProcessSnapshot[]): ActiveCodexProcess[];
|
|
90
|
+
export declare function classifyCodexProcess(process: CodexProcessSnapshot): ActiveCodexProcess | undefined;
|
|
91
|
+
export declare function extractResumeSessionId(command: string): string | undefined;
|
|
92
|
+
export declare function parseCodexRolloutJsonl(text: string, options?: RolloutExcerptOptions): RolloutExcerpt;
|
|
93
|
+
export declare function parseCodexRolloutModel(text: string): CodexSessionModelInfo | undefined;
|
|
94
|
+
export declare function normalizeCodexAcpxModel(model: string): string;
|
|
95
|
+
export declare function buildForkContextPackage(session: CodexSessionSummary, rollout: RolloutExcerpt): ForkContextPackage;
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
const UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
2
|
+
const RESUME_SESSION_REGEX = new RegExp(`(?:^|\\s)resume\\s+(${UUID_PATTERN})(?:\\s|$)`, "i");
|
|
3
|
+
export function codexSessionsFromThreadRows(rows) {
|
|
4
|
+
return rows
|
|
5
|
+
.map((row) => codexSessionFromThreadRow(row))
|
|
6
|
+
.filter((session) => session !== undefined)
|
|
7
|
+
.sort((left, right) => Number(right.updatedAtMs ?? 0) - Number(left.updatedAtMs ?? 0));
|
|
8
|
+
}
|
|
9
|
+
export function codexSessionFromThreadRow(row) {
|
|
10
|
+
const id = stringValue(row.id);
|
|
11
|
+
const cwd = stringValue(row.cwd);
|
|
12
|
+
if (!id || !cwd) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const rolloutPath = stringValue(row.rolloutPath) ?? stringValue(row.rollout_path);
|
|
16
|
+
const updatedAtMs = numberValue(row.updatedAtMs) ?? numberValue(row.updated_at_ms);
|
|
17
|
+
const title = cleanText(stringValue(row.title));
|
|
18
|
+
const preview = cleanText(stringValue(row.preview));
|
|
19
|
+
const firstUserMessage = cleanText(stringValue(row.firstUserMessage) ?? stringValue(row.first_user_message));
|
|
20
|
+
const capability = rolloutPath ? "full" : "metadata_only";
|
|
21
|
+
return {
|
|
22
|
+
id,
|
|
23
|
+
cwd,
|
|
24
|
+
rolloutPath,
|
|
25
|
+
title,
|
|
26
|
+
preview,
|
|
27
|
+
firstUserMessage,
|
|
28
|
+
updatedAtMs,
|
|
29
|
+
archived: row.archived === true || row.archived === 1,
|
|
30
|
+
capability,
|
|
31
|
+
capabilityReason: capability === "full" ? undefined : "missing rollout_path"
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function discoverCodexProcesses(processes) {
|
|
35
|
+
return processes
|
|
36
|
+
.map((process) => classifyCodexProcess(process))
|
|
37
|
+
.filter((process) => process !== undefined);
|
|
38
|
+
}
|
|
39
|
+
export function listActiveCodexCli(processes) {
|
|
40
|
+
return discoverCodexProcesses(processes).filter((process) => process.kind === "codex_cli");
|
|
41
|
+
}
|
|
42
|
+
export function classifyCodexProcess(process) {
|
|
43
|
+
const command = process.command.trim();
|
|
44
|
+
if (!command) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
if (/\bcodex-acp(?:\s|$)/i.test(command) || /@agentclientprotocol\/codex-acp|@zed-industries\/codex-acp/i.test(command)) {
|
|
48
|
+
return {
|
|
49
|
+
...baseProcess(process),
|
|
50
|
+
kind: "codex_acp",
|
|
51
|
+
sessionId: extractResumeSessionId(command),
|
|
52
|
+
confidence: "medium",
|
|
53
|
+
reason: "codex ACP adapter process"
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (!commandInvokesCodexCli(command)) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const sessionId = extractResumeSessionId(command);
|
|
60
|
+
return {
|
|
61
|
+
...baseProcess(process),
|
|
62
|
+
kind: "codex_cli",
|
|
63
|
+
sessionId,
|
|
64
|
+
confidence: sessionId ? "high" : process.cwd ? "medium" : "low",
|
|
65
|
+
reason: sessionId ? "codex resume command includes session id" : "codex CLI process without visible session id"
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function extractResumeSessionId(command) {
|
|
69
|
+
return RESUME_SESSION_REGEX.exec(command)?.[1];
|
|
70
|
+
}
|
|
71
|
+
export function parseCodexRolloutJsonl(text, options = {}) {
|
|
72
|
+
const maxMessages = options.maxMessages ?? 12;
|
|
73
|
+
const maxCommands = options.maxCommands ?? 8;
|
|
74
|
+
const maxTextLength = options.maxTextLength ?? 1200;
|
|
75
|
+
const messages = [];
|
|
76
|
+
const commands = [];
|
|
77
|
+
let skippedLines = 0;
|
|
78
|
+
let truncated = false;
|
|
79
|
+
for (const line of text.split(/\r?\n/)) {
|
|
80
|
+
if (!line.trim()) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
let event;
|
|
84
|
+
try {
|
|
85
|
+
event = JSON.parse(line);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
skippedLines += 1;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const record = asRecord(event);
|
|
92
|
+
if (!record) {
|
|
93
|
+
skippedLines += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const message = messageExcerptFromRolloutRecord(record, maxTextLength);
|
|
97
|
+
if (message) {
|
|
98
|
+
if (messages.length < maxMessages) {
|
|
99
|
+
messages.push(message);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
truncated = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const command = commandSummaryFromRolloutRecord(record, maxTextLength);
|
|
106
|
+
if (command) {
|
|
107
|
+
if (commands.length < maxCommands) {
|
|
108
|
+
commands.push(command);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
truncated = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
messages,
|
|
117
|
+
commands,
|
|
118
|
+
skippedLines,
|
|
119
|
+
truncated
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function parseCodexRolloutModel(text) {
|
|
123
|
+
for (const line of text.split(/\r?\n/)) {
|
|
124
|
+
if (!line.trim()) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
let event;
|
|
128
|
+
try {
|
|
129
|
+
event = JSON.parse(line);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const record = asRecord(event);
|
|
135
|
+
const payload = asRecord(record?.payload);
|
|
136
|
+
if (!record || !payload) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const directModel = stringValue(payload.model);
|
|
140
|
+
if (directModel && (record.type === "turn_context" || record.type === "session_meta")) {
|
|
141
|
+
return {
|
|
142
|
+
model: directModel,
|
|
143
|
+
acpxModel: normalizeCodexAcpxModel(directModel),
|
|
144
|
+
source: record.type
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (record.type === "turn_context") {
|
|
148
|
+
const collaborationMode = asRecord(payload.collaboration_mode);
|
|
149
|
+
const settings = asRecord(collaborationMode?.settings);
|
|
150
|
+
const settingsModel = stringValue(settings?.model);
|
|
151
|
+
if (settingsModel) {
|
|
152
|
+
return {
|
|
153
|
+
model: settingsModel,
|
|
154
|
+
acpxModel: normalizeCodexAcpxModel(settingsModel),
|
|
155
|
+
source: "turn_context"
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
export function normalizeCodexAcpxModel(model) {
|
|
163
|
+
const cleaned = model.trim();
|
|
164
|
+
if (!cleaned || cleaned.includes("[")) {
|
|
165
|
+
return cleaned;
|
|
166
|
+
}
|
|
167
|
+
return /^gpt-/i.test(cleaned) ? `${cleaned}[medium]` : cleaned;
|
|
168
|
+
}
|
|
169
|
+
export function buildForkContextPackage(session, rollout) {
|
|
170
|
+
return {
|
|
171
|
+
source: {
|
|
172
|
+
agent: "codex",
|
|
173
|
+
sessionId: session.id,
|
|
174
|
+
cwd: session.cwd,
|
|
175
|
+
title: session.title ?? session.preview ?? session.firstUserMessage,
|
|
176
|
+
updatedAtMs: session.updatedAtMs
|
|
177
|
+
},
|
|
178
|
+
messages: rollout.messages,
|
|
179
|
+
commands: rollout.commands,
|
|
180
|
+
truncated: rollout.truncated
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function baseProcess(process) {
|
|
184
|
+
return {
|
|
185
|
+
pid: process.pid,
|
|
186
|
+
ppid: process.ppid,
|
|
187
|
+
command: process.command,
|
|
188
|
+
cwd: process.cwd,
|
|
189
|
+
elapsed: process.elapsed
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function commandInvokesCodexCli(command) {
|
|
193
|
+
const tokens = command.split(/\s+/).filter(Boolean);
|
|
194
|
+
const firstCommandIndex = tokens.findIndex((token) => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
|
|
195
|
+
if (firstCommandIndex < 0) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
const first = tokens[firstCommandIndex];
|
|
199
|
+
const second = tokens[firstCommandIndex + 1];
|
|
200
|
+
if (pathBasename(first) === "codex") {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return pathBasename(first) === "node" && pathBasename(second) === "codex";
|
|
204
|
+
}
|
|
205
|
+
function pathBasename(value) {
|
|
206
|
+
return value?.split("/").at(-1)?.toLowerCase();
|
|
207
|
+
}
|
|
208
|
+
function messageExcerptFromRolloutRecord(record, maxTextLength) {
|
|
209
|
+
const timestamp = stringValue(record.timestamp);
|
|
210
|
+
const payload = asRecord(record.payload);
|
|
211
|
+
if (!payload) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
if (record.type === "event_msg") {
|
|
215
|
+
if (payload.type === "user_message") {
|
|
216
|
+
return message("user", stringValue(payload.message), timestamp, maxTextLength);
|
|
217
|
+
}
|
|
218
|
+
if (payload.type === "agent_message") {
|
|
219
|
+
return message("assistant", stringValue(payload.message), timestamp, maxTextLength);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (record.type !== "response_item") {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
if (payload.type === "message") {
|
|
226
|
+
const role = payload.role === "assistant" ? "assistant" : payload.role === "user" ? "user" : undefined;
|
|
227
|
+
const text = textFromContentArray(payload.content);
|
|
228
|
+
return role ? message(role, text, timestamp, maxTextLength) : undefined;
|
|
229
|
+
}
|
|
230
|
+
if (payload.type === "function_call_output") {
|
|
231
|
+
return message("tool", stringValue(payload.output), timestamp, maxTextLength);
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
function commandSummaryFromRolloutRecord(record, maxTextLength) {
|
|
236
|
+
const payload = asRecord(record.payload);
|
|
237
|
+
if (!payload) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
const timestamp = stringValue(record.timestamp);
|
|
241
|
+
const command = stringValue(payload.command) ?? stringValue(payload.cmd);
|
|
242
|
+
if (command) {
|
|
243
|
+
return {
|
|
244
|
+
command: truncateText(command, maxTextLength),
|
|
245
|
+
cwd: stringValue(payload.cwd),
|
|
246
|
+
status: stringValue(payload.status),
|
|
247
|
+
timestamp
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
const call = asRecord(payload.call) ?? asRecord(payload.tool_call);
|
|
251
|
+
const callCommand = stringValue(call?.command) ?? stringValue(call?.cmd);
|
|
252
|
+
if (!callCommand) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
command: truncateText(callCommand, maxTextLength),
|
|
257
|
+
cwd: stringValue(call?.cwd),
|
|
258
|
+
status: stringValue(call?.status),
|
|
259
|
+
timestamp
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function message(role, text, timestamp, maxTextLength) {
|
|
263
|
+
const cleaned = cleanText(text);
|
|
264
|
+
if (!cleaned) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
role,
|
|
269
|
+
text: truncateText(cleaned, maxTextLength),
|
|
270
|
+
timestamp
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function textFromContentArray(content) {
|
|
274
|
+
if (!Array.isArray(content)) {
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
return content
|
|
278
|
+
.map((item) => {
|
|
279
|
+
const record = asRecord(item);
|
|
280
|
+
return stringValue(record?.text);
|
|
281
|
+
})
|
|
282
|
+
.filter((text) => Boolean(text))
|
|
283
|
+
.join("\n");
|
|
284
|
+
}
|
|
285
|
+
function truncateText(text, maxLength) {
|
|
286
|
+
if (text.length <= maxLength) {
|
|
287
|
+
return text;
|
|
288
|
+
}
|
|
289
|
+
return `${text.slice(0, Math.max(0, maxLength - 15)).trimEnd()}... [truncated]`;
|
|
290
|
+
}
|
|
291
|
+
function cleanText(text) {
|
|
292
|
+
const cleaned = text?.replace(/\s+/g, " ").trim();
|
|
293
|
+
return cleaned || undefined;
|
|
294
|
+
}
|
|
295
|
+
function asRecord(value) {
|
|
296
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
297
|
+
}
|
|
298
|
+
function stringValue(value) {
|
|
299
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
300
|
+
}
|
|
301
|
+
function numberValue(value) {
|
|
302
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=codex-session-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-session-provider.js","sourceRoot":"","sources":["../../src/codex-session-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type CodexProcessSnapshot, type CodexThreadRow } from "./codex-session-provider.js";
|
|
2
|
+
import type { CodexLocalSessionAdapter } from "./codex-local-session-provider.js";
|
|
3
|
+
export interface CommandResult {
|
|
4
|
+
status: number | null;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
error?: Error;
|
|
8
|
+
}
|
|
9
|
+
export interface CodexStoreAdapterOptions {
|
|
10
|
+
codexHome?: string;
|
|
11
|
+
runCommand?: (command: string, args: string[]) => CommandResult;
|
|
12
|
+
maxSessions?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class CodexStoreAdapter implements CodexLocalSessionAdapter {
|
|
15
|
+
private readonly codexHome;
|
|
16
|
+
private readonly runCommand;
|
|
17
|
+
private readonly maxSessions;
|
|
18
|
+
constructor(options?: CodexStoreAdapterOptions);
|
|
19
|
+
listThreadRows(): Promise<CodexThreadRow[]>;
|
|
20
|
+
readRollout(rolloutPath: string): Promise<string | undefined>;
|
|
21
|
+
listProcessSnapshots(): Promise<CodexProcessSnapshot[]>;
|
|
22
|
+
private queryJson;
|
|
23
|
+
}
|
|
24
|
+
export declare function latestStateDbPath(codexHome: string): string | undefined;
|
|
25
|
+
export declare function parsePsProcessSnapshots(output: string): CodexProcessSnapshot[];
|
|
26
|
+
export declare function parseLsofCwdMap(output: string): Map<number, string>;
|
|
27
|
+
export declare function buildThreadSelect(columns: string[], limit: number): string;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { discoverCodexProcesses } from "./codex-session-provider.js";
|
|
6
|
+
export class CodexStoreAdapter {
|
|
7
|
+
codexHome;
|
|
8
|
+
runCommand;
|
|
9
|
+
maxSessions;
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.codexHome = options.codexHome ?? path.join(os.homedir(), ".codex");
|
|
12
|
+
this.runCommand = options.runCommand ?? runCommand;
|
|
13
|
+
this.maxSessions = options.maxSessions ?? 100;
|
|
14
|
+
}
|
|
15
|
+
async listThreadRows() {
|
|
16
|
+
const dbPath = latestStateDbPath(this.codexHome);
|
|
17
|
+
if (!dbPath) {
|
|
18
|
+
throw new Error("no Codex state sqlite database found");
|
|
19
|
+
}
|
|
20
|
+
const columns = this.queryJson(dbPath, "pragma table_info(threads)")
|
|
21
|
+
.map((column) => column.name);
|
|
22
|
+
if (!columns.includes("id") || !columns.includes("cwd")) {
|
|
23
|
+
throw new Error("Codex threads table is missing required id or cwd columns");
|
|
24
|
+
}
|
|
25
|
+
return this.queryJson(dbPath, buildThreadSelect(columns, this.maxSessions));
|
|
26
|
+
}
|
|
27
|
+
async readRollout(rolloutPath) {
|
|
28
|
+
if (!fs.existsSync(rolloutPath)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return fs.readFileSync(rolloutPath, "utf8");
|
|
32
|
+
}
|
|
33
|
+
async listProcessSnapshots() {
|
|
34
|
+
const ps = this.runCommand("ps", ["-axo", "pid,ppid,etime,command"]);
|
|
35
|
+
if (ps.status !== 0) {
|
|
36
|
+
throw new Error(ps.stderr || ps.error?.message || "ps failed");
|
|
37
|
+
}
|
|
38
|
+
const snapshots = parsePsProcessSnapshots(ps.stdout);
|
|
39
|
+
const codexSnapshots = snapshots.filter((snapshot) => discoverCodexProcesses([snapshot]).length > 0);
|
|
40
|
+
if (codexSnapshots.length === 0) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const lsof = this.runCommand("lsof", ["-a", "-d", "cwd", "-p", codexSnapshots.map((snapshot) => String(snapshot.pid)).join(",")]);
|
|
44
|
+
if (lsof.status !== 0) {
|
|
45
|
+
return codexSnapshots;
|
|
46
|
+
}
|
|
47
|
+
const cwdByPid = parseLsofCwdMap(lsof.stdout);
|
|
48
|
+
return codexSnapshots.map((snapshot) => ({
|
|
49
|
+
...snapshot,
|
|
50
|
+
cwd: snapshot.cwd ?? cwdByPid.get(snapshot.pid)
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
queryJson(dbPath, sql) {
|
|
54
|
+
const result = this.runCommand("sqlite3", ["-json", dbPath, sql]);
|
|
55
|
+
if (result.status !== 0) {
|
|
56
|
+
throw new Error(result.stderr || result.error?.message || "sqlite3 query failed");
|
|
57
|
+
}
|
|
58
|
+
return JSON.parse(result.stdout || "[]");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function latestStateDbPath(codexHome) {
|
|
62
|
+
if (!fs.existsSync(codexHome)) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
return fs.readdirSync(codexHome)
|
|
66
|
+
.filter((entry) => /^state_\d+\.sqlite$/u.test(entry))
|
|
67
|
+
.map((entry) => path.join(codexHome, entry))
|
|
68
|
+
.sort((left, right) => fs.statSync(right).mtimeMs - fs.statSync(left).mtimeMs)[0];
|
|
69
|
+
}
|
|
70
|
+
export function parsePsProcessSnapshots(output) {
|
|
71
|
+
return output
|
|
72
|
+
.split(/\r?\n/)
|
|
73
|
+
.slice(1)
|
|
74
|
+
.map((line) => /^\s*(\d+)\s+(\d+)\s+(\S+)\s+(.+?)\s*$/u.exec(line))
|
|
75
|
+
.filter((match) => Boolean(match))
|
|
76
|
+
.map((match) => ({
|
|
77
|
+
pid: Number(match[1]),
|
|
78
|
+
ppid: Number(match[2]),
|
|
79
|
+
elapsed: match[3],
|
|
80
|
+
command: match[4]
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
export function parseLsofCwdMap(output) {
|
|
84
|
+
const cwdByPid = new Map();
|
|
85
|
+
for (const line of output.split(/\r?\n/).slice(1)) {
|
|
86
|
+
const match = /^\S+\s+(\d+)\s+\S+\s+cwd\s+\S+\s+\S+\s+\S+\s+\S+\s+(.+?)\s*$/u.exec(line);
|
|
87
|
+
if (match) {
|
|
88
|
+
cwdByPid.set(Number(match[1]), match[2]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return cwdByPid;
|
|
92
|
+
}
|
|
93
|
+
export function buildThreadSelect(columns, limit) {
|
|
94
|
+
const columnSet = new Set(columns);
|
|
95
|
+
const updatedAtExpression = columnSet.has("updated_at_ms")
|
|
96
|
+
? "updated_at_ms"
|
|
97
|
+
: columnSet.has("updated_at")
|
|
98
|
+
? "updated_at * 1000"
|
|
99
|
+
: "0";
|
|
100
|
+
const select = [
|
|
101
|
+
"id",
|
|
102
|
+
"cwd",
|
|
103
|
+
columnSet.has("rollout_path") ? "rollout_path" : "null as rollout_path",
|
|
104
|
+
columnSet.has("title") ? "title" : "null as title",
|
|
105
|
+
columnSet.has("preview") ? "preview" : "null as preview",
|
|
106
|
+
columnSet.has("first_user_message") ? "first_user_message" : "null as first_user_message",
|
|
107
|
+
columnSet.has("updated_at_ms") ? "updated_at_ms" : columnSet.has("updated_at") ? "updated_at * 1000 as updated_at_ms" : "null as updated_at_ms",
|
|
108
|
+
columnSet.has("archived") ? "archived" : "0 as archived"
|
|
109
|
+
].join(", ");
|
|
110
|
+
return `select ${select} from threads order by ${updatedAtExpression} desc limit ${Math.max(1, Math.floor(limit))}`;
|
|
111
|
+
}
|
|
112
|
+
function runCommand(command, args) {
|
|
113
|
+
const result = spawnSync(command, args, {
|
|
114
|
+
encoding: "utf8",
|
|
115
|
+
maxBuffer: 1024 * 1024 * 10
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
status: result.status,
|
|
119
|
+
stdout: result.stdout,
|
|
120
|
+
stderr: result.stderr,
|
|
121
|
+
error: result.error
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=codex-store-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-store-adapter.js","sourceRoot":"","sources":["../../src/codex-store-adapter.ts"],"names":[],"mappings":"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"}
|