rivetkit 2.3.0-rc.12 → 2.3.0-rc.13

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 (113) hide show
  1. package/dist/browser/client.d.ts +50 -0
  2. package/dist/browser/client.js +98 -84
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +12 -2
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/tsup/actor/errors.d.cts +1 -1
  7. package/dist/tsup/actor/errors.d.ts +1 -1
  8. package/dist/tsup/agent-os/index.cjs +66 -3
  9. package/dist/tsup/agent-os/index.cjs.map +1 -1
  10. package/dist/tsup/agent-os/index.d.cts +50 -0
  11. package/dist/tsup/agent-os/index.d.ts +50 -0
  12. package/dist/tsup/agent-os/index.js +66 -3
  13. package/dist/tsup/agent-os/index.js.map +1 -1
  14. package/dist/tsup/{chunk-EWVOWEMD.js → chunk-33YE6XCI.js} +4 -4
  15. package/dist/tsup/{chunk-2ZTBRZRS.cjs → chunk-7OR3CHD5.cjs} +10 -10
  16. package/dist/tsup/{chunk-2ZTBRZRS.cjs.map → chunk-7OR3CHD5.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-UETC5RF7.cjs → chunk-7XQCARVY.cjs} +3 -3
  18. package/dist/tsup/{chunk-UETC5RF7.cjs.map → chunk-7XQCARVY.cjs.map} +1 -1
  19. package/dist/tsup/{chunk-SS56HFM2.cjs → chunk-BSPS6NSN.cjs} +5 -5
  20. package/dist/tsup/{chunk-SS56HFM2.cjs.map → chunk-BSPS6NSN.cjs.map} +1 -1
  21. package/dist/tsup/{chunk-WIMUFZVJ.js → chunk-DPIMKYNB.js} +61 -2
  22. package/dist/tsup/chunk-DPIMKYNB.js.map +1 -0
  23. package/dist/tsup/{chunk-2U6RLFKX.cjs → chunk-E5CLYAUZ.cjs} +144 -142
  24. package/dist/tsup/chunk-E5CLYAUZ.cjs.map +1 -0
  25. package/dist/tsup/{chunk-VNMIAPPF.cjs → chunk-EBWOJRCC.cjs} +21 -4
  26. package/dist/tsup/chunk-EBWOJRCC.cjs.map +1 -0
  27. package/dist/tsup/{chunk-OLIJHKLL.js → chunk-HHNYEQD3.js} +6 -6
  28. package/dist/tsup/chunk-HHNYEQD3.js.map +1 -0
  29. package/dist/tsup/{chunk-3EVVOYFD.js → chunk-IOUSQVXI.js} +20 -3
  30. package/dist/tsup/chunk-IOUSQVXI.js.map +1 -0
  31. package/dist/tsup/{chunk-C7AAIILH.cjs → chunk-ISDKSSYR.cjs} +4 -4
  32. package/dist/tsup/{chunk-C7AAIILH.cjs.map → chunk-ISDKSSYR.cjs.map} +1 -1
  33. package/dist/tsup/{chunk-7UZF56RS.js → chunk-J72WHUBC.js} +10 -8
  34. package/dist/tsup/{chunk-7UZF56RS.js.map → chunk-J72WHUBC.js.map} +1 -1
  35. package/dist/tsup/{chunk-6KTMKPNU.cjs → chunk-KWABEUUA.cjs} +10 -10
  36. package/dist/tsup/chunk-KWABEUUA.cjs.map +1 -0
  37. package/dist/tsup/{chunk-WHYBAEWG.cjs → chunk-NIY3RSPX.cjs} +62 -3
  38. package/dist/tsup/chunk-NIY3RSPX.cjs.map +1 -0
  39. package/dist/tsup/{chunk-VLXRFJ7P.js → chunk-T44AVAGW.js} +2 -2
  40. package/dist/tsup/{chunk-QKSGGKGQ.js → chunk-TCXEM6PA.js} +2 -2
  41. package/dist/tsup/{chunk-OOB32JVG.js → chunk-ZI5CNA2Z.js} +2 -2
  42. package/dist/tsup/client/mod.cjs +7 -7
  43. package/dist/tsup/client/mod.cjs.map +1 -1
  44. package/dist/tsup/client/mod.d.cts +3 -3
  45. package/dist/tsup/client/mod.d.ts +3 -3
  46. package/dist/tsup/client/mod.js +6 -6
  47. package/dist/tsup/common/log.cjs +2 -2
  48. package/dist/tsup/common/log.js +1 -1
  49. package/dist/tsup/common/websocket.cjs +3 -3
  50. package/dist/tsup/common/websocket.js +2 -2
  51. package/dist/tsup/{config-DKgPGC0f.d.ts → config-BxWAw3iH.d.ts} +121 -2
  52. package/dist/tsup/{config-BtAh7oBu.d.cts → config-CZQQ-mso.d.cts} +121 -2
  53. package/dist/tsup/{context-Cfjl5pgz.d.cts → context-Bw7xq8w3.d.cts} +1 -1
  54. package/dist/tsup/{context-C-6dGebY.d.ts → context-D8QA76sV.d.ts} +1 -1
  55. package/dist/tsup/dynamic/mod.cjs +2 -2
  56. package/dist/tsup/dynamic/mod.d.cts +2 -2
  57. package/dist/tsup/dynamic/mod.d.ts +2 -2
  58. package/dist/tsup/dynamic/mod.js +1 -1
  59. package/dist/tsup/inspector/mod.cjs +5 -5
  60. package/dist/tsup/inspector/mod.js +4 -4
  61. package/dist/tsup/inspector-tab/mod.cjs +173 -0
  62. package/dist/tsup/inspector-tab/mod.cjs.map +1 -0
  63. package/dist/tsup/inspector-tab/mod.d.cts +250 -0
  64. package/dist/tsup/inspector-tab/mod.d.ts +250 -0
  65. package/dist/tsup/inspector-tab/mod.js +173 -0
  66. package/dist/tsup/inspector-tab/mod.js.map +1 -0
  67. package/dist/tsup/mod.cjs +189 -81
  68. package/dist/tsup/mod.cjs.map +1 -1
  69. package/dist/tsup/mod.d.cts +4 -4
  70. package/dist/tsup/mod.d.ts +4 -4
  71. package/dist/tsup/mod.js +124 -16
  72. package/dist/tsup/mod.js.map +1 -1
  73. package/dist/tsup/test/mod.cjs +10 -10
  74. package/dist/tsup/test/mod.d.cts +2 -2
  75. package/dist/tsup/test/mod.d.ts +2 -2
  76. package/dist/tsup/test/mod.js +6 -6
  77. package/dist/tsup/{utils-DVekpm4I.d.cts → utils-DQosb24I.d.cts} +1 -1
  78. package/dist/tsup/{utils-DVekpm4I.d.ts → utils-DQosb24I.d.ts} +1 -1
  79. package/dist/tsup/utils.cjs +2 -2
  80. package/dist/tsup/utils.d.cts +1 -1
  81. package/dist/tsup/utils.d.ts +1 -1
  82. package/dist/tsup/utils.js +1 -1
  83. package/dist/tsup/workflow/mod.cjs +11 -11
  84. package/dist/tsup/workflow/mod.cjs.map +1 -1
  85. package/dist/tsup/workflow/mod.d.cts +4 -4
  86. package/dist/tsup/workflow/mod.d.ts +4 -4
  87. package/dist/tsup/workflow/mod.js +5 -5
  88. package/package.json +19 -9
  89. package/src/actor/config.ts +91 -0
  90. package/src/actor/instance/mod.ts +4 -4
  91. package/src/actor/mod.ts +2 -0
  92. package/src/common/engine.ts +28 -1
  93. package/src/devtools-loader/index.ts +4 -7
  94. package/src/devtools-loader/serve-devtools.ts +26 -0
  95. package/src/engine-client/actor-http-client.ts +2 -2
  96. package/src/engine-client/ws-proxy.ts +5 -0
  97. package/src/inspector-tab/mod.ts +315 -0
  98. package/src/registry/config/index.ts +37 -7
  99. package/src/registry/index.ts +4 -2
  100. package/src/registry/native.ts +118 -7
  101. package/src/registry/runtime.ts +20 -0
  102. package/src/utils/env-vars.ts +6 -0
  103. package/dist/tsup/chunk-2U6RLFKX.cjs.map +0 -1
  104. package/dist/tsup/chunk-3EVVOYFD.js.map +0 -1
  105. package/dist/tsup/chunk-6KTMKPNU.cjs.map +0 -1
  106. package/dist/tsup/chunk-OLIJHKLL.js.map +0 -1
  107. package/dist/tsup/chunk-VNMIAPPF.cjs.map +0 -1
  108. package/dist/tsup/chunk-WHYBAEWG.cjs.map +0 -1
  109. package/dist/tsup/chunk-WIMUFZVJ.js.map +0 -1
  110. /package/dist/tsup/{chunk-EWVOWEMD.js.map → chunk-33YE6XCI.js.map} +0 -0
  111. /package/dist/tsup/{chunk-VLXRFJ7P.js.map → chunk-T44AVAGW.js.map} +0 -0
  112. /package/dist/tsup/{chunk-QKSGGKGQ.js.map → chunk-TCXEM6PA.js.map} +0 -0
  113. /package/dist/tsup/{chunk-OOB32JVG.js.map → chunk-ZI5CNA2Z.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs","../../src/actor/log.ts","../../src/actor/definition.ts","../../src/actor/schema.ts","../../src/common/inline-websocket-adapter.ts","../../src/registry/index.ts","../../src/common/engine.ts","../../src/registry/log.ts","../../src/serverless/configure.ts","../../src/utils/serve.ts","../../src/registry/config/index.ts","../../src/registry/config/envoy.ts","../../src/registry/config/serverless.ts","../../src/registry/native.ts","../../src/common/database/native-database.ts","../../src/registry/runtime.ts","../../src/registry/napi-runtime.ts","../../src/registry/native-validation.ts","../../src/registry/wasm-runtime.ts","../../src/registry/write-through-proxy.ts"],"names":["error","method","asActorFactoryHandle","queue","event","_a","_b"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs","sourcesContent":[null,"import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport {\n\ttype Actions,\n\ttype ActorConfig,\n\ttype ActorConfigInput,\n\tActorConfigSchema,\n} from \"./config\";\nimport { loggerWithoutContext } from \"./log\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"./schema\";\n\nconst warnedDeprecatedTimeoutKeys = new Set<string>();\n\nfunction warnDeprecatedShutdownTimeoutKeys(options: unknown) {\n\tif (!options || typeof options !== \"object\") return;\n\tconst opts = options as Record<string, unknown>;\n\tfor (const key of [\"onDestroyTimeout\", \"waitUntilTimeout\"]) {\n\t\tif (opts[key] !== undefined && !warnedDeprecatedTimeoutKeys.has(key)) {\n\t\t\twarnedDeprecatedTimeoutKeys.add(key);\n\t\t\tloggerWithoutContext().warn({\n\t\t\t\tmsg: `actor option \\`${key}\\` is deprecated and is now ignored. Configure \\`sleepGracePeriod\\` instead, which bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0.`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport interface BaseActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\t_R extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> {\n\treadonly config: ActorConfig<S, CP, CS, V, I, DB, E, Q, _R>;\n}\n\nexport interface AnyActorDefinition {\n\treadonly config: any;\n}\n\nexport type AnyStaticActorDefinition = ActorDefinition<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport class ActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\tR extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> implements BaseActorDefinition<S, CP, CS, V, I, DB, E, Q, R>\n{\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q, R>;\n\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q, R>) {\n\t\tthis.#config = config;\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q, R> {\n\t\treturn this.#config;\n\t}\n}\n\nexport interface BaseActorInstance<\n\tS = any,\n\tCP = any,\n\tCS = any,\n\tV = any,\n\tI = any,\n\tDB extends AnyDatabaseProvider = AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\tid: string;\n\tconfig: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\trLog: Record<string, (...args: any[]) => any>;\n\t[key: string]: any;\n}\n\nexport type AnyActorInstance = BaseActorInstance<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type AnyStaticActorInstance = AnyActorInstance;\n\nexport function isStaticActorInstance(\n\t_actor: AnyActorInstance,\n): _actor is AnyStaticActorInstance {\n\treturn true;\n}\n\nexport function actor<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues,\n\t\tTActions\n\t>,\n): ActorDefinition<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues,\n\tTActions\n> {\n\twarnDeprecatedShutdownTimeoutKeys(\n\t\t(input as { options?: unknown } | undefined)?.options,\n\t);\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues,\n\t\tTActions\n\t>;\n\treturn new ActorDefinition(config);\n}\n\nexport function isStaticActorDefinition(\n\tdefinition: AnyActorDefinition,\n): definition is AnyStaticActorDefinition {\n\treturn definition instanceof ActorDefinition;\n}\n\nexport function lookupInRegistry(\n\tconfig: RegistryConfig,\n\tname: string,\n): AnyActorDefinition {\n\tconst definition = config.use[name];\n\tif (!definition) throw new Error(`no actor in registry for name ${name}`);\n\treturn definition;\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { unsupportedFeature } from \"./errors\";\n\nexport type SchemaHookResult = boolean | Promise<boolean>;\n\ntype SchemaHook<TContext = any> = (ctx: TContext) => SchemaHookResult;\n\nexport interface EventTypeToken<T, TContext = any> {\n\treadonly _eventType?: T;\n\treadonly canSubscribe?: SchemaHook<TContext>;\n\treadonly schema?: PrimitiveSchema;\n}\n\nexport interface QueueTypeToken<TMessage, TComplete = never, TContext = any> {\n\treadonly _queueMessage?: TMessage;\n\treadonly _queueComplete?: TComplete;\n\treadonly canPublish?: SchemaHook<TContext>;\n\treadonly message?: PrimitiveSchema;\n\treadonly complete?: PrimitiveSchema;\n}\n\n/** @deprecated Use `event<T>()`. */\nexport type Type<T> = EventTypeToken<T, any>;\n\ninterface EventOptions<TContext = any> {\n\tcanSubscribe?: SchemaHook<TContext>;\n\tschema?: PrimitiveSchema;\n}\n\ninterface QueueOptions<TContext = any> {\n\tcanPublish?: SchemaHook<TContext>;\n\tmessage?: PrimitiveSchema;\n\tcomplete?: PrimitiveSchema;\n}\n\nexport function event<T, TContext = any>(\n\toptions?: EventOptions<TContext>,\n): EventTypeToken<T, TContext> {\n\treturn (options ?? {}) as EventTypeToken<T, TContext>;\n}\n\nexport function queue<TMessage, TComplete = never, TContext = any>(\n\toptions?: QueueOptions<TContext>,\n): QueueTypeToken<TMessage, TComplete, TContext> {\n\treturn (options ?? {}) as QueueTypeToken<TMessage, TComplete, TContext>;\n}\n\nexport type PrimitiveSchema = StandardSchemaV1 | EventTypeToken<unknown, any>;\n\nexport interface EventSchemaDefinition<TContext = any> {\n\tschema: PrimitiveSchema;\n\tcanSubscribe?: SchemaHook<TContext>;\n}\n\nexport interface QueueSchemaDefinition<TContext = any> {\n\tmessage: PrimitiveSchema;\n\tcomplete?: PrimitiveSchema;\n\tcanPublish?: SchemaHook<TContext>;\n}\n\nexport type EventSchema<TContext = any> =\n\t| PrimitiveSchema\n\t| EventSchemaDefinition<TContext>;\nexport type QueueSchema =\n\t| PrimitiveSchema\n\t| QueueSchemaDefinition<any>\n\t| QueueTypeToken<unknown, unknown, any>;\nexport type EventSchemaConfig<TContext = any> = Record<\n\tstring,\n\tEventSchema<TContext>\n>;\nexport type QueueSchemaConfig<_TContext = any> = Record<string, QueueSchema>;\nexport type AnySchemaConfig = EventSchemaConfig | QueueSchemaConfig;\n\n/** @deprecated Use `EventSchema` or `QueueSchema`. */\nexport type Schema = QueueSchema;\n/** @deprecated Use `EventSchemaConfig` or `QueueSchemaConfig`. */\nexport type SchemaConfig = QueueSchemaConfig;\n\nexport type InferSchema<T> =\n\tT extends QueueSchemaDefinition<any>\n\t\t? InferSchema<T[\"message\"]>\n\t\t: T extends QueueTypeToken<infer M, unknown, any>\n\t\t\t? M\n\t\t\t: T extends EventSchemaDefinition<any>\n\t\t\t\t? InferSchema<T[\"schema\"]>\n\t\t\t\t: T extends StandardSchemaV1<any, infer O>\n\t\t\t\t\t? O\n\t\t\t\t\t: T extends EventTypeToken<infer R, any>\n\t\t\t\t\t\t? R\n\t\t\t\t\t\t: never;\n\nexport type InferSchemaMap<T extends Record<string, unknown>> = {\n\t[K in keyof T]: InferSchema<T[K]>;\n};\n\nexport type InferQueueComplete<T> =\n\tT extends QueueTypeToken<unknown, infer C, any>\n\t\t? [C] extends [never]\n\t\t\t? never\n\t\t\t: C\n\t\t: T extends QueueSchemaDefinition<any>\n\t\t\t? T[\"complete\"] extends PrimitiveSchema\n\t\t\t\t? InferSchema<T[\"complete\"]>\n\t\t\t\t: never\n\t\t\t: never;\n\nexport type InferQueueCompleteMap<T extends QueueSchemaConfig> = {\n\t[K in keyof T]: InferQueueComplete<T[K]>;\n};\n\nexport type InferEventArgs<T> = T extends readonly unknown[]\n\t? number extends T[\"length\"]\n\t\t? [T]\n\t\t: T\n\t: [T];\n\nexport type ValidationResult<T> =\n\t| { success: true; data: T }\n\t| { success: false; issues: unknown[] };\n\nexport function isStandardSchema(value: unknown): value is StandardSchemaV1 {\n\treturn typeof value === \"object\" && value !== null && \"~standard\" in value;\n}\n\nexport function isQueueSchemaDefinition(\n\tvalue: unknown,\n): value is QueueSchemaDefinition<any> {\n\tif (isEventSchemaDefinition(value)) {\n\t\treturn false;\n\t}\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"message\" in value &&\n\t\t(value as { message?: unknown }).message !== undefined\n\t);\n}\n\nexport function isEventSchemaDefinition(\n\tvalue: unknown,\n): value is EventSchemaDefinition<any> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"schema\" in value &&\n\t\t(value as { schema?: unknown }).schema !== undefined\n\t);\n}\n\nexport function hasSchemaConfigKey<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: string,\n): boolean {\n\tif (!schemas) {\n\t\treturn false;\n\t}\n\treturn Object.hasOwn(schemas, key);\n}\n\nexport function getEventCanSubscribe<TContext = any>(\n\tschemas: EventSchemaConfig<TContext> | undefined,\n\tkey: string,\n): SchemaHook<TContext> | undefined {\n\tconst schema = schemas?.[key];\n\tif (!schema || isStandardSchema(schema)) {\n\t\treturn undefined;\n\t}\n\n\tconst maybeCanSubscribe = (schema as { canSubscribe?: unknown })\n\t\t.canSubscribe;\n\treturn typeof maybeCanSubscribe === \"function\"\n\t\t? (maybeCanSubscribe as SchemaHook<TContext>)\n\t\t: undefined;\n}\n\nexport function getQueueCanPublish<TContext = any>(\n\tschemas: QueueSchemaConfig | undefined,\n\tkey: string,\n): SchemaHook<TContext> | undefined {\n\tconst schema = schemas?.[key];\n\tif (!schema || isStandardSchema(schema)) {\n\t\treturn undefined;\n\t}\n\n\tconst maybeCanPublish = (schema as { canPublish?: unknown }).canPublish;\n\treturn typeof maybeCanPublish === \"function\"\n\t\t? (maybeCanPublish as SchemaHook<TContext>)\n\t\t: undefined;\n}\n\nfunction getValidationSchema(\n\tschema: QueueSchema | EventSchema | undefined,\n): QueueSchema | EventSchema | undefined {\n\tif (!schema) {\n\t\treturn undefined;\n\t}\n\tif (isEventSchemaDefinition(schema)) {\n\t\treturn schema.schema;\n\t}\n\tif (isQueueSchemaDefinition(schema)) {\n\t\treturn schema.message;\n\t}\n\tif (\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"schema\" in schema &&\n\t\t(schema as { schema?: unknown }).schema !== undefined\n\t) {\n\t\treturn (schema as { schema: QueueSchema | EventSchema }).schema;\n\t}\n\tif (\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"message\" in schema &&\n\t\t(schema as { message?: unknown }).message !== undefined\n\t) {\n\t\treturn (schema as { message: QueueSchema | EventSchema }).message;\n\t}\n\treturn schema;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"then\" in value &&\n\t\ttypeof (value as { then?: unknown }).then === \"function\"\n\t);\n}\n\nexport async function validateSchema<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: keyof T & string,\n\tdata: unknown,\n): Promise<ValidationResult<InferSchemaMap<T>[typeof key]>> {\n\tconst schema = getValidationSchema(schemas?.[key]);\n\n\tif (!schema) {\n\t\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n\t}\n\n\tif (isStandardSchema(schema)) {\n\t\tconst result = await schema[\"~standard\"].validate(data);\n\t\tif (result.issues) {\n\t\t\treturn { success: false, issues: [...result.issues] };\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: result.value as InferSchemaMap<T>[typeof key],\n\t\t};\n\t}\n\n\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n}\n\nexport function validateSchemaSync<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: keyof T & string,\n\tdata: unknown,\n): ValidationResult<InferSchemaMap<T>[typeof key]> {\n\tconst schema = getValidationSchema(schemas?.[key]);\n\n\tif (!schema) {\n\t\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n\t}\n\n\tif (isStandardSchema(schema)) {\n\t\tconst result = schema[\"~standard\"].validate(data);\n\t\tif (isPromiseLike(result)) {\n\t\t\tthrow unsupportedFeature(\"async schema validation\");\n\t\t}\n\t\tif (result.issues) {\n\t\t\treturn { success: false, issues: [...result.issues] };\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: result.value as InferSchemaMap<T>[typeof key],\n\t\t};\n\t}\n\n\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n}\n","import { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/common/actor-websocket\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { getLogger } from \"./log\";\n\nfunction logger() {\n\treturn getLogger(\"inline-websocket-adapter\");\n}\n\n/**\n * InlineWebSocketAdapter creates two linked WebSocket objects:\n * - clientWs: for the client/proxy side (returned from openWebSocket)\n * - actorWs: for the actor side (passed via wsContext.raw)\n *\n * Each side's send() triggers the OTHER side's message event.\n */\nexport class InlineWebSocketAdapter {\n\t#handler: UpgradeWebSocketArgs;\n\t#wsContext: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 0;\n\t#restoring: boolean;\n\t#pendingClientMessages: Array<{\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\trivetMessageIndex?: number;\n\t}> = [];\n\n\t#clientWs: VirtualWebSocket;\n\t#actorWs: VirtualWebSocket;\n\n\tconstructor(\n\t\thandler: UpgradeWebSocketArgs,\n\t\toptions: {\n\t\t\trestoring?: boolean;\n\t\t} = {},\n\t) {\n\t\tthis.#handler = handler;\n\t\tthis.#restoring = options.restoring ?? false;\n\n\t\t// Create linked WebSocket pair\n\t\t// Client's send() -> handler.onMessage (for RPC) + Actor's message event (for raw WS)\n\t\t// Actor's send() -> Client's message event\n\t\tthis.#clientWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.dispatchClientMessageWithMetadata(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\tthis.#actorWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.#clientWs.triggerMessage(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\t// Create WSContext with actorWs as raw\n\t\tthis.#wsContext = new WSContext({\n\t\t\traw: this.#actorWs,\n\t\t\tsend: (data: string | ArrayBuffer | Uint8Array) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.send called\" });\n\t\t\t\tthis.#clientWs.triggerMessage(data);\n\t\t\t},\n\t\t\tclose: (code?: number, reason?: string) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.close called\", code, reason });\n\t\t\t\tthis.#close(code || 1000, reason || \"\");\n\t\t\t},\n\t\t\treadyState: 1,\n\t\t});\n\n\t\t// Defer initialization to allow event listeners to be attached first\n\t\tsetTimeout(() => {\n\t\t\tthis.#initialize();\n\t\t}, 0);\n\t}\n\n\t/** Get the client-side WebSocket (for proxy/client code) */\n\tget clientWebSocket(): UniversalWebSocket {\n\t\treturn this.#clientWs;\n\t}\n\n\t/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */\n\tget actorWebSocket(): UniversalWebSocket {\n\t\treturn this.#actorWs;\n\t}\n\n\t/**\n\t * Dispatch a client->actor message with optional transport metadata.\n\t *\n\t * This is used by dynamic actor host bridges to preserve\n\t * `rivetMessageIndex` on hibernatable engine websocket paths.\n\t */\n\tdispatchClientMessageWithMetadata(\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView,\n\t\trivetMessageIndex?: number,\n\t): void {\n\t\tif (this.#readyState === this.#clientWs.CONNECTING) {\n\t\t\tthis.#pendingClientMessages.push({ data, rivetMessageIndex });\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tthis.#readyState === this.#clientWs.CLOSING ||\n\t\t\tthis.#readyState === this.#clientWs.CLOSED\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#dispatchClientMessage(data, rivetMessageIndex);\n\t}\n\n\t#dispatchClientMessage(\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView,\n\t\trivetMessageIndex?: number,\n\t): void {\n\t\ttry {\n\t\t\tthis.#handler.onMessage(\n\t\t\t\t{ data, rivetMessageIndex },\n\t\t\t\tthis.#wsContext,\n\t\t\t);\n\t\t\t(this.#actorWs as any).dispatchEvent({\n\t\t\t\ttype: \"message\",\n\t\t\t\tdata,\n\t\t\t\trivetMessageIndex,\n\t\t\t\ttarget: this.#actorWs,\n\t\t\t\tcurrentTarget: this.#actorWs,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error processing message\");\n\t\t}\n\t}\n\n\tasync #initialize(): Promise<void> {\n\t\ttry {\n\t\t\tlogger().debug({ msg: \"websocket initializing\" });\n\n\t\t\tthis.#readyState = 1; // OPEN\n\n\t\t\tif (this.#restoring && this.#handler.onRestore) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"calling handler.onRestore with WSContext\",\n\t\t\t\t});\n\t\t\t\tthis.#handler.onRestore(this.#wsContext);\n\t\t\t} else {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"calling handler.onOpen with WSContext\",\n\t\t\t\t});\n\t\t\t\tthis.#handler.onOpen(undefined, this.#wsContext);\n\t\t\t}\n\n\t\t\t// Fire open event to both sides\n\t\t\tthis.#clientWs.triggerOpen();\n\t\t\tthis.#actorWs.triggerOpen();\n\t\t\twhile (this.#pendingClientMessages.length > 0) {\n\t\t\t\tconst next = this.#pendingClientMessages.shift();\n\t\t\t\tif (!next) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.#dispatchClientMessage(next.data, next.rivetMessageIndex);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error during initialization\");\n\t\t}\n\t}\n\n\t#handleError(error: unknown): void {\n\t\tconsole.error(\"INLINE_WEBSOCKET_ADAPTER_ERROR\", error);\n\t\tlogger().error({\n\t\t\tmsg: \"error in websocket\",\n\t\t\terror,\n\t\t\terrorMessage:\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\n\t\t// Call handler.onError\n\t\ttry {\n\t\t\tthis.#handler.onError(error, this.#wsContext);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"error in onError handler\",\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\n\t\t// Fire error event to both sides\n\t\tthis.#clientWs.triggerError(error);\n\t\tthis.#actorWs.triggerError(error);\n\t}\n\n\t#close(code: number, reason: string): void {\n\t\tif (this.#readyState === 3 || this.#readyState === 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"closing websocket\", code, reason });\n\n\t\tthis.#readyState = 2; // CLOSING\n\n\t\ttry {\n\t\t\tthis.#handler.onClose(\n\t\t\t\t{ code, reason, wasClean: true },\n\t\t\t\tthis.#wsContext,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error });\n\t\t} finally {\n\t\t\tthis.#readyState = 3; // CLOSED\n\n\t\t\t// Fire close event to both sides\n\t\t\tthis.#clientWs.triggerClose(code, reason);\n\t\t\tthis.#actorWs.triggerClose(code, reason);\n\t\t}\n\t}\n}\n\n/**\n * Creates an InlineWebSocketAdapter and returns the client-side WebSocket.\n * This is the main entry point for creating inline WebSocket connections.\n */\nexport function createInlineWebSocket(\n\thandler: UpgradeWebSocketArgs,\n): UniversalWebSocket {\n\tconst adapter = new InlineWebSocketAdapter(handler);\n\treturn adapter.clientWebSocket;\n}\n","import { Hono } from \"hono\";\nimport { ENGINE_ENDPOINT } from \"@/common/engine\";\nimport { configureServerlessPool } from \"@/serverless/configure\";\nimport { detectRuntime, VERSION } from \"@/utils\";\nimport { crossPlatformServe, loadRuntimeServeStatic } from \"@/utils/serve\";\nimport {\n\ttype RegistryActors,\n\ttype RegistryConfig,\n\ttype RegistryConfigInput,\n\tRegistryConfigSchema,\n} from \"./config\";\nimport { logger } from \"./log\";\nimport { buildConfiguredRegistry } from \"./native\";\nimport type { RuntimeServerlessResponseHead } from \"./runtime\";\n\ntype ShutdownSignal = \"SIGINT\" | \"SIGTERM\";\n\nfunction signalExitCode(signal: ShutdownSignal): number {\n\tswitch (signal) {\n\t\tcase \"SIGINT\":\n\t\t\treturn 130;\n\t\tcase \"SIGTERM\":\n\t\t\treturn 143;\n\t}\n}\n\nfunction finishShutdownSignal(signal: ShutdownSignal): void {\n\tif (process.pid === 1) {\n\t\tprocess.exit(signalExitCode(signal));\n\t}\n\tprocess.kill(process.pid, signal);\n}\n\nexport type FetchHandler = (\n\trequest: Request,\n\t...args: any\n) => Response | Promise<Response>;\n\nexport interface ServerlessHandler {\n\tfetch: FetchHandler;\n}\n\nexport interface RegistryRoutes {\n\thealth(): Promise<Response>;\n\tmetadata(): Promise<Response>;\n\tprometheusMetrics(request?: Request): Promise<Response>;\n}\n\n/**\n * Injectable dependencies for {@link Registry}. Production code uses the\n * defaults. Tests override `buildConfiguredRegistry` to drive lifecycle\n * orchestration against a fake `CoreRuntime` without an engine.\n */\nexport interface RegistryDeps {\n\tbuildConfiguredRegistry: typeof buildConfiguredRegistry;\n}\n\nexport class Registry<A extends RegistryActors> {\n\t#config: RegistryConfigInput<A>;\n\t#buildConfiguredRegistry: typeof buildConfiguredRegistry;\n\tpublic readonly routes: RegistryRoutes;\n\n\tget config(): RegistryConfigInput<A> {\n\t\treturn this.#config;\n\t}\n\n\tparseConfig(): RegistryConfig {\n\t\treturn RegistryConfigSchema.parse(this.#config);\n\t}\n\n\t#runtimeServePromise?: Promise<void>;\n\t#runtimeServeConfiguredPromise?: ReturnType<typeof buildConfiguredRegistry>;\n\t#runtimeServerlessPromise?: ReturnType<typeof buildConfiguredRegistry>;\n\t#configureServerlessPoolPromise?: Promise<void>;\n\t#welcomePrinted = false;\n\t#shutdownInstalled = false;\n\t#shutdownInFlight: Promise<void> | null = null;\n\t#signalHandlers: Partial<Record<ShutdownSignal, () => void>> = {};\n\n\tconstructor(config: RegistryConfigInput<A>, deps?: Partial<RegistryDeps>) {\n\t\tthis.#config = config;\n\t\tthis.#buildConfiguredRegistry =\n\t\t\tdeps?.buildConfiguredRegistry ?? buildConfiguredRegistry;\n\t\tthis.routes = {\n\t\t\thealth: () => this.#healthRoute(),\n\t\t\tmetadata: () => this.#metadataRoute(),\n\t\t\tprometheusMetrics: (request?: Request) =>\n\t\t\t\tthis.#prometheusMetricsRoute(request),\n\t\t};\n\t}\n\n\t#ensureServerlessPoolConfigured(\n\t\tconfig: RegistryConfig,\n\t): Promise<void> | undefined {\n\t\tif (!config.configurePool) return undefined;\n\n\t\tif (!this.#configureServerlessPoolPromise) {\n\t\t\tthis.#configureServerlessPoolPromise = configureServerlessPool(\n\t\t\t\tconfig,\n\t\t\t).catch((error) => {\n\t\t\t\tthis.#configureServerlessPoolPromise = undefined;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tthis.#configureServerlessPoolPromise.catch(() => {});\n\t\t}\n\n\t\treturn this.#configureServerlessPoolPromise;\n\t}\n\n\t/**\n\t * Handle an incoming HTTP request for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const app = new Hono();\n\t * app.all(\"/api/rivet/*\", (c) => registry.handler(c.req.raw));\n\t * export default app;\n\t * ```\n\t */\n\tpublic async handler(request: Request): Promise<Response> {\n\t\tconst config = this.parseConfig();\n\t\tthis.#printWelcome(config, \"serverless\");\n\n\t\tif (!this.#runtimeServerlessPromise) {\n\t\t\tthis.#runtimeServerlessPromise =\n\t\t\t\tthis.#buildConfiguredRegistry(config);\n\t\t}\n\n\t\tconst { runtime, registry, serveConfig } =\n\t\t\tawait this.#runtimeServerlessPromise;\n\t\tconst isStartRequest = isServerlessStartRequest(\n\t\t\trequest,\n\t\t\tserveConfig.serverlessBasePath ?? \"/api/rivet\",\n\t\t);\n\t\tconst isMetadataRequest = isServerlessMetadataRequest(\n\t\t\trequest,\n\t\t\tserveConfig.serverlessBasePath ?? \"/api/rivet\",\n\t\t);\n\t\tconst isEngineMetadataRequest =\n\t\t\trequest.headers.get(\"user-agent\")?.startsWith(\"RivetEngine/\") ??\n\t\t\tfalse;\n\n\t\tif (isStartRequest) {\n\t\t\ttry {\n\t\t\t\tawait this.#ensureServerlessPoolConfigured(config);\n\t\t\t} catch (_error) {\n\t\t\t\treturn new Response(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tgroup: \"guard\",\n\t\t\t\t\t\tcode: \"service_unavailable\",\n\t\t\t\t\t\tmessage: \"Serverless pool is not configured.\",\n\t\t\t\t\t\tmetadata: null,\n\t\t\t\t\t}),\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst cancelToken = runtime.createCancellationToken();\n\t\tconst abort = () => runtime.cancelCancellationToken(cancelToken);\n\t\tif (request.signal.aborted) {\n\t\t\tabort();\n\t\t} else {\n\t\t\trequest.signal.addEventListener(\"abort\", abort, { once: true });\n\t\t}\n\n\t\tconst requestBody = await request.arrayBuffer();\n\t\tif (\n\t\t\tisStartRequest &&\n\t\t\trequestBody.byteLength > serveConfig.serverlessMaxStartPayloadBytes\n\t\t) {\n\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\treturn new Response(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tgroup: \"message\",\n\t\t\t\t\tcode: \"incoming_too_long\",\n\t\t\t\t\tmessage: `Incoming message too long. Received ${requestBody.byteLength} bytes, limit is ${serveConfig.serverlessMaxStartPayloadBytes} bytes.`,\n\t\t\t\t\tmetadata: null,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tstatus: 413,\n\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tlet settled = false;\n\t\tlet controllerRef:\n\t\t\t| ReadableStreamDefaultController<Uint8Array>\n\t\t\t| undefined;\n\t\tconst backpressureWaiters: Array<() => void> = [];\n\t\tconst resolveBackpressure = () => {\n\t\t\twhile (\n\t\t\t\tcontrollerRef &&\n\t\t\t\t(controllerRef.desiredSize ?? 1) > 0 &&\n\t\t\t\tbackpressureWaiters.length > 0\n\t\t\t) {\n\t\t\t\tbackpressureWaiters.shift()?.();\n\t\t\t}\n\t\t};\n\t\tconst waitForBackpressure = async () => {\n\t\t\tif (!controllerRef || (controllerRef.desiredSize ?? 1) > 0) return;\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tbackpressureWaiters.push(resolve);\n\t\t\t});\n\t\t};\n\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\tstart(controller) {\n\t\t\t\tcontrollerRef = controller;\n\t\t\t},\n\t\t\tpull() {\n\t\t\t\tresolveBackpressure();\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\tsettled = true;\n\t\t\t\tresolveBackpressure();\n\t\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\t},\n\t\t});\n\n\t\tconst headers: Record<string, string> = {};\n\t\trequest.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tlet head: RuntimeServerlessResponseHead;\n\t\ttry {\n\t\t\thead = await runtime.handleServerlessRequest(\n\t\t\t\tregistry,\n\t\t\t\t{\n\t\t\t\t\tmethod: request.method,\n\t\t\t\t\turl: request.url,\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: new Uint8Array(requestBody),\n\t\t\t\t},\n\t\t\t\tasync (\n\t\t\t\t\terror: unknown,\n\t\t\t\t\tevent?: {\n\t\t\t\t\t\tkind: \"chunk\" | \"end\";\n\t\t\t\t\t\tchunk?: Uint8Array;\n\t\t\t\t\t\terror?: {\n\t\t\t\t\t\t\tgroup: string;\n\t\t\t\t\t\t\tcode: string;\n\t\t\t\t\t\t\tmessage: string;\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t) => {\n\t\t\t\t\tif (error) throw error;\n\t\t\t\t\tif (!event || settled) return;\n\t\t\t\t\tif (event.kind === \"chunk\") {\n\t\t\t\t\t\tawait waitForBackpressure();\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tif (event.chunk) controllerRef?.enqueue(event.chunk);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolveBackpressure();\n\t\t\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\t\t\tif (event.error) {\n\t\t\t\t\t\tcontrollerRef?.error(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`${event.error.group}.${event.error.code}: ${event.error.message}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontrollerRef?.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcancelToken,\n\t\t\t\tserveConfig,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\t// The runtime call itself rejected (e.g. `registry_shut_down_error`).\n\t\t\t// Clean up the abort listener so it doesn't leak, then propagate.\n\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\tthrow err;\n\t\t}\n\n\t\tif (isMetadataRequest && !isEngineMetadataRequest) {\n\t\t\ttry {\n\t\t\t\tawait this.#ensureServerlessPoolConfigured(config);\n\t\t\t} catch (_error) {\n\t\t\t\treturn new Response(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tgroup: \"guard\",\n\t\t\t\t\t\tcode: \"service_unavailable\",\n\t\t\t\t\t\tmessage: \"Serverless pool is not configured.\",\n\t\t\t\t\t\tmetadata: null,\n\t\t\t\t\t}),\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn new Response(stream, {\n\t\t\tstatus: head.status,\n\t\t\theaders: head.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a fetch handler for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * export default registry.serve();\n\t * ```\n\t */\n\tpublic serve(): ServerlessHandler {\n\t\treturn {\n\t\t\tfetch: (request) => this.handler(request),\n\t\t};\n\t}\n\n\t/**\n\t * Starts an HTTP server that dispatches every request through the\n\t * serverless handler. Uses `crossPlatformServe` to pick the right\n\t * runtime (Node, Bun, Deno).\n\t *\n\t * @param opts.port Port to listen on. Defaults to 3000.\n\t * @param opts.publicDir If set, serves static files from this directory\n\t * before falling through to the registry handler.\n\t *\n\t * @example\n\t * ```ts\n\t * await registry.listen();\n\t * await registry.listen({ port: 8080, publicDir: \"./public\" });\n\t * ```\n\t */\n\tpublic async listen(\n\t\topts: { port?: number; publicDir?: string } = {},\n\t): Promise<void> {\n\t\tconst port = opts.port ?? 3000;\n\t\tconst config = this.parseConfig();\n\t\tconst runtime = detectRuntime();\n\t\tconst app = new Hono();\n\t\tif (opts.publicDir) {\n\t\t\tconst serveStatic = await loadRuntimeServeStatic(runtime);\n\t\t\tapp.use(\"*\", serveStatic({ root: opts.publicDir }));\n\t\t}\n\t\tapp.all(\"*\", (c) => this.handler(c.req.raw));\n\t\tawait crossPlatformServe(config, port, app, runtime);\n\t}\n\n\t/**\n\t * Returns a health response suitable for mounting in a user-owned router.\n\t */\n\tasync #healthRoute(): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn jsonRouteResponse(503, {\n\t\t\t\tstatus: \"not_started\",\n\t\t\t\truntime: \"rivetkit\",\n\t\t\t\tversion: VERSION,\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryHealth) {\n\t\t\treturn jsonRouteResponse(501, {\n\t\t\t\tstatus: \"unsupported\",\n\t\t\t\truntime: \"rivetkit\",\n\t\t\t\tversion: VERSION,\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryHealth(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns serverless metadata suitable for mounting in a user-owned router.\n\t */\n\tasync #metadataRoute(): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn new Response(\"registry not started\\n\", {\n\t\t\t\tstatus: 503,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryMetadata) {\n\t\t\treturn new Response(\"metadata is not supported by this runtime\\n\", {\n\t\t\t\tstatus: 501,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryMetadata(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Prometheus metrics response suitable for mounting in a user-owned router.\n\t */\n\tasync #prometheusMetricsRoute(_request?: Request): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn new Response(\"registry not started\\n\", {\n\t\t\t\tstatus: 503,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryMetrics) {\n\t\t\treturn new Response(\"metrics are not supported by this runtime\\n\", {\n\t\t\t\tstatus: 501,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryMetrics(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\tasync #activeConfiguredRegistry(): Promise<\n\t\tAwaited<ReturnType<typeof buildConfiguredRegistry>> | undefined\n\t> {\n\t\tconst candidates = [\n\t\t\tthis.#runtimeServerlessPromise,\n\t\t\tthis.#runtimeServeConfiguredPromise,\n\t\t].filter(\n\t\t\t(\n\t\t\t\tcandidate,\n\t\t\t): candidate is ReturnType<typeof buildConfiguredRegistry> =>\n\t\t\t\tcandidate !== undefined,\n\t\t);\n\n\t\tif (candidates.length === 0) return undefined;\n\t\treturn await candidates[0]!;\n\t}\n\n\t/**\n\t * Starts an actor envoy for standalone server deployments.\n\t */\n\t#startEnvoy(config: RegistryConfig, printWelcome: boolean) {\n\t\tif (!this.#runtimeServePromise) {\n\t\t\tconst configuredRegistryPromise =\n\t\t\t\tthis.#buildConfiguredRegistry(config);\n\t\t\tthis.#runtimeServeConfiguredPromise = configuredRegistryPromise;\n\t\t\tthis.#runtimeServePromise = configuredRegistryPromise\n\t\t\t\t.then(async ({ runtime, registry, serveConfig }) => {\n\t\t\t\t\tawait runtime.serveRegistry(registry, serveConfig);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Always-attached catch so the stored promise never leaves a\n\t\t\t\t\t// rejection unhandled. Downstream awaits (e.g. #runShutdown's\n\t\t\t\t\t// Promise.race) attach their own catches and still observe\n\t\t\t\t\t// resolution via the race.\n\t\t\t\t\tlogger().warn({ error }, \"runtime registry serve errored\");\n\t\t\t\t});\n\t\t\t// Install signal handlers once an envoy lifecycle has begun. Only\n\t\t\t// Mode A ever reaches here. Mode B (handler(request)) intentionally\n\t\t\t// does not install handlers because it runs on Workers/Vercel/Deno\n\t\t\t// Deploy where `process.on` is absent or forbidden; those platforms\n\t\t\t// own their own signal policy.\n\t\t\tthis.#installSignalHandlers(config);\n\t\t}\n\t\tif (printWelcome) {\n\t\t\tthis.#printWelcome(config, \"serverful\");\n\t\t}\n\t}\n\n\t#installSignalHandlers(config: RegistryConfig): void {\n\t\tif (this.#shutdownInstalled) return;\n\t\tif (config.shutdown?.disableSignalHandlers) return;\n\t\t// Guard against non-Node runtimes (Workers/Edge) where `process` may\n\t\t// exist but `process.on` is unavailable or forbidden.\n\t\tif (\n\t\t\ttypeof process === \"undefined\" ||\n\t\t\ttypeof process.on !== \"function\" ||\n\t\t\ttypeof process.kill !== \"function\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#shutdownInstalled = true;\n\n\t\tconst install = (signal: ShutdownSignal) => {\n\t\t\tconst handler = () => this.#onShutdownSignal(signal, config);\n\t\t\tthis.#signalHandlers[signal] = handler;\n\t\t\tprocess.on(signal, handler);\n\t\t};\n\t\tinstall(\"SIGINT\");\n\t\tinstall(\"SIGTERM\");\n\t}\n\n\t#onShutdownSignal(signal: ShutdownSignal, config: RegistryConfig): void {\n\t\tif (this.#shutdownInFlight !== null) {\n\t\t\t// Second delivery of the same (or another) shutdown signal, or a\n\t\t\t// drain already started by an explicit `shutdown()` call. Remove\n\t\t\t// our handler only, preserving any user-installed listeners. PID 1\n\t\t\t// must exit directly because re-raised default signals can be\n\t\t\t// swallowed by the container signal path.\n\t\t\tthis.#removeSignalHandlers();\n\t\t\tfinishShutdownSignal(signal);\n\t\t\treturn;\n\t\t}\n\t\tthis.#shutdownInFlight = this.#drain(config)\n\t\t\t.catch((err) => {\n\t\t\t\tlogger().warn({ err }, \"shutdown error\");\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\tthis.#removeSignalHandlers();\n\t\t\t\tfinishShutdownSignal(signal);\n\t\t\t});\n\t}\n\n\t/**\n\t * Gracefully drains all live registries.\n\t *\n\t * Programmatic counterpart to the SIGINT/SIGTERM handlers: tears down\n\t * every live `CoreRegistry` (both `start()` and `handler()` modes) and\n\t * waits for the serve promise to resolve, all bounded by the shutdown\n\t * grace period. Unlike a signal-driven shutdown, this does not re-raise a\n\t * signal or exit the process. The caller owns process lifetime.\n\t *\n\t * Idempotent: concurrent or repeated calls share a single drain. Safe to\n\t * call even if nothing has been started.\n\t *\n\t * @example\n\t * ```ts\n\t * const registry = setup({ use: { counter } });\n\t * registry.start();\n\t * // ...later, on your own shutdown trigger:\n\t * await registry.shutdown();\n\t * ```\n\t */\n\tpublic async shutdown(): Promise<void> {\n\t\tif (this.#shutdownInFlight !== null) return this.#shutdownInFlight;\n\t\tconst config = this.parseConfig();\n\t\t// Uninstall our signal handlers so a later SIGINT/SIGTERM does not\n\t\t// re-trigger a drain on already-torn-down registries. Subsequent\n\t\t// signals fall back to Node's default termination behavior.\n\t\tthis.#removeSignalHandlers();\n\t\tthis.#shutdownInFlight = this.#drain(config).catch((err) => {\n\t\t\tlogger().warn({ err }, \"shutdown error\");\n\t\t});\n\t\treturn this.#shutdownInFlight;\n\t}\n\n\tasync #drain(config: RegistryConfig): Promise<void> {\n\t\tconst modeAPromise = this.#runtimeServeConfiguredPromise;\n\t\tconst modeBPromise = this.#runtimeServerlessPromise;\n\n\t\tconst gracePeriodMs =\n\t\t\tconfig.shutdown?.gracePeriodMs ??\n\t\t\t(await this.#actorStopThresholdMs(modeAPromise ?? modeBPromise)) ??\n\t\t\t30 * 60 * 1000;\n\t\t// Race the entire drain sequence (both modes + serve promise) against\n\t\t// a single grace ceiling. By default, this uses the engine-provided\n\t\t// actor stop threshold, matching Pegboard's hard cutoff for actors.\n\t\tconst drain = async () => {\n\t\t\t// Shut down every live `CoreRegistry` we know about. Mode A\n\t\t\t// (`start()`) and Mode B (`handler()`) each build a separate\n\t\t\t// runtime registry, so one drain fans out to both to honor the\n\t\t\t// spec invariant \"single shutdown tears down both modes\".\n\t\t\tconst registries: Promise<void>[] = [];\n\t\t\tif (modeAPromise !== undefined) {\n\t\t\t\tregistries.push(\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { runtime, registry } = await modeAPromise;\n\t\t\t\t\t\t\tawait runtime.shutdownRegistry(registry);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tlogger().warn(\n\t\t\t\t\t\t\t\t{ err },\n\t\t\t\t\t\t\t\t\"runtime registry shutdown errored (mode A)\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modeBPromise !== undefined) {\n\t\t\t\tregistries.push(\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { runtime, registry } = await modeBPromise;\n\t\t\t\t\t\t\tawait runtime.shutdownRegistry(registry);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tlogger().warn(\n\t\t\t\t\t\t\t\t{ error: err },\n\t\t\t\t\t\t\t\t\"runtime registry shutdown errored (mode B)\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait Promise.all(registries);\n\n\t\t\tconst runtimeServePromise = this.#runtimeServePromise;\n\t\t\tif (runtimeServePromise !== undefined) {\n\t\t\t\t// Swallow rejection so the race doesn't itself reject; the\n\t\t\t\t// always-attached `.catch` at the promise assignment site has\n\t\t\t\t// already logged any serve-side error.\n\t\t\t\tawait runtimeServePromise.catch(() => undefined);\n\t\t\t}\n\t\t};\n\t\tawait Promise.race([\n\t\t\tdrain(),\n\t\t\tnew Promise<void>((resolve) =>\n\t\t\t\tsetTimeout(resolve, gracePeriodMs).unref?.(),\n\t\t\t),\n\t\t]);\n\t}\n\n\tasync #actorStopThresholdMs(\n\t\tconfiguredRegistryPromise:\n\t\t\t| ReturnType<typeof buildConfiguredRegistry>\n\t\t\t| undefined,\n\t): Promise<number | undefined> {\n\t\tif (configuredRegistryPromise === undefined) return undefined;\n\t\ttry {\n\t\t\tconst { runtime, registry } = await configuredRegistryPromise;\n\t\t\tconst thresholdMs =\n\t\t\t\tawait runtime.registryActorStopThresholdMs?.(registry);\n\t\t\tif (\n\t\t\t\tthresholdMs !== undefined &&\n\t\t\t\tNumber.isFinite(thresholdMs) &&\n\t\t\t\tthresholdMs > 0\n\t\t\t) {\n\t\t\t\treturn thresholdMs;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().warn(\n\t\t\t\t{ err },\n\t\t\t\t\"failed to read actor stop threshold for shutdown grace\",\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t#removeSignalHandlers(): void {\n\t\tfor (const [signal, handler] of Object.entries(\n\t\t\tthis.#signalHandlers,\n\t\t) as [ShutdownSignal, () => void][]) {\n\t\t\tif (handler) process.removeListener(signal, handler);\n\t\t}\n\t\tthis.#signalHandlers = {};\n\t}\n\n\tpublic startEnvoy() {\n\t\tthis.#startEnvoy(this.parseConfig(), true);\n\t}\n\n\t/**\n\t * Starts the actor envoy for standalone server deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const registry = setup({ use: { counter } });\n\t * registry.start();\n\t * ```\n\t */\n\tpublic start() {\n\t\tconst config = this.parseConfig();\n\t\tthis.#startEnvoy(config, true);\n\t}\n\n\t#printWelcome(\n\t\tconfig: RegistryConfig,\n\t\tkind: \"serverless\" | \"serverful\",\n\t): void {\n\t\tif (config.noWelcome || this.#welcomePrinted) return;\n\t\tthis.#welcomePrinted = true;\n\n\t\tconst logLine = (label: string, value: string) => {\n\t\t\tconst padding = \" \".repeat(Math.max(0, 13 - label.length));\n\t\t\tconsole.log(` - ${label}:${padding}${value}`);\n\t\t};\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\t` RivetKit ${VERSION} (Engine - ${kind === \"serverless\" ? \"Serverless\" : \"Serverful\"})`,\n\t\t);\n\n\t\tif (config.namespace !== \"default\") {\n\t\t\tlogLine(\"Namespace\", config.namespace);\n\t\t}\n\n\t\tif (config.endpoint) {\n\t\t\tconst endpointType =\n\t\t\t\tconfig.endpoint === ENGINE_ENDPOINT ? \"local native\" : \"remote\";\n\t\t\tlogLine(\"Endpoint\", `${config.endpoint} (${endpointType})`);\n\t\t}\n\n\t\tif (kind === \"serverless\" && config.publicEndpoint) {\n\t\t\tlogLine(\"Client\", config.publicEndpoint);\n\t\t}\n\n\t\tlogLine(\"Actors\", Object.keys(config.use).length.toString());\n\t\tconsole.log();\n\t}\n}\n\nfunction isServerlessStartRequest(request: Request, basePath: string): boolean {\n\tif (request.method !== \"POST\") return false;\n\tconst parsed = new URL(request.url);\n\tconst normalizedBase =\n\t\tbasePath === \"/\" ? \"\" : `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}`;\n\treturn parsed.pathname === `${normalizedBase}/start`;\n}\n\nfunction isServerlessMetadataRequest(\n\trequest: Request,\n\tbasePath: string,\n): boolean {\n\tif (request.method !== \"GET\") return false;\n\tconst parsed = new URL(request.url);\n\tconst normalizedBase =\n\t\tbasePath === \"/\" ? \"\" : `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}`;\n\treturn parsed.pathname === `${normalizedBase}/metadata`;\n}\n\nfunction jsonRouteResponse(status: number, body: unknown): Response {\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus,\n\t\theaders: { \"content-type\": \"application/json\" },\n\t});\n}\n\nexport function setup<A extends RegistryActors>(\n\tinput: RegistryConfigInput<A>,\n): Registry<A> {\n\treturn new Registry(input);\n}\n\nexport type { RegistryConfig, RegistryActors };\nexport { RegistryConfigSchema };\n","export const ENGINE_PORT = 6420;\nexport const ENGINE_ENDPOINT = `http://127.0.0.1:${ENGINE_PORT}`;\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"registry\");\n}\n","import { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { stringifyError } from \"@/common/utils\";\nimport {\n\tgetDatacenters,\n\tupdateRunnerConfig,\n} from \"@/engine-client/api-endpoints\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"@/registry/log\";\n\nconst DEFAULT_CONFIGURE_TIMEOUT_MS = 60_000;\nconst CONFIGURE_RETRY_DELAY_MS = 1_000;\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction configureTimeoutMs() {\n\tconst value = process.env.RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS;\n\tif (value === undefined || value === \"\")\n\t\treturn DEFAULT_CONFIGURE_TIMEOUT_MS;\n\n\tconst parsed = Number(value);\n\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\tthrow new Error(\n\t\t\t\"RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS must be a finite non-negative number\",\n\t\t);\n\t}\n\n\treturn parsed;\n}\n\nexport async function configureServerlessPool(\n\tconfig: RegistryConfig,\n): Promise<void> {\n\tlogger().debug({ msg: \"configuring serverless pool\" });\n\n\tconst startedAt = Date.now();\n\tconst timeoutMs = configureTimeoutMs();\n\tlet attempts = 0;\n\tlet lastError: unknown;\n\n\twhile (Date.now() - startedAt <= timeoutMs) {\n\t\tattempts += 1;\n\t\ttry {\n\t\t\tif (!config.namespace) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"namespace is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!config.endpoint) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"endpoint is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!config.configurePool) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"configurePool is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst customConfig = config.configurePool;\n\t\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\t\t\tconst dcsRes = await getDatacenters(clientConfig);\n\t\t\tconst poolName = customConfig.name ?? \"default\";\n\t\t\tconst serverlessToken = config.token ?? config.publicToken;\n\t\t\tconst headers = {\n\t\t\t\t...(serverlessToken\n\t\t\t\t\t? { \"x-rivet-token\": serverlessToken }\n\t\t\t\t\t: {}),\n\t\t\t\t...(customConfig.headers ?? {}),\n\t\t\t};\n\t\t\tconst serverlessConfig = {\n\t\t\t\tserverless: {\n\t\t\t\t\turl: customConfig.url,\n\t\t\t\t\theaders,\n\t\t\t\t\trequest_lifespan: customConfig.requestLifespan ?? 60 * 60,\n\t\t\t\t\tdrain_grace_period: customConfig.drainGracePeriod,\n\t\t\t\t\tmetadata_poll_interval:\n\t\t\t\t\t\tcustomConfig.metadataPollInterval ?? 1000,\n\t\t\t\t\tmax_runners: 100_000,\n\t\t\t\t\tmin_runners: 0,\n\t\t\t\t\trunners_margin: 0,\n\t\t\t\t\tslots_per_runner: 1,\n\t\t\t\t},\n\t\t\t\tmetadata: customConfig.metadata ?? {},\n\t\t\t\tdrain_on_version_upgrade:\n\t\t\t\t\tcustomConfig.drainOnVersionUpgrade ?? true,\n\t\t\t};\n\n\t\t\tawait updateRunnerConfig(clientConfig, poolName, {\n\t\t\t\tdatacenters: Object.fromEntries(\n\t\t\t\t\tdcsRes.datacenters.map((dc) => [dc.name, serverlessConfig]),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"serverless pool configured successfully\",\n\t\t\t\tpoolName,\n\t\t\t\tnamespace: config.namespace,\n\t\t\t\tattempts,\n\t\t\t});\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tlastError = error;\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"serverless pool configuration attempt failed\",\n\t\t\t\tattempts,\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tawait sleep(CONFIGURE_RETRY_DELAY_MS);\n\t\t}\n\t}\n\n\tlogger().error({\n\t\tmsg: \"failed to configure serverless pool, validate endpoint is configured correctly then restart this process\",\n\t\tattempts,\n\t\terror: stringifyError(lastError),\n\t});\n\tthrow lastError;\n}\n","// TODO: Go back to dynamic import for this\nimport getPort from \"get-port\";\nimport type { Hono } from \"hono\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"@/registry/log\";\nimport { detectRuntime, type Runtime, stringifyError } from \"../utils\";\n\nconst DEFAULT_PORT = 6421;\nexport type ServeStatic =\n\ttypeof import(\"@hono/node-server/serve-static\").serveStatic;\nconst serveStaticLoaderPromises: Partial<\n\tRecord<Runtime, Promise<ServeStatic>>\n> = {};\n\n/**\n * Finds a free port starting from the given port.\n *\n * Tries ports incrementally until a free one is found.\n */\nexport async function findFreePort(\n\tstartPort: number = DEFAULT_PORT,\n): Promise<number> {\n\t// TODO: Fix this\n\t// const getPortModule = \"get-port\";\n\t// const { default: getPort } = await import(/* webpackIgnore: true */ getPortModule);\n\n\t// Create an iterable of ports starting from startPort\n\tfunction* portRange(start: number, count: number = 100): Iterable<number> {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tyield start + i;\n\t\t}\n\t}\n\n\treturn getPort({ port: portRange(startPort) });\n}\n\nexport async function crossPlatformServe(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n\truntime: Runtime = detectRuntime(),\n): Promise<{ upgradeWebSocket: any; closeServer?: () => void }> {\n\tlogger().debug({ msg: \"detected runtime for serve\", runtime });\n\n\tswitch (runtime) {\n\t\tcase \"deno\":\n\t\t\treturn serveDeno(config, httpPort, app);\n\t\tcase \"bun\":\n\t\t\treturn serveBun(config, httpPort, app);\n\t\tcase \"node\":\n\t\t\treturn serveNode(config, httpPort, app);\n\t\tdefault:\n\t\t\treturn serveNode(config, httpPort, app);\n\t}\n}\n\nexport async function loadRuntimeServeStatic(\n\truntime: Runtime,\n): Promise<ServeStatic> {\n\tif (!serveStaticLoaderPromises[runtime]) {\n\t\tif (runtime === \"node\") {\n\t\t\tconst nodeServeStaticModule = \"@hono/node-server/serve-static\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tnodeServeStaticModule\n\t\t\t).then((x) => x.serveStatic);\n\t\t} else if (runtime === \"bun\") {\n\t\t\tconst bunModule = \"hono/bun\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tbunModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else if (runtime === \"deno\") {\n\t\t\tconst denoModule = \"hono/deno\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tdenoModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else {\n\t\t\tthrow new Error(`unsupported runtime: ${runtime}`);\n\t\t}\n\t}\n\n\treturn await serveStaticLoaderPromises[runtime]!;\n}\n\nasync function serveNode(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any; closeServer: () => void }> {\n\t// Import @hono/node-server using string variable to prevent static analysis\n\tconst nodeServerModule = \"@hono/node-server\";\n\tlet serve: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeServerModule\n\t\t);\n\t\tserve = dep.serve;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Import @hono/node-ws using string variable to prevent static analysis\n\tconst nodeWsModule = \"@hono/node-ws\";\n\tlet createNodeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeWsModule\n\t\t);\n\t\tcreateNodeWebSocket = dep.createNodeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Inject WS\n\tconst { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({\n\t\tapp: app,\n\t});\n\n\t// Start server\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\tconst server = serve({ fetch: app.fetch, port, hostname }, () =>\n\t\tlogger().info({ msg: \"server listening\", port, hostname }),\n\t);\n\tinjectWebSocket(server);\n\n\tconst closeServer = () => {\n\t\tserver.close();\n\t};\n\n\treturn { upgradeWebSocket, closeServer };\n}\n\nasync function serveDeno(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/deno using string variable to prevent static analysis\n\tconst honoDenoModule = \"hono/deno\";\n\tlet upgradeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoDenoModule\n\t\t);\n\t\tupgradeWebSocket = dep.upgradeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/deno\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\n\t// Use Deno.serve\n\tDeno.serve({ port, hostname }, app.fetch);\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveBun(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/bun using string variable to prevent static analysis\n\tconst honoBunModule = \"hono/bun\";\n\tlet createBunWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoBunModule\n\t\t);\n\t\tcreateBunWebSocket = dep.createBunWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/bun\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst { websocket, upgradeWebSocket } = createBunWebSocket();\n\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\n\t// Use Bun.serve\n\t// @ts-expect-error - Bun global\n\tBun.serve({\n\t\tfetch: app.fetch,\n\t\tport,\n\t\thostname,\n\t\twebsocket,\n\t});\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n","import { z } from \"zod\";\nimport { getRunMetadata } from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport {\n\tKEYS,\n\tqueueMessagesPrefix,\n\tqueueMetadataKey,\n\tworkflowStoragePrefix,\n} from \"@/actor/keys\";\nimport { ENGINE_ENDPOINT } from \"@/common/engine\";\nimport { type Logger, LogLevelSchema } from \"@/common/log\";\nimport { VERSION } from \"@/utils\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\nimport {\n\tgetRivetEndpoint,\n\tgetRivetEngine,\n\tgetRivetkitRuntime,\n\tgetRivetNamespace,\n\tgetRivetRunEngine,\n\tgetRivetRunEngineVersion,\n\tgetRivetToken,\n\tisDev,\n} from \"@/utils/env-vars\";\nimport { EnvoyConfigSchema } from \"./envoy\";\nimport {\n\tConfigurePoolSchema,\n\tDEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES,\n\tServerlessConfigSchema,\n} from \"./serverless\";\n\nexport const ActorsSchema = z.record(\n\tz.string(),\n\tz.custom<AnyActorDefinition>(),\n);\nexport type RegistryActors = z.infer<typeof ActorsSchema>;\n\nexport const RuntimeKindSchema = z.enum([\"auto\", \"native\", \"wasm\"]);\nexport type RuntimeKind = z.infer<typeof RuntimeKindSchema>;\nexport type WasmRuntimeBindings = typeof import(\"@rivetkit/rivetkit-wasm\");\nexport type WasmRuntimeInitInput = Parameters<\n\tWasmRuntimeBindings[\"default\"]\n>[0];\nexport const SqliteBackendSchema = z.enum([\"local\", \"remote\"]);\nexport type SqliteBackend = z.infer<typeof SqliteBackendSchema>;\n\nexport const TestConfigSchema = z.object({\n\tenabled: z.boolean().optional().default(false),\n\tsqliteBackend: SqliteBackendSchema.optional(),\n});\nexport type TestConfig = z.infer<typeof TestConfigSchema>;\n\nexport const WasmRuntimeConfigSchema = z.object({\n\tbindings: z.custom<WasmRuntimeBindings>().optional(),\n\tinitInput: z.custom<WasmRuntimeInitInput>().optional(),\n});\nexport type WasmRuntimeConfig = z.infer<typeof WasmRuntimeConfigSchema>;\n\nexport const SqliteConfigSchema = z\n\t.union([\n\t\tSqliteBackendSchema,\n\t\tz.object({\n\t\t\tbackend: SqliteBackendSchema,\n\t\t}),\n\t])\n\t.optional()\n\t.transform((config) => {\n\t\tif (config === undefined) return undefined;\n\t\tif (typeof config === \"string\") return { backend: config };\n\t\treturn config;\n\t});\nexport type SqliteConfig = z.infer<typeof SqliteConfigSchema>;\n\n// TODO: Add sane defaults for NODE_ENV=development\nexport const RegistryConfigSchema = z\n\t.object({\n\t\t// MARK: Actors\n\t\tuse: z.record(z.string(), z.custom<AnyActorDefinition>()),\n\n\t\t// TODO: Find a better way of passing around the test config\n\t\t/**\n\t\t * Test configuration.\n\t\t *\n\t\t * DO NOT MANUALLY ENABLE. THIS IS USED INTERNALLY.\n\t\t * @internal\n\t\t **/\n\t\ttest: TestConfigSchema.optional().default({ enabled: false }),\n\n\t\t// MARK: Networking\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t// MARK: Runtime\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Runtime binding to use for RivetKit core.\n\t\t * */\n\t\truntime: RuntimeKindSchema.optional().transform((val, ctx) => {\n\t\t\tconst rawRuntime = val ?? getRivetkitRuntime();\n\t\t\tif (rawRuntime === undefined) {\n\t\t\t\treturn \"auto\";\n\t\t\t}\n\n\t\t\tconst parsed = RuntimeKindSchema.safeParse(rawRuntime);\n\t\t\tif (!parsed.success) {\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"RIVETKIT_RUNTIME must be one of auto, native, or wasm\",\n\t\t\t\t});\n\t\t\t\treturn \"auto\";\n\t\t\t}\n\n\t\t\treturn parsed.data;\n\t\t}),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * WebAssembly runtime configuration.\n\t\t * */\n\t\twasm: WasmRuntimeConfigSchema.optional().default(() => ({})),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * SQLite backend selection.\n\t\t * */\n\t\tsqlite: SqliteConfigSchema,\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t// MARK: Routing\n\t\t// // This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// // fly. This is required since the dependencies that upgradeWebSocket\n\t\t// // (specifically Node.js) can sometimes only be specified after the router is\n\t\t// // created or must be imported async using `await import(...)`\n\t\t// getUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t// MARK: Runner Configuration\n\t\t/**\n\t\t * Endpoint to connect to for Rivet Engine.\n\t\t *\n\t\t * Supports URL auth syntax for namespace and token:\n\t\t * - `https://namespace:token@api.rivet.dev`\n\t\t * - `https://namespace@api.rivet.dev`\n\t\t *\n\t\t * Can also be set via RIVET_ENDPOINT environment variables.\n\t\t */\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetEngine() ?? getRivetEndpoint()),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetToken()),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetNamespace()),\n\t\theaders: z.record(z.string(), z.string()).optional().default({}),\n\n\t\t// MARK: Client\n\t\t// TODO:\n\t\t// client: ClientConfigSchema.optional(),\n\n\t\t// MARK: Local HTTP\n\t\t/**\n\t\t * Directory to serve static files from.\n\t\t *\n\t\t * When set, the local RivetKit server will serve static files from this\n\t\t * directory. This is used by `registry.start()` to serve a frontend\n\t\t * alongside the actor API.\n\t\t */\n\t\tstaticDir: z.string().optional(),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the local RivetKit API. This is used to prefix all routes.\n\t\t * For example, if the base path is `/foo`, then the route `/actors`\n\t\t * will be available at `/foo/actors`.\n\t\t */\n\t\thttpBasePath: z.string().optional().default(\"/\"),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What port to run the local HTTP server on.\n\t\t */\n\t\thttpPort: z.number().optional().default(6421),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What host to bind the local HTTP server to.\n\t\t */\n\t\thttpHost: z.string().optional(),\n\n\t\t// MARK: Engine\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Starts the full Rust engine process locally.\n\t\t */\n\t\tstartEngine: z.boolean().default(() => getRivetRunEngine()),\n\t\t/** @experimental */\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Automatically configure serverless envoys in the engine.\n\t\t */\n\t\tconfigurePool: ConfigurePoolSchema.optional(),\n\n\t\t// MARK: Runtime-specific\n\t\tserverless: ServerlessConfigSchema.optional().default(() =>\n\t\t\tServerlessConfigSchema.parse({}),\n\t\t),\n\t\tenvoy: EnvoyConfigSchema.optional().default(() =>\n\t\t\tEnvoyConfigSchema.parse({}),\n\t\t),\n\n\t\t// MARK: Shutdown\n\t\t/**\n\t\t * Graceful shutdown configuration for SIGINT/SIGTERM.\n\t\t *\n\t\t * When a persistent envoy is running (Mode A, started via `registry.start()`),\n\t\t * rivetkit installs Node SIGINT/SIGTERM handlers that call into core's\n\t\t * `shutdown()` and wait up to `gracePeriodMs` for the envoy to drain\n\t\t * before re-raising the signal to let Node exit via its default path.\n\t\t *\n\t\t * Handlers are NOT installed when `handler(request)` is used alone\n\t\t * (Mode B / serverless): platform runtimes (Cloudflare Workers, Vercel,\n\t\t * Deno Deploy) own their own signal policy there, and `process.on` may\n\t\t * not exist.\n\t\t */\n\t\tshutdown: z\n\t\t\t.object({\n\t\t\t\t/**\n\t\t\t\t * Wait this many milliseconds for the serve promise to resolve\n\t\t\t\t * after calling `CoreRegistry::shutdown()`. Defaults to the\n\t\t\t\t * engine-provided actor stop threshold once the envoy connects.\n\t\t\t\t *\n\t\t\t\t * Must be long enough for rivetkit-core to drain the envoy.\n\t\t\t\t */\n\t\t\t\tgracePeriodMs: z.number().int().min(1_000).optional(),\n\t\t\t\t/**\n\t\t\t\t * If true, rivetkit will not install SIGINT/SIGTERM handlers.\n\t\t\t\t * Use when the host application owns signal policy and will\n\t\t\t\t * call `nativeRegistry.shutdown()` itself.\n\t\t\t\t */\n\t\t\t\tdisableSignalHandlers: z.boolean().optional().default(false),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({\n\t\t\t\tdisableSignalHandlers: false,\n\t\t\t})),\n\t})\n\t.transform((config, ctx) => {\n\t\tconst isDevEnv = isDev();\n\t\tconst sqliteBackend =\n\t\t\tconfig.sqlite?.backend ?? config.test?.sqliteBackend;\n\n\t\tif (config.runtime === \"wasm\" && sqliteBackend === \"local\") {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"WebAssembly runtime cannot use local SQLite. Use remote SQLite instead.\",\n\t\t\t\tpath:\n\t\t\t\t\tconfig.sqlite?.backend === \"local\"\n\t\t\t\t\t\t? [\"sqlite\"]\n\t\t\t\t\t\t: [\"test\", \"sqliteBackend\"],\n\t\t\t});\n\t\t}\n\n\t\tconst sqlite =\n\t\t\tconfig.runtime === \"wasm\" && config.sqlite === undefined\n\t\t\t\t? { backend: \"remote\" as const }\n\t\t\t\t: config.sqlite;\n\n\t\t// Parse endpoint string (env var fallback is applied via transform above)\n\t\tconst parsedEndpoint = config.endpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.endpoint,\n\t\t\t\t\tpath: [\"endpoint\"],\n\t\t\t\t\tnamespace: config.namespace,\n\t\t\t\t\ttoken: config.token,\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// Can't start a local engine and connect to a remote endpoint.\n\t\tif (config.startEngine && parsedEndpoint) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both startEngine and endpoint\",\n\t\t\t});\n\t\t}\n\n\t\t// configurePool requires an engine (via endpoint or startEngine).\n\t\tif (config.configurePool && !parsedEndpoint && !config.startEngine) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"configurePool requires either endpoint or startEngine\",\n\t\t\t});\n\t\t}\n\n\t\t// Flatten the endpoint and apply defaults for namespace/token\n\t\t// If startEngine is enabled, set endpoint to the engine endpoint.\n\t\tconst endpoint = config.startEngine\n\t\t\t? ENGINE_ENDPOINT\n\t\t\t: (parsedEndpoint?.endpoint ??\n\t\t\t\t(isDevEnv ? ENGINE_ENDPOINT : undefined));\n\t\tconst validateServerlessEndpoint = Boolean(\n\t\t\tconfig.startEngine || parsedEndpoint,\n\t\t);\n\t\t// Namespace priority: parsed from endpoint URL > config value (includes env var) > \"default\"\n\t\tconst namespace =\n\t\t\tparsedEndpoint?.namespace ?? config.namespace ?? \"default\";\n\t\t// Token priority: parsed from endpoint URL > config value (includes env var)\n\t\tconst token = parsedEndpoint?.token ?? config.token;\n\n\t\t// Parse publicEndpoint string (env var fallback is applied via transform in serverless schema)\n\t\tconst parsedPublicEndpoint = config.serverless.publicEndpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.serverless.publicEndpoint,\n\t\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// Validate that publicEndpoint namespace matches backend namespace if specified\n\t\tif (\n\t\t\tparsedPublicEndpoint?.namespace &&\n\t\t\tparsedPublicEndpoint.namespace !== namespace\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `publicEndpoint namespace \"${parsedPublicEndpoint.namespace}\" must match backend namespace \"${namespace}\"`,\n\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t});\n\t\t}\n\n\t\t// In dev mode, clients connect directly to the local Rivet Engine.\n\t\tconst publicEndpoint =\n\t\t\tparsedPublicEndpoint?.endpoint ??\n\t\t\t(isDevEnv && config.startEngine ? ENGINE_ENDPOINT : undefined);\n\t\t// We extract publicNamespace to validate that it matches the backend\n\t\t// namespace (see validation above), not for functional use.\n\t\tconst publicNamespace = parsedPublicEndpoint?.namespace;\n\t\tconst publicToken =\n\t\t\tparsedPublicEndpoint?.token ?? config.serverless.publicToken;\n\n\t\t// If endpoint is set or starting the engine, we'll use the engine driver.\n\t\treturn {\n\t\t\t...config,\n\t\t\tsqlite,\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\ttoken,\n\t\t\tpublicEndpoint,\n\t\t\tpublicNamespace,\n\t\t\tpublicToken,\n\t\t\tvalidateServerlessEndpoint,\n\t\t\tserverless: {\n\t\t\t\t...config.serverless,\n\t\t\t\tpublicEndpoint,\n\t\t\t},\n\t\t};\n\t});\n\nexport type RegistryConfig = z.infer<typeof RegistryConfigSchema>;\nexport type RegistryConfigInput<A extends RegistryActors> = Omit<\n\tz.input<typeof RegistryConfigSchema>,\n\t\"use\"\n> & { use: A };\n\nexport function buildActorNames(\n\tconfig: RegistryConfig,\n): Record<string, { metadata: Record<string, unknown> }> {\n\treturn Object.fromEntries(\n\t\tObject.keys(config.use).map((actorName) => {\n\t\t\tconst definition = config.use[actorName];\n\t\t\tconst options = definition.config.options ?? {};\n\t\t\tconst runMeta = getRunMetadata(definition.config.run);\n\t\t\tconst metadata: Record<string, unknown> = {};\n\t\t\t// Actor options take precedence over run metadata\n\t\t\tmetadata.icon = options.icon ?? runMeta.icon;\n\t\t\tmetadata.name = options.name ?? runMeta.name;\n\t\t\tmetadata.preload = {\n\t\t\t\tkeys: [\n\t\t\t\t\tArray.from(KEYS.PERSIST_DATA),\n\t\t\t\t\tArray.from(KEYS.INSPECTOR_TOKEN),\n\t\t\t\t\tArray.from(queueMetadataKey()),\n\t\t\t\t\tArray.from(KEYS.LAST_PUSHED_ALARM),\n\t\t\t\t],\n\t\t\t\tprefixes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(workflowStoragePrefix()),\n\t\t\t\t\t\tmaxBytes: options.preloadMaxWorkflowBytes ?? 131_072,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(KEYS.CONN_PREFIX),\n\t\t\t\t\t\tmaxBytes: options.preloadMaxConnectionsBytes ?? 65_536,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(queueMessagesPrefix()),\n\t\t\t\t\t\tmaxBytes: 65_536,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\t// Remove undefined values\n\t\t\tif (!metadata.icon) delete metadata.icon;\n\t\t\tif (!metadata.name) delete metadata.name;\n\t\t\treturn [actorName, { metadata }];\n\t\t}),\n\t);\n}\n\n// MARK: Documentation Schemas\n// These schemas are JSON-serializable versions used for documentation generation.\n// They exclude runtime-only fields (transforms, custom types, Logger instances).\n\nexport const DocConfigurePoolSchema = z\n\t.object({\n\t\tname: z.string().optional().describe(\"Name of the runner pool.\"),\n\t\turl: z\n\t\t\t.string()\n\t\t\t.describe(\"URL of the serverless platform to configure runners.\"),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Headers to include in requests to the serverless platform.\",\n\t\t\t),\n\t\trequestLifespan: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum lifespan of a request in seconds.\"),\n\t\tdrainGracePeriod: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Grace period before the serverless request is forcibly closed, in seconds.\",\n\t\t\t),\n\t\tmetadata: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional metadata to pass to the serverless platform.\",\n\t\t\t),\n\t\tmetadataPollInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in milliseconds between metadata polls from the engine. Defaults to 10000 milliseconds (10 seconds).\",\n\t\t\t),\n\t\tdrainOnVersionUpgrade: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Drain runners when a new version is deployed. Defaults to true.\",\n\t\t\t),\n\t})\n\t.optional();\n\nexport const DocServerlessConfigSchema = z\n\t.object({\n\t\tbasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Base path for serverless API routes. Default: '/api/rivet'\",\n\t\t\t),\n\t\tmaxStartPayloadBytes: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t`Maximum POST /start body size in bytes. Default: ${DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES}`,\n\t\t\t),\n\t\tpublicEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"The endpoint that clients should connect to. Supports URL auth syntax: https://namespace:token@api.rivet.dev\",\n\t\t\t),\n\t\tpublicToken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Token that clients should use when connecting via the public endpoint.\",\n\t\t\t),\n\t})\n\t.describe(\"Configuration for serverless deployment mode.\");\n\nexport const DocEnvoyConfigSchema = z\n\t.object({\n\t\ttotalSlots: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Total number of actor slots available. Default: 100000\"),\n\t\tpoolName: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Name of this envoy pool. Default: 'default'\"),\n\t\tenvoyKey: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Deprecated. Authentication key for the envoy.\"),\n\t\tversion: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Version number of this envoy. Default: 1\"),\n\t})\n\t.describe(\"Configuration for envoy mode.\");\n\nexport const DocSqliteConfigSchema = z\n\t.object({\n\t\tbackend: SqliteBackendSchema.optional().describe(\n\t\t\t\"SQLite backend to use. Native defaults to local. Wasm defaults to remote and cannot use local.\",\n\t\t),\n\t})\n\t.optional()\n\t.describe(\"SQLite runtime configuration.\");\n\nexport const DocRegistryConfigSchema = z\n\t.object({\n\t\tuse: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.describe(\n\t\t\t\t\"Actor definitions. Keys are actor names, values are actor definitions.\",\n\t\t\t),\n\t\tmaxIncomingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of incoming WebSocket messages in bytes. Default: 65536\",\n\t\t\t),\n\t\tmaxOutgoingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of outgoing WebSocket messages in bytes. Default: 1048576\",\n\t\t\t),\n\t\tnoWelcome: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"Disable the welcome message on startup. Default: false\"),\n\t\tsqlite: DocSqliteConfigSchema,\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tlevel: LogLevelSchema.optional().describe(\n\t\t\t\t\t\"Log level for RivetKit. Default: 'warn'\",\n\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\"Logging configuration.\"),\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Endpoint URL to connect to Rivet Engine. Supports URL auth syntax: https://namespace:token@api.rivet.dev. Can also be set via RIVET_ENDPOINT environment variable.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Authentication token for Rivet Engine. Can also be set via RIVET_TOKEN environment variable.\",\n\t\t\t),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Namespace to use. Default: 'default'. Can also be set via RIVET_NAMESPACE environment variable.\",\n\t\t\t),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional headers to include in requests to Rivet Engine.\",\n\t\t\t),\n\t\tstaticDir: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Directory to serve static files from. When set, registry.start() serves static files alongside the actor API.\",\n\t\t\t),\n\t\thttpBasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Base path for the local RivetKit API. Default: '/'\"),\n\t\thttpPort: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Port to run the local HTTP server on. Default: 6421\"),\n\t\thttpHost: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Host to bind the local HTTP server to.\"),\n\t\tstartEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Starts the full Rust engine process locally. Default: false\",\n\t\t\t),\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Version of the local engine package to use. Defaults to the current RivetKit version.\",\n\t\t\t),\n\t\tconfigurePool: DocConfigurePoolSchema.describe(\n\t\t\t\"Automatically configure serverless runners in the engine.\",\n\t\t),\n\t\tserverless: DocServerlessConfigSchema.optional(),\n\t\tenvoy: DocEnvoyConfigSchema.optional(),\n\t})\n\t.describe(\"RivetKit registry configuration.\");\n","import { z } from \"zod/v4\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tgetNodeEnv,\n\tgetRivetEnvoyVersion,\n\tgetRivetPool,\n\tgetRivetTotalSlots,\n} from \"@/utils/env-vars\";\n\nlet warnedMissingVersion = false;\n\nexport const EnvoyConfigSchema = z.object({\n\tpoolName: z.string().default(() => getRivetPool() ?? \"default\"),\n\tversion: z.number().default(() => {\n\t\tconst version = getRivetEnvoyVersion();\n\t\tif (version !== undefined) return version;\n\n\t\tif (getNodeEnv() === \"production\" && !warnedMissingVersion) {\n\t\t\twarnedMissingVersion = true;\n\t\t\tgetLogger(\"rivetkit\").error(\n\t\t\t\t\"RIVET_ENVOY_VERSION is not set. Actors will not be versioned, which means they won't be drained on deploy. This is only needed when self-hosting or using a custom envoy (not needed for Rivet Compute). Set this as a build arg in your Dockerfile. See https://rivet.dev/docs/actors/versions\",\n\t\t\t);\n\t\t}\n\n\t\treturn 1;\n\t}),\n\n\t// Deprecated.\n\ttotalSlots: z.number().default(() => getRivetTotalSlots() ?? 100000),\n\tenvoyKey: z.string().optional(),\n});\nexport type EnvoyConfigInput = z.input<typeof EnvoyConfigSchema>;\nexport type EnvoyConfig = z.infer<typeof EnvoyConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { getRivetPublicEndpoint, getRivetPublicToken } from \"@/utils/env-vars\";\n\nexport const DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES = 16 * 1024 * 1024;\n\nexport const ConfigurePoolSchema = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\turl: z.string(),\n\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\trequestLifespan: z.number().optional(),\n\t\tdrainGracePeriod: z.number().optional(),\n\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\tmetadataPollInterval: z.number().optional(),\n\t\tdrainOnVersionUpgrade: z.boolean().optional(),\n\t})\n\t.optional();\n\nexport const ServerlessConfigSchema = z.object({\n\t// MARK: Routing\n\tbasePath: z.string().optional().default(\"/api/rivet\"),\n\tmaxStartPayloadBytes: z\n\t\t.number()\n\t\t.optional()\n\t\t.default(DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES),\n\n\t// MARK: Public Endpoint Configuration\n\t/**\n\t * The endpoint that clients should connect to.\n\t *\n\t * This is useful if clients connect to serverless directly\n\t * (e.g. `http://localhost:3000/api/rivet`), they will fetch\n\t * `http://localhost:3000/api/rivet/metadata` and be redirected to\n\t * the public endpoint.\n\t *\n\t * Supports URL auth syntax for namespace and token:\n\t * - `https://namespace:token@api.rivet.dev`\n\t * - `https://namespace@api.rivet.dev`\n\t *\n\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t *\n\t * Can also be set via RIVET_PUBLIC_ENDPOINT environment variable.\n\t */\n\tpublicEndpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicEndpoint()),\n\n\t/**\n\t * Token that clients should use when connecting via the public endpoint.\n\t *\n\t * Can also be set via RIVET_PUBLIC_TOKEN environment variable.\n\t *\n\t * Can also be specified in the publicEndpoint URL as `https://namespace:token@host`.\n\t */\n\tpublicToken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicToken()),\n\n\t// There is no publicNamespace config option because the frontend and backend\n\t// cannot use different namespaces. The namespace is extracted from the\n\t// publicEndpoint URL auth syntax if provided.\n});\nexport type ServerlessConfigInput = z.input<typeof ServerlessConfigSchema>;\nexport type ServerlessConfig = z.infer<typeof ServerlessConfigSchema>;\n","import { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\tgetRunFunction,\n\tgetRunInspectorConfig,\n\tRAW_STATE_SYMBOL,\n\ttype WorkflowInspectorConfig,\n} from \"@/actor/config\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport {\n\tdecodeBridgeRivetError,\n\tencodeBridgeRivetError,\n\tforbiddenError,\n\tINTERNAL_ERROR_CODE,\n\tisRivetErrorLike,\n\tRivetError,\n\ttype RivetErrorLike,\n\ttoRivetError,\n} from \"@/actor/errors\";\nimport { makePrefixedKey, removePrefixFromKey } from \"@/actor/keys\";\nimport {\n\tgetEventCanSubscribe,\n\tgetQueueCanPublish,\n\thasSchemaConfigKey,\n} from \"@/actor/schema\";\nimport {\n\ttype AnyClient,\n\ttype Client,\n\tcreateClientWithDriver,\n} from \"@/client/client\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { HEADER_CONN_PARAMS } from \"@/common/actor-router-consts\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { wrapJsNativeDatabase } from \"@/common/database/native-database\";\nimport { assertJsonCompatValue, type JsonCompatValue } from \"@/common/encoding\";\nimport { decodeWorkflowHistoryTransport } from \"@/common/inspector-transport\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { RemoteEngineControlClient } from \"@/engine-client/mod\";\nimport type { Registry } from \"@/registry\";\nimport type {\n\tRegistryConfig,\n\tRuntimeKind,\n\tSqliteBackend,\n} from \"@/registry/config\";\nimport { decodeCborCompat, encodeCborCompat } from \"@/serde\";\nimport { getEnvUniversal, VERSION } from \"@/utils\";\nimport { logger } from \"./log\";\nimport { loadNapiRuntime } from \"./napi-runtime\";\nimport {\n\ttype NativeValidationConfig,\n\tvalidateActionArgs,\n\tvalidateConnParams,\n\tvalidateEventArgs,\n\tvalidateQueueBody,\n\tvalidateQueueComplete,\n} from \"./native-validation\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeBytes,\n\tRuntimeHttpResponse,\n\tRuntimeQueueMessage,\n\tRuntimeServeConfig,\n\tRuntimeStateDeltaPayload,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { loadWasmRuntime } from \"./wasm-runtime\";\nimport { createWriteThroughProxy } from \"./write-through-proxy\";\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\ntype ResolvedRuntimeKind = Exclude<RuntimeKind, \"auto\">;\ntype RuntimeHostKind = \"node-like\" | \"edge-like\";\nexport type RuntimeLoaders = {\n\tloadNative: () => ReturnType<typeof loadNapiRuntime>;\n\tloadWasm: (\n\t\tconfig?: RegistryConfig[\"wasm\"],\n\t) => ReturnType<typeof loadWasmRuntime>;\n\tdetectHost: () => RuntimeHostKind;\n};\ntype SerializeStateReason = \"save\" | \"inspector\";\ntype NativeOnStateChangeHandler = (\n\tctx: ActorContextHandleAdapter,\n\tstate: unknown,\n) => void | Promise<void>;\ntype NativePersistConnState = {\n\tstate: unknown;\n};\n\nconst defaultRuntimeLoaders: RuntimeLoaders = {\n\tloadNative: loadNapiRuntime,\n\tloadWasm: loadWasmRuntime,\n\tdetectHost: detectRuntimeHost,\n};\n\nfunction trySetProcessEnv(key: string, value: string) {\n\tif (typeof process === \"undefined\") return;\n\ttry {\n\t\tprocess.env[key] = value;\n\t} catch {\n\t\t// Some edge runtimes expose a read-only Node-compatible process.env.\n\t}\n}\n\nexport function detectRuntimeHost(): RuntimeHostKind {\n\tconst globalScope = globalThis as typeof globalThis & {\n\t\tBun?: unknown;\n\t\tDeno?: unknown;\n\t\tprocess?: { versions?: { node?: string } };\n\t\tself?: unknown;\n\t\twindow?: unknown;\n\t};\n\n\tif (\n\t\tglobalScope.Deno !== undefined ||\n\t\tglobalScope.Bun !== undefined ||\n\t\ttypeof globalScope.process?.versions?.node === \"string\"\n\t) {\n\t\treturn \"node-like\";\n\t}\n\n\treturn \"edge-like\";\n}\n\nexport function resolveRuntimeKind(\n\truntime: RuntimeKind | undefined,\n): RuntimeKind {\n\treturn runtime ?? \"auto\";\n}\n\nfunction loadedRuntimeKind(runtime: CoreRuntime): ResolvedRuntimeKind {\n\tswitch (runtime.kind) {\n\t\tcase \"napi\":\n\t\t\treturn \"native\";\n\t\tcase \"wasm\":\n\t\t\treturn \"wasm\";\n\t}\n\n\tthrow new RivetError(\n\t\t\"config\",\n\t\t\"unknown_runtime\",\n\t\t\"RivetKit runtime must be NAPI or wasm.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 500,\n\t\t},\n\t);\n}\n\nexport async function loadAutoRuntime(\n\tconfig: RegistryConfig,\n\tloaders: RuntimeLoaders = defaultRuntimeLoaders,\n): Promise<CoreRuntime> {\n\tif (loaders.detectHost() === \"edge-like\") {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n\n\ttry {\n\t\treturn (await loaders.loadNative()).runtime;\n\t} catch {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n}\n\nexport async function loadConfiguredRuntime(\n\tconfig: RegistryConfig,\n\tloaders: RuntimeLoaders = defaultRuntimeLoaders,\n): Promise<CoreRuntime> {\n\tconst requested = resolveRuntimeKind(config.runtime);\n\n\tif (requested === \"native\") {\n\t\treturn (await loaders.loadNative()).runtime;\n\t}\n\n\tif (requested === \"wasm\") {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n\n\treturn loadAutoRuntime(config, loaders);\n}\n\nfunction sqliteBackendForConfig(\n\tconfig: RegistryConfig,\n): SqliteBackend | undefined {\n\treturn config.sqlite?.backend ?? config.test?.sqliteBackend;\n}\n\nexport function normalizeRuntimeConfigForKind(\n\tconfig: RegistryConfig,\n\truntimeKind: ResolvedRuntimeKind,\n): RegistryConfig {\n\tif (runtimeKind === \"native\") {\n\t\treturn config;\n\t}\n\n\tif (sqliteBackendForConfig(config) === \"local\") {\n\t\tthrow new RivetError(\n\t\t\t\"config\",\n\t\t\t\"wasm_local_sqlite\",\n\t\t\t\"WebAssembly runtime cannot use local SQLite. Use remote SQLite instead.\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tstatusCode: 400,\n\t\t\t\tmetadata: { runtime: \"wasm\", sqliteBackend: \"local\" },\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\t...config,\n\t\tsqlite: {\n\t\t\t...config.sqlite,\n\t\t\tbackend: \"remote\",\n\t\t},\n\t\ttest: {\n\t\t\t...config.test,\n\t\t\tenabled: config.test?.enabled ?? false,\n\t\t\tsqliteBackend: \"remote\",\n\t\t},\n\t};\n}\n\nexport function normalizeRuntimeConfig(\n\tconfig: RegistryConfig,\n\truntime: CoreRuntime,\n): RegistryConfig {\n\treturn normalizeRuntimeConfigForKind(config, loadedRuntimeKind(runtime));\n}\ntype NativePersistActorState = {\n\tstate: unknown;\n\tisInOnStateChange: boolean;\n\tconnStates: Map<string, NativePersistConnState>;\n\t// Memoized deep write-through proxy and the state object it wraps. Rebuilt\n\t// only when the underlying state object identity changes.\n\tstateProxy?: unknown;\n\tstateProxyTarget?: unknown;\n\t// Set when a coalesced save and onStateChange flush is pending for the\n\t// current event loop tick.\n\tsaveScheduled?: boolean;\n\tpendingSaveHandle?: ReturnType<typeof setImmediate>;\n};\ntype NativeDestroyGate = {\n\tdestroyCompletion?: Promise<void>;\n\tresolveDestroy?: () => void;\n};\ntype NativeDatabaseClientState = {\n\tclient: unknown;\n};\ntype NativeActorRuntimeState = {\n\tsql?: ReturnType<typeof wrapJsNativeDatabase>;\n\tdatabaseClient?: NativeDatabaseClientState;\n\tvarsInitialized?: boolean;\n\tvars?: unknown;\n\tdestroyGate?: NativeDestroyGate;\n\tpersistState?: NativePersistActorState;\n};\n\n// Keep JS-only actor caches on the NAPI ActorContext runtime-state bag instead\n// of actorId-keyed module globals so same-key recreates start from a fresh\n// generation.\nfunction getNativeRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): NativeActorRuntimeState {\n\tconst runtimeState = callNativeSync(() =>\n\t\truntime.actorRuntimeState(ctx),\n\t) as NativeActorRuntimeState;\n\tif (!runtimeState.destroyGate) {\n\t\truntimeState.destroyGate = {};\n\t}\n\tif (!runtimeState.persistState) {\n\t\truntimeState.persistState = {\n\t\t\tstate: undefined,\n\t\t\tisInOnStateChange: false,\n\t\t\tconnStates: new Map(),\n\t\t};\n\t}\n\treturn runtimeState;\n}\n\nfunction getNativePersistState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): NativePersistActorState {\n\tconst persistState = getNativeRuntimeState(runtime, ctx).persistState;\n\tif (!persistState) {\n\t\tthrow new Error(\"native persist state was not initialized\");\n\t}\n\treturn persistState;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"then\" in value &&\n\t\ttypeof value.then === \"function\"\n\t);\n}\n\nfunction getNativeConnPersistState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tconn: ConnHandle,\n): NativePersistConnState {\n\tconst persistState = getNativePersistState(runtime, ctx);\n\tconst connId = callNativeSync(() => runtime.connId(conn));\n\tlet connState = persistState.connStates.get(connId);\n\tif (!connState) {\n\t\tconnState = {\n\t\t\tstate: undefined,\n\t\t};\n\t\tpersistState.connStates.set(connId, connState);\n\t}\n\treturn connState;\n}\n\nfunction stateMutationReentrantError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"state_mutation_reentrant\",\n\t\t\"State mutations are not allowed inside onStateChange.\",\n\t);\n}\n\nfunction databaseNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"database_not_configured\",\n\t\t\"database is not configured for this actor\",\n\t\t{ public: true },\n\t);\n}\n\nfunction databaseClientNotReadyError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"database_client_not_ready\",\n\t\t\"actor database client was not initialized before user code ran. this is an internal lifecycle error; the migration callback should have pre-warmed the client. file an issue if you can reproduce.\",\n\t\t{ public: true },\n\t);\n}\n\nfunction stateNotEnabledError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"state_not_enabled\",\n\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t{ public: true },\n\t);\n}\n\nfunction nativeClientNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"native\",\n\t\t\"client_not_configured\",\n\t\t\"native actor client is not configured\",\n\t\t{ public: true },\n\t);\n}\n\nfunction nativeEndpointNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"native\",\n\t\t\"endpoint_not_configured\",\n\t\t\"registry endpoint is required for native envoy startup\",\n\t\t{ public: true },\n\t);\n}\n\nfunction getNativeDestroyGate(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\tconst destroyGate = getNativeRuntimeState(runtime, ctx).destroyGate;\n\tif (!destroyGate) {\n\t\tthrow new Error(\"native destroy gate was not initialized\");\n\t}\n\treturn destroyGate;\n}\n\nfunction markNativeDestroyRequested(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n) {\n\tconst gate = getNativeDestroyGate(runtime, ctx);\n\tif (!gate.destroyCompletion) {\n\t\tgate.destroyCompletion = new Promise<void>((resolve) => {\n\t\t\tgate.resolveDestroy = resolve;\n\t\t});\n\t}\n}\n\nfunction resolveNativeDestroy(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\tconst gate = getNativeRuntimeState(runtime, ctx).destroyGate;\n\tif (!gate?.resolveDestroy) {\n\t\treturn;\n\t}\n\n\tgate.resolveDestroy();\n\tgate.resolveDestroy = undefined;\n\tgate.destroyCompletion = undefined;\n}\n\nfunction clearNativeRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n) {\n\tcallNativeSync(() => runtime.actorClearRuntimeState(ctx));\n}\n\nasync function cleanupNativeSleepRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tafterTrackedWorkDrained?: () => Promise<void>,\n): Promise<void> {\n\t// The bounded wait gives shutdown work one grace-period chance to finish.\n\t// Drained means all tracked shutdown work completed before the deadline, so\n\t// we can save final state and clear runtime state immediately. If it did not\n\t// drain, close database handles now, then defer the final save and clear until\n\t// the tracked work finishes without a deadline.\n\tconst drained = await runtime.actorWaitForTrackedShutdownWork(ctx);\n\tif (!drained) {\n\t\tawait closeNativeDatabaseClient(runtime, ctx);\n\t\tawait closeNativeSqlDatabase(runtime, ctx);\n\t\tvoid runtime\n\t\t\t.actorWaitForTrackedShutdownWorkUnbounded(ctx)\n\t\t\t.then(async () => {\n\t\t\t\tawait afterTrackedWorkDrained?.();\n\t\t\t\tclearNativeRuntimeState(runtime, ctx);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"deferred native sleep cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\treturn;\n\t}\n\n\tawait afterTrackedWorkDrained?.();\n\tawait closeNativeDatabaseClient(runtime, ctx);\n\tawait closeNativeSqlDatabase(runtime, ctx);\n\tclearNativeRuntimeState(runtime, ctx);\n}\n\nfunction closeNativeSqlDatabase(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): Promise<void> | undefined {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst database = runtimeState.sql;\n\tif (!database) {\n\t\treturn;\n\t}\n\n\truntimeState.sql = undefined;\n\treturn database.close();\n}\n\nasync function closeNativeDatabaseClient(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): Promise<void> {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst entry = runtimeState.databaseClient;\n\tif (!entry) {\n\t\treturn;\n\t}\n\n\truntimeState.databaseClient = undefined;\n\n\tif (\n\t\tentry.client &&\n\t\ttypeof entry.client === \"object\" &&\n\t\t\"close\" in entry.client &&\n\t\ttypeof entry.client.close === \"function\"\n\t) {\n\t\tawait entry.client.close();\n\t}\n}\n\nfunction getOrCreateNativeSqlDatabase(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): ReturnType<typeof wrapJsNativeDatabase> {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst cachedDatabase = runtimeState.sql;\n\tif (cachedDatabase) {\n\t\treturn cachedDatabase;\n\t}\n\n\tconst database = wrapJsNativeDatabase({\n\t\texec: (sql) => runtime.actorSqlExec(ctx, sql),\n\t\texecute: (sql, params) => runtime.actorSqlExecute(ctx, sql, params),\n\t\tquery: (sql, params) => runtime.actorSqlQuery(ctx, sql, params),\n\t\trun: (sql, params) => runtime.actorSqlRun(ctx, sql, params),\n\t\tmetrics: () => runtime.actorSqlMetrics(ctx),\n\t\ttakeLastKvError: () => runtime.actorSqlTakeLastKvError(ctx),\n\t\tclose: () => runtime.actorSqlClose(ctx),\n\t});\n\truntimeState.sql = database;\n\treturn database;\n}\n\nfunction toRuntimeBytes(\n\tvalue: string | Uint8Array | ArrayBuffer,\n): RuntimeBytes {\n\tif (typeof value === \"string\") {\n\t\treturn textEncoder.encode(value);\n\t}\n\tif (value instanceof Uint8Array) {\n\t\treturn value;\n\t}\n\treturn new Uint8Array(value);\n}\n\nfunction arrayBufferViewToRuntimeBytes(value: ArrayBufferView): RuntimeBytes {\n\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n}\n\nfunction runtimeBytesToArrayBuffer(value: RuntimeBytes): ArrayBuffer {\n\treturn value.buffer.slice(\n\t\tvalue.byteOffset,\n\t\tvalue.byteOffset + value.byteLength,\n\t) as ArrayBuffer;\n}\n\ntype NativeKvValueType = \"text\" | \"arrayBuffer\" | \"binary\";\ntype NativeKvKeyType = \"text\" | \"binary\";\n\ntype NativeKvValueTypeMap = {\n\ttext: string;\n\tarrayBuffer: ArrayBuffer;\n\tbinary: Uint8Array;\n};\n\ntype NativeKvKeyTypeMap = {\n\ttext: string;\n\tbinary: Uint8Array;\n};\n\ntype NativeKvValueOptions<T extends NativeKvValueType = \"text\"> = {\n\ttype?: T;\n};\n\ntype NativeKvListOptions<\n\tT extends NativeKvValueType = \"text\",\n\tK extends NativeKvKeyType = \"text\",\n> = NativeKvValueOptions<T> & {\n\tkeyType?: K;\n\treverse?: boolean;\n\tlimit?: number;\n};\n\nfunction decodeNativeKvKey<K extends NativeKvKeyType = \"text\">(\n\tkey: Uint8Array,\n\tkeyType?: K,\n): NativeKvKeyTypeMap[K] {\n\tconst resolvedKeyType = keyType ?? \"text\";\n\tswitch (resolvedKeyType) {\n\t\tcase \"text\":\n\t\t\treturn textDecoder.decode(key) as NativeKvKeyTypeMap[K];\n\t\tcase \"binary\":\n\t\t\treturn key as NativeKvKeyTypeMap[K];\n\t\tdefault:\n\t\t\tthrow new TypeError(\"Invalid kv key type\");\n\t}\n}\n\nfunction encodeNativeKvUserKey<K extends NativeKvKeyType = NativeKvKeyType>(\n\tkey: NativeKvKeyTypeMap[K],\n\tkeyType?: K,\n): Uint8Array {\n\tif (key instanceof Uint8Array) {\n\t\treturn key;\n\t}\n\tconst resolvedKeyType = keyType ?? \"text\";\n\tif (resolvedKeyType === \"binary\") {\n\t\tthrow new TypeError(\"Expected a Uint8Array when keyType is binary\");\n\t}\n\treturn textEncoder.encode(key);\n}\n\nfunction decodeNativeKvValue<T extends NativeKvValueType = \"text\">(\n\tvalue: Uint8Array,\n\toptions?: NativeKvValueOptions<T>,\n): NativeKvValueTypeMap[T] {\n\tconst type = options?.type ?? \"text\";\n\tswitch (type) {\n\t\tcase \"text\":\n\t\t\treturn textDecoder.decode(value) as NativeKvValueTypeMap[T];\n\t\tcase \"arrayBuffer\": {\n\t\t\tconst copy = new Uint8Array(value.byteLength);\n\t\t\tcopy.set(value);\n\t\t\treturn copy.buffer as NativeKvValueTypeMap[T];\n\t\t}\n\t\tcase \"binary\":\n\t\t\treturn value as NativeKvValueTypeMap[T];\n\t\tdefault:\n\t\t\tthrow new TypeError(\"Invalid kv value type\");\n\t}\n}\n\nasync function loadEngineCli(): Promise<typeof import(\"@rivetkit/engine-cli\")> {\n\treturn import([\"@rivetkit\", \"engine-cli\"].join(\"/\"));\n}\n\nfunction decodeValue<T>(value?: RuntimeBytes | null): T {\n\tif (!value || value.length === 0) {\n\t\treturn undefined as T;\n\t}\n\n\treturn decodeCborCompat(value);\n}\n\nfunction encodeValue(value: unknown): RuntimeBytes {\n\treturn encodeCborCompat(value as JsonCompatValue);\n}\n\nfunction unwrapTsfnPayload<T>(error: unknown, payload: T): T {\n\tif (error !== null && error !== undefined) {\n\t\tthrow error;\n\t}\n\n\treturn payload;\n}\n\nfunction normalizeNativeBridgeError(error: unknown): unknown {\n\tif (typeof error === \"string\") {\n\t\treturn decodeBridgeRivetError(error) ?? error;\n\t}\n\n\tif (error instanceof Error) {\n\t\tconst bridged = decodeBridgeRivetError(error.message);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\tif (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"reason\" in error &&\n\t\ttypeof error.reason === \"string\"\n\t) {\n\t\tconst bridged = decodeBridgeRivetError(error.reason);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\treturn error;\n}\n\nfunction isStructuredBridgeError(\n\terror: unknown,\n): error is RivetError | RivetErrorLike {\n\tif (error instanceof RivetError) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tisRivetErrorLike(error) &&\n\t\t\"__type\" in error &&\n\t\t(error.__type === \"RivetError\" || error.__type === \"ActorError\")\n\t);\n}\n\nfunction encodeNativeCallbackError(error: unknown): Error {\n\tconst structuredError = isStructuredBridgeError(error)\n\t\t? error\n\t\t: deconstructError(error, true);\n\n\tconst bridgeError = new Error(encodeBridgeRivetError(structuredError), {\n\t\tcause: error instanceof Error ? error : undefined,\n\t});\n\treturn Object.assign(bridgeError, {\n\t\tgroup: structuredError.group,\n\t\tcode: structuredError.code,\n\t\tmetadata: structuredError.metadata,\n\t});\n}\n\nasync function callNative<T>(invoke: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn await invoke();\n\t} catch (error) {\n\t\tthrow normalizeNativeBridgeError(error);\n\t}\n}\n\nfunction callNativeSync<T>(invoke: () => T): T {\n\ttry {\n\t\treturn invoke();\n\t} catch (error) {\n\t\tthrow normalizeNativeBridgeError(error);\n\t}\n}\n\nfunction actorAbortedError(): Error & { group: string; code: string } {\n\treturn Object.assign(new Error(\"Actor aborted\"), {\n\t\tgroup: \"actor\",\n\t\tcode: \"aborted\",\n\t});\n}\n\ntype NativeWorkflowInspectorConfig = WorkflowInspectorConfig<ArrayBuffer> & {\n\tgetState?: () => Promise<unknown> | unknown;\n};\n\nfunction isClosedTaskRegistrationError(error: unknown): boolean {\n\tconst metadata = error instanceof RivetError ? error.metadata : undefined;\n\tconst metadataError =\n\t\tmetadata && typeof metadata === \"object\" && \"error\" in metadata\n\t\t\t? metadata.error\n\t\t\t: undefined;\n\treturn (\n\t\terror instanceof RivetError &&\n\t\terror.group === \"core\" &&\n\t\terror.code === INTERNAL_ERROR_CODE &&\n\t\ttypeof metadataError === \"string\" &&\n\t\t/actor task registration is (closed|not configured)/.test(metadataError)\n\t);\n}\n\nasync function createCancellationTokenHandle(\n\truntime: CoreRuntime,\n\tsignal?: AbortSignal,\n): Promise<{\n\ttoken?: CancellationTokenHandle;\n\tcleanup?: () => void;\n}> {\n\tif (!signal) {\n\t\treturn {};\n\t}\n\n\tconst token = runtime.createCancellationToken();\n\n\tif (signal.aborted) {\n\t\truntime.cancelCancellationToken(token);\n\t\treturn { token };\n\t}\n\n\tconst abort = () => runtime.cancelCancellationToken(token);\n\tsignal.addEventListener(\"abort\", abort, { once: true });\n\treturn {\n\t\ttoken,\n\t\tcleanup: () => signal.removeEventListener(\"abort\", abort),\n\t};\n}\n\nfunction decodeWorkflowCbor(data: ArrayBuffer | null): unknown | null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn decodeCborCompat(new Uint8Array(data));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction serializeWorkflowLocation(\n\tlocation: ReturnType<\n\t\ttypeof decodeWorkflowHistoryTransport\n\t>[\"entries\"][number][\"location\"],\n): Array<\n\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t| {\n\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\tval: { loop: number; iteration: number };\n\t }\n> {\n\treturn location.map((segment) => {\n\t\tif (segment.tag === \"WorkflowNameIndex\") {\n\t\t\treturn {\n\t\t\t\ttag: segment.tag,\n\t\t\t\tval: segment.val,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttag: segment.tag,\n\t\t\tval: {\n\t\t\t\tloop: segment.val.loop,\n\t\t\t\titeration: segment.val.iteration,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction serializeWorkflowBranches(\n\tbranches: ReadonlyMap<\n\t\tstring,\n\t\tReturnType<\n\t\t\ttypeof decodeWorkflowHistoryTransport\n\t\t>[\"entries\"][number][\"kind\"] extends infer T\n\t\t\t? T extends { tag: \"WorkflowJoinEntry\"; val: { branches: infer B } }\n\t\t\t\t? B extends ReadonlyMap<string, infer V>\n\t\t\t\t\t? V\n\t\t\t\t\t: never\n\t\t\t\t: T extends {\n\t\t\t\t\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\t\t\t\t\tval: { branches: infer B };\n\t\t\t\t\t\t}\n\t\t\t\t\t? B extends ReadonlyMap<string, infer V>\n\t\t\t\t\t\t? V\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t\t: never\n\t>,\n): Record<\n\tstring,\n\t{ status: string; output: unknown | null; error: string | null }\n> {\n\treturn Object.fromEntries(\n\t\tArray.from(branches.entries()).map(([name, branch]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\tstatus: branch.status,\n\t\t\t\toutput: decodeWorkflowCbor(branch.output),\n\t\t\t\terror: branch.error,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction serializeWorkflowEntryKind(\n\tkind: ReturnType<\n\t\ttypeof decodeWorkflowHistoryTransport\n\t>[\"entries\"][number][\"kind\"],\n):\n\t| {\n\t\t\ttag: \"WorkflowStepEntry\";\n\t\t\tval: { output: unknown | null; error: string | null };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowLoopEntry\";\n\t\t\tval: {\n\t\t\t\tstate: unknown | null;\n\t\t\t\titeration: number;\n\t\t\t\toutput: unknown | null;\n\t\t\t};\n\t }\n\t| { tag: \"WorkflowSleepEntry\"; val: { deadline: number; state: string } }\n\t| {\n\t\t\ttag: \"WorkflowMessageEntry\";\n\t\t\tval: { name: string; messageData: unknown | null };\n\t }\n\t| { tag: \"WorkflowRollbackCheckpointEntry\"; val: { name: string } }\n\t| {\n\t\t\ttag: \"WorkflowJoinEntry\";\n\t\t\tval: {\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\tval: {\n\t\t\t\twinner: string | null;\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRemovedEntry\";\n\t\t\tval: { originalType: string; originalName: string | null };\n\t } {\n\tswitch (kind.tag) {\n\t\tcase \"WorkflowStepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t\terror: kind.val.error,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowLoopEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tstate: decodeWorkflowCbor(kind.val.state),\n\t\t\t\t\titeration: kind.val.iteration,\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowSleepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tdeadline: Number(kind.val.deadline),\n\t\t\t\t\tstate: kind.val.state,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowMessageEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t\tmessageData: decodeWorkflowCbor(kind.val.messageData),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRollbackCheckpointEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowJoinEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRaceEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\twinner: kind.val.winner,\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRemovedEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toriginalType: kind.val.originalType,\n\t\t\t\t\toriginalName: kind.val.originalName,\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n// TODO: Switch inspector routes to CBOR encoding\nfunction serializeWorkflowHistoryForJson(data: ArrayBuffer | null): {\n\tnameRegistry: string[];\n\tentries: Array<{\n\t\tid: string;\n\t\tlocation: Array<\n\t\t\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t\t\t| {\n\t\t\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\t\t\tval: { loop: number; iteration: number };\n\t\t\t }\n\t\t>;\n\t\tkind: ReturnType<typeof serializeWorkflowEntryKind>;\n\t}>;\n\tentryMetadata: Record<\n\t\tstring,\n\t\t{\n\t\t\tstatus: string;\n\t\t\terror: string | null;\n\t\t\tattempts: number;\n\t\t\tlastAttemptAt: number;\n\t\t\tcreatedAt: number;\n\t\t\tcompletedAt: number | null;\n\t\t\trollbackCompletedAt: number | null;\n\t\t\trollbackError: string | null;\n\t\t}\n\t>;\n} | null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\tconst history = decodeWorkflowHistoryTransport(data);\n\n\treturn jsonSafe({\n\t\tnameRegistry: [...history.nameRegistry],\n\t\tentries: history.entries.map((entry) => ({\n\t\t\tid: entry.id,\n\t\t\tlocation: serializeWorkflowLocation(entry.location),\n\t\t\tkind: serializeWorkflowEntryKind(entry.kind),\n\t\t})),\n\t\tentryMetadata: Object.fromEntries(\n\t\t\tArray.from(history.entryMetadata.entries()).map(\n\t\t\t\t([entryId, meta]) => [\n\t\t\t\t\tentryId,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: meta.status,\n\t\t\t\t\t\terror: meta.error,\n\t\t\t\t\t\tattempts: meta.attempts,\n\t\t\t\t\t\tlastAttemptAt: Number(meta.lastAttemptAt),\n\t\t\t\t\t\tcreatedAt: Number(meta.createdAt),\n\t\t\t\t\t\tcompletedAt:\n\t\t\t\t\t\t\tmeta.completedAt === null\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: Number(meta.completedAt),\n\t\t\t\t\t\trollbackCompletedAt:\n\t\t\t\t\t\t\tmeta.rollbackCompletedAt === null\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: Number(meta.rollbackCompletedAt),\n\t\t\t\t\t\trollbackError: meta.rollbackError,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t),\n\t\t),\n\t});\n}\n\nfunction toHttpJsonCompatible<T>(value: T): T {\n\treturn JSON.parse(\n\t\tJSON.stringify(value, (_key, nestedValue) =>\n\t\t\ttypeof nestedValue === \"bigint\"\n\t\t\t\t? Number(nestedValue)\n\t\t\t\t: nestedValue instanceof Uint8Array\n\t\t\t\t\t? Array.from(nestedValue)\n\t\t\t\t\t: nestedValue,\n\t\t),\n\t) as T;\n}\n\nfunction jsonSafe<T>(value: T): T {\n\treturn toHttpJsonCompatible(value);\n}\n\nfunction normalizeSqlitePropertyBindings(\n\tproperties: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst normalized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(properties)) {\n\t\tif (/^[:@$]/.test(key)) {\n\t\t\tnormalized[key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tnormalized[`:${key}`] = value;\n\t\tnormalized[`@${key}`] = value;\n\t\tnormalized[`$${key}`] = value;\n\t}\n\treturn normalized;\n}\n\nfunction queryRows(result: unknown): Array<Record<string, unknown>> {\n\tif (Array.isArray(result)) {\n\t\treturn result as Array<Record<string, unknown>>;\n\t}\n\tif (\n\t\tresult &&\n\t\ttypeof result === \"object\" &&\n\t\t\"columns\" in result &&\n\t\t\"rows\" in result &&\n\t\tArray.isArray((result as { columns: unknown }).columns) &&\n\t\tArray.isArray((result as { rows: unknown }).rows)\n\t) {\n\t\tconst columns = (result as { columns: string[] }).columns;\n\t\treturn ((result as { rows: unknown[][] }).rows ?? []).map((row) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tcolumns.map((column, index) => [column, row[index]]),\n\t\t\t),\n\t\t);\n\t}\n\treturn [];\n}\n\nfunction wrapNativeCallback<Args extends Array<unknown>, Result>(\n\tcallback: (...args: Args) => Result | Promise<Result>,\n): (...args: Args) => Promise<Result> {\n\treturn async (...args: Args) => {\n\t\ttry {\n\t\t\treturn await callback(...args);\n\t\t} catch (error) {\n\t\t\tthrow encodeNativeCallbackError(error);\n\t\t}\n\t};\n}\n\nfunction decodeArgs(value?: RuntimeBytes | null): unknown[] {\n\tconst decoded = decodeValue<unknown>(value);\n\treturn Array.isArray(decoded)\n\t\t? decoded\n\t\t: decoded === undefined\n\t\t\t? []\n\t\t\t: [decoded];\n}\n\nfunction buildRequest(init: {\n\tmethod: string;\n\turi: string;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}): Request {\n\tconst url = init.uri.startsWith(\"http\")\n\t\t? init.uri\n\t\t: new URL(init.uri, \"http://127.0.0.1\").toString();\n\tconst body =\n\t\tinit.body && init.body.length > 0\n\t\t\t? runtimeBytesToArrayBuffer(init.body)\n\t\t\t: undefined;\n\treturn new Request(url, {\n\t\tmethod: init.method,\n\t\theaders: init.headers,\n\t\tbody,\n\t});\n}\n\nasync function toRuntimeHttpResponse(\n\tresponse: Response,\n): Promise<RuntimeHttpResponse> {\n\tconst headers = Object.fromEntries(response.headers.entries());\n\tconst body = new Uint8Array(await response.arrayBuffer());\n\treturn {\n\t\tstatus: response.status,\n\t\theaders,\n\t\tbody,\n\t};\n}\n\nfunction toActorKey(\n\tsegments: Array<{\n\t\tkind: string;\n\t\tstringValue?: string;\n\t\tnumberValue?: number;\n\t}>,\n): string[] {\n\treturn segments.map((segment) =>\n\t\tsegment.kind === \"number\"\n\t\t\t? String(segment.numberValue ?? 0)\n\t\t\t: (segment.stringValue ?? \"\"),\n\t);\n}\n\nclass NativeConnAdapter {\n\t#runtime: CoreRuntime;\n\t#conn: ConnHandle;\n\t#schemas: NativeValidationConfig;\n\t#ctx?: ActorContextHandle;\n\t#queueHibernationRemoval?: (connId: string) => void;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tconn: ConnHandle,\n\t\tschemas: NativeValidationConfig = {},\n\t\tctx?: ActorContextHandle,\n\t\tqueueHibernationRemoval?: (connId: string) => void,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#conn = conn;\n\t\tthis.#schemas = schemas;\n\t\tthis.#ctx = ctx;\n\t\tthis.#queueHibernationRemoval = queueHibernationRemoval;\n\t\t(\n\t\t\tthis as NativeConnAdapter & {\n\t\t\t\t[CONN_STATE_MANAGER_SYMBOL]?: unknown;\n\t\t\t}\n\t\t)[CONN_STATE_MANAGER_SYMBOL] = {\n\t\t\tstateEnabled: true,\n\t\t\tget state() {\n\t\t\t\treturn thisConn.state;\n\t\t\t},\n\t\t};\n\t\tconst thisConn = this;\n\t}\n\n\tget id(): string {\n\t\treturn this.#runtime.connId(this.#conn);\n\t}\n\n\tget params(): unknown {\n\t\treturn validateConnParams(\n\t\t\tthis.#schemas.connParamsSchema,\n\t\t\tdecodeValue(this.#runtime.connParams(this.#conn)),\n\t\t);\n\t}\n\n\t[RAW_STATE_SYMBOL](): unknown {\n\t\treturn this.#readState();\n\t}\n\n\tget state(): unknown {\n\t\tconst nextState = this.#readState();\n\t\treturn createWriteThroughProxy(\n\t\t\tnextState,\n\t\t\t(nextValue) => {\n\t\t\t\tthis.#writeState(nextValue, { writeNative: true });\n\t\t\t},\n\t\t\t(newValue) => {\n\t\t\t\tassertJsonCompatValue(newValue);\n\t\t\t},\n\t\t);\n\t}\n\n\tset state(value: unknown) {\n\t\tassertJsonCompatValue(value);\n\t\tthis.#writeState(value, { writeNative: true });\n\t}\n\n\tinitializeState(value: unknown): void {\n\t\tthis.#writeState(value, { writeNative: false });\n\t}\n\n\tget isHibernatable(): boolean {\n\t\treturn callNativeSync(() =>\n\t\t\tthis.#runtime.connIsHibernatable(this.#conn),\n\t\t);\n\t}\n\n\tsend(name: string, ...args: unknown[]): void {\n\t\tconst validatedArgs = validateEventArgs(\n\t\t\tthis.#schemas.events,\n\t\t\tname,\n\t\t\targs,\n\t\t);\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.connSend(\n\t\t\t\tthis.#conn,\n\t\t\t\tname,\n\t\t\t\tencodeValue(validatedArgs),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync disconnect(reason?: string): Promise<void> {\n\t\tconst connId = this.id;\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.connDisconnect(this.#conn, reason),\n\t\t);\n\t\tif (this.isHibernatable) {\n\t\t\tthis.#queueHibernationRemoval?.(connId);\n\t\t}\n\t}\n\n\t#readState(): unknown {\n\t\tif (!this.#ctx) {\n\t\t\treturn decodeValue(this.#runtime.connState(this.#conn));\n\t\t}\n\n\t\tconst connState = getNativeConnPersistState(\n\t\t\tthis.#runtime,\n\t\t\tthis.#ctx,\n\t\t\tthis.#conn,\n\t\t);\n\t\tif (connState.state === undefined) {\n\t\t\tconnState.state = decodeValue(this.#runtime.connState(this.#conn));\n\t\t}\n\t\treturn connState.state;\n\t}\n\n\t#writeState(\n\t\tvalue: unknown,\n\t\toptions: {\n\t\t\twriteNative: boolean;\n\t\t},\n\t): void {\n\t\tconst encoded = encodeValue(value);\n\t\tif (!this.#ctx) {\n\t\t\tthis.#runtime.connSetState(this.#conn, encoded);\n\t\t\treturn;\n\t\t}\n\n\t\tconst connState = getNativeConnPersistState(\n\t\t\tthis.#runtime,\n\t\t\tthis.#ctx,\n\t\t\tthis.#conn,\n\t\t);\n\t\tconnState.state = value;\n\t\tif (options.writeNative) {\n\t\t\tthis.#runtime.connSetState(this.#conn, encoded);\n\t\t}\n\t}\n}\n\nclass NativeScheduleAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\n\tconstructor(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync after(\n\t\tduration: number,\n\t\taction: string,\n\t\t...args: unknown[]\n\t): Promise<void> {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorScheduleAfter(\n\t\t\t\tthis.#ctx,\n\t\t\t\tduration,\n\t\t\t\taction,\n\t\t\t\tencodeValue(args),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync at(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\t...args: unknown[]\n\t): Promise<void> {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorScheduleAt(\n\t\t\t\tthis.#ctx,\n\t\t\t\ttimestamp,\n\t\t\t\taction,\n\t\t\t\tencodeValue(args),\n\t\t\t),\n\t\t);\n\t}\n}\n\nclass NativeKvAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\n\tconstructor(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync get<T extends NativeKvValueType = \"text\">(\n\t\tkey: string | Uint8Array,\n\t\toptions?: NativeKvValueOptions<T>,\n\t): Promise<NativeKvValueTypeMap[T] | null> {\n\t\tconst value = await callNative(() =>\n\t\t\tthis.#runtime.actorKvGet(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t),\n\t\t);\n\t\treturn value\n\t\t\t? decodeNativeKvValue(new Uint8Array(value), options)\n\t\t\t: null;\n\t}\n\n\tasync put(\n\t\tkey: string | Uint8Array,\n\t\tvalue: string | Uint8Array | ArrayBuffer,\n\t\t_options?: NativeKvValueOptions,\n\t): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvPut(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t\ttoRuntimeBytes(value),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync delete(key: string | Uint8Array): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDelete(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync deleteRange(\n\t\tstart: string | Uint8Array,\n\t\tend: string | Uint8Array,\n\t): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDeleteRange(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(start)),\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(end)),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync rawDeleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDeleteRange(this.#ctx, start, end),\n\t\t);\n\t}\n\n\tasync listPrefix<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tprefix: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListPrefix(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tprefix as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\treverse: options?.reverse,\n\t\t\t\t\tlimit: options?.limit,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tdecodeNativeKvKey(\n\t\t\t\tremovePrefixFromKey(new Uint8Array(entry.key)),\n\t\t\t\toptions?.keyType,\n\t\t\t),\n\t\t\tdecodeNativeKvValue(new Uint8Array(entry.value), options),\n\t\t]);\n\t}\n\n\tasync rawListPrefix(\n\t\tprefix: Uint8Array,\n\t): Promise<Array<[Uint8Array, Uint8Array]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListPrefix(this.#ctx, prefix, {}),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tnew Uint8Array(entry.key),\n\t\t\tnew Uint8Array(entry.value),\n\t\t]);\n\t}\n\n\tasync listRange<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tstart: string | Uint8Array,\n\t\tend: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListRange(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tstart as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tend as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\treverse: options?.reverse,\n\t\t\t\t\tlimit: options?.limit,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tdecodeNativeKvKey(\n\t\t\t\tremovePrefixFromKey(new Uint8Array(entry.key)),\n\t\t\t\toptions?.keyType,\n\t\t\t),\n\t\t\tdecodeNativeKvValue(new Uint8Array(entry.value), options),\n\t\t]);\n\t}\n\n\tasync list<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tprefix: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\treturn this.listPrefix(prefix, options);\n\t}\n\n\tasync batchGet(keys: Uint8Array[]): Promise<Array<Uint8Array | null>> {\n\t\tconst values = await callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchGet(this.#ctx, keys),\n\t\t);\n\t\treturn values.map((value) => (value ? new Uint8Array(value) : null));\n\t}\n\n\tasync batchPut(entries: [Uint8Array, Uint8Array][]): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchPut(\n\t\t\t\tthis.#ctx,\n\t\t\t\tentries.map(([key, value]) => ({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue,\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync batchDelete(keys: Uint8Array[]): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchDelete(this.#ctx, keys),\n\t\t);\n\t}\n}\n\nfunction wrapQueueMessage(\n\tmessage: RuntimeQueueMessage,\n\tschemas: NativeValidationConfig[\"queues\"],\n) {\n\tconst name = callNativeSync(() => message.name());\n\treturn {\n\t\tid: Number(callNativeSync(() => message.id())),\n\t\tname,\n\t\tbody: validateQueueBody(\n\t\t\tschemas,\n\t\t\tname,\n\t\t\tdecodeValue(callNativeSync(() => message.body())),\n\t\t),\n\t\tcreatedAt: callNativeSync(() => message.createdAt()),\n\t\tcomplete: callNativeSync(() => message.isCompletable())\n\t\t\t? async (response?: unknown) =>\n\t\t\t\t\tawait callNative(() =>\n\t\t\t\t\t\tmessage.complete(\n\t\t\t\t\t\t\tresponse === undefined\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(\n\t\t\t\t\t\t\t\t\t\tvalidateQueueComplete(\n\t\t\t\t\t\t\t\t\t\t\tschemas,\n\t\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t};\n}\n\nclass NativeQueueAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig[\"queues\"];\n\t#pendingCompletableMessageIds = new Set<string>();\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tschemas: NativeValidationConfig[\"queues\"] = undefined,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#schemas = schemas;\n\t}\n\n\tasync send(name: string, body: unknown) {\n\t\tconst validatedBody = validateQueueBody(this.#schemas, name, body);\n\t\treturn wrapQueueMessage(\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueSend(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\tname,\n\t\t\t\t\tencodeValue(validatedBody),\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#schemas,\n\t\t);\n\t}\n\n\tasync next(options?: {\n\t\tnames?: readonly string[];\n\t\ttimeout?: number;\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst messages = await this.nextBatch({\n\t\t\tnames: options?.names,\n\t\t\tcount: 1,\n\t\t\ttimeout: options?.timeout,\n\t\t\tsignal: options?.signal,\n\t\t\tcompletable: options?.completable,\n\t\t});\n\t\treturn messages[0];\n\t}\n\n\tasync nextBatch(options?: {\n\t\tnames?: readonly string[];\n\t\tcount?: number;\n\t\ttimeout?: number;\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst completable = options?.completable === true;\n\t\tif (this.#pendingCompletableMessageIds.size > 0) {\n\t\t\tthrow new RivetError(\n\t\t\t\t\"queue\",\n\t\t\t\t\"previous_message_not_completed\",\n\t\t\t\t\"Previous completable queue message is not completed. Call `message.complete(...)` before receiving the next message.\",\n\t\t\t\t{\n\t\t\t\t\tpublic: true,\n\t\t\t\t\tstatusCode: 400,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tconst messages = await callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueNextBatch(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t{\n\t\t\t\t\t\tnames: this.#normalizeNames(options?.names),\n\t\t\t\t\t\tcount: options?.count,\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t\tcompletable,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst wrapped = messages.map((message) =>\n\t\t\t\twrapQueueMessage(message, this.#schemas),\n\t\t\t);\n\t\t\treturn completable\n\t\t\t\t? wrapped.map((message) =>\n\t\t\t\t\t\tthis.#makeCompletableMessage(message),\n\t\t\t\t\t)\n\t\t\t\t: wrapped;\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync waitForNames(\n\t\tnames: readonly string[],\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t\tcompletable?: boolean;\n\t\t},\n\t) {\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\treturn wrapQueueMessage(\n\t\t\t\tawait callNative(() =>\n\t\t\t\t\tthis.#runtime.actorQueueWaitForNames(\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t\t[...names],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t\t\tcompletable: options?.completable,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tthis.#schemas,\n\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync waitForNamesAvailable(\n\t\tnames: readonly string[],\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t},\n\t) {\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueWaitForNamesAvailable(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t[...names],\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync enqueueAndWait(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t},\n\t) {\n\t\tconst validatedBody = validateQueueBody(this.#schemas, name, body);\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tconst response = await callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueEnqueueAndWait(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\tname,\n\t\t\t\t\tencodeValue(validatedBody),\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn response === undefined || response === null\n\t\t\t\t? undefined\n\t\t\t\t: validateQueueComplete(\n\t\t\t\t\t\tthis.#schemas,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdecodeValue(response),\n\t\t\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync tryNext(options?: {\n\t\tnames?: readonly string[];\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst messages = await this.tryNextBatch({\n\t\t\tnames: options?.names,\n\t\t\tcount: 1,\n\t\t\tcompletable: options?.completable,\n\t\t});\n\t\treturn messages[0];\n\t}\n\n\tasync tryNextBatch(options?: {\n\t\tnames?: readonly string[];\n\t\tcount?: number;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tif (options?.completable) {\n\t\t\treturn await this.nextBatch({\n\t\t\t\tnames: options.names,\n\t\t\t\tcount: options.count,\n\t\t\t\ttimeout: 0,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.nextBatch({\n\t\t\t\tnames: options?.names,\n\t\t\t\tcount: options?.count,\n\t\t\t\ttimeout: 0,\n\t\t\t\tcompletable: false,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t(error as { group?: string; code?: string }).group ===\n\t\t\t\t\t\"queue\" &&\n\t\t\t\t(error as { group?: string; code?: string }).code ===\n\t\t\t\t\t\"timed_out\"\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync *iter(options?: {\n\t\tnames?: readonly string[];\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}): AsyncIterableIterator<\n\t\tNonNullable<Awaited<ReturnType<NativeQueueAdapter[\"next\"]>>>\n\t> {\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst message = await this.next(options);\n\t\t\t\tif (!message) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield message;\n\t\t\t} catch (error) {\n\t\t\t\tif (\n\t\t\t\t\tisRivetErrorLike(error) &&\n\t\t\t\t\terror.group === \"actor\" &&\n\t\t\t\t\terror.code === \"aborted\"\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t#normalizeNames(\n\t\tnames: readonly string[] | undefined,\n\t): string[] | undefined {\n\t\tif (!names || names.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn [...new Set(names)];\n\t}\n\n\t#makeCompletableMessage(\n\t\tmessage: Awaited<ReturnType<typeof wrapQueueMessage>>,\n\t) {\n\t\tconst messageId = message.id.toString();\n\t\tthis.#pendingCompletableMessageIds.add(messageId);\n\t\tlet completed = false;\n\n\t\treturn {\n\t\t\t...message,\n\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\tif (typeof message.complete !== \"function\") {\n\t\t\t\t\tthrow new RivetError(\n\t\t\t\t\t\t\"queue\",\n\t\t\t\t\t\t\"complete_not_configured\",\n\t\t\t\t\t\t`Queue '${message.name}' does not support completion responses.`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpublic: true,\n\t\t\t\t\t\t\tstatusCode: 400,\n\t\t\t\t\t\t\tmetadata: { name: message.name },\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (completed) {\n\t\t\t\t\tthrow new RivetError(\n\t\t\t\t\t\t\"queue\",\n\t\t\t\t\t\t\"already_completed\",\n\t\t\t\t\t\t\"Queue message was already completed.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpublic: true,\n\t\t\t\t\t\t\tstatusCode: 400,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tawait message.complete(response);\n\t\t\t\tcompleted = true;\n\t\t\t\tthis.#pendingCompletableMessageIds.delete(messageId);\n\t\t\t},\n\t\t};\n\t}\n}\n\nclass NativeWebSocketAdapter {\n\t#runtime: CoreRuntime;\n\t#ws: WebSocketHandle;\n\t#virtual: VirtualWebSocket;\n\t#readyState: 0 | 1 | 2 | 3 = VirtualWebSocket.OPEN;\n\n\tconstructor(runtime: CoreRuntime, ws: WebSocketHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ws = ws;\n\t\tthis.#virtual = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => {\n\t\t\t\tif (typeof data === \"string\") {\n\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\tthis.#runtime.webSocketSend(\n\t\t\t\t\t\t\tthis.#ws,\n\t\t\t\t\t\t\ttextEncoder.encode(data),\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst bytes = ArrayBuffer.isView(data)\n\t\t\t\t\t? arrayBufferViewToRuntimeBytes(data)\n\t\t\t\t\t: new Uint8Array(data as ArrayBufferLike);\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.webSocketSend(this.#ws, bytes, true),\n\t\t\t\t);\n\t\t\t},\n\t\t\tonClose: (code, reason) => {\n\t\t\t\tthis.#readyState = VirtualWebSocket.CLOSING;\n\t\t\t\tvoid callNative(() =>\n\t\t\t\t\tthis.#runtime.webSocketClose(this.#ws, code, reason),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t\tthis.#runtime.webSocketSetEventCallback(this.#ws, (event) => {\n\t\t\tif (event.kind === \"message\") {\n\t\t\t\tthis.#virtual.triggerMessage(\n\t\t\t\t\tevent.binary\n\t\t\t\t\t\t? runtimeBytesToArrayBuffer(event.data as RuntimeBytes)\n\t\t\t\t\t\t: event.data,\n\t\t\t\t\tevent.messageIndex,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#readyState = VirtualWebSocket.CLOSED;\n\t\t\tthis.#virtual.triggerClose(\n\t\t\t\tevent.code,\n\t\t\t\tevent.reason,\n\t\t\t\tevent.wasClean,\n\t\t\t);\n\t\t});\n\t}\n\n\tget readyState() {\n\t\treturn this.#virtual.readyState;\n\t}\n\n\tget CONNECTING() {\n\t\treturn this.#virtual.CONNECTING;\n\t}\n\n\tget OPEN() {\n\t\treturn this.#virtual.OPEN;\n\t}\n\n\tget CLOSING() {\n\t\treturn this.#virtual.CLOSING;\n\t}\n\n\tget CLOSED() {\n\t\treturn this.#virtual.CLOSED;\n\t}\n\n\tget binaryType() {\n\t\treturn this.#virtual.binaryType;\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\tthis.#virtual.binaryType = value;\n\t}\n\n\tget bufferedAmount() {\n\t\treturn this.#virtual.bufferedAmount;\n\t}\n\n\tget extensions() {\n\t\treturn this.#virtual.extensions;\n\t}\n\n\tget protocol() {\n\t\treturn this.#virtual.protocol;\n\t}\n\n\tget url() {\n\t\treturn this.#virtual.url;\n\t}\n\n\tget onopen() {\n\t\treturn this.#virtual.onopen;\n\t}\n\n\tset onopen(value) {\n\t\tthis.#virtual.onopen = value;\n\t}\n\n\tget onclose() {\n\t\treturn this.#virtual.onclose;\n\t}\n\n\tset onclose(value) {\n\t\tthis.#virtual.onclose = value;\n\t}\n\n\tget onerror() {\n\t\treturn this.#virtual.onerror;\n\t}\n\n\tset onerror(value) {\n\t\tthis.#virtual.onerror = value;\n\t}\n\n\tget onmessage() {\n\t\treturn this.#virtual.onmessage;\n\t}\n\n\tset onmessage(value) {\n\t\tthis.#virtual.onmessage = value;\n\t}\n\n\tsend(data: string | ArrayBuffer | ArrayBufferView): void {\n\t\tthis.#virtual.send(data);\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tthis.#virtual.close(code, reason);\n\t}\n\n\taddEventListener(\n\t\ttype: string,\n\t\tlistener: (event: any) => void | Promise<void>,\n\t): void {\n\t\tthis.#virtual.addEventListener(type, listener);\n\t}\n\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: (event: any) => void | Promise<void>,\n\t): void {\n\t\tthis.#virtual.removeEventListener(type, listener);\n\t}\n\n\tdispatchEvent(event: {\n\t\ttype: string;\n\t\ttarget?: unknown;\n\t\tcurrentTarget?: unknown;\n\t}): boolean {\n\t\treturn this.#virtual.dispatchEvent(event);\n\t}\n}\n\ntype TrackedWebSocketListener = (event: any) => void | Promise<void>;\n\nclass TrackedWebSocketHandleAdapter implements UniversalWebSocket {\n\t#ctx: ActorContextHandleAdapter;\n\t#inner: UniversalWebSocket;\n\t#listeners = new Map<string, TrackedWebSocketListener[]>();\n\t#onopen: ((event: RivetEvent) => void | Promise<void>) | null = null;\n\t#onclose: ((event: RivetCloseEvent) => void | Promise<void>) | null = null;\n\t#onerror: ((event: RivetEvent) => void | Promise<void>) | null = null;\n\t#onmessage: ((event: RivetMessageEvent) => void | Promise<void>) | null =\n\t\tnull;\n\n\tconstructor(ctx: ActorContextHandleAdapter, inner: UniversalWebSocket) {\n\t\tthis.#ctx = ctx;\n\t\tthis.#inner = inner;\n\n\t\tinner.addEventListener(\"open\", (event) => {\n\t\t\tthis.#dispatch(\"open\", this.#createEvent(\"open\", event));\n\t\t});\n\t\tinner.addEventListener(\"message\", (event) => {\n\t\t\tthis.#dispatch(\"message\", this.#createEvent(\"message\", event));\n\t\t});\n\t\tinner.addEventListener(\"close\", (event) => {\n\t\t\tthis.#dispatch(\"close\", this.#createEvent(\"close\", event));\n\t\t});\n\t\tinner.addEventListener(\"error\", (event) => {\n\t\t\tthis.#dispatch(\"error\", this.#createEvent(\"error\", event));\n\t\t});\n\t}\n\n\tget CONNECTING(): 0 {\n\t\treturn this.#inner.CONNECTING;\n\t}\n\n\tget OPEN(): 1 {\n\t\treturn this.#inner.OPEN;\n\t}\n\n\tget CLOSING(): 2 {\n\t\treturn this.#inner.CLOSING;\n\t}\n\n\tget CLOSED(): 3 {\n\t\treturn this.#inner.CLOSED;\n\t}\n\n\tget readyState(): 0 | 1 | 2 | 3 {\n\t\treturn this.#inner.readyState;\n\t}\n\n\tget binaryType(): \"arraybuffer\" | \"blob\" {\n\t\treturn this.#inner.binaryType;\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\tthis.#inner.binaryType = value;\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn this.#inner.bufferedAmount;\n\t}\n\n\tget extensions(): string {\n\t\treturn this.#inner.extensions;\n\t}\n\n\tget protocol(): string {\n\t\treturn this.#inner.protocol;\n\t}\n\n\tget url(): string {\n\t\treturn this.#inner.url;\n\t}\n\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n\t\tthis.#inner.send(data);\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tthis.#inner.close(code, reason);\n\t}\n\n\taddEventListener(type: string, listener: TrackedWebSocketListener): void {\n\t\tlet listeners = this.#listeners.get(type);\n\t\tif (!listeners) {\n\t\t\tlisteners = [];\n\t\t\tthis.#listeners.set(type, listeners);\n\t\t}\n\t\tlisteners.push(listener);\n\t}\n\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: TrackedWebSocketListener,\n\t): void {\n\t\tconst listeners = this.#listeners.get(type);\n\t\tif (!listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\t}\n\n\tdispatchEvent(event: RivetEvent): boolean {\n\t\tthis.#dispatch(event.type, this.#createEvent(event.type, event));\n\t\treturn true;\n\t}\n\n\tget onopen(): ((event: RivetEvent) => void | Promise<void>) | null {\n\t\treturn this.#onopen;\n\t}\n\n\tset onopen(fn: ((event: RivetEvent) => void | Promise<void>) | null) {\n\t\tthis.#onopen = fn;\n\t}\n\n\tget onclose(): ((event: RivetCloseEvent) => void | Promise<void>) | null {\n\t\treturn this.#onclose;\n\t}\n\n\tset onclose(fn: ((event: RivetCloseEvent) => void | Promise<void>) | null) {\n\t\tthis.#onclose = fn;\n\t}\n\n\tget onerror(): ((event: RivetEvent) => void | Promise<void>) | null {\n\t\treturn this.#onerror;\n\t}\n\n\tset onerror(fn: ((event: RivetEvent) => void | Promise<void>) | null) {\n\t\tthis.#onerror = fn;\n\t}\n\n\tget onmessage():\n\t\t| ((event: RivetMessageEvent) => void | Promise<void>)\n\t\t| null {\n\t\treturn this.#onmessage;\n\t}\n\n\tset onmessage(fn:\n\t\t| ((event: RivetMessageEvent) => void | Promise<void>)\n\t\t| null,) {\n\t\tthis.#onmessage = fn;\n\t}\n\n\t#createEvent(type: string, event: any): any {\n\t\tswitch (type) {\n\t\t\tcase \"message\":\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\tdata: event.data,\n\t\t\t\t\trivetMessageIndex: event.rivetMessageIndex,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t} satisfies RivetMessageEvent;\n\t\t\tcase \"close\":\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t} satisfies RivetCloseEvent;\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t\t...(event.message !== undefined\n\t\t\t\t\t\t? { message: event.message }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(event.error !== undefined\n\t\t\t\t\t\t? { error: event.error }\n\t\t\t\t\t\t: {}),\n\t\t\t\t} satisfies RivetEvent;\n\t\t}\n\t}\n\n\t#dispatch(type: string, event: any): void {\n\t\tconst listeners = this.#listeners.get(type);\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of [...listeners]) {\n\t\t\t\tthis.#callHandler(type, listener, event);\n\t\t\t}\n\t\t}\n\n\t\tswitch (type) {\n\t\t\tcase \"open\":\n\t\t\t\tif (this.#onopen) this.#callHandler(type, this.#onopen, event);\n\t\t\t\tbreak;\n\t\t\tcase \"close\":\n\t\t\t\tif (this.#onclose)\n\t\t\t\t\tthis.#callHandler(type, this.#onclose, event);\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tif (this.#onerror)\n\t\t\t\t\tthis.#callHandler(type, this.#onerror, event);\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (this.#onmessage)\n\t\t\t\t\tthis.#callHandler(type, this.#onmessage, event);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#callHandler(\n\t\ttype: string,\n\t\thandler: TrackedWebSocketListener,\n\t\tevent: any,\n\t): void {\n\t\ttry {\n\t\t\tconst result = handler(event);\n\t\t\tif (!this.#isPromiseLike(result)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst callbackRegionId = this.#ctx.beginWebSocketCallback();\n\t\t\tthis.#ctx.waitUntil(\n\t\t\t\tPromise.resolve(result)\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"async websocket handler failed\",\n\t\t\t\t\t\t\teventType: type,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.#ctx.endWebSocketCallback(callbackRegionId);\n\t\t\t\t\t})\n\t\t\t\t\t.then(() => null),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"websocket handler failed\",\n\t\t\t\teventType: type,\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\t}\n\n\t#isPromiseLike(value: unknown): value is PromiseLike<void> {\n\t\treturn (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t\"then\" in value &&\n\t\t\ttypeof value.then === \"function\"\n\t\t);\n\t}\n}\n\nclass NativeConnectionMap implements ReadonlyMap<string, NativeConnAdapter> {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tschemas: NativeValidationConfig,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#schemas = schemas;\n\t}\n\n\t#connToAdapter(conn: ConnHandle): NativeConnAdapter {\n\t\treturn new NativeConnAdapter(\n\t\t\tthis.#runtime,\n\t\t\tconn,\n\t\t\tthis.#schemas,\n\t\t\tthis.#ctx,\n\t\t\t(connId) =>\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.actorQueueHibernationRemoval(\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\t}\n\n\tget size(): number {\n\t\treturn callNativeSync(() => this.#runtime.actorConns(this.#ctx)).length;\n\t}\n\n\tget(key: string): NativeConnAdapter | undefined {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\tconst conn = conns.find((c) => this.#runtime.connId(c) === key);\n\t\tif (!conn) return undefined;\n\t\treturn this.#connToAdapter(conn);\n\t}\n\n\thas(key: string): boolean {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns.some((c) => this.#runtime.connId(c) === key);\n\t}\n\n\tkeys(): MapIterator<string> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map((c) => this.#runtime.connId(c))\n\t\t\t[Symbol.iterator]() satisfies MapIterator<string>;\n\t}\n\n\tvalues(): MapIterator<NativeConnAdapter> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map((c) => this.#connToAdapter(c))\n\t\t\t[Symbol.iterator]() satisfies MapIterator<NativeConnAdapter>;\n\t}\n\n\tentries(): MapIterator<[string, NativeConnAdapter]> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map(\n\t\t\t\t(c) =>\n\t\t\t\t\t[this.#runtime.connId(c), this.#connToAdapter(c)] as [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tNativeConnAdapter,\n\t\t\t\t\t],\n\t\t\t)\n\t\t\t[Symbol.iterator]() satisfies MapIterator<\n\t\t\t[string, NativeConnAdapter]\n\t\t>;\n\t}\n\n\tforEach(\n\t\tcallback: (\n\t\t\tvalue: NativeConnAdapter,\n\t\t\tkey: string,\n\t\t\tmap: ReadonlyMap<string, NativeConnAdapter>,\n\t\t) => void,\n\t\tthisArg?: unknown,\n\t): void {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\tfor (const conn of conns) {\n\t\t\tconst id = this.#runtime.connId(conn);\n\t\t\tcallback.call(thisArg, this.#connToAdapter(conn), id, this);\n\t\t}\n\t}\n\n\t[Symbol.iterator](): MapIterator<[string, NativeConnAdapter]> {\n\t\treturn this.entries();\n\t}\n\n\treadonly [Symbol.toStringTag] = \"NativeConnectionMap\";\n}\n\nexport class ActorContextHandleAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig;\n\t#abortSignal?: AbortSignal;\n\t#abortSignalCleanup?: () => void;\n\t#client?: AnyClient;\n\t#clientFactory?: () => AnyClient;\n\t#connMap?: NativeConnectionMap;\n\t#databaseProvider?: Exclude<AnyDatabaseProvider, undefined>;\n\t#db?: unknown;\n\t#dispatchCancelToken?: CancellationTokenHandle;\n\t#kv?: NativeKvAdapter;\n\t#queue?: NativeQueueAdapter;\n\t#request?: Request;\n\t#schedule?: NativeScheduleAdapter;\n\t#sql?: ReturnType<typeof wrapJsNativeDatabase>;\n\t#runHandlerActiveProvider?: () => boolean;\n\t#onStateChange?: NativeOnStateChangeHandler;\n\t#stateEnabled: boolean;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tclientFactory?: () => AnyClient,\n\t\tschemas: NativeValidationConfig = {},\n\t\tdatabaseProvider?: AnyDatabaseProvider,\n\t\trequest?: Request,\n\t\tstateEnabled = true,\n\t\trunHandlerActiveProvider?: () => boolean,\n\t\tonStateChange?: NativeOnStateChangeHandler,\n\t\tdispatchCancelToken?: CancellationTokenHandle,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#clientFactory = clientFactory;\n\t\tthis.#schemas = schemas;\n\t\tthis.#dispatchCancelToken = dispatchCancelToken;\n\t\tthis.#runHandlerActiveProvider = runHandlerActiveProvider;\n\t\tthis.#onStateChange = onStateChange;\n\t\tthis.#stateEnabled = stateEnabled;\n\t\tif (databaseProvider) {\n\t\t\tthis.#databaseProvider = databaseProvider;\n\t\t}\n\t\tthis.#request = request;\n\t\t(\n\t\t\tthis as ActorContextHandleAdapter & {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: unknown;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL] = new NativeWorkflowRuntimeAdapter(\n\t\t\tthis,\n\t\t);\n\t}\n\n\tget kv() {\n\t\tif (!this.#kv) {\n\t\t\tthis.#kv = new NativeKvAdapter(this.#runtime, this.#ctx);\n\t\t}\n\t\treturn this.#kv;\n\t}\n\n\tget sql() {\n\t\tif (!this.#sql) {\n\t\t\tthis.#sql = getOrCreateNativeSqlDatabase(this.#runtime, this.#ctx);\n\t\t}\n\t\treturn this.#sql;\n\t}\n\n\tget db() {\n\t\tif (!this.#databaseProvider) {\n\t\t\tthrow databaseNotConfiguredError();\n\t\t}\n\n\t\tif (this.#db) {\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tconst cachedClient = runtimeState.databaseClient;\n\t\tif (cachedClient) {\n\t\t\tthis.#db = cachedClient.client;\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tthrow databaseClientNotReadyError();\n\t}\n\n\t[RAW_STATE_SYMBOL](): unknown {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\treturn this.#readState();\n\t}\n\n\tget state(): unknown {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tconst nextState = this.#readState();\n\t\t// Reading `c.state` rebuilds the deep write-through proxy, which\n\t\t// allocates fresh on-change caches and rewraps the whole tree. Memoize\n\t\t// the proxy keyed on the underlying state object so repeated reads and\n\t\t// deep read cascades reuse a single proxy.\n\t\tif (\n\t\t\tactorState.stateProxy === undefined ||\n\t\t\tactorState.stateProxyTarget !== nextState\n\t\t) {\n\t\t\tactorState.stateProxyTarget = nextState;\n\t\t\tactorState.stateProxy = createWriteThroughProxy(\n\t\t\t\tnextState,\n\t\t\t\t(nextValue) => {\n\t\t\t\t\tthis.#writeState(nextValue, { scheduleSave: true });\n\t\t\t\t},\n\t\t\t\t(newValue) => {\n\t\t\t\t\tthis.#assertCanMutateState();\n\t\t\t\t\tassertJsonCompatValue(newValue);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn actorState.stateProxy;\n\t}\n\n\tset state(value: unknown) {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\tthis.#assertCanMutateState();\n\t\tassertJsonCompatValue(value);\n\t\tthis.#writeState(value, { scheduleSave: true });\n\t}\n\n\tinitializeState(value: unknown): void {\n\t\tif (!this.#stateEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#writeState(value, { scheduleSave: false });\n\t}\n\n\tget vars(): unknown {\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tif (runtimeState.varsInitialized) {\n\t\t\treturn runtimeState.vars;\n\t\t}\n\n\t\truntimeState.varsInitialized = true;\n\t\truntimeState.vars = undefined;\n\t\treturn undefined;\n\t}\n\n\tset vars(value: unknown) {\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\truntimeState.varsInitialized = true;\n\t\truntimeState.vars = value;\n\t}\n\n\tget queue(): NativeQueueAdapter {\n\t\tif (!this.#queue) {\n\t\t\tthis.#queue = new NativeQueueAdapter(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t\tthis.#schemas.queues,\n\t\t\t);\n\t\t}\n\t\treturn this.#queue;\n\t}\n\n\tget schedule(): NativeScheduleAdapter {\n\t\tif (!this.#schedule) {\n\t\t\tthis.#schedule = new NativeScheduleAdapter(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t);\n\t\t}\n\t\treturn this.#schedule;\n\t}\n\n\tget actorId(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorId(this.#ctx));\n\t}\n\n\tget name(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorName(this.#ctx));\n\t}\n\n\tget key(): string[] {\n\t\treturn toActorKey(\n\t\t\tcallNativeSync(() => this.#runtime.actorKey(this.#ctx)),\n\t\t);\n\t}\n\n\tget region(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorRegion(this.#ctx));\n\t}\n\n\tget conns(): ReadonlyMap<string, NativeConnAdapter> {\n\t\tif (!this.#connMap) {\n\t\t\tthis.#connMap = new NativeConnectionMap(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t\tthis.#schemas,\n\t\t\t);\n\t\t}\n\t\treturn this.#connMap;\n\t}\n\n\tget log() {\n\t\treturn logger();\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\tif (!this.#abortSignal) {\n\t\t\tconst actorSignal = this.#createActorAbortSignal();\n\t\t\tif (this.#dispatchCancelToken === undefined) {\n\t\t\t\tthis.#abortSignal = actorSignal;\n\t\t\t} else {\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tlet cleanedUp = false;\n\t\t\t\tconst onActorAbort = () => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t};\n\t\t\t\tconst cleanup = () => {\n\t\t\t\t\tif (cleanedUp) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcleanedUp = true;\n\t\t\t\t\tactorSignal.removeEventListener(\"abort\", onActorAbort);\n\t\t\t\t\tthis.#abortSignalCleanup = undefined;\n\t\t\t\t};\n\n\t\t\t\tif (\n\t\t\t\t\tactorSignal.aborted ||\n\t\t\t\t\tthis.#runtime.cancellationTokenAborted(\n\t\t\t\t\t\tthis.#dispatchCancelToken,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t} else {\n\t\t\t\t\tconst dispatchCancelToken = this.#dispatchCancelToken;\n\t\t\t\t\tthis.#abortSignalCleanup = cleanup;\n\t\t\t\t\tactorSignal.addEventListener(\"abort\", onActorAbort, {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\tthis.#runtime.onCancellationTokenCancelled(\n\t\t\t\t\t\t\tdispatchCancelToken,\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.#abortSignal = controller.signal;\n\t\t\t}\n\t\t}\n\t\treturn this.#abortSignal;\n\t}\n\n\tget aborted(): boolean {\n\t\treturn this.abortSignal.aborted;\n\t}\n\n\tget request(): Request | undefined {\n\t\treturn this.#request;\n\t}\n\n\tprivate async ensureDatabaseClient(): Promise<unknown> {\n\t\tif (!this.#databaseProvider) {\n\t\t\tthrow databaseNotConfiguredError();\n\t\t}\n\n\t\tif (this.#db) {\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tconst cachedClient = runtimeState.databaseClient;\n\t\tif (cachedClient) {\n\t\t\tthis.#db = cachedClient.client;\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst actorId = this.actorId;\n\t\tconst client = await this.#databaseProvider.createClient({\n\t\t\tactorId,\n\t\t\tkv: {\n\t\t\t\tbatchPut: async (entries) => {\n\t\t\t\t\tawait this.kv.batchPut(\n\t\t\t\t\t\tentries.map(([key, value]) => [key, value]),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tbatchGet: async (keys) => {\n\t\t\t\t\treturn await this.kv.batchGet([...keys]);\n\t\t\t\t},\n\t\t\t\tbatchDelete: async (keys) => {\n\t\t\t\t\tawait this.kv.batchDelete([...keys]);\n\t\t\t\t},\n\t\t\t\tdeleteRange: async (start, end) => {\n\t\t\t\t\tawait this.kv.deleteRange(start, end);\n\t\t\t\t},\n\t\t\t},\n\t\t\tlog: {\n\t\t\t\tdebug: (obj) => logger().debug(obj),\n\t\t\t},\n\t\t\tnativeDatabaseProvider: {\n\t\t\t\topen: async (requestedActorId) => {\n\t\t\t\t\tvoid requestedActorId;\n\t\t\t\t\treturn getOrCreateNativeSqlDatabase(\n\t\t\t\t\t\tthis.#runtime,\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\truntimeState.databaseClient = {\n\t\t\tclient,\n\t\t};\n\t\tthis.#db = client;\n\t\treturn client;\n\t}\n\n\tasync prepare(): Promise<void> {\n\t\tif (!this.#databaseProvider) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.ensureDatabaseClient();\n\t}\n\n\tasync runDatabaseMigrations(): Promise<void> {\n\t\tif (!this.#databaseProvider) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#databaseProvider.onMigrate(\n\t\t\t(await this.ensureDatabaseClient()) as never,\n\t\t);\n\t}\n\n\tasync closeDatabase(): Promise<void> {\n\t\tthis.#db = undefined;\n\t\tthis.#sql = undefined;\n\t\tawait closeNativeDatabaseClient(this.#runtime, this.#ctx);\n\t\tawait closeNativeSqlDatabase(this.#runtime, this.#ctx);\n\t}\n\n\tbroadcast(name: string, ...args: unknown[]): void {\n\t\tconst validatedArgs = validateEventArgs(\n\t\t\tthis.#schemas.events,\n\t\t\tname,\n\t\t\targs,\n\t\t);\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorBroadcast(\n\t\t\t\tthis.#ctx,\n\t\t\t\tname,\n\t\t\t\tencodeValue(validatedArgs),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync saveState(opts?: {\n\t\timmediate?: boolean;\n\t\tmaxWait?: number;\n\t}): Promise<void> {\n\t\tif (opts?.immediate) {\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorRequestSaveAndWait(this.#ctx, {\n\t\t\t\t\timmediate: true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (opts?.maxWait != null) {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorRequestSave(this.#ctx, {\n\t\t\t\t\tmaxWaitMs: opts.maxWait,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorRequestSave(this.#ctx, { immediate: false }),\n\t\t);\n\t}\n\n\tserializeForTick(reason: SerializeStateReason): RuntimeStateDeltaPayload {\n\t\tvoid reason;\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tconst connHibernationRemoved = callNativeSync(() =>\n\t\t\tthis.#runtime.actorTakePendingHibernationChanges(this.#ctx),\n\t\t);\n\t\tfor (const connId of connHibernationRemoved) {\n\t\t\tactorState.connStates.delete(connId);\n\t\t}\n\t\tconst state =\n\t\t\tthis.#stateEnabled && this.#readState() !== undefined\n\t\t\t\t? encodeValue(this.#readState())\n\t\t\t\t: undefined;\n\t\tconst connHibernation = callNativeSync(() =>\n\t\t\tthis.#runtime.actorDirtyHibernatableConns(this.#ctx),\n\t\t).map((conn) => {\n\t\t\tconst connId = callNativeSync(() => this.#runtime.connId(conn));\n\t\t\treturn {\n\t\t\t\tconnId,\n\t\t\t\tbytes: callNativeSync(() => this.#runtime.connState(conn)),\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tconnHibernation,\n\t\t\tconnHibernationRemoved,\n\t\t};\n\t}\n\n\tasync restartRunHandler(): Promise<void> {\n\t\tawait callNative(async () => {\n\t\t\tthis.#runtime.actorRestartRunHandler(this.#ctx);\n\t\t});\n\t}\n\n\tasync setAlarm(timestampMs?: number): Promise<void> {\n\t\tawait callNative(async () => {\n\t\t\tthis.#runtime.actorSetAlarm(this.#ctx, timestampMs);\n\t\t});\n\t}\n\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tconst trackedPromise = Promise.resolve(promise)\n\t\t\t.catch((error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"keepAwake promise rejected\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorKeepAwake(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t}\n\n\trunHandlerActive(): boolean {\n\t\treturn this.#runHandlerActiveProvider?.() ?? false;\n\t}\n\n\tinternalKeepAwake<T>(run: Promise<T> | (() => Promise<T>)): Promise<T> {\n\t\tconst promise = typeof run === \"function\" ? run() : run;\n\t\tconst trackedPromise = promise.then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorRegisterTask(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t}\n\n\twaitUntil(promise: Promise<unknown>): void {\n\t\tconst trackedPromise = Promise.resolve(promise).then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorWaitUntil(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\tbeginWebSocketCallback(): number {\n\t\treturn callNativeSync(() =>\n\t\t\tthis.#runtime.actorBeginWebsocketCallback(this.#ctx),\n\t\t);\n\t}\n\n\tendWebSocketCallback(callbackRegionId: number): void {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorEndWebsocketCallback(\n\t\t\t\tthis.#ctx,\n\t\t\t\tcallbackRegionId,\n\t\t\t),\n\t\t);\n\t}\n\n\t// Intentionally a no-op. `setPreventSleep` / `preventSleep` are kept on the\n\t// surface for legacy callers but must not gate sleep here. Callers that\n\t// need to keep an actor awake should use `keepAwake(promise)` or\n\t// `waitUntil(promise)` so the native counter machinery in rivetkit-core\n\t// owns the lifecycle.\n\t/** @deprecated Use `keepAwake(promise)` or `waitUntil(promise)` instead. */\n\tsetPreventSleep(_preventSleep: boolean): void {\n\t\tlogger().warn({\n\t\t\tmsg: \"setPreventSleep is deprecated and is a no-op; use keepAwake(promise) or waitUntil(promise) instead\",\n\t\t});\n\t}\n\n\t/** @deprecated Use `keepAwake(promise)` or `waitUntil(promise)` instead. */\n\tget preventSleep(): boolean {\n\t\tlogger().warn({\n\t\t\tmsg: \"preventSleep is deprecated and always returns false; use keepAwake(promise) or waitUntil(promise) instead\",\n\t\t});\n\t\treturn false;\n\t}\n\n\tsleep(): void {\n\t\tthis.#flushStateChange();\n\t\tcallNativeSync(() => this.#runtime.actorSleep(this.#ctx));\n\t}\n\n\tdestroy(): void {\n\t\t// Call the native destroy first so it can throw `actor/starting` or\n\t\t// `actor/stopping` without leaving an unresolved destroyCompletion\n\t\t// promise behind in the native runtime state.\n\t\tcallNativeSync(() => this.#runtime.actorDestroy(this.#ctx));\n\t\tmarkNativeDestroyRequested(this.#runtime, this.#ctx);\n\t}\n\n\tclient<T = AnyClient>(): T extends Registry<any> ? Client<T> : T {\n\t\tif (!this.#client) {\n\t\t\tif (!this.#clientFactory) {\n\t\t\t\tthrow nativeClientNotConfiguredError();\n\t\t\t}\n\t\t\tthis.#client = this.#clientFactory();\n\t\t}\n\n\t\treturn this.#client as T extends Registry<any> ? Client<T> : T;\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\t// Flush any save coalesced for this tick before the context is torn\n\t\t// down so the request-save and onStateChange always run.\n\t\tthis.#flushStateChange();\n\t\tthis.#abortSignalCleanup?.();\n\t\tthis.#sql = undefined;\n\t}\n\n\t#createActorAbortSignal(): AbortSignal {\n\t\tconst nativeSignal = callNativeSync(() =>\n\t\t\tthis.#runtime.actorAbortSignal(this.#ctx),\n\t\t);\n\t\tconst controller = new AbortController();\n\t\tif (nativeSignal.aborted) {\n\t\t\tcontroller.abort();\n\t\t} else {\n\t\t\tnativeSignal.addEventListener(\"abort\", () => controller.abort(), {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\t\treturn controller.signal;\n\t}\n\n\t#readState(): unknown {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.state === undefined) {\n\t\t\tactorState.state = decodeValue(\n\t\t\t\tcallNativeSync(() => this.#runtime.actorState(this.#ctx)),\n\t\t\t);\n\t\t}\n\t\treturn actorState.state;\n\t}\n\n\t#writeState(\n\t\tvalue: unknown,\n\t\toptions: {\n\t\t\tscheduleSave: boolean;\n\t\t},\n\t): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tactorState.state = value;\n\t\tif (!options.scheduleSave) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#scheduleSave();\n\t}\n\n\t#assertCanMutateState(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.isInOnStateChange) {\n\t\t\tthrow stateMutationReentrantError();\n\t\t}\n\t}\n\n\t// Coalesce the request-save and onStateChange work to once per event loop\n\t// tick. A synchronous burst of mutations (for example\n\t// `Object.assign(c.state, ...)`) would otherwise cross the NAPI boundary and\n\t// run onStateChange once per field, re-serializing the whole state each time\n\t// and pinning the event loop on large state.\n\t#scheduleSave(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.saveScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tactorState.saveScheduled = true;\n\t\tactorState.pendingSaveHandle = setImmediate(() => {\n\t\t\tthis.#flushStateChange();\n\t\t});\n\t}\n\n\t#flushStateChange(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (!actorState.saveScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tactorState.saveScheduled = false;\n\t\tif (actorState.pendingSaveHandle !== undefined) {\n\t\t\tclearImmediate(actorState.pendingSaveHandle);\n\t\t\tactorState.pendingSaveHandle = undefined;\n\t\t}\n\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorRequestSave(this.#ctx, { immediate: false }),\n\t\t);\n\n\t\tif (!this.#onStateChange) {\n\t\t\treturn;\n\t\t}\n\n\t\tactorState.isInOnStateChange = true;\n\t\tcallNativeSync(() => this.#runtime.actorBeginOnStateChange(this.#ctx));\n\t\tlet shouldFinish = true;\n\t\ttry {\n\t\t\tconst result = this.#onStateChange(\n\t\t\t\tthis,\n\t\t\t\tactorState.state,\n\t\t\t) as unknown;\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\tshouldFinish = false;\n\t\t\t\tvoid Promise.resolve(result)\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"error in `onStateChange`\",\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tactorState.isInOnStateChange = false;\n\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\tthis.#runtime.actorEndOnStateChange(this.#ctx),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t}\n\t\t} finally {\n\t\t\tif (shouldFinish) {\n\t\t\t\tactorState.isInOnStateChange = false;\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.actorEndOnStateChange(this.#ctx),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype NativeWorkflowQueueMessage = Awaited<\n\tReturnType<NativeQueueAdapter[\"next\"]>\n>;\n\nclass NativeWorkflowRuntimeAdapter {\n\t#ctx: ActorContextHandleAdapter;\n\t#completions = new Map<string, (response?: unknown) => Promise<void>>();\n\n\treadonly id: string;\n\treadonly driver: {\n\t\tkvBatchGet: (\n\t\t\tactorId: string,\n\t\t\tkeys: Uint8Array[],\n\t\t) => Promise<Array<Uint8Array | null>>;\n\t\tkvBatchPut: (\n\t\t\tactorId: string,\n\t\t\tentries: Array<[Uint8Array, Uint8Array]>,\n\t\t) => Promise<void>;\n\t\tkvBatchDelete: (actorId: string, keys: Uint8Array[]) => Promise<void>;\n\t\tkvDeleteRange: (\n\t\t\tactorId: string,\n\t\t\tstart: Uint8Array,\n\t\t\tend: Uint8Array,\n\t\t) => Promise<void>;\n\t\tkvListPrefix: (\n\t\t\tactorId: string,\n\t\t\tprefix: Uint8Array,\n\t\t) => Promise<Array<[Uint8Array, Uint8Array]>>;\n\t\tsetAlarm: (_actor: unknown, wakeAt: number) => Promise<void>;\n\t};\n\treadonly queueManager: {\n\t\tenqueue: (name: string, body: unknown) => Promise<unknown>;\n\t\treceive: (\n\t\t\tnames: string[] | undefined,\n\t\t\tcount: number,\n\t\t\ttimeout?: number,\n\t\t\t_abortSignal?: AbortSignal,\n\t\t\tcompletable?: boolean,\n\t\t) => Promise<\n\t\t\tArray<{\n\t\t\t\tid: bigint;\n\t\t\t\tname: string;\n\t\t\t\tbody: unknown;\n\t\t\t\tcreatedAt: number;\n\t\t\t\tcomplete?: (response?: unknown) => Promise<void>;\n\t\t\t}>\n\t\t>;\n\t\tcompleteMessage: (\n\t\t\tmessage: {\n\t\t\t\tid: bigint;\n\t\t\t\tcomplete?: (response?: unknown) => Promise<void>;\n\t\t\t},\n\t\t\tresponse?: unknown,\n\t\t) => Promise<void>;\n\t\tcompleteMessageById: (\n\t\t\tmessageId: bigint,\n\t\t\tresponse?: unknown,\n\t\t) => Promise<void>;\n\t\twaitForNames: (\n\t\t\tnames: readonly string[] | undefined,\n\t\t\tabortSignal?: AbortSignal,\n\t\t) => Promise<void>;\n\t};\n\treadonly stateManager: {\n\t\tsaveState: (opts?: {\n\t\t\timmediate?: boolean;\n\t\t\tmaxWait?: number;\n\t\t}) => Promise<void>;\n\t};\n\n\tconstructor(ctx: ActorContextHandleAdapter) {\n\t\tthis.#ctx = ctx;\n\t\tthis.id = ctx.actorId;\n\t\tthis.driver = {\n\t\t\tkvBatchGet: async (actorId, keys) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\treturn await this.#ctx.kv.batchGet(keys);\n\t\t\t},\n\t\t\tkvBatchPut: async (actorId, entries) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.batchPut(entries);\n\t\t\t},\n\t\t\tkvBatchDelete: async (actorId, keys) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.batchDelete(keys);\n\t\t\t},\n\t\t\tkvDeleteRange: async (actorId, start, end) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.rawDeleteRange(start, end);\n\t\t\t},\n\t\t\tkvListPrefix: async (actorId, prefix) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\treturn await this.#ctx.kv.rawListPrefix(prefix);\n\t\t\t},\n\t\t\tsetAlarm: async (_actor, wakeAt) => {\n\t\t\t\tawait this.#ctx.setAlarm(wakeAt);\n\t\t\t},\n\t\t};\n\t\tthis.queueManager = {\n\t\t\tenqueue: async (name, body) => {\n\t\t\t\treturn this.#wrapQueueMessage(\n\t\t\t\t\tawait this.#ctx.queue.send(name, body),\n\t\t\t\t);\n\t\t\t},\n\t\t\treceive: async (\n\t\t\t\tnames,\n\t\t\t\tcount,\n\t\t\t\ttimeout,\n\t\t\t\t_abortSignal,\n\t\t\t\tcompletable,\n\t\t\t) => {\n\t\t\t\tconst messages = await this.#ctx.queue.nextBatch({\n\t\t\t\t\tnames,\n\t\t\t\t\tcount,\n\t\t\t\t\ttimeout: timeout ?? 0,\n\t\t\t\t\tcompletable,\n\t\t\t\t});\n\t\t\t\treturn messages.map((message) =>\n\t\t\t\t\tthis.#wrapQueueMessage(message),\n\t\t\t\t);\n\t\t\t},\n\t\t\tcompleteMessage: async (message, response) => {\n\t\t\t\tawait message.complete?.(response);\n\t\t\t\tthis.#completions.delete(message.id.toString());\n\t\t\t},\n\t\t\tcompleteMessageById: async (messageId, response) => {\n\t\t\t\tconst complete = this.#completions.get(messageId.toString());\n\t\t\t\tif (!complete) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait complete(response);\n\t\t\t\tthis.#completions.delete(messageId.toString());\n\t\t\t},\n\t\t\twaitForNames: async (names, abortSignal) => {\n\t\t\t\tawait this.#ctx.queue.waitForNamesAvailable(names ?? [], {\n\t\t\t\t\tsignal: abortSignal,\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t\tthis.stateManager = {\n\t\t\tsaveState: async (opts) => {\n\t\t\t\tawait this.#ctx.saveState(opts);\n\t\t\t},\n\t\t};\n\t}\n\n\tisRunHandlerActive(): boolean {\n\t\treturn this.#ctx.runHandlerActive();\n\t}\n\n\tasync restartRunHandler(): Promise<void> {\n\t\tawait this.#ctx.restartRunHandler();\n\t}\n\n\t#assertActorId(actorId: string): void {\n\t\tif (actorId !== this.id) {\n\t\t\tthrow new Error(\n\t\t\t\t`workflow runtime actor id mismatch: expected ${this.id}, got ${actorId}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t#wrapQueueMessage(message: NativeWorkflowQueueMessage) {\n\t\tif (!message) {\n\t\t\tthrow new Error(\"native workflow queue message missing\");\n\t\t}\n\n\t\tconst id = BigInt(message.id);\n\t\tlet complete: ((response?: unknown) => Promise<void>) | undefined;\n\t\tif (message.complete) {\n\t\t\tcomplete = async (response?: unknown) => {\n\t\t\t\tawait message.complete?.(response);\n\t\t\t};\n\t\t\tthis.#completions.set(id.toString(), complete);\n\t\t}\n\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\tcomplete,\n\t\t};\n\t}\n}\n\nfunction withConnContext(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tconn: ConnHandle,\n\tclientFactory?: () => AnyClient,\n\tschemas: NativeValidationConfig = {},\n\tdatabaseProvider?: AnyDatabaseProvider,\n\trequest?: Request,\n\tstateEnabled = true,\n\tonStateChange?: NativeOnStateChangeHandler,\n\tdispatchCancelToken?: CancellationTokenHandle,\n) {\n\treturn Object.assign(\n\t\tnew ActorContextHandleAdapter(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tclientFactory,\n\t\t\tschemas,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\tundefined,\n\t\t\tonStateChange,\n\t\t\tdispatchCancelToken,\n\t\t),\n\t\t{\n\t\t\tconn: new NativeConnAdapter(runtime, conn, schemas, ctx, (connId) =>\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\truntime.actorQueueHibernationRemoval(ctx, connId),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t);\n}\n\nfunction buildActorConfig(\n\tdefinition: AnyActorDefinition,\n\tregistryConfig: RegistryConfig,\n): RuntimeActorConfig {\n\tconst config = definition.config as unknown as Record<string, unknown>;\n\tconst options = (config.options ?? {}) as Record<string, unknown>;\n\tconst canHibernate = options.canHibernateWebSocket;\n\n\treturn {\n\t\tname: options.name as string | undefined,\n\t\ticon: options.icon as string | undefined,\n\t\thasDatabase: config.db !== undefined,\n\t\tremoteSqlite:\n\t\t\tconfig.db !== undefined &&\n\t\t\tsqliteBackendForConfig(registryConfig) === \"remote\",\n\t\thasState:\n\t\t\tconfig.state !== undefined ||\n\t\t\ttypeof config.createState === \"function\",\n\t\tcanHibernateWebsocket:\n\t\t\ttypeof canHibernate === \"boolean\" ? canHibernate : undefined,\n\t\tstateSaveIntervalMs: options.stateSaveInterval as number | undefined,\n\t\tcreateVarsTimeoutMs: options.createVarsTimeout as number | undefined,\n\t\tcreateConnStateTimeoutMs: options.createConnStateTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tonBeforeConnectTimeoutMs: options.onBeforeConnectTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tonConnectTimeoutMs: options.onConnectTimeout as number | undefined,\n\t\tonMigrateTimeoutMs: options.onMigrateTimeout as number | undefined,\n\t\tactionTimeoutMs: options.actionTimeout as number | undefined,\n\t\tsleepTimeoutMs: options.sleepTimeout as number | undefined,\n\t\tnoSleep: options.noSleep as boolean | undefined,\n\t\tsleepGracePeriodMs: options.sleepGracePeriod as number | undefined,\n\t\tconnectionLivenessTimeoutMs: options.connectionLivenessTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tconnectionLivenessIntervalMs: options.connectionLivenessInterval as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tmaxQueueSize: options.maxQueueSize as number | undefined,\n\t\tmaxQueueMessageSize: options.maxQueueMessageSize as number | undefined,\n\t\tmaxIncomingMessageSize: registryConfig.maxIncomingMessageSize as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tmaxOutgoingMessageSize: registryConfig.maxOutgoingMessageSize as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tpreloadMaxWorkflowBytes: options.preloadMaxWorkflowBytes as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tpreloadMaxConnectionsBytes: options.preloadMaxConnectionsBytes as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tactions: Object.keys((config.actions ?? {}) as Record<string, unknown>)\n\t\t\t.sort()\n\t\t\t.map((name) => ({ name })),\n\t};\n}\n\nexport function buildNativeFactory(\n\truntime: CoreRuntime,\n\tregistryConfig: RegistryConfig,\n\tdefinition: AnyActorDefinition,\n): ActorFactoryHandle {\n\tconst config = definition.config as Record<string, any>;\n\tconst databaseProvider = config.db as AnyDatabaseProvider;\n\tconst schemaConfig: NativeValidationConfig = {\n\t\tactionInputSchemas: config.actionInputSchemas,\n\t\tconnParamsSchema: config.connParamsSchema,\n\t\tevents: config.events,\n\t\tqueues: config.queues,\n\t};\n\tconst actionHandlers = Object.fromEntries(\n\t\t(\n\t\t\tObject.entries(config.actions ?? {}) as Array<\n\t\t\t\t[string, (...args: Array<any>) => any]\n\t\t\t>\n\t\t).map(([name, handler]) => [name, handler]),\n\t);\n\tconst createClient = () =>\n\t\tcreateClientWithDriver(\n\t\t\tnew RemoteEngineControlClient(\n\t\t\t\tconvertRegistryConfigToClientConfig(registryConfig),\n\t\t\t),\n\t\t\t{ encoding: \"bare\" },\n\t\t);\n\tconst nativeRunHandlerActiveByActorId = new Map<string, boolean>();\n\tconst isNativeRunHandlerActive = (ctx: ActorContextHandle) =>\n\t\tnativeRunHandlerActiveByActorId.get(\n\t\t\tcallNativeSync(() => runtime.actorId(ctx)),\n\t\t) ?? false;\n\tconst getNativeWorkflowInspector = (ctx: ActorContextHandle) =>\n\t\tgetRunInspectorConfig(\n\t\t\tconfig.run,\n\t\t\tcallNativeSync(() => runtime.actorId(ctx)),\n\t\t)?.workflow as NativeWorkflowInspectorConfig | undefined;\n\tconst onStateChange =\n\t\ttypeof config.onStateChange === \"function\"\n\t\t\t? (actorCtx: ActorContextHandleAdapter, nextState: unknown) => {\n\t\t\t\t\tconfig.onStateChange(actorCtx, nextState);\n\t\t\t\t}\n\t\t\t: undefined;\n\tconst hasStaticState = \"state\" in config;\n\tconst hasStaticVars = \"vars\" in config;\n\tconst hasStaticConnState = Object.hasOwn(config, \"connState\");\n\tconst hasDynamicConnState = typeof config.createConnState === \"function\";\n\tconst onSleep =\n\t\ttypeof config.onSleep === \"function\" ? config.onSleep : undefined;\n\tconst needsDisconnectCallback =\n\t\ttypeof config.onDisconnect === \"function\" ||\n\t\thasStaticConnState ||\n\t\thasDynamicConnState ||\n\t\tconfig.options?.canHibernateWebSocket === true;\n\tconst stateEnabled =\n\t\tconfig.state !== undefined || typeof config.createState === \"function\";\n\tconst makeActorCtx = (\n\t\tctx: ActorContextHandle,\n\t\trequest?: Request,\n\t\tcancelToken?: CancellationTokenHandle,\n\t) =>\n\t\tnew ActorContextHandleAdapter(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tcreateClient,\n\t\t\tschemaConfig,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\t() => isNativeRunHandlerActive(ctx),\n\t\t\tonStateChange,\n\t\t\tcancelToken,\n\t\t);\n\tconst makeConnCtx = (\n\t\tctx: ActorContextHandle,\n\t\tconn: ConnHandle,\n\t\trequest?: Request,\n\t\tcancelToken?: CancellationTokenHandle,\n\t) =>\n\t\twithConnContext(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tconn,\n\t\t\tcreateClient,\n\t\t\tschemaConfig,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\tonStateChange,\n\t\t\tcancelToken,\n\t\t);\n\tconst maybeHandleNativeInspectorRequest = async (\n\t\tctx: ActorContextHandle,\n\t\t_rawRequest: {\n\t\t\tmethod: string;\n\t\t\turi: string;\n\t\t\theaders?: Record<string, string>;\n\t\t\tbody?: RuntimeBytes;\n\t\t},\n\t\tjsRequest: Request,\n\t): Promise<Response | undefined> => {\n\t\tconst url = new URL(jsRequest.url);\n\t\tif (!url.pathname.startsWith(\"/inspector/\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst jsonResponse = (body: unknown, init?: ResponseInit) =>\n\t\t\tnew Response(JSON.stringify(body), {\n\t\t\t\tstatus: init?.status ?? 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...(init?.headers ?? {}),\n\t\t\t\t},\n\t\t\t});\n\t\tconst errorResponse = (error: unknown, status?: number) => {\n\t\t\tconst rivetError = toRivetError(error);\n\t\t\treturn jsonResponse(\n\t\t\t\t{\n\t\t\t\t\tgroup: rivetError.group,\n\t\t\t\t\tcode: rivetError.code,\n\t\t\t\t\tmessage: rivetError.message,\n\t\t\t\t\tmetadata: rivetError.metadata ?? null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus:\n\t\t\t\t\t\tstatus ??\n\t\t\t\t\t\trivetError.statusCode ??\n\t\t\t\t\t\t(rivetError.public ? 400 : 500),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\ttry {\n\t\t\tawait runtime.actorVerifyInspectorAuth(\n\t\t\t\tctx,\n\t\t\t\tjsRequest.headers\n\t\t\t\t\t.get(\"authorization\")\n\t\t\t\t\t?.replace(/^Bearer\\s+/i, \"\") ?? null,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn errorResponse(error, 401);\n\t\t}\n\n\t\tconst workflowHistory = () =>\n\t\t\tserializeWorkflowHistoryForJson(\n\t\t\t\tgetNativeWorkflowInspector(ctx)?.getHistory() ?? null,\n\t\t\t);\n\t\tconst workflowState = async () =>\n\t\t\t(await getNativeWorkflowInspector(ctx)?.getState?.()) ?? null;\n\t\tconst actorCtx = makeActorCtx(ctx, jsRequest);\n\t\ttry {\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/state\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tstate: stateEnabled ? actorCtx.state : undefined,\n\t\t\t\t\tisStateEnabled: stateEnabled,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/state\" &&\n\t\t\t\tjsRequest.method === \"PATCH\"\n\t\t\t) {\n\t\t\t\tconst body = (await jsRequest.json()) as { state?: unknown };\n\t\t\t\tactorCtx.state = body.state;\n\t\t\t\tawait actorCtx.saveState({ immediate: true });\n\t\t\t\treturn jsonResponse({ ok: true });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/connections\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tconnections: Array.from(actorCtx.conns.values()).map(\n\t\t\t\t\t\t(conn) => ({\n\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\tid: conn.id,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tparams: conn.params,\n\t\t\t\t\t\t\t\tstateEnabled: true,\n\t\t\t\t\t\t\t\tstate: conn.state,\n\t\t\t\t\t\t\t\tsubscriptions: 0,\n\t\t\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/rpcs\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\trpcs: Object.keys(actionHandlers).sort(),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/queue\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst limitParam = url.searchParams.get(\"limit\");\n\t\t\t\tconst parsedLimit = limitParam ? Number(limitParam) : 100;\n\t\t\t\tconst limit =\n\t\t\t\t\tNumber.isFinite(parsedLimit) && parsedLimit > 0\n\t\t\t\t\t\t? Math.floor(parsedLimit)\n\t\t\t\t\t\t: 100;\n\t\t\t\tconst allMessages =\n\t\t\t\t\tawait runtime.actorQueueInspectMessages(ctx);\n\t\t\t\tconst truncated = allMessages.length > limit;\n\t\t\t\tconst messages = allMessages.slice(0, limit).map((m) => ({\n\t\t\t\t\tid: m.id,\n\t\t\t\t\tname: m.name,\n\t\t\t\t\tcreatedAtMs: m.createdAtMs,\n\t\t\t\t}));\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tsize: allMessages.length,\n\t\t\t\t\tmaxSize: runtime.actorQueueMaxSize(ctx),\n\t\t\t\t\ttruncated,\n\t\t\t\t\tmessages,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/traces\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({ otlp: [], clamped: false });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/workflow-history\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\thistory: workflowHistory(),\n\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/workflow/replay\" &&\n\t\t\t\tjsRequest.method === \"POST\"\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = (await jsRequest.json()) as {\n\t\t\t\t\t\tentryId?: string;\n\t\t\t\t\t};\n\t\t\t\t\tconst history = await getNativeWorkflowInspector(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t)?.replayFromStep?.(body.entryId);\n\t\t\t\t\treturn jsonResponse({\n\t\t\t\t\t\thistory: serializeWorkflowHistoryForJson(\n\t\t\t\t\t\t\thistory ?? null,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error replaying workflow history\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn errorResponse(error);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/schema\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst db = actorCtx.sql;\n\t\t\t\tconst tables = queryRows(\n\t\t\t\t\tawait db.query(\n\t\t\t\t\t\t\"SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__drizzle_%' ORDER BY name\",\n\t\t\t\t\t),\n\t\t\t\t) as Array<{ name: string; type: string }>;\n\t\t\t\tconst tableInfos = [];\n\t\t\t\tfor (const table of tables) {\n\t\t\t\t\tconst quoted = `\"${table.name.replace(/\"/g, '\"\"')}\"`;\n\t\t\t\t\tconst columns = queryRows(\n\t\t\t\t\t\tawait db.query(`PRAGMA table_info(${quoted})`),\n\t\t\t\t\t);\n\t\t\t\t\tconst foreignKeys = queryRows(\n\t\t\t\t\t\tawait db.query(`PRAGMA foreign_key_list(${quoted})`),\n\t\t\t\t\t);\n\t\t\t\t\tconst countResult = queryRows(\n\t\t\t\t\t\tawait db.query(\n\t\t\t\t\t\t\t`SELECT COUNT(*) as count FROM ${quoted}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t) as Array<{ count?: number }>;\n\t\t\t\t\ttableInfos.push({\n\t\t\t\t\t\ttable: {\n\t\t\t\t\t\t\tschema: \"main\",\n\t\t\t\t\t\t\tname: table.name,\n\t\t\t\t\t\t\ttype: table.type,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcolumns: jsonSafe(columns),\n\t\t\t\t\t\tforeignKeys: jsonSafe(foreignKeys),\n\t\t\t\t\t\trecords: countResult[0]?.count ?? 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn jsonResponse({ schema: { tables: tableInfos } });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/rows\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst table = url.searchParams.get(\"table\");\n\t\t\t\tif (!table) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"Missing required table query parameter\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst limit = Number.parseInt(\n\t\t\t\t\turl.searchParams.get(\"limit\") ?? \"100\",\n\t\t\t\t\t10,\n\t\t\t\t);\n\t\t\t\tconst offset = Number.parseInt(\n\t\t\t\t\turl.searchParams.get(\"offset\") ?? \"0\",\n\t\t\t\t\t10,\n\t\t\t\t);\n\t\t\t\tconst quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n\t\t\t\tconst rows = queryRows(\n\t\t\t\t\tawait actorCtx.sql.query(\n\t\t\t\t\t\t`SELECT * FROM ${quoted} LIMIT ? OFFSET ?`,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tMath.max(0, Math.min(limit, 500)),\n\t\t\t\t\t\t\tMath.max(0, offset),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/execute\" &&\n\t\t\t\tjsRequest.method === \"POST\"\n\t\t\t) {\n\t\t\t\tconst body = (await jsRequest.json()) as {\n\t\t\t\t\tsql?: unknown;\n\t\t\t\t\targs?: unknown;\n\t\t\t\t\tproperties?: unknown;\n\t\t\t\t};\n\t\t\t\tif (typeof body.sql !== \"string\" || body.sql.trim() === \"\") {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"sql is required\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tArray.isArray(body.args) &&\n\t\t\t\t\tbody.properties &&\n\t\t\t\t\ttypeof body.properties === \"object\"\n\t\t\t\t) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"use either args or properties, not both\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tbody.properties &&\n\t\t\t\t\ttypeof body.properties === \"object\" &&\n\t\t\t\t\t!Array.isArray(body.properties)\n\t\t\t\t) {\n\t\t\t\t\tconst bindings = normalizeSqlitePropertyBindings(\n\t\t\t\t\t\tbody.properties as Record<string, unknown>,\n\t\t\t\t\t);\n\t\t\t\t\tconst rows = queryRows(\n\t\t\t\t\t\tawait actorCtx.sql.query(body.sql, bindings),\n\t\t\t\t\t);\n\t\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t\t}\n\t\t\t\tconst args = Array.isArray(body.args) ? body.args : [];\n\t\t\t\tconst rows = queryRows(\n\t\t\t\t\tawait actorCtx.sql.query(body.sql, args),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/summary\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst inspectorSnapshot = callNativeSync(() =>\n\t\t\t\t\truntime.actorInspectorSnapshot(ctx),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tstate: stateEnabled ? actorCtx.state : undefined,\n\t\t\t\t\tconnections: Array.from(actorCtx.conns.values()).map(\n\t\t\t\t\t\t(conn) => ({\n\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\tid: conn.id,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tparams: conn.params,\n\t\t\t\t\t\t\t\tstateEnabled: true,\n\t\t\t\t\t\t\t\tstate: conn.state,\n\t\t\t\t\t\t\t\tsubscriptions: 0,\n\t\t\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\trpcs: Object.keys(actionHandlers).sort(),\n\t\t\t\t\tqueueSize: inspectorSnapshot.queueSize,\n\t\t\t\t\tisStateEnabled: stateEnabled,\n\t\t\t\t\tisDatabaseEnabled: databaseProvider !== undefined,\n\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\tworkflowHistory: workflowHistory(),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\tjsRequest.method === \"POST\" &&\n\t\t\t\turl.pathname.startsWith(\"/inspector/action/\")\n\t\t\t) {\n\t\t\t\tconst actionName = url.pathname.replace(\n\t\t\t\t\t\"/inspector/action/\",\n\t\t\t\t\t\"\",\n\t\t\t\t);\n\t\t\t\tconst action = actionHandlers[actionName];\n\t\t\t\tif (!action) {\n\t\t\t\t\treturn errorResponse(\n\t\t\t\t\t\tnew RivetError(\n\t\t\t\t\t\t\t\"action\",\n\t\t\t\t\t\t\t\"action_not_found\",\n\t\t\t\t\t\t\t`Action ${actionName} not found`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t404,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst body = (await jsRequest.json()) as { args?: unknown[] };\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await action(\n\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t...validateActionArgs(\n\t\t\t\t\t\t\tschemaConfig.actionInputSchemas,\n\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\tbody.args ?? [],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn jsonResponse({ output });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"Error handling inspector action request\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn errorResponse(error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn jsonResponse(\n\t\t\t\t{\n\t\t\t\t\tgroup: \"actor\",\n\t\t\t\t\tcode: \"not_found\",\n\t\t\t\t\tmessage: \"Inspector route was not found\",\n\t\t\t\t\tmetadata: null,\n\t\t\t\t},\n\t\t\t\t{ status: 404 },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"Error handling inspector request\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\treturn errorResponse(error);\n\t\t} finally {\n\t\t\tawait actorCtx.dispose();\n\t\t}\n\t};\n\tconst callbacks = {\n\t\tcreateState:\n\t\t\thasStaticState || typeof config.createState === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tinput?: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<RuntimeBytes> => {\n\t\t\t\t\t\t\tconst { ctx, input } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst decodedInput = decodeValue(input);\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tconst state = hasStaticState\n\t\t\t\t\t\t\t\t\t? structuredClone(config.state)\n\t\t\t\t\t\t\t\t\t: await config.createState(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tdecodedInput,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: createStateMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tactorCtx.initializeState(state);\n\t\t\t\t\t\t\t\treturn encodeValue(state);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonCreate:\n\t\t\ttypeof config.onCreate === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tinput?: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\t\tconst { ctx, input } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onCreate(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tdecodeValue(input),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tcreateVars:\n\t\t\thasStaticVars || typeof config.createVars === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tconst vars = hasStaticVars\n\t\t\t\t\t\t\t\t\t? structuredClone(config.vars)\n\t\t\t\t\t\t\t\t\t: await config.createVars(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: createVarsMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tactorCtx.vars = vars;\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonMigrate:\n\t\t\ttypeof config.onMigrate === \"function\" ||\n\t\t\tdatabaseProvider !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tisNew: boolean;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, isNew } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (!isNew) {\n\t\t\t\t\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait actorCtx.runDatabaseMigrations();\n\t\t\t\t\t\t\t\tif (typeof config.onMigrate === \"function\") {\n\t\t\t\t\t\t\t\t\tawait config.onMigrate(actorCtx, isNew);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonWake:\n\t\t\ttypeof config.onWake === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tawait config.onWake(actorCtx);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: onWakeMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonBeforeActorStart:\n\t\t\ttypeof config.onBeforeActorStart === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onBeforeActorStart(actorCtx);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonSleep: wrapNativeCallback(\n\t\t\tasync (error: unknown, payload: { ctx: ActorContextHandle }) => {\n\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t// TODO: Move this save hook into cleanupNativeSleepRuntimeState\n\t\t\t\t// so immediate and deferred sleep cleanup share one save-state\n\t\t\t\t// path instead of passing a callback through cleanup.\n\t\t\t\tconst saveActorState = async () => {\n\t\t\t\t\tif (runtime.kind === \"wasm\") {\n\t\t\t\t\t\t// Wasm cannot use the native context save helper here because\n\t\t\t\t\t\t// the runtime owns the serialized state handoff.\n\t\t\t\t\t\tawait runtime.actorSaveState(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tactorCtx.serializeForTick(\"save\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait actorCtx.saveState({\n\t\t\t\t\t\t\timmediate: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tif (onSleep) {\n\t\t\t\t\t\tawait onSleep(actorCtx);\n\t\t\t\t\t}\n\t\t\t\t\tawait saveActorState();\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cleanupNativeSleepRuntimeState(\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tsaveActorState,\n\t\t\t\t\t\t);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonDestroy: wrapNativeCallback(\n\t\t\tasync (error: unknown, payload: { ctx: ActorContextHandle }) => {\n\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof config.onDestroy === \"function\") {\n\t\t\t\t\t\tawait config.onDestroy(actorCtx);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tresolveNativeDestroy(runtime, ctx);\n\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\tclearNativeRuntimeState(runtime, ctx);\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonBeforeConnect:\n\t\t\ttypeof config.onBeforeConnect === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tparams: RuntimeBytes;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, params, request } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onBeforeConnect(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tvalidateConnParams(\n\t\t\t\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\t\t\t\tdecodeValue(params),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tcreateConnState:\n\t\t\thasStaticConnState || hasDynamicConnState\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\tparams: RuntimeBytes;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<RuntimeBytes> => {\n\t\t\t\t\t\t\tconst { ctx, conn, params, request } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst connAdapter = new NativeConnAdapter(\n\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst nextConnState = hasStaticConnState\n\t\t\t\t\t\t\t\t\t? structuredClone(config.connState)\n\t\t\t\t\t\t\t\t\t: await config.createConnState(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tvalidateConnParams(\n\t\t\t\t\t\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\t\t\t\t\t\tdecodeValue(params),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconnAdapter.initializeState(nextConnState);\n\t\t\t\t\t\t\t\treturn encodeValue(nextConnState);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonConnect:\n\t\t\ttypeof config.onConnect === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, request } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst connAdapter = new NativeConnAdapter(\n\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onConnect(\n\t\t\t\t\t\t\t\t\tObject.assign(actorCtx, {\n\t\t\t\t\t\t\t\t\t\tconn: connAdapter,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tconnAdapter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonDisconnectFinal: needsDisconnectCallback\n\t\t\t? wrapNativeCallback(\n\t\t\t\t\tasync (\n\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst { ctx, conn } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Core already removed the connection; this hook is\n\t\t\t\t\t\t\t// pure user dispatch.\n\t\t\t\t\t\t\tif (typeof config.onDisconnect === \"function\") {\n\t\t\t\t\t\t\t\tawait config.onDisconnect(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tnew NativeConnAdapter(\n\t\t\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t: undefined,\n\t\tonBeforeSubscribe:\n\t\t\tschemaConfig.events &&\n\t\t\tObject.values(schemaConfig.events).some(\n\t\t\t\t(schema) =>\n\t\t\t\t\ttypeof (schema as { canSubscribe?: unknown })\n\t\t\t\t\t\t.canSubscribe === \"function\",\n\t\t\t)\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\teventName: string;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, eventName } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst canSubscribe = getEventCanSubscribe(\n\t\t\t\t\t\t\t\t\tschemaConfig.events,\n\t\t\t\t\t\t\t\t\teventName,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!canSubscribe) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst result = await canSubscribe(actorCtx);\n\t\t\t\t\t\t\t\tif (typeof result !== \"boolean\") {\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\"canSubscribe must return a boolean\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\t\t\tthrow forbiddenError();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonBeforeActionResponse:\n\t\t\ttypeof config.onBeforeActionResponse === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\targs: RuntimeBytes;\n\t\t\t\t\t\t\t\toutput: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, name, args, output } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn encodeValue(\n\t\t\t\t\t\t\t\t\tawait config.onBeforeActionResponse(\n\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tdecodeArgs(args),\n\t\t\t\t\t\t\t\t\t\tdecodeValue(output),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonRequest: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\turi: string;\n\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t};\n\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { ctx, request, cancelToken } = unwrapTsfnPayload(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t);\n\t\t\t\t\tconst jsRequest = buildRequest(request);\n\t\t\t\t\tconst inspectorResponse =\n\t\t\t\t\t\tawait maybeHandleNativeInspectorRequest(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (inspectorResponse) {\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(inspectorResponse);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof config.onRequest !== \"function\") {\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(\n\t\t\t\t\t\t\tnew Response(null, { status: 404 }),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rawConnParams =\n\t\t\t\t\t\tjsRequest.headers.get(HEADER_CONN_PARAMS);\n\t\t\t\t\tlet requestCtx:\n\t\t\t\t\t\t| ReturnType<typeof withConnContext>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tlet conn: ConnHandle | undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst connParams = validateConnParams(\n\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\trawConnParams\n\t\t\t\t\t\t\t\t? JSON.parse(rawConnParams)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconn = await callNative(() =>\n\t\t\t\t\t\t\truntime.actorConnectConn(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tencodeValue(connParams),\n\t\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\trequestCtx = makeConnCtx(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t\tcancelToken,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst response = await config.onRequest(\n\t\t\t\t\t\t\trequestCtx,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!(response instanceof Response)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"onRequest handler must return a Response\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(response);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait requestCtx?.dispose();\n\t\t\t\t\t\tif (conn) {\n\t\t\t\t\t\t\tawait runtime.connDisconnect(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"native onRequest failed\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonWebSocket:\n\t\t\ttypeof config.onWebSocket === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\tws: WebSocketHandle;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, ws, request } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst jsRequest = request\n\t\t\t\t\t\t\t\t? buildRequest(request)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn, jsRequest);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onWebSocket(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tnew TrackedWebSocketHandleAdapter(\n\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\tnew NativeWebSocketAdapter(runtime, ws),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\trun: (() => {\n\t\t\tconst run = getRunFunction(config.run);\n\t\t\tif (!run) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn wrapNativeCallback(\n\t\t\t\tasync (\n\t\t\t\t\terror: unknown,\n\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t) => {\n\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\tconst actorId = callNativeSync(() => runtime.actorId(ctx));\n\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\tnativeRunHandlerActiveByActorId.set(actorId, true);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait run(actorCtx);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tnativeRunHandlerActiveByActorId.set(actorId, false);\n\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t})(),\n\t\tgetWorkflowHistory:\n\t\t\tgetRunInspectorConfig(config.run) !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst history =\n\t\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx)?.getHistory();\n\t\t\t\t\t\t\treturn history == null\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(history);\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\treplayWorkflow:\n\t\t\tgetRunInspectorConfig(config.run) !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tentryId?: string;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, entryId } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst workflowInspector =\n\t\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx);\n\t\t\t\t\t\t\tif (!workflowInspector?.replayFromStep) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst history =\n\t\t\t\t\t\t\t\t(await workflowInspector.replayFromStep(\n\t\t\t\t\t\t\t\t\tentryId,\n\t\t\t\t\t\t\t\t)) ?? null;\n\t\t\t\t\t\t\treturn history == null\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(history);\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tactions: Object.fromEntries(\n\t\t\tObject.entries(actionHandlers).map(([name, handler]) => [\n\t\t\t\tname,\n\t\t\t\twrapNativeCallback(\n\t\t\t\t\tasync (\n\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\tconn: ConnHandle | null;\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\targs: RuntimeBytes;\n\t\t\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst { ctx, conn, args, cancelToken } =\n\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\tconst actorCtx =\n\t\t\t\t\t\t\tconn != null\n\t\t\t\t\t\t\t\t? makeConnCtx(ctx, conn, undefined, cancelToken)\n\t\t\t\t\t\t\t\t: makeActorCtx(ctx, undefined, cancelToken);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn encodeValue(\n\t\t\t\t\t\t\t\tawait handler(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t...validateActionArgs(\n\t\t\t\t\t\t\t\t\t\tschemaConfig.actionInputSchemas,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tdecodeArgs(args),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t]),\n\t\t),\n\t\tonQueueSend: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\turi: string;\n\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t};\n\t\t\t\t\tname: string;\n\t\t\t\t\tbody: RuntimeBytes;\n\t\t\t\t\twait: boolean;\n\t\t\t\t\ttimeoutMs?: bigint | number;\n\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\tconst {\n\t\t\t\t\tctx,\n\t\t\t\t\tconn,\n\t\t\t\t\trequest,\n\t\t\t\t\tname,\n\t\t\t\t\tbody,\n\t\t\t\t\twait,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tcancelToken,\n\t\t\t\t} = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst jsRequest = buildRequest(request);\n\t\t\t\tconst actorCtx = withConnContext(\n\t\t\t\t\truntime,\n\t\t\t\t\tctx,\n\t\t\t\t\tconn,\n\t\t\t\t\tcreateClient,\n\t\t\t\t\tschemaConfig,\n\t\t\t\t\tdatabaseProvider,\n\t\t\t\t\tjsRequest,\n\t\t\t\t\tstateEnabled,\n\t\t\t\t\tonStateChange,\n\t\t\t\t\tcancelToken,\n\t\t\t\t);\n\t\t\t\ttry {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!schemaConfig.queues ||\n\t\t\t\t\t\t!hasSchemaConfigKey(schemaConfig.queues, name)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn { status: \"completed\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tconst canPublish = getQueueCanPublish(\n\t\t\t\t\t\tschemaConfig.queues,\n\t\t\t\t\t\tname,\n\t\t\t\t\t);\n\t\t\t\t\tif (canPublish && !(await canPublish(actorCtx))) {\n\t\t\t\t\t\tthrow forbiddenError();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst decodedBody = decodeValue(body);\n\t\t\t\t\tif (wait) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\tawait actorCtx.queue.enqueueAndWait(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdecodedBody,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttimeout:\n\t\t\t\t\t\t\t\t\t\t\ttimeoutMs === undefined ||\n\t\t\t\t\t\t\t\t\t\t\ttimeoutMs === null\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t: Number(timeoutMs),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\t\tresponse:\n\t\t\t\t\t\t\t\t\tresponse === undefined\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: encodeValue(response),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(error as { group?: string; code?: string })\n\t\t\t\t\t\t\t\t\t.group === \"queue\" &&\n\t\t\t\t\t\t\t\t(error as { group?: string; code?: string })\n\t\t\t\t\t\t\t\t\t.code === \"timed_out\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn { status: \"timedOut\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tawait actorCtx.queue.send(name, decodedBody);\n\t\t\t\t\treturn { status: \"completed\" };\n\t\t\t\t} finally {\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tserializeState: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\treason: SerializeStateReason;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\tconst { ctx, reason } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\ttry {\n\t\t\t\t\treturn actorCtx.serializeForTick(reason);\n\t\t\t\t} finally {\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t};\n\n\treturn runtime.createActorFactory(\n\t\tcallbacks,\n\t\tbuildActorConfig(definition, registryConfig),\n\t);\n}\n\nexport async function buildServeConfig(\n\tconfig: RegistryConfig,\n): Promise<RuntimeServeConfig> {\n\tif (!config.endpoint) {\n\t\tthrow nativeEndpointNotConfiguredError();\n\t}\n\n\tconst serveConfig: RuntimeServeConfig = {\n\t\tversion: config.envoy.version,\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\tpoolName: config.envoy.poolName,\n\t\thandleInspectorHttpInRuntime: true,\n\t\tserverlessBasePath: config.serverless.basePath,\n\t\tserverlessPackageVersion: VERSION,\n\t\tserverlessClientEndpoint: config.publicEndpoint,\n\t\tserverlessClientNamespace: config.publicNamespace,\n\t\tserverlessClientToken: config.publicToken,\n\t\tserverlessValidateEndpoint: config.validateServerlessEndpoint,\n\t\tserverlessMaxStartPayloadBytes: config.serverless.maxStartPayloadBytes,\n\t};\n\n\tif (config.startEngine) {\n\t\tconst { getEnginePath } = await loadEngineCli();\n\t\tserveConfig.engineBinaryPath = getEnginePath();\n\t}\n\tif (config.test?.enabled) {\n\t\tserveConfig.inspectorTestToken =\n\t\t\tgetEnvUniversal(\"_RIVET_TEST_INSPECTOR_TOKEN\") ?? \"token\";\n\t}\n\n\treturn serveConfig;\n}\n\nexport async function buildRegistryWithRuntime(\n\tconfig: RegistryConfig,\n\truntime: CoreRuntime,\n): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tif (\n\t\tconfig.test?.enabled &&\n\t\tgetEnvUniversal(\"_RIVET_TEST_INSPECTOR_TOKEN\") === undefined\n\t) {\n\t\ttrySetProcessEnv(\"_RIVET_TEST_INSPECTOR_TOKEN\", \"token\");\n\t}\n\n\tconst registry = runtime.createRegistry();\n\n\tfor (const [name, definition] of Object.entries(config.use)) {\n\t\truntime.registerActor(\n\t\t\tregistry,\n\t\t\tname,\n\t\t\tbuildNativeFactory(runtime, config, definition),\n\t\t);\n\t}\n\n\treturn {\n\t\truntime,\n\t\tregistry,\n\t\tserveConfig: await buildServeConfig(config),\n\t};\n}\n\nexport async function buildNativeRegistry(config: RegistryConfig): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tconst { runtime } = await loadNapiRuntime();\n\treturn buildRegistryWithRuntime(\n\t\tnormalizeRuntimeConfigForKind(config, \"native\"),\n\t\truntime,\n\t);\n}\n\nexport async function buildConfiguredRegistry(config: RegistryConfig): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tconst runtime = await loadConfiguredRuntime(config);\n\treturn buildRegistryWithRuntime(\n\t\tnormalizeRuntimeConfig(config, runtime),\n\t\truntime,\n\t);\n}\n","import { decodeBridgeRivetError } from \"@/actor/errors\";\nimport type {\n\tSqliteBindings,\n\tSqliteDatabase,\n\tSqliteExecuteResult,\n\tSqliteNativeMetrics,\n} from \"./config\";\n\ntype NativeBindNoValues = {\n\tintValue?: never;\n\tfloatValue?: never;\n\ttextValue?: never;\n\tblobValue?: never;\n};\n\ntype NativeBindParam =\n\t| ({ kind: \"null\" } & NativeBindNoValues)\n\t| {\n\t\t\tkind: \"int\";\n\t\t\tintValue: number;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"float\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue: number;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"text\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue: string;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"blob\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue: Buffer;\n\t };\n\ninterface NativeExecResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\ninterface NativeQueryResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\ninterface NativeRunResult {\n\tchanges: number;\n}\n\ninterface NativeExecuteResult {\n\tcolumns: string[];\n\trows: unknown[][];\n\tchanges: number;\n\tlastInsertRowId?: number | null;\n}\n\nexport interface JsNativeDatabaseLike {\n\texec(sql: string): Promise<NativeExecResult>;\n\texecute(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeExecuteResult>;\n\tquery(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeQueryResult>;\n\trun(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeRunResult>;\n\tmetrics?(): SqliteNativeMetrics | null;\n\ttakeLastKvError?(): string | null;\n\tclose(): Promise<void>;\n}\n\nfunction shouldAttachNativeKvError(message: string): boolean {\n\treturn /i\\/o error|unable to open database file/i.test(message);\n}\n\nfunction enrichNativeDatabaseError(\n\tdatabase: JsNativeDatabaseLike,\n\terror: unknown,\n): never {\n\tconst bridgeReason =\n\t\ttypeof error === \"string\"\n\t\t\t? error\n\t\t\t: error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: undefined;\n\tconst bridged =\n\t\tbridgeReason === undefined\n\t\t\t? undefined\n\t\t\t: decodeBridgeRivetError(bridgeReason);\n\tif (bridged) {\n\t\tthrow bridged;\n\t}\n\n\tconst kvError = database.takeLastKvError?.();\n\tif (\n\t\terror instanceof Error &&\n\t\tkvError &&\n\t\tshouldAttachNativeKvError(error.message) &&\n\t\t!error.message.includes(kvError)\n\t) {\n\t\terror.message = `${error.message} (native sqlite kv error: ${kvError})`;\n\t}\n\tthrow error;\n}\n\nfunction toNativeBinding(arg: unknown): NativeBindParam {\n\tif (arg === null || arg === undefined) {\n\t\treturn { kind: \"null\" };\n\t}\n\tif (typeof arg === \"bigint\") {\n\t\treturn { kind: \"int\", intValue: Number(arg) };\n\t}\n\tif (typeof arg === \"number\") {\n\t\tif (Number.isInteger(arg)) {\n\t\t\treturn { kind: \"int\", intValue: arg };\n\t\t}\n\t\treturn { kind: \"float\", floatValue: arg };\n\t}\n\tif (typeof arg === \"string\") {\n\t\treturn { kind: \"text\", textValue: arg };\n\t}\n\tif (typeof arg === \"boolean\") {\n\t\treturn { kind: \"int\", intValue: arg ? 1 : 0 };\n\t}\n\tif (arg instanceof Uint8Array) {\n\t\treturn { kind: \"blob\", blobValue: Buffer.from(arg) };\n\t}\n\tthrow new Error(`unsupported bind parameter type: ${typeof arg}`);\n}\n\nfunction extractNamedSqliteParameters(sql: string): string[] {\n\tconst orderedNames: string[] = [];\n\tconst seen = new Set<string>();\n\tconst pattern = /([:@$][A-Za-z_][A-Za-z0-9_]*)/g;\n\tfor (const match of sql.matchAll(pattern)) {\n\t\tconst name = match[1];\n\t\tif (seen.has(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(name);\n\t\torderedNames.push(name);\n\t}\n\treturn orderedNames;\n}\n\nfunction getNamedSqliteBinding(\n\tbindings: Record<string, unknown>,\n\tname: string,\n): unknown {\n\tif (name in bindings) {\n\t\treturn bindings[name];\n\t}\n\n\tconst bareName = name.slice(1);\n\tif (bareName in bindings) {\n\t\treturn bindings[bareName];\n\t}\n\n\tfor (const prefix of [\":\", \"@\", \"$\"] as const) {\n\t\tconst candidate = `${prefix}${bareName}`;\n\t\tif (candidate in bindings) {\n\t\t\treturn bindings[candidate];\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction toNativeBindings(\n\tsql: string,\n\tparams?: SqliteBindings,\n): NativeBindParam[] | null {\n\tif (params === undefined) {\n\t\treturn null;\n\t}\n\n\tif (Array.isArray(params)) {\n\t\treturn params.map((arg) => toNativeBinding(arg));\n\t}\n\n\tconst orderedNames = extractNamedSqliteParameters(sql);\n\tif (orderedNames.length === 0) {\n\t\treturn Object.values(params).map((arg) => toNativeBinding(arg));\n\t}\n\n\treturn orderedNames.map((name) => {\n\t\tconst value = getNamedSqliteBinding(params, name);\n\t\tif (value === undefined) {\n\t\t\tthrow new Error(`missing bind parameter: ${name}`);\n\t\t}\n\t\treturn toNativeBinding(value);\n\t});\n}\n\nfunction normalizeNativeMetrics(\n\tmetrics: SqliteNativeMetrics | null | undefined,\n): SqliteNativeMetrics | null {\n\tif (!metrics) return null;\n\tconst raw = metrics as unknown as Record<string, unknown>;\n\tconst numberField = (camel: string, snake: string) =>\n\t\tNumber(raw[camel] ?? raw[snake] ?? 0);\n\n\treturn {\n\t\trequestBuildNs: numberField(\"requestBuildNs\", \"request_build_ns\"),\n\t\tserializeNs: numberField(\"serializeNs\", \"serialize_ns\"),\n\t\ttransportNs: numberField(\"transportNs\", \"transport_ns\"),\n\t\tstateUpdateNs: numberField(\"stateUpdateNs\", \"state_update_ns\"),\n\t\ttotalNs: numberField(\"totalNs\", \"total_ns\"),\n\t\tcommitCount: numberField(\"commitCount\", \"commit_count\"),\n\t\tpageCacheEntries: numberField(\"pageCacheEntries\", \"page_cache_entries\"),\n\t\tpageCacheWeightedSize: numberField(\n\t\t\t\"pageCacheWeightedSize\",\n\t\t\t\"page_cache_weighted_size\",\n\t\t),\n\t\tpageCacheCapacityPages: numberField(\n\t\t\t\"pageCacheCapacityPages\",\n\t\t\t\"page_cache_capacity_pages\",\n\t\t),\n\t\twriteBufferDirtyPages: numberField(\n\t\t\t\"writeBufferDirtyPages\",\n\t\t\t\"write_buffer_dirty_pages\",\n\t\t),\n\t\tdbSizePages: numberField(\"dbSizePages\", \"db_size_pages\"),\n\t};\n}\n\nclass NativeCloseGate {\n\t#active = 0;\n\t#closed = false;\n\t#waiters: (() => void)[] = [];\n\n\tenter(): () => void {\n\t\tif (this.#closed) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t);\n\t\t}\n\n\t\tthis.#active++;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tthis.#active--;\n\t\t\tif (this.#active === 0) {\n\t\t\t\tconst waiters = this.#waiters.splice(0);\n\t\t\t\tfor (const waiter of waiters) {\n\t\t\t\t\twaiter();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tasync close(callback: () => Promise<void>): Promise<void> {\n\t\tif (this.#closed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#closed = true;\n\t\tif (this.#active > 0) {\n\t\t\tawait new Promise<void>((resolve) => this.#waiters.push(resolve));\n\t\t}\n\t\tawait callback();\n\t}\n}\n\nexport function wrapJsNativeDatabase(\n\tdatabase: JsNativeDatabaseLike,\n): SqliteDatabase {\n\tconst gate = new NativeCloseGate();\n\tlet closePromise: Promise<void> | undefined;\n\tlet lastInsertRowId: number | null = null;\n\n\tconst executeNative = async (\n\t\tsql: string,\n\t\tparams?: SqliteBindings,\n\t): Promise<SqliteExecuteResult> => {\n\t\tconst lastInsertRowIdColumn = lastInsertRowIdColumnName(sql);\n\t\tif (lastInsertRowIdColumn) {\n\t\t\treturn {\n\t\t\t\tcolumns: [lastInsertRowIdColumn],\n\t\t\t\trows: [[lastInsertRowId ?? 0]],\n\t\t\t\tchanges: 0,\n\t\t\t\tlastInsertRowId,\n\t\t\t};\n\t\t}\n\n\t\tconst release = gate.enter();\n\t\ttry {\n\t\t\tconst nativeParams = toNativeBindings(sql, params);\n\t\t\tconst result = await database.execute(sql, nativeParams);\n\t\t\tif (result.lastInsertRowId !== undefined) {\n\t\t\t\tlastInsertRowId = result.lastInsertRowId;\n\t\t\t}\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tenrichNativeDatabaseError(database, error);\n\t\t} finally {\n\t\t\trelease();\n\t\t}\n\t};\n\n\treturn {\n\t\tasync exec(\n\t\t\tsql: string,\n\t\t\tcallback?: (row: unknown[], columns: string[]) => void,\n\t\t): Promise<void> {\n\t\t\tconst release = gate.enter();\n\t\t\tlet result: NativeExecResult;\n\t\t\ttry {\n\t\t\t\tresult = await database.exec(sql);\n\t\t\t} catch (error) {\n\t\t\t\tenrichNativeDatabaseError(database, error);\n\t\t\t} finally {\n\t\t\t\trelease();\n\t\t\t}\n\t\t\tif (!callback) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const row of result.rows) {\n\t\t\t\tcallback(row, result.columns);\n\t\t\t}\n\t\t},\n\t\tasync execute(\n\t\t\tsql: string,\n\t\t\tparams?: SqliteBindings,\n\t\t): Promise<SqliteExecuteResult> {\n\t\t\treturn await executeNative(sql, params);\n\t\t},\n\t\tasync run(sql: string, params?: SqliteBindings): Promise<void> {\n\t\t\tawait executeNative(sql, params);\n\t\t},\n\t\tasync query(sql: string, params?: SqliteBindings) {\n\t\t\tconst { columns, rows } = await executeNative(sql, params);\n\t\t\treturn { columns, rows };\n\t\t},\n\t\tnativeMetrics(): SqliteNativeMetrics | null {\n\t\t\treturn normalizeNativeMetrics(database.metrics?.());\n\t\t},\n\t\tasync close(): Promise<void> {\n\t\t\tclosePromise ??= gate.close(() => database.close());\n\t\t\tawait closePromise;\n\t\t},\n\t};\n}\n\nfunction lastInsertRowIdColumnName(sql: string): string | undefined {\n\tconst match = sql.match(\n\t\t/^\\s*SELECT\\s+last_insert_rowid\\s*\\(\\s*\\)\\s*(?:AS\\s+(\"[^\"]+\"|`[^`]+`|\\[[^\\]]+\\]|\\w+))?\\s*;?\\s*$/i,\n\t);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\n\tconst alias = match[1];\n\tif (!alias) {\n\t\treturn \"last_insert_rowid()\";\n\t}\n\tif (\n\t\t(alias.startsWith('\"') && alias.endsWith('\"')) ||\n\t\t(alias.startsWith(\"`\") && alias.endsWith(\"`\")) ||\n\t\t(alias.startsWith(\"[\") && alias.endsWith(\"]\"))\n\t) {\n\t\treturn alias.slice(1, -1);\n\t}\n\treturn alias;\n}\n","import type { SqliteNativeMetrics } from \"@/common/database/config\";\nimport type { RegistryConfig } from \"./config\";\n\ndeclare const handleBrand: unique symbol;\n\ntype OpaqueHandle<Name extends string> = {\n\treadonly [handleBrand]: Name;\n};\n\nexport type RegistryHandle = OpaqueHandle<\"registry\">;\nexport type ActorFactoryHandle = OpaqueHandle<\"actorFactory\">;\nexport type ActorContextHandle = OpaqueHandle<\"actorContext\">;\nexport type ConnHandle = OpaqueHandle<\"conn\">;\nexport type WebSocketHandle = OpaqueHandle<\"webSocket\">;\nexport type CancellationTokenHandle = OpaqueHandle<\"cancellationToken\">;\n\nexport type RuntimeBytes = Uint8Array;\n\nexport interface RuntimeActorKeySegment {\n\tkind: string;\n\tstringValue?: string;\n\tnumberValue?: number;\n}\n\nexport interface RuntimeHttpRequest {\n\tmethod: string;\n\turi: string;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}\n\nexport interface RuntimeHttpResponse {\n\tstatus?: number;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}\n\nexport interface RuntimeStateDeltaPayload {\n\tstate?: RuntimeBytes;\n\tconnHibernation: Array<{\n\t\tconnId: string;\n\t\tbytes: RuntimeBytes;\n\t}>;\n\tconnHibernationRemoved: string[];\n}\n\nexport interface RuntimeRequestSaveOpts {\n\timmediate?: boolean;\n\tmaxWaitMs?: number;\n}\n\nexport interface RuntimeInspectorSnapshot {\n\tstateRevision: number;\n\tconnectionsRevision: number;\n\tqueueRevision: number;\n\tactiveConnections: number;\n\tqueueSize: number;\n\tconnectedClients: number;\n}\n\nexport interface RuntimeQueueMessage {\n\tid(): bigint;\n\tname(): string;\n\tbody(): RuntimeBytes;\n\tcreatedAt(): number;\n\tisCompletable(): boolean;\n\tcomplete(response?: RuntimeBytes | undefined | null): Promise<void>;\n}\n\nexport interface RuntimeQueueInspectMessage {\n\tid: number;\n\tname: string;\n\tcreatedAtMs: number;\n}\n\nexport interface RuntimeQueueSendResult {\n\tstatus: string;\n\tresponse?: RuntimeBytes;\n}\n\nexport interface RuntimeQueueNextBatchOptions {\n\tnames?: string[];\n\tcount?: number;\n\ttimeoutMs?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeQueueWaitOptions {\n\ttimeoutMs?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeQueueEnqueueAndWaitOptions {\n\ttimeoutMs?: number;\n}\n\nexport interface RuntimeQueueTryNextBatchOptions {\n\tnames?: string[];\n\tcount?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeKvListOptions {\n\treverse?: boolean;\n\tlimit?: number;\n}\n\nexport interface RuntimeKvEntry {\n\tkey: RuntimeBytes;\n\tvalue: RuntimeBytes;\n}\n\ntype RuntimeSqlBindNoValues = {\n\tintValue?: never;\n\tfloatValue?: never;\n\ttextValue?: never;\n\tblobValue?: never;\n};\n\nexport type RuntimeSqlBindParam =\n\t| ({ kind: \"null\" } & RuntimeSqlBindNoValues)\n\t| {\n\t\t\tkind: \"int\";\n\t\t\tintValue: number;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"float\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue: number;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"text\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue: string;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"blob\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue: RuntimeBytes;\n\t };\n\nexport type RuntimeSqlBindParams = RuntimeSqlBindParam[] | null;\n\nexport interface RuntimeSqlQueryResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\nexport type RuntimeSqlExecResult = RuntimeSqlQueryResult;\n\nexport interface RuntimeSqlExecuteResult extends RuntimeSqlQueryResult {\n\tchanges: number;\n\tlastInsertRowId?: number | null;\n}\n\nexport function normalizeRuntimeSqlExecuteResult(\n\tresult: RuntimeSqlQueryResult & {\n\t\tchanges: number;\n\t\tlastInsertRowId?: number | null;\n\t},\n): RuntimeSqlExecuteResult {\n\treturn result;\n}\n\nexport interface RuntimeSqlRunResult {\n\tchanges: number;\n}\n\nexport interface RuntimeSqlDatabase {\n\texec(sql: string): Promise<RuntimeSqlExecResult>;\n\texecute(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult>;\n\tquery(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult>;\n\trun(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult>;\n\tmetrics?(): SqliteNativeMetrics | null;\n\ttakeLastKvError?(): string | null;\n\tclose(): Promise<void>;\n}\n\nexport interface RuntimeActorConfig {\n\tname?: string;\n\ticon?: string;\n\thasDatabase?: boolean;\n\tremoteSqlite?: boolean;\n\thasState?: boolean;\n\tcanHibernateWebsocket?: boolean;\n\tstateSaveIntervalMs?: number;\n\tcreateStateTimeoutMs?: number;\n\tonCreateTimeoutMs?: number;\n\tcreateVarsTimeoutMs?: number;\n\tcreateConnStateTimeoutMs?: number;\n\tonBeforeConnectTimeoutMs?: number;\n\tonConnectTimeoutMs?: number;\n\tonMigrateTimeoutMs?: number;\n\tonWakeTimeoutMs?: number;\n\tonBeforeActorStartTimeoutMs?: number;\n\tactionTimeoutMs?: number;\n\tonRequestTimeoutMs?: number;\n\tsleepTimeoutMs?: number;\n\tnoSleep?: boolean;\n\tsleepGracePeriodMs?: number;\n\tconnectionLivenessTimeoutMs?: number;\n\tconnectionLivenessIntervalMs?: number;\n\tmaxQueueSize?: number;\n\tmaxQueueMessageSize?: number;\n\tmaxIncomingMessageSize?: number;\n\tmaxOutgoingMessageSize?: number;\n\tpreloadMaxWorkflowBytes?: number;\n\tpreloadMaxConnectionsBytes?: number;\n\tactions?: Array<{ name: string }>;\n}\n\nexport interface RuntimeServeConfig {\n\tversion: number;\n\tendpoint: string;\n\ttoken?: string;\n\tnamespace: string;\n\tpoolName: string;\n\tengineBinaryPath?: string;\n\thandleInspectorHttpInRuntime?: boolean;\n\tinspectorTestToken?: string;\n\tserverlessBasePath?: string;\n\tserverlessPackageVersion: string;\n\tserverlessClientEndpoint?: string;\n\tserverlessClientNamespace?: string;\n\tserverlessClientToken?: string;\n\tserverlessValidateEndpoint: boolean;\n\tserverlessMaxStartPayloadBytes: number;\n}\n\nexport interface RuntimeServerlessRequest {\n\tmethod: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody: RuntimeBytes;\n}\n\nexport interface RuntimeServerlessResponseHead {\n\tstatus: number;\n\theaders: Record<string, string>;\n}\n\nexport interface RuntimeRegistryRouteResponse {\n\tstatus: number;\n\theaders: Record<string, string>;\n\tbody: RuntimeBytes;\n}\n\nexport type RuntimeServerlessStreamEvent =\n\t| {\n\t\t\tkind: \"chunk\";\n\t\t\tchunk?: RuntimeBytes;\n\t }\n\t| {\n\t\t\tkind: \"end\";\n\t\t\terror?: {\n\t\t\t\tgroup: string;\n\t\t\t\tcode: string;\n\t\t\t\tmessage: string;\n\t\t\t};\n\t };\n\nexport type RuntimeServerlessStreamCallback = (\n\terror: unknown,\n\tevent?: RuntimeServerlessStreamEvent,\n) => unknown;\n\nexport type RuntimeWebSocketEvent =\n\t| {\n\t\t\tkind: \"message\";\n\t\t\tdata: string | RuntimeBytes;\n\t\t\tbinary: boolean;\n\t\t\tmessageIndex?: number;\n\t }\n\t| {\n\t\t\tkind: \"close\";\n\t\t\tcode: number;\n\t\t\treason: string;\n\t\t\twasClean: boolean;\n\t };\n\nexport interface CoreRuntime {\n\treadonly kind: \"napi\" | \"wasm\";\n\n\tcreateRegistry(): RegistryHandle;\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void;\n\tserveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void>;\n\tshutdownRegistry(registry: RegistryHandle): Promise<void>;\n\tregistryActorStopThresholdMs?(\n\t\tregistry: RegistryHandle,\n\t): Promise<number | undefined>;\n\thandleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead>;\n\tregistryHealth?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tregistryMetadata?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tregistryMetrics?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle;\n\n\tcreateCancellationToken(): CancellationTokenHandle;\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean;\n\tcancelCancellationToken(token: CancellationTokenHandle): void;\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void;\n\n\tactorState(ctx: ActorContextHandle): RuntimeBytes;\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void;\n\tactorEndOnStateChange(ctx: ActorContextHandle): void;\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | undefined | null,\n\t): void;\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void;\n\tactorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void>;\n\tactorInspectorSnapshot(ctx: ActorContextHandle): RuntimeInspectorSnapshot;\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes;\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes;\n\tactorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void>;\n\tactorQueueHibernationRemoval(ctx: ActorContextHandle, connId: string): void;\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[];\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[];\n\tactorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void>;\n\tactorId(ctx: ActorContextHandle): string;\n\tactorName(ctx: ActorContextHandle): string;\n\tactorKey(ctx: ActorContextHandle): RuntimeActorKeySegment[];\n\tactorRegion(ctx: ActorContextHandle): string;\n\tactorSleep(ctx: ActorContextHandle): void;\n\tactorDestroy(ctx: ActorContextHandle): void;\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal;\n\tactorConns(ctx: ActorContextHandle): ConnHandle[];\n\tactorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle>;\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorWaitForTrackedShutdownWork(ctx: ActorContextHandle): Promise<boolean>;\n\tactorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void>;\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number;\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void;\n\tactorRegisterTask(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorRuntimeState(ctx: ActorContextHandle): object;\n\tactorClearRuntimeState(ctx: ActorContextHandle): void;\n\tactorRestartRunHandler(ctx: ActorContextHandle): void;\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number;\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void;\n\n\tactorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null>;\n\tactorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void>;\n\tactorKvDelete(ctx: ActorContextHandle, key: RuntimeBytes): Promise<void>;\n\tactorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void>;\n\tactorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]>;\n\tactorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]>;\n\tactorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>>;\n\tactorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void>;\n\tactorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void>;\n\n\tactorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult>;\n\tactorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult>;\n\tactorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult>;\n\tactorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult>;\n\tactorSqlMetrics(ctx: ActorContextHandle): SqliteNativeMetrics | null;\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null;\n\tactorSqlClose(ctx: ActorContextHandle): Promise<void>;\n\n\tactorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage>;\n\tactorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]>;\n\tactorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage>;\n\tactorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void>;\n\tactorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null>;\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[];\n\tactorQueueMaxSize(ctx: ActorContextHandle): number;\n\tactorQueueInspectMessages(\n\t\tctx: ActorContextHandle,\n\t): Promise<RuntimeQueueInspectMessage[]>;\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\n\tconnId(conn: ConnHandle): string;\n\tconnParams(conn: ConnHandle): RuntimeBytes;\n\tconnState(conn: ConnHandle): RuntimeBytes;\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void;\n\tconnIsHibernatable(conn: ConnHandle): boolean;\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void;\n\tconnDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void>;\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void;\n\twebSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void>;\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void;\n}\n\nexport interface RuntimeBundle {\n\truntime: CoreRuntime;\n}\n\nexport async function buildServeConfig(\n\tconfig: RegistryConfig,\n\tloadEnginePath: () => Promise<string>,\n\tversion: string,\n): Promise<RuntimeServeConfig> {\n\tif (!config.endpoint) {\n\t\tthrow new Error(\"registry endpoint is required\");\n\t}\n\n\tconst serveConfig: RuntimeServeConfig = {\n\t\tversion: config.envoy.version,\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\tpoolName: config.envoy.poolName,\n\t\thandleInspectorHttpInRuntime: true,\n\t\tserverlessBasePath: config.serverless.basePath,\n\t\tserverlessPackageVersion: version,\n\t\tserverlessClientEndpoint: config.publicEndpoint,\n\t\tserverlessClientNamespace: config.publicNamespace,\n\t\tserverlessClientToken: config.publicToken,\n\t\tserverlessValidateEndpoint: config.validateServerlessEndpoint,\n\t\tserverlessMaxStartPayloadBytes: config.serverless.maxStartPayloadBytes,\n\t};\n\n\tif (config.startEngine) {\n\t\tserveConfig.engineBinaryPath = await loadEnginePath();\n\t}\n\tif (config.test?.enabled) {\n\t\tserveConfig.inspectorTestToken =\n\t\t\tprocess.env._RIVET_TEST_INSPECTOR_TOKEN ?? \"token\";\n\t}\n\n\treturn serveConfig;\n}\n","import type {\n\tActorContext as NativeActorContext,\n\tNapiActorFactory as NativeActorFactory,\n\tCancellationToken as NativeCancellationToken,\n\tConnHandle as NativeConnHandle,\n\tCoreRegistry as NativeCoreRegistry,\n\tWebSocket as NativeWebSocket,\n} from \"@rivetkit/rivetkit-napi\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeBytes,\n\tRuntimeHttpRequest,\n\tRuntimeKvEntry,\n\tRuntimeKvListOptions,\n\tRuntimeQueueEnqueueAndWaitOptions,\n\tRuntimeQueueMessage,\n\tRuntimeQueueNextBatchOptions,\n\tRuntimeQueueTryNextBatchOptions,\n\tRuntimeQueueWaitOptions,\n\tRuntimeRegistryRouteResponse,\n\tRuntimeRequestSaveOpts,\n\tRuntimeServeConfig,\n\tRuntimeServerlessRequest,\n\tRuntimeServerlessResponseHead,\n\tRuntimeServerlessStreamCallback,\n\tRuntimeSqlBindParam,\n\tRuntimeSqlBindParams,\n\tRuntimeSqlExecResult,\n\tRuntimeSqlExecuteResult,\n\tRuntimeSqlQueryResult,\n\tRuntimeSqlRunResult,\n\tRuntimeStateDeltaPayload,\n\tRuntimeWebSocketEvent,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { normalizeRuntimeSqlExecuteResult } from \"./runtime\";\n\ntype NativeBindings = typeof import(\"@rivetkit/rivetkit-napi\");\ntype NapiSqlDatabase = ReturnType<NativeActorContext[\"sql\"]>;\ntype NapiSqlBindParams = Parameters<NapiSqlDatabase[\"execute\"]>[1];\n\nfunction asNativeRegistry(handle: RegistryHandle): NativeCoreRegistry {\n\treturn handle as unknown as NativeCoreRegistry;\n}\n\nfunction asNativeFactory(handle: ActorFactoryHandle): NativeActorFactory {\n\treturn handle as unknown as NativeActorFactory;\n}\n\nfunction asNativeActorContext(handle: ActorContextHandle): NativeActorContext {\n\treturn handle as unknown as NativeActorContext;\n}\n\nfunction asNativeConn(handle: ConnHandle): NativeConnHandle {\n\treturn handle as unknown as NativeConnHandle;\n}\n\nfunction asNativeWebSocket(handle: WebSocketHandle): NativeWebSocket {\n\treturn handle as unknown as NativeWebSocket;\n}\n\nfunction asNativeCancellationToken(\n\thandle: CancellationTokenHandle,\n): NativeCancellationToken {\n\treturn handle as unknown as NativeCancellationToken;\n}\n\nfunction asRegistryHandle(handle: NativeCoreRegistry): RegistryHandle {\n\treturn handle as unknown as RegistryHandle;\n}\n\nfunction asActorFactoryHandle(handle: NativeActorFactory): ActorFactoryHandle {\n\treturn handle as unknown as ActorFactoryHandle;\n}\n\nfunction toNapiSqlBindParam(\n\tparam: RuntimeSqlBindParam,\n): NonNullable<NapiSqlBindParams>[number] {\n\tswitch (param.kind) {\n\t\tcase \"null\":\n\t\t\treturn { kind: \"null\" };\n\t\tcase \"int\":\n\t\t\treturn { kind: \"int\", intValue: param.intValue };\n\t\tcase \"float\":\n\t\t\treturn { kind: \"float\", floatValue: param.floatValue };\n\t\tcase \"text\":\n\t\t\treturn { kind: \"text\", textValue: param.textValue };\n\t\tcase \"blob\":\n\t\t\treturn { kind: \"blob\", blobValue: Buffer.from(param.blobValue) };\n\t}\n}\n\nfunction toNapiSqlBindParams(params?: RuntimeSqlBindParams): NapiSqlBindParams {\n\tif (params == null) {\n\t\treturn params;\n\t}\n\treturn params.map((param) => toNapiSqlBindParam(param));\n}\n\nfunction toNapiBuffer(value: RuntimeBytes): Buffer {\n\treturn Buffer.from(value);\n}\n\nfunction toNapiHttpRequest(\n\trequest?: RuntimeHttpRequest | undefined | null,\n): Parameters<NativeActorContext[\"connectConn\"]>[1] {\n\tif (!request) {\n\t\treturn request;\n\t}\n\treturn {\n\t\t...request,\n\t\tbody: request.body ? toNapiBuffer(request.body) : undefined,\n\t};\n}\n\nfunction toNapiStateDeltaPayload(\n\tpayload: RuntimeStateDeltaPayload,\n): Parameters<NativeActorContext[\"saveState\"]>[0] {\n\treturn {\n\t\t...payload,\n\t\tstate: payload.state ? toNapiBuffer(payload.state) : undefined,\n\t\tconnHibernation: payload.connHibernation.map((conn) => ({\n\t\t\t...conn,\n\t\t\tbytes: toNapiBuffer(conn.bytes),\n\t\t})),\n\t};\n}\n\nfunction toNapiKvEntry(entry: RuntimeKvEntry): {\n\tkey: Buffer;\n\tvalue: Buffer;\n} {\n\treturn {\n\t\tkey: toNapiBuffer(entry.key),\n\t\tvalue: toNapiBuffer(entry.value),\n\t};\n}\n\nfunction toNapiQueueMessage(message: RuntimeQueueMessage): RuntimeQueueMessage {\n\treturn {\n\t\tid: () => message.id(),\n\t\tname: () => message.name(),\n\t\tbody: () => message.body(),\n\t\tcreatedAt: () => message.createdAt(),\n\t\tisCompletable: () => message.isCompletable(),\n\t\tcomplete: async (response?: RuntimeBytes | undefined | null) => {\n\t\t\tawait message.complete(\n\t\t\t\tresponse === null || response === undefined\n\t\t\t\t\t? response\n\t\t\t\t\t: toNapiBuffer(response),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport class NapiCoreRuntime implements CoreRuntime {\n\treadonly kind = \"napi\";\n\n\t#bindings: NativeBindings;\n\t#sql = new WeakMap<NativeActorContext, NapiSqlDatabase>();\n\n\tconstructor(bindings: NativeBindings) {\n\t\tthis.#bindings = bindings;\n\t}\n\n\t#actorSql(ctx: ActorContextHandle): NapiSqlDatabase {\n\t\tconst nativeCtx = asNativeActorContext(ctx);\n\t\tlet database = this.#sql.get(nativeCtx);\n\t\tif (!database) {\n\t\t\tdatabase = nativeCtx.sql();\n\t\t\tthis.#sql.set(nativeCtx, database);\n\t\t}\n\t\treturn database;\n\t}\n\n\tcreateRegistry(): RegistryHandle {\n\t\treturn asRegistryHandle(new this.#bindings.CoreRegistry());\n\t}\n\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void {\n\t\tasNativeRegistry(registry).register(name, asNativeFactory(factory));\n\t}\n\n\tasync serveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void> {\n\t\tawait asNativeRegistry(registry).serve(config);\n\t}\n\n\tasync shutdownRegistry(registry: RegistryHandle): Promise<void> {\n\t\tawait asNativeRegistry(registry).shutdown();\n\t}\n\n\tasync registryActorStopThresholdMs(\n\t\tregistry: RegistryHandle,\n\t): Promise<number | undefined> {\n\t\treturn (\n\t\t\t(await asNativeRegistry(registry).actorStopThresholdMs()) ??\n\t\t\tundefined\n\t\t);\n\t}\n\n\tasync registryHealth(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = await asNativeRegistry(registry).health();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync registryMetadata(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = asNativeRegistry(registry).metadata();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync registryMetrics(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = asNativeRegistry(registry).metrics();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync handleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead> {\n\t\treturn await asNativeRegistry(registry).handleServerlessRequest(\n\t\t\t{ ...req, body: toNapiBuffer(req.body) },\n\t\t\tonStreamEvent,\n\t\t\tasNativeCancellationToken(cancelToken),\n\t\t\tconfig,\n\t\t);\n\t}\n\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle {\n\t\treturn asActorFactoryHandle(\n\t\t\tnew this.#bindings.NapiActorFactory(callbacks, config),\n\t\t);\n\t}\n\n\tcreateCancellationToken(): CancellationTokenHandle {\n\t\treturn new this.#bindings.CancellationToken() as unknown as CancellationTokenHandle;\n\t}\n\n\tcreateTestActorContext(\n\t\tactorId: string,\n\t\tname: string,\n\t\tregion: string,\n\t): ActorContextHandle {\n\t\treturn new this.#bindings.ActorContext(\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tregion,\n\t\t) as unknown as ActorContextHandle;\n\t}\n\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean {\n\t\treturn asNativeCancellationToken(token).aborted();\n\t}\n\n\tcancelCancellationToken(token: CancellationTokenHandle): void {\n\t\tasNativeCancellationToken(token).cancel();\n\t}\n\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void {\n\t\tasNativeCancellationToken(token).onCancelled(callback);\n\t}\n\n\tactorState(ctx: ActorContextHandle): Buffer {\n\t\treturn asNativeActorContext(ctx).state();\n\t}\n\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).beginOnStateChange();\n\t}\n\n\tactorEndOnStateChange(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).endOnStateChange();\n\t}\n\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | undefined | null,\n\t): void {\n\t\tasNativeActorContext(ctx).setAlarm(timestampMs);\n\t}\n\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void {\n\t\tasNativeActorContext(ctx).requestSave(opts);\n\t}\n\n\tasync actorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).requestSaveAndWait(opts);\n\t}\n\n\tactorInspectorSnapshot(ctx: ActorContextHandle) {\n\t\treturn asNativeActorContext(ctx).inspectorSnapshot();\n\t}\n\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes {\n\t\treturn asNativeActorContext(ctx).decodeInspectorRequest(\n\t\t\ttoNapiBuffer(bytes),\n\t\t\tadvertisedVersion,\n\t\t);\n\t}\n\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes {\n\t\treturn asNativeActorContext(ctx).encodeInspectorResponse(\n\t\t\ttoNapiBuffer(bytes),\n\t\t\ttargetVersion,\n\t\t);\n\t}\n\n\tasync actorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).verifyInspectorAuth(bearerToken);\n\t}\n\n\tactorQueueHibernationRemoval(\n\t\tctx: ActorContextHandle,\n\t\tconnId: string,\n\t): void {\n\t\tasNativeActorContext(ctx).queueHibernationRemoval(connId);\n\t}\n\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[] {\n\t\treturn asNativeActorContext(ctx).takePendingHibernationChanges();\n\t}\n\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn asNativeActorContext(\n\t\t\tctx,\n\t\t).dirtyHibernatableConns() as unknown as ConnHandle[];\n\t}\n\n\tasync actorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).saveState(\n\t\t\ttoNapiStateDeltaPayload(payload),\n\t\t);\n\t}\n\n\tactorId(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).actorId();\n\t}\n\n\tactorName(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).name();\n\t}\n\n\tactorKey(ctx: ActorContextHandle) {\n\t\treturn asNativeActorContext(ctx).key();\n\t}\n\n\tactorRegion(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).region();\n\t}\n\n\tactorSleep(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).sleep();\n\t}\n\n\tactorDestroy(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).destroy();\n\t}\n\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal {\n\t\treturn asNativeActorContext(ctx).abortSignal();\n\t}\n\n\tactorConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn asNativeActorContext(ctx).conns() as unknown as ConnHandle[];\n\t}\n\n\tasync actorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle> {\n\t\treturn (await asNativeActorContext(ctx).connectConn(\n\t\t\ttoNapiBuffer(params),\n\t\t\ttoNapiHttpRequest(request),\n\t\t)) as unknown as ConnHandle;\n\t}\n\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx).broadcast(name, toNapiBuffer(args));\n\t}\n\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tasNativeActorContext(ctx).waitUntil(promise);\n\t}\n\n\tasync actorWaitForTrackedShutdownWork(\n\t\tctx: ActorContextHandle,\n\t): Promise<boolean> {\n\t\treturn await asNativeActorContext(ctx).waitForTrackedShutdownWork();\n\t}\n\n\tasync actorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).waitForTrackedShutdownWorkUnbounded();\n\t}\n\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tasNativeActorContext(ctx).keepAwake(promise);\n\t}\n\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).beginKeepAwake();\n\t}\n\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void {\n\t\tasNativeActorContext(ctx).endKeepAwake(regionId);\n\t}\n\n\tactorRegisterTask(\n\t\tctx: ActorContextHandle,\n\t\tpromise: Promise<unknown>,\n\t): void {\n\t\tasNativeActorContext(ctx).registerTask(promise);\n\t}\n\n\tactorRuntimeState(ctx: ActorContextHandle): object {\n\t\treturn asNativeActorContext(ctx).runtimeState();\n\t}\n\n\tactorClearRuntimeState(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).clearRuntimeState();\n\t}\n\n\tactorRestartRunHandler(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).restartRunHandler();\n\t}\n\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).beginWebsocketCallback();\n\t}\n\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void {\n\t\tasNativeActorContext(ctx).endWebsocketCallback(regionId);\n\t}\n\n\tasync actorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null> {\n\t\treturn await asNativeActorContext(ctx).kv().get(toNapiBuffer(key));\n\t}\n\n\tasync actorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.put(toNapiBuffer(key), toNapiBuffer(value));\n\t}\n\n\tasync actorKvDelete(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).kv().delete(toNapiBuffer(key));\n\t}\n\n\tasync actorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.deleteRange(toNapiBuffer(start), toNapiBuffer(end));\n\t}\n\n\tasync actorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.listPrefix(toNapiBuffer(prefix), options);\n\t}\n\n\tasync actorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.listRange(toNapiBuffer(start), toNapiBuffer(end), options);\n\t}\n\n\tasync actorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchGet(keys.map(toNapiBuffer));\n\t}\n\n\tasync actorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchPut(entries.map(toNapiKvEntry));\n\t}\n\n\tasync actorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchDelete(keys.map(toNapiBuffer));\n\t}\n\n\tasync actorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult> {\n\t\treturn await this.#actorSql(ctx).exec(sql);\n\t}\n\n\tasync actorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult> {\n\t\tconst result = await this.#actorSql(ctx).execute(\n\t\t\tsql,\n\t\t\ttoNapiSqlBindParams(params),\n\t\t);\n\t\treturn normalizeRuntimeSqlExecuteResult(result);\n\t}\n\n\tasync actorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult> {\n\t\treturn await this.#actorSql(ctx).query(\n\t\t\tsql,\n\t\t\ttoNapiSqlBindParams(params),\n\t\t);\n\t}\n\n\tasync actorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult> {\n\t\treturn await this.#actorSql(ctx).run(sql, toNapiSqlBindParams(params));\n\t}\n\n\tactorSqlMetrics(ctx: ActorContextHandle) {\n\t\treturn this.#actorSql(ctx).metrics?.() ?? null;\n\t}\n\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null {\n\t\treturn this.#actorSql(ctx).takeLastKvError?.() ?? null;\n\t}\n\n\tasync actorSqlClose(ctx: ActorContextHandle): Promise<void> {\n\t\tconst nativeCtx = asNativeActorContext(ctx);\n\t\tconst database = this.#sql.get(nativeCtx);\n\t\tif (!database) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sql.delete(nativeCtx);\n\t\tawait database.close();\n\t}\n\n\tasync actorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage> {\n\t\treturn toNapiQueueMessage(\n\t\t\tawait asNativeActorContext(ctx)\n\t\t\t\t.queue()\n\t\t\t\t.send(name, toNapiBuffer(body)),\n\t\t);\n\t}\n\n\tasync actorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]> {\n\t\tconst messages = await asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.nextBatch(\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t\treturn messages.map(toNapiQueueMessage);\n\t}\n\n\tasync actorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage> {\n\t\treturn toNapiQueueMessage(\n\t\t\tawait asNativeActorContext(ctx)\n\t\t\t\t.queue()\n\t\t\t\t.waitForNames(\n\t\t\t\t\tnames,\n\t\t\t\t\toptions,\n\t\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t\t),\n\t\t);\n\t}\n\n\tasync actorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.waitForNamesAvailable(\n\t\t\t\tnames,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t}\n\n\tasync actorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.enqueueAndWait(\n\t\t\t\tname,\n\t\t\t\ttoNapiBuffer(body),\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t}\n\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[] {\n\t\treturn asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.tryNextBatch(options)\n\t\t\t.map(toNapiQueueMessage);\n\t}\n\n\tactorQueueMaxSize(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).queue().maxSize();\n\t}\n\n\tasync actorQueueInspectMessages(ctx: ActorContextHandle) {\n\t\treturn await asNativeActorContext(ctx).queue().inspectMessages();\n\t}\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx)\n\t\t\t.schedule()\n\t\t\t.after(durationMs, actionName, toNapiBuffer(args));\n\t}\n\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx)\n\t\t\t.schedule()\n\t\t\t.at(timestampMs, actionName, toNapiBuffer(args));\n\t}\n\n\tconnId(conn: ConnHandle): string {\n\t\treturn asNativeConn(conn).id();\n\t}\n\n\tconnParams(conn: ConnHandle): RuntimeBytes {\n\t\treturn asNativeConn(conn).params();\n\t}\n\n\tconnState(conn: ConnHandle): RuntimeBytes {\n\t\treturn asNativeConn(conn).state();\n\t}\n\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void {\n\t\tasNativeConn(conn).setState(toNapiBuffer(state));\n\t}\n\n\tconnIsHibernatable(conn: ConnHandle): boolean {\n\t\treturn asNativeConn(conn).isHibernatable();\n\t}\n\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void {\n\t\tasNativeConn(conn).send(name, toNapiBuffer(args));\n\t}\n\n\tasync connDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeConn(conn).disconnect(reason);\n\t}\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void {\n\t\tasNativeWebSocket(ws).send(toNapiBuffer(data), binary);\n\t}\n\n\tasync webSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeWebSocket(ws).close(code, reason);\n\t}\n\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void {\n\t\tasNativeWebSocket(ws).setEventCallback(callback);\n\t}\n}\n\nexport type NapiBindings = NativeBindings;\n\nexport async function loadNapiRuntime(): Promise<{\n\tbindings: NapiBindings;\n\truntime: NapiCoreRuntime;\n}> {\n\tconst bindings = await import([\"@rivetkit\", \"rivetkit-napi\"].join(\"/\"));\n\treturn {\n\t\tbindings,\n\t\truntime: new NapiCoreRuntime(bindings),\n\t};\n}\n","import { RivetError } from \"@/actor/errors\";\nimport {\n\ttype EventSchemaConfig,\n\tisEventSchemaDefinition,\n\tisQueueSchemaDefinition,\n\tisStandardSchema,\n\ttype PrimitiveSchema,\n\ttype QueueSchemaConfig,\n\tvalidateSchemaSync,\n} from \"@/actor/schema\";\n\nconst CONN_PARAMS_KEY = \"__conn_params__\";\n\nexport interface NativeValidationConfig {\n\tactionInputSchemas?: Record<string, PrimitiveSchema>;\n\tconnParamsSchema?: PrimitiveSchema;\n\tevents?: EventSchemaConfig;\n\tqueues?: QueueSchemaConfig;\n}\n\nexport function validateActionArgs(\n\tschemas: NativeValidationConfig[\"actionInputSchemas\"],\n\tname: string,\n\targs: unknown[],\n): unknown[] {\n\tif (!schemas?.[name]) {\n\t\treturn args;\n\t}\n\n\tconst result = validateSchemaSync(schemas as EventSchemaConfig, name, args);\n\tif (!result.success) {\n\t\tthrow validationError(`action \\`${name}\\` arguments`, result.issues);\n\t}\n\treturn Array.isArray(result.data) ? result.data : [result.data];\n}\n\nexport function validateConnParams(\n\tschema: NativeValidationConfig[\"connParamsSchema\"],\n\tparams: unknown,\n): unknown {\n\tif (!schema) {\n\t\treturn params;\n\t}\n\n\tconst result = validateSchemaSync(\n\t\t{ [CONN_PARAMS_KEY]: schema } as EventSchemaConfig,\n\t\tCONN_PARAMS_KEY,\n\t\tparams,\n\t);\n\tif (!result.success) {\n\t\tthrow validationError(\"connection params\", result.issues);\n\t}\n\treturn result.data;\n}\n\nexport function validateEventArgs(\n\tschemas: NativeValidationConfig[\"events\"],\n\tname: string,\n\targs: unknown[],\n): unknown[] {\n\tif (!schemas?.[name]) {\n\t\treturn args;\n\t}\n\n\tconst payload = args.length <= 1 ? args[0] : args;\n\tconst result = validateSchemaSync(schemas, name, payload);\n\tif (!result.success) {\n\t\tthrow validationError(`event \\`${name}\\` payload`, result.issues);\n\t}\n\treturn args.length <= 1\n\t\t? [result.data]\n\t\t: Array.isArray(result.data)\n\t\t\t? result.data\n\t\t\t: [result.data];\n}\n\nexport function validateQueueBody(\n\tschemas: NativeValidationConfig[\"queues\"],\n\tname: string,\n\tbody: unknown,\n): unknown {\n\tif (!schemas?.[name]) {\n\t\treturn body;\n\t}\n\n\tconst result = validateSchemaSync(schemas, name, body);\n\tif (!result.success) {\n\t\tthrow validationError(`queue \\`${name}\\` message`, result.issues);\n\t}\n\treturn result.data;\n}\n\nexport function validateQueueComplete(\n\tschemas: NativeValidationConfig[\"queues\"],\n\tname: string,\n\tresponse: unknown,\n): unknown {\n\tconst schema = schemas?.[name];\n\tif (!schema) {\n\t\treturn response;\n\t}\n\n\tlet completeSchema: PrimitiveSchema | undefined;\n\tif (isQueueSchemaDefinition(schema)) {\n\t\tcompleteSchema = schema.complete;\n\t} else if (\n\t\t!isStandardSchema(schema) &&\n\t\t!isEventSchemaDefinition(schema) &&\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"complete\" in schema\n\t) {\n\t\tconst candidate = (schema as { complete?: unknown }).complete;\n\t\tif (candidate !== undefined) {\n\t\t\tcompleteSchema = candidate as PrimitiveSchema;\n\t\t}\n\t}\n\n\tif (!completeSchema) {\n\t\treturn response;\n\t}\n\n\tconst result = validateSchemaSync(\n\t\t{ [name]: completeSchema } as EventSchemaConfig,\n\t\tname,\n\t\tresponse,\n\t);\n\tif (!result.success) {\n\t\tthrow validationError(\n\t\t\t`queue \\`${name}\\` completion response`,\n\t\t\tresult.issues,\n\t\t);\n\t}\n\treturn result.data;\n}\n\nfunction validationError(target: string, issues: unknown[]): RivetError {\n\treturn new RivetError(\"actor\", \"validation_error\", `Invalid ${target}`, {\n\t\tpublic: true,\n\t\tmetadata: { issues },\n\t});\n}\n","import type {\n\tActorContext as WasmActorContext,\n\tActorFactory as WasmActorFactory,\n\tCancellationToken as WasmCancellationToken,\n\tConnHandle as WasmConnHandle,\n\tCoreRegistry as WasmCoreRegistry,\n\tWebSocketHandle as WasmWebSocketHandle,\n} from \"@rivetkit/rivetkit-wasm\";\nimport { decodeBridgeRivetError, RivetError } from \"@/actor/errors\";\nimport type {\n\tWasmRuntimeBindings,\n\tWasmRuntimeConfig,\n\tWasmRuntimeInitInput,\n} from \"./config\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeActorKeySegment,\n\tRuntimeBytes,\n\tRuntimeHttpRequest,\n\tRuntimeInspectorSnapshot,\n\tRuntimeKvEntry,\n\tRuntimeKvListOptions,\n\tRuntimeQueueEnqueueAndWaitOptions,\n\tRuntimeQueueInspectMessage,\n\tRuntimeQueueMessage,\n\tRuntimeQueueNextBatchOptions,\n\tRuntimeQueueTryNextBatchOptions,\n\tRuntimeQueueWaitOptions,\n\tRuntimeRegistryRouteResponse,\n\tRuntimeRequestSaveOpts,\n\tRuntimeServeConfig,\n\tRuntimeServerlessRequest,\n\tRuntimeServerlessResponseHead,\n\tRuntimeServerlessStreamCallback,\n\tRuntimeSqlBindParams,\n\tRuntimeSqlDatabase,\n\tRuntimeSqlExecResult,\n\tRuntimeSqlExecuteResult,\n\tRuntimeSqlQueryResult,\n\tRuntimeSqlRunResult,\n\tRuntimeStateDeltaPayload,\n\tRuntimeWebSocketEvent,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { normalizeRuntimeSqlExecuteResult } from \"./runtime\";\n\ntype WasmBindings = WasmRuntimeBindings;\nexport type WasmInitInput = WasmRuntimeInitInput;\ntype AnyFunction = (...args: unknown[]) => unknown;\ntype WasmRuntimeLoadConfig = Pick<WasmRuntimeConfig, \"bindings\" | \"initInput\">;\n\nfunction asWasmRegistry(handle: RegistryHandle): WasmCoreRegistry {\n\treturn handle as unknown as WasmCoreRegistry;\n}\n\nfunction asWasmFactory(handle: ActorFactoryHandle): WasmActorFactory {\n\treturn handle as unknown as WasmActorFactory;\n}\n\nfunction asWasmActorContext(handle: ActorContextHandle): WasmActorContext {\n\treturn handle as unknown as WasmActorContext;\n}\n\nfunction asWasmConn(handle: ConnHandle): WasmConnHandle {\n\treturn handle as unknown as WasmConnHandle;\n}\n\nfunction asWasmWebSocket(handle: WebSocketHandle): WasmWebSocketHandle {\n\treturn handle as unknown as WasmWebSocketHandle;\n}\n\nfunction asWasmCancellationToken(\n\thandle: CancellationTokenHandle,\n): WasmCancellationToken {\n\treturn handle as unknown as WasmCancellationToken;\n}\n\nfunction asRegistryHandle(handle: WasmCoreRegistry): RegistryHandle {\n\treturn handle as unknown as RegistryHandle;\n}\n\nfunction asActorFactoryHandle(handle: WasmActorFactory): ActorFactoryHandle {\n\treturn handle as unknown as ActorFactoryHandle;\n}\n\nfunction toBytes(value: RuntimeBytes | null | undefined): RuntimeBytes {\n\treturn value ?? new Uint8Array(0);\n}\n\nfunction optionalBytes(\n\tvalue: RuntimeBytes | null | undefined,\n): RuntimeBytes | null {\n\tif (value === null || value === undefined) {\n\t\treturn null;\n\t}\n\treturn toBytes(value);\n}\n\nfunction optionalWasmNumber(\n\tvalue: number | bigint | null | undefined,\n): number | null | undefined {\n\tif (value === null || value === undefined) {\n\t\treturn value;\n\t}\n\treturn typeof value === \"bigint\" ? Number(value) : value;\n}\n\nfunction wasmNumber(value: number | bigint): number {\n\treturn typeof value === \"bigint\" ? Number(value) : value;\n}\n\nfunction normalizeKvEntry(entry: RuntimeKvEntry): RuntimeKvEntry {\n\treturn {\n\t\tkey: toBytes(entry.key),\n\t\tvalue: toBytes(entry.value),\n\t};\n}\n\nfunction normalizeQueueMessage(\n\tmessage: RuntimeQueueMessage,\n): RuntimeQueueMessage {\n\treturn {\n\t\tid: () => message.id(),\n\t\tname: () => message.name(),\n\t\tbody: () => toBytes(message.body()),\n\t\tcreatedAt: () => message.createdAt(),\n\t\tisCompletable: () => message.isCompletable(),\n\t\tcomplete: async (response?: RuntimeBytes | undefined | null) => {\n\t\t\tawait callWasm(() => message.complete(response));\n\t\t},\n\t};\n}\n\nfunction normalizeWasmBridgeError(error: unknown): unknown {\n\tif (typeof error === \"string\") {\n\t\treturn decodeBridgeRivetError(error) ?? error;\n\t}\n\n\tif (error instanceof Error) {\n\t\tconst bridged = decodeBridgeRivetError(error.message);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\tif (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"reason\" in error &&\n\t\ttypeof error.reason === \"string\"\n\t) {\n\t\tconst bridged = decodeBridgeRivetError(error.reason);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\treturn error;\n}\n\nasync function callWasm<T>(invoke: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn await invoke();\n\t} catch (error) {\n\t\tthrow normalizeWasmBridgeError(error);\n\t}\n}\n\nfunction callWasmSync<T>(invoke: () => T): T {\n\ttry {\n\t\treturn invoke();\n\t} catch (error) {\n\t\tthrow normalizeWasmBridgeError(error);\n\t}\n}\n\nfunction unsupportedWasmMethod(method: string): never {\n\tthrow new RivetError(\n\t\t\"runtime\",\n\t\t\"unsupported\",\n\t\t`Unsupported wasm runtime method: ${method}`,\n\t\t{\n\t\t\tmetadata: {\n\t\t\t\truntime: \"wasm\",\n\t\t\t\tmethod,\n\t\t\t},\n\t\t},\n\t);\n}\n\nfunction method<T extends AnyFunction>(target: unknown, name: string): T {\n\tif (\n\t\ttypeof target === \"object\" &&\n\t\ttarget !== null &&\n\t\tname in target &&\n\t\ttypeof target[name as keyof typeof target] === \"function\"\n\t) {\n\t\treturn target[name as keyof typeof target] as T;\n\t}\n\treturn unsupportedWasmMethod(name);\n}\n\nfunction callHandle<T>(handle: unknown, name: string, ...args: unknown[]): T {\n\treturn callWasmSync(() => method(handle, name).apply(handle, args) as T);\n}\n\nasync function callHandleAsync<T>(\n\thandle: unknown,\n\tname: string,\n\t...args: unknown[]\n): Promise<T> {\n\treturn await callWasm(\n\t\tasync () => (await method(handle, name).apply(handle, args)) as T,\n\t);\n}\n\nfunction childHandle<T>(handle: unknown, name: string): T {\n\treturn callHandle<T>(handle, name);\n}\n\nexport class WasmCoreRuntime implements CoreRuntime {\n\treadonly kind = \"wasm\";\n\n\t#bindings: WasmBindings;\n\t#sql = new WeakMap<WasmActorContext, RuntimeSqlDatabase>();\n\n\tconstructor(bindings: WasmBindings) {\n\t\tthis.#bindings = bindings;\n\t}\n\n\t#actorSql(ctx: ActorContextHandle): RuntimeSqlDatabase {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tlet database = this.#sql.get(wasmCtx);\n\t\tif (!database) {\n\t\t\tdatabase = callHandle<RuntimeSqlDatabase>(wasmCtx, \"sql\");\n\t\t\tthis.#sql.set(wasmCtx, database);\n\t\t}\n\t\treturn database;\n\t}\n\n\tcreateRegistry(): RegistryHandle {\n\t\treturn callWasmSync(() =>\n\t\t\tasRegistryHandle(new this.#bindings.CoreRegistry()),\n\t\t);\n\t}\n\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void {\n\t\tcallWasmSync(() =>\n\t\t\tasWasmRegistry(registry).register(name, asWasmFactory(factory)),\n\t\t);\n\t}\n\n\tasync serveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void> {\n\t\tawait callWasm(() => asWasmRegistry(registry).serve(config));\n\t}\n\n\tasync shutdownRegistry(registry: RegistryHandle): Promise<void> {\n\t\tawait callWasm(() => asWasmRegistry(registry).shutdown());\n\t}\n\n\tasync registryHealth(): Promise<RuntimeRegistryRouteResponse> {\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tbody: new TextEncoder().encode(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\truntime: \"rivetkit\",\n\t\t\t\t\tversion: \"wasm\",\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\t}\n\n\tasync handleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead> {\n\t\treturn await callHandleAsync<RuntimeServerlessResponseHead>(\n\t\t\tasWasmRegistry(registry),\n\t\t\t\"handleServerlessRequest\",\n\t\t\treq,\n\t\t\tonStreamEvent,\n\t\t\tasWasmCancellationToken(cancelToken),\n\t\t\tconfig,\n\t\t);\n\t}\n\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle {\n\t\treturn callWasmSync(() =>\n\t\t\tasActorFactoryHandle(\n\t\t\t\tnew this.#bindings.ActorFactory(callbacks, config),\n\t\t\t),\n\t\t);\n\t}\n\n\tcreateCancellationToken(): CancellationTokenHandle {\n\t\treturn callWasmSync(\n\t\t\t() =>\n\t\t\t\tnew this.#bindings.CancellationToken() as unknown as CancellationTokenHandle,\n\t\t);\n\t}\n\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean {\n\t\treturn callWasmSync(() => asWasmCancellationToken(token).aborted());\n\t}\n\n\tcancelCancellationToken(token: CancellationTokenHandle): void {\n\t\tcallWasmSync(() => asWasmCancellationToken(token).cancel());\n\t}\n\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void {\n\t\tcallWasmSync(() =>\n\t\t\tasWasmCancellationToken(token).onCancelled(callback),\n\t\t);\n\t}\n\n\tactorState(ctx: ActorContextHandle): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"state\",\n\t\t\t),\n\t\t);\n\t}\n\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"beginOnStateChange\");\n\t}\n\n\tactorEndOnStateChange(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endOnStateChange\");\n\t}\n\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | bigint | undefined | null,\n\t): void {\n\t\tcallHandle(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"setAlarm\",\n\t\t\toptionalWasmNumber(timestampMs),\n\t\t);\n\t}\n\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"requestSave\", opts);\n\t}\n\n\tasync actorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"requestSaveAndWait\",\n\t\t\topts,\n\t\t);\n\t}\n\n\tactorInspectorSnapshot(ctx: ActorContextHandle): RuntimeInspectorSnapshot {\n\t\treturn callHandle(asWasmActorContext(ctx), \"inspectorSnapshot\");\n\t}\n\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"decodeInspectorRequest\",\n\t\t\t\tbytes,\n\t\t\t\tadvertisedVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"encodeInspectorResponse\",\n\t\t\t\tbytes,\n\t\t\t\ttargetVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync actorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"verifyInspectorAuth\",\n\t\t\tbearerToken,\n\t\t);\n\t}\n\n\tactorQueueHibernationRemoval(\n\t\tctx: ActorContextHandle,\n\t\tconnId: string,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"queueHibernationRemoval\", connId);\n\t}\n\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[] {\n\t\treturn callHandle(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"takePendingHibernationChanges\",\n\t\t);\n\t}\n\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"dirtyHibernatableConns\");\n\t}\n\n\tasync actorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmActorContext(ctx), \"saveState\", payload);\n\t}\n\n\tactorId(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"actorId\");\n\t}\n\n\tactorName(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"name\");\n\t}\n\n\tactorKey(ctx: ActorContextHandle): RuntimeActorKeySegment[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"key\");\n\t}\n\n\tactorRegion(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"region\");\n\t}\n\n\tactorSleep(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"sleep\");\n\t}\n\n\tactorDestroy(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"destroy\");\n\t}\n\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal {\n\t\treturn callHandle(asWasmActorContext(ctx), \"abortSignal\");\n\t}\n\n\tactorConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"conns\");\n\t}\n\n\tasync actorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle> {\n\t\treturn await callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"connectConn\",\n\t\t\tparams,\n\t\t\trequest,\n\t\t);\n\t}\n\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"broadcast\", name, args);\n\t}\n\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"waitUntil\", promise);\n\t}\n\n\tasync actorWaitForTrackedShutdownWork(\n\t\tctx: ActorContextHandle,\n\t): Promise<boolean> {\n\t\treturn await callHandle<Promise<boolean>>(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"waitForTrackedShutdownWork\",\n\t\t);\n\t}\n\n\tasync actorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void> {\n\t\tawait callHandle<Promise<void>>(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"waitForTrackedShutdownWorkUnbounded\",\n\t\t);\n\t}\n\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tconst regionId = callHandle<number>(wasmCtx, \"beginKeepAwake\");\n\t\tconst trackedPromise = Promise.resolve(promise)\n\t\t\t.finally(() => {\n\t\t\t\tcallHandle(wasmCtx, \"endKeepAwake\", regionId);\n\t\t\t})\n\t\t\t.then(() => null);\n\t\tcallHandle(wasmCtx, \"registerTask\", trackedPromise);\n\t}\n\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number {\n\t\treturn callHandle<number>(asWasmActorContext(ctx), \"beginKeepAwake\");\n\t}\n\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endKeepAwake\", regionId);\n\t}\n\n\tactorRegisterTask(\n\t\tctx: ActorContextHandle,\n\t\tpromise: Promise<unknown>,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"registerTask\", promise);\n\t}\n\n\tactorRuntimeState(ctx: ActorContextHandle): object {\n\t\treturn callHandle(asWasmActorContext(ctx), \"runtimeState\");\n\t}\n\n\tactorClearRuntimeState(ctx: ActorContextHandle): void {\n\t\tconst runtimeState = this.actorRuntimeState(ctx);\n\t\tfor (const key of Object.keys(runtimeState)) {\n\t\t\tdelete (runtimeState as Record<string, unknown>)[key];\n\t\t}\n\t}\n\n\tactorRestartRunHandler(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"restartRunHandler\");\n\t}\n\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number {\n\t\treturn callHandle(asWasmActorContext(ctx), \"beginWebsocketCallback\");\n\t}\n\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endWebsocketCallback\", regionId);\n\t}\n\n\tasync actorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\treturn optionalBytes(await callHandleAsync(kv, \"get\", key));\n\t}\n\n\tasync actorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"put\", key, value);\n\t}\n\n\tasync actorKvDelete(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"delete\", key);\n\t}\n\n\tasync actorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"deleteRange\", start, end);\n\t}\n\n\tasync actorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst entries = await callHandleAsync<RuntimeKvEntry[]>(\n\t\t\tkv,\n\t\t\t\"listPrefix\",\n\t\t\tprefix,\n\t\t\toptions,\n\t\t);\n\t\treturn entries.map(normalizeKvEntry);\n\t}\n\n\tasync actorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst entries = await callHandleAsync<RuntimeKvEntry[]>(\n\t\t\tkv,\n\t\t\t\"listRange\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\toptions,\n\t\t);\n\t\treturn entries.map(normalizeKvEntry);\n\t}\n\n\tasync actorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst values = await callHandleAsync<\n\t\t\tArray<RuntimeBytes | Uint8Array | null | undefined>\n\t\t>(kv, \"batchGet\", keys);\n\t\treturn values.map((value) =>\n\t\t\tvalue === undefined ? undefined : optionalBytes(value),\n\t\t);\n\t}\n\n\tasync actorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"batchPut\", entries);\n\t}\n\n\tasync actorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"batchDelete\", keys);\n\t}\n\n\tasync actorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).exec(sql));\n\t}\n\n\tasync actorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult> {\n\t\tconst result = await callWasm(() =>\n\t\t\tthis.#actorSql(ctx).execute(sql, params),\n\t\t);\n\t\treturn normalizeRuntimeSqlExecuteResult(result);\n\t}\n\n\tasync actorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).query(sql, params));\n\t}\n\n\tasync actorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).run(sql, params));\n\t}\n\n\tactorSqlMetrics(ctx: ActorContextHandle) {\n\t\treturn this.#actorSql(ctx).metrics?.() ?? null;\n\t}\n\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null {\n\t\treturn this.#actorSql(ctx).takeLastKvError?.() ?? null;\n\t}\n\n\tasync actorSqlClose(ctx: ActorContextHandle): Promise<void> {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tconst database = this.#sql.get(wasmCtx);\n\t\tif (!database) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sql.delete(wasmCtx);\n\t\tawait callWasm(() => database.close());\n\t}\n\n\tasync actorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn normalizeQueueMessage(\n\t\t\tawait callHandleAsync(queue, \"send\", name, body),\n\t\t);\n\t}\n\n\tasync actorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\tconst messages = await callHandleAsync<RuntimeQueueMessage[]>(\n\t\t\tqueue,\n\t\t\t\"nextBatch\",\n\t\t\toptions,\n\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t);\n\t\treturn messages.map(normalizeQueueMessage);\n\t}\n\n\tasync actorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn normalizeQueueMessage(\n\t\t\tawait callHandleAsync(\n\t\t\t\tqueue,\n\t\t\t\t\"waitForNames\",\n\t\t\t\tnames,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync actorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\tawait callHandleAsync(\n\t\t\tqueue,\n\t\t\t\"waitForNamesAvailable\",\n\t\t\tnames,\n\t\t\toptions,\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync actorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn optionalBytes(\n\t\t\tawait callHandleAsync(\n\t\t\t\tqueue,\n\t\t\t\t\"enqueueAndWait\",\n\t\t\t\tname,\n\t\t\t\tbody,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t\t),\n\t\t);\n\t}\n\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[] {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn callHandle<RuntimeQueueMessage[]>(\n\t\t\tqueue,\n\t\t\t\"tryNextBatch\",\n\t\t\toptions,\n\t\t).map(normalizeQueueMessage);\n\t}\n\n\tactorQueueMaxSize(ctx: ActorContextHandle): number {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn callHandle(queue, \"maxSize\");\n\t}\n\n\tasync actorQueueInspectMessages(\n\t\tctx: ActorContextHandle,\n\t): Promise<RuntimeQueueInspectMessage[]> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn await callHandleAsync(queue, \"inspectMessages\");\n\t}\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number | bigint,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tconst schedule = childHandle(asWasmActorContext(ctx), \"schedule\");\n\t\tcallHandle(schedule, \"after\", wasmNumber(durationMs), actionName, args);\n\t}\n\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number | bigint,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tconst schedule = childHandle(asWasmActorContext(ctx), \"schedule\");\n\t\tcallHandle(schedule, \"at\", wasmNumber(timestampMs), actionName, args);\n\t}\n\n\tconnId(conn: ConnHandle): string {\n\t\treturn callHandle(asWasmConn(conn), \"id\");\n\t}\n\n\tconnParams(conn: ConnHandle): RuntimeBytes {\n\t\treturn toBytes(callHandle(asWasmConn(conn), \"params\"));\n\t}\n\n\tconnState(conn: ConnHandle): RuntimeBytes {\n\t\treturn toBytes(callHandle(asWasmConn(conn), \"state\"));\n\t}\n\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void {\n\t\tcallHandle(asWasmConn(conn), \"setState\", state);\n\t}\n\n\tconnIsHibernatable(conn: ConnHandle): boolean {\n\t\treturn callHandle(asWasmConn(conn), \"isHibernatable\");\n\t}\n\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void {\n\t\tcallHandle(asWasmConn(conn), \"send\", name, args);\n\t}\n\n\tasync connDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmConn(conn), \"disconnect\", reason);\n\t}\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void {\n\t\tcallHandle(asWasmWebSocket(ws), \"send\", data, binary);\n\t}\n\n\tasync webSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmWebSocket(ws), \"close\", code, reason);\n\t}\n\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void {\n\t\tcallHandle(\n\t\t\tasWasmWebSocket(ws),\n\t\t\t\"setEventCallback\",\n\t\t\t(event: RuntimeWebSocketEvent) => {\n\t\t\t\tif (event.kind === \"message\" && event.binary) {\n\t\t\t\t\tcallback({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\tdata: toBytes(event.data as RuntimeBytes | Uint8Array),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback(event);\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport type { WasmBindings };\n\nexport async function loadWasmRuntime(config?: WasmRuntimeLoadConfig): Promise<{\n\tbindings: WasmBindings;\n\truntime: WasmCoreRuntime;\n}> {\n\tconst bindings =\n\t\tconfig?.bindings ??\n\t\t(await import([\"@rivetkit\", \"rivetkit-wasm\"].join(\"/\")));\n\tawait bindings.default(config?.initInput);\n\treturn {\n\t\tbindings,\n\t\truntime: new WasmCoreRuntime(bindings),\n\t};\n}\n","import onChange from \"@rivetkit/on-change\";\n\n/**\n * Creates a proxy that tracks deep mutations on an object and calls `commit`\n * after every change. Uses `@rivetkit/on-change` internally, which correctly\n * detects mutations via methods on Map, Set, Date, TypedArrays, and arrays.\n *\n * If the value is not an object (primitive, null, undefined), it is returned\n * as-is since primitives cannot be proxied or mutated.\n *\n * @param value - The root value to watch.\n * @param commit - Called after every detected mutation with the root object.\n * @param beforeChange - Called before every mutation with the new value being\n * assigned. Throw to reject the change.\n */\nexport function createWriteThroughProxy<T>(\n\tvalue: T,\n\tcommit: (next: T) => void,\n\tbeforeChange?: (newValue: unknown) => void,\n): T {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn value;\n\t}\n\n\treturn onChange(\n\t\tvalue as T & Record<string, any>,\n\t\t() => {\n\t\t\tcommit(value);\n\t\t},\n\t\t{\n\t\t\t// Rejection is throw-based: beforeChange throws to prevent the\n\t\t\t// mutation. We always return true so on-change applies the change\n\t\t\t// if beforeChange did not throw.\n\t\t\tonValidate(_path: string, newValue: unknown) {\n\t\t\t\tbeforeChange?.(newValue);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t) as T;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs","../../src/actor/log.ts","../../src/actor/definition.ts","../../src/actor/schema.ts","../../src/common/inline-websocket-adapter.ts","../../src/registry/index.ts","../../src/common/engine.ts","../../src/registry/log.ts","../../src/serverless/configure.ts","../../src/utils/serve.ts","../../src/registry/config/index.ts","../../src/registry/config/envoy.ts","../../src/registry/config/serverless.ts","../../src/registry/native.ts","../../src/common/database/native-database.ts","../../src/registry/runtime.ts","../../src/registry/napi-runtime.ts","../../src/registry/native-validation.ts","../../src/registry/wasm-runtime.ts","../../src/registry/write-through-proxy.ts"],"names":["error","method","asActorFactoryHandle","queue","event","_a","_b"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACzEO,SAAS,oBAAA,CAAA,EAAuB;AACtC,EAAA,OAAO,yCAAA,eAAyB,CAAA;AACjC;AD2EA;AACA;AEtEA,IAAM,4BAAA,kBAA8B,IAAI,GAAA,CAAY,CAAA;AAEpD,SAAS,iCAAA,CAAkC,OAAA,EAAkB;AAC5D,EAAA,GAAA,CAAI,CAAC,QAAA,GAAW,OAAO,QAAA,IAAY,QAAA,EAAU,MAAA;AAC7C,EAAA,MAAM,KAAA,EAAO,OAAA;AACb,EAAA,IAAA,CAAA,MAAW,IAAA,GAAO,CAAC,kBAAA,EAAoB,kBAAkB,CAAA,EAAG;AAC3D,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,EAAA,IAAM,KAAA,EAAA,GAAa,CAAC,2BAAA,CAA4B,GAAA,CAAI,GAAG,CAAA,EAAG;AACrE,MAAA,2BAAA,CAA4B,GAAA,CAAI,GAAG,CAAA;AACnC,MAAA,oBAAA,CAAqB,CAAA,CAAE,IAAA,CAAK;AAAA,QAC3B,GAAA,EAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,mLAAA;AAAA,MAC3B,CAAC,CAAA;AAAA,IACF;AAAA,EACD;AACD;AAyCO,IAAM,gBAAA,EAAN,MAoBP;AAAA,EACC,CAAA,MAAA;AAAA,EAEA,WAAA,CAAY,MAAA,EAAmD;AAC9D,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,CAAA,EAAoD;AACvD,IAAA,OAAO,IAAA,CAAK,CAAA,MAAA;AAAA,EACb;AACD,CAAA;AA+BO,SAAS,qBAAA,CACf,MAAA,EACmC;AACnC,EAAA,OAAO,IAAA;AACR;AAEO,SAAS,KAAA,CA6Bf,KAAA,EAqBC;AACD,EAAA,iCAAA;AAAA,IACE,MAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,KAAA,CAA6C;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,OAAA,EAAS,mCAAA,CAAkB,KAAA,CAAM,KAAK,CAAA;AAW5C,EAAA,OAAO,IAAI,eAAA,CAAgB,MAAM,CAAA;AAClC;AAEO,SAAS,uBAAA,CACf,UAAA,EACyC;AACzC,EAAA,OAAO,WAAA,WAAsB,eAAA;AAC9B;AAEO,SAAS,gBAAA,CACf,MAAA,EACA,IAAA,EACqB;AACrB,EAAA,MAAM,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,EAAA,GAAA,CAAI,CAAC,UAAA,EAAY,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAA;AAC/D,EAAA;AACR;AF3FyE;AACA;AGtF1C;AACV,EAAA;AACrB;AAIiD;AAC5B,EAAA;AACrB;AA4E4E;AACN,EAAA;AACtE;AAIuC;AACF,EAAA;AAC5B,IAAA;AACR,EAAA;AAIc,EAAA;AAGf;AAIuC;AAIzB,EAAA;AAGd;AAKW;AACI,EAAA;AACN,IAAA;AACR,EAAA;AACiC,EAAA;AAClC;AAKoC;AACV,EAAA;AACgB,EAAA;AACjC,IAAA;AACR,EAAA;AAGE,EAAA;AAGC,EAAA;AACJ;AAKoC;AACV,EAAA;AACgB,EAAA;AACjC,IAAA;AACR,EAAA;AAE6D,EAAA;AAG1D,EAAA;AACJ;AAIyC;AAC3B,EAAA;AACL,IAAA;AACR,EAAA;AACqC,EAAA;AACtB,IAAA;AACf,EAAA;AACqC,EAAA;AACtB,IAAA;AACf,EAAA;AAIa,EAAA;AAG6C,IAAA;AAC1D,EAAA;AAIc,EAAA;AAG6C,IAAA;AAC3D,EAAA;AACO,EAAA;AACR;AAEsE;AAI1D,EAAA;AAGZ;AA+BmD;AACL,EAAA;AAEhC,EAAA;AACwD,IAAA;AACrE,EAAA;AAE8B,EAAA;AACmB,IAAA;AACrB,IAAA;AACwB,MAAA;AACnD,IAAA;AACmB,IAAA;AACkC,MAAA;AACrD,IAAA;AACO,IAAA;AACG,MAAA;AACI,MAAA;AACd,IAAA;AACD,EAAA;AAEoE,EAAA;AACrE;AH7EyE;AACA;AI9MxC;AACP;AAKR;AAC0B,EAAA;AAC5C;AASoC;AACnC,EAAA;AACA,EAAA;AAC6B,EAAA;AAC7B,EAAA;AAIM,EAAA;AAEN,EAAA;AACA,EAAA;AAOE,EAAA;AACe,IAAA;AACuB,IAAA;AAKD,IAAA;AACX,MAAA;AACmC,MAAA;AACV,MAAA;AACnD,IAAA;AAEoC,IAAA;AACV,MAAA;AAC0B,MAAA;AACD,MAAA;AACnD,IAAA;AAG+B,IAAA;AACrB,MAAA;AACyC,MAAA;AACH,QAAA;AACb,QAAA;AACnC,MAAA;AAC2C,MAAA;AACoB,QAAA;AACxB,QAAA;AACvC,MAAA;AACY,MAAA;AACZ,IAAA;AAGgB,IAAA;AACC,MAAA;AACd,IAAA;AACL,EAAA;AAAA;AAG0C,EAAA;AAC7B,IAAA;AACb,EAAA;AAAA;AAGyC,EAAA;AAC5B,IAAA;AACb,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWQ,EAAA;AAC6C,IAAA;AACS,MAAA;AAC5D,MAAA;AACD,IAAA;AAGM,IAAA;AAEL,MAAA;AACD,IAAA;AACmD,IAAA;AACpD,EAAA;AAKQ,EAAA;AACH,IAAA;AACW,MAAA;AACa,QAAA;AACrB,QAAA;AACN,MAAA;AACqC,MAAA;AAC9B,QAAA;AACN,QAAA;AACA,QAAA;AACa,QAAA;AACO,QAAA;AACpB,MAAA;AACY,IAAA;AACQ,MAAA;AACgC,MAAA;AACtD,IAAA;AACD,EAAA;AAEmC,EAAA;AAC9B,IAAA;AAC6C,MAAA;AAE7B,MAAA;AAE6B,MAAA;AAChC,QAAA;AACT,UAAA;AACL,QAAA;AACsC,QAAA;AACjC,MAAA;AACS,QAAA;AACT,UAAA;AACL,QAAA;AAC8C,QAAA;AAChD,MAAA;AAG2B,MAAA;AACD,MAAA;AACqB,MAAA;AACC,QAAA;AACpC,QAAA;AACV,UAAA;AACD,QAAA;AAC6D,QAAA;AAC9D,MAAA;AACa,IAAA;AACQ,MAAA;AACmC,MAAA;AACzD,IAAA;AACD,EAAA;AAEmC,EAAA;AACmB,IAAA;AACtC,IAAA;AACT,MAAA;AACL,MAAA;AAEsD,MAAA;AACR,MAAA;AAC9C,IAAA;AAGG,IAAA;AACyC,MAAA;AAC7B,IAAA;AACA,MAAA;AACT,QAAA;AACLA,QAAAA;AACA,MAAA;AACF,IAAA;AAGiC,IAAA;AACD,IAAA;AACjC,EAAA;AAE2C,EAAA;AACY,IAAA;AACrD,MAAA;AACD,IAAA;AAEyD,IAAA;AAEtC,IAAA;AAEf,IAAA;AACW,MAAA;AACkB,QAAA;AAC1B,QAAA;AACN,MAAA;AACe,IAAA;AACyC,MAAA;AACvD,IAAA;AACkB,MAAA;AAGqB,MAAA;AACD,MAAA;AACxC,IAAA;AACD,EAAA;AACD;AJmJyE;AACA;AKxWpD;AL0WoD;AACA;AM3W9C;AACA;AACgD;AAEH;AAEhB,EAAA;AACvB,EAAA;AACjC;AAEiE;AAC5D,EAAA;AACA,EAAA;AACmB,IAAA;AACf,EAAA;AACA,IAAA;AACR,EAAA;AAE0C,EAAA;AAIzC,EAAA;AAMF;ANiWyE;AACA;AO5XhD;AACG,EAAA;AAC5B;AP8XyE;AACA;AQ1XpC;AACJ;AAES;AACc,EAAA;AACxD;AAE8B;AACH,EAAA;AACW,EAAA;AAC7B,IAAA;AAEmB,EAAA;AACiB,EAAA;AACjC,IAAA;AACT,MAAA;AACD,IAAA;AACD,EAAA;AAEO,EAAA;AACR;AAIiB;AACqC,EAAA;AAE1B,EAAA;AACU,EAAA;AACtB,EAAA;AACX,EAAA;AAEwC,EAAA;AAC/B,IAAA;AACR,IAAA;AACoB,MAAA;AACZ,QAAA;AACT,UAAA;AACD,QAAA;AACD,MAAA;AACsB,MAAA;AACX,QAAA;AACT,UAAA;AACD,QAAA;AACD,MAAA;AAC2B,MAAA;AAChB,QAAA;AACT,UAAA;AACD,QAAA;AACD,MAAA;AAE4B,MAAA;AACmC,MAAA;AACf,MAAA;AACV,MAAA;AACS,MAAA;AAC/B,MAAA;AAGX,QAAA;AACyB,QAAA;AAC9B,MAAA;AACyB,MAAA;AACZ,QAAA;AACO,UAAA;AAClB,UAAA;AACuD,UAAA;AACtB,UAAA;AAEK,UAAA;AACzB,UAAA;AACA,UAAA;AACG,UAAA;AACE,UAAA;AACnB,QAAA;AACoC,QAAA;AAEG,QAAA;AACxC,MAAA;AAEiD,MAAA;AAC5B,QAAA;AACuC,UAAA;AAC3D,QAAA;AACA,MAAA;AAEa,MAAA;AACR,QAAA;AACL,QAAA;AACkB,QAAA;AAClB,QAAA;AACA,MAAA;AACD,MAAA;AACe,IAAA;AACH,MAAA;AACE,MAAA;AACR,QAAA;AACL,QAAA;AAC2B,QAAA;AAC3B,MAAA;AACmC,MAAA;AACrC,IAAA;AACD,EAAA;AAEe,EAAA;AACT,IAAA;AACL,IAAA;AAC+B,IAAA;AAC/B,EAAA;AACK,EAAA;AACP;AR2WyE;AACA;ASlerD;AAWf;AA4Be;AAE0C,EAAA;AAE5C,EAAA;AACX,IAAA;AACkC,MAAA;AAClC,IAAA;AACiC,MAAA;AACjC,IAAA;AACkC,MAAA;AACvC,IAAA;AACuC,MAAA;AACxC,EAAA;AACD;AAIwB;AACkB,EAAA;AAChB,IAAA;AACO,MAAA;AACO,MAAA;AAAA;AAEpC,QAAA;AAC0B,MAAA;AACE,IAAA;AACX,MAAA;AACmB,MAAA;AAAA;AAEpC,QAAA;AACyC,MAAA;AACZ,IAAA;AACX,MAAA;AACkB,MAAA;AAAA;AAEpC,QAAA;AACyC,MAAA;AACpC,IAAA;AAC2C,MAAA;AAClD,IAAA;AACD,EAAA;AAE8C,EAAA;AAC/C;AAM+D;AAErC,EAAA;AACrB,EAAA;AACA,EAAA;AACe,IAAA;AAAA;AAEjB,MAAA;AAAA,IAAA;AAEW,IAAA;AACC,EAAA;AACE,IAAA;AACT,MAAA;AACoB,MAAA;AACzB,IAAA;AACa,IAAA;AACf,EAAA;AAGqB,EAAA;AACjB,EAAA;AACA,EAAA;AACe,IAAA;AAAA;AAEjB,MAAA;AAAA,IAAA;AAEyB,IAAA;AACb,EAAA;AACE,IAAA;AACT,MAAA;AACoB,MAAA;AACzB,IAAA;AACa,IAAA;AACf,EAAA;AAGkE,EAAA;AACjE,IAAA;AACA,EAAA;AAGY,EAAA;AACW,EAAA;AACT,EAAA;AAAyC,IAAA;AACE,IAAA;AAC1D,EAAA;AACsB,EAAA;AAEI,EAAA;AACZ,IAAA;AACd,EAAA;AAEuC,EAAA;AACxC;AAMsC;AAEd,EAAA;AACnB,EAAA;AACA,EAAA;AACe,IAAA;AAAA;AAEjB,MAAA;AAAA,IAAA;AAEsB,IAAA;AACV,EAAA;AACE,IAAA;AACT,MAAA;AACoB,MAAA;AACzB,IAAA;AACa,IAAA;AACf,EAAA;AAEa,EAAA;AACW,EAAA;AAGgB,EAAA;AACiB,EAAA;AAE/B,EAAA;AAC3B;AAMsC;AAEf,EAAA;AAClB,EAAA;AACA,EAAA;AACe,IAAA;AAAA;AAEjB,MAAA;AAAA,IAAA;AAEwB,IAAA;AACZ,EAAA;AACE,IAAA;AACT,MAAA;AACoB,MAAA;AACzB,IAAA;AACa,IAAA;AACf,EAAA;AAE2D,EAAA;AAE9C,EAAA;AACW,EAAA;AAId,EAAA;AACE,IAAA;AACX,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACwD,EAAA;AAE/B,EAAA;AAC3B;ATsZyE;AACA;AU9mBvD;AVgnBuD;AACA;AWjnBvD;AASS;AAEe;AACqB,EAAA;AAC5B,EAAA;AACI,IAAA;AACH,IAAA;AAE0B,IAAA;AACpC,MAAA;AACD,MAAA;AACrB,QAAA;AACD,MAAA;AACD,IAAA;AAEO,IAAA;AACP,EAAA;AAAA;AAGkE,EAAA;AACrC,EAAA;AAC9B;AXumBwE;AACA;AYtoBvD;AAGoD;AAG7D;AACmB,EAAA;AACZ,EAAA;AACqC,EAAA;AACd,EAAA;AACC,EAAA;AACe,EAAA;AACX,EAAA;AACE,EAAA;AAEnC;AAEoC;AAAA;AAEM,EAAA;AAI1C,EAAA;AAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBxB,EAAA;AAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYxB,EAAA;AAAqB;AAAA;AAAA;AAKjD;AZsnBwE;AACA;AUnpB3C;AACpB,EAAA;AACoB,EAAA;AAC9B;AAGkE;AAML;AAGpB;AACK,EAAA;AACD,EAAA;AAC5C;AAG+C;AACI,EAAA;AACE,EAAA;AACrD;AAIO;AACN,EAAA;AACS,EAAA;AACC,IAAA;AACT,EAAA;AAGqB;AACW,EAAA;AACwB,EAAA;AAClD,EAAA;AACP;AAKO;AAAA;AAEiD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASI,EAAA;AAAA;AAAA;AAIA,EAAA;AAAA;AAGG,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQD,EAAA;AAChB,IAAA;AACf,IAAA;AACtB,MAAA;AACR,IAAA;AAEqD,IAAA;AAChC,IAAA;AACP,MAAA;AACN,QAAA;AAEL,QAAA;AACD,MAAA;AACM,MAAA;AACR,IAAA;AAEc,IAAA;AACd,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO0D,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOuC,EAAA;AAAA;AAAA;AAAA;AAMtC,EAAA;AACiC,IAAA;AACT,IAAA;AAGb,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBQ,EAAA;AAIe,EAAA;AAIf,EAAA;AACmC,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAchC,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQgB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMH,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMd,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ4B,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASpB,EAAA;AAAgB;AAAA;AAAA;AAAA;AAAA;AAY5C,EAAA;AAA4C;AAKtC,EAAA;AAAqC;AAAA;AAAA;AAAA;AAAA;AAMT,EAAA;AAAA;AAGE,EAAA;AACd,IAAA;AAChC,EAAA;AACoC,EAAA;AACT,IAAA;AAC3B,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBS,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ6C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,IAAA;AAG5C,EAAA;AACQ,IAAA;AACtB,EAAA;AAEwB;AAjT7B,EAAA;AAkTyB,EAAA;AAEP,EAAA;AAE4C,EAAA;AAC9C,IAAA;AACN,MAAA;AAEL,MAAA;AAE2B,MAAA;AAG5B,IAAA;AACF,EAAA;AAII,EAAA;AAKqB,EAAA;AACL,IAAA;AACA,IAAA;AACC,IAAA;AACJ,IAAA;AAEd,EAAA;AAKuC,EAAA;AAC5B,IAAA;AACN,MAAA;AACG,MAAA;AACT,IAAA;AACF,EAAA;AAGoE,EAAA;AACtD,IAAA;AACN,MAAA;AAEL,MAAA;AACD,IAAA;AACF,EAAA;AAG4B,EAAA;AACpB,IAAA;AACA,IAAA;AACR,EAAA;AAGI,EAAA;AAI+B,EAAA;AACZ,IAAA;AACvB,EAAA;AAGiB,EAAA;AAEa,EAAA;AAI3B,EAAA;AAC4B,IAAA;AACS,IAAA;AAErC,EAAA;AAIoB,EAAA;AAGT,IAAA;AACN,MAAA;AACqD,MAAA;AACtB,MAAA;AACrC,IAAA;AACF,EAAA;AAIC,EAAA;AAIuB,EAAA;AAEvB,EAAA;AAGM,EAAA;AACH,IAAA;AACH,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACY,IAAA;AACD,MAAA;AACV,MAAA;AACD,IAAA;AACD,EAAA;AACA;AAUuD;AAC1C,EAAA;AAC8B,IAAA;AACH,MAAA;AACO,MAAA;AACM,MAAA;AACT,MAAA;AAEH,MAAA;AACA,MAAA;AACrB,MAAA;AACZ,QAAA;AACuB,UAAA;AACG,UAAA;AACF,UAAA;AACI,UAAA;AAClC,QAAA;AACU,QAAA;AACT,UAAA;AAC2C,YAAA;AACG,YAAA;AACpC,YAAA;AACV,UAAA;AACA,UAAA;AACoC,YAAA;AACa,YAAA;AACvC,YAAA;AACV,UAAA;AACA,UAAA;AACyC,YAAA;AAC9B,YAAA;AACD,YAAA;AACV,UAAA;AACD,QAAA;AACD,MAAA;AAEoC,MAAA;AACA,MAAA;AACL,MAAA;AAC/B,IAAA;AACF,EAAA;AACD;AAOS;AACwD,EAAA;AAGpD,EAAA;AAIT,EAAA;AACA,IAAA;AACD,EAAA;AAIU,EAAA;AAIT,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAEQ;AAGF;AAIL,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACoD,IAAA;AACrD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAEuD;AAGjD;AAII,EAAA;AAIA,EAAA;AAIA,EAAA;AAIA,EAAA;AAE6B;AAGjC;AACiC,EAAA;AACvC,IAAA;AACD,EAAA;AAGwC;AAGjC;AAGL,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIU,EAAA;AACH,EAAA;AAEC,EAAA;AAC0B,IAAA;AAChC,MAAA;AACD,IAAA;AAGiC,EAAA;AAIjC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AAIU,EAAA;AAIA,EAAA;AAIA,EAAA;AAIT,EAAA;AACA,IAAA;AACD,EAAA;AAIC,EAAA;AACA,IAAA;AACD,EAAA;AACqC,EAAA;AACrC,IAAA;AACD,EAAA;AAC+C,EAAA;AACV,EAAA;AAEM;AV4a4B;AACA;Aa9kCxC;AbglCwC;AACA;Ac3/BZ;AACE,EAAA;AAC/D;AAKS;AA7FT,EAAA;AAiGK,EAAA;AAMA,EAAA;AACS,EAAA;AACN,IAAA;AACP,EAAA;AAEgB,EAAA;AAIW,EAAA;AAG0C,IAAA;AACrE,EAAA;AACM,EAAA;AACP;AAEwD;AAChB,EAAA;AAChB,IAAA;AACvB,EAAA;AAC6B,EAAA;AACgB,IAAA;AAC7C,EAAA;AAC6B,EAAA;AACD,IAAA;AACU,MAAA;AACrC,IAAA;AACwC,IAAA;AACzC,EAAA;AAC6B,EAAA;AACU,IAAA;AACvC,EAAA;AAC8B,EAAA;AACe,IAAA;AAC7C,EAAA;AAC+B,EAAA;AACqB,IAAA;AACpD,EAAA;AACgE,EAAA;AACjE;AAE6D;AAC5B,EAAA;AACH,EAAA;AACb,EAAA;AAC2B,EAAA;AACtB,IAAA;AACA,IAAA;AACnB,MAAA;AACD,IAAA;AACa,IAAA;AACS,IAAA;AACvB,EAAA;AACO,EAAA;AACR;AAKW;AACY,EAAA;AACD,IAAA;AACrB,EAAA;AAE6B,EAAA;AACH,EAAA;AACD,IAAA;AACzB,EAAA;AAE+C,EAAA;AACR,IAAA;AACX,IAAA;AACD,MAAA;AAC1B,IAAA;AACD,EAAA;AAEO,EAAA;AACR;AAK4B;AACD,EAAA;AAClB,IAAA;AACR,EAAA;AAE2B,EAAA;AACqB,IAAA;AAChD,EAAA;AAEqD,EAAA;AACtB,EAAA;AACgC,IAAA;AAC/D,EAAA;AAEkC,EAAA;AACe,IAAA;AACvB,IAAA;AACyB,MAAA;AAClD,IAAA;AAC4B,IAAA;AAC5B,EAAA;AACF;AAI8B;AACR,EAAA;AACT,EAAA;AAEmB,EAAA;AAExB,EAAA;AAC0D,IAAA;AACV,IAAA;AACA,IAAA;AACO,IAAA;AACnB,IAAA;AACY,IAAA;AACJ,IAAA;AAC3B,IAAA;AACtB,MAAA;AACA,MAAA;AACD,IAAA;AACwB,IAAA;AACvB,MAAA;AACA,MAAA;AACD,IAAA;AACuB,IAAA;AACtB,MAAA;AACA,MAAA;AACD,IAAA;AACuD,IAAA;AACxD,EAAA;AACD;AAEsB;AACX,EAAA;AACA,EAAA;AACkB,EAAA;AAER,EAAA;AACD,IAAA;AACP,MAAA;AACT,QAAA;AACD,MAAA;AACD,IAAA;AAEK,IAAA;AACU,IAAA;AACF,IAAA;AACE,MAAA;AACb,QAAA;AACD,MAAA;AACW,MAAA;AACN,MAAA;AACmB,MAAA;AACe,QAAA;AACR,QAAA;AACtB,UAAA;AACR,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAE0D,EAAA;AACvC,IAAA;AACjB,MAAA;AACD,IAAA;AACe,IAAA;AACO,IAAA;AAC2C,MAAA;AACjE,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAIkB;AACgB,EAAA;AAC7B,EAAA;AACiC,EAAA;AAKF,EAAA;AACyB,IAAA;AAChC,IAAA;AACnB,MAAA;AACyB,QAAA;AACF,QAAA;AACpB,QAAA;AACT,QAAA;AACD,MAAA;AACD,IAAA;AAE2B,IAAA;AACvB,IAAA;AAC8C,MAAA;AACM,MAAA;AACb,MAAA;AAChB,QAAA;AAC1B,MAAA;AACO,MAAA;AACQ,IAAA;AAC0B,MAAA;AACxC,IAAA;AACO,MAAA;AACT,IAAA;AACD,EAAA;AAEO,EAAA;AAIW,IAAA;AACW,MAAA;AACvB,MAAA;AACA,MAAA;AAC6B,QAAA;AACjB,MAAA;AAC0B,QAAA;AACxC,MAAA;AACO,QAAA;AACT,MAAA;AACe,MAAA;AACd,QAAA;AACD,MAAA;AAC+B,MAAA;AACF,QAAA;AAC7B,MAAA;AACD,IAAA;AAIgC,IAAA;AACO,MAAA;AACvC,IAAA;AAC+D,IAAA;AAC/B,MAAA;AAChC,IAAA;AACkD,IAAA;AACQ,MAAA;AAClC,MAAA;AACxB,IAAA;AAC4C,IAAA;AAhW9C,MAAA;AAiWiC,MAAA;AAC/B,IAAA;AAC6B,IAAA;AACsB,MAAA;AAC5C,MAAA;AACP,IAAA;AACD,EAAA;AACD;AAEoE;AACjD,EAAA;AACjB,IAAA;AACD,EAAA;AACY,EAAA;AACJ,IAAA;AACR,EAAA;AAEqB,EAAA;AACT,EAAA;AACJ,IAAA;AACR,EAAA;AAGmB,EAAA;AAGM,IAAA;AACzB,EAAA;AACO,EAAA;AACR;Ad+7ByE;AACA;AerpC9C;AACnB,EAAA;AACR;AfupCyE;AACA;AgBpxCH;AAC9D,EAAA;AACR;AAEyE;AACjE,EAAA;AACR;AAE8E;AACtE,EAAA;AACR;AAE4D;AACpD,EAAA;AACR;AAEqE;AAC7D,EAAA;AACR;AAI2B;AACnB,EAAA;AACR;AAEsE;AAC9D,EAAA;AACR;AAE8E;AACtE,EAAA;AACR;AAI0C;AACrB,EAAA;AACd,IAAA;AACkB,MAAA;AAClB,IAAA;AAC2C,MAAA;AAC3C,IAAA;AACiD,MAAA;AACjD,IAAA;AAC8C,MAAA;AAC9C,IAAA;AAC2D,MAAA;AACjE,EAAA;AACD;AAE+E;AAC1D,EAAA;AACZ,IAAA;AACR,EAAA;AACsD,EAAA;AACvD;AAEmD;AAC1B,EAAA;AACzB;AAIoD;AACrC,EAAA;AACN,IAAA;AACR,EAAA;AACO,EAAA;AACH,IAAA;AAC+C,IAAA;AACnD,EAAA;AACD;AAIkD;AAC1C,EAAA;AACH,IAAA;AACkD,IAAA;AACG,IAAA;AACpD,MAAA;AAC2B,MAAA;AAC7B,IAAA;AACH,EAAA;AACD;AAKE;AACM,EAAA;AACqB,IAAA;AACI,IAAA;AAChC,EAAA;AACD;AAE+E;AACvE,EAAA;AACe,IAAA;AACI,IAAA;AACA,IAAA;AACU,IAAA;AACQ,IAAA;AACqB,IAAA;AACjD,MAAA;AAGV,QAAA;AACJ,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAEoD;AACnC,iBAAA;AAEhB,EAAA;AACwD,EAAA;AAElB,EAAA;AACpB,IAAA;AAClB,EAAA;AAEoD,EAAA;AACT,IAAA;AACJ,IAAA;AACvB,IAAA;AACW,MAAA;AACQ,MAAA;AAClC,IAAA;AACO,IAAA;AACR,EAAA;AAEiC,EAAA;AACyB,IAAA;AAC1D,EAAA;AAMQ,EAAA;AAC2D,IAAA;AACnE,EAAA;AAKiB,EAAA;AAC6B,IAAA;AAC9C,EAAA;AAEgE,EAAA;AACrB,IAAA;AAC3C,EAAA;AAI+B,EAAA;AAG7B,IAAA;AAEF,EAAA;AAIyC,EAAA;AACiB,IAAA;AAClD,IAAA;AACW,MAAA;AACC,MAAA;AACH,MAAA;AAChB,IAAA;AACD,EAAA;AAIyC,EAAA;AACa,IAAA;AAC9C,IAAA;AACW,MAAA;AACC,MAAA;AACH,MAAA;AAChB,IAAA;AACD,EAAA;AAIyC,EAAA;AACY,IAAA;AAC7C,IAAA;AACW,MAAA;AACC,MAAA;AACH,MAAA;AAChB,IAAA;AACD,EAAA;AAMC,EAAA;AAGwC,IAAA;AACA,MAAA;AACvC,MAAA;AACqC,MAAA;AACrC,MAAA;AACD,IAAA;AACD,EAAA;AAKsB,EAAA;AACd,IAAA;AAC+C,MAAA;AACtD,IAAA;AACD,EAAA;AAEmD,EAAA;AACN,IAAA;AAC7C,EAAA;AAMsB,EAAA;AACK,IAAA;AACzB,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAEkE,EAAA;AACjB,IAAA;AACjD,EAAA;AAE8D,EAAA;AACrB,IAAA;AACzC,EAAA;AAKQ,EAAA;AAC8C,IAAA;AACtD,EAAA;AAE4C,EAAA;AACJ,IAAA;AACxC,EAAA;AAEuD,EAAA;AACT,IAAA;AAC9C,EAAA;AAEqD,EAAA;AACT,IAAA;AAC5C,EAAA;AAKQ,EAAA;AACuC,IAAA;AAC/C,EAAA;AAKQ,EAAA;AACmC,IAAA;AAC3C,EAAA;AAKiB,EAAA;AACuC,IAAA;AACxD,EAAA;AAEgD,EAAA;AACI,IAAA;AACpD,EAAA;AAMgB,EAAA;AACkB,IAAA;AACd,MAAA;AAClB,MAAA;AACD,IAAA;AACD,EAAA;AAMgB,EAAA;AACkB,IAAA;AACd,MAAA;AAClB,MAAA;AACD,IAAA;AACD,EAAA;AAKiB,EAAA;AAC+C,IAAA;AAChE,EAAA;AAKQ,EAAA;AACiD,IAAA;AACzD,EAAA;AAEsE,EAAA;AACN,IAAA;AAChE,EAAA;AAEmE,EAAA;AAC3D,IAAA;AACN,MAAA;AACwB,IAAA;AAC1B,EAAA;AAKiB,EAAA;AACgB,IAAA;AACA,MAAA;AAChC,IAAA;AACD,EAAA;AAEyC,EAAA;AACC,IAAA;AAC1C,EAAA;AAE2C,EAAA;AACJ,IAAA;AACvC,EAAA;AAEkC,EAAA;AACI,IAAA;AACtC,EAAA;AAE6C,EAAA;AACJ,IAAA;AACzC,EAAA;AAE0C,EAAA;AACT,IAAA;AACjC,EAAA;AAE4C,EAAA;AACT,IAAA;AACnC,EAAA;AAEuD,EAAA;AACT,IAAA;AAC9C,EAAA;AAEkD,EAAA;AACV,IAAA;AACxC,EAAA;AAMuB,EAAA;AACkB,IAAA;AACpB,MAAA;AACM,MAAA;AAC1B,IAAA;AACD,EAAA;AAMQ,EAAA;AACqD,IAAA;AAC7D,EAAA;AAEyE,EAAA;AAC7B,IAAA;AAC5C,EAAA;AAIoB,EAAA;AAC+C,IAAA;AACnE,EAAA;AAIiB,EAAA;AACoD,IAAA;AACrE,EAAA;AAEyE,EAAA;AAC7B,IAAA;AAC5C,EAAA;AAEqD,EAAA;AACJ,IAAA;AACjD,EAAA;AAEmE,EAAA;AACnB,IAAA;AAChD,EAAA;AAKQ,EAAA;AACuC,IAAA;AAC/C,EAAA;AAEmD,EAAA;AACJ,IAAA;AAC/C,EAAA;AAEsD,EAAA;AACT,IAAA;AAC7C,EAAA;AAEsD,EAAA;AACT,IAAA;AAC7C,EAAA;AAE6D,EAAA;AACJ,IAAA;AACzD,EAAA;AAE2E,EAAA;AACnB,IAAA;AACxD,EAAA;AAKgC,EAAA;AACkC,IAAA;AAClE,EAAA;AAMiB,EAAA;AAGS,IAAA;AAC1B,EAAA;AAKiB,EAAA;AAC6C,IAAA;AAC9D,EAAA;AAMiB,EAAA;AAGgB,IAAA;AACjC,EAAA;AAM6B,EAAA;AAGF,IAAA;AAC3B,EAAA;AAO6B,EAAA;AAGH,IAAA;AAC1B,EAAA;AAKmD,EAAA;AAG9B,IAAA;AACrB,EAAA;AAKiB,EAAA;AAGO,IAAA;AACxB,EAAA;AAKiB,EAAA;AAGO,IAAA;AACxB,EAAA;AAKiC,EAAA;AACS,IAAA;AAC1C,EAAA;AAMoC,EAAA;AACM,IAAA;AACxC,MAAA;AAC0B,MAAA;AAC3B,IAAA;AAC8C,IAAA;AAC/C,EAAA;AAMkC,EAAA;AACA,IAAA;AAChC,MAAA;AAC0B,MAAA;AAC3B,IAAA;AACD,EAAA;AAMgC,EAAA;AACsC,IAAA;AACtE,EAAA;AAEyC,EAAA;AA3mB1C,IAAA;AA4mBS,IAAA;AACR,EAAA;AAEgE,EAAA;AA/mBjE,IAAA;AAgnBS,IAAA;AACR,EAAA;AAE4D,EAAA;AACjB,IAAA;AACF,IAAA;AACzB,IAAA;AACd,MAAA;AACD,IAAA;AAE0B,IAAA;AACL,IAAA;AACtB,EAAA;AAMgC,EAAA;AACxB,IAAA;AAGoB,MAAA;AAC3B,IAAA;AACD,EAAA;AAMkC,EAAA;AAG/B,IAAA;AACA,MAAA;AAC6C,MAAA;AAC9C,IAAA;AACqC,IAAA;AACvC,EAAA;AAOgC,EAAA;AACxB,IAAA;AAGJ,MAAA;AACA,QAAA;AACA,QAAA;AAC6C,QAAA;AAC9C,MAAA;AACF,IAAA;AACD,EAAA;AAOiB,EAAA;AAGd,IAAA;AACA,MAAA;AACA,MAAA;AAC6C,MAAA;AAC9C,IAAA;AACF,EAAA;AAQgC,EAAA;AAG7B,IAAA;AACA,MAAA;AACiB,MAAA;AACjB,MAAA;AAC6C,MAAA;AAC9C,IAAA;AACF,EAAA;AAKyB,EAAA;AAIlB,IAAA;AACP,EAAA;AAEmD,EAAA;AACD,IAAA;AAClD,EAAA;AAEyD,EAAA;AACO,IAAA;AAChE,EAAA;AAOQ,EAAA;AAGyB,IAAA;AACjC,EAAA;AAOQ,EAAA;AAGuB,IAAA;AAC/B,EAAA;AAEiC,EAAA;AACH,IAAA;AAC9B,EAAA;AAE2C,EAAA;AACT,IAAA;AAClC,EAAA;AAE0C,EAAA;AACT,IAAA;AACjC,EAAA;AAE0D,EAAA;AACV,IAAA;AAChD,EAAA;AAE8C,EAAA;AACJ,IAAA;AAC1C,EAAA;AAEmE,EAAA;AAClB,IAAA;AACjD,EAAA;AAKiB,EAAA;AAC0B,IAAA;AAC3C,EAAA;AAMQ,EAAA;AAC8C,IAAA;AACtD,EAAA;AAMiB,EAAA;AAC8B,IAAA;AAC/C,EAAA;AAKQ,EAAA;AACwC,IAAA;AAChD,EAAA;AACD;AAOG;AACmE,EAAA;AAC9D,EAAA;AACN,IAAA;AACqC,IAAA;AACtC,EAAA;AACD;AhB+8ByE;AACA;AiBxvDjD;AAaX;AACU,EAAA;AACd,IAAA;AACR,EAAA;AAE0E,EAAA;AACrD,EAAA;AAC+C,IAAA;AACpE,EAAA;AAC8D,EAAA;AAC/D;AAKW;AACG,EAAA;AACL,IAAA;AACR,EAAA;AAEe,EAAA;AACc,IAAA;AAC5B,IAAA;AACA,IAAA;AACD,EAAA;AACqB,EAAA;AACoC,IAAA;AACzD,EAAA;AACc,EAAA;AACf;AAMa;AACU,EAAA;AACd,IAAA;AACR,EAAA;AAE6C,EAAA;AACW,EAAA;AACnC,EAAA;AAC4C,IAAA;AACjE,EAAA;AAII,EAAA;AAEL;AAMW;AACY,EAAA;AACd,IAAA;AACR,EAAA;AAEqD,EAAA;AAChC,EAAA;AAC4C,IAAA;AACjE,EAAA;AACc,EAAA;AACf;AAMW;AACe,EAAA;AACZ,EAAA;AACL,IAAA;AACR,EAAA;AAEI,EAAA;AACiC,EAAA;AACZ,IAAA;AAGO,EAAA;AAKsB,IAAA;AACxB,IAAA;AACX,MAAA;AAClB,IAAA;AACD,EAAA;AAEqB,EAAA;AACb,IAAA;AACR,EAAA;AAEe,EAAA;AACW,IAAA;AACzB,IAAA;AACA,IAAA;AACD,EAAA;AACqB,EAAA;AACd,IAAA;AACU,MAAA;AACR,MAAA;AACR,IAAA;AACD,EAAA;AACc,EAAA;AACf;AAEwE;AACH,EAAA;AAC3D,IAAA;AACW,IAAA;AACnB,EAAA;AACF;AjBysDyE;AACA;AkB9xDP;AAC1D,EAAA;AACR;AAEqE;AAC7D,EAAA;AACR;AAE0E;AAClE,EAAA;AACR;AAEwD;AAChD,EAAA;AACR;AAEuE;AAC/D,EAAA;AACR;AAIyB;AACjB,EAAA;AACR;AAEoE;AAC5D,EAAA;AACR;AAE4E;AACpE,EAAA;AACR;AAEuE;AACtC,EAAA;AACjC;AAIuB;AACqB,EAAA;AACnC,IAAA;AACR,EAAA;AACoB,EAAA;AACrB;AAI6B;AACe,EAAA;AACnC,IAAA;AACR,EAAA;AACmD,EAAA;AACpD;AAEoD;AACA,EAAA;AACpD;AAEiE;AACzD,EAAA;AACgB,IAAA;AACI,IAAA;AAC3B,EAAA;AACD;AAIuB;AACf,EAAA;AACe,IAAA;AACI,IAAA;AACS,IAAA;AACC,IAAA;AACQ,IAAA;AACqB,IAAA;AAChB,MAAA;AAChD,IAAA;AACD,EAAA;AACD;AAE2D;AAC3B,EAAA;AACU,IAAA;AACzC,EAAA;AAE4B,EAAA;AACyB,IAAA;AACvC,IAAA;AACL,MAAA;AACR,IAAA;AACD,EAAA;AAKa,EAAA;AAGuC,IAAA;AACtC,IAAA;AACL,MAAA;AACR,IAAA;AACD,EAAA;AAEO,EAAA;AACR;AAEiE;AAC5D,EAAA;AACiB,IAAA;AACL,EAAA;AACqB,IAAA;AACrC,EAAA;AACD;AAE6C;AACxC,EAAA;AACW,IAAA;AACC,EAAA;AACqB,IAAA;AACrC,EAAA;AACD;AAEsD;AAC3C,EAAA;AACT,IAAA;AACA,IAAA;AAC0C,IAAA;AAC1C,IAAA;AACW,MAAA;AACA,QAAA;AACTC,QAAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAEyE;AAKvE,EAAA;AAEyC,IAAA;AAC1C,EAAA;AACiC,EAAA;AAClC;AAE6E;AACL,EAAA;AACxE;AAMc;AACA,EAAA;AAC8C,IAAA;AAC3D,EAAA;AACD;AAE0D;AACxB,EAAA;AAClC;AAEoD;AACnC,kBAAA;AAEhB,EAAA;AACyD,EAAA;AAErB,EAAA;AAClB,IAAA;AAClB,EAAA;AAEuD,EAAA;AAChB,IAAA;AACF,IAAA;AACrB,IAAA;AAC0C,MAAA;AACzB,MAAA;AAChC,IAAA;AACO,IAAA;AACR,EAAA;AAEiC,EAAA;AACzB,IAAA;AAC4C,MAAA;AACnD,IAAA;AACD,EAAA;AAMQ,EAAA;AACP,IAAA;AAC8D,MAAA;AAC9D,IAAA;AACD,EAAA;AAKiB,EAAA;AAC2C,IAAA;AAC5D,EAAA;AAEgE,EAAA;AACP,IAAA;AACzD,EAAA;AAE8D,EAAA;AACtD,IAAA;AACE,MAAA;AACsC,MAAA;AACtB,MAAA;AACR,QAAA;AACN,UAAA;AACC,UAAA;AACA,UAAA;AACT,QAAA;AACF,MAAA;AACD,IAAA;AACD,EAAA;AAMC,EAAA;AAGa,IAAA;AACW,MAAA;AACvB,MAAA;AACA,MAAA;AACA,MAAA;AACmC,MAAA;AACnC,MAAA;AACD,IAAA;AACD,EAAA;AAKsB,EAAA;AACd,IAAA;AACNC,MAAAA;AACkD,QAAA;AAClD,MAAA;AACD,IAAA;AACD,EAAA;AAEmD,EAAA;AAC3C,IAAA;AAEgC,MAAA;AACvC,IAAA;AACD,EAAA;AAEkE,EAAA;AACC,IAAA;AACnE,EAAA;AAE8D,EAAA;AACH,IAAA;AAC3D,EAAA;AAKQ,EAAA;AACP,IAAA;AACoD,MAAA;AACpD,IAAA;AACD,EAAA;AAEkD,EAAA;AAC1C,IAAA;AACN,MAAA;AACuB,QAAA;AACtB,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAEuD,EAAA;AACE,IAAA;AACzD,EAAA;AAEqD,EAAA;AACE,IAAA;AACvD,EAAA;AAKQ,EAAA;AACP,IAAA;AACuB,MAAA;AACtB,MAAA;AAC8B,MAAA;AAC/B,IAAA;AACD,EAAA;AAKQ,EAAA;AACgD,IAAA;AACxD,EAAA;AAKiB,EAAA;AACV,IAAA;AACiB,MAAA;AACtB,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAE0E,EAAA;AACX,IAAA;AAC/D,EAAA;AAMgB,EAAA;AACR,IAAA;AACN,MAAA;AACuB,QAAA;AACtB,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAMgB,EAAA;AACR,IAAA;AACN,MAAA;AACuB,QAAA;AACtB,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAKiB,EAAA;AACV,IAAA;AACiB,MAAA;AACtB,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAKQ,EAAA;AAC8D,IAAA;AACtE,EAAA;AAEsE,EAAA;AAC9D,IAAA;AACgB,MAAA;AACtB,MAAA;AACD,IAAA;AACD,EAAA;AAEmE,EAAA;AACC,IAAA;AACpE,EAAA;AAKiB,EAAA;AACmD,IAAA;AACpE,EAAA;AAEyC,EAAA;AACY,IAAA;AACrD,EAAA;AAE2C,EAAA;AACO,IAAA;AAClD,EAAA;AAE4D,EAAA;AACX,IAAA;AACjD,EAAA;AAE6C,EAAA;AACO,IAAA;AACpD,EAAA;AAE0C,EAAA;AACE,IAAA;AAC5C,EAAA;AAE4C,EAAA;AACE,IAAA;AAC9C,EAAA;AAEuD,EAAA;AACE,IAAA;AACzD,EAAA;AAEkD,EAAA;AACC,IAAA;AACnD,EAAA;AAMuB,EAAA;AACT,IAAA;AACU,MAAA;AACtB,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAMQ,EAAA;AACoD,IAAA;AAC5D,EAAA;AAEyE,EAAA;AAChB,IAAA;AACzD,EAAA;AAIoB,EAAA;AACN,IAAA;AACU,MAAA;AACtB,MAAA;AACD,IAAA;AACD,EAAA;AAIiB,EAAA;AACV,IAAA;AACiB,MAAA;AACtB,MAAA;AACD,IAAA;AACD,EAAA;AAEyE,EAAA;AAClC,IAAA;AACuB,IAAA;AAE7C,IAAA;AAC8B,MAAA;AAE7B,IAAA;AACiC,IAAA;AACnD,EAAA;AAEqD,EAAA;AACe,IAAA;AACpE,EAAA;AAEmE,EAAA;AACN,IAAA;AAC7D,EAAA;AAKQ,EAAA;AACoD,IAAA;AAC5D,EAAA;AAEmD,EAAA;AACO,IAAA;AAC1D,EAAA;AAEsD,EAAA;AACN,IAAA;AACF,IAAA;AACQ,MAAA;AACrD,IAAA;AACD,EAAA;AAEsD,EAAA;AACE,IAAA;AACxD,EAAA;AAE6D,EAAA;AACO,IAAA;AACpE,EAAA;AAE2E,EAAA;AACN,IAAA;AACrE,EAAA;AAKgC,EAAA;AACqB,IAAA;AACM,IAAA;AAC3D,EAAA;AAMiB,EAAA;AACoC,IAAA;AACT,IAAA;AAC5C,EAAA;AAKiB,EAAA;AACoC,IAAA;AACb,IAAA;AACxC,EAAA;AAMiB,EAAA;AACoC,IAAA;AACD,IAAA;AACpD,EAAA;AAM6B,EAAA;AACwB,IAAA;AAC9B,IAAA;AACrB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACmC,IAAA;AACpC,EAAA;AAO6B,EAAA;AACwB,IAAA;AAC9B,IAAA;AACrB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACmC,IAAA;AACpC,EAAA;AAKmD,EAAA;AACE,IAAA;AAG9B,IAAA;AACR,IAAA;AACwC,MAAA;AACtD,IAAA;AACD,EAAA;AAKiB,EAAA;AACoC,IAAA;AACP,IAAA;AAC9C,EAAA;AAKiB,EAAA;AACoC,IAAA;AACP,IAAA;AAC9C,EAAA;AAKiC,EAAA;AACyB,IAAA;AAC1D,EAAA;AAMoC,EAAA;AACd,IAAA;AACmB,MAAA;AACxC,IAAA;AAC8C,IAAA;AAC/C,EAAA;AAMkC,EAAA;AACiC,IAAA;AACnE,EAAA;AAMgC,EAAA;AACiC,IAAA;AACjE,EAAA;AAEyC,EAAA;AApsB1C,IAAA;AAqsBS,IAAA;AACR,EAAA;AAEgE,EAAA;AAxsBjE,IAAA;AAysBS,IAAA;AACR,EAAA;AAE4D,EAAA;AACrB,IAAA;AACA,IAAA;AACvB,IAAA;AACd,MAAA;AACD,IAAA;AAEwB,IAAA;AACa,IAAA;AACtC,EAAA;AAMgC,EAAA;AAC2B,IAAA;AACnD,IAAA;AACyC,MAAA;AAChD,IAAA;AACD,EAAA;AAMkC,EAAA;AACyB,IAAA;AACnC,IAAA;AACtBC,MAAAA;AACA,MAAA;AACA,MAAA;AAC2C,MAAA;AAC5C,IAAA;AACyC,IAAA;AAC1C,EAAA;AAOgC,EAAA;AAC2B,IAAA;AACnD,IAAA;AACA,MAAA;AACLA,QAAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAC2C,QAAA;AAC5C,MAAA;AACD,IAAA;AACD,EAAA;AAOiB,EAAA;AAC0C,IAAA;AACpD,IAAA;AACLA,MAAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAQgC,EAAA;AAC2B,IAAA;AACnD,IAAA;AACA,MAAA;AACLA,QAAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAC2C,QAAA;AAC5C,MAAA;AACD,IAAA;AACD,EAAA;AAKyB,EAAA;AACkC,IAAA;AACnD,IAAA;AACNA,MAAAA;AACA,MAAA;AACA,MAAA;AAC0B,IAAA;AAC5B,EAAA;AAEmD,EAAA;AACQ,IAAA;AACxB,IAAA;AACnC,EAAA;AAIyC,EAAA;AACkB,IAAA;AACL,IAAA;AACtD,EAAA;AAOQ,EAAA;AACyD,IAAA;AACE,IAAA;AACnE,EAAA;AAOQ,EAAA;AACyD,IAAA;AACI,IAAA;AACrE,EAAA;AAEiC,EAAA;AACQ,IAAA;AACzC,EAAA;AAE2C,EAAA;AACW,IAAA;AACtD,EAAA;AAE0C,EAAA;AACW,IAAA;AACrD,EAAA;AAE0D,EAAA;AACX,IAAA;AAC/C,EAAA;AAE8C,EAAA;AACO,IAAA;AACrD,EAAA;AAEmE,EAAA;AACnB,IAAA;AAChD,EAAA;AAKiB,EAAA;AAC4C,IAAA;AAC7D,EAAA;AAMQ,EAAA;AAC6C,IAAA;AACrD,EAAA;AAMiB,EAAA;AACgD,IAAA;AACjE,EAAA;AAKQ,EAAA;AACP,IAAA;AACmB,MAAA;AAClB,MAAA;AACkC,MAAA;AACa,QAAA;AACpC,UAAA;AACLC,YAAAA;AACkD,YAAA;AACrD,UAAA;AACD,UAAA;AACD,QAAA;AACc,QAAA;AACf,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAOG;AAGM,EAAA;AACgC,EAAA;AACjC,EAAA;AACN,IAAA;AACqC,IAAA;AACtC,EAAA;AACD;AlB++CyE;AACA;Aar0EtD;AACE;Abu0EoD;AACA;AmBz5EpD;AAmBhB;AACqC,EAAA;AACjC,IAAA;AACR,EAAA;AAEO,EAAA;AACN,IAAA;AACM,IAAA;AACO,MAAA;AACb,IAAA;AACA,IAAA;AAAA;AAAA;AAAA;AAI8C,MAAA;AAC7B,QAAA;AACR,QAAA;AACR,MAAA;AACD,IAAA;AACD,EAAA;AACD;AnBw4EyE;AACA;Aa51ErC;AACA;AAmBU;AACjC,EAAA;AACF,EAAA;AACE,EAAA;AACb;AAEsD;AACjB,EAAA;AAChC,EAAA;AACgB,IAAA;AACZ,EAAA;AAER,EAAA;AACD;AAEqD;AAvHrD,EAAA;AAwHqB,EAAA;AAWnB,EAAA;AAEO,IAAA;AACR,EAAA;AAEO,EAAA;AACR;AAIe;AACI,EAAA;AACnB;AAEsE;AAC/C,EAAA;AAChB,IAAA;AACG,MAAA;AACH,IAAA;AACG,MAAA;AACT,EAAA;AAEU,EAAA;AACT,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACS,MAAA;AACI,MAAA;AACb,IAAA;AACD,EAAA;AACD;AAKwB;AACmB,EAAA;AACI,IAAA;AAC9C,EAAA;AAEI,EAAA;AACiC,IAAA;AAC7B,EAAA;AACsC,IAAA;AAC9C,EAAA;AACD;AAI2B;AAEyB,EAAA;AAEvB,EAAA;AACS,IAAA;AACrC,EAAA;AAE0B,EAAA;AACoB,IAAA;AAC9C,EAAA;AAEsC,EAAA;AACvC;AAI6B;AAtM7B,EAAA;AAuMkC,EAAA;AAClC;AAKkB;AA7MlB,EAAA;AA8M+B,EAAA;AACtB,IAAA;AACR,EAAA;AAEgD,EAAA;AACrC,IAAA;AACT,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACS,QAAA;AACI,QAAA;AACwC,QAAA;AACrD,MAAA;AACD,IAAA;AACD,EAAA;AAEO,EAAA;AACH,IAAA;AACK,IAAA;AACG,MAAA;AACD,MAAA;AACV,IAAA;AACM,IAAA;AACK,MAAA;AACuB,MAAA;AAClB,MAAA;AAChB,IAAA;AACD,EAAA;AACD;AAKkB;AACsD,EAAA;AACxE;AAoC2B;AACL,EAAA;AACS,IAAA;AAC9B,EAAA;AAC+B,EAAA;AACF,IAAA;AAC7B,EAAA;AACgC,EAAA;AACH,IAAA;AACpB,MAAA;AACY,MAAA;AACC,MAAA;AACrB,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAK2B;AAC+B,EAAA;AACtC,EAAA;AACwC,IAAA;AAC3D,EAAA;AACO,EAAA;AACR;AAEmE;AAIvD,EAAA;AAGZ;AAM0B;AAC8B,EAAA;AACC,EAAA;AACN,EAAA;AAClC,EAAA;AACH,IAAA;AACJ,MAAA;AACR,IAAA;AAC6C,IAAA;AAC9C,EAAA;AACO,EAAA;AACR;AAEmD;AACvC,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACD;AAEkD;AACtC,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAEmD;AACvC,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAE4C;AAChC,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAEsD;AAC1C,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAEwD;AAC5C,EAAA;AACV,IAAA;AACA,IAAA;AACA,IAAA;AACe,IAAA;AAChB,EAAA;AACD;AAE6E;AACpB,EAAA;AACtC,EAAA;AACwC,IAAA;AAC1D,EAAA;AACO,EAAA;AACR;AAKE;AAC6C,EAAA;AACjB,EAAA;AAC4B,IAAA;AACjC,MAAA;AACtB,IAAA;AACF,EAAA;AACD;AAE6E;AAC3B,EAAA;AACtB,EAAA;AAC1B,IAAA;AACD,EAAA;AAEoB,EAAA;AACE,EAAA;AACG,EAAA;AAC1B;AAKE;AACuD,EAAA;AACzD;AAKC;AAOiE,EAAA;AACnD,EAAA;AAC+B,IAAA;AACH,IAAA;AAGlC,IAAA;AACC,MAAA;AAC8B,MAAA;AAEnB,IAAA;AACH,MAAA;AACR,QAAA;AACsB,QAAA;AAC3B,MAAA;AACD,IAAA;AACF,IAAA;AACD,EAAA;AAEM,EAAA;AACsC,EAAA;AACH,EAAA;AACL,EAAA;AACrC;AAK6B;AAC2B,EAAA;AACzB,EAAA;AACf,EAAA;AACd,IAAA;AACD,EAAA;AAEmB,EAAA;AACG,EAAA;AACvB;AAKiB;AACuC,EAAA;AAC5B,EAAA;AACf,EAAA;AACX,IAAA;AACD,EAAA;AAE8B,EAAA;AAKlB,EAAA;AAGc,IAAA;AAC1B,EAAA;AACD;AAK2C;AACa,EAAA;AACnB,EAAA;AAChB,EAAA;AACZ,IAAA;AACR,EAAA;AAEsC,EAAA;AACO,IAAA;AACsB,IAAA;AACJ,IAAA;AACJ,IAAA;AAChB,IAAA;AACgB,IAAA;AACpB,IAAA;AACtC,EAAA;AACkB,EAAA;AACZ,EAAA;AACR;AAIgB;AACgB,EAAA;AACC,IAAA;AAChC,EAAA;AACiC,EAAA;AACzB,IAAA;AACR,EAAA;AAC2B,EAAA;AAC5B;AAE6E;AACN,EAAA;AACvE;AAEqE;AAChD,EAAA;AACb,IAAA;AACmB,IAAA;AAC1B,EAAA;AACD;AAgCyB;AACW,EAAA;AACV,EAAA;AACnB,IAAA;AACyB,MAAA;AACzB,IAAA;AACG,MAAA;AACR,IAAA;AAC0C,MAAA;AAC3C,EAAA;AACD;AAKc;AACkB,EAAA;AACvB,IAAA;AACR,EAAA;AACmC,EAAA;AACD,EAAA;AACiC,IAAA;AACnE,EAAA;AAC6B,EAAA;AAC9B;AAK2B;AACI,EAAA;AAChB,EAAA;AACR,IAAA;AAC2B,MAAA;AACZ,IAAA;AACyB,MAAA;AAC9B,MAAA;AACF,MAAA;AACb,IAAA;AACK,IAAA;AACG,MAAA;AACR,IAAA;AAC4C,MAAA;AAC7C,EAAA;AACD;AAE+E;AAC5B,EAAA;AACnD;AAEwD;AACrB,EAAA;AAC1B,IAAA;AACR,EAAA;AAE6B,EAAA;AAC9B;AAEmD;AACF,EAAA;AACjD;AAEkD;AAGb,EAAA;AAGrC;AAE6D;AACjB,EAAA;AACpC,IAAA;AACP,EAAA;AAEO,EAAA;AACR;AAE6D;AAC7B,EAAA;AACU,IAAA;AACzC,EAAA;AAE4B,EAAA;AACyB,IAAA;AACvC,IAAA;AACL,MAAA;AACR,IAAA;AACD,EAAA;AAKa,EAAA;AAGuC,IAAA;AACtC,IAAA;AACL,MAAA;AACR,IAAA;AACD,EAAA;AAEO,EAAA;AACR;AAIwC;AACN,EAAA;AACzB,IAAA;AACR,EAAA;AAKQ,EAAA;AAET;AAE0D;AAGtD,EAAA;AAEoE,EAAA;AAC9B,IAAA;AACxC,EAAA;AACiC,EAAA;AACV,IAAA;AACD,IAAA;AACI,IAAA;AAC1B,EAAA;AACF;AAEmE;AAC9D,EAAA;AACiB,IAAA;AACL,EAAA;AACuB,IAAA;AACvC,EAAA;AACD;AAE+C;AAC1C,EAAA;AACW,IAAA;AACC,EAAA;AACuB,IAAA;AACvC,EAAA;AACD;AAagE;AACC,EAAA;AAEnB,EAAA;AAMtC,EAAA;AAIR;AAQG;AACW,EAAA;AACJ,IAAA;AACT,EAAA;AAE8C,EAAA;AAE1B,EAAA;AACkB,IAAA;AACtB,IAAA;AAChB,EAAA;AAEyD,EAAA;AACH,EAAA;AAC/C,EAAA;AACN,IAAA;AACwD,IAAA;AACzD,EAAA;AACD;AAEsE;AAClD,EAAA;AACX,IAAA;AACR,EAAA;AAEI,EAAA;AACyC,IAAA;AACrC,EAAA;AACA,IAAA;AACR,EAAA;AACD;AAYE;AACgC,EAAA;AACS,IAAA;AACjC,MAAA;AACO,QAAA;AACA,QAAA;AACd,MAAA;AACD,IAAA;AAEO,IAAA;AACO,MAAA;AACR,MAAA;AACc,QAAA;AACK,QAAA;AACxB,MAAA;AACD,IAAA;AACA,EAAA;AACF;AAyBE;AACa,EAAA;AAC0C,IAAA;AACtD,MAAA;AACA,MAAA;AACgB,QAAA;AACyB,QAAA;AAC1B,QAAA;AACf,MAAA;AACA,IAAA;AACF,EAAA;AACD;AAuDK;AACc,EAAA;AACZ,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACsC,UAAA;AAC1B,UAAA;AACjB,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACoC,UAAA;AACpB,UAAA;AACsB,UAAA;AAC3C,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AAC8B,UAAA;AAClB,UAAA;AACjB,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACW,UAAA;AACqC,UAAA;AACrD,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACW,UAAA;AAChB,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACiD,UAAA;AACtD,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACa,UAAA;AACoC,UAAA;AACtD,QAAA;AACD,MAAA;AACI,IAAA;AACG,MAAA;AACI,QAAA;AACL,QAAA;AACmB,UAAA;AACA,UAAA;AACxB,QAAA;AACD,MAAA;AACF,EAAA;AACD;AA6BS;AACW,EAAA;AACX,IAAA;AACR,EAAA;AAEmD,EAAA;AAEnC,EAAA;AACuB,IAAA;AACG,IAAA;AAC9B,MAAA;AACwC,MAAA;AACP,MAAA;AAC1C,IAAA;AACoB,IAAA;AACuB,MAAA;AACtB,QAAA;AACpB,UAAA;AACA,UAAA;AACc,YAAA;AACD,YAAA;AACG,YAAA;AACyB,YAAA;AACR,YAAA;AAIhB,YAAA;AAGZ,YAAA;AAEgB,YAAA;AACrB,UAAA;AACD,QAAA;AACD,MAAA;AACD,IAAA;AACA,EAAA;AACF;AAE8C;AACjC,EAAA;AACN,IAAA;AAAU,MAAA;AAEJ,MAAA;AAIX,IAAA;AACD,EAAA;AACD;AAEkC;AACA,EAAA;AAClC;AAI2B;AACmB,EAAA;AACU,EAAA;AAC9B,IAAA;AACL,MAAA;AAClB,MAAA;AACD,IAAA;AAEwB,IAAA;AACA,IAAA;AACA,IAAA;AACzB,EAAA;AACO,EAAA;AACR;AAEoE;AACxC,EAAA;AACnB,IAAA;AACR,EAAA;AAKC,EAAA;AAIkD,IAAA;AACI,IAAA;AAC9C,MAAA;AAC6C,QAAA;AACpD,MAAA;AACD,IAAA;AACD,EAAA;AACQ,EAAA;AACT;AAIsC;AACL,EAAA;AAC3B,IAAA;AAC0B,MAAA;AACd,IAAA;AACsB,MAAA;AACtC,IAAA;AACD,EAAA;AACD;AAE4D;AACjB,EAAA;AACd,EAAA;AAC7B;AAOY;AAGU,EAAA;AAGjB,EAAA;AAEoB,EAAA;AACV,IAAA;AACC,IAAA;AACd,IAAA;AACA,EAAA;AACF;AAIgC;AAC8B,EAAA;AACL,EAAA;AACjD,EAAA;AACW,IAAA;AACjB,IAAA;AACA,IAAA;AACD,EAAA;AACD;AAQY;AACK,EAAA;AAEG,IAAA;AAEnB,EAAA;AACD;AAEwB;AACvB,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAQE,EAAA;AACe,IAAA;AACH,IAAA;AACG,IAAA;AACJ,IAAA;AACoB,IAAA;AAKD,IAAA;AAChB,MAAA;AACF,MAAA;AACK,QAAA;AACjB,MAAA;AACD,IAAA;AACiB,IAAA;AAClB,EAAA;AAEiB,EAAA;AACsB,IAAA;AACvC,EAAA;AAEsB,EAAA;AACd,IAAA;AACQ,MAAA;AACkC,MAAA;AACjD,IAAA;AACD,EAAA;AAE8B,EAAA;AACN,IAAA;AACxB,EAAA;AAEqB,EAAA;AACc,IAAA;AAC3B,IAAA;AACN,MAAA;AACe,MAAA;AACmC,QAAA;AAClD,MAAA;AACc,MAAA;AACiB,QAAA;AAC/B,MAAA;AACD,IAAA;AACD,EAAA;AAE0B,EAAA;AACE,IAAA;AACkB,IAAA;AAC9C,EAAA;AAEsC,EAAA;AACS,IAAA;AAC/C,EAAA;AAE8B,EAAA;AACtB,IAAA;AACqC,MAAA;AAC5C,IAAA;AACD,EAAA;AAE6C,EAAA;AACtB,IAAA;AACP,MAAA;AACd,MAAA;AACA,MAAA;AACD,IAAA;AACA,IAAA;AACe,MAAA;AACR,QAAA;AACL,QAAA;AACyB,QAAA;AAC1B,MAAA;AACD,IAAA;AACD,EAAA;AAEiD,EAAA;AA7tClD,IAAA;AA8tCsB,IAAA;AACd,IAAA;AAC0C,MAAA;AAChD,IAAA;AACyB,IAAA;AACxB,MAAA;AACD,IAAA;AACD,EAAA;AAEsB,EAAA;AACL,IAAA;AACuC,MAAA;AACvD,IAAA;AAEkB,IAAA;AACZ,MAAA;AACA,MAAA;AACA,MAAA;AACN,IAAA;AACmC,IAAA;AAC+B,MAAA;AAClE,IAAA;AACiB,IAAA;AAClB,EAAA;AAOQ,EAAA;AAC0B,IAAA;AACjB,IAAA;AAC+B,MAAA;AAC9C,MAAA;AACD,IAAA;AAEkB,IAAA;AACZ,MAAA;AACA,MAAA;AACA,MAAA;AACN,IAAA;AACkB,IAAA;AACO,IAAA;AACsB,MAAA;AAC/C,IAAA;AACD,EAAA;AACD;AAE4B;AAC3B,EAAA;AACA,EAAA;AAE2D,EAAA;AAC1C,IAAA;AACJ,IAAA;AACb,EAAA;AAMiB,EAAA;AAChB,IAAA;AACe,MAAA;AACR,QAAA;AACL,QAAA;AACA,QAAA;AACgB,QAAA;AACjB,MAAA;AACD,IAAA;AACD,EAAA;AAMiB,EAAA;AAChB,IAAA;AACe,MAAA;AACR,QAAA;AACL,QAAA;AACA,QAAA;AACgB,QAAA;AACjB,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAEsB;AACrB,EAAA;AACA,EAAA;AAE2D,EAAA;AAC1C,IAAA;AACJ,IAAA;AACb,EAAA;AAK2C,EAAA;AACtB,IAAA;AACL,MAAA;AACR,QAAA;AACqC,QAAA;AAC3C,MAAA;AACD,IAAA;AAGG,IAAA;AACJ,EAAA;AAMiB,EAAA;AACV,IAAA;AACS,MAAA;AACR,QAAA;AACqC,QAAA;AACtB,QAAA;AACrB,MAAA;AACD,IAAA;AACD,EAAA;AAEsD,EAAA;AAC/C,IAAA;AACS,MAAA;AACR,QAAA;AACqC,QAAA;AAC3C,MAAA;AACD,IAAA;AACD,EAAA;AAKiB,EAAA;AACV,IAAA;AACS,MAAA;AACR,QAAA;AACuC,QAAA;AACF,QAAA;AAC3C,MAAA;AACD,IAAA;AACD,EAAA;AAEwE,EAAA;AACjE,IAAA;AACiD,MAAA;AACvD,IAAA;AACD,EAAA;AAQoE,EAAA;AAC7C,IAAA;AACP,MAAA;AACR,QAAA;AACL,QAAA;AACC,UAAA;AACC,YAAA;AACS,YAAA;AACV,UAAA;AACD,QAAA;AACA,QAAA;AACmB,UAAA;AACF,UAAA;AACjB,QAAA;AACD,MAAA;AACD,IAAA;AAC8B,IAAA;AAC7B,MAAA;AAC8C,QAAA;AACpC,QAAA;AACV,MAAA;AACwD,MAAA;AACxD,IAAA;AACF,EAAA;AAI4C,EAAA;AACrB,IAAA;AACgC,MAAA;AACtD,IAAA;AAC8B,IAAA;AACL,MAAA;AACE,MAAA;AAC1B,IAAA;AACF,EAAA;AASoE,EAAA;AAC7C,IAAA;AACP,MAAA;AACR,QAAA;AACL,QAAA;AACC,UAAA;AACC,YAAA;AACS,YAAA;AACV,UAAA;AACD,QAAA;AACA,QAAA;AACC,UAAA;AACC,YAAA;AACS,YAAA;AACV,UAAA;AACD,QAAA;AACA,QAAA;AACmB,UAAA;AACF,UAAA;AACjB,QAAA;AACD,MAAA;AACD,IAAA;AAC8B,IAAA;AAC7B,MAAA;AAC8C,QAAA;AACpC,QAAA;AACV,MAAA;AACwD,MAAA;AACxD,IAAA;AACF,EAAA;AAQoE,EAAA;AAC7B,IAAA;AACvC,EAAA;AAEsE,EAAA;AAChD,IAAA;AACyB,MAAA;AAC9C,IAAA;AACmE,IAAA;AACpE,EAAA;AAEmE,EAAA;AAC5D,IAAA;AACS,MAAA;AACR,QAAA;AAC0B,QAAA;AAC9B,UAAA;AACA,UAAA;AACC,QAAA;AACH,MAAA;AACD,IAAA;AACD,EAAA;AAEqD,EAAA;AAC9C,IAAA;AAC2C,MAAA;AACjD,IAAA;AACD,EAAA;AACD;AAKE;AAC+C,EAAA;AACzC,EAAA;AACuC,IAAA;AAC7C,IAAA;AACM,IAAA;AACL,MAAA;AACA,MAAA;AACgD,MAAA;AACjD,IAAA;AACmD,IAAA;AAEzC,IAAA;AAEE,MAAA;AAGJ,QAAA;AACA,UAAA;AACC,YAAA;AACA,YAAA;AACA,YAAA;AACD,UAAA;AACD,QAAA;AACH,MAAA;AAED,IAAA;AACJ,EAAA;AACD;AAEyB;AACxB,EAAA;AACA,EAAA;AACA,EAAA;AACgD,EAAA;AAM9C,EAAA;AACe,IAAA;AACJ,IAAA;AACI,IAAA;AACjB,EAAA;AAEwC,EAAA;AAC0B,IAAA;AAC1D,IAAA;AACA,MAAA;AACS,QAAA;AACR,UAAA;AACL,UAAA;AACyB,UAAA;AAC1B,QAAA;AACD,MAAA;AACK,MAAA;AACN,IAAA;AACD,EAAA;AAOG,EAAA;AACoC,IAAA;AACrB,MAAA;AACT,MAAA;AACW,MAAA;AACD,MAAA;AACK,MAAA;AACtB,IAAA;AACgB,IAAA;AAClB,EAAA;AAQG,EAAA;AAC2B,IAAA;AACoB,IAAA;AACtC,MAAA;AACT,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACS,UAAA;AACI,UAAA;AACb,QAAA;AACD,MAAA;AACD,IAAA;AAEiC,IAAA;AAC3B,MAAA;AACI,MAAA;AACV,IAAA;AAEI,IAAA;AACoB,MAAA;AACR,QAAA;AACR,UAAA;AACL,UAAA;AAC6B,YAAA;AACZ,YAAA;AACI,YAAA;AACpB,YAAA;AACD,UAAA;AACA,UAAA;AACD,QAAA;AACD,MAAA;AACyB,MAAA;AACe,QAAA;AACxC,MAAA;AAEW,MAAA;AAC4B,QAAA;AAEpC,MAAA;AACF,IAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AASE,EAAA;AACgC,IAAA;AAC3B,MAAA;AACI,MAAA;AACV,IAAA;AAEI,IAAA;AACI,MAAA;AACA,QAAA;AACS,UAAA;AACR,YAAA;AACI,YAAA;AACT,YAAA;AACqB,cAAA;AACE,cAAA;AACvB,YAAA;AACA,YAAA;AACD,UAAA;AACD,QAAA;AACK,QAAA;AACN,MAAA;AACC,IAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAQE,EAAA;AACgC,IAAA;AAC3B,MAAA;AACI,MAAA;AACV,IAAA;AAEI,IAAA;AACG,MAAA;AACS,QAAA;AACR,UAAA;AACI,UAAA;AACT,UAAA;AACqB,YAAA;AACrB,UAAA;AACA,UAAA;AACD,QAAA;AACD,MAAA;AACC,IAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AASE,EAAA;AACgE,IAAA;AAChC,IAAA;AAC3B,MAAA;AACI,MAAA;AACV,IAAA;AAEI,IAAA;AACoB,MAAA;AACR,QAAA;AACR,UAAA;AACL,UAAA;AACyB,UAAA;AACzB,UAAA;AACqB,YAAA;AACrB,UAAA;AACA,UAAA;AACD,QAAA;AACD,MAAA;AAGG,MAAA;AACK,QAAA;AACL,QAAA;AACoB,QAAA;AACrB,MAAA;AACD,IAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAKG,EAAA;AACuC,IAAA;AACxB,MAAA;AACT,MAAA;AACe,MAAA;AACtB,IAAA;AACgB,IAAA;AAClB,EAAA;AAMG,EAAA;AACwB,IAAA;AACG,MAAA;AACZ,QAAA;AACA,QAAA;AACN,QAAA;AACI,QAAA;AACb,MAAA;AACF,IAAA;AAEI,IAAA;AACyB,MAAA;AACX,QAAA;AACA,QAAA;AACP,QAAA;AACI,QAAA;AACb,MAAA;AACc,IAAA;AAMb,MAAA;AACO,QAAA;AACT,MAAA;AACM,MAAA;AACP,IAAA;AACD,EAAA;AAQE,EAAA;AACQ,IAAA;AACJ,MAAA;AACoC,QAAA;AACzB,QAAA;AACb,UAAA;AACD,QAAA;AACM,QAAA;AACS,MAAA;AAIR,QAAA;AAEN,UAAA;AACD,QAAA;AACM,QAAA;AACP,MAAA;AACD,IAAA;AACD,EAAA;AAIwB,EAAA;AACW,IAAA;AAC1B,MAAA;AACR,IAAA;AACyB,IAAA;AAC1B,EAAA;AAIE,EAAA;AACqC,IAAA;AACU,IAAA;AAChC,IAAA;AAET,IAAA;AACH,MAAA;AACqC,MAAA;AACK,QAAA;AACjC,UAAA;AACT,YAAA;AACA,YAAA;AACsB,YAAA;AACtB,YAAA;AACS,cAAA;AACI,cAAA;AACmB,cAAA;AAChC,YAAA;AACD,UAAA;AACD,QAAA;AACe,QAAA;AACJ,UAAA;AACT,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACS,cAAA;AACI,cAAA;AACb,YAAA;AACD,UAAA;AACD,QAAA;AAE+B,QAAA;AACnB,QAAA;AACuC,QAAA;AACpD,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAE6B;AAC5B,EAAA;AACA,EAAA;AACA,EAAA;AAC8C,EAAA;AAES,EAAA;AACtC,IAAA;AACL,IAAA;AAC0B,IAAA;AACV,MAAA;AACR,MAAA;AACa,QAAA;AAC7B,UAAA;AACe,YAAA;AACR,cAAA;AACkB,cAAA;AACvB,cAAA;AACD,YAAA;AACD,UAAA;AACA,UAAA;AACD,QAAA;AAGG,QAAA;AAEH,QAAA;AACkD,UAAA;AAClD,QAAA;AACD,MAAA;AAC2B,MAAA;AACU,QAAA;AAC/B,QAAA;AAC+C,UAAA;AACpD,QAAA;AACD,MAAA;AACA,IAAA;AAC4D,IAAA;AAC9B,MAAA;AACf,QAAA;AAGVA,UAAAA;AACG,UAAA;AACP,QAAA;AACA,QAAA;AACD,MAAA;AAEoC,MAAA;AACtB,MAAA;AACP,QAAA;AACA,QAAA;AACA,QAAA;AACP,MAAA;AACA,IAAA;AACF,EAAA;AAEiB,EAAA;AACK,IAAA;AACtB,EAAA;AAEiB,EAAA;AACK,IAAA;AACtB,EAAA;AAEW,EAAA;AACW,IAAA;AACtB,EAAA;AAEc,EAAA;AACQ,IAAA;AACtB,EAAA;AAEa,EAAA;AACS,IAAA;AACtB,EAAA;AAEiB,EAAA;AACK,IAAA;AACtB,EAAA;AAE8C,EAAA;AAClB,IAAA;AAC5B,EAAA;AAEqB,EAAA;AACC,IAAA;AACtB,EAAA;AAEiB,EAAA;AACK,IAAA;AACtB,EAAA;AAEe,EAAA;AACO,IAAA;AACtB,EAAA;AAEU,EAAA;AACY,IAAA;AACtB,EAAA;AAEa,EAAA;AACS,IAAA;AACtB,EAAA;AAEkB,EAAA;AACM,IAAA;AACxB,EAAA;AAEc,EAAA;AACQ,IAAA;AACtB,EAAA;AAEmB,EAAA;AACM,IAAA;AACzB,EAAA;AAEc,EAAA;AACQ,IAAA;AACtB,EAAA;AAEmB,EAAA;AACM,IAAA;AACzB,EAAA;AAEgB,EAAA;AACM,IAAA;AACtB,EAAA;AAEqB,EAAA;AACM,IAAA;AAC3B,EAAA;AAEyD,EAAA;AACjC,IAAA;AACxB,EAAA;AAE4C,EAAA;AACX,IAAA;AACjC,EAAA;AAKQ,EAAA;AACsC,IAAA;AAC9C,EAAA;AAKQ,EAAA;AACyC,IAAA;AACjD,EAAA;AAMY,EAAA;AAC6B,IAAA;AACzC,EAAA;AACD;AAIkE;AACjE,EAAA;AACA,EAAA;AACyD,EAAA;AACO,EAAA;AACM,EAAA;AACL,EAAA;AAEhE,EAAA;AAEsE,EAAA;AAC1D,IAAA;AACE,IAAA;AAE4B,IAAA;AACc,MAAA;AACvD,IAAA;AAC4C,IAAA;AACiB,MAAA;AAC7D,IAAA;AAC0C,IAAA;AACe,MAAA;AACzD,IAAA;AAC0C,IAAA;AACe,MAAA;AACzD,IAAA;AACF,EAAA;AAEoB,EAAA;AACA,IAAA;AACpB,EAAA;AAEc,EAAA;AACM,IAAA;AACpB,EAAA;AAEiB,EAAA;AACG,IAAA;AACpB,EAAA;AAEgB,EAAA;AACI,IAAA;AACpB,EAAA;AAEgC,EAAA;AACZ,IAAA;AACpB,EAAA;AAEyC,EAAA;AACrB,IAAA;AACpB,EAAA;AAE8C,EAAA;AACpB,IAAA;AAC1B,EAAA;AAE6B,EAAA;AACT,IAAA;AACpB,EAAA;AAEyB,EAAA;AACL,IAAA;AACpB,EAAA;AAEuB,EAAA;AACH,IAAA;AACpB,EAAA;AAEkB,EAAA;AACE,IAAA;AACpB,EAAA;AAEoE,EAAA;AAC9C,IAAA;AACtB,EAAA;AAE4C,EAAA;AACb,IAAA;AAC/B,EAAA;AAEyE,EAAA;AAChC,IAAA;AACxB,IAAA;AACF,MAAA;AACsB,MAAA;AACpC,IAAA;AACuB,IAAA;AACxB,EAAA;AAKQ,EAAA;AACmC,IAAA;AAC1B,IAAA;AACf,MAAA;AACD,IAAA;AAEwC,IAAA;AACtB,IAAA;AACQ,MAAA;AAC1B,IAAA;AACD,EAAA;AAE0C,EAAA;AACsB,IAAA;AACxD,IAAA;AACR,EAAA;AAEmE,EAAA;AACtD,IAAA;AACb,EAAA;AAEqE,EAAA;AACrD,IAAA;AAChB,EAAA;AAEyE,EAAA;AAC5D,IAAA;AACb,EAAA;AAE2E,EAAA;AAC1D,IAAA;AACjB,EAAA;AAEoE,EAAA;AACvD,IAAA;AACb,EAAA;AAEsE,EAAA;AACrD,IAAA;AACjB,EAAA;AAIQ,EAAA;AACK,IAAA;AACb,EAAA;AAIU,EAAA;AACS,IAAA;AACnB,EAAA;AAE4C,EAAA;AAC7B,IAAA;AACR,MAAA;AACG,QAAA;AACN,UAAA;AACY,UAAA;AACa,UAAA;AACjB,UAAA;AACO,UAAA;AAChB,QAAA;AACI,MAAA;AACG,QAAA;AACN,UAAA;AACY,UAAA;AACE,UAAA;AACE,UAAA;AACR,UAAA;AACO,UAAA;AAChB,QAAA;AACD,MAAA;AACQ,QAAA;AACN,UAAA;AACQ,UAAA;AACO,UAAA;AAGX,UAAA;AAGA,UAAA;AACL,QAAA;AACF,IAAA;AACD,EAAA;AAE0C,EAAA;AACC,IAAA;AACH,IAAA;AACC,MAAA;AACC,QAAA;AACxC,MAAA;AACD,IAAA;AAEc,IAAA;AACR,MAAA;AACyD,QAAA;AAC7D,QAAA;AACI,MAAA;AACK,QAAA;AACoC,UAAA;AAC7C,QAAA;AACI,MAAA;AACK,QAAA;AACoC,UAAA;AAC7C,QAAA;AACI,MAAA;AACK,QAAA;AACsC,UAAA;AAC/C,QAAA;AACF,IAAA;AACD,EAAA;AAMQ,EAAA;AACH,IAAA;AACyB,MAAA;AACM,MAAA;AACjC,QAAA;AACD,MAAA;AAC0D,MAAA;AAChD,MAAA;AAEU,QAAA;AACF,UAAA;AACT,YAAA;AACM,YAAA;AACX,YAAA;AACA,UAAA;AAEa,QAAA;AACiC,UAAA;AAEhC,QAAA;AAClB,MAAA;AACe,IAAA;AACA,MAAA;AACT,QAAA;AACM,QAAA;AACX,QAAA;AACA,MAAA;AACF,IAAA;AACD,EAAA;AAE2D,EAAA;AAI/C,IAAA;AAGZ,EAAA;AACD;AAE4E;AAC3E,EAAA;AACA,EAAA;AACA,EAAA;AAME,EAAA;AACe,IAAA;AACJ,IAAA;AACI,IAAA;AACjB,EAAA;AAEoD,EAAA;AACxC,IAAA;AACL,MAAA;AACL,MAAA;AACK,MAAA;AACA,MAAA;AAEJ,MAAA;AACe,QAAA;AACR,UAAA;AACL,UAAA;AACD,QAAA;AACD,MAAA;AACF,IAAA;AACD,EAAA;AAEmB,EAAA;AAC+C,IAAA;AAClE,EAAA;AAEgD,EAAA;AACsB,IAAA;AACP,IAAA;AAC5C,IAAA;AACa,IAAA;AAChC,EAAA;AAE0B,EAAA;AAC4C,IAAA;AACb,IAAA;AACzD,EAAA;AAE4B,EAAA;AAC0C,IAAA;AAGlD,IAAA;AACpB,EAAA;AAEyC,EAAA;AAC6B,IAAA;AAGlD,IAAA;AACpB,EAAA;AAEoD,EAAA;AACkB,IAAA;AAEnE,IAAA;AAEiD,MAAA;AAKhC,IAAA;AAGpB,EAAA;AASQ,EAAA;AAC8D,IAAA;AAC3C,IAAA;AACW,MAAA;AACsB,MAAA;AAC3D,IAAA;AACD,EAAA;AAE8D,EAAA;AACzC,IAAA;AACrB,EAAA;AAEgC,iBAAA;AACjC;AAEuC;AACtC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAOC,EAAA;AAOgB,IAAA;AACJ,IAAA;AACU,IAAA;AACN,IAAA;AACY,IAAA;AACK,IAAA;AACX,IAAA;AACD,IAAA;AACC,IAAA;AACI,MAAA;AAC1B,IAAA;AACgB,IAAA;AAKuB,IAAA;AACtC,MAAA;AACD,IAAA;AACD,EAAA;AAES,EAAA;AACO,IAAA;AACyC,MAAA;AACxD,IAAA;AACY,IAAA;AACb,EAAA;AAEU,EAAA;AACO,IAAA;AACkD,MAAA;AAClE,IAAA;AACY,IAAA;AACb,EAAA;AAES,EAAA;AACqB,IAAA;AACK,MAAA;AAClC,IAAA;AAEc,IAAA;AACD,MAAA;AACb,IAAA;AAEmE,IAAA;AACjC,IAAA;AAChB,IAAA;AACO,MAAA;AACZ,MAAA;AACb,IAAA;AAEkC,IAAA;AACnC,EAAA;AAE8B,EAAA;AACJ,IAAA;AACG,MAAA;AAC5B,IAAA;AACuB,IAAA;AACxB,EAAA;AAEqB,EAAA;AACK,IAAA;AACG,MAAA;AAC5B,IAAA;AACiE,IAAA;AAC/B,IAAA;AAOtB,IAAA;AAEmB,MAAA;AACN,MAAA;AACvB,QAAA;AACe,QAAA;AACoC,UAAA;AACnD,QAAA;AACc,QAAA;AACc,UAAA;AACG,UAAA;AAC/B,QAAA;AACD,MAAA;AACD,IAAA;AACkB,IAAA;AACnB,EAAA;AAE0B,EAAA;AACA,IAAA;AACG,MAAA;AAC5B,IAAA;AAC2B,IAAA;AACA,IAAA;AACmB,IAAA;AAC/C,EAAA;AAEsC,EAAA;AACZ,IAAA;AACxB,MAAA;AACD,IAAA;AAC+C,IAAA;AAChD,EAAA;AAEoB,EAAA;AACgD,IAAA;AACjC,IAAA;AACb,MAAA;AACrB,IAAA;AAE+B,IAAA;AACX,IAAA;AACb,IAAA;AACR,EAAA;AAEyB,EAAA;AAC2C,IAAA;AACpC,IAAA;AACX,IAAA;AACrB,EAAA;AAEgC,EAAA;AACb,IAAA;AACC,MAAA;AACZ,QAAA;AACA,QAAA;AACS,QAAA;AACf,MAAA;AACD,IAAA;AACY,IAAA;AACb,EAAA;AAEsC,EAAA;AAChB,IAAA;AACC,MAAA;AACf,QAAA;AACA,QAAA;AACN,MAAA;AACD,IAAA;AACY,IAAA;AACb,EAAA;AAEsB,EAAA;AACuC,IAAA;AAC7D,EAAA;AAEmB,EAAA;AAC4C,IAAA;AAC/D,EAAA;AAEoB,EAAA;AACZ,IAAA;AACgD,MAAA;AACvD,IAAA;AACD,EAAA;AAEqB,EAAA;AAC4C,IAAA;AACjE,EAAA;AAEoD,EAAA;AAC/B,IAAA;AACC,MAAA;AACd,QAAA;AACA,QAAA;AACA,QAAA;AACN,MAAA;AACD,IAAA;AACY,IAAA;AACb,EAAA;AAEU,EAAA;AACK,IAAA;AACf,EAAA;AAE+B,EAAA;AACN,IAAA;AAC0B,MAAA;AACJ,MAAA;AACxB,QAAA;AACd,MAAA;AACiC,QAAA;AACvB,QAAA;AACW,QAAA;AAClB,UAAA;AACS,UAAA;AAClB,QAAA;AACsB,QAAA;AACN,UAAA;AACd,YAAA;AACD,UAAA;AACY,UAAA;AACyC,UAAA;AAC1B,UAAA;AAC5B,QAAA;AAIe,QAAA;AACR,UAAA;AAEL,QAAA;AACgB,UAAA;AACX,QAAA;AAC2B,UAAA;AACN,UAAA;AACyB,UAAA;AAC7C,YAAA;AACN,UAAA;AACD,UAAA;AACe,YAAA;AACb,cAAA;AACM,cAAA;AACG,gBAAA;AACS,gBAAA;AAClB,cAAA;AACD,YAAA;AACD,UAAA;AACD,QAAA;AAE+B,QAAA;AAChC,MAAA;AACD,IAAA;AACY,IAAA;AACb,EAAA;AAEuB,EAAA;AACE,IAAA;AACzB,EAAA;AAEmC,EAAA;AACtB,IAAA;AACb,EAAA;AAEuD,EAAA;AACzB,IAAA;AACK,MAAA;AAClC,IAAA;AAEc,IAAA;AACD,MAAA;AACb,IAAA;AAEmE,IAAA;AACjC,IAAA;AAChB,IAAA;AACO,MAAA;AACZ,MAAA;AACb,IAAA;AAEqB,IAAA;AACoC,IAAA;AACxD,MAAA;AACI,MAAA;AAC0B,QAAA;AACd,UAAA;AAC6B,YAAA;AAC3C,UAAA;AACD,QAAA;AAC0B,QAAA;AACc,UAAA;AACxC,QAAA;AAC6B,QAAA;AACO,UAAA;AACpC,QAAA;AACmC,QAAA;AACE,UAAA;AACrC,QAAA;AACD,MAAA;AACK,MAAA;AAC8B,QAAA;AACnC,MAAA;AACwB,MAAA;AACW,QAAA;AAC5B,UAAA;AACE,UAAA;AACD,YAAA;AACA,YAAA;AACN,UAAA;AACD,QAAA;AACD,MAAA;AACA,IAAA;AAC6B,IAAA;AAC7B,MAAA;AACD,IAAA;AACW,IAAA;AACJ,IAAA;AACR,EAAA;AAE+B,EAAA;AACD,IAAA;AAC5B,MAAA;AACD,IAAA;AAEgC,IAAA;AACjC,EAAA;AAE6C,EAAA;AACf,IAAA;AAC5B,MAAA;AACD,IAAA;AAE6B,IAAA;AACK,MAAA;AAClC,IAAA;AACD,EAAA;AAEqC,EAAA;AACzB,IAAA;AACC,IAAA;AAC4C,IAAA;AACH,IAAA;AACtD,EAAA;AAEkD,EAAA;AAC3B,IAAA;AACP,MAAA;AACd,MAAA;AACA,MAAA;AACD,IAAA;AACA,IAAA;AACe,MAAA;AACR,QAAA;AACL,QAAA;AACyB,QAAA;AAC1B,MAAA;AACD,IAAA;AACD,EAAA;AAKkB,EAAA;AACI,IAAA;AACd,MAAA;AAC4C,QAAA;AACrC,UAAA;AACX,QAAA;AACF,MAAA;AACA,MAAA;AACD,IAAA;AAE2B,IAAA;AAC1B,MAAA;AAC2C,QAAA;AACzB,UAAA;AAChB,QAAA;AACF,MAAA;AACA,MAAA;AACD,IAAA;AAEA,IAAA;AAC8D,MAAA;AAC9D,IAAA;AACD,EAAA;AAEyE,EAAA;AACnE,IAAA;AAC4D,IAAA;AAClC,IAAA;AAC4B,MAAA;AAC3D,IAAA;AAC6C,IAAA;AACT,MAAA;AACpC,IAAA;AAGI,IAAA;AAEoB,IAAA;AAC4B,MAAA;AACpC,IAAA;AAC+C,MAAA;AACvD,MAAA;AACN,QAAA;AACyD,QAAA;AAC1D,MAAA;AACA,IAAA;AAEM,IAAA;AACN,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AAEyC,EAAA;AACX,IAAA;AACkB,MAAA;AAC9C,IAAA;AACF,EAAA;AAEoD,EAAA;AACtB,IAAA;AACsB,MAAA;AAClD,IAAA;AACF,EAAA;AAE8C,EAAA;AAE1B,IAAA;AACH,MAAA;AACR,QAAA;AACsB,QAAA;AAC3B,MAAA;AAEc,IAAA;AACb,IAAA;AACH,MAAA;AACuD,QAAA;AACvD,MAAA;AACe,IAAA;AAC4B,MAAA;AACpC,QAAA;AACP,MAAA;AACD,IAAA;AACO,IAAA;AACR,EAAA;AAE4B,EAAA;AAvxF7B,IAAA;AAwxFS,IAAA;AACR,EAAA;AAEuE,EAAA;AAClB,IAAA;AACN,IAAA;AAC1C,IAAA;AACH,MAAA;AAC0D,QAAA;AAC1D,MAAA;AACe,IAAA;AAC4B,MAAA;AACpC,QAAA;AACP,MAAA;AACD,IAAA;AACO,IAAA;AACR,EAAA;AAE2C,EAAA;AACqB,IAAA;AAC3D,IAAA;AACH,MAAA;AACuD,QAAA;AACvD,MAAA;AACe,IAAA;AAC4B,MAAA;AACpC,QAAA;AACP,MAAA;AACD,IAAA;AACD,EAAA;AAEiC,EAAA;AACzB,IAAA;AAC6C,MAAA;AACpD,IAAA;AACD,EAAA;AAEqD,EAAA;AACpD,IAAA;AACe,MAAA;AACR,QAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ8C,EAAA;AAC/B,IAAA;AACR,MAAA;AACL,IAAA;AACF,EAAA;AAAA;AAG4B,EAAA;AACb,IAAA;AACR,MAAA;AACL,IAAA;AACM,IAAA;AACR,EAAA;AAEc,EAAA;AACU,IAAA;AACiC,IAAA;AACzD,EAAA;AAEgB,EAAA;AAI2C,IAAA;AACP,IAAA;AACpD,EAAA;AAEiE,EAAA;AAC7C,IAAA;AACQ,MAAA;AACY,QAAA;AACtC,MAAA;AACmC,MAAA;AACpC,IAAA;AAEY,IAAA;AACb,EAAA;AAE+B,EAAA;AAl3FhC,IAAA;AAq3FyB,IAAA;AACvB,IAAA;AACY,IAAA;AACb,EAAA;AAEuC,EAAA;AACjB,IAAA;AACoB,MAAA;AACzC,IAAA;AACuC,IAAA;AACb,IAAA;AACR,MAAA;AACX,IAAA;AAC2D,MAAA;AAC1D,QAAA;AACN,MAAA;AACF,IAAA;AACkB,IAAA;AACnB,EAAA;AAEsB,EAAA;AAC4C,IAAA;AAC7B,IAAA;AAChB,MAAA;AACsC,QAAA;AACzD,MAAA;AACD,IAAA;AACkB,IAAA;AACnB,EAAA;AAOQ,EAAA;AAC0D,IAAA;AAC9C,IAAA;AACQ,IAAA;AAC1B,MAAA;AACD,IAAA;AACmB,IAAA;AACpB,EAAA;AAE8B,EAAA;AACoC,IAAA;AAC/B,IAAA;AACC,MAAA;AACnC,IAAA;AACD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOsB,EAAA;AAC4C,IAAA;AACnC,IAAA;AAC7B,MAAA;AACD,IAAA;AAC2B,IAAA;AACuB,IAAA;AAC1B,MAAA;AACvB,IAAA;AACF,EAAA;AAE0B,EAAA;AACwC,IAAA;AAClC,IAAA;AAC9B,MAAA;AACD,IAAA;AAC2B,IAAA;AACqB,IAAA;AACJ,MAAA;AACZ,MAAA;AAChC,IAAA;AAEA,IAAA;AAC8D,MAAA;AAC9D,IAAA;AAE0B,IAAA;AACzB,MAAA;AACD,IAAA;AAE+B,IAAA;AACsC,IAAA;AAClD,IAAA;AACf,IAAA;AACiB,MAAA;AACnB,QAAA;AACW,QAAA;AACZ,MAAA;AAC2B,MAAA;AACX,QAAA;AAEI,QAAA;AACF,UAAA;AACT,YAAA;AACL,YAAA;AACA,UAAA;AAEa,QAAA;AACiB,UAAA;AAC/B,UAAA;AAC8C,YAAA;AAC9C,UAAA;AACA,QAAA;AACH,MAAA;AACC,IAAA;AACiB,MAAA;AACc,QAAA;AAC/B,QAAA;AAC8C,UAAA;AAC9C,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAMmC;AAClC,EAAA;AACsE,EAAA;AAE7D,EAAA;AACA,EAAA;AAqBA,EAAA;AAiCA,EAAA;AAOmC,EAAA;AAC/B,IAAA;AACE,IAAA;AACA,IAAA;AACwB,MAAA;AACT,QAAA;AACY,QAAA;AACxC,MAAA;AACwC,MAAA;AACZ,QAAA;AACQ,QAAA;AACpC,MAAA;AACwC,MAAA;AACZ,QAAA;AACQ,QAAA;AACpC,MAAA;AAC8C,MAAA;AAClB,QAAA;AACiB,QAAA;AAC7C,MAAA;AACyC,MAAA;AACb,QAAA;AACmB,QAAA;AAC/C,MAAA;AACoC,MAAA;AACJ,QAAA;AAChC,MAAA;AACD,IAAA;AACoB,IAAA;AACY,MAAA;AAClB,QAAA;AAC0B,UAAA;AACtC,QAAA;AACD,MAAA;AAMC,MAAA;AAEiD,QAAA;AAChD,UAAA;AACA,UAAA;AACoB,UAAA;AACpB,UAAA;AACA,QAAA;AACe,QAAA;AACe,UAAA;AAC/B,QAAA;AACD,MAAA;AAC8C,MAAA;AAvmGjD,QAAA;AAwmGU,QAAA;AACwC,QAAA;AAC/C,MAAA;AACoD,MAAA;AACQ,QAAA;AAC5C,QAAA;AACd,UAAA;AACD,QAAA;AACuB,QAAA;AACsB,QAAA;AAC9C,MAAA;AAC4C,MAAA;AACc,QAAA;AAChD,UAAA;AACR,QAAA;AACF,MAAA;AACD,IAAA;AACoB,IAAA;AACQ,MAAA;AACI,QAAA;AAC/B,MAAA;AACD,IAAA;AACD,EAAA;AAE8B,EAAA;AACK,IAAA;AACnC,EAAA;AAEyC,EAAA;AACN,IAAA;AACnC,EAAA;AAEsC,EAAA;AACZ,IAAA;AACd,MAAA;AACuD,QAAA;AACjE,MAAA;AACD,IAAA;AACD,EAAA;AAEuD,EAAA;AACxC,IAAA;AAC0C,MAAA;AACxD,IAAA;AAE4B,IAAA;AACxB,IAAA;AACkB,IAAA;AACoB,MAAA;AAxpG5C,QAAA;AAypGU,QAAA;AACP,MAAA;AAC6C,MAAA;AAC9C,IAAA;AAEO,IAAA;AACN,MAAA;AACc,MAAA;AACA,MAAA;AACK,MAAA;AACnB,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAOoC;AAOrB,EAAA;AACT,IAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACA,IAAA;AACW,MAAA;AAAkB,QAAA;AAAS,QAAA;AAAM,QAAA;AAAS,QAAA;AACnD,QAAA;AACiD,UAAA;AACjD,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAKsB;AACK,EAAA;AACU,EAAA;AACP,EAAA;AAEtB,EAAA;AACQ,IAAA;AACA,IAAA;AACa,IAAA;AAGH,IAAA;AAGO,IAAA;AAEM,IAAA;AACR,IAAA;AACA,IAAA;AACK,IAAA;AAGA,IAAA;AAGN,IAAA;AACA,IAAA;AACH,IAAA;AACD,IAAA;AACP,IAAA;AACW,IAAA;AACS,IAAA;AAGC,IAAA;AAGhB,IAAA;AACO,IAAA;AACU,IAAA;AAGA,IAAA;AAGN,IAAA;AAGG,IAAA;AAKjB,IAAA;AAC+B,IAAA;AACnD,EAAA;AACD;AAI+C;AACU,EAAA;AACT,EAAA;AACO,EAAA;AAC7B,EAAA;AACV,IAAA;AAOa,IAAA;AACU,MAAA;AACrC,IAAA;AAM2B,IAAA;AAEC,IAAA;AACkB,MAAA;AAC9C,IAAA;AACO,IAAA;AACI,MAAA;AACG,MAAA;AACD,MAAA;AACJ,MAAA;AACT,IAAA;AACA,EAAA;AACF;AAE2E;AAK1B,EAAA;AACrC,IAAA;AACkB,MAAA;AAE5B,IAAA;AACD,EAAA;AACI,EAAA;AACA,EAAA;AAC4B,IAAA;AAClB,EAAA;AACgC,IAAA;AACtB,IAAA;AACZ,MAAA;AACwC,QAAA;AAClD,MAAA;AACD,IAAA;AACuB,IAAA;AACZ,MAAA;AACwC,QAAA;AAClD,MAAA;AACD,IAAA;AACU,IAAA;AACwC,MAAA;AAGlD,IAAA;AACD,EAAA;AACyB,EAAA;AACd,IAAA;AACwC,MAAA;AAGlD,IAAA;AACD,EAAA;AACD;AAMsB;AAz1GtB,EAAA;AA01G2B,EAAA;AACM,EAAA;AACa,EAAA;AACjB,IAAA;AACF,IAAA;AACV,IAAA;AACA,IAAA;AAChB,EAAA;AAC8B,EAAA;AAKK,IAAA;AACnC,EAAA;AAEC,EAAA;AACK,IAAA;AAC+C,MAAA;AACnD,IAAA;AACmB,IAAA;AACpB,EAAA;AACgE,EAAA;AAEhE,EAAA;AAC0C,IAAA;AACrC,EAAA;AACuD,EAAA;AAr3G9DC,IAAAA;AAs3GE,IAAA;AACQ,MAAA;AACkC,MAAA;AACvC,IAAA;AAAA,EAAA;AAGC,EAAA;AACuC,IAAA;AAExC,EAAA;AAC8B,EAAA;AACF,EAAA;AAC4B,EAAA;AACE,EAAA;AAEf,EAAA;AAEf,EAAA;AAKa,EAAA;AAMxC,EAAA;AACH,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACkC,IAAA;AAClC,IAAA;AACA,IAAA;AACD,EAAA;AAOA,EAAA;AACC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AASA,EAAA;AAx7GF,IAAA;AA07GmC,IAAA;AACY,IAAA;AACrC,MAAA;AACR,IAAA;AAGiC,IAAA;AACP,MAAA;AACf,MAAA;AACQ,QAAA;AACM,QAAA;AACvB,MAAA;AACA,IAAA;AACyD,IAAA;AACrB,MAAA;AAC9B,MAAA;AACN,QAAA;AACmB,UAAA;AACD,UAAA;AACG,UAAA;AACa,UAAA;AAClC,QAAA;AACA,QAAA;AAIc,UAAA;AACd,QAAA;AACD,MAAA;AACD,IAAA;AACI,IAAA;AACW,MAAA;AACb,QAAA;AACA,yBAAA;AAGD,MAAA;AACe,IAAA;AACgB,MAAA;AAChC,IAAA;AAE2B,IAAA;AAn+G7BA,MAAAA;AAo+GG,MAAA;AACkC,yBAAA;AAClC,MAAA;AAAA,IAAA;AAC8B,IAAA;AAv+GjCC,MAAAA;AAw+GU,MAAA;AAAkD,IAAA;AACd,IAAA;AACxC,IAAA;AAGmB,MAAA;AAED,QAAA;AACoB,UAAA;AACvB,UAAA;AAChB,QAAA;AACF,MAAA;AAGsB,MAAA;AAEc,QAAA;AACb,QAAA;AACsB,QAAA;AACZ,QAAA;AACjC,MAAA;AAGW,MAAA;AAEU,QAAA;AAC8B,UAAA;AACrC,YAAA;AACJ,cAAA;AACG,cAAA;AACA,cAAA;AACF,gBAAA;AACO,gBAAA;AACC,gBAAA;AACF,gBAAA;AACG,gBAAA;AACM,gBAAA;AACtB,cAAA;AACD,YAAA;AACD,UAAA;AACA,QAAA;AACF,MAAA;AAGsB,MAAA;AAED,QAAA;AACoB,UAAA;AACvC,QAAA;AACF,MAAA;AAGsB,MAAA;AAE0B,QAAA;AACO,QAAA;AAGlD,QAAA;AAGwC,QAAA;AACL,QAAA;AACkB,QAAA;AAClD,UAAA;AACE,UAAA;AACO,UAAA;AACd,QAAA;AACkB,QAAA;AACD,UAAA;AACoB,UAAA;AACtC,UAAA;AACA,UAAA;AACA,QAAA;AACF,MAAA;AAGsB,MAAA;AAE2B,QAAA;AACjD,MAAA;AAGW,MAAA;AAEU,QAAA;AACM,UAAA;AACU,UAAA;AAEE,UAAA;AACrC,QAAA;AACF,MAAA;AAGW,MAAA;AAEN,QAAA;AACgC,UAAA;AAGb,UAAA;AACrB,YAAA;AADqB,UAAA;AAGF,UAAA;AACV,YAAA;AACG,+BAAA;AACZ,YAAA;AACmC,YAAA;AAEE,YAAA;AACrC,UAAA;AACc,QAAA;AACA,UAAA;AACT,YAAA;AACL,YAAA;AACA,UAAA;AACyB,UAAA;AAC3B,QAAA;AACD,MAAA;AAGW,MAAA;AAEU,QAAA;AACL,QAAA;AACL,UAAA;AACR,YAAA;AACD,UAAA;AACD,QAAA;AACoB,QAAA;AACQ,QAAA;AACsB,UAAA;AACjC,UAAA;AAC8B,YAAA;AAC9C,UAAA;AACoB,UAAA;AACgC,YAAA;AACpD,UAAA;AACoB,UAAA;AACV,YAAA;AAC+B,cAAA;AACxC,YAAA;AACD,UAAA;AACgB,UAAA;AACR,YAAA;AACE,cAAA;AACI,cAAA;AACA,cAAA;AACb,YAAA;AACyB,YAAA;AACQ,YAAA;AACR,YAAA;AACzB,UAAA;AACF,QAAA;AACsD,QAAA;AACvD,MAAA;AAGW,MAAA;AAEgC,QAAA;AAC9B,QAAA;AACJ,UAAA;AAC4C,YAAA;AACpC,YAAA;AACf,UAAA;AACD,QAAA;AACqB,QAAA;AACa,2BAAA;AACjC,UAAA;AACD,QAAA;AACsB,QAAA;AACa,2BAAA;AAClC,UAAA;AACD,QAAA;AAC4C,QAAA;AAC/B,QAAA;AACO,UAAA;AACK,YAAA;AACvB,YAAA;AACiC,cAAA;AACd,cAAA;AACnB,YAAA;AACD,UAAA;AACD,QAAA;AAC4C,QAAA;AAC7C,MAAA;AAGW,MAAA;AAEyB,QAAA;AAKyB,QAAA;AACpD,UAAA;AACqB,YAAA;AACb,YAAA;AACf,UAAA;AACD,QAAA;AAIa,QAAA;AAEL,UAAA;AAC6C,YAAA;AACrC,YAAA;AACf,UAAA;AACD,QAAA;AAIE,QAAA;AAEgB,UAAA;AACX,YAAA;AACN,UAAA;AACa,UAAA;AAC+B,YAAA;AAC5C,UAAA;AAC4C,UAAA;AAC7C,QAAA;AACqD,QAAA;AACxC,QAAA;AAC2B,UAAA;AACxC,QAAA;AAC4C,QAAA;AAC7C,MAAA;AAGsB,MAAA;AAEK,QAAA;AACS,UAAA;AACnC,QAAA;AACoB,QAAA;AACoB,UAAA;AACU,UAAA;AACrC,YAAA;AACJ,cAAA;AACG,cAAA;AACA,cAAA;AACF,gBAAA;AACO,gBAAA;AACC,gBAAA;AACF,gBAAA;AACG,gBAAA;AACM,gBAAA;AACtB,cAAA;AACD,YAAA;AACD,UAAA;AACuC,UAAA;AACV,UAAA;AACb,UAAA;AACwB,UAAA;AAEH,UAAA;AACF,UAAA;AACF,UAAA;AACjC,QAAA;AACF,MAAA;AAGyB,MAAA;AAEQ,QAAA;AAC/B,UAAA;AACA,UAAA;AACD,QAAA;AACwC,QAAA;AAC3B,QAAA;AACL,UAAA;AACF,YAAA;AACH,cAAA;AACA,cAAA;AACoB,cAAA;AACrB,YAAA;AACA,YAAA;AACD,UAAA;AACD,QAAA;AACmC,QAAA;AAI2B,QAAA;AACtD,UAAA;AAC6C,YAAA;AACrC,YAAA;AACf,UAAA;AACD,QAAA;AAIE,QAAA;AAGM,UAAA;AACkC,YAAA;AAC1B,YAAA;AACf,UAAA;AACD,QAAA;AAII,QAAA;AACA,QAAA;AACkB,UAAA;AACpB,YAAA;AACG,YAAA;AACW,cAAA;AACb,cAAA;AACA,cAAA;AACD,YAAA;AACD,UAAA;AAC8B,UAAA;AACf,QAAA;AACA,UAAA;AACT,YAAA;AACL,YAAA;AACA,UAAA;AACyB,UAAA;AAC3B,QAAA;AACD,MAAA;AAEO,MAAA;AACN,QAAA;AACQ,UAAA;AACD,UAAA;AACG,UAAA;AACC,UAAA;AACX,QAAA;AACc,QAAA;AACf,MAAA;AACe,IAAA;AACA,MAAA;AACT,QAAA;AACL,QAAA;AACA,MAAA;AACyB,MAAA;AACzB,IAAA;AACsB,MAAA;AACxB,IAAA;AACD,EAAA;AACkB,EAAA;AAEgC,IAAA;AAQjB,MAAA;AACJ,QAAA;AACtB,UAAA;AACA,UAAA;AACD,QAAA;AACiC,QAAA;AAC7B,QAAA;AACmC,UAAA;AACJ,UAAA;AAG/B,UAAA;AACA,YAAA;AACA,YAAA;AACD,UAAA;AACa,UAAA;AACT,YAAA;AAC2B,YAAA;AAChC,UAAA;AAC6B,UAAA;AACN,UAAA;AACvB,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGA,IAAA;AAOoB,MAAA;AACI,QAAA;AACtB,UAAA;AACA,UAAA;AACD,QAAA;AACiC,QAAA;AAC7B,QAAA;AACU,UAAA;AACZ,YAAA;AACiB,YAAA;AAClB,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAE2C,IAAA;AAKvB,MAAA;AAC6B,QAAA;AACf,QAAA;AAC7B,QAAA;AAC+B,UAAA;AAG/B,UAAA;AACA,YAAA;AACA,YAAA;AACD,UAAA;AACa,UAAA;AACT,YAAA;AAC2B,YAAA;AAChC,UAAA;AACe,UAAA;AACf,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGH,IAAA;AAQQ,MAAA;AACmB,QAAA;AACtB,UAAA;AACA,UAAA;AACD,QAAA;AACiC,QAAA;AAC7B,QAAA;AACS,UAAA;AACkB,YAAA;AAC9B,UAAA;AACqC,UAAA;AACO,UAAA;AACL,YAAA;AACvC,UAAA;AACe,QAAA;AACc,UAAA;AACvBN,UAAAA;AACL,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGA,IAAA;AAIK,MAAA;AAC4C,QAAA;AACf,QAAA;AAC7B,QAAA;AAC+B,UAAA;AACN,UAAA;AACb,UAAA;AACT,YAAA;AAC2B,YAAA;AAChC,UAAA;AACA,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAEkC,IAAA;AAK7B,MAAA;AAC4C,QAAA;AACf,QAAA;AAC7B,QAAA;AACqC,UAAA;AACvC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AACK,IAAA;AACwD,MAAA;AACf,QAAA;AACf,QAAA;AAIE,QAAA;AACL,UAAA;AAGd,YAAA;AACb,cAAA;AACgC,cAAA;AACjC,YAAA;AACM,UAAA;AACmB,YAAA;AACb,cAAA;AACX,YAAA;AACF,UAAA;AACD,QAAA;AACI,QAAA;AACU,UAAA;AACU,YAAA;AACvB,UAAA;AACqB,UAAA;AACpB,QAAA;AACG,UAAA;AACG,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACD,YAAA;AACC,UAAA;AACsB,YAAA;AACxB,UAAA;AACD,QAAA;AACD,MAAA;AACD,IAAA;AACW,IAAA;AACsD,MAAA;AACf,QAAA;AACf,QAAA;AAC7B,QAAA;AACyC,UAAA;AACZ,YAAA;AAChC,UAAA;AACC,QAAA;AACgC,UAAA;AACJ,UAAA;AACO,UAAA;AACb,UAAA;AACxB,QAAA;AACD,MAAA;AACD,IAAA;AAGI,IAAA;AAaK,MAAA;AAC6B,QAAA;AAChC,UAAA;AACA,UAAA;AACD,QAAA;AACiB,QAAA;AAChB,UAAA;AACkC,UAAA;AACnC,QAAA;AACI,QAAA;AACU,UAAA;AACZ,YAAA;AACA,YAAA;AACc,cAAA;AACK,cAAA;AACnB,YAAA;AACD,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGA,IAAA;AAc4B,MAAA;AAED,QAAA;AACT,QAAA;AAChB,UAAA;AACkC,UAAA;AACnC,QAAA;AACwB,QAAA;AACvB,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AAEC,UAAA;AACS,YAAA;AACP,cAAA;AACA,cAAA;AACD,YAAA;AACD,UAAA;AACF,QAAA;AACI,QAAA;AAEgB,UAAA;AAEhB,YAAA;AACA,YAAA;AACc,cAAA;AACK,cAAA;AACnB,YAAA;AACD,UAAA;AACuC,UAAA;AACT,UAAA;AAC/B,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGA,IAAA;AAaK,MAAA;AAC2B,QAAA;AAC9B,UAAA;AACA,UAAA;AACD,QAAA;AACiB,QAAA;AAChB,UAAA;AACkC,UAAA;AACnC,QAAA;AACwB,QAAA;AACvB,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AAEC,UAAA;AACS,YAAA;AACP,cAAA;AACA,cAAA;AACD,YAAA;AACD,UAAA;AACF,QAAA;AACI,QAAA;AACU,UAAA;AACY,YAAA;AACjB,cAAA;AACN,YAAA;AACD,YAAA;AACD,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAED,IAAA;AAOK,MAAA;AACkD,QAAA;AAChB,QAAA;AAClC,QAAA;AAG4C,UAAA;AACjC,YAAA;AACZ,cAAA;AACI,cAAA;AACH,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AAEC,gBAAA;AACS,kBAAA;AACP,oBAAA;AACA,oBAAA;AACD,kBAAA;AACD,gBAAA;AACF,cAAA;AACD,YAAA;AACD,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAGyB,IAAA;AAGN,MAAA;AAElB,IAAA;AAQK,MAAA;AAC6B,QAAA;AAChC,UAAA;AACA,UAAA;AACD,QAAA;AACsC,QAAA;AAClC,QAAA;AACkB,UAAA;AACP,YAAA;AACb,YAAA;AACD,UAAA;AACmB,UAAA;AAClB,YAAA;AACD,UAAA;AAC0C,UAAA;AACT,UAAA;AACtB,YAAA;AACT,cAAA;AACD,YAAA;AACD,UAAA;AACa,UAAA;AACS,YAAA;AACtB,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AAEsC,IAAA;AAUjC,MAAA;AAEsB,QAAA;AACO,QAAA;AAC7B,QAAA;AACI,UAAA;AACO,YAAA;AACZ,cAAA;AACA,cAAA;AACe,cAAA;AACG,cAAA;AACnB,YAAA;AACD,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AACO,IAAA;AAaL,MAAA;AACA,QAAA;AACmC,UAAA;AACrC,YAAA;AACA,YAAA;AACD,UAAA;AACsC,UAAA;AAE/B,UAAA;AACL,YAAA;AACA,YAAA;AACA,YAAA;AACD,UAAA;AACsB,UAAA;AAC8B,YAAA;AACrD,UAAA;AAE4C,UAAA;AAC9B,YAAA;AACsB,cAAA;AACnC,YAAA;AACD,UAAA;AAGyC,UAAA;AACrC,UAAA;AAGA,UAAA;AACA,UAAA;AACgB,YAAA;AACL,cAAA;AAGV,cAAA;AACJ,YAAA;AACa,YAAA;AACJ,cAAA;AACP,gBAAA;AACsB,gBAAA;AACtB,gBAAA;AACD,cAAA;AACD,YAAA;AACa,YAAA;AACZ,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACD,YAAA;AAC8B,YAAA;AAC7B,cAAA;AACA,cAAA;AACD,YAAA;AACqC,YAAA;AAC1B,cAAA;AACT,gBAAA;AACD,cAAA;AACD,YAAA;AAC2C,YAAA;AAC1C,UAAA;AACiB,YAAA;AACR,YAAA;AACwB,cAAA;AAClC,YAAA;AACD,UAAA;AACe,QAAA;AACA,UAAA;AACT,YAAA;AACLA,YAAAA;AACA,UAAA;AACKA,UAAAA;AACP,QAAA;AACD,MAAA;AACD,IAAA;AAGI,IAAA;AAcK,MAAA;AAEsB,QAAA;AAGvB,QAAA;AAC8C,QAAA;AAC7C,QAAA;AACU,UAAA;AACZ,YAAA;AACI,YAAA;AACH,cAAA;AACsC,cAAA;AACvC,YAAA;AACD,UAAA;AACC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AAEA,IAAA;AACQ,IAAA;AAC0B,MAAA;AAC3B,MAAA;AACF,QAAA;AACR,MAAA;AAEO,MAAA;AAID,QAAA;AAC4C,UAAA;AACS,UAAA;AACxB,UAAA;AACgB,UAAA;AAC7C,UAAA;AACe,YAAA;AACjB,UAAA;AACiD,YAAA;AAC3B,YAAA;AACxB,UAAA;AACD,QAAA;AACD,MAAA;AACE,IAAA;AAGC,IAAA;AAIK,MAAA;AAp7IXK,QAAAA;AAq7IuD,QAAA;AAE/C,QAAA;AAGqB,QAAA;AACvB,MAAA;AAEA,IAAA;AAGA,IAAA;AAOK,MAAA;AACqB,QAAA;AACxB,UAAA;AACA,UAAA;AACD,QAAA;AAE+B,QAAA;AACP,QAAA;AAChB,UAAA;AACR,QAAA;AAG0B,QAAA;AACxB,UAAA;AACK,QAAA;AAGe,QAAA;AACvB,MAAA;AAEA,IAAA;AACY,IAAA;AACyC,MAAA;AACvD,QAAA;AACA,QAAA;AAUM,UAAA;AAEe,YAAA;AAGQ,YAAA;AAEvB,YAAA;AACI,cAAA;AACA,gBAAA;AACL,kBAAA;AACG,kBAAA;AACW,oBAAA;AACb,oBAAA;AACe,oBAAA;AAChB,kBAAA;AACD,gBAAA;AACD,cAAA;AACC,YAAA;AACsB,cAAA;AACxB,YAAA;AACD,UAAA;AACD,QAAA;AACA,MAAA;AACF,IAAA;AACa,IAAA;AAkBP,MAAA;AACE,QAAA;AACL,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACmC,QAAA;AACE,QAAA;AACrB,QAAA;AAChB,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACD,QAAA;AACI,QAAA;AAG+B,UAAA;AAEJ,YAAA;AAC9B,UAAA;AAEmB,UAAA;AACL,YAAA;AACb,YAAA;AACD,UAAA;AACiD,UAAA;AAC3B,YAAA;AACtB,UAAA;AAEoC,UAAA;AAC1B,UAAA;AACL,YAAA;AAEmB,cAAA;AACpB,gBAAA;AACA,gBAAA;AACA,gBAAA;AAIK,kBAAA;AAEL,gBAAA;AACD,cAAA;AACM,cAAA;AACE,gBAAA;AAIQ,gBAAA;AACjB,cAAA;AACe,YAAA;AAKH,cAAA;AAEiB,gBAAA;AAC7B,cAAA;AACML,cAAAA;AACP,YAAA;AACD,UAAA;AAE2C,UAAA;AACd,UAAA;AAC5B,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AACD,IAAA;AACgB,IAAA;AAOV,MAAA;AACoD,QAAA;AACvB,QAAA;AAC7B,QAAA;AACoC,UAAA;AACtC,QAAA;AACsB,UAAA;AACxB,QAAA;AACD,MAAA;AACD,IAAA;AACD,EAAA;AAEe,EAAA;AACd,IAAA;AAC2C,IAAA;AAC5C,EAAA;AACD;AAI+B;AAjoJ/B,EAAA;AAkoJuB,EAAA;AACkB,IAAA;AACxC,EAAA;AAEwC,EAAA;AACjB,IAAA;AACL,IAAA;AACH,IAAA;AACI,IAAA;AACK,IAAA;AACO,IAAA;AACQ,IAAA;AACZ,IAAA;AACO,IAAA;AACC,IAAA;AACJ,IAAA;AACK,IAAA;AACe,IAAA;AACnD,EAAA;AAEwB,EAAA;AACuB,IAAA;AACD,IAAA;AACb,IAAA;AACA,IAAA;AACjC,EAAA;AAC0B,EAAA;AAER,IAAA;AAClB,EAAA;AAEO,EAAA;AACR;AASG;AA3qJH,EAAA;AA8qJE,EAAA;AAEuD,IAAA;AACxD,EAAA;AAEwC,EAAA;AAEqB,EAAA;AACpD,IAAA;AACP,MAAA;AACA,MAAA;AAC8C,MAAA;AAC/C,IAAA;AACD,EAAA;AAEO,EAAA;AACN,IAAA;AACA,IAAA;AAC0C,IAAA;AAC3C,EAAA;AACD;AAkBG;AACgD,EAAA;AAC3C,EAAA;AACgC,IAAA;AACtC,IAAA;AACD,EAAA;AACD;Abm9ByE;AACA;AK7pLjB;AACvC,EAAA;AACV,IAAA;AACG,MAAA;AACH,IAAA;AACG,MAAA;AACT,EAAA;AACD;AAE4D;AACpC,EAAA;AACa,IAAA;AACpC,EAAA;AACgC,EAAA;AACjC;AA0BgD;AAC/C,EAAA;AACA,EAAA;AACgB,EAAA;AAEqB,EAAA;AACxB,IAAA;AACb,EAAA;AAE8B,EAAA;AACiB,IAAA;AAC/C,EAAA;AAEA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACkB,EAAA;AACG,EAAA;AACqB,EAAA;AACsB,EAAA;AAEU,EAAA;AAC1D,IAAA;AAER,IAAA;AACO,IAAA;AACmB,MAAA;AACI,MAAA;AAEN,MAAA;AAC/B,IAAA;AACD,EAAA;AAI6B,EAAA;AACM,IAAA;AAES,IAAA;AACH,MAAA;AACtC,QAAA;AACkB,MAAA;AACqB,QAAA;AACjC,QAAA;AACN,MAAA;AACgD,MAAA;AAAE,MAAA;AACpD,IAAA;AAEY,IAAA;AACb,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY0D,EAAA;AAvH3D,IAAA;AAwHkC,IAAA;AACO,IAAA;AAEF,IAAA;AAEL,MAAA;AAChC,IAAA;AAGY,IAAA;AACW,IAAA;AACtB,MAAA;AACkC,uBAAA;AACnC,IAAA;AAC0B,IAAA;AACzB,MAAA;AACkC,uBAAA;AACnC,IAAA;AAEqB,IAAA;AAGD,IAAA;AACf,MAAA;AAC8C,QAAA;AACjC,MAAA;AACL,QAAA;AACK,UAAA;AACP,YAAA;AACD,YAAA;AACG,YAAA;AACC,YAAA;AACV,UAAA;AACD,UAAA;AACS,YAAA;AACsC,YAAA;AAC/C,UAAA;AACD,QAAA;AACD,MAAA;AACD,IAAA;AAEoD,IAAA;AACW,IAAA;AACnC,IAAA;AACrB,MAAA;AACA,IAAA;AACwD,MAAA;AAC/D,IAAA;AAE8C,IAAA;AAGR,IAAA;AAEY,MAAA;AACN,MAAA;AAChC,MAAA;AACK,QAAA;AACP,UAAA;AACD,UAAA;AACsD,UAAA;AAClD,UAAA;AACV,QAAA;AACD,QAAA;AACS,UAAA;AACsC,UAAA;AAC/C,QAAA;AACD,MAAA;AACD,IAAA;AAEc,IAAA;AACV,IAAA;AAG4C,IAAA;AACd,IAAA;AAnMpCK,MAAAA;AAuMI,MAAA;AAEAA,QAAAA;AACD,MAAA;AACD,IAAA;AACwC,IAAA;AACqB,MAAA;AACvB,MAAA;AACJ,QAAA;AAChC,MAAA;AACF,IAAA;AAC8C,IAAA;AAC3B,MAAA;AACD,QAAA;AACjB,MAAA;AACO,MAAA;AACc,QAAA;AACrB,MAAA;AACS,MAAA;AACE,QAAA;AACU,QAAA;AACuB,QAAA;AAC5C,MAAA;AACA,IAAA;AAEwC,IAAA;AACD,IAAA;AACxB,MAAA;AACf,IAAA;AAEG,IAAA;AACA,IAAA;AACkB,MAAA;AACpB,QAAA;AACA,QAAA;AACiB,UAAA;AACH,UAAA;AACb,UAAA;AACgC,UAAA;AACjC,QAAA;AAYK,QAAA;AACa,UAAA;AACM,UAAA;AACK,UAAA;AACD,YAAA;AACb,YAAA;AACI,YAAA;AACjB,YAAA;AACD,UAAA;AAEU,UAAA;AACU,UAAA;AAC6B,UAAA;AAChC,UAAA;AACD,YAAA;AACV,cAAA;AACgD,gBAAA;AACpD,cAAA;AAAA,YAAA;AAEK,UAAA;AACS,YAAA;AAChB,UAAA;AACD,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACa,IAAA;AAGoC,MAAA;AACN,MAAA;AACrC,MAAA;AACP,IAAA;AAEmD,IAAA;AAC9C,MAAA;AAC8C,QAAA;AACjC,MAAA;AACL,QAAA;AACK,UAAA;AACP,YAAA;AACD,YAAA;AACG,YAAA;AACC,YAAA;AACV,UAAA;AACD,UAAA;AACS,YAAA;AACsC,YAAA;AAC/C,UAAA;AACD,QAAA;AACD,MAAA;AACD,IAAA;AAE4B,IAAA;AACd,MAAA;AACC,MAAA;AACd,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUkC,EAAA;AAC1B,IAAA;AACkC,MAAA;AACzC,IAAA;AACD,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBiB,EAAA;AACU,IAAA;AACM,IAAA;AACF,IAAA;AACT,IAAA;AACD,IAAA;AACqC,MAAA;AACN,MAAA;AACnD,IAAA;AAC2C,IAAA;AACQ,IAAA;AACpD,EAAA;AAAA;AAAA;AAAA;AAKwC,EAAA;AACiB,IAAA;AACvC,IAAA;AACc,MAAA;AACrB,QAAA;AACC,QAAA;AACA,QAAA;AACT,MAAA;AACF,IAAA;AAE8B,IAAA;AACD,IAAA;AACE,MAAA;AACrB,QAAA;AACC,QAAA;AACA,QAAA;AACT,MAAA;AACF,IAAA;AAEsD,IAAA;AACH,IAAA;AACjC,MAAA;AACC,MAAA;AAClB,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK0C,EAAA;AACe,IAAA;AACvC,IAAA;AAC8B,MAAA;AACrC,QAAA;AAC+C,QAAA;AACvD,MAAA;AACF,IAAA;AAE8B,IAAA;AACC,IAAA;AACqC,MAAA;AAC1D,QAAA;AAC+C,QAAA;AACvD,MAAA;AACF,IAAA;AAEwD,IAAA;AACL,IAAA;AACjC,MAAA;AACC,MAAA;AAClB,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKqE,EAAA;AACZ,IAAA;AACvC,IAAA;AAC8B,MAAA;AACrC,QAAA;AAC+C,QAAA;AACvD,MAAA;AACF,IAAA;AAE8B,IAAA;AACA,IAAA;AACsC,MAAA;AAC1D,QAAA;AAC+C,QAAA;AACvD,MAAA;AACF,IAAA;AAEuD,IAAA;AACJ,IAAA;AACjC,MAAA;AACC,MAAA;AAClB,IAAA;AACF,EAAA;AAIE,EAAA;AACkB,IAAA;AACb,MAAA;AACA,MAAA;AACJ,IAAA;AAIc,MAAA;AAChB,IAAA;AAEoC,IAAA;AACX,IAAA;AAC1B,EAAA;AAAA;AAAA;AAAA;AAK2D,EAAA;AAC1B,IAAA;AAEA,MAAA;AACO,MAAA;AAExB,MAAA;AACqC,QAAA;AAEhC,MAAA;AAKwC,QAAA;AACzD,MAAA;AAMgC,MAAA;AACnC,IAAA;AACkB,IAAA;AACqB,MAAA;AACvC,IAAA;AACD,EAAA;AAEqD,EAAA;AApetD,IAAA;AAqe+B,IAAA;AACR,IAAA;AAKE,IAAA;AAGtB,MAAA;AACD,IAAA;AAC0B,IAAA;AAEkB,IAAA;AACgB,MAAA;AAC5B,MAAA;AACL,MAAA;AAC3B,IAAA;AACgB,IAAA;AACC,IAAA;AAClB,EAAA;AAEwE,EAAA;AAClC,IAAA;AAMT,MAAA;AACA,MAAA;AAC3B,MAAA;AACD,IAAA;AAEiB,IAAA;AACwB,MAAA;AAE5B,IAAA;AACgB,MAAA;AACA,MAAA;AAC3B,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBuC,EAAA;AACW,IAAA;AACjB,IAAA;AAIL,IAAA;AACiC,IAAA;AACpB,MAAA;AACvC,IAAA;AACW,IAAA;AACb,EAAA;AAEoD,EAAA;AAjjBrD,IAAA;AAkjB4B,IAAA;AACA,IAAA;AAGR,IAAA;AAMQ,IAAA;AAKY,MAAA;AACL,MAAA;AACpB,QAAA;AACG,UAAA;AACR,YAAA;AACiC,cAAA;AACG,cAAA;AAC1B,YAAA;AACJ,cAAA;AACF,gBAAA;AACN,gBAAA;AACD,cAAA;AACD,YAAA;AACE,UAAA;AACJ,QAAA;AACD,MAAA;AACgC,MAAA;AACpB,QAAA;AACG,UAAA;AACR,YAAA;AACiC,cAAA;AACG,cAAA;AAC1B,YAAA;AACJ,cAAA;AACK,gBAAA;AACb,gBAAA;AACD,cAAA;AACD,YAAA;AACE,UAAA;AACJ,QAAA;AACD,MAAA;AAC4B,MAAA;AAEK,MAAA;AACM,MAAA;AAIS,QAAA;AAChD,MAAA;AACD,IAAA;AACmB,IAAA;AACZ,MAAA;AACF,MAAA;AAAwB,QAAA;AA5mB/B,UAAA;AA6mBuC,UAAA;AAAnC,QAAA;AACD,MAAA;AACA,IAAA;AACF,EAAA;AAM+B,EAAA;AAtnBhC,IAAA;AAunBsD,IAAA;AAChD,IAAA;AACiC,MAAA;AAErB,MAAA;AAId,MAAA;AAEO,QAAA;AACR,MAAA;AACa,IAAA;AACJ,MAAA;AACF,QAAA;AACN,QAAA;AACD,MAAA;AACD,IAAA;AACO,IAAA;AACR,EAAA;AAE8B,EAAA;AACU,IAAA;AACjC,MAAA;AAC+B,IAAA;AACe,MAAA;AACpD,IAAA;AACwB,IAAA;AACzB,EAAA;AAEoB,EAAA;AACsB,IAAA;AAC1C,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWe,EAAA;AACkB,IAAA;AACH,IAAA;AAC9B,EAAA;AAKQ,EAAA;AACuC,IAAA;AACvB,IAAA;AAE2B,IAAA;AACQ,MAAA;AACZ,MAAA;AAC9C,IAAA;AAEY,IAAA;AACJ,IAAA;AACoD,MAAA;AAC5D,IAAA;AAEoC,IAAA;AACE,MAAA;AACtC,IAAA;AAEqB,IAAA;AAEyB,MAAA;AAGa,MAAA;AAC3D,IAAA;AAEoD,IAAA;AACZ,MAAA;AACxC,IAAA;AAE2D,IAAA;AAC/C,IAAA;AACb,EAAA;AACD;AAE+E;AACxC,EAAA;AACJ,EAAA;AAEY,EAAA;AACF,EAAA;AAC7C;AAKW;AAC2B,EAAA;AACH,EAAA;AAEY,EAAA;AACF,EAAA;AAC7C;AAEoE;AACzB,EAAA;AACzC,IAAA;AAC8C,IAAA;AAC9C,EAAA;AACF;AAIe;AACW,EAAA;AAC1B;ALm/KyE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs","sourcesContent":[null,"import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport {\n\ttype Actions,\n\ttype ActorConfig,\n\ttype ActorConfigInput,\n\tActorConfigSchema,\n} from \"./config\";\nimport { loggerWithoutContext } from \"./log\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"./schema\";\n\nconst warnedDeprecatedTimeoutKeys = new Set<string>();\n\nfunction warnDeprecatedShutdownTimeoutKeys(options: unknown) {\n\tif (!options || typeof options !== \"object\") return;\n\tconst opts = options as Record<string, unknown>;\n\tfor (const key of [\"onDestroyTimeout\", \"waitUntilTimeout\"]) {\n\t\tif (opts[key] !== undefined && !warnedDeprecatedTimeoutKeys.has(key)) {\n\t\t\twarnedDeprecatedTimeoutKeys.add(key);\n\t\t\tloggerWithoutContext().warn({\n\t\t\t\tmsg: `actor option \\`${key}\\` is deprecated and is now ignored. Configure \\`sleepGracePeriod\\` instead, which bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0.`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport interface BaseActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\t_R extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> {\n\treadonly config: ActorConfig<S, CP, CS, V, I, DB, E, Q, _R>;\n}\n\nexport interface AnyActorDefinition {\n\treadonly config: any;\n}\n\nexport type AnyStaticActorDefinition = ActorDefinition<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport class ActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\tR extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> implements BaseActorDefinition<S, CP, CS, V, I, DB, E, Q, R>\n{\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q, R>;\n\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q, R>) {\n\t\tthis.#config = config;\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q, R> {\n\t\treturn this.#config;\n\t}\n}\n\nexport interface BaseActorInstance<\n\tS = any,\n\tCP = any,\n\tCS = any,\n\tV = any,\n\tI = any,\n\tDB extends AnyDatabaseProvider = AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\tid: string;\n\tconfig: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\trLog: Record<string, (...args: any[]) => any>;\n\t[key: string]: any;\n}\n\nexport type AnyActorInstance = BaseActorInstance<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type AnyStaticActorInstance = AnyActorInstance;\n\nexport function isStaticActorInstance(\n\t_actor: AnyActorInstance,\n): _actor is AnyStaticActorInstance {\n\treturn true;\n}\n\nexport function actor<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues,\n\t\tTActions\n\t>,\n): ActorDefinition<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues,\n\tTActions\n> {\n\twarnDeprecatedShutdownTimeoutKeys(\n\t\t(input as { options?: unknown } | undefined)?.options,\n\t);\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues,\n\t\tTActions\n\t>;\n\treturn new ActorDefinition(config);\n}\n\nexport function isStaticActorDefinition(\n\tdefinition: AnyActorDefinition,\n): definition is AnyStaticActorDefinition {\n\treturn definition instanceof ActorDefinition;\n}\n\nexport function lookupInRegistry(\n\tconfig: RegistryConfig,\n\tname: string,\n): AnyActorDefinition {\n\tconst definition = config.use[name];\n\tif (!definition) throw new Error(`no actor in registry for name ${name}`);\n\treturn definition;\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { unsupportedFeature } from \"./errors\";\n\nexport type SchemaHookResult = boolean | Promise<boolean>;\n\ntype SchemaHook<TContext = any> = (ctx: TContext) => SchemaHookResult;\n\nexport interface EventTypeToken<T, TContext = any> {\n\treadonly _eventType?: T;\n\treadonly canSubscribe?: SchemaHook<TContext>;\n\treadonly schema?: PrimitiveSchema;\n}\n\nexport interface QueueTypeToken<TMessage, TComplete = never, TContext = any> {\n\treadonly _queueMessage?: TMessage;\n\treadonly _queueComplete?: TComplete;\n\treadonly canPublish?: SchemaHook<TContext>;\n\treadonly message?: PrimitiveSchema;\n\treadonly complete?: PrimitiveSchema;\n}\n\n/** @deprecated Use `event<T>()`. */\nexport type Type<T> = EventTypeToken<T, any>;\n\ninterface EventOptions<TContext = any> {\n\tcanSubscribe?: SchemaHook<TContext>;\n\tschema?: PrimitiveSchema;\n}\n\ninterface QueueOptions<TContext = any> {\n\tcanPublish?: SchemaHook<TContext>;\n\tmessage?: PrimitiveSchema;\n\tcomplete?: PrimitiveSchema;\n}\n\nexport function event<T, TContext = any>(\n\toptions?: EventOptions<TContext>,\n): EventTypeToken<T, TContext> {\n\treturn (options ?? {}) as EventTypeToken<T, TContext>;\n}\n\nexport function queue<TMessage, TComplete = never, TContext = any>(\n\toptions?: QueueOptions<TContext>,\n): QueueTypeToken<TMessage, TComplete, TContext> {\n\treturn (options ?? {}) as QueueTypeToken<TMessage, TComplete, TContext>;\n}\n\nexport type PrimitiveSchema = StandardSchemaV1 | EventTypeToken<unknown, any>;\n\nexport interface EventSchemaDefinition<TContext = any> {\n\tschema: PrimitiveSchema;\n\tcanSubscribe?: SchemaHook<TContext>;\n}\n\nexport interface QueueSchemaDefinition<TContext = any> {\n\tmessage: PrimitiveSchema;\n\tcomplete?: PrimitiveSchema;\n\tcanPublish?: SchemaHook<TContext>;\n}\n\nexport type EventSchema<TContext = any> =\n\t| PrimitiveSchema\n\t| EventSchemaDefinition<TContext>;\nexport type QueueSchema =\n\t| PrimitiveSchema\n\t| QueueSchemaDefinition<any>\n\t| QueueTypeToken<unknown, unknown, any>;\nexport type EventSchemaConfig<TContext = any> = Record<\n\tstring,\n\tEventSchema<TContext>\n>;\nexport type QueueSchemaConfig<_TContext = any> = Record<string, QueueSchema>;\nexport type AnySchemaConfig = EventSchemaConfig | QueueSchemaConfig;\n\n/** @deprecated Use `EventSchema` or `QueueSchema`. */\nexport type Schema = QueueSchema;\n/** @deprecated Use `EventSchemaConfig` or `QueueSchemaConfig`. */\nexport type SchemaConfig = QueueSchemaConfig;\n\nexport type InferSchema<T> =\n\tT extends QueueSchemaDefinition<any>\n\t\t? InferSchema<T[\"message\"]>\n\t\t: T extends QueueTypeToken<infer M, unknown, any>\n\t\t\t? M\n\t\t\t: T extends EventSchemaDefinition<any>\n\t\t\t\t? InferSchema<T[\"schema\"]>\n\t\t\t\t: T extends StandardSchemaV1<any, infer O>\n\t\t\t\t\t? O\n\t\t\t\t\t: T extends EventTypeToken<infer R, any>\n\t\t\t\t\t\t? R\n\t\t\t\t\t\t: never;\n\nexport type InferSchemaMap<T extends Record<string, unknown>> = {\n\t[K in keyof T]: InferSchema<T[K]>;\n};\n\nexport type InferQueueComplete<T> =\n\tT extends QueueTypeToken<unknown, infer C, any>\n\t\t? [C] extends [never]\n\t\t\t? never\n\t\t\t: C\n\t\t: T extends QueueSchemaDefinition<any>\n\t\t\t? T[\"complete\"] extends PrimitiveSchema\n\t\t\t\t? InferSchema<T[\"complete\"]>\n\t\t\t\t: never\n\t\t\t: never;\n\nexport type InferQueueCompleteMap<T extends QueueSchemaConfig> = {\n\t[K in keyof T]: InferQueueComplete<T[K]>;\n};\n\nexport type InferEventArgs<T> = T extends readonly unknown[]\n\t? number extends T[\"length\"]\n\t\t? [T]\n\t\t: T\n\t: [T];\n\nexport type ValidationResult<T> =\n\t| { success: true; data: T }\n\t| { success: false; issues: unknown[] };\n\nexport function isStandardSchema(value: unknown): value is StandardSchemaV1 {\n\treturn typeof value === \"object\" && value !== null && \"~standard\" in value;\n}\n\nexport function isQueueSchemaDefinition(\n\tvalue: unknown,\n): value is QueueSchemaDefinition<any> {\n\tif (isEventSchemaDefinition(value)) {\n\t\treturn false;\n\t}\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"message\" in value &&\n\t\t(value as { message?: unknown }).message !== undefined\n\t);\n}\n\nexport function isEventSchemaDefinition(\n\tvalue: unknown,\n): value is EventSchemaDefinition<any> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"schema\" in value &&\n\t\t(value as { schema?: unknown }).schema !== undefined\n\t);\n}\n\nexport function hasSchemaConfigKey<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: string,\n): boolean {\n\tif (!schemas) {\n\t\treturn false;\n\t}\n\treturn Object.hasOwn(schemas, key);\n}\n\nexport function getEventCanSubscribe<TContext = any>(\n\tschemas: EventSchemaConfig<TContext> | undefined,\n\tkey: string,\n): SchemaHook<TContext> | undefined {\n\tconst schema = schemas?.[key];\n\tif (!schema || isStandardSchema(schema)) {\n\t\treturn undefined;\n\t}\n\n\tconst maybeCanSubscribe = (schema as { canSubscribe?: unknown })\n\t\t.canSubscribe;\n\treturn typeof maybeCanSubscribe === \"function\"\n\t\t? (maybeCanSubscribe as SchemaHook<TContext>)\n\t\t: undefined;\n}\n\nexport function getQueueCanPublish<TContext = any>(\n\tschemas: QueueSchemaConfig | undefined,\n\tkey: string,\n): SchemaHook<TContext> | undefined {\n\tconst schema = schemas?.[key];\n\tif (!schema || isStandardSchema(schema)) {\n\t\treturn undefined;\n\t}\n\n\tconst maybeCanPublish = (schema as { canPublish?: unknown }).canPublish;\n\treturn typeof maybeCanPublish === \"function\"\n\t\t? (maybeCanPublish as SchemaHook<TContext>)\n\t\t: undefined;\n}\n\nfunction getValidationSchema(\n\tschema: QueueSchema | EventSchema | undefined,\n): QueueSchema | EventSchema | undefined {\n\tif (!schema) {\n\t\treturn undefined;\n\t}\n\tif (isEventSchemaDefinition(schema)) {\n\t\treturn schema.schema;\n\t}\n\tif (isQueueSchemaDefinition(schema)) {\n\t\treturn schema.message;\n\t}\n\tif (\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"schema\" in schema &&\n\t\t(schema as { schema?: unknown }).schema !== undefined\n\t) {\n\t\treturn (schema as { schema: QueueSchema | EventSchema }).schema;\n\t}\n\tif (\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"message\" in schema &&\n\t\t(schema as { message?: unknown }).message !== undefined\n\t) {\n\t\treturn (schema as { message: QueueSchema | EventSchema }).message;\n\t}\n\treturn schema;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"then\" in value &&\n\t\ttypeof (value as { then?: unknown }).then === \"function\"\n\t);\n}\n\nexport async function validateSchema<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: keyof T & string,\n\tdata: unknown,\n): Promise<ValidationResult<InferSchemaMap<T>[typeof key]>> {\n\tconst schema = getValidationSchema(schemas?.[key]);\n\n\tif (!schema) {\n\t\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n\t}\n\n\tif (isStandardSchema(schema)) {\n\t\tconst result = await schema[\"~standard\"].validate(data);\n\t\tif (result.issues) {\n\t\t\treturn { success: false, issues: [...result.issues] };\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: result.value as InferSchemaMap<T>[typeof key],\n\t\t};\n\t}\n\n\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n}\n\nexport function validateSchemaSync<T extends AnySchemaConfig>(\n\tschemas: T | undefined,\n\tkey: keyof T & string,\n\tdata: unknown,\n): ValidationResult<InferSchemaMap<T>[typeof key]> {\n\tconst schema = getValidationSchema(schemas?.[key]);\n\n\tif (!schema) {\n\t\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n\t}\n\n\tif (isStandardSchema(schema)) {\n\t\tconst result = schema[\"~standard\"].validate(data);\n\t\tif (isPromiseLike(result)) {\n\t\t\tthrow unsupportedFeature(\"async schema validation\");\n\t\t}\n\t\tif (result.issues) {\n\t\t\treturn { success: false, issues: [...result.issues] };\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: result.value as InferSchemaMap<T>[typeof key],\n\t\t};\n\t}\n\n\treturn { success: true, data: data as InferSchemaMap<T>[typeof key] };\n}\n","import { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/common/actor-websocket\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { getLogger } from \"./log\";\n\nfunction logger() {\n\treturn getLogger(\"inline-websocket-adapter\");\n}\n\n/**\n * InlineWebSocketAdapter creates two linked WebSocket objects:\n * - clientWs: for the client/proxy side (returned from openWebSocket)\n * - actorWs: for the actor side (passed via wsContext.raw)\n *\n * Each side's send() triggers the OTHER side's message event.\n */\nexport class InlineWebSocketAdapter {\n\t#handler: UpgradeWebSocketArgs;\n\t#wsContext: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 0;\n\t#restoring: boolean;\n\t#pendingClientMessages: Array<{\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\trivetMessageIndex?: number;\n\t}> = [];\n\n\t#clientWs: VirtualWebSocket;\n\t#actorWs: VirtualWebSocket;\n\n\tconstructor(\n\t\thandler: UpgradeWebSocketArgs,\n\t\toptions: {\n\t\t\trestoring?: boolean;\n\t\t} = {},\n\t) {\n\t\tthis.#handler = handler;\n\t\tthis.#restoring = options.restoring ?? false;\n\n\t\t// Create linked WebSocket pair\n\t\t// Client's send() -> handler.onMessage (for RPC) + Actor's message event (for raw WS)\n\t\t// Actor's send() -> Client's message event\n\t\tthis.#clientWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.dispatchClientMessageWithMetadata(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\tthis.#actorWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.#clientWs.triggerMessage(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\t// Create WSContext with actorWs as raw\n\t\tthis.#wsContext = new WSContext({\n\t\t\traw: this.#actorWs,\n\t\t\tsend: (data: string | ArrayBuffer | Uint8Array) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.send called\" });\n\t\t\t\tthis.#clientWs.triggerMessage(data);\n\t\t\t},\n\t\t\tclose: (code?: number, reason?: string) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.close called\", code, reason });\n\t\t\t\tthis.#close(code || 1000, reason || \"\");\n\t\t\t},\n\t\t\treadyState: 1,\n\t\t});\n\n\t\t// Defer initialization to allow event listeners to be attached first\n\t\tsetTimeout(() => {\n\t\t\tthis.#initialize();\n\t\t}, 0);\n\t}\n\n\t/** Get the client-side WebSocket (for proxy/client code) */\n\tget clientWebSocket(): UniversalWebSocket {\n\t\treturn this.#clientWs;\n\t}\n\n\t/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */\n\tget actorWebSocket(): UniversalWebSocket {\n\t\treturn this.#actorWs;\n\t}\n\n\t/**\n\t * Dispatch a client->actor message with optional transport metadata.\n\t *\n\t * This is used by dynamic actor host bridges to preserve\n\t * `rivetMessageIndex` on hibernatable engine websocket paths.\n\t */\n\tdispatchClientMessageWithMetadata(\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView,\n\t\trivetMessageIndex?: number,\n\t): void {\n\t\tif (this.#readyState === this.#clientWs.CONNECTING) {\n\t\t\tthis.#pendingClientMessages.push({ data, rivetMessageIndex });\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tthis.#readyState === this.#clientWs.CLOSING ||\n\t\t\tthis.#readyState === this.#clientWs.CLOSED\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#dispatchClientMessage(data, rivetMessageIndex);\n\t}\n\n\t#dispatchClientMessage(\n\t\tdata: string | ArrayBufferLike | Blob | ArrayBufferView,\n\t\trivetMessageIndex?: number,\n\t): void {\n\t\ttry {\n\t\t\tthis.#handler.onMessage(\n\t\t\t\t{ data, rivetMessageIndex },\n\t\t\t\tthis.#wsContext,\n\t\t\t);\n\t\t\t(this.#actorWs as any).dispatchEvent({\n\t\t\t\ttype: \"message\",\n\t\t\t\tdata,\n\t\t\t\trivetMessageIndex,\n\t\t\t\ttarget: this.#actorWs,\n\t\t\t\tcurrentTarget: this.#actorWs,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error processing message\");\n\t\t}\n\t}\n\n\tasync #initialize(): Promise<void> {\n\t\ttry {\n\t\t\tlogger().debug({ msg: \"websocket initializing\" });\n\n\t\t\tthis.#readyState = 1; // OPEN\n\n\t\t\tif (this.#restoring && this.#handler.onRestore) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"calling handler.onRestore with WSContext\",\n\t\t\t\t});\n\t\t\t\tthis.#handler.onRestore(this.#wsContext);\n\t\t\t} else {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"calling handler.onOpen with WSContext\",\n\t\t\t\t});\n\t\t\t\tthis.#handler.onOpen(undefined, this.#wsContext);\n\t\t\t}\n\n\t\t\t// Fire open event to both sides\n\t\t\tthis.#clientWs.triggerOpen();\n\t\t\tthis.#actorWs.triggerOpen();\n\t\t\twhile (this.#pendingClientMessages.length > 0) {\n\t\t\t\tconst next = this.#pendingClientMessages.shift();\n\t\t\t\tif (!next) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.#dispatchClientMessage(next.data, next.rivetMessageIndex);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error during initialization\");\n\t\t}\n\t}\n\n\t#handleError(error: unknown): void {\n\t\tconsole.error(\"INLINE_WEBSOCKET_ADAPTER_ERROR\", error);\n\t\tlogger().error({\n\t\t\tmsg: \"error in websocket\",\n\t\t\terror,\n\t\t\terrorMessage:\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\n\t\t// Call handler.onError\n\t\ttry {\n\t\t\tthis.#handler.onError(error, this.#wsContext);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"error in onError handler\",\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\n\t\t// Fire error event to both sides\n\t\tthis.#clientWs.triggerError(error);\n\t\tthis.#actorWs.triggerError(error);\n\t}\n\n\t#close(code: number, reason: string): void {\n\t\tif (this.#readyState === 3 || this.#readyState === 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"closing websocket\", code, reason });\n\n\t\tthis.#readyState = 2; // CLOSING\n\n\t\ttry {\n\t\t\tthis.#handler.onClose(\n\t\t\t\t{ code, reason, wasClean: true },\n\t\t\t\tthis.#wsContext,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error });\n\t\t} finally {\n\t\t\tthis.#readyState = 3; // CLOSED\n\n\t\t\t// Fire close event to both sides\n\t\t\tthis.#clientWs.triggerClose(code, reason);\n\t\t\tthis.#actorWs.triggerClose(code, reason);\n\t\t}\n\t}\n}\n\n/**\n * Creates an InlineWebSocketAdapter and returns the client-side WebSocket.\n * This is the main entry point for creating inline WebSocket connections.\n */\nexport function createInlineWebSocket(\n\thandler: UpgradeWebSocketArgs,\n): UniversalWebSocket {\n\tconst adapter = new InlineWebSocketAdapter(handler);\n\treturn adapter.clientWebSocket;\n}\n","import { Hono } from \"hono\";\nimport { isLocalEngineEndpoint } from \"@/common/engine\";\nimport { configureServerlessPool } from \"@/serverless/configure\";\nimport { detectRuntime, VERSION } from \"@/utils\";\nimport { crossPlatformServe, loadRuntimeServeStatic } from \"@/utils/serve\";\nimport {\n\ttype RegistryActors,\n\ttype RegistryConfig,\n\ttype RegistryConfigInput,\n\tRegistryConfigSchema,\n} from \"./config\";\nimport { logger } from \"./log\";\nimport { buildConfiguredRegistry } from \"./native\";\nimport type { RuntimeServerlessResponseHead } from \"./runtime\";\n\ntype ShutdownSignal = \"SIGINT\" | \"SIGTERM\";\n\nfunction signalExitCode(signal: ShutdownSignal): number {\n\tswitch (signal) {\n\t\tcase \"SIGINT\":\n\t\t\treturn 130;\n\t\tcase \"SIGTERM\":\n\t\t\treturn 143;\n\t}\n}\n\nfunction finishShutdownSignal(signal: ShutdownSignal): void {\n\tif (process.pid === 1) {\n\t\tprocess.exit(signalExitCode(signal));\n\t}\n\tprocess.kill(process.pid, signal);\n}\n\nexport type FetchHandler = (\n\trequest: Request,\n\t...args: any\n) => Response | Promise<Response>;\n\nexport interface ServerlessHandler {\n\tfetch: FetchHandler;\n}\n\nexport interface RegistryRoutes {\n\thealth(): Promise<Response>;\n\tmetadata(): Promise<Response>;\n\tprometheusMetrics(request?: Request): Promise<Response>;\n}\n\n/**\n * Injectable dependencies for {@link Registry}. Production code uses the\n * defaults. Tests override `buildConfiguredRegistry` to drive lifecycle\n * orchestration against a fake `CoreRuntime` without an engine.\n */\nexport interface RegistryDeps {\n\tbuildConfiguredRegistry: typeof buildConfiguredRegistry;\n}\n\nexport class Registry<A extends RegistryActors> {\n\t#config: RegistryConfigInput<A>;\n\t#buildConfiguredRegistry: typeof buildConfiguredRegistry;\n\tpublic readonly routes: RegistryRoutes;\n\n\tget config(): RegistryConfigInput<A> {\n\t\treturn this.#config;\n\t}\n\n\tparseConfig(): RegistryConfig {\n\t\treturn RegistryConfigSchema.parse(this.#config);\n\t}\n\n\t#runtimeServePromise?: Promise<void>;\n\t#runtimeServeConfiguredPromise?: ReturnType<typeof buildConfiguredRegistry>;\n\t#runtimeServerlessPromise?: ReturnType<typeof buildConfiguredRegistry>;\n\t#configureServerlessPoolPromise?: Promise<void>;\n\t#welcomePrinted = false;\n\t#shutdownInstalled = false;\n\t#shutdownInFlight: Promise<void> | null = null;\n\t#signalHandlers: Partial<Record<ShutdownSignal, () => void>> = {};\n\n\tconstructor(config: RegistryConfigInput<A>, deps?: Partial<RegistryDeps>) {\n\t\tthis.#config = config;\n\t\tthis.#buildConfiguredRegistry =\n\t\t\tdeps?.buildConfiguredRegistry ?? buildConfiguredRegistry;\n\t\tthis.routes = {\n\t\t\thealth: () => this.#healthRoute(),\n\t\t\tmetadata: () => this.#metadataRoute(),\n\t\t\tprometheusMetrics: (request?: Request) =>\n\t\t\t\tthis.#prometheusMetricsRoute(request),\n\t\t};\n\t}\n\n\t#ensureServerlessPoolConfigured(\n\t\tconfig: RegistryConfig,\n\t): Promise<void> | undefined {\n\t\tif (!config.configurePool) return undefined;\n\n\t\tif (!this.#configureServerlessPoolPromise) {\n\t\t\tthis.#configureServerlessPoolPromise = configureServerlessPool(\n\t\t\t\tconfig,\n\t\t\t).catch((error) => {\n\t\t\t\tthis.#configureServerlessPoolPromise = undefined;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tthis.#configureServerlessPoolPromise.catch(() => {});\n\t\t}\n\n\t\treturn this.#configureServerlessPoolPromise;\n\t}\n\n\t/**\n\t * Handle an incoming HTTP request for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const app = new Hono();\n\t * app.all(\"/api/rivet/*\", (c) => registry.handler(c.req.raw));\n\t * export default app;\n\t * ```\n\t */\n\tpublic async handler(request: Request): Promise<Response> {\n\t\tconst config = this.parseConfig();\n\t\tthis.#printWelcome(config, \"serverless\");\n\n\t\tif (!this.#runtimeServerlessPromise) {\n\t\t\tthis.#runtimeServerlessPromise =\n\t\t\t\tthis.#buildConfiguredRegistry(config);\n\t\t}\n\n\t\tconst { runtime, registry, serveConfig } =\n\t\t\tawait this.#runtimeServerlessPromise;\n\t\tconst isStartRequest = isServerlessStartRequest(\n\t\t\trequest,\n\t\t\tserveConfig.serverlessBasePath ?? \"/api/rivet\",\n\t\t);\n\t\tconst isMetadataRequest = isServerlessMetadataRequest(\n\t\t\trequest,\n\t\t\tserveConfig.serverlessBasePath ?? \"/api/rivet\",\n\t\t);\n\t\tconst isEngineMetadataRequest =\n\t\t\trequest.headers.get(\"user-agent\")?.startsWith(\"RivetEngine/\") ??\n\t\t\tfalse;\n\n\t\tif (isStartRequest) {\n\t\t\ttry {\n\t\t\t\tawait this.#ensureServerlessPoolConfigured(config);\n\t\t\t} catch (_error) {\n\t\t\t\treturn new Response(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tgroup: \"guard\",\n\t\t\t\t\t\tcode: \"service_unavailable\",\n\t\t\t\t\t\tmessage: \"Serverless pool is not configured.\",\n\t\t\t\t\t\tmetadata: null,\n\t\t\t\t\t}),\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst cancelToken = runtime.createCancellationToken();\n\t\tconst abort = () => runtime.cancelCancellationToken(cancelToken);\n\t\tif (request.signal.aborted) {\n\t\t\tabort();\n\t\t} else {\n\t\t\trequest.signal.addEventListener(\"abort\", abort, { once: true });\n\t\t}\n\n\t\tconst requestBody = await request.arrayBuffer();\n\t\tif (\n\t\t\tisStartRequest &&\n\t\t\trequestBody.byteLength > serveConfig.serverlessMaxStartPayloadBytes\n\t\t) {\n\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\treturn new Response(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tgroup: \"message\",\n\t\t\t\t\tcode: \"incoming_too_long\",\n\t\t\t\t\tmessage: `Incoming message too long. Received ${requestBody.byteLength} bytes, limit is ${serveConfig.serverlessMaxStartPayloadBytes} bytes.`,\n\t\t\t\t\tmetadata: null,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tstatus: 413,\n\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tlet settled = false;\n\t\tlet controllerRef:\n\t\t\t| ReadableStreamDefaultController<Uint8Array>\n\t\t\t| undefined;\n\t\tconst backpressureWaiters: Array<() => void> = [];\n\t\tconst resolveBackpressure = () => {\n\t\t\twhile (\n\t\t\t\tcontrollerRef &&\n\t\t\t\t(controllerRef.desiredSize ?? 1) > 0 &&\n\t\t\t\tbackpressureWaiters.length > 0\n\t\t\t) {\n\t\t\t\tbackpressureWaiters.shift()?.();\n\t\t\t}\n\t\t};\n\t\tconst waitForBackpressure = async () => {\n\t\t\tif (!controllerRef || (controllerRef.desiredSize ?? 1) > 0) return;\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tbackpressureWaiters.push(resolve);\n\t\t\t});\n\t\t};\n\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\tstart(controller) {\n\t\t\t\tcontrollerRef = controller;\n\t\t\t},\n\t\t\tpull() {\n\t\t\t\tresolveBackpressure();\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\tsettled = true;\n\t\t\t\tresolveBackpressure();\n\t\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\t},\n\t\t});\n\n\t\tconst headers: Record<string, string> = {};\n\t\trequest.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tlet head: RuntimeServerlessResponseHead;\n\t\ttry {\n\t\t\thead = await runtime.handleServerlessRequest(\n\t\t\t\tregistry,\n\t\t\t\t{\n\t\t\t\t\tmethod: request.method,\n\t\t\t\t\turl: request.url,\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: new Uint8Array(requestBody),\n\t\t\t\t},\n\t\t\t\tasync (\n\t\t\t\t\terror: unknown,\n\t\t\t\t\tevent?: {\n\t\t\t\t\t\tkind: \"chunk\" | \"end\";\n\t\t\t\t\t\tchunk?: Uint8Array;\n\t\t\t\t\t\terror?: {\n\t\t\t\t\t\t\tgroup: string;\n\t\t\t\t\t\t\tcode: string;\n\t\t\t\t\t\t\tmessage: string;\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t) => {\n\t\t\t\t\tif (error) throw error;\n\t\t\t\t\tif (!event || settled) return;\n\t\t\t\t\tif (event.kind === \"chunk\") {\n\t\t\t\t\t\tawait waitForBackpressure();\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tif (event.chunk) controllerRef?.enqueue(event.chunk);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolveBackpressure();\n\t\t\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\t\t\tif (event.error) {\n\t\t\t\t\t\tcontrollerRef?.error(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`${event.error.group}.${event.error.code}: ${event.error.message}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontrollerRef?.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcancelToken,\n\t\t\t\tserveConfig,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\t// The runtime call itself rejected (e.g. `registry_shut_down_error`).\n\t\t\t// Clean up the abort listener so it doesn't leak, then propagate.\n\t\t\trequest.signal.removeEventListener(\"abort\", abort);\n\t\t\truntime.cancelCancellationToken(cancelToken);\n\t\t\tthrow err;\n\t\t}\n\n\t\tif (isMetadataRequest && !isEngineMetadataRequest) {\n\t\t\ttry {\n\t\t\t\tawait this.#ensureServerlessPoolConfigured(config);\n\t\t\t} catch (_error) {\n\t\t\t\treturn new Response(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tgroup: \"guard\",\n\t\t\t\t\t\tcode: \"service_unavailable\",\n\t\t\t\t\t\tmessage: \"Serverless pool is not configured.\",\n\t\t\t\t\t\tmetadata: null,\n\t\t\t\t\t}),\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn new Response(stream, {\n\t\t\tstatus: head.status,\n\t\t\theaders: head.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a fetch handler for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * export default registry.serve();\n\t * ```\n\t */\n\tpublic serve(): ServerlessHandler {\n\t\treturn {\n\t\t\tfetch: (request) => this.handler(request),\n\t\t};\n\t}\n\n\t/**\n\t * Starts an HTTP server that dispatches every request through the\n\t * serverless handler. Uses `crossPlatformServe` to pick the right\n\t * runtime (Node, Bun, Deno).\n\t *\n\t * @param opts.port Port to listen on. Defaults to 3000.\n\t * @param opts.publicDir If set, serves static files from this directory\n\t * before falling through to the registry handler.\n\t *\n\t * @example\n\t * ```ts\n\t * await registry.listen();\n\t * await registry.listen({ port: 8080, publicDir: \"./public\" });\n\t * ```\n\t */\n\tpublic async listen(\n\t\topts: { port?: number; publicDir?: string } = {},\n\t): Promise<void> {\n\t\tconst port = opts.port ?? 3000;\n\t\tconst config = this.parseConfig();\n\t\tconst runtime = detectRuntime();\n\t\tconst app = new Hono();\n\t\tif (opts.publicDir) {\n\t\t\tconst serveStatic = await loadRuntimeServeStatic(runtime);\n\t\t\tapp.use(\"*\", serveStatic({ root: opts.publicDir }));\n\t\t}\n\t\tapp.all(\"*\", (c) => this.handler(c.req.raw));\n\t\tawait crossPlatformServe(config, port, app, runtime);\n\t}\n\n\t/**\n\t * Returns a health response suitable for mounting in a user-owned router.\n\t */\n\tasync #healthRoute(): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn jsonRouteResponse(503, {\n\t\t\t\tstatus: \"not_started\",\n\t\t\t\truntime: \"rivetkit\",\n\t\t\t\tversion: VERSION,\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryHealth) {\n\t\t\treturn jsonRouteResponse(501, {\n\t\t\t\tstatus: \"unsupported\",\n\t\t\t\truntime: \"rivetkit\",\n\t\t\t\tversion: VERSION,\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryHealth(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns serverless metadata suitable for mounting in a user-owned router.\n\t */\n\tasync #metadataRoute(): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn new Response(\"registry not started\\n\", {\n\t\t\t\tstatus: 503,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryMetadata) {\n\t\t\treturn new Response(\"metadata is not supported by this runtime\\n\", {\n\t\t\t\tstatus: 501,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryMetadata(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Prometheus metrics response suitable for mounting in a user-owned router.\n\t */\n\tasync #prometheusMetricsRoute(_request?: Request): Promise<Response> {\n\t\tconst configured = await this.#activeConfiguredRegistry();\n\t\tif (!configured) {\n\t\t\treturn new Response(\"registry not started\\n\", {\n\t\t\t\tstatus: 503,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { runtime, registry } = configured;\n\t\tif (!runtime.registryMetrics) {\n\t\t\treturn new Response(\"metrics are not supported by this runtime\\n\", {\n\t\t\t\tstatus: 501,\n\t\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst response = await runtime.registryMetrics(registry);\n\t\treturn new Response(new Uint8Array(response.body), {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\tasync #activeConfiguredRegistry(): Promise<\n\t\tAwaited<ReturnType<typeof buildConfiguredRegistry>> | undefined\n\t> {\n\t\tconst candidates = [\n\t\t\tthis.#runtimeServerlessPromise,\n\t\t\tthis.#runtimeServeConfiguredPromise,\n\t\t].filter(\n\t\t\t(\n\t\t\t\tcandidate,\n\t\t\t): candidate is ReturnType<typeof buildConfiguredRegistry> =>\n\t\t\t\tcandidate !== undefined,\n\t\t);\n\n\t\tif (candidates.length === 0) return undefined;\n\t\treturn await candidates[0]!;\n\t}\n\n\t/**\n\t * Starts an actor envoy for standalone server deployments.\n\t */\n\t#startEnvoy(config: RegistryConfig, printWelcome: boolean) {\n\t\tif (!this.#runtimeServePromise) {\n\t\t\tconst configuredRegistryPromise =\n\t\t\t\tthis.#buildConfiguredRegistry(config);\n\t\t\tthis.#runtimeServeConfiguredPromise = configuredRegistryPromise;\n\t\t\tthis.#runtimeServePromise = configuredRegistryPromise\n\t\t\t\t.then(async ({ runtime, registry, serveConfig }) => {\n\t\t\t\t\tawait runtime.serveRegistry(registry, serveConfig);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Always-attached catch so the stored promise never leaves a\n\t\t\t\t\t// rejection unhandled. Downstream awaits (e.g. #runShutdown's\n\t\t\t\t\t// Promise.race) attach their own catches and still observe\n\t\t\t\t\t// resolution via the race.\n\t\t\t\t\tlogger().warn({ error }, \"runtime registry serve errored\");\n\t\t\t\t});\n\t\t\t// Install signal handlers once an envoy lifecycle has begun. Only\n\t\t\t// Mode A ever reaches here. Mode B (handler(request)) intentionally\n\t\t\t// does not install handlers because it runs on Workers/Vercel/Deno\n\t\t\t// Deploy where `process.on` is absent or forbidden; those platforms\n\t\t\t// own their own signal policy.\n\t\t\tthis.#installSignalHandlers(config);\n\t\t}\n\t\tif (printWelcome) {\n\t\t\tthis.#printWelcome(config, \"serverful\");\n\t\t}\n\t}\n\n\t#installSignalHandlers(config: RegistryConfig): void {\n\t\tif (this.#shutdownInstalled) return;\n\t\tif (config.shutdown?.disableSignalHandlers) return;\n\t\t// Guard against non-Node runtimes (Workers/Edge) where `process` may\n\t\t// exist but `process.on` is unavailable or forbidden.\n\t\tif (\n\t\t\ttypeof process === \"undefined\" ||\n\t\t\ttypeof process.on !== \"function\" ||\n\t\t\ttypeof process.kill !== \"function\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#shutdownInstalled = true;\n\n\t\tconst install = (signal: ShutdownSignal) => {\n\t\t\tconst handler = () => this.#onShutdownSignal(signal, config);\n\t\t\tthis.#signalHandlers[signal] = handler;\n\t\t\tprocess.on(signal, handler);\n\t\t};\n\t\tinstall(\"SIGINT\");\n\t\tinstall(\"SIGTERM\");\n\t}\n\n\t#onShutdownSignal(signal: ShutdownSignal, config: RegistryConfig): void {\n\t\tif (this.#shutdownInFlight !== null) {\n\t\t\t// Second delivery of the same (or another) shutdown signal, or a\n\t\t\t// drain already started by an explicit `shutdown()` call. Remove\n\t\t\t// our handler only, preserving any user-installed listeners. PID 1\n\t\t\t// must exit directly because re-raised default signals can be\n\t\t\t// swallowed by the container signal path.\n\t\t\tthis.#removeSignalHandlers();\n\t\t\tfinishShutdownSignal(signal);\n\t\t\treturn;\n\t\t}\n\t\tthis.#shutdownInFlight = this.#drain(config)\n\t\t\t.catch((err) => {\n\t\t\t\tlogger().warn({ err }, \"shutdown error\");\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\tthis.#removeSignalHandlers();\n\t\t\t\tfinishShutdownSignal(signal);\n\t\t\t});\n\t}\n\n\t/**\n\t * Gracefully drains all live registries.\n\t *\n\t * Programmatic counterpart to the SIGINT/SIGTERM handlers: tears down\n\t * every live `CoreRegistry` (both `start()` and `handler()` modes) and\n\t * waits for the serve promise to resolve, all bounded by the shutdown\n\t * grace period. Unlike a signal-driven shutdown, this does not re-raise a\n\t * signal or exit the process. The caller owns process lifetime.\n\t *\n\t * Idempotent: concurrent or repeated calls share a single drain. Safe to\n\t * call even if nothing has been started.\n\t *\n\t * @example\n\t * ```ts\n\t * const registry = setup({ use: { counter } });\n\t * registry.start();\n\t * // ...later, on your own shutdown trigger:\n\t * await registry.shutdown();\n\t * ```\n\t */\n\tpublic async shutdown(): Promise<void> {\n\t\tif (this.#shutdownInFlight !== null) return this.#shutdownInFlight;\n\t\tconst config = this.parseConfig();\n\t\t// Uninstall our signal handlers so a later SIGINT/SIGTERM does not\n\t\t// re-trigger a drain on already-torn-down registries. Subsequent\n\t\t// signals fall back to Node's default termination behavior.\n\t\tthis.#removeSignalHandlers();\n\t\tthis.#shutdownInFlight = this.#drain(config).catch((err) => {\n\t\t\tlogger().warn({ err }, \"shutdown error\");\n\t\t});\n\t\treturn this.#shutdownInFlight;\n\t}\n\n\tasync #drain(config: RegistryConfig): Promise<void> {\n\t\tconst modeAPromise = this.#runtimeServeConfiguredPromise;\n\t\tconst modeBPromise = this.#runtimeServerlessPromise;\n\n\t\tconst gracePeriodMs =\n\t\t\tconfig.shutdown?.gracePeriodMs ??\n\t\t\t(await this.#actorStopThresholdMs(modeAPromise ?? modeBPromise)) ??\n\t\t\t30 * 60 * 1000;\n\t\t// Race the entire drain sequence (both modes + serve promise) against\n\t\t// a single grace ceiling. By default, this uses the engine-provided\n\t\t// actor stop threshold, matching Pegboard's hard cutoff for actors.\n\t\tconst drain = async () => {\n\t\t\t// Shut down every live `CoreRegistry` we know about. Mode A\n\t\t\t// (`start()`) and Mode B (`handler()`) each build a separate\n\t\t\t// runtime registry, so one drain fans out to both to honor the\n\t\t\t// spec invariant \"single shutdown tears down both modes\".\n\t\t\tconst registries: Promise<void>[] = [];\n\t\t\tif (modeAPromise !== undefined) {\n\t\t\t\tregistries.push(\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { runtime, registry } = await modeAPromise;\n\t\t\t\t\t\t\tawait runtime.shutdownRegistry(registry);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tlogger().warn(\n\t\t\t\t\t\t\t\t{ err },\n\t\t\t\t\t\t\t\t\"runtime registry shutdown errored (mode A)\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modeBPromise !== undefined) {\n\t\t\t\tregistries.push(\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { runtime, registry } = await modeBPromise;\n\t\t\t\t\t\t\tawait runtime.shutdownRegistry(registry);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tlogger().warn(\n\t\t\t\t\t\t\t\t{ error: err },\n\t\t\t\t\t\t\t\t\"runtime registry shutdown errored (mode B)\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait Promise.all(registries);\n\n\t\t\tconst runtimeServePromise = this.#runtimeServePromise;\n\t\t\tif (runtimeServePromise !== undefined) {\n\t\t\t\t// Swallow rejection so the race doesn't itself reject; the\n\t\t\t\t// always-attached `.catch` at the promise assignment site has\n\t\t\t\t// already logged any serve-side error.\n\t\t\t\tawait runtimeServePromise.catch(() => undefined);\n\t\t\t}\n\t\t};\n\t\tawait Promise.race([\n\t\t\tdrain(),\n\t\t\tnew Promise<void>((resolve) =>\n\t\t\t\tsetTimeout(resolve, gracePeriodMs).unref?.(),\n\t\t\t),\n\t\t]);\n\t}\n\n\tasync #actorStopThresholdMs(\n\t\tconfiguredRegistryPromise:\n\t\t\t| ReturnType<typeof buildConfiguredRegistry>\n\t\t\t| undefined,\n\t): Promise<number | undefined> {\n\t\tif (configuredRegistryPromise === undefined) return undefined;\n\t\ttry {\n\t\t\tconst { runtime, registry } = await configuredRegistryPromise;\n\t\t\tconst thresholdMs =\n\t\t\t\tawait runtime.registryActorStopThresholdMs?.(registry);\n\t\t\tif (\n\t\t\t\tthresholdMs !== undefined &&\n\t\t\t\tNumber.isFinite(thresholdMs) &&\n\t\t\t\tthresholdMs > 0\n\t\t\t) {\n\t\t\t\treturn thresholdMs;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().warn(\n\t\t\t\t{ err },\n\t\t\t\t\"failed to read actor stop threshold for shutdown grace\",\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t#removeSignalHandlers(): void {\n\t\tfor (const [signal, handler] of Object.entries(\n\t\t\tthis.#signalHandlers,\n\t\t) as [ShutdownSignal, () => void][]) {\n\t\t\tif (handler) process.removeListener(signal, handler);\n\t\t}\n\t\tthis.#signalHandlers = {};\n\t}\n\n\tpublic startEnvoy() {\n\t\tthis.#startEnvoy(this.parseConfig(), true);\n\t}\n\n\t/**\n\t * Starts the actor envoy for standalone server deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const registry = setup({ use: { counter } });\n\t * registry.start();\n\t * ```\n\t */\n\tpublic start() {\n\t\tconst config = this.parseConfig();\n\t\tthis.#startEnvoy(config, true);\n\t}\n\n\t#printWelcome(\n\t\tconfig: RegistryConfig,\n\t\tkind: \"serverless\" | \"serverful\",\n\t): void {\n\t\tif (config.noWelcome || this.#welcomePrinted) return;\n\t\tthis.#welcomePrinted = true;\n\n\t\tconst logLine = (label: string, value: string) => {\n\t\t\tconst padding = \" \".repeat(Math.max(0, 13 - label.length));\n\t\t\tconsole.log(` - ${label}:${padding}${value}`);\n\t\t};\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\t` RivetKit ${VERSION} (Engine - ${kind === \"serverless\" ? \"Serverless\" : \"Serverful\"})`,\n\t\t);\n\n\t\tif (config.namespace !== \"default\") {\n\t\t\tlogLine(\"Namespace\", config.namespace);\n\t\t}\n\n\t\tif (config.endpoint) {\n\t\t\tconst endpointType =\n\t\t\t\tconfig.startEngine || isLocalEngineEndpoint(config.endpoint)\n\t\t\t\t\t? \"local native\"\n\t\t\t\t\t: \"remote\";\n\t\t\tlogLine(\"Endpoint\", `${config.endpoint} (${endpointType})`);\n\t\t}\n\n\t\tif (kind === \"serverless\" && config.publicEndpoint) {\n\t\t\tlogLine(\"Client\", config.publicEndpoint);\n\t\t}\n\n\t\tlogLine(\"Actors\", Object.keys(config.use).length.toString());\n\t\tconsole.log();\n\t}\n}\n\nfunction isServerlessStartRequest(request: Request, basePath: string): boolean {\n\tif (request.method !== \"POST\") return false;\n\tconst parsed = new URL(request.url);\n\tconst normalizedBase =\n\t\tbasePath === \"/\" ? \"\" : `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}`;\n\treturn parsed.pathname === `${normalizedBase}/start`;\n}\n\nfunction isServerlessMetadataRequest(\n\trequest: Request,\n\tbasePath: string,\n): boolean {\n\tif (request.method !== \"GET\") return false;\n\tconst parsed = new URL(request.url);\n\tconst normalizedBase =\n\t\tbasePath === \"/\" ? \"\" : `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}`;\n\treturn parsed.pathname === `${normalizedBase}/metadata`;\n}\n\nfunction jsonRouteResponse(status: number, body: unknown): Response {\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus,\n\t\theaders: { \"content-type\": \"application/json\" },\n\t});\n}\n\nexport function setup<A extends RegistryActors>(\n\tinput: RegistryConfigInput<A>,\n): Registry<A> {\n\treturn new Registry(input);\n}\n\nexport type { RegistryConfig, RegistryActors };\nexport { RegistryConfigSchema };\n","export const ENGINE_HOST = \"127.0.0.1\";\nexport const ENGINE_PORT = 6420;\nexport const ENGINE_ENDPOINT = buildEngineEndpoint(ENGINE_HOST, ENGINE_PORT);\n\nexport function buildEngineEndpoint(host: string, port: number): string {\n\tconst urlHost =\n\t\thost.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n\treturn `http://${urlHost}:${port}`;\n}\n\nexport function isLocalEngineEndpoint(endpoint: string): boolean {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(endpoint);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst hostname = url.hostname.toLowerCase();\n\treturn (\n\t\thostname === \"localhost\" ||\n\t\thostname === \"0.0.0.0\" ||\n\t\thostname === \"::\" ||\n\t\thostname === \"[::]\" ||\n\t\thostname === \"::1\" ||\n\t\thostname === \"[::1]\" ||\n\t\t/^127(?:\\.\\d{1,3}){0,3}$/.test(hostname)\n\t);\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"registry\");\n}\n","import { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { stringifyError } from \"@/common/utils\";\nimport {\n\tgetDatacenters,\n\tupdateRunnerConfig,\n} from \"@/engine-client/api-endpoints\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"@/registry/log\";\n\nconst DEFAULT_CONFIGURE_TIMEOUT_MS = 60_000;\nconst CONFIGURE_RETRY_DELAY_MS = 1_000;\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction configureTimeoutMs() {\n\tconst value = process.env.RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS;\n\tif (value === undefined || value === \"\")\n\t\treturn DEFAULT_CONFIGURE_TIMEOUT_MS;\n\n\tconst parsed = Number(value);\n\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\tthrow new Error(\n\t\t\t\"RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS must be a finite non-negative number\",\n\t\t);\n\t}\n\n\treturn parsed;\n}\n\nexport async function configureServerlessPool(\n\tconfig: RegistryConfig,\n): Promise<void> {\n\tlogger().debug({ msg: \"configuring serverless pool\" });\n\n\tconst startedAt = Date.now();\n\tconst timeoutMs = configureTimeoutMs();\n\tlet attempts = 0;\n\tlet lastError: unknown;\n\n\twhile (Date.now() - startedAt <= timeoutMs) {\n\t\tattempts += 1;\n\t\ttry {\n\t\t\tif (!config.namespace) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"namespace is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!config.endpoint) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"endpoint is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!config.configurePool) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"configurePool is required for serverless configuration\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst customConfig = config.configurePool;\n\t\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\t\t\tconst dcsRes = await getDatacenters(clientConfig);\n\t\t\tconst poolName = customConfig.name ?? \"default\";\n\t\t\tconst serverlessToken = config.token ?? config.publicToken;\n\t\t\tconst headers = {\n\t\t\t\t...(serverlessToken\n\t\t\t\t\t? { \"x-rivet-token\": serverlessToken }\n\t\t\t\t\t: {}),\n\t\t\t\t...(customConfig.headers ?? {}),\n\t\t\t};\n\t\t\tconst serverlessConfig = {\n\t\t\t\tserverless: {\n\t\t\t\t\turl: customConfig.url,\n\t\t\t\t\theaders,\n\t\t\t\t\trequest_lifespan: customConfig.requestLifespan ?? 60 * 60,\n\t\t\t\t\tdrain_grace_period: customConfig.drainGracePeriod,\n\t\t\t\t\tmetadata_poll_interval:\n\t\t\t\t\t\tcustomConfig.metadataPollInterval ?? 1000,\n\t\t\t\t\tmax_runners: 100_000,\n\t\t\t\t\tmin_runners: 0,\n\t\t\t\t\trunners_margin: 0,\n\t\t\t\t\tslots_per_runner: 1,\n\t\t\t\t},\n\t\t\t\tmetadata: customConfig.metadata ?? {},\n\t\t\t\tdrain_on_version_upgrade:\n\t\t\t\t\tcustomConfig.drainOnVersionUpgrade ?? true,\n\t\t\t};\n\n\t\t\tawait updateRunnerConfig(clientConfig, poolName, {\n\t\t\t\tdatacenters: Object.fromEntries(\n\t\t\t\t\tdcsRes.datacenters.map((dc) => [dc.name, serverlessConfig]),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"serverless pool configured successfully\",\n\t\t\t\tpoolName,\n\t\t\t\tnamespace: config.namespace,\n\t\t\t\tattempts,\n\t\t\t});\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tlastError = error;\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"serverless pool configuration attempt failed\",\n\t\t\t\tattempts,\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tawait sleep(CONFIGURE_RETRY_DELAY_MS);\n\t\t}\n\t}\n\n\tlogger().error({\n\t\tmsg: \"failed to configure serverless pool, validate endpoint is configured correctly then restart this process\",\n\t\tattempts,\n\t\terror: stringifyError(lastError),\n\t});\n\tthrow lastError;\n}\n","// TODO: Go back to dynamic import for this\nimport getPort from \"get-port\";\nimport type { Hono } from \"hono\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"@/registry/log\";\nimport { detectRuntime, type Runtime, stringifyError } from \"../utils\";\n\nconst DEFAULT_PORT = 6421;\nexport type ServeStatic =\n\ttypeof import(\"@hono/node-server/serve-static\").serveStatic;\nconst serveStaticLoaderPromises: Partial<\n\tRecord<Runtime, Promise<ServeStatic>>\n> = {};\n\n/**\n * Finds a free port starting from the given port.\n *\n * Tries ports incrementally until a free one is found.\n */\nexport async function findFreePort(\n\tstartPort: number = DEFAULT_PORT,\n): Promise<number> {\n\t// TODO: Fix this\n\t// const getPortModule = \"get-port\";\n\t// const { default: getPort } = await import(/* webpackIgnore: true */ getPortModule);\n\n\t// Create an iterable of ports starting from startPort\n\tfunction* portRange(start: number, count: number = 100): Iterable<number> {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tyield start + i;\n\t\t}\n\t}\n\n\treturn getPort({ port: portRange(startPort) });\n}\n\nexport async function crossPlatformServe(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n\truntime: Runtime = detectRuntime(),\n): Promise<{ upgradeWebSocket: any; closeServer?: () => void }> {\n\tlogger().debug({ msg: \"detected runtime for serve\", runtime });\n\n\tswitch (runtime) {\n\t\tcase \"deno\":\n\t\t\treturn serveDeno(config, httpPort, app);\n\t\tcase \"bun\":\n\t\t\treturn serveBun(config, httpPort, app);\n\t\tcase \"node\":\n\t\t\treturn serveNode(config, httpPort, app);\n\t\tdefault:\n\t\t\treturn serveNode(config, httpPort, app);\n\t}\n}\n\nexport async function loadRuntimeServeStatic(\n\truntime: Runtime,\n): Promise<ServeStatic> {\n\tif (!serveStaticLoaderPromises[runtime]) {\n\t\tif (runtime === \"node\") {\n\t\t\tconst nodeServeStaticModule = \"@hono/node-server/serve-static\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tnodeServeStaticModule\n\t\t\t).then((x) => x.serveStatic);\n\t\t} else if (runtime === \"bun\") {\n\t\t\tconst bunModule = \"hono/bun\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tbunModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else if (runtime === \"deno\") {\n\t\t\tconst denoModule = \"hono/deno\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tdenoModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else {\n\t\t\tthrow new Error(`unsupported runtime: ${runtime}`);\n\t\t}\n\t}\n\n\treturn await serveStaticLoaderPromises[runtime]!;\n}\n\nasync function serveNode(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any; closeServer: () => void }> {\n\t// Import @hono/node-server using string variable to prevent static analysis\n\tconst nodeServerModule = \"@hono/node-server\";\n\tlet serve: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeServerModule\n\t\t);\n\t\tserve = dep.serve;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Import @hono/node-ws using string variable to prevent static analysis\n\tconst nodeWsModule = \"@hono/node-ws\";\n\tlet createNodeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeWsModule\n\t\t);\n\t\tcreateNodeWebSocket = dep.createNodeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Inject WS\n\tconst { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({\n\t\tapp: app,\n\t});\n\n\t// Start server\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\tconst server = serve({ fetch: app.fetch, port, hostname }, () =>\n\t\tlogger().info({ msg: \"server listening\", port, hostname }),\n\t);\n\tinjectWebSocket(server);\n\n\tconst closeServer = () => {\n\t\tserver.close();\n\t};\n\n\treturn { upgradeWebSocket, closeServer };\n}\n\nasync function serveDeno(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/deno using string variable to prevent static analysis\n\tconst honoDenoModule = \"hono/deno\";\n\tlet upgradeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoDenoModule\n\t\t);\n\t\tupgradeWebSocket = dep.upgradeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/deno\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\n\t// Use Deno.serve\n\tDeno.serve({ port, hostname }, app.fetch);\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveBun(\n\tconfig: RegistryConfig,\n\thttpPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/bun using string variable to prevent static analysis\n\tconst honoBunModule = \"hono/bun\";\n\tlet createBunWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoBunModule\n\t\t);\n\t\tcreateBunWebSocket = dep.createBunWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/bun\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst { websocket, upgradeWebSocket } = createBunWebSocket();\n\n\tconst port = httpPort;\n\tconst hostname = config.httpHost;\n\n\t// Use Bun.serve\n\t// @ts-expect-error - Bun global\n\tBun.serve({\n\t\tfetch: app.fetch,\n\t\tport,\n\t\thostname,\n\t\twebsocket,\n\t});\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n","import { z } from \"zod\";\nimport { getRunMetadata } from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport {\n\tKEYS,\n\tqueueMessagesPrefix,\n\tqueueMetadataKey,\n\tworkflowStoragePrefix,\n} from \"@/actor/keys\";\nimport { buildEngineEndpoint, ENGINE_HOST, ENGINE_PORT } from \"@/common/engine\";\nimport { type Logger, LogLevelSchema } from \"@/common/log\";\nimport { VERSION } from \"@/utils\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\nimport {\n\tgetRivetEndpoint,\n\tgetRivetEngine,\n\tgetRivetkitRuntime,\n\tgetRivetNamespace,\n\tgetRivetRunEngine,\n\tgetRivetRunEngineHost,\n\tgetRivetRunEnginePort,\n\tgetRivetRunEngineVersion,\n\tgetRivetToken,\n\tisDev,\n} from \"@/utils/env-vars\";\nimport { EnvoyConfigSchema } from \"./envoy\";\nimport {\n\tConfigurePoolSchema,\n\tDEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES,\n\tServerlessConfigSchema,\n} from \"./serverless\";\n\nexport const ActorsSchema = z.record(\n\tz.string(),\n\tz.custom<AnyActorDefinition>(),\n);\nexport type RegistryActors = z.infer<typeof ActorsSchema>;\n\nexport const RuntimeKindSchema = z.enum([\"auto\", \"native\", \"wasm\"]);\nexport type RuntimeKind = z.infer<typeof RuntimeKindSchema>;\nexport type WasmRuntimeBindings = typeof import(\"@rivetkit/rivetkit-wasm\");\nexport type WasmRuntimeInitInput = Parameters<\n\tWasmRuntimeBindings[\"default\"]\n>[0];\nexport const SqliteBackendSchema = z.enum([\"local\", \"remote\"]);\nexport type SqliteBackend = z.infer<typeof SqliteBackendSchema>;\n\nexport const TestConfigSchema = z.object({\n\tenabled: z.boolean().optional().default(false),\n\tsqliteBackend: SqliteBackendSchema.optional(),\n});\nexport type TestConfig = z.infer<typeof TestConfigSchema>;\n\nexport const WasmRuntimeConfigSchema = z.object({\n\tbindings: z.custom<WasmRuntimeBindings>().optional(),\n\tinitInput: z.custom<WasmRuntimeInitInput>().optional(),\n});\nexport type WasmRuntimeConfig = z.infer<typeof WasmRuntimeConfigSchema>;\n\nexport const SqliteConfigSchema = z\n\t.union([\n\t\tSqliteBackendSchema,\n\t\tz.object({\n\t\t\tbackend: SqliteBackendSchema,\n\t\t}),\n\t])\n\t.optional()\n\t.transform((config) => {\n\t\tif (config === undefined) return undefined;\n\t\tif (typeof config === \"string\") return { backend: config };\n\t\treturn config;\n\t});\nexport type SqliteConfig = z.infer<typeof SqliteConfigSchema>;\n\n// TODO: Add sane defaults for NODE_ENV=development\nexport const RegistryConfigSchema = z\n\t.object({\n\t\t// MARK: Actors\n\t\tuse: z.record(z.string(), z.custom<AnyActorDefinition>()),\n\n\t\t// TODO: Find a better way of passing around the test config\n\t\t/**\n\t\t * Test configuration.\n\t\t *\n\t\t * DO NOT MANUALLY ENABLE. THIS IS USED INTERNALLY.\n\t\t * @internal\n\t\t **/\n\t\ttest: TestConfigSchema.optional().default({ enabled: false }),\n\n\t\t// MARK: Networking\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t// MARK: Runtime\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Runtime binding to use for RivetKit core.\n\t\t * */\n\t\truntime: RuntimeKindSchema.optional().transform((val, ctx) => {\n\t\t\tconst rawRuntime = val ?? getRivetkitRuntime();\n\t\t\tif (rawRuntime === undefined) {\n\t\t\t\treturn \"auto\";\n\t\t\t}\n\n\t\t\tconst parsed = RuntimeKindSchema.safeParse(rawRuntime);\n\t\t\tif (!parsed.success) {\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"RIVETKIT_RUNTIME must be one of auto, native, or wasm\",\n\t\t\t\t});\n\t\t\t\treturn \"auto\";\n\t\t\t}\n\n\t\t\treturn parsed.data;\n\t\t}),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * WebAssembly runtime configuration.\n\t\t * */\n\t\twasm: WasmRuntimeConfigSchema.optional().default(() => ({})),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * SQLite backend selection.\n\t\t * */\n\t\tsqlite: SqliteConfigSchema,\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t// MARK: Routing\n\t\t// // This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// // fly. This is required since the dependencies that upgradeWebSocket\n\t\t// // (specifically Node.js) can sometimes only be specified after the router is\n\t\t// // created or must be imported async using `await import(...)`\n\t\t// getUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t// MARK: Runner Configuration\n\t\t/**\n\t\t * Endpoint to connect to for Rivet Engine.\n\t\t *\n\t\t * Supports URL auth syntax for namespace and token:\n\t\t * - `https://namespace:token@api.rivet.dev`\n\t\t * - `https://namespace@api.rivet.dev`\n\t\t *\n\t\t * Can also be set via RIVET_ENDPOINT environment variables.\n\t\t */\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetEngine() ?? getRivetEndpoint()),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetToken()),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetNamespace()),\n\t\theaders: z.record(z.string(), z.string()).optional().default({}),\n\n\t\t// MARK: Client\n\t\t// TODO:\n\t\t// client: ClientConfigSchema.optional(),\n\n\t\t// MARK: Local HTTP\n\t\t/**\n\t\t * Directory to serve static files from.\n\t\t *\n\t\t * When set, the local RivetKit server will serve static files from this\n\t\t * directory. This is used by `registry.start()` to serve a frontend\n\t\t * alongside the actor API.\n\t\t */\n\t\tstaticDir: z.string().optional(),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the local RivetKit API. This is used to prefix all routes.\n\t\t * For example, if the base path is `/foo`, then the route `/actors`\n\t\t * will be available at `/foo/actors`.\n\t\t */\n\t\thttpBasePath: z.string().optional().default(\"/\"),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What port to run the local HTTP server on.\n\t\t */\n\t\thttpPort: z.number().optional().default(6421),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What host to bind the local HTTP server to.\n\t\t */\n\t\thttpHost: z.string().optional(),\n\n\t\t// MARK: Engine\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Starts the full Rust engine process locally.\n\t\t */\n\t\tstartEngine: z.boolean().default(() => getRivetRunEngine()),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Host to bind the spawned local engine process to.\n\t\t */\n\t\tengineHost: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngineHost() ?? ENGINE_HOST),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Port to bind the spawned local engine process to.\n\t\t */\n\t\tenginePort: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(1)\n\t\t\t.max(65_535)\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEnginePort() ?? ENGINE_PORT),\n\t\t/** @experimental */\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Automatically configure serverless envoys in the engine.\n\t\t */\n\t\tconfigurePool: ConfigurePoolSchema.optional(),\n\n\t\t// MARK: Runtime-specific\n\t\tserverless: ServerlessConfigSchema.optional().default(() =>\n\t\t\tServerlessConfigSchema.parse({}),\n\t\t),\n\t\tenvoy: EnvoyConfigSchema.optional().default(() =>\n\t\t\tEnvoyConfigSchema.parse({}),\n\t\t),\n\n\t\t// MARK: Shutdown\n\t\t/**\n\t\t * Graceful shutdown configuration for SIGINT/SIGTERM.\n\t\t *\n\t\t * When a persistent envoy is running (Mode A, started via `registry.start()`),\n\t\t * rivetkit installs Node SIGINT/SIGTERM handlers that call into core's\n\t\t * `shutdown()` and wait up to `gracePeriodMs` for the envoy to drain\n\t\t * before re-raising the signal to let Node exit via its default path.\n\t\t *\n\t\t * Handlers are NOT installed when `handler(request)` is used alone\n\t\t * (Mode B / serverless): platform runtimes (Cloudflare Workers, Vercel,\n\t\t * Deno Deploy) own their own signal policy there, and `process.on` may\n\t\t * not exist.\n\t\t */\n\t\tshutdown: z\n\t\t\t.object({\n\t\t\t\t/**\n\t\t\t\t * Wait this many milliseconds for the serve promise to resolve\n\t\t\t\t * after calling `CoreRegistry::shutdown()`. Defaults to the\n\t\t\t\t * engine-provided actor stop threshold once the envoy connects.\n\t\t\t\t *\n\t\t\t\t * Must be long enough for rivetkit-core to drain the envoy.\n\t\t\t\t */\n\t\t\t\tgracePeriodMs: z.number().int().min(1_000).optional(),\n\t\t\t\t/**\n\t\t\t\t * If true, rivetkit will not install SIGINT/SIGTERM handlers.\n\t\t\t\t * Use when the host application owns signal policy and will\n\t\t\t\t * call `nativeRegistry.shutdown()` itself.\n\t\t\t\t */\n\t\t\t\tdisableSignalHandlers: z.boolean().optional().default(false),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({\n\t\t\t\tdisableSignalHandlers: false,\n\t\t\t})),\n\t})\n\t.transform((config, ctx) => {\n\t\tconst isDevEnv = isDev();\n\t\tconst sqliteBackend =\n\t\t\tconfig.sqlite?.backend ?? config.test?.sqliteBackend;\n\n\t\tif (config.runtime === \"wasm\" && sqliteBackend === \"local\") {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"WebAssembly runtime cannot use local SQLite. Use remote SQLite instead.\",\n\t\t\t\tpath:\n\t\t\t\t\tconfig.sqlite?.backend === \"local\"\n\t\t\t\t\t\t? [\"sqlite\"]\n\t\t\t\t\t\t: [\"test\", \"sqliteBackend\"],\n\t\t\t});\n\t\t}\n\n\t\tconst sqlite =\n\t\t\tconfig.runtime === \"wasm\" && config.sqlite === undefined\n\t\t\t\t? { backend: \"remote\" as const }\n\t\t\t\t: config.sqlite;\n\n\t\t// Parse endpoint string (env var fallback is applied via transform above)\n\t\tconst parsedEndpoint = config.endpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.endpoint,\n\t\t\t\t\tpath: [\"endpoint\"],\n\t\t\t\t\tnamespace: config.namespace,\n\t\t\t\t\ttoken: config.token,\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// RIVET_ENDPOINT configures what RivetKit connects to. Use\n\t\t// engineHost/enginePort (or RIVET_RUN_ENGINE_HOST/PORT) to control the\n\t\t// spawned local engine bind address.\n\t\tif (config.startEngine && parsedEndpoint) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both startEngine and endpoint\",\n\t\t\t});\n\t\t}\n\n\t\t// configurePool requires an engine (via endpoint or startEngine).\n\t\tif (config.configurePool && !parsedEndpoint && !config.startEngine) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"configurePool requires either endpoint or startEngine\",\n\t\t\t});\n\t\t}\n\n\t\t// Flatten the endpoint and apply defaults for namespace/token.\n\t\tconst localEngineEndpoint = buildEngineEndpoint(\n\t\t\tconfig.engineHost,\n\t\t\tconfig.enginePort,\n\t\t);\n\t\tconst endpoint = config.startEngine\n\t\t\t? localEngineEndpoint\n\t\t\t: (parsedEndpoint?.endpoint ??\n\t\t\t\t(isDevEnv\n\t\t\t\t\t? buildEngineEndpoint(ENGINE_HOST, ENGINE_PORT)\n\t\t\t\t\t: undefined));\n\t\tconst validateServerlessEndpoint = Boolean(\n\t\t\tconfig.startEngine || parsedEndpoint,\n\t\t);\n\t\t// Namespace priority: parsed from endpoint URL > config value (includes env var) > \"default\"\n\t\tconst namespace =\n\t\t\tparsedEndpoint?.namespace ?? config.namespace ?? \"default\";\n\t\t// Token priority: parsed from endpoint URL > config value (includes env var)\n\t\tconst token = parsedEndpoint?.token ?? config.token;\n\n\t\t// Parse publicEndpoint string (env var fallback is applied via transform in serverless schema)\n\t\tconst parsedPublicEndpoint = config.serverless.publicEndpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.serverless.publicEndpoint,\n\t\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// Validate that publicEndpoint namespace matches backend namespace if specified\n\t\tif (\n\t\t\tparsedPublicEndpoint?.namespace &&\n\t\t\tparsedPublicEndpoint.namespace !== namespace\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `publicEndpoint namespace \"${parsedPublicEndpoint.namespace}\" must match backend namespace \"${namespace}\"`,\n\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t});\n\t\t}\n\n\t\t// In dev mode, clients connect directly to the local Rivet Engine.\n\t\tconst publicEndpoint =\n\t\t\tparsedPublicEndpoint?.endpoint ??\n\t\t\t(isDevEnv && config.startEngine ? endpoint : undefined);\n\t\t// We extract publicNamespace to validate that it matches the backend\n\t\t// namespace (see validation above), not for functional use.\n\t\tconst publicNamespace = parsedPublicEndpoint?.namespace;\n\t\tconst publicToken =\n\t\t\tparsedPublicEndpoint?.token ?? config.serverless.publicToken;\n\n\t\t// If endpoint is set or starting the engine, we'll use the engine driver.\n\t\treturn {\n\t\t\t...config,\n\t\t\tsqlite,\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\ttoken,\n\t\t\tpublicEndpoint,\n\t\t\tpublicNamespace,\n\t\t\tpublicToken,\n\t\t\tvalidateServerlessEndpoint,\n\t\t\tserverless: {\n\t\t\t\t...config.serverless,\n\t\t\t\tpublicEndpoint,\n\t\t\t},\n\t\t};\n\t});\n\nexport type RegistryConfig = z.infer<typeof RegistryConfigSchema>;\nexport type RegistryConfigInput<A extends RegistryActors> = Omit<\n\tz.input<typeof RegistryConfigSchema>,\n\t\"use\"\n> & { use: A };\n\nexport function buildActorNames(\n\tconfig: RegistryConfig,\n): Record<string, { metadata: Record<string, unknown> }> {\n\treturn Object.fromEntries(\n\t\tObject.keys(config.use).map((actorName) => {\n\t\t\tconst definition = config.use[actorName];\n\t\t\tconst options = definition.config.options ?? {};\n\t\t\tconst runMeta = getRunMetadata(definition.config.run);\n\t\t\tconst metadata: Record<string, unknown> = {};\n\t\t\t// Actor options take precedence over run metadata\n\t\t\tmetadata.icon = options.icon ?? runMeta.icon;\n\t\t\tmetadata.name = options.name ?? runMeta.name;\n\t\t\tmetadata.preload = {\n\t\t\t\tkeys: [\n\t\t\t\t\tArray.from(KEYS.PERSIST_DATA),\n\t\t\t\t\tArray.from(KEYS.INSPECTOR_TOKEN),\n\t\t\t\t\tArray.from(queueMetadataKey()),\n\t\t\t\t\tArray.from(KEYS.LAST_PUSHED_ALARM),\n\t\t\t\t],\n\t\t\t\tprefixes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(workflowStoragePrefix()),\n\t\t\t\t\t\tmaxBytes: options.preloadMaxWorkflowBytes ?? 131_072,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(KEYS.CONN_PREFIX),\n\t\t\t\t\t\tmaxBytes: options.preloadMaxConnectionsBytes ?? 65_536,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tprefix: Array.from(queueMessagesPrefix()),\n\t\t\t\t\t\tmaxBytes: 65_536,\n\t\t\t\t\t\tpartial: false,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\t// Remove undefined values\n\t\t\tif (!metadata.icon) delete metadata.icon;\n\t\t\tif (!metadata.name) delete metadata.name;\n\t\t\treturn [actorName, { metadata }];\n\t\t}),\n\t);\n}\n\n// MARK: Documentation Schemas\n// These schemas are JSON-serializable versions used for documentation generation.\n// They exclude runtime-only fields (transforms, custom types, Logger instances).\n\nexport const DocConfigurePoolSchema = z\n\t.object({\n\t\tname: z.string().optional().describe(\"Name of the runner pool.\"),\n\t\turl: z\n\t\t\t.string()\n\t\t\t.describe(\"URL of the serverless platform to configure runners.\"),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Headers to include in requests to the serverless platform.\",\n\t\t\t),\n\t\trequestLifespan: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum lifespan of a request in seconds.\"),\n\t\tdrainGracePeriod: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Grace period before the serverless request is forcibly closed, in seconds.\",\n\t\t\t),\n\t\tmetadata: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional metadata to pass to the serverless platform.\",\n\t\t\t),\n\t\tmetadataPollInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in milliseconds between metadata polls from the engine. Defaults to 10000 milliseconds (10 seconds).\",\n\t\t\t),\n\t\tdrainOnVersionUpgrade: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Drain runners when a new version is deployed. Defaults to true.\",\n\t\t\t),\n\t})\n\t.optional();\n\nexport const DocServerlessConfigSchema = z\n\t.object({\n\t\tbasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Base path for serverless API routes. Default: '/api/rivet'\",\n\t\t\t),\n\t\tmaxStartPayloadBytes: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t`Maximum POST /start body size in bytes. Default: ${DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES}`,\n\t\t\t),\n\t\tpublicEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"The endpoint that clients should connect to. Supports URL auth syntax: https://namespace:token@api.rivet.dev\",\n\t\t\t),\n\t\tpublicToken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Token that clients should use when connecting via the public endpoint.\",\n\t\t\t),\n\t})\n\t.describe(\"Configuration for serverless deployment mode.\");\n\nexport const DocEnvoyConfigSchema = z\n\t.object({\n\t\ttotalSlots: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Total number of actor slots available. Default: 100000\"),\n\t\tpoolName: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Name of this envoy pool. Default: 'default'\"),\n\t\tenvoyKey: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Deprecated. Authentication key for the envoy.\"),\n\t\tversion: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Version number of this envoy. Default: 1\"),\n\t})\n\t.describe(\"Configuration for envoy mode.\");\n\nexport const DocSqliteConfigSchema = z\n\t.object({\n\t\tbackend: SqliteBackendSchema.optional().describe(\n\t\t\t\"SQLite backend to use. Native defaults to local. Wasm defaults to remote and cannot use local.\",\n\t\t),\n\t})\n\t.optional()\n\t.describe(\"SQLite runtime configuration.\");\n\nexport const DocRegistryConfigSchema = z\n\t.object({\n\t\tuse: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.describe(\n\t\t\t\t\"Actor definitions. Keys are actor names, values are actor definitions.\",\n\t\t\t),\n\t\tmaxIncomingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of incoming WebSocket messages in bytes. Default: 65536\",\n\t\t\t),\n\t\tmaxOutgoingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of outgoing WebSocket messages in bytes. Default: 1048576\",\n\t\t\t),\n\t\tnoWelcome: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"Disable the welcome message on startup. Default: false\"),\n\t\tsqlite: DocSqliteConfigSchema,\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tlevel: LogLevelSchema.optional().describe(\n\t\t\t\t\t\"Log level for RivetKit. Default: 'warn'\",\n\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\"Logging configuration.\"),\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Endpoint URL to connect to Rivet Engine. Supports URL auth syntax: https://namespace:token@api.rivet.dev. Can also be set via RIVET_ENDPOINT environment variable.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Authentication token for Rivet Engine. Can also be set via RIVET_TOKEN environment variable.\",\n\t\t\t),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Namespace to use. Default: 'default'. Can also be set via RIVET_NAMESPACE environment variable.\",\n\t\t\t),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional headers to include in requests to Rivet Engine.\",\n\t\t\t),\n\t\tstaticDir: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Directory to serve static files from. When set, registry.start() serves static files alongside the actor API.\",\n\t\t\t),\n\t\thttpBasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Base path for the local RivetKit API. Default: '/'\"),\n\t\thttpPort: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Port to run the local HTTP server on. Default: 6421\"),\n\t\thttpHost: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Host to bind the local HTTP server to.\"),\n\t\tstartEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Starts the full Rust engine process locally. Default: false\",\n\t\t\t),\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Version of the local engine package to use. Defaults to the current RivetKit version.\",\n\t\t\t),\n\t\tconfigurePool: DocConfigurePoolSchema.describe(\n\t\t\t\"Automatically configure serverless runners in the engine.\",\n\t\t),\n\t\tserverless: DocServerlessConfigSchema.optional(),\n\t\tenvoy: DocEnvoyConfigSchema.optional(),\n\t})\n\t.describe(\"RivetKit registry configuration.\");\n","import { z } from \"zod/v4\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tgetNodeEnv,\n\tgetRivetEnvoyVersion,\n\tgetRivetPool,\n\tgetRivetTotalSlots,\n} from \"@/utils/env-vars\";\n\nlet warnedMissingVersion = false;\n\nexport const EnvoyConfigSchema = z.object({\n\tpoolName: z.string().default(() => getRivetPool() ?? \"default\"),\n\tversion: z.number().default(() => {\n\t\tconst version = getRivetEnvoyVersion();\n\t\tif (version !== undefined) return version;\n\n\t\tif (getNodeEnv() === \"production\" && !warnedMissingVersion) {\n\t\t\twarnedMissingVersion = true;\n\t\t\tgetLogger(\"rivetkit\").error(\n\t\t\t\t\"RIVET_ENVOY_VERSION is not set. Actors will not be versioned, which means they won't be drained on deploy. This is only needed when self-hosting or using a custom envoy (not needed for Rivet Compute). Set this as a build arg in your Dockerfile. See https://rivet.dev/docs/actors/versions\",\n\t\t\t);\n\t\t}\n\n\t\treturn 1;\n\t}),\n\n\t// Deprecated.\n\ttotalSlots: z.number().default(() => getRivetTotalSlots() ?? 100000),\n\tenvoyKey: z.string().optional(),\n});\nexport type EnvoyConfigInput = z.input<typeof EnvoyConfigSchema>;\nexport type EnvoyConfig = z.infer<typeof EnvoyConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { getRivetPublicEndpoint, getRivetPublicToken } from \"@/utils/env-vars\";\n\nexport const DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES = 16 * 1024 * 1024;\n\nexport const ConfigurePoolSchema = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\turl: z.string(),\n\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\trequestLifespan: z.number().optional(),\n\t\tdrainGracePeriod: z.number().optional(),\n\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\tmetadataPollInterval: z.number().optional(),\n\t\tdrainOnVersionUpgrade: z.boolean().optional(),\n\t})\n\t.optional();\n\nexport const ServerlessConfigSchema = z.object({\n\t// MARK: Routing\n\tbasePath: z.string().optional().default(\"/api/rivet\"),\n\tmaxStartPayloadBytes: z\n\t\t.number()\n\t\t.optional()\n\t\t.default(DEFAULT_SERVERLESS_MAX_START_PAYLOAD_BYTES),\n\n\t// MARK: Public Endpoint Configuration\n\t/**\n\t * The endpoint that clients should connect to.\n\t *\n\t * This is useful if clients connect to serverless directly\n\t * (e.g. `http://localhost:3000/api/rivet`), they will fetch\n\t * `http://localhost:3000/api/rivet/metadata` and be redirected to\n\t * the public endpoint.\n\t *\n\t * Supports URL auth syntax for namespace and token:\n\t * - `https://namespace:token@api.rivet.dev`\n\t * - `https://namespace@api.rivet.dev`\n\t *\n\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t *\n\t * Can also be set via RIVET_PUBLIC_ENDPOINT environment variable.\n\t */\n\tpublicEndpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicEndpoint()),\n\n\t/**\n\t * Token that clients should use when connecting via the public endpoint.\n\t *\n\t * Can also be set via RIVET_PUBLIC_TOKEN environment variable.\n\t *\n\t * Can also be specified in the publicEndpoint URL as `https://namespace:token@host`.\n\t */\n\tpublicToken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicToken()),\n\n\t// There is no publicNamespace config option because the frontend and backend\n\t// cannot use different namespaces. The namespace is extracted from the\n\t// publicEndpoint URL auth syntax if provided.\n});\nexport type ServerlessConfigInput = z.input<typeof ServerlessConfigSchema>;\nexport type ServerlessConfig = z.infer<typeof ServerlessConfigSchema>;\n","import { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\tgetRunFunction,\n\tgetRunInspectorConfig,\n\tRAW_STATE_SYMBOL,\n\ttype WorkflowInspectorConfig,\n} from \"@/actor/config\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport {\n\tdecodeBridgeRivetError,\n\tencodeBridgeRivetError,\n\tforbiddenError,\n\tINTERNAL_ERROR_CODE,\n\tisRivetErrorLike,\n\tRivetError,\n\ttype RivetErrorLike,\n\ttoRivetError,\n} from \"@/actor/errors\";\nimport { makePrefixedKey, removePrefixFromKey } from \"@/actor/keys\";\nimport {\n\tgetEventCanSubscribe,\n\tgetQueueCanPublish,\n\thasSchemaConfigKey,\n} from \"@/actor/schema\";\nimport {\n\ttype AnyClient,\n\ttype Client,\n\tcreateClientWithDriver,\n} from \"@/client/client\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { HEADER_CONN_PARAMS } from \"@/common/actor-router-consts\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { wrapJsNativeDatabase } from \"@/common/database/native-database\";\nimport { assertJsonCompatValue, type JsonCompatValue } from \"@/common/encoding\";\nimport { decodeWorkflowHistoryTransport } from \"@/common/inspector-transport\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { RemoteEngineControlClient } from \"@/engine-client/mod\";\nimport type { Registry } from \"@/registry\";\nimport type {\n\tRegistryConfig,\n\tRuntimeKind,\n\tSqliteBackend,\n} from \"@/registry/config\";\nimport { decodeCborCompat, encodeCborCompat } from \"@/serde\";\nimport { getEnvUniversal, VERSION } from \"@/utils\";\nimport { logger } from \"./log\";\nimport { loadNapiRuntime } from \"./napi-runtime\";\nimport {\n\ttype NativeValidationConfig,\n\tvalidateActionArgs,\n\tvalidateConnParams,\n\tvalidateEventArgs,\n\tvalidateQueueBody,\n\tvalidateQueueComplete,\n} from \"./native-validation\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeBytes,\n\tRuntimeHttpResponse,\n\tRuntimeInspectorTabEntry,\n\tRuntimeQueueMessage,\n\tRuntimeServeConfig,\n\tRuntimeStateDeltaPayload,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { loadWasmRuntime } from \"./wasm-runtime\";\nimport nodeFs from \"node:fs\";\nimport nodePath from \"node:path\";\nimport { createWriteThroughProxy } from \"./write-through-proxy\";\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\ntype ResolvedRuntimeKind = Exclude<RuntimeKind, \"auto\">;\ntype RuntimeHostKind = \"node-like\" | \"edge-like\";\nexport type RuntimeLoaders = {\n\tloadNative: () => ReturnType<typeof loadNapiRuntime>;\n\tloadWasm: (\n\t\tconfig?: RegistryConfig[\"wasm\"],\n\t) => ReturnType<typeof loadWasmRuntime>;\n\tdetectHost: () => RuntimeHostKind;\n};\ntype SerializeStateReason = \"save\" | \"inspector\";\ntype NativeOnStateChangeHandler = (\n\tctx: ActorContextHandleAdapter,\n\tstate: unknown,\n) => void | Promise<void>;\ntype NativePersistConnState = {\n\tstate: unknown;\n};\n\nconst defaultRuntimeLoaders: RuntimeLoaders = {\n\tloadNative: loadNapiRuntime,\n\tloadWasm: loadWasmRuntime,\n\tdetectHost: detectRuntimeHost,\n};\n\nfunction trySetProcessEnv(key: string, value: string) {\n\tif (typeof process === \"undefined\") return;\n\ttry {\n\t\tprocess.env[key] = value;\n\t} catch {\n\t\t// Some edge runtimes expose a read-only Node-compatible process.env.\n\t}\n}\n\nexport function detectRuntimeHost(): RuntimeHostKind {\n\tconst globalScope = globalThis as typeof globalThis & {\n\t\tBun?: unknown;\n\t\tDeno?: unknown;\n\t\tprocess?: { versions?: { node?: string } };\n\t\tself?: unknown;\n\t\twindow?: unknown;\n\t};\n\n\tif (\n\t\tglobalScope.Deno !== undefined ||\n\t\tglobalScope.Bun !== undefined ||\n\t\ttypeof globalScope.process?.versions?.node === \"string\"\n\t) {\n\t\treturn \"node-like\";\n\t}\n\n\treturn \"edge-like\";\n}\n\nexport function resolveRuntimeKind(\n\truntime: RuntimeKind | undefined,\n): RuntimeKind {\n\treturn runtime ?? \"auto\";\n}\n\nfunction loadedRuntimeKind(runtime: CoreRuntime): ResolvedRuntimeKind {\n\tswitch (runtime.kind) {\n\t\tcase \"napi\":\n\t\t\treturn \"native\";\n\t\tcase \"wasm\":\n\t\t\treturn \"wasm\";\n\t}\n\n\tthrow new RivetError(\n\t\t\"config\",\n\t\t\"unknown_runtime\",\n\t\t\"RivetKit runtime must be NAPI or wasm.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 500,\n\t\t},\n\t);\n}\n\nexport async function loadAutoRuntime(\n\tconfig: RegistryConfig,\n\tloaders: RuntimeLoaders = defaultRuntimeLoaders,\n): Promise<CoreRuntime> {\n\tif (loaders.detectHost() === \"edge-like\") {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n\n\ttry {\n\t\treturn (await loaders.loadNative()).runtime;\n\t} catch {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n}\n\nexport async function loadConfiguredRuntime(\n\tconfig: RegistryConfig,\n\tloaders: RuntimeLoaders = defaultRuntimeLoaders,\n): Promise<CoreRuntime> {\n\tconst requested = resolveRuntimeKind(config.runtime);\n\n\tif (requested === \"native\") {\n\t\treturn (await loaders.loadNative()).runtime;\n\t}\n\n\tif (requested === \"wasm\") {\n\t\treturn (await loaders.loadWasm(config.wasm)).runtime;\n\t}\n\n\treturn loadAutoRuntime(config, loaders);\n}\n\nfunction sqliteBackendForConfig(\n\tconfig: RegistryConfig,\n): SqliteBackend | undefined {\n\treturn config.sqlite?.backend ?? config.test?.sqliteBackend;\n}\n\nexport function normalizeRuntimeConfigForKind(\n\tconfig: RegistryConfig,\n\truntimeKind: ResolvedRuntimeKind,\n): RegistryConfig {\n\tif (runtimeKind === \"native\") {\n\t\treturn config;\n\t}\n\n\tif (sqliteBackendForConfig(config) === \"local\") {\n\t\tthrow new RivetError(\n\t\t\t\"config\",\n\t\t\t\"wasm_local_sqlite\",\n\t\t\t\"WebAssembly runtime cannot use local SQLite. Use remote SQLite instead.\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tstatusCode: 400,\n\t\t\t\tmetadata: { runtime: \"wasm\", sqliteBackend: \"local\" },\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\t...config,\n\t\tsqlite: {\n\t\t\t...config.sqlite,\n\t\t\tbackend: \"remote\",\n\t\t},\n\t\ttest: {\n\t\t\t...config.test,\n\t\t\tenabled: config.test?.enabled ?? false,\n\t\t\tsqliteBackend: \"remote\",\n\t\t},\n\t};\n}\n\nexport function normalizeRuntimeConfig(\n\tconfig: RegistryConfig,\n\truntime: CoreRuntime,\n): RegistryConfig {\n\treturn normalizeRuntimeConfigForKind(config, loadedRuntimeKind(runtime));\n}\ntype NativePersistActorState = {\n\tstate: unknown;\n\tisInOnStateChange: boolean;\n\tconnStates: Map<string, NativePersistConnState>;\n\t// Memoized deep write-through proxy and the state object it wraps. Rebuilt\n\t// only when the underlying state object identity changes.\n\tstateProxy?: unknown;\n\tstateProxyTarget?: unknown;\n\t// Set when a coalesced save and onStateChange flush is pending for the\n\t// current event loop tick.\n\tsaveScheduled?: boolean;\n\tpendingSaveHandle?: ReturnType<typeof setImmediate>;\n};\ntype NativeDestroyGate = {\n\tdestroyCompletion?: Promise<void>;\n\tresolveDestroy?: () => void;\n};\ntype NativeDatabaseClientState = {\n\tclient: unknown;\n};\ntype NativeActorRuntimeState = {\n\tsql?: ReturnType<typeof wrapJsNativeDatabase>;\n\tdatabaseClient?: NativeDatabaseClientState;\n\tvarsInitialized?: boolean;\n\tvars?: unknown;\n\tdestroyGate?: NativeDestroyGate;\n\tpersistState?: NativePersistActorState;\n};\n\n// Keep JS-only actor caches on the NAPI ActorContext runtime-state bag instead\n// of actorId-keyed module globals so same-key recreates start from a fresh\n// generation.\nfunction getNativeRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): NativeActorRuntimeState {\n\tconst runtimeState = callNativeSync(() =>\n\t\truntime.actorRuntimeState(ctx),\n\t) as NativeActorRuntimeState;\n\tif (!runtimeState.destroyGate) {\n\t\truntimeState.destroyGate = {};\n\t}\n\tif (!runtimeState.persistState) {\n\t\truntimeState.persistState = {\n\t\t\tstate: undefined,\n\t\t\tisInOnStateChange: false,\n\t\t\tconnStates: new Map(),\n\t\t};\n\t}\n\treturn runtimeState;\n}\n\nfunction getNativePersistState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): NativePersistActorState {\n\tconst persistState = getNativeRuntimeState(runtime, ctx).persistState;\n\tif (!persistState) {\n\t\tthrow new Error(\"native persist state was not initialized\");\n\t}\n\treturn persistState;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"then\" in value &&\n\t\ttypeof value.then === \"function\"\n\t);\n}\n\nfunction getNativeConnPersistState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tconn: ConnHandle,\n): NativePersistConnState {\n\tconst persistState = getNativePersistState(runtime, ctx);\n\tconst connId = callNativeSync(() => runtime.connId(conn));\n\tlet connState = persistState.connStates.get(connId);\n\tif (!connState) {\n\t\tconnState = {\n\t\t\tstate: undefined,\n\t\t};\n\t\tpersistState.connStates.set(connId, connState);\n\t}\n\treturn connState;\n}\n\nfunction stateMutationReentrantError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"state_mutation_reentrant\",\n\t\t\"State mutations are not allowed inside onStateChange.\",\n\t);\n}\n\nfunction databaseNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"database_not_configured\",\n\t\t\"database is not configured for this actor\",\n\t\t{ public: true },\n\t);\n}\n\nfunction databaseClientNotReadyError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"database_client_not_ready\",\n\t\t\"actor database client was not initialized before user code ran. this is an internal lifecycle error; the migration callback should have pre-warmed the client. file an issue if you can reproduce.\",\n\t\t{ public: true },\n\t);\n}\n\nfunction stateNotEnabledError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"state_not_enabled\",\n\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t{ public: true },\n\t);\n}\n\nfunction nativeClientNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"native\",\n\t\t\"client_not_configured\",\n\t\t\"native actor client is not configured\",\n\t\t{ public: true },\n\t);\n}\n\nfunction nativeEndpointNotConfiguredError(): RivetError {\n\treturn new RivetError(\n\t\t\"native\",\n\t\t\"endpoint_not_configured\",\n\t\t\"registry endpoint is required for native envoy startup\",\n\t\t{ public: true },\n\t);\n}\n\nfunction getNativeDestroyGate(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\tconst destroyGate = getNativeRuntimeState(runtime, ctx).destroyGate;\n\tif (!destroyGate) {\n\t\tthrow new Error(\"native destroy gate was not initialized\");\n\t}\n\treturn destroyGate;\n}\n\nfunction markNativeDestroyRequested(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n) {\n\tconst gate = getNativeDestroyGate(runtime, ctx);\n\tif (!gate.destroyCompletion) {\n\t\tgate.destroyCompletion = new Promise<void>((resolve) => {\n\t\t\tgate.resolveDestroy = resolve;\n\t\t});\n\t}\n}\n\nfunction resolveNativeDestroy(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\tconst gate = getNativeRuntimeState(runtime, ctx).destroyGate;\n\tif (!gate?.resolveDestroy) {\n\t\treturn;\n\t}\n\n\tgate.resolveDestroy();\n\tgate.resolveDestroy = undefined;\n\tgate.destroyCompletion = undefined;\n}\n\nfunction clearNativeRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n) {\n\tcallNativeSync(() => runtime.actorClearRuntimeState(ctx));\n}\n\nasync function cleanupNativeSleepRuntimeState(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tafterTrackedWorkDrained?: () => Promise<void>,\n): Promise<void> {\n\t// The bounded wait gives shutdown work one grace-period chance to finish.\n\t// Drained means all tracked shutdown work completed before the deadline, so\n\t// we can save final state and clear runtime state immediately. If it did not\n\t// drain, close database handles now, then defer the final save and clear until\n\t// the tracked work finishes without a deadline.\n\tconst drained = await runtime.actorWaitForTrackedShutdownWork(ctx);\n\tif (!drained) {\n\t\tawait closeNativeDatabaseClient(runtime, ctx);\n\t\tawait closeNativeSqlDatabase(runtime, ctx);\n\t\tvoid runtime\n\t\t\t.actorWaitForTrackedShutdownWorkUnbounded(ctx)\n\t\t\t.then(async () => {\n\t\t\t\tawait afterTrackedWorkDrained?.();\n\t\t\t\tclearNativeRuntimeState(runtime, ctx);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"deferred native sleep cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\treturn;\n\t}\n\n\tawait afterTrackedWorkDrained?.();\n\tawait closeNativeDatabaseClient(runtime, ctx);\n\tawait closeNativeSqlDatabase(runtime, ctx);\n\tclearNativeRuntimeState(runtime, ctx);\n}\n\nfunction closeNativeSqlDatabase(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): Promise<void> | undefined {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst database = runtimeState.sql;\n\tif (!database) {\n\t\treturn;\n\t}\n\n\truntimeState.sql = undefined;\n\treturn database.close();\n}\n\nasync function closeNativeDatabaseClient(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): Promise<void> {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst entry = runtimeState.databaseClient;\n\tif (!entry) {\n\t\treturn;\n\t}\n\n\truntimeState.databaseClient = undefined;\n\n\tif (\n\t\tentry.client &&\n\t\ttypeof entry.client === \"object\" &&\n\t\t\"close\" in entry.client &&\n\t\ttypeof entry.client.close === \"function\"\n\t) {\n\t\tawait entry.client.close();\n\t}\n}\n\nfunction getOrCreateNativeSqlDatabase(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n): ReturnType<typeof wrapJsNativeDatabase> {\n\tconst runtimeState = getNativeRuntimeState(runtime, ctx);\n\tconst cachedDatabase = runtimeState.sql;\n\tif (cachedDatabase) {\n\t\treturn cachedDatabase;\n\t}\n\n\tconst database = wrapJsNativeDatabase({\n\t\texec: (sql) => runtime.actorSqlExec(ctx, sql),\n\t\texecute: (sql, params) => runtime.actorSqlExecute(ctx, sql, params),\n\t\tquery: (sql, params) => runtime.actorSqlQuery(ctx, sql, params),\n\t\trun: (sql, params) => runtime.actorSqlRun(ctx, sql, params),\n\t\tmetrics: () => runtime.actorSqlMetrics(ctx),\n\t\ttakeLastKvError: () => runtime.actorSqlTakeLastKvError(ctx),\n\t\tclose: () => runtime.actorSqlClose(ctx),\n\t});\n\truntimeState.sql = database;\n\treturn database;\n}\n\nfunction toRuntimeBytes(\n\tvalue: string | Uint8Array | ArrayBuffer,\n): RuntimeBytes {\n\tif (typeof value === \"string\") {\n\t\treturn textEncoder.encode(value);\n\t}\n\tif (value instanceof Uint8Array) {\n\t\treturn value;\n\t}\n\treturn new Uint8Array(value);\n}\n\nfunction arrayBufferViewToRuntimeBytes(value: ArrayBufferView): RuntimeBytes {\n\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n}\n\nfunction runtimeBytesToArrayBuffer(value: RuntimeBytes): ArrayBuffer {\n\treturn value.buffer.slice(\n\t\tvalue.byteOffset,\n\t\tvalue.byteOffset + value.byteLength,\n\t) as ArrayBuffer;\n}\n\ntype NativeKvValueType = \"text\" | \"arrayBuffer\" | \"binary\";\ntype NativeKvKeyType = \"text\" | \"binary\";\n\ntype NativeKvValueTypeMap = {\n\ttext: string;\n\tarrayBuffer: ArrayBuffer;\n\tbinary: Uint8Array;\n};\n\ntype NativeKvKeyTypeMap = {\n\ttext: string;\n\tbinary: Uint8Array;\n};\n\ntype NativeKvValueOptions<T extends NativeKvValueType = \"text\"> = {\n\ttype?: T;\n};\n\ntype NativeKvListOptions<\n\tT extends NativeKvValueType = \"text\",\n\tK extends NativeKvKeyType = \"text\",\n> = NativeKvValueOptions<T> & {\n\tkeyType?: K;\n\treverse?: boolean;\n\tlimit?: number;\n};\n\nfunction decodeNativeKvKey<K extends NativeKvKeyType = \"text\">(\n\tkey: Uint8Array,\n\tkeyType?: K,\n): NativeKvKeyTypeMap[K] {\n\tconst resolvedKeyType = keyType ?? \"text\";\n\tswitch (resolvedKeyType) {\n\t\tcase \"text\":\n\t\t\treturn textDecoder.decode(key) as NativeKvKeyTypeMap[K];\n\t\tcase \"binary\":\n\t\t\treturn key as NativeKvKeyTypeMap[K];\n\t\tdefault:\n\t\t\tthrow new TypeError(\"Invalid kv key type\");\n\t}\n}\n\nfunction encodeNativeKvUserKey<K extends NativeKvKeyType = NativeKvKeyType>(\n\tkey: NativeKvKeyTypeMap[K],\n\tkeyType?: K,\n): Uint8Array {\n\tif (key instanceof Uint8Array) {\n\t\treturn key;\n\t}\n\tconst resolvedKeyType = keyType ?? \"text\";\n\tif (resolvedKeyType === \"binary\") {\n\t\tthrow new TypeError(\"Expected a Uint8Array when keyType is binary\");\n\t}\n\treturn textEncoder.encode(key);\n}\n\nfunction decodeNativeKvValue<T extends NativeKvValueType = \"text\">(\n\tvalue: Uint8Array,\n\toptions?: NativeKvValueOptions<T>,\n): NativeKvValueTypeMap[T] {\n\tconst type = options?.type ?? \"text\";\n\tswitch (type) {\n\t\tcase \"text\":\n\t\t\treturn textDecoder.decode(value) as NativeKvValueTypeMap[T];\n\t\tcase \"arrayBuffer\": {\n\t\t\tconst copy = new Uint8Array(value.byteLength);\n\t\t\tcopy.set(value);\n\t\t\treturn copy.buffer as NativeKvValueTypeMap[T];\n\t\t}\n\t\tcase \"binary\":\n\t\t\treturn value as NativeKvValueTypeMap[T];\n\t\tdefault:\n\t\t\tthrow new TypeError(\"Invalid kv value type\");\n\t}\n}\n\nasync function loadEngineCli(): Promise<typeof import(\"@rivetkit/engine-cli\")> {\n\treturn import([\"@rivetkit\", \"engine-cli\"].join(\"/\"));\n}\n\nfunction decodeValue<T>(value?: RuntimeBytes | null): T {\n\tif (!value || value.length === 0) {\n\t\treturn undefined as T;\n\t}\n\n\treturn decodeCborCompat(value);\n}\n\nfunction encodeValue(value: unknown): RuntimeBytes {\n\treturn encodeCborCompat(value as JsonCompatValue);\n}\n\nfunction normalizeArgs(value: unknown): unknown[] {\n\treturn Array.isArray(value)\n\t\t? value\n\t\t: value === undefined || value === null\n\t\t\t? []\n\t\t\t: [value];\n}\n\nfunction unwrapTsfnPayload<T>(error: unknown, payload: T): T {\n\tif (error !== null && error !== undefined) {\n\t\tthrow error;\n\t}\n\n\treturn payload;\n}\n\nfunction normalizeNativeBridgeError(error: unknown): unknown {\n\tif (typeof error === \"string\") {\n\t\treturn decodeBridgeRivetError(error) ?? error;\n\t}\n\n\tif (error instanceof Error) {\n\t\tconst bridged = decodeBridgeRivetError(error.message);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\tif (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"reason\" in error &&\n\t\ttypeof error.reason === \"string\"\n\t) {\n\t\tconst bridged = decodeBridgeRivetError(error.reason);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\treturn error;\n}\n\nfunction isStructuredBridgeError(\n\terror: unknown,\n): error is RivetError | RivetErrorLike {\n\tif (error instanceof RivetError) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tisRivetErrorLike(error) &&\n\t\t\"__type\" in error &&\n\t\t(error.__type === \"RivetError\" || error.__type === \"ActorError\")\n\t);\n}\n\nfunction encodeNativeCallbackError(error: unknown): Error {\n\tconst structuredError = isStructuredBridgeError(error)\n\t\t? error\n\t\t: deconstructError(error, true);\n\n\tconst bridgeError = new Error(encodeBridgeRivetError(structuredError), {\n\t\tcause: error instanceof Error ? error : undefined,\n\t});\n\treturn Object.assign(bridgeError, {\n\t\tgroup: structuredError.group,\n\t\tcode: structuredError.code,\n\t\tmetadata: structuredError.metadata,\n\t});\n}\n\nasync function callNative<T>(invoke: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn await invoke();\n\t} catch (error) {\n\t\tthrow normalizeNativeBridgeError(error);\n\t}\n}\n\nfunction callNativeSync<T>(invoke: () => T): T {\n\ttry {\n\t\treturn invoke();\n\t} catch (error) {\n\t\tthrow normalizeNativeBridgeError(error);\n\t}\n}\n\nfunction actorAbortedError(): Error & { group: string; code: string } {\n\treturn Object.assign(new Error(\"Actor aborted\"), {\n\t\tgroup: \"actor\",\n\t\tcode: \"aborted\",\n\t});\n}\n\ntype NativeWorkflowInspectorConfig = WorkflowInspectorConfig<ArrayBuffer> & {\n\tgetState?: () => Promise<unknown> | unknown;\n};\n\nfunction isClosedTaskRegistrationError(error: unknown): boolean {\n\tconst metadata = error instanceof RivetError ? error.metadata : undefined;\n\tconst metadataError =\n\t\tmetadata && typeof metadata === \"object\" && \"error\" in metadata\n\t\t\t? metadata.error\n\t\t\t: undefined;\n\treturn (\n\t\terror instanceof RivetError &&\n\t\terror.group === \"core\" &&\n\t\terror.code === INTERNAL_ERROR_CODE &&\n\t\ttypeof metadataError === \"string\" &&\n\t\t/actor task registration is (closed|not configured)/.test(metadataError)\n\t);\n}\n\nasync function createCancellationTokenHandle(\n\truntime: CoreRuntime,\n\tsignal?: AbortSignal,\n): Promise<{\n\ttoken?: CancellationTokenHandle;\n\tcleanup?: () => void;\n}> {\n\tif (!signal) {\n\t\treturn {};\n\t}\n\n\tconst token = runtime.createCancellationToken();\n\n\tif (signal.aborted) {\n\t\truntime.cancelCancellationToken(token);\n\t\treturn { token };\n\t}\n\n\tconst abort = () => runtime.cancelCancellationToken(token);\n\tsignal.addEventListener(\"abort\", abort, { once: true });\n\treturn {\n\t\ttoken,\n\t\tcleanup: () => signal.removeEventListener(\"abort\", abort),\n\t};\n}\n\nfunction decodeWorkflowCbor(data: ArrayBuffer | null): unknown | null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn decodeCborCompat(new Uint8Array(data));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction serializeWorkflowLocation(\n\tlocation: ReturnType<\n\t\ttypeof decodeWorkflowHistoryTransport\n\t>[\"entries\"][number][\"location\"],\n): Array<\n\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t| {\n\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\tval: { loop: number; iteration: number };\n\t }\n> {\n\treturn location.map((segment) => {\n\t\tif (segment.tag === \"WorkflowNameIndex\") {\n\t\t\treturn {\n\t\t\t\ttag: segment.tag,\n\t\t\t\tval: segment.val,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttag: segment.tag,\n\t\t\tval: {\n\t\t\t\tloop: segment.val.loop,\n\t\t\t\titeration: segment.val.iteration,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction serializeWorkflowBranches(\n\tbranches: ReadonlyMap<\n\t\tstring,\n\t\tReturnType<\n\t\t\ttypeof decodeWorkflowHistoryTransport\n\t\t>[\"entries\"][number][\"kind\"] extends infer T\n\t\t\t? T extends { tag: \"WorkflowJoinEntry\"; val: { branches: infer B } }\n\t\t\t\t? B extends ReadonlyMap<string, infer V>\n\t\t\t\t\t? V\n\t\t\t\t\t: never\n\t\t\t\t: T extends {\n\t\t\t\t\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\t\t\t\t\tval: { branches: infer B };\n\t\t\t\t\t\t}\n\t\t\t\t\t? B extends ReadonlyMap<string, infer V>\n\t\t\t\t\t\t? V\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t\t: never\n\t>,\n): Record<\n\tstring,\n\t{ status: string; output: unknown | null; error: string | null }\n> {\n\treturn Object.fromEntries(\n\t\tArray.from(branches.entries()).map(([name, branch]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\tstatus: branch.status,\n\t\t\t\toutput: decodeWorkflowCbor(branch.output),\n\t\t\t\terror: branch.error,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction serializeWorkflowEntryKind(\n\tkind: ReturnType<\n\t\ttypeof decodeWorkflowHistoryTransport\n\t>[\"entries\"][number][\"kind\"],\n):\n\t| {\n\t\t\ttag: \"WorkflowStepEntry\";\n\t\t\tval: { output: unknown | null; error: string | null };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowLoopEntry\";\n\t\t\tval: {\n\t\t\t\tstate: unknown | null;\n\t\t\t\titeration: number;\n\t\t\t\toutput: unknown | null;\n\t\t\t};\n\t }\n\t| { tag: \"WorkflowSleepEntry\"; val: { deadline: number; state: string } }\n\t| {\n\t\t\ttag: \"WorkflowMessageEntry\";\n\t\t\tval: { name: string; messageData: unknown | null };\n\t }\n\t| { tag: \"WorkflowRollbackCheckpointEntry\"; val: { name: string } }\n\t| {\n\t\t\ttag: \"WorkflowJoinEntry\";\n\t\t\tval: {\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\tval: {\n\t\t\t\twinner: string | null;\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRemovedEntry\";\n\t\t\tval: { originalType: string; originalName: string | null };\n\t } {\n\tswitch (kind.tag) {\n\t\tcase \"WorkflowStepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t\terror: kind.val.error,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowLoopEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tstate: decodeWorkflowCbor(kind.val.state),\n\t\t\t\t\titeration: kind.val.iteration,\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowSleepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tdeadline: Number(kind.val.deadline),\n\t\t\t\t\tstate: kind.val.state,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowMessageEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t\tmessageData: decodeWorkflowCbor(kind.val.messageData),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRollbackCheckpointEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowJoinEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRaceEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\twinner: kind.val.winner,\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRemovedEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toriginalType: kind.val.originalType,\n\t\t\t\t\toriginalName: kind.val.originalName,\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n// TODO: Switch inspector routes to CBOR encoding\nfunction serializeWorkflowHistoryForJson(data: ArrayBuffer | null): {\n\tnameRegistry: string[];\n\tentries: Array<{\n\t\tid: string;\n\t\tlocation: Array<\n\t\t\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t\t\t| {\n\t\t\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\t\t\tval: { loop: number; iteration: number };\n\t\t\t }\n\t\t>;\n\t\tkind: ReturnType<typeof serializeWorkflowEntryKind>;\n\t}>;\n\tentryMetadata: Record<\n\t\tstring,\n\t\t{\n\t\t\tstatus: string;\n\t\t\terror: string | null;\n\t\t\tattempts: number;\n\t\t\tlastAttemptAt: number;\n\t\t\tcreatedAt: number;\n\t\t\tcompletedAt: number | null;\n\t\t\trollbackCompletedAt: number | null;\n\t\t\trollbackError: string | null;\n\t\t}\n\t>;\n} | null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\tconst history = decodeWorkflowHistoryTransport(data);\n\n\treturn jsonSafe({\n\t\tnameRegistry: [...history.nameRegistry],\n\t\tentries: history.entries.map((entry) => ({\n\t\t\tid: entry.id,\n\t\t\tlocation: serializeWorkflowLocation(entry.location),\n\t\t\tkind: serializeWorkflowEntryKind(entry.kind),\n\t\t})),\n\t\tentryMetadata: Object.fromEntries(\n\t\t\tArray.from(history.entryMetadata.entries()).map(\n\t\t\t\t([entryId, meta]) => [\n\t\t\t\t\tentryId,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: meta.status,\n\t\t\t\t\t\terror: meta.error,\n\t\t\t\t\t\tattempts: meta.attempts,\n\t\t\t\t\t\tlastAttemptAt: Number(meta.lastAttemptAt),\n\t\t\t\t\t\tcreatedAt: Number(meta.createdAt),\n\t\t\t\t\t\tcompletedAt:\n\t\t\t\t\t\t\tmeta.completedAt === null\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: Number(meta.completedAt),\n\t\t\t\t\t\trollbackCompletedAt:\n\t\t\t\t\t\t\tmeta.rollbackCompletedAt === null\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: Number(meta.rollbackCompletedAt),\n\t\t\t\t\t\trollbackError: meta.rollbackError,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t),\n\t\t),\n\t});\n}\n\nfunction toHttpJsonCompatible<T>(value: T): T {\n\treturn JSON.parse(\n\t\tJSON.stringify(value, (_key, nestedValue) =>\n\t\t\ttypeof nestedValue === \"bigint\"\n\t\t\t\t? Number(nestedValue)\n\t\t\t\t: nestedValue instanceof Uint8Array\n\t\t\t\t\t? Array.from(nestedValue)\n\t\t\t\t\t: nestedValue,\n\t\t),\n\t) as T;\n}\n\nfunction jsonSafe<T>(value: T): T {\n\treturn toHttpJsonCompatible(value);\n}\n\nfunction normalizeSqlitePropertyBindings(\n\tproperties: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst normalized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(properties)) {\n\t\tif (/^[:@$]/.test(key)) {\n\t\t\tnormalized[key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tnormalized[`:${key}`] = value;\n\t\tnormalized[`@${key}`] = value;\n\t\tnormalized[`$${key}`] = value;\n\t}\n\treturn normalized;\n}\n\nfunction queryRows(result: unknown): Array<Record<string, unknown>> {\n\tif (Array.isArray(result)) {\n\t\treturn result as Array<Record<string, unknown>>;\n\t}\n\tif (\n\t\tresult &&\n\t\ttypeof result === \"object\" &&\n\t\t\"columns\" in result &&\n\t\t\"rows\" in result &&\n\t\tArray.isArray((result as { columns: unknown }).columns) &&\n\t\tArray.isArray((result as { rows: unknown }).rows)\n\t) {\n\t\tconst columns = (result as { columns: string[] }).columns;\n\t\treturn ((result as { rows: unknown[][] }).rows ?? []).map((row) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tcolumns.map((column, index) => [column, row[index]]),\n\t\t\t),\n\t\t);\n\t}\n\treturn [];\n}\n\nfunction wrapNativeCallback<Args extends Array<unknown>, Result>(\n\tcallback: (...args: Args) => Result | Promise<Result>,\n): (...args: Args) => Promise<Result> {\n\treturn async (...args: Args) => {\n\t\ttry {\n\t\t\treturn await callback(...args);\n\t\t} catch (error) {\n\t\t\tthrow encodeNativeCallbackError(error);\n\t\t}\n\t};\n}\n\nfunction decodeArgs(value?: RuntimeBytes | null): unknown[] {\n\tconst decoded = decodeValue<unknown>(value);\n\treturn normalizeArgs(decoded);\n}\n\nfunction buildRequest(init: {\n\tmethod: string;\n\turi: string;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}): Request {\n\tconst url = init.uri.startsWith(\"http\")\n\t\t? init.uri\n\t\t: new URL(init.uri, \"http://127.0.0.1\").toString();\n\tconst body =\n\t\tinit.body && init.body.length > 0\n\t\t\t? runtimeBytesToArrayBuffer(init.body)\n\t\t\t: undefined;\n\treturn new Request(url, {\n\t\tmethod: init.method,\n\t\theaders: init.headers,\n\t\tbody,\n\t});\n}\n\nasync function toRuntimeHttpResponse(\n\tresponse: Response,\n): Promise<RuntimeHttpResponse> {\n\tconst headers = Object.fromEntries(response.headers.entries());\n\tconst body = new Uint8Array(await response.arrayBuffer());\n\treturn {\n\t\tstatus: response.status,\n\t\theaders,\n\t\tbody,\n\t};\n}\n\nfunction toActorKey(\n\tsegments: Array<{\n\t\tkind: string;\n\t\tstringValue?: string;\n\t\tnumberValue?: number;\n\t}>,\n): string[] {\n\treturn segments.map((segment) =>\n\t\tsegment.kind === \"number\"\n\t\t\t? String(segment.numberValue ?? 0)\n\t\t\t: (segment.stringValue ?? \"\"),\n\t);\n}\n\nclass NativeConnAdapter {\n\t#runtime: CoreRuntime;\n\t#conn: ConnHandle;\n\t#schemas: NativeValidationConfig;\n\t#ctx?: ActorContextHandle;\n\t#queueHibernationRemoval?: (connId: string) => void;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tconn: ConnHandle,\n\t\tschemas: NativeValidationConfig = {},\n\t\tctx?: ActorContextHandle,\n\t\tqueueHibernationRemoval?: (connId: string) => void,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#conn = conn;\n\t\tthis.#schemas = schemas;\n\t\tthis.#ctx = ctx;\n\t\tthis.#queueHibernationRemoval = queueHibernationRemoval;\n\t\t(\n\t\t\tthis as NativeConnAdapter & {\n\t\t\t\t[CONN_STATE_MANAGER_SYMBOL]?: unknown;\n\t\t\t}\n\t\t)[CONN_STATE_MANAGER_SYMBOL] = {\n\t\t\tstateEnabled: true,\n\t\t\tget state() {\n\t\t\t\treturn thisConn.state;\n\t\t\t},\n\t\t};\n\t\tconst thisConn = this;\n\t}\n\n\tget id(): string {\n\t\treturn this.#runtime.connId(this.#conn);\n\t}\n\n\tget params(): unknown {\n\t\treturn validateConnParams(\n\t\t\tthis.#schemas.connParamsSchema,\n\t\t\tdecodeValue(this.#runtime.connParams(this.#conn)),\n\t\t);\n\t}\n\n\t[RAW_STATE_SYMBOL](): unknown {\n\t\treturn this.#readState();\n\t}\n\n\tget state(): unknown {\n\t\tconst nextState = this.#readState();\n\t\treturn createWriteThroughProxy(\n\t\t\tnextState,\n\t\t\t(nextValue) => {\n\t\t\t\tthis.#writeState(nextValue, { writeNative: true });\n\t\t\t},\n\t\t\t(newValue) => {\n\t\t\t\tassertJsonCompatValue(newValue);\n\t\t\t},\n\t\t);\n\t}\n\n\tset state(value: unknown) {\n\t\tassertJsonCompatValue(value);\n\t\tthis.#writeState(value, { writeNative: true });\n\t}\n\n\tinitializeState(value: unknown): void {\n\t\tthis.#writeState(value, { writeNative: false });\n\t}\n\n\tget isHibernatable(): boolean {\n\t\treturn callNativeSync(() =>\n\t\t\tthis.#runtime.connIsHibernatable(this.#conn),\n\t\t);\n\t}\n\n\tsend(name: string, ...args: unknown[]): void {\n\t\tconst validatedArgs = validateEventArgs(\n\t\t\tthis.#schemas.events,\n\t\t\tname,\n\t\t\targs,\n\t\t);\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.connSend(\n\t\t\t\tthis.#conn,\n\t\t\t\tname,\n\t\t\t\tencodeValue(validatedArgs),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync disconnect(reason?: string): Promise<void> {\n\t\tconst connId = this.id;\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.connDisconnect(this.#conn, reason),\n\t\t);\n\t\tif (this.isHibernatable) {\n\t\t\tthis.#queueHibernationRemoval?.(connId);\n\t\t}\n\t}\n\n\t#readState(): unknown {\n\t\tif (!this.#ctx) {\n\t\t\treturn decodeValue(this.#runtime.connState(this.#conn));\n\t\t}\n\n\t\tconst connState = getNativeConnPersistState(\n\t\t\tthis.#runtime,\n\t\t\tthis.#ctx,\n\t\t\tthis.#conn,\n\t\t);\n\t\tif (connState.state === undefined) {\n\t\t\tconnState.state = decodeValue(this.#runtime.connState(this.#conn));\n\t\t}\n\t\treturn connState.state;\n\t}\n\n\t#writeState(\n\t\tvalue: unknown,\n\t\toptions: {\n\t\t\twriteNative: boolean;\n\t\t},\n\t): void {\n\t\tconst encoded = encodeValue(value);\n\t\tif (!this.#ctx) {\n\t\t\tthis.#runtime.connSetState(this.#conn, encoded);\n\t\t\treturn;\n\t\t}\n\n\t\tconst connState = getNativeConnPersistState(\n\t\t\tthis.#runtime,\n\t\t\tthis.#ctx,\n\t\t\tthis.#conn,\n\t\t);\n\t\tconnState.state = value;\n\t\tif (options.writeNative) {\n\t\t\tthis.#runtime.connSetState(this.#conn, encoded);\n\t\t}\n\t}\n}\n\nclass NativeScheduleAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\n\tconstructor(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync after(\n\t\tduration: number,\n\t\taction: string,\n\t\t...args: unknown[]\n\t): Promise<void> {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorScheduleAfter(\n\t\t\t\tthis.#ctx,\n\t\t\t\tduration,\n\t\t\t\taction,\n\t\t\t\tencodeValue(args),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync at(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\t...args: unknown[]\n\t): Promise<void> {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorScheduleAt(\n\t\t\t\tthis.#ctx,\n\t\t\t\ttimestamp,\n\t\t\t\taction,\n\t\t\t\tencodeValue(args),\n\t\t\t),\n\t\t);\n\t}\n}\n\nclass NativeKvAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\n\tconstructor(runtime: CoreRuntime, ctx: ActorContextHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync get<T extends NativeKvValueType = \"text\">(\n\t\tkey: string | Uint8Array,\n\t\toptions?: NativeKvValueOptions<T>,\n\t): Promise<NativeKvValueTypeMap[T] | null> {\n\t\tconst value = await callNative(() =>\n\t\t\tthis.#runtime.actorKvGet(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t),\n\t\t);\n\t\treturn value\n\t\t\t? decodeNativeKvValue(new Uint8Array(value), options)\n\t\t\t: null;\n\t}\n\n\tasync put(\n\t\tkey: string | Uint8Array,\n\t\tvalue: string | Uint8Array | ArrayBuffer,\n\t\t_options?: NativeKvValueOptions,\n\t): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvPut(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t\ttoRuntimeBytes(value),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync delete(key: string | Uint8Array): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDelete(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(key)),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync deleteRange(\n\t\tstart: string | Uint8Array,\n\t\tend: string | Uint8Array,\n\t): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDeleteRange(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(start)),\n\t\t\t\tmakePrefixedKey(encodeNativeKvUserKey(end)),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync rawDeleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvDeleteRange(this.#ctx, start, end),\n\t\t);\n\t}\n\n\tasync listPrefix<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tprefix: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListPrefix(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tprefix as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\treverse: options?.reverse,\n\t\t\t\t\tlimit: options?.limit,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tdecodeNativeKvKey(\n\t\t\t\tremovePrefixFromKey(new Uint8Array(entry.key)),\n\t\t\t\toptions?.keyType,\n\t\t\t),\n\t\t\tdecodeNativeKvValue(new Uint8Array(entry.value), options),\n\t\t]);\n\t}\n\n\tasync rawListPrefix(\n\t\tprefix: Uint8Array,\n\t): Promise<Array<[Uint8Array, Uint8Array]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListPrefix(this.#ctx, prefix, {}),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tnew Uint8Array(entry.key),\n\t\t\tnew Uint8Array(entry.value),\n\t\t]);\n\t}\n\n\tasync listRange<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tstart: string | Uint8Array,\n\t\tend: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\tconst entries = await callNative(() =>\n\t\t\tthis.#runtime.actorKvListRange(\n\t\t\t\tthis.#ctx,\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tstart as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tmakePrefixedKey(\n\t\t\t\t\tencodeNativeKvUserKey(\n\t\t\t\t\t\tend as NativeKvKeyTypeMap[K],\n\t\t\t\t\t\toptions?.keyType,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\treverse: options?.reverse,\n\t\t\t\t\tlimit: options?.limit,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t\treturn entries.map((entry) => [\n\t\t\tdecodeNativeKvKey(\n\t\t\t\tremovePrefixFromKey(new Uint8Array(entry.key)),\n\t\t\t\toptions?.keyType,\n\t\t\t),\n\t\t\tdecodeNativeKvValue(new Uint8Array(entry.value), options),\n\t\t]);\n\t}\n\n\tasync list<\n\t\tT extends NativeKvValueType = \"text\",\n\t\tK extends NativeKvKeyType = \"text\",\n\t>(\n\t\tprefix: string | Uint8Array,\n\t\toptions?: NativeKvListOptions<T, K>,\n\t): Promise<Array<[NativeKvKeyTypeMap[K], NativeKvValueTypeMap[T]]>> {\n\t\treturn this.listPrefix(prefix, options);\n\t}\n\n\tasync batchGet(keys: Uint8Array[]): Promise<Array<Uint8Array | null>> {\n\t\tconst values = await callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchGet(this.#ctx, keys),\n\t\t);\n\t\treturn values.map((value) => (value ? new Uint8Array(value) : null));\n\t}\n\n\tasync batchPut(entries: [Uint8Array, Uint8Array][]): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchPut(\n\t\t\t\tthis.#ctx,\n\t\t\t\tentries.map(([key, value]) => ({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue,\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync batchDelete(keys: Uint8Array[]): Promise<void> {\n\t\tawait callNative(() =>\n\t\t\tthis.#runtime.actorKvBatchDelete(this.#ctx, keys),\n\t\t);\n\t}\n}\n\nfunction wrapQueueMessage(\n\tmessage: RuntimeQueueMessage,\n\tschemas: NativeValidationConfig[\"queues\"],\n) {\n\tconst name = callNativeSync(() => message.name());\n\treturn {\n\t\tid: Number(callNativeSync(() => message.id())),\n\t\tname,\n\t\tbody: validateQueueBody(\n\t\t\tschemas,\n\t\t\tname,\n\t\t\tdecodeValue(callNativeSync(() => message.body())),\n\t\t),\n\t\tcreatedAt: callNativeSync(() => message.createdAt()),\n\t\tcomplete: callNativeSync(() => message.isCompletable())\n\t\t\t? async (response?: unknown) =>\n\t\t\t\t\tawait callNative(() =>\n\t\t\t\t\t\tmessage.complete(\n\t\t\t\t\t\t\tresponse === undefined\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(\n\t\t\t\t\t\t\t\t\t\tvalidateQueueComplete(\n\t\t\t\t\t\t\t\t\t\t\tschemas,\n\t\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t};\n}\n\nclass NativeQueueAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig[\"queues\"];\n\t#pendingCompletableMessageIds = new Set<string>();\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tschemas: NativeValidationConfig[\"queues\"] = undefined,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#schemas = schemas;\n\t}\n\n\tasync send(name: string, body: unknown) {\n\t\tconst validatedBody = validateQueueBody(this.#schemas, name, body);\n\t\treturn wrapQueueMessage(\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueSend(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\tname,\n\t\t\t\t\tencodeValue(validatedBody),\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#schemas,\n\t\t);\n\t}\n\n\tasync next(options?: {\n\t\tnames?: readonly string[];\n\t\ttimeout?: number;\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst messages = await this.nextBatch({\n\t\t\tnames: options?.names,\n\t\t\tcount: 1,\n\t\t\ttimeout: options?.timeout,\n\t\t\tsignal: options?.signal,\n\t\t\tcompletable: options?.completable,\n\t\t});\n\t\treturn messages[0];\n\t}\n\n\tasync nextBatch(options?: {\n\t\tnames?: readonly string[];\n\t\tcount?: number;\n\t\ttimeout?: number;\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst completable = options?.completable === true;\n\t\tif (this.#pendingCompletableMessageIds.size > 0) {\n\t\t\tthrow new RivetError(\n\t\t\t\t\"queue\",\n\t\t\t\t\"previous_message_not_completed\",\n\t\t\t\t\"Previous completable queue message is not completed. Call `message.complete(...)` before receiving the next message.\",\n\t\t\t\t{\n\t\t\t\t\tpublic: true,\n\t\t\t\t\tstatusCode: 400,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tconst messages = await callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueNextBatch(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t{\n\t\t\t\t\t\tnames: this.#normalizeNames(options?.names),\n\t\t\t\t\t\tcount: options?.count,\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t\tcompletable,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst wrapped = messages.map((message) =>\n\t\t\t\twrapQueueMessage(message, this.#schemas),\n\t\t\t);\n\t\t\treturn completable\n\t\t\t\t? wrapped.map((message) =>\n\t\t\t\t\t\tthis.#makeCompletableMessage(message),\n\t\t\t\t\t)\n\t\t\t\t: wrapped;\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync waitForNames(\n\t\tnames: readonly string[],\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t\tcompletable?: boolean;\n\t\t},\n\t) {\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\treturn wrapQueueMessage(\n\t\t\t\tawait callNative(() =>\n\t\t\t\t\tthis.#runtime.actorQueueWaitForNames(\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t\t[...names],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t\t\tcompletable: options?.completable,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tthis.#schemas,\n\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync waitForNamesAvailable(\n\t\tnames: readonly string[],\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t},\n\t) {\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueWaitForNamesAvailable(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t[...names],\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync enqueueAndWait(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: {\n\t\t\ttimeout?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t},\n\t) {\n\t\tconst validatedBody = validateQueueBody(this.#schemas, name, body);\n\t\tconst { token, cleanup } = await createCancellationTokenHandle(\n\t\t\tthis.#runtime,\n\t\t\toptions?.signal,\n\t\t);\n\n\t\ttry {\n\t\t\tconst response = await callNative(() =>\n\t\t\t\tthis.#runtime.actorQueueEnqueueAndWait(\n\t\t\t\t\tthis.#ctx,\n\t\t\t\t\tname,\n\t\t\t\t\tencodeValue(validatedBody),\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeoutMs: options?.timeout,\n\t\t\t\t\t},\n\t\t\t\t\ttoken,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn response === undefined || response === null\n\t\t\t\t? undefined\n\t\t\t\t: validateQueueComplete(\n\t\t\t\t\t\tthis.#schemas,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdecodeValue(response),\n\t\t\t\t\t);\n\t\t} finally {\n\t\t\tcleanup?.();\n\t\t}\n\t}\n\n\tasync tryNext(options?: {\n\t\tnames?: readonly string[];\n\t\tcompletable?: boolean;\n\t}) {\n\t\tconst messages = await this.tryNextBatch({\n\t\t\tnames: options?.names,\n\t\t\tcount: 1,\n\t\t\tcompletable: options?.completable,\n\t\t});\n\t\treturn messages[0];\n\t}\n\n\tasync tryNextBatch(options?: {\n\t\tnames?: readonly string[];\n\t\tcount?: number;\n\t\tcompletable?: boolean;\n\t}) {\n\t\tif (options?.completable) {\n\t\t\treturn await this.nextBatch({\n\t\t\t\tnames: options.names,\n\t\t\t\tcount: options.count,\n\t\t\t\ttimeout: 0,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.nextBatch({\n\t\t\t\tnames: options?.names,\n\t\t\t\tcount: options?.count,\n\t\t\t\ttimeout: 0,\n\t\t\t\tcompletable: false,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t(error as { group?: string; code?: string }).group ===\n\t\t\t\t\t\"queue\" &&\n\t\t\t\t(error as { group?: string; code?: string }).code ===\n\t\t\t\t\t\"timed_out\"\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync *iter(options?: {\n\t\tnames?: readonly string[];\n\t\tsignal?: AbortSignal;\n\t\tcompletable?: boolean;\n\t}): AsyncIterableIterator<\n\t\tNonNullable<Awaited<ReturnType<NativeQueueAdapter[\"next\"]>>>\n\t> {\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst message = await this.next(options);\n\t\t\t\tif (!message) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield message;\n\t\t\t} catch (error) {\n\t\t\t\tif (\n\t\t\t\t\tisRivetErrorLike(error) &&\n\t\t\t\t\terror.group === \"actor\" &&\n\t\t\t\t\terror.code === \"aborted\"\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t#normalizeNames(\n\t\tnames: readonly string[] | undefined,\n\t): string[] | undefined {\n\t\tif (!names || names.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn [...new Set(names)];\n\t}\n\n\t#makeCompletableMessage(\n\t\tmessage: Awaited<ReturnType<typeof wrapQueueMessage>>,\n\t) {\n\t\tconst messageId = message.id.toString();\n\t\tthis.#pendingCompletableMessageIds.add(messageId);\n\t\tlet completed = false;\n\n\t\treturn {\n\t\t\t...message,\n\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\tif (typeof message.complete !== \"function\") {\n\t\t\t\t\tthrow new RivetError(\n\t\t\t\t\t\t\"queue\",\n\t\t\t\t\t\t\"complete_not_configured\",\n\t\t\t\t\t\t`Queue '${message.name}' does not support completion responses.`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpublic: true,\n\t\t\t\t\t\t\tstatusCode: 400,\n\t\t\t\t\t\t\tmetadata: { name: message.name },\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (completed) {\n\t\t\t\t\tthrow new RivetError(\n\t\t\t\t\t\t\"queue\",\n\t\t\t\t\t\t\"already_completed\",\n\t\t\t\t\t\t\"Queue message was already completed.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpublic: true,\n\t\t\t\t\t\t\tstatusCode: 400,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tawait message.complete(response);\n\t\t\t\tcompleted = true;\n\t\t\t\tthis.#pendingCompletableMessageIds.delete(messageId);\n\t\t\t},\n\t\t};\n\t}\n}\n\nclass NativeWebSocketAdapter {\n\t#runtime: CoreRuntime;\n\t#ws: WebSocketHandle;\n\t#virtual: VirtualWebSocket;\n\t#readyState: 0 | 1 | 2 | 3 = VirtualWebSocket.OPEN;\n\n\tconstructor(runtime: CoreRuntime, ws: WebSocketHandle) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ws = ws;\n\t\tthis.#virtual = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => {\n\t\t\t\tif (typeof data === \"string\") {\n\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\tthis.#runtime.webSocketSend(\n\t\t\t\t\t\t\tthis.#ws,\n\t\t\t\t\t\t\ttextEncoder.encode(data),\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst bytes = ArrayBuffer.isView(data)\n\t\t\t\t\t? arrayBufferViewToRuntimeBytes(data)\n\t\t\t\t\t: new Uint8Array(data as ArrayBufferLike);\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.webSocketSend(this.#ws, bytes, true),\n\t\t\t\t);\n\t\t\t},\n\t\t\tonClose: (code, reason) => {\n\t\t\t\tthis.#readyState = VirtualWebSocket.CLOSING;\n\t\t\t\tvoid callNative(() =>\n\t\t\t\t\tthis.#runtime.webSocketClose(this.#ws, code, reason),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t\tthis.#runtime.webSocketSetEventCallback(this.#ws, (event) => {\n\t\t\tif (event.kind === \"message\") {\n\t\t\t\tthis.#virtual.triggerMessage(\n\t\t\t\t\tevent.binary\n\t\t\t\t\t\t? runtimeBytesToArrayBuffer(event.data as RuntimeBytes)\n\t\t\t\t\t\t: event.data,\n\t\t\t\t\tevent.messageIndex,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#readyState = VirtualWebSocket.CLOSED;\n\t\t\tthis.#virtual.triggerClose(\n\t\t\t\tevent.code,\n\t\t\t\tevent.reason,\n\t\t\t\tevent.wasClean,\n\t\t\t);\n\t\t});\n\t}\n\n\tget readyState() {\n\t\treturn this.#virtual.readyState;\n\t}\n\n\tget CONNECTING() {\n\t\treturn this.#virtual.CONNECTING;\n\t}\n\n\tget OPEN() {\n\t\treturn this.#virtual.OPEN;\n\t}\n\n\tget CLOSING() {\n\t\treturn this.#virtual.CLOSING;\n\t}\n\n\tget CLOSED() {\n\t\treturn this.#virtual.CLOSED;\n\t}\n\n\tget binaryType() {\n\t\treturn this.#virtual.binaryType;\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\tthis.#virtual.binaryType = value;\n\t}\n\n\tget bufferedAmount() {\n\t\treturn this.#virtual.bufferedAmount;\n\t}\n\n\tget extensions() {\n\t\treturn this.#virtual.extensions;\n\t}\n\n\tget protocol() {\n\t\treturn this.#virtual.protocol;\n\t}\n\n\tget url() {\n\t\treturn this.#virtual.url;\n\t}\n\n\tget onopen() {\n\t\treturn this.#virtual.onopen;\n\t}\n\n\tset onopen(value) {\n\t\tthis.#virtual.onopen = value;\n\t}\n\n\tget onclose() {\n\t\treturn this.#virtual.onclose;\n\t}\n\n\tset onclose(value) {\n\t\tthis.#virtual.onclose = value;\n\t}\n\n\tget onerror() {\n\t\treturn this.#virtual.onerror;\n\t}\n\n\tset onerror(value) {\n\t\tthis.#virtual.onerror = value;\n\t}\n\n\tget onmessage() {\n\t\treturn this.#virtual.onmessage;\n\t}\n\n\tset onmessage(value) {\n\t\tthis.#virtual.onmessage = value;\n\t}\n\n\tsend(data: string | ArrayBuffer | ArrayBufferView): void {\n\t\tthis.#virtual.send(data);\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tthis.#virtual.close(code, reason);\n\t}\n\n\taddEventListener(\n\t\ttype: string,\n\t\tlistener: (event: any) => void | Promise<void>,\n\t): void {\n\t\tthis.#virtual.addEventListener(type, listener);\n\t}\n\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: (event: any) => void | Promise<void>,\n\t): void {\n\t\tthis.#virtual.removeEventListener(type, listener);\n\t}\n\n\tdispatchEvent(event: {\n\t\ttype: string;\n\t\ttarget?: unknown;\n\t\tcurrentTarget?: unknown;\n\t}): boolean {\n\t\treturn this.#virtual.dispatchEvent(event);\n\t}\n}\n\ntype TrackedWebSocketListener = (event: any) => void | Promise<void>;\n\nclass TrackedWebSocketHandleAdapter implements UniversalWebSocket {\n\t#ctx: ActorContextHandleAdapter;\n\t#inner: UniversalWebSocket;\n\t#listeners = new Map<string, TrackedWebSocketListener[]>();\n\t#onopen: ((event: RivetEvent) => void | Promise<void>) | null = null;\n\t#onclose: ((event: RivetCloseEvent) => void | Promise<void>) | null = null;\n\t#onerror: ((event: RivetEvent) => void | Promise<void>) | null = null;\n\t#onmessage: ((event: RivetMessageEvent) => void | Promise<void>) | null =\n\t\tnull;\n\n\tconstructor(ctx: ActorContextHandleAdapter, inner: UniversalWebSocket) {\n\t\tthis.#ctx = ctx;\n\t\tthis.#inner = inner;\n\n\t\tinner.addEventListener(\"open\", (event) => {\n\t\t\tthis.#dispatch(\"open\", this.#createEvent(\"open\", event));\n\t\t});\n\t\tinner.addEventListener(\"message\", (event) => {\n\t\t\tthis.#dispatch(\"message\", this.#createEvent(\"message\", event));\n\t\t});\n\t\tinner.addEventListener(\"close\", (event) => {\n\t\t\tthis.#dispatch(\"close\", this.#createEvent(\"close\", event));\n\t\t});\n\t\tinner.addEventListener(\"error\", (event) => {\n\t\t\tthis.#dispatch(\"error\", this.#createEvent(\"error\", event));\n\t\t});\n\t}\n\n\tget CONNECTING(): 0 {\n\t\treturn this.#inner.CONNECTING;\n\t}\n\n\tget OPEN(): 1 {\n\t\treturn this.#inner.OPEN;\n\t}\n\n\tget CLOSING(): 2 {\n\t\treturn this.#inner.CLOSING;\n\t}\n\n\tget CLOSED(): 3 {\n\t\treturn this.#inner.CLOSED;\n\t}\n\n\tget readyState(): 0 | 1 | 2 | 3 {\n\t\treturn this.#inner.readyState;\n\t}\n\n\tget binaryType(): \"arraybuffer\" | \"blob\" {\n\t\treturn this.#inner.binaryType;\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\tthis.#inner.binaryType = value;\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn this.#inner.bufferedAmount;\n\t}\n\n\tget extensions(): string {\n\t\treturn this.#inner.extensions;\n\t}\n\n\tget protocol(): string {\n\t\treturn this.#inner.protocol;\n\t}\n\n\tget url(): string {\n\t\treturn this.#inner.url;\n\t}\n\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n\t\tthis.#inner.send(data);\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tthis.#inner.close(code, reason);\n\t}\n\n\taddEventListener(type: string, listener: TrackedWebSocketListener): void {\n\t\tlet listeners = this.#listeners.get(type);\n\t\tif (!listeners) {\n\t\t\tlisteners = [];\n\t\t\tthis.#listeners.set(type, listeners);\n\t\t}\n\t\tlisteners.push(listener);\n\t}\n\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: TrackedWebSocketListener,\n\t): void {\n\t\tconst listeners = this.#listeners.get(type);\n\t\tif (!listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\t}\n\n\tdispatchEvent(event: RivetEvent): boolean {\n\t\tthis.#dispatch(event.type, this.#createEvent(event.type, event));\n\t\treturn true;\n\t}\n\n\tget onopen(): ((event: RivetEvent) => void | Promise<void>) | null {\n\t\treturn this.#onopen;\n\t}\n\n\tset onopen(fn: ((event: RivetEvent) => void | Promise<void>) | null) {\n\t\tthis.#onopen = fn;\n\t}\n\n\tget onclose(): ((event: RivetCloseEvent) => void | Promise<void>) | null {\n\t\treturn this.#onclose;\n\t}\n\n\tset onclose(fn: ((event: RivetCloseEvent) => void | Promise<void>) | null) {\n\t\tthis.#onclose = fn;\n\t}\n\n\tget onerror(): ((event: RivetEvent) => void | Promise<void>) | null {\n\t\treturn this.#onerror;\n\t}\n\n\tset onerror(fn: ((event: RivetEvent) => void | Promise<void>) | null) {\n\t\tthis.#onerror = fn;\n\t}\n\n\tget onmessage():\n\t\t| ((event: RivetMessageEvent) => void | Promise<void>)\n\t\t| null {\n\t\treturn this.#onmessage;\n\t}\n\n\tset onmessage(fn:\n\t\t| ((event: RivetMessageEvent) => void | Promise<void>)\n\t\t| null,) {\n\t\tthis.#onmessage = fn;\n\t}\n\n\t#createEvent(type: string, event: any): any {\n\t\tswitch (type) {\n\t\t\tcase \"message\":\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\tdata: event.data,\n\t\t\t\t\trivetMessageIndex: event.rivetMessageIndex,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t} satisfies RivetMessageEvent;\n\t\t\tcase \"close\":\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t} satisfies RivetCloseEvent;\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tcurrentTarget: this,\n\t\t\t\t\t...(event.message !== undefined\n\t\t\t\t\t\t? { message: event.message }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(event.error !== undefined\n\t\t\t\t\t\t? { error: event.error }\n\t\t\t\t\t\t: {}),\n\t\t\t\t} satisfies RivetEvent;\n\t\t}\n\t}\n\n\t#dispatch(type: string, event: any): void {\n\t\tconst listeners = this.#listeners.get(type);\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of [...listeners]) {\n\t\t\t\tthis.#callHandler(type, listener, event);\n\t\t\t}\n\t\t}\n\n\t\tswitch (type) {\n\t\t\tcase \"open\":\n\t\t\t\tif (this.#onopen) this.#callHandler(type, this.#onopen, event);\n\t\t\t\tbreak;\n\t\t\tcase \"close\":\n\t\t\t\tif (this.#onclose)\n\t\t\t\t\tthis.#callHandler(type, this.#onclose, event);\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tif (this.#onerror)\n\t\t\t\t\tthis.#callHandler(type, this.#onerror, event);\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (this.#onmessage)\n\t\t\t\t\tthis.#callHandler(type, this.#onmessage, event);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#callHandler(\n\t\ttype: string,\n\t\thandler: TrackedWebSocketListener,\n\t\tevent: any,\n\t): void {\n\t\ttry {\n\t\t\tconst result = handler(event);\n\t\t\tif (!this.#isPromiseLike(result)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst callbackRegionId = this.#ctx.beginWebSocketCallback();\n\t\t\tthis.#ctx.waitUntil(\n\t\t\t\tPromise.resolve(result)\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"async websocket handler failed\",\n\t\t\t\t\t\t\teventType: type,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.#ctx.endWebSocketCallback(callbackRegionId);\n\t\t\t\t\t})\n\t\t\t\t\t.then(() => null),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"websocket handler failed\",\n\t\t\t\teventType: type,\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\t}\n\n\t#isPromiseLike(value: unknown): value is PromiseLike<void> {\n\t\treturn (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t\"then\" in value &&\n\t\t\ttypeof value.then === \"function\"\n\t\t);\n\t}\n}\n\nclass NativeConnectionMap implements ReadonlyMap<string, NativeConnAdapter> {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tschemas: NativeValidationConfig,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#schemas = schemas;\n\t}\n\n\t#connToAdapter(conn: ConnHandle): NativeConnAdapter {\n\t\treturn new NativeConnAdapter(\n\t\t\tthis.#runtime,\n\t\t\tconn,\n\t\t\tthis.#schemas,\n\t\t\tthis.#ctx,\n\t\t\t(connId) =>\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.actorQueueHibernationRemoval(\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t);\n\t}\n\n\tget size(): number {\n\t\treturn callNativeSync(() => this.#runtime.actorConns(this.#ctx)).length;\n\t}\n\n\tget(key: string): NativeConnAdapter | undefined {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\tconst conn = conns.find((c) => this.#runtime.connId(c) === key);\n\t\tif (!conn) return undefined;\n\t\treturn this.#connToAdapter(conn);\n\t}\n\n\thas(key: string): boolean {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns.some((c) => this.#runtime.connId(c) === key);\n\t}\n\n\tkeys(): MapIterator<string> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map((c) => this.#runtime.connId(c))\n\t\t\t[Symbol.iterator]() satisfies MapIterator<string>;\n\t}\n\n\tvalues(): MapIterator<NativeConnAdapter> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map((c) => this.#connToAdapter(c))\n\t\t\t[Symbol.iterator]() satisfies MapIterator<NativeConnAdapter>;\n\t}\n\n\tentries(): MapIterator<[string, NativeConnAdapter]> {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\treturn conns\n\t\t\t.map(\n\t\t\t\t(c) =>\n\t\t\t\t\t[this.#runtime.connId(c), this.#connToAdapter(c)] as [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tNativeConnAdapter,\n\t\t\t\t\t],\n\t\t\t)\n\t\t\t[Symbol.iterator]() satisfies MapIterator<\n\t\t\t[string, NativeConnAdapter]\n\t\t>;\n\t}\n\n\tforEach(\n\t\tcallback: (\n\t\t\tvalue: NativeConnAdapter,\n\t\t\tkey: string,\n\t\t\tmap: ReadonlyMap<string, NativeConnAdapter>,\n\t\t) => void,\n\t\tthisArg?: unknown,\n\t): void {\n\t\tconst conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));\n\t\tfor (const conn of conns) {\n\t\t\tconst id = this.#runtime.connId(conn);\n\t\t\tcallback.call(thisArg, this.#connToAdapter(conn), id, this);\n\t\t}\n\t}\n\n\t[Symbol.iterator](): MapIterator<[string, NativeConnAdapter]> {\n\t\treturn this.entries();\n\t}\n\n\treadonly [Symbol.toStringTag] = \"NativeConnectionMap\";\n}\n\nexport class ActorContextHandleAdapter {\n\t#runtime: CoreRuntime;\n\t#ctx: ActorContextHandle;\n\t#schemas: NativeValidationConfig;\n\t#abortSignal?: AbortSignal;\n\t#abortSignalCleanup?: () => void;\n\t#client?: AnyClient;\n\t#clientFactory?: () => AnyClient;\n\t#connMap?: NativeConnectionMap;\n\t#databaseProvider?: Exclude<AnyDatabaseProvider, undefined>;\n\t#db?: unknown;\n\t#dispatchCancelToken?: CancellationTokenHandle;\n\t#kv?: NativeKvAdapter;\n\t#queue?: NativeQueueAdapter;\n\t#request?: Request;\n\t#schedule?: NativeScheduleAdapter;\n\t#sql?: ReturnType<typeof wrapJsNativeDatabase>;\n\t#runHandlerActiveProvider?: () => boolean;\n\t#onStateChange?: NativeOnStateChangeHandler;\n\t#stateEnabled: boolean;\n\n\tconstructor(\n\t\truntime: CoreRuntime,\n\t\tctx: ActorContextHandle,\n\t\tclientFactory?: () => AnyClient,\n\t\tschemas: NativeValidationConfig = {},\n\t\tdatabaseProvider?: AnyDatabaseProvider,\n\t\trequest?: Request,\n\t\tstateEnabled = true,\n\t\trunHandlerActiveProvider?: () => boolean,\n\t\tonStateChange?: NativeOnStateChangeHandler,\n\t\tdispatchCancelToken?: CancellationTokenHandle,\n\t) {\n\t\tthis.#runtime = runtime;\n\t\tthis.#ctx = ctx;\n\t\tthis.#clientFactory = clientFactory;\n\t\tthis.#schemas = schemas;\n\t\tthis.#dispatchCancelToken = dispatchCancelToken;\n\t\tthis.#runHandlerActiveProvider = runHandlerActiveProvider;\n\t\tthis.#onStateChange = onStateChange;\n\t\tthis.#stateEnabled = stateEnabled;\n\t\tif (databaseProvider) {\n\t\t\tthis.#databaseProvider = databaseProvider;\n\t\t}\n\t\tthis.#request = request;\n\t\t(\n\t\t\tthis as ActorContextHandleAdapter & {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: unknown;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL] = new NativeWorkflowRuntimeAdapter(\n\t\t\tthis,\n\t\t);\n\t}\n\n\tget kv() {\n\t\tif (!this.#kv) {\n\t\t\tthis.#kv = new NativeKvAdapter(this.#runtime, this.#ctx);\n\t\t}\n\t\treturn this.#kv;\n\t}\n\n\tget sql() {\n\t\tif (!this.#sql) {\n\t\t\tthis.#sql = getOrCreateNativeSqlDatabase(this.#runtime, this.#ctx);\n\t\t}\n\t\treturn this.#sql;\n\t}\n\n\tget db() {\n\t\tif (!this.#databaseProvider) {\n\t\t\tthrow databaseNotConfiguredError();\n\t\t}\n\n\t\tif (this.#db) {\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tconst cachedClient = runtimeState.databaseClient;\n\t\tif (cachedClient) {\n\t\t\tthis.#db = cachedClient.client;\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tthrow databaseClientNotReadyError();\n\t}\n\n\t[RAW_STATE_SYMBOL](): unknown {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\treturn this.#readState();\n\t}\n\n\tget state(): unknown {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tconst nextState = this.#readState();\n\t\t// Reading `c.state` rebuilds the deep write-through proxy, which\n\t\t// allocates fresh on-change caches and rewraps the whole tree. Memoize\n\t\t// the proxy keyed on the underlying state object so repeated reads and\n\t\t// deep read cascades reuse a single proxy.\n\t\tif (\n\t\t\tactorState.stateProxy === undefined ||\n\t\t\tactorState.stateProxyTarget !== nextState\n\t\t) {\n\t\t\tactorState.stateProxyTarget = nextState;\n\t\t\tactorState.stateProxy = createWriteThroughProxy(\n\t\t\t\tnextState,\n\t\t\t\t(nextValue) => {\n\t\t\t\t\tthis.#writeState(nextValue, { scheduleSave: true });\n\t\t\t\t},\n\t\t\t\t(newValue) => {\n\t\t\t\t\tthis.#assertCanMutateState();\n\t\t\t\t\tassertJsonCompatValue(newValue);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn actorState.stateProxy;\n\t}\n\n\tset state(value: unknown) {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow stateNotEnabledError();\n\t\t}\n\t\tthis.#assertCanMutateState();\n\t\tassertJsonCompatValue(value);\n\t\tthis.#writeState(value, { scheduleSave: true });\n\t}\n\n\tinitializeState(value: unknown): void {\n\t\tif (!this.#stateEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#writeState(value, { scheduleSave: false });\n\t}\n\n\tget vars(): unknown {\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tif (runtimeState.varsInitialized) {\n\t\t\treturn runtimeState.vars;\n\t\t}\n\n\t\truntimeState.varsInitialized = true;\n\t\truntimeState.vars = undefined;\n\t\treturn undefined;\n\t}\n\n\tset vars(value: unknown) {\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\truntimeState.varsInitialized = true;\n\t\truntimeState.vars = value;\n\t}\n\n\tget queue(): NativeQueueAdapter {\n\t\tif (!this.#queue) {\n\t\t\tthis.#queue = new NativeQueueAdapter(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t\tthis.#schemas.queues,\n\t\t\t);\n\t\t}\n\t\treturn this.#queue;\n\t}\n\n\tget schedule(): NativeScheduleAdapter {\n\t\tif (!this.#schedule) {\n\t\t\tthis.#schedule = new NativeScheduleAdapter(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t);\n\t\t}\n\t\treturn this.#schedule;\n\t}\n\n\tget actorId(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorId(this.#ctx));\n\t}\n\n\tget name(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorName(this.#ctx));\n\t}\n\n\tget key(): string[] {\n\t\treturn toActorKey(\n\t\t\tcallNativeSync(() => this.#runtime.actorKey(this.#ctx)),\n\t\t);\n\t}\n\n\tget region(): string {\n\t\treturn callNativeSync(() => this.#runtime.actorRegion(this.#ctx));\n\t}\n\n\tget conns(): ReadonlyMap<string, NativeConnAdapter> {\n\t\tif (!this.#connMap) {\n\t\t\tthis.#connMap = new NativeConnectionMap(\n\t\t\t\tthis.#runtime,\n\t\t\t\tthis.#ctx,\n\t\t\t\tthis.#schemas,\n\t\t\t);\n\t\t}\n\t\treturn this.#connMap;\n\t}\n\n\tget log() {\n\t\treturn logger();\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\tif (!this.#abortSignal) {\n\t\t\tconst actorSignal = this.#createActorAbortSignal();\n\t\t\tif (this.#dispatchCancelToken === undefined) {\n\t\t\t\tthis.#abortSignal = actorSignal;\n\t\t\t} else {\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tlet cleanedUp = false;\n\t\t\t\tconst onActorAbort = () => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t};\n\t\t\t\tconst cleanup = () => {\n\t\t\t\t\tif (cleanedUp) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcleanedUp = true;\n\t\t\t\t\tactorSignal.removeEventListener(\"abort\", onActorAbort);\n\t\t\t\t\tthis.#abortSignalCleanup = undefined;\n\t\t\t\t};\n\n\t\t\t\tif (\n\t\t\t\t\tactorSignal.aborted ||\n\t\t\t\t\tthis.#runtime.cancellationTokenAborted(\n\t\t\t\t\t\tthis.#dispatchCancelToken,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t} else {\n\t\t\t\t\tconst dispatchCancelToken = this.#dispatchCancelToken;\n\t\t\t\t\tthis.#abortSignalCleanup = cleanup;\n\t\t\t\t\tactorSignal.addEventListener(\"abort\", onActorAbort, {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\tthis.#runtime.onCancellationTokenCancelled(\n\t\t\t\t\t\t\tdispatchCancelToken,\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.#abortSignal = controller.signal;\n\t\t\t}\n\t\t}\n\t\treturn this.#abortSignal;\n\t}\n\n\tget aborted(): boolean {\n\t\treturn this.abortSignal.aborted;\n\t}\n\n\tget request(): Request | undefined {\n\t\treturn this.#request;\n\t}\n\n\tprivate async ensureDatabaseClient(): Promise<unknown> {\n\t\tif (!this.#databaseProvider) {\n\t\t\tthrow databaseNotConfiguredError();\n\t\t}\n\n\t\tif (this.#db) {\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);\n\t\tconst cachedClient = runtimeState.databaseClient;\n\t\tif (cachedClient) {\n\t\t\tthis.#db = cachedClient.client;\n\t\t\treturn this.#db;\n\t\t}\n\n\t\tconst actorId = this.actorId;\n\t\tconst client = await this.#databaseProvider.createClient({\n\t\t\tactorId,\n\t\t\tkv: {\n\t\t\t\tbatchPut: async (entries) => {\n\t\t\t\t\tawait this.kv.batchPut(\n\t\t\t\t\t\tentries.map(([key, value]) => [key, value]),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tbatchGet: async (keys) => {\n\t\t\t\t\treturn await this.kv.batchGet([...keys]);\n\t\t\t\t},\n\t\t\t\tbatchDelete: async (keys) => {\n\t\t\t\t\tawait this.kv.batchDelete([...keys]);\n\t\t\t\t},\n\t\t\t\tdeleteRange: async (start, end) => {\n\t\t\t\t\tawait this.kv.deleteRange(start, end);\n\t\t\t\t},\n\t\t\t},\n\t\t\tlog: {\n\t\t\t\tdebug: (obj) => logger().debug(obj),\n\t\t\t},\n\t\t\tnativeDatabaseProvider: {\n\t\t\t\topen: async (requestedActorId) => {\n\t\t\t\t\tvoid requestedActorId;\n\t\t\t\t\treturn getOrCreateNativeSqlDatabase(\n\t\t\t\t\t\tthis.#runtime,\n\t\t\t\t\t\tthis.#ctx,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\truntimeState.databaseClient = {\n\t\t\tclient,\n\t\t};\n\t\tthis.#db = client;\n\t\treturn client;\n\t}\n\n\tasync prepare(): Promise<void> {\n\t\tif (!this.#databaseProvider) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.ensureDatabaseClient();\n\t}\n\n\tasync runDatabaseMigrations(): Promise<void> {\n\t\tif (!this.#databaseProvider) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#databaseProvider.onMigrate(\n\t\t\t(await this.ensureDatabaseClient()) as never,\n\t\t);\n\t}\n\n\tasync closeDatabase(): Promise<void> {\n\t\tthis.#db = undefined;\n\t\tthis.#sql = undefined;\n\t\tawait closeNativeDatabaseClient(this.#runtime, this.#ctx);\n\t\tawait closeNativeSqlDatabase(this.#runtime, this.#ctx);\n\t}\n\n\tbroadcast(name: string, ...args: unknown[]): void {\n\t\tconst validatedArgs = validateEventArgs(\n\t\t\tthis.#schemas.events,\n\t\t\tname,\n\t\t\targs,\n\t\t);\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorBroadcast(\n\t\t\t\tthis.#ctx,\n\t\t\t\tname,\n\t\t\t\tencodeValue(validatedArgs),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync saveState(opts?: {\n\t\timmediate?: boolean;\n\t\tmaxWait?: number;\n\t}): Promise<void> {\n\t\tif (opts?.immediate) {\n\t\t\tawait callNative(() =>\n\t\t\t\tthis.#runtime.actorRequestSaveAndWait(this.#ctx, {\n\t\t\t\t\timmediate: true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (opts?.maxWait != null) {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorRequestSave(this.#ctx, {\n\t\t\t\t\tmaxWaitMs: opts.maxWait,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorRequestSave(this.#ctx, { immediate: false }),\n\t\t);\n\t}\n\n\tserializeForTick(reason: SerializeStateReason): RuntimeStateDeltaPayload {\n\t\tvoid reason;\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tconst connHibernationRemoved = callNativeSync(() =>\n\t\t\tthis.#runtime.actorTakePendingHibernationChanges(this.#ctx),\n\t\t);\n\t\tfor (const connId of connHibernationRemoved) {\n\t\t\tactorState.connStates.delete(connId);\n\t\t}\n\t\tconst state =\n\t\t\tthis.#stateEnabled && this.#readState() !== undefined\n\t\t\t\t? encodeValue(this.#readState())\n\t\t\t\t: undefined;\n\t\tconst connHibernation = callNativeSync(() =>\n\t\t\tthis.#runtime.actorDirtyHibernatableConns(this.#ctx),\n\t\t).map((conn) => {\n\t\t\tconst connId = callNativeSync(() => this.#runtime.connId(conn));\n\t\t\treturn {\n\t\t\t\tconnId,\n\t\t\t\tbytes: callNativeSync(() => this.#runtime.connState(conn)),\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tconnHibernation,\n\t\t\tconnHibernationRemoved,\n\t\t};\n\t}\n\n\tasync restartRunHandler(): Promise<void> {\n\t\tawait callNative(async () => {\n\t\t\tthis.#runtime.actorRestartRunHandler(this.#ctx);\n\t\t});\n\t}\n\n\tasync setAlarm(timestampMs?: number): Promise<void> {\n\t\tawait callNative(async () => {\n\t\t\tthis.#runtime.actorSetAlarm(this.#ctx, timestampMs);\n\t\t});\n\t}\n\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tconst trackedPromise = Promise.resolve(promise)\n\t\t\t.catch((error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"keepAwake promise rejected\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorKeepAwake(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t}\n\n\trunHandlerActive(): boolean {\n\t\treturn this.#runHandlerActiveProvider?.() ?? false;\n\t}\n\n\tinternalKeepAwake<T>(run: Promise<T> | (() => Promise<T>)): Promise<T> {\n\t\tconst promise = typeof run === \"function\" ? run() : run;\n\t\tconst trackedPromise = promise.then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorRegisterTask(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t}\n\n\twaitUntil(promise: Promise<unknown>): void {\n\t\tconst trackedPromise = Promise.resolve(promise).then(() => null);\n\t\ttry {\n\t\t\tcallNativeSync(() =>\n\t\t\t\tthis.#runtime.actorWaitUntil(this.#ctx, trackedPromise),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!isClosedTaskRegistrationError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\tbeginWebSocketCallback(): number {\n\t\treturn callNativeSync(() =>\n\t\t\tthis.#runtime.actorBeginWebsocketCallback(this.#ctx),\n\t\t);\n\t}\n\n\tendWebSocketCallback(callbackRegionId: number): void {\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorEndWebsocketCallback(\n\t\t\t\tthis.#ctx,\n\t\t\t\tcallbackRegionId,\n\t\t\t),\n\t\t);\n\t}\n\n\t// Intentionally a no-op. `setPreventSleep` / `preventSleep` are kept on the\n\t// surface for legacy callers but must not gate sleep here. Callers that\n\t// need to keep an actor awake should use `keepAwake(promise)` or\n\t// `waitUntil(promise)` so the native counter machinery in rivetkit-core\n\t// owns the lifecycle.\n\t/** @deprecated Use `keepAwake(promise)` or `waitUntil(promise)` instead. */\n\tsetPreventSleep(_preventSleep: boolean): void {\n\t\tlogger().warn({\n\t\t\tmsg: \"setPreventSleep is deprecated and is a no-op; use keepAwake(promise) or waitUntil(promise) instead\",\n\t\t});\n\t}\n\n\t/** @deprecated Use `keepAwake(promise)` or `waitUntil(promise)` instead. */\n\tget preventSleep(): boolean {\n\t\tlogger().warn({\n\t\t\tmsg: \"preventSleep is deprecated and always returns false; use keepAwake(promise) or waitUntil(promise) instead\",\n\t\t});\n\t\treturn false;\n\t}\n\n\tsleep(): void {\n\t\tthis.#flushStateChange();\n\t\tcallNativeSync(() => this.#runtime.actorSleep(this.#ctx));\n\t}\n\n\tdestroy(): void {\n\t\t// Call the native destroy first so it can throw `actor/starting` or\n\t\t// `actor/stopping` without leaving an unresolved destroyCompletion\n\t\t// promise behind in the native runtime state.\n\t\tcallNativeSync(() => this.#runtime.actorDestroy(this.#ctx));\n\t\tmarkNativeDestroyRequested(this.#runtime, this.#ctx);\n\t}\n\n\tclient<T = AnyClient>(): T extends Registry<any> ? Client<T> : T {\n\t\tif (!this.#client) {\n\t\t\tif (!this.#clientFactory) {\n\t\t\t\tthrow nativeClientNotConfiguredError();\n\t\t\t}\n\t\t\tthis.#client = this.#clientFactory();\n\t\t}\n\n\t\treturn this.#client as T extends Registry<any> ? Client<T> : T;\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\t// Flush any save coalesced for this tick before the context is torn\n\t\t// down so the request-save and onStateChange always run.\n\t\tthis.#flushStateChange();\n\t\tthis.#abortSignalCleanup?.();\n\t\tthis.#sql = undefined;\n\t}\n\n\t#createActorAbortSignal(): AbortSignal {\n\t\tconst nativeSignal = callNativeSync(() =>\n\t\t\tthis.#runtime.actorAbortSignal(this.#ctx),\n\t\t);\n\t\tconst controller = new AbortController();\n\t\tif (nativeSignal.aborted) {\n\t\t\tcontroller.abort();\n\t\t} else {\n\t\t\tnativeSignal.addEventListener(\"abort\", () => controller.abort(), {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\t\treturn controller.signal;\n\t}\n\n\t#readState(): unknown {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.state === undefined) {\n\t\t\tactorState.state = decodeValue(\n\t\t\t\tcallNativeSync(() => this.#runtime.actorState(this.#ctx)),\n\t\t\t);\n\t\t}\n\t\treturn actorState.state;\n\t}\n\n\t#writeState(\n\t\tvalue: unknown,\n\t\toptions: {\n\t\t\tscheduleSave: boolean;\n\t\t},\n\t): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tactorState.state = value;\n\t\tif (!options.scheduleSave) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#scheduleSave();\n\t}\n\n\t#assertCanMutateState(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.isInOnStateChange) {\n\t\t\tthrow stateMutationReentrantError();\n\t\t}\n\t}\n\n\t// Coalesce the request-save and onStateChange work to once per event loop\n\t// tick. A synchronous burst of mutations (for example\n\t// `Object.assign(c.state, ...)`) would otherwise cross the NAPI boundary and\n\t// run onStateChange once per field, re-serializing the whole state each time\n\t// and pinning the event loop on large state.\n\t#scheduleSave(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (actorState.saveScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tactorState.saveScheduled = true;\n\t\tactorState.pendingSaveHandle = setImmediate(() => {\n\t\t\tthis.#flushStateChange();\n\t\t});\n\t}\n\n\t#flushStateChange(): void {\n\t\tconst actorState = getNativePersistState(this.#runtime, this.#ctx);\n\t\tif (!actorState.saveScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tactorState.saveScheduled = false;\n\t\tif (actorState.pendingSaveHandle !== undefined) {\n\t\t\tclearImmediate(actorState.pendingSaveHandle);\n\t\t\tactorState.pendingSaveHandle = undefined;\n\t\t}\n\n\t\tcallNativeSync(() =>\n\t\t\tthis.#runtime.actorRequestSave(this.#ctx, { immediate: false }),\n\t\t);\n\n\t\tif (!this.#onStateChange) {\n\t\t\treturn;\n\t\t}\n\n\t\tactorState.isInOnStateChange = true;\n\t\tcallNativeSync(() => this.#runtime.actorBeginOnStateChange(this.#ctx));\n\t\tlet shouldFinish = true;\n\t\ttry {\n\t\t\tconst result = this.#onStateChange(\n\t\t\t\tthis,\n\t\t\t\tactorState.state,\n\t\t\t) as unknown;\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\tshouldFinish = false;\n\t\t\t\tvoid Promise.resolve(result)\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"error in `onStateChange`\",\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tactorState.isInOnStateChange = false;\n\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\tthis.#runtime.actorEndOnStateChange(this.#ctx),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t}\n\t\t} finally {\n\t\t\tif (shouldFinish) {\n\t\t\t\tactorState.isInOnStateChange = false;\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\tthis.#runtime.actorEndOnStateChange(this.#ctx),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype NativeWorkflowQueueMessage = Awaited<\n\tReturnType<NativeQueueAdapter[\"next\"]>\n>;\n\nclass NativeWorkflowRuntimeAdapter {\n\t#ctx: ActorContextHandleAdapter;\n\t#completions = new Map<string, (response?: unknown) => Promise<void>>();\n\n\treadonly id: string;\n\treadonly driver: {\n\t\tkvBatchGet: (\n\t\t\tactorId: string,\n\t\t\tkeys: Uint8Array[],\n\t\t) => Promise<Array<Uint8Array | null>>;\n\t\tkvBatchPut: (\n\t\t\tactorId: string,\n\t\t\tentries: Array<[Uint8Array, Uint8Array]>,\n\t\t) => Promise<void>;\n\t\tkvBatchDelete: (actorId: string, keys: Uint8Array[]) => Promise<void>;\n\t\tkvDeleteRange: (\n\t\t\tactorId: string,\n\t\t\tstart: Uint8Array,\n\t\t\tend: Uint8Array,\n\t\t) => Promise<void>;\n\t\tkvListPrefix: (\n\t\t\tactorId: string,\n\t\t\tprefix: Uint8Array,\n\t\t) => Promise<Array<[Uint8Array, Uint8Array]>>;\n\t\tsetAlarm: (_actor: unknown, wakeAt: number) => Promise<void>;\n\t};\n\treadonly queueManager: {\n\t\tenqueue: (name: string, body: unknown) => Promise<unknown>;\n\t\treceive: (\n\t\t\tnames: string[] | undefined,\n\t\t\tcount: number,\n\t\t\ttimeout?: number,\n\t\t\t_abortSignal?: AbortSignal,\n\t\t\tcompletable?: boolean,\n\t\t) => Promise<\n\t\t\tArray<{\n\t\t\t\tid: bigint;\n\t\t\t\tname: string;\n\t\t\t\tbody: unknown;\n\t\t\t\tcreatedAt: number;\n\t\t\t\tcomplete?: (response?: unknown) => Promise<void>;\n\t\t\t}>\n\t\t>;\n\t\tcompleteMessage: (\n\t\t\tmessage: {\n\t\t\t\tid: bigint;\n\t\t\t\tcomplete?: (response?: unknown) => Promise<void>;\n\t\t\t},\n\t\t\tresponse?: unknown,\n\t\t) => Promise<void>;\n\t\tcompleteMessageById: (\n\t\t\tmessageId: bigint,\n\t\t\tresponse?: unknown,\n\t\t) => Promise<void>;\n\t\twaitForNames: (\n\t\t\tnames: readonly string[] | undefined,\n\t\t\tabortSignal?: AbortSignal,\n\t\t) => Promise<void>;\n\t};\n\treadonly stateManager: {\n\t\tsaveState: (opts?: {\n\t\t\timmediate?: boolean;\n\t\t\tmaxWait?: number;\n\t\t}) => Promise<void>;\n\t};\n\n\tconstructor(ctx: ActorContextHandleAdapter) {\n\t\tthis.#ctx = ctx;\n\t\tthis.id = ctx.actorId;\n\t\tthis.driver = {\n\t\t\tkvBatchGet: async (actorId, keys) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\treturn await this.#ctx.kv.batchGet(keys);\n\t\t\t},\n\t\t\tkvBatchPut: async (actorId, entries) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.batchPut(entries);\n\t\t\t},\n\t\t\tkvBatchDelete: async (actorId, keys) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.batchDelete(keys);\n\t\t\t},\n\t\t\tkvDeleteRange: async (actorId, start, end) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\tawait this.#ctx.kv.rawDeleteRange(start, end);\n\t\t\t},\n\t\t\tkvListPrefix: async (actorId, prefix) => {\n\t\t\t\tthis.#assertActorId(actorId);\n\t\t\t\treturn await this.#ctx.kv.rawListPrefix(prefix);\n\t\t\t},\n\t\t\tsetAlarm: async (_actor, wakeAt) => {\n\t\t\t\tawait this.#ctx.setAlarm(wakeAt);\n\t\t\t},\n\t\t};\n\t\tthis.queueManager = {\n\t\t\tenqueue: async (name, body) => {\n\t\t\t\treturn this.#wrapQueueMessage(\n\t\t\t\t\tawait this.#ctx.queue.send(name, body),\n\t\t\t\t);\n\t\t\t},\n\t\t\treceive: async (\n\t\t\t\tnames,\n\t\t\t\tcount,\n\t\t\t\ttimeout,\n\t\t\t\t_abortSignal,\n\t\t\t\tcompletable,\n\t\t\t) => {\n\t\t\t\tconst messages = await this.#ctx.queue.nextBatch({\n\t\t\t\t\tnames,\n\t\t\t\t\tcount,\n\t\t\t\t\ttimeout: timeout ?? 0,\n\t\t\t\t\tcompletable,\n\t\t\t\t});\n\t\t\t\treturn messages.map((message) =>\n\t\t\t\t\tthis.#wrapQueueMessage(message),\n\t\t\t\t);\n\t\t\t},\n\t\t\tcompleteMessage: async (message, response) => {\n\t\t\t\tawait message.complete?.(response);\n\t\t\t\tthis.#completions.delete(message.id.toString());\n\t\t\t},\n\t\t\tcompleteMessageById: async (messageId, response) => {\n\t\t\t\tconst complete = this.#completions.get(messageId.toString());\n\t\t\t\tif (!complete) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait complete(response);\n\t\t\t\tthis.#completions.delete(messageId.toString());\n\t\t\t},\n\t\t\twaitForNames: async (names, abortSignal) => {\n\t\t\t\tawait this.#ctx.queue.waitForNamesAvailable(names ?? [], {\n\t\t\t\t\tsignal: abortSignal,\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t\tthis.stateManager = {\n\t\t\tsaveState: async (opts) => {\n\t\t\t\tawait this.#ctx.saveState(opts);\n\t\t\t},\n\t\t};\n\t}\n\n\tisRunHandlerActive(): boolean {\n\t\treturn this.#ctx.runHandlerActive();\n\t}\n\n\tasync restartRunHandler(): Promise<void> {\n\t\tawait this.#ctx.restartRunHandler();\n\t}\n\n\t#assertActorId(actorId: string): void {\n\t\tif (actorId !== this.id) {\n\t\t\tthrow new Error(\n\t\t\t\t`workflow runtime actor id mismatch: expected ${this.id}, got ${actorId}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t#wrapQueueMessage(message: NativeWorkflowQueueMessage) {\n\t\tif (!message) {\n\t\t\tthrow new Error(\"native workflow queue message missing\");\n\t\t}\n\n\t\tconst id = BigInt(message.id);\n\t\tlet complete: ((response?: unknown) => Promise<void>) | undefined;\n\t\tif (message.complete) {\n\t\t\tcomplete = async (response?: unknown) => {\n\t\t\t\tawait message.complete?.(response);\n\t\t\t};\n\t\t\tthis.#completions.set(id.toString(), complete);\n\t\t}\n\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\tcomplete,\n\t\t};\n\t}\n}\n\nfunction withConnContext(\n\truntime: CoreRuntime,\n\tctx: ActorContextHandle,\n\tconn: ConnHandle,\n\tclientFactory?: () => AnyClient,\n\tschemas: NativeValidationConfig = {},\n\tdatabaseProvider?: AnyDatabaseProvider,\n\trequest?: Request,\n\tstateEnabled = true,\n\tonStateChange?: NativeOnStateChangeHandler,\n\tdispatchCancelToken?: CancellationTokenHandle,\n) {\n\treturn Object.assign(\n\t\tnew ActorContextHandleAdapter(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tclientFactory,\n\t\t\tschemas,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\tundefined,\n\t\t\tonStateChange,\n\t\t\tdispatchCancelToken,\n\t\t),\n\t\t{\n\t\t\tconn: new NativeConnAdapter(runtime, conn, schemas, ctx, (connId) =>\n\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\truntime.actorQueueHibernationRemoval(ctx, connId),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t);\n}\n\nfunction buildActorConfig(\n\tdefinition: AnyActorDefinition,\n\tregistryConfig: RegistryConfig,\n): RuntimeActorConfig {\n\tconst config = definition.config as unknown as Record<string, unknown>;\n\tconst options = (config.options ?? {}) as Record<string, unknown>;\n\tconst canHibernate = options.canHibernateWebSocket;\n\n\treturn {\n\t\tname: options.name as string | undefined,\n\t\ticon: options.icon as string | undefined,\n\t\thasDatabase: config.db !== undefined,\n\t\tremoteSqlite:\n\t\t\tconfig.db !== undefined &&\n\t\t\tsqliteBackendForConfig(registryConfig) === \"remote\",\n\t\thasState:\n\t\t\tconfig.state !== undefined ||\n\t\t\ttypeof config.createState === \"function\",\n\t\tcanHibernateWebsocket:\n\t\t\ttypeof canHibernate === \"boolean\" ? canHibernate : undefined,\n\t\tstateSaveIntervalMs: options.stateSaveInterval as number | undefined,\n\t\tcreateVarsTimeoutMs: options.createVarsTimeout as number | undefined,\n\t\tcreateConnStateTimeoutMs: options.createConnStateTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tonBeforeConnectTimeoutMs: options.onBeforeConnectTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tonConnectTimeoutMs: options.onConnectTimeout as number | undefined,\n\t\tonMigrateTimeoutMs: options.onMigrateTimeout as number | undefined,\n\t\tactionTimeoutMs: options.actionTimeout as number | undefined,\n\t\tsleepTimeoutMs: options.sleepTimeout as number | undefined,\n\t\tnoSleep: options.noSleep as boolean | undefined,\n\t\tsleepGracePeriodMs: options.sleepGracePeriod as number | undefined,\n\t\tconnectionLivenessTimeoutMs: options.connectionLivenessTimeout as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tconnectionLivenessIntervalMs: options.connectionLivenessInterval as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tmaxQueueSize: options.maxQueueSize as number | undefined,\n\t\tmaxQueueMessageSize: options.maxQueueMessageSize as number | undefined,\n\t\tmaxIncomingMessageSize: registryConfig.maxIncomingMessageSize as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tmaxOutgoingMessageSize: registryConfig.maxOutgoingMessageSize as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tpreloadMaxWorkflowBytes: options.preloadMaxWorkflowBytes as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tpreloadMaxConnectionsBytes: options.preloadMaxConnectionsBytes as\n\t\t\t| number\n\t\t\t| undefined,\n\t\tactions: Object.keys((config.actions ?? {}) as Record<string, unknown>)\n\t\t\t.sort()\n\t\t\t.map((name) => ({ name })),\n\t\tinspectorTabs: buildInspectorTabs(config.inspector),\n\t};\n}\n\nfunction buildInspectorTabs(\n\tinspector: unknown,\n): Array<RuntimeInspectorTabEntry> | undefined {\n\tif (!inspector || typeof inspector !== \"object\") return undefined;\n\tconst tabs = (inspector as { tabs?: unknown }).tabs;\n\tif (!Array.isArray(tabs) || tabs.length === 0) return undefined;\n\treturn tabs.map((raw) => {\n\t\tconst entry = raw as {\n\t\t\tid: string;\n\t\t\tlabel?: string;\n\t\t\tsource?: string;\n\t\t\ticon?: string;\n\t\t\thidden?: boolean;\n\t\t};\n\t\tif (entry.hidden === true) {\n\t\t\treturn { id: entry.id, hidden: true };\n\t\t}\n\t\t// Resolve the author's source path against the current working\n\t\t// directory so the Rust runtime gets an absolute path. The author\n\t\t// runs the actor process from their project root by convention.\n\t\tconst resolved =\n\t\t\tentry.source !== undefined\n\t\t\t\t? nodePath.resolve(entry.source)\n\t\t\t\t: undefined;\n\t\tif (resolved !== undefined) {\n\t\t\tvalidateInspectorTabSource(entry.id, resolved);\n\t\t}\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\tlabel: entry.label,\n\t\t\ticon: entry.icon,\n\t\t\tsource: resolved,\n\t\t};\n\t});\n}\n\nfunction validateInspectorTabSource(tabId: string, resolved: string): void {\n\t// Catch obviously dangerous misconfigurations at registry construction\n\t// rather than silently exposing the wrong subtree over the unauthenticated\n\t// `/inspector/custom-tabs/<id>/*` route. Fail loudly so misconfigured\n\t// actors never start.\n\tif (resolved === nodePath.parse(resolved).root) {\n\t\tthrow new Error(\n\t\t\t`inspector.tabs[id=\"${tabId}\"].source resolves to the filesystem root (${resolved}). ` +\n\t\t\t\t\"Point it at the tab's own static-asset directory instead.\",\n\t\t);\n\t}\n\tlet stat: import(\"node:fs\").Stats;\n\ttry {\n\t\tstat = nodeFs.statSync(resolved);\n\t} catch (err) {\n\t\tconst code = (err as NodeJS.ErrnoException)?.code;\n\t\tif (code === \"ENOENT\") {\n\t\t\tthrow new Error(\n\t\t\t\t`inspector.tabs[id=\"${tabId}\"].source (${resolved}) does not exist.`,\n\t\t\t);\n\t\t}\n\t\tif (code === \"EACCES\") {\n\t\t\tthrow new Error(\n\t\t\t\t`inspector.tabs[id=\"${tabId}\"].source (${resolved}) is not readable (EACCES).`,\n\t\t\t);\n\t\t}\n\t\tthrow new Error(\n\t\t\t`inspector.tabs[id=\"${tabId}\"].source (${resolved}) could not be stat'd: ${\n\t\t\t\t(err as Error)?.message ?? err\n\t\t\t}`,\n\t\t);\n\t}\n\tif (!stat.isDirectory()) {\n\t\tthrow new Error(\n\t\t\t`inspector.tabs[id=\"${tabId}\"].source (${resolved}) must be a directory, got ${\n\t\t\t\tstat.isFile() ? \"file\" : \"non-directory\"\n\t\t\t}.`,\n\t\t);\n\t}\n}\n\nexport function buildNativeFactory(\n\truntime: CoreRuntime,\n\tregistryConfig: RegistryConfig,\n\tdefinition: AnyActorDefinition,\n): ActorFactoryHandle {\n\tconst config = definition.config as Record<string, any>;\n\tconst databaseProvider = config.db as AnyDatabaseProvider;\n\tconst schemaConfig: NativeValidationConfig = {\n\t\tactionInputSchemas: config.actionInputSchemas,\n\t\tconnParamsSchema: config.connParamsSchema,\n\t\tevents: config.events,\n\t\tqueues: config.queues,\n\t};\n\tconst actionHandlers = Object.fromEntries(\n\t\t(\n\t\t\tObject.entries(config.actions ?? {}) as Array<\n\t\t\t\t[string, (...args: Array<any>) => any]\n\t\t\t>\n\t\t).map(([name, handler]) => [name, handler]),\n\t);\n\tconst createClient = () =>\n\t\tcreateClientWithDriver(\n\t\t\tnew RemoteEngineControlClient(\n\t\t\t\tconvertRegistryConfigToClientConfig(registryConfig),\n\t\t\t),\n\t\t\t{ encoding: \"bare\" },\n\t\t);\n\tconst nativeRunHandlerActiveByActorId = new Map<string, boolean>();\n\tconst isNativeRunHandlerActive = (ctx: ActorContextHandle) =>\n\t\tnativeRunHandlerActiveByActorId.get(\n\t\t\tcallNativeSync(() => runtime.actorId(ctx)),\n\t\t) ?? false;\n\tconst getNativeWorkflowInspector = (ctx: ActorContextHandle) =>\n\t\tgetRunInspectorConfig(\n\t\t\tconfig.run,\n\t\t\tcallNativeSync(() => runtime.actorId(ctx)),\n\t\t)?.workflow as NativeWorkflowInspectorConfig | undefined;\n\tconst onStateChange =\n\t\ttypeof config.onStateChange === \"function\"\n\t\t\t? (actorCtx: ActorContextHandleAdapter, nextState: unknown) => {\n\t\t\t\t\tconfig.onStateChange(actorCtx, nextState);\n\t\t\t\t}\n\t\t\t: undefined;\n\tconst hasStaticState = \"state\" in config;\n\tconst hasStaticVars = \"vars\" in config;\n\tconst hasStaticConnState = Object.hasOwn(config, \"connState\");\n\tconst hasDynamicConnState = typeof config.createConnState === \"function\";\n\tconst onSleep =\n\t\ttypeof config.onSleep === \"function\" ? config.onSleep : undefined;\n\tconst needsDisconnectCallback =\n\t\ttypeof config.onDisconnect === \"function\" ||\n\t\thasStaticConnState ||\n\t\thasDynamicConnState ||\n\t\tconfig.options?.canHibernateWebSocket === true;\n\tconst stateEnabled =\n\t\tconfig.state !== undefined || typeof config.createState === \"function\";\n\tconst makeActorCtx = (\n\t\tctx: ActorContextHandle,\n\t\trequest?: Request,\n\t\tcancelToken?: CancellationTokenHandle,\n\t) =>\n\t\tnew ActorContextHandleAdapter(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tcreateClient,\n\t\t\tschemaConfig,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\t() => isNativeRunHandlerActive(ctx),\n\t\t\tonStateChange,\n\t\t\tcancelToken,\n\t\t);\n\tconst makeConnCtx = (\n\t\tctx: ActorContextHandle,\n\t\tconn: ConnHandle,\n\t\trequest?: Request,\n\t\tcancelToken?: CancellationTokenHandle,\n\t) =>\n\t\twithConnContext(\n\t\t\truntime,\n\t\t\tctx,\n\t\t\tconn,\n\t\t\tcreateClient,\n\t\t\tschemaConfig,\n\t\t\tdatabaseProvider,\n\t\t\trequest,\n\t\t\tstateEnabled,\n\t\t\tonStateChange,\n\t\t\tcancelToken,\n\t\t);\n\tconst maybeHandleNativeInspectorRequest = async (\n\t\tctx: ActorContextHandle,\n\t\t_rawRequest: {\n\t\t\tmethod: string;\n\t\t\turi: string;\n\t\t\theaders?: Record<string, string>;\n\t\t\tbody?: RuntimeBytes;\n\t\t},\n\t\tjsRequest: Request,\n\t): Promise<Response | undefined> => {\n\t\tconst url = new URL(jsRequest.url);\n\t\tif (!url.pathname.startsWith(\"/inspector/\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst jsonResponse = (body: unknown, init?: ResponseInit) =>\n\t\t\tnew Response(JSON.stringify(body), {\n\t\t\t\tstatus: init?.status ?? 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...(init?.headers ?? {}),\n\t\t\t\t},\n\t\t\t});\n\t\tconst errorResponse = (error: unknown, status?: number) => {\n\t\t\tconst rivetError = toRivetError(error);\n\t\t\treturn jsonResponse(\n\t\t\t\t{\n\t\t\t\t\tgroup: rivetError.group,\n\t\t\t\t\tcode: rivetError.code,\n\t\t\t\t\tmessage: rivetError.message,\n\t\t\t\t\tmetadata: rivetError.metadata ?? null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus:\n\t\t\t\t\t\tstatus ??\n\t\t\t\t\t\trivetError.statusCode ??\n\t\t\t\t\t\t(rivetError.public ? 400 : 500),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\ttry {\n\t\t\tawait runtime.actorVerifyInspectorAuth(\n\t\t\t\tctx,\n\t\t\t\tjsRequest.headers\n\t\t\t\t\t.get(\"authorization\")\n\t\t\t\t\t?.replace(/^Bearer\\s+/i, \"\") ?? null,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn errorResponse(error, 401);\n\t\t}\n\n\t\tconst workflowHistory = () =>\n\t\t\tserializeWorkflowHistoryForJson(\n\t\t\t\tgetNativeWorkflowInspector(ctx)?.getHistory() ?? null,\n\t\t\t);\n\t\tconst workflowState = async () =>\n\t\t\t(await getNativeWorkflowInspector(ctx)?.getState?.()) ?? null;\n\t\tconst actorCtx = makeActorCtx(ctx, jsRequest);\n\t\ttry {\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/state\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tstate: stateEnabled ? actorCtx.state : undefined,\n\t\t\t\t\tisStateEnabled: stateEnabled,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/state\" &&\n\t\t\t\tjsRequest.method === \"PATCH\"\n\t\t\t) {\n\t\t\t\tconst body = (await jsRequest.json()) as { state?: unknown };\n\t\t\t\tactorCtx.state = body.state;\n\t\t\t\tawait actorCtx.saveState({ immediate: true });\n\t\t\t\treturn jsonResponse({ ok: true });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/connections\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tconnections: Array.from(actorCtx.conns.values()).map(\n\t\t\t\t\t\t(conn) => ({\n\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\tid: conn.id,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tparams: conn.params,\n\t\t\t\t\t\t\t\tstateEnabled: true,\n\t\t\t\t\t\t\t\tstate: conn.state,\n\t\t\t\t\t\t\t\tsubscriptions: 0,\n\t\t\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/rpcs\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\trpcs: Object.keys(actionHandlers).sort(),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/queue\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst limitParam = url.searchParams.get(\"limit\");\n\t\t\t\tconst parsedLimit = limitParam ? Number(limitParam) : 100;\n\t\t\t\tconst limit =\n\t\t\t\t\tNumber.isFinite(parsedLimit) && parsedLimit > 0\n\t\t\t\t\t\t? Math.floor(parsedLimit)\n\t\t\t\t\t\t: 100;\n\t\t\t\tconst allMessages =\n\t\t\t\t\tawait runtime.actorQueueInspectMessages(ctx);\n\t\t\t\tconst truncated = allMessages.length > limit;\n\t\t\t\tconst messages = allMessages.slice(0, limit).map((m) => ({\n\t\t\t\t\tid: m.id,\n\t\t\t\t\tname: m.name,\n\t\t\t\t\tcreatedAtMs: m.createdAtMs,\n\t\t\t\t}));\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tsize: allMessages.length,\n\t\t\t\t\tmaxSize: runtime.actorQueueMaxSize(ctx),\n\t\t\t\t\ttruncated,\n\t\t\t\t\tmessages,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/traces\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({ otlp: [], clamped: false });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/workflow-history\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\thistory: workflowHistory(),\n\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/workflow/replay\" &&\n\t\t\t\tjsRequest.method === \"POST\"\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = (await jsRequest.json()) as {\n\t\t\t\t\t\tentryId?: string;\n\t\t\t\t\t};\n\t\t\t\t\tconst history = await getNativeWorkflowInspector(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t)?.replayFromStep?.(body.entryId);\n\t\t\t\t\treturn jsonResponse({\n\t\t\t\t\t\thistory: serializeWorkflowHistoryForJson(\n\t\t\t\t\t\t\thistory ?? null,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error replaying workflow history\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn errorResponse(error);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/schema\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst db = actorCtx.sql;\n\t\t\t\tconst tables = queryRows(\n\t\t\t\t\tawait db.query(\n\t\t\t\t\t\t\"SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__drizzle_%' ORDER BY name\",\n\t\t\t\t\t),\n\t\t\t\t) as Array<{ name: string; type: string }>;\n\t\t\t\tconst tableInfos = [];\n\t\t\t\tfor (const table of tables) {\n\t\t\t\t\tconst quoted = `\"${table.name.replace(/\"/g, '\"\"')}\"`;\n\t\t\t\t\tconst columns = queryRows(\n\t\t\t\t\t\tawait db.query(`PRAGMA table_info(${quoted})`),\n\t\t\t\t\t);\n\t\t\t\t\tconst foreignKeys = queryRows(\n\t\t\t\t\t\tawait db.query(`PRAGMA foreign_key_list(${quoted})`),\n\t\t\t\t\t);\n\t\t\t\t\tconst countResult = queryRows(\n\t\t\t\t\t\tawait db.query(\n\t\t\t\t\t\t\t`SELECT COUNT(*) as count FROM ${quoted}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t) as Array<{ count?: number }>;\n\t\t\t\t\ttableInfos.push({\n\t\t\t\t\t\ttable: {\n\t\t\t\t\t\t\tschema: \"main\",\n\t\t\t\t\t\t\tname: table.name,\n\t\t\t\t\t\t\ttype: table.type,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcolumns: jsonSafe(columns),\n\t\t\t\t\t\tforeignKeys: jsonSafe(foreignKeys),\n\t\t\t\t\t\trecords: countResult[0]?.count ?? 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn jsonResponse({ schema: { tables: tableInfos } });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/rows\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst table = url.searchParams.get(\"table\");\n\t\t\t\tif (!table) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"Missing required table query parameter\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst limit = Number.parseInt(\n\t\t\t\t\turl.searchParams.get(\"limit\") ?? \"100\",\n\t\t\t\t\t10,\n\t\t\t\t);\n\t\t\t\tconst offset = Number.parseInt(\n\t\t\t\t\turl.searchParams.get(\"offset\") ?? \"0\",\n\t\t\t\t\t10,\n\t\t\t\t);\n\t\t\t\tconst quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n\t\t\t\tconst rows = queryRows(\n\t\t\t\t\tawait actorCtx.sql.query(\n\t\t\t\t\t\t`SELECT * FROM ${quoted} LIMIT ? OFFSET ?`,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tMath.max(0, Math.min(limit, 500)),\n\t\t\t\t\t\t\tMath.max(0, offset),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/database/execute\" &&\n\t\t\t\tjsRequest.method === \"POST\"\n\t\t\t) {\n\t\t\t\tconst body = (await jsRequest.json()) as {\n\t\t\t\t\tsql?: unknown;\n\t\t\t\t\targs?: unknown;\n\t\t\t\t\tproperties?: unknown;\n\t\t\t\t};\n\t\t\t\tif (typeof body.sql !== \"string\" || body.sql.trim() === \"\") {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"sql is required\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tArray.isArray(body.args) &&\n\t\t\t\t\tbody.properties &&\n\t\t\t\t\ttypeof body.properties === \"object\"\n\t\t\t\t) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"use either args or properties, not both\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tbody.properties &&\n\t\t\t\t\ttypeof body.properties === \"object\" &&\n\t\t\t\t\t!Array.isArray(body.properties)\n\t\t\t\t) {\n\t\t\t\t\tconst bindings = normalizeSqlitePropertyBindings(\n\t\t\t\t\t\tbody.properties as Record<string, unknown>,\n\t\t\t\t\t);\n\t\t\t\t\tconst rows = queryRows(\n\t\t\t\t\t\tawait actorCtx.sql.query(body.sql, bindings),\n\t\t\t\t\t);\n\t\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t\t}\n\t\t\t\tconst args = Array.isArray(body.args) ? body.args : [];\n\t\t\t\tconst rows = queryRows(\n\t\t\t\t\tawait actorCtx.sql.query(body.sql, args),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({ rows: jsonSafe(rows) });\n\t\t\t}\n\t\t\tif (\n\t\t\t\turl.pathname === \"/inspector/summary\" &&\n\t\t\t\tjsRequest.method === \"GET\"\n\t\t\t) {\n\t\t\t\tconst inspectorSnapshot = callNativeSync(() =>\n\t\t\t\t\truntime.actorInspectorSnapshot(ctx),\n\t\t\t\t);\n\t\t\t\treturn jsonResponse({\n\t\t\t\t\tstate: stateEnabled ? actorCtx.state : undefined,\n\t\t\t\t\tconnections: Array.from(actorCtx.conns.values()).map(\n\t\t\t\t\t\t(conn) => ({\n\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\tid: conn.id,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tparams: conn.params,\n\t\t\t\t\t\t\t\tstateEnabled: true,\n\t\t\t\t\t\t\t\tstate: conn.state,\n\t\t\t\t\t\t\t\tsubscriptions: 0,\n\t\t\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\trpcs: Object.keys(actionHandlers).sort(),\n\t\t\t\t\tqueueSize: inspectorSnapshot.queueSize,\n\t\t\t\t\tisStateEnabled: stateEnabled,\n\t\t\t\t\tisDatabaseEnabled: databaseProvider !== undefined,\n\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\tgetNativeWorkflowInspector(ctx) !== undefined,\n\t\t\t\t\tworkflowState: await workflowState(),\n\t\t\t\t\tworkflowHistory: workflowHistory(),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\tjsRequest.method === \"POST\" &&\n\t\t\t\turl.pathname.startsWith(\"/inspector/action/\")\n\t\t\t) {\n\t\t\t\tconst actionName = url.pathname.replace(\n\t\t\t\t\t\"/inspector/action/\",\n\t\t\t\t\t\"\",\n\t\t\t\t);\n\t\t\t\tconst action = actionHandlers[actionName];\n\t\t\t\tif (!action) {\n\t\t\t\t\treturn errorResponse(\n\t\t\t\t\t\tnew RivetError(\n\t\t\t\t\t\t\t\"action\",\n\t\t\t\t\t\t\t\"action_not_found\",\n\t\t\t\t\t\t\t`Action ${actionName} not found`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t404,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst body = (await jsRequest.json()) as {\n\t\t\t\t\targs?: unknown;\n\t\t\t\t\tproperties?: unknown;\n\t\t\t\t};\n\t\t\t\tif (body.args !== undefined && body.properties !== undefined) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"use either args or properties, not both\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tbody.properties !== undefined &&\n\t\t\t\t\t(body.properties === null ||\n\t\t\t\t\t\ttypeof body.properties !== \"object\" ||\n\t\t\t\t\t\tArray.isArray(body.properties))\n\t\t\t\t) {\n\t\t\t\t\treturn jsonResponse(\n\t\t\t\t\t\t{ error: \"properties must be an object\" },\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst args =\n\t\t\t\t\tbody.properties !== undefined\n\t\t\t\t\t\t? [body.properties]\n\t\t\t\t\t\t: normalizeArgs(body.args);\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await action(\n\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t...validateActionArgs(\n\t\t\t\t\t\t\tschemaConfig.actionInputSchemas,\n\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn jsonResponse({ output });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"Error handling inspector action request\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn errorResponse(error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn jsonResponse(\n\t\t\t\t{\n\t\t\t\t\tgroup: \"actor\",\n\t\t\t\t\tcode: \"not_found\",\n\t\t\t\t\tmessage: \"Inspector route was not found\",\n\t\t\t\t\tmetadata: null,\n\t\t\t\t},\n\t\t\t\t{ status: 404 },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"Error handling inspector request\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\treturn errorResponse(error);\n\t\t} finally {\n\t\t\tawait actorCtx.dispose();\n\t\t}\n\t};\n\tconst callbacks = {\n\t\tcreateState:\n\t\t\thasStaticState || typeof config.createState === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tinput?: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<RuntimeBytes> => {\n\t\t\t\t\t\t\tconst { ctx, input } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst decodedInput = decodeValue(input);\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tconst state = hasStaticState\n\t\t\t\t\t\t\t\t\t? structuredClone(config.state)\n\t\t\t\t\t\t\t\t\t: await config.createState(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tdecodedInput,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: createStateMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tactorCtx.initializeState(state);\n\t\t\t\t\t\t\t\treturn encodeValue(state);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonCreate:\n\t\t\ttypeof config.onCreate === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tinput?: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\t\tconst { ctx, input } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onCreate(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tdecodeValue(input),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tcreateVars:\n\t\t\thasStaticVars || typeof config.createVars === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tconst vars = hasStaticVars\n\t\t\t\t\t\t\t\t\t? structuredClone(config.vars)\n\t\t\t\t\t\t\t\t\t: await config.createVars(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: createVarsMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tactorCtx.vars = vars;\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonMigrate:\n\t\t\ttypeof config.onMigrate === \"function\" ||\n\t\t\tdatabaseProvider !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tisNew: boolean;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, isNew } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (!isNew) {\n\t\t\t\t\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait actorCtx.runDatabaseMigrations();\n\t\t\t\t\t\t\t\tif (typeof config.onMigrate === \"function\") {\n\t\t\t\t\t\t\t\t\tawait config.onMigrate(actorCtx, isNew);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonWake:\n\t\t\ttypeof config.onWake === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst startedAt = performance.now();\n\t\t\t\t\t\t\t\tawait config.onWake(actorCtx);\n\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\tmsg: \"perf user: onWakeMs\",\n\t\t\t\t\t\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonBeforeActorStart:\n\t\t\ttypeof config.onBeforeActorStart === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onBeforeActorStart(actorCtx);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonSleep: wrapNativeCallback(\n\t\t\tasync (error: unknown, payload: { ctx: ActorContextHandle }) => {\n\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t// TODO: Move this save hook into cleanupNativeSleepRuntimeState\n\t\t\t\t// so immediate and deferred sleep cleanup share one save-state\n\t\t\t\t// path instead of passing a callback through cleanup.\n\t\t\t\tconst saveActorState = async () => {\n\t\t\t\t\tif (runtime.kind === \"wasm\") {\n\t\t\t\t\t\t// Wasm cannot use the native context save helper here because\n\t\t\t\t\t\t// the runtime owns the serialized state handoff.\n\t\t\t\t\t\tawait runtime.actorSaveState(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tactorCtx.serializeForTick(\"save\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait actorCtx.saveState({\n\t\t\t\t\t\t\timmediate: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tif (onSleep) {\n\t\t\t\t\t\tawait onSleep(actorCtx);\n\t\t\t\t\t}\n\t\t\t\t\tawait saveActorState();\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cleanupNativeSleepRuntimeState(\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tsaveActorState,\n\t\t\t\t\t\t);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonDestroy: wrapNativeCallback(\n\t\t\tasync (error: unknown, payload: { ctx: ActorContextHandle }) => {\n\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof config.onDestroy === \"function\") {\n\t\t\t\t\t\tawait config.onDestroy(actorCtx);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tresolveNativeDestroy(runtime, ctx);\n\t\t\t\t\tawait actorCtx.closeDatabase();\n\t\t\t\t\tclearNativeRuntimeState(runtime, ctx);\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonBeforeConnect:\n\t\t\ttypeof config.onBeforeConnect === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tparams: RuntimeBytes;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, params, request } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onBeforeConnect(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tvalidateConnParams(\n\t\t\t\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\t\t\t\tdecodeValue(params),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tcreateConnState:\n\t\t\thasStaticConnState || hasDynamicConnState\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\tparams: RuntimeBytes;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t): Promise<RuntimeBytes> => {\n\t\t\t\t\t\t\tconst { ctx, conn, params, request } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst connAdapter = new NativeConnAdapter(\n\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst nextConnState = hasStaticConnState\n\t\t\t\t\t\t\t\t\t? structuredClone(config.connState)\n\t\t\t\t\t\t\t\t\t: await config.createConnState(\n\t\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\t\tvalidateConnParams(\n\t\t\t\t\t\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\t\t\t\t\t\tdecodeValue(params),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconnAdapter.initializeState(nextConnState);\n\t\t\t\t\t\t\t\treturn encodeValue(nextConnState);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonConnect:\n\t\t\ttypeof config.onConnect === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, request } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\trequest ? buildRequest(request) : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst connAdapter = new NativeConnAdapter(\n\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onConnect(\n\t\t\t\t\t\t\t\t\tObject.assign(actorCtx, {\n\t\t\t\t\t\t\t\t\t\tconn: connAdapter,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tconnAdapter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonDisconnectFinal: needsDisconnectCallback\n\t\t\t? wrapNativeCallback(\n\t\t\t\t\tasync (\n\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst { ctx, conn } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Core already removed the connection; this hook is\n\t\t\t\t\t\t\t// pure user dispatch.\n\t\t\t\t\t\t\tif (typeof config.onDisconnect === \"function\") {\n\t\t\t\t\t\t\t\tawait config.onDisconnect(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tnew NativeConnAdapter(\n\t\t\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\t\t\tschemaConfig,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t(connId) =>\n\t\t\t\t\t\t\t\t\t\t\tcallNativeSync(() =>\n\t\t\t\t\t\t\t\t\t\t\t\truntime.actorQueueHibernationRemoval(\n\t\t\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t: undefined,\n\t\tonBeforeSubscribe:\n\t\t\tschemaConfig.events &&\n\t\t\tObject.values(schemaConfig.events).some(\n\t\t\t\t(schema) =>\n\t\t\t\t\ttypeof (schema as { canSubscribe?: unknown })\n\t\t\t\t\t\t.canSubscribe === \"function\",\n\t\t\t)\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\teventName: string;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, eventName } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst canSubscribe = getEventCanSubscribe(\n\t\t\t\t\t\t\t\t\tschemaConfig.events,\n\t\t\t\t\t\t\t\t\teventName,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!canSubscribe) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst result = await canSubscribe(actorCtx);\n\t\t\t\t\t\t\t\tif (typeof result !== \"boolean\") {\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\"canSubscribe must return a boolean\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\t\t\tthrow forbiddenError();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonBeforeActionResponse:\n\t\t\ttypeof config.onBeforeActionResponse === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\targs: RuntimeBytes;\n\t\t\t\t\t\t\t\toutput: RuntimeBytes;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, name, args, output } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn encodeValue(\n\t\t\t\t\t\t\t\t\tawait config.onBeforeActionResponse(\n\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tdecodeArgs(args),\n\t\t\t\t\t\t\t\t\t\tdecodeValue(output),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tonRequest: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\turi: string;\n\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t};\n\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { ctx, request, cancelToken } = unwrapTsfnPayload(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t);\n\t\t\t\t\tconst jsRequest = buildRequest(request);\n\t\t\t\t\tconst inspectorResponse =\n\t\t\t\t\t\tawait maybeHandleNativeInspectorRequest(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (inspectorResponse) {\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(inspectorResponse);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof config.onRequest !== \"function\") {\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(\n\t\t\t\t\t\t\tnew Response(null, { status: 404 }),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rawConnParams =\n\t\t\t\t\t\tjsRequest.headers.get(HEADER_CONN_PARAMS);\n\t\t\t\t\tlet requestCtx:\n\t\t\t\t\t\t| ReturnType<typeof withConnContext>\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tlet conn: ConnHandle | undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst connParams = validateConnParams(\n\t\t\t\t\t\t\tschemaConfig.connParamsSchema,\n\t\t\t\t\t\t\trawConnParams\n\t\t\t\t\t\t\t\t? JSON.parse(rawConnParams)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconn = await callNative(() =>\n\t\t\t\t\t\t\truntime.actorConnectConn(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tencodeValue(connParams),\n\t\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\trequestCtx = makeConnCtx(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t\tcancelToken,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst response = await config.onRequest(\n\t\t\t\t\t\t\trequestCtx,\n\t\t\t\t\t\t\tjsRequest,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!(response instanceof Response)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"onRequest handler must return a Response\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn await toRuntimeHttpResponse(response);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait requestCtx?.dispose();\n\t\t\t\t\t\tif (conn) {\n\t\t\t\t\t\t\tawait runtime.connDisconnect(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"native onRequest failed\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tonWebSocket:\n\t\t\ttypeof config.onWebSocket === \"function\"\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\t\t\t\tws: WebSocketHandle;\n\t\t\t\t\t\t\t\trequest?: {\n\t\t\t\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\t\t\t\turi: string;\n\t\t\t\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, conn, ws, request } =\n\t\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst jsRequest = request\n\t\t\t\t\t\t\t\t? buildRequest(request)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\tconst actorCtx = makeConnCtx(ctx, conn, jsRequest);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait config.onWebSocket(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\tnew TrackedWebSocketHandleAdapter(\n\t\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t\tnew NativeWebSocketAdapter(runtime, ws),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\trun: (() => {\n\t\t\tconst run = getRunFunction(config.run);\n\t\t\tif (!run) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn wrapNativeCallback(\n\t\t\t\tasync (\n\t\t\t\t\terror: unknown,\n\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t) => {\n\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\tconst actorId = callNativeSync(() => runtime.actorId(ctx));\n\t\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\t\tnativeRunHandlerActiveByActorId.set(actorId, true);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait run(actorCtx);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tnativeRunHandlerActiveByActorId.set(actorId, false);\n\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t})(),\n\t\tgetWorkflowHistory:\n\t\t\tgetRunInspectorConfig(config.run) !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: { ctx: ActorContextHandle },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx } = unwrapTsfnPayload(error, payload);\n\t\t\t\t\t\t\tconst history =\n\t\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx)?.getHistory();\n\t\t\t\t\t\t\treturn history == null\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(history);\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\treplayWorkflow:\n\t\t\tgetRunInspectorConfig(config.run) !== undefined\n\t\t\t\t? wrapNativeCallback(\n\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\t\tentryId?: string;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst { ctx, entryId } = unwrapTsfnPayload(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst workflowInspector =\n\t\t\t\t\t\t\t\tgetNativeWorkflowInspector(ctx);\n\t\t\t\t\t\t\tif (!workflowInspector?.replayFromStep) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst history =\n\t\t\t\t\t\t\t\t(await workflowInspector.replayFromStep(\n\t\t\t\t\t\t\t\t\tentryId,\n\t\t\t\t\t\t\t\t)) ?? null;\n\t\t\t\t\t\t\treturn history == null\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: encodeValue(history);\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tactions: Object.fromEntries(\n\t\t\tObject.entries(actionHandlers).map(([name, handler]) => [\n\t\t\t\tname,\n\t\t\t\twrapNativeCallback(\n\t\t\t\t\tasync (\n\t\t\t\t\t\terror: unknown,\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\t\t\tconn: ConnHandle | null;\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\targs: RuntimeBytes;\n\t\t\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst { ctx, conn, args, cancelToken } =\n\t\t\t\t\t\t\tunwrapTsfnPayload(error, payload);\n\t\t\t\t\t\tconst actorCtx =\n\t\t\t\t\t\t\tconn != null\n\t\t\t\t\t\t\t\t? makeConnCtx(ctx, conn, undefined, cancelToken)\n\t\t\t\t\t\t\t\t: makeActorCtx(ctx, undefined, cancelToken);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn encodeValue(\n\t\t\t\t\t\t\t\tawait handler(\n\t\t\t\t\t\t\t\t\tactorCtx,\n\t\t\t\t\t\t\t\t\t...validateActionArgs(\n\t\t\t\t\t\t\t\t\t\tschemaConfig.actionInputSchemas,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tdecodeArgs(args),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t]),\n\t\t),\n\t\tonQueueSend: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\tconn: ConnHandle;\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: string;\n\t\t\t\t\t\turi: string;\n\t\t\t\t\t\theaders?: Record<string, string>;\n\t\t\t\t\t\tbody?: RuntimeBytes;\n\t\t\t\t\t};\n\t\t\t\t\tname: string;\n\t\t\t\t\tbody: RuntimeBytes;\n\t\t\t\t\twait: boolean;\n\t\t\t\t\ttimeoutMs?: bigint | number;\n\t\t\t\t\tcancelToken?: CancellationTokenHandle;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\tconst {\n\t\t\t\t\tctx,\n\t\t\t\t\tconn,\n\t\t\t\t\trequest,\n\t\t\t\t\tname,\n\t\t\t\t\tbody,\n\t\t\t\t\twait,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tcancelToken,\n\t\t\t\t} = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst jsRequest = buildRequest(request);\n\t\t\t\tconst actorCtx = withConnContext(\n\t\t\t\t\truntime,\n\t\t\t\t\tctx,\n\t\t\t\t\tconn,\n\t\t\t\t\tcreateClient,\n\t\t\t\t\tschemaConfig,\n\t\t\t\t\tdatabaseProvider,\n\t\t\t\t\tjsRequest,\n\t\t\t\t\tstateEnabled,\n\t\t\t\t\tonStateChange,\n\t\t\t\t\tcancelToken,\n\t\t\t\t);\n\t\t\t\ttry {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!schemaConfig.queues ||\n\t\t\t\t\t\t!hasSchemaConfigKey(schemaConfig.queues, name)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn { status: \"completed\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tconst canPublish = getQueueCanPublish(\n\t\t\t\t\t\tschemaConfig.queues,\n\t\t\t\t\t\tname,\n\t\t\t\t\t);\n\t\t\t\t\tif (canPublish && !(await canPublish(actorCtx))) {\n\t\t\t\t\t\tthrow forbiddenError();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst decodedBody = decodeValue(body);\n\t\t\t\t\tif (wait) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\tawait actorCtx.queue.enqueueAndWait(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdecodedBody,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttimeout:\n\t\t\t\t\t\t\t\t\t\t\ttimeoutMs === undefined ||\n\t\t\t\t\t\t\t\t\t\t\ttimeoutMs === null\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t: Number(timeoutMs),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\t\tresponse:\n\t\t\t\t\t\t\t\t\tresponse === undefined\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: encodeValue(response),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(error as { group?: string; code?: string })\n\t\t\t\t\t\t\t\t\t.group === \"queue\" &&\n\t\t\t\t\t\t\t\t(error as { group?: string; code?: string })\n\t\t\t\t\t\t\t\t\t.code === \"timed_out\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn { status: \"timedOut\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tawait actorCtx.queue.send(name, decodedBody);\n\t\t\t\t\treturn { status: \"completed\" };\n\t\t\t\t} finally {\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tserializeState: wrapNativeCallback(\n\t\t\tasync (\n\t\t\t\terror: unknown,\n\t\t\t\tpayload: {\n\t\t\t\t\tctx: ActorContextHandle;\n\t\t\t\t\treason: SerializeStateReason;\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\tconst { ctx, reason } = unwrapTsfnPayload(error, payload);\n\t\t\t\tconst actorCtx = makeActorCtx(ctx);\n\t\t\t\ttry {\n\t\t\t\t\treturn actorCtx.serializeForTick(reason);\n\t\t\t\t} finally {\n\t\t\t\t\tawait actorCtx.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t};\n\n\treturn runtime.createActorFactory(\n\t\tcallbacks,\n\t\tbuildActorConfig(definition, registryConfig),\n\t);\n}\n\nexport async function buildServeConfig(\n\tconfig: RegistryConfig,\n): Promise<RuntimeServeConfig> {\n\tif (!config.endpoint) {\n\t\tthrow nativeEndpointNotConfiguredError();\n\t}\n\n\tconst serveConfig: RuntimeServeConfig = {\n\t\tversion: config.envoy.version,\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\tpoolName: config.envoy.poolName,\n\t\thandleInspectorHttpInRuntime: true,\n\t\tserverlessBasePath: config.serverless.basePath,\n\t\tserverlessPackageVersion: VERSION,\n\t\tserverlessClientEndpoint: config.publicEndpoint,\n\t\tserverlessClientNamespace: config.publicNamespace,\n\t\tserverlessClientToken: config.publicToken,\n\t\tserverlessValidateEndpoint: config.validateServerlessEndpoint,\n\t\tserverlessMaxStartPayloadBytes: config.serverless.maxStartPayloadBytes,\n\t};\n\n\tif (config.startEngine) {\n\t\tconst { getEnginePath } = await loadEngineCli();\n\t\tserveConfig.engineBinaryPath = getEnginePath();\n\t\tserveConfig.engineHost = config.engineHost;\n\t\tserveConfig.enginePort = config.enginePort;\n\t}\n\tif (config.test?.enabled) {\n\t\tserveConfig.inspectorTestToken =\n\t\t\tgetEnvUniversal(\"_RIVET_TEST_INSPECTOR_TOKEN\") ?? \"token\";\n\t}\n\n\treturn serveConfig;\n}\n\nexport async function buildRegistryWithRuntime(\n\tconfig: RegistryConfig,\n\truntime: CoreRuntime,\n): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tif (\n\t\tconfig.test?.enabled &&\n\t\tgetEnvUniversal(\"_RIVET_TEST_INSPECTOR_TOKEN\") === undefined\n\t) {\n\t\ttrySetProcessEnv(\"_RIVET_TEST_INSPECTOR_TOKEN\", \"token\");\n\t}\n\n\tconst registry = runtime.createRegistry();\n\n\tfor (const [name, definition] of Object.entries(config.use)) {\n\t\truntime.registerActor(\n\t\t\tregistry,\n\t\t\tname,\n\t\t\tbuildNativeFactory(runtime, config, definition),\n\t\t);\n\t}\n\n\treturn {\n\t\truntime,\n\t\tregistry,\n\t\tserveConfig: await buildServeConfig(config),\n\t};\n}\n\nexport async function buildNativeRegistry(config: RegistryConfig): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tconst { runtime } = await loadNapiRuntime();\n\treturn buildRegistryWithRuntime(\n\t\tnormalizeRuntimeConfigForKind(config, \"native\"),\n\t\truntime,\n\t);\n}\n\nexport async function buildConfiguredRegistry(config: RegistryConfig): Promise<{\n\truntime: CoreRuntime;\n\tregistry: RegistryHandle;\n\tserveConfig: RuntimeServeConfig;\n}> {\n\tconst runtime = await loadConfiguredRuntime(config);\n\treturn buildRegistryWithRuntime(\n\t\tnormalizeRuntimeConfig(config, runtime),\n\t\truntime,\n\t);\n}\n","import { decodeBridgeRivetError } from \"@/actor/errors\";\nimport type {\n\tSqliteBindings,\n\tSqliteDatabase,\n\tSqliteExecuteResult,\n\tSqliteNativeMetrics,\n} from \"./config\";\n\ntype NativeBindNoValues = {\n\tintValue?: never;\n\tfloatValue?: never;\n\ttextValue?: never;\n\tblobValue?: never;\n};\n\ntype NativeBindParam =\n\t| ({ kind: \"null\" } & NativeBindNoValues)\n\t| {\n\t\t\tkind: \"int\";\n\t\t\tintValue: number;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"float\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue: number;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"text\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue: string;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"blob\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue: Buffer;\n\t };\n\ninterface NativeExecResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\ninterface NativeQueryResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\ninterface NativeRunResult {\n\tchanges: number;\n}\n\ninterface NativeExecuteResult {\n\tcolumns: string[];\n\trows: unknown[][];\n\tchanges: number;\n\tlastInsertRowId?: number | null;\n}\n\nexport interface JsNativeDatabaseLike {\n\texec(sql: string): Promise<NativeExecResult>;\n\texecute(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeExecuteResult>;\n\tquery(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeQueryResult>;\n\trun(\n\t\tsql: string,\n\t\tparams?: NativeBindParam[] | null,\n\t): Promise<NativeRunResult>;\n\tmetrics?(): SqliteNativeMetrics | null;\n\ttakeLastKvError?(): string | null;\n\tclose(): Promise<void>;\n}\n\nfunction shouldAttachNativeKvError(message: string): boolean {\n\treturn /i\\/o error|unable to open database file/i.test(message);\n}\n\nfunction enrichNativeDatabaseError(\n\tdatabase: JsNativeDatabaseLike,\n\terror: unknown,\n): never {\n\tconst bridgeReason =\n\t\ttypeof error === \"string\"\n\t\t\t? error\n\t\t\t: error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: undefined;\n\tconst bridged =\n\t\tbridgeReason === undefined\n\t\t\t? undefined\n\t\t\t: decodeBridgeRivetError(bridgeReason);\n\tif (bridged) {\n\t\tthrow bridged;\n\t}\n\n\tconst kvError = database.takeLastKvError?.();\n\tif (\n\t\terror instanceof Error &&\n\t\tkvError &&\n\t\tshouldAttachNativeKvError(error.message) &&\n\t\t!error.message.includes(kvError)\n\t) {\n\t\terror.message = `${error.message} (native sqlite kv error: ${kvError})`;\n\t}\n\tthrow error;\n}\n\nfunction toNativeBinding(arg: unknown): NativeBindParam {\n\tif (arg === null || arg === undefined) {\n\t\treturn { kind: \"null\" };\n\t}\n\tif (typeof arg === \"bigint\") {\n\t\treturn { kind: \"int\", intValue: Number(arg) };\n\t}\n\tif (typeof arg === \"number\") {\n\t\tif (Number.isInteger(arg)) {\n\t\t\treturn { kind: \"int\", intValue: arg };\n\t\t}\n\t\treturn { kind: \"float\", floatValue: arg };\n\t}\n\tif (typeof arg === \"string\") {\n\t\treturn { kind: \"text\", textValue: arg };\n\t}\n\tif (typeof arg === \"boolean\") {\n\t\treturn { kind: \"int\", intValue: arg ? 1 : 0 };\n\t}\n\tif (arg instanceof Uint8Array) {\n\t\treturn { kind: \"blob\", blobValue: Buffer.from(arg) };\n\t}\n\tthrow new Error(`unsupported bind parameter type: ${typeof arg}`);\n}\n\nfunction extractNamedSqliteParameters(sql: string): string[] {\n\tconst orderedNames: string[] = [];\n\tconst seen = new Set<string>();\n\tconst pattern = /([:@$][A-Za-z_][A-Za-z0-9_]*)/g;\n\tfor (const match of sql.matchAll(pattern)) {\n\t\tconst name = match[1];\n\t\tif (seen.has(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(name);\n\t\torderedNames.push(name);\n\t}\n\treturn orderedNames;\n}\n\nfunction getNamedSqliteBinding(\n\tbindings: Record<string, unknown>,\n\tname: string,\n): unknown {\n\tif (name in bindings) {\n\t\treturn bindings[name];\n\t}\n\n\tconst bareName = name.slice(1);\n\tif (bareName in bindings) {\n\t\treturn bindings[bareName];\n\t}\n\n\tfor (const prefix of [\":\", \"@\", \"$\"] as const) {\n\t\tconst candidate = `${prefix}${bareName}`;\n\t\tif (candidate in bindings) {\n\t\t\treturn bindings[candidate];\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction toNativeBindings(\n\tsql: string,\n\tparams?: SqliteBindings,\n): NativeBindParam[] | null {\n\tif (params === undefined) {\n\t\treturn null;\n\t}\n\n\tif (Array.isArray(params)) {\n\t\treturn params.map((arg) => toNativeBinding(arg));\n\t}\n\n\tconst orderedNames = extractNamedSqliteParameters(sql);\n\tif (orderedNames.length === 0) {\n\t\treturn Object.values(params).map((arg) => toNativeBinding(arg));\n\t}\n\n\treturn orderedNames.map((name) => {\n\t\tconst value = getNamedSqliteBinding(params, name);\n\t\tif (value === undefined) {\n\t\t\tthrow new Error(`missing bind parameter: ${name}`);\n\t\t}\n\t\treturn toNativeBinding(value);\n\t});\n}\n\nfunction normalizeNativeMetrics(\n\tmetrics: SqliteNativeMetrics | null | undefined,\n): SqliteNativeMetrics | null {\n\tif (!metrics) return null;\n\tconst raw = metrics as unknown as Record<string, unknown>;\n\tconst numberField = (camel: string, snake: string) =>\n\t\tNumber(raw[camel] ?? raw[snake] ?? 0);\n\n\treturn {\n\t\trequestBuildNs: numberField(\"requestBuildNs\", \"request_build_ns\"),\n\t\tserializeNs: numberField(\"serializeNs\", \"serialize_ns\"),\n\t\ttransportNs: numberField(\"transportNs\", \"transport_ns\"),\n\t\tstateUpdateNs: numberField(\"stateUpdateNs\", \"state_update_ns\"),\n\t\ttotalNs: numberField(\"totalNs\", \"total_ns\"),\n\t\tcommitCount: numberField(\"commitCount\", \"commit_count\"),\n\t\tpageCacheEntries: numberField(\"pageCacheEntries\", \"page_cache_entries\"),\n\t\tpageCacheWeightedSize: numberField(\n\t\t\t\"pageCacheWeightedSize\",\n\t\t\t\"page_cache_weighted_size\",\n\t\t),\n\t\tpageCacheCapacityPages: numberField(\n\t\t\t\"pageCacheCapacityPages\",\n\t\t\t\"page_cache_capacity_pages\",\n\t\t),\n\t\twriteBufferDirtyPages: numberField(\n\t\t\t\"writeBufferDirtyPages\",\n\t\t\t\"write_buffer_dirty_pages\",\n\t\t),\n\t\tdbSizePages: numberField(\"dbSizePages\", \"db_size_pages\"),\n\t};\n}\n\nclass NativeCloseGate {\n\t#active = 0;\n\t#closed = false;\n\t#waiters: (() => void)[] = [];\n\n\tenter(): () => void {\n\t\tif (this.#closed) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t);\n\t\t}\n\n\t\tthis.#active++;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tthis.#active--;\n\t\t\tif (this.#active === 0) {\n\t\t\t\tconst waiters = this.#waiters.splice(0);\n\t\t\t\tfor (const waiter of waiters) {\n\t\t\t\t\twaiter();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tasync close(callback: () => Promise<void>): Promise<void> {\n\t\tif (this.#closed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#closed = true;\n\t\tif (this.#active > 0) {\n\t\t\tawait new Promise<void>((resolve) => this.#waiters.push(resolve));\n\t\t}\n\t\tawait callback();\n\t}\n}\n\nexport function wrapJsNativeDatabase(\n\tdatabase: JsNativeDatabaseLike,\n): SqliteDatabase {\n\tconst gate = new NativeCloseGate();\n\tlet closePromise: Promise<void> | undefined;\n\tlet lastInsertRowId: number | null = null;\n\n\tconst executeNative = async (\n\t\tsql: string,\n\t\tparams?: SqliteBindings,\n\t): Promise<SqliteExecuteResult> => {\n\t\tconst lastInsertRowIdColumn = lastInsertRowIdColumnName(sql);\n\t\tif (lastInsertRowIdColumn) {\n\t\t\treturn {\n\t\t\t\tcolumns: [lastInsertRowIdColumn],\n\t\t\t\trows: [[lastInsertRowId ?? 0]],\n\t\t\t\tchanges: 0,\n\t\t\t\tlastInsertRowId,\n\t\t\t};\n\t\t}\n\n\t\tconst release = gate.enter();\n\t\ttry {\n\t\t\tconst nativeParams = toNativeBindings(sql, params);\n\t\t\tconst result = await database.execute(sql, nativeParams);\n\t\t\tif (result.lastInsertRowId !== undefined) {\n\t\t\t\tlastInsertRowId = result.lastInsertRowId;\n\t\t\t}\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tenrichNativeDatabaseError(database, error);\n\t\t} finally {\n\t\t\trelease();\n\t\t}\n\t};\n\n\treturn {\n\t\tasync exec(\n\t\t\tsql: string,\n\t\t\tcallback?: (row: unknown[], columns: string[]) => void,\n\t\t): Promise<void> {\n\t\t\tconst release = gate.enter();\n\t\t\tlet result: NativeExecResult;\n\t\t\ttry {\n\t\t\t\tresult = await database.exec(sql);\n\t\t\t} catch (error) {\n\t\t\t\tenrichNativeDatabaseError(database, error);\n\t\t\t} finally {\n\t\t\t\trelease();\n\t\t\t}\n\t\t\tif (!callback) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const row of result.rows) {\n\t\t\t\tcallback(row, result.columns);\n\t\t\t}\n\t\t},\n\t\tasync execute(\n\t\t\tsql: string,\n\t\t\tparams?: SqliteBindings,\n\t\t): Promise<SqliteExecuteResult> {\n\t\t\treturn await executeNative(sql, params);\n\t\t},\n\t\tasync run(sql: string, params?: SqliteBindings): Promise<void> {\n\t\t\tawait executeNative(sql, params);\n\t\t},\n\t\tasync query(sql: string, params?: SqliteBindings) {\n\t\t\tconst { columns, rows } = await executeNative(sql, params);\n\t\t\treturn { columns, rows };\n\t\t},\n\t\tnativeMetrics(): SqliteNativeMetrics | null {\n\t\t\treturn normalizeNativeMetrics(database.metrics?.());\n\t\t},\n\t\tasync close(): Promise<void> {\n\t\t\tclosePromise ??= gate.close(() => database.close());\n\t\t\tawait closePromise;\n\t\t},\n\t};\n}\n\nfunction lastInsertRowIdColumnName(sql: string): string | undefined {\n\tconst match = sql.match(\n\t\t/^\\s*SELECT\\s+last_insert_rowid\\s*\\(\\s*\\)\\s*(?:AS\\s+(\"[^\"]+\"|`[^`]+`|\\[[^\\]]+\\]|\\w+))?\\s*;?\\s*$/i,\n\t);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\n\tconst alias = match[1];\n\tif (!alias) {\n\t\treturn \"last_insert_rowid()\";\n\t}\n\tif (\n\t\t(alias.startsWith('\"') && alias.endsWith('\"')) ||\n\t\t(alias.startsWith(\"`\") && alias.endsWith(\"`\")) ||\n\t\t(alias.startsWith(\"[\") && alias.endsWith(\"]\"))\n\t) {\n\t\treturn alias.slice(1, -1);\n\t}\n\treturn alias;\n}\n","import type { SqliteNativeMetrics } from \"@/common/database/config\";\nimport type { RegistryConfig } from \"./config\";\n\ndeclare const handleBrand: unique symbol;\n\ntype OpaqueHandle<Name extends string> = {\n\treadonly [handleBrand]: Name;\n};\n\nexport type RegistryHandle = OpaqueHandle<\"registry\">;\nexport type ActorFactoryHandle = OpaqueHandle<\"actorFactory\">;\nexport type ActorContextHandle = OpaqueHandle<\"actorContext\">;\nexport type ConnHandle = OpaqueHandle<\"conn\">;\nexport type WebSocketHandle = OpaqueHandle<\"webSocket\">;\nexport type CancellationTokenHandle = OpaqueHandle<\"cancellationToken\">;\n\nexport type RuntimeBytes = Uint8Array;\n\nexport interface RuntimeActorKeySegment {\n\tkind: string;\n\tstringValue?: string;\n\tnumberValue?: number;\n}\n\nexport interface RuntimeHttpRequest {\n\tmethod: string;\n\turi: string;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}\n\nexport interface RuntimeHttpResponse {\n\tstatus?: number;\n\theaders?: Record<string, string>;\n\tbody?: RuntimeBytes;\n}\n\nexport interface RuntimeStateDeltaPayload {\n\tstate?: RuntimeBytes;\n\tconnHibernation: Array<{\n\t\tconnId: string;\n\t\tbytes: RuntimeBytes;\n\t}>;\n\tconnHibernationRemoved: string[];\n}\n\nexport interface RuntimeRequestSaveOpts {\n\timmediate?: boolean;\n\tmaxWaitMs?: number;\n}\n\nexport interface RuntimeInspectorSnapshot {\n\tstateRevision: number;\n\tconnectionsRevision: number;\n\tqueueRevision: number;\n\tactiveConnections: number;\n\tqueueSize: number;\n\tconnectedClients: number;\n}\n\nexport interface RuntimeQueueMessage {\n\tid(): bigint;\n\tname(): string;\n\tbody(): RuntimeBytes;\n\tcreatedAt(): number;\n\tisCompletable(): boolean;\n\tcomplete(response?: RuntimeBytes | undefined | null): Promise<void>;\n}\n\nexport interface RuntimeQueueInspectMessage {\n\tid: number;\n\tname: string;\n\tcreatedAtMs: number;\n}\n\nexport interface RuntimeQueueSendResult {\n\tstatus: string;\n\tresponse?: RuntimeBytes;\n}\n\nexport interface RuntimeQueueNextBatchOptions {\n\tnames?: string[];\n\tcount?: number;\n\ttimeoutMs?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeQueueWaitOptions {\n\ttimeoutMs?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeQueueEnqueueAndWaitOptions {\n\ttimeoutMs?: number;\n}\n\nexport interface RuntimeQueueTryNextBatchOptions {\n\tnames?: string[];\n\tcount?: number;\n\tcompletable?: boolean;\n}\n\nexport interface RuntimeKvListOptions {\n\treverse?: boolean;\n\tlimit?: number;\n}\n\nexport interface RuntimeKvEntry {\n\tkey: RuntimeBytes;\n\tvalue: RuntimeBytes;\n}\n\ntype RuntimeSqlBindNoValues = {\n\tintValue?: never;\n\tfloatValue?: never;\n\ttextValue?: never;\n\tblobValue?: never;\n};\n\nexport type RuntimeSqlBindParam =\n\t| ({ kind: \"null\" } & RuntimeSqlBindNoValues)\n\t| {\n\t\t\tkind: \"int\";\n\t\t\tintValue: number;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"float\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue: number;\n\t\t\ttextValue?: never;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"text\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue: string;\n\t\t\tblobValue?: never;\n\t }\n\t| {\n\t\t\tkind: \"blob\";\n\t\t\tintValue?: never;\n\t\t\tfloatValue?: never;\n\t\t\ttextValue?: never;\n\t\t\tblobValue: RuntimeBytes;\n\t };\n\nexport type RuntimeSqlBindParams = RuntimeSqlBindParam[] | null;\n\nexport interface RuntimeSqlQueryResult {\n\tcolumns: string[];\n\trows: unknown[][];\n}\n\nexport type RuntimeSqlExecResult = RuntimeSqlQueryResult;\n\nexport interface RuntimeSqlExecuteResult extends RuntimeSqlQueryResult {\n\tchanges: number;\n\tlastInsertRowId?: number | null;\n}\n\nexport function normalizeRuntimeSqlExecuteResult(\n\tresult: RuntimeSqlQueryResult & {\n\t\tchanges: number;\n\t\tlastInsertRowId?: number | null;\n\t},\n): RuntimeSqlExecuteResult {\n\treturn result;\n}\n\nexport interface RuntimeSqlRunResult {\n\tchanges: number;\n}\n\nexport interface RuntimeSqlDatabase {\n\texec(sql: string): Promise<RuntimeSqlExecResult>;\n\texecute(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult>;\n\tquery(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult>;\n\trun(\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult>;\n\tmetrics?(): SqliteNativeMetrics | null;\n\ttakeLastKvError?(): string | null;\n\tclose(): Promise<void>;\n}\n\nexport interface RuntimeActorConfig {\n\tname?: string;\n\ticon?: string;\n\thasDatabase?: boolean;\n\tremoteSqlite?: boolean;\n\thasState?: boolean;\n\tcanHibernateWebsocket?: boolean;\n\tstateSaveIntervalMs?: number;\n\tcreateStateTimeoutMs?: number;\n\tonCreateTimeoutMs?: number;\n\tcreateVarsTimeoutMs?: number;\n\tcreateConnStateTimeoutMs?: number;\n\tonBeforeConnectTimeoutMs?: number;\n\tonConnectTimeoutMs?: number;\n\tonMigrateTimeoutMs?: number;\n\tonWakeTimeoutMs?: number;\n\tonBeforeActorStartTimeoutMs?: number;\n\tactionTimeoutMs?: number;\n\tonRequestTimeoutMs?: number;\n\tsleepTimeoutMs?: number;\n\tnoSleep?: boolean;\n\tsleepGracePeriodMs?: number;\n\tconnectionLivenessTimeoutMs?: number;\n\tconnectionLivenessIntervalMs?: number;\n\tmaxQueueSize?: number;\n\tmaxQueueMessageSize?: number;\n\tmaxIncomingMessageSize?: number;\n\tmaxOutgoingMessageSize?: number;\n\tpreloadMaxWorkflowBytes?: number;\n\tpreloadMaxConnectionsBytes?: number;\n\tactions?: Array<{ name: string }>;\n\tinspectorTabs?: Array<RuntimeInspectorTabEntry>;\n}\n\nexport interface RuntimeInspectorTabEntry {\n\tid: string;\n\t/** Required for custom entries; omitted for built-in hides. */\n\tlabel?: string;\n\t/**\n\t * Required for custom entries — absolute path to the source directory.\n\t * Resolved on the TS side before being handed to the runtime.\n\t */\n\tsource?: string;\n\t/** Optional icon id for custom entries. */\n\ticon?: string;\n\t/** Set to true for built-in hide entries. */\n\thidden?: boolean;\n}\n\nexport interface RuntimeServeConfig {\n\tversion: number;\n\tendpoint: string;\n\ttoken?: string;\n\tnamespace: string;\n\tpoolName: string;\n\tengineBinaryPath?: string;\n\tengineHost?: string;\n\tenginePort?: number;\n\thandleInspectorHttpInRuntime?: boolean;\n\tinspectorTestToken?: string;\n\tserverlessBasePath?: string;\n\tserverlessPackageVersion: string;\n\tserverlessClientEndpoint?: string;\n\tserverlessClientNamespace?: string;\n\tserverlessClientToken?: string;\n\tserverlessValidateEndpoint: boolean;\n\tserverlessMaxStartPayloadBytes: number;\n}\n\nexport interface RuntimeServerlessRequest {\n\tmethod: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody: RuntimeBytes;\n}\n\nexport interface RuntimeServerlessResponseHead {\n\tstatus: number;\n\theaders: Record<string, string>;\n}\n\nexport interface RuntimeRegistryRouteResponse {\n\tstatus: number;\n\theaders: Record<string, string>;\n\tbody: RuntimeBytes;\n}\n\nexport type RuntimeServerlessStreamEvent =\n\t| {\n\t\t\tkind: \"chunk\";\n\t\t\tchunk?: RuntimeBytes;\n\t }\n\t| {\n\t\t\tkind: \"end\";\n\t\t\terror?: {\n\t\t\t\tgroup: string;\n\t\t\t\tcode: string;\n\t\t\t\tmessage: string;\n\t\t\t};\n\t };\n\nexport type RuntimeServerlessStreamCallback = (\n\terror: unknown,\n\tevent?: RuntimeServerlessStreamEvent,\n) => unknown;\n\nexport type RuntimeWebSocketEvent =\n\t| {\n\t\t\tkind: \"message\";\n\t\t\tdata: string | RuntimeBytes;\n\t\t\tbinary: boolean;\n\t\t\tmessageIndex?: number;\n\t }\n\t| {\n\t\t\tkind: \"close\";\n\t\t\tcode: number;\n\t\t\treason: string;\n\t\t\twasClean: boolean;\n\t };\n\nexport interface CoreRuntime {\n\treadonly kind: \"napi\" | \"wasm\";\n\n\tcreateRegistry(): RegistryHandle;\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void;\n\tserveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void>;\n\tshutdownRegistry(registry: RegistryHandle): Promise<void>;\n\tregistryActorStopThresholdMs?(\n\t\tregistry: RegistryHandle,\n\t): Promise<number | undefined>;\n\thandleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead>;\n\tregistryHealth?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tregistryMetadata?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tregistryMetrics?(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse>;\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle;\n\n\tcreateCancellationToken(): CancellationTokenHandle;\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean;\n\tcancelCancellationToken(token: CancellationTokenHandle): void;\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void;\n\n\tactorState(ctx: ActorContextHandle): RuntimeBytes;\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void;\n\tactorEndOnStateChange(ctx: ActorContextHandle): void;\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | undefined | null,\n\t): void;\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void;\n\tactorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void>;\n\tactorInspectorSnapshot(ctx: ActorContextHandle): RuntimeInspectorSnapshot;\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes;\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes;\n\tactorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void>;\n\tactorQueueHibernationRemoval(ctx: ActorContextHandle, connId: string): void;\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[];\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[];\n\tactorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void>;\n\tactorId(ctx: ActorContextHandle): string;\n\tactorName(ctx: ActorContextHandle): string;\n\tactorKey(ctx: ActorContextHandle): RuntimeActorKeySegment[];\n\tactorRegion(ctx: ActorContextHandle): string;\n\tactorSleep(ctx: ActorContextHandle): void;\n\tactorDestroy(ctx: ActorContextHandle): void;\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal;\n\tactorConns(ctx: ActorContextHandle): ConnHandle[];\n\tactorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle>;\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorWaitForTrackedShutdownWork(ctx: ActorContextHandle): Promise<boolean>;\n\tactorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void>;\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number;\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void;\n\tactorRegisterTask(ctx: ActorContextHandle, promise: Promise<unknown>): void;\n\tactorRuntimeState(ctx: ActorContextHandle): object;\n\tactorClearRuntimeState(ctx: ActorContextHandle): void;\n\tactorRestartRunHandler(ctx: ActorContextHandle): void;\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number;\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void;\n\n\tactorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null>;\n\tactorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void>;\n\tactorKvDelete(ctx: ActorContextHandle, key: RuntimeBytes): Promise<void>;\n\tactorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void>;\n\tactorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]>;\n\tactorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]>;\n\tactorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>>;\n\tactorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void>;\n\tactorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void>;\n\n\tactorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult>;\n\tactorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult>;\n\tactorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult>;\n\tactorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult>;\n\tactorSqlMetrics(ctx: ActorContextHandle): SqliteNativeMetrics | null;\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null;\n\tactorSqlClose(ctx: ActorContextHandle): Promise<void>;\n\n\tactorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage>;\n\tactorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]>;\n\tactorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage>;\n\tactorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void>;\n\tactorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null>;\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[];\n\tactorQueueMaxSize(ctx: ActorContextHandle): number;\n\tactorQueueInspectMessages(\n\t\tctx: ActorContextHandle,\n\t): Promise<RuntimeQueueInspectMessage[]>;\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void;\n\n\tconnId(conn: ConnHandle): string;\n\tconnParams(conn: ConnHandle): RuntimeBytes;\n\tconnState(conn: ConnHandle): RuntimeBytes;\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void;\n\tconnIsHibernatable(conn: ConnHandle): boolean;\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void;\n\tconnDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void>;\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void;\n\twebSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void>;\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void;\n}\n\nexport interface RuntimeBundle {\n\truntime: CoreRuntime;\n}\n\nexport async function buildServeConfig(\n\tconfig: RegistryConfig,\n\tloadEnginePath: () => Promise<string>,\n\tversion: string,\n): Promise<RuntimeServeConfig> {\n\tif (!config.endpoint) {\n\t\tthrow new Error(\"registry endpoint is required\");\n\t}\n\n\tconst serveConfig: RuntimeServeConfig = {\n\t\tversion: config.envoy.version,\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\tpoolName: config.envoy.poolName,\n\t\thandleInspectorHttpInRuntime: true,\n\t\tserverlessBasePath: config.serverless.basePath,\n\t\tserverlessPackageVersion: version,\n\t\tserverlessClientEndpoint: config.publicEndpoint,\n\t\tserverlessClientNamespace: config.publicNamespace,\n\t\tserverlessClientToken: config.publicToken,\n\t\tserverlessValidateEndpoint: config.validateServerlessEndpoint,\n\t\tserverlessMaxStartPayloadBytes: config.serverless.maxStartPayloadBytes,\n\t};\n\n\tif (config.startEngine) {\n\t\tserveConfig.engineBinaryPath = await loadEnginePath();\n\t\tserveConfig.engineHost = config.engineHost;\n\t\tserveConfig.enginePort = config.enginePort;\n\t}\n\tif (config.test?.enabled) {\n\t\tserveConfig.inspectorTestToken =\n\t\t\tprocess.env._RIVET_TEST_INSPECTOR_TOKEN ?? \"token\";\n\t}\n\n\treturn serveConfig;\n}\n","import type {\n\tActorContext as NativeActorContext,\n\tNapiActorFactory as NativeActorFactory,\n\tCancellationToken as NativeCancellationToken,\n\tConnHandle as NativeConnHandle,\n\tCoreRegistry as NativeCoreRegistry,\n\tWebSocket as NativeWebSocket,\n} from \"@rivetkit/rivetkit-napi\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeBytes,\n\tRuntimeHttpRequest,\n\tRuntimeKvEntry,\n\tRuntimeKvListOptions,\n\tRuntimeQueueEnqueueAndWaitOptions,\n\tRuntimeQueueMessage,\n\tRuntimeQueueNextBatchOptions,\n\tRuntimeQueueTryNextBatchOptions,\n\tRuntimeQueueWaitOptions,\n\tRuntimeRegistryRouteResponse,\n\tRuntimeRequestSaveOpts,\n\tRuntimeServeConfig,\n\tRuntimeServerlessRequest,\n\tRuntimeServerlessResponseHead,\n\tRuntimeServerlessStreamCallback,\n\tRuntimeSqlBindParam,\n\tRuntimeSqlBindParams,\n\tRuntimeSqlExecResult,\n\tRuntimeSqlExecuteResult,\n\tRuntimeSqlQueryResult,\n\tRuntimeSqlRunResult,\n\tRuntimeStateDeltaPayload,\n\tRuntimeWebSocketEvent,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { normalizeRuntimeSqlExecuteResult } from \"./runtime\";\n\ntype NativeBindings = typeof import(\"@rivetkit/rivetkit-napi\");\ntype NapiSqlDatabase = ReturnType<NativeActorContext[\"sql\"]>;\ntype NapiSqlBindParams = Parameters<NapiSqlDatabase[\"execute\"]>[1];\n\nfunction asNativeRegistry(handle: RegistryHandle): NativeCoreRegistry {\n\treturn handle as unknown as NativeCoreRegistry;\n}\n\nfunction asNativeFactory(handle: ActorFactoryHandle): NativeActorFactory {\n\treturn handle as unknown as NativeActorFactory;\n}\n\nfunction asNativeActorContext(handle: ActorContextHandle): NativeActorContext {\n\treturn handle as unknown as NativeActorContext;\n}\n\nfunction asNativeConn(handle: ConnHandle): NativeConnHandle {\n\treturn handle as unknown as NativeConnHandle;\n}\n\nfunction asNativeWebSocket(handle: WebSocketHandle): NativeWebSocket {\n\treturn handle as unknown as NativeWebSocket;\n}\n\nfunction asNativeCancellationToken(\n\thandle: CancellationTokenHandle,\n): NativeCancellationToken {\n\treturn handle as unknown as NativeCancellationToken;\n}\n\nfunction asRegistryHandle(handle: NativeCoreRegistry): RegistryHandle {\n\treturn handle as unknown as RegistryHandle;\n}\n\nfunction asActorFactoryHandle(handle: NativeActorFactory): ActorFactoryHandle {\n\treturn handle as unknown as ActorFactoryHandle;\n}\n\nfunction toNapiSqlBindParam(\n\tparam: RuntimeSqlBindParam,\n): NonNullable<NapiSqlBindParams>[number] {\n\tswitch (param.kind) {\n\t\tcase \"null\":\n\t\t\treturn { kind: \"null\" };\n\t\tcase \"int\":\n\t\t\treturn { kind: \"int\", intValue: param.intValue };\n\t\tcase \"float\":\n\t\t\treturn { kind: \"float\", floatValue: param.floatValue };\n\t\tcase \"text\":\n\t\t\treturn { kind: \"text\", textValue: param.textValue };\n\t\tcase \"blob\":\n\t\t\treturn { kind: \"blob\", blobValue: Buffer.from(param.blobValue) };\n\t}\n}\n\nfunction toNapiSqlBindParams(params?: RuntimeSqlBindParams): NapiSqlBindParams {\n\tif (params == null) {\n\t\treturn params;\n\t}\n\treturn params.map((param) => toNapiSqlBindParam(param));\n}\n\nfunction toNapiBuffer(value: RuntimeBytes): Buffer {\n\treturn Buffer.from(value);\n}\n\nfunction toNapiHttpRequest(\n\trequest?: RuntimeHttpRequest | undefined | null,\n): Parameters<NativeActorContext[\"connectConn\"]>[1] {\n\tif (!request) {\n\t\treturn request;\n\t}\n\treturn {\n\t\t...request,\n\t\tbody: request.body ? toNapiBuffer(request.body) : undefined,\n\t};\n}\n\nfunction toNapiStateDeltaPayload(\n\tpayload: RuntimeStateDeltaPayload,\n): Parameters<NativeActorContext[\"saveState\"]>[0] {\n\treturn {\n\t\t...payload,\n\t\tstate: payload.state ? toNapiBuffer(payload.state) : undefined,\n\t\tconnHibernation: payload.connHibernation.map((conn) => ({\n\t\t\t...conn,\n\t\t\tbytes: toNapiBuffer(conn.bytes),\n\t\t})),\n\t};\n}\n\nfunction toNapiKvEntry(entry: RuntimeKvEntry): {\n\tkey: Buffer;\n\tvalue: Buffer;\n} {\n\treturn {\n\t\tkey: toNapiBuffer(entry.key),\n\t\tvalue: toNapiBuffer(entry.value),\n\t};\n}\n\nfunction toNapiQueueMessage(message: RuntimeQueueMessage): RuntimeQueueMessage {\n\treturn {\n\t\tid: () => message.id(),\n\t\tname: () => message.name(),\n\t\tbody: () => message.body(),\n\t\tcreatedAt: () => message.createdAt(),\n\t\tisCompletable: () => message.isCompletable(),\n\t\tcomplete: async (response?: RuntimeBytes | undefined | null) => {\n\t\t\tawait message.complete(\n\t\t\t\tresponse === null || response === undefined\n\t\t\t\t\t? response\n\t\t\t\t\t: toNapiBuffer(response),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport class NapiCoreRuntime implements CoreRuntime {\n\treadonly kind = \"napi\";\n\n\t#bindings: NativeBindings;\n\t#sql = new WeakMap<NativeActorContext, NapiSqlDatabase>();\n\n\tconstructor(bindings: NativeBindings) {\n\t\tthis.#bindings = bindings;\n\t}\n\n\t#actorSql(ctx: ActorContextHandle): NapiSqlDatabase {\n\t\tconst nativeCtx = asNativeActorContext(ctx);\n\t\tlet database = this.#sql.get(nativeCtx);\n\t\tif (!database) {\n\t\t\tdatabase = nativeCtx.sql();\n\t\t\tthis.#sql.set(nativeCtx, database);\n\t\t}\n\t\treturn database;\n\t}\n\n\tcreateRegistry(): RegistryHandle {\n\t\treturn asRegistryHandle(new this.#bindings.CoreRegistry());\n\t}\n\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void {\n\t\tasNativeRegistry(registry).register(name, asNativeFactory(factory));\n\t}\n\n\tasync serveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void> {\n\t\tawait asNativeRegistry(registry).serve(config);\n\t}\n\n\tasync shutdownRegistry(registry: RegistryHandle): Promise<void> {\n\t\tawait asNativeRegistry(registry).shutdown();\n\t}\n\n\tasync registryActorStopThresholdMs(\n\t\tregistry: RegistryHandle,\n\t): Promise<number | undefined> {\n\t\treturn (\n\t\t\t(await asNativeRegistry(registry).actorStopThresholdMs()) ??\n\t\t\tundefined\n\t\t);\n\t}\n\n\tasync registryHealth(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = await asNativeRegistry(registry).health();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync registryMetadata(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = asNativeRegistry(registry).metadata();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync registryMetrics(\n\t\tregistry: RegistryHandle,\n\t): Promise<RuntimeRegistryRouteResponse> {\n\t\tconst response = asNativeRegistry(registry).metrics();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tbody: response.body,\n\t\t};\n\t}\n\n\tasync handleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead> {\n\t\treturn await asNativeRegistry(registry).handleServerlessRequest(\n\t\t\t{ ...req, body: toNapiBuffer(req.body) },\n\t\t\tonStreamEvent,\n\t\t\tasNativeCancellationToken(cancelToken),\n\t\t\tconfig,\n\t\t);\n\t}\n\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle {\n\t\treturn asActorFactoryHandle(\n\t\t\tnew this.#bindings.NapiActorFactory(callbacks, config),\n\t\t);\n\t}\n\n\tcreateCancellationToken(): CancellationTokenHandle {\n\t\treturn new this.#bindings.CancellationToken() as unknown as CancellationTokenHandle;\n\t}\n\n\tcreateTestActorContext(\n\t\tactorId: string,\n\t\tname: string,\n\t\tregion: string,\n\t): ActorContextHandle {\n\t\treturn new this.#bindings.ActorContext(\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tregion,\n\t\t) as unknown as ActorContextHandle;\n\t}\n\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean {\n\t\treturn asNativeCancellationToken(token).aborted();\n\t}\n\n\tcancelCancellationToken(token: CancellationTokenHandle): void {\n\t\tasNativeCancellationToken(token).cancel();\n\t}\n\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void {\n\t\tasNativeCancellationToken(token).onCancelled(callback);\n\t}\n\n\tactorState(ctx: ActorContextHandle): Buffer {\n\t\treturn asNativeActorContext(ctx).state();\n\t}\n\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).beginOnStateChange();\n\t}\n\n\tactorEndOnStateChange(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).endOnStateChange();\n\t}\n\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | undefined | null,\n\t): void {\n\t\tasNativeActorContext(ctx).setAlarm(timestampMs);\n\t}\n\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void {\n\t\tasNativeActorContext(ctx).requestSave(opts);\n\t}\n\n\tasync actorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).requestSaveAndWait(opts);\n\t}\n\n\tactorInspectorSnapshot(ctx: ActorContextHandle) {\n\t\treturn asNativeActorContext(ctx).inspectorSnapshot();\n\t}\n\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes {\n\t\treturn asNativeActorContext(ctx).decodeInspectorRequest(\n\t\t\ttoNapiBuffer(bytes),\n\t\t\tadvertisedVersion,\n\t\t);\n\t}\n\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes {\n\t\treturn asNativeActorContext(ctx).encodeInspectorResponse(\n\t\t\ttoNapiBuffer(bytes),\n\t\t\ttargetVersion,\n\t\t);\n\t}\n\n\tasync actorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).verifyInspectorAuth(bearerToken);\n\t}\n\n\tactorQueueHibernationRemoval(\n\t\tctx: ActorContextHandle,\n\t\tconnId: string,\n\t): void {\n\t\tasNativeActorContext(ctx).queueHibernationRemoval(connId);\n\t}\n\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[] {\n\t\treturn asNativeActorContext(ctx).takePendingHibernationChanges();\n\t}\n\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn asNativeActorContext(\n\t\t\tctx,\n\t\t).dirtyHibernatableConns() as unknown as ConnHandle[];\n\t}\n\n\tasync actorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).saveState(\n\t\t\ttoNapiStateDeltaPayload(payload),\n\t\t);\n\t}\n\n\tactorId(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).actorId();\n\t}\n\n\tactorName(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).name();\n\t}\n\n\tactorKey(ctx: ActorContextHandle) {\n\t\treturn asNativeActorContext(ctx).key();\n\t}\n\n\tactorRegion(ctx: ActorContextHandle): string {\n\t\treturn asNativeActorContext(ctx).region();\n\t}\n\n\tactorSleep(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).sleep();\n\t}\n\n\tactorDestroy(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).destroy();\n\t}\n\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal {\n\t\treturn asNativeActorContext(ctx).abortSignal();\n\t}\n\n\tactorConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn asNativeActorContext(ctx).conns() as unknown as ConnHandle[];\n\t}\n\n\tasync actorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle> {\n\t\treturn (await asNativeActorContext(ctx).connectConn(\n\t\t\ttoNapiBuffer(params),\n\t\t\ttoNapiHttpRequest(request),\n\t\t)) as unknown as ConnHandle;\n\t}\n\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx).broadcast(name, toNapiBuffer(args));\n\t}\n\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tasNativeActorContext(ctx).waitUntil(promise);\n\t}\n\n\tasync actorWaitForTrackedShutdownWork(\n\t\tctx: ActorContextHandle,\n\t): Promise<boolean> {\n\t\treturn await asNativeActorContext(ctx).waitForTrackedShutdownWork();\n\t}\n\n\tasync actorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).waitForTrackedShutdownWorkUnbounded();\n\t}\n\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tasNativeActorContext(ctx).keepAwake(promise);\n\t}\n\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).beginKeepAwake();\n\t}\n\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void {\n\t\tasNativeActorContext(ctx).endKeepAwake(regionId);\n\t}\n\n\tactorRegisterTask(\n\t\tctx: ActorContextHandle,\n\t\tpromise: Promise<unknown>,\n\t): void {\n\t\tasNativeActorContext(ctx).registerTask(promise);\n\t}\n\n\tactorRuntimeState(ctx: ActorContextHandle): object {\n\t\treturn asNativeActorContext(ctx).runtimeState();\n\t}\n\n\tactorClearRuntimeState(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).clearRuntimeState();\n\t}\n\n\tactorRestartRunHandler(ctx: ActorContextHandle): void {\n\t\tasNativeActorContext(ctx).restartRunHandler();\n\t}\n\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).beginWebsocketCallback();\n\t}\n\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void {\n\t\tasNativeActorContext(ctx).endWebsocketCallback(regionId);\n\t}\n\n\tasync actorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null> {\n\t\treturn await asNativeActorContext(ctx).kv().get(toNapiBuffer(key));\n\t}\n\n\tasync actorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.put(toNapiBuffer(key), toNapiBuffer(value));\n\t}\n\n\tasync actorKvDelete(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx).kv().delete(toNapiBuffer(key));\n\t}\n\n\tasync actorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.deleteRange(toNapiBuffer(start), toNapiBuffer(end));\n\t}\n\n\tasync actorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.listPrefix(toNapiBuffer(prefix), options);\n\t}\n\n\tasync actorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.listRange(toNapiBuffer(start), toNapiBuffer(end), options);\n\t}\n\n\tasync actorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchGet(keys.map(toNapiBuffer));\n\t}\n\n\tasync actorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchPut(entries.map(toNapiKvEntry));\n\t}\n\n\tasync actorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.kv()\n\t\t\t.batchDelete(keys.map(toNapiBuffer));\n\t}\n\n\tasync actorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult> {\n\t\treturn await this.#actorSql(ctx).exec(sql);\n\t}\n\n\tasync actorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult> {\n\t\tconst result = await this.#actorSql(ctx).execute(\n\t\t\tsql,\n\t\t\ttoNapiSqlBindParams(params),\n\t\t);\n\t\treturn normalizeRuntimeSqlExecuteResult(result);\n\t}\n\n\tasync actorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult> {\n\t\treturn await this.#actorSql(ctx).query(\n\t\t\tsql,\n\t\t\ttoNapiSqlBindParams(params),\n\t\t);\n\t}\n\n\tasync actorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult> {\n\t\treturn await this.#actorSql(ctx).run(sql, toNapiSqlBindParams(params));\n\t}\n\n\tactorSqlMetrics(ctx: ActorContextHandle) {\n\t\treturn this.#actorSql(ctx).metrics?.() ?? null;\n\t}\n\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null {\n\t\treturn this.#actorSql(ctx).takeLastKvError?.() ?? null;\n\t}\n\n\tasync actorSqlClose(ctx: ActorContextHandle): Promise<void> {\n\t\tconst nativeCtx = asNativeActorContext(ctx);\n\t\tconst database = this.#sql.get(nativeCtx);\n\t\tif (!database) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sql.delete(nativeCtx);\n\t\tawait database.close();\n\t}\n\n\tasync actorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage> {\n\t\treturn toNapiQueueMessage(\n\t\t\tawait asNativeActorContext(ctx)\n\t\t\t\t.queue()\n\t\t\t\t.send(name, toNapiBuffer(body)),\n\t\t);\n\t}\n\n\tasync actorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]> {\n\t\tconst messages = await asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.nextBatch(\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t\treturn messages.map(toNapiQueueMessage);\n\t}\n\n\tasync actorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage> {\n\t\treturn toNapiQueueMessage(\n\t\t\tawait asNativeActorContext(ctx)\n\t\t\t\t.queue()\n\t\t\t\t.waitForNames(\n\t\t\t\t\tnames,\n\t\t\t\t\toptions,\n\t\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t\t),\n\t\t);\n\t}\n\n\tasync actorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.waitForNamesAvailable(\n\t\t\t\tnames,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t}\n\n\tasync actorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null> {\n\t\treturn await asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.enqueueAndWait(\n\t\t\t\tname,\n\t\t\t\ttoNapiBuffer(body),\n\t\t\t\toptions,\n\t\t\t\tsignal ? asNativeCancellationToken(signal) : signal,\n\t\t\t);\n\t}\n\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[] {\n\t\treturn asNativeActorContext(ctx)\n\t\t\t.queue()\n\t\t\t.tryNextBatch(options)\n\t\t\t.map(toNapiQueueMessage);\n\t}\n\n\tactorQueueMaxSize(ctx: ActorContextHandle): number {\n\t\treturn asNativeActorContext(ctx).queue().maxSize();\n\t}\n\n\tasync actorQueueInspectMessages(ctx: ActorContextHandle) {\n\t\treturn await asNativeActorContext(ctx).queue().inspectMessages();\n\t}\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx)\n\t\t\t.schedule()\n\t\t\t.after(durationMs, actionName, toNapiBuffer(args));\n\t}\n\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tasNativeActorContext(ctx)\n\t\t\t.schedule()\n\t\t\t.at(timestampMs, actionName, toNapiBuffer(args));\n\t}\n\n\tconnId(conn: ConnHandle): string {\n\t\treturn asNativeConn(conn).id();\n\t}\n\n\tconnParams(conn: ConnHandle): RuntimeBytes {\n\t\treturn asNativeConn(conn).params();\n\t}\n\n\tconnState(conn: ConnHandle): RuntimeBytes {\n\t\treturn asNativeConn(conn).state();\n\t}\n\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void {\n\t\tasNativeConn(conn).setState(toNapiBuffer(state));\n\t}\n\n\tconnIsHibernatable(conn: ConnHandle): boolean {\n\t\treturn asNativeConn(conn).isHibernatable();\n\t}\n\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void {\n\t\tasNativeConn(conn).send(name, toNapiBuffer(args));\n\t}\n\n\tasync connDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeConn(conn).disconnect(reason);\n\t}\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void {\n\t\tasNativeWebSocket(ws).send(toNapiBuffer(data), binary);\n\t}\n\n\tasync webSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait asNativeWebSocket(ws).close(code, reason);\n\t}\n\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void {\n\t\tasNativeWebSocket(ws).setEventCallback(callback);\n\t}\n}\n\nexport type NapiBindings = NativeBindings;\n\nexport async function loadNapiRuntime(): Promise<{\n\tbindings: NapiBindings;\n\truntime: NapiCoreRuntime;\n}> {\n\tconst bindings = await import([\"@rivetkit\", \"rivetkit-napi\"].join(\"/\"));\n\treturn {\n\t\tbindings,\n\t\truntime: new NapiCoreRuntime(bindings),\n\t};\n}\n","import { RivetError } from \"@/actor/errors\";\nimport {\n\ttype EventSchemaConfig,\n\tisEventSchemaDefinition,\n\tisQueueSchemaDefinition,\n\tisStandardSchema,\n\ttype PrimitiveSchema,\n\ttype QueueSchemaConfig,\n\tvalidateSchemaSync,\n} from \"@/actor/schema\";\n\nconst CONN_PARAMS_KEY = \"__conn_params__\";\n\nexport interface NativeValidationConfig {\n\tactionInputSchemas?: Record<string, PrimitiveSchema>;\n\tconnParamsSchema?: PrimitiveSchema;\n\tevents?: EventSchemaConfig;\n\tqueues?: QueueSchemaConfig;\n}\n\nexport function validateActionArgs(\n\tschemas: NativeValidationConfig[\"actionInputSchemas\"],\n\tname: string,\n\targs: unknown[],\n): unknown[] {\n\tif (!schemas?.[name]) {\n\t\treturn args;\n\t}\n\n\tconst result = validateSchemaSync(schemas as EventSchemaConfig, name, args);\n\tif (!result.success) {\n\t\tthrow validationError(`action \\`${name}\\` arguments`, result.issues);\n\t}\n\treturn Array.isArray(result.data) ? result.data : [result.data];\n}\n\nexport function validateConnParams(\n\tschema: NativeValidationConfig[\"connParamsSchema\"],\n\tparams: unknown,\n): unknown {\n\tif (!schema) {\n\t\treturn params;\n\t}\n\n\tconst result = validateSchemaSync(\n\t\t{ [CONN_PARAMS_KEY]: schema } as EventSchemaConfig,\n\t\tCONN_PARAMS_KEY,\n\t\tparams,\n\t);\n\tif (!result.success) {\n\t\tthrow validationError(\"connection params\", result.issues);\n\t}\n\treturn result.data;\n}\n\nexport function validateEventArgs(\n\tschemas: NativeValidationConfig[\"events\"],\n\tname: string,\n\targs: unknown[],\n): unknown[] {\n\tif (!schemas?.[name]) {\n\t\treturn args;\n\t}\n\n\tconst payload = args.length <= 1 ? args[0] : args;\n\tconst result = validateSchemaSync(schemas, name, payload);\n\tif (!result.success) {\n\t\tthrow validationError(`event \\`${name}\\` payload`, result.issues);\n\t}\n\treturn args.length <= 1\n\t\t? [result.data]\n\t\t: Array.isArray(result.data)\n\t\t\t? result.data\n\t\t\t: [result.data];\n}\n\nexport function validateQueueBody(\n\tschemas: NativeValidationConfig[\"queues\"],\n\tname: string,\n\tbody: unknown,\n): unknown {\n\tif (!schemas?.[name]) {\n\t\treturn body;\n\t}\n\n\tconst result = validateSchemaSync(schemas, name, body);\n\tif (!result.success) {\n\t\tthrow validationError(`queue \\`${name}\\` message`, result.issues);\n\t}\n\treturn result.data;\n}\n\nexport function validateQueueComplete(\n\tschemas: NativeValidationConfig[\"queues\"],\n\tname: string,\n\tresponse: unknown,\n): unknown {\n\tconst schema = schemas?.[name];\n\tif (!schema) {\n\t\treturn response;\n\t}\n\n\tlet completeSchema: PrimitiveSchema | undefined;\n\tif (isQueueSchemaDefinition(schema)) {\n\t\tcompleteSchema = schema.complete;\n\t} else if (\n\t\t!isStandardSchema(schema) &&\n\t\t!isEventSchemaDefinition(schema) &&\n\t\ttypeof schema === \"object\" &&\n\t\tschema !== null &&\n\t\t\"complete\" in schema\n\t) {\n\t\tconst candidate = (schema as { complete?: unknown }).complete;\n\t\tif (candidate !== undefined) {\n\t\t\tcompleteSchema = candidate as PrimitiveSchema;\n\t\t}\n\t}\n\n\tif (!completeSchema) {\n\t\treturn response;\n\t}\n\n\tconst result = validateSchemaSync(\n\t\t{ [name]: completeSchema } as EventSchemaConfig,\n\t\tname,\n\t\tresponse,\n\t);\n\tif (!result.success) {\n\t\tthrow validationError(\n\t\t\t`queue \\`${name}\\` completion response`,\n\t\t\tresult.issues,\n\t\t);\n\t}\n\treturn result.data;\n}\n\nfunction validationError(target: string, issues: unknown[]): RivetError {\n\treturn new RivetError(\"actor\", \"validation_error\", `Invalid ${target}`, {\n\t\tpublic: true,\n\t\tmetadata: { issues },\n\t});\n}\n","import type {\n\tActorContext as WasmActorContext,\n\tActorFactory as WasmActorFactory,\n\tCancellationToken as WasmCancellationToken,\n\tConnHandle as WasmConnHandle,\n\tCoreRegistry as WasmCoreRegistry,\n\tWebSocketHandle as WasmWebSocketHandle,\n} from \"@rivetkit/rivetkit-wasm\";\nimport { decodeBridgeRivetError, RivetError } from \"@/actor/errors\";\nimport type {\n\tWasmRuntimeBindings,\n\tWasmRuntimeConfig,\n\tWasmRuntimeInitInput,\n} from \"./config\";\nimport type {\n\tActorContextHandle,\n\tActorFactoryHandle,\n\tCancellationTokenHandle,\n\tConnHandle,\n\tCoreRuntime,\n\tRegistryHandle,\n\tRuntimeActorConfig,\n\tRuntimeActorKeySegment,\n\tRuntimeBytes,\n\tRuntimeHttpRequest,\n\tRuntimeInspectorSnapshot,\n\tRuntimeKvEntry,\n\tRuntimeKvListOptions,\n\tRuntimeQueueEnqueueAndWaitOptions,\n\tRuntimeQueueInspectMessage,\n\tRuntimeQueueMessage,\n\tRuntimeQueueNextBatchOptions,\n\tRuntimeQueueTryNextBatchOptions,\n\tRuntimeQueueWaitOptions,\n\tRuntimeRegistryRouteResponse,\n\tRuntimeRequestSaveOpts,\n\tRuntimeServeConfig,\n\tRuntimeServerlessRequest,\n\tRuntimeServerlessResponseHead,\n\tRuntimeServerlessStreamCallback,\n\tRuntimeSqlBindParams,\n\tRuntimeSqlDatabase,\n\tRuntimeSqlExecResult,\n\tRuntimeSqlExecuteResult,\n\tRuntimeSqlQueryResult,\n\tRuntimeSqlRunResult,\n\tRuntimeStateDeltaPayload,\n\tRuntimeWebSocketEvent,\n\tWebSocketHandle,\n} from \"./runtime\";\nimport { normalizeRuntimeSqlExecuteResult } from \"./runtime\";\n\ntype WasmBindings = WasmRuntimeBindings;\nexport type WasmInitInput = WasmRuntimeInitInput;\ntype AnyFunction = (...args: unknown[]) => unknown;\ntype WasmRuntimeLoadConfig = Pick<WasmRuntimeConfig, \"bindings\" | \"initInput\">;\n\nfunction asWasmRegistry(handle: RegistryHandle): WasmCoreRegistry {\n\treturn handle as unknown as WasmCoreRegistry;\n}\n\nfunction asWasmFactory(handle: ActorFactoryHandle): WasmActorFactory {\n\treturn handle as unknown as WasmActorFactory;\n}\n\nfunction asWasmActorContext(handle: ActorContextHandle): WasmActorContext {\n\treturn handle as unknown as WasmActorContext;\n}\n\nfunction asWasmConn(handle: ConnHandle): WasmConnHandle {\n\treturn handle as unknown as WasmConnHandle;\n}\n\nfunction asWasmWebSocket(handle: WebSocketHandle): WasmWebSocketHandle {\n\treturn handle as unknown as WasmWebSocketHandle;\n}\n\nfunction asWasmCancellationToken(\n\thandle: CancellationTokenHandle,\n): WasmCancellationToken {\n\treturn handle as unknown as WasmCancellationToken;\n}\n\nfunction asRegistryHandle(handle: WasmCoreRegistry): RegistryHandle {\n\treturn handle as unknown as RegistryHandle;\n}\n\nfunction asActorFactoryHandle(handle: WasmActorFactory): ActorFactoryHandle {\n\treturn handle as unknown as ActorFactoryHandle;\n}\n\nfunction toBytes(value: RuntimeBytes | null | undefined): RuntimeBytes {\n\treturn value ?? new Uint8Array(0);\n}\n\nfunction optionalBytes(\n\tvalue: RuntimeBytes | null | undefined,\n): RuntimeBytes | null {\n\tif (value === null || value === undefined) {\n\t\treturn null;\n\t}\n\treturn toBytes(value);\n}\n\nfunction optionalWasmNumber(\n\tvalue: number | bigint | null | undefined,\n): number | null | undefined {\n\tif (value === null || value === undefined) {\n\t\treturn value;\n\t}\n\treturn typeof value === \"bigint\" ? Number(value) : value;\n}\n\nfunction wasmNumber(value: number | bigint): number {\n\treturn typeof value === \"bigint\" ? Number(value) : value;\n}\n\nfunction normalizeKvEntry(entry: RuntimeKvEntry): RuntimeKvEntry {\n\treturn {\n\t\tkey: toBytes(entry.key),\n\t\tvalue: toBytes(entry.value),\n\t};\n}\n\nfunction normalizeQueueMessage(\n\tmessage: RuntimeQueueMessage,\n): RuntimeQueueMessage {\n\treturn {\n\t\tid: () => message.id(),\n\t\tname: () => message.name(),\n\t\tbody: () => toBytes(message.body()),\n\t\tcreatedAt: () => message.createdAt(),\n\t\tisCompletable: () => message.isCompletable(),\n\t\tcomplete: async (response?: RuntimeBytes | undefined | null) => {\n\t\t\tawait callWasm(() => message.complete(response));\n\t\t},\n\t};\n}\n\nfunction normalizeWasmBridgeError(error: unknown): unknown {\n\tif (typeof error === \"string\") {\n\t\treturn decodeBridgeRivetError(error) ?? error;\n\t}\n\n\tif (error instanceof Error) {\n\t\tconst bridged = decodeBridgeRivetError(error.message);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\tif (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"reason\" in error &&\n\t\ttypeof error.reason === \"string\"\n\t) {\n\t\tconst bridged = decodeBridgeRivetError(error.reason);\n\t\tif (bridged) {\n\t\t\treturn bridged;\n\t\t}\n\t}\n\n\treturn error;\n}\n\nasync function callWasm<T>(invoke: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn await invoke();\n\t} catch (error) {\n\t\tthrow normalizeWasmBridgeError(error);\n\t}\n}\n\nfunction callWasmSync<T>(invoke: () => T): T {\n\ttry {\n\t\treturn invoke();\n\t} catch (error) {\n\t\tthrow normalizeWasmBridgeError(error);\n\t}\n}\n\nfunction unsupportedWasmMethod(method: string): never {\n\tthrow new RivetError(\n\t\t\"runtime\",\n\t\t\"unsupported\",\n\t\t`Unsupported wasm runtime method: ${method}`,\n\t\t{\n\t\t\tmetadata: {\n\t\t\t\truntime: \"wasm\",\n\t\t\t\tmethod,\n\t\t\t},\n\t\t},\n\t);\n}\n\nfunction method<T extends AnyFunction>(target: unknown, name: string): T {\n\tif (\n\t\ttypeof target === \"object\" &&\n\t\ttarget !== null &&\n\t\tname in target &&\n\t\ttypeof target[name as keyof typeof target] === \"function\"\n\t) {\n\t\treturn target[name as keyof typeof target] as T;\n\t}\n\treturn unsupportedWasmMethod(name);\n}\n\nfunction callHandle<T>(handle: unknown, name: string, ...args: unknown[]): T {\n\treturn callWasmSync(() => method(handle, name).apply(handle, args) as T);\n}\n\nasync function callHandleAsync<T>(\n\thandle: unknown,\n\tname: string,\n\t...args: unknown[]\n): Promise<T> {\n\treturn await callWasm(\n\t\tasync () => (await method(handle, name).apply(handle, args)) as T,\n\t);\n}\n\nfunction childHandle<T>(handle: unknown, name: string): T {\n\treturn callHandle<T>(handle, name);\n}\n\nexport class WasmCoreRuntime implements CoreRuntime {\n\treadonly kind = \"wasm\";\n\n\t#bindings: WasmBindings;\n\t#sql = new WeakMap<WasmActorContext, RuntimeSqlDatabase>();\n\n\tconstructor(bindings: WasmBindings) {\n\t\tthis.#bindings = bindings;\n\t}\n\n\t#actorSql(ctx: ActorContextHandle): RuntimeSqlDatabase {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tlet database = this.#sql.get(wasmCtx);\n\t\tif (!database) {\n\t\t\tdatabase = callHandle<RuntimeSqlDatabase>(wasmCtx, \"sql\");\n\t\t\tthis.#sql.set(wasmCtx, database);\n\t\t}\n\t\treturn database;\n\t}\n\n\tcreateRegistry(): RegistryHandle {\n\t\treturn callWasmSync(() =>\n\t\t\tasRegistryHandle(new this.#bindings.CoreRegistry()),\n\t\t);\n\t}\n\n\tregisterActor(\n\t\tregistry: RegistryHandle,\n\t\tname: string,\n\t\tfactory: ActorFactoryHandle,\n\t): void {\n\t\tcallWasmSync(() =>\n\t\t\tasWasmRegistry(registry).register(name, asWasmFactory(factory)),\n\t\t);\n\t}\n\n\tasync serveRegistry(\n\t\tregistry: RegistryHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<void> {\n\t\tawait callWasm(() => asWasmRegistry(registry).serve(config));\n\t}\n\n\tasync shutdownRegistry(registry: RegistryHandle): Promise<void> {\n\t\tawait callWasm(() => asWasmRegistry(registry).shutdown());\n\t}\n\n\tasync registryHealth(): Promise<RuntimeRegistryRouteResponse> {\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tbody: new TextEncoder().encode(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\truntime: \"rivetkit\",\n\t\t\t\t\tversion: \"wasm\",\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\t}\n\n\tasync handleServerlessRequest(\n\t\tregistry: RegistryHandle,\n\t\treq: RuntimeServerlessRequest,\n\t\tonStreamEvent: RuntimeServerlessStreamCallback,\n\t\tcancelToken: CancellationTokenHandle,\n\t\tconfig: RuntimeServeConfig,\n\t): Promise<RuntimeServerlessResponseHead> {\n\t\treturn await callHandleAsync<RuntimeServerlessResponseHead>(\n\t\t\tasWasmRegistry(registry),\n\t\t\t\"handleServerlessRequest\",\n\t\t\treq,\n\t\t\tonStreamEvent,\n\t\t\tasWasmCancellationToken(cancelToken),\n\t\t\tconfig,\n\t\t);\n\t}\n\n\tcreateActorFactory(\n\t\tcallbacks: object,\n\t\tconfig?: RuntimeActorConfig | undefined | null,\n\t): ActorFactoryHandle {\n\t\treturn callWasmSync(() =>\n\t\t\tasActorFactoryHandle(\n\t\t\t\tnew this.#bindings.ActorFactory(callbacks, config),\n\t\t\t),\n\t\t);\n\t}\n\n\tcreateCancellationToken(): CancellationTokenHandle {\n\t\treturn callWasmSync(\n\t\t\t() =>\n\t\t\t\tnew this.#bindings.CancellationToken() as unknown as CancellationTokenHandle,\n\t\t);\n\t}\n\n\tcancellationTokenAborted(token: CancellationTokenHandle): boolean {\n\t\treturn callWasmSync(() => asWasmCancellationToken(token).aborted());\n\t}\n\n\tcancelCancellationToken(token: CancellationTokenHandle): void {\n\t\tcallWasmSync(() => asWasmCancellationToken(token).cancel());\n\t}\n\n\tonCancellationTokenCancelled(\n\t\ttoken: CancellationTokenHandle,\n\t\tcallback: (...args: unknown[]) => unknown,\n\t): void {\n\t\tcallWasmSync(() =>\n\t\t\tasWasmCancellationToken(token).onCancelled(callback),\n\t\t);\n\t}\n\n\tactorState(ctx: ActorContextHandle): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"state\",\n\t\t\t),\n\t\t);\n\t}\n\n\tactorBeginOnStateChange(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"beginOnStateChange\");\n\t}\n\n\tactorEndOnStateChange(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endOnStateChange\");\n\t}\n\n\tactorSetAlarm(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs?: number | bigint | undefined | null,\n\t): void {\n\t\tcallHandle(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"setAlarm\",\n\t\t\toptionalWasmNumber(timestampMs),\n\t\t);\n\t}\n\n\tactorRequestSave(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"requestSave\", opts);\n\t}\n\n\tasync actorRequestSaveAndWait(\n\t\tctx: ActorContextHandle,\n\t\topts?: RuntimeRequestSaveOpts | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"requestSaveAndWait\",\n\t\t\topts,\n\t\t);\n\t}\n\n\tactorInspectorSnapshot(ctx: ActorContextHandle): RuntimeInspectorSnapshot {\n\t\treturn callHandle(asWasmActorContext(ctx), \"inspectorSnapshot\");\n\t}\n\n\tactorDecodeInspectorRequest(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\tadvertisedVersion: number,\n\t): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"decodeInspectorRequest\",\n\t\t\t\tbytes,\n\t\t\t\tadvertisedVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tactorEncodeInspectorResponse(\n\t\tctx: ActorContextHandle,\n\t\tbytes: RuntimeBytes,\n\t\ttargetVersion: number,\n\t): RuntimeBytes {\n\t\treturn toBytes(\n\t\t\tcallHandle<RuntimeBytes | Uint8Array>(\n\t\t\t\tasWasmActorContext(ctx),\n\t\t\t\t\"encodeInspectorResponse\",\n\t\t\t\tbytes,\n\t\t\t\ttargetVersion,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync actorVerifyInspectorAuth(\n\t\tctx: ActorContextHandle,\n\t\tbearerToken?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"verifyInspectorAuth\",\n\t\t\tbearerToken,\n\t\t);\n\t}\n\n\tactorQueueHibernationRemoval(\n\t\tctx: ActorContextHandle,\n\t\tconnId: string,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"queueHibernationRemoval\", connId);\n\t}\n\n\tactorTakePendingHibernationChanges(ctx: ActorContextHandle): string[] {\n\t\treturn callHandle(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"takePendingHibernationChanges\",\n\t\t);\n\t}\n\n\tactorDirtyHibernatableConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"dirtyHibernatableConns\");\n\t}\n\n\tasync actorSaveState(\n\t\tctx: ActorContextHandle,\n\t\tpayload: RuntimeStateDeltaPayload,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmActorContext(ctx), \"saveState\", payload);\n\t}\n\n\tactorId(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"actorId\");\n\t}\n\n\tactorName(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"name\");\n\t}\n\n\tactorKey(ctx: ActorContextHandle): RuntimeActorKeySegment[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"key\");\n\t}\n\n\tactorRegion(ctx: ActorContextHandle): string {\n\t\treturn callHandle(asWasmActorContext(ctx), \"region\");\n\t}\n\n\tactorSleep(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"sleep\");\n\t}\n\n\tactorDestroy(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"destroy\");\n\t}\n\n\tactorAbortSignal(ctx: ActorContextHandle): AbortSignal {\n\t\treturn callHandle(asWasmActorContext(ctx), \"abortSignal\");\n\t}\n\n\tactorConns(ctx: ActorContextHandle): ConnHandle[] {\n\t\treturn callHandle(asWasmActorContext(ctx), \"conns\");\n\t}\n\n\tasync actorConnectConn(\n\t\tctx: ActorContextHandle,\n\t\tparams: RuntimeBytes,\n\t\trequest?: RuntimeHttpRequest | undefined | null,\n\t): Promise<ConnHandle> {\n\t\treturn await callHandleAsync(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"connectConn\",\n\t\t\tparams,\n\t\t\trequest,\n\t\t);\n\t}\n\n\tactorBroadcast(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"broadcast\", name, args);\n\t}\n\n\tactorWaitUntil(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"waitUntil\", promise);\n\t}\n\n\tasync actorWaitForTrackedShutdownWork(\n\t\tctx: ActorContextHandle,\n\t): Promise<boolean> {\n\t\treturn await callHandle<Promise<boolean>>(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"waitForTrackedShutdownWork\",\n\t\t);\n\t}\n\n\tasync actorWaitForTrackedShutdownWorkUnbounded(\n\t\tctx: ActorContextHandle,\n\t): Promise<void> {\n\t\tawait callHandle<Promise<void>>(\n\t\t\tasWasmActorContext(ctx),\n\t\t\t\"waitForTrackedShutdownWorkUnbounded\",\n\t\t);\n\t}\n\n\tactorKeepAwake(ctx: ActorContextHandle, promise: Promise<unknown>): void {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tconst regionId = callHandle<number>(wasmCtx, \"beginKeepAwake\");\n\t\tconst trackedPromise = Promise.resolve(promise)\n\t\t\t.finally(() => {\n\t\t\t\tcallHandle(wasmCtx, \"endKeepAwake\", regionId);\n\t\t\t})\n\t\t\t.then(() => null);\n\t\tcallHandle(wasmCtx, \"registerTask\", trackedPromise);\n\t}\n\n\tactorBeginKeepAwake(ctx: ActorContextHandle): number {\n\t\treturn callHandle<number>(asWasmActorContext(ctx), \"beginKeepAwake\");\n\t}\n\n\tactorEndKeepAwake(ctx: ActorContextHandle, regionId: number): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endKeepAwake\", regionId);\n\t}\n\n\tactorRegisterTask(\n\t\tctx: ActorContextHandle,\n\t\tpromise: Promise<unknown>,\n\t): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"registerTask\", promise);\n\t}\n\n\tactorRuntimeState(ctx: ActorContextHandle): object {\n\t\treturn callHandle(asWasmActorContext(ctx), \"runtimeState\");\n\t}\n\n\tactorClearRuntimeState(ctx: ActorContextHandle): void {\n\t\tconst runtimeState = this.actorRuntimeState(ctx);\n\t\tfor (const key of Object.keys(runtimeState)) {\n\t\t\tdelete (runtimeState as Record<string, unknown>)[key];\n\t\t}\n\t}\n\n\tactorRestartRunHandler(ctx: ActorContextHandle): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"restartRunHandler\");\n\t}\n\n\tactorBeginWebsocketCallback(ctx: ActorContextHandle): number {\n\t\treturn callHandle(asWasmActorContext(ctx), \"beginWebsocketCallback\");\n\t}\n\n\tactorEndWebsocketCallback(ctx: ActorContextHandle, regionId: number): void {\n\t\tcallHandle(asWasmActorContext(ctx), \"endWebsocketCallback\", regionId);\n\t}\n\n\tasync actorKvGet(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<RuntimeBytes | null> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\treturn optionalBytes(await callHandleAsync(kv, \"get\", key));\n\t}\n\n\tasync actorKvPut(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t\tvalue: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"put\", key, value);\n\t}\n\n\tasync actorKvDelete(\n\t\tctx: ActorContextHandle,\n\t\tkey: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"delete\", key);\n\t}\n\n\tasync actorKvDeleteRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"deleteRange\", start, end);\n\t}\n\n\tasync actorKvListPrefix(\n\t\tctx: ActorContextHandle,\n\t\tprefix: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst entries = await callHandleAsync<RuntimeKvEntry[]>(\n\t\t\tkv,\n\t\t\t\"listPrefix\",\n\t\t\tprefix,\n\t\t\toptions,\n\t\t);\n\t\treturn entries.map(normalizeKvEntry);\n\t}\n\n\tasync actorKvListRange(\n\t\tctx: ActorContextHandle,\n\t\tstart: RuntimeBytes,\n\t\tend: RuntimeBytes,\n\t\toptions?: RuntimeKvListOptions | undefined | null,\n\t): Promise<RuntimeKvEntry[]> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst entries = await callHandleAsync<RuntimeKvEntry[]>(\n\t\t\tkv,\n\t\t\t\"listRange\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\toptions,\n\t\t);\n\t\treturn entries.map(normalizeKvEntry);\n\t}\n\n\tasync actorKvBatchGet(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<Array<RuntimeBytes | undefined | null>> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tconst values = await callHandleAsync<\n\t\t\tArray<RuntimeBytes | Uint8Array | null | undefined>\n\t\t>(kv, \"batchGet\", keys);\n\t\treturn values.map((value) =>\n\t\t\tvalue === undefined ? undefined : optionalBytes(value),\n\t\t);\n\t}\n\n\tasync actorKvBatchPut(\n\t\tctx: ActorContextHandle,\n\t\tentries: RuntimeKvEntry[],\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"batchPut\", entries);\n\t}\n\n\tasync actorKvBatchDelete(\n\t\tctx: ActorContextHandle,\n\t\tkeys: RuntimeBytes[],\n\t): Promise<void> {\n\t\tconst kv = childHandle(asWasmActorContext(ctx), \"kv\");\n\t\tawait callHandleAsync(kv, \"batchDelete\", keys);\n\t}\n\n\tasync actorSqlExec(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t): Promise<RuntimeSqlExecResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).exec(sql));\n\t}\n\n\tasync actorSqlExecute(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlExecuteResult> {\n\t\tconst result = await callWasm(() =>\n\t\t\tthis.#actorSql(ctx).execute(sql, params),\n\t\t);\n\t\treturn normalizeRuntimeSqlExecuteResult(result);\n\t}\n\n\tasync actorSqlQuery(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlQueryResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).query(sql, params));\n\t}\n\n\tasync actorSqlRun(\n\t\tctx: ActorContextHandle,\n\t\tsql: string,\n\t\tparams?: RuntimeSqlBindParams,\n\t): Promise<RuntimeSqlRunResult> {\n\t\treturn await callWasm(() => this.#actorSql(ctx).run(sql, params));\n\t}\n\n\tactorSqlMetrics(ctx: ActorContextHandle) {\n\t\treturn this.#actorSql(ctx).metrics?.() ?? null;\n\t}\n\n\tactorSqlTakeLastKvError(ctx: ActorContextHandle): string | null {\n\t\treturn this.#actorSql(ctx).takeLastKvError?.() ?? null;\n\t}\n\n\tasync actorSqlClose(ctx: ActorContextHandle): Promise<void> {\n\t\tconst wasmCtx = asWasmActorContext(ctx);\n\t\tconst database = this.#sql.get(wasmCtx);\n\t\tif (!database) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sql.delete(wasmCtx);\n\t\tawait callWasm(() => database.close());\n\t}\n\n\tasync actorQueueSend(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t): Promise<RuntimeQueueMessage> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn normalizeQueueMessage(\n\t\t\tawait callHandleAsync(queue, \"send\", name, body),\n\t\t);\n\t}\n\n\tasync actorQueueNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueNextBatchOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage[]> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\tconst messages = await callHandleAsync<RuntimeQueueMessage[]>(\n\t\t\tqueue,\n\t\t\t\"nextBatch\",\n\t\t\toptions,\n\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t);\n\t\treturn messages.map(normalizeQueueMessage);\n\t}\n\n\tasync actorQueueWaitForNames(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeQueueMessage> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn normalizeQueueMessage(\n\t\t\tawait callHandleAsync(\n\t\t\t\tqueue,\n\t\t\t\t\"waitForNames\",\n\t\t\t\tnames,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync actorQueueWaitForNamesAvailable(\n\t\tctx: ActorContextHandle,\n\t\tnames: string[],\n\t\toptions?: RuntimeQueueWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<void> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\tawait callHandleAsync(\n\t\t\tqueue,\n\t\t\t\"waitForNamesAvailable\",\n\t\t\tnames,\n\t\t\toptions,\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync actorQueueEnqueueAndWait(\n\t\tctx: ActorContextHandle,\n\t\tname: string,\n\t\tbody: RuntimeBytes,\n\t\toptions?: RuntimeQueueEnqueueAndWaitOptions | undefined | null,\n\t\tsignal?: CancellationTokenHandle | undefined | null,\n\t): Promise<RuntimeBytes | null> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn optionalBytes(\n\t\t\tawait callHandleAsync(\n\t\t\t\tqueue,\n\t\t\t\t\"enqueueAndWait\",\n\t\t\t\tname,\n\t\t\t\tbody,\n\t\t\t\toptions,\n\t\t\t\tsignal ? asWasmCancellationToken(signal) : signal,\n\t\t\t),\n\t\t);\n\t}\n\n\tactorQueueTryNextBatch(\n\t\tctx: ActorContextHandle,\n\t\toptions?: RuntimeQueueTryNextBatchOptions | undefined | null,\n\t): RuntimeQueueMessage[] {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn callHandle<RuntimeQueueMessage[]>(\n\t\t\tqueue,\n\t\t\t\"tryNextBatch\",\n\t\t\toptions,\n\t\t).map(normalizeQueueMessage);\n\t}\n\n\tactorQueueMaxSize(ctx: ActorContextHandle): number {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn callHandle(queue, \"maxSize\");\n\t}\n\n\tasync actorQueueInspectMessages(\n\t\tctx: ActorContextHandle,\n\t): Promise<RuntimeQueueInspectMessage[]> {\n\t\tconst queue = childHandle(asWasmActorContext(ctx), \"queue\");\n\t\treturn await callHandleAsync(queue, \"inspectMessages\");\n\t}\n\n\tactorScheduleAfter(\n\t\tctx: ActorContextHandle,\n\t\tdurationMs: number | bigint,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tconst schedule = childHandle(asWasmActorContext(ctx), \"schedule\");\n\t\tcallHandle(schedule, \"after\", wasmNumber(durationMs), actionName, args);\n\t}\n\n\tactorScheduleAt(\n\t\tctx: ActorContextHandle,\n\t\ttimestampMs: number | bigint,\n\t\tactionName: string,\n\t\targs: RuntimeBytes,\n\t): void {\n\t\tconst schedule = childHandle(asWasmActorContext(ctx), \"schedule\");\n\t\tcallHandle(schedule, \"at\", wasmNumber(timestampMs), actionName, args);\n\t}\n\n\tconnId(conn: ConnHandle): string {\n\t\treturn callHandle(asWasmConn(conn), \"id\");\n\t}\n\n\tconnParams(conn: ConnHandle): RuntimeBytes {\n\t\treturn toBytes(callHandle(asWasmConn(conn), \"params\"));\n\t}\n\n\tconnState(conn: ConnHandle): RuntimeBytes {\n\t\treturn toBytes(callHandle(asWasmConn(conn), \"state\"));\n\t}\n\n\tconnSetState(conn: ConnHandle, state: RuntimeBytes): void {\n\t\tcallHandle(asWasmConn(conn), \"setState\", state);\n\t}\n\n\tconnIsHibernatable(conn: ConnHandle): boolean {\n\t\treturn callHandle(asWasmConn(conn), \"isHibernatable\");\n\t}\n\n\tconnSend(conn: ConnHandle, name: string, args: RuntimeBytes): void {\n\t\tcallHandle(asWasmConn(conn), \"send\", name, args);\n\t}\n\n\tasync connDisconnect(\n\t\tconn: ConnHandle,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmConn(conn), \"disconnect\", reason);\n\t}\n\n\twebSocketSend(\n\t\tws: WebSocketHandle,\n\t\tdata: RuntimeBytes,\n\t\tbinary: boolean,\n\t): void {\n\t\tcallHandle(asWasmWebSocket(ws), \"send\", data, binary);\n\t}\n\n\tasync webSocketClose(\n\t\tws: WebSocketHandle,\n\t\tcode?: number | undefined | null,\n\t\treason?: string | undefined | null,\n\t): Promise<void> {\n\t\tawait callHandleAsync(asWasmWebSocket(ws), \"close\", code, reason);\n\t}\n\n\twebSocketSetEventCallback(\n\t\tws: WebSocketHandle,\n\t\tcallback: (event: RuntimeWebSocketEvent) => void,\n\t): void {\n\t\tcallHandle(\n\t\t\tasWasmWebSocket(ws),\n\t\t\t\"setEventCallback\",\n\t\t\t(event: RuntimeWebSocketEvent) => {\n\t\t\t\tif (event.kind === \"message\" && event.binary) {\n\t\t\t\t\tcallback({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\tdata: toBytes(event.data as RuntimeBytes | Uint8Array),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback(event);\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport type { WasmBindings };\n\nexport async function loadWasmRuntime(config?: WasmRuntimeLoadConfig): Promise<{\n\tbindings: WasmBindings;\n\truntime: WasmCoreRuntime;\n}> {\n\tconst bindings =\n\t\tconfig?.bindings ??\n\t\t(await import([\"@rivetkit\", \"rivetkit-wasm\"].join(\"/\")));\n\tawait bindings.default(config?.initInput);\n\treturn {\n\t\tbindings,\n\t\truntime: new WasmCoreRuntime(bindings),\n\t};\n}\n","import onChange from \"@rivetkit/on-change\";\n\n/**\n * Creates a proxy that tracks deep mutations on an object and calls `commit`\n * after every change. Uses `@rivetkit/on-change` internally, which correctly\n * detects mutations via methods on Map, Set, Date, TypedArrays, and arrays.\n *\n * If the value is not an object (primitive, null, undefined), it is returned\n * as-is since primitives cannot be proxied or mutated.\n *\n * @param value - The root value to watch.\n * @param commit - Called after every detected mutation with the root object.\n * @param beforeChange - Called before every mutation with the new value being\n * assigned. Throw to reject the change.\n */\nexport function createWriteThroughProxy<T>(\n\tvalue: T,\n\tcommit: (next: T) => void,\n\tbeforeChange?: (newValue: unknown) => void,\n): T {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn value;\n\t}\n\n\treturn onChange(\n\t\tvalue as T & Record<string, any>,\n\t\t() => {\n\t\t\tcommit(value);\n\t\t},\n\t\t{\n\t\t\t// Rejection is throw-based: beforeChange throws to prevent the\n\t\t\t// mutation. We always return true so on-change applies the change\n\t\t\t// if beforeChange did not throw.\n\t\t\tonValidate(_path: string, newValue: unknown) {\n\t\t\t\tbeforeChange?.(newValue);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t) as T;\n}\n"]}