@gigaflow/gmux 0.15.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 +654 -0
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/dist/adapters/claude-code.d.ts +52 -0
- package/dist/adapters/claude-code.js +315 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +39 -0
- package/dist/adapters/codex.js +233 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/jsonl.d.ts +40 -0
- package/dist/adapters/jsonl.js +92 -0
- package/dist/adapters/jsonl.js.map +1 -0
- package/dist/adapters/registry.d.ts +11 -0
- package/dist/adapters/registry.js +21 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +43 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/border-client.d.ts +8 -0
- package/dist/cli/border-client.js +11 -0
- package/dist/cli/border-client.js.map +1 -0
- package/dist/cli/commands/__ask-cancel.d.ts +35 -0
- package/dist/cli/commands/__ask-cancel.js +91 -0
- package/dist/cli/commands/__ask-cancel.js.map +1 -0
- package/dist/cli/commands/__ask-refresh.d.ts +40 -0
- package/dist/cli/commands/__ask-refresh.js +54 -0
- package/dist/cli/commands/__ask-refresh.js.map +1 -0
- package/dist/cli/commands/__ask-run.d.ts +43 -0
- package/dist/cli/commands/__ask-run.js +126 -0
- package/dist/cli/commands/__ask-run.js.map +1 -0
- package/dist/cli/commands/__ask-send.d.ts +50 -0
- package/dist/cli/commands/__ask-send.js +138 -0
- package/dist/cli/commands/__ask-send.js.map +1 -0
- package/dist/cli/commands/__preview-card.d.ts +31 -0
- package/dist/cli/commands/__preview-card.js +72 -0
- package/dist/cli/commands/__preview-card.js.map +1 -0
- package/dist/cli/commands/ask.d.ts +50 -0
- package/dist/cli/commands/ask.js +240 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/auto.d.ts +12 -0
- package/dist/cli/commands/auto.js +28 -0
- package/dist/cli/commands/auto.js.map +1 -0
- package/dist/cli/commands/cockpit.d.ts +14 -0
- package/dist/cli/commands/cockpit.js +52 -0
- package/dist/cli/commands/cockpit.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +75 -0
- package/dist/cli/commands/daemon.js +258 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.js +159 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/grep.d.ts +2 -0
- package/dist/cli/commands/grep.js +52 -0
- package/dist/cli/commands/grep.js.map +1 -0
- package/dist/cli/commands/index-cmd.d.ts +2 -0
- package/dist/cli/commands/index-cmd.js +29 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/ls.d.ts +30 -0
- package/dist/cli/commands/ls.js +95 -0
- package/dist/cli/commands/ls.js.map +1 -0
- package/dist/cli/commands/overlay.d.ts +26 -0
- package/dist/cli/commands/overlay.js +216 -0
- package/dist/cli/commands/overlay.js.map +1 -0
- package/dist/cli/commands/pick.d.ts +59 -0
- package/dist/cli/commands/pick.js +254 -0
- package/dist/cli/commands/pick.js.map +1 -0
- package/dist/cli/commands/picker-rows.d.ts +17 -0
- package/dist/cli/commands/picker-rows.js +47 -0
- package/dist/cli/commands/picker-rows.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +25 -0
- package/dist/cli/commands/resume.js +88 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +13 -0
- package/dist/cli/commands/run.js +78 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +37 -0
- package/dist/cli/commands/setup.js +200 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/show.d.ts +2 -0
- package/dist/cli/commands/show.js +24 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/summarize.d.ts +2 -0
- package/dist/cli/commands/summarize.js +59 -0
- package/dist/cli/commands/summarize.js.map +1 -0
- package/dist/cli/commands/tmux.d.ts +11 -0
- package/dist/cli/commands/tmux.js +90 -0
- package/dist/cli/commands/tmux.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +2 -0
- package/dist/cli/commands/watch.js +76 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/format.d.ts +74 -0
- package/dist/cli/format.js +242 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/gmux-render.d.ts +11 -0
- package/dist/cli/gmux-render.js +60 -0
- package/dist/cli/gmux-render.js.map +1 -0
- package/dist/cli/main.d.ts +8 -0
- package/dist/cli/main.js +145 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/overlay-ask.d.ts +13 -0
- package/dist/cli/overlay-ask.js +32 -0
- package/dist/cli/overlay-ask.js.map +1 -0
- package/dist/cli/overlay.d.ts +26 -0
- package/dist/cli/overlay.js +149 -0
- package/dist/cli/overlay.js.map +1 -0
- package/dist/cli/picker.d.ts +308 -0
- package/dist/cli/picker.js +642 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/preview.d.ts +87 -0
- package/dist/cli/preview.js +292 -0
- package/dist/cli/preview.js.map +1 -0
- package/dist/cli/tmux-label.d.ts +50 -0
- package/dist/cli/tmux-label.js +146 -0
- package/dist/cli/tmux-label.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.js +91 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fingerprint.d.ts +21 -0
- package/dist/core/fingerprint.js +59 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/gmux-types.d.ts +102 -0
- package/dist/core/gmux-types.js +13 -0
- package/dist/core/gmux-types.js.map +1 -0
- package/dist/core/pane-state.d.ts +5 -0
- package/dist/core/pane-state.js +15 -0
- package/dist/core/pane-state.js.map +1 -0
- package/dist/core/paths.d.ts +68 -0
- package/dist/core/paths.js +106 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/proc-tree.d.ts +9 -0
- package/dist/core/proc-tree.js +33 -0
- package/dist/core/proc-tree.js.map +1 -0
- package/dist/core/text.d.ts +34 -0
- package/dist/core/text.js +126 -0
- package/dist/core/text.js.map +1 -0
- package/dist/core/types.d.ts +322 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/services/ask-transcript.d.ts +256 -0
- package/dist/services/ask-transcript.js +544 -0
- package/dist/services/ask-transcript.js.map +1 -0
- package/dist/services/ask.d.ts +54 -0
- package/dist/services/ask.js +161 -0
- package/dist/services/ask.js.map +1 -0
- package/dist/services/auto-summarize.d.ts +188 -0
- package/dist/services/auto-summarize.js +415 -0
- package/dist/services/auto-summarize.js.map +1 -0
- package/dist/services/concurrency.d.ts +2 -0
- package/dist/services/concurrency.js +16 -0
- package/dist/services/concurrency.js.map +1 -0
- package/dist/services/config.d.ts +131 -0
- package/dist/services/config.js +325 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/daemon-client.d.ts +9 -0
- package/dist/services/daemon-client.js +34 -0
- package/dist/services/daemon-client.js.map +1 -0
- package/dist/services/daemon-socket.d.ts +30 -0
- package/dist/services/daemon-socket.js +76 -0
- package/dist/services/daemon-socket.js.map +1 -0
- package/dist/services/daemon.d.ts +43 -0
- package/dist/services/daemon.js +106 -0
- package/dist/services/daemon.js.map +1 -0
- package/dist/services/distill.d.ts +39 -0
- package/dist/services/distill.js +93 -0
- package/dist/services/distill.js.map +1 -0
- package/dist/services/guardian.d.ts +26 -0
- package/dist/services/guardian.js +71 -0
- package/dist/services/guardian.js.map +1 -0
- package/dist/services/index-store.d.ts +36 -0
- package/dist/services/index-store.js +125 -0
- package/dist/services/index-store.js.map +1 -0
- package/dist/services/log-rotation.d.ts +3 -0
- package/dist/services/log-rotation.js +28 -0
- package/dist/services/log-rotation.js.map +1 -0
- package/dist/services/pane-links.d.ts +10 -0
- package/dist/services/pane-links.js +47 -0
- package/dist/services/pane-links.js.map +1 -0
- package/dist/services/pane-process.d.ts +95 -0
- package/dist/services/pane-process.js +183 -0
- package/dist/services/pane-process.js.map +1 -0
- package/dist/services/pane-registry.d.ts +24 -0
- package/dist/services/pane-registry.js +40 -0
- package/dist/services/pane-registry.js.map +1 -0
- package/dist/services/provider-process.d.ts +37 -0
- package/dist/services/provider-process.js +105 -0
- package/dist/services/provider-process.js.map +1 -0
- package/dist/services/providers.d.ts +76 -0
- package/dist/services/providers.js +104 -0
- package/dist/services/providers.js.map +1 -0
- package/dist/services/resolve.d.ts +3 -0
- package/dist/services/resolve.js +18 -0
- package/dist/services/resolve.js.map +1 -0
- package/dist/services/resources.d.ts +17 -0
- package/dist/services/resources.js +113 -0
- package/dist/services/resources.js.map +1 -0
- package/dist/services/search.d.ts +29 -0
- package/dist/services/search.js +135 -0
- package/dist/services/search.js.map +1 -0
- package/dist/services/semantic-gate.d.ts +13 -0
- package/dist/services/semantic-gate.js +23 -0
- package/dist/services/semantic-gate.js.map +1 -0
- package/dist/services/semantic.d.ts +113 -0
- package/dist/services/semantic.js +216 -0
- package/dist/services/semantic.js.map +1 -0
- package/dist/services/sensors.d.ts +92 -0
- package/dist/services/sensors.js +246 -0
- package/dist/services/sensors.js.map +1 -0
- package/dist/services/summarize.d.ts +84 -0
- package/dist/services/summarize.js +230 -0
- package/dist/services/summarize.js.map +1 -0
- package/dist/services/tmux-gateway.d.ts +17 -0
- package/dist/services/tmux-gateway.js +10 -0
- package/dist/services/tmux-gateway.js.map +1 -0
- package/dist/services/tmux-resolve.d.ts +54 -0
- package/dist/services/tmux-resolve.js +0 -0
- package/dist/services/tmux-resolve.js.map +1 -0
- package/dist/services/tmux.d.ts +32 -0
- package/dist/services/tmux.js +107 -0
- package/dist/services/tmux.js.map +1 -0
- package/dist/services/views.d.ts +7 -0
- package/dist/services/views.js +18 -0
- package/dist/services/views.js.map +1 -0
- package/dist/services/watch.d.ts +36 -0
- package/dist/services/watch.js +98 -0
- package/dist/services/watch.js.map +1 -0
- package/dist/services/workspace.d.ts +19 -0
- package/dist/services/workspace.js +88 -0
- package/dist/services/workspace.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code adapter.
|
|
3
|
+
*
|
|
4
|
+
* Layout: ~/.claude/projects/<slugified-cwd>/<session-uuid>.jsonl
|
|
5
|
+
* Each line is a tagged record; the ones we care about are `user`, `assistant`,
|
|
6
|
+
* `ai-title`, `last-prompt` and `pr-link`.
|
|
7
|
+
*
|
|
8
|
+
* Note on `ai-title`: Claude Code writes it early and never revises it, so it
|
|
9
|
+
* describes where a session STARTED. We keep it as `title` for reference, but
|
|
10
|
+
* the summary layer is what tells you where the work LANDED.
|
|
11
|
+
*/
|
|
12
|
+
import { readdir, stat } from "node:fs/promises";
|
|
13
|
+
import { basename, join, sep } from "node:path";
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import { harnessHome } from "../core/paths.js";
|
|
16
|
+
import { truncate } from "../core/text.js";
|
|
17
|
+
import { readJsonl, DecimatingSampler, RingBuffer } from "./jsonl.js";
|
|
18
|
+
/** How many recent human turns to keep for the summarizer. */
|
|
19
|
+
const RECENT_PROMPT_COUNT = 12;
|
|
20
|
+
/** Waypoints sampled across the whole session. See DecimatingSampler. */
|
|
21
|
+
const ARC_PROMPT_COUNT = 8;
|
|
22
|
+
/** A failure or interruption this close to the end means the work was cut short. */
|
|
23
|
+
const END_WINDOW = 10;
|
|
24
|
+
const EDIT_TOOLS = new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
|
|
25
|
+
export class ClaudeCodeAdapter {
|
|
26
|
+
id = "claude-code";
|
|
27
|
+
displayName = "Claude Code";
|
|
28
|
+
processNames = ["claude"];
|
|
29
|
+
launchCommand = "claude";
|
|
30
|
+
root() {
|
|
31
|
+
return join(harnessHome(), ".claude", "projects");
|
|
32
|
+
}
|
|
33
|
+
async isAvailable() {
|
|
34
|
+
return existsSync(this.root());
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Discovery walks the whole tree, not just the top level.
|
|
38
|
+
*
|
|
39
|
+
* A project directory holds its top-level sessions as `<uuid>.jsonl`, but
|
|
40
|
+
* subagent transcripts live deeper, under `<uuid>/subagents/agent-*.jsonl`,
|
|
41
|
+
* and can nest again inside each other. Those are the sidechains: on this
|
|
42
|
+
* author's machine they outnumber real sessions roughly nine to one, which is
|
|
43
|
+
* exactly why they are hidden by default — and why they must still be found,
|
|
44
|
+
* so `--include-sidechains` and `gmux grep` can reach them.
|
|
45
|
+
*/
|
|
46
|
+
async listSessions() {
|
|
47
|
+
const root = this.root();
|
|
48
|
+
if (!existsSync(root))
|
|
49
|
+
return [];
|
|
50
|
+
return this.walk(root);
|
|
51
|
+
}
|
|
52
|
+
async walk(dir) {
|
|
53
|
+
const refs = [];
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return refs;
|
|
60
|
+
}
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const path = join(dir, entry.name);
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
refs.push(...(await this.walk(path)));
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!entry.name.endsWith(".jsonl"))
|
|
68
|
+
continue;
|
|
69
|
+
try {
|
|
70
|
+
const stats = await stat(path);
|
|
71
|
+
if (!stats.isFile() || stats.size === 0)
|
|
72
|
+
continue;
|
|
73
|
+
refs.push({
|
|
74
|
+
harness: this.id,
|
|
75
|
+
sessionId: entry.name.replace(/\.jsonl$/, ""),
|
|
76
|
+
filePath: path,
|
|
77
|
+
mtimeMs: stats.mtimeMs,
|
|
78
|
+
size: stats.size,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
continue; // Vanished mid-scan; a live harness rewrites these constantly.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return refs;
|
|
86
|
+
}
|
|
87
|
+
async parseSession(ref) {
|
|
88
|
+
const prompts = new RingBuffer(RECENT_PROMPT_COUNT);
|
|
89
|
+
const arc = new DecimatingSampler(ARC_PROMPT_COUNT);
|
|
90
|
+
const filesTouched = new Set();
|
|
91
|
+
const prLinks = [];
|
|
92
|
+
let cwd = null;
|
|
93
|
+
let gitBranch = null;
|
|
94
|
+
let title = null;
|
|
95
|
+
let lastPrompt = null;
|
|
96
|
+
let startedAt = null;
|
|
97
|
+
let updatedAt = null;
|
|
98
|
+
let lastAssistantText = null;
|
|
99
|
+
let lastToolFailure = null;
|
|
100
|
+
// A transcript under `subagents/` is a sidechain even if no line says so.
|
|
101
|
+
let isSidechain = ref.filePath.includes(`${sep}subagents${sep}`);
|
|
102
|
+
let isAutomated = false;
|
|
103
|
+
let messageCount = 0;
|
|
104
|
+
let userPromptCount = 0;
|
|
105
|
+
let interruptedAt = -1;
|
|
106
|
+
let failureAt = -1;
|
|
107
|
+
for await (const entry of readJsonl(ref.filePath)) {
|
|
108
|
+
const type = str(entry["type"]);
|
|
109
|
+
// Session-level metadata lines.
|
|
110
|
+
if (type === "ai-title") {
|
|
111
|
+
title = str(entry["aiTitle"]) ?? title;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (type === "last-prompt") {
|
|
115
|
+
lastPrompt = str(entry["lastPrompt"]) ?? lastPrompt;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (type === "pr-link") {
|
|
119
|
+
// Claude Code re-emits this line on every turn, so the same PR appears
|
|
120
|
+
// hundreds of times in a long session. Keep one entry per PR.
|
|
121
|
+
const number = num(entry["prNumber"]);
|
|
122
|
+
const url = str(entry["prUrl"]);
|
|
123
|
+
if (number !== null && url && !prLinks.some((pr) => pr.url === url)) {
|
|
124
|
+
prLinks.push({ number, url, repository: str(entry["prRepository"]) ?? undefined });
|
|
125
|
+
}
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (type !== "user" && type !== "assistant")
|
|
129
|
+
continue;
|
|
130
|
+
messageCount += 1;
|
|
131
|
+
const timestamp = str(entry["timestamp"]);
|
|
132
|
+
if (timestamp) {
|
|
133
|
+
startedAt ??= timestamp;
|
|
134
|
+
updatedAt = timestamp;
|
|
135
|
+
}
|
|
136
|
+
cwd ??= str(entry["cwd"]);
|
|
137
|
+
gitBranch ??= str(entry["gitBranch"]);
|
|
138
|
+
if (entry["isSidechain"] === true)
|
|
139
|
+
isSidechain = true;
|
|
140
|
+
// `sdk-cli` / `sdk` mark a headless `claude -p` run rather than a
|
|
141
|
+
// conversation someone actually had.
|
|
142
|
+
if (str(entry["entrypoint"])?.startsWith("sdk") || str(entry["promptSource"]) === "sdk") {
|
|
143
|
+
isAutomated = true;
|
|
144
|
+
}
|
|
145
|
+
if (entry["interruptedMessageId"] != null)
|
|
146
|
+
interruptedAt = messageCount;
|
|
147
|
+
const message = obj(entry["message"]);
|
|
148
|
+
const content = message?.["content"];
|
|
149
|
+
if (type === "user") {
|
|
150
|
+
// A `user` line is either a real human turn or a tool result being fed
|
|
151
|
+
// back to the model. Only the former is a prompt.
|
|
152
|
+
if (entry["isMeta"] === true)
|
|
153
|
+
continue;
|
|
154
|
+
const text = humanText(content);
|
|
155
|
+
if (text) {
|
|
156
|
+
userPromptCount += 1;
|
|
157
|
+
prompts.push(text);
|
|
158
|
+
arc.push(text);
|
|
159
|
+
}
|
|
160
|
+
if (hasToolError(content)) {
|
|
161
|
+
failureAt = messageCount;
|
|
162
|
+
lastToolFailure = truncate(toolErrorText(content) ?? "tool call failed", 300);
|
|
163
|
+
}
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// Assistant turn.
|
|
167
|
+
const text = assistantText(content);
|
|
168
|
+
if (text)
|
|
169
|
+
lastAssistantText = text;
|
|
170
|
+
for (const file of editedFiles(content))
|
|
171
|
+
filesTouched.add(file);
|
|
172
|
+
}
|
|
173
|
+
const endedMidTask = (interruptedAt > 0 && messageCount - interruptedAt <= END_WINDOW) ||
|
|
174
|
+
(failureAt > 0 && messageCount - failureAt <= END_WINDOW);
|
|
175
|
+
const recentUserPrompts = prompts.toArray();
|
|
176
|
+
const arcPrompts = arc.toArray();
|
|
177
|
+
return {
|
|
178
|
+
harness: this.id,
|
|
179
|
+
sessionId: ref.sessionId,
|
|
180
|
+
filePath: ref.filePath,
|
|
181
|
+
cwd,
|
|
182
|
+
project: projectName(cwd),
|
|
183
|
+
// "HEAD" means detached or unknown; it tells the reader nothing.
|
|
184
|
+
gitBranch: gitBranch === "HEAD" ? null : gitBranch,
|
|
185
|
+
startedAt,
|
|
186
|
+
updatedAt: updatedAt ?? new Date(ref.mtimeMs).toISOString(),
|
|
187
|
+
messageCount,
|
|
188
|
+
userPromptCount,
|
|
189
|
+
title,
|
|
190
|
+
lastUserPrompt: lastPrompt ?? recentUserPrompts[recentUserPrompts.length - 1] ?? null,
|
|
191
|
+
recentUserPrompts,
|
|
192
|
+
arcPrompts,
|
|
193
|
+
filesTouched: [...filesTouched],
|
|
194
|
+
prLinks,
|
|
195
|
+
lastAssistantText: lastAssistantText ? truncate(lastAssistantText, 1500) : null,
|
|
196
|
+
lastToolFailure,
|
|
197
|
+
endedMidTask,
|
|
198
|
+
isSidechain,
|
|
199
|
+
isAutomated,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
resumeCommand(record) {
|
|
203
|
+
return {
|
|
204
|
+
command: "claude",
|
|
205
|
+
args: ["--resume", record.sessionId],
|
|
206
|
+
cwd: record.cwd ?? process.cwd(),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Display name for a session's project.
|
|
212
|
+
*
|
|
213
|
+
* Worktrees live at `<repo>/.claude/worktrees/<branch>`, which would otherwise
|
|
214
|
+
* show up as a project named after the branch. Attribute those to the repo.
|
|
215
|
+
*/
|
|
216
|
+
export function projectName(cwd) {
|
|
217
|
+
if (!cwd)
|
|
218
|
+
return null;
|
|
219
|
+
const marker = `${sep}.claude${sep}worktrees${sep}`;
|
|
220
|
+
const at = cwd.indexOf(marker);
|
|
221
|
+
const path = at === -1 ? cwd : cwd.slice(0, at);
|
|
222
|
+
const name = basename(path);
|
|
223
|
+
return name === "" ? null : name;
|
|
224
|
+
}
|
|
225
|
+
function str(value) {
|
|
226
|
+
return typeof value === "string" && value !== "" ? value : null;
|
|
227
|
+
}
|
|
228
|
+
function num(value) {
|
|
229
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
230
|
+
}
|
|
231
|
+
function obj(value) {
|
|
232
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
233
|
+
? value
|
|
234
|
+
: null;
|
|
235
|
+
}
|
|
236
|
+
function blocks(content) {
|
|
237
|
+
return Array.isArray(content) ? content.filter((b) => !!obj(b)) : [];
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Text the human actually typed.
|
|
241
|
+
*
|
|
242
|
+
* Filters out the machinery Claude Code injects into `user` lines: tool results,
|
|
243
|
+
* slash-command envelopes, and `<system-reminder>` blocks. Those are not prompts,
|
|
244
|
+
* and letting them through would poison the summaries.
|
|
245
|
+
*/
|
|
246
|
+
export function humanText(content) {
|
|
247
|
+
let raw = null;
|
|
248
|
+
if (typeof content === "string") {
|
|
249
|
+
raw = content;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
const texts = blocks(content)
|
|
253
|
+
.filter((b) => b["type"] === "text")
|
|
254
|
+
.map((b) => str(b["text"]))
|
|
255
|
+
.filter((t) => t !== null);
|
|
256
|
+
if (texts.length > 0)
|
|
257
|
+
raw = texts.join("\n");
|
|
258
|
+
}
|
|
259
|
+
if (raw === null)
|
|
260
|
+
return null;
|
|
261
|
+
const cleaned = raw
|
|
262
|
+
.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, "")
|
|
263
|
+
.replace(/<command-(name|message|args)>[\s\S]*?<\/command-\1>/g, "")
|
|
264
|
+
.replace(/<local-command-[\s\S]*?<\/local-command-[a-z-]+>/g, "")
|
|
265
|
+
.trim();
|
|
266
|
+
if (cleaned === "")
|
|
267
|
+
return null;
|
|
268
|
+
if (cleaned.startsWith("Caveat: The messages below"))
|
|
269
|
+
return null;
|
|
270
|
+
return truncate(cleaned, 600);
|
|
271
|
+
}
|
|
272
|
+
function assistantText(content) {
|
|
273
|
+
if (typeof content === "string")
|
|
274
|
+
return content.trim() || null;
|
|
275
|
+
const texts = blocks(content)
|
|
276
|
+
.filter((b) => b["type"] === "text")
|
|
277
|
+
.map((b) => str(b["text"]))
|
|
278
|
+
.filter((t) => t !== null);
|
|
279
|
+
return texts.length > 0 ? texts.join("\n").trim() || null : null;
|
|
280
|
+
}
|
|
281
|
+
/** Files the assistant edited, read off its `tool_use` blocks. */
|
|
282
|
+
export function editedFiles(content) {
|
|
283
|
+
const files = [];
|
|
284
|
+
for (const block of blocks(content)) {
|
|
285
|
+
if (block["type"] !== "tool_use")
|
|
286
|
+
continue;
|
|
287
|
+
const name = str(block["name"]);
|
|
288
|
+
if (!name || !EDIT_TOOLS.has(name))
|
|
289
|
+
continue;
|
|
290
|
+
const input = obj(block["input"]);
|
|
291
|
+
const file = input ? str(input["file_path"]) : null;
|
|
292
|
+
if (file)
|
|
293
|
+
files.push(file);
|
|
294
|
+
}
|
|
295
|
+
return files;
|
|
296
|
+
}
|
|
297
|
+
function hasToolError(content) {
|
|
298
|
+
return blocks(content).some((b) => b["type"] === "tool_result" && b["is_error"] === true);
|
|
299
|
+
}
|
|
300
|
+
function toolErrorText(content) {
|
|
301
|
+
for (const block of blocks(content)) {
|
|
302
|
+
if (block["type"] !== "tool_result" || block["is_error"] !== true)
|
|
303
|
+
continue;
|
|
304
|
+
const inner = block["content"];
|
|
305
|
+
if (typeof inner === "string")
|
|
306
|
+
return inner;
|
|
307
|
+
const text = blocks(inner)
|
|
308
|
+
.map((b) => str(b["text"]))
|
|
309
|
+
.find((t) => t !== null);
|
|
310
|
+
if (text)
|
|
311
|
+
return text;
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex adapter.
|
|
3
|
+
*
|
|
4
|
+
* Layout: ~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<uuid>.jsonl
|
|
5
|
+
* Lines are tagged `session_meta`, `event_msg`, `response_item` or `turn_context`.
|
|
6
|
+
*
|
|
7
|
+
* We read human turns and agent replies from `event_msg` rather than
|
|
8
|
+
* `response_item/message`, because the latter also carries `developer`-role
|
|
9
|
+
* system injections that are not conversation.
|
|
10
|
+
*
|
|
11
|
+
* Codex gives us a signal Claude Code does not: a `task_started` with no matching
|
|
12
|
+
* `task_complete` means the session was genuinely cut off mid-task.
|
|
13
|
+
*/
|
|
14
|
+
import type { SessionRecord, SessionRef } from "../core/types.js";
|
|
15
|
+
import type { HarnessAdapter, ResumeCommand } from "./types.js";
|
|
16
|
+
export declare class CodexAdapter implements HarnessAdapter {
|
|
17
|
+
readonly id = "codex";
|
|
18
|
+
readonly displayName = "Codex";
|
|
19
|
+
readonly processNames: readonly ["codex"];
|
|
20
|
+
readonly launchCommand = "codex";
|
|
21
|
+
private root;
|
|
22
|
+
isAvailable(): Promise<boolean>;
|
|
23
|
+
listSessions(): Promise<SessionRef[]>;
|
|
24
|
+
/** Sessions nest under year/month/day, so discovery is a bounded recursive walk. */
|
|
25
|
+
private walk;
|
|
26
|
+
parseSession(ref: SessionRef): Promise<SessionRecord>;
|
|
27
|
+
resumeCommand(record: SessionRecord): ResumeCommand;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pull file paths out of an apply_patch payload, wherever it is embedded.
|
|
31
|
+
*
|
|
32
|
+
* The payload usually arrives inside a JSON-encoded argument string, so the
|
|
33
|
+
* patch's own newlines show up as the two characters `\` `n` rather than as a
|
|
34
|
+
* line break. A path therefore ends at the first backslash or quote, not at the
|
|
35
|
+
* end of the line.
|
|
36
|
+
*/
|
|
37
|
+
export declare function patchedFiles(args: string): string[];
|
|
38
|
+
/** Codex reports shell failures in prose; a nonzero exit is the signal. */
|
|
39
|
+
export declare function exitFailure(output: string | null): string | null;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex adapter.
|
|
3
|
+
*
|
|
4
|
+
* Layout: ~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<uuid>.jsonl
|
|
5
|
+
* Lines are tagged `session_meta`, `event_msg`, `response_item` or `turn_context`.
|
|
6
|
+
*
|
|
7
|
+
* We read human turns and agent replies from `event_msg` rather than
|
|
8
|
+
* `response_item/message`, because the latter also carries `developer`-role
|
|
9
|
+
* system injections that are not conversation.
|
|
10
|
+
*
|
|
11
|
+
* Codex gives us a signal Claude Code does not: a `task_started` with no matching
|
|
12
|
+
* `task_complete` means the session was genuinely cut off mid-task.
|
|
13
|
+
*/
|
|
14
|
+
import { readdir, stat } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { existsSync } from "node:fs";
|
|
17
|
+
import { harnessHome } from "../core/paths.js";
|
|
18
|
+
import { truncate } from "../core/text.js";
|
|
19
|
+
import { readJsonl, DecimatingSampler, RingBuffer } from "./jsonl.js";
|
|
20
|
+
import { projectName } from "./claude-code.js";
|
|
21
|
+
const RECENT_PROMPT_COUNT = 12;
|
|
22
|
+
/** Waypoints sampled across the whole session. See DecimatingSampler. */
|
|
23
|
+
const ARC_PROMPT_COUNT = 8;
|
|
24
|
+
/** `rollout-2026-06-05T18-06-20-<uuid>.jsonl` → the uuid. */
|
|
25
|
+
const ROLLOUT_FILE = /^rollout-.*?-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
|
|
26
|
+
/** Markers inside an apply_patch payload naming the files it changes. */
|
|
27
|
+
const PATCH_TARGET = /\*\*\* (?:Update|Add|Delete) File: (.+)/g;
|
|
28
|
+
export class CodexAdapter {
|
|
29
|
+
id = "codex";
|
|
30
|
+
displayName = "Codex";
|
|
31
|
+
processNames = ["codex"];
|
|
32
|
+
launchCommand = "codex";
|
|
33
|
+
root() {
|
|
34
|
+
return join(harnessHome(), ".codex", "sessions");
|
|
35
|
+
}
|
|
36
|
+
async isAvailable() {
|
|
37
|
+
return existsSync(this.root());
|
|
38
|
+
}
|
|
39
|
+
async listSessions() {
|
|
40
|
+
const root = this.root();
|
|
41
|
+
if (!existsSync(root))
|
|
42
|
+
return [];
|
|
43
|
+
return this.walk(root);
|
|
44
|
+
}
|
|
45
|
+
/** Sessions nest under year/month/day, so discovery is a bounded recursive walk. */
|
|
46
|
+
async walk(dir) {
|
|
47
|
+
const refs = [];
|
|
48
|
+
let entries;
|
|
49
|
+
try {
|
|
50
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return refs;
|
|
54
|
+
}
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
const path = join(dir, entry.name);
|
|
57
|
+
if (entry.isDirectory()) {
|
|
58
|
+
refs.push(...(await this.walk(path)));
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const match = ROLLOUT_FILE.exec(entry.name);
|
|
62
|
+
if (!match)
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
const stats = await stat(path);
|
|
66
|
+
if (!stats.isFile() || stats.size === 0)
|
|
67
|
+
continue;
|
|
68
|
+
refs.push({
|
|
69
|
+
harness: this.id,
|
|
70
|
+
sessionId: match[1],
|
|
71
|
+
filePath: path,
|
|
72
|
+
mtimeMs: stats.mtimeMs,
|
|
73
|
+
size: stats.size,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return refs;
|
|
81
|
+
}
|
|
82
|
+
async parseSession(ref) {
|
|
83
|
+
const prompts = new RingBuffer(RECENT_PROMPT_COUNT);
|
|
84
|
+
const arc = new DecimatingSampler(ARC_PROMPT_COUNT);
|
|
85
|
+
const filesTouched = new Set();
|
|
86
|
+
let cwd = null;
|
|
87
|
+
let startedAt = null;
|
|
88
|
+
let updatedAt = null;
|
|
89
|
+
let lastAssistantText = null;
|
|
90
|
+
let lastToolFailure = null;
|
|
91
|
+
let messageCount = 0;
|
|
92
|
+
let userPromptCount = 0;
|
|
93
|
+
let tasksStarted = 0;
|
|
94
|
+
let tasksCompleted = 0;
|
|
95
|
+
let isAutomated = false;
|
|
96
|
+
for await (const entry of readJsonl(ref.filePath)) {
|
|
97
|
+
const type = str(entry["type"]);
|
|
98
|
+
const payload = obj(entry["payload"]);
|
|
99
|
+
const timestamp = str(entry["timestamp"]);
|
|
100
|
+
if (timestamp) {
|
|
101
|
+
startedAt ??= timestamp;
|
|
102
|
+
updatedAt = timestamp;
|
|
103
|
+
}
|
|
104
|
+
if (!payload)
|
|
105
|
+
continue;
|
|
106
|
+
if (type === "session_meta") {
|
|
107
|
+
cwd ??= str(payload["cwd"]);
|
|
108
|
+
// `codex exec` is the non-interactive entrypoint — automation, not a
|
|
109
|
+
// conversation someone sat through.
|
|
110
|
+
if (str(payload["originator"]) === "codex_exec" || str(payload["source"]) === "exec") {
|
|
111
|
+
isAutomated = true;
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (type === "turn_context") {
|
|
116
|
+
cwd ??= str(payload["cwd"]);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (type === "event_msg") {
|
|
120
|
+
const kind = str(payload["type"]);
|
|
121
|
+
if (kind === "user_message") {
|
|
122
|
+
const text = str(payload["message"]);
|
|
123
|
+
if (text) {
|
|
124
|
+
messageCount += 1;
|
|
125
|
+
userPromptCount += 1;
|
|
126
|
+
const prompt = truncate(text, 600);
|
|
127
|
+
prompts.push(prompt);
|
|
128
|
+
arc.push(prompt);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (kind === "agent_message") {
|
|
132
|
+
const text = str(payload["message"]);
|
|
133
|
+
if (text) {
|
|
134
|
+
messageCount += 1;
|
|
135
|
+
lastAssistantText = text;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (kind === "task_started") {
|
|
139
|
+
tasksStarted += 1;
|
|
140
|
+
}
|
|
141
|
+
else if (kind === "task_complete") {
|
|
142
|
+
tasksCompleted += 1;
|
|
143
|
+
lastAssistantText = str(payload["last_agent_message"]) ?? lastAssistantText;
|
|
144
|
+
}
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (type === "response_item") {
|
|
148
|
+
const kind = str(payload["type"]);
|
|
149
|
+
if (kind === "function_call") {
|
|
150
|
+
const args = str(payload["arguments"]);
|
|
151
|
+
if (args)
|
|
152
|
+
for (const file of patchedFiles(args))
|
|
153
|
+
filesTouched.add(file);
|
|
154
|
+
}
|
|
155
|
+
else if (kind === "function_call_output") {
|
|
156
|
+
const output = str(payload["output"]);
|
|
157
|
+
const failure = exitFailure(output);
|
|
158
|
+
if (failure)
|
|
159
|
+
lastToolFailure = truncate(failure, 300);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const recentUserPrompts = prompts.toArray();
|
|
164
|
+
const arcPrompts = arc.toArray();
|
|
165
|
+
// A turn was started and never completed: the session was interrupted.
|
|
166
|
+
const endedMidTask = tasksStarted > tasksCompleted;
|
|
167
|
+
return {
|
|
168
|
+
harness: this.id,
|
|
169
|
+
sessionId: ref.sessionId,
|
|
170
|
+
filePath: ref.filePath,
|
|
171
|
+
cwd,
|
|
172
|
+
project: projectName(cwd),
|
|
173
|
+
gitBranch: null, // Codex does not record the branch in its rollout files.
|
|
174
|
+
startedAt,
|
|
175
|
+
updatedAt: updatedAt ?? new Date(ref.mtimeMs).toISOString(),
|
|
176
|
+
messageCount,
|
|
177
|
+
userPromptCount,
|
|
178
|
+
title: null, // Codex writes no title; the summary layer supplies one.
|
|
179
|
+
lastUserPrompt: recentUserPrompts[recentUserPrompts.length - 1] ?? null,
|
|
180
|
+
recentUserPrompts,
|
|
181
|
+
arcPrompts,
|
|
182
|
+
filesTouched: [...filesTouched],
|
|
183
|
+
prLinks: [],
|
|
184
|
+
lastAssistantText: lastAssistantText ? truncate(lastAssistantText, 1500) : null,
|
|
185
|
+
lastToolFailure,
|
|
186
|
+
endedMidTask,
|
|
187
|
+
isSidechain: false,
|
|
188
|
+
isAutomated,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
resumeCommand(record) {
|
|
192
|
+
return {
|
|
193
|
+
command: "codex",
|
|
194
|
+
args: ["resume", record.sessionId],
|
|
195
|
+
cwd: record.cwd ?? process.cwd(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Pull file paths out of an apply_patch payload, wherever it is embedded.
|
|
201
|
+
*
|
|
202
|
+
* The payload usually arrives inside a JSON-encoded argument string, so the
|
|
203
|
+
* patch's own newlines show up as the two characters `\` `n` rather than as a
|
|
204
|
+
* line break. A path therefore ends at the first backslash or quote, not at the
|
|
205
|
+
* end of the line.
|
|
206
|
+
*/
|
|
207
|
+
export function patchedFiles(args) {
|
|
208
|
+
const files = [];
|
|
209
|
+
for (const match of args.matchAll(PATCH_TARGET)) {
|
|
210
|
+
const file = match[1]?.split(/[\\"']/)[0]?.trim();
|
|
211
|
+
if (file)
|
|
212
|
+
files.push(file);
|
|
213
|
+
}
|
|
214
|
+
return files;
|
|
215
|
+
}
|
|
216
|
+
/** Codex reports shell failures in prose; a nonzero exit is the signal. */
|
|
217
|
+
export function exitFailure(output) {
|
|
218
|
+
if (!output)
|
|
219
|
+
return null;
|
|
220
|
+
const match = /Process exited with code (\d+)/.exec(output);
|
|
221
|
+
if (!match || match[1] === "0")
|
|
222
|
+
return null;
|
|
223
|
+
return output.trim();
|
|
224
|
+
}
|
|
225
|
+
function str(value) {
|
|
226
|
+
return typeof value === "string" && value !== "" ? value : null;
|
|
227
|
+
}
|
|
228
|
+
function obj(value) {
|
|
229
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
230
|
+
? value
|
|
231
|
+
: null;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming JSONL reader shared by adapters.
|
|
3
|
+
*
|
|
4
|
+
* Sessions run to hundreds of megabytes in aggregate, so we stream line by line
|
|
5
|
+
* and never hold a whole file as one string. Malformed lines are skipped rather
|
|
6
|
+
* than thrown: a truncated final line is normal for a session that is still open.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readJsonl(filePath: string): AsyncGenerator<Record<string, unknown>>;
|
|
9
|
+
/** Keep only the last `n` items pushed. Used for message tails. */
|
|
10
|
+
export declare class RingBuffer<T> {
|
|
11
|
+
private readonly capacity;
|
|
12
|
+
private items;
|
|
13
|
+
constructor(capacity: number);
|
|
14
|
+
push(item: T): void;
|
|
15
|
+
toArray(): T[];
|
|
16
|
+
get last(): T | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Keep an evenly-spaced sample of an unbounded stream, in bounded memory.
|
|
20
|
+
*
|
|
21
|
+
* `RingBuffer` above answers "how did this end?". This answers "what shape was
|
|
22
|
+
* it?" — and crucially it never drops the FIRST item, which is the developer's
|
|
23
|
+
* original ask. A summarizer that never sees that writes the same thing the
|
|
24
|
+
* stale harness title already says.
|
|
25
|
+
*
|
|
26
|
+
* Every `stride`-th item is a candidate; when the buffer fills we drop every
|
|
27
|
+
* other one and double the stride. Stride is therefore always a power of two,
|
|
28
|
+
* and the retained set lands between `ceil((capacity + 1) / 2)` and `capacity`
|
|
29
|
+
* — evenly spaced, not exactly `capacity` long. A few waypoints is all the
|
|
30
|
+
* prompt needs.
|
|
31
|
+
*/
|
|
32
|
+
export declare class DecimatingSampler<T> {
|
|
33
|
+
private readonly capacity;
|
|
34
|
+
private items;
|
|
35
|
+
private stride;
|
|
36
|
+
private seen;
|
|
37
|
+
constructor(capacity: number);
|
|
38
|
+
push(item: T): void;
|
|
39
|
+
toArray(): T[];
|
|
40
|
+
}
|