@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/LICENSE +1 -1
- package/dist/index.cjs +1296 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +1273 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +19 -14
- package/dist/emitter.js +0 -197
- package/dist/emitter.js.map +0 -1
- package/dist/hooks.js +0 -157
- package/dist/hooks.js.map +0 -1
- package/dist/index.js +0 -53
- package/dist/index.js.map +0 -1
- package/dist/mapper.js +0 -320
- package/dist/mapper.js.map +0 -1
- package/dist/plugin.js +0 -331
- package/dist/plugin.js.map +0 -1
- package/dist/tools.js +0 -732
- package/dist/tools.js.map +0 -1
- package/dist/types.js +0 -57
- package/dist/types.js.map +0 -1
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
|
package/dist/plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|