@tarunspandit/codexflow 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/AGENTS.example.md +18 -0
  2. package/CHANGELOG.md +311 -0
  3. package/CHATGPT_PROMPT.md +12 -0
  4. package/CODEX_PROMPT.md +12 -0
  5. package/CONTRIBUTING.md +51 -0
  6. package/DOMAIN_SETUP.md +241 -0
  7. package/FAQ.md +327 -0
  8. package/FAQ_ZH.md +279 -0
  9. package/LICENSE +21 -0
  10. package/NOTICE +9 -0
  11. package/PUBLIC_LAUNCH_CHECKLIST.md +111 -0
  12. package/README.md +287 -0
  13. package/README_ZH.md +461 -0
  14. package/SECURITY.md +145 -0
  15. package/config.example.env +31 -0
  16. package/dist/analysis/cache.js +27 -0
  17. package/dist/analysis/cache.js.map +1 -0
  18. package/dist/analysis/classify.js +102 -0
  19. package/dist/analysis/classify.js.map +1 -0
  20. package/dist/analysis/extract.js +139 -0
  21. package/dist/analysis/extract.js.map +1 -0
  22. package/dist/analysis/graph.js +22 -0
  23. package/dist/analysis/graph.js.map +1 -0
  24. package/dist/analysis/impact.js +167 -0
  25. package/dist/analysis/impact.js.map +1 -0
  26. package/dist/analysis/index.js +215 -0
  27. package/dist/analysis/index.js.map +1 -0
  28. package/dist/analysis/inventory.js +51 -0
  29. package/dist/analysis/inventory.js.map +1 -0
  30. package/dist/analysis/providers.js +24 -0
  31. package/dist/analysis/providers.js.map +1 -0
  32. package/dist/analysis/rank.js +27 -0
  33. package/dist/analysis/rank.js.map +1 -0
  34. package/dist/analysis/types.js +8 -0
  35. package/dist/analysis/types.js.map +1 -0
  36. package/dist/bashOps.js +233 -0
  37. package/dist/bashOps.js.map +1 -0
  38. package/dist/capabilitiesOps.js +365 -0
  39. package/dist/capabilitiesOps.js.map +1 -0
  40. package/dist/codexSessions.js +379 -0
  41. package/dist/codexSessions.js.map +1 -0
  42. package/dist/config.js +289 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/fsOps.js +286 -0
  45. package/dist/fsOps.js.map +1 -0
  46. package/dist/gitOps.js +79 -0
  47. package/dist/gitOps.js.map +1 -0
  48. package/dist/guard.js +198 -0
  49. package/dist/guard.js.map +1 -0
  50. package/dist/http.js +1671 -0
  51. package/dist/http.js.map +1 -0
  52. package/dist/proContext.js +274 -0
  53. package/dist/proContext.js.map +1 -0
  54. package/dist/profileStore.js +89 -0
  55. package/dist/profileStore.js.map +1 -0
  56. package/dist/projectCatalog.js +134 -0
  57. package/dist/projectCatalog.js.map +1 -0
  58. package/dist/redact.js +73 -0
  59. package/dist/redact.js.map +1 -0
  60. package/dist/searchOps.js +186 -0
  61. package/dist/searchOps.js.map +1 -0
  62. package/dist/server.js +2502 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/stdio.js +36 -0
  65. package/dist/stdio.js.map +1 -0
  66. package/dist/toolCardWidget.js +1155 -0
  67. package/dist/toolCardWidget.js.map +1 -0
  68. package/dist/workspaceOps.js +229 -0
  69. package/dist/workspaceOps.js.map +1 -0
  70. package/docs/.nojekyll +1 -0
  71. package/docs/favicon.svg +5 -0
  72. package/docs/index.html +638 -0
  73. package/docs/og.png +0 -0
  74. package/docs/script.js +80 -0
  75. package/docs/star.svg +11 -0
  76. package/docs/styles.css +1229 -0
  77. package/docs/zh.html +436 -0
  78. package/package.json +94 -0
  79. package/scripts/analysis-cli-smoke.mjs +81 -0
  80. package/scripts/analysis-smoke.mjs +179 -0
  81. package/scripts/clean.mjs +6 -0
  82. package/scripts/cli-smoke.mjs +168 -0
  83. package/scripts/codexflow.mjs +4375 -0
  84. package/scripts/doctor-smoke.mjs +90 -0
  85. package/scripts/execute-handoff-smoke.mjs +1110 -0
  86. package/scripts/http-smoke.mjs +812 -0
  87. package/scripts/pro-apply.mjs +141 -0
  88. package/scripts/pro-bundle.mjs +121 -0
  89. package/scripts/pro-smoke.mjs +95 -0
  90. package/scripts/settings-smoke.mjs +756 -0
  91. package/scripts/smoke.mjs +1194 -0
  92. package/scripts/stress.mjs +835 -0
