@vforsh/argus-watcher 0.1.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/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # argus-watcher
2
+
3
+ Library for starting a watcher that connects to Chrome DevTools Protocol (CDP), buffers console logs, and exposes an HTTP API on `127.0.0.1`.
4
+
5
+ ## Usage
6
+
7
+ ```js
8
+ import { startWatcher } from '@vforsh/argus-watcher'
9
+
10
+ const watcher = await startWatcher({
11
+ id: 'app',
12
+ match: { url: 'localhost:3000' },
13
+ chrome: { host: '127.0.0.1', port: 9222 },
14
+ fileLogs: { logsDir: '/tmp/argus/watcher-logs' },
15
+ })
16
+
17
+ // later
18
+ await watcher.close()
19
+ ```
20
+
21
+ ## API
22
+
23
+ `startWatcher(options)`
24
+
25
+ - `id` (required): registry id
26
+ - `host`/`port`: bind address (defaults to `127.0.0.1`, random port)
27
+ - `match`: URL/title matching for CDP target selection
28
+ - `chrome`: CDP host/port (defaults to `127.0.0.1:9222`)
29
+ - `bufferSize`: max in-memory log count (default `50000`)
30
+ - `fileLogs`: optional persistence for watcher logs
31
+ - `logsDir`: directory for log files (required)
32
+ - `maxFiles`: max log files to keep for the session (default `5`)
33
+ - Rotation: a new file is created after each top-level navigation/reload (lazy; created on first log)
34
+
35
+ ## File logs
36
+
37
+ File logging is opt-in via `fileLogs`. When enabled, logs are written to `.log` files under the provided `logsDir`.
38
+
39
+ Behavior details:
40
+
41
+ - Lazy creation: no file is created until the first log arrives after start or after a rotation.
42
+ - Rotation trigger: each top-level navigation or reload rotates to a new file.
43
+ - File naming: `watcher-<watcherId>-<startedAtIso>-<n>.log` (n starts at 1).
44
+ - Retention: after a new file is created, older files are deleted to keep at most `maxFiles`.
45
+ - Session header: each file starts with a short header containing watcher id, start time, chrome host/port, match, page URL, and page title.
46
+ - Log lines: one log event per line with ISO timestamp and level; includes location when available and page URL when it changes.
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../argus-core/dist/protocol/logs.d.ts","../../argus-core/dist/registry/types.d.ts","../../argus-core/dist/protocol/http.d.ts","../../argus-core/dist/registry/registry.d.ts","../../argus-core/dist/registry/paths.d.ts","../../argus-core/dist/index.d.ts","../src/cdp/watcher.ts","../src/buffer/logbuffer.ts","../src/http/server.ts","../src/registry/registry.ts","../src/filelogs/watcherfilelogger.ts","../src/index.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/blob.d.ts","../../../node_modules/@types/node/web-globals/console.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/encoding.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/importmeta.d.ts","../../../node_modules/@types/node/web-globals/messaging.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/performance.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/web-globals/timers.d.ts","../../../node_modules/@types/node/web-globals/url.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/inspector/promises.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/path/posix.d.ts","../../../node_modules/@types/node/path/win32.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/quic.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/test/reporters.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/util/types.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[75,134,135,137,145,149,152,154,155,156,168],[75,136,137,145,149,152,154,155,156,168],[137,145,149,152,154,155,156,168],[75,137,145,149,152,154,155,156,168,176],[75,137,138,143,145,148,149,152,154,155,156,158,168,173,185],[75,137,138,139,145,148,149,152,154,155,156,168],[75,137,145,149,152,154,155,156,168],[75,137,140,145,149,152,154,155,156,168,186],[75,137,141,142,145,149,152,154,155,156,159,168],[75,137,142,145,149,152,154,155,156,168,173,182],[75,137,143,145,148,149,152,154,155,156,158,168],[75,136,137,144,145,149,152,154,155,156,168],[75,137,145,146,149,152,154,155,156,168],[75,137,145,147,148,149,152,154,155,156,168],[75,136,137,145,148,149,152,154,155,156,168],[75,137,145,148,149,150,152,154,155,156,168,173,185],[75,137,145,148,149,150,152,154,155,156,168,173,176],[75,124,137,145,148,149,151,152,154,155,156,158,168,173,185],[75,137,145,148,149,151,152,154,155,156,158,168,173,182,185],[75,137,145,149,151,152,153,154,155,156,168,173,182,185],[73,74,75,76,77,78,79,80,81,82,83,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[75,137,145,148,149,152,154,155,156,168],[75,137,145,149,152,154,156,168],[75,137,145,149,152,154,155,156,157,168,185],[75,137,145,148,149,152,154,155,156,158,168,173],[75,137,145,149,152,154,155,156,159,168],[75,137,145,149,152,154,155,156,160,168],[75,137,145,148,149,152,154,155,156,163,168],[75,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[75,137,145,149,152,154,155,156,165,168],[75,137,145,149,152,154,155,156,166,168],[75,137,142,145,149,152,154,155,156,158,168,176],[75,137,145,148,149,152,154,155,156,168,169],[75,137,145,149,152,154,155,156,168,170,186,189],[75,137,145,148,149,152,154,155,156,168,173,175,176],[75,137,145,149,152,154,155,156,168,174,176],[75,137,145,149,152,154,155,156,168,176,186],[75,137,145,149,152,154,155,156,168,177],[75,134,137,145,149,152,154,155,156,168,173,179],[75,137,145,149,152,154,155,156,168,173,178],[75,137,145,148,149,152,154,155,156,168,180,181],[75,137,145,149,152,154,155,156,168,180,181],[75,137,142,145,149,152,154,155,156,158,168,173,182],[75,137,145,149,152,154,155,156,168,183],[75,137,145,149,152,154,155,156,158,168,184],[75,137,145,149,151,152,154,155,156,166,168,185],[75,137,145,149,152,154,155,156,168,186,187],[75,137,142,145,149,152,154,155,156,168,187],[75,137,145,149,152,154,155,156,168,173,188],[75,137,145,149,152,154,155,156,157,168,189],[75,137,145,149,152,154,155,156,168,190],[75,137,140,145,149,152,154,155,156,168],[75,137,142,145,149,152,154,155,156,168],[75,137,145,149,152,154,155,156,168,186],[75,124,137,145,149,152,154,155,156,168],[75,137,145,149,152,154,155,156,168,185],[75,137,145,149,152,154,155,156,168,191],[75,137,145,149,152,154,155,156,163,168],[75,137,145,149,152,154,155,156,168,181],[75,124,137,145,148,149,150,152,154,155,156,163,168,173,176,185,188,189,191],[75,137,145,149,152,154,155,156,168,173,192],[75,90,93,96,97,137,145,149,152,154,155,156,168,185],[75,93,137,145,149,152,154,155,156,168,173,185],[75,93,97,137,145,149,152,154,155,156,168,185],[75,137,145,149,152,154,155,156,168,173],[75,87,137,145,149,152,154,155,156,168],[75,91,137,145,149,152,154,155,156,168],[75,89,90,93,137,145,149,152,154,155,156,168,185],[75,137,145,149,152,154,155,156,158,168,182],[75,137,145,149,152,154,155,156,168,193],[75,87,137,145,149,152,154,155,156,168,193],[75,89,93,137,145,149,152,154,155,156,158,168,185],[75,84,85,86,88,92,137,145,148,149,152,154,155,156,168,173,185],[75,93,101,109,137,145,149,152,154,155,156,168],[75,85,91,137,145,149,152,154,155,156,168],[75,93,118,119,137,145,149,152,154,155,156,168],[75,85,88,93,137,145,149,152,154,155,156,168,176,185,193],[75,93,137,145,149,152,154,155,156,168],[75,89,93,137,145,149,152,154,155,156,168,185],[75,84,137,145,149,152,154,155,156,168],[75,87,88,89,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,137,145,149,152,154,155,156,168],[75,93,111,114,137,145,149,152,154,155,156,168],[75,93,101,102,103,137,145,149,152,154,155,156,168],[75,91,93,102,104,137,145,149,152,154,155,156,168],[75,92,137,145,149,152,154,155,156,168],[75,85,87,93,137,145,149,152,154,155,156,168],[75,93,97,102,104,137,145,149,152,154,155,156,168],[75,97,137,145,149,152,154,155,156,168],[75,91,93,96,137,145,149,152,154,155,156,168,185],[75,85,89,93,101,137,145,149,152,154,155,156,168],[75,93,111,137,145,149,152,154,155,156,168],[75,104,137,145,149,152,154,155,156,168],[75,87,93,118,137,145,149,152,154,155,156,168,176,191,193],[61,62,63,64,65,75,137,145,149,152,154,155,156,168],[61,62,75,137,145,149,152,154,155,156,168],[62,75,137,145,149,152,154,155,156,168],[66,75,137,145,149,152,154,155,156,168],[66,75,137,145,149,150,152,154,155,156,160,168],[66,68,75,137,145,149,151,152,154,155,156,168],[66,67,68,69,70,71,75,137,145,149,152,154,155,156,160,168]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"938ad84939b8213b7b25db3c7005ca55f8781dd985472b21390b566951c19e69","impliedFormat":99},{"version":"f46b8fa62e025eca08875f78b5ef1d3b48c4c6eef59a7206bd840d0a8e9b5d9b","impliedFormat":99},{"version":"0c6d2205853778f97c93c1cf3e151bf744d14314321b58cc8f9e142915f066aa","impliedFormat":99},{"version":"bf696edc8cdb7d94c30e59c65607393a0d3159b437fd75e6ad538e5364f8a709","impliedFormat":99},{"version":"b77a3be6ad97731ea56590f14689b04c9443cc8f0e67335cf1ebfce370775bed","impliedFormat":99},{"version":"ddf6239d9d73424631f9efa11d63aa4ba11b6fd26f4da86f38ce90edebb144bd","impliedFormat":99},{"version":"348447421d105fb182ed39588425f9a1a7c71cc0622ff78525ddcec5f95c265f","signature":"2211ee8d4e1ef4f3d9cdddb9e9e460423e2b3539340cd46b61c4ffd053491c7f","impliedFormat":99},{"version":"fd2549e96e3751aa184eff74c37fe671cb120243b4a952aa17d1b0873886344f","signature":"a1b03b4d90768170207a809a2dd7d3ed29176e8e29d0c899e481064bd0036069","impliedFormat":99},{"version":"8cb1c470b3bff3095908cda68dab800a1e5837e6dde1ac8b093842db38aa1864","signature":"1592abbdf7531f6dcca1e46819434942dc8a464ac220ec9849eec4ff7c6ea5d5","impliedFormat":99},{"version":"12f28f483e9e0d0458b62fc538315ce7143dc5ae01f835d06d0de77f2a6539dd","signature":"4e539bac844c255a10a76b2c63260016764da03f5324fff85b588adb48cb48a8","impliedFormat":99},{"version":"b32383dbaab86e9fece288be9b977f48b6667ed285136f946446483de3777367","signature":"417f24a6dce727cee8914ba14136950352285aa4c419cd1b920d18bf1e0c43d2","impliedFormat":99},{"version":"dfca2acf0d34406c8dfe90d687b759d7dc2b70e08b30e523d0257741b0ddbd80","signature":"a2de7518fa3f90622926fcac6839a533569ea1ab0c562fa65929f23670ed4ffe","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1}],"root":[[67,72]],"options":{"composite":true,"declaration":true,"declarationMap":true,"module":199,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[134,1],[135,1],[136,2],[75,3],[137,4],[138,5],[139,6],[73,7],[140,8],[141,9],[142,10],[143,11],[144,12],[145,13],[146,13],[147,14],[148,15],[149,16],[150,17],[76,7],[74,7],[151,18],[152,19],[153,20],[193,21],[154,22],[155,23],[156,22],[157,24],[158,25],[159,26],[160,27],[161,27],[162,27],[163,28],[164,29],[165,30],[166,31],[167,32],[168,33],[169,33],[170,34],[171,7],[172,7],[173,35],[174,36],[175,35],[176,37],[177,38],[178,39],[179,40],[180,41],[181,42],[182,43],[183,44],[184,45],[185,46],[186,47],[187,48],[188,49],[189,50],[190,51],[77,22],[78,7],[79,52],[80,53],[81,7],[82,54],[83,7],[125,55],[126,56],[127,57],[128,57],[129,58],[130,7],[131,4],[132,59],[133,56],[191,60],[192,61],[59,7],[60,7],[10,7],[12,7],[11,7],[2,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[3,7],[21,7],[22,7],[4,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[5,7],[31,7],[32,7],[33,7],[34,7],[6,7],[38,7],[35,7],[36,7],[37,7],[39,7],[7,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[8,7],[50,7],[47,7],[48,7],[49,7],[51,7],[9,7],[52,7],[53,7],[54,7],[56,7],[55,7],[1,7],[57,7],[58,7],[101,62],[113,63],[99,64],[114,65],[123,66],[90,67],[91,68],[89,69],[122,70],[117,71],[121,72],[93,73],[110,74],[92,75],[120,76],[87,77],[88,71],[94,78],[95,7],[100,79],[98,78],[85,80],[124,81],[115,82],[104,83],[103,78],[105,84],[108,85],[102,86],[106,87],[118,70],[96,88],[97,89],[109,90],[86,65],[112,91],[111,78],[107,92],[116,7],[84,7],[119,93],[66,94],[63,95],[61,7],[65,7],[64,96],[62,7],[68,97],[67,97],[71,98],[69,99],[72,100],[70,97]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
@@ -0,0 +1,45 @@
1
+ import type { LogEvent, LogLevel } from '@vforsh/argus-core';
2
+ /**
3
+ * Filtering options for log retrieval.
4
+ *
5
+ * Used by `LogBuffer.listAfter()` and `LogBuffer.waitForAfter()`.
6
+ */
7
+ export type LogFilters = {
8
+ /** If provided, only include events whose `level` is in this list. */
9
+ levels?: LogLevel[];
10
+ /**
11
+ * Case-insensitive substring match against `LogEvent.text`.
12
+ * If provided, only include events whose text contains this value.
13
+ */
14
+ grep?: string;
15
+ /**
16
+ * Only include events with `event.ts >= sinceTs`.
17
+ *
18
+ * Timestamp is **epoch milliseconds** (same units as `Date.now()`).
19
+ */
20
+ sinceTs?: number;
21
+ };
22
+ /** In-memory ring buffer for log events with long-poll waiters. */
23
+ export declare class LogBuffer {
24
+ private readonly maxSize;
25
+ private events;
26
+ private nextId;
27
+ private waiters;
28
+ constructor(maxSize: number);
29
+ /** Add a log event and return the stored entry with id. */
30
+ add(event: Omit<LogEvent, 'id'>): LogEvent;
31
+ /** List events after the given id, respecting filters and limit. */
32
+ listAfter(after: number, filters: LogFilters, limit: number): LogEvent[];
33
+ /** Wait for events after an id or timeout. */
34
+ waitForAfter(after: number, filters: LogFilters, limit: number, timeoutMs: number): Promise<LogEvent[]>;
35
+ /** Get buffer size and id boundaries. */
36
+ getStats(): {
37
+ size: number;
38
+ count: number;
39
+ minId: number | null;
40
+ maxId: number | null;
41
+ };
42
+ private trim;
43
+ private flushWaiters;
44
+ }
45
+ //# sourceMappingURL=LogBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogBuffer.d.ts","sourceRoot":"","sources":["../../src/buffer/LogBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE5D;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,sEAAsE;IACtE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAUD,mEAAmE;AACnE,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,MAAM;IAI3B,2DAA2D;IAC3D,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,QAAQ;IAW1C,oEAAoE;IACpE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE;IAKxE,8CAA8C;IAC9C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgBvG,yCAAyC;IACzC,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAavF,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,YAAY;CAiBpB"}
@@ -0,0 +1,87 @@
1
+ /** In-memory ring buffer for log events with long-poll waiters. */
2
+ export class LogBuffer {
3
+ maxSize;
4
+ events = [];
5
+ nextId = 1;
6
+ waiters = [];
7
+ constructor(maxSize) {
8
+ this.maxSize = maxSize;
9
+ }
10
+ /** Add a log event and return the stored entry with id. */
11
+ add(event) {
12
+ const entry = {
13
+ ...event,
14
+ id: this.nextId++,
15
+ };
16
+ this.events.push(entry);
17
+ this.trim();
18
+ this.flushWaiters();
19
+ return entry;
20
+ }
21
+ /** List events after the given id, respecting filters and limit. */
22
+ listAfter(after, filters, limit) {
23
+ const filtered = this.events.filter((event) => event.id > after && matchesFilters(event, filters));
24
+ return filtered.slice(0, limit);
25
+ }
26
+ /** Wait for events after an id or timeout. */
27
+ waitForAfter(after, filters, limit, timeoutMs) {
28
+ const immediate = this.listAfter(after, filters, limit);
29
+ if (immediate.length > 0) {
30
+ return Promise.resolve(immediate);
31
+ }
32
+ return new Promise((resolve) => {
33
+ const timer = setTimeout(() => {
34
+ this.waiters = this.waiters.filter((waiter) => waiter.timer !== timer);
35
+ resolve([]);
36
+ }, timeoutMs);
37
+ this.waiters.push({ after, filters, limit, resolve, timer });
38
+ });
39
+ }
40
+ /** Get buffer size and id boundaries. */
41
+ getStats() {
42
+ if (this.events.length === 0) {
43
+ return { size: this.maxSize, count: 0, minId: null, maxId: null };
44
+ }
45
+ return {
46
+ size: this.maxSize,
47
+ count: this.events.length,
48
+ minId: this.events[0]?.id ?? null,
49
+ maxId: this.events[this.events.length - 1]?.id ?? null,
50
+ };
51
+ }
52
+ trim() {
53
+ if (this.events.length <= this.maxSize) {
54
+ return;
55
+ }
56
+ this.events = this.events.slice(this.events.length - this.maxSize);
57
+ }
58
+ flushWaiters() {
59
+ if (this.waiters.length === 0) {
60
+ return;
61
+ }
62
+ const remaining = [];
63
+ for (const waiter of this.waiters) {
64
+ const events = this.listAfter(waiter.after, waiter.filters, waiter.limit);
65
+ if (events.length > 0) {
66
+ clearTimeout(waiter.timer);
67
+ waiter.resolve(events);
68
+ continue;
69
+ }
70
+ remaining.push(waiter);
71
+ }
72
+ this.waiters = remaining;
73
+ }
74
+ }
75
+ const matchesFilters = (event, filters) => {
76
+ if (filters.sinceTs && event.ts < filters.sinceTs) {
77
+ return false;
78
+ }
79
+ if (filters.levels && filters.levels.length > 0 && !filters.levels.includes(event.level)) {
80
+ return false;
81
+ }
82
+ if (filters.grep && !event.text.toLowerCase().includes(filters.grep.toLowerCase())) {
83
+ return false;
84
+ }
85
+ return true;
86
+ };
87
+ //# sourceMappingURL=LogBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogBuffer.js","sourceRoot":"","sources":["../../src/buffer/LogBuffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { LogEvent, WatcherMatch, WatcherChrome } from '@vforsh/argus-core';
2
+ /** Minimal CDP target metadata needed for attachment. */
3
+ export type CdpTarget = {
4
+ /** CDP target id (from Chrome `/json` endpoint). */
5
+ id: string;
6
+ /** Human-readable page title for the target. */
7
+ title: string;
8
+ /** Page URL for the target. */
9
+ url: string;
10
+ /** WebSocket URL used to connect to the target via the Chrome DevTools Protocol. */
11
+ webSocketDebuggerUrl: string;
12
+ };
13
+ /** Current CDP attachment status. */
14
+ export type CdpStatus = {
15
+ attached: boolean;
16
+ target: {
17
+ title: string | null;
18
+ url: string | null;
19
+ } | null;
20
+ };
21
+ /** Options for CDP watcher lifecycle. */
22
+ export type CdpWatcherOptions = {
23
+ chrome: WatcherChrome;
24
+ match?: WatcherMatch;
25
+ onLog: (event: Omit<LogEvent, 'id'>) => void;
26
+ onStatus: (status: CdpStatus) => void;
27
+ onPageNavigation?: (info: {
28
+ url: string;
29
+ title: string | null;
30
+ }) => void;
31
+ };
32
+ /** Start CDP polling + websocket subscriptions for console/exception events. */
33
+ export declare const startCdpWatcher: (options: CdpWatcherOptions) => {
34
+ stop: () => Promise<void>;
35
+ };
36
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/cdp/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEzF,yDAAyD;AACzD,MAAM,MAAM,SAAS,GAAG;IACvB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IAEV,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IAEb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IAEX,oFAAoF;IACpF,oBAAoB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE;QACP,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAClB,GAAG,IAAI,CAAA;CACR,CAAA;AAED,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA;IAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IACrC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAA;CACxE,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe,GAAI,SAAS,iBAAiB,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAkFvF,CAAA"}
@@ -0,0 +1,291 @@
1
+ /** Start CDP polling + websocket subscriptions for console/exception events. */
2
+ export const startCdpWatcher = (options) => {
3
+ let stopped = false;
4
+ let socket = null;
5
+ const stop = async () => {
6
+ stopped = true;
7
+ if (socket) {
8
+ socket.close();
9
+ }
10
+ };
11
+ void runLoop();
12
+ return { stop };
13
+ async function runLoop() {
14
+ let backoffMs = 1_000;
15
+ while (!stopped) {
16
+ try {
17
+ await connectOnce();
18
+ backoffMs = 1_000;
19
+ }
20
+ catch (error) {
21
+ options.onLog(createSystemLog(`CDP connection failed: ${formatError(error)}`));
22
+ options.onStatus({ attached: false, target: null });
23
+ await delay(backoffMs);
24
+ backoffMs = Math.min(backoffMs * 2, 10_000);
25
+ }
26
+ }
27
+ }
28
+ async function connectOnce() {
29
+ const target = await findTarget(options.chrome, options.match);
30
+ socket = new WebSocket(target.webSocketDebuggerUrl);
31
+ await new Promise((resolve, reject) => {
32
+ socket?.addEventListener('open', () => resolve());
33
+ socket?.addEventListener('error', () => reject(new Error('WebSocket error')));
34
+ });
35
+ if (!socket) {
36
+ throw new Error('WebSocket unavailable');
37
+ }
38
+ socket.addEventListener('message', (event) => {
39
+ const message = parseMessage(event.data);
40
+ if (!message || typeof message !== 'object') {
41
+ return;
42
+ }
43
+ const payload = message;
44
+ if (payload.method === 'Runtime.consoleAPICalled') {
45
+ options.onLog(toConsoleEvent(payload.params, target));
46
+ return;
47
+ }
48
+ if (payload.method === 'Runtime.exceptionThrown') {
49
+ options.onLog(toExceptionEvent(payload.params, target));
50
+ return;
51
+ }
52
+ if (payload.method === 'Page.frameNavigated') {
53
+ const navigation = parseNavigation(payload.params);
54
+ if (!navigation) {
55
+ return;
56
+ }
57
+ target.url = navigation.url;
58
+ options.onPageNavigation?.({ url: navigation.url, title: target.title ?? null });
59
+ }
60
+ });
61
+ socket.addEventListener('close', () => {
62
+ options.onStatus({ attached: false, target: null });
63
+ });
64
+ send(socket, 'Runtime.enable');
65
+ send(socket, 'Page.enable');
66
+ // Only signal attached after we've enabled the necessary domains
67
+ options.onStatus({ attached: true, target: { title: target.title ?? null, url: target.url ?? null } });
68
+ await new Promise((resolve) => {
69
+ socket?.addEventListener('close', () => resolve());
70
+ });
71
+ }
72
+ };
73
+ const parseNavigation = (params) => {
74
+ const record = params;
75
+ const url = record.frame?.url;
76
+ if (!url || typeof url !== 'string' || url.trim() === '') {
77
+ return null;
78
+ }
79
+ if (record.frame?.parentId) {
80
+ return null;
81
+ }
82
+ return { url };
83
+ };
84
+ const findTarget = async (chrome, match) => {
85
+ const targets = await fetchTargets(chrome);
86
+ if (targets.length === 0) {
87
+ throw new Error('No CDP targets available');
88
+ }
89
+ if (!match || (!match.url && !match.title && !match.urlRegex && !match.titleRegex)) {
90
+ return targets[0];
91
+ }
92
+ const urlRegex = match.urlRegex ? safeRegex(match.urlRegex) : null;
93
+ const titleRegex = match.titleRegex ? safeRegex(match.titleRegex) : null;
94
+ const selected = targets.find((target) => {
95
+ if (match.url && !target.url.includes(match.url)) {
96
+ return false;
97
+ }
98
+ if (match.title && !target.title.includes(match.title)) {
99
+ return false;
100
+ }
101
+ if (urlRegex && !urlRegex.test(target.url)) {
102
+ return false;
103
+ }
104
+ if (titleRegex && !titleRegex.test(target.title)) {
105
+ return false;
106
+ }
107
+ return true;
108
+ });
109
+ if (!selected) {
110
+ throw new Error('No CDP target matched the provided criteria');
111
+ }
112
+ return selected;
113
+ };
114
+ const fetchTargets = async (chrome) => {
115
+ const response = await fetch(`http://${chrome.host}:${chrome.port}/json`);
116
+ if (!response.ok) {
117
+ throw new Error(`Failed to fetch CDP targets (status ${response.status})`);
118
+ }
119
+ const data = await response.json();
120
+ if (!Array.isArray(data)) {
121
+ throw new Error('CDP target list is not an array');
122
+ }
123
+ return data
124
+ .map((target) => ({
125
+ id: target.id,
126
+ title: String(target.title ?? ''),
127
+ url: String(target.url ?? ''),
128
+ webSocketDebuggerUrl: String(target.webSocketDebuggerUrl ?? ''),
129
+ }))
130
+ .filter((target) => Boolean(target.webSocketDebuggerUrl));
131
+ };
132
+ const toConsoleEvent = (params, target) => {
133
+ const record = params;
134
+ const args = Array.isArray(record.args) ? record.args.map(serializeRemoteObject) : [];
135
+ const text = formatArgs(args);
136
+ const frame = record.stackTrace?.callFrames?.[0];
137
+ const file = frame?.url ?? null;
138
+ const line = frame?.lineNumber != null ? frame.lineNumber + 1 : null;
139
+ const column = frame?.columnNumber != null ? frame.columnNumber + 1 : null;
140
+ return {
141
+ ts: Date.now(),
142
+ level: normalizeLevel(record.type ?? 'log'),
143
+ text,
144
+ args,
145
+ file,
146
+ line,
147
+ column,
148
+ pageUrl: target.url ?? null,
149
+ pageTitle: target.title ?? null,
150
+ source: 'console',
151
+ };
152
+ };
153
+ const toExceptionEvent = (params, target) => {
154
+ const record = params;
155
+ const details = record.exceptionDetails;
156
+ const exceptionValue = details?.exception ? serializeRemoteObject(details.exception) : null;
157
+ const args = exceptionValue != null ? [exceptionValue] : [];
158
+ const exceptionDescription = describeExceptionValue(exceptionValue);
159
+ const text = formatExceptionText(details?.text, exceptionDescription);
160
+ const frame = details?.stackTrace?.callFrames?.[0];
161
+ const file = frame?.url ?? null;
162
+ const line = frame?.lineNumber != null ? frame.lineNumber + 1 : null;
163
+ const column = frame?.columnNumber != null ? frame.columnNumber + 1 : null;
164
+ return {
165
+ ts: Date.now(),
166
+ level: 'exception',
167
+ text,
168
+ args,
169
+ file,
170
+ line,
171
+ column,
172
+ pageUrl: target.url ?? null,
173
+ pageTitle: target.title ?? null,
174
+ source: 'exception',
175
+ };
176
+ };
177
+ const describeExceptionValue = (value) => {
178
+ if (value == null) {
179
+ return null;
180
+ }
181
+ if (typeof value === 'string') {
182
+ return value;
183
+ }
184
+ try {
185
+ return JSON.stringify(value);
186
+ }
187
+ catch {
188
+ return String(value);
189
+ }
190
+ };
191
+ const formatExceptionText = (baseText, description) => {
192
+ const trimmed = baseText?.trim();
193
+ if (!trimmed) {
194
+ return description ?? 'Exception';
195
+ }
196
+ if (!description) {
197
+ return trimmed;
198
+ }
199
+ const isGeneric = trimmed === 'Uncaught' || trimmed === 'Uncaught (in promise)';
200
+ if (isGeneric && !trimmed.includes(description)) {
201
+ return `${trimmed}: ${description}`;
202
+ }
203
+ return trimmed;
204
+ };
205
+ const serializeRemoteObject = (value) => {
206
+ if (!value || typeof value !== 'object') {
207
+ return value;
208
+ }
209
+ const record = value;
210
+ if (record.unserializableValue) {
211
+ return record.unserializableValue;
212
+ }
213
+ if (record.value !== undefined) {
214
+ return record.value;
215
+ }
216
+ if (record.preview?.properties) {
217
+ const preview = {};
218
+ for (const prop of record.preview.properties) {
219
+ preview[prop.name] = prop.value ?? '';
220
+ }
221
+ return preview;
222
+ }
223
+ return record.description ?? record.subtype ?? record.type ?? 'Object';
224
+ };
225
+ const normalizeLevel = (level) => {
226
+ if (level === 'warn') {
227
+ return 'warning';
228
+ }
229
+ if (level === 'warning') {
230
+ return 'warning';
231
+ }
232
+ if (level === 'error' || level === 'info' || level === 'debug' || level === 'exception' || level === 'log') {
233
+ return level;
234
+ }
235
+ return 'log';
236
+ };
237
+ const formatArgs = (args) => {
238
+ if (args.length === 0) {
239
+ return '';
240
+ }
241
+ return args.map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ');
242
+ };
243
+ const parseMessage = (data) => {
244
+ if (typeof data === 'string') {
245
+ try {
246
+ return JSON.parse(data);
247
+ }
248
+ catch {
249
+ return null;
250
+ }
251
+ }
252
+ if (data instanceof ArrayBuffer) {
253
+ return parseMessage(new TextDecoder().decode(data));
254
+ }
255
+ return null;
256
+ };
257
+ let nextId = 1;
258
+ const send = (socket, method) => {
259
+ socket.send(JSON.stringify({ id: nextId++, method }));
260
+ };
261
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
262
+ const safeRegex = (pattern) => {
263
+ try {
264
+ return new RegExp(pattern);
265
+ }
266
+ catch {
267
+ throw new Error(`Invalid regex pattern: ${pattern}`);
268
+ }
269
+ };
270
+ const createSystemLog = (message) => ({
271
+ ts: Date.now(),
272
+ level: 'warning',
273
+ text: message,
274
+ args: [],
275
+ file: null,
276
+ line: null,
277
+ column: null,
278
+ pageUrl: null,
279
+ pageTitle: null,
280
+ source: 'system',
281
+ });
282
+ const formatError = (error) => {
283
+ if (!error) {
284
+ return 'Unknown error';
285
+ }
286
+ if (error instanceof Error) {
287
+ return error.message;
288
+ }
289
+ return String(error);
290
+ };
291
+ //# sourceMappingURL=watcher.js.map