@paperclipai/adapter-codex-local 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cli/format-event.d.ts +2 -0
  2. package/dist/cli/format-event.d.ts.map +1 -0
  3. package/dist/cli/format-event.js +213 -0
  4. package/dist/cli/format-event.js.map +1 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +41 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/server/execute.d.ts +3 -0
  14. package/dist/server/execute.d.ts.map +1 -0
  15. package/dist/server/execute.js +341 -0
  16. package/dist/server/execute.js.map +1 -0
  17. package/dist/server/index.d.ts +6 -0
  18. package/dist/server/index.d.ts.map +1 -0
  19. package/dist/server/index.js +55 -0
  20. package/dist/server/index.js.map +1 -0
  21. package/dist/server/parse.d.ts +12 -0
  22. package/dist/server/parse.d.ts.map +1 -0
  23. package/dist/server/parse.js +67 -0
  24. package/dist/server/parse.js.map +1 -0
  25. package/dist/server/test.d.ts +3 -0
  26. package/dist/server/test.d.ts.map +1 -0
  27. package/dist/server/test.js +194 -0
  28. package/dist/server/test.js.map +1 -0
  29. package/dist/ui/build-config.d.ts +3 -0
  30. package/dist/ui/build-config.d.ts.map +1 -0
  31. package/dist/ui/build-config.js +88 -0
  32. package/dist/ui/build-config.js.map +1 -0
  33. package/dist/ui/index.d.ts +3 -0
  34. package/dist/ui/index.d.ts.map +1 -0
  35. package/dist/ui/index.js +3 -0
  36. package/dist/ui/index.js.map +1 -0
  37. package/dist/ui/parse-stdout.d.ts +3 -0
  38. package/dist/ui/parse-stdout.d.ts.map +1 -0
  39. package/dist/ui/parse-stdout.js +225 -0
  40. package/dist/ui/parse-stdout.js.map +1 -0
  41. package/package.json +43 -0
