@mnemonik/claude-code-hooks 0.1.6 → 0.2.1
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/hook.js +294 -7
- package/dist/hook.js.map +1 -1
- package/dist/install.js +32 -8
- package/dist/install.js.map +1 -1
- package/dist/lib/http.d.ts +52 -1
- package/dist/lib/http.js +192 -0
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/shellTokens.d.ts +12 -1
- package/dist/lib/shellTokens.js +76 -17
- package/dist/lib/shellTokens.js.map +1 -1
- package/dist/lib/types.d.ts +50 -0
- package/dist/lib/types.js +9 -0
- package/dist/lib/types.js.map +1 -1
- package/package.json +2 -2
package/dist/hook.js
CHANGED
|
@@ -13,10 +13,16 @@ import { existsSync } from 'node:fs';
|
|
|
13
13
|
import { isAbsolute, resolve } from 'node:path';
|
|
14
14
|
import { stdin, stdout, stderr, exit } from 'node:process';
|
|
15
15
|
import { isNonInteractive, parseBypass, resolveConfig } from './lib/env.js';
|
|
16
|
-
import { fetchFileContext, fetchSnapshot, reportBypass, reportGateFired } from './lib/http.js';
|
|
16
|
+
import { createPreCompactSnapshot, fetchBootstrap, fetchFileContext, fetchPromptContext, fetchSnapshot, markSessionStart, markStopBlocked, postSessionEnd, reportBypass, reportGateFired, } from './lib/http.js';
|
|
17
17
|
import { BUILT_IN_DESTRUCTIVE, matchCommand, tokenize } from './lib/shellTokens.js';
|
|
18
18
|
const POLICY_DEDUP_WINDOW_MS = 60_000;
|
|
19
|
-
|
|
19
|
+
// Was 60s — bumped to 5min so a single mustConfirm pause emitted by the
|
|
20
|
+
// agent covers a batch of related destructive commands the user pre-
|
|
21
|
+
// authorized in one go (e.g. "ship all changes" → 6+ git pushes/commits).
|
|
22
|
+
// 60s was forcing the gate to nag per-command on every batch. 5min still
|
|
23
|
+
// expires before stale state becomes a problem, and the agent can re-emit
|
|
24
|
+
// a fresh pause if it does another batch later.
|
|
25
|
+
const MUST_CONFIRM_DEDUP_WINDOW_MS = 300_000;
|
|
20
26
|
// ─── Decision writers ──────────────────────────────────────────────────────
|
|
21
27
|
function writeDecision(decision) {
|
|
22
28
|
if (decision !== null) {
|
|
@@ -270,12 +276,14 @@ async function handlePreBash(input, config) {
|
|
|
270
276
|
const projectForbidden = snapshot.policies.forbiddenCommand.map((p) => p.pattern);
|
|
271
277
|
const projectMustConfirm = snapshot.policies.mustConfirm.map((p) => p.pattern);
|
|
272
278
|
const forbiddenPatterns = [...BUILT_IN_DESTRUCTIVE, ...projectForbidden];
|
|
273
|
-
const { commands } = tokenize(command);
|
|
279
|
+
const { commands, wasQuoted } = tokenize(command);
|
|
274
280
|
let forbiddenHit = null;
|
|
275
281
|
let mustConfirmHit = null;
|
|
276
|
-
for (
|
|
277
|
-
|
|
278
|
-
|
|
282
|
+
for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
|
|
283
|
+
const tokens = commands[cmdIdx];
|
|
284
|
+
const quotedFlags = wasQuoted[cmdIdx];
|
|
285
|
+
forbiddenHit = forbiddenHit ?? matchCommand(tokens, forbiddenPatterns, quotedFlags);
|
|
286
|
+
mustConfirmHit = mustConfirmHit ?? matchCommand(tokens, projectMustConfirm, quotedFlags);
|
|
279
287
|
if (forbiddenHit && mustConfirmHit)
|
|
280
288
|
break;
|
|
281
289
|
}
|
|
@@ -338,6 +346,265 @@ async function handlePreBash(input, config) {
|
|
|
338
346
|
};
|
|
339
347
|
writeDecision(decision);
|
|
340
348
|
}
|
|
349
|
+
// ─── SessionStart: bootstrap pre-injection (P5) ─────────────────────────────
|
|
350
|
+
/**
|
|
351
|
+
* Synchronously fetch session_bootstrap and inject the rendered context as
|
|
352
|
+
* additionalContext so the agent sees its tasks/policies/synthesis before
|
|
353
|
+
* responding to the first prompt. Marks the project's coord key so the proxy
|
|
354
|
+
* suppresses NO_BOOTSTRAP for this developer/project pair.
|
|
355
|
+
*
|
|
356
|
+
* Always-on side-effect — there is nothing to gate. On any failure we silently
|
|
357
|
+
* fall back to today's behavior (proxy emits NO_BOOTSTRAP, agent calls the
|
|
358
|
+
* tool itself).
|
|
359
|
+
*/
|
|
360
|
+
async function handleSessionStart(input, config) {
|
|
361
|
+
if (config.contextualHooks.sessionStartBootstrap === 'off')
|
|
362
|
+
writeAllow();
|
|
363
|
+
if (!config.apiKey)
|
|
364
|
+
writeAllow();
|
|
365
|
+
const result = await fetchBootstrap({
|
|
366
|
+
server: config.server,
|
|
367
|
+
apiKey: config.apiKey,
|
|
368
|
+
cwd: input.cwd,
|
|
369
|
+
claudeSessionId: input.session_id,
|
|
370
|
+
});
|
|
371
|
+
if (!result || !result.ok)
|
|
372
|
+
writeAllow();
|
|
373
|
+
// Mark coord key (fire-and-forget but awaited so the next API request sees it).
|
|
374
|
+
await markSessionStart({
|
|
375
|
+
server: config.server,
|
|
376
|
+
apiKey: config.apiKey,
|
|
377
|
+
cwd: input.cwd,
|
|
378
|
+
claudeSessionId: input.session_id,
|
|
379
|
+
});
|
|
380
|
+
// Render a compact summary for additionalContext. The bootstrap payload is
|
|
381
|
+
// structured JSON; we surface the high-leverage parts (synthesis + pending
|
|
382
|
+
// tasks + active policy count) so the agent sees the directional signal.
|
|
383
|
+
const additionalContext = formatBootstrapForInjection(result.payload);
|
|
384
|
+
if (!additionalContext)
|
|
385
|
+
writeAllow();
|
|
386
|
+
const decision = {
|
|
387
|
+
hookSpecificOutput: {
|
|
388
|
+
hookEventName: 'SessionStart',
|
|
389
|
+
additionalContext,
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
writeDecision(decision);
|
|
393
|
+
}
|
|
394
|
+
function formatBootstrapForInjection(payload) {
|
|
395
|
+
if (!payload || typeof payload !== 'object')
|
|
396
|
+
return null;
|
|
397
|
+
const p = payload;
|
|
398
|
+
const lines = ['Mnemonik bootstrap (pre-injected by SessionStart hook):'];
|
|
399
|
+
const synthesis = typeof p.synthesis === 'string' ? p.synthesis.trim() : '';
|
|
400
|
+
if (synthesis) {
|
|
401
|
+
// Cap synthesis at ~600 chars — enough for the directional signal without
|
|
402
|
+
// hijacking the prompt budget.
|
|
403
|
+
lines.push(`Synthesis: ${synthesis.slice(0, 600)}${synthesis.length > 600 ? '…' : ''}`);
|
|
404
|
+
}
|
|
405
|
+
const tasks = Array.isArray(p.pendingTasks) ? p.pendingTasks : [];
|
|
406
|
+
if (tasks.length > 0) {
|
|
407
|
+
const top = tasks
|
|
408
|
+
.slice(0, 5)
|
|
409
|
+
.map((t) => {
|
|
410
|
+
if (typeof t === 'string')
|
|
411
|
+
return t.slice(0, 120);
|
|
412
|
+
if (t && typeof t === 'object' && typeof t.text === 'string') {
|
|
413
|
+
return t.text.slice(0, 120);
|
|
414
|
+
}
|
|
415
|
+
return null;
|
|
416
|
+
})
|
|
417
|
+
.filter((s) => s !== null);
|
|
418
|
+
if (top.length > 0) {
|
|
419
|
+
lines.push(`Pending tasks (${tasks.length}): ${top.join(' | ')}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const policies = Array.isArray(p.policies)
|
|
423
|
+
? p.policies
|
|
424
|
+
: Array.isArray(p.allPolicies)
|
|
425
|
+
? p.allPolicies
|
|
426
|
+
: [];
|
|
427
|
+
if (policies.length > 0) {
|
|
428
|
+
lines.push(`Active policies: ${policies.length} (call policy({ action: "check" }) before risky Bash).`);
|
|
429
|
+
}
|
|
430
|
+
const directive = typeof p.directiveMessage === 'string' ? p.directiveMessage : '';
|
|
431
|
+
if (directive) {
|
|
432
|
+
lines.push(`Directive: ${directive.slice(0, 400)}`);
|
|
433
|
+
}
|
|
434
|
+
lines.push('session_bootstrap was already loaded — do not call it again. Continue with memory_search before tasks, file_context before edits, checkpoint after changes.');
|
|
435
|
+
return lines.length > 1 ? lines.join('\n') : null;
|
|
436
|
+
}
|
|
437
|
+
// ─── Stop: checkpoint gate (P5) ─────────────────────────────────────────────
|
|
438
|
+
/**
|
|
439
|
+
* Refuse-to-stop / nudge when meaningful work happened without a checkpoint.
|
|
440
|
+
* Mode-controlled: advisory emits a systemMessage nudge, enforce returns
|
|
441
|
+
* decision:"block". Honors the bypass envelope identically to PreEdit/PreBash.
|
|
442
|
+
*
|
|
443
|
+
* Trigger is narrow — only fires when:
|
|
444
|
+
* - Server reports editedFiles.length > 0 in the active session, AND
|
|
445
|
+
* - Server reports lastCheckpointAt is null OR older than the start of the
|
|
446
|
+
* edit activity (we approximate by comparing to lastCheckpointAt only).
|
|
447
|
+
*/
|
|
448
|
+
async function handleStop(input, config) {
|
|
449
|
+
const mode = config.contextualHooks.stopCheckpointGate;
|
|
450
|
+
if (mode === 'off') {
|
|
451
|
+
await emitGateFired(input, config, 'Stop', 'off', 'off');
|
|
452
|
+
writeAllow();
|
|
453
|
+
}
|
|
454
|
+
if (!config.apiKey)
|
|
455
|
+
writeAllow();
|
|
456
|
+
const snapshot = await fetchSnapshot({
|
|
457
|
+
server: config.server,
|
|
458
|
+
apiKey: config.apiKey,
|
|
459
|
+
cwd: input.cwd,
|
|
460
|
+
claudeSessionId: input.session_id,
|
|
461
|
+
});
|
|
462
|
+
// Server unreachable / no project / no active session → nothing to gate on.
|
|
463
|
+
if (!snapshot || !snapshot.ok) {
|
|
464
|
+
await emitGateFired(input, config, 'Stop', mode, 'no_signal');
|
|
465
|
+
writeAllow();
|
|
466
|
+
}
|
|
467
|
+
const editedCount = snapshot.editedFiles.length;
|
|
468
|
+
const lastCheckpointAt = snapshot.lastCheckpointAt ?? null;
|
|
469
|
+
// Checkpoint is "fresh" if it happened within this session's active window.
|
|
470
|
+
// We treat any lastCheckpointAt != null as sufficient — the server already
|
|
471
|
+
// scopes findActiveSessions to the developer+project, so older sessions
|
|
472
|
+
// wouldn't contribute. Add a 5-min freshness floor so a checkpoint from
|
|
473
|
+
// hours ago doesn't perpetually satisfy the gate.
|
|
474
|
+
const CHECKPOINT_FRESHNESS_MS = 5 * 60 * 1000;
|
|
475
|
+
const hasFreshCheckpoint = lastCheckpointAt !== null && Date.now() - lastCheckpointAt < CHECKPOINT_FRESHNESS_MS;
|
|
476
|
+
if (editedCount === 0 || hasFreshCheckpoint) {
|
|
477
|
+
await emitGateFired(input, config, 'Stop', mode, 'satisfied');
|
|
478
|
+
writeAllow();
|
|
479
|
+
}
|
|
480
|
+
// Coord-key write so the proxy stops nagging about NEEDS_CHECKPOINT for ~60s.
|
|
481
|
+
await markStopBlocked({
|
|
482
|
+
server: config.server,
|
|
483
|
+
apiKey: config.apiKey,
|
|
484
|
+
cwd: input.cwd,
|
|
485
|
+
claudeSessionId: input.session_id,
|
|
486
|
+
});
|
|
487
|
+
const filesPreview = snapshot.editedFiles.slice(0, 5).join(', ');
|
|
488
|
+
const overflow = editedCount > 5 ? ` (+${editedCount - 5} more)` : '';
|
|
489
|
+
if (mode === 'advisory') {
|
|
490
|
+
await emitGateFired(input, config, 'Stop', mode, 'advisory_nudge');
|
|
491
|
+
const additionalContext = [
|
|
492
|
+
`Mnemonik checkpoint pressure: ${editedCount} file(s) edited this session without a checkpoint — ${filesPreview}${overflow}.`,
|
|
493
|
+
"Recommended: call mnemonik.checkpoint with a summary of what you accomplished before stopping. Without it, this session's learnings will not survive into the next.",
|
|
494
|
+
'This message will become a hard block when contextual hooks are set to "enforce" (currently advisory).',
|
|
495
|
+
].join(' ');
|
|
496
|
+
const decision = {
|
|
497
|
+
hookSpecificOutput: {
|
|
498
|
+
hookEventName: 'Stop',
|
|
499
|
+
additionalContext,
|
|
500
|
+
},
|
|
501
|
+
};
|
|
502
|
+
writeDecision(decision);
|
|
503
|
+
}
|
|
504
|
+
// mode === 'enforce'
|
|
505
|
+
await emitGateFired(input, config, 'Stop', mode, 'block');
|
|
506
|
+
const reason = [
|
|
507
|
+
'MNEMONIK_CHECKPOINT_REQUIRED',
|
|
508
|
+
`Stop blocked: ${editedCount} file(s) edited this session and no checkpoint has been called.`,
|
|
509
|
+
`Edited: ${filesPreview}${overflow}.`,
|
|
510
|
+
'Fix: call mnemonik.checkpoint({ summary: "...", filesTouched: [...] }) before stopping.',
|
|
511
|
+
"Bypass: MNEMONIK_BYPASS_HOOKS=1 + MNEMONIK_BYPASS_TYPE=<typo|formatting|regenerated|already_grounded|other>; 'other' additionally requires MNEMONIK_BYPASS_DETAIL 50-200 chars.",
|
|
512
|
+
].join('\n');
|
|
513
|
+
const decision = {
|
|
514
|
+
decision: 'block',
|
|
515
|
+
reason,
|
|
516
|
+
hookSpecificOutput: {
|
|
517
|
+
hookEventName: 'Stop',
|
|
518
|
+
additionalContext: reason,
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
writeDecision(decision);
|
|
522
|
+
}
|
|
523
|
+
// ─── PreCompact: snapshot pre-injection (P5; never blocks) ──────────────────
|
|
524
|
+
/**
|
|
525
|
+
* Before Claude Code auto-compacts, create a context_snapshot memory and
|
|
526
|
+
* inject a directive naming the snapshot ID so the post-compaction agent can
|
|
527
|
+
* call memory_get to resume. Always-on side-effect; never refuses compaction
|
|
528
|
+
* (refusing means context overflow, which is worse than the data loss).
|
|
529
|
+
*/
|
|
530
|
+
async function handlePreCompact(input, config) {
|
|
531
|
+
if (config.contextualHooks.preCompactSnapshot === 'off')
|
|
532
|
+
writeAllow();
|
|
533
|
+
if (!config.apiKey)
|
|
534
|
+
writeAllow();
|
|
535
|
+
const result = await createPreCompactSnapshot({
|
|
536
|
+
server: config.server,
|
|
537
|
+
apiKey: config.apiKey,
|
|
538
|
+
cwd: input.cwd,
|
|
539
|
+
claudeSessionId: input.session_id,
|
|
540
|
+
});
|
|
541
|
+
if (!result || !result.ok || !result.snapshotMemoryId)
|
|
542
|
+
writeAllow();
|
|
543
|
+
const note = result.suppressedDuplicate
|
|
544
|
+
? `(reusing snapshot from <5min ago)`
|
|
545
|
+
: `(created at compaction)`;
|
|
546
|
+
const additionalContext = [
|
|
547
|
+
`Mnemonik PreCompact: in-flight session work was saved as context_snapshot memory ${result.snapshotMemoryId} ${note}.`,
|
|
548
|
+
`After compaction, resume by calling: mnemonik.memory_get({ memoryIds: ["${result.snapshotMemoryId}"] }).`,
|
|
549
|
+
'It returns the summary, next steps, and files-in-progress captured at the moment of compaction. Then call file_context on each file before editing, and follow the NEXT STEPS list.',
|
|
550
|
+
].join(' ');
|
|
551
|
+
const decision = {
|
|
552
|
+
hookSpecificOutput: {
|
|
553
|
+
hookEventName: 'PreCompact',
|
|
554
|
+
additionalContext,
|
|
555
|
+
},
|
|
556
|
+
};
|
|
557
|
+
writeDecision(decision);
|
|
558
|
+
}
|
|
559
|
+
// ─── SessionEnd: fire-and-forget save (P5) ──────────────────────────────────
|
|
560
|
+
async function handleSessionEnd(input, config) {
|
|
561
|
+
if (config.contextualHooks.sessionEndSave === 'off')
|
|
562
|
+
writeAllow();
|
|
563
|
+
if (!config.apiKey)
|
|
564
|
+
writeAllow();
|
|
565
|
+
// Fire-and-forget — server-side AutoSaveService decides whether to distill
|
|
566
|
+
// based on the session's tools/edits count.
|
|
567
|
+
await postSessionEnd({
|
|
568
|
+
server: config.server,
|
|
569
|
+
apiKey: config.apiKey,
|
|
570
|
+
cwd: input.cwd,
|
|
571
|
+
claudeSessionId: input.session_id,
|
|
572
|
+
});
|
|
573
|
+
writeAllow();
|
|
574
|
+
}
|
|
575
|
+
// ─── UserPromptSubmit: prompt-context inject (P5) ───────────────────────────
|
|
576
|
+
async function handleUserPromptSubmit(input, config) {
|
|
577
|
+
if (config.contextualHooks.userPromptContext === 'off')
|
|
578
|
+
writeAllow();
|
|
579
|
+
if (!config.apiKey)
|
|
580
|
+
writeAllow();
|
|
581
|
+
// The prompt text is in tool_input.prompt for UserPromptSubmit per Claude
|
|
582
|
+
// Code's spec. Some payloads put it directly on the input — accept both.
|
|
583
|
+
const inputAsRecord = input;
|
|
584
|
+
const prompt = typeof input.tool_input?.prompt === 'string'
|
|
585
|
+
? input.tool_input.prompt
|
|
586
|
+
: typeof inputAsRecord.prompt === 'string'
|
|
587
|
+
? inputAsRecord.prompt
|
|
588
|
+
: '';
|
|
589
|
+
if (!prompt.trim())
|
|
590
|
+
writeAllow();
|
|
591
|
+
const result = await fetchPromptContext({
|
|
592
|
+
server: config.server,
|
|
593
|
+
apiKey: config.apiKey,
|
|
594
|
+
cwd: input.cwd,
|
|
595
|
+
claudeSessionId: input.session_id,
|
|
596
|
+
prompt,
|
|
597
|
+
});
|
|
598
|
+
if (!result || !result.ok || !result.additionalContext)
|
|
599
|
+
writeAllow();
|
|
600
|
+
const decision = {
|
|
601
|
+
hookSpecificOutput: {
|
|
602
|
+
hookEventName: 'UserPromptSubmit',
|
|
603
|
+
additionalContext: result.additionalContext,
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
writeDecision(decision);
|
|
607
|
+
}
|
|
341
608
|
// ─── PostToolUse: keep server's filesEdited fresh ──────────────────────────
|
|
342
609
|
async function handlePostEdit(input, config) {
|
|
343
610
|
// Best-effort track-ide-edit — fire-and-forget, always allow.
|
|
@@ -410,8 +677,28 @@ async function dispatch(input) {
|
|
|
410
677
|
writeAllow();
|
|
411
678
|
break;
|
|
412
679
|
}
|
|
680
|
+
case 'SessionStart':
|
|
681
|
+
await handleSessionStart(input, config);
|
|
682
|
+
writeAllow();
|
|
683
|
+
break;
|
|
684
|
+
case 'Stop':
|
|
685
|
+
await handleStop(input, config);
|
|
686
|
+
writeAllow();
|
|
687
|
+
break;
|
|
688
|
+
case 'PreCompact':
|
|
689
|
+
await handlePreCompact(input, config);
|
|
690
|
+
writeAllow();
|
|
691
|
+
break;
|
|
692
|
+
case 'SessionEnd':
|
|
693
|
+
await handleSessionEnd(input, config);
|
|
694
|
+
writeAllow();
|
|
695
|
+
break;
|
|
696
|
+
case 'UserPromptSubmit':
|
|
697
|
+
await handleUserPromptSubmit(input, config);
|
|
698
|
+
writeAllow();
|
|
699
|
+
break;
|
|
413
700
|
default:
|
|
414
|
-
//
|
|
701
|
+
// Notification and any other future event types — no-op.
|
|
415
702
|
writeAllow();
|
|
416
703
|
}
|
|
417
704
|
}
|
package/dist/hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
CHANGED
|
@@ -40,7 +40,16 @@ function isMnemonikEntry(entry) {
|
|
|
40
40
|
}
|
|
41
41
|
function patchHookGroup(groups, matcher, entry) {
|
|
42
42
|
const filtered = (groups ?? []).filter((g) => !isMnemonikEntry(g));
|
|
43
|
-
|
|
43
|
+
// Lifecycle hooks (SessionStart, Stop, PreCompact, SessionEnd,
|
|
44
|
+
// UserPromptSubmit) don't use a matcher — they fire on every event of
|
|
45
|
+
// that name. PreToolUse / PostToolUse use the regex matcher to scope by
|
|
46
|
+
// tool name.
|
|
47
|
+
if (matcher === null) {
|
|
48
|
+
filtered.push({ hooks: [entry] });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
filtered.push({ matcher, hooks: [entry] });
|
|
52
|
+
}
|
|
44
53
|
return filtered;
|
|
45
54
|
}
|
|
46
55
|
async function readSettings(path) {
|
|
@@ -74,19 +83,34 @@ async function main() {
|
|
|
74
83
|
hooks.PreToolUse = patchHookGroup(hooks.PreToolUse, 'Edit|Write|NotebookEdit|Bash', entry);
|
|
75
84
|
// PostToolUse — keep filesEdited fresh after Edit / Write / NotebookEdit.
|
|
76
85
|
hooks.PostToolUse = patchHookGroup(hooks.PostToolUse, 'Edit|Write|NotebookEdit', entry);
|
|
86
|
+
// Lifecycle hooks (P5) — bootstrap pre-injection, checkpoint gate,
|
|
87
|
+
// pre-compaction snapshot, end-of-session save, and user-prompt context.
|
|
88
|
+
// No matcher: each fires on every event of that name.
|
|
89
|
+
hooks.SessionStart = patchHookGroup(hooks.SessionStart, null, entry);
|
|
90
|
+
hooks.Stop = patchHookGroup(hooks.Stop, null, entry);
|
|
91
|
+
hooks.PreCompact = patchHookGroup(hooks.PreCompact, null, entry);
|
|
92
|
+
hooks.SessionEnd = patchHookGroup(hooks.SessionEnd, null, entry);
|
|
93
|
+
hooks.UserPromptSubmit = patchHookGroup(hooks.UserPromptSubmit, null, entry);
|
|
77
94
|
settings.hooks = hooks;
|
|
78
95
|
await writeSettings(settingsPath, settings);
|
|
79
96
|
console.log([
|
|
80
97
|
`mnemonik-claude-code-hooks: wired into ${settingsPath}`,
|
|
81
|
-
` PreToolUse
|
|
82
|
-
` PostToolUse
|
|
83
|
-
`
|
|
98
|
+
` PreToolUse → Edit|Write|NotebookEdit|Bash`,
|
|
99
|
+
` PostToolUse → Edit|Write|NotebookEdit`,
|
|
100
|
+
` SessionStart → bootstrap pre-injection`,
|
|
101
|
+
` Stop → checkpoint gate (advisory)`,
|
|
102
|
+
` PreCompact → context_snapshot pre-injection`,
|
|
103
|
+
` SessionEnd → fire-and-forget save`,
|
|
104
|
+
` UserPromptSubmit → prompt-context inject`,
|
|
105
|
+
` dispatcher → ${dispatcher}`,
|
|
84
106
|
``,
|
|
85
|
-
`Default
|
|
86
|
-
`add to .mnemonik.json:`,
|
|
87
|
-
` { "contextualHooks": { "preEditGate": "enforce" } }`,
|
|
107
|
+
`Default modes: gates ADVISORY (no edits/stops will be blocked); side-effects ON.`,
|
|
108
|
+
`To switch a gate to enforce, add to .mnemonik.json:`,
|
|
109
|
+
` { "contextualHooks": { "preEditGate": "enforce", "stopCheckpointGate": "enforce" } }`,
|
|
110
|
+
`To turn off a side-effect handler:`,
|
|
111
|
+
` { "contextualHooks": { "userPromptContext": "off" } }`,
|
|
88
112
|
``,
|
|
89
|
-
`Bypass for trivial edits:`,
|
|
113
|
+
`Bypass for trivial edits / stops:`,
|
|
90
114
|
` MNEMONIK_BYPASS_HOOKS=1 MNEMONIK_BYPASS_TYPE=typo claude ...`,
|
|
91
115
|
].join('\n'));
|
|
92
116
|
return 0;
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/http.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Uses Node 20's global `fetch` — zero npm dependencies on the runtime side.
|
|
6
6
|
*/
|
|
7
|
-
import type { FileContextResponse, SnapshotResponse } from './types.js';
|
|
7
|
+
import type { FileContextResponse, PreCompactResponse, PromptContextResponse, SnapshotResponse } from './types.js';
|
|
8
8
|
export interface FetchSnapshotInput {
|
|
9
9
|
server: string;
|
|
10
10
|
apiKey: string;
|
|
@@ -58,3 +58,54 @@ export interface ReportBypassInput {
|
|
|
58
58
|
detail: string | null;
|
|
59
59
|
}
|
|
60
60
|
export declare function reportBypass(input: ReportBypassInput): Promise<void>;
|
|
61
|
+
interface BaseHookInput {
|
|
62
|
+
server: string;
|
|
63
|
+
apiKey: string;
|
|
64
|
+
cwd: string;
|
|
65
|
+
claudeSessionId: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fetch the session_bootstrap REST payload so the SessionStart hook can
|
|
69
|
+
* inject it as additionalContext. Reuses the same endpoint Cursor's
|
|
70
|
+
* SessionStart hook already calls — server unchanged.
|
|
71
|
+
*/
|
|
72
|
+
export declare function fetchBootstrap(input: BaseHookInput): Promise<{
|
|
73
|
+
ok: boolean;
|
|
74
|
+
payload: unknown;
|
|
75
|
+
} | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Tell the server we pre-injected bootstrap so the proxy can switch from
|
|
78
|
+
* NO_BOOTSTRAP to BOOTSTRAP_INJECTED.
|
|
79
|
+
*/
|
|
80
|
+
export declare function markSessionStart(input: BaseHookInput): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Tell the server the Stop checkpoint gate fired so the proxy suppresses
|
|
83
|
+
* NEEDS_CHECKPOINT for ~60s. Telemetry budget — the gate decision is already
|
|
84
|
+
* out the door by the time this returns.
|
|
85
|
+
*/
|
|
86
|
+
export declare function markStopBlocked(input: BaseHookInput): Promise<void>;
|
|
87
|
+
export interface CreatePreCompactSnapshotInput extends BaseHookInput {
|
|
88
|
+
summary?: string;
|
|
89
|
+
nextSteps?: string[];
|
|
90
|
+
filesInProgress?: string[];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* PreCompact snapshot — synchronous because Claude Code hold the compaction
|
|
94
|
+
* pause until the hook returns, and we want the snapshot ID in the
|
|
95
|
+
* additionalContext that survives compaction. 4s budget matches bootstrap.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createPreCompactSnapshot(input: CreatePreCompactSnapshotInput): Promise<PreCompactResponse | null>;
|
|
98
|
+
export interface PostSessionEndInput extends BaseHookInput {
|
|
99
|
+
reason?: string;
|
|
100
|
+
}
|
|
101
|
+
/** SessionEnd save — fire-and-forget; the session is closing anyway. */
|
|
102
|
+
export declare function postSessionEnd(input: PostSessionEndInput): Promise<void>;
|
|
103
|
+
export interface FetchPromptContextInput extends BaseHookInput {
|
|
104
|
+
prompt: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* UserPromptSubmit context inject — calls the existing /api/v1/hooks/context
|
|
108
|
+
* endpoint already battle-tested by @mnemonik/codex-hooks.
|
|
109
|
+
*/
|
|
110
|
+
export declare function fetchPromptContext(input: FetchPromptContextInput): Promise<PromptContextResponse | null>;
|
|
111
|
+
export {};
|
package/dist/lib/http.js
CHANGED
|
@@ -124,4 +124,196 @@ export async function reportBypass(input) {
|
|
|
124
124
|
clearTimeout(timer);
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Tighter timeout for SessionStart bootstrap fetch — the agent is waiting on
|
|
129
|
+
* the first response, so the budget is more like the proxy's bootstrap layer
|
|
130
|
+
* (~4s) than the regular 2s gate budget. Cap at 4s; on timeout we just fail
|
|
131
|
+
* open (proxy's NO_BOOTSTRAP reminder takes over).
|
|
132
|
+
*/
|
|
133
|
+
const BOOTSTRAP_TIMEOUT_MS = 4000;
|
|
134
|
+
/**
|
|
135
|
+
* Fetch the session_bootstrap REST payload so the SessionStart hook can
|
|
136
|
+
* inject it as additionalContext. Reuses the same endpoint Cursor's
|
|
137
|
+
* SessionStart hook already calls — server unchanged.
|
|
138
|
+
*/
|
|
139
|
+
export async function fetchBootstrap(input) {
|
|
140
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/session/bootstrap`;
|
|
141
|
+
const ac = new AbortController();
|
|
142
|
+
const timer = setTimeout(() => ac.abort(), BOOTSTRAP_TIMEOUT_MS);
|
|
143
|
+
try {
|
|
144
|
+
const res = await fetch(url, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: {
|
|
147
|
+
'content-type': 'application/json',
|
|
148
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify({ cwd: input.cwd, claudeSessionId: input.claudeSessionId }),
|
|
151
|
+
signal: ac.signal,
|
|
152
|
+
});
|
|
153
|
+
if (!res.ok)
|
|
154
|
+
return null;
|
|
155
|
+
return { ok: true, payload: await res.json() };
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
clearTimeout(timer);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Tell the server we pre-injected bootstrap so the proxy can switch from
|
|
166
|
+
* NO_BOOTSTRAP to BOOTSTRAP_INJECTED.
|
|
167
|
+
*/
|
|
168
|
+
export async function markSessionStart(input) {
|
|
169
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/hooks/session-start`;
|
|
170
|
+
const ac = new AbortController();
|
|
171
|
+
const timer = setTimeout(() => ac.abort(), TELEMETRY_TIMEOUT_MS);
|
|
172
|
+
try {
|
|
173
|
+
await fetch(url, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: {
|
|
176
|
+
'content-type': 'application/json',
|
|
177
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
178
|
+
},
|
|
179
|
+
body: JSON.stringify({ cwd: input.cwd, claudeSessionId: input.claudeSessionId }),
|
|
180
|
+
signal: ac.signal,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Coord-key telemetry — failure means proxy keeps showing NO_BOOTSTRAP.
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
clearTimeout(timer);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Tell the server the Stop checkpoint gate fired so the proxy suppresses
|
|
192
|
+
* NEEDS_CHECKPOINT for ~60s. Telemetry budget — the gate decision is already
|
|
193
|
+
* out the door by the time this returns.
|
|
194
|
+
*/
|
|
195
|
+
export async function markStopBlocked(input) {
|
|
196
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/hooks/stop-blocked`;
|
|
197
|
+
const ac = new AbortController();
|
|
198
|
+
const timer = setTimeout(() => ac.abort(), TELEMETRY_TIMEOUT_MS);
|
|
199
|
+
try {
|
|
200
|
+
await fetch(url, {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
headers: {
|
|
203
|
+
'content-type': 'application/json',
|
|
204
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify({ cwd: input.cwd, claudeSessionId: input.claudeSessionId }),
|
|
207
|
+
signal: ac.signal,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Coord-key telemetry — failure means proxy keeps showing NEEDS_CHECKPOINT.
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
clearTimeout(timer);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* PreCompact snapshot — synchronous because Claude Code hold the compaction
|
|
219
|
+
* pause until the hook returns, and we want the snapshot ID in the
|
|
220
|
+
* additionalContext that survives compaction. 4s budget matches bootstrap.
|
|
221
|
+
*/
|
|
222
|
+
export async function createPreCompactSnapshot(input) {
|
|
223
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/hooks/pre-compact`;
|
|
224
|
+
const ac = new AbortController();
|
|
225
|
+
const timer = setTimeout(() => ac.abort(), BOOTSTRAP_TIMEOUT_MS);
|
|
226
|
+
try {
|
|
227
|
+
const res = await fetch(url, {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: {
|
|
230
|
+
'content-type': 'application/json',
|
|
231
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
232
|
+
},
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
cwd: input.cwd,
|
|
235
|
+
claudeSessionId: input.claudeSessionId,
|
|
236
|
+
summary: input.summary,
|
|
237
|
+
nextSteps: input.nextSteps,
|
|
238
|
+
filesInProgress: input.filesInProgress,
|
|
239
|
+
}),
|
|
240
|
+
signal: ac.signal,
|
|
241
|
+
});
|
|
242
|
+
if (!res.ok)
|
|
243
|
+
return null;
|
|
244
|
+
return (await res.json());
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
clearTimeout(timer);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/** SessionEnd save — fire-and-forget; the session is closing anyway. */
|
|
254
|
+
export async function postSessionEnd(input) {
|
|
255
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/session/track-ide-edit`;
|
|
256
|
+
const ac = new AbortController();
|
|
257
|
+
const timer = setTimeout(() => ac.abort(), TELEMETRY_TIMEOUT_MS);
|
|
258
|
+
try {
|
|
259
|
+
// Reuse the existing track-ide-edit endpoint with a synthetic event marker.
|
|
260
|
+
// Server-side we just need to notice the session is ending so the
|
|
261
|
+
// expiry callback (AutoSaveService) can run earlier.
|
|
262
|
+
await fetch(url, {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
headers: {
|
|
265
|
+
'content-type': 'application/json',
|
|
266
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
267
|
+
},
|
|
268
|
+
body: JSON.stringify({
|
|
269
|
+
sessionId: input.claudeSessionId,
|
|
270
|
+
filePath: '__session_ended__',
|
|
271
|
+
ended: true,
|
|
272
|
+
reason: input.reason,
|
|
273
|
+
}),
|
|
274
|
+
signal: ac.signal,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Telemetry must not crash the hook.
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
clearTimeout(timer);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* UserPromptSubmit context inject — calls the existing /api/v1/hooks/context
|
|
286
|
+
* endpoint already battle-tested by @mnemonik/codex-hooks.
|
|
287
|
+
*/
|
|
288
|
+
export async function fetchPromptContext(input) {
|
|
289
|
+
const url = `${input.server.replace(/\/$/, '')}/api/v1/hooks/context`;
|
|
290
|
+
const ac = new AbortController();
|
|
291
|
+
const timer = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS);
|
|
292
|
+
try {
|
|
293
|
+
const res = await fetch(url, {
|
|
294
|
+
method: 'POST',
|
|
295
|
+
headers: {
|
|
296
|
+
'content-type': 'application/json',
|
|
297
|
+
authorization: `Bearer ${input.apiKey}`,
|
|
298
|
+
},
|
|
299
|
+
body: JSON.stringify({
|
|
300
|
+
cwd: input.cwd,
|
|
301
|
+
sessionId: input.claudeSessionId,
|
|
302
|
+
host: 'claude_code',
|
|
303
|
+
event: 'UserPromptSubmit',
|
|
304
|
+
prompt: input.prompt,
|
|
305
|
+
}),
|
|
306
|
+
signal: ac.signal,
|
|
307
|
+
});
|
|
308
|
+
if (!res.ok)
|
|
309
|
+
return null;
|
|
310
|
+
return (await res.json());
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
clearTimeout(timer);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
127
319
|
//# sourceMappingURL=http.js.map
|
package/dist/lib/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,17 @@
|
|
|
21
21
|
export interface TokenizeResult {
|
|
22
22
|
/** Each entry is one command in a pipeline / sequence. */
|
|
23
23
|
commands: string[][];
|
|
24
|
+
/**
|
|
25
|
+
* Parallel to `commands`: per-token boolean — true iff the token came from
|
|
26
|
+
* (or partially included) a quoted region (single OR double quotes). The
|
|
27
|
+
* regex match path uses this to exclude quoted argument bodies from
|
|
28
|
+
* pattern matching, so a project policy regex like `\b(api|db|...):` can't
|
|
29
|
+
* spuriously match because "api" appears inside `gh api 'jq-query-text'`.
|
|
30
|
+
* The plain-phrase / token-subsequence path doesn't need this since it
|
|
31
|
+
* already operates on whole tokens — quoted strings stay as one token
|
|
32
|
+
* and are compared verbatim.
|
|
33
|
+
*/
|
|
34
|
+
wasQuoted: boolean[][];
|
|
24
35
|
}
|
|
25
36
|
export declare function tokenize(input: string): TokenizeResult;
|
|
26
37
|
/**
|
|
@@ -46,7 +57,7 @@ export declare function tokenize(input: string): TokenizeResult;
|
|
|
46
57
|
* Returning the matched pattern (verbatim) lets the dispatcher key bypass
|
|
47
58
|
* telemetry / dedup against `recentPolicyChecks` exactly.
|
|
48
59
|
*/
|
|
49
|
-
export declare function matchCommand(commandTokens: string[], patterns: string[]): string | null;
|
|
60
|
+
export declare function matchCommand(commandTokens: string[], patterns: string[], wasQuoted?: boolean[]): string | null;
|
|
50
61
|
/**
|
|
51
62
|
* Built-in destructive patterns. Project-level policies extend this set;
|
|
52
63
|
* they're never shrunk, so a project can only ADD restrictions to what's
|
package/dist/lib/shellTokens.js
CHANGED
|
@@ -21,20 +21,28 @@
|
|
|
21
21
|
const META_TOKENS = new Set(['|', '||', '&&', ';', '&', '>', '>>', '<', '<<']);
|
|
22
22
|
export function tokenize(input) {
|
|
23
23
|
const commands = [];
|
|
24
|
+
const wasQuotedAll = [];
|
|
24
25
|
let current = [];
|
|
26
|
+
let currentQuoted = [];
|
|
25
27
|
let buf = '';
|
|
28
|
+
let bufQuoted = false;
|
|
26
29
|
let mode = 'normal';
|
|
27
30
|
const flushToken = () => {
|
|
28
31
|
if (buf.length > 0) {
|
|
29
32
|
current.push(buf);
|
|
33
|
+
currentQuoted.push(bufQuoted);
|
|
30
34
|
buf = '';
|
|
35
|
+
bufQuoted = false;
|
|
31
36
|
}
|
|
32
37
|
};
|
|
33
38
|
const flushCommand = () => {
|
|
34
39
|
flushToken();
|
|
35
|
-
if (current.length > 0)
|
|
40
|
+
if (current.length > 0) {
|
|
36
41
|
commands.push(current);
|
|
42
|
+
wasQuotedAll.push(currentQuoted);
|
|
43
|
+
}
|
|
37
44
|
current = [];
|
|
45
|
+
currentQuoted = [];
|
|
38
46
|
};
|
|
39
47
|
for (let i = 0; i < input.length; i++) {
|
|
40
48
|
const c = input[i];
|
|
@@ -44,6 +52,7 @@ export function tokenize(input) {
|
|
|
44
52
|
}
|
|
45
53
|
else {
|
|
46
54
|
buf += c;
|
|
55
|
+
bufQuoted = true;
|
|
47
56
|
}
|
|
48
57
|
continue;
|
|
49
58
|
}
|
|
@@ -54,19 +63,23 @@ export function tokenize(input) {
|
|
|
54
63
|
else if (c === '\\' && i + 1 < input.length) {
|
|
55
64
|
// Handle escaped quotes inside double-quoted strings.
|
|
56
65
|
buf += input[++i];
|
|
66
|
+
bufQuoted = true;
|
|
57
67
|
}
|
|
58
68
|
else {
|
|
59
69
|
buf += c;
|
|
70
|
+
bufQuoted = true;
|
|
60
71
|
}
|
|
61
72
|
continue;
|
|
62
73
|
}
|
|
63
74
|
// mode === 'normal'
|
|
64
75
|
if (c === "'") {
|
|
65
76
|
mode = 'single';
|
|
77
|
+
bufQuoted = true; // entering quoted region — even if empty, mark token
|
|
66
78
|
continue;
|
|
67
79
|
}
|
|
68
80
|
if (c === '"') {
|
|
69
81
|
mode = 'double';
|
|
82
|
+
bufQuoted = true;
|
|
70
83
|
continue;
|
|
71
84
|
}
|
|
72
85
|
if (c === '\\' && i + 1 < input.length) {
|
|
@@ -97,7 +110,7 @@ export function tokenize(input) {
|
|
|
97
110
|
buf += c;
|
|
98
111
|
}
|
|
99
112
|
flushCommand();
|
|
100
|
-
return { commands };
|
|
113
|
+
return { commands, wasQuoted: wasQuotedAll };
|
|
101
114
|
}
|
|
102
115
|
/**
|
|
103
116
|
* Match a token sequence against a project policy pattern.
|
|
@@ -122,10 +135,20 @@ export function tokenize(input) {
|
|
|
122
135
|
* Returning the matched pattern (verbatim) lets the dispatcher key bypass
|
|
123
136
|
* telemetry / dedup against `recentPolicyChecks` exactly.
|
|
124
137
|
*/
|
|
125
|
-
export function matchCommand(commandTokens, patterns) {
|
|
138
|
+
export function matchCommand(commandTokens, patterns, wasQuoted) {
|
|
126
139
|
if (commandTokens.length === 0 || patterns.length === 0)
|
|
127
140
|
return null;
|
|
128
141
|
const joined = commandTokens.join(' ').trim();
|
|
142
|
+
// Regex-safe joined excludes content of quoted tokens — see TokenizeResult
|
|
143
|
+
// doc comment. Each quoted token becomes a single-character placeholder so
|
|
144
|
+
// patterns can't bridge across them either. When wasQuoted is not provided
|
|
145
|
+
// (test fixtures, legacy callers), fall back to the old behavior.
|
|
146
|
+
const joinedForRegex = wasQuoted
|
|
147
|
+
? commandTokens
|
|
148
|
+
.map((t, i) => (wasQuoted[i] ? '' : t))
|
|
149
|
+
.join(' ')
|
|
150
|
+
.trim()
|
|
151
|
+
: joined;
|
|
129
152
|
for (const raw of patterns) {
|
|
130
153
|
const pattern = raw.trim();
|
|
131
154
|
if (!pattern)
|
|
@@ -133,8 +156,9 @@ export function matchCommand(commandTokens, patterns) {
|
|
|
133
156
|
const explicitRegex = parseExplicitRegex(pattern);
|
|
134
157
|
if (explicitRegex !== null) {
|
|
135
158
|
try {
|
|
136
|
-
if (new RegExp(explicitRegex.body, explicitRegex.flags).test(
|
|
159
|
+
if (new RegExp(explicitRegex.body, explicitRegex.flags).test(joinedForRegex)) {
|
|
137
160
|
return pattern;
|
|
161
|
+
}
|
|
138
162
|
}
|
|
139
163
|
catch {
|
|
140
164
|
/* invalid regex — skip */
|
|
@@ -142,20 +166,15 @@ export function matchCommand(commandTokens, patterns) {
|
|
|
142
166
|
continue;
|
|
143
167
|
}
|
|
144
168
|
// Pipe alternation: split into segments and decide phrase-vs-regex
|
|
145
|
-
// PER SEGMENT
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
const segments = pattern
|
|
152
|
-
? pattern
|
|
153
|
-
.split('|')
|
|
154
|
-
.map((s) => s.trim())
|
|
155
|
-
.filter(Boolean)
|
|
156
|
-
: [pattern];
|
|
169
|
+
// PER SEGMENT — but ONLY at the top level of the pattern. Pipes inside
|
|
170
|
+
// `(...)` or `[...]` groups are regex syntax (alternation inside a
|
|
171
|
+
// capture group, character class), not policy alternatives. Splitting
|
|
172
|
+
// them produced the v0.2.0 false positive: a YAML-targeted regex like
|
|
173
|
+
// `\b(app|db|...|api|...):` was split into a phrase segment "api" that
|
|
174
|
+
// matched any command containing `api` as a token (e.g. `gh api ...`).
|
|
175
|
+
const segments = splitTopLevelPipes(pattern);
|
|
157
176
|
for (const segment of segments) {
|
|
158
|
-
if (matchOneSegment(segment, commandTokens,
|
|
177
|
+
if (matchOneSegment(segment, commandTokens, joinedForRegex))
|
|
159
178
|
return pattern;
|
|
160
179
|
}
|
|
161
180
|
}
|
|
@@ -175,6 +194,46 @@ function matchOneSegment(segment, commandTokens, joined) {
|
|
|
175
194
|
return false;
|
|
176
195
|
return matchTokenSubsequence(commandTokens, tokens);
|
|
177
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Split `pattern` on `|` only when the pipe is at the top level (not nested
|
|
199
|
+
* inside `(...)` or `[...]`). Backslash-escapes the next character. Used by
|
|
200
|
+
* matchCommand to handle policy patterns like `make staging|make prod` while
|
|
201
|
+
* leaving regex group alternations like `(app|db|...)` intact.
|
|
202
|
+
*/
|
|
203
|
+
function splitTopLevelPipes(pattern) {
|
|
204
|
+
const segments = [];
|
|
205
|
+
let buf = '';
|
|
206
|
+
let depthParen = 0;
|
|
207
|
+
let depthBracket = 0;
|
|
208
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
209
|
+
const c = pattern[i];
|
|
210
|
+
if (c === '\\' && i + 1 < pattern.length) {
|
|
211
|
+
buf += c + pattern[i + 1];
|
|
212
|
+
i++;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (c === '(')
|
|
216
|
+
depthParen++;
|
|
217
|
+
else if (c === ')')
|
|
218
|
+
depthParen = Math.max(0, depthParen - 1);
|
|
219
|
+
else if (c === '[')
|
|
220
|
+
depthBracket++;
|
|
221
|
+
else if (c === ']')
|
|
222
|
+
depthBracket = Math.max(0, depthBracket - 1);
|
|
223
|
+
if (c === '|' && depthParen === 0 && depthBracket === 0) {
|
|
224
|
+
const trimmed = buf.trim();
|
|
225
|
+
if (trimmed)
|
|
226
|
+
segments.push(trimmed);
|
|
227
|
+
buf = '';
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
buf += c;
|
|
231
|
+
}
|
|
232
|
+
const tail = buf.trim();
|
|
233
|
+
if (tail)
|
|
234
|
+
segments.push(tail);
|
|
235
|
+
return segments.length > 0 ? segments : [pattern];
|
|
236
|
+
}
|
|
178
237
|
/**
|
|
179
238
|
* /regex/ or /regex/i — explicit opt-in to joined-form regex matching.
|
|
180
239
|
* Returns null when the pattern isn't wrapped this way.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellTokens.js","sourceRoot":"","sources":["../../src/lib/shellTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"shellTokens.js","sourceRoot":"","sources":["../../src/lib/shellTokens.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -34,6 +34,22 @@ export interface PostToolUseDecision {
|
|
|
34
34
|
additionalContext?: string;
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
+
/** SessionStart / UserPromptSubmit / PreCompact decision (additionalContext only). */
|
|
38
|
+
export interface AdditionalContextDecision {
|
|
39
|
+
hookSpecificOutput: {
|
|
40
|
+
hookEventName: 'SessionStart' | 'UserPromptSubmit' | 'PreCompact' | 'SessionEnd';
|
|
41
|
+
additionalContext?: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Stop decision — `decision:"block"` refuses to let the agent end the turn. */
|
|
45
|
+
export interface StopDecision {
|
|
46
|
+
decision?: 'block';
|
|
47
|
+
reason?: string;
|
|
48
|
+
hookSpecificOutput?: {
|
|
49
|
+
hookEventName: 'Stop';
|
|
50
|
+
additionalContext?: string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
37
53
|
/** Bypass envelope wired through MNEMONIK_BYPASS_HOOKS=1. */
|
|
38
54
|
export type BypassType = 'typo' | 'formatting' | 'regenerated' | 'already_grounded' | 'other';
|
|
39
55
|
export interface BypassEnvelope {
|
|
@@ -77,6 +93,25 @@ export interface SnapshotResponse {
|
|
|
77
93
|
};
|
|
78
94
|
sessionsMerged: number;
|
|
79
95
|
now: number;
|
|
96
|
+
lastCheckpointAt?: number | null;
|
|
97
|
+
lastSnapshotAt?: number | null;
|
|
98
|
+
lastSnapshotMemoryId?: string | null;
|
|
99
|
+
hasRecentSnapshot?: boolean;
|
|
100
|
+
}
|
|
101
|
+
/** Server response from /api/v1/hooks/pre-compact (P5). */
|
|
102
|
+
export interface PreCompactResponse {
|
|
103
|
+
ok: boolean;
|
|
104
|
+
reason?: 'unauthorized' | 'no_project' | 'no_active_session' | 'save_failed';
|
|
105
|
+
memoryId: string | null;
|
|
106
|
+
snapshotMemoryId: string | null;
|
|
107
|
+
suppressedDuplicate?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/** Server response from /api/v1/hooks/context (Codex hooks endpoint, reused). */
|
|
110
|
+
export interface PromptContextResponse {
|
|
111
|
+
ok: boolean;
|
|
112
|
+
reason?: string;
|
|
113
|
+
additionalContext?: string;
|
|
114
|
+
filesInjected?: string[];
|
|
80
115
|
}
|
|
81
116
|
/** Minimal config read from .mnemonik.json + ~/.mnemonik/scanner.json. */
|
|
82
117
|
export interface HookConfig {
|
|
@@ -85,7 +120,22 @@ export interface HookConfig {
|
|
|
85
120
|
contextualHooks: {
|
|
86
121
|
preEditGate: 'advisory' | 'enforce' | 'off';
|
|
87
122
|
preBashGate: 'advisory' | 'enforce' | 'off';
|
|
123
|
+
/**
|
|
124
|
+
* Stop checkpoint gate (P5). Advisory by default — same default as
|
|
125
|
+
* preEditGate / preBashGate. Enforce flip waits for telemetry per the
|
|
126
|
+
* v4.0 criteria (bypass <5%, false-positive <1% over 2 weeks).
|
|
127
|
+
*/
|
|
128
|
+
stopCheckpointGate: 'advisory' | 'enforce' | 'off';
|
|
88
129
|
advisoryAutoFetch: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* P5 lifecycle side-effect handlers — these don't gate anything (they
|
|
132
|
+
* inject context or fire-and-forget save), so they take a binary on|off
|
|
133
|
+
* rather than the advisory|enforce|off tri-state.
|
|
134
|
+
*/
|
|
135
|
+
sessionStartBootstrap: 'on' | 'off';
|
|
136
|
+
preCompactSnapshot: 'on' | 'off';
|
|
137
|
+
sessionEndSave: 'on' | 'off';
|
|
138
|
+
userPromptContext: 'on' | 'off';
|
|
89
139
|
};
|
|
90
140
|
}
|
|
91
141
|
export declare const DEFAULT_CONTEXTUAL_HOOKS: HookConfig['contextualHooks'];
|
package/dist/lib/types.js
CHANGED
|
@@ -10,7 +10,16 @@ export const DEFAULT_CONTEXTUAL_HOOKS = {
|
|
|
10
10
|
// if dogfood telemetry shows bypass rate <5% and false-positive rate <1%.
|
|
11
11
|
preEditGate: 'advisory',
|
|
12
12
|
preBashGate: 'advisory',
|
|
13
|
+
stopCheckpointGate: 'advisory',
|
|
13
14
|
advisoryAutoFetch: true,
|
|
15
|
+
// Side-effect handlers default ON — they don't block anything, and the only
|
|
16
|
+
// off-switch is for users who want to opt out entirely. The proxy still
|
|
17
|
+
// fires its corresponding reminders when these are off (no coord keys
|
|
18
|
+
// written → today's behavior).
|
|
19
|
+
sessionStartBootstrap: 'on',
|
|
20
|
+
preCompactSnapshot: 'on',
|
|
21
|
+
sessionEndSave: 'on',
|
|
22
|
+
userPromptContext: 'on',
|
|
14
23
|
};
|
|
15
24
|
export const DEFAULT_SERVER = 'https://api.mnemonik.dev';
|
|
16
25
|
//# sourceMappingURL=types.js.map
|
package/dist/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6JH,MAAM,CAAC,MAAM,wBAAwB,GAAkC;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,UAAU;IACvB,kBAAkB,EAAE,UAAU;IAC9B,iBAAiB,EAAE,IAAI;IACvB,4EAA4E;IAC5E,wEAAwE;IACxE,sEAAsE;IACtE,+BAA+B;IAC/B,qBAAqB,EAAE,IAAI;IAC3B,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnemonik/claude-code-hooks",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "Claude Code
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Claude Code lifecycle contextual hooks for Mnemonik. PreToolUse Edit/Write/NotebookEdit/Bash gates plus SessionStart bootstrap pre-injection, Stop checkpoint gate (advisory), PreCompact context_snapshot pre-injection, SessionEnd save, and UserPromptSubmit context inject. filesToWrite delivery of skill/rules/.mnemonik.json continues to flow for ALL clients including Claude Code — this package adds host-side hook gating only. Versioned independently from the @mnemonik/server release cadence (mirrors @mnemonik/scanner).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"mnemonik-claude-code-hooks": "dist/install.js"
|