veryfront 0.1.246 → 0.1.248

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 (160) hide show
  1. package/esm/cli/mcp/tools/project-tools.d.ts +1 -1
  2. package/esm/cli/mcp/tools/scaffold-tools.d.ts +2 -2
  3. package/esm/cli/shared/server-startup.d.ts.map +1 -1
  4. package/esm/cli/shared/server-startup.js +8 -0
  5. package/esm/deno.d.ts +0 -9
  6. package/esm/deno.js +5 -12
  7. package/esm/src/agent/durable.d.ts +67 -0
  8. package/esm/src/agent/durable.d.ts.map +1 -1
  9. package/esm/src/agent/durable.js +134 -0
  10. package/esm/src/agent/index.d.ts +1 -1
  11. package/esm/src/agent/index.d.ts.map +1 -1
  12. package/esm/src/agent/index.js +1 -1
  13. package/esm/src/embedding/upload-loader.d.ts +2 -2
  14. package/esm/src/embedding/upload-loader.d.ts.map +1 -1
  15. package/esm/src/embedding/upload-loader.js +11 -48
  16. package/esm/src/errors/middleware/cli-error-boundary.js +1 -1
  17. package/esm/src/errors/middleware/http-error-boundary.js +1 -1
  18. package/esm/src/errors/tracing.d.ts +3 -3
  19. package/esm/src/errors/tracing.d.ts.map +1 -1
  20. package/esm/src/errors/tracing.js +3 -3
  21. package/esm/src/extensions/interfaces/index.d.ts +2 -2
  22. package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
  23. package/esm/src/extensions/interfaces/node-compat.d.ts +68 -10
  24. package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -1
  25. package/esm/src/extensions/interfaces/tracing-exporter.d.ts +35 -1
  26. package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -1
  27. package/esm/src/integrations/schema.d.ts +10 -10
  28. package/esm/src/mcp/index.d.ts +7 -2
  29. package/esm/src/mcp/index.d.ts.map +1 -1
  30. package/esm/src/mcp/index.js +7 -2
  31. package/esm/src/mcp/schemas/index.d.ts +1 -1
  32. package/esm/src/mcp/schemas/index.d.ts.map +1 -1
  33. package/esm/src/mcp/schemas/index.js +1 -1
  34. package/esm/src/mcp/schemas/mcp.schema.d.ts +13 -7
  35. package/esm/src/mcp/schemas/mcp.schema.d.ts.map +1 -1
  36. package/esm/src/mcp/schemas/mcp.schema.js +17 -7
  37. package/esm/src/mcp/server.d.ts +13 -0
  38. package/esm/src/mcp/server.d.ts.map +1 -1
  39. package/esm/src/mcp/server.js +43 -6
  40. package/esm/src/observability/auto-instrument/http-instrumentation.js +1 -1
  41. package/esm/src/observability/auto-instrument/react-instrumentation.js +1 -1
  42. package/esm/src/observability/instruments/build-instruments.d.ts +1 -1
  43. package/esm/src/observability/instruments/build-instruments.d.ts.map +1 -1
  44. package/esm/src/observability/instruments/cache-instruments.d.ts +1 -1
  45. package/esm/src/observability/instruments/cache-instruments.d.ts.map +1 -1
  46. package/esm/src/observability/instruments/data-instruments.d.ts +1 -1
  47. package/esm/src/observability/instruments/data-instruments.d.ts.map +1 -1
  48. package/esm/src/observability/instruments/error-instruments.d.ts +1 -1
  49. package/esm/src/observability/instruments/error-instruments.d.ts.map +1 -1
  50. package/esm/src/observability/instruments/http-instruments.d.ts +1 -1
  51. package/esm/src/observability/instruments/http-instruments.d.ts.map +1 -1
  52. package/esm/src/observability/instruments/instruments-factory.d.ts +1 -1
  53. package/esm/src/observability/instruments/instruments-factory.d.ts.map +1 -1
  54. package/esm/src/observability/instruments/memory-instruments.d.ts +1 -1
  55. package/esm/src/observability/instruments/memory-instruments.d.ts.map +1 -1
  56. package/esm/src/observability/instruments/render-instruments.d.ts +1 -1
  57. package/esm/src/observability/instruments/render-instruments.d.ts.map +1 -1
  58. package/esm/src/observability/instruments/rsc-instruments.d.ts +1 -1
  59. package/esm/src/observability/instruments/rsc-instruments.d.ts.map +1 -1
  60. package/esm/src/observability/metrics/manager.d.ts.map +1 -1
  61. package/esm/src/observability/metrics/manager.js +10 -2
  62. package/esm/src/observability/metrics/types.d.ts +1 -1
  63. package/esm/src/observability/metrics/types.d.ts.map +1 -1
  64. package/esm/src/observability/simple-metrics/otel-instruments.d.ts.map +1 -1
  65. package/esm/src/observability/simple-metrics/otel-instruments.js +7 -2
  66. package/esm/src/observability/simple-metrics/types.d.ts +1 -1
  67. package/esm/src/observability/simple-metrics/types.d.ts.map +1 -1
  68. package/esm/src/observability/tracing/api-shim.d.ts +177 -0
  69. package/esm/src/observability/tracing/api-shim.d.ts.map +1 -0
  70. package/esm/src/observability/tracing/api-shim.js +234 -0
  71. package/esm/src/observability/tracing/manager.d.ts.map +1 -1
  72. package/esm/src/observability/tracing/manager.js +29 -4
  73. package/esm/src/observability/tracing/otlp-setup.d.ts +12 -8
  74. package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
  75. package/esm/src/observability/tracing/otlp-setup.js +59 -136
  76. package/esm/src/observability/tracing/types.d.ts +1 -1
  77. package/esm/src/observability/tracing/types.d.ts.map +1 -1
  78. package/esm/src/platform/compat/kv/factory.d.ts.map +1 -1
  79. package/esm/src/platform/compat/kv/factory.js +15 -6
  80. package/esm/src/platform/compat/opaque-deps.d.ts +6 -5
  81. package/esm/src/platform/compat/opaque-deps.d.ts.map +1 -1
  82. package/esm/src/platform/compat/opaque-deps.js +13 -37
  83. package/esm/src/proxy/tracing.d.ts +7 -2
  84. package/esm/src/proxy/tracing.d.ts.map +1 -1
  85. package/esm/src/proxy/tracing.js +31 -96
  86. package/esm/src/rendering/rsc/client-module-strategy.d.ts.map +1 -1
  87. package/esm/src/rendering/rsc/client-module-strategy.js +9 -1
  88. package/esm/src/server/bootstrap.d.ts.map +1 -1
  89. package/esm/src/server/bootstrap.js +27 -1
  90. package/esm/src/server/context/request-context.d.ts.map +1 -1
  91. package/esm/src/server/context/request-context.js +7 -4
  92. package/esm/src/server/dev-server/middleware.js +1 -1
  93. package/esm/src/server/handlers/dev/files/dev-file.handler.d.ts.map +1 -1
  94. package/esm/src/server/handlers/dev/files/dev-file.handler.js +4 -14
  95. package/esm/src/server/services/rendering/ssr.service.d.ts.map +1 -1
  96. package/esm/src/server/services/rendering/ssr.service.js +4 -1
  97. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
  98. package/esm/src/utils/version-constant.d.ts +1 -1
  99. package/esm/src/utils/version-constant.js +1 -1
  100. package/esm/src/workflow/claude-code/workspace-sync.d.ts +17 -2
  101. package/esm/src/workflow/claude-code/workspace-sync.d.ts.map +1 -1
  102. package/esm/src/workflow/claude-code/workspace-sync.js +106 -19
  103. package/esm/src/workflow/schemas/workflow.schema.d.ts +3 -3
  104. package/package.json +1 -9
  105. package/src/cli/shared/server-startup.ts +8 -0
  106. package/src/deno.js +5 -12
  107. package/src/src/agent/durable.ts +237 -0
  108. package/src/src/agent/index.ts +4 -0
  109. package/src/src/cache/backends/factory.ts +1 -1
  110. package/src/src/cache/backends/redis.ts +1 -1
  111. package/src/src/cache/keys/utils.ts +1 -1
  112. package/src/src/cache/registry.ts +1 -1
  113. package/src/src/data/static-paths-fetcher.ts +1 -1
  114. package/src/src/embedding/upload-loader.ts +14 -63
  115. package/src/src/errors/middleware/cli-error-boundary.ts +1 -1
  116. package/src/src/errors/middleware/http-error-boundary.ts +1 -1
  117. package/src/src/errors/tracing.ts +4 -4
  118. package/src/src/extensions/interfaces/index.ts +7 -2
  119. package/src/src/extensions/interfaces/node-compat.ts +74 -10
  120. package/src/src/extensions/interfaces/tracing-exporter.ts +36 -1
  121. package/src/src/mcp/index.ts +7 -2
  122. package/src/src/mcp/schemas/index.ts +1 -0
  123. package/src/src/mcp/schemas/mcp.schema.ts +20 -7
  124. package/src/src/mcp/server.ts +60 -6
  125. package/src/src/observability/auto-instrument/http-instrumentation.ts +1 -1
  126. package/src/src/observability/auto-instrument/react-instrumentation.ts +1 -1
  127. package/src/src/observability/auto-instrument/wrappers.ts +1 -1
  128. package/src/src/observability/instruments/build-instruments.ts +1 -1
  129. package/src/src/observability/instruments/cache-instruments.ts +6 -1
  130. package/src/src/observability/instruments/data-instruments.ts +1 -1
  131. package/src/src/observability/instruments/error-instruments.ts +1 -1
  132. package/src/src/observability/instruments/http-instruments.ts +6 -1
  133. package/src/src/observability/instruments/instruments-factory.ts +1 -1
  134. package/src/src/observability/instruments/memory-instruments.ts +5 -1
  135. package/src/src/observability/instruments/render-instruments.ts +1 -1
  136. package/src/src/observability/instruments/rsc-instruments.ts +1 -1
  137. package/src/src/observability/metrics/manager.ts +11 -3
  138. package/src/src/observability/metrics/types.ts +7 -1
  139. package/src/src/observability/simple-metrics/otel-instruments.ts +7 -2
  140. package/src/src/observability/simple-metrics/types.ts +1 -1
  141. package/src/src/observability/tracing/api-shim.ts +409 -0
  142. package/src/src/observability/tracing/manager.ts +29 -4
  143. package/src/src/observability/tracing/otlp-setup.ts +76 -168
  144. package/src/src/observability/tracing/types.ts +1 -1
  145. package/src/src/platform/compat/kv/factory.ts +18 -7
  146. package/src/src/platform/compat/opaque-deps.ts +16 -44
  147. package/src/src/proxy/tracing.ts +43 -117
  148. package/src/src/rendering/rsc/client-module-strategy.ts +9 -1
  149. package/src/src/server/bootstrap.ts +38 -1
  150. package/src/src/server/context/request-context.ts +10 -7
  151. package/src/src/server/dev-server/middleware.ts +1 -1
  152. package/src/src/server/handlers/dev/files/dev-file.handler.ts +4 -22
  153. package/src/src/server/services/rendering/ssr.service.ts +4 -1
  154. package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +1 -1
  155. package/src/src/utils/version-constant.ts +1 -1
  156. package/src/src/workflow/claude-code/workspace-sync.ts +109 -20
  157. package/esm/src/utils/logger/trace-bridge.d.ts +0 -11
  158. package/esm/src/utils/logger/trace-bridge.d.ts.map +0 -1
  159. package/esm/src/utils/logger/trace-bridge.js +0 -12
  160. package/src/src/utils/logger/trace-bridge.ts +0 -14