@@ -0,0 +1,341 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { asString, asNumber, asBoolean, asStringArray, parseObject, buildPaperclipEnv, redactEnvForLogs, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, renderTemplate, runChildProcess, } from "@paperclipai/adapter-utils/server-utils";
6
+ import { parseCodexJsonl, isCodexUnknownSessionError } from "./parse.js";
7
+ const PAPERCLIP_SKILLS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../../../../skills");
8
+ const CODEX_ROLLOUT_NOISE_RE = /^\d{4}-\d{2}-\d{2}T[^\s]+\s+ERROR\s+codex_core::rollout::list:\s+state db missing rollout path for thread\s+[a-z0-9-]+$/i;
9
+ function stripCodexRolloutNoise(text) {
10
+ const parts = text.split(/\r?\n/);
11
+ const kept = [];
12
+ for (const part of parts) {
13
+ const trimmed = part.trim();
14
+ if (!trimmed) {
15
+ kept.push(part);
16
+ continue;
17
+ }
18
+ if (CODEX_ROLLOUT_NOISE_RE.test(trimmed))
19
+ continue;
20
+ kept.push(part);
21
+ }
22
+ return kept.join("\n");
23
+ }
24
+ function firstNonEmptyLine(text) {
25
+ return (text
26
+ .split(/\r?\n/)
27
+ .map((line) => line.trim())
28
+ .find(Boolean) ?? "");
29
+ }
30
+ function hasNonEmptyEnvValue(env, key) {
31
+ const raw = env[key];
32
+ return typeof raw === "string" && raw.trim().length > 0;
33
+ }
34
+ function resolveCodexBillingType(env) {
35
+ // Codex uses API-key auth when OPENAI_API_KEY is present; otherwise rely on local login/session auth.
36
+ return hasNonEmptyEnvValue(env, "OPENAI_API_KEY") ? "api" : "subscription";
37
+ }
38
+ function codexHomeDir() {
39
+ const fromEnv = process.env.CODEX_HOME;
40
+ if (typeof fromEnv === "string" && fromEnv.trim().length > 0)
41
+ return fromEnv.trim();
42
+ return path.join(os.homedir(), ".codex");
43
+ }
44
+ async function ensureCodexSkillsInjected(onLog) {
45
+ const sourceExists = await fs
46
+ .stat(PAPERCLIP_SKILLS_DIR)
47
+ .then((stats) => stats.isDirectory())
48
+ .catch(() => false);
49
+ if (!sourceExists)
50
+ return;
51
+ const skillsHome = path.join(codexHomeDir(), "skills");
52
+ await fs.mkdir(skillsHome, { recursive: true });
53
+ const entries = await fs.readdir(PAPERCLIP_SKILLS_DIR, { withFileTypes: true });
54
+ for (const entry of entries) {
55
+ if (!entry.isDirectory())
56
+ continue;
57
+ const source = path.join(PAPERCLIP_SKILLS_DIR, entry.name);
58
+ const target = path.join(skillsHome, entry.name);
59
+ const existing = await fs.lstat(target).catch(() => null);
60
+ if (existing)
61
+ continue;
62
+ try {
63
+ await fs.symlink(source, target);
64
+ await onLog("stderr", `[paperclip] Injected Codex skill "${entry.name}" into ${skillsHome}\n`);
65
+ }
66
+ catch (err) {
67
+ await onLog("stderr", `[paperclip] Failed to inject Codex skill "${entry.name}" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\n`);
68
+ }
69
+ }
70
+ }
71
+ export async function execute(ctx) {
72
+ const { runId, agent, runtime, config, context, onLog, onMeta, authToken } = ctx;
73
+ const promptTemplate = asString(config.promptTemplate, "You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.");
74
+ const command = asString(config.command, "codex");
75
+ const model = asString(config.model, "");
76
+ const modelReasoningEffort = asString(config.modelReasoningEffort, asString(config.reasoningEffort, ""));
77
+ const search = asBoolean(config.search, false);
78
+ const bypass = asBoolean(config.dangerouslyBypassApprovalsAndSandbox, asBoolean(config.dangerouslyBypassSandbox, false));
79
+ const workspaceContext = parseObject(context.paperclipWorkspace);
80
+ const workspaceCwd = asString(workspaceContext.cwd, "");
81
+ const workspaceSource = asString(workspaceContext.source, "");
82
+ const workspaceId = asString(workspaceContext.workspaceId, "");
83
+ const workspaceRepoUrl = asString(workspaceContext.repoUrl, "");
84
+ const workspaceRepoRef = asString(workspaceContext.repoRef, "");
85
+ const workspaceHints = Array.isArray(context.paperclipWorkspaces)
86
+ ? context.paperclipWorkspaces.filter((value) => typeof value === "object" && value !== null)
87
+ : [];
88
+ const configuredCwd = asString(config.cwd, "");
89
+ const useConfiguredInsteadOfAgentHome = workspaceSource === "agent_home" && configuredCwd.length > 0;
90
+ const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? "" : workspaceCwd;
91
+ const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();
92
+ await ensureAbsoluteDirectory(cwd, { createIfMissing: true });
93
+ await ensureCodexSkillsInjected(onLog);
94
+ const envConfig = parseObject(config.env);
95
+ const hasExplicitApiKey = typeof envConfig.PAPERCLIP_API_KEY === "string" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;
96
+ const env = { ...buildPaperclipEnv(agent) };
97
+ env.PAPERCLIP_RUN_ID = runId;
98
+ const wakeTaskId = (typeof context.taskId === "string" && context.taskId.trim().length > 0 && context.taskId.trim()) ||
99
+ (typeof context.issueId === "string" && context.issueId.trim().length > 0 && context.issueId.trim()) ||
100
+ null;
101
+ const wakeReason = typeof context.wakeReason === "string" && context.wakeReason.trim().length > 0
102
+ ? context.wakeReason.trim()
103
+ : null;
104
+ const wakeCommentId = (typeof context.wakeCommentId === "string" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||
105
+ (typeof context.commentId === "string" && context.commentId.trim().length > 0 && context.commentId.trim()) ||
106
+ null;
107
+ const approvalId = typeof context.approvalId === "string" && context.approvalId.trim().length > 0
108
+ ? context.approvalId.trim()
109
+ : null;
110
+ const approvalStatus = typeof context.approvalStatus === "string" && context.approvalStatus.trim().length > 0
111
+ ? context.approvalStatus.trim()
112
+ : null;
113
+ const linkedIssueIds = Array.isArray(context.issueIds)
114
+ ? context.issueIds.filter((value) => typeof value === "string" && value.trim().length > 0)
115
+ : [];
116
+ if (wakeTaskId) {
117
+ env.PAPERCLIP_TASK_ID = wakeTaskId;
118
+ }
119
+ if (wakeReason) {
120
+ env.PAPERCLIP_WAKE_REASON = wakeReason;
121
+ }
122
+ if (wakeCommentId) {
123
+ env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;
124
+ }
125
+ if (approvalId) {
126
+ env.PAPERCLIP_APPROVAL_ID = approvalId;
127
+ }
128
+ if (approvalStatus) {
129
+ env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;
130
+ }
131
+ if (linkedIssueIds.length > 0) {
132
+ env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(",");
133
+ }
134
+ if (effectiveWorkspaceCwd) {
135
+ env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;
136
+ }
137
+ if (workspaceSource) {
138
+ env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;
139
+ }
140
+ if (workspaceId) {
141
+ env.PAPERCLIP_WORKSPACE_ID = workspaceId;
142
+ }
143
+ if (workspaceRepoUrl) {
144
+ env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;
145
+ }
146
+ if (workspaceRepoRef) {
147
+ env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;
148
+ }
149
+ if (workspaceHints.length > 0) {
150
+ env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);
151
+ }
152
+ for (const [k, v] of Object.entries(envConfig)) {
153
+ if (typeof v === "string")
154
+ env[k] = v;
155
+ }
156
+ if (!hasExplicitApiKey && authToken) {
157
+ env.PAPERCLIP_API_KEY = authToken;
158
+ }
159
+ const billingType = resolveCodexBillingType(env);
160
+ const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
161
+ await ensureCommandResolvable(command, cwd, runtimeEnv);
162
+ const timeoutSec = asNumber(config.timeoutSec, 0);
163
+ const graceSec = asNumber(config.graceSec, 20);
164
+ const extraArgs = (() => {
165
+ const fromExtraArgs = asStringArray(config.extraArgs);
166
+ if (fromExtraArgs.length > 0)
167
+ return fromExtraArgs;
168
+ return asStringArray(config.args);
169
+ })();
170
+ const runtimeSessionParams = parseObject(runtime.sessionParams);
171
+ const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? "");
172
+ const runtimeSessionCwd = asString(runtimeSessionParams.cwd, "");
173
+ const canResumeSession = runtimeSessionId.length > 0 &&
174
+ (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));
175
+ const sessionId = canResumeSession ? runtimeSessionId : null;
176
+ if (runtimeSessionId && !canResumeSession) {
177
+ await onLog("stderr", `[paperclip] Codex session "${runtimeSessionId}" was saved for cwd "${runtimeSessionCwd}" and will not be resumed in "${cwd}".\n`);
178
+ }
179
+ const instructionsFilePath = asString(config.instructionsFilePath, "").trim();
180
+ const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : "";
181
+ let instructionsPrefix = "";
182
+ if (instructionsFilePath) {
183
+ try {
184
+ const instructionsContents = await fs.readFile(instructionsFilePath, "utf8");
185
+ instructionsPrefix =
186
+ `${instructionsContents}\n\n` +
187
+ `The above agent instructions were loaded from ${instructionsFilePath}. ` +
188
+ `Resolve any relative file references from ${instructionsDir}.\n\n`;
189
+ await onLog("stderr", `[paperclip] Loaded agent instructions file: ${instructionsFilePath}\n`);
190
+ }
191
+ catch (err) {
192
+ const reason = err instanceof Error ? err.message : String(err);
193
+ await onLog("stderr", `[paperclip] Warning: could not read agent instructions file "${instructionsFilePath}": ${reason}\n`);
194
+ }
195
+ }
196
+ const commandNotes = (() => {
197
+ if (!instructionsFilePath)
198
+ return [];
199
+ if (instructionsPrefix.length > 0) {
200
+ return [
201
+ `Loaded agent instructions from ${instructionsFilePath}`,
202
+ `Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`,
203
+ ];
204
+ }
205
+ return [
206
+ `Configured instructionsFilePath ${instructionsFilePath}, but file could not be read; continuing without injected instructions.`,
207
+ ];
208
+ })();
209
+ const renderedPrompt = renderTemplate(promptTemplate, {
210
+ agentId: agent.id,
211
+ companyId: agent.companyId,
212
+ runId,
213
+ company: { id: agent.companyId },
214
+ agent,
215
+ run: { id: runId, source: "on_demand" },
216
+ context,
217
+ });
218
+ const prompt = `${instructionsPrefix}${renderedPrompt}`;
219
+ const buildArgs = (resumeSessionId) => {
220
+ const args = ["exec", "--json"];
221
+ if (search)
222
+ args.unshift("--search");
223
+ if (bypass)
224
+ args.push("--dangerously-bypass-approvals-and-sandbox");
225
+ if (model)
226
+ args.push("--model", model);
227
+ if (modelReasoningEffort)
228
+ args.push("-c", `model_reasoning_effort=${JSON.stringify(modelReasoningEffort)}`);
229
+ if (extraArgs.length > 0)
230
+ args.push(...extraArgs);
231
+ if (resumeSessionId)
232
+ args.push("resume", resumeSessionId, "-");
233
+ else
234
+ args.push("-");
235
+ return args;
236
+ };
237
+ const runAttempt = async (resumeSessionId) => {
238
+ const args = buildArgs(resumeSessionId);
239
+ if (onMeta) {
240
+ await onMeta({
241
+ adapterType: "codex_local",
242
+ command,
243
+ cwd,
244
+ commandNotes,
245
+ commandArgs: args.map((value, idx) => {
246
+ if (idx === args.length - 1 && value !== "-")
247
+ return `<prompt ${prompt.length} chars>`;
248
+ return value;
249
+ }),
250
+ env: redactEnvForLogs(env),
251
+ prompt,
252
+ context,
253
+ });
254
+ }
255
+ const proc = await runChildProcess(runId, command, args, {
256
+ cwd,
257
+ env,
258
+ stdin: prompt,
259
+ timeoutSec,
260
+ graceSec,
261
+ onLog: async (stream, chunk) => {
262
+ if (stream !== "stderr") {
263
+ await onLog(stream, chunk);
264
+ return;
265
+ }
266
+ const cleaned = stripCodexRolloutNoise(chunk);
267
+ if (!cleaned.trim())
268
+ return;
269
+ await onLog(stream, cleaned);
270
+ },
271
+ });
272
+ const cleanedStderr = stripCodexRolloutNoise(proc.stderr);
273
+ return {
274
+ proc: {
275
+ ...proc,
276
+ stderr: cleanedStderr,
277
+ },
278
+ rawStderr: proc.stderr,
279
+ parsed: parseCodexJsonl(proc.stdout),
280
+ };
281
+ };
282
+ const toResult = (attempt, clearSessionOnMissingSession = false) => {
283
+ if (attempt.proc.timedOut) {
284
+ return {
285
+ exitCode: attempt.proc.exitCode,
286
+ signal: attempt.proc.signal,
287
+ timedOut: true,
288
+ errorMessage: `Timed out after ${timeoutSec}s`,
289
+ clearSession: clearSessionOnMissingSession,
290
+ };
291
+ }
292
+ const resolvedSessionId = attempt.parsed.sessionId ?? runtimeSessionId ?? runtime.sessionId ?? null;
293
+ const resolvedSessionParams = resolvedSessionId
294
+ ? {
295
+ sessionId: resolvedSessionId,
296
+ cwd,
297
+ ...(workspaceId ? { workspaceId } : {}),
298
+ ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),
299
+ ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),
300
+ }
301
+ : null;
302
+ const parsedError = typeof attempt.parsed.errorMessage === "string" ? attempt.parsed.errorMessage.trim() : "";
303
+ const stderrLine = firstNonEmptyLine(attempt.proc.stderr);
304
+ const fallbackErrorMessage = parsedError ||
305
+ stderrLine ||
306
+ `Codex exited with code ${attempt.proc.exitCode ?? -1}`;
307
+ return {
308
+ exitCode: attempt.proc.exitCode,
309
+ signal: attempt.proc.signal,
310
+ timedOut: false,
311
+ errorMessage: (attempt.proc.exitCode ?? 0) === 0
312
+ ? null
313
+ : fallbackErrorMessage,
314
+ usage: attempt.parsed.usage,
315
+ sessionId: resolvedSessionId,
316
+ sessionParams: resolvedSessionParams,
317
+ sessionDisplayId: resolvedSessionId,
318
+ provider: "openai",
319
+ model,
320
+ billingType,
321
+ costUsd: null,
322
+ resultJson: {
323
+ stdout: attempt.proc.stdout,
324
+ stderr: attempt.proc.stderr,
325
+ },
326
+ summary: attempt.parsed.summary,
327
+ clearSession: Boolean(clearSessionOnMissingSession && !resolvedSessionId),
328
+ };
329
+ };
330
+ const initial = await runAttempt(sessionId);
331
+ if (sessionId &&
332
+ !initial.proc.timedOut &&
333
+ (initial.proc.exitCode ?? 0) !== 0 &&
334
+ isCodexUnknownSessionError(initial.proc.stdout, initial.rawStderr)) {
335
+ await onLog("stderr", `[paperclip] Codex resume session "${sessionId}" is unavailable; retrying with a fresh session.\n`);
336
+ const retry = await runAttempt(null);
337
+ return toResult(retry, true);
338
+ }
339
+ return toResult(initial);
340
+ }
341
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/server/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test.js";
3
+ export { parseCodexJsonl, isCodexUnknownSessionError } from "./parse.js";
4
+ import type { AdapterSessionCodec } from "@paperclipai/adapter-utils";
5
+ export declare const sessionCodec: AdapterSessionCodec;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMtE,eAAO,MAAM,YAAY,EAAE,mBA4C1B,CAAC"}
@@ -0,0 +1,55 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test.js";
3
+ export { parseCodexJsonl, isCodexUnknownSessionError } from "./parse.js";
4
+ function readNonEmptyString(value) {
5
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
6
+ }
7
+ export const sessionCodec = {
8
+ deserialize(raw) {
9
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
10
+ return null;
11
+ const record = raw;
12
+ const sessionId = readNonEmptyString(record.sessionId) ?? readNonEmptyString(record.session_id);
13
+ if (!sessionId)
14
+ return null;
15
+ const cwd = readNonEmptyString(record.cwd) ??
16
+ readNonEmptyString(record.workdir) ??
17
+ readNonEmptyString(record.folder);
18
+ const workspaceId = readNonEmptyString(record.workspaceId) ?? readNonEmptyString(record.workspace_id);
19
+ const repoUrl = readNonEmptyString(record.repoUrl) ?? readNonEmptyString(record.repo_url);
20
+ const repoRef = readNonEmptyString(record.repoRef) ?? readNonEmptyString(record.repo_ref);
21
+ return {
22
+ sessionId,
23
+ ...(cwd ? { cwd } : {}),
24
+ ...(workspaceId ? { workspaceId } : {}),
25
+ ...(repoUrl ? { repoUrl } : {}),
26
+ ...(repoRef ? { repoRef } : {}),
27
+ };
28
+ },
29
+ serialize(params) {
30
+ if (!params)
31
+ return null;
32
+ const sessionId = readNonEmptyString(params.sessionId) ?? readNonEmptyString(params.session_id);
33
+ if (!sessionId)
34
+ return null;
35
+ const cwd = readNonEmptyString(params.cwd) ??
36
+ readNonEmptyString(params.workdir) ??
37
+ readNonEmptyString(params.folder);
38
+ const workspaceId = readNonEmptyString(params.workspaceId) ?? readNonEmptyString(params.workspace_id);
39
+ const repoUrl = readNonEmptyString(params.repoUrl) ?? readNonEmptyString(params.repo_url);
40
+ const repoRef = readNonEmptyString(params.repoRef) ?? readNonEmptyString(params.repo_ref);
41
+ return {
42
+ sessionId,
43
+ ...(cwd ? { cwd } : {}),
44
+ ...(workspaceId ? { workspaceId } : {}),
45
+ ...(repoUrl ? { repoUrl } : {}),
46
+ ...(repoRef ? { repoRef } : {}),
47
+ };
48
+ },
49
+ getDisplayId(params) {
50
+ if (!params)
51
+ return null;
52
+ return readNonEmptyString(params.sessionId) ?? readNonEmptyString(params.session_id);
53
+ },
54
+ };
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGzE,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAwB;IAC/C,WAAW,CAAC,GAAY;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GACP,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9B,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC;YAClC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtG,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1F,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GACP,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9B,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC;YAClC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtG,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1F,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,MAAsC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function parseCodexJsonl(stdout: string): {
2
+ sessionId: string | null;
3
+ summary: string;
4
+ usage: {
5
+ inputTokens: number;
6
+ cachedInputTokens: number;
7
+ outputTokens: number;
8
+ };
9
+ errorMessage: string | null;
10
+ };
11
+ export declare function isCodexUnknownSessionError(stdout: string, stderr: string): boolean;
12
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM;;;;;;;;;EA2D7C;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CASlF"}
@@ -0,0 +1,67 @@
1
+ import { asString, asNumber, parseObject, parseJson } from "@paperclipai/adapter-utils/server-utils";
2
+ export function parseCodexJsonl(stdout) {
3
+ let sessionId = null;
4
+ const messages = [];
5
+ let errorMessage = null;
6
+ const usage = {
7
+ inputTokens: 0,
8
+ cachedInputTokens: 0,
9
+ outputTokens: 0,
10
+ };
11
+ for (const rawLine of stdout.split(/\r?\n/)) {
12
+ const line = rawLine.trim();
13
+ if (!line)
14
+ continue;
15
+ const event = parseJson(line);
16
+ if (!event)
17
+ continue;
18
+ const type = asString(event.type, "");
19
+ if (type === "thread.started") {
20
+ sessionId = asString(event.thread_id, sessionId ?? "") || sessionId;
21
+ continue;
22
+ }
23
+ if (type === "error") {
24
+ const msg = asString(event.message, "").trim();
25
+ if (msg)
26
+ errorMessage = msg;
27
+ continue;
28
+ }
29
+ if (type === "item.completed") {
30
+ const item = parseObject(event.item);
31
+ if (asString(item.type, "") === "agent_message") {
32
+ const text = asString(item.text, "");
33
+ if (text)
34
+ messages.push(text);
35
+ }
36
+ continue;
37
+ }
38
+ if (type === "turn.completed") {
39
+ const usageObj = parseObject(event.usage);
40
+ usage.inputTokens = asNumber(usageObj.input_tokens, usage.inputTokens);
41
+ usage.cachedInputTokens = asNumber(usageObj.cached_input_tokens, usage.cachedInputTokens);
42
+ usage.outputTokens = asNumber(usageObj.output_tokens, usage.outputTokens);
43
+ continue;
44
+ }
45
+ if (type === "turn.failed") {
46
+ const err = parseObject(event.error);
47
+ const msg = asString(err.message, "").trim();
48
+ if (msg)
49
+ errorMessage = msg;
50
+ }
51
+ }
52
+ return {
53
+ sessionId,
54
+ summary: messages.join("\n\n").trim(),
55
+ usage,
56
+ errorMessage,
57
+ };
58
+ }
59
+ export function isCodexUnknownSessionError(stdout, stderr) {
60
+ const haystack = `${stdout}\n${stderr}`
61
+ .split(/\r?\n/)
62
+ .map((line) => line.trim())
63
+ .filter(Boolean)
64
+ .join("\n");
65
+ return /unknown (session|thread)|session .* not found|thread .* not found|conversation .* not found|missing rollout path for thread|state db missing rollout path/i.test(haystack);
66
+ }
67
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@paperclipai/adapter-utils";
2
+ export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,4BAA4B,CAAC;AAiDpC,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAuKvC"}