@clawtrail/context-graph-openclaw 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.
Files changed (62) hide show
  1. package/README.md +252 -0
  2. package/dist/OpenClawAdapter.d.ts +75 -0
  3. package/dist/OpenClawAdapter.d.ts.map +1 -0
  4. package/dist/OpenClawAdapter.js +157 -0
  5. package/dist/OpenClawAdapter.js.map +1 -0
  6. package/dist/detectors/BuildDetector.d.ts +17 -0
  7. package/dist/detectors/BuildDetector.d.ts.map +1 -0
  8. package/dist/detectors/BuildDetector.js +98 -0
  9. package/dist/detectors/BuildDetector.js.map +1 -0
  10. package/dist/detectors/TestDetector.d.ts +19 -0
  11. package/dist/detectors/TestDetector.d.ts.map +1 -0
  12. package/dist/detectors/TestDetector.js +133 -0
  13. package/dist/detectors/TestDetector.js.map +1 -0
  14. package/dist/hooks/lifecycle.d.ts +29 -0
  15. package/dist/hooks/lifecycle.d.ts.map +1 -0
  16. package/dist/hooks/lifecycle.js +26 -0
  17. package/dist/hooks/lifecycle.js.map +1 -0
  18. package/dist/hooks/toolCall.d.ts +18 -0
  19. package/dist/hooks/toolCall.d.ts.map +1 -0
  20. package/dist/hooks/toolCall.js +34 -0
  21. package/dist/hooks/toolCall.js.map +1 -0
  22. package/dist/index.d.ts +30 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +29 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mappers/MapperRegistry.d.ts +29 -0
  27. package/dist/mappers/MapperRegistry.d.ts.map +1 -0
  28. package/dist/mappers/MapperRegistry.js +29 -0
  29. package/dist/mappers/MapperRegistry.js.map +1 -0
  30. package/dist/mappers/fallback.d.ts +11 -0
  31. package/dist/mappers/fallback.d.ts.map +1 -0
  32. package/dist/mappers/fallback.js +25 -0
  33. package/dist/mappers/fallback.js.map +1 -0
  34. package/dist/mappers/fs.d.ts +7 -0
  35. package/dist/mappers/fs.d.ts.map +1 -0
  36. package/dist/mappers/fs.js +51 -0
  37. package/dist/mappers/fs.js.map +1 -0
  38. package/dist/mappers/git.d.ts +10 -0
  39. package/dist/mappers/git.d.ts.map +1 -0
  40. package/dist/mappers/git.js +79 -0
  41. package/dist/mappers/git.js.map +1 -0
  42. package/dist/mappers/shell.d.ts +16 -0
  43. package/dist/mappers/shell.d.ts.map +1 -0
  44. package/dist/mappers/shell.js +75 -0
  45. package/dist/mappers/shell.js.map +1 -0
  46. package/dist/rules/openclaw-rules.d.ts +15 -0
  47. package/dist/rules/openclaw-rules.d.ts.map +1 -0
  48. package/dist/rules/openclaw-rules.js +175 -0
  49. package/dist/rules/openclaw-rules.js.map +1 -0
  50. package/dist/tools/status.d.ts +14 -0
  51. package/dist/tools/status.d.ts.map +1 -0
  52. package/dist/tools/status.js +21 -0
  53. package/dist/tools/status.js.map +1 -0
  54. package/dist/tools/summarize.d.ts +17 -0
  55. package/dist/tools/summarize.d.ts.map +1 -0
  56. package/dist/tools/summarize.js +30 -0
  57. package/dist/tools/summarize.js.map +1 -0
  58. package/dist/util/hash.d.ts +23 -0
  59. package/dist/util/hash.d.ts.map +1 -0
  60. package/dist/util/hash.js +83 -0
  61. package/dist/util/hash.js.map +1 -0
  62. package/package.json +48 -0
