@isaacriehm/cairn-core 0.3.7 → 0.4.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/dist/.tsbuildinfo +1 -1
- package/dist/attention/bulk-accept.d.ts +18 -0
- package/dist/attention/bulk-accept.js +46 -0
- package/dist/attention/bulk-accept.js.map +1 -1
- package/dist/attention/dedup.d.ts +68 -0
- package/dist/attention/dedup.js +239 -0
- package/dist/attention/dedup.js.map +1 -0
- package/dist/attention/index.d.ts +3 -0
- package/dist/attention/index.js +3 -0
- package/dist/attention/index.js.map +1 -1
- package/dist/attention/restore.d.ts +43 -0
- package/dist/attention/restore.js +127 -0
- package/dist/attention/restore.js.map +1 -0
- package/dist/attention/source-strip.d.ts +49 -0
- package/dist/attention/source-strip.js +340 -0
- package/dist/attention/source-strip.js.map +1 -0
- package/dist/claude/cache.d.ts +31 -0
- package/dist/claude/cache.js +0 -0
- package/dist/claude/cache.js.map +1 -0
- package/dist/claude/error.d.ts +1 -1
- package/dist/claude/error.js +5 -0
- package/dist/claude/error.js.map +1 -1
- package/dist/claude/runner.js +60 -3
- package/dist/claude/runner.js.map +1 -1
- package/dist/claude/types.d.ts +25 -0
- package/dist/hooks/runners/session-start.js +24 -2
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/init/baseline-audit.d.ts +8 -0
- package/dist/init/baseline-audit.js +1 -1
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/brand-derive.js +53 -34
- package/dist/init/brand-derive.js.map +1 -1
- package/dist/init/index.d.ts +4 -2
- package/dist/init/index.js +3 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/ingest-docs.d.ts +7 -0
- package/dist/init/ingest-docs.js +4 -1
- package/dist/init/ingest-docs.js.map +1 -1
- package/dist/init/mapper-merge.js +1 -0
- package/dist/init/mapper-merge.js.map +1 -1
- package/dist/init/phases/3-mapper.js +18 -0
- package/dist/init/phases/3-mapper.js.map +1 -1
- package/dist/init/phases/5-brand.js +3 -0
- package/dist/init/phases/5-brand.js.map +1 -1
- package/dist/init/phases/6-docs-ingest.js +14 -0
- package/dist/init/phases/6-docs-ingest.js.map +1 -1
- package/dist/init/phases/7b-source-comments.d.ts +9 -0
- package/dist/init/phases/7b-source-comments.js +41 -1
- package/dist/init/phases/7b-source-comments.js.map +1 -1
- package/dist/init/phases/7c-rules-merge.js +10 -0
- package/dist/init/phases/7c-rules-merge.js.map +1 -1
- package/dist/init/phases/index.d.ts +2 -0
- package/dist/init/phases/index.js +2 -0
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/parallel-678.d.ts +31 -0
- package/dist/init/phases/parallel-678.js +205 -0
- package/dist/init/phases/parallel-678.js.map +1 -0
- package/dist/init/phases/source-comments-output-io.d.ts +78 -0
- package/dist/init/phases/source-comments-output-io.js +84 -0
- package/dist/init/phases/source-comments-output-io.js.map +1 -0
- package/dist/init/progress.d.ts +35 -0
- package/dist/init/progress.js +71 -0
- package/dist/init/progress.js.map +1 -0
- package/dist/init/rules-merge/ingest.d.ts +14 -0
- package/dist/init/rules-merge/ingest.js +8 -2
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/source-comments/classify.d.ts +6 -0
- package/dist/init/source-comments/classify.js +60 -3
- package/dist/init/source-comments/classify.js.map +1 -1
- package/dist/init/source-comments/ingest.d.ts +21 -0
- package/dist/init/source-comments/ingest.js +28 -3
- package/dist/init/source-comments/ingest.js.map +1 -1
- package/dist/mcp/tools/attention-dedup.d.ts +21 -0
- package/dist/mcp/tools/attention-dedup.js +34 -0
- package/dist/mcp/tools/attention-dedup.js.map +1 -0
- package/dist/mcp/tools/attention-restore.d.ts +14 -0
- package/dist/mcp/tools/attention-restore.js +22 -0
- package/dist/mcp/tools/attention-restore.js.map +1 -0
- package/dist/mcp/tools/index.js +6 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +1 -0
- package/dist/mcp/tools/init-phases.js +88 -1
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.js +44 -141
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/status-line/format.d.ts +5 -2
- package/dist/status-line/format.js +31 -5
- package/dist/status-line/format.js.map +1 -1
- package/dist/status-line/reader.js +25 -1
- package/dist/status-line/reader.js.map +1 -1
- package/package.json +1 -1
- package/templates/.claude/rules/cairn.md +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/attention/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared source-comment strip-replace helpers for the attention surface.
|
|
3
|
+
*
|
|
4
|
+
* Phase 7b writes DEC drafts (extracted from essay-class JSDoc / block
|
|
5
|
+
* comments) to `_inbox/` and stamps `sourceFile` + `blockId` on the
|
|
6
|
+
* frontmatter. When the operator accepts a draft — either inline via
|
|
7
|
+
* `cairn_resolve_attention` or in bulk via `cairn_bulk_accept_attention`
|
|
8
|
+
* — the original essay should be replaced with `// §DEC-NNNN` so the
|
|
9
|
+
* file ends up carrying the canonical bare cite, not the original prose.
|
|
10
|
+
*
|
|
11
|
+
* The full block coordinates (start/end byte offsets, language) live in
|
|
12
|
+
* `.cairn/baseline/source-comments-<ISO>.yaml` (the audit YAML written
|
|
13
|
+
* by phase 7b). This module reads the latest audit, looks up the block
|
|
14
|
+
* by id, and runs `applyStripReplace` against the recorded range.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors the invariant strip pass that 7b runs at adoption time. The
|
|
17
|
+
* net effect: every accepted DEC draft from a source comment is bare-
|
|
18
|
+
* cited inline, just like §INV constraints already are.
|
|
19
|
+
*/
|
|
20
|
+
export interface DraftMeta {
|
|
21
|
+
blockId: string | null;
|
|
22
|
+
sourceFile: string | null;
|
|
23
|
+
captureSource: string | null;
|
|
24
|
+
title: string | null;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseDraftMeta(body: string): DraftMeta | null;
|
|
27
|
+
export interface StripOutcomeSummary {
|
|
28
|
+
attempted: boolean;
|
|
29
|
+
files_modified: number;
|
|
30
|
+
items_applied: number;
|
|
31
|
+
audit_path: string | null;
|
|
32
|
+
reason?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function findLatestSourceCommentsAudit(repoRoot: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Strip the original source-comment block for one accepted DEC and
|
|
37
|
+
* replace it with `// §DEC-NNNN` (or `# §DEC-NNNN` in hash-comment
|
|
38
|
+
* languages). Reads block coordinates from the latest 7b audit YAML;
|
|
39
|
+
* skips when the audit is missing, the block id isn't found, or the
|
|
40
|
+
* source file is dirty (strip-replace's own dirty check).
|
|
41
|
+
*
|
|
42
|
+
* Returns a small summary the MCP / CLI surface can echo back to the
|
|
43
|
+
* operator.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runDecSourceStrip(args: {
|
|
46
|
+
repoRoot: string;
|
|
47
|
+
decId: string;
|
|
48
|
+
meta: DraftMeta;
|
|
49
|
+
}): StripOutcomeSummary;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared source-comment strip-replace helpers for the attention surface.
|
|
3
|
+
*
|
|
4
|
+
* Phase 7b writes DEC drafts (extracted from essay-class JSDoc / block
|
|
5
|
+
* comments) to `_inbox/` and stamps `sourceFile` + `blockId` on the
|
|
6
|
+
* frontmatter. When the operator accepts a draft — either inline via
|
|
7
|
+
* `cairn_resolve_attention` or in bulk via `cairn_bulk_accept_attention`
|
|
8
|
+
* — the original essay should be replaced with `// §DEC-NNNN` so the
|
|
9
|
+
* file ends up carrying the canonical bare cite, not the original prose.
|
|
10
|
+
*
|
|
11
|
+
* The full block coordinates (start/end byte offsets, language) live in
|
|
12
|
+
* `.cairn/baseline/source-comments-<ISO>.yaml` (the audit YAML written
|
|
13
|
+
* by phase 7b). This module reads the latest audit, looks up the block
|
|
14
|
+
* by id, and runs `applyStripReplace` against the recorded range.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors the invariant strip pass that 7b runs at adoption time. The
|
|
17
|
+
* net effect: every accepted DEC draft from a source comment is bare-
|
|
18
|
+
* cited inline, just like §INV constraints already are.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { parse as parseYaml } from "yaml";
|
|
23
|
+
import { applyStripReplace, formatBareCitation, } from "../init/source-comments/strip-replace.js";
|
|
24
|
+
import { logger } from "../logger.js";
|
|
25
|
+
/**
|
|
26
|
+
* Look up the current byte range of `expectedRaw` in `file` (relative to
|
|
27
|
+
* `repoRoot`). Returns null when the file is missing, the raw text
|
|
28
|
+
* doesn't appear, or it appears more than once (ambiguous). This is the
|
|
29
|
+
* content-search fallback that recovers from offset drift caused by
|
|
30
|
+
* Phase 7b's INV strip-replace pass mutating the same file before this
|
|
31
|
+
* DEC's accept ran.
|
|
32
|
+
*/
|
|
33
|
+
function findCurrentRange(repoRoot, file, expectedRaw) {
|
|
34
|
+
const abs = join(repoRoot, file);
|
|
35
|
+
if (!existsSync(abs))
|
|
36
|
+
return null;
|
|
37
|
+
let body;
|
|
38
|
+
try {
|
|
39
|
+
body = readFileSync(abs, "utf8");
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const first = body.indexOf(expectedRaw);
|
|
45
|
+
if (first === -1)
|
|
46
|
+
return null;
|
|
47
|
+
// Reject ambiguous matches — if the same essay appears twice we can't
|
|
48
|
+
// safely guess which one the DEC was extracted from.
|
|
49
|
+
const second = body.indexOf(expectedRaw, first + 1);
|
|
50
|
+
if (second !== -1)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
startOffset: first,
|
|
54
|
+
endOffset: first + expectedRaw.length,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const log = logger("attention.source-strip");
|
|
58
|
+
export function parseDraftMeta(body) {
|
|
59
|
+
const match = /^---\n([\s\S]*?)\n---/.exec(body);
|
|
60
|
+
if (match === null)
|
|
61
|
+
return null;
|
|
62
|
+
let parsed;
|
|
63
|
+
try {
|
|
64
|
+
parsed = parseYaml(match[1] ?? "");
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (parsed === null || typeof parsed !== "object")
|
|
70
|
+
return null;
|
|
71
|
+
const obj = parsed;
|
|
72
|
+
return {
|
|
73
|
+
blockId: typeof obj["blockId"] === "string" ? obj["blockId"] : null,
|
|
74
|
+
sourceFile: typeof obj["sourceFile"] === "string" ? obj["sourceFile"] : null,
|
|
75
|
+
captureSource: typeof obj["capture_source"] === "string" ? obj["capture_source"] : null,
|
|
76
|
+
title: typeof obj["title"] === "string" ? obj["title"] : null,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function extractAuditBlocks(body) {
|
|
80
|
+
if (body === null || typeof body !== "object")
|
|
81
|
+
return [];
|
|
82
|
+
const obj = body;
|
|
83
|
+
const raw = obj["blocks"];
|
|
84
|
+
if (!Array.isArray(raw))
|
|
85
|
+
return [];
|
|
86
|
+
const out = [];
|
|
87
|
+
for (const entry of raw) {
|
|
88
|
+
if (entry === null || typeof entry !== "object")
|
|
89
|
+
continue;
|
|
90
|
+
const e = entry;
|
|
91
|
+
const block_id = e["block_id"];
|
|
92
|
+
const file = e["file"];
|
|
93
|
+
const lang = e["lang"];
|
|
94
|
+
const start_offset = e["start_offset"];
|
|
95
|
+
const end_offset = e["end_offset"];
|
|
96
|
+
const rawText = e["raw"];
|
|
97
|
+
if (typeof block_id !== "string" ||
|
|
98
|
+
typeof file !== "string" ||
|
|
99
|
+
typeof lang !== "string" ||
|
|
100
|
+
typeof start_offset !== "number" ||
|
|
101
|
+
typeof end_offset !== "number") {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
out.push({
|
|
105
|
+
block_id,
|
|
106
|
+
file,
|
|
107
|
+
lang,
|
|
108
|
+
start_offset,
|
|
109
|
+
end_offset,
|
|
110
|
+
...(typeof rawText === "string" ? { raw: rawText } : {}),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
export function findLatestSourceCommentsAudit(repoRoot) {
|
|
116
|
+
const dir = join(repoRoot, ".cairn", "baseline");
|
|
117
|
+
if (!existsSync(dir))
|
|
118
|
+
return null;
|
|
119
|
+
let entries;
|
|
120
|
+
try {
|
|
121
|
+
entries = readdirSync(dir);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const candidates = entries
|
|
127
|
+
.filter((n) => n.startsWith("source-comments-") && n.endsWith(".yaml"))
|
|
128
|
+
.map((name) => {
|
|
129
|
+
const abs = join(dir, name);
|
|
130
|
+
let mtime = 0;
|
|
131
|
+
try {
|
|
132
|
+
mtime = statSync(abs).mtimeMs;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
/* best-effort */
|
|
136
|
+
}
|
|
137
|
+
return { abs, mtime };
|
|
138
|
+
})
|
|
139
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
140
|
+
return candidates[0]?.abs ?? null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Strip the original source-comment block for one accepted DEC and
|
|
144
|
+
* replace it with `// §DEC-NNNN` (or `# §DEC-NNNN` in hash-comment
|
|
145
|
+
* languages). Reads block coordinates from the latest 7b audit YAML;
|
|
146
|
+
* skips when the audit is missing, the block id isn't found, or the
|
|
147
|
+
* source file is dirty (strip-replace's own dirty check).
|
|
148
|
+
*
|
|
149
|
+
* Returns a small summary the MCP / CLI surface can echo back to the
|
|
150
|
+
* operator.
|
|
151
|
+
*/
|
|
152
|
+
export function runDecSourceStrip(args) {
|
|
153
|
+
const blockId = args.meta.blockId;
|
|
154
|
+
if (blockId === null) {
|
|
155
|
+
return {
|
|
156
|
+
attempted: false,
|
|
157
|
+
files_modified: 0,
|
|
158
|
+
items_applied: 0,
|
|
159
|
+
audit_path: null,
|
|
160
|
+
reason: "no-block-id",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const auditPath = findLatestSourceCommentsAudit(args.repoRoot);
|
|
164
|
+
if (auditPath === null) {
|
|
165
|
+
return {
|
|
166
|
+
attempted: false,
|
|
167
|
+
files_modified: 0,
|
|
168
|
+
items_applied: 0,
|
|
169
|
+
audit_path: null,
|
|
170
|
+
reason: "no-audit-found",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
let auditBody;
|
|
174
|
+
try {
|
|
175
|
+
auditBody = parseYaml(readFileSync(auditPath, "utf8"));
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
log.warn({ err: err instanceof Error ? err.message : String(err), auditPath }, "audit parse failed");
|
|
179
|
+
return {
|
|
180
|
+
attempted: false,
|
|
181
|
+
files_modified: 0,
|
|
182
|
+
items_applied: 0,
|
|
183
|
+
audit_path: auditPath,
|
|
184
|
+
reason: "audit-parse-failed",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const blocks = extractAuditBlocks(auditBody);
|
|
188
|
+
const block = blocks.find((b) => b.block_id === blockId);
|
|
189
|
+
if (block === undefined) {
|
|
190
|
+
return {
|
|
191
|
+
attempted: false,
|
|
192
|
+
files_modified: 0,
|
|
193
|
+
items_applied: 0,
|
|
194
|
+
audit_path: auditPath,
|
|
195
|
+
reason: "block-not-found",
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
const replacement = formatBareCitation(block.lang, args.decId);
|
|
199
|
+
// Idempotency: if the file already carries the bare cite, the strip
|
|
200
|
+
// already landed (typical when `cairn fix dec-strip` re-runs after a
|
|
201
|
+
// partial first pass). Surface as `already-stripped` so re-runs don't
|
|
202
|
+
// look like failures.
|
|
203
|
+
const absFile = join(args.repoRoot, block.file);
|
|
204
|
+
if (existsSync(absFile)) {
|
|
205
|
+
try {
|
|
206
|
+
const current = readFileSync(absFile, "utf8");
|
|
207
|
+
if (current.includes(replacement)) {
|
|
208
|
+
return {
|
|
209
|
+
attempted: false,
|
|
210
|
+
files_modified: 0,
|
|
211
|
+
items_applied: 0,
|
|
212
|
+
audit_path: auditPath,
|
|
213
|
+
reason: "already-stripped",
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
/* fall through to the strip path */
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Phase 7b's INV strip pass already mutated the same source file inline
|
|
222
|
+
// for any constraint blocks it found, so by accept time the file is
|
|
223
|
+
// virtually always "dirty" against HEAD AND the recorded byte offsets
|
|
224
|
+
// for OTHER blocks in that same file have shifted. Try the recorded
|
|
225
|
+
// offsets first (cheapest path); on `range-mismatch` fall back to a
|
|
226
|
+
// content search for `block.raw` and re-issue with current offsets.
|
|
227
|
+
// Operator consented to source mutation at adoption time — pass
|
|
228
|
+
// `overwrite` so the dirty check doesn't bail.
|
|
229
|
+
const buildItem = (startOffset, endOffset) => ({
|
|
230
|
+
blockId,
|
|
231
|
+
file: block.file,
|
|
232
|
+
startOffset,
|
|
233
|
+
endOffset,
|
|
234
|
+
replacement,
|
|
235
|
+
...(block.raw !== undefined ? { expectedRaw: block.raw } : {}),
|
|
236
|
+
});
|
|
237
|
+
const item = buildItem(block.start_offset, block.end_offset);
|
|
238
|
+
let result;
|
|
239
|
+
try {
|
|
240
|
+
result = applyStripReplace({
|
|
241
|
+
repoRoot: args.repoRoot,
|
|
242
|
+
items: [item],
|
|
243
|
+
dirtyDecisions: { [block.file]: "overwrite" },
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
log.warn({ err: err instanceof Error ? err.message : String(err), decId: args.decId, blockId }, "strip-replace failed");
|
|
248
|
+
return {
|
|
249
|
+
attempted: true,
|
|
250
|
+
files_modified: 0,
|
|
251
|
+
items_applied: 0,
|
|
252
|
+
audit_path: auditPath,
|
|
253
|
+
reason: "strip-failed",
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// applyStripReplace runs successfully but can still return zero items
|
|
257
|
+
// applied (range-mismatch when audit offsets are stale, missing-file,
|
|
258
|
+
// overlap, etc.). Surface the underlying reason instead of swallowing
|
|
259
|
+
// it as "unknown" — `cairn fix dec-strip` and the resolve-attention
|
|
260
|
+
// skill both need the operator-facing detail.
|
|
261
|
+
if (result.itemsApplied === 0) {
|
|
262
|
+
const fileOutcome = result.files.find((f) => f.file === block.file);
|
|
263
|
+
const itemReason = fileOutcome?.itemsSkipped.find((s) => s.blockId === blockId)
|
|
264
|
+
?.reason;
|
|
265
|
+
const reason = itemReason ?? fileOutcome?.fileSkipReason ?? "no-items-applied";
|
|
266
|
+
// Content-search fallback: when the audit's recorded offsets no
|
|
267
|
+
// longer match the file (because earlier INV / DEC strips shifted
|
|
268
|
+
// bytes), look up `block.raw` directly in the current file and
|
|
269
|
+
// re-issue with the current range. Only attempted on
|
|
270
|
+
// range-mismatch — every other reason (missing-file, dirty-skipped,
|
|
271
|
+
// overlap) needs operator action, not a coordinate retry.
|
|
272
|
+
if (reason === "range-mismatch" && block.raw !== undefined) {
|
|
273
|
+
const current = findCurrentRange(args.repoRoot, block.file, block.raw);
|
|
274
|
+
if (current !== null) {
|
|
275
|
+
const retryItem = buildItem(current.startOffset, current.endOffset);
|
|
276
|
+
try {
|
|
277
|
+
const retryResult = applyStripReplace({
|
|
278
|
+
repoRoot: args.repoRoot,
|
|
279
|
+
items: [retryItem],
|
|
280
|
+
dirtyDecisions: { [block.file]: "overwrite" },
|
|
281
|
+
});
|
|
282
|
+
if (retryResult.itemsApplied > 0) {
|
|
283
|
+
return {
|
|
284
|
+
attempted: true,
|
|
285
|
+
files_modified: retryResult.filesModified,
|
|
286
|
+
items_applied: retryResult.itemsApplied,
|
|
287
|
+
audit_path: auditPath,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
const retryFile = retryResult.files.find((f) => f.file === block.file);
|
|
291
|
+
const retryReason = retryFile?.itemsSkipped.find((s) => s.blockId === blockId)?.reason ??
|
|
292
|
+
retryFile?.fileSkipReason ??
|
|
293
|
+
"range-mismatch";
|
|
294
|
+
return {
|
|
295
|
+
attempted: true,
|
|
296
|
+
files_modified: 0,
|
|
297
|
+
items_applied: 0,
|
|
298
|
+
audit_path: auditPath,
|
|
299
|
+
reason: retryReason,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
log.warn({
|
|
304
|
+
err: err instanceof Error ? err.message : String(err),
|
|
305
|
+
decId: args.decId,
|
|
306
|
+
blockId,
|
|
307
|
+
}, "strip-replace content-search retry failed");
|
|
308
|
+
return {
|
|
309
|
+
attempted: true,
|
|
310
|
+
files_modified: 0,
|
|
311
|
+
items_applied: 0,
|
|
312
|
+
audit_path: auditPath,
|
|
313
|
+
reason: "strip-failed",
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
attempted: true,
|
|
319
|
+
files_modified: 0,
|
|
320
|
+
items_applied: 0,
|
|
321
|
+
audit_path: auditPath,
|
|
322
|
+
reason: "raw-not-in-file",
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
attempted: true,
|
|
327
|
+
files_modified: 0,
|
|
328
|
+
items_applied: 0,
|
|
329
|
+
audit_path: auditPath,
|
|
330
|
+
reason,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
attempted: true,
|
|
335
|
+
files_modified: result.filesModified,
|
|
336
|
+
items_applied: result.itemsApplied,
|
|
337
|
+
audit_path: auditPath,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=source-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-strip.js","sourceRoot":"","sources":["../../src/attention/source-strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Haiku response cache.
|
|
3
|
+
*
|
|
4
|
+
* Adoption re-runs are common — operators bail out, restart, or
|
|
5
|
+
* `cairn init --force` on the same repo before drift catches up. Each
|
|
6
|
+
* re-run otherwise burns the operator's coding-plan quota on identical
|
|
7
|
+
* Haiku calls. This module memoizes responses keyed on the full
|
|
8
|
+
* input fingerprint (tier + model + system + prompt + jsonSchema). 30-day
|
|
9
|
+
* TTL — long enough to cover typical adoption-iterate cycles, short
|
|
10
|
+
* enough that semantic prompt changes invalidate stale entries.
|
|
11
|
+
*
|
|
12
|
+
* Cache files live under `.cairn/cache/haiku/<sha256>.json`. The path
|
|
13
|
+
* is added to `.cairn/.gitignore` at adoption time so cached responses
|
|
14
|
+
* never enter version control.
|
|
15
|
+
*
|
|
16
|
+
* The cache is opt-in per call via `runClaude({ cacheable: true })`.
|
|
17
|
+
* Callers should only enable it for tier `haiku` and pure idempotent
|
|
18
|
+
* classification work — anything that depends on filesystem state at
|
|
19
|
+
* call time (e.g. mapper module slices) must never be cached.
|
|
20
|
+
*/
|
|
21
|
+
import type { RunClaudeOptions, RunClaudeResult } from "./types.js";
|
|
22
|
+
/**
|
|
23
|
+
* Read a cached response if one exists and is within TTL. Returns null
|
|
24
|
+
* on miss, expired entry, or unreadable cache file.
|
|
25
|
+
*/
|
|
26
|
+
export declare function cacheLookup(repoRoot: string, opts: RunClaudeOptions): RunClaudeResult | null;
|
|
27
|
+
/**
|
|
28
|
+
* Persist the result of a Haiku call so the next identical input hits
|
|
29
|
+
* the cache instead of re-issuing.
|
|
30
|
+
*/
|
|
31
|
+
export declare function cacheStore(repoRoot: string, opts: RunClaudeOptions, result: RunClaudeResult, ttlMs?: number): void;
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/claude/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/claude/error.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* Used by both `claude/runner.ts` (one-shot calls) and
|
|
12
12
|
* `orchestrator/runner.ts` (stream-json implementer runs).
|
|
13
13
|
*/
|
|
14
|
-
export type ClaudeErrorKind = "rate_limit" | "overloaded" | "auth" | "other";
|
|
14
|
+
export type ClaudeErrorKind = "rate_limit" | "overloaded" | "auth" | "timeout" | "other";
|
|
15
15
|
export declare class ClaudeError extends Error {
|
|
16
16
|
readonly kind: ClaudeErrorKind;
|
|
17
17
|
readonly exitCode: number | undefined;
|
package/dist/claude/error.js
CHANGED
|
@@ -28,6 +28,11 @@ const RATE_LIMIT_RE = /rate[\s_-]?limit|\b429\b|too many requests|usage_limit/i;
|
|
|
28
28
|
const OVERLOADED_RE = /overloaded|\b529\b|temporarily unavailable|service.?unavailable|\b503\b/i;
|
|
29
29
|
const AUTH_RE = /unauthorized|forbidden|\b401\b|\b403\b|authentication|please[\s_-]+log[\s_-]?in|not[\s_-]+authenticated|invalid[\s_-]+api[\s_-]+key|api[\s_-]+key[\s_-]+expired|credit[\s_-]+balance[\s_-]+is[\s_-]+too[\s_-]+low/i;
|
|
30
30
|
export function classifyClaudeError(args) {
|
|
31
|
+
// SIGTERM (143) — AbortController firing on timeout. Classify as timeout
|
|
32
|
+
// for trace observability so sensors can flag stuck calls distinctly from
|
|
33
|
+
// generic failures.
|
|
34
|
+
if (args.exitCode === 143)
|
|
35
|
+
return "timeout";
|
|
31
36
|
const text = `${args.message}\n${args.stderr ?? ""}`;
|
|
32
37
|
if (RATE_LIMIT_RE.test(text))
|
|
33
38
|
return "rate_limit";
|
package/dist/claude/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/claude/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/claude/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,QAAQ,CAAqB;IAC7B,MAAM,CAAqB;IAEpC,YAAY,IAKX;QACC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,aAAa,GAAG,yDAAyD,CAAC;AAChF,MAAM,aAAa,GAAG,0EAA0E,CAAC;AACjG,MAAM,OAAO,GACX,oNAAoN,CAAC;AAEvN,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,yEAAyE;IACzE,0EAA0E;IAC1E,oBAAoB;IACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,cAAuB;IACjE,IAAI,GAAG,YAAY,WAAW;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,OAAO;QACP,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,OAAO,IAAI,WAAW,CAAC;QACrB,OAAO;QACP,IAAI;QACJ,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;AACL,CAAC"}
|
package/dist/claude/runner.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
2
3
|
import { logger } from "../logger.js";
|
|
3
4
|
import { appendTrace } from "../trace/index.js";
|
|
5
|
+
import { cacheLookup, cacheStore } from "./cache.js";
|
|
4
6
|
import { ClaudeError, classifyClaudeError } from "./error.js";
|
|
5
7
|
const log = logger("claude.runner");
|
|
6
8
|
/** Cap previewed text in trace so payloads stay scannable (full body still in stderr/stdout if needed). */
|
|
@@ -34,6 +36,14 @@ export function claudeIsAvailable() {
|
|
|
34
36
|
* the operator's Claude Code coding-plan subscription quota.
|
|
35
37
|
*/
|
|
36
38
|
export async function runClaude(opts) {
|
|
39
|
+
// Cache lookup happens before subprocess spawn so a hit short-circuits
|
|
40
|
+
// the whole flow including the trace request event. Only haiku tier
|
|
41
|
+
// is cached — see cache.ts module docstring for why.
|
|
42
|
+
if (opts.cacheable === true && opts.tier === "haiku" && opts.repoRoot !== undefined) {
|
|
43
|
+
const hit = cacheLookup(opts.repoRoot, opts);
|
|
44
|
+
if (hit !== null)
|
|
45
|
+
return hit;
|
|
46
|
+
}
|
|
37
47
|
const model = TIER_MODEL[opts.tier];
|
|
38
48
|
const args = [
|
|
39
49
|
"--print",
|
|
@@ -49,6 +59,14 @@ export async function runClaude(opts) {
|
|
|
49
59
|
if (opts.jsonSchema !== undefined) {
|
|
50
60
|
args.push("--json-schema", JSON.stringify(opts.jsonSchema));
|
|
51
61
|
}
|
|
62
|
+
// Isolate ambient context: drop user-level CLAUDE.md, project-hierarchy
|
|
63
|
+
// CLAUDE.md, MCP tools, and plugin slash commands so the call sees only
|
|
64
|
+
// the caller-supplied prompt + system. Subprocess runs from
|
|
65
|
+
// `os.tmpdir()` so no CLAUDE.md ancestor chain auto-loads. Caller still
|
|
66
|
+
// pays for whatever they explicitly include in the prompt.
|
|
67
|
+
if (opts.isolateAmbientContext === true) {
|
|
68
|
+
args.push("--setting-sources", "project,local", "--tools", "", "--disable-slash-commands");
|
|
69
|
+
}
|
|
52
70
|
if (opts.extraArgs && opts.extraArgs.length > 0) {
|
|
53
71
|
args.push(...opts.extraArgs);
|
|
54
72
|
}
|
|
@@ -73,21 +91,56 @@ export async function runClaude(opts) {
|
|
|
73
91
|
...(opts.system !== undefined ? { system_preview: preview(opts.system) } : {}),
|
|
74
92
|
},
|
|
75
93
|
});
|
|
94
|
+
// Subprocess cwd: when isolating ambient context, route to os.tmpdir()
|
|
95
|
+
// so the CLAUDE.md ancestor chain doesn't auto-load. Otherwise honor
|
|
96
|
+
// the caller's cwd (mapper needs the repo cwd for tool access).
|
|
97
|
+
const subprocessCwd = opts.isolateAmbientContext === true
|
|
98
|
+
? tmpdir()
|
|
99
|
+
: opts.cwd ?? process.cwd();
|
|
76
100
|
return new Promise((resolve, reject) => {
|
|
77
101
|
const child = spawn("claude", args, {
|
|
78
|
-
cwd:
|
|
102
|
+
cwd: subprocessCwd,
|
|
79
103
|
stdio: ["pipe", "pipe", "pipe"],
|
|
80
104
|
signal: ctrl.signal,
|
|
81
105
|
});
|
|
82
106
|
const stdoutChunks = [];
|
|
83
107
|
const stderrChunks = [];
|
|
108
|
+
let settled = false;
|
|
84
109
|
child.stdout.on("data", (chunk) => stdoutChunks.push(chunk));
|
|
85
110
|
child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
|
|
86
111
|
child.on("error", (err) => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
87
115
|
clearTimeout(timer);
|
|
116
|
+
const isAbort = err.name === "AbortError";
|
|
117
|
+
if (isAbort) {
|
|
118
|
+
const message = `claude timed out after ${timeoutMs}ms`;
|
|
119
|
+
appendTrace({
|
|
120
|
+
ts: new Date().toISOString(),
|
|
121
|
+
source: "claude",
|
|
122
|
+
kind: "response",
|
|
123
|
+
repo_root: opts.repoRoot ?? null,
|
|
124
|
+
session_id: opts.sessionId ?? null,
|
|
125
|
+
duration_ms: Date.now() - startedAt,
|
|
126
|
+
ok: false,
|
|
127
|
+
payload: {
|
|
128
|
+
tier: opts.tier,
|
|
129
|
+
model,
|
|
130
|
+
purpose: opts.purpose ?? null,
|
|
131
|
+
error_kind: "timeout",
|
|
132
|
+
exit_code: 143,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
reject(new ClaudeError({ message, kind: "timeout", exitCode: 143 }));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
88
138
|
reject(err);
|
|
89
139
|
});
|
|
90
140
|
child.on("close", (code) => {
|
|
141
|
+
if (settled)
|
|
142
|
+
return;
|
|
143
|
+
settled = true;
|
|
91
144
|
clearTimeout(timer);
|
|
92
145
|
const stdout = Buffer.concat(stdoutChunks).toString("utf8");
|
|
93
146
|
const stderr = Buffer.concat(stderrChunks).toString("utf8");
|
|
@@ -176,7 +229,7 @@ export async function runClaude(opts) {
|
|
|
176
229
|
parsed_present: parsed !== undefined,
|
|
177
230
|
},
|
|
178
231
|
});
|
|
179
|
-
|
|
232
|
+
const result = {
|
|
180
233
|
text,
|
|
181
234
|
...(parsed !== undefined ? { parsed } : {}),
|
|
182
235
|
durationMs,
|
|
@@ -184,7 +237,11 @@ export async function runClaude(opts) {
|
|
|
184
237
|
model,
|
|
185
238
|
envelope,
|
|
186
239
|
...(usage !== undefined ? { usage } : {}),
|
|
187
|
-
}
|
|
240
|
+
};
|
|
241
|
+
if (opts.cacheable === true && opts.tier === "haiku" && opts.repoRoot !== undefined) {
|
|
242
|
+
cacheStore(opts.repoRoot, opts, result);
|
|
243
|
+
}
|
|
244
|
+
resolve(result);
|
|
188
245
|
});
|
|
189
246
|
child.stdin.write(opts.prompt);
|
|
190
247
|
child.stdin.end();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/claude/runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/claude/runner.ts"],"names":[],"mappings":"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"}
|