@clawtrail/context-graph-openclaw 0.1.0 → 0.3.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/dist/index.d.ts CHANGED
@@ -27,4 +27,5 @@ export type { StatusResult } from './tools/status.js';
27
27
  export { summarizeSession } from './tools/summarize.js';
28
28
  export type { SummarizeResult } from './tools/summarize.js';
29
29
  export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from './util/hash.js';
30
+ export { default as register } from './register.js';
30
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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;AAGpI,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -26,4 +26,6 @@ export { getStatus } from './tools/status.js';
26
26
  export { summarizeSession } from './tools/summarize.js';
27
27
  // Utilities
28
28
  export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from './util/hash.js';
29
+ // OpenClaw Plugin Entry Point
30
+ export { default as register } from './register.js';
29
31
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
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;AAEpI,8BAA8B;AAC9B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** Hook event names as defined in OpenClaw's PluginHookName type */
2
+ type HookName = 'message_received' | 'tool_result_persist' | 'after_tool_call' | 'session_start' | 'session_end' | 'before_reset' | 'agent_end' | 'gateway_stop';
3
+ interface PluginApi {
4
+ config?: {
5
+ plugins?: {
6
+ entries?: Record<string, {
7
+ enabled?: boolean;
8
+ config?: Record<string, unknown>;
9
+ }>;
10
+ };
11
+ };
12
+ logger?: {
13
+ info(...args: unknown[]): void;
14
+ warn(...args: unknown[]): void;
15
+ error(...args: unknown[]): void;
16
+ };
17
+ /** Legacy hook registration — requires config.hooks.internal.enabled */
18
+ registerHook?(eventName: string, handler: (event: Record<string, unknown>) => Promise<void> | void, meta?: {
19
+ name?: string;
20
+ description?: string;
21
+ }): void;
22
+ /** Typed hook registration — always active (OpenClaw 2026.2+) */
23
+ on?(hookName: HookName, handler: (...args: unknown[]) => Promise<void> | void, opts?: {
24
+ priority?: number;
25
+ }): void;
26
+ registerTool?(tool: {
27
+ name: string;
28
+ description: string;
29
+ parameters: Record<string, unknown>;
30
+ handler: (params: Record<string, unknown>, ctx: Record<string, unknown>) => Promise<unknown>;
31
+ }): void;
32
+ }
33
+ export default function register(api: PluginApi): void;
34
+ export {};
35
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,KAAK,QAAQ,GACT,kBAAkB,GAClB,qBAAqB,GACrB,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,cAAc,GACd,WAAW,GACX,cAAc,CAAC;AAEnB,UAAU,SAAS;IACjB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EACN;gBAAE,OAAO,CAAC,EAAE,OAAO,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAAE,CACxD,CAAC;SACH,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC;IACF,wEAAwE;IACxE,YAAY,CAAC,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EACjE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,IAAI,CAAC;IACR,iEAAiE;IACjE,EAAE,CAAC,CACD,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EACrD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,IAAI,CAAC;IACR,YAAY,CAAC,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;KACvB,GAAG,IAAI,CAAC;CACV;AA2GD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CA4LrD"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * OpenClaw Plugin Entry Point
3
+ *
4
+ * Wires the context-graph adapter into OpenClaw's hook-based plugin system.
5
+ * Registers hooks for session lifecycle approximation and tool call capture,
6
+ * and optionally auto-submits signed provenance to the ClawTrail API.
7
+ */
8
+ import { OpenClawAdapter } from './OpenClawAdapter.js';
9
+ // ── Helpers ──────────────────────────────────────────────────────────
10
+ const TAG = '[context-graph]';
11
+ function log(api, level, ...args) {
12
+ if (api.logger?.[level]) {
13
+ api.logger[level](TAG, ...args);
14
+ }
15
+ else {
16
+ console[level](TAG, ...args);
17
+ }
18
+ }
19
+ function createSessionContext(sessionKey, initialMessage, agentId) {
20
+ const store = new Map();
21
+ return {
22
+ sessionKey,
23
+ initialMessage,
24
+ agentId,
25
+ set: (key, value) => store.set(key, value),
26
+ get: (key) => store.get(key),
27
+ };
28
+ }
29
+ // ── Auto-submit to ClawTrail API ────────────────────────────────────
30
+ async function submitToClawTrail(adapter, sessionId, submitUrl, apiKey, api) {
31
+ const MAX_RETRIES = 1;
32
+ const RETRY_DELAY = 2000;
33
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
34
+ try {
35
+ const { signed } = await adapter.summarizeAndSign(sessionId);
36
+ if (!signed) {
37
+ log(api, 'warn', 'No signed submission produced — skipping auto-submit');
38
+ return;
39
+ }
40
+ const response = await fetch(submitUrl, {
41
+ method: 'POST',
42
+ headers: {
43
+ 'Content-Type': 'application/json',
44
+ Authorization: `Bearer ${apiKey}`,
45
+ },
46
+ body: JSON.stringify(signed),
47
+ signal: AbortSignal.timeout(30_000),
48
+ });
49
+ if (response.ok) {
50
+ const result = (await response.json());
51
+ log(api, 'info', `Submitted session ${sessionId}:`, `submissionId=${result.submissionId},`, `claims=${result.claimsExtracted}`);
52
+ return;
53
+ }
54
+ const errorBody = await response.text().catch(() => '');
55
+ log(api, 'warn', `Submit failed (HTTP ${response.status}):`, errorBody.slice(0, 200));
56
+ // Don't retry client errors (bad request, auth failure, etc.)
57
+ if (response.status >= 400 && response.status < 500)
58
+ return;
59
+ }
60
+ catch (err) {
61
+ log(api, 'warn', `Submit error (attempt ${attempt + 1}):`, err instanceof Error ? err.message : String(err));
62
+ }
63
+ if (attempt < MAX_RETRIES) {
64
+ await new Promise((r) => setTimeout(r, RETRY_DELAY));
65
+ }
66
+ }
67
+ }
68
+ // ── Plugin Register Function ────────────────────────────────────────
69
+ export default function register(api) {
70
+ // 1. Read config
71
+ const pluginEntry = api.config?.plugins?.entries?.['context-graph'];
72
+ const cfg = (pluginEntry?.config ?? {});
73
+ if (cfg.enabled === false)
74
+ return;
75
+ // 2. Create adapter
76
+ const adapter = new OpenClawAdapter({
77
+ enabled: true,
78
+ contextGraphRoot: cfg.contextGraphRoot ?? '.context-graph',
79
+ agentId: cfg.agentId,
80
+ policyPath: cfg.policyPath,
81
+ detectTests: cfg.detectTests ?? true,
82
+ detectBuilds: cfg.detectBuilds ?? true,
83
+ signingKeyPath: cfg.signingKeyPath,
84
+ });
85
+ // 3. Session map — keyed by OpenClaw sessionKey
86
+ const sessions = new Map();
87
+ // Helper: end session and optionally submit
88
+ async function endSessionAndSubmit(sessionKey) {
89
+ const state = sessions.get(sessionKey);
90
+ if (!state)
91
+ return;
92
+ try {
93
+ await adapter.onSessionEnd(state.ctx);
94
+ const submitUrl = cfg.submitUrl;
95
+ const apiKey = cfg.apiKey;
96
+ const autoSubmit = cfg.autoSubmit !== false; // default true
97
+ if (autoSubmit && submitUrl && apiKey) {
98
+ await submitToClawTrail(adapter, state.sessionId, submitUrl, apiKey, api);
99
+ }
100
+ }
101
+ catch (err) {
102
+ log(api, 'error', 'Error ending session:', err);
103
+ }
104
+ finally {
105
+ sessions.delete(sessionKey);
106
+ }
107
+ }
108
+ // ── Require api.on() — the typed hook API (OpenClaw 2026.2+) ───────
109
+ if (typeof api.on !== 'function') {
110
+ log(api, 'warn', 'api.on() not available — hooks will not fire. Upgrade OpenClaw to 2026.2+');
111
+ return;
112
+ }
113
+ const on = api.on; // bind for TS narrowing
114
+ // ── Hook: message_received → lazy session start ───────────────────
115
+ on('message_received', async (...args) => {
116
+ try {
117
+ const event = (args[0] ?? {});
118
+ const ctx2 = (args[1] ?? {});
119
+ const key = ctx2.sessionKey || event.sessionKey || 'default';
120
+ if (sessions.has(key))
121
+ return;
122
+ const msg = event.content ||
123
+ event.text ||
124
+ 'session';
125
+ const ctx = createSessionContext(key, msg, cfg.agentId);
126
+ const session = await adapter.onSessionStart(ctx);
127
+ sessions.set(key, {
128
+ ctx,
129
+ sessionId: session.meta.session_id,
130
+ startedAt: Date.now(),
131
+ });
132
+ log(api, 'info', `Session started: ${session.meta.session_id}`);
133
+ }
134
+ catch (err) {
135
+ log(api, 'warn', 'Failed to start session:', err);
136
+ }
137
+ });
138
+ // ── Hook: tool_result_persist → capture tool call ─────────────────
139
+ on('tool_result_persist', async (...args) => {
140
+ try {
141
+ const event = (args[0] ?? {});
142
+ const ctx2 = (args[1] ?? {});
143
+ const key = ctx2.sessionKey || event.sessionKey || 'default';
144
+ const state = sessions.get(key);
145
+ if (!state)
146
+ return;
147
+ // Defensively read tool info from multiple possible paths
148
+ const context = event.context;
149
+ const toolName = (context?.toolName ??
150
+ event.toolName ??
151
+ 'unknown');
152
+ const params = (context?.params ??
153
+ event.params ??
154
+ {});
155
+ const result = (context?.result ??
156
+ event.result ??
157
+ {});
158
+ const durationMs = (context?.durationMs ??
159
+ event.durationMs);
160
+ const error = event.error
161
+ ? event.error instanceof Error
162
+ ? event.error
163
+ : new Error(String(event.error))
164
+ : undefined;
165
+ const toolEvent = {
166
+ toolName,
167
+ params,
168
+ result,
169
+ error,
170
+ durationMs,
171
+ };
172
+ await adapter.onAfterToolCall(toolEvent, state.ctx);
173
+ }
174
+ catch (err) {
175
+ log(api, 'warn', 'Failed to capture tool result:', err);
176
+ }
177
+ });
178
+ // ── Hooks: session_end, before_reset, agent_end → end session ─────
179
+ for (const hookName of ['session_end', 'before_reset', 'agent_end']) {
180
+ on(hookName, async (...args) => {
181
+ const event = (args[0] ?? {});
182
+ const ctx2 = (args[1] ?? {});
183
+ const key = ctx2.sessionKey || event.sessionKey || 'default';
184
+ await endSessionAndSubmit(key);
185
+ });
186
+ }
187
+ // ── Agent tools (optional — depends on api.registerTool) ──────────
188
+ if (typeof api.registerTool === 'function') {
189
+ api.registerTool({
190
+ name: 'context_graph_status',
191
+ description: 'Check current context graph session status, event count, and capture health.',
192
+ parameters: { type: 'object', properties: {} },
193
+ handler: async (_params, ctx) => {
194
+ const key = ctx.sessionKey || 'default';
195
+ const state = sessions.get(key);
196
+ return adapter.getStatus(state?.sessionId);
197
+ },
198
+ });
199
+ api.registerTool({
200
+ name: 'context_graph_summarize',
201
+ description: 'Generate metrics and derived claims for the current session.',
202
+ parameters: { type: 'object', properties: {} },
203
+ handler: async (_params, ctx) => {
204
+ const key = ctx.sessionKey || 'default';
205
+ const state = sessions.get(key);
206
+ if (!state)
207
+ return { status: 'no_active_session' };
208
+ const { summary, signed } = await adapter.summarizeAndSign(state.sessionId);
209
+ return {
210
+ ...summary,
211
+ signed: signed
212
+ ? {
213
+ payloadHash: signed.payloadHash,
214
+ agentId: signed.agentId,
215
+ }
216
+ : undefined,
217
+ };
218
+ },
219
+ });
220
+ }
221
+ log(api, 'info', 'Plugin registered — provenance capture active');
222
+ }
223
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ {
2
+ "id": "context-graph",
3
+ "name": "Context Graph — Verifiable Agent Provenance",
4
+ "version": "0.3.0",
5
+ "description": "Captures agent execution traces as PROV-O context graphs with hash chain integrity and signed submissions.",
6
+ "configSchema": {
7
+ "type": "object",
8
+ "properties": {
9
+ "enabled": { "type": "boolean", "default": true },
10
+ "autoCapture": { "type": "boolean", "default": true },
11
+ "policyPath": { "type": "string" },
12
+ "agentId": { "type": "string" },
13
+ "contextGraphRoot": {
14
+ "type": "string",
15
+ "default": ".context-graph",
16
+ "description": "Path to context-graph storage directory"
17
+ },
18
+ "detectTests": { "type": "boolean", "default": true },
19
+ "detectBuilds": { "type": "boolean", "default": true },
20
+ "signingKeyPath": {
21
+ "type": "string",
22
+ "description": "Path to Ed25519 signing key (auto-generated if missing)"
23
+ },
24
+ "submitUrl": {
25
+ "type": "string",
26
+ "description": "ClawTrail API endpoint for submitting signed context graphs"
27
+ },
28
+ "apiKey": {
29
+ "type": "string",
30
+ "description": "ClawTrail agent API key for authentication"
31
+ },
32
+ "autoSubmit": {
33
+ "type": "boolean",
34
+ "default": true,
35
+ "description": "Automatically submit signed context graph after each session ends"
36
+ },
37
+ "environment": {
38
+ "type": "string",
39
+ "enum": ["staging", "production"],
40
+ "default": "production",
41
+ "description": "ClawTrail environment"
42
+ }
43
+ }
44
+ },
45
+ "uiHints": {
46
+ "apiKey": { "label": "ClawTrail API Key", "sensitive": true }
47
+ },
48
+ "skills": ["skills"]
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawtrail/context-graph-openclaw",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "OpenClaw adapter for @clawtrail/context-graph — captures agent execution traces as PROV-O events",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,8 +9,15 @@
9
9
  ".": {
10
10
  "import": "./dist/index.js",
11
11
  "types": "./dist/index.d.ts"
12
+ },
13
+ "./register": {
14
+ "import": "./dist/register.js",
15
+ "types": "./dist/register.d.ts"
12
16
  }
13
17
  },