@@ -1,21 +1,20 @@
1
1
  /**************************
2
- * OpenTelemetry OTLP Setup for Grafana Cloud
2
+ * OpenTelemetry OTLP Setup
3
+ *
4
+ * Thin wrapper that delegates to the `ext-opentelemetry` extension via the
5
+ * `TracingExporter` contract. When the extension is not installed, all span
6
+ * operations silently no-op.
3
7
  *
4
- * Configures the OTLP exporter to send traces to Grafana Cloud.
5
8
  * Reads configuration from environment variables:
6
9
  * - OTEL_TRACES_ENABLED: "true" to enable tracing
7
10
  * - OTEL_SERVICE_NAME: Service name for traces
8
- * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP endpoint (e.g., https://otlp-gateway-prod-eu-west-2.grafana.net/otlp)
9
- * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers (e.g., Authorization=Basic ...)
11
+ * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP endpoint
12
+ * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers
10
13
  **************************/
11
14
  import { getOtelTracingConfig } from "../../config/env.js";
12
15
  import { serverLogger } from "../../utils/index.js";
13
- import { RUNTIME_VERSION } from "../../utils/version.js";
16
+ import { context as shimContext, defaultTextMapGetter, defaultTextMapSetter, getTracer, propagation as shimPropagation, SpanKind, SpanStatusCode, trace as shimTrace, } from "./api-shim.js";
14
17
  const logger = serverLogger.component("otel");
