@a5c-ai/hooks-mux-adapter-claude 5.0.1-staging.048a6d1f

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/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @a5c-ai/hooks-mux-adapter-claude
2
+
3
+ Claude Code harness adapter for hooks-mux.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @a5c-ai/hooks-mux-adapter-claude @a5c-ai/hooks-mux-core
9
+ ```
10
+
11
+ This package ships the built adapter runtime in `dist/` and this package README for npm publish-surface auditing.
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import {
17
+ createAdapter,
18
+ normalizeClaude,
19
+ renderClaudeOutput,
20
+ } from "@a5c-ai/hooks-mux-adapter-claude";
21
+ ```
22
+
23
+ The package exposes Claude-specific normalization, phase mappings, rendering helpers, and session-resolution utilities for the hooks-mux execution pipeline.
24
+
25
+ See [`packages/hooks-mux/README.md`](../README.md) for the workspace overview and `packages/hooks-mux/docs/adapter-integration-guide.md` for end-to-end integration guidance.
26
+
27
+ ## License
28
+
29
+ MIT © a5c-ai
@@ -0,0 +1,12 @@
1
+ import type { AdapterCapabilities } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * Creates the Claude Code adapter capability descriptor.
4
+ *
5
+ * Claude Code is a shell-hook harness with native session IDs,
6
+ * native env-file persistence via CLAUDE_ENV_FILE, and full
7
+ * tool interception scope.
8
+ *
9
+ * Spec section 17.1.
10
+ */
11
+ export declare function createAdapter(): AdapterCapabilities;
12
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CAoBnD"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAdapter = createAdapter;
4
+ /**
5
+ * Creates the Claude Code adapter capability descriptor.
6
+ *
7
+ * Claude Code is a shell-hook harness with native session IDs,
8
+ * native env-file persistence via CLAUDE_ENV_FILE, and full
9
+ * tool interception scope.
10
+ *
11
+ * Spec section 17.1.
12
+ */
13
+ function createAdapter() {
14
+ return {
15
+ name: 'claude',
16
+ family: 'shell-hook',
17
+ sessionIdQuality: 'native',
18
+ supportsOrderedFanout: true,
19
+ supportsNativeAdditionalContext: true,
20
+ supportsBlock: true,
21
+ supportsAsk: true,
22
+ supportsToolInputMutation: false,
23
+ supportsToolResultMutation: false,
24
+ supportsPersistedEnv: true,
25
+ envPersistenceMode: 'native_env_file',
26
+ toolInterceptionScope: 'all',
27
+ notes: [
28
+ 'CLAUDE_ENV_FILE is only available on specific events; append semantics required',
29
+ 'turn.stop can recurse if not guarded; stop_hook_active must be checked',
30
+ 'session.start source values: startup, resume, clear, compact',
31
+ ],
32
+ };
33
+ }
34
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;AAWA,sCAoBC;AA7BD;;;;;;;;GAQG;AACH,SAAgB,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,YAAY;QACpB,gBAAgB,EAAE,QAAQ;QAC1B,qBAAqB,EAAE,IAAI;QAC3B,+BAA+B,EAAE,IAAI;QACrC,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,IAAI;QACjB,yBAAyB,EAAE,KAAK;QAChC,0BAA0B,EAAE,KAAK;QACjC,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,iBAAiB;QACrC,qBAAqB,EAAE,KAAK;QAC5B,KAAK,EAAE;YACL,iFAAiF;YACjF,wEAAwE;YACxE,8DAA8D;SAC/D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { createAdapter } from './adapter';
2
+ export { CLAUDE_PHASE_MAPPINGS, getClaudePhaseMapping, getSupportedPhases } from './mappings';
3
+ export { normalizeClaude, parseStdin, buildExecutionContext, buildPayload, isStopHookRecursion } from './normalizer';
4
+ export { normalizeClaude as normalizeForInvoke } from './normalizer';
5
+ export type { ClaudeStdinBase, ClaudeSessionStartPayload, ClaudePreToolUsePayload, ClaudePostToolUsePayload, ClaudeStopPayload, ClaudeUserPromptSubmitPayload, ClaudeSubagentStopPayload, } from './normalizer';
6
+ export { renderClaudeOutput } from './renderer';
7
+ export { renderClaudeOutput as renderForInvoke } from './renderer';
8
+ export type { ClaudePreToolUseOutput, ClaudePostToolUseOutput, ClaudeStopOutput, ClaudeSessionStartOutput, ClaudeGenericOutput, } from './renderer';
9
+ export { resolveSessionId } from './session-resolver';
10
+ export type { SessionResolutionResult } from './session-resolver';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EACV,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSessionId = exports.renderForInvoke = exports.renderClaudeOutput = exports.normalizeForInvoke = exports.isStopHookRecursion = exports.buildPayload = exports.buildExecutionContext = exports.parseStdin = exports.normalizeClaude = exports.getSupportedPhases = exports.getClaudePhaseMapping = exports.CLAUDE_PHASE_MAPPINGS = exports.createAdapter = void 0;
4
+ var adapter_1 = require("./adapter");
5
+ Object.defineProperty(exports, "createAdapter", { enumerable: true, get: function () { return adapter_1.createAdapter; } });
6
+ var mappings_1 = require("./mappings");
7
+ Object.defineProperty(exports, "CLAUDE_PHASE_MAPPINGS", { enumerable: true, get: function () { return mappings_1.CLAUDE_PHASE_MAPPINGS; } });
8
+ Object.defineProperty(exports, "getClaudePhaseMapping", { enumerable: true, get: function () { return mappings_1.getClaudePhaseMapping; } });
9
+ Object.defineProperty(exports, "getSupportedPhases", { enumerable: true, get: function () { return mappings_1.getSupportedPhases; } });
10
+ var normalizer_1 = require("./normalizer");
11
+ Object.defineProperty(exports, "normalizeClaude", { enumerable: true, get: function () { return normalizer_1.normalizeClaude; } });
12
+ Object.defineProperty(exports, "parseStdin", { enumerable: true, get: function () { return normalizer_1.parseStdin; } });
13
+ Object.defineProperty(exports, "buildExecutionContext", { enumerable: true, get: function () { return normalizer_1.buildExecutionContext; } });
14
+ Object.defineProperty(exports, "buildPayload", { enumerable: true, get: function () { return normalizer_1.buildPayload; } });
15
+ Object.defineProperty(exports, "isStopHookRecursion", { enumerable: true, get: function () { return normalizer_1.isStopHookRecursion; } });
16
+ var normalizer_2 = require("./normalizer");
17
+ Object.defineProperty(exports, "normalizeForInvoke", { enumerable: true, get: function () { return normalizer_2.normalizeClaude; } });
18
+ var renderer_1 = require("./renderer");
19
+ Object.defineProperty(exports, "renderClaudeOutput", { enumerable: true, get: function () { return renderer_1.renderClaudeOutput; } });
20
+ var renderer_2 = require("./renderer");
21
+ Object.defineProperty(exports, "renderForInvoke", { enumerable: true, get: function () { return renderer_2.renderClaudeOutput; } });
22
+ var session_resolver_1 = require("./session-resolver");
23
+ Object.defineProperty(exports, "resolveSessionId", { enumerable: true, get: function () { return session_resolver_1.resolveSessionId; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,uCAA8F;AAArF,iHAAA,qBAAqB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AACzE,2CAAqH;AAA5G,6GAAA,eAAe,OAAA;AAAE,wGAAA,UAAU,OAAA;AAAE,mHAAA,qBAAqB,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAC9F,2CAAqE;AAA5D,gHAAA,eAAe,OAAsB;AAU9C,uCAAgD;AAAvC,8GAAA,kBAAkB,OAAA;AAC3B,uCAAmE;AAA1D,2GAAA,kBAAkB,OAAmB;AAQ9C,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,20 @@
1
+ import type { PhaseMapping } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * Claude Code native event name to canonical phase mappings.
4
+ *
5
+ * Claude Code hook events:
6
+ * SessionStart, PreToolUse, PostToolUse, Stop, SubagentStop,
7
+ * Notification, UserPromptSubmit, PreCompact, SessionEnd
8
+ *
9
+ * Spec section 8.2 / 17.1.
10
+ */
11
+ export declare const CLAUDE_PHASE_MAPPINGS: PhaseMapping[];
12
+ /**
13
+ * Look up the phase mapping for a given Claude native event name.
14
+ */
15
+ export declare function getClaudePhaseMapping(nativeEventName: string): PhaseMapping | undefined;
16
+ /**
17
+ * Get all canonical phases supported by the Claude adapter.
18
+ */
19
+ export declare function getSupportedPhases(): string[];
20
+ //# sourceMappingURL=mappings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../src/mappings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAY,EAkF/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEvF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLAUDE_PHASE_MAPPINGS = void 0;
4
+ exports.getClaudePhaseMapping = getClaudePhaseMapping;
5
+ exports.getSupportedPhases = getSupportedPhases;
6
+ /**
7
+ * Claude Code native event name to canonical phase mappings.
8
+ *
9
+ * Claude Code hook events:
10
+ * SessionStart, PreToolUse, PostToolUse, Stop, SubagentStop,
11
+ * Notification, UserPromptSubmit, PreCompact, SessionEnd
12
+ *
13
+ * Spec section 8.2 / 17.1.
14
+ */
15
+ exports.CLAUDE_PHASE_MAPPINGS = [
16
+ {
17
+ canonicalPhase: 'session.start',
18
+ nativeHook: 'SessionStart',
19
+ supportLevel: 'native',
20
+ blockCapability: false,
21
+ mutationCapability: false,
22
+ scope: 'session',
23
+ notes: 'source values: startup, resume, clear, compact. CLAUDE_ENV_FILE available.',
24
+ },
25
+ {
26
+ canonicalPhase: 'session.end',
27
+ nativeHook: 'SessionEnd',
28
+ supportLevel: 'native',
29
+ blockCapability: false,
30
+ mutationCapability: false,
31
+ scope: 'session',
32
+ notes: 'Observer-only; no blocking or mutation.',
33
+ },
34
+ {
35
+ canonicalPhase: 'session.compact.before',
36
+ nativeHook: 'PreCompact',
37
+ supportLevel: 'native',
38
+ blockCapability: false,
39
+ mutationCapability: false,
40
+ scope: 'session',
41
+ notes: 'Fires before context compaction. Observer-only.',
42
+ },
43
+ {
44
+ canonicalPhase: 'turn.user_prompt_submitted',
45
+ nativeHook: 'UserPromptSubmit',
46
+ supportLevel: 'native',
47
+ blockCapability: false,
48
+ mutationCapability: false,
49
+ scope: 'turn',
50
+ notes: 'Fires when user submits a prompt.',
51
+ },
52
+ {
53
+ canonicalPhase: 'tool.before',
54
+ nativeHook: 'PreToolUse',
55
+ supportLevel: 'native',
56
+ blockCapability: true,
57
+ mutationCapability: false,
58
+ scope: 'tool',
59
+ notes: 'Can block (deny) or ask for permission. Tool input mutation not supported.',
60
+ },
61
+ {
62
+ canonicalPhase: 'tool.after',
63
+ nativeHook: 'PostToolUse',
64
+ supportLevel: 'native',
65
+ blockCapability: false,
66
+ mutationCapability: false,
67
+ scope: 'tool',
68
+ notes: 'Observer-only post-tool hook. CLAUDE_ENV_FILE available.',
69
+ },
70
+ {
71
+ canonicalPhase: 'turn.stop',
72
+ nativeHook: 'Stop',
73
+ supportLevel: 'native',
74
+ blockCapability: true,
75
+ mutationCapability: false,
76
+ scope: 'turn',
77
+ notes: 'Can continue session or stop. Guard against recursion via stop_hook_active.',
78
+ },
79
+ {
80
+ canonicalPhase: 'subagent.end',
81
+ nativeHook: 'SubagentStop',
82
+ supportLevel: 'native',
83
+ blockCapability: false,
84
+ mutationCapability: false,
85
+ scope: 'subagent',
86
+ notes: 'Fires when a subagent completes.',
87
+ },
88
+ {
89
+ canonicalPhase: 'notification',
90
+ nativeHook: 'Notification',
91
+ supportLevel: 'native',
92
+ blockCapability: false,
93
+ mutationCapability: false,
94
+ scope: 'notification',
95
+ notes: 'Observer-only notification event.',
96
+ },
97
+ ];
98
+ /**
99
+ * Look up the phase mapping for a given Claude native event name.
100
+ */
101
+ function getClaudePhaseMapping(nativeEventName) {
102
+ return exports.CLAUDE_PHASE_MAPPINGS.find((m) => m.nativeHook === nativeEventName);
103
+ }
104
+ /**
105
+ * Get all canonical phases supported by the Claude adapter.
106
+ */
107
+ function getSupportedPhases() {
108
+ return exports.CLAUDE_PHASE_MAPPINGS.map((m) => m.canonicalPhase);
109
+ }
110
+ //# sourceMappingURL=mappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.js","sourceRoot":"","sources":["../src/mappings.ts"],"names":[],"mappings":";;;AAkGA,sDAEC;AAKD,gDAEC;AAzGD;;;;;;;;GAQG;AACU,QAAA,qBAAqB,GAAmB;IACnD;QACE,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,4EAA4E;KACpF;IACD;QACE,cAAc,EAAE,aAAa;QAC7B,UAAU,EAAE,YAAY;QACxB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,yCAAyC;KACjD;IACD;QACE,cAAc,EAAE,wBAAwB;QACxC,UAAU,EAAE,YAAY;QACxB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,iDAAiD;KACzD;IACD;QACE,cAAc,EAAE,4BAA4B;QAC5C,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,mCAAmC;KAC3C;IACD;QACE,cAAc,EAAE,aAAa;QAC7B,UAAU,EAAE,YAAY;QACxB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,4EAA4E;KACpF;IACD;QACE,cAAc,EAAE,YAAY;QAC5B,UAAU,EAAE,aAAa;QACzB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,0DAA0D;KAClE;IACD;QACE,cAAc,EAAE,WAAW;QAC3B,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,6EAA6E;KACrF;IACD;QACE,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,kCAAkC;KAC1C;IACD;QACE,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,mCAAmC;KAC3C;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,qBAAqB,CAAC,eAAuB;IAC3D,OAAO,6BAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,6BAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,88 @@
1
+ import type { UnifiedHookEvent, UnifiedExecutionContext } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * Claude Code stdin JSON payload shapes.
4
+ *
5
+ * Claude passes hook input as JSON on stdin with fields varying by event type.
6
+ */
7
+ /** Common fields present across most Claude hook events. */
8
+ export interface ClaudeStdinBase {
9
+ session_id?: string;
10
+ session_type?: string;
11
+ cwd?: string;
12
+ transcript_path?: string;
13
+ model?: string;
14
+ permission_mode?: string;
15
+ /** Present on Stop events to indicate recursion guard. */
16
+ stop_hook_active?: boolean;
17
+ [key: string]: unknown;
18
+ }
19
+ /** SessionStart-specific fields. */
20
+ export interface ClaudeSessionStartPayload extends ClaudeStdinBase {
21
+ /** Source of session start: startup, resume, clear, compact. */
22
+ source?: string;
23
+ initial_prompt?: string;
24
+ }
25
+ /** PreToolUse-specific fields. */
26
+ export interface ClaudePreToolUsePayload extends ClaudeStdinBase {
27
+ tool_name?: string;
28
+ tool_call_id?: string;
29
+ tool_input?: unknown;
30
+ }
31
+ /** PostToolUse-specific fields. */
32
+ export interface ClaudePostToolUsePayload extends ClaudeStdinBase {
33
+ tool_name?: string;
34
+ tool_call_id?: string;
35
+ tool_input?: unknown;
36
+ tool_response?: unknown;
37
+ }
38
+ /** Stop-specific fields. */
39
+ export interface ClaudeStopPayload extends ClaudeStdinBase {
40
+ reason?: string;
41
+ last_assistant_message?: string;
42
+ stop_hook_active?: boolean;
43
+ }
44
+ /** UserPromptSubmit-specific fields. */
45
+ export interface ClaudeUserPromptSubmitPayload extends ClaudeStdinBase {
46
+ prompt?: string;
47
+ }
48
+ /** SubagentStop-specific fields. */
49
+ export interface ClaudeSubagentStopPayload extends ClaudeStdinBase {
50
+ agent_type?: string;
51
+ reason?: string;
52
+ last_assistant_message?: string;
53
+ }
54
+ /**
55
+ * Parse raw stdin input (string or object) into a structured object.
56
+ */
57
+ export declare function parseStdin(raw: unknown): Record<string, unknown>;
58
+ /**
59
+ * Build a UnifiedExecutionContext from a Claude stdin payload and environment.
60
+ */
61
+ export declare function buildExecutionContext(stdinData: Record<string, unknown>, nativeEventName: string, env: Record<string, string>): UnifiedExecutionContext;
62
+ /**
63
+ * Build the payload portion of the unified event from Claude stdin data.
64
+ * Extracts event-specific fields into the normalized payload.
65
+ */
66
+ export declare function buildPayload(nativeEventName: string, stdinData: Record<string, unknown>): Record<string, unknown>;
67
+ /**
68
+ * Check whether a normalized event represents a stop-hook recursion scenario.
69
+ *
70
+ * Claude Code sets `stop_hook_active: true` on Stop events that fire *inside*
71
+ * a stop hook's continued session. Responding with `continueSession: true`
72
+ * in this situation would trigger infinite recursion, so callers must detect
73
+ * this and emit a safe no-op instead.
74
+ *
75
+ * @param event - A normalized UnifiedHookEvent (or any object with an
76
+ * `execution.metadata` bag).
77
+ * @returns `true` when the event indicates stop-hook recursion.
78
+ */
79
+ export declare function isStopHookRecursion(event: Pick<UnifiedHookEvent, 'execution'>): boolean;
80
+ /**
81
+ * Normalize a Claude Code hook invocation into a UnifiedHookEvent.
82
+ *
83
+ * @param nativeEventName - The Claude event name (e.g. 'SessionStart', 'PreToolUse').
84
+ * @param rawStdin - Raw stdin content (string or parsed object).
85
+ * @param env - Environment variables at invocation time.
86
+ */
87
+ export declare function normalizeClaude(nativeEventName: string, rawStdin: unknown, env?: Record<string, string>): UnifiedHookEvent;
88
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGxF;;;;GAIG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,oCAAoC;AACpC,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,kCAAkC;AAClC,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,4BAA4B;AAC5B,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,6BAA8B,SAAQ,eAAe;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,uBAAuB,CAsCzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8DzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GACzC,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,EACjB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC/B,gBAAgB,CAmClB"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseStdin = parseStdin;
4
+ exports.buildExecutionContext = buildExecutionContext;
5
+ exports.buildPayload = buildPayload;
6
+ exports.isStopHookRecursion = isStopHookRecursion;
7
+ exports.normalizeClaude = normalizeClaude;
8
+ const mappings_1 = require("./mappings");
9
+ /**
10
+ * Parse raw stdin input (string or object) into a structured object.
11
+ */
12
+ function parseStdin(raw) {
13
+ if (raw == null) {
14
+ return {};
15
+ }
16
+ if (typeof raw === 'string') {
17
+ try {
18
+ const parsed = JSON.parse(raw);
19
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
20
+ return parsed;
21
+ }
22
+ return { raw: parsed };
23
+ }
24
+ catch {
25
+ return { raw };
26
+ }
27
+ }
28
+ if (typeof raw === 'object' && !Array.isArray(raw)) {
29
+ return raw;
30
+ }
31
+ return { raw };
32
+ }
33
+ /**
34
+ * Build a UnifiedExecutionContext from a Claude stdin payload and environment.
35
+ */
36
+ function buildExecutionContext(stdinData, nativeEventName, env) {
37
+ const persistedEnv = {};
38
+ const contextVars = {};
39
+ // Collect persisted env from environment
40
+ for (const [key, value] of Object.entries(env)) {
41
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
42
+ persistedEnv[key] = value;
43
+ }
44
+ }
45
+ // Claude provides session_id natively
46
+ const sessionId = stdinData.session_id
47
+ ?? env['AGENT_SESSION_ID']
48
+ ?? null;
49
+ return {
50
+ sessionId,
51
+ turnId: env['HOOKS_PROXY_TURN_ID'] ?? null,
52
+ conversationId: env['HOOKS_PROXY_CONVERSATION_ID'] ?? null,
53
+ adapter: 'claude',
54
+ cwd: stdinData.cwd ?? env['PWD'] ?? null,
55
+ worktree: env['HOOKS_PROXY_WORKTREE'] ?? null,
56
+ transcriptPath: stdinData.transcript_path ?? null,
57
+ source: stdinData.source ?? null,
58
+ model: stdinData.model ?? env['HOOKS_PROXY_MODEL'] ?? null,
59
+ agentType: stdinData.agent_type ?? null,
60
+ permissionMode: stdinData.permission_mode ?? null,
61
+ toolName: stdinData.tool_name ?? null,
62
+ toolCallId: stdinData.tool_call_id ?? null,
63
+ nativeEventName,
64
+ rawEventScope: stdinData.session_type ?? null,
65
+ persistedEnv,
66
+ contextVars,
67
+ metadata: {
68
+ ...(stdinData.stop_hook_active != null ? { stop_hook_active: stdinData.stop_hook_active } : {}),
69
+ },
70
+ };
71
+ }
72
+ /**
73
+ * Build the payload portion of the unified event from Claude stdin data.
74
+ * Extracts event-specific fields into the normalized payload.
75
+ */
76
+ function buildPayload(nativeEventName, stdinData) {
77
+ const payload = {};
78
+ switch (nativeEventName) {
79
+ case 'SessionStart':
80
+ if (stdinData.source != null)
81
+ payload.source = stdinData.source;
82
+ if (stdinData.initial_prompt != null)
83
+ payload.initialPrompt = stdinData.initial_prompt;
84
+ break;
85
+ case 'PreToolUse':
86
+ if (stdinData.tool_name != null)
87
+ payload.toolName = stdinData.tool_name;
88
+ if (stdinData.tool_call_id != null)
89
+ payload.toolCallId = stdinData.tool_call_id;
90
+ if (stdinData.tool_input != null)
91
+ payload.toolInput = stdinData.tool_input;
92
+ break;
93
+ case 'PostToolUse':
94
+ if (stdinData.tool_name != null)
95
+ payload.toolName = stdinData.tool_name;
96
+ if (stdinData.tool_call_id != null)
97
+ payload.toolCallId = stdinData.tool_call_id;
98
+ if (stdinData.tool_input != null)
99
+ payload.toolInput = stdinData.tool_input;
100
+ if (stdinData.tool_response != null)
101
+ payload.toolResponse = stdinData.tool_response;
102
+ break;
103
+ case 'Stop':
104
+ if (stdinData.reason != null)
105
+ payload.reason = stdinData.reason;
106
+ if (stdinData.last_assistant_message != null)
107
+ payload.lastAssistantMessage = stdinData.last_assistant_message;
108
+ if (stdinData.stop_hook_active != null)
109
+ payload.stopHookActive = stdinData.stop_hook_active;
110
+ break;
111
+ case 'UserPromptSubmit':
112
+ if (stdinData.prompt != null)
113
+ payload.prompt = stdinData.prompt;
114
+ break;
115
+ case 'SubagentStop':
116
+ if (stdinData.agent_type != null)
117
+ payload.agentType = stdinData.agent_type;
118
+ if (stdinData.reason != null)
119
+ payload.reason = stdinData.reason;
120
+ if (stdinData.last_assistant_message != null)
121
+ payload.lastAssistantMessage = stdinData.last_assistant_message;
122
+ break;
123
+ case 'PreCompact':
124
+ // No event-specific fields beyond common ones
125
+ break;
126
+ case 'SessionEnd':
127
+ // No event-specific fields beyond common ones
128
+ break;
129
+ case 'Notification':
130
+ if (stdinData.message != null)
131
+ payload.message = stdinData.message;
132
+ if (stdinData.title != null)
133
+ payload.title = stdinData.title;
134
+ break;
135
+ default:
136
+ // Unknown event: pass through all non-common fields
137
+ for (const [key, value] of Object.entries(stdinData)) {
138
+ if (!['session_id', 'session_type', 'cwd', 'transcript_path', 'model', 'permission_mode'].includes(key)) {
139
+ payload[key] = value;
140
+ }
141
+ }
142
+ break;
143
+ }
144
+ return payload;
145
+ }
146
+ /**
147
+ * Check whether a normalized event represents a stop-hook recursion scenario.
148
+ *
149
+ * Claude Code sets `stop_hook_active: true` on Stop events that fire *inside*
150
+ * a stop hook's continued session. Responding with `continueSession: true`
151
+ * in this situation would trigger infinite recursion, so callers must detect
152
+ * this and emit a safe no-op instead.
153
+ *
154
+ * @param event - A normalized UnifiedHookEvent (or any object with an
155
+ * `execution.metadata` bag).
156
+ * @returns `true` when the event indicates stop-hook recursion.
157
+ */
158
+ function isStopHookRecursion(event) {
159
+ return event.execution.metadata?.stop_hook_active === true;
160
+ }
161
+ /**
162
+ * Normalize a Claude Code hook invocation into a UnifiedHookEvent.
163
+ *
164
+ * @param nativeEventName - The Claude event name (e.g. 'SessionStart', 'PreToolUse').
165
+ * @param rawStdin - Raw stdin content (string or parsed object).
166
+ * @param env - Environment variables at invocation time.
167
+ */
168
+ function normalizeClaude(nativeEventName, rawStdin, env = {}) {
169
+ const stdinData = parseStdin(rawStdin);
170
+ const mapping = (0, mappings_1.getClaudePhaseMapping)(nativeEventName);
171
+ const phase = mapping?.canonicalPhase ?? 'unknown';
172
+ const supportLevel = mapping?.supportLevel ?? 'unsupported';
173
+ const execution = buildExecutionContext(stdinData, nativeEventName, env);
174
+ const payload = buildPayload(nativeEventName, stdinData);
175
+ // Split env into input and persisted buckets
176
+ const inputEnv = {};
177
+ const persistedEnv = {};
178
+ for (const [key, value] of Object.entries(env)) {
179
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
180
+ persistedEnv[key] = value;
181
+ }
182
+ else if (key.startsWith('HOOKS_PROXY_')) {
183
+ inputEnv[key] = value;
184
+ }
185
+ }
186
+ return {
187
+ version: 'a5c.hooks.v1',
188
+ adapter: 'claude',
189
+ phase,
190
+ rawEventName: nativeEventName,
191
+ supportLevel,
192
+ execution,
193
+ payload,
194
+ env: {
195
+ input: inputEnv,
196
+ persisted: persistedEnv,
197
+ },
198
+ raw: rawStdin,
199
+ };
200
+ }
201
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { UnifiedHookEvent, UnifiedHookResult } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * Claude Code native hook output formats.
4
+ *
5
+ * Claude Code hooks communicate results via JSON on stdout.
6
+ * The shape depends on the event type.
7
+ */
8
+ /** PreToolUse hook output: permission decision. */
9
+ export interface ClaudePreToolUseOutput {
10
+ decision?: 'allow' | 'deny' | 'ask';
11
+ reason?: string;
12
+ /** Additional context injected into the model's context window. */
13
+ additionalContext?: string;
14
+ }
15
+ /** PostToolUse hook output. */
16
+ export interface ClaudePostToolUseOutput {
17
+ /** Additional context injected into the model's context window. */
18
+ additionalContext?: string;
19
+ }
20
+ /** Stop hook output: continue/stop decision. */
21
+ export interface ClaudeStopOutput {
22
+ /** If true, the session continues instead of stopping. */
23
+ continue?: boolean;
24
+ /** Optional reason for the decision. */
25
+ reason?: string;
26
+ /** Follow-up message to send if continuing. */
27
+ followUpMessage?: string;
28
+ /** Additional context injected into the model's context window. */
29
+ additionalContext?: string;
30
+ }
31
+ /** SessionStart hook output. */
32
+ export interface ClaudeSessionStartOutput {
33
+ /** Additional context injected into the model's context window. */
34
+ additionalContext?: string;
35
+ }
36
+ /** Generic output shape for events with no specific output contract. */
37
+ export interface ClaudeGenericOutput {
38
+ [key: string]: unknown;
39
+ }
40
+ /**
41
+ * Render a UnifiedHookResult back to Claude's native JSON output format.
42
+ *
43
+ * If the optional `event` parameter is provided and indicates stop-hook
44
+ * recursion (`execution.metadata.stop_hook_active === true`), the renderer
45
+ * short-circuits to a safe no-op (`continueSession: false`) to prevent
46
+ * infinite recursion (spec 17.1).
47
+ *
48
+ * @param result - The unified hook result from handler execution.
49
+ * @param nativeEventName - The original Claude event name.
50
+ * @param event - Optional normalized event; used for recursion detection.
51
+ * @returns The native JSON output to write to stdout.
52
+ */
53
+ export declare function renderClaudeOutput(result: UnifiedHookResult, nativeEventName: string, event?: Pick<UnifiedHookEvent, 'execution'>): Record<string, unknown>;
54
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAElF;;;;;GAKG;AAEH,mDAAmD;AACnD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,+BAA+B;AAC/B,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,gCAAgC;AAChC,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderClaudeOutput = renderClaudeOutput;
4
+ /**
5
+ * Safe no-op response for Stop events during stop-hook recursion.
6
+ *
7
+ * When `stop_hook_active` is true, the hook is firing inside a session that
8
+ * was already continued by a previous stop hook. Emitting
9
+ * `continueSession: true` here would create an infinite loop, so the only
10
+ * safe response is to let the session stop naturally.
11
+ */
12
+ const SAFE_STOP_NOOP = Object.freeze({
13
+ continue: false,
14
+ });
15
+ /**
16
+ * Render a UnifiedHookResult back to Claude's native JSON output format.
17
+ *
18
+ * If the optional `event` parameter is provided and indicates stop-hook
19
+ * recursion (`execution.metadata.stop_hook_active === true`), the renderer
20
+ * short-circuits to a safe no-op (`continueSession: false`) to prevent
21
+ * infinite recursion (spec 17.1).
22
+ *
23
+ * @param result - The unified hook result from handler execution.
24
+ * @param nativeEventName - The original Claude event name.
25
+ * @param event - Optional normalized event; used for recursion detection.
26
+ * @returns The native JSON output to write to stdout.
27
+ */
28
+ function renderClaudeOutput(result, nativeEventName, event) {
29
+ // Recursion guard: if stop_hook_active is set, emit safe no-op for Stop events
30
+ if (nativeEventName === 'Stop' &&
31
+ event?.execution.metadata?.stop_hook_active === true) {
32
+ return { ...SAFE_STOP_NOOP };
33
+ }
34
+ switch (nativeEventName) {
35
+ case 'PreToolUse':
36
+ return renderPreToolUseOutput(result);
37
+ case 'PostToolUse':
38
+ return renderPostToolUseOutput(result);
39
+ case 'Stop':
40
+ return renderStopOutput(result);
41
+ case 'SessionStart':
42
+ return renderSessionStartOutput(result);
43
+ default:
44
+ return renderGenericOutput(result);
45
+ }
46
+ }
47
+ function renderPreToolUseOutput(result) {
48
+ const output = {};
49
+ // Map unified decision to Claude's permission decision
50
+ if (result.decision === 'allow') {
51
+ output['decision'] = 'allow';
52
+ }
53
+ else if (result.decision === 'deny') {
54
+ output['decision'] = 'deny';
55
+ }
56
+ else if (result.decision === 'ask') {
57
+ output['decision'] = 'ask';
58
+ }
59
+ // 'continue' and 'noop' produce no decision field — Claude defaults to allow
60
+ if (result.reason != null) {
61
+ output['reason'] = result.reason;
62
+ }
63
+ if (result.additionalContext != null) {
64
+ output['additionalContext'] = result.additionalContext;
65
+ }
66
+ return output;
67
+ }
68
+ function renderPostToolUseOutput(result) {
69
+ const output = {};
70
+ if (result.additionalContext != null) {
71
+ output['additionalContext'] = result.additionalContext;
72
+ }
73
+ return output;
74
+ }
75
+ function renderStopOutput(result) {
76
+ const output = {};
77
+ if (result.continueSession != null) {
78
+ output['continue'] = result.continueSession;
79
+ }
80
+ if (result.stopReason != null) {
81
+ output['reason'] = result.stopReason;
82
+ }
83
+ else if (result.reason != null) {
84
+ output['reason'] = result.reason;
85
+ }
86
+ if (result.followUpMessage != null) {
87
+ output['followUpMessage'] = result.followUpMessage;
88
+ }
89
+ if (result.additionalContext != null) {
90
+ output['additionalContext'] = result.additionalContext;
91
+ }
92
+ return output;
93
+ }
94
+ function renderSessionStartOutput(result) {
95
+ const output = {};
96
+ if (result.additionalContext != null) {
97
+ output['additionalContext'] = result.additionalContext;
98
+ }
99
+ return output;
100
+ }
101
+ function renderGenericOutput(result) {
102
+ const output = {};
103
+ if (result.additionalContext != null) {
104
+ output.additionalContext = result.additionalContext;
105
+ }
106
+ return output;
107
+ }
108
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Session ID resolution for Claude Code.
3
+ *
4
+ * Claude Code provides a native session_id in stdin JSON payloads,
5
+ * so the resolution quality is 'native'.
6
+ *
7
+ * Resolution precedence (spec section 9.2):
8
+ * 1. Explicit CLI flag --session-id
9
+ * 2. Explicit env AGENT_SESSION_ID
10
+ * 3. Native session_id from Claude stdin payload
11
+ * 4. Fallback: null (no synthetic generation — Claude always provides session_id)
12
+ */
13
+ export interface SessionResolutionResult {
14
+ sessionId: string | null;
15
+ source: 'explicit_flag' | 'explicit_env' | 'native' | 'none';
16
+ }
17
+ /**
18
+ * Resolve the session ID for a Claude Code hook invocation.
19
+ *
20
+ * @param stdinData - Parsed stdin JSON payload from Claude.
21
+ * @param env - Environment variables at invocation time.
22
+ * @param explicitSessionId - Session ID from explicit CLI flag, if any.
23
+ */
24
+ export declare function resolveSessionId(stdinData: Record<string, unknown>, env?: Record<string, string>, explicitSessionId?: string): SessionResolutionResult;
25
+ //# sourceMappingURL=session-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-resolver.d.ts","sourceRoot":"","sources":["../src/session-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAChC,iBAAiB,CAAC,EAAE,MAAM,GACzB,uBAAuB,CAoBzB"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * Session ID resolution for Claude Code.
4
+ *
5
+ * Claude Code provides a native session_id in stdin JSON payloads,
6
+ * so the resolution quality is 'native'.
7
+ *
8
+ * Resolution precedence (spec section 9.2):
9
+ * 1. Explicit CLI flag --session-id
10
+ * 2. Explicit env AGENT_SESSION_ID
11
+ * 3. Native session_id from Claude stdin payload
12
+ * 4. Fallback: null (no synthetic generation — Claude always provides session_id)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.resolveSessionId = resolveSessionId;
16
+ /**
17
+ * Resolve the session ID for a Claude Code hook invocation.
18
+ *
19
+ * @param stdinData - Parsed stdin JSON payload from Claude.
20
+ * @param env - Environment variables at invocation time.
21
+ * @param explicitSessionId - Session ID from explicit CLI flag, if any.
22
+ */
23
+ function resolveSessionId(stdinData, env = {}, explicitSessionId) {
24
+ // 1. Explicit CLI flag
25
+ if (explicitSessionId) {
26
+ return { sessionId: explicitSessionId, source: 'explicit_flag' };
27
+ }
28
+ // 2. Explicit env
29
+ const envSessionId = env['AGENT_SESSION_ID'];
30
+ if (envSessionId) {
31
+ return { sessionId: envSessionId, source: 'explicit_env' };
32
+ }
33
+ // 3. Native session_id from Claude stdin
34
+ const nativeSessionId = stdinData.session_id;
35
+ if (typeof nativeSessionId === 'string' && nativeSessionId.length > 0) {
36
+ return { sessionId: nativeSessionId, source: 'native' };
37
+ }
38
+ // 4. No session ID available
39
+ return { sessionId: null, source: 'none' };
40
+ }
41
+ //# sourceMappingURL=session-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-resolver.js","sourceRoot":"","sources":["../src/session-resolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAcH,4CAwBC;AA/BD;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,SAAkC,EAClC,MAA8B,EAAE,EAChC,iBAA0B;IAE1B,uBAAuB;IACvB,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,YAAY,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC7C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC7D,CAAC;IAED,yCAAyC;IACzC,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC;IAC7C,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,6BAA6B;IAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@a5c-ai/hooks-mux-adapter-claude",
3
+ "version": "5.0.1-staging.048a6d1f",
4
+ "description": "Claude Code harness adapter for the hooks-mux system",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/a5c-ai/babysitter.git",
15
+ "directory": "packages/hooks-mux/adapter-claude"
16
+ },
17
+ "homepage": "https://github.com/a5c-ai/babysitter/tree/main/packages/hooks-mux/adapter-claude#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/a5c-ai/babysitter/issues"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.json",
27
+ "clean": "rimraf dist",
28
+ "lint": "eslint \"src/**/*.ts\" --max-warnings=0",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest"
31
+ },
32
+ "dependencies": {
33
+ "@a5c-ai/hooks-mux-core": "5.0.1-staging.048a6d1f"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^5.7.0",
37
+ "vitest": "^3.0.0",
38
+ "rimraf": "^6.0.0"
39
+ }
40
+ }