@mcp-b/do-runtime 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.
Files changed (52) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +110 -0
  3. package/LICENSE.workerd +176 -0
  4. package/NOTICE +7 -0
  5. package/README.md +282 -0
  6. package/dist/backends/node-sqlite.d.ts +38 -0
  7. package/dist/backends/node-sqlite.js +335 -0
  8. package/dist/backends/node-sqlite.js.map +1 -0
  9. package/dist/backends/sqlite-wasm.d.ts +130 -0
  10. package/dist/backends/sqlite-wasm.js +259 -0
  11. package/dist/backends/sqlite-wasm.js.map +1 -0
  12. package/dist/chunks/sqlite-DFg92Tgt.js +498 -0
  13. package/dist/chunks/sqlite-DFg92Tgt.js.map +1 -0
  14. package/dist/cloudflare-workers.js +351 -0
  15. package/dist/cloudflare-workers.js.map +1 -0
  16. package/dist/conformance/host.d.ts +58 -0
  17. package/dist/conformance.js +18 -0
  18. package/dist/conformance.js.map +1 -0
  19. package/dist/index.js +7184 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/server/alarm-scheduler.js +513 -0
  22. package/dist/server/alarm-scheduler.js.map +1 -0
  23. package/dist/src/api/actor-state.d.ts +396 -0
  24. package/dist/src/api/actor.d.ts +306 -0
  25. package/dist/src/api/cloudflare-workers.d.ts +259 -0
  26. package/dist/src/api/export-loopback.d.ts +264 -0
  27. package/dist/src/api/global-scope.d.ts +262 -0
  28. package/dist/src/api/http.d.ts +52 -0
  29. package/dist/src/api/sql.d.ts +188 -0
  30. package/dist/src/api/sync-kv.d.ts +51 -0
  31. package/dist/src/api/web-socket.d.ts +93 -0
  32. package/dist/src/api/worker-loader.d.ts +354 -0
  33. package/dist/src/index.d.ts +130 -0
  34. package/dist/src/io/actor-cache.d.ts +203 -0
  35. package/dist/src/io/actor-id.d.ts +74 -0
  36. package/dist/src/io/actor-sqlite.d.ts +298 -0
  37. package/dist/src/io/io-channels.d.ts +191 -0
  38. package/dist/src/io/io-context.d.ts +451 -0
  39. package/dist/src/io/io-gate.d.ts +298 -0
  40. package/dist/src/io/worker-source.d.ts +108 -0
  41. package/dist/src/io/worker.d.ts +88 -0
  42. package/dist/src/server/actor-container.d.ts +525 -0
  43. package/dist/src/server/actor-id-impl.d.ts +118 -0
  44. package/dist/src/server/alarm-scheduler.d.ts +201 -0
  45. package/dist/src/server/facet-deletion.d.ts +156 -0
  46. package/dist/src/server/facet-tree-index.d.ts +94 -0
  47. package/dist/src/server/sha256.d.ts +39 -0
  48. package/dist/src/transport/rpc-session.d.ts +34 -0
  49. package/dist/src/util/sqlite-kv.d.ts +98 -0
  50. package/dist/src/util/sqlite-metadata.d.ts +46 -0
  51. package/dist/src/util/sqlite.d.ts +291 -0
  52. package/package.json +111 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * ← workerd `src/workerd/util/sqlite.{h,c++}`
