@getmarrow/mcp 3.9.48 → 3.9.50

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.
@@ -0,0 +1,39 @@
1
+ export declare const MCP_ADAPTER_VERSION = "3.9.50";
2
+ export declare const NATIVE_HOOK_MATCHER = "Bash|Edit|Write|MultiEdit|mcp__(?!marrow_).*";
3
+ export declare const MCP_PACKAGE_SPEC = "@getmarrow/mcp@3.9.50";
4
+ export declare const CONTEXT_HOOK_COMMAND = "npx -y @getmarrow/mcp@3.9.50 context-hook";
5
+ export declare const PRE_ACTION_HOOK_COMMAND = "npx -y @getmarrow/mcp@3.9.50 pre-action-hook";
6
+ export declare const ACTION_RESULT_HOOK_COMMAND = "npx -y @getmarrow/mcp@3.9.50 hook";
7
+ export declare const SESSION_END_HOOK_COMMAND = "npx -y @getmarrow/mcp@3.9.50 session-hook";
8
+ export declare const NATIVE_EXPECTED_HOOKS: readonly ["prompt", "pre_action", "action_result", "session_end"];
9
+ type HookSettings = Record<string, unknown>;
10
+ export declare function findHookSettingsPath(startDir?: string): string;
11
+ export declare function readHookSettings(startDir?: string): HookSettings;
12
+ export declare function readHookSettingsForInstall(startDir?: string): HookSettings;
13
+ export type MarrowHookSubcommand = 'context-hook' | 'pre-action-hook' | 'hook' | 'session-hook';
14
+ export declare function reconcileMarrowCommandHook(settings: HookSettings, eventName: string, subcommand: MarrowHookSubcommand, command: string, matcher?: string): {
15
+ entries: unknown[];
16
+ changed: boolean;
17
+ };
18
+ export declare function hasExactCommandHook(settings: HookSettings, eventName: string, command: string, matcher?: string): boolean;
19
+ export declare function nativeHookConfigurationFingerprint(startDir?: string): string;
20
+ export declare function nativeHookEvidence(observedHook: typeof NATIVE_EXPECTED_HOOKS[number], startDir?: string): {
21
+ adapter_version: string;
22
+ capability_level: 'native_hooks';
23
+ config_fingerprint: string;
24
+ expected_hooks: string[];
25
+ observed_hook: typeof observedHook;
26
+ };
27
+ export declare function stableToolCorrelation(event: {
28
+ session_id?: string;
29
+ tool_use_id?: string;
30
+ tool_name?: string;
31
+ tool_input?: unknown;
32
+ }): string;
33
+ export declare function stablePromptCorrelation(event: {
34
+ session_id?: string;
35
+ prompt?: string;
36
+ }): string;
37
+ export declare function stableSessionWorkflowId(sessionId?: string, fallback?: unknown): string;
38
+ export {};
39
+ //# sourceMappingURL=hook-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-contract.d.ts","sourceRoot":"","sources":["../src/hook-contract.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,mBAAmB,iDAAiD,CAAC;AAClF,eAAO,MAAM,gBAAgB,0BAA0C,CAAC;AACxE,eAAO,MAAM,oBAAoB,8CAA4C,CAAC;AAC9E,eAAO,MAAM,uBAAuB,iDAA+C,CAAC;AACpF,eAAO,MAAM,0BAA0B,sCAAoC,CAAC;AAC5E,eAAO,MAAM,wBAAwB,8CAA4C,CAAC;AAClF,eAAO,MAAM,qBAAqB,mEAAoE,CAAC;AAEvG,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAQ5C,wBAAgB,oBAAoB,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAYrE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,SAAgB,GAAG,YAAY,CAQvE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,SAAgB,GAAG,YAAY,CAejF;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,iBAAiB,GAAG,MAAM,GAAG,cAAc,CAAC;AAUhG,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAuC1C;AA4BD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAcT;AA4BD,wBAAgB,kCAAkC,CAAC,QAAQ,SAAgB,GAAG,MAAM,CA6BnF;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,OAAO,qBAAqB,CAAC,MAAM,CAAC,EAClD,QAAQ,SAAgB,GACvB;IACD,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,cAAc,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,YAAY,CAAC;CACpC,CAQA;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,MAAM,CAOT;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAET;AAED,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAEtF"}
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NATIVE_EXPECTED_HOOKS = exports.SESSION_END_HOOK_COMMAND = exports.ACTION_RESULT_HOOK_COMMAND = exports.PRE_ACTION_HOOK_COMMAND = exports.CONTEXT_HOOK_COMMAND = exports.MCP_PACKAGE_SPEC = exports.NATIVE_HOOK_MATCHER = exports.MCP_ADAPTER_VERSION = void 0;
4
+ exports.findHookSettingsPath = findHookSettingsPath;
5
+ exports.readHookSettings = readHookSettings;
6
+ exports.readHookSettingsForInstall = readHookSettingsForInstall;
7
+ exports.reconcileMarrowCommandHook = reconcileMarrowCommandHook;
8
+ exports.hasExactCommandHook = hasExactCommandHook;
9
+ exports.nativeHookConfigurationFingerprint = nativeHookConfigurationFingerprint;
10
+ exports.nativeHookEvidence = nativeHookEvidence;
11
+ exports.stableToolCorrelation = stableToolCorrelation;
12
+ exports.stablePromptCorrelation = stablePromptCorrelation;
13
+ exports.stableSessionWorkflowId = stableSessionWorkflowId;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const node_fs_1 = require("node:fs");
16
+ const node_path_1 = require("node:path");
17
+ exports.MCP_ADAPTER_VERSION = '3.9.50';
18
+ exports.NATIVE_HOOK_MATCHER = 'Bash|Edit|Write|MultiEdit|mcp__(?!marrow_).*';
19
+ exports.MCP_PACKAGE_SPEC = `@getmarrow/mcp@${exports.MCP_ADAPTER_VERSION}`;
20
+ exports.CONTEXT_HOOK_COMMAND = `npx -y ${exports.MCP_PACKAGE_SPEC} context-hook`;
21
+ exports.PRE_ACTION_HOOK_COMMAND = `npx -y ${exports.MCP_PACKAGE_SPEC} pre-action-hook`;
22
+ exports.ACTION_RESULT_HOOK_COMMAND = `npx -y ${exports.MCP_PACKAGE_SPEC} hook`;
23
+ exports.SESSION_END_HOOK_COMMAND = `npx -y ${exports.MCP_PACKAGE_SPEC} session-hook`;
24
+ exports.NATIVE_EXPECTED_HOOKS = ['prompt', 'pre_action', 'action_result', 'session_end'];
25
+ function asRecord(value) {
26
+ return value && typeof value === 'object' && !Array.isArray(value)
27
+ ? value
28
+ : null;
29
+ }
30
+ function findHookSettingsPath(startDir = process.cwd()) {
31
+ let dir = startDir;
32
+ let fallback = null;
33
+ for (let depth = 0; depth < 8; depth += 1) {
34
+ const candidate = (0, node_path_1.join)(dir, '.claude', 'settings.json');
35
+ if ((0, node_fs_1.existsSync)(candidate) || (0, node_fs_1.existsSync)((0, node_path_1.join)(dir, '.claude')))
36
+ return candidate;
37
+ if (!fallback && (0, node_fs_1.existsSync)((0, node_path_1.join)(dir, '.git')))
38
+ fallback = candidate;
39
+ const parent = (0, node_path_1.dirname)(dir);
40
+ if (parent === dir)
41
+ break;
42
+ dir = parent;
43
+ }
44
+ return fallback || (0, node_path_1.join)(startDir, '.claude', 'settings.json');
45
+ }
46
+ function readHookSettings(startDir = process.cwd()) {
47
+ const path = findHookSettingsPath(startDir);
48
+ if (!(0, node_fs_1.existsSync)(path))
49
+ return {};
50
+ try {
51
+ return asRecord(JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'))) || {};
52
+ }
53
+ catch {
54
+ return {};
55
+ }
56
+ }
57
+ function readHookSettingsForInstall(startDir = process.cwd()) {
58
+ const path = findHookSettingsPath(startDir);
59
+ if (!(0, node_fs_1.existsSync)(path))
60
+ return {};
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'));
64
+ }
65
+ catch (error) {
66
+ const detail = error instanceof Error ? error.message : 'invalid JSON';
67
+ throw new Error(`Cannot update Claude hook settings at ${path}: ${detail}`);
68
+ }
69
+ const settings = asRecord(parsed);
70
+ if (!settings) {
71
+ throw new Error(`Cannot update Claude hook settings at ${path}: root must be a JSON object`);
72
+ }
73
+ return settings;
74
+ }
75
+ function marrowHookSubcommand(command) {
76
+ if (typeof command !== 'string')
77
+ return null;
78
+ const match = command.trim().match(/^npx\s+(?:-y\s+)?@getmarrow\/mcp(?:@[^\s]+)?\s+(context-hook|pre-action-hook|hook|session-hook)$/);
79
+ return match?.[1] || null;
80
+ }
81
+ function reconcileMarrowCommandHook(settings, eventName, subcommand, command, matcher) {
82
+ const hooks = asRecord(settings.hooks);
83
+ const original = Array.isArray(hooks?.[eventName]) ? hooks[eventName] : [];
84
+ let preferredHandler = null;
85
+ const retained = [];
86
+ for (const entry of original) {
87
+ const record = asRecord(entry);
88
+ if (!record || !Array.isArray(record.hooks)) {
89
+ retained.push(entry);
90
+ continue;
91
+ }
92
+ const remaining = [];
93
+ for (const hook of record.hooks) {
94
+ const handler = asRecord(hook);
95
+ const detected = marrowHookSubcommand(handler?.command);
96
+ if (handler?.type === 'command' && detected) {
97
+ const exactMatcher = matcher === undefined
98
+ ? record.matcher === undefined
99
+ : record.matcher === matcher;
100
+ if (detected === subcommand && (!preferredHandler || (handler.command === command && exactMatcher))) {
101
+ preferredHandler = handler;
102
+ }
103
+ continue;
104
+ }
105
+ remaining.push(hook);
106
+ }
107
+ if (remaining.length > 0)
108
+ retained.push({ ...record, hooks: remaining });
109
+ }
110
+ const handler = { ...(preferredHandler || {}), type: 'command', command };
111
+ const canonicalEntry = { hooks: [handler] };
112
+ if (matcher !== undefined)
113
+ canonicalEntry.matcher = matcher;
114
+ retained.push(canonicalEntry);
115
+ return {
116
+ entries: retained,
117
+ changed: JSON.stringify(original) !== JSON.stringify(retained),
118
+ };
119
+ }
120
+ function marrowHookDescriptors(settings, eventName, subcommand) {
121
+ const hooks = asRecord(settings.hooks);
122
+ const entries = hooks?.[eventName];
123
+ if (!Array.isArray(entries))
124
+ return [];
125
+ return entries.flatMap((entry) => {
126
+ const record = asRecord(entry);
127
+ if (!record || !Array.isArray(record.hooks))
128
+ return [];
129
+ return record.hooks.flatMap((hook) => {
130
+ const handler = asRecord(hook);
131
+ const detected = marrowHookSubcommand(handler?.command);
132
+ if (handler?.type !== 'command' || !detected || (subcommand && detected !== subcommand))
133
+ return [];
134
+ return [{
135
+ matcher: typeof record.matcher === 'string' ? record.matcher : null,
136
+ command: String(handler.command).trim(),
137
+ timeout: typeof handler.timeout === 'number' && Number.isFinite(handler.timeout)
138
+ ? handler.timeout
139
+ : null,
140
+ }];
141
+ });
142
+ });
143
+ }
144
+ function hasExactCommandHook(settings, eventName, command, matcher) {
145
+ const hooks = asRecord(settings.hooks);
146
+ const entries = hooks?.[eventName];
147
+ if (!Array.isArray(entries))
148
+ return false;
149
+ return entries.some((entry) => {
150
+ const record = asRecord(entry);
151
+ if (!record || (matcher !== undefined && record.matcher !== matcher) || !Array.isArray(record.hooks))
152
+ return false;
153
+ return record.hooks.some((hook) => {
154
+ const handler = asRecord(hook);
155
+ return handler?.type === 'command'
156
+ && typeof handler.command === 'string'
157
+ && handler.command.trim() === command;
158
+ });
159
+ });
160
+ }
161
+ function exactHookDescriptors(settings, eventName, command, matcher) {
162
+ const hooks = asRecord(settings.hooks);
163
+ const entries = hooks?.[eventName];
164
+ if (!Array.isArray(entries))
165
+ return [];
166
+ return entries.flatMap((entry) => {
167
+ const record = asRecord(entry);
168
+ if (!record || (matcher !== undefined && record.matcher !== matcher) || !Array.isArray(record.hooks))
169
+ return [];
170
+ return record.hooks.flatMap((hook) => {
171
+ const handler = asRecord(hook);
172
+ if (handler?.type !== 'command' || typeof handler.command !== 'string' || handler.command.trim() !== command)
173
+ return [];
174
+ return [{
175
+ matcher: typeof record.matcher === 'string' ? record.matcher : null,
176
+ command,
177
+ timeout: typeof handler.timeout === 'number' && Number.isFinite(handler.timeout)
178
+ ? handler.timeout
179
+ : null,
180
+ }];
181
+ });
182
+ });
183
+ }
184
+ function nativeHookConfigurationFingerprint(startDir = process.cwd()) {
185
+ const settings = readHookSettings(startDir);
186
+ const contract = {
187
+ schema: 'marrow-claude-native-hooks.v3',
188
+ adapter_version: exports.MCP_ADAPTER_VERSION,
189
+ expected_hooks: exports.NATIVE_EXPECTED_HOOKS,
190
+ configured: {
191
+ prompt: hasExactCommandHook(settings, 'UserPromptSubmit', exports.CONTEXT_HOOK_COMMAND),
192
+ pre_action: hasExactCommandHook(settings, 'PreToolUse', exports.PRE_ACTION_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
193
+ action_result_success: hasExactCommandHook(settings, 'PostToolUse', exports.ACTION_RESULT_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
194
+ action_result_failure: hasExactCommandHook(settings, 'PostToolUseFailure', exports.ACTION_RESULT_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
195
+ session_end: hasExactCommandHook(settings, 'Stop', exports.SESSION_END_HOOK_COMMAND),
196
+ },
197
+ descriptors: {
198
+ prompt: exactHookDescriptors(settings, 'UserPromptSubmit', exports.CONTEXT_HOOK_COMMAND),
199
+ pre_action: exactHookDescriptors(settings, 'PreToolUse', exports.PRE_ACTION_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
200
+ action_result_success: exactHookDescriptors(settings, 'PostToolUse', exports.ACTION_RESULT_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
201
+ action_result_failure: exactHookDescriptors(settings, 'PostToolUseFailure', exports.ACTION_RESULT_HOOK_COMMAND, exports.NATIVE_HOOK_MATCHER),
202
+ session_end: exactHookDescriptors(settings, 'Stop', exports.SESSION_END_HOOK_COMMAND),
203
+ },
204
+ active_marrow_handlers: {
205
+ prompt: marrowHookDescriptors(settings, 'UserPromptSubmit'),
206
+ pre_action: marrowHookDescriptors(settings, 'PreToolUse'),
207
+ action_result_success: marrowHookDescriptors(settings, 'PostToolUse'),
208
+ action_result_failure: marrowHookDescriptors(settings, 'PostToolUseFailure'),
209
+ session_end: marrowHookDescriptors(settings, 'Stop'),
210
+ },
211
+ };
212
+ return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(contract)).digest('hex');
213
+ }
214
+ function nativeHookEvidence(observedHook, startDir = process.cwd()) {
215
+ return {
216
+ adapter_version: exports.MCP_ADAPTER_VERSION,
217
+ capability_level: 'native_hooks',
218
+ config_fingerprint: nativeHookConfigurationFingerprint(startDir),
219
+ expected_hooks: [...exports.NATIVE_EXPECTED_HOOKS],
220
+ observed_hook: observedHook,
221
+ };
222
+ }
223
+ function stableHash(value) {
224
+ return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(value)).digest('hex').slice(0, 32);
225
+ }
226
+ function stableToolCorrelation(event) {
227
+ return stableHash([
228
+ event.session_id || '',
229
+ event.tool_use_id || '',
230
+ event.tool_name || 'tool',
231
+ event.tool_use_id ? null : event.tool_input ?? null,
232
+ ]);
233
+ }
234
+ function stablePromptCorrelation(event) {
235
+ return stableHash([event.session_id || '', event.prompt || '']);
236
+ }
237
+ function stableSessionWorkflowId(sessionId, fallback) {
238
+ return `session-${stableHash([sessionId || '', sessionId ? null : fallback ?? null])}`;
239
+ }
240
+ //# sourceMappingURL=hook-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-contract.js","sourceRoot":"","sources":["../src/hook-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { marrowAgentRuntime } from './index';
2
+ export type PreToolUseEvent = {
3
+ session_id?: string;
4
+ hook_event_name?: string;
5
+ tool_use_id?: string;
6
+ tool_name?: string;
7
+ tool_input?: unknown;
8
+ };
9
+ export declare function preActionHookOutput(runtime: Awaited<ReturnType<typeof marrowAgentRuntime>> | null): Record<string, unknown>;
10
+ export declare function installPreActionHook(startDir?: string): {
11
+ settingsPath: string;
12
+ installed: boolean;
13
+ };
14
+ export declare function runPreActionHookCommand(input?: unknown): Promise<void>;
15
+ //# sourceMappingURL=hook-pre-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-pre-action.d.ts","sourceRoot":"","sources":["../src/hook-pre-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,SAAS,CAAC;AAiB9D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAkDF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoB3H;AA0BD,wBAAgB,oBAAoB,CAAC,QAAQ,SAAgB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAgB3G;AAED,wBAAsB,uBAAuB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD5E"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preActionHookOutput = preActionHookOutput;
4
+ exports.installPreActionHook = installPreActionHook;
5
+ exports.runPreActionHookCommand = runPreActionHookCommand;
6
+ const index_1 = require("./index");
7
+ const env_1 = require("./env");
8
+ const lifecycle_spool_1 = require("./lifecycle-spool");
9
+ const hook_contract_1 = require("./hook-contract");
10
+ const MAX_INPUT_BYTES = 64 * 1024;
11
+ const RUNTIME_TIMEOUT_MS = 900;
12
+ function asRecord(value) {
13
+ return value && typeof value === 'object' && !Array.isArray(value)
14
+ ? value
15
+ : null;
16
+ }
17
+ async function readStdin() {
18
+ const chunks = [];
19
+ let bytes = 0;
20
+ for await (const chunk of process.stdin) {
21
+ const buffer = Buffer.from(chunk);
22
+ bytes += buffer.length;
23
+ if (bytes > MAX_INPUT_BYTES)
24
+ throw new Error('pre-action hook input exceeds byte limit');
25
+ chunks.push(buffer);
26
+ }
27
+ return Buffer.concat(chunks).toString('utf8');
28
+ }
29
+ function classifyTool(event) {
30
+ const tool = String(event.tool_name || 'tool').slice(0, 64);
31
+ const input = JSON.stringify(event.tool_input || {}).toLowerCase();
32
+ let type = 'process';
33
+ if (/\b(?:deploy|release|publish|wrangler)\b/.test(input))
34
+ type = 'deploy';
35
+ else if (/\b(?:merge|pull request|git push)\b/.test(input))
36
+ type = 'review';
37
+ else if (/\b(?:migration|schema|database|d1)\b/.test(input))
38
+ type = 'migration';
39
+ else if (/\b(?:secret|credential|token|key|permission)\b/.test(input))
40
+ type = 'audit';
41
+ const surfaces = [
42
+ /\b(?:deploy|release|production|prod|wrangler)\b/.test(input) ? 'production' : '',
43
+ /\b(?:git|github|merge|pull request|push)\b/.test(input) ? 'github' : '',
44
+ /\b(?:npm|package|publish)\b/.test(input) ? 'npm' : '',
45
+ /\b(?:secret|credential|token|key)\b/.test(input) ? 'secrets' : '',
46
+ ].filter(Boolean);
47
+ const risk = surfaces.includes('production') || surfaces.includes('secrets') ? 'high' : 'medium';
48
+ return {
49
+ action: `classified ${tool} action: ${type} on ${surfaces.join(', ') || 'workspace'}`,
50
+ type,
51
+ role: ['deploy', 'review', 'migration', 'audit'].includes(type) ? type : 'general',
52
+ surfaces: surfaces.length ? surfaces : ['workspace'],
53
+ risk,
54
+ };
55
+ }
56
+ function preActionHookOutput(runtime) {
57
+ if (!runtime?.risk_gate) {
58
+ return {};
59
+ }
60
+ const gate = runtime.risk_gate;
61
+ const reason = runtime.exact_next_action
62
+ || gate.reasons?.[0]?.message
63
+ || 'Marrow requires additional proof or operator review before this action.';
64
+ const permissionDecision = gate.decision === 'review_required'
65
+ ? 'ask'
66
+ : gate.decision === 'block' || gate.allow === false
67
+ ? 'deny'
68
+ : null;
69
+ return {
70
+ hookSpecificOutput: {
71
+ hookEventName: 'PreToolUse',
72
+ ...(permissionDecision ? { permissionDecision, permissionDecisionReason: reason } : {}),
73
+ ...(runtime.before_you_act ? { additionalContext: runtime.before_you_act } : {}),
74
+ },
75
+ };
76
+ }
77
+ function emitDecision(runtime) {
78
+ process.stdout.write(JSON.stringify(preActionHookOutput(runtime)));
79
+ }
80
+ async function withTimeout(operation) {
81
+ const controller = new AbortController();
82
+ let timer;
83
+ try {
84
+ return await Promise.race([
85
+ operation(controller.signal),
86
+ new Promise((resolve) => {
87
+ timer = setTimeout(() => {
88
+ controller.abort();
89
+ resolve(null);
90
+ }, RUNTIME_TIMEOUT_MS);
91
+ }),
92
+ ]);
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ finally {
98
+ if (timer)
99
+ clearTimeout(timer);
100
+ }
101
+ }
102
+ function installPreActionHook(startDir = process.cwd()) {
103
+ const fs = require('node:fs');
104
+ const path = (0, hook_contract_1.findHookSettingsPath)(startDir);
105
+ const settings = (0, hook_contract_1.readHookSettingsForInstall)(startDir);
106
+ const hooks = asRecord(settings.hooks) || {};
107
+ const reconciled = (0, hook_contract_1.reconcileMarrowCommandHook)(settings, 'PreToolUse', 'pre-action-hook', hook_contract_1.PRE_ACTION_HOOK_COMMAND, hook_contract_1.NATIVE_HOOK_MATCHER);
108
+ settings.hooks = { ...hooks, PreToolUse: reconciled.entries };
109
+ fs.mkdirSync(require('node:path').dirname(path), { recursive: true });
110
+ fs.writeFileSync(path, JSON.stringify(settings, null, 2) + '\n');
111
+ return { settingsPath: path, installed: reconciled.changed };
112
+ }
113
+ async function runPreActionHookCommand(input) {
114
+ if (process.env.MARROW_AUTO_HOOK === 'false')
115
+ return;
116
+ let event = input;
117
+ if (event === undefined) {
118
+ try {
119
+ const raw = (await readStdin()).trim();
120
+ event = raw ? JSON.parse(raw) : {};
121
+ }
122
+ catch {
123
+ process.stdout.write('{}');
124
+ return;
125
+ }
126
+ }
127
+ const source = asRecord(event);
128
+ if (!source?.tool_name) {
129
+ process.stdout.write('{}');
130
+ return;
131
+ }
132
+ const resolved = (0, env_1.resolveMarrowEnv)();
133
+ if (!resolved.apiKey) {
134
+ process.stdout.write('{}');
135
+ return;
136
+ }
137
+ const baseUrl = (0, index_1.validateBaseUrl)(resolved.baseUrl || 'https://api.getmarrow.ai');
138
+ const sessionId = resolved.sessionId || source.session_id;
139
+ const agentId = resolved.agentId || undefined;
140
+ const correlation = (0, hook_contract_1.stableToolCorrelation)({ ...source, session_id: sessionId });
141
+ const classified = classifyTool(source);
142
+ const lifecycle = (0, lifecycle_spool_1.recordLifecycleEvent)({
143
+ apiKey: resolved.apiKey,
144
+ baseUrl,
145
+ event: {
146
+ event_id: `pretool-${correlation}`,
147
+ event_type: 'pre_action_checked',
148
+ harness: 'claude-code',
149
+ agent_id: agentId,
150
+ session_id: sessionId,
151
+ workflow_id: (0, hook_contract_1.stableSessionWorkflowId)(sessionId, source.tool_use_id),
152
+ correlation_id: correlation,
153
+ ...(0, hook_contract_1.nativeHookEvidence)('pre_action'),
154
+ action: classified.action,
155
+ risk_level: classified.risk,
156
+ outcome_state: 'pending',
157
+ },
158
+ }).catch(() => null);
159
+ const runtime = (signal) => (0, index_1.marrowAgentRuntime)(resolved.apiKey, baseUrl, {
160
+ action: classified.action,
161
+ type: classified.type,
162
+ role: classified.role,
163
+ surfaces: classified.surfaces,
164
+ }, sessionId, agentId, signal);
165
+ const [result] = await Promise.all([withTimeout(runtime), lifecycle]);
166
+ emitDecision(result);
167
+ }
168
+ //# sourceMappingURL=hook-pre-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-pre-action.js","sourceRoot":"","sources":["../src/hook-pre-action.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const SESSION_HOOK_COMMAND = "npx -y @getmarrow/mcp session-hook";
1
+ export declare const SESSION_HOOK_COMMAND = "npx -y @getmarrow/mcp@3.9.50 session-hook";
2
2
  export declare function installSessionEndHook(startDir?: string): {
3
3
  settingsPath: string;
4
4
  installed: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"hook-session.d.ts","sourceRoot":"","sources":["../src/hook-session.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAkFzE,wBAAgB,qBAAqB,CAAC,QAAQ,SAAgB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAiB5G;AAED,wBAAsB,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1E"}
1
+ {"version":3,"file":"hook-session.d.ts","sourceRoot":"","sources":["../src/hook-session.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,oBAAoB,8CAA2B,CAAC;AA0D7D,wBAAgB,qBAAqB,CAAC,QAAQ,SAAgB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAa5G;AAED,wBAAsB,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B1E"}
@@ -6,9 +6,9 @@ exports.runSessionHookCommand = runSessionHookCommand;
6
6
  const env_1 = require("./env");
7
7
  const lifecycle_spool_1 = require("./lifecycle-spool");
8
8
  const index_1 = require("./index");
9
- const node_crypto_1 = require("node:crypto");
10
9
  const node_fs_1 = require("node:fs");
11
- exports.SESSION_HOOK_COMMAND = 'npx -y @getmarrow/mcp session-hook';
10
+ const hook_contract_1 = require("./hook-contract");
11
+ exports.SESSION_HOOK_COMMAND = hook_contract_1.SESSION_END_HOOK_COMMAND;
12
12
  const MAX_HOOK_INPUT_BYTES = 64 * 1024;
13
13
  const SESSION_END_TIMEOUT_MS = 900;
14
14
  function readStopHookSource(input) {
@@ -36,15 +36,6 @@ function readStopHookSource(input) {
36
36
  hook_event_name: take('hook_event_name'),
37
37
  };
38
38
  }
39
- function stopCorrelation(source, sessionId) {
40
- const stableSource = sessionId || JSON.stringify([
41
- source.session_id || '',
42
- source.transcript_path || '',
43
- source.cwd || '',
44
- source.hook_event_name || 'Stop',
45
- ]);
46
- return (0, node_crypto_1.createHash)('sha256').update(stableSource).digest('hex').slice(0, 32);
47
- }
48
39
  async function boundedSessionEnd(apiKey, baseUrl, sessionId, agentId) {
49
40
  const controller = new AbortController();
50
41
  let timeout;
@@ -64,39 +55,19 @@ async function boundedSessionEnd(apiKey, baseUrl, sessionId, agentId) {
64
55
  clearTimeout(timeout);
65
56
  }
66
57
  }
67
- function settingsPath(startDir) {
68
- const fs = require('fs');
69
- const path = require('path');
70
- let dir = startDir;
71
- while (true) {
72
- const candidate = path.join(dir, '.claude', 'settings.json');
73
- if (fs.existsSync(candidate) || fs.existsSync(path.join(dir, '.git')))
74
- return candidate;
75
- const parent = path.dirname(dir);
76
- if (parent === dir)
77
- break;
78
- dir = parent;
79
- }
80
- return path.join(startDir, '.claude', 'settings.json');
81
- }
82
58
  function installSessionEndHook(startDir = process.cwd()) {
83
59
  const fs = require('fs');
84
60
  const path = require('path');
85
- const target = settingsPath(startDir);
86
- const settings = fs.existsSync(target) && fs.readFileSync(target, 'utf8').trim()
87
- ? JSON.parse(fs.readFileSync(target, 'utf8'))
88
- : {};
61
+ const target = (0, hook_contract_1.findHookSettingsPath)(startDir);
62
+ const settings = (0, hook_contract_1.readHookSettingsForInstall)(startDir);
89
63
  const hooks = settings.hooks && typeof settings.hooks === 'object' && !Array.isArray(settings.hooks)
90
64
  ? settings.hooks
91
65
  : {};
92
- const stop = Array.isArray(hooks.Stop) ? [...hooks.Stop] : [];
93
- const installed = stop.some((entry) => JSON.stringify(entry).includes(exports.SESSION_HOOK_COMMAND));
94
- if (!installed)
95
- stop.push({ hooks: [{ type: 'command', command: exports.SESSION_HOOK_COMMAND }] });
96
- settings.hooks = { ...hooks, Stop: stop };
66
+ const reconciled = (0, hook_contract_1.reconcileMarrowCommandHook)(settings, 'Stop', 'session-hook', exports.SESSION_HOOK_COMMAND);
67
+ settings.hooks = { ...hooks, Stop: reconciled.entries };
97
68
  fs.mkdirSync(path.dirname(target), { recursive: true });
98
69
  fs.writeFileSync(target, JSON.stringify(settings, null, 2) + '\n');
99
- return { settingsPath: target, installed: !installed };
70
+ return { settingsPath: target, installed: reconciled.changed };
100
71
  }
101
72
  async function runSessionHookCommand(input) {
102
73
  if (process.env.MARROW_AUTO_HOOK === 'false')
@@ -108,7 +79,8 @@ async function runSessionHookCommand(input) {
108
79
  const source = readStopHookSource(input);
109
80
  const sessionId = resolved.sessionId || source.session_id || undefined;
110
81
  const agentId = resolved.agentId || undefined;
111
- const correlation = stopCorrelation(source, sessionId);
82
+ const workflowId = (0, hook_contract_1.stableSessionWorkflowId)(sessionId, [source.transcript_path, source.cwd]);
83
+ const correlation = workflowId.slice('session-'.length);
112
84
  await (0, lifecycle_spool_1.recordLifecycleEvent)({
113
85
  apiKey: resolved.apiKey,
114
86
  baseUrl,
@@ -118,7 +90,9 @@ async function runSessionHookCommand(input) {
118
90
  harness: 'claude-code',
119
91
  agent_id: agentId,
120
92
  session_id: sessionId,
121
- workflow_id: `session-${correlation}`,
93
+ workflow_id: workflowId,
94
+ correlation_id: correlation,
95
+ ...(0, hook_contract_1.nativeHookEvidence)('session_end'),
122
96
  action: 'agent session ended',
123
97
  outcome_state: 'pending',
124
98
  },
@@ -1 +1 @@
1
- {"version":3,"file":"hook-session.js","sourceRoot":"","sources":["../src/hook-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-session.js","sourceRoot":"","sources":["../src/hook-session.ts"],"names":[],"mappings":"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"}