@@ -0,0 +1,379 @@
1
+ import { createReadStream, statSync } from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { createInterface } from "node:readline";
6
+ import { CodexFlowError } from "./guard.js";
7
+ const CODEX_IDE_CONTEXT_PREFIX = "# Context from my IDE setup:";
8
+ const CODEX_REQUEST_MARKER = "my request for codex";
9
+ const UUID_RE = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/;
10
+ const META_HEAD_BYTES = 64 * 1024;
11
+ const META_TAIL_BYTES = 64 * 1024;
12
+ function codexDir(config) {
13
+ return path.resolve(config.codexDir || path.join(os.homedir(), ".codex"));
14
+ }
15
+ function sessionRoots(config) {
16
+ const root = codexDir(config);
17
+ return [path.join(root, "sessions"), path.join(root, "archived_sessions")];
18
+ }
19
+ function ensureEnabled(config, read = false) {
20
+ if (config.codexSessions === "off") {
21
+ throw new CodexFlowError("Codex session tools are disabled. Start with --codex-sessions metadata or --codex-sessions read to opt in.");
22
+ }
23
+ if (read && config.codexSessions !== "read") {
24
+ throw new CodexFlowError("Reading Codex session transcripts is disabled. Start with --codex-sessions read to opt in.");
25
+ }
26
+ }
27
+ function isSubpath(child, parent) {
28
+ const relative = path.relative(parent, child);
29
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
30
+ }
31
+ async function collectJsonlFiles(root, files, maxDepth, maxFiles, depth = 0) {
32
+ if (depth > maxDepth || files.length >= maxFiles)
33
+ return;
34
+ let entries;
35
+ try {
36
+ entries = await fsp.readdir(root, { withFileTypes: true });
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ for (const entry of entries) {
42
+ if (files.length >= maxFiles)
43
+ return;
44
+ const fullPath = path.join(root, entry.name);
45
+ if (entry.isDirectory()) {
46
+ await collectJsonlFiles(fullPath, files, maxDepth, maxFiles, depth + 1);
47
+ }
48
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
49
+ files.push(fullPath);
50
+ }
51
+ }
52
+ }
53
+ async function readFileSlice(filePath, start, length) {
54
+ if (length <= 0)
55
+ return "";
56
+ const handle = await fsp.open(filePath, "r");
57
+ try {
58
+ const buffer = Buffer.alloc(length);
59
+ const { bytesRead } = await handle.read(buffer, 0, length, start);
60
+ return buffer.subarray(0, bytesRead).toString("utf8");
61
+ }
62
+ finally {
63
+ await handle.close();
64
+ }
65
+ }
66
+ function splitJsonlLines(text) {
67
+ return text.split(/\r?\n/).filter((line) => line.length > 0);
68
+ }
69
+ async function readHeadTailLines(filePath, headLimit, tailLimit) {
70
+ const fileStat = await fsp.stat(filePath);
71
+ const headLength = Math.min(fileStat.size, META_HEAD_BYTES);
72
+ const tailOffset = Math.max(0, fileStat.size - META_TAIL_BYTES);
73
+ const tailLength = fileStat.size - tailOffset;
74
+ const [headText, tailText] = await Promise.all([
75
+ readFileSlice(filePath, 0, headLength),
76
+ tailOffset === 0 && tailLength === headLength ? Promise.resolve("") : readFileSlice(filePath, tailOffset, tailLength)
77
+ ]);
78
+ const headLines = splitJsonlLines(headText);
79
+ if (headLength < fileStat.size && !headText.endsWith("\n"))
80
+ headLines.pop();
81
+ const tailSource = tailText
82
+ ? tailOffset > 0
83
+ ? tailText.slice(Math.max(0, tailText.indexOf("\n") + 1))
84
+ : tailText
85
+ : headText;
86
+ const tailLines = splitJsonlLines(tailSource);
87
+ return {
88
+ head: headLines.slice(0, headLimit),
89
+ tail: tailLines.slice(-tailLimit)
90
+ };
91
+ }
92
+ function parseTimestamp(value) {
93
+ if (typeof value === "number" && Number.isFinite(value))
94
+ return value;
95
+ if (typeof value !== "string" || !value.trim())
96
+ return undefined;
97
+ const parsed = Date.parse(value);
98
+ return Number.isFinite(parsed) ? parsed : undefined;
99
+ }
100
+ function extractText(value) {
101
+ if (typeof value === "string")
102
+ return value;
103
+ if (Array.isArray(value)) {
104
+ return value.map((item) => {
105
+ if (typeof item === "string")
106
+ return item;
107
+ if (item && typeof item === "object" && "text" in item)
108
+ return String(item.text ?? "");
109
+ return "";
110
+ }).filter(Boolean).join("\n");
111
+ }
112
+ if (value && typeof value === "object" && "text" in value) {
113
+ return String(value.text ?? "");
114
+ }
115
+ return "";
116
+ }
117
+ function truncate(text, max) {
118
+ const clean = text.replace(/\s+/g, " ").trim();
119
+ if (clean.length <= max)
120
+ return clean;
121
+ return `${clean.slice(0, Math.max(0, max - 1)).trimEnd()}…`;
122
+ }
123
+ function basename(value) {
124
+ if (!value)
125
+ return undefined;
126
+ const cleaned = value.replace(/[\\/]+$/, "");
127
+ const base = path.basename(cleaned);
128
+ return base || undefined;
129
+ }
130
+ function codexRequestHeadingPayload(line) {
131
+ const trimmed = line.trim();
132
+ if (!trimmed.startsWith("#"))
133
+ return null;
134
+ const heading = trimmed.replace(/^#+\s*/, "");
135
+ const lowered = heading.toLowerCase();
136
+ if (!lowered.startsWith(CODEX_REQUEST_MARKER))
137
+ return null;
138
+ const suffix = heading.slice(CODEX_REQUEST_MARKER.length).trimStart();
139
+ if (!suffix)
140
+ return "";
141
+ if (!/^[::\-—]/.test(suffix))
142
+ return null;
143
+ return suffix.replace(/^[::\-—\s]+/, "").trim();
144
+ }
145
+ function extractCodexFlowmptFromIdeContext(text) {
146
+ const trimmed = text.trim();
147
+ if (!trimmed.startsWith(CODEX_IDE_CONTEXT_PREFIX))
148
+ return undefined;
149
+ const lines = trimmed.replace(/\r\n/g, "\n").split("\n");
150
+ let prompt;
151
+ for (const [index, line] of lines.entries()) {
152
+ const inline = codexRequestHeadingPayload(line);
153
+ if (inline === null)
154
+ continue;
155
+ if (inline) {
156
+ prompt = inline;
157
+ continue;
158
+ }
159
+ const following = lines.slice(index + 1).join("\n").trim();
160
+ prompt = following || undefined;
161
+ }
162
+ return prompt;
163
+ }
164
+ function titleCandidateFromUserMessage(text) {
165
+ const trimmed = text.trim();
166
+ if (!trimmed || trimmed.startsWith("# AGENTS.md") || trimmed.startsWith("<environment_context>"))
167
+ return undefined;
168
+ if (trimmed.startsWith(CODEX_IDE_CONTEXT_PREFIX))
169
+ return extractCodexFlowmptFromIdeContext(trimmed);
170
+ return trimmed;
171
+ }
172
+ function inferSessionIdFromFilename(filePath) {
173
+ const match = path.basename(filePath).match(UUID_RE);
174
+ return match?.[0];
175
+ }
176
+ function parseJsonLine(line) {
177
+ try {
178
+ return JSON.parse(line);
179
+ }
180
+ catch {
181
+ return undefined;
182
+ }
183
+ }
184
+ function isSubagentSource(payload) {
185
+ return Boolean(payload?.source && typeof payload.source === "object" && "subagent" in payload.source);
186
+ }
187
+ async function parseSessionMeta(filePath) {
188
+ const { head, tail } = await readHeadTailLines(filePath, 16, 48);
189
+ let sessionId;
190
+ let projectDir;
191
+ let createdAt;
192
+ let firstUserMessage;
193
+ for (const line of head) {
194
+ const value = parseJsonLine(line);
195
+ if (!value)
196
+ continue;
197
+ createdAt ??= parseTimestamp(value.timestamp);
198
+ if (value.type === "session_meta" && value.payload) {
199
+ if (isSubagentSource(value.payload))
200
+ return undefined;
201
+ sessionId ??= value.payload.id || value.payload.session_id || value.payload.sessionId;
202
+ projectDir ??= value.payload.cwd || value.payload.project_dir || value.payload.projectDir;
203
+ createdAt ??= parseTimestamp(value.payload.timestamp);
204
+ }
205
+ if (!firstUserMessage && value.type === "response_item" && value.payload?.type === "message" && value.payload?.role === "user") {
206
+ const text = extractText(value.payload.content);
207
+ firstUserMessage = titleCandidateFromUserMessage(text);
208
+ }
209
+ }
210
+ let lastActiveAt;
211
+ for (const line of [...tail].reverse()) {
212
+ const value = parseJsonLine(line);
213
+ if (!value)
214
+ continue;
215
+ lastActiveAt ??= parseTimestamp(value.timestamp);
216
+ if (lastActiveAt)
217
+ break;
218
+ }
219
+ const id = String(sessionId || inferSessionIdFromFilename(filePath) || "").trim();
220
+ if (!id)
221
+ return undefined;
222
+ const title = firstUserMessage ? truncate(firstUserMessage, 96) : basename(projectDir);
223
+ return {
224
+ provider_id: "codex",
225
+ session_id: id,
226
+ ...(title ? { title } : {}),
227
+ ...(projectDir ? { project_dir: projectDir } : {}),
228
+ ...(createdAt ? { created_at: createdAt } : {}),
229
+ ...(lastActiveAt ? { last_active_at: lastActiveAt } : {}),
230
+ source_path: filePath,
231
+ resume_command: `codex resume ${id}`
232
+ };
233
+ }
234
+ async function collectSessionMetas(config) {
235
+ const files = [];
236
+ for (const root of sessionRoots(config)) {
237
+ await collectJsonlFiles(root, files, 6, 3000);
238
+ }
239
+ const sessions = [];
240
+ for (const file of files) {
241
+ const meta = await parseSessionMeta(file).catch(() => undefined);
242
+ if (meta)
243
+ sessions.push(meta);
244
+ }
245
+ return sessions;
246
+ }
247
+ export async function listCodexSessions(config, options = {}) {
248
+ ensureEnabled(config);
249
+ const roots = sessionRoots(config);
250
+ const sessions = await collectSessionMetas(config);
251
+ const query = options.query?.trim().toLowerCase();
252
+ const filtered = query
253
+ ? sessions.filter((session) => [
254
+ session.session_id,
255
+ session.title,
256
+ session.project_dir,
257
+ session.source_path
258
+ ].filter(Boolean).join("\n").toLowerCase().includes(query))
259
+ : sessions;
260
+ filtered.sort((a, b) => (b.last_active_at ?? b.created_at ?? 0) - (a.last_active_at ?? a.created_at ?? 0));
261
+ const maxSessions = Math.max(1, Math.min(Number(options.maxSessions ?? 30), 200));
262
+ return {
263
+ codex_dir: codexDir(config),
264
+ roots,
265
+ sessions: filtered.slice(0, maxSessions),
266
+ total_found: filtered.length
267
+ };
268
+ }
269
+ export async function listCodexProjectDirectories(config) {
270
+ ensureEnabled(config);
271
+ const sessions = await collectSessionMetas(config);
272
+ const projects = new Map();
273
+ for (const session of sessions) {
274
+ if (!session.project_dir)
275
+ continue;
276
+ const projectDir = path.resolve(session.project_dir);
277
+ const current = projects.get(projectDir) ?? { project_dir: projectDir, session_count: 0 };
278
+ current.session_count += 1;
279
+ const activeAt = session.last_active_at ?? session.created_at;
280
+ if (activeAt && (!current.last_active_at || activeAt > current.last_active_at))
281
+ current.last_active_at = activeAt;
282
+ projects.set(projectDir, current);
283
+ }
284
+ return [...projects.values()].sort((a, b) => (b.last_active_at ?? 0) - (a.last_active_at ?? 0) || a.project_dir.localeCompare(b.project_dir));
285
+ }
286
+ async function resolveSessionSource(config, sessionId, sourcePath) {
287
+ ensureEnabled(config, true);
288
+ const roots = await Promise.all(sessionRoots(config).map(async (root) => fsp.realpath(root).catch(() => path.resolve(root))));
289
+ if (sourcePath) {
290
+ const resolved = path.resolve(sourcePath);
291
+ const canonical = await fsp.realpath(resolved).catch(() => resolved);
292
+ if (!roots.some((root) => isSubpath(canonical, root))) {
293
+ throw new CodexFlowError("Codex session source_path is outside configured Codex session roots.");
294
+ }
295
+ const meta = await parseSessionMeta(canonical);
296
+ if (!meta)
297
+ throw new CodexFlowError("Could not parse Codex session metadata from source_path.");
298
+ if (sessionId && meta.session_id !== sessionId)
299
+ throw new CodexFlowError("Codex session id does not match source_path.");
300
+ return meta;
301
+ }
302
+ if (!sessionId)
303
+ throw new CodexFlowError("session_id or source_path is required.");
304
+ const sessions = await collectSessionMetas(config);
305
+ const match = sessions.find((session) => session.session_id === sessionId);
306
+ if (!match)
307
+ throw new CodexFlowError(`Codex session not found: ${sessionId}`);
308
+ return match;
309
+ }
310
+ async function loadSessionMessages(filePath, maxMessages, maxTotalBytes) {
311
+ const size = statSync(filePath).size;
312
+ if (size > 20_000_000) {
313
+ throw new CodexFlowError(`Codex session file is too large (${size} bytes).`);
314
+ }
315
+ const messages = [];
316
+ let usedBytes = 0;
317
+ let truncated = false;
318
+ const rl = createInterface({ input: createReadStream(filePath, { encoding: "utf8" }), crlfDelay: Infinity });
319
+ for await (const line of rl) {
320
+ const value = parseJsonLine(line);
321
+ if (value?.type !== "response_item" || !value.payload)
322
+ continue;
323
+ const payload = value.payload;
324
+ let role = "";
325
+ let content = "";
326
+ if (payload.type === "message") {
327
+ role = String(payload.role || "unknown");
328
+ content = extractText(payload.content);
329
+ }
330
+ else if (payload.type === "function_call") {
331
+ role = "assistant";
332
+ content = `[Tool: ${payload.name || "unknown"}]`;
333
+ }
334
+ else if (payload.type === "function_call_output") {
335
+ role = "tool";
336
+ content = String(payload.output || "");
337
+ }
338
+ else {
339
+ continue;
340
+ }
341
+ if (!content.trim())
342
+ continue;
343
+ const nextBytes = Buffer.byteLength(content, "utf8");
344
+ if (messages.length >= maxMessages || usedBytes + nextBytes > maxTotalBytes) {
345
+ truncated = true;
346
+ break;
347
+ }
348
+ usedBytes += nextBytes;
349
+ const ts = parseTimestamp(value.timestamp);
350
+ messages.push({ role, content, ...(ts !== undefined ? { ts } : {}) });
351
+ }
352
+ return { messages, truncated };
353
+ }
354
+ export async function readCodexSession(config, options = {}) {
355
+ const session = await resolveSessionSource(config, options.sessionId, options.sourcePath);
356
+ const maxMessages = Math.max(1, Math.min(Number(options.maxMessages ?? 80), 400));
357
+ const maxTotalBytes = Math.max(4_000, Math.min(Number(options.maxTotalBytes ?? 80_000), 400_000));
358
+ const { messages, truncated } = await loadSessionMessages(session.source_path, maxMessages, maxTotalBytes);
359
+ const transcript = messages.map((message) => {
360
+ const when = message.ts ? ` ${new Date(message.ts).toISOString()}` : "";
361
+ return `### ${message.role}${when}\n\n${message.content}`;
362
+ }).join("\n\n");
363
+ const text = [
364
+ "# Codex Session",
365
+ "",
366
+ `Session: ${session.session_id}`,
367
+ session.title ? `Title: ${session.title}` : "",
368
+ session.project_dir ? `CWD: ${session.project_dir}` : "",
369
+ `Source: ${session.source_path}`,
370
+ `Resume: ${session.resume_command}`,
371
+ truncated ? "Transcript truncated by configured limits." : "",
372
+ "",
373
+ "## Transcript",
374
+ "",
375
+ transcript || "No readable transcript messages found."
376
+ ].filter((line) => line !== "").join("\n");
377
+ return { session, messages, truncated, text };
378
+ }
379
+ //# sourceMappingURL=codexSessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexSessions.js","sourceRoot":"","sources":["../src/codexSessions.ts"],"names":[],"mappings":"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"}