@isaacriehm/cairn-core 0.3.8 → 0.4.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.
Files changed (94) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/attention/bulk-accept.d.ts +18 -0
  3. package/dist/attention/bulk-accept.js +46 -0
  4. package/dist/attention/bulk-accept.js.map +1 -1
  5. package/dist/attention/dedup.d.ts +68 -0
  6. package/dist/attention/dedup.js +239 -0
  7. package/dist/attention/dedup.js.map +1 -0
  8. package/dist/attention/index.d.ts +3 -0
  9. package/dist/attention/index.js +3 -0
  10. package/dist/attention/index.js.map +1 -1
  11. package/dist/attention/restore.d.ts +43 -0
  12. package/dist/attention/restore.js +127 -0
  13. package/dist/attention/restore.js.map +1 -0
  14. package/dist/attention/source-strip.d.ts +49 -0
  15. package/dist/attention/source-strip.js +340 -0
  16. package/dist/attention/source-strip.js.map +1 -0
  17. package/dist/claude/cache.d.ts +31 -0
  18. package/dist/claude/cache.js +0 -0
  19. package/dist/claude/cache.js.map +1 -0
  20. package/dist/claude/error.d.ts +1 -1
  21. package/dist/claude/error.js +5 -0
  22. package/dist/claude/error.js.map +1 -1
  23. package/dist/claude/runner.js +60 -3
  24. package/dist/claude/runner.js.map +1 -1
  25. package/dist/claude/types.d.ts +25 -0
  26. package/dist/hooks/runners/session-start.js +24 -2
  27. package/dist/hooks/runners/session-start.js.map +1 -1
  28. package/dist/init/baseline-audit.d.ts +8 -0
  29. package/dist/init/baseline-audit.js +1 -1
  30. package/dist/init/baseline-audit.js.map +1 -1
  31. package/dist/init/brand-derive.js +53 -34
  32. package/dist/init/brand-derive.js.map +1 -1
  33. package/dist/init/index.d.ts +4 -2
  34. package/dist/init/index.js +3 -1
  35. package/dist/init/index.js.map +1 -1
  36. package/dist/init/ingest-docs.d.ts +7 -0
  37. package/dist/init/ingest-docs.js +4 -1
  38. package/dist/init/ingest-docs.js.map +1 -1
  39. package/dist/init/mapper-merge.js +1 -0
  40. package/dist/init/mapper-merge.js.map +1 -1
  41. package/dist/init/phases/3-mapper.js +18 -0
  42. package/dist/init/phases/3-mapper.js.map +1 -1
  43. package/dist/init/phases/5-brand.js +3 -0
  44. package/dist/init/phases/5-brand.js.map +1 -1
  45. package/dist/init/phases/6-docs-ingest.js +14 -0
  46. package/dist/init/phases/6-docs-ingest.js.map +1 -1
  47. package/dist/init/phases/7b-source-comments.d.ts +9 -0
  48. package/dist/init/phases/7b-source-comments.js +41 -1
  49. package/dist/init/phases/7b-source-comments.js.map +1 -1
  50. package/dist/init/phases/7c-rules-merge.js +10 -0
  51. package/dist/init/phases/7c-rules-merge.js.map +1 -1
  52. package/dist/init/phases/index.d.ts +2 -0
  53. package/dist/init/phases/index.js +2 -0
  54. package/dist/init/phases/index.js.map +1 -1
  55. package/dist/init/phases/parallel-678.d.ts +31 -0
  56. package/dist/init/phases/parallel-678.js +205 -0
  57. package/dist/init/phases/parallel-678.js.map +1 -0
  58. package/dist/init/phases/source-comments-output-io.d.ts +78 -0
  59. package/dist/init/phases/source-comments-output-io.js +84 -0
  60. package/dist/init/phases/source-comments-output-io.js.map +1 -0
  61. package/dist/init/progress.d.ts +35 -0
  62. package/dist/init/progress.js +71 -0
  63. package/dist/init/progress.js.map +1 -0
  64. package/dist/init/rules-merge/ingest.d.ts +14 -0
  65. package/dist/init/rules-merge/ingest.js +8 -2
  66. package/dist/init/rules-merge/ingest.js.map +1 -1
  67. package/dist/init/seed.js +48 -21
  68. package/dist/init/seed.js.map +1 -1
  69. package/dist/init/source-comments/classify.d.ts +6 -0
  70. package/dist/init/source-comments/classify.js +60 -3
  71. package/dist/init/source-comments/classify.js.map +1 -1
  72. package/dist/init/source-comments/ingest.d.ts +21 -0
  73. package/dist/init/source-comments/ingest.js +28 -3
  74. package/dist/init/source-comments/ingest.js.map +1 -1
  75. package/dist/mcp/tools/attention-dedup.d.ts +21 -0
  76. package/dist/mcp/tools/attention-dedup.js +34 -0
  77. package/dist/mcp/tools/attention-dedup.js.map +1 -0
  78. package/dist/mcp/tools/attention-restore.d.ts +14 -0
  79. package/dist/mcp/tools/attention-restore.js +22 -0
  80. package/dist/mcp/tools/attention-restore.js.map +1 -0
  81. package/dist/mcp/tools/index.js +6 -1
  82. package/dist/mcp/tools/index.js.map +1 -1
  83. package/dist/mcp/tools/init-phases.d.ts +1 -0
  84. package/dist/mcp/tools/init-phases.js +88 -1
  85. package/dist/mcp/tools/init-phases.js.map +1 -1
  86. package/dist/mcp/tools/resolve-attention.js +44 -141
  87. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  88. package/dist/status-line/format.d.ts +4 -1
  89. package/dist/status-line/format.js +26 -3
  90. package/dist/status-line/format.js.map +1 -1
  91. package/dist/status-line/reader.js +25 -1
  92. package/dist/status-line/reader.js.map +1 -1
  93. package/package.json +1 -1
  94. 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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"}
@@ -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;
@@ -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";
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/claude/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,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,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"}
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"}
@@ -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: opts.cwd ?? process.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
- resolve({
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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"}