3
+ *
4
+ * The SQL backend port. Upstream's seam is the same one: `server.c++` opens
5
+ * `<actor-id>.<facetId>.sqlite` and hands `ActorSqlite` a `SqliteDatabase`.
6
+ *
7
+ * Almost none of upstream's 3,768 lines are ours. `sqlite.{h,c++}` is workerd's
8
+ * binding to the SQLite C API — statement caching, the VFS, regulators, the
9
+ * authorizer, the memory-metering allocator. Underneath us that role is played
10
+ * by `node:sqlite` and sqlite-wasm, which is the storage-backend adaptation the
11
+ * design record sanctions: `io-gate.h` knows nothing about SQLite, `ActorSqlite`
12
+ * calls into it, and that seam is upstream's rather than ours.
13
+ *
14
+ * So this file is two things stacked:
15
+ *
16
+ * 1. `SqlDatabase` / `SqlDatabaseProvider` — the backend seam. `backends/`
17
+ * implements it, and nothing above `util/` ever sees a driver type.
18
+ * 2. `SqliteDatabase` — the small part of upstream's class that is genuinely
19
+ * ours, because the layers above call into it and a stateless exec interface
20
+ * cannot express it: `onRollback`, the transaction/savepoint stack it needs,
21
+ * `reset()` and its `ResetListener` notification, all three of which
22
+ * `sqlite-kv.c++` and `sqlite-metadata.c++` reach for; plus `onWrite`,
23
+ * `notifyWrite` and `onCriticalError`, which only `io/actor-sqlite.ts`
24
+ * reaches for. That last trio lives here rather than one directory up
25
+ * because it lives here upstream (`sqlite.h:240`, `:248`, `:267`): a
26
+ * callback slot is not actor knowledge, and a reader who finds `onWrite` in
27
+ * `sqlite.h` has to find it in this file too. Every consumer takes a
28
+ * `SqliteDatabase`, exactly as upstream's take a `SqliteDatabase&`.
29
+ *
30
+ * `transactionSync` is NOT here — it lives in `io/actor-sqlite.ts` as
31
+ * SAVEPOINT/RELEASE with a depth counter, exactly as upstream has it. Today
32
+ * both browser and Node adapters duplicate `BEGIN IMMEDIATE`, which is why a
33
+ * nested call is a live SQLite error (§2.4). Moving it inward fixes that.
34
+ *
35
+ * Not ported, because the substrate has no equivalent: the `Regulator` /
36
+ * authorizer machinery (there is no untrusted-SQL path in `util/`, and
37
+ * `api/sql.ts` owns that question); `SqliteObserver` row-count billing, whose
38
+ * counters are libsql `STMTSTATUS` extensions neither backend exposes;
39
+ * `sqlite-metering.{h,c++}`, which swaps SQLite's process-wide allocator to
40
+ * meter per-database memory — a C-API facility with no JS analogue; and the
41
+ * point-in-time-recovery APIs, a named substrate boundary in the package README.
42
+ *
43
+ * Spec: §1.4, §2.4 in docs/decisions.md.
44
+ */
45
+ /** The four values SQLite itself accepts after public JSG-style conversion. */
46
+ export type SqlValue = string | number | null | Uint8Array;
47
+ export type SqlResult = {
48
+ readonly columnNames: readonly string[];
49
+ readonly rawRows: readonly (readonly unknown[])[];
50
+ /** Rows changed by this statement, including DML with `RETURNING`. */
51
+ readonly rowsWritten: number;
52
+ };
53
+ /** ← `SqliteDatabase::IngestResult`. */
54
+ export type SqlIngestResult = {
55
+ readonly remainder: string;
56
+ readonly rowsRead: number;
57
+ readonly rowsWritten: number;
58
+ readonly statementCount: number;
59
+ };
60
+ /**
61
+ * One SQLite-compiled statement from the front of a SQL string.
62
+ *
63
+ * `sql` is the exact prefix SQLite consumed, including trigger bodies. Keeping
64
+ * that boundary on the backend is what prevents JavaScript from inventing a
65
+ * second, subtly different SQL grammar.
66
+ */
67
+ export interface SqlDatabaseStatement {
68
+ readonly sql: string;
69
+ readonly parameterCount: number;
70
+ execute(params: readonly SqlValue[]): SqlResult;
71
+ close(): void;
72
+ }
73
+ export declare const SQL_WRONG_BINDINGS_MESSAGE = "Wrong number of parameter bindings for SQL query.";
74
+ /** ← `SQLITE_LIMIT_LENGTH`, raised from 2.2 MB to 4 MiB in workerd 2026-08-20. */
75
+ export declare const SQLITE_LENGTH_LIMIT: number;
76
+ export declare const SQLITE_TOOBIG_MESSAGE = "string or blob too big: SQLITE_TOOBIG";
77
+ /** The part of `sqlite3_limit(SQLITE_LIMIT_LENGTH)` visible at the JS binding seam. */
78
+ export declare function requireSqliteLength(value: unknown): void;
79
+ export declare const SQL_PRELUDE_BINDINGS_MESSAGE: string;
80
+ /**
81
+ * One open database. Synchronous exec, matching every substrate we have: in a
82
+ * SQLite-backed Durable Object reads return a value rather than a promise
83
+ * (§1.4), which is what makes the input gate cheap.
84
+ */
85
+ export interface SqlDatabase {
86
+ /** Compile exactly the first statement, using SQLite's own statement boundary. */
87
+ prepare(sql: string): SqlDatabaseStatement;
88
+ exec(sql: string, params: readonly SqlValue[]): SqlResult;
89
+ readonly databaseSize: number;
90
+ /**
91
+ * ← `sqlite3_get_autocommit(db) == 0`, which is how upstream's
92
+ * `handleCriticalError` learns that SQLite rolled a transaction back on its
93
+ * own (`sqlite.c++:669-691`).
94
+ *
95
+ * SQLite auto-rolls-back on `SQLITE_FULL`, `SQLITE_IOERR`, `SQLITE_NOMEM` and
96
+ * `SQLITE_INTERRUPT`. Nothing announces it, so without this the savepoint
97
+ * stack above would keep believing a transaction is open and the rollback
98
+ * callbacks would never fire — a stale cache with nothing thrown, which is
99
+ * the one failure this layer must never produce.
100
+ */
101
+ readonly inTransaction: boolean;
102
+ /**
103
+ * ← `SqliteDatabase::reset()` — "delete the underlying database file and
104
+ * create a new one in its place", which is how upstream implements
105
+ * `deleteAll()`.
106
+ *
107
+ * On the backend rather than above it because only the backend knows how to
108
+ * recreate its own file, and because the alternative — enumerating and
109
+ * dropping every table — is the fragile dance today's `storage.ts` performs,
110
+ * complete with an FTS5 shadow-table ordering hazard its comment documents.
111
+ * The `SqlDatabase` reference stays valid across the call; what changes is
112
+ * the file behind it.
113
+ */
114
+ reset(): void;
115
+ close(): void;
116
+ }
117
+ /**
118
+ * Opens databases within ONE actor's storage scope. The package derives the
119
+ * names (`"root"`, `` `facet-${facetId}` ``); the host maps them onto files.
120
+ * OPFS layout knowledge stays with the host — this package never reaches for
121
+ * `navigator.storage`.
122
+ */
123
+ export interface SqlDatabaseProvider {
124
+ open(name: string): Promise<SqlDatabase>;
125
+ }
126
+ /** A portable, host-owned image of every SQLite database in one actor storage scope. */
127
+ export type SqlDatabaseSnapshot = {
128
+ readonly version: 1;
129
+ readonly databases: readonly {
130
+ readonly name: string;
131
+ readonly image: Uint8Array;
132
+ }[];
133
+ };
134
+ /** Local backup/restore. This is deliberately not Cloudflare's time-indexed PITR service. */
135
+ export interface SqlDatabaseSnapshotProvider extends SqlDatabaseProvider {
136
+ /** Close every database opened through this provider before snapshot or placement teardown. */
137
+ close(): void;
138
+ exportSnapshot(): Promise<SqlDatabaseSnapshot>;
139
+ importSnapshot(snapshot: SqlDatabaseSnapshot): Promise<void>;
140
+ }
141
+ export declare function requireSafeDatabaseName(name: string): void;
142
+ /** Validate the complete snapshot before a backend replaces any files. */
143
+ export declare function requireValidSqlDatabaseSnapshot(snapshot: SqlDatabaseSnapshot): void;
144
+ /**
145
+ * ← `SqliteDatabase::QueryOptions`. The C++ regulator pointer is narrowed to
146
+ * a callback over the exact SQL source SQLite compiled; `api/sql.ts` owns the
147
+ * policy because this backend seam owns no public-API knowledge.
148
+ *
149
+ * `allowUnconfirmed`'s only destination is `onWrite(bool allowUnconfirmed)`,
150
+ * which fires *before* the statement executes so the automatic transaction
151
+ * opens first — see `isWrite` below for how a statement is known to be a write
152
+ * without the compiled plan upstream reads it from.
153
+ */
154
+ export type QueryOptions = {
155
+ allowUnconfirmed?: boolean;
156
+ /** The public SQL regulator, run once against each SQLite-compiled statement. */
157
+ regulate?: (sql: string) => void;
158
+ };
159
+ /**
160
+ * ← the state `SqliteDatabase::onCriticalError` reports and
161
+ * `observedCriticalError()` latches.
162
+ *
163
+ * Raised when SQLite has rolled back an open transaction on its own. Upstream
164
+ * hands this to `ActorSqlite`, which treats it as fatal; §1.6 is why — a
165
+ * storage failure this severe destroys the object rather than being survived.
166
+ * Until `io/actor-sqlite.ts` wires it to `onBroken`, latching it and refusing
167
+ * every subsequent statement is what keeps a caller from reading through a
168
+ * cache that is knowingly wrong.
169
+ */
170
+ export declare class SqliteCriticalError extends Error {
171
+ readonly name = "SqliteCriticalError";
172
+ }
173
+ /**
174
+ * ← `SqliteDatabase::ResetListener`.
175
+ *
176
+ * Upstream's is a base class whose constructor registers and whose destructor
177
+ * unregisters. JS has neither, so registration is the explicit
178
+ * `db.addResetListener(this)` call — the same translation Section 1 applied to
179
+ * every kj destructor.
180
+ */
181
+ export interface ResetListener {
182
+ /** Called before the database is actually reset. */
183
+ beforeSqliteReset(): void;
184
+ }
185
+ /** ← `SqliteDatabase::Query::isNull(uint column)`. */
186
+ export declare function isNull(row: readonly unknown[], column: number): boolean;
187
+ /** ← `SqliteDatabase::Query::getBlob(uint column)`. Fails closed on any other column type. */
188
+ export declare function getBlob(row: readonly unknown[], column: number): Uint8Array;
189
+ /** ← `SqliteDatabase::Query::getText(uint column)`. Fails closed on any other column type. */
190
+ export declare function getText(row: readonly unknown[], column: number): string;
191
+ /**
192
+ * ← `SqliteDatabase::Query::getInt64(uint column)`.
193
+ *
194
+ * Narrowed to a safe integer rather than upstream's `int64_t`: a JS number
195
+ * cannot carry the full range, and a silently-rounded row id or alarm time is
196
+ * exactly the kind of corruption this layer must not produce.
197
+ */
198
+ export declare function getInt64(row: readonly unknown[], column: number): number;
199
+ /**
200
+ * ← `SqliteDatabase`, restricted to the members `sqlite-kv` and
201
+ * `sqlite-metadata` actually call.
202
+ *
203
+ * The one piece of real machinery here is the transaction/savepoint stack that
204
+ * `onRollback()` needs. Upstream learns of a `BEGIN` / `SAVEPOINT` / `COMMIT` /
205
+ * `RELEASE` / `ROLLBACK` from the SQLite authorizer while the statement is
206
+ * being compiled (`prepareSql` fills a `ParseContext::stateChange`); we have no
207
+ * authorizer, so the statement text is the only source. `applyChange` below is
208
+ * a line-for-line port of upstream's; only where the `StateChange` comes from
209
+ * differs.
210
+ */
211
+ export declare class SqliteDatabase {
212
+ #private;
213
+ constructor(backend: SqlDatabase);
214
+ /**
215
+ * Invokes the given callback whenever a query begins which may write to the
216
+ * database. The callback is called just before executing the query.
217
+ *
218
+ * Durable Objects uses this to automatically begin a transaction and close the
219
+ * output gate.
220
+ *
221
+ * Note that the write callback is NOT called before (or at any point during) a
222
+ * `reset()`. Use the `ResetListener` mechanism for that case.
223
+ */
224
+ onWrite(callback: (allowUnconfirmed: boolean) => void): void;
225
+ /**
226
+ * Invokes the given callback when a "critical error" causes an automatic
227
+ * rollback during a transaction.
228
+ *
229
+ * See: https://www.sqlite.org/lang_transaction.html#response_to_errors_within_a_transaction
230
+ *
231
+ * Upstream passes `(errorMessage, maybeException)` and lets the caller build
232
+ * the exception; `#checkForAutoRollback` has already built one by the time it
233
+ * can tell a rollback happened, so the callback receives that.
234
+ */
235
+ onCriticalError(callback: (exception: SqliteCriticalError) => void): void;
236
+ /**
237
+ * Invoke the onWrite() callback.
238
+ *
239
+ * "This is useful when the caller is about to execute a statement which SQLite
240
+ * considers read-only, but needs to be considered a write for our purposes. In
241
+ * particular, we use the onWrite callback to start automatic transactions, and
242
+ * we use the SAVEPOINT statement to implement explicit transactions. For
243
+ * synchronous transactions, the explicit transaction needs to be nested inside
244
+ * the automatic transaction, so we need to force an auto-transaction to start
245
+ * before the SAVEPOINT."
246
+ */
247
+ notifyWrite(allowUnconfirmed?: boolean): void;
248
+ /** ← `SqliteDatabase::run`, in both its bare and its `QueryOptions` form. */
249
+ run(sql: string, ...bindings: SqlValue[]): SqlResult;
250
+ run(options: QueryOptions, sql: string, ...bindings: SqlValue[]): SqlResult;
251
+ /** ← `SqliteDatabase::ingestSql`: execute complete statements, retain the partial tail. */
252
+ ingest(sql: string, regulate?: (sql: string) => void): SqlIngestResult;
253
+ /**
254
+ * ← `SqliteDatabase::observedCriticalError()`. The named state
255
+ * `io/actor-sqlite.ts` wires to `onBroken`, so it does not have to re-derive
256
+ * the condition from an exception it caught.
257
+ */
258
+ observedCriticalError(): SqliteCriticalError | undefined;
259
+ /**
260
+ * The guard for any read this package serves from a cache rather than from a
261
+ * statement. Those are the only paths a latched critical error would not
262
+ * already stop, and they are exactly the paths whose answer is wrong once
263
+ * SQLite has rolled back underneath them.
264
+ */
265
+ assertUsable(): void;
266
+ get databaseSize(): number;
267
+ /**
268
+ * ← `SqliteDatabase::onRollback`.
269
+ *
270
+ * "Register a callback which shall be called if the current transaction is
271
+ * rolled back. If the current transaction commits, then the callback is
272
+ * discarded without invoking it. [...] When a rollback occurs, callbacks are
273
+ * invoked in the reverse of the order in which they were registered."
274
+ *
275
+ * With nothing open there is nothing that can roll back, so the callback is
276
+ * dropped — upstream's `if (inTransaction || !savepoints.empty())`.
277
+ */
278
+ onRollback(callback: () => void): void;
279
+ addResetListener(listener: ResetListener): void;
280
+ removeResetListener(listener: ResetListener): void;
281
+ /** ← `SqliteDatabase::reset()`. */
282
+ reset(): void;
283
+ close(): void;
284
+ }
285
+ type SqliteSchemaDatabase = Pick<SqlDatabase, "exec"> | Pick<SqliteDatabase, "run">;
286
+ /**
287
+ * Returns whether a runtime-owned table exists, and refuses any present shape
288
+ * other than the one this release writes.
289
+ */
290
+ export declare function hasCurrentSqliteTable(db: SqliteSchemaDatabase, name: string, createSql: string): boolean;
291
+ export {};
package/package.json ADDED
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "@mcp-b/do-runtime",
3
+ "version": "0.1.0",
4
+ "description": "Cloudflare's Durable Object runtime (workerd), ported to TypeScript: actors with input/output gates, SQLite storage, facets and alarms, running in the browser and in Node.",
5
+ "keywords": [
6
+ "actors",
7
+ "browser",
8
+ "cloudflare",
9
+ "durable-objects",
10
+ "opfs",
11
+ "sqlite",
12
+ "typescript",
13
+ "workerd"
14
+ ],
15
+ "homepage": "https://github.com/WebMCP-org/do-runtime#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/WebMCP-org/do-runtime/issues"
18
+ },
19
+ "license": "FSL-1.1-MIT",
20
+ "author": "Kukumis, Inc.",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/WebMCP-org/do-runtime.git"
24
+ },
25
+ "type": "module",
26
+ "types": "./dist/src/index.d.ts",
27
+ "files": [
28
+ "dist",
29
+ "CHANGELOG.md",
30
+ "LICENSE",
31
+ "LICENSE.workerd",
32
+ "NOTICE",
33
+ "README.md"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public",
37
+ "registry": "https://registry.npmjs.org/"
38
+ },
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/src/index.d.ts",
42
+ "import": "./dist/index.js"
43
+ },
44
+ "./server/alarm-scheduler": {
45
+ "types": "./dist/src/server/alarm-scheduler.d.ts",
46
+ "import": "./dist/server/alarm-scheduler.js"
47
+ },
48
+ "./backends/sqlite-wasm": {
49
+ "types": "./dist/backends/sqlite-wasm.d.ts",
50
+ "import": "./dist/backends/sqlite-wasm.js"
51
+ },
52
+ "./backends/node-sqlite": {
53
+ "types": "./dist/backends/node-sqlite.d.ts",
54
+ "import": "./dist/backends/node-sqlite.js"
55
+ },
56
+ "./cloudflare-workers": {
57
+ "types": "./dist/src/api/cloudflare-workers.d.ts",
58
+ "import": "./dist/cloudflare-workers.js"
59
+ },
60
+ "./conformance": {
61
+ "types": "./dist/conformance/host.d.ts",
62
+ "import": "./dist/conformance.js"
63
+ },
64
+ "./package.json": "./package.json"
65
+ },
66
+ "dependencies": {
67
+ "@ungap/structured-clone": "1.3.3",
68
+ "capnweb": "0.10.0"
69
+ },
70
+ "devDependencies": {
71
+ "@arethetypeswrong/cli": "0.18.5",
72
+ "@changesets/cli": "^2.29.8",
73
+ "@cloudflare/vitest-pool-workers": "^0.18.8",
74
+ "@cloudflare/workers-types": "5.20260820.1",
75
+ "@sqlite.org/sqlite-wasm": "3.53.0-build1",
76
+ "@types/node": "^26.1.2",
77
+ "@types/ungap__structured-clone": "1.2.0",
78
+ "@vitest/browser-playwright": "4.1.10",
79
+ "playwright": "1.61.1",
80
+ "publint": "0.3.23",
81
+ "typescript": "^5.9.3",
82
+ "vite": "^8.1.5",
83
+ "vitest": "4.1.10",
84
+ "workerd": "1.20260820.1",
85
+ "wrangler": "^4.114.0"
86
+ },
87
+ "engines": {
88
+ "node": ">=24.11.0"
89
+ },
90
+ "scripts": {
91
+ "build": "pnpm build:package",
92
+ "typecheck": "pnpm build:package && tsc -b tsconfig.json && tsc -p conformance/tsconfig.json && tsc -p examples/extension/tsconfig.page.json && tsc -p examples/extension/tsconfig.worker.json && tsc -p examples/vibe-platform/tsconfig.page.json && tsc -p examples/vibe-platform/tsconfig.worker.json",
93
+ "test": "pnpm test:unit && pnpm test:conformance",
94
+ "examples:build": "pnpm build:package && pnpm --filter \"do-runtime-example-*\" build",
95
+ "test:examples": "pnpm build:package && node examples/extension/scripts/e2e.mjs && node examples/vibe-platform/scripts/e2e.mjs",
96
+ "test:unit": "vitest run --config vitest.unit.config.ts",
97
+ "test:conformance": "pnpm test:conformance-workerd && pnpm test:conformance-node && pnpm test:conformance-browser",
98
+ "test:conformance-workerd": "vitest run --config conformance/workerd/vitest.config.ts",
99
+ "test:conformance-node": "vitest run --config conformance/node/vitest.config.ts",
100
+ "test:conformance-browser": "vitest run --config conformance/browser/vitest.config.ts",
101
+ "check:oracle": "node scripts/check-workerd-oracle.mjs",
102
+ "check:package": "pnpm build:package && publint && attw --pack . --profile esm-only && node scripts/check-package.mjs",
103
+ "build:package": "node scripts/build-package.mjs && tsc -p tsconfig.publish.json && node scripts/fix-declaration-imports.mjs",
104
+ "changeset": "changeset",
105
+ "changeset:version": "changeset version",
106
+ "changeset:publish": "pnpm check:package && changeset publish",
107
+ "publish:dry": "pnpm publish --access public --dry-run",
108
+ "bench:node": "vitest run --config conformance/bench/vitest.node.config.ts",
109
+ "bench:browser": "vitest run --config conformance/bench/vitest.browser.config.ts"
110
+ }
111
+ }