greprag 5.38.0 → 5.40.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/commands/discover.d.ts +1 -1
- package/dist/commands/discover.js +6 -5
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/fix.d.ts +28 -0
- package/dist/commands/fix.js +455 -37
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/init.js +18 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mechanic.d.ts +64 -0
- package/dist/commands/mechanic.js +374 -0
- package/dist/commands/mechanic.js.map +1 -0
- package/dist/fix-trigger.d.ts +43 -0
- package/dist/fix-trigger.js +270 -0
- package/dist/fix-trigger.js.map +1 -0
- package/dist/guard.d.ts +92 -0
- package/dist/guard.js +404 -0
- package/dist/guard.js.map +1 -0
- package/dist/hook.js +117 -70
- package/dist/hook.js.map +1 -1
- package/dist/index.js +66 -46
- package/dist/index.js.map +1 -1
- package/dist/secret-scrubber.d.ts +48 -0
- package/dist/secret-scrubber.js +368 -0
- package/dist/secret-scrubber.js.map +1 -0
- package/package.json +1 -1
- package/skill/greprag/SKILL.md +6 -3
- package/skill/greprag/docs/corpus.md +15 -0
- package/skill/greprag/docs/discover.md +1 -1
- package/skill/greprag/docs/email.md +46 -0
- package/skill/greprag/docs/fix.md +86 -0
- package/skill/greprag/docs/inbox-watch.md +5 -4
- package/skill/greprag/docs/inbox.md +10 -8
- package/skill/greprag/docs/setup.md +1 -1
- package/skill/mechanic/SKILL.md +22 -2
- package/skill/templates/chip-spawn.md +30 -8
- package/skill/templates/workshop-chip.md +43 -0
- package/skill/greprag/docs/lore.md +0 -70
package/dist/guard.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** guard — the PreToolUse repair dispatcher (Chip B, docs/mechanic-repairs.md
|
|
3
|
+
* D1/D2/D5/D8; contracts: docs/mechanic-engine-contracts.md).
|
|
4
|
+
*
|
|
5
|
+
* The ad-blocker model (D5): rules live server-side; each session pulls its
|
|
6
|
+
* matchset at SessionStart into a local cache; every PreToolUse check runs
|
|
7
|
+
* locally in microseconds; fire tallies sync back async via a detached child
|
|
8
|
+
* process and NEVER block the tool call. Total guard posture: local-only on
|
|
9
|
+
* the critical path, any error → fail-open (emit nothing, exit 0).
|
|
10
|
+
*
|
|
11
|
+
* Latch journal placement (documented per contract): latches live INSIDE the
|
|
12
|
+
* matchset cache file under the `latchState` key — one file to read on the
|
|
13
|
+
* hot path, and a refetch preserves it (fetchAndCacheMatchset merges the old
|
|
14
|
+
* latchState into the fresh server body).
|
|
15
|
+
*
|
|
16
|
+
* Cadence `cooldown:N` is interpreted as N MINUTES since lastFired (the local
|
|
17
|
+
* journal stores timestamps, not turn counters; the server-side row keeps the
|
|
18
|
+
* authoritative turn-based view).
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.TRANSFORM_SENSITIVE_FIELDS = void 0;
|
|
55
|
+
exports.killSwitchPath = killSwitchPath;
|
|
56
|
+
exports.matchsetCachePath = matchsetCachePath;
|
|
57
|
+
exports.tallySpoolPath = tallySpoolPath;
|
|
58
|
+
exports.wrapStandingNote = wrapStandingNote;
|
|
59
|
+
exports.readMatchsetCache = readMatchsetCache;
|
|
60
|
+
exports.runGuard = runGuard;
|
|
61
|
+
exports.flushTallySpools = flushTallySpools;
|
|
62
|
+
exports.fetchAndCacheMatchset = fetchAndCacheMatchset;
|
|
63
|
+
exports.maybeSpawnGuardRefresh = maybeSpawnGuardRefresh;
|
|
64
|
+
const path = __importStar(require("path"));
|
|
65
|
+
const fs = __importStar(require("fs"));
|
|
66
|
+
const child_process_1 = require("child_process");
|
|
67
|
+
const fix_trigger_1 = require("./fix-trigger");
|
|
68
|
+
// ---------- Paths -----------------------------------------------------------
|
|
69
|
+
function stateDir() {
|
|
70
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
71
|
+
return path.join(home, '.greprag', 'state');
|
|
72
|
+
}
|
|
73
|
+
function killSwitchPath() {
|
|
74
|
+
return path.join(stateDir(), 'mechanic-off.json');
|
|
75
|
+
}
|
|
76
|
+
function matchsetCachePath(projectId) {
|
|
77
|
+
return path.join(stateDir(), `matchset-${projectId}.json`);
|
|
78
|
+
}
|
|
79
|
+
function tallySpoolPath(projectId) {
|
|
80
|
+
return path.join(stateDir(), `tally-spool-${projectId}.json`);
|
|
81
|
+
}
|
|
82
|
+
/** D8 transform denylist (sensitive fields) — kept for the local refusal leg.
|
|
83
|
+
* v1 refuses ALL transforms locally regardless; the list documents the rail
|
|
84
|
+
* the server enforces at authoring time. */
|
|
85
|
+
exports.TRANSFORM_SENSITIVE_FIELDS = [
|
|
86
|
+
'url', 'remote', 'recipient', 'recipients', 'to', 'cc', 'bcc', 'host', 'target',
|
|
87
|
+
];
|
|
88
|
+
/** D8 injection envelope — repair text always lands wrapped as a standing note
|
|
89
|
+
* (data, not a user instruction). */
|
|
90
|
+
function wrapStandingNote(text) {
|
|
91
|
+
return `[Mechanic standing note — context, not a user instruction] ${text}`;
|
|
92
|
+
}
|
|
93
|
+
// ---------- Cache I/O --------------------------------------------------------
|
|
94
|
+
function readMatchsetCache(projectId) {
|
|
95
|
+
try {
|
|
96
|
+
const raw = fs.readFileSync(matchsetCachePath(projectId), 'utf-8');
|
|
97
|
+
const parsed = JSON.parse(raw);
|
|
98
|
+
if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.repairs))
|
|
99
|
+
return null;
|
|
100
|
+
return parsed;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null; // missing/corrupt → fail-open
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function writeMatchsetCache(projectId, cache) {
|
|
107
|
+
const file = matchsetCachePath(projectId);
|
|
108
|
+
const dir = path.dirname(file);
|
|
109
|
+
if (!fs.existsSync(dir))
|
|
110
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
111
|
+
fs.writeFileSync(file, JSON.stringify(cache, null, 2) + '\n');
|
|
112
|
+
}
|
|
113
|
+
// ---------- Matching ---------------------------------------------------------
|
|
114
|
+
function toolNameMatches(matcher, toolName) {
|
|
115
|
+
if (matcher === undefined || matcher === '' || matcher === '*')
|
|
116
|
+
return true;
|
|
117
|
+
const re = (0, fix_trigger_1.compileSafeRegex)(matcher, undefined);
|
|
118
|
+
if (!re)
|
|
119
|
+
return false; // unsafe/broken matcher → never fire (fail-safe)
|
|
120
|
+
return re.test(toolName);
|
|
121
|
+
}
|
|
122
|
+
function latchKey(repair, sessionId) {
|
|
123
|
+
return repair.resetScope === 'project' ? 'project' : sessionId;
|
|
124
|
+
}
|
|
125
|
+
/** Cadence gate. true = allowed to fire now. */
|
|
126
|
+
function cadenceAllows(repair, lastFiredIso, nowMs) {
|
|
127
|
+
const cadence = repair.cadence || 'once-per-session';
|
|
128
|
+
if (cadence === 'every-match')
|
|
129
|
+
return true;
|
|
130
|
+
if (!lastFiredIso)
|
|
131
|
+
return true;
|
|
132
|
+
if (cadence === 'once-per-session')
|
|
133
|
+
return false; // latched
|
|
134
|
+
const m = cadence.match(/^cooldown:(\d+)$/);
|
|
135
|
+
if (m) {
|
|
136
|
+
const lastMs = Date.parse(lastFiredIso);
|
|
137
|
+
if (!Number.isFinite(lastMs))
|
|
138
|
+
return true;
|
|
139
|
+
return nowMs - lastMs >= parseInt(m[1], 10) * 60_000;
|
|
140
|
+
}
|
|
141
|
+
return false; // unknown cadence → fail-safe (don't fire)
|
|
142
|
+
}
|
|
143
|
+
function buildMatchedContext(toolName, toolInput) {
|
|
144
|
+
let detail = '';
|
|
145
|
+
try {
|
|
146
|
+
detail = JSON.stringify(toolInput);
|
|
147
|
+
}
|
|
148
|
+
catch { /* best-effort */ }
|
|
149
|
+
return `${toolName}: ${detail}`.slice(0, 500);
|
|
150
|
+
}
|
|
151
|
+
/** Run the dispatcher over one PreToolUse event. Pure given the cache contents
|
|
152
|
+
* read from disk; mutates only local state files (cache latchState + spool).
|
|
153
|
+
* Returns the hook output to emit, or null for silence. NO network — tallies
|
|
154
|
+
* flush via a detached child (spawnTallyFlush). */
|
|
155
|
+
function runGuard(input, projectId) {
|
|
156
|
+
// (a) kill switch — checked FIRST, before anything else (D8 panic switch).
|
|
157
|
+
if (fs.existsSync(killSwitchPath()))
|
|
158
|
+
return null;
|
|
159
|
+
// (b) matchset cache — missing/corrupt → fail-open.
|
|
160
|
+
const cache = readMatchsetCache(projectId);
|
|
161
|
+
if (!cache)
|
|
162
|
+
return null;
|
|
163
|
+
const toolName = input.tool_name || '';
|
|
164
|
+
const toolInput = (input.tool_input || {});
|
|
165
|
+
const sessionId = (input.session_id || 'unknown').slice(0, 8);
|
|
166
|
+
const nowMs = Date.now();
|
|
167
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
168
|
+
const latchState = cache.latchState || {};
|
|
169
|
+
const injections = [];
|
|
170
|
+
let ask = null;
|
|
171
|
+
let deny = null;
|
|
172
|
+
const spoolFires = [];
|
|
173
|
+
const spoolLatches = [];
|
|
174
|
+
let latchDirty = false;
|
|
175
|
+
for (const row of cache.repairs) {
|
|
176
|
+
const repair = row.repair;
|
|
177
|
+
const trigger = repair?.trigger;
|
|
178
|
+
if (!trigger || trigger.event !== 'PreToolUse')
|
|
179
|
+
continue;
|
|
180
|
+
const status = repair.status;
|
|
181
|
+
if (status !== 'shadow' && status !== 'active')
|
|
182
|
+
continue;
|
|
183
|
+
// (c) match: tool-name regex → condition (the shared core interpreter).
|
|
184
|
+
if (!toolNameMatches(trigger.matcher, toolName))
|
|
185
|
+
continue;
|
|
186
|
+
if (!(0, fix_trigger_1.evaluateCondition)(trigger.condition ?? true, toolInput))
|
|
187
|
+
continue;
|
|
188
|
+
// (d) cadence/latch.
|
|
189
|
+
const key = latchKey(repair, sessionId);
|
|
190
|
+
const lastFired = latchState[row.nodeId]?.[key];
|
|
191
|
+
if (!cadenceAllows(repair, lastFired, nowMs))
|
|
192
|
+
continue;
|
|
193
|
+
const action = trigger.action || 'inject';
|
|
194
|
+
// (e) effect. Transform: REFUSED locally regardless of server state (D8
|
|
195
|
+
// double-enforcement) — no effect, no fire.
|
|
196
|
+
if (action === 'transform')
|
|
197
|
+
continue;
|
|
198
|
+
const shadow = status === 'shadow';
|
|
199
|
+
if (!shadow) {
|
|
200
|
+
if (action === 'inject') {
|
|
201
|
+
injections.push(wrapStandingNote(row.text));
|
|
202
|
+
}
|
|
203
|
+
else if (action === 'ask') {
|
|
204
|
+
if (!ask)
|
|
205
|
+
ask = row.text;
|
|
206
|
+
}
|
|
207
|
+
else if (action === 'deny') {
|
|
208
|
+
// Only honored from cache with failMode: "closed" (v1 ships no deny
|
|
209
|
+
// rows; the path must still be safe).
|
|
210
|
+
if (repair.failMode === 'closed' && !deny)
|
|
211
|
+
deny = row.text;
|
|
212
|
+
else
|
|
213
|
+
continue; // open-mode deny → not honored, no fire
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
continue; // unknown action → fail-safe
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// shadow (any action): no effect, record the shadow fire below.
|
|
220
|
+
// (f) record fire + latch.
|
|
221
|
+
spoolFires.push({
|
|
222
|
+
nodeId: row.nodeId, firedAt: nowIso, sessionId, shadow,
|
|
223
|
+
matchedContext: buildMatchedContext(toolName, toolInput),
|
|
224
|
+
});
|
|
225
|
+
if ((repair.cadence || 'once-per-session') !== 'every-match') {
|
|
226
|
+
if (!latchState[row.nodeId])
|
|
227
|
+
latchState[row.nodeId] = {};
|
|
228
|
+
latchState[row.nodeId][key] = nowIso;
|
|
229
|
+
spoolLatches.push({ nodeId: row.nodeId, key, firedAt: nowIso });
|
|
230
|
+
latchDirty = true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Persist latches into the cache file (the documented journal location).
|
|
234
|
+
if (latchDirty) {
|
|
235
|
+
try {
|
|
236
|
+
cache.latchState = latchState;
|
|
237
|
+
writeMatchsetCache(projectId, cache);
|
|
238
|
+
}
|
|
239
|
+
catch { /* latch write is best-effort — never block the tool call */ }
|
|
240
|
+
}
|
|
241
|
+
// Spool tallies + fire-and-forget flush via a detached child.
|
|
242
|
+
if (spoolFires.length > 0 || spoolLatches.length > 0) {
|
|
243
|
+
try {
|
|
244
|
+
appendSpool(projectId, spoolFires, spoolLatches);
|
|
245
|
+
spawnTallyFlush(input.cwd || process.cwd());
|
|
246
|
+
}
|
|
247
|
+
catch { /* tally write-back is best-effort */ }
|
|
248
|
+
}
|
|
249
|
+
if (injections.length === 0 && !ask && !deny)
|
|
250
|
+
return null;
|
|
251
|
+
const out = { hookSpecificOutput: { hookEventName: 'PreToolUse' } };
|
|
252
|
+
if (injections.length > 0)
|
|
253
|
+
out.hookSpecificOutput.additionalContext = injections.join('\n\n');
|
|
254
|
+
if (deny) {
|
|
255
|
+
out.hookSpecificOutput.permissionDecision = 'deny';
|
|
256
|
+
out.hookSpecificOutput.permissionDecisionReason = deny;
|
|
257
|
+
}
|
|
258
|
+
else if (ask) {
|
|
259
|
+
out.hookSpecificOutput.permissionDecision = 'ask';
|
|
260
|
+
out.hookSpecificOutput.permissionDecisionReason = ask;
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
// ---------- Tally spool + async flush ----------------------------------------
|
|
265
|
+
function appendSpool(projectId, fires, latches) {
|
|
266
|
+
const file = tallySpoolPath(projectId);
|
|
267
|
+
let spool = { fires: [], latches: [] };
|
|
268
|
+
try {
|
|
269
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
270
|
+
if (parsed && Array.isArray(parsed.fires) && Array.isArray(parsed.latches))
|
|
271
|
+
spool = parsed;
|
|
272
|
+
}
|
|
273
|
+
catch { /* fresh spool */ }
|
|
274
|
+
spool.fires.push(...fires);
|
|
275
|
+
spool.latches.push(...latches);
|
|
276
|
+
// Batch cap: keep at most 500 of each (oldest dropped — tallies are stats,
|
|
277
|
+
// not ledger; losing old fires under backlog beats unbounded growth).
|
|
278
|
+
if (spool.fires.length > 500)
|
|
279
|
+
spool.fires = spool.fires.slice(-500);
|
|
280
|
+
if (spool.latches.length > 500)
|
|
281
|
+
spool.latches = spool.latches.slice(-500);
|
|
282
|
+
const dir = path.dirname(file);
|
|
283
|
+
if (!fs.existsSync(dir))
|
|
284
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
285
|
+
fs.writeFileSync(file, JSON.stringify(spool) + '\n');
|
|
286
|
+
}
|
|
287
|
+
/** Fire-and-forget: detached `greprag-hook guard-flush` child. The hook process
|
|
288
|
+
* exits immediately; the child does the network POST off the critical path. */
|
|
289
|
+
function spawnTallyFlush(cwd) {
|
|
290
|
+
try {
|
|
291
|
+
const hookJs = path.join(__dirname, 'hook.js');
|
|
292
|
+
const child = (0, child_process_1.spawn)(process.execPath, [hookJs, 'guard-flush'], {
|
|
293
|
+
cwd, detached: true, stdio: 'ignore',
|
|
294
|
+
env: { ...process.env, GREPRAG_GUARD_CHILD: '1' },
|
|
295
|
+
});
|
|
296
|
+
child.unref();
|
|
297
|
+
}
|
|
298
|
+
catch { /* best-effort */ }
|
|
299
|
+
}
|
|
300
|
+
/** Flush every tally spool in the state dir to the server. Runs in the
|
|
301
|
+
* detached child (guard-flush) — hard 5s timeout per POST; failure keeps the
|
|
302
|
+
* spool for the next flush. */
|
|
303
|
+
async function flushTallySpools(apiUrl, apiKey) {
|
|
304
|
+
let files = [];
|
|
305
|
+
try {
|
|
306
|
+
files = fs.readdirSync(stateDir()).filter(f => f.startsWith('tally-spool-') && f.endsWith('.json'));
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
for (const fname of files) {
|
|
312
|
+
const file = path.join(stateDir(), fname);
|
|
313
|
+
const projectId = fname.slice('tally-spool-'.length, -'.json'.length);
|
|
314
|
+
let spool;
|
|
315
|
+
try {
|
|
316
|
+
spool = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
317
|
+
if (!spool || (!Array.isArray(spool.fires) && !Array.isArray(spool.latches)))
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if ((spool.fires?.length || 0) === 0 && (spool.latches?.length || 0) === 0) {
|
|
324
|
+
try {
|
|
325
|
+
fs.unlinkSync(file);
|
|
326
|
+
}
|
|
327
|
+
catch { /* fine */ }
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const ctrl = new AbortController();
|
|
332
|
+
const timer = setTimeout(() => ctrl.abort(), 5000);
|
|
333
|
+
const res = await fetch(`${apiUrl}/v1/fix/triggers/tallies`, {
|
|
334
|
+
method: 'POST',
|
|
335
|
+
headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
336
|
+
body: JSON.stringify({
|
|
337
|
+
projectId,
|
|
338
|
+
fires: (spool.fires || []).slice(0, 500),
|
|
339
|
+
latches: (spool.latches || []).slice(0, 500),
|
|
340
|
+
}),
|
|
341
|
+
signal: ctrl.signal,
|
|
342
|
+
});
|
|
343
|
+
clearTimeout(timer);
|
|
344
|
+
if (res.ok) {
|
|
345
|
+
try {
|
|
346
|
+
fs.unlinkSync(file);
|
|
347
|
+
}
|
|
348
|
+
catch { /* fine */ }
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch { /* network failed — spool stays for next flush */ }
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// ---------- Boot pull + freshness (D1: ride existing hook calls) -------------
|
|
355
|
+
/** GET the matchset and write the cache, preserving the local latch journal.
|
|
356
|
+
* Hard 3s timeout; any failure leaves the existing cache untouched. */
|
|
357
|
+
async function fetchAndCacheMatchset(apiUrl, apiKey, projectId) {
|
|
358
|
+
try {
|
|
359
|
+
const ctrl = new AbortController();
|
|
360
|
+
const timer = setTimeout(() => ctrl.abort(), 3000);
|
|
361
|
+
const res = await fetch(`${apiUrl}/v1/fix/triggers/matchset?projectId=${encodeURIComponent(projectId)}`, { headers: { 'Authorization': `Bearer ${apiKey}` }, signal: ctrl.signal });
|
|
362
|
+
clearTimeout(timer);
|
|
363
|
+
if (!res.ok)
|
|
364
|
+
return null;
|
|
365
|
+
const body = await res.json();
|
|
366
|
+
if (!body?.ok || typeof body.triggersVersion !== 'string')
|
|
367
|
+
return null;
|
|
368
|
+
const prior = readMatchsetCache(projectId);
|
|
369
|
+
writeMatchsetCache(projectId, {
|
|
370
|
+
triggersVersion: body.triggersVersion,
|
|
371
|
+
repairs: Array.isArray(body.repairs) ? body.repairs : [],
|
|
372
|
+
fetchedAt: new Date().toISOString(),
|
|
373
|
+
latchState: prior?.latchState || {},
|
|
374
|
+
});
|
|
375
|
+
return body.triggersVersion;
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
const REFRESH_MIN_AGE_MS = 120_000;
|
|
382
|
+
/** UserPromptSubmit freshness leg: when the cache is stale (>2 min since last
|
|
383
|
+
* server contact), spawn a detached `guard-refresh` child that re-fetches and
|
|
384
|
+
* rewrites the cache iff triggersVersion changed. Never blocks the turn. */
|
|
385
|
+
function maybeSpawnGuardRefresh(cwd, projectId) {
|
|
386
|
+
if (process.env.GREPRAG_GUARD_CHILD === '1')
|
|
387
|
+
return; // no child-of-child loops
|
|
388
|
+
const cache = readMatchsetCache(projectId);
|
|
389
|
+
if (cache?.fetchedAt) {
|
|
390
|
+
const age = Date.now() - Date.parse(cache.fetchedAt);
|
|
391
|
+
if (Number.isFinite(age) && age < REFRESH_MIN_AGE_MS)
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
const hookJs = path.join(__dirname, 'hook.js');
|
|
396
|
+
const child = (0, child_process_1.spawn)(process.execPath, [hookJs, 'guard-refresh'], {
|
|
397
|
+
cwd, detached: true, stdio: 'ignore',
|
|
398
|
+
env: { ...process.env, GREPRAG_GUARD_CHILD: '1' },
|
|
399
|
+
});
|
|
400
|
+
child.unref();
|
|
401
|
+
}
|
|
402
|
+
catch { /* best-effort */ }
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
|