15
- let initialized = false;
16
- let tracerProvider = null;
17
- let traceApi = null;
18
- let propagationApi = null;
19
18
  function parseHeaders(headerString) {
20
19
  if (!headerString)
21
20
  return {};
@@ -42,107 +41,50 @@ function getConfig() {
42
41
  headers: parseHeaders(tracingConfig.headers),
43
42
  };
44
43
  }
45
- async function ensureApis() {
46
- if (traceApi && propagationApi)
47
- return;
48
- traceApi = await import("@opentelemetry/api");
49
- propagationApi = await import("@opentelemetry/core");
50
- }
51
- function setSpanErrorStatus(span, error) {
52
- if (!traceApi)
53
- return;
54
- span.setStatus({
55
- code: traceApi.SpanStatusCode.ERROR,
56
- message: error instanceof Error ? error.message : String(error),
57
- });
58
- if (error instanceof Error)
59
- span.recordException(error);
60
- }
44
+ // ---------------------------------------------------------------------------
45
+ // Legacy initialise / shutdown (now delegated to bootstrap.ts + ext)
46
+ // ---------------------------------------------------------------------------
47
+ let initialized = false;
61
48
  export async function initializeOTLP() {
62
49
  if (initialized) {
63
50
  logger.debug("Already initialized");
64
51
  return;
65
52
  }
66
- const config = getConfig();
67
- if (!config.enabled) {
68
- logger.debug("Tracing disabled (OTEL_TRACES_ENABLED != true)");
69
- initialized = true;
70
- return;
71
- }
72
- if (!config.endpoint) {
73
- logger.warn("No OTEL_EXPORTER_OTLP_ENDPOINT configured, skipping");
74
- initialized = true;
75
- return;
76
- }
77
- try {
78
- const { BasicTracerProvider, BatchSpanProcessor } = await import("@opentelemetry/sdk-trace-base");
79
- const { OTLPTraceExporter } = await import("@opentelemetry/exporter-trace-otlp-http");
80
- const { resourceFromAttributes } = await import("@opentelemetry/resources");
81
- const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = await import("@opentelemetry/semantic-conventions");
82
- const { AsyncLocalStorageContextManager } = await import("@opentelemetry/context-async-hooks");
83
- const resource = resourceFromAttributes({
84
- [ATTR_SERVICE_NAME]: config.serviceName,
85
- [ATTR_SERVICE_VERSION]: RUNTIME_VERSION,
86
- });
87
- const endpointBase = config.endpoint.replace(/\/$/, "");
88
- const exporter = new OTLPTraceExporter({
89
- url: `${endpointBase}/v1/traces`,
90
- headers: config.headers,
91
- });
92
- const contextManager = new AsyncLocalStorageContextManager();
93
- contextManager.enable();
94
- const provider = new BasicTracerProvider({
95
- resource,
96
- spanProcessors: [new BatchSpanProcessor(exporter)],
97
- });
98
- // In OTel SDK v2, provider.register() is removed.
99
- // Set global tracer provider and context manager via the API directly.
100
- traceApi = await import("@opentelemetry/api");
101
- traceApi.trace.setGlobalTracerProvider(provider);
102
- traceApi.context.setGlobalContextManager(contextManager);
103
- tracerProvider = provider;
104
- initialized = true;
105
- logger.info("OpenTelemetry OTLP tracing initialized", {
106
- serviceName: config.serviceName,
107
- endpoint: config.endpoint,
108
- });
109
- traceApi.trace.getTracer(config.serviceName);
110
- logger.debug("Tracer obtained", { name: config.serviceName });
111
- // Bridge trace context into the logger so every JSON log entry
112
- // automatically includes traceId/spanId from the active span.
113
- // Imported here (rather than per-entrypoint) so all callers of
114
- // initializeOTLP benefit — CLI serve, production-server, proxy, etc.
115
- await import("../../utils/logger/trace-bridge.js");
116
- }
117
- catch (error) {
118
- logger.error("Failed to initialize OTLP tracing", { error });
119
- initialized = true; // Mark as initialized to prevent retries
120
- }
53
+ // Actual provider setup is handled by ext-opentelemetry via bootstrap.
54
+ // This is kept for backward compatibility.
55
+ initialized = true;
56
+ logger.debug("OTLP setup delegated to ext-opentelemetry extension");
121
57
  }
