greprag 5.40.1 → 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 (80) 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/email.js +158 -9
  29. package/dist/commands/email.js.map +1 -1
  30. package/dist/commands/inbox-watch-supervisor.js +8 -65
  31. package/dist/commands/inbox-watch-supervisor.js.map +1 -1
  32. package/dist/commands/init.js +93 -0
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/pipe-wrap.d.ts +75 -0
  35. package/dist/commands/pipe-wrap.js +255 -0
  36. package/dist/commands/pipe-wrap.js.map +1 -0
  37. package/dist/commands/watcher-registry.d.ts +1 -8
  38. package/dist/commands/watcher-registry.js +10 -47
  39. package/dist/commands/watcher-registry.js.map +1 -1
  40. package/dist/crush/adaptive-sizer.d.ts +40 -0
  41. package/dist/crush/adaptive-sizer.js +156 -0
  42. package/dist/crush/adaptive-sizer.js.map +1 -0
  43. package/dist/crush/crush-keywords.d.ts +40 -0
  44. package/dist/crush/crush-keywords.js +110 -0
  45. package/dist/crush/crush-keywords.js.map +1 -0
  46. package/dist/crush/crush-types.d.ts +38 -0
  47. package/dist/crush/crush-types.js +36 -0
  48. package/dist/crush/crush-types.js.map +1 -0
  49. package/dist/crush/index.d.ts +16 -0
  50. package/dist/crush/index.js +48 -0
  51. package/dist/crush/index.js.map +1 -0
  52. package/dist/crush/json-crusher.d.ts +38 -0
  53. package/dist/crush/json-crusher.js +250 -0
  54. package/dist/crush/json-crusher.js.map +1 -0
  55. package/dist/crush/json-detectors.d.ts +48 -0
  56. package/dist/crush/json-detectors.js +211 -0
  57. package/dist/crush/json-detectors.js.map +1 -0
  58. package/dist/crush/log-compressor.d.ts +60 -0
  59. package/dist/crush/log-compressor.js +394 -0
  60. package/dist/crush/log-compressor.js.map +1 -0
  61. package/dist/crush/search-compressor.d.ts +60 -0
  62. package/dist/crush/search-compressor.js +210 -0
  63. package/dist/crush/search-compressor.js.map +1 -0
  64. package/dist/email-pull.d.ts +25 -3
  65. package/dist/email-pull.js +25 -5
  66. package/dist/email-pull.js.map +1 -1
  67. package/dist/email-send.d.ts +4 -0
  68. package/dist/email-send.js +2 -0
  69. package/dist/email-send.js.map +1 -1
  70. package/dist/hook.js +49 -1
  71. package/dist/hook.js.map +1 -1
  72. package/dist/index.js +487 -449
  73. package/dist/index.js.map +1 -1
  74. package/dist/session-id.js +7 -12
  75. package/dist/session-id.js.map +1 -1
  76. package/package.json +2 -2
  77. package/skill/greprag/SKILL.md +2 -2
  78. package/skill/greprag/docs/email.md +28 -4
  79. package/skill/mechanic/SKILL.md +1 -1
  80. package/skill/templates/chip-spawn.md +4 -2
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * MIRRORED FILE — canonical source: packages/core/src/crush/search-compressor.ts.
4
+ * Byte-identical copy lives at packages/cli/src/crush/search-compressor.ts (the CLI is a
5
+ * zero-dep artifact and cannot import @greprag/core). KEEP IN SYNC —
6
+ * the sync guard in tests/test-crush.cjs fails the build on drift.
7
+ *
8
+ * Search-results compressor — TypeScript port of Headroom's
9
+ * transforms/search_compressor.rs. Compresses grep/ripgrep output
10
+ * (`file:line:content`, plus rg's `file-line-content` context lines).
11
+ * Typical compression: 5-10x.
12
+ *
13
+ * Pipeline: parse -> score (query-word overlap + error-keyword boosts)
14
+ * -> select (top-N per adaptive budget; always keep first/last per
15
+ * file) -> emit survivors in line order + `[... and N more matches in
16
+ * <file>]` summaries.
17
+ *
18
+ * Carries Headroom's documented parser fixes:
19
+ * - Windows drive paths (`C:\...`): the drive colon is not the
20
+ * line-number marker; the scan starts after it.
21
+ * - Filenames containing `-` (rg context lines): the parser anchors on
22
+ * the leftmost `<sep><digits><sep>` marker, not on a path charset.
23
+ * - Adjacent-separator collapse: `file.py:-1:x` is rejected (negative
24
+ * line numbers are content, not markers).
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.DEFAULT_SEARCH_CONFIG = void 0;
28
+ exports.parseMatchLine = parseMatchLine;
29
+ exports.crushSearch = crushSearch;
30
+ const adaptive_sizer_1 = require("./adaptive-sizer");
31
+ const crush_keywords_1 = require("./crush-keywords");
32
+ const crush_types_1 = require("./crush-types");
33
+ exports.DEFAULT_SEARCH_CONFIG = {
34
+ maxMatchesPerFile: 5,
35
+ alwaysKeepFirst: true,
36
+ alwaysKeepLast: true,
37
+ maxTotalMatches: 30,
38
+ maxFiles: 15,
39
+ contextKeywords: [],
40
+ boostErrors: true,
41
+ bias: 1.0,
42
+ };
43
+ /**
44
+ * Parse one grep/ripgrep-style line into a match, or null.
45
+ *
46
+ * Finds the leftmost `<sep><digits><sep>` triplet (sep = `:` or `-`);
47
+ * path is everything before, content everything after. A Windows drive
48
+ * prefix (`C:\` / `C:/`) shifts the scan start past the drive colon.
49
+ */
50
+ function parseMatchLine(line) {
51
+ const isDrivePrefixed = line.length >= 3 && /[A-Za-z]/.test(line[0]) && line[1] === ':' && (line[2] === '\\' || line[2] === '/');
52
+ let i = isDrivePrefixed ? 2 : 0;
53
+ for (; i < line.length; i++) {
54
+ const ch = line[i];
55
+ if (ch !== ':' && ch !== '-')
56
+ continue;
57
+ // Collapse adjacent-separator runs: a separator immediately after
58
+ // another separator can't open the marker (rejects `file.py:-1:x`).
59
+ const prev = line[i - 1];
60
+ if (i > 0 && (prev === ':' || prev === '-'))
61
+ continue;
62
+ const digitsStart = i + 1;
63
+ let j = digitsStart;
64
+ while (j < line.length && line[j] >= '0' && line[j] <= '9')
65
+ j++;
66
+ if (j > digitsStart && j < line.length && (line[j] === ':' || line[j] === '-')) {
67
+ if (i === 0)
68
+ return null; // zero-length path
69
+ const lineNumber = parseInt(line.slice(digitsStart, j), 10);
70
+ if (!Number.isFinite(lineNumber))
71
+ return null;
72
+ return { file: line.slice(0, i), lineNumber, content: line.slice(j + 1) };
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ function parseSearchResults(content) {
78
+ const out = new Map();
79
+ for (const raw of content.split('\n')) {
80
+ const line = raw.trim();
81
+ if (!line)
82
+ continue;
83
+ const parsed = parseMatchLine(line);
84
+ if (!parsed)
85
+ continue;
86
+ let fm = out.get(parsed.file);
87
+ if (!fm) {
88
+ fm = { file: parsed.file, matches: [] };
89
+ out.set(parsed.file, fm);
90
+ }
91
+ fm.matches.push({ ...parsed, score: 0 });
92
+ }
93
+ return out;
94
+ }
95
+ function scoreMatches(files, query, config) {
96
+ const queryWords = query
97
+ .toLowerCase()
98
+ .split(/\s+/)
99
+ .filter((w) => w.length > 2);
100
+ for (const fm of files.values()) {
101
+ for (const m of fm.matches) {
102
+ let score = 0;
103
+ const lower = m.content.toLowerCase();
104
+ for (const w of queryWords) {
105
+ if (lower.includes(w))
106
+ score += 0.3;
107
+ }
108
+ if (config.boostErrors) {
109
+ const cat = (0, crush_keywords_1.classifyImportance)(m.content);
110
+ if (cat === 'error')
111
+ score += 0.5;
112
+ else if (cat === 'warning')
113
+ score += 0.4;
114
+ else if (cat === 'importance')
115
+ score += 0.3;
116
+ }
117
+ for (const kw of config.contextKeywords) {
118
+ if (lower.includes(kw.toLowerCase()))
119
+ score += 0.4;
120
+ }
121
+ m.score = Math.min(score, 1.0);
122
+ }
123
+ }
124
+ }
125
+ function totalScore(fm) {
126
+ return fm.matches.reduce((s, m) => s + m.score, 0);
127
+ }
128
+ function selectMatches(files, config) {
129
+ // Files by total score descending; cap to maxFiles.
130
+ let byScore = [...files.values()].sort((a, b) => totalScore(b) - totalScore(a));
131
+ if (byScore.length > config.maxFiles)
132
+ byScore = byScore.slice(0, config.maxFiles);
133
+ const allMatchStrings = byScore.flatMap((fm) => fm.matches.map((m) => `${m.file}:${m.lineNumber}:${m.content}`));
134
+ const adaptiveTotal = (0, adaptive_sizer_1.computeOptimalK)(allMatchStrings, config.bias, 5, config.maxTotalMatches);
135
+ const selected = new Map();
136
+ let totalSelected = 0;
137
+ for (const fm of byScore) {
138
+ if (totalSelected >= adaptiveTotal)
139
+ continue;
140
+ // Score desc, line asc on ties.
141
+ const sorted = [...fm.matches].sort((a, b) => b.score - a.score || a.lineNumber - b.lineNumber);
142
+ const fileSelected = [];
143
+ const seen = new Set();
144
+ const remainingCap = Math.min(config.maxMatchesPerFile, adaptiveTotal - totalSelected);
145
+ const pushUnique = (m) => {
146
+ const key = `${m.lineNumber}${m.content}`;
147
+ if (!seen.has(key)) {
148
+ seen.add(key);
149
+ fileSelected.push(m);
150
+ }
151
+ };
152
+ if (config.alwaysKeepFirst && fm.matches.length > 0 && fileSelected.length < remainingCap) {
153
+ pushUnique(fm.matches[0]);
154
+ }
155
+ if (config.alwaysKeepLast && fm.matches.length > 1 && fileSelected.length < remainingCap) {
156
+ pushUnique(fm.matches[fm.matches.length - 1]);
157
+ }
158
+ for (const m of sorted) {
159
+ if (fileSelected.length >= remainingCap)
160
+ break;
161
+ pushUnique(m);
162
+ }
163
+ fileSelected.sort((a, b) => a.lineNumber - b.lineNumber);
164
+ totalSelected += fileSelected.length;
165
+ selected.set(fm.file, { file: fm.file, matches: fileSelected });
166
+ }
167
+ return selected;
168
+ }
169
+ function formatOutput(selected, original) {
170
+ const lines = [];
171
+ for (const [file, fm] of selected) {
172
+ for (const m of fm.matches) {
173
+ lines.push(`${m.file}:${m.lineNumber}:${m.content}`);
174
+ }
175
+ const orig = original.get(file);
176
+ if (orig && orig.matches.length > fm.matches.length) {
177
+ lines.push(`[... and ${orig.matches.length - fm.matches.length} more matches in ${file}]`);
178
+ }
179
+ }
180
+ return lines.join('\n');
181
+ }
182
+ /**
183
+ * Compress grep/rg output. `query` (optional) boosts matches containing
184
+ * its words. Unparseable input passes through unchanged.
185
+ */
186
+ function crushSearch(content, query = '', config = {}) {
187
+ const cfg = { ...exports.DEFAULT_SEARCH_CONFIG, ...config };
188
+ const parsed = parseSearchResults(content);
189
+ const originalCount = [...parsed.values()].reduce((s, fm) => s + fm.matches.length, 0);
190
+ if (originalCount === 0) {
191
+ return (0, crush_types_1.makePassthrough)(content, 'search', 'no parseable matches');
192
+ }
193
+ scoreMatches(parsed, query, cfg);
194
+ const selected = selectMatches(parsed, cfg);
195
+ const output = formatOutput(selected, parsed);
196
+ const keptCount = [...selected.values()].reduce((s, fm) => s + fm.matches.length, 0);
197
+ return {
198
+ output,
199
+ stats: {
200
+ sourceType: 'search',
201
+ originalChars: content.length,
202
+ compressedChars: output.length,
203
+ compressionRatio: output.length / Math.max(content.length, 1),
204
+ originalUnits: originalCount,
205
+ keptUnits: keptCount,
206
+ passthrough: false,
207
+ },
208
+ };
209
+ }
210
+ //# sourceMappingURL=search-compressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-compressor.js","sourceRoot":"","sources":["../../src/crush/search-compressor.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,9 @@ export interface PendingRow {
40
40
  subject: string | null;
41
41
  trust_verdict: string | null;
42
42
  attachment_count: number;
43
+ /** The address this mail arrived on (custom-domain mailboxes). NULL on
44
+ * legacy rows that predate the stamp — the tenant's default box. */
45
+ mailbox: string | null;
43
46
  created_at: string;
44
47
  }
45
48
  /** One attachment's outcome from a pull. `skipped` = already on disk. */
@@ -68,14 +71,33 @@ export declare function resolveEmailDir(opts: {
68
71
  anchorDir?: string | null;
69
72
  projectName?: string | null;
70
73
  }): string;
71
- export declare function fetchPending(apiUrl: string, apiKey: string, limit?: number): Promise<PendingRow[]>;
74
+ /** Build the /pending URL pure, exported for unit tests. `box` narrows to
75
+ * one mailbox (address), a whole domain, or the literal `default`. */
76
+ export declare function pendingUrl(apiUrl: string, limit: number, box?: string | null): string;
77
+ export declare function fetchPending(apiUrl: string, apiKey: string, limit?: number, box?: string | null): Promise<PendingRow[]>;
78
+ export interface BoxRow {
79
+ mailbox: string;
80
+ pending: number;
81
+ is_default: boolean;
82
+ }
83
+ /** GET /v1/email/boxes — distinct mailboxes with pending counts. */
84
+ export declare function fetchBoxes(apiUrl: string, apiKey: string): Promise<BoxRow[]>;
85
+ export interface DomainRow {
86
+ domain: string;
87
+ verified: boolean;
88
+ forward_to: string | null;
89
+ created_at: string;
90
+ }
91
+ /** GET /v1/email/domains — the tenant's custom domains + verified status. */
92
+ export declare function fetchDomains(apiUrl: string, apiKey: string): Promise<DomainRow[]>;
72
93
  export declare function fetchManifest(apiUrl: string, apiKey: string, recordId: string): Promise<RecordManifest>;
73
94
  /** Pull one record's attachments into `dir`. Idempotent: already-saved
74
95
  * attachments are reported `skipped`, never re-downloaded. Non-downloadable
75
96
  * (dropped / no original) attachments are omitted from the result. */
76
97
  export declare function pullRecord(apiUrl: string, apiKey: string, recordId: string, dir: string): Promise<SavedFile[]>;
77
- /** Pull every pending record that carries attachments. */
78
- export declare function pullAllPending(apiUrl: string, apiKey: string, dir: string): Promise<{
98
+ /** Pull every pending record that carries attachments — optionally only one
99
+ * mailbox/domain (`box`, same grammar as fetchPending). */
100
+ export declare function pullAllPending(apiUrl: string, apiKey: string, dir: string, box?: string | null): Promise<{
79
101
  records: number;
80
102
  saved: SavedFile[];
81
103
  }>;
@@ -50,7 +50,10 @@ exports.slugifySubject = slugifySubject;
50
50
  exports.attachmentFilename = attachmentFilename;
51
51
  exports.shouldPull = shouldPull;
52
52
  exports.resolveEmailDir = resolveEmailDir;
53
+ exports.pendingUrl = pendingUrl;
53
54
  exports.fetchPending = fetchPending;
55
+ exports.fetchBoxes = fetchBoxes;
56
+ exports.fetchDomains = fetchDomains;
54
57
  exports.fetchManifest = fetchManifest;
55
58
  exports.pullRecord = pullRecord;
56
59
  exports.pullAllPending = pullAllPending;
@@ -110,10 +113,26 @@ async function getJson(url, apiKey) {
110
113
  function base(apiUrl) {
111
114
  return apiUrl.replace(/\/+$/, '');
112
115
  }
113
- async function fetchPending(apiUrl, apiKey, limit = 50) {
114
- const data = await getJson(`${base(apiUrl)}/v1/email/pending?limit=${limit}`, apiKey);
116
+ /** Build the /pending URL — pure, exported for unit tests. `box` narrows to
117
+ * one mailbox (address), a whole domain, or the literal `default`. */
118
+ function pendingUrl(apiUrl, limit, box) {
119
+ const boxParam = box && box.trim() ? `&box=${encodeURIComponent(box.trim())}` : '';
120
+ return `${base(apiUrl)}/v1/email/pending?limit=${limit}${boxParam}`;
121
+ }
122
+ async function fetchPending(apiUrl, apiKey, limit = 50, box) {
123
+ const data = await getJson(pendingUrl(apiUrl, limit, box), apiKey);
115
124
  return data.pending || [];
116
125
  }
126
+ /** GET /v1/email/boxes — distinct mailboxes with pending counts. */
127
+ async function fetchBoxes(apiUrl, apiKey) {
128
+ const data = await getJson(`${base(apiUrl)}/v1/email/boxes`, apiKey);
129
+ return data.boxes || [];
130
+ }
131
+ /** GET /v1/email/domains — the tenant's custom domains + verified status. */
132
+ async function fetchDomains(apiUrl, apiKey) {
133
+ const data = await getJson(`${base(apiUrl)}/v1/email/domains`, apiKey);
134
+ return data.domains || [];
135
+ }
117
136
  async function fetchManifest(apiUrl, apiKey, recordId) {
118
137
  const data = await getJson(`${base(apiUrl)}/v1/email/${encodeURIComponent(recordId)}/manifest`, apiKey);
119
138
  return { id: data.id, subject: data.subject ?? null, attachments: data.attachments || [] };
@@ -176,9 +195,10 @@ async function pullRecord(apiUrl, apiKey, recordId, dir) {
176
195
  }
177
196
  return out;
178
197
  }
179
- /** Pull every pending record that carries attachments. */
180
- async function pullAllPending(apiUrl, apiKey, dir) {
181
- const pending = (await fetchPending(apiUrl, apiKey)).filter(r => r.attachment_count > 0);
198
+ /** Pull every pending record that carries attachments — optionally only one
199
+ * mailbox/domain (`box`, same grammar as fetchPending). */
200
+ async function pullAllPending(apiUrl, apiKey, dir, box) {
201
+ const pending = (await fetchPending(apiUrl, apiKey, 50, box)).filter(r => r.attachment_count > 0);
182
202
  const saved = [];
183
203
  for (const row of pending) {
184
204
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"email-pull.js","sourceRoot":"","sources":["../src/email-pull.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email-pull.js","sourceRoot":"","sources":["../src/email-pull.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DH,wCAMC;AAUD,gDAMC;AAID,gCAIC;AAID,0CAWC;AAgBD,gCAGC;AAED,oCAKC;AASD,gCAGC;AAUD,oCAGC;AAED,sCAKC;AAmCD,gCA4BC;AAID,wCAaC;AAID,oDAMC;AAzPD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAmDzB,+EAA+E;AAE/E,0DAA0D;AAC1D,SAAgB,cAAc,CAAC,OAAsB;IACnD,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE;SAC5C,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,IAAI,IAAI,OAAO,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,CAAC;AAED;;oEAEoE;AACpE,SAAgB,kBAAkB,CAAC,OAAsB,EAAE,KAAoB;IAC7E,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;SAC7D,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;IAC3B,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;AACzC,CAAC;AAED;kFACkF;AAClF,SAAgB,UAAU,CAAC,KAAoB;IAC7C,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;kEACkE;AAClE,SAAgB,eAAe,CAAC,IAK/B;IACC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,OAAO,CAAI,GAAW,EAAE,MAAc;IACnD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,SAAS,IAAI,CAAC,MAAc;IAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;uEACuE;AACvE,SAAgB,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,GAAmB;IAC3E,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,2BAA2B,KAAK,GAAG,QAAQ,EAAE,CAAC;AACtE,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAc,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE,EAAE,GAAmB;IAE/D,MAAM,IAAI,GAAG,MAAM,OAAO,CAA6B,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/F,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AAC5B,CAAC;AAQD,oEAAoE;AAC7D,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,MAAc;IAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC1B,CAAC;AASD,6EAA6E;AACtE,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,MAAM,OAAO,CAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAClG,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AAC5B,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,MAAc,EAAE,QAAgB;IAClF,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC5E,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;AAC7F,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EAAE,MAAc,EAAE,QAAgB,EAAE,KAAa;IAE/D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,eAAe,KAAK,EAAE,CAAC;IAC3F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;yCAEyC;AACzC,KAAK,UAAU,UAAU,CACvB,MAAc,EAAE,MAAc,EAAE,QAAgB,EAAE,KAAa,EAAE,SAAiB;IAElF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC;QACjG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAClF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;uEAEuE;AAChE,KAAK,UAAU,UAAU,CAC9B,MAAc,EAAE,MAAc,EAAE,QAAgB,EAAE,GAAW;IAE7D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC;gBACP,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ;gBACnD,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI;aACtF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ;YACnD,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;SAChD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;4DAC4D;AACrD,KAAK,UAAU,cAAc,CAClC,MAAc,EAAE,MAAc,EAAE,GAAW,EAAE,GAAmB;IAEhE,MAAM,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED;iFACiF;AACjF,SAAgB,oBAAoB,CAAC,KAAkB,EAAE,GAAW;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,iBAAiB,KAAK,CAAC,MAAM,oBAAoB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,IAAI,EAAE,CAAC;AACrH,CAAC"}
@@ -25,6 +25,7 @@ export interface SendPayload {
25
25
  bcc?: string[];
26
26
  reply_to?: string;
27
27
  from?: string;
28
+ from_name?: string;
28
29
  attachments?: SendAttachmentInput[];
29
30
  }
30
31
  export interface SendOptions {
@@ -36,6 +37,9 @@ export interface SendOptions {
36
37
  bcc?: string[];
37
38
  replyTo?: string | null;
38
39
  from?: string | null;
40
+ /** Display name for the From header ("Travis Steward"). Overrides the
41
+ * domain default; null falls back to it server-side. */
42
+ fromName?: string | null;
39
43
  /** Local file paths to attach — read + base64'd by buildSendPayload. */
40
44
  attachPaths?: string[];
41
45
  }
@@ -98,6 +98,8 @@ function buildSendPayload(opts) {
98
98
  payload.reply_to = opts.replyTo;
99
99
  if (opts.from)
100
100
  payload.from = opts.from;
101
+ if (opts.fromName)
102
+ payload.from_name = opts.fromName;
101
103
  const atts = (opts.attachPaths || []).map(fileToAttachment);
102
104
  if (atts.length)
103
105
  payload.attachments = atts;
@@ -1 +1 @@
1
- {"version":3,"file":"email-send.js","sourceRoot":"","sources":["../src/email-send.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email-send.js","sourceRoot":"","sources":["../src/email-send.ts"],"names":[],"mappings":"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"}
package/dist/hook.js CHANGED
@@ -70,6 +70,19 @@ const opencode_plugin_helpers_1 = require("./opencode-plugin-helpers");
70
70
  // Mechanic dispatcher (Chip B) — PreToolUse guard + matchset boot pull/refresh.
71
71
  // docs/mechanic-repairs.md D1/D2/D5/D8; docs/mechanic-engine-contracts.md.
72
72
  const guard_1 = require("./guard");
73
+ // Context governor (Chip C) — Stop probe measures live context size from the
74
+ // transcript tail; UserPromptSubmit check injects the crossover advisory.
75
+ // All real logic lives in ./commands/context-governor. docs/pre-llm-compression.md
76
+ const context_governor_1 = require("./commands/context-governor");
77
+ // Pipe-wrap (Chip B) — PreToolUse[Bash] rewrite: noisy commands get piped
78
+ // through `greprag crush` via hookSpecificOutput.updatedInput. All real logic
79
+ // lives in ./commands/pipe-wrap. docs/pre-llm-compression.md, adr/pipe-wrap-hook.md
80
+ const pipe_wrap_1 = require("./commands/pipe-wrap");
81
+ // Governed compact (Chip D) — PreCompact renders the transcript to pixel-font
82
+ // PNG pages (lossless ~3x-density archive, CCR-indexed); SessionStart(compact)
83
+ // injects the pointer so the post-compact model can Read the verbatim record.
84
+ // All real logic lives in ./commands/archive. adr: adr/governed-compact.md
85
+ const archive_1 = require("./commands/archive");
73
86
  const API_URL_DEFAULT = 'https://api.greprag.com';
74
87
  const MAX_FIELD_CHARS = 500_000; // safety cap per text field
75
88
  // ---------- Env + config ---------------------------------------------------
@@ -1358,11 +1371,13 @@ async function main() {
1358
1371
  const validSubs = new Set([
1359
1372
  'store', 'recap', 'notify', 'mail', 'session-id', 'pre-spawn-check', 'armcheck',
1360
1373
  'guard', 'guard-refresh', 'guard-flush',
1374
+ 'context-probe', 'context-check', 'crush-wrap',
1375
+ 'pre-compact', 'archive-pointer',
1361
1376
  'codex-store', 'codex-notify', 'codex-inbox', 'codex-recap',
1362
1377
  'codex-permission-context', 'codex-subagent-start',
1363
1378
  ]);
1364
1379
  if (!validSubs.has(subcommand)) {
1365
- process.stderr.write(`Usage: greprag-hook <store|recap|notify|mail|session-id|pre-spawn-check|armcheck|guard|guard-refresh|guard-flush|codex-store|codex-notify|codex-inbox|codex-recap|codex-permission-context|codex-subagent-start>\n`);
1380
+ process.stderr.write(`Usage: greprag-hook <store|recap|notify|mail|session-id|pre-spawn-check|armcheck|guard|guard-refresh|guard-flush|context-probe|context-check|crush-wrap|pre-compact|archive-pointer|codex-store|codex-notify|codex-inbox|codex-recap|codex-permission-context|codex-subagent-start>\n`);
1366
1381
  process.exit(1);
1367
1382
  }
1368
1383
  let input = {};
@@ -1425,6 +1440,39 @@ async function main() {
1425
1440
  else if (subcommand === 'armcheck') {
1426
1441
  await armCheck(input);
1427
1442
  }
1443
+ else if (subcommand === 'context-probe') {
1444
+ // Stop probe — transcript-tail context-size measurement, local state only.
1445
+ (0, context_governor_1.runContextProbe)(input);
1446
+ }
1447
+ else if (subcommand === 'context-check') {
1448
+ // UserPromptSubmit — one-line crossover advisory, once per 25-turn window.
1449
+ const advisory = (0, context_governor_1.runContextCheck)(input);
1450
+ if (advisory)
1451
+ writeAdditionalContext('UserPromptSubmit', advisory);
1452
+ }
1453
+ else if (subcommand === 'crush-wrap') {
1454
+ // PreToolUse[Bash] — rewrite noisy commands to pipe through greprag crush.
1455
+ // Emits updatedInput only (no permissionDecision — permission flow intact);
1456
+ // silence on any non-qualifying command. adr: adr/pipe-wrap-hook.md
1457
+ const out = (0, pipe_wrap_1.runPipeWrap)(input);
1458
+ if (out)
1459
+ process.stdout.write(JSON.stringify(out) + '\n');
1460
+ }
1461
+ else if (subcommand === 'pre-compact') {
1462
+ // PreCompact — render the PNG archive before compaction proceeds. The
1463
+ // verified contract (adr/governed-compact.md) allows no instruction
1464
+ // injection here; we archive + surface a user-facing systemMessage.
1465
+ const message = await (0, archive_1.runPreCompactArchive)(input);
1466
+ if (message)
1467
+ process.stdout.write(JSON.stringify({ systemMessage: message }) + '\n');
1468
+ }
1469
+ else if (subcommand === 'archive-pointer') {
1470
+ // SessionStart(matcher=compact) — the one documented post-compact channel
1471
+ // whose output reaches the model. Points at the PNG archive.
1472
+ const pointer = await (0, archive_1.buildArchivePointer)(input);
1473
+ if (pointer)
1474
+ writeAdditionalContext('SessionStart', pointer);
1475
+ }
1428
1476
  else if (subcommand === 'codex-store') {
1429
1477
  await store(input, 'codex');
1430
1478
  }