@kanson1996/audit-trail 0.1.0

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,110 @@
1
+ /**
2
+ * OpenClaw plugin configuration schema for audit-trail.
3
+ *
4
+ * Follows the same pattern as memory-lancedb's configSchema:
5
+ * a plain object with parse() and uiHints.
6
+ */
7
+ import { homedir } from "node:os";
8
+ import { join } from "node:path";
9
+ const DEFAULT_LOG_DIR = join(homedir(), ".openclaw", "audit-trail");
10
+ export const DEFAULT_CONFIG = {
11
+ logDir: DEFAULT_LOG_DIR,
12
+ captureMode: "metadata_only",
13
+ rotation: { strategy: "daily" },
14
+ redaction: { mode: "hash", fields: [] },
15
+ captureBeforeToolCall: false,
16
+ };
17
+ function assertAllowedKeys(obj, allowed, label) {
18
+ const unknown = Object.keys(obj).filter((k) => !allowed.includes(k));
19
+ if (unknown.length > 0) {
20
+ throw new Error(`${label} has unknown keys: ${unknown.join(", ")}`);
21
+ }
22
+ }
23
+ export const auditTrailConfigSchema = {
24
+ parse(value) {
25
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
26
+ // Accept empty config — use all defaults
27
+ return { ...DEFAULT_CONFIG };
28
+ }
29
+ const cfg = value;
30
+ assertAllowedKeys(cfg, ["logDir", "captureMode", "rotation", "redaction", "enabledEvents", "captureBeforeToolCall"], "audit-trail config");
31
+ const captureMode = cfg["captureMode"] === "full_capture" ? "full_capture" : "metadata_only";
32
+ // Rotation
33
+ let rotation = { strategy: "daily" };
34
+ if (cfg["rotation"] && typeof cfg["rotation"] === "object") {
35
+ const rot = cfg["rotation"];
36
+ const strategy = rot["strategy"] === "session"
37
+ ? "session"
38
+ : rot["strategy"] === "size"
39
+ ? "size"
40
+ : "daily";
41
+ rotation = {
42
+ strategy,
43
+ maxSizeBytes: typeof rot["maxSizeBytes"] === "number" ? rot["maxSizeBytes"] : undefined,
44
+ };
45
+ }
46
+ // Redaction
47
+ let redaction = { mode: "hash", fields: [] };
48
+ if (cfg["redaction"] && typeof cfg["redaction"] === "object") {
49
+ const red = cfg["redaction"];
50
+ const mode = red["mode"] === "omit" ? "omit" : red["mode"] === "truncate" ? "truncate" : "hash";
51
+ redaction = {
52
+ mode,
53
+ fields: Array.isArray(red["fields"])
54
+ ? red["fields"].filter((f) => typeof f === "string")
55
+ : [],
56
+ truncateLength: typeof red["truncateLength"] === "number" ? red["truncateLength"] : undefined,
57
+ };
58
+ }
59
+ return {
60
+ logDir: typeof cfg["logDir"] === "string" ? cfg["logDir"] : DEFAULT_LOG_DIR,
61
+ captureMode,
62
+ rotation,
63
+ redaction,
64
+ enabledEvents: Array.isArray(cfg["enabledEvents"])
65
+ ? cfg["enabledEvents"].filter((e) => typeof e === "string")
66
+ : undefined,
67
+ captureBeforeToolCall: cfg["captureBeforeToolCall"] === true,
68
+ };
69
+ },
70
+ uiHints: {
71
+ logDir: {
72
+ label: "Log Directory",
73
+ placeholder: DEFAULT_LOG_DIR,
74
+ help: "Directory where tamper-evident audit logs are stored",
75
+ advanced: true,
76
+ },
77
+ captureMode: {
78
+ label: "Capture Mode",
79
+ help: 'metadata_only: record hashes and lengths only (privacy-safe). full_capture: record raw content.',
80
+ placeholder: "metadata_only",
81
+ },
82
+ "rotation.strategy": {
83
+ label: "Rotation Strategy",
84
+ help: "daily: one file per day. session: one file per session. size: rotate by file size.",
85
+ placeholder: "daily",
86
+ },
87
+ "rotation.maxSizeBytes": {
88
+ label: "Max Log File Size (bytes)",
89
+ help: "Only used when rotation strategy is 'size'",
90
+ advanced: true,
91
+ placeholder: "10485760",
92
+ },
93
+ "redaction.mode": {
94
+ label: "Redaction Mode",
95
+ help: "hash: replace with SHA-256. omit: remove field. truncate: keep first N chars.",
96
+ placeholder: "hash",
97
+ },
98
+ "redaction.fields": {
99
+ label: "Redaction Fields",
100
+ help: "Dot-notation paths to redact in full_capture mode (e.g. payload.content)",
101
+ advanced: true,
102
+ },
103
+ captureBeforeToolCall: {
104
+ label: "Capture Before Tool Call",
105
+ help: "Record tool parameters before execution (may expose sensitive args)",
106
+ advanced: true,
107
+ },
108
+ },
109
+ };
110
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { auditTrailConfigSchema, DEFAULT_CONFIG } from "./config.js";
3
+ describe("auditTrailConfigSchema.parse", () => {
4
+ it("returns defaults for empty config", () => {
5
+ const cfg = auditTrailConfigSchema.parse({});
6
+ expect(cfg.captureMode).toBe("metadata_only");
7
+ expect(cfg.rotation.strategy).toBe("daily");
8
+ expect(cfg.redaction.mode).toBe("hash");
9
+ expect(cfg.captureBeforeToolCall).toBe(false);
10
+ expect(cfg.logDir).toBe(DEFAULT_CONFIG.logDir);
11
+ });
12
+ it("returns defaults for null/undefined/non-object", () => {
13
+ expect(auditTrailConfigSchema.parse(null).captureMode).toBe("metadata_only");
14
+ expect(auditTrailConfigSchema.parse(undefined).captureMode).toBe("metadata_only");
15
+ expect(auditTrailConfigSchema.parse("string").captureMode).toBe("metadata_only");
16
+ });
17
+ it("parses captureMode: full_capture", () => {
18
+ const cfg = auditTrailConfigSchema.parse({ captureMode: "full_capture" });
19
+ expect(cfg.captureMode).toBe("full_capture");
20
+ });
21
+ it("falls back to metadata_only for unknown captureMode", () => {
22
+ const cfg = auditTrailConfigSchema.parse({ captureMode: "unknown" });
23
+ expect(cfg.captureMode).toBe("metadata_only");
24
+ });
25
+ it("parses custom logDir", () => {
26
+ const cfg = auditTrailConfigSchema.parse({ logDir: "/custom/path" });
27
+ expect(cfg.logDir).toBe("/custom/path");
28
+ });
29
+ it("parses rotation.strategy: session", () => {
30
+ const cfg = auditTrailConfigSchema.parse({ rotation: { strategy: "session" } });
31
+ expect(cfg.rotation.strategy).toBe("session");
32
+ });
33
+ it("parses rotation.strategy: size with maxSizeBytes", () => {
34
+ const cfg = auditTrailConfigSchema.parse({ rotation: { strategy: "size", maxSizeBytes: 1048576 } });
35
+ expect(cfg.rotation.strategy).toBe("size");
36
+ expect(cfg.rotation.maxSizeBytes).toBe(1048576);
37
+ });
38
+ it("defaults rotation.strategy to daily for unknown value", () => {
39
+ const cfg = auditTrailConfigSchema.parse({ rotation: { strategy: "unknown" } });
40
+ expect(cfg.rotation.strategy).toBe("daily");
41
+ });
42
+ it("parses redaction.mode: omit", () => {
43
+ const cfg = auditTrailConfigSchema.parse({ redaction: { mode: "omit" } });
44
+ expect(cfg.redaction.mode).toBe("omit");
45
+ });
46
+ it("parses redaction.mode: truncate with truncateLength", () => {
47
+ const cfg = auditTrailConfigSchema.parse({ redaction: { mode: "truncate", truncateLength: 64 } });
48
+ expect(cfg.redaction.mode).toBe("truncate");
49
+ expect(cfg.redaction.truncateLength).toBe(64);
50
+ });
51
+ it("parses redaction.fields array", () => {
52
+ const cfg = auditTrailConfigSchema.parse({ redaction: { mode: "hash", fields: ["payload.content"] } });
53
+ expect(cfg.redaction.fields).toEqual(["payload.content"]);
54
+ });
55
+ it("filters non-string redaction fields", () => {
56
+ const cfg = auditTrailConfigSchema.parse({ redaction: { mode: "hash", fields: ["valid", 123, null] } });
57
+ expect(cfg.redaction.fields).toEqual(["valid"]);
58
+ });
59
+ it("parses enabledEvents array", () => {
60
+ const cfg = auditTrailConfigSchema.parse({ enabledEvents: ["session_start", "llm_input"] });
61
+ expect(cfg.enabledEvents).toEqual(["session_start", "llm_input"]);
62
+ });
63
+ it("sets enabledEvents to undefined when not provided", () => {
64
+ const cfg = auditTrailConfigSchema.parse({});
65
+ expect(cfg.enabledEvents).toBeUndefined();
66
+ });
67
+ it("parses captureBeforeToolCall: true", () => {
68
+ const cfg = auditTrailConfigSchema.parse({ captureBeforeToolCall: true });
69
+ expect(cfg.captureBeforeToolCall).toBe(true);
70
+ });
71
+ it("defaults captureBeforeToolCall to false for truthy non-boolean", () => {
72
+ const cfg = auditTrailConfigSchema.parse({ captureBeforeToolCall: 1 });
73
+ expect(cfg.captureBeforeToolCall).toBe(false);
74
+ });
75
+ });
76
+ describe("auditTrailConfigSchema.uiHints", () => {
77
+ it("has uiHints for key fields", () => {
78
+ const hints = auditTrailConfigSchema.uiHints;
79
+ expect(hints).toHaveProperty("logDir");
80
+ expect(hints).toHaveProperty("captureMode");
81
+ expect(hints["captureMode"].label).toBeDefined();
82
+ expect(hints["logDir"].advanced).toBe(true);
83
+ });
84
+ });
85
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * OpenClaw hook registrations for audit-trail.
3
+ *
4
+ * All hooks are registered as observers (void return) to avoid
5
+ * interfering with agent behavior. Maps each lifecycle event to
6
+ * an AuditEvent and queues it through AuditWriter.
7
+ */
8
+ import { AuditWriter } from "agent-audit-trail";
9
+ import type { AuditTrailConfig } from "agent-audit-trail";
10
+ type PluginApi = {
11
+ on: (hookName: string, handler: (...args: unknown[]) => unknown) => void;
12
+ logger: {
13
+ info: (msg: string) => void;
14
+ warn: (msg: string) => void;
15
+ error: (msg: string) => void;
16
+ };
17
+ };
18
+ export declare function registerHooks(api: PluginApi, writer: AuditWriter, config: AuditTrailConfig): void;
19
+ export {};
20
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAe,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,KAAK,SAAS,GAAG;IACf,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC;IACzE,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACpG,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA2UjG"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * OpenClaw hook registrations for audit-trail.
3
+ *
4
+ * All hooks are registered as observers (void return) to avoid
5
+ * interfering with agent behavior. Maps each lifecycle event to
6
+ * an AuditEvent and queues it through AuditWriter.
7
+ */
8
+ import { contentHash } from "agent-audit-trail";
9
+ export function registerHooks(api, writer, config) {
10
+ const { captureMode, enabledEvents, captureBeforeToolCall } = config;
11
+ const isEnabled = (type) => !enabledEvents || enabledEvents.includes(type);
12
+ const ts = () => new Date().toISOString();
13
+ // -------------------------------------------------------------------------
14
+ // session_start
15
+ // -------------------------------------------------------------------------
16
+ if (isEnabled("session_start")) {
17
+ api.on("session_start", (event, ctx) => {
18
+ const ev = event;
19
+ const c = ctx;
20
+ try {
21
+ writer.append({
22
+ type: "session_start",
23
+ timestamp: ts(),
24
+ agentId: c.agentId,
25
+ sessionId: ev.sessionId,
26
+ sessionKey: ev.sessionKey,
27
+ payload: {
28
+ sessionId: ev.sessionId,
29
+ sessionKey: ev.sessionKey,
30
+ resumedFrom: ev.resumedFrom,
31
+ },
32
+ });
33
+ }
34
+ catch (err) {
35
+ api.logger.warn(`audit-trail: session_start write failed: ${String(err)}`);
36
+ }
37
+ });
38
+ }
39
+ // -------------------------------------------------------------------------
40
+ // session_end
41
+ // -------------------------------------------------------------------------
42
+ if (isEnabled("session_end")) {
43
+ api.on("session_end", (event, ctx) => {
44
+ const ev = event;
45
+ const c = ctx;
46
+ try {
47
+ writer.append({
48
+ type: "session_end",
49
+ timestamp: ts(),
50
+ agentId: c.agentId,
51
+ sessionId: ev.sessionId,
52
+ sessionKey: ev.sessionKey,
53
+ payload: {
54
+ sessionId: ev.sessionId,
55
+ sessionKey: ev.sessionKey,
56
+ messageCount: ev.messageCount,
57
+ durationMs: ev.durationMs,
58
+ },
59
+ });
60
+ }
61
+ catch (err) {
62
+ api.logger.warn(`audit-trail: session_end write failed: ${String(err)}`);
63
+ }
64
+ });
65
+ }
66
+ // -------------------------------------------------------------------------
67
+ // message_received
68
+ // -------------------------------------------------------------------------
69
+ if (isEnabled("message_received")) {
70
+ api.on("message_received", (event, ctx) => {
71
+ const ev = event;
72
+ const c = ctx;
73
+ try {
74
+ const contentLength = ev.content?.length ?? 0;
75
+ writer.append({
76
+ type: "message_received",
77
+ timestamp: ts(),
78
+ payload: {
79
+ from: ev.from,
80
+ channelId: c.channelId,
81
+ contentLength,
82
+ ...(captureMode === "full_capture" ? { content: ev.content } : {}),
83
+ },
84
+ });
85
+ }
86
+ catch (err) {
87
+ api.logger.warn(`audit-trail: message_received write failed: ${String(err)}`);
88
+ }
89
+ });
90
+ }
91
+ // -------------------------------------------------------------------------
92
+ // message_sent
93
+ // -------------------------------------------------------------------------
94
+ if (isEnabled("message_sent")) {
95
+ api.on("message_sent", (event, ctx) => {
96
+ const ev = event;
97
+ const c = ctx;
98
+ try {
99
+ const contentLength = ev.content?.length ?? 0;
100
+ writer.append({
101
+ type: "message_sent",
102
+ timestamp: ts(),
103
+ payload: {
104
+ to: ev.to,
105
+ channelId: c.channelId,
106
+ success: ev.success,
107
+ error: ev.error,
108
+ contentLength,
109
+ ...(captureMode === "full_capture" ? { content: ev.content } : {}),
110
+ },
111
+ });
112
+ }
113
+ catch (err) {
114
+ api.logger.warn(`audit-trail: message_sent write failed: ${String(err)}`);
115
+ }
116
+ });
117
+ }
118
+ // -------------------------------------------------------------------------
119
+ // llm_input
120
+ // -------------------------------------------------------------------------
121
+ if (isEnabled("llm_input")) {
122
+ api.on("llm_input", (event, ctx) => {
123
+ const ev = event;
124
+ const c = ctx;
125
+ try {
126
+ writer.append({
127
+ type: "llm_input",
128
+ timestamp: ts(),
129
+ agentId: c.agentId,
130
+ sessionId: ev.sessionId,
131
+ sessionKey: c.sessionKey,
132
+ runId: ev.runId,
133
+ payload: {
134
+ provider: ev.provider,
135
+ model: ev.model,
136
+ historyMessageCount: ev.historyMessages?.length ?? 0,
137
+ systemPromptHash: ev.systemPrompt ? contentHash(ev.systemPrompt) : undefined,
138
+ ...(captureMode === "full_capture" ? { prompt: ev.prompt } : {}),
139
+ },
140
+ });
141
+ }
142
+ catch (err) {
143
+ api.logger.warn(`audit-trail: llm_input write failed: ${String(err)}`);
144
+ }
145
+ });
146
+ }
147
+ // -------------------------------------------------------------------------
148
+ // llm_output
149
+ // -------------------------------------------------------------------------
150
+ if (isEnabled("llm_output")) {
151
+ api.on("llm_output", (event, ctx) => {
152
+ const ev = event;
153
+ const c = ctx;
154
+ try {
155
+ const assistantText = ev.assistantTexts?.join("") ?? "";
156
+ writer.append({
157
+ type: "llm_output",
158
+ timestamp: ts(),
159
+ agentId: c.agentId,
160
+ sessionId: ev.sessionId,
161
+ sessionKey: c.sessionKey,
162
+ runId: ev.runId,
163
+ payload: {
164
+ provider: ev.provider,
165
+ model: ev.model,
166
+ assistantTextLength: assistantText.length,
167
+ usage: ev.usage,
168
+ },
169
+ });
170
+ }
171
+ catch (err) {
172
+ api.logger.warn(`audit-trail: llm_output write failed: ${String(err)}`);
173
+ }
174
+ });
175
+ }
176
+ // -------------------------------------------------------------------------
177
+ // before_tool_call (opt-in)
178
+ // -------------------------------------------------------------------------
179
+ if (captureBeforeToolCall && isEnabled("tool_call_before")) {
180
+ api.on("before_tool_call", (event, ctx) => {
181
+ const ev = event;
182
+ const c = ctx;
183
+ try {
184
+ writer.append({
185
+ type: "tool_call_before",
186
+ timestamp: ts(),
187
+ agentId: c.agentId,
188
+ sessionId: c.sessionId,
189
+ sessionKey: c.sessionKey,
190
+ runId: ev.runId,
191
+ toolCallId: ev.toolCallId,
192
+ payload: {
193
+ toolName: ev.toolName,
194
+ paramsHash: contentHash(JSON.stringify(ev.params)),
195
+ ...(captureMode === "full_capture" ? { params: ev.params } : {}),
196
+ },
197
+ });
198
+ }
199
+ catch (err) {
200
+ api.logger.warn(`audit-trail: before_tool_call write failed: ${String(err)}`);
201
+ }
202
+ });
203
+ }
204
+ // -------------------------------------------------------------------------
205
+ // after_tool_call
206
+ // -------------------------------------------------------------------------
207
+ if (isEnabled("tool_call_after")) {
208
+ api.on("after_tool_call", (event, ctx) => {
209
+ const ev = event;
210
+ const c = ctx;
211
+ try {
212
+ const success = !ev.error;
213
+ const resultStr = ev.result !== undefined ? JSON.stringify(ev.result) : undefined;
214
+ writer.append({
215
+ type: "tool_call_after",
216
+ timestamp: ts(),
217
+ agentId: c.agentId,
218
+ sessionId: c.sessionId,
219
+ sessionKey: c.sessionKey,
220
+ runId: ev.runId,
221
+ toolCallId: ev.toolCallId,
222
+ payload: {
223
+ toolName: ev.toolName,
224
+ durationMs: ev.durationMs,
225
+ success,
226
+ error: ev.error,
227
+ resultHash: resultStr ? contentHash(resultStr) : undefined,
228
+ ...(captureMode === "full_capture" && ev.result !== undefined
229
+ ? { result: ev.result }
230
+ : {}),
231
+ },
232
+ });
233
+ }
234
+ catch (err) {
235
+ api.logger.warn(`audit-trail: after_tool_call write failed: ${String(err)}`);
236
+ }
237
+ });
238
+ }
239
+ // -------------------------------------------------------------------------
240
+ // agent_end
241
+ // -------------------------------------------------------------------------
242
+ if (isEnabled("agent_end")) {
243
+ api.on("agent_end", (event, ctx) => {
244
+ const ev = event;
245
+ const c = ctx;
246
+ try {
247
+ writer.append({
248
+ type: "agent_end",
249
+ timestamp: ts(),
250
+ agentId: c.agentId,
251
+ sessionId: c.sessionId,
252
+ sessionKey: c.sessionKey,
253
+ payload: {
254
+ success: ev.success,
255
+ durationMs: ev.durationMs,
256
+ messageCount: ev.messages?.length,
257
+ error: ev.error,
258
+ },
259
+ });
260
+ }
261
+ catch (err) {
262
+ api.logger.warn(`audit-trail: agent_end write failed: ${String(err)}`);
263
+ }
264
+ });
265
+ }
266
+ // -------------------------------------------------------------------------
267
+ // subagent_spawned
268
+ // -------------------------------------------------------------------------
269
+ if (isEnabled("subagent_spawned")) {
270
+ api.on("subagent_spawned", (event, ctx) => {
271
+ const ev = event;
272
+ const c = ctx;
273
+ try {
274
+ writer.append({
275
+ type: "subagent_spawned",
276
+ timestamp: ts(),
277
+ runId: ev.runId ?? c.runId,
278
+ payload: {
279
+ childSessionKey: ev.childSessionKey,
280
+ childAgentId: ev.agentId,
281
+ mode: ev.mode,
282
+ },
283
+ });
284
+ }
285
+ catch (err) {
286
+ api.logger.warn(`audit-trail: subagent_spawned write failed: ${String(err)}`);
287
+ }
288
+ });
289
+ }
290
+ // -------------------------------------------------------------------------
291
+ // subagent_ended
292
+ // -------------------------------------------------------------------------
293
+ if (isEnabled("subagent_ended")) {
294
+ api.on("subagent_ended", (event, ctx) => {
295
+ const ev = event;
296
+ const c = ctx;
297
+ try {
298
+ writer.append({
299
+ type: "subagent_ended",
300
+ timestamp: ts(),
301
+ runId: ev.runId ?? c.runId,
302
+ payload: {
303
+ targetSessionKey: ev.targetSessionKey,
304
+ outcome: ev.outcome,
305
+ error: ev.error,
306
+ },
307
+ });
308
+ }
309
+ catch (err) {
310
+ api.logger.warn(`audit-trail: subagent_ended write failed: ${String(err)}`);
311
+ }
312
+ });
313
+ }
314
+ api.logger.info(`audit-trail: hooks registered (mode=${captureMode}, dir=${config.logDir})`);
315
+ }
316
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAU7D,MAAM,UAAU,aAAa,CAAC,GAAc,EAAE,MAAmB,EAAE,MAAwB;IACzF,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAAC;IACrE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAW,EAAE,CAC1C,CAAC,aAAa,IAAK,aAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE1C,4EAA4E;IAC5E,gBAAgB;IAChB,4EAA4E;IAC5E,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACvD,MAAM,EAAE,GAAG,KAAyE,CAAC;YACrF,MAAM,CAAC,GAAG,GAAoE,CAAC;YAC/E,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,eAAe;oBACrB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,OAAO,EAAE;wBACP,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,UAAU,EAAE,EAAE,CAAC,UAAU;wBACzB,WAAW,EAAE,EAAE,CAAC,WAAW;qBAC5B;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAC5E,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACrD,MAAM,EAAE,GAAG,KAA8F,CAAC;YAC1G,MAAM,CAAC,GAAG,GAA2B,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,OAAO,EAAE;wBACP,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,UAAU,EAAE,EAAE,CAAC,UAAU;wBACzB,YAAY,EAAE,EAAE,CAAC,YAAY;wBAC7B,UAAU,EAAE,EAAE,CAAC,UAAU;qBAC1B;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAC5E,IAAI,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YAC1D,MAAM,EAAE,GAAG,KAA0C,CAAC;YACtD,MAAM,CAAC,GAAG,GAA4B,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE;wBACP,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,aAAa;wBACb,GAAG,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnE;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAC5E,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACtD,MAAM,EAAE,GAAG,KAA0E,CAAC;YACtF,MAAM,CAAC,GAAG,GAA4B,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,cAAc;oBACpB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE;wBACP,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,OAAO,EAAE,EAAE,CAAC,OAAO;wBACnB,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,aAAa;wBACb,GAAG,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnE;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,YAAY;IACZ,4EAA4E;IAC5E,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,KAQV,CAAC;YACF,MAAM,CAAC,GAAG,GAAgD,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,mBAAmB,EAAE,EAAE,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC;wBACpD,gBAAgB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC5E,GAAG,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACjE;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,aAAa;IACb,4EAA4E;IAC5E,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACpD,MAAM,EAAE,GAAG,KAOV,CAAC;YACF,MAAM,CAAC,GAAG,GAAgD,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,YAAY;oBAClB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,mBAAmB,EAAE,aAAa,CAAC,MAAM;wBACzC,KAAK,EAAE,EAAE,CAAC,KAAK;qBAChB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,4BAA4B;IAC5B,4EAA4E;IAC5E,IAAI,qBAAqB,IAAI,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YAC1D,MAAM,EAAE,GAAG,KAAmG,CAAC;YAC/G,MAAM,CAAC,GAAG,GAAoE,CAAC;YAC/E,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;wBAClD,GAAG,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACjE;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAC5E,IAAI,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACzD,MAAM,EAAE,GAAG,KAQV,CAAC;YACF,MAAM,CAAC,GAAG,GAAoE,CAAC;YAC/E,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;gBAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClF,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,iBAAiB;oBACvB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,UAAU,EAAE,EAAE,CAAC,UAAU;wBACzB,OAAO;wBACP,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC1D,GAAG,CAAC,WAAW,KAAK,cAAc,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;4BAC3D,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;4BACvB,CAAC,CAAC,EAAE,CAAC;qBACR;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,YAAY;IACZ,4EAA4E;IAC5E,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,KAAuF,CAAC;YACnG,MAAM,CAAC,GAAG,GAAoE,CAAC;YAC/E,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,EAAE,EAAE;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,OAAO,EAAE;wBACP,OAAO,EAAE,EAAE,CAAC,OAAO;wBACnB,UAAU,EAAE,EAAE,CAAC,UAAU;wBACzB,YAAY,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM;wBACjC,KAAK,EAAE,EAAE,CAAC,KAAK;qBAChB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAC5E,IAAI,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YAC1D,MAAM,EAAE,GAAG,KAA6F,CAAC;YACzG,MAAM,CAAC,GAAG,GAAyB,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,EAAE,EAAE;oBACf,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;oBAC1B,OAAO,EAAE;wBACP,eAAe,EAAE,EAAE,CAAC,eAAe;wBACnC,YAAY,EAAE,EAAE,CAAC,OAAO;wBACxB,IAAI,EAAE,EAAE,CAAC,IAAI;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAC5E,IAAI,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAc,EAAE,GAAY,EAAE,EAAE;YACxD,MAAM,EAAE,GAAG,KAAuF,CAAC;YACnG,MAAM,CAAC,GAAG,GAAyB,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,SAAS,EAAE,EAAE,EAAE;oBACf,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;oBAC1B,OAAO,EAAE;wBACP,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;wBACrC,OAAO,EAAE,EAAE,CAAC,OAAkF;wBAC9F,KAAK,EAAE,EAAE,CAAC,KAAK;qBAChB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,WAAW,SAAS,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../src/hooks.test.ts"],"names":[],"mappings":""}