122
58
  export async function shutdownOTLP() {
123
- if (!tracerProvider)
124
- return;
125
- try {
126
- await tracerProvider.shutdown();
127
- logger.info("Tracer provider shutdown complete");
128
- }
129
- catch (error) {
130
- logger.warn("Error during tracer shutdown", { error });
131
- }
59
+ // Actual shutdown is handled by the extension loader teardown.
60
+ logger.debug("OTLP shutdown delegated to ext-opentelemetry extension");
132
61
  }
133
62
  export function isOTLPEnabled() {
134
- return initialized && tracerProvider !== null;
63
+ return initialized;
64
+ }
65
+ export async function initializeOTLPWithApis() {
66
+ await initializeOTLP();
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Span helpers — delegate to shim (which delegates to SDK if wired)
70
+ // ---------------------------------------------------------------------------
71
+ function setSpanErrorStatus(span, error) {
72
+ span.setStatus({
73
+ code: SpanStatusCode.ERROR,
74
+ message: error instanceof Error ? error.message : String(error),
75
+ });
76
+ if (error instanceof Error)
77
+ span.recordException(error);
135
78
  }
136
79
  export async function withSpan(name, fn, attributes) {
137
- if (!traceApi || !isOTLPEnabled())
138
- return fn();
139
- const tracer = traceApi.trace.getTracer(getConfig().serviceName);
140
- const parentContext = traceApi.context.active();
141
- const span = tracer.startSpan(name, { kind: traceApi.SpanKind.INTERNAL, attributes }, parentContext);
142
- const spanContext = traceApi.trace.setSpan(parentContext, span);
80
+ const config = getConfig();
81
+ const tracer = getTracer(config.serviceName);
82
+ const parentContext = shimContext.active();
83
+ const span = tracer.startSpan(name, { kind: SpanKind.INTERNAL, attributes }, parentContext);
84
+ const spanContext = shimTrace.setSpan(parentContext, span);
143
85
  try {
144
- const result = await traceApi.context.with(spanContext, fn);
145
- span.setStatus({ code: traceApi.SpanStatusCode.OK });
86
+ const result = await shimContext.with(spanContext, fn);
87
+ span.setStatus({ code: SpanStatusCode.OK });
146
88
  return result;
147
89
  }
148
90
  catch (error) {
@@ -154,14 +96,13 @@ export async function withSpan(name, fn, attributes) {
154
96
  }
155
97
  }
156
98
  export function withSpanSync(name, fn, attributes) {
157
- if (!traceApi || !isOTLPEnabled())
158
- return fn();
159
- const tracer = traceApi.trace.getTracer(getConfig().serviceName);
160
- const parentContext = traceApi.context.active();
161
- const span = tracer.startSpan(name, { kind: traceApi.SpanKind.INTERNAL, attributes }, parentContext);
99
+ const config = getConfig();
100
+ const tracer = getTracer(config.serviceName);
101
+ const parentContext = shimContext.active();
102
+ const span = tracer.startSpan(name, { kind: SpanKind.INTERNAL, attributes }, parentContext);
162
103
  try {
163
104
  const result = fn();
164
- span.setStatus({ code: traceApi.SpanStatusCode.OK });
105
+ span.setStatus({ code: SpanStatusCode.OK });
165
106
  return result;
166
107
  }
167
108
  catch (error) {
@@ -173,35 +114,28 @@ export function withSpanSync(name, fn, attributes) {
173
114
  }
174
115
  }
175
116
  export function extractContext(headers) {
176
- if (!traceApi || !propagationApi)
177
- return traceApi?.context?.active();
178
117
  const carrier = {};
179
118
  for (const [k, v] of headers)
180
119
  carrier[k.toLowerCase()] = v;
181
- if (!propagationApi.W3CTraceContextPropagator)
182
- return traceApi.context.active();
183
- return new propagationApi.W3CTraceContextPropagator().extract(traceApi.context.active(), carrier, traceApi.defaultTextMapGetter);
120
+ return shimPropagation.extract(shimContext.active(), carrier, defaultTextMapGetter);
184
121
  }
185
122
  export function injectContext(headers) {
186
- if (!traceApi || !propagationApi)
187
- return;
188
123
  const carrier = {};
189
- new propagationApi.W3CTraceContextPropagator().inject(traceApi.context.active(), carrier, traceApi.defaultTextMapSetter);
124
+ shimPropagation.inject(shimContext.active(), carrier, defaultTextMapSetter);
190
125
  for (const [k, v] of Object.entries(carrier))
191
126
  headers.set(k, v);
192
127
  }
193
128
  export function startServerSpan(method, path, parentContext) {
194
- if (!traceApi || !isOTLPEnabled())
195
- return null;
196
- const tracer = traceApi.trace.getTracer(getConfig().serviceName);
197
- const ctx = (parentContext || traceApi.context.active());
198
- const span = tracer.startSpan(`${method} ${path}`, { kind: traceApi.SpanKind.SERVER }, ctx);
129
+ const config = getConfig();
130
+ const tracer = getTracer(config.serviceName);
131
+ const ctx = (parentContext || shimContext.active());
132
+ const span = tracer.startSpan(`${method} ${path}`, { kind: SpanKind.SERVER }, ctx);
199
133
  span.setAttribute("http.method", method);
200
134
  span.setAttribute("http.target", path);
201
- return { span, context: traceApi.trace.setSpan(ctx, span) };
135
+ return { span, context: shimTrace.setSpan(ctx, span) };
202
136
  }
203
137
  export function endServerSpan(span, statusCode, error) {
204
- if (!span || !traceApi)
138
+ if (!span)
205
139
  return;
206
140
  const otelSpan = span;
207
141
  otelSpan.setAttribute("http.status_code", statusCode);
@@ -211,45 +145,34 @@ export function endServerSpan(span, statusCode, error) {
211
145
  return;
212
146
  }
213
147
  if (statusCode >= 400) {
214
- otelSpan.setStatus({ code: traceApi.SpanStatusCode.ERROR });
148
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR });
215
149
  otelSpan.end();
216
150
  return;
217
151
  }
218
- otelSpan.setStatus({ code: traceApi.SpanStatusCode.OK });
152
+ otelSpan.setStatus({ code: SpanStatusCode.OK });
219
153
  otelSpan.end();
220
154
  }
221
155
  export function setSpanAttributes(span, attributes) {
222
- if (!span || !traceApi)
156
+ if (!span)
223
157
  return;
224
158
  const otelSpan = span;
225
159
  for (const [key, value] of Object.entries(attributes))
226
160
  otelSpan.setAttribute(key, value);
227
161
  }
228
162
  export function setActiveSpanAttributes(attributes) {
229
- if (!traceApi)
230
- return;
231
- const span = traceApi.trace.getSpan(traceApi.context.active());
163
+ const span = shimTrace.getActiveSpan?.();
232
164
  if (!span)
233
165
  return;
234
166
  for (const [key, value] of Object.entries(attributes))
235
167
  span.setAttribute(key, value);
236
168
  }
237
169
  export async function withContext(spanContext, fn) {
238
- if (!traceApi)
239
- return fn();
240
- return traceApi.context.with(spanContext, fn);
170
+ return shimContext.with(spanContext, fn);
241
171
  }
242
172
  export function getTraceContext() {
243
- if (!traceApi)
244
- return {};
245
- const span = traceApi.trace.getSpan(traceApi.context.active());
173
+ const span = shimTrace.getActiveSpan?.();
246
174
  if (!span)
247
175
  return {};
248
176
  const ctx = span.spanContext();
249
177
  return { traceId: ctx.traceId, spanId: ctx.spanId };
250
178
  }
251
- export async function initializeOTLPWithApis() {
252
- await initializeOTLP();
253
- if (isOTLPEnabled())
254
- await ensureApis();
255
- }
@@ -1,4 +1,4 @@
1
- import type { Context, Span, SpanKind, TextMapPropagator, Tracer } from "@opentelemetry/api";
1
+ import type { Context, Span, SpanKind, TextMapPropagator, Tracer } from "./api-shim.js";
2
2
  export interface TracingConfig {
3
3
  enabled: boolean;
4
4
  exporter: "jaeger" | "zipkin" | "otlp" | "console";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/observability/tracing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC9D,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;KAChD,CAAC;IACF,WAAW,EAAE;QACX,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACzD,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QACpE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;KACjE,CAAC;IACF,OAAO,EAAE;QACP,MAAM,IAAI,OAAO,CAAC;QAClB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;KAC3C,CAAC;IACF,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACtC;AAED,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/observability/tracing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC9D,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;KAChD,CAAC;IACF,WAAW,EAAE;QACX,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACzD,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QACpE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;KACjE,CAAC;IACF,OAAO,EAAE;QACP,MAAM,IAAI,OAAO,CAAC;QAClB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;KAC3C,CAAC;IACF,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACtC;AAED,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/kv/factory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAQrC,wBAAsB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAuBvD;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAEtE;AAED,wBAAgB,cAAc,IAAI,IAAI,CAMrC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/kv/factory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,EAAkB,MAAM,YAAY,CAAC;AASrD,wBAAsB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAgCvD;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAEtE;AAED,wBAAgB,cAAc,IAAI,IAAI,CAMrC"}
@@ -1,4 +1,5 @@
1
1
  import * as dntShim from "../../../../_dnt.shims.js";
2
+ import { tryResolve } from "../../../extensions/contracts.js";
2
3
  import { serverLogger } from "../../../utils/index.js";
3
4
  import { isDeno } from "../runtime.js";
4
5
  import { MemoryKv } from "./memory-adapter.js";
@@ -16,13 +17,21 @@ export async function openKv(path) {
16
17
  }
17
18
  }
18
19
  }
