@coldtea/abide 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +10 -0
- package/dist/abide-hook.d.ts +2 -0
- package/dist/abide-hook.d.ts.map +1 -0
- package/dist/abide-hook.js +23 -0
- package/dist/abide-hook.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +64 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +79 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bench.d.ts +3 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +206 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/calibrate.d.ts +3 -0
- package/dist/commands/calibrate.d.ts.map +1 -0
- package/dist/commands/calibrate.js +159 -0
- package/dist/commands/calibrate.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +106 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +116 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +58 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/replay.d.ts +4 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +118 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/report.d.ts +5 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +78 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/rubric.d.ts +3 -0
- package/dist/commands/rubric.d.ts.map +1 -0
- package/dist/commands/rubric.js +40 -0
- package/dist/commands/rubric.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +31 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/hooks/postToolUse.d.ts +3 -0
- package/dist/hooks/postToolUse.d.ts.map +1 -0
- package/dist/hooks/postToolUse.js +145 -0
- package/dist/hooks/postToolUse.js.map +1 -0
- package/dist/hooks/sessionStart.d.ts +11 -0
- package/dist/hooks/sessionStart.d.ts.map +1 -0
- package/dist/hooks/sessionStart.js +83 -0
- package/dist/hooks/sessionStart.js.map +1 -0
- package/dist/hooks/stop.d.ts +26 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +227 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/turnStart.d.ts +8 -0
- package/dist/hooks/turnStart.d.ts.map +1 -0
- package/dist/hooks/turnStart.js +40 -0
- package/dist/hooks/turnStart.js.map +1 -0
- package/dist/lib/applyPatch.d.ts +22 -0
- package/dist/lib/applyPatch.d.ts.map +1 -0
- package/dist/lib/applyPatch.js +63 -0
- package/dist/lib/applyPatch.js.map +1 -0
- package/dist/lib/audit.d.ts +40 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +215 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/band.d.ts +20 -0
- package/dist/lib/band.d.ts.map +1 -0
- package/dist/lib/band.js +40 -0
- package/dist/lib/band.js.map +1 -0
- package/dist/lib/calibration.d.ts +13 -0
- package/dist/lib/calibration.d.ts.map +1 -0
- package/dist/lib/calibration.js +25 -0
- package/dist/lib/calibration.js.map +1 -0
- package/dist/lib/checkRunner.d.ts +34 -0
- package/dist/lib/checkRunner.d.ts.map +1 -0
- package/dist/lib/checkRunner.js +76 -0
- package/dist/lib/checkRunner.js.map +1 -0
- package/dist/lib/claude.d.ts +4 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +28 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/compilePrompt.d.ts +22 -0
- package/dist/lib/compilePrompt.d.ts.map +1 -0
- package/dist/lib/compilePrompt.js +33 -0
- package/dist/lib/compilePrompt.js.map +1 -0
- package/dist/lib/constants.d.ts +33 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +33 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/coverage.d.ts +7 -0
- package/dist/lib/coverage.d.ts.map +1 -0
- package/dist/lib/coverage.js +17 -0
- package/dist/lib/coverage.js.map +1 -0
- package/dist/lib/credentials.d.ts +27 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +89 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/diff.d.ts +30 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +139 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/events.d.ts +5 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +38 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/lib/git.d.ts +37 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +163 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/hookRunner.d.ts +10 -0
- package/dist/lib/hookRunner.d.ts.map +1 -0
- package/dist/lib/hookRunner.js +52 -0
- package/dist/lib/hookRunner.js.map +1 -0
- package/dist/lib/hosts.d.ts +20 -0
- package/dist/lib/hosts.d.ts.map +1 -0
- package/dist/lib/hosts.js +101 -0
- package/dist/lib/hosts.js.map +1 -0
- package/dist/lib/jev.d.ts +24 -0
- package/dist/lib/jev.d.ts.map +1 -0
- package/dist/lib/jev.js +169 -0
- package/dist/lib/jev.js.map +1 -0
- package/dist/lib/lintConfig.d.ts +3 -0
- package/dist/lib/lintConfig.d.ts.map +1 -0
- package/dist/lib/lintConfig.js +55 -0
- package/dist/lib/lintConfig.js.map +1 -0
- package/dist/lib/loadRules.d.ts +12 -0
- package/dist/lib/loadRules.d.ts.map +1 -0
- package/dist/lib/loadRules.js +31 -0
- package/dist/lib/loadRules.js.map +1 -0
- package/dist/lib/opencodePlugin.d.ts +10 -0
- package/dist/lib/opencodePlugin.d.ts.map +1 -0
- package/dist/lib/opencodePlugin.js +36 -0
- package/dist/lib/opencodePlugin.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +35 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/packageRoot.d.ts +12 -0
- package/dist/lib/packageRoot.d.ts.map +1 -0
- package/dist/lib/packageRoot.js +50 -0
- package/dist/lib/packageRoot.js.map +1 -0
- package/dist/lib/paths.d.ts +24 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +75 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/reason.d.ts +11 -0
- package/dist/lib/reason.d.ts.map +1 -0
- package/dist/lib/reason.js +31 -0
- package/dist/lib/reason.js.map +1 -0
- package/dist/lib/regularFile.d.ts +26 -0
- package/dist/lib/regularFile.d.ts.map +1 -0
- package/dist/lib/regularFile.js +77 -0
- package/dist/lib/regularFile.js.map +1 -0
- package/dist/lib/replay.d.ts +74 -0
- package/dist/lib/replay.d.ts.map +1 -0
- package/dist/lib/replay.js +250 -0
- package/dist/lib/replay.js.map +1 -0
- package/dist/lib/replayCodex.d.ts +6 -0
- package/dist/lib/replayCodex.d.ts.map +1 -0
- package/dist/lib/replayCodex.js +132 -0
- package/dist/lib/replayCodex.js.map +1 -0
- package/dist/lib/replayOpencode.d.ts +15 -0
- package/dist/lib/replayOpencode.d.ts.map +1 -0
- package/dist/lib/replayOpencode.js +154 -0
- package/dist/lib/replayOpencode.js.map +1 -0
- package/dist/lib/rubricFile.d.ts +31 -0
- package/dist/lib/rubricFile.d.ts.map +1 -0
- package/dist/lib/rubricFile.js +75 -0
- package/dist/lib/rubricFile.js.map +1 -0
- package/dist/lib/scope.d.ts +4 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +14 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/session.d.ts +48 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +182 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/settings.d.ts +26 -0
- package/dist/lib/settings.d.ts.map +1 -0
- package/dist/lib/settings.js +104 -0
- package/dist/lib/settings.js.map +1 -0
- package/dist/lib/sources.d.ts +28 -0
- package/dist/lib/sources.d.ts.map +1 -0
- package/dist/lib/sources.js +137 -0
- package/dist/lib/sources.js.map +1 -0
- package/dist/lib/stdin.d.ts +3 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +24 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/transcript.d.ts +3 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +57 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/ui.d.ts +8 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +34 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/ui/components/Buckets.d.ts +6 -0
- package/dist/ui/components/Buckets.d.ts.map +1 -0
- package/dist/ui/components/Buckets.js +11 -0
- package/dist/ui/components/Buckets.js.map +1 -0
- package/dist/ui/components/Callout.d.ts +11 -0
- package/dist/ui/components/Callout.d.ts.map +1 -0
- package/dist/ui/components/Callout.js +10 -0
- package/dist/ui/components/Callout.js.map +1 -0
- package/dist/ui/components/Checklist.d.ts +10 -0
- package/dist/ui/components/Checklist.d.ts.map +1 -0
- package/dist/ui/components/Checklist.js +8 -0
- package/dist/ui/components/Checklist.js.map +1 -0
- package/dist/ui/components/Columns.d.ts +28 -0
- package/dist/ui/components/Columns.d.ts.map +1 -0
- package/dist/ui/components/Columns.js +20 -0
- package/dist/ui/components/Columns.js.map +1 -0
- package/dist/ui/components/Header.d.ts +9 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +7 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/Live.d.ts +16 -0
- package/dist/ui/components/Live.d.ts.map +1 -0
- package/dist/ui/components/Live.js +40 -0
- package/dist/ui/components/Live.js.map +1 -0
- package/dist/ui/components/RuleTable.d.ts +15 -0
- package/dist/ui/components/RuleTable.d.ts.map +1 -0
- package/dist/ui/components/RuleTable.js +81 -0
- package/dist/ui/components/RuleTable.js.map +1 -0
- package/dist/ui/components/Section.d.ts +10 -0
- package/dist/ui/components/Section.d.ts.map +1 -0
- package/dist/ui/components/Section.js +8 -0
- package/dist/ui/components/Section.js.map +1 -0
- package/dist/ui/components/Verdicts.d.ts +9 -0
- package/dist/ui/components/Verdicts.d.ts.map +1 -0
- package/dist/ui/components/Verdicts.js +12 -0
- package/dist/ui/components/Verdicts.js.map +1 -0
- package/dist/ui/render.d.ts +20 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +32 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/theme.d.ts +37 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +63 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/views/AuditView.d.ts +18 -0
- package/dist/ui/views/AuditView.d.ts.map +1 -0
- package/dist/ui/views/AuditView.js +48 -0
- package/dist/ui/views/AuditView.js.map +1 -0
- package/dist/ui/views/BenchView.d.ts +33 -0
- package/dist/ui/views/BenchView.d.ts.map +1 -0
- package/dist/ui/views/BenchView.js +19 -0
- package/dist/ui/views/BenchView.js.map +1 -0
- package/dist/ui/views/CalibrateView.d.ts +26 -0
- package/dist/ui/views/CalibrateView.d.ts.map +1 -0
- package/dist/ui/views/CalibrateView.js +42 -0
- package/dist/ui/views/CalibrateView.js.map +1 -0
- package/dist/ui/views/CheckView.d.ts +19 -0
- package/dist/ui/views/CheckView.d.ts.map +1 -0
- package/dist/ui/views/CheckView.js +15 -0
- package/dist/ui/views/CheckView.js.map +1 -0
- package/dist/ui/views/ErrorView.d.ts +4 -0
- package/dist/ui/views/ErrorView.d.ts.map +1 -0
- package/dist/ui/views/ErrorView.js +26 -0
- package/dist/ui/views/ErrorView.js.map +1 -0
- package/dist/ui/views/HelpView.d.ts +2 -0
- package/dist/ui/views/HelpView.d.ts.map +1 -0
- package/dist/ui/views/HelpView.js +25 -0
- package/dist/ui/views/HelpView.js.map +1 -0
- package/dist/ui/views/InitView.d.ts +27 -0
- package/dist/ui/views/InitView.d.ts.map +1 -0
- package/dist/ui/views/InitView.js +24 -0
- package/dist/ui/views/InitView.js.map +1 -0
- package/dist/ui/views/ReplayView.d.ts +16 -0
- package/dist/ui/views/ReplayView.d.ts.map +1 -0
- package/dist/ui/views/ReplayView.js +44 -0
- package/dist/ui/views/ReplayView.js.map +1 -0
- package/dist/ui/views/ReportView.d.ts +14 -0
- package/dist/ui/views/ReportView.d.ts.map +1 -0
- package/dist/ui/views/ReportView.js +86 -0
- package/dist/ui/views/ReportView.js.map +1 -0
- package/dist/ui/views/RubricView.d.ts +18 -0
- package/dist/ui/views/RubricView.d.ts.map +1 -0
- package/dist/ui/views/RubricView.js +18 -0
- package/dist/ui/views/RubricView.js.map +1 -0
- package/opencode/abide.mjs +246 -0
- package/package.json +50 -0
- package/skills/abide-compile/SKILL.md +173 -0
- package/src/abide-hook.ts +23 -0
- package/src/bin.ts +64 -0
- package/src/commands/audit.ts +97 -0
- package/src/commands/bench.ts +226 -0
- package/src/commands/calibrate.ts +165 -0
- package/src/commands/check.ts +114 -0
- package/src/commands/compile.ts +127 -0
- package/src/commands/init.ts +109 -0
- package/src/commands/login.ts +61 -0
- package/src/commands/replay.ts +148 -0
- package/src/commands/report.ts +83 -0
- package/src/commands/rubric.ts +45 -0
- package/src/commands/uninstall.ts +33 -0
- package/src/hooks/postToolUse.ts +171 -0
- package/src/hooks/sessionStart.ts +100 -0
- package/src/hooks/stop.ts +275 -0
- package/src/hooks/turnStart.ts +36 -0
- package/src/lib/applyPatch.ts +75 -0
- package/src/lib/audit.ts +265 -0
- package/src/lib/band.ts +49 -0
- package/src/lib/calibration.ts +35 -0
- package/src/lib/checkRunner.ts +124 -0
- package/src/lib/claude.ts +35 -0
- package/src/lib/compilePrompt.ts +67 -0
- package/src/lib/constants.ts +39 -0
- package/src/lib/coverage.ts +21 -0
- package/src/lib/credentials.ts +104 -0
- package/src/lib/diff.ts +209 -0
- package/src/lib/events.ts +34 -0
- package/src/lib/git.ts +206 -0
- package/src/lib/hookRunner.ts +55 -0
- package/src/lib/hosts.ts +112 -0
- package/src/lib/jev.ts +223 -0
- package/src/lib/lintConfig.ts +53 -0
- package/src/lib/loadRules.ts +39 -0
- package/src/lib/opencodePlugin.ts +38 -0
- package/src/lib/output.ts +44 -0
- package/src/lib/packageRoot.ts +48 -0
- package/src/lib/paths.ts +96 -0
- package/src/lib/reason.ts +46 -0
- package/src/lib/regularFile.ts +96 -0
- package/src/lib/replay.ts +314 -0
- package/src/lib/replayCodex.ts +130 -0
- package/src/lib/replayOpencode.ts +186 -0
- package/src/lib/rubricFile.ts +99 -0
- package/src/lib/scope.ts +18 -0
- package/src/lib/session.ts +223 -0
- package/src/lib/settings.ts +112 -0
- package/src/lib/sources.ts +154 -0
- package/src/lib/stdin.ts +23 -0
- package/src/lib/transcript.ts +49 -0
- package/src/lib/ui.ts +38 -0
- package/src/ui/components/Buckets.tsx +30 -0
- package/src/ui/components/Callout.tsx +26 -0
- package/src/ui/components/Checklist.tsx +29 -0
- package/src/ui/components/Columns.tsx +62 -0
- package/src/ui/components/Header.tsx +35 -0
- package/src/ui/components/Live.tsx +73 -0
- package/src/ui/components/RuleTable.tsx +94 -0
- package/src/ui/components/Section.tsx +24 -0
- package/src/ui/components/Verdicts.tsx +40 -0
- package/src/ui/render.tsx +51 -0
- package/src/ui/theme.ts +65 -0
- package/src/ui/views/AuditView.tsx +140 -0
- package/src/ui/views/BenchView.tsx +87 -0
- package/src/ui/views/CalibrateView.tsx +108 -0
- package/src/ui/views/CheckView.tsx +56 -0
- package/src/ui/views/ErrorView.tsx +32 -0
- package/src/ui/views/HelpView.tsx +51 -0
- package/src/ui/views/InitView.tsx +103 -0
- package/src/ui/views/ReplayView.tsx +100 -0
- package/src/ui/views/ReportView.tsx +225 -0
- package/src/ui/views/RubricView.tsx +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayCodex.d.ts","sourceRoot":"","sources":["../../src/lib/replayCodex.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAE7D,wIAAwI;AACxI,eAAO,MAAM,gBAAgB,QAAO,MAAoD,CAAC;AAgCzF,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,aA4DhD,CAAC;AAyBF,eAAO,MAAM,gBAAgB,SAAU,MAAM,mBAA6B,aAAa,EAI1B,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { postToolUseInputSchema } from "@coldtea/abide-schema";
|
|
5
|
+
import { MAX_TASK_CHARS } from "./constants.js";
|
|
6
|
+
/** One rollout file per session, one JSON object per line. An `apply_patch` call carries the same patch text the live hook receives. */
|
|
7
|
+
export const codexSessionsDir = () => path.join(homedir(), ".codex", "sessions");
|
|
8
|
+
const asRecord = (value) => {
|
|
9
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
10
|
+
return undefined;
|
|
11
|
+
const record = { ...value };
|
|
12
|
+
return record;
|
|
13
|
+
};
|
|
14
|
+
const asList = (value) => (Array.isArray(value) ? value : []);
|
|
15
|
+
/** Codex's own additions to a user turn, not prompts. */
|
|
16
|
+
const INJECTED = [
|
|
17
|
+
"# AGENTS.md instructions",
|
|
18
|
+
"<environment_context>",
|
|
19
|
+
"<permissions instructions>",
|
|
20
|
+
"<turn_aborted>",
|
|
21
|
+
"\n# Files mentioned by the user",
|
|
22
|
+
];
|
|
23
|
+
const promptOf = (payload) => {
|
|
24
|
+
const text = asList(payload.content)
|
|
25
|
+
.flatMap((c) => {
|
|
26
|
+
const part = asRecord(c);
|
|
27
|
+
return part?.type === "input_text" && typeof part.text === "string" ? [part.text] : [];
|
|
28
|
+
})
|
|
29
|
+
.join("\n");
|
|
30
|
+
if (text.trim() === "" || INJECTED.some((prefix) => text.startsWith(prefix)))
|
|
31
|
+
return undefined;
|
|
32
|
+
return text.slice(0, MAX_TASK_CHARS);
|
|
33
|
+
};
|
|
34
|
+
const FAILED_OUTPUT = /^apply_patch (verification )?failed|^error/i;
|
|
35
|
+
export const parseCodexRollout = (file) => {
|
|
36
|
+
const turns = [];
|
|
37
|
+
const pending = new Map();
|
|
38
|
+
let cwd;
|
|
39
|
+
let turnIndex = 0;
|
|
40
|
+
const current = () => {
|
|
41
|
+
const last = turns.at(-1);
|
|
42
|
+
if (last !== undefined)
|
|
43
|
+
return last;
|
|
44
|
+
const first = { index: 0, prompt: undefined, edits: [] };
|
|
45
|
+
turns.push(first);
|
|
46
|
+
return first;
|
|
47
|
+
};
|
|
48
|
+
const sessionId = path.basename(file, ".jsonl");
|
|
49
|
+
for (const line of readFileSync(file, "utf8").split("\n")) {
|
|
50
|
+
if (line.trim() === "")
|
|
51
|
+
continue;
|
|
52
|
+
let entry;
|
|
53
|
+
try {
|
|
54
|
+
entry = asRecord(JSON.parse(line));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// a torn line, still being written
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const payload = asRecord(entry?.payload);
|
|
61
|
+
if (entry === undefined || payload === undefined)
|
|
62
|
+
continue;
|
|
63
|
+
if (entry.type === "session_meta" && typeof payload.cwd === "string")
|
|
64
|
+
cwd ??= payload.cwd;
|
|
65
|
+
if (entry.type !== "response_item")
|
|
66
|
+
continue;
|
|
67
|
+
if (payload.type === "message" && payload.role === "user") {
|
|
68
|
+
const prompt = promptOf(payload);
|
|
69
|
+
if (prompt === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
turnIndex += 1;
|
|
72
|
+
turns.push({ index: turnIndex, prompt, edits: [] });
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (payload.type === "custom_tool_call" &&
|
|
76
|
+
payload.name === "apply_patch" &&
|
|
77
|
+
typeof payload.call_id === "string" &&
|
|
78
|
+
typeof payload.input === "string") {
|
|
79
|
+
pending.set(payload.call_id, { turn: current(), command: payload.input });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (payload.type === "custom_tool_call_output" && typeof payload.call_id === "string") {
|
|
83
|
+
const call = pending.get(payload.call_id);
|
|
84
|
+
pending.delete(payload.call_id);
|
|
85
|
+
if (call === undefined)
|
|
86
|
+
continue;
|
|
87
|
+
// a patch that did not apply changed nothing
|
|
88
|
+
if (typeof payload.output === "string" && FAILED_OUTPUT.test(payload.output))
|
|
89
|
+
continue;
|
|
90
|
+
const parsed = postToolUseInputSchema.safeParse({
|
|
91
|
+
session_id: sessionId,
|
|
92
|
+
cwd: cwd ?? process.cwd(),
|
|
93
|
+
hook_event_name: "PostToolUse",
|
|
94
|
+
tool_name: "apply_patch",
|
|
95
|
+
tool_use_id: payload.call_id,
|
|
96
|
+
tool_input: { command: call.command },
|
|
97
|
+
});
|
|
98
|
+
if (parsed.success)
|
|
99
|
+
call.turn.edits.push({ turn: call.turn.index, input: parsed.data });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { file, cwd: cwd ?? process.cwd(), turns: turns.filter((t) => t.edits.length > 0) };
|
|
103
|
+
};
|
|
104
|
+
const rolloutFiles = (dir) => {
|
|
105
|
+
let names;
|
|
106
|
+
try {
|
|
107
|
+
names = readdirSync(dir);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
return names.flatMap((name) => {
|
|
113
|
+
const full = path.join(dir, name);
|
|
114
|
+
try {
|
|
115
|
+
if (statSync(full).isDirectory())
|
|
116
|
+
return rolloutFiles(full);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
return name.startsWith("rollout-") && name.endsWith(".jsonl") ? [full] : [];
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const inside = (root, dir) => {
|
|
125
|
+
const rel = path.relative(root, dir);
|
|
126
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
127
|
+
};
|
|
128
|
+
export const codexSessionsFor = (root, dir = codexSessionsDir()) => rolloutFiles(dir)
|
|
129
|
+
.sort()
|
|
130
|
+
.map(parseCodexRollout)
|
|
131
|
+
.filter((s) => inside(root, s.cwd) && s.turns.length > 0);
|
|
132
|
+
//# sourceMappingURL=replayCodex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayCodex.js","sourceRoot":"","sources":["../../src/lib/replayCodex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,wIAAwI;AACxI,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAEzF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAuC,EAAE;IACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,MAAM,MAAM,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAa,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAElF,yDAAyD;AACzD,MAAM,QAAQ,GAAG;IACf,0BAA0B;IAC1B,uBAAuB;IACvB,4BAA4B;IAC5B,gBAAgB;IAChB,iCAAiC;CAClC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,OAAgC,EAAsB,EAAE;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/F,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,6CAA6C,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAiB,EAAE;IAC/D,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiD,CAAC;IACzE,IAAI,GAAuB,CAAC;IAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,GAAe,EAAE;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,KAAK,GAAe,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,IAAI,KAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;YACnC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;YAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;QAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;YAAE,SAAS;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,MAAM,KAAK,SAAS;gBAAE,SAAS;YACnC,SAAS,IAAI,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IACE,OAAO,CAAC,IAAI,KAAK,kBAAkB;YACnC,OAAO,CAAC,IAAI,KAAK,aAAa;YAC9B,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YACnC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EACjC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,yBAAyB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,6CAA6C;YAC7C,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvF,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;gBAC9C,UAAU,EAAE,SAAS;gBACrB,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACzB,eAAe,EAAE,aAAa;gBAC9B,SAAS,EAAE,aAAa;gBACxB,WAAW,EAAE,OAAO,CAAC,OAAO;gBAC5B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACtC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAY,EAAE;IAC7C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAW,EAAW,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,GAAG,GAAG,gBAAgB,EAAE,EAAmB,EAAE,CAC1F,YAAY,CAAC,GAAG,CAAC;KACd,IAAI,EAAE;KACN,GAAG,CAAC,iBAAiB,CAAC;KACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReplaySession } from "./replay.js";
|
|
2
|
+
/** Sessions live in SQLite. The `sqlite3` binary reads it so the CLI needs no driver. */
|
|
3
|
+
export declare const opencodeDbPath: () => string;
|
|
4
|
+
export type OpencodeRow = {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
directory: string;
|
|
7
|
+
messageId: string;
|
|
8
|
+
role: string;
|
|
9
|
+
created: number;
|
|
10
|
+
part: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const readOpencodeRows: (db: string) => OpencodeRow[];
|
|
13
|
+
export declare const opencodeSessionsFromRows: (root: string, rows: readonly OpencodeRow[]) => ReplaySession[];
|
|
14
|
+
export declare const opencodeSessionsFor: (root: string, db?: string) => ReplaySession[];
|
|
15
|
+
//# sourceMappingURL=replayOpencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayOpencode.d.ts","sourceRoot":"","sources":["../../src/lib/replayOpencode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAE7D,yFAAyF;AACzF,eAAO,MAAM,cAAc,QAAO,MACkC,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AA+BF,eAAO,MAAM,gBAAgB,OAAQ,MAAM,KAAG,WAAW,EA+BrD,CAAC;AA2CL,eAAO,MAAM,wBAAwB,SAC7B,MAAM,QACN,SAAS,WAAW,EAAE,KAC3B,aAAa,EAqDf,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU,MAAM,kBAA0B,aAAa,EAGtF,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { AbideError, postToolUseInputSchema } from "@coldtea/abide-schema";
|
|
6
|
+
import { MAX_TASK_CHARS } from "./constants.js";
|
|
7
|
+
/** Sessions live in SQLite. The `sqlite3` binary reads it so the CLI needs no driver. */
|
|
8
|
+
export const opencodeDbPath = () => path.join(homedir(), ".local", "share", "opencode", "opencode.db");
|
|
9
|
+
const asRecord = (value) => {
|
|
10
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
11
|
+
return undefined;
|
|
12
|
+
const record = { ...value };
|
|
13
|
+
return record;
|
|
14
|
+
};
|
|
15
|
+
const query = (db, sql) => {
|
|
16
|
+
const result = spawnSync("sqlite3", ["-json", "-readonly", db, sql], {
|
|
17
|
+
encoding: "utf8",
|
|
18
|
+
maxBuffer: 512 * 1024 * 1024,
|
|
19
|
+
});
|
|
20
|
+
if (result.error !== undefined)
|
|
21
|
+
throw new AbideError("GIT_UNAVAILABLE", "sqlite3 is not on PATH, and OpenCode sessions live in a SQLite database", {
|
|
22
|
+
cause: result.error,
|
|
23
|
+
});
|
|
24
|
+
if (result.status !== 0)
|
|
25
|
+
throw new AbideError("GIT_UNAVAILABLE", `sqlite3 could not read ${db}: ${result.stderr.trim()}`);
|
|
26
|
+
if (result.stdout.trim() === "")
|
|
27
|
+
return [];
|
|
28
|
+
const parsed = JSON.parse(result.stdout);
|
|
29
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
30
|
+
};
|
|
31
|
+
export const readOpencodeRows = (db) => query(db, `select s.id as sessionId, s.directory as directory, m.id as messageId,
|
|
32
|
+
json_extract(m.data, '$.role') as role, m.time_created as created, p.data as part
|
|
33
|
+
from part p
|
|
34
|
+
join message m on m.id = p.message_id
|
|
35
|
+
join session s on s.id = m.session_id
|
|
36
|
+
order by s.id, m.time_created, m.id, p.id`).flatMap((row) => {
|
|
37
|
+
const r = asRecord(row);
|
|
38
|
+
if (r === undefined ||
|
|
39
|
+
typeof r.sessionId !== "string" ||
|
|
40
|
+
typeof r.directory !== "string" ||
|
|
41
|
+
typeof r.messageId !== "string" ||
|
|
42
|
+
typeof r.role !== "string" ||
|
|
43
|
+
typeof r.created !== "number" ||
|
|
44
|
+
typeof r.part !== "string")
|
|
45
|
+
return [];
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
sessionId: r.sessionId,
|
|
49
|
+
directory: r.directory,
|
|
50
|
+
messageId: r.messageId,
|
|
51
|
+
role: r.role,
|
|
52
|
+
created: r.created,
|
|
53
|
+
part: r.part,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
});
|
|
57
|
+
/** The same payload the live plugin builds. */
|
|
58
|
+
const editPayload = (sessionId, directory, callId, tool, input) => {
|
|
59
|
+
const file = typeof input.filePath === "string" ? input.filePath : "";
|
|
60
|
+
if (file === "")
|
|
61
|
+
return undefined;
|
|
62
|
+
const file_path = path.isAbsolute(file) ? file : path.join(directory, file);
|
|
63
|
+
const base = {
|
|
64
|
+
session_id: sessionId,
|
|
65
|
+
cwd: directory,
|
|
66
|
+
hook_event_name: "PostToolUse",
|
|
67
|
+
tool_use_id: callId,
|
|
68
|
+
};
|
|
69
|
+
switch (tool) {
|
|
70
|
+
case "edit":
|
|
71
|
+
return {
|
|
72
|
+
...base,
|
|
73
|
+
tool_name: "Edit",
|
|
74
|
+
tool_input: {
|
|
75
|
+
file_path,
|
|
76
|
+
old_string: String(input.oldString ?? ""),
|
|
77
|
+
new_string: String(input.newString ?? ""),
|
|
78
|
+
replace_all: Boolean(input.replaceAll),
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
case "write":
|
|
82
|
+
return {
|
|
83
|
+
...base,
|
|
84
|
+
tool_name: "Write",
|
|
85
|
+
tool_input: { file_path, content: String(input.content ?? "") },
|
|
86
|
+
tool_response: { filePath: file_path, originalFile: null },
|
|
87
|
+
};
|
|
88
|
+
default:
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
export const opencodeSessionsFromRows = (root, rows) => {
|
|
93
|
+
const sessions = new Map();
|
|
94
|
+
for (const row of rows) {
|
|
95
|
+
const rel = path.relative(root, row.directory);
|
|
96
|
+
if (rel !== "" && (rel.startsWith("..") || path.isAbsolute(rel)))
|
|
97
|
+
continue;
|
|
98
|
+
let session = sessions.get(row.sessionId);
|
|
99
|
+
if (session === undefined) {
|
|
100
|
+
session = { file: row.sessionId, cwd: row.directory, turns: [], turnIndex: 0 };
|
|
101
|
+
sessions.set(row.sessionId, session);
|
|
102
|
+
}
|
|
103
|
+
let part;
|
|
104
|
+
try {
|
|
105
|
+
part = asRecord(JSON.parse(row.part));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (part === undefined)
|
|
111
|
+
continue;
|
|
112
|
+
if (row.role === "user") {
|
|
113
|
+
if (session.lastMessage !== row.messageId) {
|
|
114
|
+
session.lastMessage = row.messageId;
|
|
115
|
+
session.turnIndex += 1;
|
|
116
|
+
session.turns.push({ index: session.turnIndex, prompt: undefined, edits: [] });
|
|
117
|
+
}
|
|
118
|
+
const turn = session.turns.at(-1);
|
|
119
|
+
if (turn !== undefined && part.type === "text" && typeof part.text === "string") {
|
|
120
|
+
const text = part.text.trim();
|
|
121
|
+
if (text !== "" && !text.startsWith("Abide:"))
|
|
122
|
+
turn.prompt = `${turn.prompt === undefined ? "" : `${turn.prompt}\n`}${text}`.slice(0, MAX_TASK_CHARS);
|
|
123
|
+
}
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (part.type !== "tool" || typeof part.tool !== "string" || typeof part.callID !== "string")
|
|
127
|
+
continue;
|
|
128
|
+
const state = asRecord(part.state);
|
|
129
|
+
const input = asRecord(state?.input);
|
|
130
|
+
if (state?.status !== "completed" || input === undefined)
|
|
131
|
+
continue;
|
|
132
|
+
const payload = editPayload(row.sessionId, row.directory, part.callID, part.tool, input);
|
|
133
|
+
if (payload === undefined)
|
|
134
|
+
continue;
|
|
135
|
+
const parsed = postToolUseInputSchema.safeParse(payload);
|
|
136
|
+
if (!parsed.success)
|
|
137
|
+
continue;
|
|
138
|
+
let turn = session.turns.at(-1);
|
|
139
|
+
if (turn === undefined) {
|
|
140
|
+
turn = { index: 0, prompt: undefined, edits: [] };
|
|
141
|
+
session.turns.push(turn);
|
|
142
|
+
}
|
|
143
|
+
turn.edits.push({ turn: turn.index, input: parsed.data });
|
|
144
|
+
}
|
|
145
|
+
return [...sessions.values()]
|
|
146
|
+
.map(({ file, cwd, turns }) => ({ file, cwd, turns: turns.filter((t) => t.edits.length > 0) }))
|
|
147
|
+
.filter((s) => s.turns.length > 0);
|
|
148
|
+
};
|
|
149
|
+
export const opencodeSessionsFor = (root, db = opencodeDbPath()) => {
|
|
150
|
+
if (!existsSync(db))
|
|
151
|
+
throw new AbideError("RUBRIC_MISSING", `no OpenCode database at ${db}`);
|
|
152
|
+
return opencodeSessionsFromRows(root, readOpencodeRows(db));
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=replayOpencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayOpencode.js","sourceRoot":"","sources":["../../src/lib/replayOpencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type CheckType, type Rubric, type Rule, type RuleStatus } from "@coldtea/abide-schema";
|
|
2
|
+
export type RubricRead = {
|
|
3
|
+
kind: "missing";
|
|
4
|
+
path: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "invalid";
|
|
7
|
+
path: string;
|
|
8
|
+
issues: string[];
|
|
9
|
+
} | {
|
|
10
|
+
kind: "ok";
|
|
11
|
+
path: string;
|
|
12
|
+
rubric: Rubric;
|
|
13
|
+
};
|
|
14
|
+
export declare const readRubric: (file: string) => RubricRead;
|
|
15
|
+
export declare const writeRubric: (file: string, rubric: Rubric) => void;
|
|
16
|
+
/** Hashes every source and settles on one spelling for each path, in sources and in rules. */
|
|
17
|
+
export declare const fillSourceShas: (rubric: Rubric, root: string) => {
|
|
18
|
+
rubric: Rubric;
|
|
19
|
+
missing: string[];
|
|
20
|
+
};
|
|
21
|
+
export type MergedRule = Rule & {
|
|
22
|
+
origin: "project" | "global";
|
|
23
|
+
};
|
|
24
|
+
/** Project rules win on an id clash. */
|
|
25
|
+
export declare const mergeRules: (project: Rubric | undefined, global: Rubric | undefined) => MergedRule[];
|
|
26
|
+
export type BucketCounts = Record<CheckType, number> & {
|
|
27
|
+
total: number;
|
|
28
|
+
byStatus: Record<RuleStatus, number>;
|
|
29
|
+
};
|
|
30
|
+
export declare const bucketCounts: (rules: readonly Rule[]) => BucketCounts;
|
|
31
|
+
//# sourceMappingURL=rubricFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rubricFile.d.ts","sourceRoot":"","sources":["../../src/lib/rubricFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAK/B,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,UAmBzC,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,UAAU,MAAM,KAAG,IAG1D,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,cAAc,WACjB,MAAM,QACR,MAAM,KACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAgBrC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEjE,wCAAwC;AACxC,eAAO,MAAM,UAAU,YACZ,MAAM,GAAG,SAAS,UACnB,MAAM,GAAG,SAAS,KACzB,UAAU,EAKZ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,YAAY,UAAW,SAAS,IAAI,EAAE,KAAG,YAcrD,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { rubricSchema, } from "@coldtea/abide-schema";
|
|
4
|
+
import { hashFile } from "./sources.js";
|
|
5
|
+
import { canonicalSourcePath, resolveSourcePath } from "./paths.js";
|
|
6
|
+
import { readRegularText } from "./regularFile.js";
|
|
7
|
+
export const readRubric = (file) => {
|
|
8
|
+
const raw = readRegularText(file);
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
return { kind: "missing", path: file };
|
|
11
|
+
let json;
|
|
12
|
+
try {
|
|
13
|
+
json = JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
const message = error instanceof Error ? error.message : "not JSON";
|
|
17
|
+
return { kind: "invalid", path: file, issues: [message] };
|
|
18
|
+
}
|
|
19
|
+
const parsed = rubricSchema.safeParse(json);
|
|
20
|
+
if (!parsed.success) {
|
|
21
|
+
return {
|
|
22
|
+
kind: "invalid",
|
|
23
|
+
path: file,
|
|
24
|
+
issues: parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { kind: "ok", path: file, rubric: parsed.data };
|
|
28
|
+
};
|
|
29
|
+
export const writeRubric = (file, rubric) => {
|
|
30
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
31
|
+
writeFileSync(file, `${JSON.stringify(rubric, null, 2)}\n`);
|
|
32
|
+
};
|
|
33
|
+
/** Hashes every source and settles on one spelling for each path, in sources and in rules. */
|
|
34
|
+
export const fillSourceShas = (rubric, root) => {
|
|
35
|
+
const missing = [];
|
|
36
|
+
const sources = rubric.sources.map((source) => {
|
|
37
|
+
const canonical = canonicalSourcePath(root, source.path);
|
|
38
|
+
const sha = hashFile(resolveSourcePath(root, source.path));
|
|
39
|
+
if (sha === undefined) {
|
|
40
|
+
missing.push(source.path);
|
|
41
|
+
return { ...source, path: canonical };
|
|
42
|
+
}
|
|
43
|
+
return { ...source, path: canonical, sha };
|
|
44
|
+
});
|
|
45
|
+
const rules = rubric.rules.map((rule) => ({
|
|
46
|
+
...rule,
|
|
47
|
+
source: { ...rule.source, path: canonicalSourcePath(root, rule.source.path) },
|
|
48
|
+
}));
|
|
49
|
+
return { rubric: { ...rubric, sources, rules }, missing };
|
|
50
|
+
};
|
|
51
|
+
/** Project rules win on an id clash. */
|
|
52
|
+
export const mergeRules = (project, global) => {
|
|
53
|
+
const byId = new Map();
|
|
54
|
+
for (const rule of global?.rules ?? [])
|
|
55
|
+
byId.set(rule.id, { ...rule, origin: "global" });
|
|
56
|
+
for (const rule of project?.rules ?? [])
|
|
57
|
+
byId.set(rule.id, { ...rule, origin: "project" });
|
|
58
|
+
return [...byId.values()];
|
|
59
|
+
};
|
|
60
|
+
export const bucketCounts = (rules) => {
|
|
61
|
+
const counts = {
|
|
62
|
+
lint: 0,
|
|
63
|
+
model: 0,
|
|
64
|
+
deferred: 0,
|
|
65
|
+
unenforceable: 0,
|
|
66
|
+
total: rules.length,
|
|
67
|
+
byStatus: { active: 0, weak: 0, noisy: 0, disabled: 0 },
|
|
68
|
+
};
|
|
69
|
+
for (const rule of rules) {
|
|
70
|
+
counts[rule.check.type] += 1;
|
|
71
|
+
counts.byStatus[rule.status] += 1;
|
|
72
|
+
}
|
|
73
|
+
return counts;
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=rubricFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rubricFile.js","sourceRoot":"","sources":["../../src/lib/rubricFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Rule } from "@coldtea/abide-schema";
|
|
2
|
+
/** Repo-relative posix path against the rule's globs. No scope means every file. */
|
|
3
|
+
export declare const ruleAppliesTo: (rule: Pick<Rule, "scope">, relativePath: string) => boolean;
|
|
4
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/lib/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAclD,oFAAoF;AACpF,eAAO,MAAM,aAAa,SAAU,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,MAAM,KAAG,OACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import picomatch from "picomatch";
|
|
2
|
+
const matchers = new Map();
|
|
3
|
+
const matcherFor = (globs) => {
|
|
4
|
+
const key = globs.join("\n");
|
|
5
|
+
let m = matchers.get(key);
|
|
6
|
+
if (m === undefined) {
|
|
7
|
+
m = picomatch([...globs], { dot: true });
|
|
8
|
+
matchers.set(key, m);
|
|
9
|
+
}
|
|
10
|
+
return m;
|
|
11
|
+
};
|
|
12
|
+
/** Repo-relative posix path against the rule's globs. No scope means every file. */
|
|
13
|
+
export const ruleAppliesTo = (rule, relativePath) => rule.scope === undefined || matcherFor(rule.scope)(relativePath);
|
|
14
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/lib/scope.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAGlC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;AAE3D,MAAM,UAAU,GAAG,CAAC,KAAwB,EAA4B,EAAE;IACxE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAyB,EAAE,YAAoB,EAAW,EAAE,CACxF,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const NO_PROMPT_TURN = "turn";
|
|
3
|
+
export declare const turnDir: (sessionId: string, promptId: string | undefined) => string;
|
|
4
|
+
declare const fileStartSchema: z.ZodObject<{
|
|
5
|
+
path: z.ZodString;
|
|
6
|
+
original: z.ZodNullable<z.ZodString>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export type FileStart = z.infer<typeof fileStartSchema>;
|
|
9
|
+
/** The content a file had when this turn first touched it. Only the first record counts. */
|
|
10
|
+
export declare const recordFileStart: (dir: string, absolutePath: string, original: string | null) => void;
|
|
11
|
+
export declare const readFileStarts: (dir: string) => FileStart[];
|
|
12
|
+
/** Stop judges these again: a block the agent ignored must not end the turn quietly. */
|
|
13
|
+
export declare const recordBlockedFile: (dir: string, relativePath: string) => void;
|
|
14
|
+
export declare const readBlockedFiles: (dir: string) => Set<string>;
|
|
15
|
+
declare const checkedSchema: z.ZodObject<{
|
|
16
|
+
path: z.ZodString;
|
|
17
|
+
before: z.ZodNullable<z.ZodString>;
|
|
18
|
+
after: z.ZodString;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
/** An edit a check judged, as blob ids on either side of it. */
|
|
21
|
+
export type CheckedEdit = z.infer<typeof checkedSchema>;
|
|
22
|
+
/** All kept: Stop walks them as a chain from turn start to the file as it stands. */
|
|
23
|
+
export declare const recordChecked: (dir: string, record: CheckedEdit) => void;
|
|
24
|
+
export declare const readChecked: (dir: string) => CheckedEdit[];
|
|
25
|
+
export declare const blockCount: (dir: string, key: string) => number;
|
|
26
|
+
export declare const incrementBlock: (dir: string, key: string) => number;
|
|
27
|
+
export declare const stopCheckCount: (dir: string) => number;
|
|
28
|
+
export declare const incrementStopChecks: (dir: string) => number;
|
|
29
|
+
/** The prompt that started the turn, for hosts that send it instead of a transcript. */
|
|
30
|
+
export declare const writePrompt: (dir: string, prompt: string) => void;
|
|
31
|
+
export declare const readPrompt: (dir: string) => string | undefined;
|
|
32
|
+
/** The git tree the working tree was at when the turn began, when a turn-start hook recorded one. */
|
|
33
|
+
export declare const writeBaseline: (dir: string, tree: string) => void;
|
|
34
|
+
export declare const readBaseline: (dir: string) => string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* What became of the turn-start snapshot. Absent on a repository without git,
|
|
37
|
+
* where the per-file fallback is the documented mode. `pending` means the
|
|
38
|
+
* hook died before it could say, which for the Stop check is the same as
|
|
39
|
+
* failed: the turn cannot be read back whole.
|
|
40
|
+
*/
|
|
41
|
+
export type BaselineStatus = "pending" | "ok" | "failed";
|
|
42
|
+
export declare const markBaseline: (dir: string, status: BaselineStatus) => void;
|
|
43
|
+
export declare const readBaselineStatus: (dir: string) => BaselineStatus | undefined;
|
|
44
|
+
export declare const hasTurnState: (dir: string) => boolean;
|
|
45
|
+
export declare const clearTurn: (dir: string) => void;
|
|
46
|
+
export declare const pruneOldTurns: (now?: number) => void;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,eAAO,MAAM,OAAO,cAAe,MAAM,YAAY,MAAM,GAAG,SAAS,KAAG,MACG,CAAC;AAE9E,QAAA,MAAM,eAAe;;;iBAAkE,CAAC;AACxF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAkCxD,4FAA4F;AAC5F,eAAO,MAAM,eAAe,QACrB,MAAM,gBACG,MAAM,YACV,MAAM,GAAG,IAAI,KACtB,IAGF,CAAC;AAqBF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,SAAS,EACC,CAAC;AAExD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,QAAS,MAAM,gBAAgB,MAAM,KAAG,IAErE,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,GAAG,CAAC,MAAM,CAcxD,CAAC;AAEF,QAAA,MAAM,aAAa;;;;iBAKjB,CAAC;AACH,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,qFAAqF;AACrF,eAAO,MAAM,aAAa,QAAS,MAAM,UAAU,WAAW,KAAG,IAGhE,CAAC;AAEF,eAAO,MAAM,WAAW,QAAS,MAAM,KAAG,WAAW,EACE,CAAC;AAIxD,eAAO,MAAM,UAAU,QAAS,MAAM,OAAO,MAAM,KAAG,MACO,CAAC;AAE9D,eAAO,MAAM,cAAc,QAAS,MAAM,OAAO,MAAM,KAAG,MACH,CAAC;AAExD,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,MACM,CAAC;AAEpD,eAAO,MAAM,mBAAmB,QAAS,MAAM,KAAG,MACL,CAAC;AAE9C,wFAAwF;AACxF,eAAO,MAAM,WAAW,QAAS,MAAM,UAAU,MAAM,KAAG,IAEzD,CAAC;AAEF,eAAO,MAAM,UAAU,QAAS,MAAM,KAAG,MAAM,GAAG,SAOjD,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,aAAa,QAAS,MAAM,QAAQ,MAAM,KAAG,IAEzD,CAAC;AAEF,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,MAAM,GAAG,SAOnD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;AAIzD,eAAO,MAAM,YAAY,QAAS,MAAM,UAAU,cAAc,KAAG,IAMlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,cAAc,GAAG,SAOjE,CAAC;AAEF,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,OAGJ,CAAC;AAExC,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,IAMvC,CAAC;AAEF,eAAO,MAAM,aAAa,oBAAuB,IAUhD,CAAC"}
|