@farmslot/recipe-runner 0.23.0 → 0.25.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/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ All notable changes to `@farmslot/recipe-runner` (published as `@farmslot/recipe
6
6
 
7
7
  - Active-development baseline; add user-facing changes here before release or package publication.
8
8
 
9
+ ## 0.25.0 - 2026-10-06
10
+
11
+ - The library digest (`digestRecipeLibrary`) covers every file under each declared adapter module's directory, not only the module file, so a plugin's helper files move it. A module at the library root contributes itself and the library's `actions/`, not the whole root. Add `libraryAdapterFiles(root, declaration)` (the module's directory plus the library's `actions/`, the files a host lets the plugin import) and `digestLibraryAdapter(root, declaration)` for one plugin. The module's directory is listed strictly (`listLibraryFiles(root, directory, { strict: true })`): dot-files are digested, and a `node_modules`, a symlinked directory, or more than `MAX_LIBRARY_ADAPTER_FILES` (1,000) files fails with `RECIPE_SOURCE_INVALID`.
12
+ - Publish with protocol 0.34.0.
13
+
14
+ ## 0.24.0 - 2026-10-05
15
+
16
+ - Add `@farmslot/recipe-runner/cdp-broker`: the CDP broker that shares one inspector connection between bridge commands and long-lived collectors, moved from mm-harness. Both React Native and browser-extension network capture use it.
17
+ - Publish with protocol 0.34.0.
18
+
9
19
  ## 0.23.0 - 2026-10-04
10
20
 
11
21
  - **Breaking:** renamed from `@farmslot/recipe-harness`. Run provenance, the bundled recipe source and the packages a library's `requires` can name now report `@farmslot/recipe-runner`. `RECIPE_HARNESS_VERSION`, `runRecipeHarnessCli`, `createRecipeHarnessProgram` and `RecipeHarnessCliOptions` are now `RECIPE_RUNNER_VERSION`, `runRecipeRunnerCli`, `createRecipeRunnerProgram` and `RecipeRunnerCliOptions`. There is no `@farmslot/recipe-harness` alias package.
@@ -0,0 +1,991 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const { createHash, randomUUID } = require('node:crypto');
5
+ const net = require('node:net');
6
+ const path = require('node:path');
7
+
8
+ const DEFAULT_MAX_REQUESTS = 1000;
9
+ const DEFAULT_MAX_DURATION_MS = 5 * 60 * 1000;
10
+ const MAX_CAPTURE_DURATION_MS = 60 * 60 * 1000;
11
+ const MAX_ACTIVE_CAPTURES = 16;
12
+ const MAX_COMPLETED_CAPTURES = 16;
13
+ const MAX_CAPTURE_BYTES = 4 * 1024 * 1024;
14
+ const MAX_POST_DATA_BYTES = 64 * 1024;
15
+ const MAX_REQUEST_FRAME_BYTES = 8 * 1024 * 1024;
16
+ const MAX_RESPONSE_FRAME_BYTES = 16 * 1024 * 1024;
17
+ const MAX_HUD_STEP_BYTES = 16 * 1024;
18
+ const MAX_HUD_UPDATES = 64;
19
+ const MAX_RETAINED_STRING_LENGTH = 256;
20
+ const MAX_BROKER_TIMEOUT_MS = 60_000;
21
+ const SENSITIVE_FIELD = /(?:address|authorization|cookie|key|password|secret|token|user|account)/iu;
22
+ const SENSITIVE_VALUE = /(?:0x[a-f0-9]{40,}|[a-f0-9]{64,}|eyJ[a-z0-9_-]{20,}\.[a-z0-9_-]{20,})/iu;
23
+ const APPLY_HUD_UPDATE_FUNCTION = `function(step) {
24
+ const bridge = this.__AGENTIC__;
25
+ if (step === null) {
26
+ if (typeof bridge?.hideStep !== 'function') return false;
27
+ setTimeout(() => bridge.hideStep(), 0);
28
+ return true;
29
+ }
30
+ if (typeof bridge?.showStep !== 'function') return false;
31
+ setTimeout(() => bridge.showStep(step), 0);
32
+ return true;
33
+ }`;
34
+
35
+ function brokerSocketPath(runtimeDir, endpointIdentity) {
36
+ const runtimePath = path.resolve(
37
+ runtimeDir || process.env.RECIPE_RUNTIME_DIR || path.join('temp', 'recipe', 'runtime'),
38
+ );
39
+ const socketIdentity =
40
+ endpointIdentity === undefined || endpointIdentity === null
41
+ ? runtimePath
42
+ : `${runtimePath}\u0000${String(endpointIdentity)}`;
43
+ const identity = createHash('sha256').update(socketIdentity).digest('hex').slice(0, 20);
44
+ return path.join('/tmp', `mmh-cdp-${identity}.sock`);
45
+ }
46
+
47
+ function deviceIdFromUrl(wsUrl) {
48
+ const match = /[?&]device=([^&]+)/u.exec(wsUrl || '');
49
+ return match ? match[1] : wsUrl;
50
+ }
51
+
52
+ function safePrimitive(value) {
53
+ if (value === null || ['number', 'boolean'].includes(typeof value)) {
54
+ return value;
55
+ }
56
+ if (
57
+ typeof value !== 'string' ||
58
+ value.length > MAX_RETAINED_STRING_LENGTH ||
59
+ SENSITIVE_VALUE.test(value)
60
+ ) {
61
+ return undefined;
62
+ }
63
+ return value;
64
+ }
65
+
66
+ function sanitizePathname(pathname) {
67
+ const segments = String(pathname)
68
+ .split('/')
69
+ .map((segment) =>
70
+ segment.length > 64 || SENSITIVE_VALUE.test(segment) ? '<redacted>' : segment,
71
+ );
72
+ return segments.join('/').slice(0, 1024);
73
+ }
74
+
75
+ function boundedError(error) {
76
+ return String(error?.message || error || 'unknown error').slice(0, MAX_RETAINED_STRING_LENGTH);
77
+ }
78
+
79
+ function boundedTimeout(value, fallback = 10_000) {
80
+ const timeout = Number(value);
81
+ return Number.isFinite(timeout) && timeout > 0
82
+ ? Math.min(MAX_BROKER_TIMEOUT_MS, timeout)
83
+ : fallback;
84
+ }
85
+
86
+ // State recovery is event-driven. Pick a fixed bound below the caller's RPC
87
+ // deadline so the broker always answers before the client gives up. Returning
88
+ // literals also keeps the timer independent from untrusted request values.
89
+ function stateWaitTimeout(value) {
90
+ const timeout = boundedTimeout(value);
91
+ if (timeout <= 500) return 1;
92
+ if (timeout <= 1_000) return 400;
93
+ if (timeout <= 2_000) return 900;
94
+ if (timeout <= 5_000) return 1_900;
95
+ if (timeout <= 10_000) return 4_500;
96
+ if (timeout <= 15_000) return 9_500;
97
+ if (timeout <= 30_000) return 14_500;
98
+ if (timeout <= 45_000) return 29_500;
99
+ if (timeout <= 55_000) return 44_500;
100
+ return 54_500;
101
+ }
102
+
103
+ function readField(value, field) {
104
+ let current = value;
105
+ for (const segment of String(field).split('.')) {
106
+ if (!current || typeof current !== 'object' || !Object.hasOwn(current, segment)) {
107
+ return { found: false };
108
+ }
109
+ current = current[segment];
110
+ }
111
+ return { found: true, value: safePrimitive(current) };
112
+ }
113
+
114
+ function sanitizeNetworkRequest(request, capture, now) {
115
+ let url;
116
+ try {
117
+ url = new URL(request.url);
118
+ } catch {
119
+ return null;
120
+ }
121
+ if (
122
+ capture.urlIncludes.length > 0 &&
123
+ !capture.urlIncludes.some((value) => request.url.includes(value))
124
+ ) {
125
+ return null;
126
+ }
127
+ if (
128
+ capture.methods.length > 0 &&
129
+ !capture.methods.includes(String(request.method).toUpperCase())
130
+ ) {
131
+ return null;
132
+ }
133
+
134
+ let body = null;
135
+ let bodyInspectable = capture.bodyJsonFields.length === 0;
136
+ if (
137
+ capture.bodyJsonFields.length > 0 &&
138
+ request.postData &&
139
+ Buffer.byteLength(request.postData) <= MAX_POST_DATA_BYTES
140
+ ) {
141
+ try {
142
+ const parsed = JSON.parse(request.postData);
143
+ bodyInspectable = true;
144
+ const entries = [];
145
+ for (const field of capture.bodyJsonFields) {
146
+ const retained = readField(parsed, field);
147
+ if (!retained.found) continue;
148
+ if (retained.value === undefined) {
149
+ bodyInspectable = false;
150
+ continue;
151
+ }
152
+ entries.push([field, retained.value]);
153
+ }
154
+ body = Object.fromEntries(entries);
155
+ } catch {
156
+ body = null;
157
+ }
158
+ }
159
+
160
+ return {
161
+ record: {
162
+ elapsedMs: now - capture.startedAtEpochMs,
163
+ host: url.hostname,
164
+ path: sanitizePathname(url.pathname),
165
+ method: String(request.method || 'GET').toUpperCase(),
166
+ ...(body && Object.keys(body).length > 0 ? { body } : {}),
167
+ },
168
+ bodyInspectable,
169
+ };
170
+ }
171
+
172
+ function countsBy(records, selector) {
173
+ const result = Object.create(null);
174
+ for (const record of records) {
175
+ const key = String(selector(record) ?? 'unknown');
176
+ result[key] = (result[key] || 0) + 1;
177
+ }
178
+ return Object.fromEntries(Object.entries(result).sort(([a], [b]) => a.localeCompare(b)));
179
+ }
180
+
181
+ function normalizeCapture(input) {
182
+ const id = String(input.id || '').trim();
183
+ if (!/^[a-z0-9._-]{1,100}$/iu.test(id)) {
184
+ throw new Error('Network capture id is invalid');
185
+ }
186
+ const normalizeList = (value, name) => {
187
+ const values = Array.isArray(value) ? [...new Set(value.map(String).filter(Boolean))] : [];
188
+ if (values.length > 20 || values.some((entry) => entry.length > 256)) {
189
+ throw new Error(`Network capture ${name} exceeds its bound`);
190
+ }
191
+ return values;
192
+ };
193
+ const bodyJsonFields = normalizeList(input.bodyJsonFields, 'bodyJsonFields');
194
+ if (bodyJsonFields.some((field) => SENSITIVE_FIELD.test(field))) {
195
+ throw new Error('Network capture body field is sensitive');
196
+ }
197
+ const maxRequests = Number(input.maxRequests ?? DEFAULT_MAX_REQUESTS);
198
+ if (!Number.isInteger(maxRequests) || maxRequests < 1 || maxRequests > 10_000) {
199
+ throw new Error('Network capture maxRequests must be between 1 and 10000');
200
+ }
201
+ const maxDurationMs = Number(input.maxDurationMs ?? DEFAULT_MAX_DURATION_MS);
202
+ if (
203
+ !Number.isInteger(maxDurationMs) ||
204
+ maxDurationMs < 1 ||
205
+ maxDurationMs > MAX_CAPTURE_DURATION_MS
206
+ ) {
207
+ throw new Error('Network capture maxDurationMs is invalid');
208
+ }
209
+ return {
210
+ id,
211
+ startedAtEpochMs: Date.now(),
212
+ urlIncludes: normalizeList(input.urlIncludes, 'urlIncludes'),
213
+ methods: normalizeList(input.methods, 'methods').map((value) => value.toUpperCase()),
214
+ bodyJsonFields,
215
+ maxRequests,
216
+ maxDurationMs,
217
+ requests: [],
218
+ retainedBytes: 0,
219
+ uninspectableBodyRequests: 0,
220
+ droppedRequests: 0,
221
+ reconnects: 0,
222
+ partial: false,
223
+ networkEnabled: false,
224
+ enableErrors: [],
225
+ endedAtEpochMs: null,
226
+ };
227
+ }
228
+
229
+ function brokerOwnerPath(socketPath) {
230
+ return `${socketPath}.owner`;
231
+ }
232
+
233
+ function readBrokerOwner(ownerPath) {
234
+ let source;
235
+ try {
236
+ source = fs.readFileSync(ownerPath, 'utf8');
237
+ } catch (error) {
238
+ if (error.code !== 'EISDIR') return null;
239
+ try {
240
+ source = fs.readFileSync(path.join(ownerPath, 'owner.json'), 'utf8');
241
+ } catch {
242
+ return null;
243
+ }
244
+ }
245
+ try {
246
+ const value = JSON.parse(source);
247
+ return Number.isInteger(value.pid) && typeof value.token === 'string' ? value : null;
248
+ } catch {
249
+ return null;
250
+ }
251
+ }
252
+
253
+ function processIsAlive(pid) {
254
+ if (!Number.isInteger(pid) || pid < 1) return false;
255
+ try {
256
+ process.kill(pid, 0);
257
+ return true;
258
+ } catch {
259
+ return false;
260
+ }
261
+ }
262
+
263
+ function claimBrokerSocket(socketPath) {
264
+ const ownerPath = brokerOwnerPath(socketPath);
265
+ const owner = { pid: process.pid, token: randomUUID() };
266
+ const candidatePath = `${ownerPath}.claim-${owner.pid}-${owner.token}`;
267
+ fs.mkdirSync(candidatePath, { mode: 0o700 });
268
+ fs.writeFileSync(path.join(candidatePath, 'owner.json'), `${JSON.stringify(owner)}\n`, {
269
+ flag: 'wx',
270
+ mode: 0o600,
271
+ });
272
+ let claimed = false;
273
+ for (let attempt = 0; attempt < 10 && !claimed; attempt += 1) {
274
+ try {
275
+ fs.renameSync(candidatePath, ownerPath);
276
+ claimed = true;
277
+ } catch (error) {
278
+ if (!['EEXIST', 'ENOTEMPTY', 'ENOTDIR', 'EISDIR'].includes(error.code)) {
279
+ fs.rmSync(candidatePath, { recursive: true, force: true });
280
+ throw error;
281
+ }
282
+ const previousOwner = readBrokerOwner(ownerPath);
283
+ if (previousOwner && processIsAlive(previousOwner.pid)) {
284
+ fs.rmSync(candidatePath, { recursive: true, force: true });
285
+ throw new Error(`CDP broker socket is owned by process ${previousOwner.pid}`);
286
+ }
287
+ const stalePath = `${ownerPath}.stale-${randomUUID()}`;
288
+ try {
289
+ fs.renameSync(ownerPath, stalePath);
290
+ fs.rmSync(stalePath, { recursive: true, force: true });
291
+ } catch (staleError) {
292
+ if (staleError.code !== 'ENOENT') {
293
+ fs.rmSync(candidatePath, { recursive: true, force: true });
294
+ throw staleError;
295
+ }
296
+ }
297
+ }
298
+ }
299
+ if (!claimed) {
300
+ fs.rmSync(candidatePath, { recursive: true, force: true });
301
+ throw new Error('CDP broker socket ownership could not be claimed');
302
+ }
303
+ try {
304
+ fs.unlinkSync(socketPath);
305
+ } catch (error) {
306
+ if (error.code !== 'ENOENT') {
307
+ fs.rmSync(ownerPath, { recursive: true, force: true });
308
+ throw error;
309
+ }
310
+ }
311
+ return { ownerPath, owner };
312
+ }
313
+
314
+ function releaseBrokerSocket(socketPath, ownership) {
315
+ const currentOwner = readBrokerOwner(ownership.ownerPath);
316
+ if (currentOwner?.pid !== ownership.owner.pid || currentOwner?.token !== ownership.owner.token) {
317
+ return;
318
+ }
319
+ fs.rmSync(socketPath, { force: true });
320
+ fs.rmSync(ownership.ownerPath, { recursive: true, force: true });
321
+ }
322
+
323
+ function createCdpBroker({
324
+ socketPath,
325
+ sessions,
326
+ sendCommand,
327
+ requestDiscovery,
328
+ onClientActivity,
329
+ }) {
330
+ const captures = new Map();
331
+ const completedCaptures = new Map();
332
+ const hudUpdates = new Map();
333
+ const appliedHudVersions = new Map();
334
+ const hudApplyChains = new Map();
335
+ const clients = new Set();
336
+ const subscriptions = new Map();
337
+ const knownTargets = new Map(
338
+ [...sessions.entries()].flatMap(([deviceId, session]) =>
339
+ session?.brokerReady
340
+ ? [
341
+ [
342
+ deviceId,
343
+ {
344
+ deviceId,
345
+ generation: 1,
346
+ name: String(session.name || ''),
347
+ ready: true,
348
+ },
349
+ ],
350
+ ]
351
+ : [],
352
+ ),
353
+ );
354
+ const sessionWaiters = new Map();
355
+ const targetWaiters = new Set();
356
+ const observedSessions = new Map(
357
+ [...sessions.entries()].flatMap(([deviceId, session]) =>
358
+ session?.brokerReady ? [[deviceId, session]] : [],
359
+ ),
360
+ );
361
+
362
+ const capturesFor = (deviceId) => {
363
+ if (!captures.has(deviceId)) captures.set(deviceId, new Map());
364
+ return captures.get(deviceId);
365
+ };
366
+
367
+ const completedCapturesFor = (deviceId) => {
368
+ if (!completedCaptures.has(deviceId)) {
369
+ completedCaptures.set(deviceId, new Map());
370
+ }
371
+ return completedCaptures.get(deviceId);
372
+ };
373
+
374
+ function targetList({ nameIncludes = '', readyOnly = false } = {}) {
375
+ const pin = String(nameIncludes).trim().toLowerCase();
376
+ return [...knownTargets.values()]
377
+ .filter((target) => !readyOnly || target.ready)
378
+ .filter((target) => !pin || target.name.toLowerCase().includes(pin))
379
+ .map((target) => ({ ...target }))
380
+ .sort((a, b) => a.name.localeCompare(b.name));
381
+ }
382
+
383
+ function settleTargetWaiters() {
384
+ for (const waiter of [...targetWaiters]) {
385
+ const targets = targetList({
386
+ nameIncludes: waiter.nameIncludes,
387
+ readyOnly: true,
388
+ });
389
+ if (targets.length === 0) continue;
390
+ targetWaiters.delete(waiter);
391
+ clearTimeout(waiter.timer);
392
+ waiter.resolve(targets);
393
+ }
394
+ }
395
+
396
+ function resolveTargets(params, timeoutMs, socket) {
397
+ const existing = targetList({
398
+ nameIncludes: params.nameIncludes,
399
+ readyOnly: true,
400
+ });
401
+ if (existing.length > 0) return Promise.resolve(existing);
402
+ const retained = targetList({ nameIncludes: params.nameIncludes });
403
+ requestDiscovery?.(
404
+ String(params.nameIncludes || '').trim() && retained.length === 1 ? retained[0].deviceId : '',
405
+ );
406
+ return new Promise((resolve, reject) => {
407
+ const waiter = {
408
+ nameIncludes: String(params.nameIncludes || ''),
409
+ resolve,
410
+ reject,
411
+ socket,
412
+ timer: null,
413
+ };
414
+ waiter.timer = setTimeout(() => {
415
+ targetWaiters.delete(waiter);
416
+ reject(new Error('CDP broker never observed the requested target'));
417
+ }, stateWaitTimeout(timeoutMs));
418
+ targetWaiters.add(waiter);
419
+ settleTargetWaiters();
420
+ });
421
+ }
422
+
423
+ function waitForSession(deviceId, timeoutMs, socket) {
424
+ if (sessions.get(deviceId)?.brokerReady) return sessions.get(deviceId);
425
+ requestDiscovery?.(deviceId);
426
+ return new Promise((resolve, reject) => {
427
+ const waiters = sessionWaiters.get(deviceId) || new Set();
428
+ const waiter = {
429
+ resolve,
430
+ reject,
431
+ socket,
432
+ timer: setTimeout(() => {
433
+ waiters.delete(waiter);
434
+ if (waiters.size === 0) sessionWaiters.delete(deviceId);
435
+ reject(new Error(`CDP broker target unavailable: ${deviceId}`));
436
+ }, stateWaitTimeout(timeoutMs)),
437
+ };
438
+ waiters.add(waiter);
439
+ sessionWaiters.set(deviceId, waiters);
440
+ const session = sessions.get(deviceId);
441
+ if (session?.brokerReady) {
442
+ waiters.delete(waiter);
443
+ if (waiters.size === 0) sessionWaiters.delete(deviceId);
444
+ clearTimeout(waiter.timer);
445
+ resolve(session);
446
+ }
447
+ });
448
+ }
449
+
450
+ async function enableNetwork(deviceId, capture, timeoutMs = 10_000, socket) {
451
+ try {
452
+ const budgetMs = boundedTimeout(timeoutMs);
453
+ const deadline = Date.now() + budgetMs;
454
+ const session = await waitForSession(deviceId, budgetMs, socket);
455
+ const remainingMs = Math.max(1, deadline - Date.now());
456
+ await sendCommand(session, 'Network.enable', {}, remainingMs);
457
+ if (capture.enableErrors.length > 0) capture.partial = true;
458
+ capture.networkEnabled = true;
459
+ } catch (error) {
460
+ if (capture.networkEnabled) capture.partial = true;
461
+ if (capture.enableErrors.length < 20) {
462
+ capture.enableErrors.push(boundedError(error));
463
+ }
464
+ }
465
+ }
466
+
467
+ function finishCapture(deviceId, capture, partial = false) {
468
+ capture.partial ||= partial;
469
+ capture.endedAtEpochMs ??= Date.now();
470
+ capturesFor(deviceId).delete(capture.id);
471
+ }
472
+
473
+ async function applyHudUpdate(deviceId, timeoutMs, socket) {
474
+ if (!hudUpdates.has(deviceId)) return { status: 'none' };
475
+ const budgetMs = boundedTimeout(timeoutMs);
476
+ const deadline = Date.now() + budgetMs;
477
+ const session = await waitForSession(deviceId, budgetMs, socket);
478
+ const update = hudUpdates.get(deviceId);
479
+ if (!update) return { status: 'none' };
480
+ if (appliedHudVersions.get(deviceId) === update.version) {
481
+ return { status: 'applied', version: update.version };
482
+ }
483
+ let applied = false;
484
+ while (Date.now() < deadline) {
485
+ const globalObject = await sendCommand(
486
+ session,
487
+ 'Runtime.evaluate',
488
+ { expression: 'globalThis', returnByValue: false, awaitPromise: false },
489
+ Math.max(1, deadline - Date.now()),
490
+ );
491
+ const objectId = globalObject?.result?.objectId;
492
+ if (!objectId) {
493
+ throw new Error('Mobile HUD runtime did not expose globalThis');
494
+ }
495
+ const evaluation = await sendCommand(
496
+ session,
497
+ 'Runtime.callFunctionOn',
498
+ {
499
+ objectId,
500
+ functionDeclaration: APPLY_HUD_UPDATE_FUNCTION,
501
+ arguments: [{ value: update.step }],
502
+ returnByValue: true,
503
+ awaitPromise: false,
504
+ },
505
+ Math.max(1, deadline - Date.now()),
506
+ );
507
+ if (evaluation?.result?.value === true) {
508
+ applied = true;
509
+ break;
510
+ }
511
+ await new Promise((resolve) => setTimeout(resolve, 100));
512
+ }
513
+ if (!applied) {
514
+ throw new Error('Mobile HUD bridge was not installed before the update deadline');
515
+ }
516
+ if (hudUpdates.get(deviceId)?.version === update.version) {
517
+ appliedHudVersions.set(deviceId, update.version);
518
+ }
519
+ return { status: 'applied', version: update.version };
520
+ }
521
+
522
+ function scheduleHudUpdate(deviceId, timeoutMs, socket) {
523
+ const previous = hudApplyChains.get(deviceId) || Promise.resolve();
524
+ const next = previous
525
+ .catch(() => undefined)
526
+ .then(() => applyHudUpdate(deviceId, timeoutMs, socket));
527
+ hudApplyChains.set(deviceId, next);
528
+ void next
529
+ .finally(() => {
530
+ if (hudApplyChains.get(deviceId) === next) hudApplyChains.delete(deviceId);
531
+ })
532
+ .catch(() => undefined);
533
+ return next;
534
+ }
535
+
536
+ function expireCapture(deviceId, capture) {
537
+ if (capturesFor(deviceId).get(capture.id) !== capture) return;
538
+ finishCapture(deviceId, capture, true);
539
+ const completed = completedCapturesFor(deviceId);
540
+ completed.set(capture.id, capture);
541
+ while (completed.size > MAX_COMPLETED_CAPTURES) {
542
+ completed.delete(completed.keys().next().value);
543
+ }
544
+ }
545
+
546
+ function captureSummary(capture) {
547
+ const bodyType = (record) => record.body?.type ?? 'unknown';
548
+ const endedAtEpochMs = capture.endedAtEpochMs ?? Date.now();
549
+ const exceededMaxDuration = endedAtEpochMs - capture.startedAtEpochMs > capture.maxDurationMs;
550
+ return {
551
+ schemaVersion: 1,
552
+ id: capture.id,
553
+ status: !capture.networkEnabled
554
+ ? 'unavailable'
555
+ : capture.partial || exceededMaxDuration
556
+ ? 'partial'
557
+ : 'complete',
558
+ startedAtEpochMs: capture.startedAtEpochMs,
559
+ endedAtEpochMs,
560
+ maxDurationMs: capture.maxDurationMs,
561
+ reconnects: capture.reconnects,
562
+ droppedRequests: capture.droppedRequests,
563
+ unavailableReasons: capture.networkEnabled ? [] : capture.enableErrors,
564
+ coverageGapReasons: capture.networkEnabled ? capture.enableErrors : [],
565
+ uninspectableBodyRequests: capture.uninspectableBodyRequests,
566
+ projectedBodyFields: capture.bodyJsonFields,
567
+ totalRequests: capture.requests.length,
568
+ requestsByMethod: countsBy(capture.requests, (record) => record.method),
569
+ requestsByHost: countsBy(capture.requests, (record) => record.host),
570
+ requestsByType: countsBy(capture.requests, bodyType),
571
+ requests: capture.requests,
572
+ };
573
+ }
574
+
575
+ async function control(deviceId, action, params, timeoutMs = 10_000, socket) {
576
+ if (action === 'list-targets') {
577
+ return targetList({ readyOnly: true }).map(({ deviceId, name }) => ({
578
+ deviceId,
579
+ name,
580
+ }));
581
+ }
582
+ if (action === 'list-target-identities') {
583
+ return targetList({ readyOnly: true }).map(({ deviceId, generation, name }) => ({
584
+ deviceId,
585
+ generation,
586
+ name,
587
+ }));
588
+ }
589
+ if (action === 'resolve-targets') {
590
+ return resolveTargets(params, timeoutMs, socket);
591
+ }
592
+ if (action === 'hud-update') {
593
+ const step = params.step ?? null;
594
+ if (step !== null && (typeof step !== 'object' || Array.isArray(step))) {
595
+ throw new Error('HUD update requires an object step or null');
596
+ }
597
+ if (Buffer.byteLength(JSON.stringify(step)) > MAX_HUD_STEP_BYTES) {
598
+ throw new Error('HUD update exceeds its bound');
599
+ }
600
+ const previousVersion = hudUpdates.get(deviceId)?.version || 0;
601
+ if (hudUpdates.has(deviceId)) {
602
+ hudUpdates.delete(deviceId);
603
+ }
604
+ while (hudUpdates.size >= MAX_HUD_UPDATES) {
605
+ const oldestDeviceId = hudUpdates.keys().next().value;
606
+ hudUpdates.delete(oldestDeviceId);
607
+ appliedHudVersions.delete(oldestDeviceId);
608
+ }
609
+ const version = previousVersion + 1;
610
+ hudUpdates.set(deviceId, { step, version });
611
+ requestDiscovery?.(deviceId);
612
+ void scheduleHudUpdate(deviceId, 10_000).catch(() => undefined);
613
+ return { status: 'queued', version };
614
+ }
615
+ if (action === 'capture-start') {
616
+ const capture = normalizeCapture(params);
617
+ const deviceCaptures = capturesFor(deviceId);
618
+ if (deviceCaptures.size >= MAX_ACTIVE_CAPTURES) {
619
+ throw new Error('Too many active Network captures');
620
+ }
621
+ if (deviceCaptures.has(capture.id)) {
622
+ throw new Error(`Network capture already active: ${capture.id}`);
623
+ }
624
+ completedCapturesFor(deviceId).delete(capture.id);
625
+ deviceCaptures.set(capture.id, capture);
626
+ await enableNetwork(deviceId, capture, Math.max(1, timeoutMs - 500), socket);
627
+ return { id: capture.id, status: 'started' };
628
+ }
629
+ if (action === 'capture-end') {
630
+ const id = String(params.id || '').trim();
631
+ const deviceCaptures = capturesFor(deviceId);
632
+ const completed = completedCapturesFor(deviceId);
633
+ const capture = deviceCaptures.get(id) || completed.get(id);
634
+ if (!capture) throw new Error(`Network capture not active: ${id}`);
635
+ if (deviceCaptures.has(id)) finishCapture(deviceId, capture);
636
+ completed.delete(id);
637
+ return captureSummary(capture);
638
+ }
639
+ throw new Error(`Unknown CDP broker control: ${action}`);
640
+ }
641
+
642
+ function writeMessage(socket, message) {
643
+ if (!socket.destroyed) socket.write(`${JSON.stringify(message)}\n`);
644
+ }
645
+
646
+ async function handleRequest(socket, request) {
647
+ try {
648
+ onClientActivity?.();
649
+ if (request.type === 'command') {
650
+ const budgetMs = boundedTimeout(request.timeoutMs);
651
+ const deadline = Date.now() + budgetMs;
652
+ const session = await waitForSession(request.deviceId, budgetMs, socket);
653
+ const result = await sendCommand(
654
+ session,
655
+ request.method,
656
+ request.params || {},
657
+ Math.max(1, deadline - Date.now()),
658
+ );
659
+ writeMessage(socket, { id: request.id, result });
660
+ return;
661
+ }
662
+ if (request.type === 'control') {
663
+ const result = await control(
664
+ request.deviceId,
665
+ request.action,
666
+ request.params || {},
667
+ boundedTimeout(request.timeoutMs),
668
+ socket,
669
+ );
670
+ writeMessage(socket, { id: request.id, result });
671
+ return;
672
+ }
673
+ if (request.type === 'subscribe') {
674
+ const entries = subscriptions.get(socket) || new Set();
675
+ entries.add(`${request.deviceId}\u0000${request.method}`);
676
+ subscriptions.set(socket, entries);
677
+ writeMessage(socket, { id: request.id, result: {} });
678
+ return;
679
+ }
680
+ if (request.type === 'unsubscribe') {
681
+ subscriptions.get(socket)?.delete(`${request.deviceId}\u0000${request.method}`);
682
+ writeMessage(socket, { id: request.id, result: {} });
683
+ return;
684
+ }
685
+ throw new Error('Unknown CDP broker request');
686
+ } catch (error) {
687
+ writeMessage(socket, {
688
+ id: request.id,
689
+ error: String(error.message || error),
690
+ });
691
+ }
692
+ }
693
+
694
+ fs.mkdirSync(path.dirname(socketPath), { recursive: true });
695
+ const ownership = claimBrokerSocket(socketPath);
696
+ const expirySweep = setInterval(() => {
697
+ const now = Date.now();
698
+ for (const [deviceId, deviceCaptures] of captures) {
699
+ for (const capture of deviceCaptures.values()) {
700
+ if (now - capture.startedAtEpochMs >= capture.maxDurationMs) {
701
+ expireCapture(deviceId, capture);
702
+ }
703
+ }
704
+ }
705
+ }, 100);
706
+ const server = net.createServer((socket) => {
707
+ clients.add(socket);
708
+ subscriptions.set(socket, new Set());
709
+ let buffer = '';
710
+ socket.setEncoding('utf8');
711
+ socket.on('data', (chunk) => {
712
+ buffer += chunk;
713
+ if (Buffer.byteLength(buffer) > MAX_REQUEST_FRAME_BYTES) {
714
+ writeMessage(socket, { error: 'CDP broker request exceeds its bound' });
715
+ socket.destroy();
716
+ return;
717
+ }
718
+ let newline;
719
+ while ((newline = buffer.indexOf('\n')) >= 0) {
720
+ const line = buffer.slice(0, newline);
721
+ buffer = buffer.slice(newline + 1);
722
+ if (!line.trim()) continue;
723
+ try {
724
+ const request = JSON.parse(line);
725
+ if (!request || typeof request !== 'object' || Array.isArray(request)) {
726
+ throw new Error('Invalid CDP broker request');
727
+ }
728
+ void handleRequest(socket, request);
729
+ } catch {
730
+ writeMessage(socket, { error: 'Invalid CDP broker request' });
731
+ }
732
+ }
733
+ });
734
+ const drop = () => {
735
+ clients.delete(socket);
736
+ subscriptions.delete(socket);
737
+ for (const waiter of [...targetWaiters]) {
738
+ if (waiter.socket !== socket) continue;
739
+ targetWaiters.delete(waiter);
740
+ clearTimeout(waiter.timer);
741
+ waiter.reject(new Error('CDP broker client closed'));
742
+ }
743
+ for (const [deviceId, waiters] of sessionWaiters) {
744
+ for (const waiter of [...waiters]) {
745
+ if (waiter.socket !== socket) continue;
746
+ waiters.delete(waiter);
747
+ clearTimeout(waiter.timer);
748
+ waiter.reject(new Error('CDP broker client closed'));
749
+ }
750
+ if (waiters.size === 0) sessionWaiters.delete(deviceId);
751
+ }
752
+ };
753
+ socket.on('close', drop);
754
+ socket.on('error', drop);
755
+ });
756
+ server.on('error', (error) => {
757
+ releaseBrokerSocket(socketPath, ownership);
758
+ process.stderr.write(`cdp-broker: ${boundedError(error)}\n`);
759
+ });
760
+ server.listen(socketPath, () => fs.chmodSync(socketPath, 0o600));
761
+
762
+ return {
763
+ onSessionOpen(deviceId) {
764
+ const session = sessions.get(deviceId);
765
+ if (!session?.brokerReady) return;
766
+ const previous = knownTargets.get(deviceId);
767
+ const name = String(session.name || previous?.name || '');
768
+ for (const [otherDeviceId, target] of knownTargets) {
769
+ if (
770
+ otherDeviceId !== deviceId &&
771
+ name &&
772
+ target.name === name &&
773
+ target.ready &&
774
+ !sessions.get(otherDeviceId)?.brokerReady
775
+ ) {
776
+ knownTargets.set(otherDeviceId, { ...target, ready: false });
777
+ }
778
+ }
779
+ const sessionChanged = observedSessions.get(deviceId) !== session;
780
+ knownTargets.set(deviceId, {
781
+ deviceId,
782
+ generation:
783
+ previous?.generation === undefined
784
+ ? 1
785
+ : previous.generation + (!previous.ready || sessionChanged ? 1 : 0),
786
+ name,
787
+ ready: true,
788
+ });
789
+ observedSessions.set(deviceId, session);
790
+ const waiters = sessionWaiters.get(deviceId);
791
+ if (waiters) {
792
+ sessionWaiters.delete(deviceId);
793
+ for (const waiter of waiters) {
794
+ clearTimeout(waiter.timer);
795
+ waiter.resolve(session);
796
+ }
797
+ }
798
+ settleTargetWaiters();
799
+ for (const capture of capturesFor(deviceId).values()) {
800
+ if (capture.reconnects > 0) capture.partial = true;
801
+ void enableNetwork(deviceId, capture);
802
+ }
803
+ void scheduleHudUpdate(deviceId, 10_000).catch(() => undefined);
804
+ },
805
+ onSessionClose(deviceId) {
806
+ const previous = knownTargets.get(deviceId);
807
+ if (previous) knownTargets.set(deviceId, { ...previous, ready: false });
808
+ observedSessions.delete(deviceId);
809
+ appliedHudVersions.delete(deviceId);
810
+ for (const capture of capturesFor(deviceId).values()) {
811
+ capture.reconnects += 1;
812
+ capture.partial = true;
813
+ }
814
+ },
815
+ onCdpEvent(deviceId, method, params) {
816
+ if (method === 'Runtime.executionContextsCleared') {
817
+ const target = knownTargets.get(deviceId);
818
+ if (target) knownTargets.set(deviceId, { ...target, generation: target.generation + 1 });
819
+ }
820
+ for (const socket of clients) {
821
+ if (subscriptions.get(socket)?.has(`${deviceId}\u0000${method}`)) {
822
+ writeMessage(socket, { type: 'event', deviceId, method, params });
823
+ }
824
+ }
825
+ if (method !== 'Network.requestWillBeSent') return;
826
+ const now = Date.now();
827
+ for (const capture of capturesFor(deviceId).values()) {
828
+ const sanitized = sanitizeNetworkRequest(params.request || {}, capture, now);
829
+ if (!sanitized) continue;
830
+ const { record } = sanitized;
831
+ if (!sanitized.bodyInspectable) {
832
+ capture.uninspectableBodyRequests += 1;
833
+ capture.partial = true;
834
+ }
835
+ if (now - capture.startedAtEpochMs > capture.maxDurationMs) {
836
+ capture.droppedRequests += 1;
837
+ expireCapture(deviceId, capture);
838
+ continue;
839
+ }
840
+ if (capture.requests.length >= capture.maxRequests) {
841
+ capture.droppedRequests += 1;
842
+ capture.partial = true;
843
+ continue;
844
+ }
845
+ const recordBytes = Buffer.byteLength(JSON.stringify(record));
846
+ if (capture.retainedBytes + recordBytes > MAX_CAPTURE_BYTES) {
847
+ capture.droppedRequests += 1;
848
+ capture.partial = true;
849
+ continue;
850
+ }
851
+ capture.retainedBytes += recordBytes;
852
+ capture.requests.push(record);
853
+ }
854
+ },
855
+ close() {
856
+ clearInterval(expirySweep);
857
+ for (const waiters of sessionWaiters.values()) {
858
+ for (const waiter of waiters) {
859
+ clearTimeout(waiter.timer);
860
+ waiter.reject(new Error('CDP broker closed'));
861
+ }
862
+ }
863
+ sessionWaiters.clear();
864
+ for (const waiter of targetWaiters) {
865
+ clearTimeout(waiter.timer);
866
+ waiter.reject(new Error('CDP broker closed'));
867
+ }
868
+ targetWaiters.clear();
869
+ for (const socket of clients) socket.destroy();
870
+ server.close();
871
+ releaseBrokerSocket(socketPath, ownership);
872
+ },
873
+ };
874
+ }
875
+
876
+ function createBrokerClient(socketPath, deviceId, timeout) {
877
+ return new Promise((resolve, reject) => {
878
+ const clientTimeout = boundedTimeout(timeout);
879
+ const socket = net.createConnection(socketPath);
880
+ socket.setEncoding('utf8');
881
+ let nextId = 0;
882
+ let buffer = '';
883
+ const pending = new Map();
884
+ const eventHandlers = new Map();
885
+ const connectTimer = setTimeout(() => {
886
+ socket.destroy();
887
+ reject(new Error('CDP broker connection timeout'));
888
+ }, clientTimeout);
889
+
890
+ const request = (type, value, requestTimeout = clientTimeout) =>
891
+ new Promise((requestResolve, requestReject) => {
892
+ const timeoutMs = boundedTimeout(requestTimeout, clientTimeout);
893
+ const id = ++nextId;
894
+ const timer = setTimeout(() => {
895
+ pending.delete(id);
896
+ requestReject(new Error('CDP broker request timeout'));
897
+ }, timeoutMs);
898
+ pending.set(id, {
899
+ resolve: (result) => {
900
+ clearTimeout(timer);
901
+ requestResolve(result);
902
+ },
903
+ reject: (error) => {
904
+ clearTimeout(timer);
905
+ requestReject(error);
906
+ },
907
+ });
908
+ socket.write(`${JSON.stringify({ id, deviceId, timeoutMs, type, ...value })}\n`);
909
+ });
910
+
911
+ socket.on('connect', () => {
912
+ clearTimeout(connectTimer);
913
+ resolve({
914
+ send(method, params = {}, requestTimeout = clientTimeout) {
915
+ return request('command', { method, params }, requestTimeout);
916
+ },
917
+ control(action, params = {}, requestTimeout = clientTimeout) {
918
+ return request('control', { action, params }, requestTimeout);
919
+ },
920
+ on(method, handler) {
921
+ const handlers = eventHandlers.get(method) || new Set();
922
+ handlers.add(handler);
923
+ eventHandlers.set(method, handlers);
924
+ void request('subscribe', { method });
925
+ return () => {
926
+ handlers.delete(handler);
927
+ if (handlers.size === 0) {
928
+ eventHandlers.delete(method);
929
+ void request('unsubscribe', { method }).catch(() => undefined);
930
+ }
931
+ };
932
+ },
933
+ close() {
934
+ socket.destroy();
935
+ },
936
+ });
937
+ });
938
+ socket.on('data', (chunk) => {
939
+ buffer += chunk;
940
+ if (Buffer.byteLength(buffer) > MAX_RESPONSE_FRAME_BYTES) {
941
+ socket.destroy();
942
+ for (const entry of pending.values()) {
943
+ entry.reject(new Error('CDP broker response exceeds its bound'));
944
+ }
945
+ pending.clear();
946
+ return;
947
+ }
948
+ let newline;
949
+ while ((newline = buffer.indexOf('\n')) >= 0) {
950
+ const line = buffer.slice(0, newline);
951
+ buffer = buffer.slice(newline + 1);
952
+ if (!line.trim()) continue;
953
+ let message;
954
+ try {
955
+ message = JSON.parse(line);
956
+ } catch {
957
+ continue;
958
+ }
959
+ if (message.id && pending.has(message.id)) {
960
+ const entry = pending.get(message.id);
961
+ pending.delete(message.id);
962
+ if (message.error) entry.reject(new Error(message.error));
963
+ else entry.resolve(message.result);
964
+ continue;
965
+ }
966
+ if (message.type !== 'event') continue;
967
+ for (const handler of eventHandlers.get(message.method) || []) {
968
+ handler(message.params || {});
969
+ }
970
+ }
971
+ });
972
+ socket.on('error', (error) => {
973
+ clearTimeout(connectTimer);
974
+ reject(error);
975
+ });
976
+ socket.on('close', () => {
977
+ for (const entry of pending.values()) {
978
+ entry.reject(new Error('CDP broker closed'));
979
+ }
980
+ pending.clear();
981
+ eventHandlers.clear();
982
+ });
983
+ });
984
+ }
985
+
986
+ module.exports = {
987
+ brokerSocketPath,
988
+ createBrokerClient,
989
+ createCdpBroker,
990
+ deviceIdFromUrl,
991
+ };
@@ -15,7 +15,7 @@ export interface RecipeLibraryAdapterDeclaration {
15
15
  export interface RecipeLibraryManifest {
16
16
  /** Platform variant folders under recipes/, in addition to the built-in platforms. */
17
17
  platforms?: string[];
18
- /** Platform adapter plugins this library ships. Declared and digested; not loaded yet. */
18
+ /** Platform adapter plugins this library ships; a host loads one when a command selects it. */
19
19
  adapters?: Record<string, RecipeLibraryAdapterDeclaration>;
20
20
  /** Action manifest files keyed by platform or `shared`, relative to the library root. */
21
21
  actions?: Record<string, string>;
@@ -42,12 +42,32 @@ export declare function checkRecipeLibraryRequirements(library: string, manifest
42
42
  * Regular files under `<root>/<directory>`, as sorted `/`-separated paths relative to the root.
43
43
  * The one walker for loading and digesting: it skips dot-entries, `node_modules` and symlinked
44
44
  * directories, and rejects any file that resolves outside the library root.
45
+ *
46
+ * `strict` (an adapter plugin's directory, whose code runs in the host): nothing is skipped
47
+ * silently. Dot-entries are listed, and a `node_modules` or a symlinked directory is refused
48
+ * (`RECIPE_SOURCE_INVALID`), since the digest could not cover what it holds.
45
49
  */
46
- export declare function listLibraryFiles(root: string, directory: string): Promise<string[]>;
50
+ export declare function listLibraryFiles(root: string, directory: string, options?: {
51
+ strict?: boolean;
52
+ }): Promise<string[]>;
53
+ /** The most files one adapter plugin's directory may hold; past it the plugin should be bundled. */
54
+ export declare const MAX_LIBRARY_ADAPTER_FILES = 1000;
55
+ /**
56
+ * Files one declared adapter plugin contributes, sorted and relative to the root: its module,
57
+ * plus every file under the module's directory when that directory is not the library root,
58
+ * so a multi-file plugin's helpers are covered (a module at the root contributes itself only),
59
+ * plus the library's `actions/`. The module's directory is listed strictly: dot-entries count,
60
+ * and a `node_modules` or a symlinked directory is refused. These are the files a host lets the
61
+ * plugin import from disk.
62
+ */
63
+ export declare function libraryAdapterFiles(root: string, declaration: RecipeLibraryAdapterDeclaration): Promise<string[]>;
64
+ /** Content digest of one declared adapter plugin: the files `libraryAdapterFiles` lists. */
65
+ export declare function digestLibraryAdapter(root: string, declaration: RecipeLibraryAdapterDeclaration): Promise<string>;
47
66
  /**
48
67
  * Content digest of what a library contributes to discovery and runs: recipe-library.json,
49
- * recipes/, manifests/, actions/, and the files it declares. Text files hash with LF line
50
- * endings, so a CRLF checkout of the same content has the same digest.
68
+ * recipes/, manifests/, actions/, the files it declares, and each adapter plugin's directory
69
+ * (`libraryAdapterFiles`). Text files hash with LF line endings, so a CRLF checkout of the same
70
+ * content has the same digest.
51
71
  */
52
72
  export declare function digestRecipeLibrary(root: string, manifest?: RecipeLibraryManifest): Promise<string>;
53
73
  //# sourceMappingURL=library-manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"library-manifest.d.ts","sourceRoot":"","sources":["../../src/core/library-manifest.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAG5C,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,8CAA+C,CAAC;AAEvF,MAAM,WAAW,+BAA+B;IAC9C,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wGAAwG;AACxG,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;IAC3D,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oGAAoG;AACpG,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnE;AAED,8FAA8F;AAC9F,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA0F5C;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAC3C,eAAe,GAAE,qBAA0B,GAC1C,wBAAwB,EAAE,CAuB5B;AAgCD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4CzF;AAID;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
1
+ {"version":3,"file":"library-manifest.d.ts","sourceRoot":"","sources":["../../src/core/library-manifest.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAG5C,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,8CAA+C,CAAC;AAEvF,MAAM,WAAW,+BAA+B;IAC9C,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wGAAwG;AACxG,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;IAC3D,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oGAAoG;AACpG,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnE;AAED,8FAA8F;AAC9F,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA0F5C;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAC3C,eAAe,GAAE,qBAA0B,GAC1C,wBAAwB,EAAE,CAuB5B;AAgCD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAyDnB;AAED,oGAAoG;AACpG,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,+BAA+B,GAC3C,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED,4FAA4F;AAC5F,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,+BAA+B,GAC3C,OAAO,CAAC,MAAM,CAAC,CAEjB;AAID;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -154,8 +154,12 @@ async function declaredLibraryFile(rootReal, root, relativePath, key, invalid) {
154
154
  * Regular files under `<root>/<directory>`, as sorted `/`-separated paths relative to the root.
155
155
  * The one walker for loading and digesting: it skips dot-entries, `node_modules` and symlinked
156
156
  * directories, and rejects any file that resolves outside the library root.
157
+ *
158
+ * `strict` (an adapter plugin's directory, whose code runs in the host): nothing is skipped
159
+ * silently. Dot-entries are listed, and a `node_modules` or a symlinked directory is refused
160
+ * (`RECIPE_SOURCE_INVALID`), since the digest could not cover what it holds.
157
161
  */
158
- export async function listLibraryFiles(root, directory) {
162
+ export async function listLibraryFiles(root, directory, options = {}) {
159
163
  const rootReal = await libraryRootReal(root);
160
164
  const visit = async (relativeDir) => {
161
165
  let entries;
@@ -170,9 +174,11 @@ export async function listLibraryFiles(root, directory) {
170
174
  }
171
175
  // Entries are checked concurrently: discovery walks a library several times per command.
172
176
  const nested = await Promise.all(entries.map(async (entry) => {
173
- if (entry.name.startsWith('.') || entry.name === 'node_modules')
174
- return [];
175
177
  const relativePath = path.join(relativeDir, entry.name);
178
+ if (options.strict && entry.name === 'node_modules')
179
+ throw invalidRecipeSource(`Adapter directory entry ${relativePath.split(path.sep).join('/')} is a node_modules, which the plugin digest cannot cover.`, 'bundle the dependency into the plugin, or depend on a package the host installs');
180
+ if (!options.strict && (entry.name.startsWith('.') || entry.name === 'node_modules'))
181
+ return [];
176
182
  if (entry.isDirectory())
177
183
  return visit(relativePath);
178
184
  if (!entry.isFile() && !entry.isSymbolicLink())
@@ -188,8 +194,11 @@ export async function listLibraryFiles(root, directory) {
188
194
  throw invalidRecipeSource(`Library file ${portable} is a broken symlink.`, 'remove the symlink or restore its target inside the library root');
189
195
  }
190
196
  // Symlinked directories are not followed, so a link cannot pull another tree in.
191
- if (entry.isSymbolicLink() && !(await stat(fileReal)).isFile())
197
+ if (entry.isSymbolicLink() && !(await stat(fileReal)).isFile()) {
198
+ if (options.strict)
199
+ throw invalidRecipeSource(`Adapter directory entry ${portable} is a symlinked directory, which the plugin digest cannot cover.`, 'replace the symlink with the files it points to');
192
200
  return [];
201
+ }
193
202
  if (!isPathWithin(rootReal, fileReal)) {
194
203
  throw invalidRecipeSource(`Library file ${portable} resolves outside its library root.`, 'move the file inside the library root or remove the escaping symlink');
195
204
  }
@@ -199,19 +208,52 @@ export async function listLibraryFiles(root, directory) {
199
208
  };
200
209
  return (await visit(directory)).sort();
201
210
  }
211
+ /** The most files one adapter plugin's directory may hold; past it the plugin should be bundled. */
212
+ export const MAX_LIBRARY_ADAPTER_FILES = 1000;
213
+ /**
214
+ * Files one declared adapter plugin contributes, sorted and relative to the root: its module,
215
+ * plus every file under the module's directory when that directory is not the library root,
216
+ * so a multi-file plugin's helpers are covered (a module at the root contributes itself only),
217
+ * plus the library's `actions/`. The module's directory is listed strictly: dot-entries count,
218
+ * and a `node_modules` or a symlinked directory is refused. These are the files a host lets the
219
+ * plugin import from disk.
220
+ */
221
+ export async function libraryAdapterFiles(root, declaration) {
222
+ const module = path
223
+ .relative(root, path.resolve(root, declaration.module))
224
+ .split(path.sep)
225
+ .join('/');
226
+ const rootReal = await libraryRootReal(root);
227
+ const moduleReal = await existingRealpath(path.join(root, module));
228
+ if (moduleReal && !isPathWithin(rootReal, moduleReal))
229
+ throw invalidRecipeSource(`Library file ${module} resolves outside its library root.`, 'move the file inside the library root or remove the escaping symlink');
230
+ const directory = path.posix.dirname(module);
231
+ const files = new Set(moduleReal ? [module] : []);
232
+ if (directory !== '.') {
233
+ for (const file of await listLibraryFiles(root, directory, { strict: true }))
234
+ files.add(file);
235
+ }
236
+ if (files.size > MAX_LIBRARY_ADAPTER_FILES)
237
+ throw invalidRecipeSource(`Adapter module ${module} sits in a directory of ${files.size} files (at most ${MAX_LIBRARY_ADAPTER_FILES}).`, `give the adapter its own directory, or bundle it into fewer files`);
238
+ // The library's actions/ is shared code a plugin may import too.
239
+ for (const file of await listLibraryFiles(root, 'actions'))
240
+ files.add(file);
241
+ return [...files].sort();
242
+ }
243
+ /** Content digest of one declared adapter plugin: the files `libraryAdapterFiles` lists. */
244
+ export async function digestLibraryAdapter(root, declaration) {
245
+ return digestFiles(root, await libraryAdapterFiles(root, declaration));
246
+ }
202
247
  const fileDigests = new Map();
203
248
  /**
204
249
  * Content digest of what a library contributes to discovery and runs: recipe-library.json,
205
- * recipes/, manifests/, actions/, and the files it declares. Text files hash with LF line
206
- * endings, so a CRLF checkout of the same content has the same digest.
250
+ * recipes/, manifests/, actions/, the files it declares, and each adapter plugin's directory
251
+ * (`libraryAdapterFiles`). Text files hash with LF line endings, so a CRLF checkout of the same
252
+ * content has the same digest.
207
253
  */
208
254
  export async function digestRecipeLibrary(root, manifest) {
209
255
  const files = new Set();
210
- const declared = [
211
- RECIPE_LIBRARY_MANIFEST_FILE,
212
- ...Object.values(manifest?.actions ?? {}),
213
- ...Object.values(manifest?.adapters ?? {}).map((adapter) => adapter.module),
214
- ];
256
+ const declared = [RECIPE_LIBRARY_MANIFEST_FILE, ...Object.values(manifest?.actions ?? {})];
215
257
  const rootReal = await libraryRootReal(root);
216
258
  for (const file of declared) {
217
259
  const relative = path.relative(root, path.resolve(root, file)).split(path.sep).join('/');
@@ -228,6 +270,13 @@ export async function digestRecipeLibrary(root, manifest) {
228
270
  for (const file of await listLibraryFiles(root, directory))
229
271
  files.add(file);
230
272
  }
273
+ for (const adapter of Object.values(manifest?.adapters ?? {})) {
274
+ for (const file of await libraryAdapterFiles(root, adapter))
275
+ files.add(file);
276
+ }
277
+ return digestFiles(root, [...files]);
278
+ }
279
+ async function digestFiles(root, files) {
231
280
  const sorted = [...files].sort();
232
281
  const digests = await Promise.all(sorted.map((file) => fileDigest(path.join(root, file))));
233
282
  const hash = createHash('sha256');
@@ -1 +1 @@
1
- {"version":3,"file":"library-manifest.js","sourceRoot":"","sources":["../../src/core/library-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"library-manifest.js","sourceRoot":"","sources":["../../src/core/library-manifest.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { extractWorkflowGraph, type WorkflowGraph } from './core/graph.js';
10
10
  export { redactRecipeParams } from './core/invocation.js';
11
11
  export type { LibraryRecipeMatch, RecipeLibraryEnv, RecipeLibraryLoadOptions, RecipeLibraryResolution, ResolvedLibraryRecipe, } from './core/library.js';
12
12
  export { applyTaskLocalInvocationTrust, BUILT_IN_RECIPE_PLATFORMS, defaultRecipeLibrarySources, findLibraryRecipe, listRecipeFiles, listRecipeLibraryPlatforms, loadRecipeLibraries, logRecipeLibraryResolution, logRecipeLibraryShadows, logRecipeLibrarySources, parseRecipeLibraryPath, personalRecipeLibraryRoot, resolveRecipeLibrarySources, } from './core/library.js';
13
- export { checkRecipeLibraryRequirements, digestRecipeLibrary, listLibraryFiles, readRecipeLibraryManifest, RECIPE_LIBRARY_DIRECTORIES, RECIPE_LIBRARY_MANIFEST_FILE, type RecipeLibraryAdapterDeclaration, type RecipeLibraryManifest, type RecipeLibraryRequirement, type RecipePackageVersions, SHARED_RECIPE_SCOPE, } from './core/library-manifest.js';
13
+ export { checkRecipeLibraryRequirements, digestLibraryAdapter, digestRecipeLibrary, libraryAdapterFiles, listLibraryFiles, MAX_LIBRARY_ADAPTER_FILES, readRecipeLibraryManifest, RECIPE_LIBRARY_DIRECTORIES, RECIPE_LIBRARY_MANIFEST_FILE, type RecipeLibraryAdapterDeclaration, type RecipeLibraryManifest, type RecipeLibraryRequirement, type RecipePackageVersions, SHARED_RECIPE_SCOPE, } from './core/library-manifest.js';
14
14
  export { resolveRecipeParams, resolveRecipeValue } from './core/parameters.js';
15
15
  export { RecipeResolutionError } from './core/resolution-error.js';
16
16
  export { createRecipeRunner, defineActionAdapter } from './core/runner.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ export { RecipeExecutionError } from './core/failure.js';
7
7
  export { extractWorkflowGraph } from './core/graph.js';
8
8
  export { redactRecipeParams } from './core/invocation.js';
9
9
  export { applyTaskLocalInvocationTrust, BUILT_IN_RECIPE_PLATFORMS, defaultRecipeLibrarySources, findLibraryRecipe, listRecipeFiles, listRecipeLibraryPlatforms, loadRecipeLibraries, logRecipeLibraryResolution, logRecipeLibraryShadows, logRecipeLibrarySources, parseRecipeLibraryPath, personalRecipeLibraryRoot, resolveRecipeLibrarySources, } from './core/library.js';
10
- export { checkRecipeLibraryRequirements, digestRecipeLibrary, listLibraryFiles, readRecipeLibraryManifest, RECIPE_LIBRARY_DIRECTORIES, RECIPE_LIBRARY_MANIFEST_FILE, SHARED_RECIPE_SCOPE, } from './core/library-manifest.js';
10
+ export { checkRecipeLibraryRequirements, digestLibraryAdapter, digestRecipeLibrary, libraryAdapterFiles, listLibraryFiles, MAX_LIBRARY_ADAPTER_FILES, readRecipeLibraryManifest, RECIPE_LIBRARY_DIRECTORIES, RECIPE_LIBRARY_MANIFEST_FILE, SHARED_RECIPE_SCOPE, } from './core/library-manifest.js';
11
11
  export { resolveRecipeParams, resolveRecipeValue } from './core/parameters.js';
12
12
  export { RecipeResolutionError } from './core/resolution-error.js';
13
13
  export { createRecipeRunner, defineActionAdapter } from './core/runner.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAEL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,yBAAyB,EACzB,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAK5B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,wBAAwB,EAOxB,eAAe,GAIhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EAEnB,sBAAsB,GAKvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EACL,gCAAgC,EAChC,YAAY,EACZ,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAEL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,yBAAyB,EACzB,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAK5B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,wBAAwB,EAOxB,eAAe,GAIhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EAEnB,sBAAsB,GAKvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EACL,gCAAgC,EAChC,YAAY,EACZ,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farmslot/recipe-runner",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -102,7 +102,9 @@
102
102
  "types": "./dist/runtime/operation.d.ts",
103
103
  "import": "./dist/runtime/operation.js",
104
104
  "default": "./dist/runtime/operation.js"
105
- }
105
+ },
106
+ "./cdp-broker": "./cdp-broker/cdp-broker.cjs",
107
+ "./package.json": "./package.json"
106
108
  },
107
109
  "scripts": {
108
110
  "typecheck": "tsc --noEmit --project tsconfig.json",
@@ -155,7 +157,8 @@
155
157
  "dist/**/*.js",
156
158
  "dist/**/*.d.ts",
157
159
  "dist/**/*.d.ts.map",
158
- "dist/**/*.js.map"
160
+ "dist/**/*.js.map",
161
+ "cdp-broker/*.cjs"
159
162
  ],
160
163
  "publishConfig": {
161
164
  "access": "public"