overmux 0.0.10 → 0.0.12

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 (78) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/bin.js +145 -58
  3. package/dist/bin.js.map +1 -1
  4. package/dist/docs/400-reference/200-configuration.md +54 -4
  5. package/dist/docs/400-reference/500-server/000-index.md +4 -0
  6. package/dist/docs/400-reference/500-server/100-resources.md +5 -0
  7. package/dist/docs/400-reference/500-server/200-operations.md +1 -0
  8. package/dist/docs/400-reference/500-server/300-streams.md +7 -1
  9. package/dist/docs/400-reference/500-server/400-notifications.md +4 -0
  10. package/dist/docs/400-reference/500-server/500-api.md +26 -5
  11. package/dist/exports/client.d.ts +1 -1
  12. package/dist/exports/client.d.ts.map +1 -1
  13. package/dist/exports/client.js +55 -14
  14. package/dist/exports/client.js.map +1 -1
  15. package/dist/exports/{index-Dk11nKIv.d.ts → index-C-8Kzrnc.d.ts} +23 -8
  16. package/dist/exports/index-C-8Kzrnc.d.ts.map +1 -0
  17. package/dist/exports/index.d.ts +2 -2
  18. package/dist/exports/index.js +1 -1
  19. package/dist/exports/index.js.map +1 -1
  20. package/dist/exports/{notifications-BFAD3QQl.js → notifications-BBKvKZgI.js} +8 -2
  21. package/dist/exports/{notifications-BFAD3QQl.js.map → notifications-BBKvKZgI.js.map} +1 -1
  22. package/dist/exports/server.d.ts.map +1 -1
  23. package/dist/exports/server.js +8 -2
  24. package/dist/exports/server.js.map +1 -1
  25. package/dist/internal/server/coordinator/server-child.js +616 -883
  26. package/dist/internal/server/coordinator/server-child.js.map +1 -1
  27. package/dist/internal/server/worker-entry.d.ts +1 -0
  28. package/dist/internal/server/worker-entry.js +728 -0
  29. package/dist/internal/server/worker-entry.js.map +1 -0
  30. package/dist/push/THIRD_PARTY_NOTICES.md +30 -0
  31. package/dist/push/badge.png +0 -0
  32. package/dist/push/icon.png +0 -0
  33. package/dist/push/sw.js +88 -0
  34. package/dist/push/sw.js.map +1 -0
  35. package/dist/worker-protocol-hXs4FXCH.js +638 -0
  36. package/dist/worker-protocol-hXs4FXCH.js.map +1 -0
  37. package/docs/400-reference/200-configuration.md +54 -4
  38. package/docs/400-reference/500-server/000-index.md +4 -0
  39. package/docs/400-reference/500-server/100-resources.md +5 -0
  40. package/docs/400-reference/500-server/200-operations.md +1 -0
  41. package/docs/400-reference/500-server/300-streams.md +7 -1
  42. package/docs/400-reference/500-server/400-notifications.md +4 -0
  43. package/docs/400-reference/500-server/500-api.md +26 -5
  44. package/package.json +4 -3
  45. package/src/internal/client/background-notifications.ts +3 -1
  46. package/src/internal/client/host/hosted-pages/browser-notification-settings.tsx +8 -3
  47. package/src/internal/client/host/overmux-host.tsx +4 -8
  48. package/src/internal/client/push-assets/badge.png +0 -0
  49. package/src/internal/client/push-assets/icon.png +0 -0
  50. package/src/internal/client/push-service-worker.ts +118 -0
  51. package/src/internal/client/register-push-worker.ts +63 -0
  52. package/src/internal/server/coordinator/ipc-protocol.ts +2 -1
  53. package/src/internal/server/http/operation-handler.ts +3 -0
  54. package/src/internal/server/http/request-logging.ts +1 -1
  55. package/src/internal/server/http/routes.ts +47 -2
  56. package/src/internal/server/protocol-error.ts +19 -0
  57. package/src/internal/server/runtime/create-runtime.ts +11 -5
  58. package/src/internal/server/runtime/handler-logger.ts +54 -0
  59. package/src/internal/server/runtime/runtime-operations.ts +23 -5
  60. package/src/internal/server/runtime/runtime-resources.ts +158 -88
  61. package/src/internal/server/runtime/runtime-streams.ts +24 -8
  62. package/src/internal/server/runtime/worker-capabilities.ts +67 -0
  63. package/src/internal/server/runtime/worker-connection.ts +549 -0
  64. package/src/internal/server/runtime/worker-protocol.ts +173 -0
  65. package/src/internal/server/runtime/worker-runtime.ts +214 -0
  66. package/src/internal/server/server-logger.ts +25 -37
  67. package/src/internal/server/server-startup-options.ts +7 -6
  68. package/src/internal/server/start-application-server.ts +22 -18
  69. package/src/internal/server/start-overmux-server.ts +2 -2
  70. package/src/internal/server/websocket-connection.ts +97 -32
  71. package/src/internal/server/websocket-server.ts +5 -1
  72. package/src/internal/server/worker-entry.ts +504 -0
  73. package/src/internal/shared/protocol.ts +3 -3
  74. package/src/internal/shared/routes.ts +2 -0
  75. package/src/public/config.ts +15 -23
  76. package/src/public/handler-logger.ts +7 -0
  77. package/src/public/index.ts +3 -1
  78. package/dist/exports/index-Dk11nKIv.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # overmux
