@mcp-b/do-runtime 0.6.1 → 0.7.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 +18 -0
- package/README.md +251 -67
- package/dist/backends/sqlite-wasm.d.ts +6 -1
- package/dist/backends/sqlite-wasm.js +70 -5
- package/dist/backends/sqlite-wasm.js.map +1 -1
- package/dist/browser/alarm-coordinator.js +159 -0
- package/dist/browser/alarm-coordinator.js.map +1 -0
- package/dist/browser/message-port-websocket.js +243 -0
- package/dist/browser/message-port-websocket.js.map +1 -0
- package/dist/browser/offscreen-document.js +33 -0
- package/dist/browser/offscreen-document.js.map +1 -0
- package/dist/browser.js +1 -1
- package/dist/chunks/{web-socket-W63BdFn5.js → web-socket-PWFZxlBg.js} +6 -7
- package/dist/chunks/web-socket-PWFZxlBg.js.map +1 -0
- package/dist/gate.js +11 -7
- package/dist/gate.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/src/api/web-socket.d.ts +6 -0
- package/dist/src/browser/alarm-coordinator.d.ts +46 -0
- package/dist/src/browser/message-port-websocket.d.ts +62 -0
- package/dist/src/browser/offscreen-document.d.ts +17 -0
- package/dist/src/server/hibernation-mirror.d.ts +2 -0
- package/docs/assets/browser-agent-runtime.png +0 -0
- package/docs/assets/extension-agent-runtime.svg +178 -0
- package/docs/migrations.md +235 -0
- package/package.json +23 -3
- package/dist/chunks/web-socket-W63BdFn5.js.map +0 -1
package/dist/gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","names":[],"sources":["../src/gate.ts"],"sourcesContent":["/* @do-runtime-gated */\n\nimport {\n atCheckpointEnd,\n tryCurrentContinuation,\n tryCurrentIoContext,\n type IoContext,\n} from \"./io/io-context\";\n\ntype Publication = {\n readonly publish: () => Promise<void>;\n readonly reject: (exception: unknown) => void;\n};\n\ntype Outcome<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly exception: unknown };\n\nconst TRANSFORMED_AWAIT = Symbol(\"@mcp-b/do-runtime/transformed-await\");\n/**\n * Own the gap between publishing an await result and its `__resumeAwait` call.\n * This is deliberately separate from the current-continuation ambient: a\n * reservation serializes publishers but must never make its actor look current.\n * See §2.3 and decision 8.\n */\nconst CURRENT_PUBLICATION = Symbol.for(\"@mcp-b/do-runtime/current-await-publication\");\nconst warnedUngatedAwaits = new Set<string>();\n\ntype PublicationReservation = {\n readonly context: IoContext;\n};\n\ntype TransformedAwait<T> = {\n readonly [TRANSFORMED_AWAIT]: true;\n readonly context: IoContext;\n readonly outcome: Outcome<T>;\n readonly reservation: PublicationReservation;\n};\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n (typeof value === \"object\" && value !== null) ||\n typeof value === \"function\"\n ) && typeof Reflect.get(value, \"then\") === \"function\";\n}\n\n/** Re-enter the actor that owns this transformed await; fail open outside actors. */\nexport function __gate<T>(value: T): T | Promise<Awaited<T>> {\n const context = tryCurrentIoContext();\n if (!isThenable(value) && context === undefined) return value;\n if (context === undefined) return value;\n return resumeWithContext(context, Promise.resolve(value));\n}\n\n/** Capture an actor await without publishing its context before the continuation runs. */\nexport function __gateAwait<T>(\n value: T,\n developmentSource?: string,\n): T | Promise<TransformedAwait<Awaited<T>>> {\n const context = tryCurrentIoContext();\n if (context === undefined) {\n if (developmentSource !== undefined && !warnedUngatedAwaits.has(developmentSource)) {\n warnedUngatedAwaits.add(developmentSource);\n console.warn(\n `do-runtime: transformed await in ${developmentSource} ran without an actor input lock; ` +\n \"an earlier await or entry path is not gated\",\n );\n }\n return value;\n }\n return resumeAwaitWithContext(context, Promise.resolve(value));\n}\n\n/** Restore the captured actor at the first instruction after a transformed await. */\nexport function __resumeAwait<T>(value: T | TransformedAwait<T>): T {\n if (!isTransformedAwait(value)) return value as T;\n\n clearPublication(value.reservation);\n value.context.restoreContinuation();\n if (value.outcome.ok) return value.outcome.value;\n throw value.outcome.exception;\n}\n\nfunction isTransformedAwait<T>(value: T | TransformedAwait<T>): value is TransformedAwait<T> {\n return Reflect.get(Object(value), TRANSFORMED_AWAIT) === true;\n}\n\nfunction currentPublication(): PublicationReservation | undefined {\n return Reflect.get(globalThis, CURRENT_PUBLICATION) as PublicationReservation | undefined;\n}\n\nfunction reservePublication(context: IoContext): PublicationReservation | undefined {\n if (tryCurrentContinuation() !== undefined || currentPublication() !== undefined) return undefined;\n const reservation = { context };\n Reflect.set(globalThis, CURRENT_PUBLICATION, reservation);\n atCheckpointEnd(() => clearPublication(reservation));\n return reservation;\n}\n\nfunction clearPublication(reservation: PublicationReservation): void {\n if (currentPublication() === reservation) {\n Reflect.deleteProperty(globalThis, CURRENT_PUBLICATION);\n }\n}\n\nfunction publishOutcome<T, Result>(\n context: IoContext,\n promise: Promise<T>,\n finish: (outcome: Outcome<T>, reservation: PublicationReservation) => Result,\n): Promise<Result> {\n return new Promise<Result>((resolve, reject) => {\n const publish = context.makeTransformReentryCallback((outcome: Outcome<T>) => {\n const reservation = reservePublication(context);\n if (reservation === undefined) {\n schedulePublication({ publish: () => publish(outcome), reject });\n return;\n }\n resolve(finish(outcome, reservation));\n });\n void promise.then(\n (value) => {\n schedulePublication({ publish: () => publish({ ok: true, value }), reject });\n },\n (exception: unknown) => {\n schedulePublication({ publish: () => publish({ ok: false, exception }), reject });\n },\n );\n });\n}\n\nfunction resumeAwaitWithContext<T>(\n context: IoContext,\n promise: Promise<T>,\n): Promise<TransformedAwait<T>> {\n return publishOutcome(context, promise, (outcome, reservation) => ({\n [TRANSFORMED_AWAIT]: true,\n context,\n outcome,\n reservation,\n }));\n}\n\nfunction resumeWithContext<T>(context: IoContext, promise: Promise<T>): Promise<T> {\n return publishOutcome(context, promise, (outcome, reservation) => {\n clearPublication(reservation);\n context.restoreContinuation();\n if (outcome.ok) return outcome.value;\n throw outcome.exception;\n });\n}\n\n/**\n * Resolve one transformed await per task, inside a fresh actor slice. Admission\n * attempts are independent so a blocked actor cannot stall the actor that will\n * unblock it. The task boundary keeps each continuation ambient isolated.\n */\nfunction schedulePublication(publication: Publication): void {\n const channel = new MessageChannel();\n channel.port1.onmessage = () => {\n channel.port1.close();\n channel.port2.close();\n\n void publication.publish().catch((exception: unknown) => {\n publication.reject(exception);\n });\n };\n channel.port2.postMessage(undefined);\n}\n\nfunction iteratorFor<T>(iterable: AsyncIterable<T> | Iterable<T>): AsyncIterator<T> | Iterator<T> {\n const subject = Object(iterable);\n const asyncIterator: unknown = Reflect.get(subject, Symbol.asyncIterator);\n if (typeof asyncIterator === \"function\") return Reflect.apply(asyncIterator, iterable, []);\n const iterator: unknown = Reflect.get(subject, Symbol.iterator);\n if (typeof iterator === \"function\") return Reflect.apply(iterator, iterable, []);\n throw new TypeError(\"value is not async iterable or iterable\");\n}\n\nfunction gatedIterator<T>(iterable: AsyncIterable<T> | Iterable<T>): AsyncIterator<T> {\n const iterator = iteratorFor(iterable);\n\n function invoke(methodName: \"next\" | \"return\" | \"throw\", args: unknown[]): Promise<IteratorResult<T>> {\n const method: unknown = Reflect.get(iterator, methodName);\n if (typeof method === \"function\") {\n return Promise.resolve(__gate(Reflect.apply(method, iterator, args)));\n }\n if (methodName === \"throw\") return Promise.reject(args[0]);\n return Promise.resolve({ done: true, value: args[0] });\n }\n\n return {\n next: (...args: [] | [unknown]) => invoke(\"next\", args),\n return: (value?: unknown) => invoke(\"return\", [value]),\n throw: (exception?: unknown) => invoke(\"throw\", [exception]),\n };\n}\n\n/** Gate every operation used by `for await`, including early return and throw. */\nexport function __gateAsyncIterable<T, IterableType extends AsyncIterable<T> | Iterable<T>>(\n iterable: IterableType,\n): IterableType;\nexport function __gateAsyncIterable<T>(\n iterable: AsyncIterable<T> | Iterable<T>,\n): AsyncIterable<T> | Iterable<T> {\n const wrapper: AsyncIterable<T> = {\n [Symbol.asyncIterator]: () => gatedIterator(iterable),\n };\n if ((typeof iterable !== \"object\" || iterable === null) && typeof iterable !== \"function\") {\n return wrapper;\n }\n return new Proxy(iterable, {\n get(target, property, receiver): unknown {\n if (property === Symbol.asyncIterator) return wrapper[Symbol.asyncIterator];\n return Reflect.get(target, property, receiver);\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gate.js","names":[],"sources":["../src/gate.ts"],"sourcesContent":["/* @do-runtime-gated */\n\nimport {\n atCheckpointEnd,\n tryCurrentContinuation,\n tryCurrentIoContext,\n type IoContext,\n} from \"./io/io-context\";\n\ntype Publication = {\n readonly publish: () => Promise<void>;\n readonly reject: (exception: unknown) => void;\n};\n\ntype Outcome<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly exception: unknown };\n\nconst TRANSFORMED_AWAIT = Symbol(\"@mcp-b/do-runtime/transformed-await\");\n/**\n * Own the gap between publishing an await result and its `__resumeAwait` call.\n * This is deliberately separate from the current-continuation ambient: a\n * reservation serializes publishers but must never make its actor look current.\n * See §2.3 and decision 8.\n */\nconst CURRENT_PUBLICATION = Symbol.for(\"@mcp-b/do-runtime/current-await-publication\");\nconst warnedUngatedAwaits = new Set<string>();\n\ntype PublicationReservation = {\n readonly context: IoContext;\n};\n\ntype TransformedAwait<T> = {\n readonly [TRANSFORMED_AWAIT]: true;\n readonly context: IoContext;\n readonly outcome: Outcome<T>;\n readonly reservation: PublicationReservation;\n};\n\n/** Re-enter the actor that owns this transformed await; fail open outside actors. */\nexport function __gate<T>(value: T): T | Promise<Awaited<T>> {\n const context = tryCurrentIoContext();\n if (context === undefined) return value;\n return resumeWithContext(context, Promise.resolve(value));\n}\n\n/** Capture an actor await without publishing its context before the continuation runs. */\nexport function __gateAwait<T>(\n value: T,\n developmentSource?: string,\n): T | Promise<TransformedAwait<Awaited<T>>> {\n const context = tryCurrentIoContext();\n if (context === undefined) {\n if (developmentSource !== undefined && !warnedUngatedAwaits.has(developmentSource)) {\n warnedUngatedAwaits.add(developmentSource);\n console.warn(\n `do-runtime: transformed await in ${developmentSource} ran without an actor input lock; ` +\n \"an earlier await or entry path is not gated\",\n );\n }\n return value;\n }\n return resumeAwaitWithContext(context, Promise.resolve(value));\n}\n\n/** Restore the captured actor at the first instruction after a transformed await. */\nexport function __resumeAwait<T>(value: T | TransformedAwait<T>): T {\n if (!isTransformedAwait(value)) return value as T;\n\n clearPublication(value.reservation);\n value.context.restoreContinuation();\n if (value.outcome.ok) return value.outcome.value;\n throw value.outcome.exception;\n}\n\nfunction isTransformedAwait<T>(value: T | TransformedAwait<T>): value is TransformedAwait<T> {\n return Reflect.get(Object(value), TRANSFORMED_AWAIT) === true;\n}\n\nfunction currentPublication(): PublicationReservation | undefined {\n return Reflect.get(globalThis, CURRENT_PUBLICATION) as PublicationReservation | undefined;\n}\n\nfunction reservePublication(context: IoContext): PublicationReservation | undefined {\n if (tryCurrentContinuation() !== undefined || currentPublication() !== undefined) return undefined;\n const reservation = { context };\n Reflect.set(globalThis, CURRENT_PUBLICATION, reservation);\n atCheckpointEnd(() => clearPublication(reservation));\n return reservation;\n}\n\nfunction clearPublication(reservation: PublicationReservation): void {\n if (currentPublication() === reservation) {\n Reflect.deleteProperty(globalThis, CURRENT_PUBLICATION);\n }\n}\n\nfunction publishOutcome<T, Result>(\n context: IoContext,\n promise: Promise<T>,\n finish: (outcome: Outcome<T>, reservation: PublicationReservation) => Result,\n): Promise<Result> {\n const result = new Promise<Result>((resolve, reject) => {\n const publish = context.makeTransformReentryCallback((outcome: Outcome<T>) => {\n const reservation = reservePublication(context);\n if (reservation === undefined) {\n schedulePublication({ publish: () => publish(outcome), reject });\n return;\n }\n resolve(finish(outcome, reservation));\n });\n void promise.then(\n (value) => {\n schedulePublication({ publish: () => publish({ ok: true, value }), reject });\n },\n (exception: unknown) => {\n schedulePublication({ publish: () => publish({ ok: false, exception }), reject });\n },\n );\n });\n // Keep the actor alive through both the foreign wait and queued publication.\n // The caller receives failures; they are not failed background tasks.\n context.addTask(result.then(() => {}, () => {}));\n return result;\n}\n\nfunction resumeAwaitWithContext<T>(\n context: IoContext,\n promise: Promise<T>,\n): Promise<TransformedAwait<T>> {\n return publishOutcome(context, promise, (outcome, reservation) => ({\n [TRANSFORMED_AWAIT]: true,\n context,\n outcome,\n reservation,\n }));\n}\n\nfunction resumeWithContext<T>(context: IoContext, promise: Promise<T>): Promise<T> {\n return publishOutcome(context, promise, (outcome, reservation) => {\n clearPublication(reservation);\n context.restoreContinuation();\n if (outcome.ok) return outcome.value;\n throw outcome.exception;\n });\n}\n\n/**\n * Resolve one transformed await per task, inside a fresh actor slice. Admission\n * attempts are independent so a blocked actor cannot stall the actor that will\n * unblock it. The task boundary keeps each continuation ambient isolated.\n */\nfunction schedulePublication(publication: Publication): void {\n const channel = new MessageChannel();\n channel.port1.onmessage = () => {\n channel.port1.close();\n channel.port2.close();\n\n void publication.publish().catch((exception: unknown) => {\n publication.reject(exception);\n });\n };\n channel.port2.postMessage(undefined);\n}\n\nfunction iteratorFor<T>(iterable: AsyncIterable<T> | Iterable<T>): AsyncIterator<T> | Iterator<T> {\n const subject = Object(iterable);\n const asyncIterator: unknown = Reflect.get(subject, Symbol.asyncIterator);\n if (typeof asyncIterator === \"function\") return Reflect.apply(asyncIterator, iterable, []);\n if (asyncIterator !== undefined && asyncIterator !== null) {\n throw new TypeError(\"Symbol.asyncIterator is not callable\");\n }\n const method: unknown = Reflect.get(subject, Symbol.iterator);\n if (typeof method === \"function\") {\n const iterator = Reflect.apply(method, iterable, []) as Iterator<T>;\n // Let native for-await unwrap sync values and handle rejection/closing.\n return (async function* () {\n for await (const value of { [Symbol.iterator]: () => iterator }) yield value;\n })();\n }\n throw new TypeError(\"value is not async iterable or iterable\");\n}\n\nfunction gatedIterator<T>(iterable: AsyncIterable<T> | Iterable<T>): AsyncIterator<T> {\n const iterator = iteratorFor(iterable);\n\n function invoke(methodName: \"next\" | \"return\" | \"throw\", args: unknown[]): Promise<IteratorResult<T>> {\n const method: unknown = Reflect.get(iterator, methodName);\n if (typeof method === \"function\") {\n return Promise.resolve(__gate(Reflect.apply(method, iterator, args)));\n }\n if (methodName === \"throw\") return Promise.reject(args[0]);\n return Promise.resolve({ done: true, value: args[0] });\n }\n\n return {\n next: (...args: [] | [unknown]) => invoke(\"next\", args),\n return: (value?: unknown) => invoke(\"return\", [value]),\n throw: (exception?: unknown) => invoke(\"throw\", [exception]),\n };\n}\n\n/** Gate every operation used by `for await`, including early return and throw. */\nexport function __gateAsyncIterable<T, IterableType extends AsyncIterable<T> | Iterable<T>>(\n iterable: IterableType,\n): IterableType;\nexport function __gateAsyncIterable<T>(\n iterable: AsyncIterable<T> | Iterable<T>,\n): AsyncIterable<T> | Iterable<T> {\n const wrapper: AsyncIterable<T> = {\n [Symbol.asyncIterator]: () => gatedIterator(iterable),\n };\n if ((typeof iterable !== \"object\" || iterable === null) && typeof iterable !== \"function\") {\n return wrapper;\n }\n return new Proxy(iterable, {\n get(target, property, receiver): unknown {\n if (property === Symbol.asyncIterator) return wrapper[Symbol.asyncIterator];\n return Reflect.get(target, property, receiver);\n },\n });\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as hasUserErrorDetail, d as tryCurrentSlice, f as CanceledError, i as captureGateStack, m as OutputGate, n as IoContext, o as isExceptionFromInputGateBroken, p as InputGate, r as atCheckpointEnd, s as requireInputLock, t as BrokenActorError, u as tryCurrentIoContext } from "./chunks/io-context-BBgKEsdR.js";
|
|
2
|
-
import { _ as DurableObjectClass, a as installWebSocketGlobals, c as DurableObjectStorage, d as LoopbackColoLocalActorNamespace, f as LoopbackDurableObjectClass, g as ACTOR_CLASS_SERIALIZATION_UNIMPLEMENTED_MESSAGE, h as asLoopbackDurableObjectClass, i as acceptWebSocket, l as FACET_NAME_MAX_LENGTH, m as LoopbackServiceStub, n as HibernatableWebSocketRegistry, o as markWebSocketUsed, p as LoopbackDurableObjectNamespace, r as RuntimeWebSocketRequestResponsePair, s as DurableObjectState, t as ALREADY_ACCEPTED_MESSAGE, u as FACET_TREE_MAX_DEPTH, v as DurableObjectId, y as DurableObjectNamespace } from "./chunks/web-socket-
|
|
2
|
+
import { _ as DurableObjectClass, a as installWebSocketGlobals, c as DurableObjectStorage, d as LoopbackColoLocalActorNamespace, f as LoopbackDurableObjectClass, g as ACTOR_CLASS_SERIALIZATION_UNIMPLEMENTED_MESSAGE, h as asLoopbackDurableObjectClass, i as acceptWebSocket, l as FACET_NAME_MAX_LENGTH, m as LoopbackServiceStub, n as HibernatableWebSocketRegistry, o as markWebSocketUsed, p as LoopbackDurableObjectNamespace, r as RuntimeWebSocketRequestResponsePair, s as DurableObjectState, t as ALREADY_ACCEPTED_MESSAGE, u as FACET_TREE_MAX_DEPTH, v as DurableObjectId, y as DurableObjectNamespace } from "./chunks/web-socket-PWFZxlBg.js";
|
|
3
3
|
import { RpcTarget as RpcTarget$1 } from "./cloudflare-workers.js";
|
|
4
4
|
import { a as SqliteDatabase, c as getText, l as hasCurrentSqliteTable, o as getBlob, s as getInt64, t as ensureRuntimeStorageVersion, u as isNull } from "./chunks/sqlite-migrations-DsWmLP_B.js";
|
|
5
5
|
import { ALARM_RETRY_MAX_TRIES, ALARM_RETRY_START_SECONDS, AlarmScheduler, RETRY_BACKOFF_MAX, RETRY_JITTER_FACTOR, alarmRetryDelayMs } from "./server/alarm-scheduler.js";
|
|
@@ -4056,6 +4056,12 @@ var HibernationMirror = class {
|
|
|
4056
4056
|
autoResponse(pair) {
|
|
4057
4057
|
this.#autoResponsePair = cloneAutoResponse(pair);
|
|
4058
4058
|
}
|
|
4059
|
+
/** Also called by a host that answers a ping while no actor container is live. */
|
|
4060
|
+
autoResponseTimestamp(socket, timestamp) {
|
|
4061
|
+
const entry = this.#entries.get(socket);
|
|
4062
|
+
if (entry === void 0) throw new Error("Hibernation mirror: auto-response preceded socket acceptance.");
|
|
4063
|
+
entry.autoResponseTimestamp = timestamp;
|
|
4064
|
+
}
|
|
4059
4065
|
closed(socket) {
|
|
4060
4066
|
this.#entries.delete(socket);
|
|
4061
4067
|
}
|