@@ -0,0 +1,133 @@
1
+ /**
2
+ * TestDetector — identifies test framework invocations from shell commands
3
+ * and parses test results from stdout.
4
+ */
5
+ const frameworks = [
6
+ {
7
+ framework: 'jest',
8
+ cmdPatterns: [/\bjest\b/, /\bvitest\b/],
9
+ parseOutput(stdout, stderr) {
10
+ const combined = stdout + '\n' + stderr;
11
+ // Jest/Vitest outputs counts in variable order: "5 passed, 2 failed, 7 total"
12
+ const passedMatch = combined.match(/(\d+)\s+passed/i);
13
+ const failedMatch = combined.match(/(\d+)\s+failed/i);
14
+ const skippedMatch = combined.match(/(\d+)\s+skipped/i);
15
+ if (passedMatch || failedMatch) {
16
+ return {
17
+ passed: Number(passedMatch?.[1] || 0),
18
+ failed: Number(failedMatch?.[1] || 0),
19
+ skipped: Number(skippedMatch?.[1] || 0),
20
+ };
21
+ }
22
+ // Fallback: if we matched the command, at least return zeros
23
+ return { passed: 0, failed: 0, skipped: 0 };
24
+ },
25
+ },
26
+ {
27
+ framework: 'mocha',
28
+ cmdPatterns: [/\bmocha\b/],
29
+ parseOutput(stdout) {
30
+ // Mocha: "5 passing", "2 failing"
31
+ const passing = stdout.match(/(\d+)\s+passing/i);
32
+ const failing = stdout.match(/(\d+)\s+failing/i);
33
+ if (passing || failing) {
34
+ return {
35
+ passed: Number(passing?.[1] || 0),
36
+ failed: Number(failing?.[1] || 0),
37
+ skipped: 0,
38
+ };
39
+ }
40
+ return null;
41
+ },
42
+ },
43
+ {
44
+ framework: 'pytest',
45
+ cmdPatterns: [/\bpytest\b/, /python\s+-m\s+pytest/],
46
+ parseOutput(stdout) {
47
+ // pytest: "5 passed, 2 failed, 1 skipped"
48
+ const match = stdout.match(/(\d+)\s+passed(?:,\s+(\d+)\s+failed)?(?:,\s+(\d+)\s+skipped)?/i);
49
+ if (match) {
50
+ return {
51
+ passed: Number(match[1]),
52
+ failed: Number(match[2] || 0),
53
+ skipped: Number(match[3] || 0),
54
+ };
55
+ }
56
+ return null;
57
+ },
58
+ },
59
+ {
60
+ framework: 'cargo-test',
61
+ cmdPatterns: [/\bcargo\s+test\b/],
62
+ parseOutput(stdout) {
63
+ // Cargo: "test result: ok. 5 passed; 0 failed;"
64
+ const match = stdout.match(/test result:.*?(\d+)\s+passed;\s+(\d+)\s+failed/i);
65
+ if (match) {
66
+ return {
67
+ passed: Number(match[1]),
68
+ failed: Number(match[2]),
69
+ skipped: 0,
70
+ };
71
+ }
72
+ return null;
73
+ },
74
+ },
75
+ {
76
+ framework: 'go-test',
77
+ cmdPatterns: [/\bgo\s+test\b/],
78
+ parseOutput(stdout) {
79
+ // Go: "ok package 0.5s" or "FAIL package 0.5s"
80
+ const okCount = (stdout.match(/^ok\s/gm) || []).length;
81
+ const failCount = (stdout.match(/^FAIL\s/gm) || []).length;
82
+ if (okCount > 0 || failCount > 0) {
83
+ return { passed: okCount, failed: failCount, skipped: 0 };
84
+ }
85
+ return null;
86
+ },
87
+ },
88
+ {
89
+ framework: 'hardhat',
90
+ cmdPatterns: [/\bhardhat\s+test\b/],
91
+ parseOutput(stdout) {
92
+ // Hardhat uses Mocha output
93
+ const passing = stdout.match(/(\d+)\s+passing/i);
94
+ const failing = stdout.match(/(\d+)\s+failing/i);
95
+ if (passing || failing) {
96
+ return {
97
+ passed: Number(passing?.[1] || 0),
98
+ failed: Number(failing?.[1] || 0),
99
+ skipped: 0,
100
+ };
101
+ }
102
+ return null;
103
+ },
104
+ },
105
+ ];
106
+ export class TestDetector {
107
+ /**
108
+ * Try to detect a test run from a shell command and its output.
109
+ * Returns null if this doesn't look like a test invocation.
110
+ */
111
+ detect(cmd, stdout, stderr, exitCode) {
112
+ for (const fw of frameworks) {
113
+ const cmdMatch = fw.cmdPatterns.some((p) => p.test(cmd));
114
+ if (!cmdMatch)
115
+ continue;
116
+ const parsed = fw.parseOutput(stdout, stderr);
117
+ // Determine framework name (vitest vs jest)
118
+ let fwName = fw.framework;
119
+ if (fwName === 'jest' && /\bvitest\b/.test(cmd)) {
120
+ fwName = 'vitest';
121
+ }
122
+ return {
123
+ framework: fwName,
124
+ passed: parsed?.passed ?? 0,
125
+ failed: parsed?.failed ?? 0,
126
+ skipped: parsed?.skipped ?? 0,
127
+ durationMs: parsed?.durationMs,
128
+ };
129
+ }
130
+ return null;
131
+ }
132
+ }
133
+ //# sourceMappingURL=TestDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestDetector.js","sourceRoot":"","sources":["../../src/detectors/TestDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Lifecycle hooks — wired into OpenClaw's session_start / session_end events.
3
+ */
4
+ import type { ContextGraph, Session } from '@clawtrail/context-graph';
5
+ export interface OpenClawSessionContext {
6
+ sessionKey: string;
7
+ initialMessage?: string;
8
+ agentId?: string;
9
+ /** Store/retrieve adapter state across hook invocations */
10
+ set(key: string, value: unknown): void;
11
+ get(key: string): unknown;
12
+ }
13
+ export interface LifecycleEvent {
14
+ type: string;
15
+ [key: string]: unknown;
16
+ }
17
+ /**
18
+ * Register session lifecycle hooks.
19
+ * In a real OpenClaw integration, `api.on(...)` is called.
20
+ * Here we export the handlers so the adapter can wire them in.
21
+ */
22
+ export declare function createLifecycleHandlers(cg: ContextGraph, config: {
23
+ agentId?: string;
24
+ policyPath?: string;
25
+ }): {
26
+ onSessionStart(ctx: OpenClawSessionContext): Promise<Session>;
27
+ onSessionEnd(ctx: OpenClawSessionContext): Promise<void>;
28
+ };
29
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;wBAGrB,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;sBAW3C,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;EAMjE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Register session lifecycle hooks.
3
+ * In a real OpenClaw integration, `api.on(...)` is called.
4
+ * Here we export the handlers so the adapter can wire them in.
5
+ */
6
+ export function createLifecycleHandlers(cg, config) {
7
+ return {
8
+ async onSessionStart(ctx) {
9
+ await cg.init();
10
+ const session = await cg.startSession({
11
+ task: ctx.initialMessage || 'OpenClaw session',
12
+ actorId: config.agentId || `agent:openclaw:${ctx.sessionKey}`,
13
+ policy: config.policyPath,
14
+ });
15
+ ctx.set('cg:session_id', session.meta.session_id);
16
+ return session;
17
+ },
18
+ async onSessionEnd(ctx) {
19
+ const sessionId = ctx.get('cg:session_id');
20
+ if (!sessionId)
21
+ return;
22
+ await cg.endSession(sessionId, { status: 'COMPLETED' });
23
+ },
24
+ };
25
+ }
26
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,EAAgB,EAChB,MAAiD;IAEjD,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,GAA2B;YAC9C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC;gBACpC,IAAI,EAAE,GAAG,CAAC,cAAc,IAAI,kBAAkB;gBAC9C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,kBAAkB,GAAG,CAAC,UAAU,EAAE;gBAC7D,MAAM,EAAE,MAAM,CAAC,UAAU;aAC1B,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,GAA2B;YAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;YACjE,IAAI,CAAC,SAAS;gBAAE,OAAO;YACvB,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tool call hooks — wired into OpenClaw's before_tool_call / after_tool_call events.
3
+ */
4
+ import type { ContextGraph } from '@clawtrail/context-graph';
5
+ import type { MapperRegistry } from '../mappers/MapperRegistry.js';
6
+ import type { OpenClawSessionContext } from './lifecycle.js';
7
+ export interface ToolCallEvent {
8
+ toolName: string;
9
+ params: Record<string, unknown>;
10
+ result?: Record<string, unknown>;
11
+ error?: Error;
12
+ durationMs?: number;
13
+ }
14
+ export declare function createToolCallHandlers(cg: ContextGraph, mappers: MapperRegistry): {
15
+ onBeforeToolCall(event: ToolCallEvent, ctx: OpenClawSessionContext): Promise<void>;
16
+ onAfterToolCall(event: ToolCallEvent, ctx: OpenClawSessionContext): Promise<void>;
17
+ };
18
+ //# sourceMappingURL=toolCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolCall.d.ts","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,0BAA0B,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,cAAc;4BAIZ,aAAa,OACf,sBAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC;2BAeP,aAAa,OACf,sBAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC;EAwBnB"}
@@ -0,0 +1,34 @@
1
+ export function createToolCallHandlers(cg, mappers) {
2
+ return {
3
+ async onBeforeToolCall(event, ctx) {
4
+ const sessionId = ctx.get('cg:session_id');
5
+ if (!sessionId)
6
+ return;
7
+ const session = await cg.getSession(sessionId);
8
+ const mapped = mappers.mapStart(event.toolName, event.params);
9
+ await session.logEvent({
10
+ type: mapped.type,
11
+ status: 'STARTED',
12
+ data: mapped.data,
13
+ });
14
+ },
15
+ async onAfterToolCall(event, ctx) {
16
+ const sessionId = ctx.get('cg:session_id');
17
+ if (!sessionId)
18
+ return;
19
+ const session = await cg.getSession(sessionId);
20
+ const mapped = mappers.mapEnd(event.toolName, event.params, event.result ?? null, event.error);
21
+ await session.logEvent({
22
+ type: mapped.type,
23
+ status: (event.error ? 'FAILED' : 'SUCCEEDED'),
24
+ data: {
25
+ ...mapped.data,
26
+ ...(event.durationMs !== undefined
27
+ ? { duration_ms: event.durationMs }
28
+ : {}),
29
+ },
30
+ });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=toolCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolCall.js","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,sBAAsB,CACpC,EAAgB,EAChB,OAAuB;IAEvB,OAAO;QACL,KAAK,CAAC,gBAAgB,CACpB,KAAoB,EACpB,GAA2B;YAE3B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;YACjE,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,SAAwB;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,eAAe,CACnB,KAAoB,EACpB,GAA2B;YAE3B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;YACjE,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,KAAK,CACZ,CAAC;YAEF,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAgB;gBAC7D,IAAI,EAAE;oBACJ,GAAG,MAAM,CAAC,IAAI;oBACd,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;wBAChC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE;wBACnC,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @clawtrail/context-graph-openclaw
3
+ *
4
+ * OpenClaw adapter for @clawtrail/context-graph.
5
+ * Captures agent execution traces as PROV-O events with
6
+ * hash chain integrity and signed submissions.
7
+ */
8
+ export { OpenClawAdapter } from './OpenClawAdapter.js';
9
+ export type { AdapterConfig, SignedSubmission } from './OpenClawAdapter.js';
10
+ export { MapperRegistry } from './mappers/MapperRegistry.js';
11
+ export type { EventMapper, MappedEvent } from './mappers/MapperRegistry.js';
12
+ export { ShellMapper } from './mappers/shell.js';
13
+ export { FsMapper } from './mappers/fs.js';
14
+ export { GitMapper } from './mappers/git.js';
15
+ export { FallbackMapper } from './mappers/fallback.js';
16
+ export { TestDetector } from './detectors/TestDetector.js';
17
+ export type { TestResult } from './detectors/TestDetector.js';
18
+ export { BuildDetector } from './detectors/BuildDetector.js';
19
+ export type { BuildResult } from './detectors/BuildDetector.js';
20
+ export { createLifecycleHandlers } from './hooks/lifecycle.js';
21
+ export type { OpenClawSessionContext, LifecycleEvent } from './hooks/lifecycle.js';
22
+ export { createToolCallHandlers } from './hooks/toolCall.js';
23
+ export type { ToolCallEvent } from './hooks/toolCall.js';
24
+ export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool } from './rules/openclaw-rules.js';
25
+ export { getStatus } from './tools/status.js';
26
+ export type { StatusResult } from './tools/status.js';
27
+ export { summarizeSession } from './tools/summarize.js';
28
+ export type { SummarizeResult } from './tools/summarize.js';
29
+ export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from './util/hash.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGjK,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @clawtrail/context-graph-openclaw
3
+ *
4
+ * OpenClaw adapter for @clawtrail/context-graph.
5
+ * Captures agent execution traces as PROV-O events with
6
+ * hash chain integrity and signed submissions.
7
+ */
8
+ // Adapter
9
+ export { OpenClawAdapter } from './OpenClawAdapter.js';
10
+ // Mappers
11
+ export { MapperRegistry } from './mappers/MapperRegistry.js';
12
+ export { ShellMapper } from './mappers/shell.js';
13
+ export { FsMapper } from './mappers/fs.js';
14
+ export { GitMapper } from './mappers/git.js';
15
+ export { FallbackMapper } from './mappers/fallback.js';
16
+ // Detectors
17
+ export { TestDetector } from './detectors/TestDetector.js';
18
+ export { BuildDetector } from './detectors/BuildDetector.js';
19
+ // Hooks
20
+ export { createLifecycleHandlers } from './hooks/lifecycle.js';
21
+ export { createToolCallHandlers } from './hooks/toolCall.js';
22
+ // Rules
23
+ export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool } from './rules/openclaw-rules.js';
24
+ // Tools
25
+ export { getStatus } from './tools/status.js';
26
+ export { summarizeSession } from './tools/summarize.js';
27
+ // Utilities
28
+ export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from './util/hash.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,QAAQ;AACR,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEjK,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MapperRegistry — dispatches tool calls to the appropriate mapper.
3
+ */
4
+ export interface MappedEvent {
5
+ type: string;
6
+ data: Record<string, unknown>;
7
+ }
8
+ export interface EventMapper {
9
+ /** OpenClaw tool names this mapper handles */
10
+ toolNames: string[];
11
+ /** Map tool call start to an event */
12
+ mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
13
+ /** Map tool call end (with result/error) to an event */
14
+ mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, error?: Error): MappedEvent;
15
+ }
16
+ export declare class MapperRegistry {
17
+ private mappers;
18
+ private fallback;
19
+ constructor(fallback: EventMapper);
20
+ /** Register a mapper for its declared tool names */
21
+ register(mapper: EventMapper): void;
22
+ /** Find the mapper for a tool name */
23
+ getMapper(toolName: string): EventMapper;
24
+ /** Map a tool call start */
25
+ mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
26
+ /** Map a tool call end */
27
+ mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, error?: Error): MappedEvent;
28
+ }
29
+ //# sourceMappingURL=MapperRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapperRegistry.d.ts","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;IACzE,wDAAwD;IACxD,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAAc;gBAElB,QAAQ,EAAE,WAAW;IAIjC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMnC,sCAAsC;IACtC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIxC,4BAA4B;IAC5B,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,WAAW;IAId,0BAA0B;IAC1B,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW;CAGf"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MapperRegistry — dispatches tool calls to the appropriate mapper.
3
+ */
4
+ export class MapperRegistry {
5
+ mappers = new Map();
6
+ fallback;
7
+ constructor(fallback) {
8
+ this.fallback = fallback;
9
+ }
10
+ /** Register a mapper for its declared tool names */
11
+ register(mapper) {
12
+ for (const name of mapper.toolNames) {
13
+ this.mappers.set(name, mapper);
14
+ }
15
+ }
16
+ /** Find the mapper for a tool name */
17
+ getMapper(toolName) {
18
+ return this.mappers.get(toolName) ?? this.fallback;
19
+ }
20
+ /** Map a tool call start */
21
+ mapStart(toolName, params) {
22
+ return this.getMapper(toolName).mapStart(toolName, params);
23
+ }
24
+ /** Map a tool call end */
25
+ mapEnd(toolName, params, result, error) {
26
+ return this.getMapper(toolName).mapEnd(toolName, params, result, error);
27
+ }
28
+ }
29
+ //# sourceMappingURL=MapperRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapperRegistry.js","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,MAAM,OAAO,cAAc;IACjB,OAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC9C,QAAQ,CAAc;IAE9B,YAAY,QAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oDAAoD;IACpD,QAAQ,CAAC,MAAmB;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED,4BAA4B;IAC5B,QAAQ,CACN,QAAgB,EAChB,MAA+B;QAE/B,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,0BAA0B;IAC1B,MAAM,CACJ,QAAgB,EAChB,MAA+B,EAC/B,MAAsC,EACtC,KAAa;QAEb,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Fallback mapper — catches any tool not handled by a specific mapper.
3
+ * Produces generic TOOL_CALL events.
4
+ */
5
+ import type { EventMapper, MappedEvent } from './MapperRegistry.js';
6
+ export declare class FallbackMapper implements EventMapper {
7
+ toolNames: never[];
8
+ mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
9
+ mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, error?: Error): MappedEvent;
10
+ }
11
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/mappers/fallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpE,qBAAa,cAAe,YAAW,WAAW;IAChD,SAAS,UAAM;IAEf,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAUxE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW;CAWf"}
@@ -0,0 +1,25 @@
1
+ import { hashArgs, hashContent } from '../util/hash.js';
2
+ export class FallbackMapper {
3
+ toolNames = []; // Never matched directly — used as the registry fallback
4
+ mapStart(toolName, params) {
5
+ return {
6
+ type: 'TOOL_CALL',
7
+ data: {
8
+ tool: toolName,
9
+ args_hash: hashArgs(params),
10
+ },
11
+ };
12
+ }
13
+ mapEnd(toolName, params, result, error) {
14
+ return {
15
+ type: 'TOOL_CALL',
16
+ data: {
17
+ tool: toolName,
18
+ args_hash: hashArgs(params),
19
+ result_hash: result ? hashContent(result) : undefined,
20
+ error_type: error?.name,
21
+ },
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/mappers/fallback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,OAAO,cAAc;IACzB,SAAS,GAAG,EAAE,CAAC,CAAC,yDAAyD;IAEzE,QAAQ,CAAC,QAAgB,EAAE,MAA+B;QACxD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;aAC5B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,QAAgB,EAChB,MAA+B,EAC/B,MAAsC,EACtC,KAAa;QAEb,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;gBAC3B,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrD,UAAU,EAAE,KAAK,EAAE,IAAI;aACxB;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { EventMapper, MappedEvent } from './MapperRegistry.js';
2
+ export declare class FsMapper implements EventMapper {
3
+ toolNames: string[];
4
+ mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
5
+ mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, _error?: Error): MappedEvent;
6
+ }
7
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/mappers/fs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpE,qBAAa,QAAS,YAAW,WAAW;IAC1C,SAAS,WAA6B;IAEtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAcxE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;CAiCf"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Filesystem mapper — maps read/write/edit tool calls to FILE_READ/FILE_WRITE events.
3
+ * File contents are NEVER logged — only hashes, extensions, and byte counts.
4
+ */
5
+ import { extname } from 'node:path';
6
+ import { sha256, mimeFromExtension } from '../util/hash.js';
7
+ export class FsMapper {
8
+ toolNames = ['read', 'write', 'edit'];
9
+ mapStart(toolName, params) {
10
+ const filePath = (params.path || params.file || '');
11
+ const ext = extname(filePath);
12
+ const isRead = toolName === 'read';
13
+ return {
14
+ type: isRead ? 'FILE_READ' : 'FILE_WRITE',
15
+ data: {
16
+ path_hash: sha256(filePath),
17
+ path_extension: ext || undefined,
18
+ },
19
+ };
20
+ }
21
+ mapEnd(toolName, params, result, _error) {
22
+ const filePath = (params.path || params.file || '');
23
+ const ext = extname(filePath);
24
+ if (toolName === 'read') {
25
+ const content = (result?.content || '');
26
+ return {
27
+ type: 'FILE_READ',
28
+ data: {
29
+ path_hash: sha256(filePath),
30
+ path_extension: ext || undefined,
31
+ bytes_read: content.length,
32
+ mime: ext ? mimeFromExtension(ext) : undefined,
33
+ },
34
+ };
35
+ }
36
+ // write or edit
37
+ const diff = (result?.diff || result?.content || '');
38
+ const bytesWritten = result?.bytesWritten ?? diff.length ?? 0;
39
+ return {
40
+ type: 'FILE_WRITE',
41
+ data: {
42
+ path_hash: sha256(filePath),
43
+ path_extension: ext || undefined,
44
+ diff_hash: sha256(diff),
45
+ bytes_written: bytesWritten,
46
+ mime: ext ? mimeFromExtension(ext) : undefined,
47
+ },
48
+ };
49
+ }
50
+ }
51
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/mappers/fs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,OAAO,QAAQ;IACnB,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEtC,QAAQ,CAAC,QAAgB,EAAE,MAA+B;QACxD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAW,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;QAEnC,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;YACzC,IAAI,EAAE;gBACJ,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC3B,cAAc,EAAE,GAAG,IAAI,SAAS;aACjC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,QAAgB,EAChB,MAA+B,EAC/B,MAAsC,EACtC,MAAc;QAEd,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAW,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE9B,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAW,CAAC;YAClD,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE;oBACJ,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;oBAC3B,cAAc,EAAE,GAAG,IAAI,SAAS;oBAChC,UAAU,EAAE,OAAO,CAAC,MAAM;oBAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC/C;aACF,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,OAAO,IAAI,EAAE,CAAW,CAAC;QAC/D,MAAM,YAAY,GACf,MAAM,EAAE,YAAuB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAEvD,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE;gBACJ,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC3B,cAAc,EAAE,GAAG,IAAI,SAAS;gBAChC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;gBACvB,aAAa,EAAE,YAAY;gBAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aAC/C;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Git mapper — maps git tool calls to GIT_DIFF / GIT_COMMIT / generic TOOL_CALL.
3
+ */
4
+ import type { EventMapper, MappedEvent } from './MapperRegistry.js';
5
+ export declare class GitMapper implements EventMapper {
6
+ toolNames: string[];
7
+ mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
8
+ mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, _error?: Error): MappedEvent;
9
+ }
10
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/mappers/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpE,qBAAa,SAAU,YAAW,WAAW;IAC3C,SAAS,WAAW;IAEpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAWxE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;CAwCf"}
@@ -0,0 +1,79 @@
1
+ import { sha256, hashArgs } from '../util/hash.js';
2
+ export class GitMapper {
3
+ toolNames = ['git'];
4
+ mapStart(toolName, params) {
5
+ const subcommand = extractGitSubcommand(params);
6
+ return {
7
+ type: subcommand === 'diff' ? 'GIT_DIFF' : subcommand === 'commit' ? 'GIT_COMMIT' : 'TOOL_CALL',
8
+ data: {
9
+ tool: `git:${subcommand}`,
10
+ args_hash: hashArgs(params),
11
+ },
12
+ };
13
+ }
14
+ mapEnd(toolName, params, result, _error) {
15
+ const subcommand = extractGitSubcommand(params);
16
+ const output = (result?.output || result?.stdout || '');
17
+ if (subcommand === 'diff') {
18
+ const stat = parseDiffStat(output);
19
+ return {
20
+ type: 'GIT_DIFF',
21
+ data: {
22
+ diff_hash: sha256(output),
23
+ files_changed: stat.filesChanged,
24
+ insertions: stat.insertions,
25
+ deletions: stat.deletions,
26
+ },
27
+ };
28
+ }
29
+ if (subcommand === 'commit') {
30
+ const commitHash = parseCommitHash(output);
31
+ const message = (params.message || params.m || '');
32
+ return {
33
+ type: 'GIT_COMMIT',
34
+ data: {
35
+ commit_hash: commitHash,
36
+ message_hash: sha256(message),
37
+ files_changed: parseDiffStat(output).filesChanged,
38
+ },
39
+ };
40
+ }
41
+ // Other git subcommands
42
+ return {
43
+ type: 'TOOL_CALL',
44
+ data: {
45
+ tool: `git:${subcommand}`,
46
+ args_hash: hashArgs(params),
47
+ result_hash: sha256(output),
48
+ },
49
+ };
50
+ }
51
+ }
52
+ // ── Helpers ────────────────────────────────────────────────────────
53
+ function extractGitSubcommand(params) {
54
+ // Support multiple param shapes
55
+ const cmd = (params.command || params.cmd || params.subcommand || '');
56
+ const parts = cmd.trim().split(/\s+/);
57
+ // If first part is "git", take the second
58
+ if (parts[0] === 'git' && parts.length > 1)
59
+ return parts[1];
60
+ return parts[0] || 'unknown';
61
+ }
62
+ function parseDiffStat(output) {
63
+ // "3 files changed, 42 insertions(+), 15 deletions(-)"
64
+ const match = output.match(/(\d+)\s+files?\s+changed(?:,\s+(\d+)\s+insertions?\(\+\))?(?:,\s+(\d+)\s+deletions?\(-\))?/);
65
+ if (match) {
66
+ return {
67
+ filesChanged: Number(match[1]),
68
+ insertions: Number(match[2] || 0),
69
+ deletions: Number(match[3] || 0),
70
+ };
71
+ }
72
+ return { filesChanged: 0, insertions: 0, deletions: 0 };
73
+ }
74
+ function parseCommitHash(output) {
75
+ // "[main abc1234] commit message"
76
+ const match = output.match(/\[[\w/.-]+\s+([a-f0-9]+)\]/);
77
+ return match?.[1] || '';
78
+ }
79
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/mappers/git.ts"],"names":[],"mappings":"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"}