@a5c-ai/hooks-adapter-openclaw 5.1.1-staging.52898ebfc24f

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-adapter-openclaw
2
+
3
+ OpenClaw harness adapter for hooks-adapter.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @a5c-ai/hooks-adapter-openclaw @a5c-ai/hooks-adapter-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
+ createConfiguredEngine,
19
+ normalizeOpenClaw,
20
+ } from "@a5c-ai/hooks-adapter-openclaw";
21
+ ```
22
+
23
+ The package exposes OpenClaw-specific normalization, phase mappings, gateway/plugin helpers, session utilities, and an in-process configured engine for hooks-adapter integrations.
24
+
25
+ See [`packages/adapters/hooks/README.md`](../README.md) for the workspace overview and `packages/adapters/hooks/docs/adapter-integration-guide.md` for end-to-end integration guidance.
26
+
27
+ ## License
28
+
29
+ MIT © a5c-ai
@@ -0,0 +1,3 @@
1
+ import type { AdapterCapabilities } from '@a5c-ai/hooks-adapter-core';
2
+ export declare function createAdapter(name?: string): AdapterCapabilities;
3
+ //# 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,4BAA4B,CAAC;AAiBtE,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAA6B,GAAG,mBAAmB,CAsBtF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAdapter = createAdapter;
4
+ const catalog_1 = require("@a5c-ai/atlas/catalog");
5
+ /**
6
+ * Creates the OpenClaw adapter capability descriptor.
7
+ *
8
+ * Reads capability data from the Atlas graph via the agent-catalog.
9
+ * Falls back to hardcoded defaults if the catalog is unavailable.
10
+ *
11
+ * OpenClaw exposes two distinct hook layers:
12
+ * 1. Gateway hooks — infrastructure-level (request routing, auth, rate-limiting)
13
+ * 2. Plugin hooks — agent-lifecycle (session, tool, turn)
14
+ *
15
+ * Spec section 17.9.
16
+ */
17
+ const DEFAULT_ADAPTER_NAME = 'openclaw';
18
+ function createAdapter(name = DEFAULT_ADAPTER_NAME) {
19
+ const target = (0, catalog_1.getPluginTargetDescriptor)(name);
20
+ return {
21
+ name,
22
+ family: target?.hooksMuxFamily ?? 'in-process',
23
+ sessionIdQuality: target?.sessionIdQuality ?? 'derived',
24
+ supportsOrderedFanout: target?.supportsOrderedFanout ?? true,
25
+ supportsNativeAdditionalContext: target?.supportsNativeAdditionalContext ?? false,
26
+ supportsBlock: target?.supportsBlock ?? true,
27
+ supportsAsk: target?.supportsAsk ?? false,
28
+ supportsToolInputMutation: target?.supportsToolInputMutation ?? true,
29
+ supportsToolResultMutation: target?.supportsToolResultMutation ?? false,
30
+ supportsPersistedEnv: target?.supportsPersistedEnv ?? false,
31
+ envPersistenceMode: target?.envPersistenceMode ?? 'runtime_hook',
32
+ toolInterceptionScope: target?.toolInterceptionScope ?? 'all',
33
+ notes: [
34
+ 'Gateway hooks (request.received, request.routed, request.completed, auth.check) are infrastructure-level; do not treat as agent lifecycle',
35
+ 'Plugin hooks (plugin.session.start, plugin.session.end, plugin.tool.before, plugin.tool.after, plugin.turn.stop) map to canonical phases',
36
+ 'Session ID derived from plugin context or gateway request correlation ID',
37
+ 'Library-first: designed for in-process integration, not shell subprocess invocation',
38
+ ],
39
+ };
40
+ }
41
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;AAiBA,sCAsBC;AAtCD,mDAAkE;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAExC,SAAgB,aAAa,CAAC,OAAe,oBAAoB;IAC/D,MAAM,MAAM,GAAG,IAAA,mCAAyB,EAAC,IAAI,CAAC,CAAC;IAC/C,OAAO;QACL,IAAI;QACJ,MAAM,EAAG,MAAM,EAAE,cAAgD,IAAI,YAAY;QACjF,gBAAgB,EAAG,MAAM,EAAE,gBAA4D,IAAI,SAAS;QACpG,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,IAAI,IAAI;QAC5D,+BAA+B,EAAE,MAAM,EAAE,+BAA+B,IAAI,KAAK;QACjF,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,IAAI;QAC5C,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,KAAK;QACzC,yBAAyB,EAAE,MAAM,EAAE,yBAAyB,IAAI,IAAI;QACpE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,IAAI,KAAK;QACvE,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,IAAI,KAAK;QAC3D,kBAAkB,EAAG,MAAM,EAAE,kBAAgE,IAAI,cAAc;QAC/G,qBAAqB,EAAG,MAAM,EAAE,qBAAsE,IAAI,KAAK;QAC/G,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, setAdapterName, } 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,EACZ,cAAc,GACf,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,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSessionId = exports.renderOpenClawOutput = exports.setAdapterName = 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
+ Object.defineProperty(exports, "setAdapterName", { enumerable: true, get: function () { return normalizer_1.setAdapterName; } });
22
+ var renderer_1 = require("./renderer");
23
+ Object.defineProperty(exports, "renderOpenClawOutput", { enumerable: true, get: function () { return renderer_1.renderOpenClawOutput; } });
24
+ var session_resolver_1 = require("./session-resolver");
25
+ Object.defineProperty(exports, "resolveSessionId", { enumerable: true, get: function () { return session_resolver_1.resolveSessionId; } });
26
+ //# 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,2CAMsB;AALpB,+GAAA,iBAAiB,OAAA;AACjB,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,0GAAA,YAAY,OAAA;AACZ,4GAAA,cAAc,OAAA;AAShB,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAS7B,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,42 @@
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-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-adapter-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
+ adapterName: string;
41
+ }): HooksEngine;
42
+ //# 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,4BAA4B,CAAC;AAIjF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAQzG"}
@@ -0,0 +1,52 @@
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-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_adapter_core_1 = require("@a5c-ai/hooks-adapter-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
+ const name = options.adapterName;
45
+ return (0, hooks_adapter_core_1.createHooksEngine)({
46
+ adapter: name,
47
+ capabilities: (0, adapter_1.createAdapter)(name),
48
+ phaseMappings: mappings_1.OPENCLAW_PHASE_MAPPINGS,
49
+ sessionDir: options?.sessionDir,
50
+ });
51
+ }
52
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;AAUH,wDAQC;AAhBD,mEAAiF;AACjF,uCAA0C;AAC1C,yCAAqD;AAErD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAqD;IAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IACjC,OAAO,IAAA,sCAAiB,EAAC;QACvB,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,IAAA,uBAAa,EAAC,IAAI,CAAC;QACjC,aAAa,EAAE,kCAAuB;QACtC,UAAU,EAAE,OAAO,EAAE,UAAU;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { PhaseMapping } from '@a5c-ai/hooks-adapter-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
+ export declare const OPENCLAW_PLUGIN_MAPPINGS: PhaseMapping[];
10
+ export declare const OPENCLAW_GATEWAY_MAPPINGS: PhaseMapping[];
11
+ /**
12
+ * All OpenClaw phase mappings (plugin + gateway).
13
+ */
14
+ export declare const OPENCLAW_PHASE_MAPPINGS: PhaseMapping[];
15
+ /**
16
+ * Determine the origin of an OpenClaw native event.
17
+ */
18
+ export declare function classifyHookOrigin(nativeEventName: string): OpenClawHookOrigin;
19
+ /**
20
+ * Look up the phase mapping for a given OpenClaw native event name.
21
+ * Searches plugin mappings first (preferred), then gateway mappings.
22
+ */
23
+ export declare function getOpenClawPhaseMapping(nativeEventName: string): PhaseMapping | undefined;
24
+ /**
25
+ * Get all canonical phases supported by plugin hooks (the true agent-lifecycle mappings).
26
+ */
27
+ export declare function getSupportedPluginPhases(): string[];
28
+ /**
29
+ * Get all canonical phases across both plugin and gateway mappings.
30
+ */
31
+ export declare function getSupportedPhases(): string[];
32
+ //# 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,4BAA4B,CAAC;AAI/D;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AA6DtD,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAA2B,CAAC;AAC/E,eAAO,MAAM,yBAAyB,EAAE,YAAY,EAA4B,CAAC;AAEjF;;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,106 @@
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
+ const catalog_1 = require("@a5c-ai/atlas/catalog");
9
+ /**
10
+ * OpenClaw native event to canonical phase mappings.
11
+ *
12
+ * Phase mappings are built from the Atlas graph HookMapping records
13
+ * via the agent-catalog. Falls back to hardcoded defaults if the
14
+ * catalog is unavailable.
15
+ *
16
+ * KEY DESIGN DECISION: Gateway hooks and plugin hooks are mapped separately.
17
+ * Gateway hooks use scope 'gateway' and supportLevel 'lossy' because they
18
+ * are NOT semantically equivalent to agent-lifecycle phases.
19
+ *
20
+ * Spec section 8.2 / 17.9.
21
+ */
22
+ const SUPPORT_LEVEL_MAP = {
23
+ supported: 'native',
24
+ native: 'native',
25
+ lossy: 'lossy',
26
+ emulated: 'emulated',
27
+ unsupported: 'unsupported',
28
+ };
29
+ function hookMappingToPhaseMapping(mapping) {
30
+ if (!mapping.canonicalPhase)
31
+ return null;
32
+ return {
33
+ canonicalPhase: mapping.canonicalPhase,
34
+ nativeHook: mapping.nativeName,
35
+ supportLevel: SUPPORT_LEVEL_MAP[mapping.supportLevel] ?? (mapping.scope === 'gateway' ? 'lossy' : 'native'),
36
+ blockCapability: mapping.blockCapability ?? false,
37
+ mutationCapability: mapping.mutationCapability ?? false,
38
+ scope: (mapping.scope ?? 'session'),
39
+ };
40
+ }
41
+ function buildFromCatalog() {
42
+ const mappings = (0, catalog_1.listHookMappingsByAdapterFamily)('openclaw');
43
+ if (mappings.length === 0) {
44
+ throw new Error('hooks-adapter adapter-openclaw: catalog unavailable or returned no mappings for family "openclaw"');
45
+ }
46
+ const phaseMappings = mappings
47
+ .map(hookMappingToPhaseMapping)
48
+ .filter((m) => m !== null);
49
+ // Split into plugin and gateway
50
+ const plugin = phaseMappings.filter((m) => m.scope !== 'gateway');
51
+ const gateway = phaseMappings.filter((m) => m.scope === 'gateway');
52
+ // Deduplicate by nativeHook within each group
53
+ const dedup = (arr) => {
54
+ const seen = new Set();
55
+ return arr.filter((m) => {
56
+ if (seen.has(m.nativeHook))
57
+ return false;
58
+ seen.add(m.nativeHook);
59
+ return true;
60
+ });
61
+ };
62
+ return { plugin: dedup(plugin), gateway: dedup(gateway) };
63
+ }
64
+ const catalogMappings = buildFromCatalog();
65
+ exports.OPENCLAW_PLUGIN_MAPPINGS = catalogMappings.plugin;
66
+ exports.OPENCLAW_GATEWAY_MAPPINGS = catalogMappings.gateway;
67
+ /**
68
+ * All OpenClaw phase mappings (plugin + gateway).
69
+ */
70
+ exports.OPENCLAW_PHASE_MAPPINGS = [
71
+ ...exports.OPENCLAW_PLUGIN_MAPPINGS,
72
+ ...exports.OPENCLAW_GATEWAY_MAPPINGS,
73
+ ];
74
+ /**
75
+ * Determine the origin of an OpenClaw native event.
76
+ */
77
+ function classifyHookOrigin(nativeEventName) {
78
+ if (nativeEventName.startsWith('gateway.')) {
79
+ return 'gateway';
80
+ }
81
+ return 'plugin';
82
+ }
83
+ /**
84
+ * Look up the phase mapping for a given OpenClaw native event name.
85
+ * Searches plugin mappings first (preferred), then gateway mappings.
86
+ */
87
+ function getOpenClawPhaseMapping(nativeEventName) {
88
+ // Plugin mappings take priority
89
+ const pluginMatch = exports.OPENCLAW_PLUGIN_MAPPINGS.find((m) => m.nativeHook === nativeEventName);
90
+ if (pluginMatch)
91
+ return pluginMatch;
92
+ return exports.OPENCLAW_GATEWAY_MAPPINGS.find((m) => m.nativeHook === nativeEventName);
93
+ }
94
+ /**
95
+ * Get all canonical phases supported by plugin hooks (the true agent-lifecycle mappings).
96
+ */
97
+ function getSupportedPluginPhases() {
98
+ return exports.OPENCLAW_PLUGIN_MAPPINGS.map((m) => m.canonicalPhase);
99
+ }
100
+ /**
101
+ * Get all canonical phases across both plugin and gateway mappings.
102
+ */
103
+ function getSupportedPhases() {
104
+ return exports.OPENCLAW_PHASE_MAPPINGS.map((m) => m.canonicalPhase);
105
+ }
106
+ //# 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,82 @@
1
+ import type { UnifiedHookEvent, UnifiedExecutionContext } from '@a5c-ai/hooks-adapter-core';
2
+ import type { OpenClawHookOrigin } from './mappings';
3
+ /** The default adapter name. */
4
+ export declare const ADAPTER_NAME = "openclaw";
5
+ /** Override the adapter name used in normalized events. */
6
+ export declare function setAdapterName(name: string): void;
7
+ /**
8
+ * OpenClaw in-process hook payload shapes.
9
+ *
10
+ * OpenClaw passes hook data as in-process objects (not stdin JSON),
11
+ * with fields varying by origin (gateway vs plugin) and event type.
12
+ */
13
+ /** Common fields present across OpenClaw hook events. */
14
+ export interface OpenClawEventBase {
15
+ /** Correlation ID from the gateway or plugin session. */
16
+ correlationId?: string;
17
+ /** Plugin-level session identifier. */
18
+ sessionId?: string;
19
+ /** Working directory or workspace path. */
20
+ workspace?: string;
21
+ /** Model identifier, if available. */
22
+ model?: string;
23
+ /** Timestamp of the event. */
24
+ timestamp?: string;
25
+ [key: string]: unknown;
26
+ }
27
+ /** Plugin session start payload. */
28
+ export interface OpenClawPluginSessionStartPayload extends OpenClawEventBase {
29
+ source?: string;
30
+ initialPrompt?: string;
31
+ pluginId?: string;
32
+ }
33
+ /** Plugin tool before/after payload. */
34
+ export interface OpenClawPluginToolPayload extends OpenClawEventBase {
35
+ toolName?: string;
36
+ toolCallId?: string;
37
+ toolInput?: unknown;
38
+ toolResponse?: unknown;
39
+ pluginId?: string;
40
+ }
41
+ /** Plugin turn stop payload. */
42
+ export interface OpenClawPluginTurnStopPayload extends OpenClawEventBase {
43
+ reason?: string;
44
+ lastMessage?: string;
45
+ pluginId?: string;
46
+ }
47
+ /** Gateway request payload. */
48
+ export interface OpenClawGatewayPayload extends OpenClawEventBase {
49
+ requestId?: string;
50
+ route?: string;
51
+ method?: string;
52
+ statusCode?: number;
53
+ authResult?: string;
54
+ }
55
+ /**
56
+ * Parse raw event input into a structured object.
57
+ * OpenClaw is in-process so payloads are typically already objects,
58
+ * but we handle string input for robustness.
59
+ */
60
+ export declare function parseEventData(raw: unknown): Record<string, unknown>;
61
+ /**
62
+ * Build a UnifiedExecutionContext from an OpenClaw event payload.
63
+ */
64
+ export declare function buildExecutionContext(eventData: Record<string, unknown>, nativeEventName: string, origin: OpenClawHookOrigin, env: Record<string, string>): UnifiedExecutionContext;
65
+ /**
66
+ * Build the payload portion of the unified event from OpenClaw event data.
67
+ * Extracts event-specific fields into the normalized payload.
68
+ */
69
+ export declare function buildPayload(nativeEventName: string, eventData: Record<string, unknown>): Record<string, unknown>;
70
+ /**
71
+ * Normalize an OpenClaw hook invocation into a UnifiedHookEvent.
72
+ *
73
+ * Tags each event with its origin (gateway vs plugin) in execution metadata
74
+ * so downstream consumers can distinguish infrastructure-level hooks from
75
+ * agent-lifecycle hooks.
76
+ *
77
+ * @param nativeEventName - The OpenClaw event name (e.g. 'plugin.tool.before', 'gateway.request.received').
78
+ * @param rawData - Raw event data (object or string).
79
+ * @param env - Environment variables at invocation time.
80
+ */
81
+ export declare function normalizeOpenClaw(nativeEventName: string, rawData: unknown, env?: Record<string, string>): UnifiedHookEvent;
82
+ //# 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,4BAA4B,CAAC;AAE5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,gCAAgC;AAChC,eAAO,MAAM,YAAY,aAAa,CAAC;AAKvC,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;;;;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,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ADAPTER_NAME = void 0;
4
+ exports.setAdapterName = setAdapterName;
5
+ exports.parseEventData = parseEventData;
6
+ exports.buildExecutionContext = buildExecutionContext;
7
+ exports.buildPayload = buildPayload;
8
+ exports.normalizeOpenClaw = normalizeOpenClaw;
9
+ const mappings_1 = require("./mappings");
10
+ /** The default adapter name. */
11
+ exports.ADAPTER_NAME = 'openclaw';
12
+ /** Mutable adapter name, defaulting to the openclaw adapter identity. */
13
+ let _adapterName = 'openclaw';
14
+ /** Override the adapter name used in normalized events. */
15
+ function setAdapterName(name) {
16
+ _adapterName = name;
17
+ }
18
+ /**
19
+ * Parse raw event input into a structured object.
20
+ * OpenClaw is in-process so payloads are typically already objects,
21
+ * but we handle string input for robustness.
22
+ */
23
+ function parseEventData(raw) {
24
+ if (raw == null) {
25
+ return {};
26
+ }
27
+ if (typeof raw === 'string') {
28
+ try {
29
+ const parsed = JSON.parse(raw);
30
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
31
+ return parsed;
32
+ }
33
+ return { raw: parsed };
34
+ }
35
+ catch {
36
+ return { raw };
37
+ }
38
+ }
39
+ if (typeof raw === 'object' && !Array.isArray(raw)) {
40
+ return raw;
41
+ }
42
+ return { raw };
43
+ }
44
+ /**
45
+ * Build a UnifiedExecutionContext from an OpenClaw event payload.
46
+ */
47
+ function buildExecutionContext(eventData, nativeEventName, origin, env) {
48
+ const persistedEnv = {};
49
+ const contextVars = {};
50
+ for (const [key, value] of Object.entries(env)) {
51
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
52
+ persistedEnv[key] = value;
53
+ }
54
+ }
55
+ // Session ID: prefer plugin sessionId, fall back to gateway correlationId
56
+ const sessionId = eventData.sessionId ??
57
+ env['AGENT_SESSION_ID'] ??
58
+ eventData.correlationId ??
59
+ null;
60
+ return {
61
+ sessionId,
62
+ turnId: env['HOOKS_PROXY_TURN_ID'] ?? null,
63
+ conversationId: env['HOOKS_PROXY_CONVERSATION_ID'] ?? null,
64
+ adapter: _adapterName,
65
+ cwd: eventData.workspace ?? env['PWD'] ?? null,
66
+ worktree: env['HOOKS_PROXY_WORKTREE'] ?? null,
67
+ transcriptPath: null,
68
+ source: eventData.source ?? null,
69
+ model: eventData.model ?? env['HOOKS_PROXY_MODEL'] ?? null,
70
+ agentType: null,
71
+ permissionMode: null,
72
+ toolName: eventData.toolName ?? null,
73
+ toolCallId: eventData.toolCallId ?? null,
74
+ nativeEventName,
75
+ rawEventScope: origin,
76
+ persistedEnv,
77
+ contextVars,
78
+ metadata: {
79
+ origin,
80
+ ...(eventData.pluginId != null ? { pluginId: eventData.pluginId } : {}),
81
+ ...(eventData.correlationId != null ? { correlationId: eventData.correlationId } : {}),
82
+ ...(eventData.requestId != null ? { requestId: eventData.requestId } : {}),
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * Build the payload portion of the unified event from OpenClaw event data.
88
+ * Extracts event-specific fields into the normalized payload.
89
+ */
90
+ function buildPayload(nativeEventName, eventData) {
91
+ const payload = {};
92
+ switch (nativeEventName) {
93
+ // --- Plugin hooks ---
94
+ case 'plugin.session.start':
95
+ if (eventData.source != null)
96
+ payload.source = eventData.source;
97
+ if (eventData.initialPrompt != null)
98
+ payload.initialPrompt = eventData.initialPrompt;
99
+ if (eventData.pluginId != null)
100
+ payload.pluginId = eventData.pluginId;
101
+ break;
102
+ case 'plugin.session.end':
103
+ if (eventData.pluginId != null)
104
+ payload.pluginId = eventData.pluginId;
105
+ break;
106
+ case 'plugin.tool.before':
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.pluginId != null)
114
+ payload.pluginId = eventData.pluginId;
115
+ break;
116
+ case 'plugin.tool.after':
117
+ if (eventData.toolName != null)
118
+ payload.toolName = eventData.toolName;
119
+ if (eventData.toolCallId != null)
120
+ payload.toolCallId = eventData.toolCallId;
121
+ if (eventData.toolInput != null)
122
+ payload.toolInput = eventData.toolInput;
123
+ if (eventData.toolResponse != null)
124
+ payload.toolResponse = eventData.toolResponse;
125
+ if (eventData.pluginId != null)
126
+ payload.pluginId = eventData.pluginId;
127
+ break;
128
+ case 'plugin.turn.stop':
129
+ if (eventData.reason != null)
130
+ payload.reason = eventData.reason;
131
+ if (eventData.lastMessage != null)
132
+ payload.lastMessage = eventData.lastMessage;
133
+ if (eventData.pluginId != null)
134
+ payload.pluginId = eventData.pluginId;
135
+ break;
136
+ case 'plugin.prompt.submitted':
137
+ if (eventData.prompt != null)
138
+ payload.prompt = eventData.prompt;
139
+ if (eventData.pluginId != null)
140
+ payload.pluginId = eventData.pluginId;
141
+ break;
142
+ // --- Gateway hooks ---
143
+ case 'gateway.request.received':
144
+ if (eventData.requestId != null)
145
+ payload.requestId = eventData.requestId;
146
+ if (eventData.route != null)
147
+ payload.route = eventData.route;
148
+ if (eventData.method != null)
149
+ payload.method = eventData.method;
150
+ break;
151
+ case 'gateway.request.routed':
152
+ if (eventData.requestId != null)
153
+ payload.requestId = eventData.requestId;
154
+ if (eventData.route != null)
155
+ payload.route = eventData.route;
156
+ break;
157
+ case 'gateway.request.completed':
158
+ if (eventData.requestId != null)
159
+ payload.requestId = eventData.requestId;
160
+ if (eventData.statusCode != null)
161
+ payload.statusCode = eventData.statusCode;
162
+ break;
163
+ case 'gateway.auth.check':
164
+ if (eventData.requestId != null)
165
+ payload.requestId = eventData.requestId;
166
+ if (eventData.authResult != null)
167
+ payload.authResult = eventData.authResult;
168
+ break;
169
+ default:
170
+ // Unknown event: pass through all non-common fields
171
+ for (const [key, value] of Object.entries(eventData)) {
172
+ if (!['correlationId', 'sessionId', 'workspace', 'model', 'timestamp'].includes(key)) {
173
+ payload[key] = value;
174
+ }
175
+ }
176
+ break;
177
+ }
178
+ return payload;
179
+ }
180
+ /**
181
+ * Normalize an OpenClaw hook invocation into a UnifiedHookEvent.
182
+ *
183
+ * Tags each event with its origin (gateway vs plugin) in execution metadata
184
+ * so downstream consumers can distinguish infrastructure-level hooks from
185
+ * agent-lifecycle hooks.
186
+ *
187
+ * @param nativeEventName - The OpenClaw event name (e.g. 'plugin.tool.before', 'gateway.request.received').
188
+ * @param rawData - Raw event data (object or string).
189
+ * @param env - Environment variables at invocation time.
190
+ */
191
+ function normalizeOpenClaw(nativeEventName, rawData, env = {}) {
192
+ const eventData = parseEventData(rawData);
193
+ const origin = (0, mappings_1.classifyHookOrigin)(nativeEventName);
194
+ const mapping = (0, mappings_1.getOpenClawPhaseMapping)(nativeEventName);
195
+ const phase = mapping?.canonicalPhase ?? 'unknown';
196
+ const supportLevel = mapping?.supportLevel ?? 'unsupported';
197
+ const execution = buildExecutionContext(eventData, nativeEventName, origin, env);
198
+ const payload = buildPayload(nativeEventName, eventData);
199
+ // Split env into input and persisted buckets
200
+ const inputEnv = {};
201
+ const persistedEnv = {};
202
+ for (const [key, value] of Object.entries(env)) {
203
+ if (key.startsWith('HOOKS_PROXY_PERSIST_')) {
204
+ persistedEnv[key] = value;
205
+ }
206
+ else if (key.startsWith('HOOKS_PROXY_')) {
207
+ inputEnv[key] = value;
208
+ }
209
+ }
210
+ return {
211
+ version: 'a5c.hooks.v1',
212
+ adapter: _adapterName,
213
+ phase,
214
+ rawEventName: nativeEventName,
215
+ supportLevel,
216
+ execution,
217
+ payload,
218
+ env: {
219
+ input: inputEnv,
220
+ persisted: persistedEnv,
221
+ },
222
+ raw: rawData,
223
+ };
224
+ }
225
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":";;;AAWA,wCAEC;AA6DD,wCAmBC;AAKD,sDA+CC;AAMD,oCA6EC;AAaD,8CAwCC;AAxRD,yCAAyE;AAGzE,gCAAgC;AACnB,QAAA,YAAY,GAAG,UAAU,CAAC;AAEvC,yEAAyE;AACzE,IAAI,YAAY,GAAW,UAAU,CAAC;AAEtC,2DAA2D;AAC3D,SAAgB,cAAc,CAAC,IAAY;IACzC,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAwDD;;;;GAIG;AACH,SAAgB,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5E,OAAO,MAAiC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,GAA8B,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,SAAkC,EAClC,eAAuB,EACvB,MAA0B,EAC1B,GAA2B;IAE3B,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,SAAS,GACZ,SAAS,CAAC,SAAgC;QAC3C,GAAG,CAAC,kBAAkB,CAAC;QACtB,SAAS,CAAC,aAAoC;QAC/C,IAAI,CAAC;IAEP,OAAO;QACL,SAAS;QACT,MAAM,EAAE,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;QAC1C,cAAc,EAAE,GAAG,CAAC,6BAA6B,CAAC,IAAI,IAAI;QAC1D,OAAO,EAAE,YAAY;QACrB,GAAG,EAAG,SAAS,CAAC,SAAgC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;QACtE,QAAQ,EAAE,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI;QAC7C,cAAc,EAAE,IAAI;QACpB,MAAM,EAAG,SAAS,CAAC,MAA6B,IAAI,IAAI;QACxD,KAAK,EAAG,SAAS,CAAC,KAA4B,IAAI,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI;QAClF,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAG,SAAS,CAAC,QAA+B,IAAI,IAAI;QAC5D,UAAU,EAAG,SAAS,CAAC,UAAiC,IAAI,IAAI;QAChE,eAAe;QACf,aAAa,EAAE,MAAM;QACrB,YAAY;QACZ,WAAW;QACX,QAAQ,EAAE;YACR,MAAM;YACN,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,GAAG,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAC1B,eAAuB,EACvB,SAAkC;IAElC,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,QAAQ,eAAe,EAAE,CAAC;QACxB,uBAAuB;QACvB,KAAK,sBAAsB;YACzB,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,IAAI,SAAS,CAAC,aAAa,IAAI,IAAI;gBAAE,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;YACrF,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,KAAK,oBAAoB;YACvB,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,KAAK,oBAAoB;YACvB,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI;gBAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;YAC5E,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,KAAK,mBAAmB;YACtB,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI;gBAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;YAC5E,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,YAAY,IAAI,IAAI;gBAAE,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;YAClF,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,KAAK,kBAAkB;YACrB,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,IAAI,SAAS,CAAC,WAAW,IAAI,IAAI;gBAAE,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;YAC/E,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,KAAK,yBAAyB;YAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACtE,MAAM;QAER,wBAAwB;QACxB,KAAK,0BAA0B;YAC7B,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI;gBAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC7D,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,MAAM;QAER,KAAK,wBAAwB;YAC3B,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI;gBAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC7D,MAAM;QAER,KAAK,2BAA2B;YAC9B,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI;gBAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;YAC5E,MAAM;QAER,KAAK,oBAAoB;YACvB,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACzE,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI;gBAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;YAC5E,MAAM;QAER;YACE,oDAAoD;YACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,MAAM;IACV,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAC/B,eAAuB,EACvB,OAAgB,EAChB,MAA8B,EAAE;IAEhC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,6BAAkB,EAAC,eAAe,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAA,kCAAuB,EAAC,eAAe,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,OAAO,EAAE,cAAc,IAAI,SAAS,CAAC;IACnD,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,aAAa,CAAC;IAE5D,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAEzD,6CAA6C;IAC7C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,YAAY;QACrB,KAAK;QACL,YAAY,EAAE,eAAe;QAC7B,YAAY;QACZ,SAAS;QACT,OAAO;QACP,GAAG,EAAE;YACH,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,YAAY;SACxB;QACD,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { UnifiedHookResult } from '@a5c-ai/hooks-adapter-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,4BAA4B,CAAC;AAEpE;;;;;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,40 @@
1
+ {
2
+ "name": "@a5c-ai/hooks-adapter-openclaw",
3
+ "version": "5.1.1-staging.52898ebfc24f",
4
+ "description": "OpenClaw harness adapter for the hooks-adapter 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/adapters/hooks/adapter-openclaw"
16
+ },
17
+ "homepage": "https://github.com/a5c-ai/babysitter/tree/main/packages/adapters/hooks/adapter-openclaw#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-adapter-core": "5.1.1-staging.52898ebfc24f"
34
+ },
35
+ "devDependencies": {
36
+ "rimraf": "^6.0.0",
37
+ "typescript": "^5.7.0",
38
+ "vitest": "^4.1.8"
39
+ }
40
+ }