@a5c-ai/hooks-mux-adapter-openclaw 5.0.1-staging.37ca18bd

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,25 @@
1
+ import type { AdapterCapabilities } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * Creates the OpenClaw adapter capability descriptor.
4
+ *
5
+ * OpenClaw is a library-first (in-process) harness that exposes two distinct
6
+ * hook layers:
7
+ *
8
+ * 1. **Gateway hooks** — internal lifecycle events fired by the OpenClaw
9
+ * gateway/router (e.g. request routing, auth, rate-limiting). These are
10
+ * infrastructure-level and do NOT map to canonical agent-lifecycle phases.
11
+ *
12
+ * 2. **Plugin hooks** — lifecycle events fired by OpenClaw plugins that
13
+ * participate in the agent conversation loop (session, tool, turn).
14
+ * These map cleanly to canonical phases.
15
+ *
16
+ * The adapter preserves this distinction by tagging normalized events with
17
+ * an `origin` field ('gateway' | 'plugin') in execution metadata, and by
18
+ * mapping only plugin hooks to canonical phases. Gateway hooks are mapped
19
+ * to scope 'gateway' with supportLevel 'lossy' to signal they are not
20
+ * semantically equivalent to agent-lifecycle phases.
21
+ *
22
+ * Spec section 17.9.
23
+ */
24
+ export declare function createAdapter(): AdapterCapabilities;
25
+ //# 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;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CAqBnD"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAdapter = createAdapter;
4
+ /**
5
+ * Creates the OpenClaw adapter capability descriptor.
6
+ *
7
+ * OpenClaw is a library-first (in-process) harness that exposes two distinct
8
+ * hook layers:
9
+ *
10
+ * 1. **Gateway hooks** — internal lifecycle events fired by the OpenClaw
11
+ * gateway/router (e.g. request routing, auth, rate-limiting). These are
12
+ * infrastructure-level and do NOT map to canonical agent-lifecycle phases.
13
+ *
14
+ * 2. **Plugin hooks** — lifecycle events fired by OpenClaw plugins that
15
+ * participate in the agent conversation loop (session, tool, turn).
16
+ * These map cleanly to canonical phases.
17
+ *
18
+ * The adapter preserves this distinction by tagging normalized events with
19
+ * an `origin` field ('gateway' | 'plugin') in execution metadata, and by
20
+ * mapping only plugin hooks to canonical phases. Gateway hooks are mapped
21
+ * to scope 'gateway' with supportLevel 'lossy' to signal they are not
22
+ * semantically equivalent to agent-lifecycle phases.
23
+ *
24
+ * Spec section 17.9.
25
+ */
26
+ function createAdapter() {
27
+ return {
28
+ name: 'openclaw',
29
+ family: 'in-process',
30
+ sessionIdQuality: 'derived',
31
+ supportsOrderedFanout: true,
32
+ supportsNativeAdditionalContext: false,
33
+ supportsBlock: true,
34
+ supportsAsk: false,
35
+ supportsToolInputMutation: true,
36
+ supportsToolResultMutation: false,
37
+ supportsPersistedEnv: false,
38
+ envPersistenceMode: 'runtime_hook',
39
+ toolInterceptionScope: 'all',
40
+ notes: [
41
+ 'Gateway hooks (request.received, request.routed, request.completed, auth.check) are infrastructure-level; do not treat as agent lifecycle',
42
+ 'Plugin hooks (plugin.session.start, plugin.session.end, plugin.tool.before, plugin.tool.after, plugin.turn.stop) map to canonical phases',
43
+ 'Session ID derived from plugin context or gateway request correlation ID',
44
+ 'Library-first: designed for in-process integration, not shell subprocess invocation',
45
+ ],
46
+ };
47
+ }
48
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;AAwBA,sCAqBC;AA3CD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,YAAY;QACpB,gBAAgB,EAAE,SAAS;QAC3B,qBAAqB,EAAE,IAAI;QAC3B,+BAA+B,EAAE,KAAK;QACtC,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,KAAK;QAClB,yBAAyB,EAAE,IAAI;QAC/B,0BAA0B,EAAE,KAAK;QACjC,oBAAoB,EAAE,KAAK;QAC3B,kBAAkB,EAAE,cAAc;QAClC,qBAAqB,EAAE,KAAK;QAC5B,KAAK,EAAE;YACL,2IAA2I;YAC3I,0IAA0I;YAC1I,0EAA0E;YAC1E,qFAAqF;SACtF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { createAdapter } from './adapter';
2
+ export { OPENCLAW_PHASE_MAPPINGS, OPENCLAW_PLUGIN_MAPPINGS, OPENCLAW_GATEWAY_MAPPINGS, getOpenClawPhaseMapping, getSupportedPhases, getSupportedPluginPhases, classifyHookOrigin, } from './mappings';
3
+ export { createConfiguredEngine } from './integration';
4
+ export type { OpenClawHookOrigin } from './mappings';
5
+ export { normalizeOpenClaw, parseEventData, buildExecutionContext, buildPayload, } from './normalizer';
6
+ export type { OpenClawEventBase, OpenClawPluginSessionStartPayload, OpenClawPluginToolPayload, OpenClawPluginTurnStopPayload, OpenClawGatewayPayload, } from './normalizer';
7
+ export { renderOpenClawOutput } from './renderer';
8
+ export type { OpenClawToolBeforeOutput, OpenClawToolAfterOutput, OpenClawTurnStopOutput, OpenClawSessionStartOutput, OpenClawGatewayAuthOutput, OpenClawGenericOutput, } 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,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,iBAAiB,EACjB,iCAAiC,EACjC,yBAAyB,EACzB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,GACtB,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,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSessionId = exports.renderOpenClawOutput = exports.buildPayload = exports.buildExecutionContext = exports.parseEventData = exports.normalizeOpenClaw = exports.createConfiguredEngine = exports.classifyHookOrigin = exports.getSupportedPluginPhases = exports.getSupportedPhases = exports.getOpenClawPhaseMapping = exports.OPENCLAW_GATEWAY_MAPPINGS = exports.OPENCLAW_PLUGIN_MAPPINGS = exports.OPENCLAW_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, "OPENCLAW_PHASE_MAPPINGS", { enumerable: true, get: function () { return mappings_1.OPENCLAW_PHASE_MAPPINGS; } });
8
+ Object.defineProperty(exports, "OPENCLAW_PLUGIN_MAPPINGS", { enumerable: true, get: function () { return mappings_1.OPENCLAW_PLUGIN_MAPPINGS; } });
9
+ Object.defineProperty(exports, "OPENCLAW_GATEWAY_MAPPINGS", { enumerable: true, get: function () { return mappings_1.OPENCLAW_GATEWAY_MAPPINGS; } });
10
+ Object.defineProperty(exports, "getOpenClawPhaseMapping", { enumerable: true, get: function () { return mappings_1.getOpenClawPhaseMapping; } });
11
+ Object.defineProperty(exports, "getSupportedPhases", { enumerable: true, get: function () { return mappings_1.getSupportedPhases; } });
12
+ Object.defineProperty(exports, "getSupportedPluginPhases", { enumerable: true, get: function () { return mappings_1.getSupportedPluginPhases; } });
13
+ Object.defineProperty(exports, "classifyHookOrigin", { enumerable: true, get: function () { return mappings_1.classifyHookOrigin; } });
14
+ var integration_1 = require("./integration");
15
+ Object.defineProperty(exports, "createConfiguredEngine", { enumerable: true, get: function () { return integration_1.createConfiguredEngine; } });
16
+ var normalizer_1 = require("./normalizer");
17
+ Object.defineProperty(exports, "normalizeOpenClaw", { enumerable: true, get: function () { return normalizer_1.normalizeOpenClaw; } });
18
+ Object.defineProperty(exports, "parseEventData", { enumerable: true, get: function () { return normalizer_1.parseEventData; } });
19
+ Object.defineProperty(exports, "buildExecutionContext", { enumerable: true, get: function () { return normalizer_1.buildExecutionContext; } });
20
+ Object.defineProperty(exports, "buildPayload", { enumerable: true, get: function () { return normalizer_1.buildPayload; } });
21
+ var renderer_1 = require("./renderer");
22
+ Object.defineProperty(exports, "renderOpenClawOutput", { enumerable: true, get: function () { return renderer_1.renderOpenClawOutput; } });
23
+ var session_resolver_1 = require("./session-resolver");
24
+ Object.defineProperty(exports, "resolveSessionId", { enumerable: true, get: function () { return session_resolver_1.resolveSessionId; } });
25
+ //# 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,uCAQoB;AAPlB,mHAAA,uBAAuB,OAAA;AACvB,oHAAA,wBAAwB,OAAA;AACxB,qHAAA,yBAAyB,OAAA;AACzB,mHAAA,uBAAuB,OAAA;AACvB,8GAAA,kBAAkB,OAAA;AAClB,oHAAA,wBAAwB,OAAA;AACxB,8GAAA,kBAAkB,OAAA;AAEpB,6CAAuD;AAA9C,qHAAA,sBAAsB,OAAA;AAE/B,2CAKsB;AAJpB,+GAAA,iBAAiB,OAAA;AACjB,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,0GAAA,YAAY,OAAA;AASd,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAS7B,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Programmatic engine integration for the OpenClaw adapter.
3
+ *
4
+ * Creates a pre-configured HooksEngine wired to the OpenClaw adapter's
5
+ * capabilities and phase mappings, ready for in-process hook execution.
6
+ *
7
+ * OpenClaw has a dual-layer hook system (gateway + plugin). The configured
8
+ * engine includes both mapping sets so that plugin hooks map to canonical
9
+ * phases and gateway hooks are available for observability.
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * import { createConfiguredEngine } from '@a5c-ai/hooks-mux-adapter-openclaw';
14
+ *
15
+ * const engine = createConfiguredEngine();
16
+ *
17
+ * engine.registerHandler({
18
+ * id: 'my-handler',
19
+ * pluginId: 'my-plugin',
20
+ * phase: 'tool.before',
21
+ * priority: 10,
22
+ * handler: async (event) => ({
23
+ * decision: 'allow',
24
+ * }),
25
+ * });
26
+ *
27
+ * const result = await engine.processEvent({
28
+ * nativeEventName: 'plugin.tool.before',
29
+ * payload: { toolName: 'Bash' },
30
+ * });
31
+ * ```
32
+ */
33
+ import { type HooksEngine } from '@a5c-ai/hooks-mux-core';
34
+ /**
35
+ * Create a pre-configured hooks engine for the OpenClaw adapter.
36
+ * Ready to register handlers and process events.
37
+ */
38
+ export declare function createConfiguredEngine(options?: {
39
+ sessionDir?: string;
40
+ }): HooksEngine;
41
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI7E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAOrF"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Programmatic engine integration for the OpenClaw adapter.
4
+ *
5
+ * Creates a pre-configured HooksEngine wired to the OpenClaw adapter's
6
+ * capabilities and phase mappings, ready for in-process hook execution.
7
+ *
8
+ * OpenClaw has a dual-layer hook system (gateway + plugin). The configured
9
+ * engine includes both mapping sets so that plugin hooks map to canonical
10
+ * phases and gateway hooks are available for observability.
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * import { createConfiguredEngine } from '@a5c-ai/hooks-mux-adapter-openclaw';
15
+ *
16
+ * const engine = createConfiguredEngine();
17
+ *
18
+ * engine.registerHandler({
19
+ * id: 'my-handler',
20
+ * pluginId: 'my-plugin',
21
+ * phase: 'tool.before',
22
+ * priority: 10,
23
+ * handler: async (event) => ({
24
+ * decision: 'allow',
25
+ * }),
26
+ * });
27
+ *
28
+ * const result = await engine.processEvent({
29
+ * nativeEventName: 'plugin.tool.before',
30
+ * payload: { toolName: 'Bash' },
31
+ * });
32
+ * ```
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.createConfiguredEngine = createConfiguredEngine;
36
+ const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
37
+ const adapter_1 = require("./adapter");
38
+ const mappings_1 = require("./mappings");
39
+ /**
40
+ * Create a pre-configured hooks engine for the OpenClaw adapter.
41
+ * Ready to register handlers and process events.
42
+ */
43
+ function createConfiguredEngine(options) {
44
+ return (0, hooks_mux_core_1.createHooksEngine)({
45
+ adapter: 'openclaw',
46
+ capabilities: (0, adapter_1.createAdapter)(),
47
+ phaseMappings: mappings_1.OPENCLAW_PHASE_MAPPINGS,
48
+ sessionDir: options?.sessionDir,
49
+ });
50
+ }
51
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;AAUH,wDAOC;AAfD,2DAA6E;AAC7E,uCAA0C;AAC1C,yCAAqD;AAErD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAiC;IACtE,OAAO,IAAA,kCAAiB,EAAC;QACvB,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,IAAA,uBAAa,GAAE;QAC7B,aAAa,EAAE,kCAAuB;QACtC,UAAU,EAAE,OAAO,EAAE,UAAU;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { PhaseMapping } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * OpenClaw hook origin type.
4
+ *
5
+ * Gateway hooks are infrastructure-level (request routing, auth, rate-limiting).
6
+ * Plugin hooks are agent-lifecycle (session, tool, turn).
7
+ */
8
+ export type OpenClawHookOrigin = 'gateway' | 'plugin';
9
+ /**
10
+ * OpenClaw native event to canonical phase mappings.
11
+ *
12
+ * KEY DESIGN DECISION: Gateway hooks and plugin hooks are mapped separately.
13
+ * Gateway hooks use scope 'gateway' and supportLevel 'lossy' because they
14
+ * are NOT semantically equivalent to agent-lifecycle phases. Plugin hooks
15
+ * use standard scopes and 'native' support level.
16
+ *
17
+ * Spec section 8.2 / 17.9.
18
+ */
19
+ export declare const OPENCLAW_PLUGIN_MAPPINGS: PhaseMapping[];
20
+ export declare const OPENCLAW_GATEWAY_MAPPINGS: PhaseMapping[];
21
+ /**
22
+ * All OpenClaw phase mappings (plugin + gateway).
23
+ */
24
+ export declare const OPENCLAW_PHASE_MAPPINGS: PhaseMapping[];
25
+ /**
26
+ * Determine the origin of an OpenClaw native event.
27
+ */
28
+ export declare function classifyHookOrigin(nativeEventName: string): OpenClawHookOrigin;
29
+ /**
30
+ * Look up the phase mapping for a given OpenClaw native event name.
31
+ * Searches plugin mappings first (preferred), then gateway mappings.
32
+ */
33
+ export declare function getOpenClawPhaseMapping(nativeEventName: string): PhaseMapping | undefined;
34
+ /**
35
+ * Get all canonical phases supported by plugin hooks (the true agent-lifecycle mappings).
36
+ */
37
+ export declare function getSupportedPluginPhases(): string[];
38
+ /**
39
+ * Get all canonical phases across both plugin and gateway mappings.
40
+ */
41
+ export declare function getSupportedPhases(): string[];
42
+ //# 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;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;;;;;;;GASG;AAMH,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAuDlD,CAAC;AAMF,eAAO,MAAM,yBAAyB,EAAE,YAAY,EA4CnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,YAAY,EAGjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB,CAK9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAMzF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OPENCLAW_PHASE_MAPPINGS = exports.OPENCLAW_GATEWAY_MAPPINGS = exports.OPENCLAW_PLUGIN_MAPPINGS = void 0;
4
+ exports.classifyHookOrigin = classifyHookOrigin;
5
+ exports.getOpenClawPhaseMapping = getOpenClawPhaseMapping;
6
+ exports.getSupportedPluginPhases = getSupportedPluginPhases;
7
+ exports.getSupportedPhases = getSupportedPhases;
8
+ /**
9
+ * OpenClaw native event to canonical phase mappings.
10
+ *
11
+ * KEY DESIGN DECISION: Gateway hooks and plugin hooks are mapped separately.
12
+ * Gateway hooks use scope 'gateway' and supportLevel 'lossy' because they
13
+ * are NOT semantically equivalent to agent-lifecycle phases. Plugin hooks
14
+ * use standard scopes and 'native' support level.
15
+ *
16
+ * Spec section 8.2 / 17.9.
17
+ */
18
+ // ---------------------------------------------------------------------------
19
+ // Plugin hooks — these map to canonical agent-lifecycle phases
20
+ // ---------------------------------------------------------------------------
21
+ exports.OPENCLAW_PLUGIN_MAPPINGS = [
22
+ {
23
+ canonicalPhase: 'session.start',
24
+ nativeHook: 'plugin.session.start',
25
+ supportLevel: 'native',
26
+ blockCapability: false,
27
+ mutationCapability: false,
28
+ scope: 'session',
29
+ notes: 'Fires when a plugin session begins within OpenClaw.',
30
+ },
31
+ {
32
+ canonicalPhase: 'session.end',
33
+ nativeHook: 'plugin.session.end',
34
+ supportLevel: 'native',
35
+ blockCapability: false,
36
+ mutationCapability: false,
37
+ scope: 'session',
38
+ notes: 'Observer-only; fires when a plugin session is torn down.',
39
+ },
40
+ {
41
+ canonicalPhase: 'tool.before',
42
+ nativeHook: 'plugin.tool.before',
43
+ supportLevel: 'native',
44
+ blockCapability: true,
45
+ mutationCapability: true,
46
+ scope: 'tool',
47
+ notes: 'Fires before tool execution in plugin context. Can block or mutate tool input.',
48
+ },
49
+ {
50
+ canonicalPhase: 'tool.after',
51
+ nativeHook: 'plugin.tool.after',
52
+ supportLevel: 'native',
53
+ blockCapability: false,
54
+ mutationCapability: false,
55
+ scope: 'tool',
56
+ notes: 'Observer-only post-tool hook in plugin context.',
57
+ },
58
+ {
59
+ canonicalPhase: 'turn.stop',
60
+ nativeHook: 'plugin.turn.stop',
61
+ supportLevel: 'native',
62
+ blockCapability: true,
63
+ mutationCapability: false,
64
+ scope: 'turn',
65
+ notes: 'Fires when plugin turn completes. Can continue or stop.',
66
+ },
67
+ {
68
+ canonicalPhase: 'turn.user_prompt_submitted',
69
+ nativeHook: 'plugin.prompt.submitted',
70
+ supportLevel: 'native',
71
+ blockCapability: false,
72
+ mutationCapability: false,
73
+ scope: 'turn',
74
+ notes: 'Fires when user submits a prompt through the plugin.',
75
+ },
76
+ ];
77
+ // ---------------------------------------------------------------------------
78
+ // Gateway hooks — infrastructure-level, NOT agent-lifecycle equivalents
79
+ // ---------------------------------------------------------------------------
80
+ exports.OPENCLAW_GATEWAY_MAPPINGS = [
81
+ {
82
+ canonicalPhase: 'session.start',
83
+ nativeHook: 'gateway.request.received',
84
+ supportLevel: 'lossy',
85
+ blockCapability: false,
86
+ mutationCapability: false,
87
+ scope: 'gateway',
88
+ notes: 'Gateway request receipt is NOT equivalent to session.start. ' +
89
+ 'Mapped with lossy fidelity for observability only.',
90
+ },
91
+ {
92
+ canonicalPhase: 'session.start',
93
+ nativeHook: 'gateway.request.routed',
94
+ supportLevel: 'lossy',
95
+ blockCapability: false,
96
+ mutationCapability: false,
97
+ scope: 'gateway',
98
+ notes: 'Gateway routing decision. Infrastructure-level, not an agent session start.',
99
+ },
100
+ {
101
+ canonicalPhase: 'session.end',
102
+ nativeHook: 'gateway.request.completed',
103
+ supportLevel: 'lossy',
104
+ blockCapability: false,
105
+ mutationCapability: false,
106
+ scope: 'gateway',
107
+ notes: 'Gateway request completion is NOT equivalent to session.end. ' +
108
+ 'Mapped with lossy fidelity for observability only.',
109
+ },
110
+ {
111
+ canonicalPhase: 'tool.permission_request',
112
+ nativeHook: 'gateway.auth.check',
113
+ supportLevel: 'lossy',
114
+ blockCapability: true,
115
+ mutationCapability: false,
116
+ scope: 'gateway',
117
+ notes: 'Gateway auth check loosely maps to tool permission but is infrastructure-level. ' +
118
+ 'Do not treat as an agent-level permission gate.',
119
+ },
120
+ ];
121
+ /**
122
+ * All OpenClaw phase mappings (plugin + gateway).
123
+ */
124
+ exports.OPENCLAW_PHASE_MAPPINGS = [
125
+ ...exports.OPENCLAW_PLUGIN_MAPPINGS,
126
+ ...exports.OPENCLAW_GATEWAY_MAPPINGS,
127
+ ];
128
+ /**
129
+ * Determine the origin of an OpenClaw native event.
130
+ */
131
+ function classifyHookOrigin(nativeEventName) {
132
+ if (nativeEventName.startsWith('gateway.')) {
133
+ return 'gateway';
134
+ }
135
+ return 'plugin';
136
+ }
137
+ /**
138
+ * Look up the phase mapping for a given OpenClaw native event name.
139
+ * Searches plugin mappings first (preferred), then gateway mappings.
140
+ */
141
+ function getOpenClawPhaseMapping(nativeEventName) {
142
+ // Plugin mappings take priority
143
+ const pluginMatch = exports.OPENCLAW_PLUGIN_MAPPINGS.find((m) => m.nativeHook === nativeEventName);
144
+ if (pluginMatch)
145
+ return pluginMatch;
146
+ return exports.OPENCLAW_GATEWAY_MAPPINGS.find((m) => m.nativeHook === nativeEventName);
147
+ }
148
+ /**
149
+ * Get all canonical phases supported by plugin hooks (the true agent-lifecycle mappings).
150
+ */
151
+ function getSupportedPluginPhases() {
152
+ return exports.OPENCLAW_PLUGIN_MAPPINGS.map((m) => m.canonicalPhase);
153
+ }
154
+ /**
155
+ * Get all canonical phases across both plugin and gateway mappings.
156
+ */
157
+ function getSupportedPhases() {
158
+ return exports.OPENCLAW_PHASE_MAPPINGS.map((m) => m.canonicalPhase);
159
+ }
160
+ //# sourceMappingURL=mappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.js","sourceRoot":"","sources":["../src/mappings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { UnifiedHookEvent, UnifiedExecutionContext } from '@a5c-ai/hooks-mux-core';
2
+ import type { OpenClawHookOrigin } from './mappings';
3
+ /**
4
+ * OpenClaw in-process hook payload shapes.
5
+ *
6
+ * OpenClaw passes hook data as in-process objects (not stdin JSON),
7
+ * with fields varying by origin (gateway vs plugin) and event type.
8
+ */
9
+ /** Common fields present across OpenClaw hook events. */
10
+ export interface OpenClawEventBase {
11
+ /** Correlation ID from the gateway or plugin session. */
12
+ correlationId?: string;
13
+ /** Plugin-level session identifier. */
14
+ sessionId?: string;
15
+ /** Working directory or workspace path. */
16
+ workspace?: string;
17
+ /** Model identifier, if available. */
18
+ model?: string;
19
+ /** Timestamp of the event. */
20
+ timestamp?: string;
21
+ [key: string]: unknown;
22
+ }
23
+ /** Plugin session start payload. */
24
+ export interface OpenClawPluginSessionStartPayload extends OpenClawEventBase {
25
+ source?: string;
26
+ initialPrompt?: string;
27
+ pluginId?: string;
28
+ }
29
+ /** Plugin tool before/after payload. */
30
+ export interface OpenClawPluginToolPayload extends OpenClawEventBase {
31
+ toolName?: string;
32
+ toolCallId?: string;
33
+ toolInput?: unknown;
34
+ toolResponse?: unknown;
35
+ pluginId?: string;
36
+ }
37
+ /** Plugin turn stop payload. */
38
+ export interface OpenClawPluginTurnStopPayload extends OpenClawEventBase {
39
+ reason?: string;
40
+ lastMessage?: string;
41
+ pluginId?: string;
42
+ }
43
+ /** Gateway request payload. */
44
+ export interface OpenClawGatewayPayload extends OpenClawEventBase {
45
+ requestId?: string;
46
+ route?: string;
47
+ method?: string;
48
+ statusCode?: number;
49
+ authResult?: string;
50
+ }
51
+ /**
52
+ * Parse raw event input into a structured object.
53
+ * OpenClaw is in-process so payloads are typically already objects,
54
+ * but we handle string input for robustness.
55
+ */
56
+ export declare function parseEventData(raw: unknown): Record<string, unknown>;
57
+ /**
58
+ * Build a UnifiedExecutionContext from an OpenClaw event payload.
59
+ */
60
+ export declare function buildExecutionContext(eventData: Record<string, unknown>, nativeEventName: string, origin: OpenClawHookOrigin, env: Record<string, string>): UnifiedExecutionContext;
61
+ /**
62
+ * Build the payload portion of the unified event from OpenClaw event data.
63
+ * Extracts event-specific fields into the normalized payload.
64
+ */
65
+ export declare function buildPayload(nativeEventName: string, eventData: Record<string, unknown>): Record<string, unknown>;
66
+ /**
67
+ * Normalize an OpenClaw hook invocation into a UnifiedHookEvent.
68
+ *
69
+ * Tags each event with its origin (gateway vs plugin) in execution metadata
70
+ * so downstream consumers can distinguish infrastructure-level hooks from
71
+ * agent-lifecycle hooks.
72
+ *
73
+ * @param nativeEventName - The OpenClaw event name (e.g. 'plugin.tool.before', 'gateway.request.received').
74
+ * @param rawData - Raw event data (object or string).
75
+ * @param env - Environment variables at invocation time.
76
+ */
77
+ export declare function normalizeOpenClaw(nativeEventName: string, rawData: unknown, env?: Record<string, string>): UnifiedHookEvent;
78
+ //# 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;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AAEH,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,oCAAoC;AACpC,MAAM,WAAW,iCAAkC,SAAQ,iBAAiB;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,6BAA8B,SAAQ,iBAAiB;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,uBAAuB,CA0CzB;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,CA0EzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC/B,gBAAgB,CAoClB"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseEventData = parseEventData;
4
+ exports.buildExecutionContext = buildExecutionContext;
5
+ exports.buildPayload = buildPayload;
6
+ exports.normalizeOpenClaw = normalizeOpenClaw;
7
+ const mappings_1 = require("./mappings");
8
+ /**
9
+ * Parse raw event input into a structured object.
10
+ * OpenClaw is in-process so payloads are typically already objects,
11
+ * but we handle string input for robustness.
12
+ */
13
+ function parseEventData(raw) {
14
+ if (raw == null) {
15
+ return {};
16
+ }
17
+ if (typeof raw === 'string') {
18
+ try {
19
+ const parsed = JSON.parse(raw);
20
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
21
+ return parsed;
22
+ }
23
+ return { raw: parsed };
24
+ }
25
+ catch {
26
+ return { raw };
27
+ }
28
+ }
29
+ if (typeof raw === 'object' && !Array.isArray(raw)) {
30
+ return raw;
31
+ }
32
+ return { raw };
33
+ }
34
+ /**
35
+ * Build a UnifiedExecutionContext from an OpenClaw event payload.
36
+ */
37
+ function buildExecutionContext(eventData, nativeEventName, origin, env) {
38
+ const persistedEnv = {};
39
+ const contextVars = {};
40
+ for (const [key, value] of Object.entries(env)) {
41
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
42
+ persistedEnv[key] = value;
43
+ }
44
+ }
45
+ // Session ID: prefer plugin sessionId, fall back to gateway correlationId
46
+ const sessionId = eventData.sessionId ??
47
+ env['AGENT_SESSION_ID'] ??
48
+ eventData.correlationId ??
49
+ null;
50
+ return {
51
+ sessionId,
52
+ turnId: env['HOOKS_PROXY_TURN_ID'] ?? null,
53
+ conversationId: env['HOOKS_PROXY_CONVERSATION_ID'] ?? null,
54
+ adapter: 'openclaw',
55
+ cwd: eventData.workspace ?? env['PWD'] ?? null,
56
+ worktree: env['HOOKS_PROXY_WORKTREE'] ?? null,
57
+ transcriptPath: null,
58
+ source: eventData.source ?? null,
59
+ model: eventData.model ?? env['HOOKS_PROXY_MODEL'] ?? null,
60
+ agentType: null,
61
+ permissionMode: null,
62
+ toolName: eventData.toolName ?? null,
63
+ toolCallId: eventData.toolCallId ?? null,
64
+ nativeEventName,
65
+ rawEventScope: origin,
66
+ persistedEnv,
67
+ contextVars,
68
+ metadata: {
69
+ origin,
70
+ ...(eventData.pluginId != null ? { pluginId: eventData.pluginId } : {}),
71
+ ...(eventData.correlationId != null ? { correlationId: eventData.correlationId } : {}),
72
+ ...(eventData.requestId != null ? { requestId: eventData.requestId } : {}),
73
+ },
74
+ };
75
+ }
76
+ /**
77
+ * Build the payload portion of the unified event from OpenClaw event data.
78
+ * Extracts event-specific fields into the normalized payload.
79
+ */
80
+ function buildPayload(nativeEventName, eventData) {
81
+ const payload = {};
82
+ switch (nativeEventName) {
83
+ // --- Plugin hooks ---
84
+ case 'plugin.session.start':
85
+ if (eventData.source != null)
86
+ payload.source = eventData.source;
87
+ if (eventData.initialPrompt != null)
88
+ payload.initialPrompt = eventData.initialPrompt;
89
+ if (eventData.pluginId != null)
90
+ payload.pluginId = eventData.pluginId;
91
+ break;
92
+ case 'plugin.session.end':
93
+ if (eventData.pluginId != null)
94
+ payload.pluginId = eventData.pluginId;
95
+ break;
96
+ case 'plugin.tool.before':
97
+ if (eventData.toolName != null)
98
+ payload.toolName = eventData.toolName;
99
+ if (eventData.toolCallId != null)
100
+ payload.toolCallId = eventData.toolCallId;
101
+ if (eventData.toolInput != null)
102
+ payload.toolInput = eventData.toolInput;
103
+ if (eventData.pluginId != null)
104
+ payload.pluginId = eventData.pluginId;
105
+ break;
106
+ case 'plugin.tool.after':
107
+ if (eventData.toolName != null)
108
+ payload.toolName = eventData.toolName;
109
+ if (eventData.toolCallId != null)
110
+ payload.toolCallId = eventData.toolCallId;
111
+ if (eventData.toolInput != null)
112
+ payload.toolInput = eventData.toolInput;
113
+ if (eventData.toolResponse != null)
114
+ payload.toolResponse = eventData.toolResponse;
115
+ if (eventData.pluginId != null)
116
+ payload.pluginId = eventData.pluginId;
117
+ break;
118
+ case 'plugin.turn.stop':
119
+ if (eventData.reason != null)
120
+ payload.reason = eventData.reason;
121
+ if (eventData.lastMessage != null)
122
+ payload.lastMessage = eventData.lastMessage;
123
+ if (eventData.pluginId != null)
124
+ payload.pluginId = eventData.pluginId;
125
+ break;
126
+ case 'plugin.prompt.submitted':
127
+ if (eventData.prompt != null)
128
+ payload.prompt = eventData.prompt;
129
+ if (eventData.pluginId != null)
130
+ payload.pluginId = eventData.pluginId;
131
+ break;
132
+ // --- Gateway hooks ---
133
+ case 'gateway.request.received':
134
+ if (eventData.requestId != null)
135
+ payload.requestId = eventData.requestId;
136
+ if (eventData.route != null)
137
+ payload.route = eventData.route;
138
+ if (eventData.method != null)
139
+ payload.method = eventData.method;
140
+ break;
141
+ case 'gateway.request.routed':
142
+ if (eventData.requestId != null)
143
+ payload.requestId = eventData.requestId;
144
+ if (eventData.route != null)
145
+ payload.route = eventData.route;
146
+ break;
147
+ case 'gateway.request.completed':
148
+ if (eventData.requestId != null)
149
+ payload.requestId = eventData.requestId;
150
+ if (eventData.statusCode != null)
151
+ payload.statusCode = eventData.statusCode;
152
+ break;
153
+ case 'gateway.auth.check':
154
+ if (eventData.requestId != null)
155
+ payload.requestId = eventData.requestId;
156
+ if (eventData.authResult != null)
157
+ payload.authResult = eventData.authResult;
158
+ break;
159
+ default:
160
+ // Unknown event: pass through all non-common fields
161
+ for (const [key, value] of Object.entries(eventData)) {
162
+ if (!['correlationId', 'sessionId', 'workspace', 'model', 'timestamp'].includes(key)) {
163
+ payload[key] = value;
164
+ }
165
+ }
166
+ break;
167
+ }
168
+ return payload;
169
+ }
170
+ /**
171
+ * Normalize an OpenClaw hook invocation into a UnifiedHookEvent.
172
+ *
173
+ * Tags each event with its origin (gateway vs plugin) in execution metadata
174
+ * so downstream consumers can distinguish infrastructure-level hooks from
175
+ * agent-lifecycle hooks.
176
+ *
177
+ * @param nativeEventName - The OpenClaw event name (e.g. 'plugin.tool.before', 'gateway.request.received').
178
+ * @param rawData - Raw event data (object or string).
179
+ * @param env - Environment variables at invocation time.
180
+ */
181
+ function normalizeOpenClaw(nativeEventName, rawData, env = {}) {
182
+ const eventData = parseEventData(rawData);
183
+ const origin = (0, mappings_1.classifyHookOrigin)(nativeEventName);
184
+ const mapping = (0, mappings_1.getOpenClawPhaseMapping)(nativeEventName);
185
+ const phase = mapping?.canonicalPhase ?? 'unknown';
186
+ const supportLevel = mapping?.supportLevel ?? 'unsupported';
187
+ const execution = buildExecutionContext(eventData, nativeEventName, origin, env);
188
+ const payload = buildPayload(nativeEventName, eventData);
189
+ // Split env into input and persisted buckets
190
+ const inputEnv = {};
191
+ const persistedEnv = {};
192
+ for (const [key, value] of Object.entries(env)) {
193
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
194
+ persistedEnv[key] = value;
195
+ }
196
+ else if (key.startsWith('HOOKS_PROXY_')) {
197
+ inputEnv[key] = value;
198
+ }
199
+ }
200
+ return {
201
+ version: 'a5c.hooks.v1',
202
+ adapter: 'openclaw',
203
+ phase,
204
+ rawEventName: nativeEventName,
205
+ supportLevel,
206
+ execution,
207
+ payload,
208
+ env: {
209
+ input: inputEnv,
210
+ persisted: persistedEnv,
211
+ },
212
+ raw: rawData,
213
+ };
214
+ }
215
+ //# 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,45 @@
1
+ import type { UnifiedHookResult } from '@a5c-ai/hooks-mux-core';
2
+ /**
3
+ * OpenClaw native hook output formats.
4
+ *
5
+ * OpenClaw is in-process, so results are returned as structured objects
6
+ * rather than stdout JSON. The shape varies by event origin and type.
7
+ */
8
+ /** Plugin tool.before output: permission/mutation decision. */
9
+ export interface OpenClawToolBeforeOutput {
10
+ decision?: 'allow' | 'deny';
11
+ reason?: string;
12
+ toolInput?: unknown;
13
+ }
14
+ /** Plugin tool.after output. */
15
+ export interface OpenClawToolAfterOutput {
16
+ metadata?: Record<string, unknown>;
17
+ }
18
+ /** Plugin turn.stop output. */
19
+ export interface OpenClawTurnStopOutput {
20
+ continueSession?: boolean;
21
+ reason?: string;
22
+ followUpMessage?: string;
23
+ }
24
+ /** Plugin session.start output. */
25
+ export interface OpenClawSessionStartOutput {
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ /** Gateway auth output. */
29
+ export interface OpenClawGatewayAuthOutput {
30
+ allowed?: boolean;
31
+ reason?: string;
32
+ }
33
+ /** Generic output for unrecognized events. */
34
+ export interface OpenClawGenericOutput {
35
+ [key: string]: unknown;
36
+ }
37
+ /**
38
+ * Render a UnifiedHookResult back to OpenClaw's native output format.
39
+ *
40
+ * @param result - The unified hook result from handler execution.
41
+ * @param nativeEventName - The original OpenClaw event name.
42
+ * @returns The native output object.
43
+ */
44
+ export declare function renderOpenClawOutput(result: UnifiedHookResult, nativeEventName: string): Record<string, unknown>;
45
+ //# 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,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;;GAKG;AAEH,+DAA+D;AAC/D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,gCAAgC;AAChC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,+BAA+B;AAC/B,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,mCAAmC;AACnC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,2BAA2B;AAC3B,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,MAAM,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderOpenClawOutput = renderOpenClawOutput;
4
+ /**
5
+ * Render a UnifiedHookResult back to OpenClaw's native output format.
6
+ *
7
+ * @param result - The unified hook result from handler execution.
8
+ * @param nativeEventName - The original OpenClaw event name.
9
+ * @returns The native output object.
10
+ */
11
+ function renderOpenClawOutput(result, nativeEventName) {
12
+ switch (nativeEventName) {
13
+ case 'plugin.tool.before':
14
+ return renderToolBeforeOutput(result);
15
+ case 'plugin.tool.after':
16
+ return renderToolAfterOutput(result);
17
+ case 'plugin.turn.stop':
18
+ return renderTurnStopOutput(result);
19
+ case 'plugin.session.start':
20
+ return renderSessionStartOutput(result);
21
+ case 'gateway.auth.check':
22
+ return renderGatewayAuthOutput(result);
23
+ default:
24
+ return renderGenericOutput(result);
25
+ }
26
+ }
27
+ function renderToolBeforeOutput(result) {
28
+ const output = {};
29
+ if (result.decision === 'allow') {
30
+ output['decision'] = 'allow';
31
+ }
32
+ else if (result.decision === 'deny') {
33
+ output['decision'] = 'deny';
34
+ }
35
+ // 'continue', 'noop', 'ask' → no decision field (OpenClaw defaults to allow)
36
+ if (result.reason != null) {
37
+ output['reason'] = result.reason;
38
+ }
39
+ // OpenClaw supports tool input mutation
40
+ if (result.toolMutation != null) {
41
+ output['toolInput'] = result.toolMutation.value;
42
+ }
43
+ return output;
44
+ }
45
+ function renderToolAfterOutput(result) {
46
+ const output = {};
47
+ if (result.metadata != null) {
48
+ output['metadata'] = result.metadata;
49
+ }
50
+ return output;
51
+ }
52
+ function renderTurnStopOutput(result) {
53
+ const output = {};
54
+ if (result.continueSession != null) {
55
+ output['continueSession'] = result.continueSession;
56
+ }
57
+ if (result.stopReason != null) {
58
+ output['reason'] = result.stopReason;
59
+ }
60
+ else if (result.reason != null) {
61
+ output['reason'] = result.reason;
62
+ }
63
+ if (result.followUpMessage != null) {
64
+ output['followUpMessage'] = result.followUpMessage;
65
+ }
66
+ return output;
67
+ }
68
+ function renderSessionStartOutput(result) {
69
+ const output = {};
70
+ if (result.metadata != null) {
71
+ output['metadata'] = result.metadata;
72
+ }
73
+ return output;
74
+ }
75
+ function renderGatewayAuthOutput(result) {
76
+ const output = {};
77
+ if (result.decision === 'allow') {
78
+ output['allowed'] = true;
79
+ }
80
+ else if (result.decision === 'deny') {
81
+ output['allowed'] = false;
82
+ }
83
+ if (result.reason != null) {
84
+ output['reason'] = result.reason;
85
+ }
86
+ return output;
87
+ }
88
+ function renderGenericOutput(result) {
89
+ const output = {};
90
+ if (result.metadata != null) {
91
+ output['metadata'] = result.metadata;
92
+ }
93
+ return output;
94
+ }
95
+ //# 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,30 @@
1
+ /**
2
+ * Session ID resolution for OpenClaw.
3
+ *
4
+ * OpenClaw provides session IDs through two channels:
5
+ * - Plugin hooks: sessionId field in event data
6
+ * - Gateway hooks: correlationId field (NOT a true session ID)
7
+ *
8
+ * Resolution quality is 'derived' because the session ID comes from
9
+ * plugin context rather than a native harness session mechanism.
10
+ *
11
+ * Resolution precedence (spec section 9.2):
12
+ * 1. Explicit CLI flag --session-id
13
+ * 2. Explicit env AGENT_SESSION_ID
14
+ * 3. Plugin sessionId from event data
15
+ * 4. Gateway correlationId as fallback (tagged as 'derived')
16
+ * 5. null
17
+ */
18
+ export interface SessionResolutionResult {
19
+ sessionId: string | null;
20
+ source: 'explicit_flag' | 'explicit_env' | 'plugin' | 'gateway_correlation' | 'none';
21
+ }
22
+ /**
23
+ * Resolve the session ID for an OpenClaw hook invocation.
24
+ *
25
+ * @param eventData - Parsed event data from OpenClaw.
26
+ * @param env - Environment variables at invocation time.
27
+ * @param explicitSessionId - Session ID from explicit CLI flag, if any.
28
+ */
29
+ export declare function resolveSessionId(eventData: Record<string, unknown>, env?: Record<string, string>, explicitSessionId?: string): SessionResolutionResult;
30
+ //# 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;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,QAAQ,GAAG,qBAAqB,GAAG,MAAM,CAAC;CACtF;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,CA0BzB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Session ID resolution for OpenClaw.
4
+ *
5
+ * OpenClaw provides session IDs through two channels:
6
+ * - Plugin hooks: sessionId field in event data
7
+ * - Gateway hooks: correlationId field (NOT a true session ID)
8
+ *
9
+ * Resolution quality is 'derived' because the session ID comes from
10
+ * plugin context rather than a native harness session mechanism.
11
+ *
12
+ * Resolution precedence (spec section 9.2):
13
+ * 1. Explicit CLI flag --session-id
14
+ * 2. Explicit env AGENT_SESSION_ID
15
+ * 3. Plugin sessionId from event data
16
+ * 4. Gateway correlationId as fallback (tagged as 'derived')
17
+ * 5. null
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.resolveSessionId = resolveSessionId;
21
+ /**
22
+ * Resolve the session ID for an OpenClaw hook invocation.
23
+ *
24
+ * @param eventData - Parsed event data from OpenClaw.
25
+ * @param env - Environment variables at invocation time.
26
+ * @param explicitSessionId - Session ID from explicit CLI flag, if any.
27
+ */
28
+ function resolveSessionId(eventData, env = {}, explicitSessionId) {
29
+ // 1. Explicit CLI flag
30
+ if (explicitSessionId) {
31
+ return { sessionId: explicitSessionId, source: 'explicit_flag' };
32
+ }
33
+ // 2. Explicit env
34
+ const envSessionId = env['AGENT_SESSION_ID'];
35
+ if (envSessionId) {
36
+ return { sessionId: envSessionId, source: 'explicit_env' };
37
+ }
38
+ // 3. Plugin sessionId
39
+ const pluginSessionId = eventData.sessionId;
40
+ if (typeof pluginSessionId === 'string' && pluginSessionId.length > 0) {
41
+ return { sessionId: pluginSessionId, source: 'plugin' };
42
+ }
43
+ // 4. Gateway correlationId as fallback
44
+ const correlationId = eventData.correlationId;
45
+ if (typeof correlationId === 'string' && correlationId.length > 0) {
46
+ return { sessionId: correlationId, source: 'gateway_correlation' };
47
+ }
48
+ // 5. No session ID available
49
+ return { sessionId: null, source: 'none' };
50
+ }
51
+ //# sourceMappingURL=session-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-resolver.js","sourceRoot":"","sources":["../src/session-resolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAcH,4CA8BC;AArCD;;;;;;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,sBAAsB;IACtB,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC;IAC5C,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,uCAAuC;IACvC,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;IAC9C,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACrE,CAAC;IAED,6BAA6B;IAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@a5c-ai/hooks-mux-adapter-openclaw",
3
+ "version": "5.0.1-staging.37ca18bd",
4
+ "description": "OpenClaw harness adapter for the hooks-mux system",
5
+ "license": "UNLICENSED",
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": "https://github.com/a5c-ai/babysitter.git",
15
+ "directory": "packages/hooks-mux/adapter-openclaw"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "clean": "rimraf dist",
23
+ "lint": "eslint \"src/**/*.ts\" --max-warnings=0",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest"
26
+ },
27
+ "dependencies": {
28
+ "@a5c-ai/hooks-mux-core": "5.0.1-staging.37ca18bd"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.7.0",
32
+ "vitest": "^3.0.0",
33
+ "rimraf": "^6.0.0"
34
+ }
35
+ }