@mnemonik/shared 7.112.1 → 7.112.2
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/gitEditDetector.d.ts +85 -0
- package/dist/gitEditDetector.d.ts.map +1 -1
- package/dist/gitEditDetector.js +305 -3
- package/dist/gitEditDetector.js.map +1 -1
- package/dist/hookRuntime.d.ts +20 -0
- package/dist/hookRuntime.d.ts.map +1 -1
- package/dist/hookRuntime.js +82 -9
- package/dist/hookRuntime.js.map +1 -1
- package/dist/hookTimeouts.d.ts +36 -0
- package/dist/hookTimeouts.d.ts.map +1 -1
- package/dist/hookTimeouts.js +37 -0
- package/dist/hookTimeouts.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/projectIdentityFile.d.ts.map +1 -1
- package/dist/projectIdentityFile.js +8 -2
- package/dist/projectIdentityFile.js.map +1 -1
- package/dist/projectSetupHandoff.d.ts +9 -0
- package/dist/projectSetupHandoff.d.ts.map +1 -1
- package/dist/projectSetupHandoff.js +178 -36
- package/dist/projectSetupHandoff.js.map +1 -1
- package/dist/usageGuide.d.ts +1 -1
- package/dist/usageGuide.d.ts.map +1 -1
- package/dist/usageGuide.js +1 -2
- package/dist/usageGuide.js.map +1 -1
- package/package.json +1 -1
- package/src/gitEditDetector.ts +347 -3
- package/src/hookRuntime.ts +96 -8
- package/src/hookTimeouts.ts +43 -0
- package/src/index.ts +6 -0
- package/src/projectIdentityFile.ts +10 -2
- package/src/projectSetupHandoff.ts +202 -42
- package/src/usageGuide.ts +1 -2
- package/tests/projectIdentity.test.ts +9 -0
|
@@ -74,4 +74,89 @@ export declare function diffGitDirtySnapshot(snapshotFile: string, cwd: string,
|
|
|
74
74
|
* report pre-existing dirt.
|
|
75
75
|
*/
|
|
76
76
|
export declare function addPathsToGitDirtySnapshot(snapshotFile: string, paths: string[]): void;
|
|
77
|
+
/**
|
|
78
|
+
* The fingerprint a host sends with an edit report: the first 32 hex chars of
|
|
79
|
+
* the sha256 of the file's current content, 'absent' when the file does not
|
|
80
|
+
* exist, undefined when it cannot be read, is not a regular file, or exceeds
|
|
81
|
+
* EDIT_FINGERPRINT_MAX_BYTES (the report then carries none and counts as
|
|
82
|
+
* before).
|
|
83
|
+
*
|
|
84
|
+
* Why: a report the server recorded but answered after the host's budget
|
|
85
|
+
* stays unconfirmed here and the next carrier's diff re-sends it. The server
|
|
86
|
+
* compares the fingerprint with the last one it recorded for the path, so the
|
|
87
|
+
* re-send of unchanged content is not counted as a second edit, while any
|
|
88
|
+
* further edit changes the content and is.
|
|
89
|
+
*/
|
|
90
|
+
export declare function editFingerprint(path: string, cwd?: string): string | undefined;
|
|
91
|
+
export declare const EDIT_REPORT_RETRY: {
|
|
92
|
+
/** Total time one hook event may spend on edit reports. */
|
|
93
|
+
readonly budgetMs: 1500;
|
|
94
|
+
/** One report's own ceiling (the shared POST_TOOL_TIMEOUT_MS). */
|
|
95
|
+
readonly attemptTimeoutMs: 1500;
|
|
96
|
+
/** Reports in flight at once. */
|
|
97
|
+
readonly concurrency: 4;
|
|
98
|
+
readonly maxAttempts: 5;
|
|
99
|
+
/** Backoff after the second failure; doubles per failure after that. */
|
|
100
|
+
readonly backoffBaseMs: 5000;
|
|
101
|
+
readonly backoffMaxMs: number;
|
|
102
|
+
/** A path pending longer than this since its first attempt is dropped. */
|
|
103
|
+
readonly expiryMs: number;
|
|
104
|
+
/** Pause after an event in which every attempt timed out. */
|
|
105
|
+
readonly hungServerPauseMs: 15000;
|
|
106
|
+
readonly rateLimitDefaultMs: 30000;
|
|
107
|
+
readonly rateLimitMaxMs: number;
|
|
108
|
+
/** Oldest pending paths beyond this are dropped. */
|
|
109
|
+
readonly maxPending: 200;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* The edit-report budget a hook event can still afford (CQ-033 review). The
|
|
113
|
+
* event's own work runs after its edit reports and the host kills the hook at
|
|
114
|
+
* its installed timeout, so the reports get only what is left of `deadlineMs`
|
|
115
|
+
* (the host timeout less a safety margin, measured from process start) after
|
|
116
|
+
* the time this process has already spent and `reserveMs`, the worst case of
|
|
117
|
+
* the event's own work still to come; capped at EDIT_REPORT_RETRY.budgetMs.
|
|
118
|
+
* Zero means send nothing now: every path stays pending for a later, lighter
|
|
119
|
+
* event. The per-event sums are pinned by tests/HookEventBudgets.test.ts.
|
|
120
|
+
*/
|
|
121
|
+
export declare function editReportBudgetMs(deadlineMs: number, reserveMs: number, elapsedMs?: number): number;
|
|
122
|
+
/** What one edit report achieved, as the sending host classifies it. */
|
|
123
|
+
export type EditReportResult = {
|
|
124
|
+
kind: 'confirmed';
|
|
125
|
+
} | {
|
|
126
|
+
kind: 'transient';
|
|
127
|
+
detail: string;
|
|
128
|
+
timedOut?: boolean;
|
|
129
|
+
} | {
|
|
130
|
+
kind: 'permanent';
|
|
131
|
+
detail: string;
|
|
132
|
+
} | {
|
|
133
|
+
kind: 'rate_limited';
|
|
134
|
+
retryAfterMs?: number;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Classify an HTTP answer to track-ide-edit. `body` is the parsed JSON, if any.
|
|
138
|
+
* `retryable: true` marks a failure that says nothing lasting (see above); an
|
|
139
|
+
* older server never sends it, so its `{ ok: false }` stays permanent.
|
|
140
|
+
*/
|
|
141
|
+
export declare function classifyEditReportResponse(status: number, body: unknown, retryAfter?: string | null): EditReportResult;
|
|
142
|
+
/** Paths whose report is pending and due now (retry on any hook event). */
|
|
143
|
+
export declare function pendingEditReports(snapshotFile: string, now?: number): string[];
|
|
144
|
+
/**
|
|
145
|
+
* Report edited paths under the bounded retry policy: this event's new paths
|
|
146
|
+
* plus every pending path now due. Call once per hook event (pass `paths: []`
|
|
147
|
+
* to deliver only pending ones). Confirmed and dropped paths join the dirty
|
|
148
|
+
* snapshot; the rest stay pending for a later event.
|
|
149
|
+
*/
|
|
150
|
+
export declare function reportEditsWithinBudget(options: {
|
|
151
|
+
snapshotFile: string;
|
|
152
|
+
paths: readonly string[];
|
|
153
|
+
send: (path: string, signal: AbortSignal) => Promise<EditReportResult>;
|
|
154
|
+
budgetMs?: number;
|
|
155
|
+
now?: () => number;
|
|
156
|
+
log?: (message: string) => void;
|
|
157
|
+
}): Promise<{
|
|
158
|
+
confirmed: string[];
|
|
159
|
+
dropped: string[];
|
|
160
|
+
deferred: string[];
|
|
161
|
+
}>;
|
|
77
162
|
//# sourceMappingURL=gitEditDetector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitEditDetector.d.ts","sourceRoot":"","sources":["../src/gitEditDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;
|
|
1
|
+
{"version":3,"file":"gitEditDetector.d.ts","sourceRoot":"","sources":["../src/gitEditDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAmDH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAuBvF;AAuGD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,MAAM,EAAE,CAqB9F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAWtF;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,GAAG,SAAS,CAS1E;AAgCD,eAAO,MAAM,iBAAiB;IAC5B,2DAA2D;aAC3D,QAAQ,EAAE,IAAK;IACf,kEAAkE;aAClE,gBAAgB,EAAE,IAAK;IACvB,iCAAiC;aACjC,WAAW,EAAE,CAAC;aACd,WAAW,EAAE,CAAC;IACd,wEAAwE;aACxE,aAAa,EAAE,IAAK;aACpB,YAAY;IACZ,0EAA0E;aAC1E,QAAQ;IACR,6DAA6D;aAC7D,iBAAiB,EAAE,KAAM;aACzB,kBAAkB,EAAE,KAAM;aAC1B,cAAc;IACd,oDAAoD;aACpD,UAAU,EAAE,GAAG;CACP,CAAC;AAEX;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAA0B,GACpC,MAAM,CAKR;AAED,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,gBAAgB,CAoBlB;AAyCD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,EAAE,CAMnF;AA6BD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA2F1E"}
|
package/dist/gitEditDetector.js
CHANGED
|
@@ -49,8 +49,10 @@
|
|
|
49
49
|
* the last observation count, and never a merge.
|
|
50
50
|
*/
|
|
51
51
|
import { execFileSync } from 'node:child_process';
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
52
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
53
|
+
import { mkdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
54
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
55
|
+
import { performance } from 'node:perf_hooks';
|
|
54
56
|
/** Bounded so a pathological repo cannot stall the hook's PostToolUse turn. */
|
|
55
57
|
const GIT_REV_PARSE_TIMEOUT_MS = 400;
|
|
56
58
|
const GIT_STATUS_TIMEOUT_MS = 800;
|
|
@@ -136,6 +138,31 @@ function committedPaths(cwd, root, from, to) {
|
|
|
136
138
|
.filter(Boolean)
|
|
137
139
|
.map((name) => join(root, name));
|
|
138
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Replace `file` whole: write a temporary file beside it, then rename it into
|
|
143
|
+
* place. Hook processes for one session run concurrently (parallel tool calls)
|
|
144
|
+
* and each rewrites the snapshot and the retry ledger; a plain writeFileSync
|
|
145
|
+
* truncates first, so a reader could see an empty or partial file and two
|
|
146
|
+
* writers could interleave into corrupt JSON. A rename is atomic on the same
|
|
147
|
+
* file system: a reader sees the old file or the new one. Concurrent writers
|
|
148
|
+
* still race (the last rename wins), which costs at most a re-sent report.
|
|
149
|
+
*/
|
|
150
|
+
function writeFileWhole(file, data) {
|
|
151
|
+
const temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
|
|
152
|
+
try {
|
|
153
|
+
writeFileSync(temporary, data, { mode: 0o600 });
|
|
154
|
+
renameSync(temporary, file);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
try {
|
|
158
|
+
unlinkSync(temporary);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Never written, or already renamed.
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
139
166
|
function readSnapshot(snapshotFile) {
|
|
140
167
|
try {
|
|
141
168
|
const parsed = JSON.parse(readFileSync(snapshotFile, 'utf8'));
|
|
@@ -164,7 +191,7 @@ function writeRoot(snapshotFile, root, entry) {
|
|
|
164
191
|
roots: total > MAX_SNAPSHOT_PATHS ? { [root]: entry } : roots,
|
|
165
192
|
};
|
|
166
193
|
mkdirSync(dirname(snapshotFile), { recursive: true, mode: 0o700 });
|
|
167
|
-
|
|
194
|
+
writeFileWhole(snapshotFile, JSON.stringify(snapshot));
|
|
168
195
|
}
|
|
169
196
|
catch {
|
|
170
197
|
// Best-effort: a missing snapshot degrades to "report nothing", never to a
|
|
@@ -239,4 +266,279 @@ export function addPathsToGitDirtySnapshot(snapshotFile, paths) {
|
|
|
239
266
|
writeRoot(snapshotFile, root, entry);
|
|
240
267
|
}
|
|
241
268
|
}
|
|
269
|
+
/** Largest file whose content is hashed for an edit fingerprint, in bytes. */
|
|
270
|
+
const EDIT_FINGERPRINT_MAX_BYTES = 8 * 1024 * 1024;
|
|
271
|
+
/**
|
|
272
|
+
* The fingerprint a host sends with an edit report: the first 32 hex chars of
|
|
273
|
+
* the sha256 of the file's current content, 'absent' when the file does not
|
|
274
|
+
* exist, undefined when it cannot be read, is not a regular file, or exceeds
|
|
275
|
+
* EDIT_FINGERPRINT_MAX_BYTES (the report then carries none and counts as
|
|
276
|
+
* before).
|
|
277
|
+
*
|
|
278
|
+
* Why: a report the server recorded but answered after the host's budget
|
|
279
|
+
* stays unconfirmed here and the next carrier's diff re-sends it. The server
|
|
280
|
+
* compares the fingerprint with the last one it recorded for the path, so the
|
|
281
|
+
* re-send of unchanged content is not counted as a second edit, while any
|
|
282
|
+
* further edit changes the content and is.
|
|
283
|
+
*/
|
|
284
|
+
export function editFingerprint(path, cwd = '') {
|
|
285
|
+
const absolute = isAbsolute(path) ? path : join(cwd, path);
|
|
286
|
+
try {
|
|
287
|
+
const stat = statSync(absolute);
|
|
288
|
+
if (!stat.isFile() || stat.size > EDIT_FINGERPRINT_MAX_BYTES)
|
|
289
|
+
return undefined;
|
|
290
|
+
return createHash('sha256').update(readFileSync(absolute)).digest('hex').slice(0, 32);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
return error.code === 'ENOENT' ? 'absent' : undefined;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ─── Bounded edit-report retry ─────────────────────────────────────────────
|
|
297
|
+
//
|
|
298
|
+
// An edit report the server did not confirm stays pending so a later event
|
|
299
|
+
// can deliver it (CQ-033). Unbounded, that meant every later event re-sent
|
|
300
|
+
// every pending path one by one with a 1.5 s timeout each, forever: a hung or
|
|
301
|
+
// refusing server stalled each hook by ~1.5 s per pending path, past the
|
|
302
|
+
// host's hook timeout (Codex and Grok kill the hook at 5 s; Cursor at 30 s,
|
|
303
|
+
// where it also delayed the catastrophic-command deny check), and permanent
|
|
304
|
+
// refusals were retried for the life of the session. One policy for every
|
|
305
|
+
// host bounds it:
|
|
306
|
+
//
|
|
307
|
+
// - one call per hook event, inside a total time budget well under the
|
|
308
|
+
// shortest host hook timeout; attempts run a few at a time, each capped by
|
|
309
|
+
// the per-attempt timeout and by what is left of the budget;
|
|
310
|
+
// - per path: the first failure retries on the next event, later failures
|
|
311
|
+
// back off exponentially; after EDIT_REPORT_RETRY.maxAttempts attempts, or
|
|
312
|
+
// EDIT_REPORT_RETRY.expiryMs after the first, the path is dropped;
|
|
313
|
+
// - a permanent refusal (4xx other than 408/429, or `{ ok: false }`) drops
|
|
314
|
+
// the path at once; an answer marked `retryable: true` is not a refusal:
|
|
315
|
+
// the server could not check the credential (a database blip) or the hook's
|
|
316
|
+
// own credential could not be used this time (fetchWithHookCredential's 503
|
|
317
|
+
// marker), so it retries like any other transient failure; 429 pauses every
|
|
318
|
+
// report until its Retry-After; an event whose every attempt timed out
|
|
319
|
+
// pauses reports briefly (the server hangs);
|
|
320
|
+
// - a dropped path joins the dirty snapshot exactly as a confirmed one does,
|
|
321
|
+
// so no later diff re-reports it, and the drop is logged at debug level.
|
|
322
|
+
//
|
|
323
|
+
// Pending state lives beside the dirty snapshot (`<snapshotFile>.retries`),
|
|
324
|
+
// per session. The host's caller runs its safety/deny logic before this.
|
|
325
|
+
export const EDIT_REPORT_RETRY = {
|
|
326
|
+
/** Total time one hook event may spend on edit reports. */
|
|
327
|
+
budgetMs: 1_500,
|
|
328
|
+
/** One report's own ceiling (the shared POST_TOOL_TIMEOUT_MS). */
|
|
329
|
+
attemptTimeoutMs: 1_500,
|
|
330
|
+
/** Reports in flight at once. */
|
|
331
|
+
concurrency: 4,
|
|
332
|
+
maxAttempts: 5,
|
|
333
|
+
/** Backoff after the second failure; doubles per failure after that. */
|
|
334
|
+
backoffBaseMs: 5_000,
|
|
335
|
+
backoffMaxMs: 5 * 60_000,
|
|
336
|
+
/** A path pending longer than this since its first attempt is dropped. */
|
|
337
|
+
expiryMs: 30 * 60_000,
|
|
338
|
+
/** Pause after an event in which every attempt timed out. */
|
|
339
|
+
hungServerPauseMs: 15_000,
|
|
340
|
+
rateLimitDefaultMs: 30_000,
|
|
341
|
+
rateLimitMaxMs: 5 * 60_000,
|
|
342
|
+
/** Oldest pending paths beyond this are dropped. */
|
|
343
|
+
maxPending: 200,
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* The edit-report budget a hook event can still afford (CQ-033 review). The
|
|
347
|
+
* event's own work runs after its edit reports and the host kills the hook at
|
|
348
|
+
* its installed timeout, so the reports get only what is left of `deadlineMs`
|
|
349
|
+
* (the host timeout less a safety margin, measured from process start) after
|
|
350
|
+
* the time this process has already spent and `reserveMs`, the worst case of
|
|
351
|
+
* the event's own work still to come; capped at EDIT_REPORT_RETRY.budgetMs.
|
|
352
|
+
* Zero means send nothing now: every path stays pending for a later, lighter
|
|
353
|
+
* event. The per-event sums are pinned by tests/HookEventBudgets.test.ts.
|
|
354
|
+
*/
|
|
355
|
+
export function editReportBudgetMs(deadlineMs, reserveMs, elapsedMs = performance.now()) {
|
|
356
|
+
return Math.max(0, Math.min(EDIT_REPORT_RETRY.budgetMs, Math.floor(deadlineMs - reserveMs - elapsedMs)));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Classify an HTTP answer to track-ide-edit. `body` is the parsed JSON, if any.
|
|
360
|
+
* `retryable: true` marks a failure that says nothing lasting (see above); an
|
|
361
|
+
* older server never sends it, so its `{ ok: false }` stays permanent.
|
|
362
|
+
*/
|
|
363
|
+
export function classifyEditReportResponse(status, body, retryAfter) {
|
|
364
|
+
const retryable = body?.retryable === true;
|
|
365
|
+
if (status >= 200 && status < 300) {
|
|
366
|
+
const ok = body?.ok;
|
|
367
|
+
if (ok === true)
|
|
368
|
+
return { kind: 'confirmed' };
|
|
369
|
+
if (ok === false && retryable)
|
|
370
|
+
return { kind: 'transient', detail: 'ok:false retryable' };
|
|
371
|
+
if (ok === false)
|
|
372
|
+
return { kind: 'permanent', detail: 'ok:false' };
|
|
373
|
+
return { kind: 'transient', detail: 'unreadable response' };
|
|
374
|
+
}
|
|
375
|
+
if (status === 429) {
|
|
376
|
+
const seconds = retryAfter ? Number(retryAfter) : NaN;
|
|
377
|
+
return {
|
|
378
|
+
kind: 'rate_limited',
|
|
379
|
+
...(Number.isFinite(seconds) && seconds >= 0 ? { retryAfterMs: seconds * 1000 } : {}),
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (status >= 400 && status < 500 && status !== 408 && !retryable) {
|
|
383
|
+
return { kind: 'permanent', detail: `HTTP ${status}` };
|
|
384
|
+
}
|
|
385
|
+
return { kind: 'transient', detail: `HTTP ${status}` };
|
|
386
|
+
}
|
|
387
|
+
function ledgerFile(snapshotFile) {
|
|
388
|
+
return `${snapshotFile}.retries`;
|
|
389
|
+
}
|
|
390
|
+
function readLedger(snapshotFile) {
|
|
391
|
+
if (!snapshotFile)
|
|
392
|
+
return { v: 1, pending: {} };
|
|
393
|
+
try {
|
|
394
|
+
const parsed = JSON.parse(readFileSync(ledgerFile(snapshotFile), 'utf8'));
|
|
395
|
+
if (parsed?.v === 1 && typeof parsed.pending === 'object' && parsed.pending !== null) {
|
|
396
|
+
return parsed;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
// Missing or unreadable: start empty.
|
|
401
|
+
}
|
|
402
|
+
return { v: 1, pending: {} };
|
|
403
|
+
}
|
|
404
|
+
function writeLedger(snapshotFile, ledger) {
|
|
405
|
+
if (!snapshotFile)
|
|
406
|
+
return;
|
|
407
|
+
try {
|
|
408
|
+
mkdirSync(dirname(snapshotFile), { recursive: true, mode: 0o700 });
|
|
409
|
+
writeFileWhole(ledgerFile(snapshotFile), JSON.stringify(ledger));
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
// Best-effort: a lost ledger costs at most one extra attempt per path.
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** Paths whose report is pending and due now (retry on any hook event). */
|
|
416
|
+
export function pendingEditReports(snapshotFile, now = Date.now()) {
|
|
417
|
+
const ledger = readLedger(snapshotFile);
|
|
418
|
+
if ((ledger.pausedUntil ?? 0) > now)
|
|
419
|
+
return [];
|
|
420
|
+
return Object.entries(ledger.pending)
|
|
421
|
+
.filter(([, entry]) => entry.nextAt <= now)
|
|
422
|
+
.map(([path]) => path);
|
|
423
|
+
}
|
|
424
|
+
async function attemptReport(path, send, timeoutMs) {
|
|
425
|
+
const controller = new AbortController();
|
|
426
|
+
let timer;
|
|
427
|
+
const timedOut = new Promise((resolveTimeout) => {
|
|
428
|
+
timer = setTimeout(() => {
|
|
429
|
+
controller.abort();
|
|
430
|
+
resolveTimeout({ kind: 'transient', detail: 'timeout', timedOut: true });
|
|
431
|
+
}, timeoutMs);
|
|
432
|
+
});
|
|
433
|
+
try {
|
|
434
|
+
return await Promise.race([
|
|
435
|
+
send(path, controller.signal).catch((error) => ({
|
|
436
|
+
kind: 'transient',
|
|
437
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
438
|
+
timedOut: controller.signal.aborted,
|
|
439
|
+
})),
|
|
440
|
+
timedOut,
|
|
441
|
+
]);
|
|
442
|
+
}
|
|
443
|
+
finally {
|
|
444
|
+
clearTimeout(timer);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Report edited paths under the bounded retry policy: this event's new paths
|
|
449
|
+
* plus every pending path now due. Call once per hook event (pass `paths: []`
|
|
450
|
+
* to deliver only pending ones). Confirmed and dropped paths join the dirty
|
|
451
|
+
* snapshot; the rest stay pending for a later event.
|
|
452
|
+
*/
|
|
453
|
+
export async function reportEditsWithinBudget(options) {
|
|
454
|
+
const now = options.now ?? Date.now;
|
|
455
|
+
// Debug level: silent unless MNEMONIK_HOOK_DEBUG is set (hook stderr can
|
|
456
|
+
// reach the host's UI).
|
|
457
|
+
const log = options.log ??
|
|
458
|
+
((message) => {
|
|
459
|
+
if (process.env.MNEMONIK_HOOK_DEBUG)
|
|
460
|
+
process.stderr.write(`${message}\n`);
|
|
461
|
+
});
|
|
462
|
+
const policy = EDIT_REPORT_RETRY;
|
|
463
|
+
const start = now();
|
|
464
|
+
const deadline = start + (options.budgetMs ?? policy.budgetMs);
|
|
465
|
+
const ledger = readLedger(options.snapshotFile);
|
|
466
|
+
const confirmed = [];
|
|
467
|
+
const dropped = [];
|
|
468
|
+
const drop = (path, why) => {
|
|
469
|
+
delete ledger.pending[path];
|
|
470
|
+
dropped.push(path);
|
|
471
|
+
log(`mnemonik: edit report for ${path} dropped (${why})`);
|
|
472
|
+
};
|
|
473
|
+
for (const [path, entry] of Object.entries(ledger.pending)) {
|
|
474
|
+
if (start - entry.firstAt > policy.expiryMs)
|
|
475
|
+
drop(path, 'expired');
|
|
476
|
+
}
|
|
477
|
+
for (const path of options.paths) {
|
|
478
|
+
ledger.pending[path] ??= { attempts: 0, firstAt: start, nextAt: start };
|
|
479
|
+
}
|
|
480
|
+
const due = [...new Set([...options.paths, ...Object.keys(ledger.pending)])].filter((path) => ledger.pending[path] && ledger.pending[path].nextAt <= start);
|
|
481
|
+
let queue = (ledger.pausedUntil ?? 0) > start ? [] : due;
|
|
482
|
+
while (queue.length > 0) {
|
|
483
|
+
const remaining = deadline - now();
|
|
484
|
+
if (remaining <= 0)
|
|
485
|
+
break;
|
|
486
|
+
const wave = queue.slice(0, policy.concurrency);
|
|
487
|
+
queue = queue.slice(policy.concurrency);
|
|
488
|
+
const timeout = Math.min(policy.attemptTimeoutMs, remaining);
|
|
489
|
+
const results = await Promise.all(wave.map(async (path) => [path, await attemptReport(path, options.send, timeout)]));
|
|
490
|
+
const at = now();
|
|
491
|
+
let rateLimited = false;
|
|
492
|
+
for (const [path, result] of results) {
|
|
493
|
+
const entry = ledger.pending[path];
|
|
494
|
+
if (!entry)
|
|
495
|
+
continue;
|
|
496
|
+
if (result.kind === 'confirmed') {
|
|
497
|
+
delete ledger.pending[path];
|
|
498
|
+
confirmed.push(path);
|
|
499
|
+
}
|
|
500
|
+
else if (result.kind === 'permanent') {
|
|
501
|
+
drop(path, result.detail);
|
|
502
|
+
}
|
|
503
|
+
else if (result.kind === 'rate_limited') {
|
|
504
|
+
rateLimited = true;
|
|
505
|
+
const pause = Math.min(result.retryAfterMs ?? policy.rateLimitDefaultMs, policy.rateLimitMaxMs);
|
|
506
|
+
ledger.pausedUntil = Math.max(ledger.pausedUntil ?? 0, at + pause);
|
|
507
|
+
entry.nextAt = ledger.pausedUntil;
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
entry.attempts += 1;
|
|
511
|
+
if (entry.attempts >= policy.maxAttempts) {
|
|
512
|
+
drop(path, `${entry.attempts} attempts, last: ${result.detail}`);
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
entry.nextAt =
|
|
516
|
+
entry.attempts <= 1
|
|
517
|
+
? at
|
|
518
|
+
: at +
|
|
519
|
+
Math.min(policy.backoffBaseMs * 2 ** (entry.attempts - 2), policy.backoffMaxMs);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
if (rateLimited)
|
|
524
|
+
break;
|
|
525
|
+
if (results.every(([, result]) => result.kind === 'transient' && result.timedOut)) {
|
|
526
|
+
ledger.pausedUntil = at + policy.hungServerPauseMs;
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
const pendingPaths = Object.keys(ledger.pending);
|
|
531
|
+
if (pendingPaths.length > policy.maxPending) {
|
|
532
|
+
pendingPaths
|
|
533
|
+
.sort((a, b) => (ledger.pending[a]?.firstAt ?? 0) - (ledger.pending[b]?.firstAt ?? 0))
|
|
534
|
+
.slice(0, pendingPaths.length - policy.maxPending)
|
|
535
|
+
.forEach((path) => drop(path, 'too many pending reports'));
|
|
536
|
+
}
|
|
537
|
+
if ((ledger.pausedUntil ?? 0) <= now())
|
|
538
|
+
delete ledger.pausedUntil;
|
|
539
|
+
addPathsToGitDirtySnapshot(options.snapshotFile, [...confirmed, ...dropped]);
|
|
540
|
+
writeLedger(options.snapshotFile, ledger);
|
|
541
|
+
const deferred = Object.keys(ledger.pending);
|
|
542
|
+
return { confirmed, dropped, deferred };
|
|
543
|
+
}
|
|
242
544
|
//# sourceMappingURL=gitEditDetector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitEditDetector.js","sourceRoot":"","sources":["../src/gitEditDetector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gitEditDetector.js","sourceRoot":"","sources":["../src/gitEditDetector.ts"],"names":[],"mappings":"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"}
|
package/dist/hookRuntime.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface ProjectIdentity {
|
|
|
5
5
|
projectName?: string;
|
|
6
6
|
projectRoot: string;
|
|
7
7
|
}
|
|
8
|
+
/** Forget cached resolutions (after project setup wrote a `.mnemonik.json`). */
|
|
9
|
+
export declare function clearProjectIdentityCache(): void;
|
|
8
10
|
export declare function findProjectIdentity(startCwd: string, options?: {
|
|
9
11
|
allowNestedInherit?: boolean;
|
|
10
12
|
maxDepth?: number;
|
|
@@ -13,6 +15,24 @@ export declare function findProjectIdentityDetailed(startCwd: string, options?:
|
|
|
13
15
|
allowNestedInherit?: boolean;
|
|
14
16
|
maxDepth?: number;
|
|
15
17
|
}): Promise<ProjectIdentityResolution>;
|
|
18
|
+
/** Largest hook payload read from stdin; a bigger one fails open. */
|
|
19
|
+
export declare const HOOK_STDIN_MAX_BYTES = 1048576;
|
|
20
|
+
/**
|
|
21
|
+
* Read a hook's stdin payload, bounded in size and in time. Resolves the text
|
|
22
|
+
* (a leading BOM removed) when the host closes stdin, or when `timeoutMs`
|
|
23
|
+
* passes first: then with whatever arrived, which the caller parses like any
|
|
24
|
+
* other payload (a partial one fails to parse and the hook fails open).
|
|
25
|
+
* Resolves null past `maxBytes` or on a stream error. After the timeout or
|
|
26
|
+
* the cap the stream is destroyed, so an unclosed pipe no longer holds the
|
|
27
|
+
* process open (Grok's hook returns without calling exit).
|
|
28
|
+
*/
|
|
29
|
+
export declare function readHookStdin(options?: {
|
|
30
|
+
stream?: NodeJS.ReadableStream & {
|
|
31
|
+
destroy?: () => void;
|
|
32
|
+
};
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
maxBytes?: number;
|
|
35
|
+
}): Promise<string | null>;
|
|
16
36
|
export declare function parseHookResponse<T>(response: Response): Promise<T>;
|
|
17
37
|
/** Native host correlation only; never accept checkpoint/model fields here. */
|
|
18
38
|
export declare function validHookSessionId(value: unknown): value is string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookRuntime.d.ts","sourceRoot":"","sources":["../src/hookRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"hookRuntime.d.ts","sourceRoot":"","sources":["../src/hookRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5E,OAAO,EAA0B,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuBjC;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,yBAAyB,CAAC,CAEpC;AAED,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,UAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB;AAID,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAYzE;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMlE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;UAO5B,OAAO;GAC3E;AAED;2EAC2E;AAC3E,wBAAsB,eAAe,CACnC,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,EAChD,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CA2Gf;AAED,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
|
package/dist/hookRuntime.js
CHANGED
|
@@ -1,21 +1,94 @@
|
|
|
1
1
|
import { protectWindowsDirectory } from './runtimeSigners.js';
|
|
2
|
-
import { stderr } from 'node:process';
|
|
2
|
+
import { stderr, stdin } from 'node:process';
|
|
3
|
+
import { HOOK_STDIN_TIMEOUT_MS } from './hookTimeouts.js';
|
|
3
4
|
import { resolveProjectIdentity } from './repositoryRoot.js';
|
|
5
|
+
/**
|
|
6
|
+
* One resolution per directory per process. A hook process serves one event,
|
|
7
|
+
* and its handlers resolve the same cwd several times in sequence (each
|
|
8
|
+
* request builder, each gate report); every resolution runs `git rev-parse`
|
|
9
|
+
* with a 2 s timeout, so on a slow or hung git the repeats alone could pass
|
|
10
|
+
* the host's 5 s hook timeout. Only hook runtimes call this (short-lived
|
|
11
|
+
* processes); project setup clears it after it writes an identity.
|
|
12
|
+
*/
|
|
13
|
+
const identityCache = new Map();
|
|
14
|
+
/** Forget cached resolutions (after project setup wrote a `.mnemonik.json`). */
|
|
15
|
+
export function clearProjectIdentityCache() {
|
|
16
|
+
identityCache.clear();
|
|
17
|
+
}
|
|
4
18
|
export async function findProjectIdentity(startCwd, options = {}) {
|
|
5
19
|
if (!startCwd)
|
|
6
20
|
return null;
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
const key = JSON.stringify([
|
|
22
|
+
startCwd,
|
|
23
|
+
options.allowNestedInherit ?? null,
|
|
24
|
+
options.maxDepth ?? null,
|
|
25
|
+
]);
|
|
26
|
+
let pending = identityCache.get(key);
|
|
27
|
+
if (!pending) {
|
|
28
|
+
pending = findProjectIdentityDetailed(startCwd, options).then((result) => result.kind === 'ok'
|
|
29
|
+
? {
|
|
30
|
+
projectId: result.identity.projectId,
|
|
31
|
+
projectName: result.identity.projectName,
|
|
32
|
+
projectRoot: result.root,
|
|
33
|
+
}
|
|
34
|
+
: null);
|
|
35
|
+
identityCache.set(key, pending);
|
|
36
|
+
// A failure is not an answer: the next caller resolves afresh.
|
|
37
|
+
pending.catch(() => identityCache.delete(key));
|
|
38
|
+
}
|
|
39
|
+
return pending;
|
|
15
40
|
}
|
|
16
41
|
export async function findProjectIdentityDetailed(startCwd, options = {}) {
|
|
17
42
|
return resolveProjectIdentity(startCwd, options);
|
|
18
43
|
}
|
|
44
|
+
/** Largest hook payload read from stdin; a bigger one fails open. */
|
|
45
|
+
export const HOOK_STDIN_MAX_BYTES = 1_048_576;
|
|
46
|
+
/**
|
|
47
|
+
* Read a hook's stdin payload, bounded in size and in time. Resolves the text
|
|
48
|
+
* (a leading BOM removed) when the host closes stdin, or when `timeoutMs`
|
|
49
|
+
* passes first: then with whatever arrived, which the caller parses like any
|
|
50
|
+
* other payload (a partial one fails to parse and the hook fails open).
|
|
51
|
+
* Resolves null past `maxBytes` or on a stream error. After the timeout or
|
|
52
|
+
* the cap the stream is destroyed, so an unclosed pipe no longer holds the
|
|
53
|
+
* process open (Grok's hook returns without calling exit).
|
|
54
|
+
*/
|
|
55
|
+
export function readHookStdin(options = {}) {
|
|
56
|
+
const stream = options.stream ?? stdin;
|
|
57
|
+
const maxBytes = options.maxBytes ?? HOOK_STDIN_MAX_BYTES;
|
|
58
|
+
return new Promise((resolve) => {
|
|
59
|
+
const chunks = [];
|
|
60
|
+
let bytes = 0;
|
|
61
|
+
let settled = false;
|
|
62
|
+
const text = () => Buffer.concat(chunks)
|
|
63
|
+
.toString('utf8')
|
|
64
|
+
.replace(/^\uFEFF/, '');
|
|
65
|
+
const finish = (value, release) => {
|
|
66
|
+
if (settled)
|
|
67
|
+
return;
|
|
68
|
+
settled = true;
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
stream.removeListener('data', onData);
|
|
71
|
+
stream.removeListener('end', onEnd);
|
|
72
|
+
if (release) {
|
|
73
|
+
stream.pause();
|
|
74
|
+
stream.destroy?.();
|
|
75
|
+
}
|
|
76
|
+
resolve(value);
|
|
77
|
+
};
|
|
78
|
+
const onData = (chunk) => {
|
|
79
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk;
|
|
80
|
+
bytes += buffer.length;
|
|
81
|
+
if (bytes > maxBytes)
|
|
82
|
+
return finish(null, true);
|
|
83
|
+
chunks.push(buffer);
|
|
84
|
+
};
|
|
85
|
+
const onEnd = () => finish(text(), false);
|
|
86
|
+
const timer = setTimeout(() => finish(text(), true), options.timeoutMs ?? HOOK_STDIN_TIMEOUT_MS);
|
|
87
|
+
stream.on('data', onData);
|
|
88
|
+
stream.on('end', onEnd);
|
|
89
|
+
stream.on('error', () => finish(null, false));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
19
92
|
let mismatchEmitted = false;
|
|
20
93
|
export async function parseHookResponse(response) {
|
|
21
94
|
const body = (await response.json());
|