@peac/adapter-openclaw 0.10.9 → 0.10.10

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/plugin.js DELETED
@@ -1,331 +0,0 @@
1
- "use strict";
2
- /**
3
- * @peac/adapter-openclaw - Plugin Entry Point
4
- *
5
- * OpenClaw plugin types and utilities for PEAC receipts.
6
- * This module provides types and factory functions for OpenClaw integration.
7
- *
8
- * Note: Full plugin activation requires OpenClaw's plugin runtime.
9
- * The types and utilities here allow building custom integrations.
10
- */
11
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- var desc = Object.getOwnPropertyDescriptor(m, k);
14
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
- desc = { enumerable: true, get: function() { return m[k]; } };
16
- }
17
- Object.defineProperty(o, k2, desc);
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
26
- });
27
- var __importStar = (this && this.__importStar) || (function () {
28
- var ownKeys = function(o) {
29
- ownKeys = Object.getOwnPropertyNames || function (o) {
30
- var ar = [];
31
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
- return ar;
33
- };
34
- return ownKeys(o);
35
- };
36
- return function (mod) {
37
- if (mod && mod.__esModule) return mod;
38
- var result = {};
39
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
- __setModuleDefault(result, mod);
41
- return result;
42
- };
43
- })();
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.createJwkSigner = createJwkSigner;
46
- exports.resolveSigner = resolveSigner;
47
- exports.generateKeyId = generateKeyId;
48
- exports.createFileReceiptWriter = createFileReceiptWriter;
49
- exports.createPluginInstance = createPluginInstance;
50
- const capture_core_1 = require("@peac/capture-core");
51
- const crypto_1 = require("@peac/crypto");
52
- const hooks_js_1 = require("./hooks.js");
53
- const emitter_js_1 = require("./emitter.js");
54
- // =============================================================================
55
- // Signer Creation
56
- // =============================================================================
57
- /**
58
- * Create a signer from a JWK private key.
59
- *
60
- * @param jwk - Ed25519 private key in JWK format
61
- * @param issuer - Issuer URI for receipts
62
- * @param audience - Optional audience URI
63
- * @returns Signer instance
64
- */
65
- function createJwkSigner(jwk, issuer, audience) {
66
- const kid = jwk.kid || generateKeyId(jwk);
67
- // Extract the private key bytes from JWK
68
- if (!jwk.d) {
69
- throw new Error('JWK must include private key (d parameter)');
70
- }
71
- // Decode base64url to get raw key bytes
72
- const privateKeyBytes = (0, crypto_1.base64urlDecode)(jwk.d);
73
- return {
74
- async sign(payload) {
75
- return (0, crypto_1.sign)(payload, privateKeyBytes, kid);
76
- },
77
- getKeyId() {
78
- return kid;
79
- },
80
- getIssuer() {
81
- return issuer;
82
- },
83
- getAudience() {
84
- return audience;
85
- },
86
- };
87
- }
88
- /**
89
- * Resolve a signer from a key reference string.
90
- *
91
- * Supported formats:
92
- * - env:VAR_NAME - Load key from environment variable
93
- * - file:/path - Load from file (development only)
94
- *
95
- * @param keyRef - Key reference string
96
- * @param issuer - Issuer URI
97
- * @param audience - Optional audience URI
98
- * @returns Promise resolving to Signer
99
- */
100
- async function resolveSigner(keyRef, issuer, audience) {
101
- const colonIndex = keyRef.indexOf(':');
102
- if (colonIndex === -1) {
103
- throw new Error(`Invalid key reference format: ${keyRef}. Expected scheme:value`);
104
- }
105
- const scheme = keyRef.slice(0, colonIndex);
106
- const value = keyRef.slice(colonIndex + 1);
107
- switch (scheme) {
108
- case 'env': {
109
- const keyData = process.env[value];
110
- if (!keyData) {
111
- throw new Error(`Environment variable ${value} not set for signing key`);
112
- }
113
- const jwk = JSON.parse(keyData);
114
- return createJwkSigner(jwk, issuer, audience);
115
- }
116
- case 'file': {
117
- const fs = await Promise.resolve().then(() => __importStar(require('fs')));
118
- const keyData = await fs.promises.readFile(value, 'utf-8');
119
- const jwk = JSON.parse(keyData);
120
- return createJwkSigner(jwk, issuer, audience);
121
- }
122
- case 'keychain':
123
- throw new Error('Keychain signing not yet implemented. Use env: for development.');
124
- case 'sidecar':
125
- throw new Error('Sidecar signing not yet implemented. Use env: for development.');
126
- default:
127
- throw new Error(`Unknown key reference scheme: ${scheme}. Use env: or file:`);
128
- }
129
- }
130
- /**
131
- * Generate a key ID from a JWK by hashing its public components.
132
- */
133
- function generateKeyId(jwk) {
134
- const publicPart = jwk.x || '';
135
- let hash = 0;
136
- for (let i = 0; i < publicPart.length; i++) {
137
- const char = publicPart.charCodeAt(i);
138
- hash = (hash << 5) - hash + char;
139
- hash = hash & hash;
140
- }
141
- return `k_${Math.abs(hash).toString(16).padStart(8, '0')}`;
142
- }
143
- // =============================================================================
144
- // Receipt Writer
145
- // =============================================================================
146
- /**
147
- * Create a file system receipt writer with atomic writes.
148
- *
149
- * Writes are atomic: write to .tmp, fsync, rename. This ensures
150
- * partially written files are never observable.
151
- *
152
- * @param outputDir - Directory for receipt files
153
- * @returns Promise resolving to ReceiptWriter
154
- */
155
- async function createFileReceiptWriter(outputDir) {
156
- const fs = await Promise.resolve().then(() => __importStar(require('fs')));
157
- const pathModule = await Promise.resolve().then(() => __importStar(require('path')));
158
- // Use path.resolve for portability
159
- const resolvedOutputDir = pathModule.resolve(outputDir);
160
- // Ensure directory exists
161
- await fs.promises.mkdir(resolvedOutputDir, { recursive: true });
162
- return {
163
- async write(receipt) {
164
- const filename = `${receipt.rid}.peac.json`;
165
- const filepath = pathModule.join(resolvedOutputDir, filename);
166
- const tempPath = `${filepath}.tmp`;
167
- const content = JSON.stringify({
168
- rid: receipt.rid,
169
- interaction_id: receipt.interaction_id,
170
- entry_digest: receipt.entry_digest,
171
- _jws: receipt.jws,
172
- }, null, 2);
173
- // Atomic write: write to .tmp, fsync, rename, fsync dir
174
- await fs.promises.writeFile(tempPath, content, 'utf-8');
175
- // fsync file for durability (open, sync, close)
176
- const fd = await fs.promises.open(tempPath, 'r');
177
- await fd.sync();
178
- await fd.close();
179
- // Atomic rename (POSIX guarantees atomicity)
180
- await fs.promises.rename(tempPath, filepath);
181
- // fsync parent directory for full crash durability (POSIX best practice)
182
- // This ensures the rename is persisted even on power loss
183
- // Best-effort: may fail on some platforms (Windows, network FS)
184
- try {
185
- const dirFd = await fs.promises.open(resolvedOutputDir, 'r');
186
- await dirFd.sync();
187
- await dirFd.close();
188
- }
189
- catch {
190
- // Directory fsync not supported on this platform - continue anyway
191
- // Receipt is still atomic via rename, just not fully durable on power loss
192
- }
193
- return filepath;
194
- },
195
- async close() {
196
- // No-op for file writer
197
- },
198
- };
199
- }
200
- /**
201
- * Create a plugin instance.
202
- *
203
- * @param options - Plugin options
204
- * @returns Plugin instance
205
- */
206
- async function createPluginInstance(options) {
207
- const { signer, writer, adapterConfig, store, dedupe, drainIntervalMs = 1000, batchSize = 100, onError, } = options;
208
- // Create hasher
209
- const hasher = await (0, capture_core_1.createHasher)();
210
- // Create capture session
211
- const session = (0, capture_core_1.createCaptureSession)({
212
- store,
213
- dedupe,
214
- hasher,
215
- });
216
- // Track stats
217
- const stats = {
218
- totalCaptured: 0,
219
- duplicatesSkipped: 0,
220
- pendingCount: 0,
221
- totalEmitted: 0,
222
- totalErrors: 0,
223
- keyId: signer.getKeyId(),
224
- isRunning: false,
225
- };
226
- // Create hook handler
227
- const hookHandler = (0, hooks_js_1.createHookHandler)({
228
- session,
229
- config: adapterConfig,
230
- onCapture: (result) => {
231
- if (result.success) {
232
- stats.totalCaptured++;
233
- stats.pendingCount++;
234
- }
235
- else {
236
- stats.duplicatesSkipped++;
237
- }
238
- },
239
- });
240
- // Create receipt emitter
241
- const emitter = (0, emitter_js_1.createReceiptEmitter)({
242
- signer,
243
- writer,
244
- onEmit: (result) => {
245
- if (result.success) {
246
- stats.totalEmitted++;
247
- stats.pendingCount = Math.max(0, stats.pendingCount - 1);
248
- }
249
- },
250
- onError: (error) => {
251
- stats.totalErrors++;
252
- if (onError)
253
- onError(error);
254
- },
255
- });
256
- // Track last emitted sequence for cursor-based emission
257
- // This is the in-memory cursor; on restart, we rebuild from dedupe index
258
- let lastEmittedSequence = 0;
259
- // Mutex to prevent overlapping drain cycles
260
- let drainInProgress = false;
261
- // Create background service with proper cursor tracking
262
- // Note: For full restart safety, the dedupe index should be persistent.
263
- // The getPendingEntries filters out already-emitted entries using the dedupe index.
264
- const backgroundService = (0, emitter_js_1.createBackgroundService)({
265
- emitter,
266
- drainIntervalMs,
267
- getPendingEntries: async () => {
268
- // Prevent overlapping drain cycles
269
- if (drainInProgress)
270
- return [];
271
- drainInProgress = true;
272
- try {
273
- // Read entries after the last emitted sequence
274
- const currentSequence = await store.getSequence();
275
- if (currentSequence <= lastEmittedSequence)
276
- return [];
277
- // Read from cursor position
278
- const entries = await store.read(lastEmittedSequence, batchSize);
279
- // Filter out entries that are already emitted (restart safety)
280
- // This uses the persistent dedupe index as source of truth
281
- const pending = [];
282
- for (const entry of entries) {
283
- if (entry.sequence <= lastEmittedSequence)
284
- continue;
285
- // Check if already emitted in dedupe index
286
- const dedupeEntry = await dedupe.get(entry.action.id);
287
- if (dedupeEntry?.emitted)
288
- continue;
289
- pending.push(entry);
290
- }
291
- return pending;
292
- }
293
- finally {
294
- drainInProgress = false;
295
- }
296
- },
297
- markEmitted: async (digest) => {
298
- // Find the entry with this digest and update cursor
299
- const entries = await store.read(lastEmittedSequence, batchSize);
300
- const entry = entries.find((e) => e.entry_digest === digest);
301
- if (entry) {
302
- // Update in-memory cursor
303
- if (entry.sequence > lastEmittedSequence) {
304
- lastEmittedSequence = entry.sequence;
305
- }
306
- // Mark in persistent dedupe index (restart-safe)
307
- await dedupe.markEmitted(entry.action.id);
308
- }
309
- },
310
- onError,
311
- });
312
- return {
313
- session,
314
- hookHandler,
315
- backgroundService,
316
- start() {
317
- stats.isRunning = true;
318
- backgroundService.start();
319
- },
320
- async stop() {
321
- backgroundService.stop();
322
- await backgroundService.drain();
323
- await hookHandler.close();
324
- stats.isRunning = false;
325
- },
326
- getStats() {
327
- return { ...stats };
328
- },
329
- };
330
- }
331
- //# sourceMappingURL=plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}