@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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/register.d.ts +35 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +223 -0
- package/dist/register.js.map +1 -0
- package/openclaw.plugin.json +49 -0
- package/package.json +11 -2
- package/skills/context-graph/SKILL.md +32 -0
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/register.js
ADDED
|
@@ -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.
|
|
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.
|