2
2
 
3
+ ## 0.0.12
4
+
5
+ ### Patch Changes
6
+
7
+ - [#43](https://github.com/richardgill/overmux/pull/43) [`b392280`](https://github.com/richardgill/overmux/commit/b3922800cfe31ca3d85c76fa3d364d146d96df88) Thanks [@richardgill](https://github.com/richardgill)! - Add structured `context.logger` logging to resource, stream, and operation handlers, with automatic capability and request/session correlation and safe cleanup logging.
8
+
9
+ Replace the top-level `debug` boolean with `logLevel: "debug" | "info" | "warn" | "error"`, defaulting to `"info"` in development and production. Runtime and handler events use the same severity threshold with no lifecycle exceptions; browser console forwarding is enabled only at `"debug"`. Remove `debug` from existing configuration and use `logLevel: "debug"` when investigating. The runtime protocol version increases to reject older browser manifests.
10
+
11
+ - [#46](https://github.com/richardgill/overmux/pull/46) [`053f7b6`](https://github.com/richardgill/overmux/commit/053f7b6cf03050e6499905fc9d71bdf5a9894fde) Thanks [@richardgill](https://github.com/richardgill)! - Isolate each named stream from the shared resource/operation worker. Query, subscription, and derived resources continue to run together with operations; each named stream has its own worker.
12
+
13
+ Remove `context.invalidate` from stream handlers. Resource and operation contexts retain invalidation. Use an operation to mutate data and invalidate resources, or a subscription resource watcher to refresh clients when an external source changes.
14
+
15
+ ## 0.0.11
16
+
17
+ ### Patch Changes
18
+
19
+ - [#40](https://github.com/richardgill/overmux/pull/40) [`1a8bf22`](https://github.com/richardgill/overmux/commit/1a8bf22fb787b78a0beb8212fa33b074bfb9e9e5) Thanks [@richardgill](https://github.com/richardgill)! - Brand background notifications with the Overmux logo on a light background and a monochrome Android status-bar badge. Ship the notification images with the runtime so they remain available in development and production, including after session expiry.
20
+
21
+ - [#42](https://github.com/richardgill/overmux/pull/42) [`910ca21`](https://github.com/richardgill/overmux/commit/910ca216beeedeb7326baad6625452bb691fc801) Thanks [@richardgill](https://github.com/richardgill)! - Add a synchronous `onBeforeInputEvent` desktop configuration hook for the remote Overmux view and owned native web views, with cancellation before native-view passthrough. Document the hook and Linux Super+C/V configuration in the configuration reference.
22
+
23
+ - [#38](https://github.com/richardgill/overmux/pull/38) [`cfc58d8`](https://github.com/richardgill/overmux/commit/cfc58d8881fa847fc15f7a5a02c2ad5e702ebe02) Thanks [@richardgill](https://github.com/richardgill)! - Fix browser background notifications with a runtime-owned push service worker in development and production. Enable now registers an active worker with bounded failure reporting; notification clicks only navigate within the current origin.
24
+
3
25
  ## 0.0.10
4
26
 
5
27
  ### Patch Changes
package/dist/bin.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire, findPackageJSON } from "node:module";
3
- import { createHash } from "node:crypto";
3
+ import { createHash, randomUUID } from "node:crypto";
4
4
  import { constants, cpSync, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, renameSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
5
5
  import { access, open, readFile, readdir, realpath } from "node:fs/promises";
6
6
  import { createConnection, isIP } from "node:net";
@@ -1853,6 +1853,12 @@ var createInstanceIdentity = (instanceId) => ({
1853
1853
  instanceId: instanceIdSchema$1.parse(instanceId),
1854
1854
  deepLinkPrefix: `overmux://${instanceId}`
1855
1855
  });
1856
+ var logLevelSchema$1 = z.enum([
1857
+ "debug",
1858
+ "info",
1859
+ "warn",
1860
+ "error"
1861
+ ]);
1856
1862
  //#endregion
1857
1863
  //#region ../shared/dist/node/index.js
1858
1864
  var durationPattern = /^([1-9]\d*)(ms|s|m|h|d)$/;
@@ -1872,6 +1878,12 @@ var durationToMilliseconds = (duration) => {
1872
1878
  };
1873
1879
  var aiContextSnippets = ["package-source", "tech-stack-recommendations"];
1874
1880
  var instanceIdSchema = z.string().max(253).regex(/^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?![\s\S])/, "Expected a lowercase instance ID with only ASCII letters, digits, internal dots and hyphens");
1881
+ var logLevelSchema = z.enum([
1882
+ "debug",
1883
+ "info",
1884
+ "warn",
1885
+ "error"
1886
+ ]);
1875
1887
  var zodTypeSchema = z.custom((value) => value instanceof z.ZodType, "Expected a Zod schema");
1876
1888
  var functionSchema = z.custom((value) => typeof value === "function", "Expected a function");
1877
1889
  var contractRuntimeSchema = z.object({
@@ -1937,11 +1949,11 @@ var serverDefinitionRuntimeSchema = z.object({
1937
1949
  var configDefinitionRuntimeSchema = serverConfigRuntimeSchema.extend({
1938
1950
  aiContextSnippets: z.array(z.enum(aiContextSnippets)).optional(),
1939
1951
  auth: authConfigRuntimeSchema,
1940
- debug: z.boolean().optional(),
1952
+ logLevel: logLevelSchema.optional(),
1941
1953
  instanceId: z.union([instanceIdSchema, z.custom((value) => typeof value === "function", "Expected an instance ID or a function of the bound port")]).optional(),
1942
1954
  server: serverDefinitionRuntimeSchema,
1943
1955
  vite: z.string().min(1).optional()
1944
- });
1956
+ }).strict();
1945
1957
  var resolveLogicalPath = async (path) => {
1946
1958
  const logicalPath = resolve(path);
1947
1959
  return {
@@ -2396,9 +2408,9 @@ var backgroundNotificationSubscriptionSchema = z.object({
2396
2408
  z.object({ publicKey: deliveryKeySchema }).strict();
2397
2409
  z.object({ endpoint: backgroundNotificationSubscriptionSchema.shape.endpoint }).strict();
2398
2410
  z.object({
2399
- debug: z.boolean(),
2411
+ logLevel: logLevelSchema$1,
2400
2412
  operations: z.array(z.string().min(1)),
2401
- protocolVersion: z.literal(10),
2413
+ protocolVersion: z.literal(11),
2402
2414
  resources: z.array(z.string().min(1)),
2403
2415
  streams: z.array(z.string().min(1))
2404
2416
  });
@@ -2601,6 +2613,31 @@ var createRuntimeLifecycle = (preparationSignal) => {
2601
2613
  };
2602
2614
  };
2603
2615
  //#endregion
2616
+ //#region src/internal/server/runtime/handler-logger.ts
2617
+ var createHandlerLogger = ({ serverLogger, correlation = {}, ...identity }) => {
2618
+ const { correlationId = randomUUID(), ...session } = correlation;
2619
+ const log = (level, event, data) => {
2620
+ try {
2621
+ serverLogger?.log({
2622
+ correlationId,
2623
+ details: {
2624
+ ...identity,
2625
+ ...session,
2626
+ data
2627
+ },
2628
+ event,
2629
+ level
2630
+ });
2631
+ } catch {}
2632
+ };
2633
+ return {
2634
+ debug: (event, details) => log("debug", event, details),
2635
+ info: (event, details) => log("info", event, details),
2636
+ warn: (event, details) => log("warn", event, details),
2637
+ error: (event, details) => log("error", event, details)
2638
+ };
2639
+ };
2640
+ //#endregion
2604
2641
  //#region src/internal/server/runtime/runtime-operations.ts
2605
2642
  var OperationValidationError = class extends Error {
2606
2643
  phase;
@@ -2609,18 +2646,25 @@ var OperationValidationError = class extends Error {
2609
2646
  this.phase = phase;
2610
2647
  }
2611
2648
  };
2612
- var createRuntimeOperations = ({ context, definitions, notifications }) => {
2649
+ var createRuntimeOperations = ({ context, definitions, notifications, serverLogger }) => {
2613
2650
  const operations = /* @__PURE__ */ new Map();
2614
2651
  Object.entries(definitions).forEach(([name, definition]) => {
2615
2652
  if (!name) throw new Error("Operation names must not be empty");
2616
2653
  operations.set(name, {
2617
- execute: async (rawInput, signal) => {
2654
+ execute: async (rawInput, signal, correlation) => {
2618
2655
  const operationContext = context(signal);
2619
2656
  operationContext.signal.throwIfAborted();
2620
2657
  const input = definition.input.safeParse(rawInput);
2621
2658
  if (!input.success) throw new OperationValidationError("input", input.error);
2622
2659
  const rawOutput = await definition.handle(input.data, {
2623
2660
  ...operationContext,
2661
+ logger: createHandlerLogger({
2662
+ serverLogger,
2663
+ correlation,
2664
+ capabilityKind: "operation",
2665
+ registeredName: name,
2666
+ handler: "handle"
2667
+ }),
2624
2668
  notifications
2625
2669
  });
2626
2670
  operationContext.signal.throwIfAborted();
@@ -2732,6 +2776,14 @@ var getInvalidatedResourceIds = (graph, resourceId) => {
2732
2776
  };
2733
2777
  //#endregion
2734
2778
  //#region src/internal/server/runtime/runtime-resources.ts
2779
+ var parseDependencyInputs = (definitions, graph, id, rawInput, inputs = /* @__PURE__ */ new Map()) => {
2780
+ if (inputs.has(id)) return inputs;
2781
+ inputs.set(id, definitions[id].contract.input.parse(rawInput));
2782
+ graph.dependencies.get(id)?.forEach((dependencyId) => {
2783
+ parseDependencyInputs(definitions, graph, dependencyId, rawInput, inputs);
2784
+ });
2785
+ return inputs;
2786
+ };
2735
2787
  var createSubscriptionLifetime = ({ entry, invalidationListeners, lifecycle, signal }) => {
2736
2788
  const controller = new AbortController();
2737
2789
  const subscriptionSignal = AbortSignal.any([lifecycle.requestSignal(signal), controller.signal]);
@@ -2743,23 +2795,23 @@ var createSubscriptionLifetime = ({ entry, invalidationListeners, lifecycle, sig
2743
2795
  }
2744
2796
  };
2745
2797
  const disposers = [];
2798
+ const subscription = {
2799
+ disposers,
2800
+ dispose: () => {
2801
+ controller.abort(/* @__PURE__ */ new Error("Resource subscription closed"));
2802
+ return release();
2803
+ },
2804
+ refresh: registeredEntry.listener,
2805
+ signal: subscriptionSignal
2806
+ };
2746
2807
  const release = lifecycle.track(async () => {
2747
2808
  invalidationListeners.delete(registeredEntry);
2748
2809
  await lifecycle.disposeAll(disposers);
2749
2810
  }, subscriptionSignal);
2750
- const dispose = () => {
2751
- controller.abort(/* @__PURE__ */ new Error("Resource subscription closed"));
2752
- return release();
2753
- };
2754
2811
  invalidationListeners.add(registeredEntry);
2755
- return {
2756
- dispose,
2757
- disposers,
2758
- refresh: registeredEntry.listener,
2759
- signal: subscriptionSignal
2760
- };
2812
+ return subscription;
2761
2813
  };
2762
- var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2814
+ var createRuntimeResources = ({ definitions, instance, lifecycle, serverLogger }) => {
2763
2815
  const graph = createResourceDependencyGraph(definitions);
2764
2816
  const invalidationListeners = /* @__PURE__ */ new Set();
2765
2817
  const resources = /* @__PURE__ */ new Map();
@@ -2767,11 +2819,11 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2767
2819
  if (lifecycle.signal.aborted) return;
2768
2820
  const ids = getInvalidatedResourceIds(graph, id);
2769
2821
  invalidationListeners.forEach((entry) => {
2770
- if (ids.has(entry.resourceId) && (allInputs || isDeepStrictEqual(entry.input, input))) entry.listener();
2822
+ if (ids.has(entry.resourceId) && (allInputs || isDeepStrictEqual(entry.inputs.get(id), input))) entry.listener();
2771
2823
  });
2772
2824
  };
2773
2825
  const invalidate = (resourceId, input) => {
2774
- if (!resources.has(resourceId)) throw new Error(`Unknown resource ID: ${resourceId}`);
2826
+ if (!Object.hasOwn(definitions, resourceId)) throw new Error(`Unknown resource ID: ${resourceId}`);
2775
2827
  const definition = definitions[resourceId];
2776
2828
  const parsedInput = input === void 0 ? void 0 : definition.contract.input.parse(input);
2777
2829
  invalidateResource(resourceId, parsedInput, input === void 0);
@@ -2781,43 +2833,68 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2781
2833
  invalidate,
2782
2834
  signal: lifecycle.requestSignal(signal)
2783
2835
  });
2784
- const read = async (id, rawInput, signal) => {
2785
- const definition = definitions[id];
2786
- const operationSignal = lifecycle.requestSignal(signal);
2787
- operationSignal.throwIfAborted();
2788
- const input = definition.contract.input.parse(rawInput);
2789
- const rawOutput = definition.kind === "derived" ? definition.combine(Object.fromEntries(await Promise.all(Object.entries(definition.dependencies).map(async ([name, dependencyId]) => [name, await read(dependencyId, rawInput, signal)])))) : await definition.read(input, context(signal));
2790
- operationSignal.throwIfAborted();
2791
- return definition.contract.output.parse(rawOutput);
2836
+ const read = (id, rawInput, signal, correlation = { correlationId: randomUUID() }, reads = /* @__PURE__ */ new Map()) => {
2837
+ const existing = reads.get(id);
2838
+ if (existing) return existing;
2839
+ const pending = readDefinition(id, rawInput, signal, correlation, reads);
2840
+ reads.set(id, pending);
2841
+ return pending;
2792
2842
  };
2793
- const activateSubscriptions = async (id, rawInput, signal, activated, disposers) => {
2794
- signal.throwIfAborted();
2795
- if (activated.has(id)) return;
2796
- activated.add(id);
2843
+ const readDefinition = async (id, rawInput, signal, correlation, reads) => {
2797
2844
  const definition = definitions[id];
2845
+ const handlerContext = {
2846
+ ...context(signal),
2847
+ logger: createHandlerLogger({
2848
+ serverLogger,
2849
+ correlation,
2850
+ capabilityKind: "resource",
2851
+ registeredName: id,
2852
+ handler: "read"
2853
+ })
2854
+ };
2855
+ handlerContext.signal.throwIfAborted();
2798
2856
  const input = definition.contract.input.parse(rawInput);
2799
- if (definition.kind === "subscription") {
2800
- const dispose = await definition.subscribe(input, () => {
2801
- if (!signal.aborted) invalidateResource(id, input);
2802
- }, context(signal));
2803
- if (typeof dispose !== "function") throw new Error(`Resource ${id} subscribe must return a disposer`);
2804
- if (signal.aborted) {
2805
- await dispose();
2806
- signal.throwIfAborted();
2857
+ const dependencies = definition.kind === "derived" ? Object.fromEntries(await Promise.all(Object.entries(definition.dependencies).map(async ([name, dependencyId]) => [name, await read(dependencyId, rawInput, handlerContext.signal, correlation, reads)]))) : void 0;
2858
+ handlerContext.signal.throwIfAborted();
2859
+ const output = definition.kind === "derived" ? definition.combine(dependencies) : await definition.read(input, handlerContext);
2860
+ handlerContext.signal.throwIfAborted();
2861
+ return definition.contract.output.parse(output);
2862
+ };
2863
+ const activateSubscriptions = async (inputs, subscription, correlation) => {
2864
+ for (const [id, input] of inputs) {
2865
+ subscription.signal.throwIfAborted();
2866
+ const definition = definitions[id];
2867
+ if (definition.kind === "subscription") {
2868
+ const dispose = await definition.subscribe(input, () => {
2869
+ if (!subscription.signal.aborted) invalidateResource(id, input);
2870
+ }, {
2871
+ ...context(subscription.signal),
2872
+ logger: createHandlerLogger({
2873
+ serverLogger,
2874
+ correlation,
2875
+ capabilityKind: "resource",
2876
+ registeredName: id,
2877
+ handler: "subscribe"
2878
+ })
2879
+ });
2880
+ if (typeof dispose !== "function") throw new Error(`Resource ${id} subscribe must return a disposer`);
2881
+ if (subscription.signal.aborted) {
2882
+ await dispose();
2883
+ subscription.signal.throwIfAborted();
2884
+ }
2885
+ subscription.disposers.push(dispose);
2807
2886
  }
2808
- disposers.push(dispose);
2809
- return;
2810
2887
  }
2811
- if (definition.kind === "derived") for (const dependencyId of graph.dependencies.get(id) ?? []) await activateSubscriptions(dependencyId, rawInput, signal, activated, disposers);
2812
2888
  };
2813
2889
  Object.keys(definitions).forEach((name) => {
2814
2890
  resources.set(name, {
2815
- read: (input, signal) => read(name, input, signal),
2816
- subscribe: async (rawInput, listener, signal) => {
2891
+ read: (rawInput, signal, correlation) => read(name, rawInput, signal, correlation),
2892
+ subscribe: async (rawInput, listener, signal, _onError, correlation = { correlationId: randomUUID() }) => {
2817
2893
  lifecycle.requestSignal(signal).throwIfAborted();
2894
+ const inputs = parseDependencyInputs(definitions, graph, name, rawInput);
2818
2895
  const subscription = createSubscriptionLifetime({
2819
2896
  entry: {
2820
- input: definitions[name].contract.input.parse(rawInput),
2897
+ inputs,
2821
2898
  listener,
2822
2899
  resourceId: name
2823
2900
  },
@@ -2826,7 +2903,7 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2826
2903
  signal
2827
2904
  });
2828
2905
  try {
2829
- await activateSubscriptions(name, rawInput, subscription.signal, /* @__PURE__ */ new Set(), subscription.disposers);
2906
+ await activateSubscriptions(inputs, subscription, correlation);
2830
2907
  subscription.signal.throwIfAborted();
2831
2908
  subscription.refresh();
2832
2909
  subscription.signal.throwIfAborted();
@@ -2851,11 +2928,11 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2851
2928
  };
2852
2929
  //#endregion
2853
2930
  //#region src/internal/server/runtime/runtime-streams.ts
2854
- var createRuntimeStreams = ({ context, definitions, lifecycle }) => {
2931
+ var createRuntimeStreams = ({ instance, definitions, lifecycle, serverLogger }) => {
2855
2932
  const streams = /* @__PURE__ */ new Map();
2856
2933
  Object.entries(definitions).forEach(([name, definition]) => {
2857
2934
  if (!name) throw new Error("Stream names must not be empty");
2858
- streams.set(name, { open: async (rawInput, emit, requestSignal, onError) => {
2935
+ streams.set(name, { open: async (rawInput, emit, requestSignal, onError, correlation) => {
2859
2936
  const sessionController = new AbortController();
2860
2937
  const sessionSignal = requestSignal ? AbortSignal.any([requestSignal, sessionController.signal]) : sessionController.signal;
2861
2938
  const operationSignal = lifecycle.requestSignal(sessionSignal);
@@ -2874,7 +2951,14 @@ var createRuntimeStreams = ({ context, definitions, lifecycle }) => {
2874
2951
  if (opened) onError?.(cause);
2875
2952
  };
2876
2953
  const session = await definition.open(input, {
2877
- ...context(sessionSignal),
2954
+ instance,
2955
+ logger: createHandlerLogger({
2956
+ serverLogger,
2957
+ correlation,
2958
+ capabilityKind: "stream",
2959
+ registeredName: name,
2960
+ handler: "open"
2961
+ }),
2878
2962
  emit: (message) => {
2879
2963
  if (operationSignal.aborted) return;
2880
2964
  try {
@@ -2921,32 +3005,35 @@ var createRuntimeStreams = ({ context, definitions, lifecycle }) => {
2921
3005
  };
2922
3006
  //#endregion
2923
3007
  //#region src/internal/server/runtime/create-runtime.ts
2924
- var createRuntime = async ({ config, debug = true, notifications = { send: async () => void 0 }, signal }) => {
3008
+ var createRuntime = async ({ config, notifications = { send: async () => void 0 }, signal, serverLogger }) => {
2925
3009
  const lifecycle = createRuntimeLifecycle(signal);
2926
3010
  const instance = createRuntimeInstance(config.instanceId ?? defaultInstanceId);
2927
3011
  try {
2928
3012
  const resources = createRuntimeResources({
2929
3013
  definitions: config.server.resources ?? {},
2930
3014
  instance: instance.context,
2931
- lifecycle
3015
+ lifecycle,
3016
+ serverLogger
2932
3017
  });
2933
3018
  const context = resources.context;
2934
3019
  const operations = createRuntimeOperations({
2935
3020
  context,
2936
3021
  definitions: config.server.operations ?? {},
2937
- notifications
3022
+ notifications,
3023
+ serverLogger
2938
3024
  });
2939
3025
  const streams = createRuntimeStreams({
2940
- context,
3026
+ instance: instance.context,
2941
3027
  definitions: config.server.streams ?? {},
2942
- lifecycle
3028
+ lifecycle,
3029
+ serverLogger
2943
3030
  });
2944
3031
  lifecycle.signal.throwIfAborted();
2945
3032
  lifecycle.completePreparation();
2946
3033
  const manifest = {
2947
- debug,
3034
+ logLevel: serverLogger?.logLevel ?? config.logLevel ?? "info",
2948
3035
  operations: [...operations.names],
2949
- protocolVersion: 10,
3036
+ protocolVersion: 11,
2950
3037
  resources: [...resources.names],
2951
3038
  streams: [...streams.names]
2952
3039
  };
@@ -3165,7 +3252,7 @@ var errorMessage = (cause) => cause instanceof Error ? cause.message : String(ca
3165
3252
  var childOptionsSchema = z.object({
3166
3253
  configAliases: z.record(z.string(), z.string()).optional(),
3167
3254
  configPath: z.string(),
3168
- debug: z.boolean().optional(),
3255
+ logLevel: logLevelSchema$1.optional(),
3169
3256
  developmentWebTarget: z.url().optional(),
3170
3257
  host: z.string().optional(),
3171
3258
  port: z.number().int().min(0).max(65535).optional(),