19
- try {
20
- const Database = (await import("better-sqlite3")).default;
21
- const db = new Database(path ?? ":memory:");
22
- return new SqliteKv(db);
20
+ const nodeCompat = tryResolve("NodeCompat");
21
+ if (nodeCompat?.openSqliteDatabase) {
22
+ try {
23
+ const db = await nodeCompat.openSqliteDatabase(path);
24
+ // NodeCompatSqliteDatabase is structurally identical to SqliteDatabase;
25
+ // cast to satisfy the SqliteKv constructor's nominal type check.
26
+ return new SqliteKv(db);
27
+ }
28
+ catch (error) {
29
+ serverLogger.debug("NodeCompat.openSqliteDatabase failed, using memory KV:", error);
30
+ }
23
31
  }
24
- catch (error) {
25
- serverLogger.debug("SQLite not available, using memory KV:", error);
32
+ else {
33
+ serverLogger.debug("NodeCompat extension not registered SQLite KV unavailable. " +
34
+ "Install @veryfront/ext-node-compat to enable SQLite-backed KV.");
26
35
  }
27
36
  return new MemoryKv();
28
37
  }
@@ -6,11 +6,12 @@ export declare function importClaudeAgentSDK(): Promise<OpaqueModule>;
6
6
  /**
7
7
  * Lazily import kreuzberg document extraction.
8
8
  *
9
- * Unlike the other opaque deps above, kreuzberg is a core framework
10
- * dependency that must work in compiled binaries. The Deno path uses
11
- * a regular `import()` (not `dynamicImport`) so `deno compile` can
12
- * trace and embed `@kreuzberg/wasm`. The Node/Bun path uses `dynamicImport`
13
- * to resolve `@kreuzberg/node` from the project's node_modules at runtime.
9
+ * Delegates to the `NodeCompat` extension contract (`@veryfront/ext-node-compat`)
10
+ * when available. Without the extension, throws an actionable error instructing
11
+ * the user to install `ext-node-compat`.
12
+ *
13
+ * Node/Bun path: `@kreuzberg/node` resolved from the project's node_modules at
14
+ * runtime — the extension handles that dynamic import internally.
14
15
  */
15
16
  export declare function importKreuzberg(): Promise<{
16
17
  extractBytes: (data: Uint8Array, mimeType: string) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"opaque-deps.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/opaque-deps.ts"],"names":[],"mappings":"AA2BA,KAAK,YAAY,GAAG,GAAG,CAAC;AAUxB,yEAAyE;AACzE,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAE1D;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAK5D;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,YAAY,EAAE,CACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnC,CAAC,CAgCD"}
