greprag 5.41.0 → 5.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/archive/glyph-font.d.ts +22 -0
  2. package/dist/archive/glyph-font.js +72 -0
  3. package/dist/archive/glyph-font.js.map +1 -0
  4. package/dist/archive/page-renderer.d.ts +67 -0
  5. package/dist/archive/page-renderer.js +197 -0
  6. package/dist/archive/page-renderer.js.map +1 -0
  7. package/dist/archive/png-codec.d.ts +21 -0
  8. package/dist/archive/png-codec.js +197 -0
  9. package/dist/archive/png-codec.js.map +1 -0
  10. package/dist/archive/transcript-extract.d.ts +39 -0
  11. package/dist/archive/transcript-extract.js +187 -0
  12. package/dist/archive/transcript-extract.js.map +1 -0
  13. package/dist/ccr-store.d.ts +49 -0
  14. package/dist/ccr-store.js +171 -0
  15. package/dist/ccr-store.js.map +1 -0
  16. package/dist/commands/archive.d.ts +81 -0
  17. package/dist/commands/archive.js +358 -0
  18. package/dist/commands/archive.js.map +1 -0
  19. package/dist/commands/context-governor.d.ts +82 -0
  20. package/dist/commands/context-governor.js +344 -0
  21. package/dist/commands/context-governor.js.map +1 -0
  22. package/dist/commands/crush-stats.d.ts +36 -0
  23. package/dist/commands/crush-stats.js +142 -0
  24. package/dist/commands/crush-stats.js.map +1 -0
  25. package/dist/commands/crush.d.ts +24 -0
  26. package/dist/commands/crush.js +183 -0
  27. package/dist/commands/crush.js.map +1 -0
  28. package/dist/commands/inbox-watch-supervisor.js +8 -65
  29. package/dist/commands/inbox-watch-supervisor.js.map +1 -1
  30. package/dist/commands/init.js +93 -0
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/pipe-wrap.d.ts +75 -0
  33. package/dist/commands/pipe-wrap.js +255 -0
  34. package/dist/commands/pipe-wrap.js.map +1 -0
  35. package/dist/commands/watcher-registry.d.ts +1 -8
  36. package/dist/commands/watcher-registry.js +10 -47
  37. package/dist/commands/watcher-registry.js.map +1 -1
  38. package/dist/crush/adaptive-sizer.d.ts +40 -0
  39. package/dist/crush/adaptive-sizer.js +156 -0
  40. package/dist/crush/adaptive-sizer.js.map +1 -0
  41. package/dist/crush/crush-keywords.d.ts +40 -0
  42. package/dist/crush/crush-keywords.js +110 -0
  43. package/dist/crush/crush-keywords.js.map +1 -0
  44. package/dist/crush/crush-types.d.ts +38 -0
  45. package/dist/crush/crush-types.js +36 -0
  46. package/dist/crush/crush-types.js.map +1 -0
  47. package/dist/crush/index.d.ts +16 -0
  48. package/dist/crush/index.js +48 -0
  49. package/dist/crush/index.js.map +1 -0
  50. package/dist/crush/json-crusher.d.ts +38 -0
  51. package/dist/crush/json-crusher.js +250 -0
  52. package/dist/crush/json-crusher.js.map +1 -0
  53. package/dist/crush/json-detectors.d.ts +48 -0
  54. package/dist/crush/json-detectors.js +211 -0
  55. package/dist/crush/json-detectors.js.map +1 -0
  56. package/dist/crush/log-compressor.d.ts +60 -0
  57. package/dist/crush/log-compressor.js +394 -0
  58. package/dist/crush/log-compressor.js.map +1 -0
  59. package/dist/crush/search-compressor.d.ts +60 -0
  60. package/dist/crush/search-compressor.js +210 -0
  61. package/dist/crush/search-compressor.js.map +1 -0
  62. package/dist/hook.js +49 -1
  63. package/dist/hook.js.map +1 -1
  64. package/dist/index.js +487 -449
  65. package/dist/index.js.map +1 -1
  66. package/dist/session-id.js +7 -12
  67. package/dist/session-id.js.map +1 -1
  68. package/package.json +2 -2
  69. package/skill/mechanic/SKILL.md +1 -1
  70. package/skill/templates/chip-spawn.md +4 -2
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ // adr: adr/governed-compact.md
3
+ /** greprag archive — the governed compact's PNG archive.
4
+ *
5
+ * Before compaction summarizes history away, the PreCompact hook renders
6
+ * the transcript's main chain to dense pixel-font PNGs (Snapcompact
7
+ * pattern: ~3x token density via the vision path) and indexes every page
8
+ * in the CCR store. After compaction, a SessionStart(matcher=compact)
9
+ * hook injects a pointer so the post-compact model knows the verbatim
10
+ * record exists and can Read the pages back.
11
+ *
12
+ * Verified hook contract (2026-06-12, code.claude.com/docs/en/hooks):
13
+ * PreCompact CANNOT inject or modify compaction instructions — so the
14
+ * instructions ship as a documented `/compact <snippet>` block
15
+ * (`greprag archive snippet`) referenced by the context governor's
16
+ * advisory, and the post-compact pointer rides SessionStart(compact),
17
+ * whose stdout/additionalContext IS added to context.
18
+ *
19
+ * Surfaces:
20
+ * greprag archive render --transcript <path> [--out-dir <dir>] [--session <8hex>]
21
+ * greprag archive list [--session <8hex>]
22
+ * greprag archive snippet [--session <8hex>]
23
+ * hook: runPreCompactArchive (PreCompact), buildArchivePointer (SessionStart)
24
+ */
25
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ var desc = Object.getOwnPropertyDescriptor(m, k);
28
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
29
+ desc = { enumerable: true, get: function() { return m[k]; } };
30
+ }
31
+ Object.defineProperty(o, k2, desc);
32
+ }) : (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ o[k2] = m[k];
35
+ }));
36
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
37
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
38
+ }) : function(o, v) {
39
+ o["default"] = v;
40
+ });
41
+ var __importStar = (this && this.__importStar) || (function () {
42
+ var ownKeys = function(o) {
43
+ ownKeys = Object.getOwnPropertyNames || function (o) {
44
+ var ar = [];
45
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
46
+ return ar;
47
+ };
48
+ return ownKeys(o);
49
+ };
50
+ return function (mod) {
51
+ if (mod && mod.__esModule) return mod;
52
+ var result = {};
53
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
54
+ __setModuleDefault(result, mod);
55
+ return result;
56
+ };
57
+ })();
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.ARCHIVE_HELP = exports.SOURCE_TYPE = void 0;
60
+ exports.archiveEnabled = archiveEnabled;
61
+ exports.defaultArchiveDir = defaultArchiveDir;
62
+ exports.renderArchive = renderArchive;
63
+ exports.listArchives = listArchives;
64
+ exports.buildCompactSnippet = buildCompactSnippet;
65
+ exports.runPreCompactArchive = runPreCompactArchive;
66
+ exports.buildArchivePointer = buildArchivePointer;
67
+ exports.runArchive = runArchive;
68
+ const fs = __importStar(require("fs"));
69
+ const os = __importStar(require("os"));
70
+ const path = __importStar(require("path"));
71
+ const crypto = __importStar(require("crypto"));
72
+ const session_id_1 = require("../session-id");
73
+ const project_anchor_1 = require("../project-anchor");
74
+ const ccr_store_1 = require("../ccr-store");
75
+ const page_renderer_1 = require("../archive/page-renderer");
76
+ const transcript_extract_1 = require("../archive/transcript-extract");
77
+ exports.SOURCE_TYPE = 'png-archive';
78
+ exports.ARCHIVE_HELP = `greprag archive — PNG archive of the pre-compact transcript (governed compact).
79
+
80
+ greprag archive render --transcript <path> [--out-dir <dir>] [--session <8hex>]
81
+ Render the transcript's main chain to 1568x1568 pixel-font PNGs
82
+ (${page_renderer_1.COLS}x${page_renderer_1.ROWS} grid, ~${Math.round(page_renderer_1.CHARS_PER_PAGE / 1000)}K chars/page), self-test the pixel round-trip,
83
+ and index every page in the CCR store.
84
+
85
+ greprag archive list [--session <8hex>]
86
+ Show indexed archives with page -> turn ranges, so a model knows
87
+ which PNG to Read for a given stretch of history.
88
+
89
+ greprag archive snippet [--session <8hex>]
90
+ Print the documented /compact instruction block (preserve-verbatim /
91
+ compress-aggressively rules + the archive pointer line).
92
+
93
+ The PreCompact hook runs render automatically before every compaction
94
+ (off-switch: png_archive=false in .greprag/project.json, or
95
+ GREPRAG_PNG_ARCHIVE=off). After compaction, a SessionStart(compact) hook
96
+ injects the archive pointer into the fresh context.
97
+
98
+ Files: ~/.greprag/png-archive/<session>/archive-<renderId>-pNNN.png
99
+ Index: CCR store (~/.greprag/ccr.db, override GREPRAG_CCR_DB), source_type '${exports.SOURCE_TYPE}'.`;
100
+ // ---------- Config (anchor-settings pattern, governor precedent) --------------
101
+ function archiveEnabled(cwd) {
102
+ let enabled = true;
103
+ try {
104
+ const anchor = (0, project_anchor_1.readAnchor)(cwd);
105
+ const raw = JSON.parse(fs.readFileSync(anchor.anchorPath, 'utf-8'));
106
+ if (raw.png_archive === false)
107
+ enabled = false;
108
+ }
109
+ catch { /* no anchor — default stands */ }
110
+ const env = process.env.GREPRAG_PNG_ARCHIVE;
111
+ if (env) {
112
+ if (/^(1|true|yes|on)$/i.test(env))
113
+ enabled = true;
114
+ else if (/^(0|false|no|off)$/i.test(env))
115
+ enabled = false;
116
+ }
117
+ return enabled;
118
+ }
119
+ // ---------- Paths + metadata ---------------------------------------------------
120
+ function defaultArchiveDir(session) {
121
+ return path.join(os.homedir(), '.greprag', 'png-archive', session);
122
+ }
123
+ function sessionFromTranscriptPath(transcriptPath) {
124
+ return (0, session_id_1.truncateSessionId)(path.basename(transcriptPath).replace(/\.jsonl$/i, ''));
125
+ }
126
+ /** Render a transcript to PNG pages, self-test, write, and index. */
127
+ async function renderArchive(opts) {
128
+ const extracted = (0, transcript_extract_1.extractTranscriptFile)(opts.transcriptPath);
129
+ if (!extracted || !extracted.text.trim())
130
+ return null;
131
+ const session = (0, session_id_1.truncateSessionId)(opts.session)
132
+ || sessionFromTranscriptPath(opts.transcriptPath)
133
+ || 'unknown';
134
+ const outDir = opts.outDir || defaultArchiveDir(session);
135
+ const { sanitized, marks } = (0, page_renderer_1.sanitizeWithMarks)(extracted.text, extracted.turnMarks);
136
+ const renderId = crypto.createHash('sha256').update(sanitized, 'utf8').digest('hex').slice(0, 8);
137
+ const pages = (0, page_renderer_1.paginate)((0, page_renderer_1.layoutRows)(sanitized));
138
+ fs.mkdirSync(outDir, { recursive: true });
139
+ const files = [];
140
+ const metas = [];
141
+ let selfTestError = null;
142
+ for (let i = 0; i < pages.length; i++) {
143
+ const rendered = (0, page_renderer_1.renderPage)(pages[i]);
144
+ const err = (0, page_renderer_1.verifyRoundTrip)(rendered);
145
+ if (err && !selfTestError)
146
+ selfTestError = `page ${i + 1}: ${err}`;
147
+ const file = path.join(outDir, `archive-${renderId}-p${String(i + 1).padStart(3, '0')}.png`);
148
+ fs.writeFileSync(file, rendered.png);
149
+ files.push(file);
150
+ const { turnStart, turnEnd } = (0, transcript_extract_1.turnRangeForWindow)(marks, rendered.charStart, rendered.charEnd);
151
+ metas.push({
152
+ kind: exports.SOURCE_TYPE,
153
+ session,
154
+ renderId,
155
+ file,
156
+ page: i + 1,
157
+ pages: pages.length,
158
+ charStart: rendered.charStart,
159
+ charEnd: rendered.charEnd,
160
+ chars: rendered.charEnd - rendered.charStart,
161
+ turnStart,
162
+ turnEnd,
163
+ });
164
+ }
165
+ // Index every page in the CCR store — content is the meta JSON, so
166
+ // `greprag retrieve <hash>` on a page hash returns the pointer record.
167
+ const store = await ccr_store_1.CcrStore.open();
168
+ try {
169
+ for (const meta of metas)
170
+ store.put(JSON.stringify(meta), exports.SOURCE_TYPE);
171
+ }
172
+ finally {
173
+ store.close();
174
+ }
175
+ return {
176
+ session,
177
+ outDir,
178
+ renderId,
179
+ pages: pages.length,
180
+ chars: sanitized.length,
181
+ turns: extracted.turns,
182
+ files,
183
+ selfTestError,
184
+ };
185
+ }
186
+ async function listArchives(session) {
187
+ const store = await ccr_store_1.CcrStore.open();
188
+ let rows;
189
+ try {
190
+ rows = store.listBySourceType(exports.SOURCE_TYPE);
191
+ }
192
+ finally {
193
+ store.close();
194
+ }
195
+ const groups = new Map();
196
+ for (const row of rows) {
197
+ let meta;
198
+ try {
199
+ meta = JSON.parse(row.content);
200
+ }
201
+ catch {
202
+ continue;
203
+ }
204
+ if (meta.kind !== exports.SOURCE_TYPE || !meta.file)
205
+ continue;
206
+ if (session && meta.session !== session)
207
+ continue;
208
+ const key = `${meta.session}/${meta.renderId}`;
209
+ let group = groups.get(key);
210
+ if (!group) {
211
+ group = { session: meta.session, renderId: meta.renderId, createdAt: row.createdAt, pages: [] };
212
+ groups.set(key, group);
213
+ }
214
+ group.pages.push(meta);
215
+ if (row.createdAt > group.createdAt)
216
+ group.createdAt = row.createdAt;
217
+ }
218
+ const out = Array.from(groups.values());
219
+ for (const g of out)
220
+ g.pages.sort((a, b) => a.page - b.page);
221
+ out.sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));
222
+ return out;
223
+ }
224
+ // ---------- /compact snippet -------------------------------------------------------
225
+ function buildCompactSnippet(session) {
226
+ const dir = defaultArchiveDir(session);
227
+ return `/compact Preserve verbatim: current task state; recent decisions and the WHY behind each; every file path touched; unresolved errors; key identifiers (branch names, session ids, commit hashes). Compress aggressively: tool output bulk, exploratory dead ends. End the summary with this exact pointer line: "Full pre-compact history is archived as pixel-text PNGs at ${dir} (greprag archive list --session ${session}) — Read a page with the Read tool when verbatim detail is needed."`;
228
+ }
229
+ /** PreCompact — render + index, return a user-facing systemMessage (or null
230
+ * when disabled/empty/failed). NEVER throws; never blocks compaction. */
231
+ async function runPreCompactArchive(input) {
232
+ try {
233
+ const cwd = input.cwd || process.cwd();
234
+ if (!archiveEnabled(cwd))
235
+ return null;
236
+ if (!input.transcript_path)
237
+ return null;
238
+ const summary = await renderArchive({
239
+ transcriptPath: input.transcript_path,
240
+ session: input.session_id,
241
+ });
242
+ if (!summary)
243
+ return null;
244
+ const warn = summary.selfTestError
245
+ ? ` (WARNING: pixel self-test failed — ${summary.selfTestError})`
246
+ : '';
247
+ return `GrepRAG governed compact: pre-compact history archived as `
248
+ + `${summary.pages} PNG page(s) (turns 1-${summary.turns}, ~${Math.round(summary.chars / 1000)}K chars) `
249
+ + `at ${summary.outDir}${warn}. Post-compact recall: greprag archive list --session ${summary.session}.`;
250
+ }
251
+ catch {
252
+ return null; // fail-open: archiving must never block compaction
253
+ }
254
+ }
255
+ /** SessionStart(matcher=compact) — pointer for the post-compact model.
256
+ * Returns additionalContext text, or null when no archive exists. */
257
+ async function buildArchivePointer(input) {
258
+ try {
259
+ const cwd = input.cwd || process.cwd();
260
+ if (!archiveEnabled(cwd))
261
+ return null;
262
+ const session = (0, session_id_1.truncateSessionId)(input.session_id);
263
+ if (!session)
264
+ return null;
265
+ const groups = await listArchives(session);
266
+ if (groups.length === 0)
267
+ return null;
268
+ const latest = groups[0];
269
+ const last = latest.pages[latest.pages.length - 1];
270
+ const turnEnd = last ? last.turnEnd : 0;
271
+ return `[GrepRAG governed compact: the full pre-compact conversation is archived `
272
+ + `losslessly as pixel-text PNGs (turns 1-${turnEnd}, ${latest.pages.length} page(s), `
273
+ + `~${Math.round(page_renderer_1.CHARS_PER_PAGE / 1000)}K chars each) at ${defaultArchiveDir(session)}. `
274
+ + `Page->turn map: \`greprag archive list --session ${session}\`. When the compact `
275
+ + `summary lacks verbatim detail (exact code, error text, identifiers), Read the `
276
+ + `relevant PNG with the Read tool — it is conversation text rendered as pixels.]`;
277
+ }
278
+ catch {
279
+ return null;
280
+ }
281
+ }
282
+ // ---------- CLI ------------------------------------------------------------------
283
+ function getFlag(args, name) {
284
+ const idx = args.indexOf(name);
285
+ if (idx === -1 || idx + 1 >= args.length)
286
+ return null;
287
+ return args[idx + 1];
288
+ }
289
+ function resolveSessionArg(args) {
290
+ return (0, session_id_1.truncateSessionId)(getFlag(args, '--session')
291
+ || process.env.CLAUDE_CODE_SESSION_ID
292
+ || process.env.CLAUDE_SESSION_ID
293
+ || process.env.GREPRAG_SESSION_ID
294
+ || '');
295
+ }
296
+ async function runArchive(args) {
297
+ const sub = args[0];
298
+ if (!sub || sub === '--help' || sub === '-h' || sub === 'help') {
299
+ console.log(exports.ARCHIVE_HELP);
300
+ return;
301
+ }
302
+ if (sub === 'render') {
303
+ const transcript = getFlag(args, '--transcript');
304
+ if (!transcript) {
305
+ console.error('archive render: --transcript <path> is required');
306
+ process.exit(1);
307
+ }
308
+ const summary = await renderArchive({
309
+ transcriptPath: transcript,
310
+ outDir: getFlag(args, '--out-dir') || undefined,
311
+ session: resolveSessionArg(args) || undefined,
312
+ });
313
+ if (!summary) {
314
+ console.error(`archive render: nothing to archive (unreadable or empty transcript: ${transcript})`);
315
+ process.exit(1);
316
+ }
317
+ console.log(`Archived session ${summary.session} -> ${summary.outDir}`);
318
+ console.log(` render ${summary.renderId}: ${summary.pages} page(s), `
319
+ + `${summary.turns} turn(s), ${summary.chars} chars`);
320
+ for (const f of summary.files)
321
+ console.log(` ${f}`);
322
+ if (summary.selfTestError) {
323
+ console.error(`SELF-TEST FAILED: ${summary.selfTestError}`);
324
+ process.exit(1);
325
+ }
326
+ console.log(' self-test: PASS (pixel round-trip lossless)');
327
+ return;
328
+ }
329
+ if (sub === 'list') {
330
+ const groups = await listArchives(resolveSessionArg(args));
331
+ if (groups.length === 0) {
332
+ console.log('No PNG archives indexed.'
333
+ + ' (They are rendered by the PreCompact hook, or: greprag archive render --transcript <path>)');
334
+ return;
335
+ }
336
+ for (const g of groups) {
337
+ console.log(`Session ${g.session} — render ${g.renderId} (${g.pages.length} page(s), ${g.createdAt})`);
338
+ for (const p of g.pages) {
339
+ console.log(` p${String(p.page).padStart(3, '0')} turns ${p.turnStart}-${p.turnEnd} `
340
+ + `chars ${p.charStart}-${p.charEnd} ${p.file}`);
341
+ }
342
+ }
343
+ return;
344
+ }
345
+ if (sub === 'snippet') {
346
+ const session = resolveSessionArg(args);
347
+ if (!session) {
348
+ console.error('archive snippet: pass --session <8hex> (or run inside a Claude Code session)');
349
+ process.exit(1);
350
+ }
351
+ console.log(buildCompactSnippet(session));
352
+ return;
353
+ }
354
+ console.error(`Unknown subcommand: archive ${sub}\n`);
355
+ console.log(exports.ARCHIVE_HELP);
356
+ process.exit(1);
357
+ }
358
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /** Context governor — tracks the session's live context size every turn and,
2
+ * past a configurable crossover threshold (default 400K tokens), injects a
3
+ * one-line advisory recommending a governed compact.
4
+ *
5
+ * Why 400K: per-turn cache-read overhead is linear in context size N and
6
+ * overtakes the productive cost of a turn at roughly N ≈ 400-425K tokens.
7
+ * Past that, most of each turn's cost is re-reading frozen history — the
8
+ * economically right moment to compact, BEFORE the window forces it.
9
+ * See docs/pre-llm-compression.md (§ cache cost model).
10
+ *
11
+ * Three surfaces, all local (no API, no LLM):
12
+ * - Stop probe (`greprag-hook context-probe`): read the transcript TAIL
13
+ * (last ~64KB, never the whole multi-MB file), compute context size from
14
+ * the most recent main-chain assistant entry's `message.usage`, write
15
+ * ~/.greprag/context-state/<8hex>.json.
16
+ * - UserPromptSubmit check (`greprag-hook context-check`): state over
17
+ * threshold → emit ONE advisory line, at most once per 25-turn window.
18
+ * - CLI (`greprag context status`): debugging/demo readout.
19
+ *
20
+ * Config follows the anchor-settings pattern (email_autosave precedent):
21
+ * `.greprag/project.json` keys `context_governor` (bool) + `context_threshold`
22
+ * (number), env overrides GREPRAG_CONTEXT_GOVERNOR / GREPRAG_CONTEXT_THRESHOLD.
23
+ */
24
+ export declare const DEFAULT_CONTEXT_THRESHOLD = 400000;
25
+ /** Advisory fires at most once per this many turns — never nag every turn. */
26
+ export declare const FIRE_WINDOW_TURNS = 25;
27
+ /** Tail window read from the transcript. The latest assistant entry always
28
+ * lives in the last few KB; 64KB gives slack for huge tool_result lines. */
29
+ export declare const TAIL_BYTES: number;
30
+ export interface ContextUsage {
31
+ /** Live context size ≈ input + cache_read + cache_creation of the most
32
+ * recent main-chain assistant entry. */
33
+ tokens: number;
34
+ /** Entry timestamp (ISO) if present. */
35
+ timestamp: string | null;
36
+ }
37
+ /** Compute the live context size from a chunk of transcript-tail text.
38
+ * Walks the JSONL lines BACKWARDS for the most recent main-chain assistant
39
+ * entry carrying `message.usage` — sidechain (subagent) entries are skipped,
40
+ * as are unparseable lines (the tail cut can land mid-line). Returns null
41
+ * when no qualifying entry is in the window. */
42
+ export declare function computeContextSizeFromTail(tailText: string): ContextUsage | null;
43
+ /** Read the last `maxBytes` of a file. Never parses the whole transcript —
44
+ * a marathon session's JSONL runs to tens of MB. Returns null on any error. */
45
+ export declare function readTranscriptTail(transcriptPath: string, maxBytes?: number): string | null;
46
+ export interface GovernorState {
47
+ /** Live context size at the last probe. */
48
+ tokens: number;
49
+ /** Probe counter — increments once per Stop event. */
50
+ turn: number;
51
+ /** ISO timestamp of the last probe. */
52
+ ts: string;
53
+ /** Sentinel: turn number when the advisory last fired. Absent = never. */
54
+ lastFiredTurn?: number;
55
+ }
56
+ /** State dir — env override (tests) > ~/.greprag/context-state. */
57
+ export declare function contextStateDir(): string;
58
+ export declare function contextStatePath(shortSessionId: string): string;
59
+ export declare function readGovernorState(shortSessionId: string): GovernorState | null;
60
+ export declare function writeGovernorState(shortSessionId: string, state: GovernorState): void;
61
+ export interface GovernorConfig {
62
+ enabled: boolean;
63
+ threshold: number;
64
+ }
65
+ /** Resolve governor config. Precedence: env > anchor file > defaults.
66
+ * Reads the anchor file raw for the context_* keys so the governor stays
67
+ * self-contained (no ProjectAnchor type change — additive for the chip seam). */
68
+ export declare function readGovernorConfig(cwd: string): GovernorConfig;
69
+ /** Fire when over threshold AND outside the once-per-window sentinel. */
70
+ export declare function shouldFire(state: GovernorState, threshold: number, windowTurns?: number): boolean;
71
+ export declare function buildAdvisory(tokens: number, threshold: number): string;
72
+ export interface GovernorHookInput {
73
+ session_id?: string;
74
+ transcript_path?: string;
75
+ cwd?: string;
76
+ }
77
+ /** Stop probe — measure + record. Silent; never blocks the turn. */
78
+ export declare function runContextProbe(input: GovernorHookInput): void;
79
+ /** UserPromptSubmit check — returns the advisory line when it should fire
80
+ * (and stamps the sentinel), else null. Caller wraps it in hook JSON. */
81
+ export declare function runContextCheck(input: GovernorHookInput): string | null;
82
+ export declare function runContext(args: string[]): void;