@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.
- package/README.md +252 -0
- package/dist/OpenClawAdapter.d.ts +75 -0
- package/dist/OpenClawAdapter.d.ts.map +1 -0
- package/dist/OpenClawAdapter.js +157 -0
- package/dist/OpenClawAdapter.js.map +1 -0
- package/dist/detectors/BuildDetector.d.ts +17 -0
- package/dist/detectors/BuildDetector.d.ts.map +1 -0
- package/dist/detectors/BuildDetector.js +98 -0
- package/dist/detectors/BuildDetector.js.map +1 -0
- package/dist/detectors/TestDetector.d.ts +19 -0
- package/dist/detectors/TestDetector.d.ts.map +1 -0
- package/dist/detectors/TestDetector.js +133 -0
- package/dist/detectors/TestDetector.js.map +1 -0
- package/dist/hooks/lifecycle.d.ts +29 -0
- package/dist/hooks/lifecycle.d.ts.map +1 -0
- package/dist/hooks/lifecycle.js +26 -0
- package/dist/hooks/lifecycle.js.map +1 -0
- package/dist/hooks/toolCall.d.ts +18 -0
- package/dist/hooks/toolCall.d.ts.map +1 -0
- package/dist/hooks/toolCall.js +34 -0
- package/dist/hooks/toolCall.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/mappers/MapperRegistry.d.ts +29 -0
- package/dist/mappers/MapperRegistry.d.ts.map +1 -0
- package/dist/mappers/MapperRegistry.js +29 -0
- package/dist/mappers/MapperRegistry.js.map +1 -0
- package/dist/mappers/fallback.d.ts +11 -0
- package/dist/mappers/fallback.d.ts.map +1 -0
- package/dist/mappers/fallback.js +25 -0
- package/dist/mappers/fallback.js.map +1 -0
- package/dist/mappers/fs.d.ts +7 -0
- package/dist/mappers/fs.d.ts.map +1 -0
- package/dist/mappers/fs.js +51 -0
- package/dist/mappers/fs.js.map +1 -0
- package/dist/mappers/git.d.ts +10 -0
- package/dist/mappers/git.d.ts.map +1 -0
- package/dist/mappers/git.js +79 -0
- package/dist/mappers/git.js.map +1 -0
- package/dist/mappers/shell.d.ts +16 -0
- package/dist/mappers/shell.d.ts.map +1 -0
- package/dist/mappers/shell.js +75 -0
- package/dist/mappers/shell.js.map +1 -0
- package/dist/rules/openclaw-rules.d.ts +15 -0
- package/dist/rules/openclaw-rules.d.ts.map +1 -0
- package/dist/rules/openclaw-rules.js +175 -0
- package/dist/rules/openclaw-rules.js.map +1 -0
- package/dist/tools/status.d.ts +14 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +21 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/summarize.d.ts +17 -0
- package/dist/tools/summarize.d.ts.map +1 -0
- package/dist/tools/summarize.js +30 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/util/hash.d.ts +23 -0
- package/dist/util/hash.d.ts.map +1 -0
- package/dist/util/hash.js +83 -0
- package/dist/util/hash.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|