1
+ {"version":3,"file":"opaque-deps.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/opaque-deps.ts"],"names":[],"mappings":"AA6BA,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB,yEAAyE;AACzE,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAE1D;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAK5D;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,YAAY,EAAE,CACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnC,CAAC,CASD"}
@@ -15,7 +15,8 @@
15
15
  * @module platform/compat
16
16
  */
17
17
  import * as dntShim from "../../../_dnt.shims.js";
18
- import { isDeno, isDenoCompiled } from "./runtime.js";
18
+ import { tryResolve } from "../../extensions/contracts.js";
19
+ import { isDeno } from "./runtime.js";
19
20
  import { dynamicImport } from "./dynamic-import.js";
20
21
  function resolve(pkg, version) {
21
22
  return isDeno ? `npm:${pkg}@${version}` : pkg;
@@ -35,43 +36,18 @@ export function importClaudeAgentSDK() {
35
36
  /**
36
37
  * Lazily import kreuzberg document extraction.
37
38
  *
38
- * Unlike the other opaque deps above, kreuzberg is a core framework
39
- * dependency that must work in compiled binaries. The Deno path uses
40
- * a regular `import()` (not `dynamicImport`) so `deno compile` can
41
- * trace and embed `@kreuzberg/wasm`. The Node/Bun path uses `dynamicImport`
42
- * to resolve `@kreuzberg/node` from the project's node_modules at runtime.
39
+ * Delegates to the `NodeCompat` extension contract (`@veryfront/ext-node-compat`)
40
+ * when available. Without the extension, throws an actionable error instructing
41
+ * the user to install `ext-node-compat`.
42
+ *
43
+ * Node/Bun path: `@kreuzberg/node` resolved from the project's node_modules at
44
+ * runtime — the extension handles that dynamic import internally.
43
45
  */
44
46
  export async function importKreuzberg() {
45
- if (isDeno) {
46
- // Regular import — visible to deno compile, resolved via deno.json import map
47
- const mod = await import("@kreuzberg/wasm");
48
- if (isDenoCompiled) {
49
- // Kreuzberg's initWasm() internally uses a computed dynamic import() to
50
- // load the WASM glue module (kreuzberg_wasm.js). deno compile cannot
51
- // trace computed import() paths, so the glue module is absent from the
52
- // binary's embedded module graph. Pre-importing it here populates Deno's
53
- // in-process module cache so the subsequent import() inside initWasm()
54
- // resolves from cache instead of hitting the missing file.
55
- await import("@kreuzberg/wasm/dist/pkg/kreuzberg_wasm.js");
56
- // pdfium.js is not in @kreuzberg/wasm package exports, so we can't use
57
- // an import map entry. Resolve its URL relative to the kreuzberg package
58
- // and pre-import it so initWasm()'s `import("./pdfium.js")` resolves
59
- // from the in-process module cache instead of hanging.
60
- // Wrapped in try/catch because pdfium is only needed for PDF extraction;
61
- // a failure here should not break extraction of other formats (DOCX, etc.).
62
- try {
63
- const kreuzbergUrl = globalThis[Symbol.for("import-meta-ponyfill-esmodule")](import.meta).resolve("@kreuzberg/wasm");
64
- await import(new URL("./pdfium.js", kreuzbergUrl).href);
65
- }
66
- catch {
67
- // expected: pdfium pre-import may fail if the file is missing or
68
- // the package structure changed — PDF extraction will be degraded
69
- // but other formats will still work.
70
- }
71
- }
72
- await mod.initWasm?.();
73
- return mod;
47
+ const nodeCompat = tryResolve("NodeCompat");
48
+ if (nodeCompat?.importKreuzberg) {
49
+ return nodeCompat.importKreuzberg();
74
50
  }
75
- // Opaque import resolved from node_modules at runtime
76
- return dynamicImport("@kreuzberg/node");
51
+ throw new Error("Document extraction requires the NodeCompat extension. " +
52
+ "Install @veryfront/ext-node-compat and add it to your extensions configuration.");
77
53
  }
@@ -1,8 +1,13 @@
1
1
  /****
2
2
  * OpenTelemetry OTLP tracing for proxy.
3
- * Env: OTEL_TRACES_ENABLED, OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS
3
+ *
4
+ * Uses the core api-shim for in-process tracing; when ext-opentelemetry
5
+ * is loaded, the shim delegates to the real SDK provider.
6
+ *
7
+ * Env: OTEL_TRACES_ENABLED, OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT,
8
+ * OTEL_EXPORTER_OTLP_HEADERS
4
9
  */
5
- import type { Context, Span } from "@opentelemetry/api";
10
+ import { type Context, type Span } from "../observability/tracing/api-shim.js";
6
11
  export declare function initializeOTLPWithApis(): Promise<void>;
7
12
  export declare function shutdownOTLP(): Promise<void>;
8
13
  export declare function extractContext(headers: Headers): Context | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/tracing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,oBAAoB,CAAC;AA6DhE,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6D5D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD;AAOD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAgBpE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBpD;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,OAAO,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAMzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAiBvF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGrF;AAWD,wBAAgB,eAAe,IAAI;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAIvE;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GACrD,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,IAAI,EAKV,MAAM,sCAAsC,CAAC;AAmC9C,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B5D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAQpE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAOpD;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,OAAO,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAMzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAiBvF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAErF;AAOD,wBAAgB,eAAe,IAAI;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAIvE;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GACrD,OAAO,CAAC,CAAC,CAAC,CA0BZ"}