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.
- package/dist/archive/glyph-font.d.ts +22 -0
- package/dist/archive/glyph-font.js +72 -0
- package/dist/archive/glyph-font.js.map +1 -0
- package/dist/archive/page-renderer.d.ts +67 -0
- package/dist/archive/page-renderer.js +197 -0
- package/dist/archive/page-renderer.js.map +1 -0
- package/dist/archive/png-codec.d.ts +21 -0
- package/dist/archive/png-codec.js +197 -0
- package/dist/archive/png-codec.js.map +1 -0
- package/dist/archive/transcript-extract.d.ts +39 -0
- package/dist/archive/transcript-extract.js +187 -0
- package/dist/archive/transcript-extract.js.map +1 -0
- package/dist/ccr-store.d.ts +49 -0
- package/dist/ccr-store.js +171 -0
- package/dist/ccr-store.js.map +1 -0
- package/dist/commands/archive.d.ts +81 -0
- package/dist/commands/archive.js +358 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/context-governor.d.ts +82 -0
- package/dist/commands/context-governor.js +344 -0
- package/dist/commands/context-governor.js.map +1 -0
- package/dist/commands/crush-stats.d.ts +36 -0
- package/dist/commands/crush-stats.js +142 -0
- package/dist/commands/crush-stats.js.map +1 -0
- package/dist/commands/crush.d.ts +24 -0
- package/dist/commands/crush.js +183 -0
- package/dist/commands/crush.js.map +1 -0
- package/dist/commands/email.js +158 -9
- package/dist/commands/email.js.map +1 -1
- package/dist/commands/inbox-watch-supervisor.js +8 -65
- package/dist/commands/inbox-watch-supervisor.js.map +1 -1
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pipe-wrap.d.ts +75 -0
- package/dist/commands/pipe-wrap.js +255 -0
- package/dist/commands/pipe-wrap.js.map +1 -0
- package/dist/commands/watcher-registry.d.ts +1 -8
- package/dist/commands/watcher-registry.js +10 -47
- package/dist/commands/watcher-registry.js.map +1 -1
- package/dist/crush/adaptive-sizer.d.ts +40 -0
- package/dist/crush/adaptive-sizer.js +156 -0
- package/dist/crush/adaptive-sizer.js.map +1 -0
- package/dist/crush/crush-keywords.d.ts +40 -0
- package/dist/crush/crush-keywords.js +110 -0
- package/dist/crush/crush-keywords.js.map +1 -0
- package/dist/crush/crush-types.d.ts +38 -0
- package/dist/crush/crush-types.js +36 -0
- package/dist/crush/crush-types.js.map +1 -0
- package/dist/crush/index.d.ts +16 -0
- package/dist/crush/index.js +48 -0
- package/dist/crush/index.js.map +1 -0
- package/dist/crush/json-crusher.d.ts +38 -0
- package/dist/crush/json-crusher.js +250 -0
- package/dist/crush/json-crusher.js.map +1 -0
- package/dist/crush/json-detectors.d.ts +48 -0
- package/dist/crush/json-detectors.js +211 -0
- package/dist/crush/json-detectors.js.map +1 -0
- package/dist/crush/log-compressor.d.ts +60 -0
- package/dist/crush/log-compressor.js +394 -0
- package/dist/crush/log-compressor.js.map +1 -0
- package/dist/crush/search-compressor.d.ts +60 -0
- package/dist/crush/search-compressor.js +210 -0
- package/dist/crush/search-compressor.js.map +1 -0
- package/dist/email-pull.d.ts +25 -3
- package/dist/email-pull.js +25 -5
- package/dist/email-pull.js.map +1 -1
- package/dist/email-send.d.ts +4 -0
- package/dist/email-send.js +2 -0
- package/dist/email-send.js.map +1 -1
- package/dist/hook.js +49 -1
- package/dist/hook.js.map +1 -1
- package/dist/index.js +487 -449
- package/dist/index.js.map +1 -1
- package/dist/session-id.js +7 -12
- package/dist/session-id.js.map +1 -1
- package/package.json +2 -2
- package/skill/greprag/SKILL.md +2 -2
- package/skill/greprag/docs/email.md +28 -4
- package/skill/mechanic/SKILL.md +1 -1
- 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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"}
|
package/dist/email-pull.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}>;
|
package/dist/email-pull.js
CHANGED
|
@@ -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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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 {
|
package/dist/email-pull.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-pull.js","sourceRoot":"","sources":["../src/email-pull.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"email-pull.js","sourceRoot":"","sources":["../src/email-pull.ts"],"names":[],"mappings":"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"}
|
package/dist/email-send.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/email-send.js
CHANGED
|
@@ -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;
|
package/dist/email-send.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-send.js","sourceRoot":"","sources":["../src/email-send.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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
|
}
|