@clawtrail/context-graph-openclaw 0.1.0 → 0.2.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,28 @@
1
+ interface PluginApi {
2
+ config?: {
3
+ plugins?: {
4
+ entries?: Record<string, {
5
+ enabled?: boolean;
6
+ config?: Record<string, unknown>;
7
+ }>;
8
+ };
9
+ };
10
+ logger?: {
11
+ info(...args: unknown[]): void;
12
+ warn(...args: unknown[]): void;
13
+ error(...args: unknown[]): void;
14
+ };
15
+ registerHook(eventName: string, handler: (event: Record<string, unknown>) => Promise<void> | void, meta?: {
16
+ name?: string;
17
+ description?: string;
18
+ }): void;
19
+ registerTool?(tool: {
20
+ name: string;
21
+ description: string;
22
+ parameters: Record<string, unknown>;
23
+ handler: (params: Record<string, unknown>, ctx: Record<string, unknown>) => Promise<unknown>;
24
+ }): void;
25
+ }
26
+ export default function register(api: PluginApi): void;
27
+ export {};
28
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAaA,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,YAAY,CACV,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,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,CA+LrD"}
@@ -0,0 +1,222 @@
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
+ // ── Hook: message:received → lazy session start ───────────────────
109
+ // When OpenClaw adds session:start, that will fire first and this
110
+ // becomes a no-op (sessions.has check prevents double-start).
111
+ api.registerHook('message:received', async (event) => {
112
+ try {
113
+ const key = event.sessionKey || 'default';
114
+ if (sessions.has(key))
115
+ return;
116
+ const msg = event.content ||
117
+ event.text ||
118
+ 'session';
119
+ const ctx = createSessionContext(key, msg, cfg.agentId);
120
+ const session = await adapter.onSessionStart(ctx);
121
+ sessions.set(key, {
122
+ ctx,
123
+ sessionId: session.meta.session_id,
124
+ startedAt: Date.now(),
125
+ });
126
+ log(api, 'info', `Session started: ${session.meta.session_id}`);
127
+ }
128
+ catch (err) {
129
+ log(api, 'warn', 'Failed to start session:', err);
130
+ }
131
+ }, {
132
+ name: 'context-graph.session-start',
133
+ description: 'Start context-graph capture on first message in a session',
134
+ });
135
+ // ── Hook: tool_result_persist → capture tool call ─────────────────
136
+ api.registerHook('tool_result_persist', async (event) => {
137
+ try {
138
+ const key = event.sessionKey || 'default';
139
+ const state = sessions.get(key);
140
+ if (!state)
141
+ return;
142
+ // Defensively read tool info from multiple possible paths
143
+ const context = event.context;
144
+ const toolName = (context?.toolName ??
145
+ event.toolName ??
146
+ 'unknown');
147
+ const params = (context?.params ??
148
+ event.params ??
149
+ {});
150
+ const result = (context?.result ??
151
+ event.result ??
152
+ {});
153
+ const durationMs = (context?.durationMs ??
154
+ event.durationMs);
155
+ const error = event.error
156
+ ? event.error instanceof Error
157
+ ? event.error
158
+ : new Error(String(event.error))
159
+ : undefined;
160
+ const toolEvent = {
161
+ toolName,
162
+ params,
163
+ result,
164
+ error,
165
+ durationMs,
166
+ };
167
+ await adapter.onAfterToolCall(toolEvent, state.ctx);
168
+ }
169
+ catch (err) {
170
+ log(api, 'warn', 'Failed to capture tool result:', err);
171
+ }
172
+ }, {
173
+ name: 'context-graph.capture-tool',
174
+ description: 'Capture tool call results into context graph provenance chain',
175
+ });
176
+ // ── Hooks: command:new, command:reset, command:stop → end session ──
177
+ for (const hookName of ['command:new', 'command:reset', 'command:stop']) {
178
+ api.registerHook(hookName, async (event) => {
179
+ const key = event.sessionKey || 'default';
180
+ await endSessionAndSubmit(key);
181
+ }, {
182
+ name: `context-graph.end-on-${hookName.replace(':', '-')}`,
183
+ description: `End context-graph session and submit provenance on ${hookName}`,
184
+ });
185
+ }
186
+ // ── Agent tools (optional — depends on api.registerTool) ──────────
187
+ if (typeof api.registerTool === 'function') {
188
+ api.registerTool({
189
+ name: 'context_graph_status',
190
+ description: 'Check current context graph session status, event count, and capture health.',
191
+ parameters: { type: 'object', properties: {} },
192
+ handler: async (_params, ctx) => {
193
+ const key = ctx.sessionKey || 'default';
194
+ const state = sessions.get(key);
195
+ return adapter.getStatus(state?.sessionId);
196
+ },
197
+ });
198
+ api.registerTool({
199
+ name: 'context_graph_summarize',
200
+ description: 'Generate metrics and derived claims for the current session.',
201
+ parameters: { type: 'object', properties: {} },
202
+ handler: async (_params, ctx) => {
203
+ const key = ctx.sessionKey || 'default';
204
+ const state = sessions.get(key);
205
+ if (!state)
206
+ return { status: 'no_active_session' };
207
+ const { summary, signed } = await adapter.summarizeAndSign(state.sessionId);
208
+ return {
209
+ ...summary,
210
+ signed: signed
211
+ ? {
212
+ payloadHash: signed.payloadHash,
213
+ agentId: signed.agentId,
214
+ }
215
+ : undefined,
216
+ };
217
+ },
218
+ });
219
+ }
220
+ log(api, 'info', 'Plugin registered — provenance capture active');
221
+ }
222
+ //# 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.2.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.2.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.