18
+ "openclaw": {
19
+ "extensions": ["./dist/register.js"]
20
+ },
14
21
  "scripts": {
15
22
  "build": "tsc",
16
23
  "dev": "tsc --watch",
@@ -28,7 +35,9 @@
28
35
  ],
29
36
  "license": "MIT",
30
37
  "files": [
31
- "dist"
38
+ "dist",
39
+ "openclaw.plugin.json",
40
+ "skills"
32
41
  ],
33
42
  "engines": {
34
43
  "node": ">=20"
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: context-graph
3
+ description: Verifiable provenance tracking for your agent work sessions
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Context Graph — Verifiable Provenance
8
+
9
+ You have Context Graph installed. It automatically captures your tool calls
10
+ into a local, tamper-evident provenance graph.
11
+
12
+ ## What It Does
13
+
14
+ - Every tool call you make (file reads/writes, shell commands, git operations)
15
+ is recorded as a PROV-O event with a hash chain.
16
+ - Test runs and builds are automatically detected and tracked with pass/fail metrics.
17
+ - At session end, claims are derived from your work (e.g., "CanFixBuild", "CanRunTests").
18
+ - All data is local by default. Nothing leaves the machine without explicit action.
19
+ - Submissions are signed with Ed25519 for non-repudiation.
20
+
21
+ ## Available Tools
22
+
23
+ - `context-graph.status`: Check current session status, event count, and capture health.
24
+ - `context-graph.summarize`: Generate metrics and claims for the current session.
25
+
26
+ ## Guidelines
27
+
28
+ - Context Graph captures your tool calls automatically. No action needed from you.
29
+ - When the user asks about your work history or session progress, use `context-graph.status`.
30
+ - When the user asks for a summary of your work, use `context-graph.summarize`.
31
+ - Never include raw code, secrets, or file contents in notes. Redaction is handled automatically.
32
+ - Privacy: file contents are never logged. Diffs and commands are hashed, not stored.