@sazabi/cli 1.2.0-dev.g3566294 → 1.2.0-dev.g3e77e13

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 (2) hide show
  1. package/dist/index.js +195 -218
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2219,7 +2219,7 @@ Tell the user the token and org slug:
2219
2219
  >
2220
2220
  > **Option B - CLI:** Use \`sazabi log-sources create fly_io --metadata "{\\"connectionMode\\":\\"managed\\",\\"apiToken\\":\\"<token>\\",\\"organizationSlug\\":\\"$ORG_SLUG\\"}"\` to create the managed log source via the CLI.
2221
2221
 
2222
- After connecting, add log streams for the apps you want and then run the log shipper — Sazabi does not deploy anything into the Fly org. See the shipper steps in the [Fly.io setup guide](https://docs.sazabi.com/data/sources/connect-your-account/fly-io).
2222
+ After connecting, add log streams for the apps you want and then run the log shipper — Sazabi does not deploy anything into the Fly org. See the shipper steps in the [Fly.io setup guide](https://docs.sazabi.com/catalogs/log-sources/connect-your-account/fly-io).
2223
2223
 
2224
2224
  AskUserQuestion: Would you like to copy the token to your clipboard?
2225
2225
 
@@ -2262,7 +2262,7 @@ fly secrets set -a <log-shipper-app> \\
2262
2262
 
2263
2263
  fly-log-shipper has one generic \`http\` sink and ships every app matched by its \`SUBJECT\` (default: the whole org) with the one key.
2264
2264
 
2265
- **Option B — dedicated OTLP shipper.** For per-app keys and richer OTLP attributes, build a Vector app that wraps events in an OTLP \`resourceLogs\` envelope and POSTs to \`\${INTAKE_URL}/v1/logs\` with \`SAZABI_PUBLIC_KEY\` as a bearer token. The full \`Dockerfile\` and \`vector.toml\` are in the [Fly.io setup guide](https://docs.sazabi.com/data/sources/endpoint/fly-io).
2265
+ **Option B — dedicated OTLP shipper.** For per-app keys and richer OTLP attributes, build a Vector app that wraps events in an OTLP \`resourceLogs\` envelope and POSTs to \`\${INTAKE_URL}/v1/logs\` with \`SAZABI_PUBLIC_KEY\` as a bearer token. The full \`Dockerfile\` and \`vector.toml\` are in the [Fly.io setup guide](https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/fly-io).
2266
2266
 
2267
2267
  ### E3: Verify
2268
2268
 
@@ -2303,7 +2303,7 @@ Logs flow through Google Cloud Pub/Sub: a log sink routes Cloud Logging entries
2303
2303
 
2304
2304
  - To connect your account: a GCP service account key with permissions to create Pub/Sub topics, log sinks, and pull subscriptions in the selected project, plus rights to create service account keys there.
2305
2305
  - To set it up yourself (for example if service account key creation is restricted): the ability to create the Pub/Sub topic, log sink, and subscription and run an OpenTelemetry Collector with the \`googlecloudpubsub\` receiver.
2306
- - If your organization enforces a Domain Restricted Sharing org policy (\`iam.allowedPolicyMemberDomains\`), an Organization Policy Administrator must relax it for the project — otherwise Sazabi cannot grant the Cloud Logging sink's writer identity access to Pub/Sub and setting up the log stream fails at the final step. See the [GCP setup guide](https://docs.sazabi.com/data/sources/connect-your-account/gcp) for the fix.
2306
+ - If your organization enforces a Domain Restricted Sharing org policy (\`iam.allowedPolicyMemberDomains\`), an Organization Policy Administrator must relax it for the project — otherwise Sazabi cannot grant the Cloud Logging sink's writer identity access to Pub/Sub and setting up the log stream fails at the final step. See the [GCP setup guide](https://docs.sazabi.com/catalogs/log-sources/connect-your-account/gcp) for the fix.
2307
2307
  - GCP bills for Pub/Sub message delivery (and any egress); Sazabi does not. High-volume log projects can incur meaningful Pub/Sub charges on your GCP bill, so use log sink filters to forward only the logs you need. See [Pub/Sub pricing](https://cloud.google.com/pubsub/pricing).
2308
2308
 
2309
2309
  ## Limitations
@@ -5354,6 +5354,149 @@ If your application already emits OpenTelemetry directly (or runs an OTel Collec
5354
5354
  Redeploy or restart the app so it loads the new configuration, then run LLM/agent workloads that generate spans; inspect Sazabi for traces tagged with the Respan adapter. Traces carry GenAI (\`gen_ai.*\`) and Traceloop (\`traceloop.*\`) attributes, which Sazabi maps to model/token/input/output fields.
5355
5355
  `;var fq=()=>{};var Iq=`## Overview
5356
5356
 
5357
+ Capture a session-scoped stream of browser activity — navigation, clicks, frustration signals, input episodes, console output, JavaScript errors, and network calls — from your web app into Sazabi.
5358
+
5359
+ ## How it works
5360
+
5361
+ Install the \`@sazabi/browser\` npm package in your web app and initialize it with your intake URL. The SDK batches OpenTelemetry log records to Sazabi, threading every event a visitor generates onto one cross-tab session id.
5362
+
5363
+ Network capture injects the W3C \`traceparent\` header into allowlisted requests, so a failed click in the browser and the backend logs that request produced share a trace id.
5364
+
5365
+ ## Streams
5366
+
5367
+ - **Navigation** — page loads and in-app route changes, including programmatic \`pushState\` navigation.
5368
+ - **Interactions** — clicks, rage clicks, dead clicks, and per-field input episodes.
5369
+ - **Network calls** — \`fetch\` and \`XMLHttpRequest\` requests with method, status, duration, and the trace context injected into them.
5370
+ - **Errors** — uncaught exceptions and unhandled promise rejections with stack traces.
5371
+ - **Console output** — \`console.error\` and \`console.warn\` mirrored into the stream.
5372
+ - **Application logs** — lines your app emits through the SDK's \`log()\`, carrying session context.
5373
+ - **Custom marks** — milestones you emit with \`addEvent()\`.
5374
+
5375
+ ## Limitations
5376
+
5377
+ - Session replay recordings are not captured or stored.
5378
+ - Input values are never captured — an input event records which field was interacted with, never what was typed.
5379
+ - Core Web Vitals and page-load timing metrics are not captured.
5380
+ `;var bq=()=>{};var Cq=`---
5381
+ name: sazabi-browser-sdk-log-source-setup
5382
+ description: Instrument a web app with the official @sazabi/browser so browser sessions stream into a Sazabi project. Use when the user wants to "add frontend observability", "instrument my web app", "connect the Sazabi browser SDK", "capture browser errors and clicks", "correlate frontend and backend logs", or after running \`sazabi log-sources skill --provider sazabi_browser_sdk\`. The Sazabi public key ships in the browser bundle by design — it can only write telemetry.
5383
+ surface: log-source
5384
+ phase: setup
5385
+ requires: sazabi_browser_sdk
5386
+ ---
5387
+
5388
+ # Sazabi Browser SDK log source setup
5389
+
5390
+ Instrument a browser app with \`@sazabi/browser\` and point it at a Sazabi keyed intake URL. Sazabi receives a session-scoped OTLP event stream — navigation, interactions, network calls with W3C trace context, console output, and errors.
5391
+
5392
+ **Principle:** Do the work. Only pause when the user must choose a Sazabi project, decide which app to instrument, or review and merge the code change.
5393
+
5394
+ ## Phase 1: Create the log source and capture the keyed intake URL
5395
+
5396
+ \`\`\`sh
5397
+ if command -v sazabi >/dev/null 2>&1; then
5398
+ SAZABI_CLI="sazabi"
5399
+ else
5400
+ SAZABI_CLI="bunx @sazabi/cli"
5401
+ fi
5402
+ \`\`\`
5403
+
5404
+ Check for an existing \`sazabi_browser_sdk\` log source:
5405
+
5406
+ \`\`\`sh
5407
+ $SAZABI_CLI log-sources list --provider sazabi_browser_sdk --json
5408
+ \`\`\`
5409
+
5410
+ If one exists, capture its \`id\` as \`INSTANCE_ID\` and recover the keyed intake URL from its log stream:
5411
+
5412
+ \`\`\`sh
5413
+ INTAKE_URL=$($SAZABI_CLI log-sources get "$INSTANCE_ID" --json \\
5414
+ | jq -r '.logSource.streams[0].endpointCards[0].url // empty')
5415
+ \`\`\`
5416
+
5417
+ If none exists, create one and capture the URL from the create response:
5418
+
5419
+ \`\`\`sh
5420
+ CREATE_JSON=$($SAZABI_CLI log-sources create web --json)
5421
+ INTAKE_URL=$(printf '%s' "$CREATE_JSON" | jq -r '.endpointCards[0].url')
5422
+ \`\`\`
5423
+
5424
+ The intake URL is all the SDK needs: the credential is embedded in its hostname, and \`init()\` derives it (the same reconstruction the intake edge performs), so a reused log source works even though its one-time plaintext key is not recoverable from \`log-sources get\`. Pass \`intakeUrl\` — with or without \`/v1/logs\` — and nothing else about credentials.
5425
+ Instrument **one app per log source** — a separate app gets its own log source so their sessions stay attributable.
5426
+
5427
+ ## Phase 2: Install the SDK
5428
+
5429
+ In the web app's repository, using its existing package manager:
5430
+
5431
+ \`\`\`sh
5432
+ bun add @sazabi/browser # or npm install / pnpm add / yarn add
5433
+ \`\`\`
5434
+
5435
+ ## Phase 3: Initialize in the entry module
5436
+
5437
+ Put the register import **first** in the app's entry module (\`src/main.tsx\`, \`src/index.ts\`, \`app/layout.tsx\`, …). It installs dormant instrumentation before any other module can capture the native \`fetch\`/\`XMLHttpRequest\`/\`history\` references. It is optional but strongly recommended: \`init()\` alone also instruments, but only at call time, and every static import in the entry file evaluates before its first statement — so an auth client or HTTP wrapper constructed at module scope wins that race. Requests that slip past are still observed through a resource-timing fallback, with a once-per-origin \`instrumentation_gap\` diagnostic naming the escaped origin.
5438
+
5439
+ \`\`\`ts
5440
+ // Import first, because a module that runs earlier can capture the native
5441
+ // fetch/XHR/history references before the SDK wraps them.
5442
+ import "@sazabi/browser/register";
5443
+
5444
+ import { init } from "@sazabi/browser";
5445
+
5446
+ init({
5447
+ intakeUrl: "<INTAKE_URL>",
5448
+ serviceName: "<app name, e.g. my-web-app>",
5449
+ serviceVersion: "<git sha, optional>",
5450
+ environment: "<production | staging | development, optional>",
5451
+ });
5452
+ \`\`\`
5453
+
5454
+ \`init()\` is idempotent and never throws into the host app. It no-ops under SSR (\`typeof window === "undefined"\`), so it is safe in a shared entry module.
5455
+
5456
+ Offer these when relevant:
5457
+
5458
+ - **Cross-origin trace correlation.** Same-origin requests get \`traceparent\` by default. For an API on another origin, add it to \`network.allowlist\` **and** confirm the API's CORS \`Access-Control-Allow-Headers\` includes \`traceparent\` — without that, the browser preflight fails and the requests break. The backend must also run each request inside the extracted trace context for its log lines to share \`otel_trace_id\`.
5459
+ - **Identity.** \`identify("user_123", { plan: "pro" })\` on sign-in and \`reset()\` on sign-out. \`reset()\` rotates the session and window ids so later activity never threads into the previous user's timeline.
5460
+ - **Custom marks.** \`addEvent("checkout_started", { cartValue: 42 })\`.
5461
+ - **Application logs.** \`log("ERROR", "checkout failed", { orderId })\` emits an app log line carrying session context.
5462
+ - **Consent gating.** Pass \`consent: () => boolean | Promise<boolean>\`; the SDK installs no listeners, patches, or network calls until it resolves true. \`identify()\` calls made while consent is pending are buffered and applied when capture starts.
5463
+ - **Quieting capture.** \`console: { capture: false }\` stops the console mirror; \`input: { capture: false }\` stops input episodes; \`network: { capture: false, propagateTraceContext: true }\` keeps trace propagation without network events.
5464
+
5465
+ ## Phase 4: Verify
5466
+
5467
+ Have the user run the app and click through a few pages. The SDK flushes every 5 seconds and again when the tab is hidden, so events land within about 10 seconds.
5468
+
5469
+ \`\`\`sh
5470
+ $SAZABI_CLI logs query --query-all --service <serviceName> --last 15m --limit 5
5471
+ \`\`\`
5472
+
5473
+ Rows carry \`web.event_type\` (\`navigation\`, \`click\`, \`rage_click\`, \`dead_click\`, \`input\`, \`network\`, \`error\`, \`custom\`, \`log\`), \`session.id\`, \`session.window_id\`, \`web.page.url\`, and \`derived.source: "sdk"\`. Network rows carry the injected \`trace_id\`; error rows carry \`exception.type\`, \`exception.message\`, and \`exception.stacktrace\`.
5474
+
5475
+ For a live tail:
5476
+
5477
+ \`\`\`sh
5478
+ $SAZABI_CLI logs tail --services <serviceName>
5479
+ \`\`\`
5480
+
5481
+ ## Troubleshooting
5482
+
5483
+ - **No requests to intake at all.** \`init()\` is not being reached — check that the entry module runs it before the framework mounts, that a \`consent\` gate is resolving true, and that build-time config values are not empty strings.
5484
+ - **POSTs return 401.** The key is deactivated or belongs to another project. Confirm with \`$SAZABI_CLI log-sources get "$INSTANCE_ID" --json\` and recreate the log source if needed.
5485
+ - **Network events appear but carry no trace id.** \`traceparent\` was not injected: the request is cross-origin and not allowlisted, or the API's CORS rejects the header. Check the browser console for a preflight failure.
5486
+ - **Some requests are missing from the stream.** A library captured native \`fetch\` before the register import ran. Move \`import "@sazabi/browser/register";\` to the true first line of the entry module. The SDK's resource-timing fallback emits degraded events plus a once-per-origin instrumentation-gap diagnostic for exactly this case.
5487
+ - **Backend logs do not join frontend network events.** The API must extract the incoming \`traceparent\` and run the request inside that context, otherwise it mints its own trace id.
5488
+
5489
+ ## Summary
5490
+
5491
+ When events are arriving, report back:
5492
+
5493
+ - The id of the \`sazabi_browser_sdk\` log source.
5494
+ - The app file where \`init()\` was added and the \`serviceName\` used.
5495
+ - Whether cross-origin trace propagation was configured, and for which origins.
5496
+
5497
+ Do not print the public key or the full keyed intake URL in the summary.
5498
+ `;var Sq=()=>{};var wq=`## Overview
5499
+
5357
5500
  Stream Sentry issue, comment, and alert events into Sazabi.
5358
5501
 
5359
5502
  ## How it works
@@ -5370,7 +5513,7 @@ Connecting your Sentry account creates a Sentry Internal Integration in your org
5370
5513
 
5371
5514
  - **Owner or Manager role in your Sentry org** — creating an Internal Integration needs \`org:write\`, which Admin, Member, and Billing roles do not have (Sentry returns 403), whether you connect your account or create the integration yourself.
5372
5515
  - To connect your account: a Sentry user auth token with these scopes (Sentry UI labels): **Organization: Read & Write** (\`org:write\`), **Project: Read** (\`project:read\`), and **Issue & Event: Read** (\`event:read\`). The \`org:write\` scope only lets Sazabi create the Internal Integration for you; the integration itself only receives read-level webhook events.
5373
- `;var bq=()=>{};var Cq=`---
5516
+ `;var vq=()=>{};var kq=`---
5374
5517
  name: sentry-platform-log-source-setup
5375
5518
  description: Connect a Sentry organization to a Sazabi project so issue, comment, and alert events stream in through a Sentry Internal Integration. Use when the user wants to "connect Sentry", "stream Sentry issues to Sazabi", "set up Sentry alerts in Sazabi", "point a Sentry webhook at Sazabi", or after running \`sazabi log-sources skill --provider sentry_platform\`. Covers both setup paths - account (Sazabi creates the Internal Integration via the Sentry API using an org:write auth token, and the single log stream auto-provisions) and endpoint (the user creates the Internal Integration themselves in Sentry's Developer Settings and points its webhook at a Sazabi keyed intake URL, no auth token shared). Distinct from the Sentry SDK log source provider, which forwards SDK telemetry via a swapped DSN.
5376
5519
  surface: log-source
@@ -5589,7 +5732,7 @@ Confirm the token is a **user auth token** minted from **Account → API → Aut
5589
5732
  ### Log source persisted but log stream stuck in \`pending\`
5590
5733
 
5591
5734
  Provisioning runs in a Temporal workflow. Wait 30 seconds and re-run \`streams list\`. If still pending after a minute, the workflow likely errored — surface \`errorMessage\` and retry by deleting the log source and re-running A2. (Endpoint-path log sources do not go through this workflow — the webhook lives entirely in Sentry.)
5592
- `;var Sq=()=>{};var wq=`## Overview
5735
+ `;var Eq=()=>{};var Pq=`## Overview
5593
5736
 
5594
5737
  Forward errors, exceptions, structured logs, and other envelope telemetry from any Sentry SDK into Sazabi.
5595
5738
 
@@ -5610,7 +5753,7 @@ Point your Sentry SDK at a Sazabi DSN. Send events only to Sazabi by swapping th
5610
5753
  ## Limitations
5611
5754
 
5612
5755
  - Sazabi does not store binary attachments, profiles, replay recordings, or native crash blobs as logs.
5613
- `;var vq=()=>{};var kq=`---
5756
+ `;var xq=()=>{};var Tq=`---
5614
5757
  name: sentry-log-source-setup
5615
5758
  description: Forward Sentry SDK telemetry to a Sazabi project by swapping the SDK DSN for Sazabi's intake-shaped DSN. Use when the user wants to "connect the Sentry SDK", "forward Sentry errors to Sazabi", "swap my Sentry DSN", or after running \`sazabi log-sources skill --provider sentry\`. Works with official Sentry clients (JavaScript, Python, Go, Ruby, Java, .NET, etc.); distinct from the Sentry Platform log source provider, which streams Sentry issues and alerts via webhooks.
5616
5759
  surface: log-source
@@ -5654,7 +5797,7 @@ sentry_sdk.init(
5654
5797
  ## Phase 3: Verify
5655
5798
 
5656
5799
  Trigger a test exception and emit a structured log. Confirm both arrive in Sazabi for this project and that ingestion is not silently blocked by CSP or outbound proxy rules.
5657
- `;var Eq=()=>{};var Pq=`## Overview
5800
+ `;var Rq=()=>{};var Oq=`## Overview
5658
5801
 
5659
5802
  Stream your Supabase Postgres, Auth, and Edge Function logs into Sazabi.
5660
5803
 
@@ -5672,7 +5815,7 @@ Set up an OpenTelemetry (OTLP) log drain in Supabase that points at Sazabi. Supa
5672
5815
 
5673
5816
  - A Supabase **Pro**, **Team**, or **Enterprise** plan. Log Drains are not available on the Free plan. You can upgrade your project plan in the Supabase dashboard under Project Settings > Billing.
5674
5817
  - Ability to add custom HTTP headers when configuring the OTLP destination.
5675
- `;var xq=()=>{};var Tq=`---
5818
+ `;var Bq=()=>{};var Dq=`---
5676
5819
  name: supabase-log-source-setup
5677
5820
  description: Connect Supabase project logs to a Sazabi project through Supabase Log Drains using OTLP over HTTP. Use when the user wants to "connect Supabase", "set up Supabase logs in Sazabi", "add a Supabase log drain", or after running \`sazabi log-sources skill --provider supabase\`. Mints a Sazabi public key and configures the drain in the Supabase dashboard pointed at Sazabi's keyed intake endpoint.
5678
5821
  surface: log-source
@@ -5713,7 +5856,7 @@ Under **Custom Headers**, Supabase pre-fills the \`Content-Type\` row when OTLP
5713
5856
  ## Phase 3: Validate
5714
5857
 
5715
5858
  Produce traffic in Supabase so new log drain batches emit. Confirm matching events appear in Sazabi for that project. If silent, verify gzip + protobuf + bearer format and that the drain is enabled for the environments you expect.
5716
- `;var Rq=()=>{};var Oq=`## Overview
5859
+ `;var _q=()=>{};var Qq=`## Overview
5717
5860
 
5718
5861
  Send OpenTelemetry logs and traces from your Temporal worker processes to Sazabi.
5719
5862
 
@@ -5729,7 +5872,7 @@ Add the OpenTelemetry SDK to each Temporal worker and point it at Sazabi. The SD
5729
5872
  ## Limitations
5730
5873
 
5731
5874
  - Worker metrics (such as \`temporal_workflow_task_execution_latency\` and \`temporal_worker_task_slots_available\`) are set up separately on the Temporal SDK runtime, and this integration does not store them yet.
5732
- `;var Bq=()=>{};var Dq=`---
5875
+ `;var Lq=()=>{};var Mq=`---
5733
5876
  name: temporal-log-source-setup
5734
5877
  description: Forward OpenTelemetry logs (and optionally traces) from Temporal worker processes to a Sazabi project. Use when the user wants to "connect Temporal", "set up Temporal worker logs in Sazabi", "ingest Temporal telemetry", or after running \`sazabi log-sources skill --provider temporal\`. Everything is configured inside the worker process and its runtime — works with Temporal Cloud and self-hosted clusters, neither of which is modified.
5735
5878
  surface: log-source
@@ -5973,7 +6116,7 @@ OTLP metrics posted to this endpoint are not currently ingested. Worker metrics
5973
6116
  ### Log source for a worker already exists
5974
6117
 
5975
6118
  Temporal log sources are per worker, so a project having several \`temporal\` log sources is expected — but the same worker should not get two. Before creating, check \`log-sources list --provider temporal --json\`; names are server-generated mnemonics, so match a log source to a worker by comparing the worker's configured OTLP endpoint hostname against each log source's log stream endpoint (\`log-sources get <id>\` → \`.logSource.streams[0].endpointCards[0].url\`). Either reuse the log source whose key the customer still has (recover the endpoint via \`log-sources get\`), or delete the stale one (\`log-sources delete <id>\`) before creating a fresh log source for that worker.
5976
- `;var _q=()=>{};var Qq=`## Overview
6119
+ `;var Nq=()=>{};var jq=`## Overview
5977
6120
 
5978
6121
  Stream Trigger.dev task logs into Sazabi.
5979
6122
 
@@ -5988,7 +6131,7 @@ Set up an OpenTelemetry log exporter in your Trigger.dev project and point it at
5988
6131
  ## Limitations
5989
6132
 
5990
6133
  - Trigger.dev alert webhooks, management-API polling, traces, and metrics are not supported.
5991
- `;var Lq=()=>{};var Mq=`---
6134
+ `;var zq=()=>{};var Fq=`---
5992
6135
  name: trigger-dev-log-source-setup
5993
6136
  description: Send Trigger.dev task logs to a Sazabi project over OTLP. Use when the user wants to "connect Trigger.dev", "set up Trigger.dev logs in Sazabi", "ingest Trigger.dev telemetry", or after running \`sazabi log-sources skill --provider trigger_dev\`. The user edits \`trigger.config.ts\` to add an OTLP export pointed at Sazabi's keyed intake and redeploys their Trigger.dev project.
5994
6137
  surface: log-source
@@ -6024,7 +6167,7 @@ Use this log source for logs only. Do not configure Trigger.dev alert webhooks,
6024
6167
  ## Phase 4: Verify
6025
6168
 
6026
6169
  Trigger a task that emits logs and confirm new records arrive in Sazabi for the project. If nothing appears, re-check that the URL includes \`/v1/logs\`, the endpoint hostname includes the \`-<publicKeyHex>\` segment, and the redeployed config uses \`telemetry.logExporters\`.
6027
- `;var Nq=()=>{};var jq=`## Overview
6170
+ `;var Uq=()=>{};var Gq=`## Overview
6028
6171
 
6029
6172
  Forward logs and traces from your infrastructure into Sazabi using Vector.
6030
6173
 
@@ -6044,7 +6187,7 @@ Add a Vector OTLP sink pointed at Sazabi and route your existing pipeline's logs
6044
6187
  ## Limitations
6045
6188
 
6046
6189
  - Sazabi accepts metrics at the intake but silently drops them.
6047
- `;var zq=()=>{};var Fq=`---
6190
+ `;var $q=()=>{};var qq=`---
6048
6191
  name: vector-log-source-setup
6049
6192
  description: Connect Vector to a Sazabi project so logs from the user's infrastructure stream into Sazabi over OTLP, with traces as an optional add-on for OTLP-shaped events. Use when the user wants to "connect Vector", "set up Vector logs in Sazabi", "forward Vector pipelines to Sazabi", or after running \`sazabi log-sources skill --provider vector\`. Adds a sink to the Vector configuration pointed at Sazabi's keyed OTLP intake endpoint.
6050
6193
  surface: log-source
@@ -6195,7 +6338,7 @@ This is the most common failure mode and almost always means the OTLP envelope i
6195
6338
  ### Partial data
6196
6339
 
6197
6340
  - Use \`vector top\` to check per-component throughput. If the transform receives events but the sink shows zero outbound, the envelope shape is likely wrong - \`tap\` the transform and verify the structure.
6198
- `;var Uq=()=>{};var Gq=`## Overview
6341
+ `;var Hq=()=>{};var Kq=`## Overview
6199
6342
 
6200
6343
  Stream logs from your Vercel serverless functions, edge functions, and static builds into Sazabi, along with OpenTelemetry traces and Web Analytics events.
6201
6344
 
@@ -6217,7 +6360,7 @@ Connect your Vercel account and Sazabi sets up and maintains [Drains](https://ve
6217
6360
  ## Limitations
6218
6361
 
6219
6362
  - The self-serve drain covers logs only — traces and Web Analytics require connecting your account.
6220
- `;var $q=()=>{};var qq=`---
6363
+ `;var Vq=()=>{};var Wq=`---
6221
6364
  name: vercel-log-source-setup
6222
6365
  description: Connect Vercel to a Sazabi project so deployment logs, OpenTelemetry traces, and Web Analytics events stream into Sazabi. Use when the user wants to "connect Vercel", "set up Vercel logs/traces in Sazabi", "ingest Vercel telemetry", "add Vercel as a log source", "add a Vercel data source", "point a Vercel log drain at Sazabi", or after running \`sazabi log-sources skill --provider vercel\`. Covers both setup paths - account (Sazabi provisions drains via Vercel's \`/v1/drains\` API using an API token) and endpoint (the user creates a log drain in the Vercel dashboard pointed at Sazabi's keyed intake URL; logs only).
6223
6366
  surface: log-source
@@ -6531,170 +6674,6 @@ A drain does not emit logs unless the Vercel project receives requests, builds,
6531
6674
  ### Existing log source without log streams (account path)
6532
6675
 
6533
6676
  If someone previously ran \`sazabi log-sources create vercel --metadata '...'\` without the corresponding \`streams create\` calls, the log source exists but \`streams list --log-source-id <id>\` returns empty. Reuse the existing \`VERCEL_INSTANCE_ID\` and continue from A4 to add log streams; do not create a second log source for the same Vercel scope.
6534
- `;var Hq=()=>{};var Kq=`## Overview
6535
-
6536
- Capture a session-scoped stream of browser activity — navigation, clicks, frustration signals, input episodes, console output, JavaScript errors, and network calls — from your web app into Sazabi.
6537
-
6538
- ## How it works
6539
-
6540
- Install the \`@sazabi/browser\` npm package in your web app and initialize it with your intake URL. The SDK batches OpenTelemetry log records to Sazabi, threading every event a visitor generates onto one cross-tab session id.
6541
-
6542
- Network capture injects the W3C \`traceparent\` header into allowlisted requests, so a failed click in the browser and the backend logs that request produced share a trace id.
6543
-
6544
- ## Streams
6545
-
6546
- - **Navigation** — page loads and in-app route changes, including programmatic \`pushState\` navigation.
6547
- - **Interactions** — clicks, rage clicks, dead clicks, and per-field input episodes.
6548
- - **Network calls** — \`fetch\` and \`XMLHttpRequest\` requests with method, status, duration, and the trace context injected into them.
6549
- - **Errors** — uncaught exceptions and unhandled promise rejections with stack traces.
6550
- - **Console output** — \`console.error\` and \`console.warn\` mirrored into the stream.
6551
- - **Application logs** — lines your app emits through the SDK's \`log()\`, carrying session context.
6552
- - **Custom marks** — milestones you emit with \`addEvent()\`.
6553
-
6554
- ## Limitations
6555
-
6556
- - Session replay recordings are not captured or stored.
6557
- - Input values are never captured — an input event records which field was interacted with, never what was typed.
6558
- - Core Web Vitals and page-load timing metrics are not captured.
6559
- `;var Vq=()=>{};var Wq=`---
6560
- name: web-log-source-setup
6561
- description: Instrument a web app with the official @sazabi/browser so browser sessions stream into a Sazabi project. Use when the user wants to "add frontend observability", "instrument my web app", "connect the Sazabi browser SDK", "capture browser errors and clicks", "correlate frontend and backend logs", or after running \`sazabi log-sources skill --provider web\`. The Sazabi public key ships in the browser bundle by design — it can only write telemetry.
6562
- surface: log-source
6563
- phase: setup
6564
- requires: web
6565
- ---
6566
-
6567
- # Web log source setup
6568
-
6569
- Instrument a browser app with \`@sazabi/browser\` and point it at a Sazabi keyed intake URL. Sazabi receives a session-scoped OTLP event stream — navigation, interactions, network calls with W3C trace context, console output, and errors.
6570
-
6571
- **Principle:** Do the work. Only pause when the user must choose a Sazabi project, decide which app to instrument, or review and merge the code change.
6572
-
6573
- ## Phase 1: Create the log source and capture the keyed intake URL
6574
-
6575
- \`\`\`sh
6576
- if command -v sazabi >/dev/null 2>&1; then
6577
- SAZABI_CLI="sazabi"
6578
- else
6579
- SAZABI_CLI="bunx @sazabi/cli"
6580
- fi
6581
- \`\`\`
6582
-
6583
- Check for an existing \`web\` log source:
6584
-
6585
- \`\`\`sh
6586
- $SAZABI_CLI log-sources list --provider web --json
6587
- \`\`\`
6588
-
6589
- If one exists, capture its \`id\` as \`INSTANCE_ID\` and recover the keyed intake URL from its log stream:
6590
-
6591
- \`\`\`sh
6592
- INTAKE_URL=$($SAZABI_CLI log-sources get "$INSTANCE_ID" --json \\
6593
- | jq -r '.logSource.streams[0].endpointCards[0].url // empty')
6594
- \`\`\`
6595
-
6596
- If none exists, create one and capture the URL from the create response:
6597
-
6598
- \`\`\`sh
6599
- CREATE_JSON=$($SAZABI_CLI log-sources create web --json)
6600
- INTAKE_URL=$(printf '%s' "$CREATE_JSON" | jq -r '.endpointCards[0].url')
6601
- \`\`\`
6602
-
6603
- Either way, derive the public key from the intake URL. The URL has the shape \`https://<publicKeyHex>.<projectRegion>.intake.<intakeDomain>\`: the key body is the first hostname label, and the full credential is \`sazabi_public_<publicKeyHex>\`. This is the same reconstruction the intake edge performs, so it also works for a **reused** log source, whose one-time plaintext key is not recoverable from \`log-sources get\`:
6604
-
6605
- \`\`\`sh
6606
- # Mirror of the grammar the intake edge itself enforces
6607
- # (terraform/main/cloudfront-functions/intake-router.js): the key is only
6608
- # reconstructed for {hex}.{region}.intake.{optional env labels.}sazabi.{dev|com}.
6609
- # A host outside that set can never authenticate, so accepting one would point
6610
- # telemetry and a write credential somewhere that is not Sazabi. Fail loudly.
6611
- KEYED_HOST_RE='^https://[0-9a-f]{32}\\.[a-z0-9-]+\\.intake\\.([a-z0-9-]+\\.)*sazabi\\.(dev|com)/?$'
6612
- printf '%s' "$INTAKE_URL" | grep -Eq "$KEYED_HOST_RE" || {
6613
- echo "unexpected intake URL: $INTAKE_URL" >&2
6614
- echo "expected https://<publicKeyHex>.<region>.intake.<domain>" >&2
6615
- exit 1
6616
- }
6617
-
6618
- KEY_HEX=$(printf '%s' "$INTAKE_URL" | sed -E 's#^https://([0-9a-f]{32})\\..*$#\\1#')
6619
- PUBLIC_KEY="sazabi_public_\${KEY_HEX}"
6620
- \`\`\`
6621
-
6622
- The SDK needs both values: \`intakeHost\` is \`INTAKE_URL\` (the SDK appends \`/v1/logs\` itself), and \`publicKey\` is \`PUBLIC_KEY\`.
6623
-
6624
- Instrument **one app per log source** — a separate app gets its own log source so their sessions stay attributable.
6625
-
6626
- ## Phase 2: Install the SDK
6627
-
6628
- In the web app's repository, using its existing package manager:
6629
-
6630
- \`\`\`sh
6631
- bun add @sazabi/browser # or npm install / pnpm add / yarn add
6632
- \`\`\`
6633
-
6634
- ## Phase 3: Initialize in the entry module
6635
-
6636
- Put the register import **first** in the app's entry module (\`src/main.tsx\`, \`src/index.ts\`, \`app/layout.tsx\`, …). It installs dormant instrumentation before any other module can capture the native \`fetch\`/\`XMLHttpRequest\`/\`history\` references. It is optional but strongly recommended: \`init()\` alone also instruments, but only at call time, and every static import in the entry file evaluates before its first statement — so an auth client or HTTP wrapper constructed at module scope wins that race. Requests that slip past are still observed through a resource-timing fallback, with a once-per-origin \`instrumentation_gap\` diagnostic naming the escaped origin.
6637
-
6638
- \`\`\`ts
6639
- // Import first, because a module that runs earlier can capture the native
6640
- // fetch/XHR/history references before the SDK wraps them.
6641
- import "@sazabi/browser/register";
6642
-
6643
- import { init } from "@sazabi/browser";
6644
-
6645
- init({
6646
- intakeHost: "<INTAKE_URL>",
6647
- publicKey: "<PUBLIC_KEY>",
6648
- serviceName: "<app name, e.g. my-web-app>",
6649
- serviceVersion: "<git sha, optional>",
6650
- environment: "<production | staging | development, optional>",
6651
- });
6652
- \`\`\`
6653
-
6654
- \`init()\` is idempotent and never throws into the host app. It no-ops under SSR (\`typeof window === "undefined"\`), so it is safe in a shared entry module.
6655
-
6656
- Offer these when relevant:
6657
-
6658
- - **Cross-origin trace correlation.** Same-origin requests get \`traceparent\` by default. For an API on another origin, add it to \`network.allowlist\` **and** confirm the API's CORS \`Access-Control-Allow-Headers\` includes \`traceparent\` — without that, the browser preflight fails and the requests break. The backend must also run each request inside the extracted trace context for its log lines to share \`otel_trace_id\`.
6659
- - **Identity.** \`identify("user_123", { plan: "pro" })\` on sign-in and \`reset()\` on sign-out. \`reset()\` rotates the session and window ids so later activity never threads into the previous user's timeline.
6660
- - **Custom marks.** \`addEvent("checkout_started", { cartValue: 42 })\`.
6661
- - **Application logs.** \`log("ERROR", "checkout failed", { orderId })\` emits an app log line carrying session context.
6662
- - **Consent gating.** Pass \`consent: () => boolean | Promise<boolean>\`; the SDK installs no listeners, patches, or network calls until it resolves true. \`identify()\` calls made while consent is pending are buffered and applied when capture starts.
6663
- - **Quieting capture.** \`console: { capture: false }\` stops the console mirror; \`input: { capture: false }\` stops input episodes; \`network: { capture: false, propagateTraceContext: true }\` keeps trace propagation without network events.
6664
-
6665
- ## Phase 4: Verify
6666
-
6667
- Have the user run the app and click through a few pages. The SDK flushes every 5 seconds and again when the tab is hidden, so events land within about 10 seconds.
6668
-
6669
- \`\`\`sh
6670
- $SAZABI_CLI logs query --query-all --service <serviceName> --last 15m --limit 5
6671
- \`\`\`
6672
-
6673
- Rows carry \`web.event_type\` (\`navigation\`, \`click\`, \`rage_click\`, \`dead_click\`, \`input\`, \`network\`, \`error\`, \`custom\`, \`log\`), \`session.id\`, \`session.window_id\`, \`web.page.url\`, and \`derived.source: "sdk"\`. Network rows carry the injected \`trace_id\`; error rows carry \`exception.type\`, \`exception.message\`, and \`exception.stacktrace\`.
6674
-
6675
- For a live tail:
6676
-
6677
- \`\`\`sh
6678
- $SAZABI_CLI logs tail --services <serviceName>
6679
- \`\`\`
6680
-
6681
- ## Troubleshooting
6682
-
6683
- - **No requests to intake at all.** \`init()\` is not being reached — check that the entry module runs it before the framework mounts, that a \`consent\` gate is resolving true, and that build-time config values are not empty strings.
6684
- - **POSTs return 401.** The key is deactivated or belongs to another project. Confirm with \`$SAZABI_CLI log-sources get "$INSTANCE_ID" --json\` and recreate the log source if needed.
6685
- - **Network events appear but carry no trace id.** \`traceparent\` was not injected: the request is cross-origin and not allowlisted, or the API's CORS rejects the header. Check the browser console for a preflight failure.
6686
- - **Some requests are missing from the stream.** A library captured native \`fetch\` before the register import ran. Move \`import "@sazabi/browser/register";\` to the true first line of the entry module. The SDK's resource-timing fallback emits degraded events plus a once-per-origin instrumentation-gap diagnostic for exactly this case.
6687
- - **Backend logs do not join frontend network events.** The API must extract the incoming \`traceparent\` and run the request inside that context, otherwise it mints its own trace id.
6688
-
6689
- ## Summary
6690
-
6691
- When events are arriving, report back:
6692
-
6693
- - The id of the \`web\` log source.
6694
- - The app file where \`init()\` was added and the \`serviceName\` used.
6695
- - Whether cross-origin trace propagation was configured, and for which origins.
6696
-
6697
- Do not print the public key or the full keyed intake URL in the summary.
6698
6677
  `;var Yq=()=>{};var Zq=`## Overview
6699
6678
 
6700
6679
  Send webhook events from any system to Sazabi as JSON — each payload is stored as a searchable log record.
@@ -6853,7 +6832,7 @@ When events are arriving, report back:
6853
6832
  - That events are landing, with payload fields preserved under \`webhook.*\`.
6854
6833
 
6855
6834
  Do not print \`PUBLIC_KEY\` (or the full keyed URL) in the summary.
6856
- `;var Xq=()=>{};var tV,nV;var oV=h(()=>{X2();tG();oG();iG();aG();lG();dG();gG();hG();fG();bG();SG();vG();EG();xG();RG();BG();_G();LG();NG();zG();UG();$G();HG();VG();YG();JG();XG();tH();oH();iH();aH();lH();dH();gH();hH();fH();bH();SH();vH();EH();xH();RH();BH();_H();LH();NH();zH();UH();$H();HH();VH();YH();JH();XH();tq();oq();iq();aq();lq();dq();gq();hq();fq();bq();Sq();vq();Eq();xq();Rq();Bq();_q();Lq();Nq();zq();Uq();$q();Hq();Vq();Yq();Jq();Xq();tV={cloudflare:cG.trim(),cloudflare_workers:rG.trim(),cloudwatch:pG.trim(),convex:IG.trim(),datadog:wG.trim(),daytona:PG.trim(),digital_ocean:OG.trim(),e2b:QG.trim(),elastic_cloud:jG.trim(),fluent_bit:GG.trim(),fly_io:KG.trim(),gcp:ZG.trim(),grafana_alloy:nH.trim(),inngest:sH.trim(),langchain:uH.trim(),mastra:mH.trim(),neon:yH.trim(),netlify:CH.trim(),openrouter:kH.trim(),otel:MH.trim(),otel_collector:TH.trim(),otel_metrics:DH.trim(),plain:FH.trim(),posthog:eq.trim(),posthog_sdk:WH.trim(),porter:qH.trim(),prometheus:rq.trim(),railway:cq.trim(),render:pq.trim(),respan:Aq.trim(),sentry:wq.trim(),sentry_platform:Iq.trim(),supabase:Pq.trim(),temporal:Oq.trim(),trigger_dev:Qq.trim(),vector:jq.trim(),vercel:Gq.trim(),web:Kq.trim(),webhook_events:Zq.trim(),claude_code:eG.trim(),codex:AG.trim()},nV={cloudflare:uG.trim(),cloudflare_workers:sG.trim(),cloudwatch:mG.trim(),convex:CG.trim(),datadog:kG.trim(),daytona:TG.trim(),digital_ocean:DG.trim(),e2b:MG.trim(),elastic_cloud:FG.trim(),fluent_bit:qG.trim(),fly_io:WG.trim(),gcp:eH.trim(),grafana_alloy:rH.trim(),inngest:cH.trim(),langchain:pH.trim(),mastra:AH.trim(),neon:IH.trim(),netlify:wH.trim(),openrouter:PH.trim(),otel:jH.trim(),otel_collector:OH.trim(),otel_metrics:QH.trim(),plain:GH.trim(),posthog:nq.trim(),posthog_sdk:ZH.trim(),porter:KH.trim(),prometheus:sq.trim(),railway:uq.trim(),render:mq.trim(),respan:yq.trim(),sentry:kq.trim(),sentry_platform:Cq.trim(),supabase:Tq.trim(),temporal:Dq.trim(),trigger_dev:Mq.trim(),vector:Fq.trim(),vercel:qq.trim(),web:Wq.trim(),webhook_events:eV.trim(),claude_code:nG.trim(),codex:yG.trim()}});var qR=(e)=>{let t=nV[e];if(t)return t;return tV[e]};var rV=h(()=>{oV()});var te="available";var VR;var iV=h(()=>{VR={perStreamInstructions:!0,groups:[{id:"enable",section:"config",title:"Enable telemetry in Claude Code settings",actions:[{instruction:"Add the following environment variables to the `env` block in `~/.claude/settings.json` — set `OTEL_EXPORTER_OTLP_ENDPOINT` to your intake URL (above).",payloads:[{kind:"code",label:"~/.claude/settings.json",language:"json",copyLabel:"Claude Code settings",value:`{
6835
+ `;var Xq=()=>{};var tV,nV;var oV=h(()=>{X2();tG();oG();iG();aG();lG();dG();gG();hG();fG();bG();SG();vG();EG();xG();RG();BG();_G();LG();NG();zG();UG();$G();HG();VG();YG();JG();XG();tH();oH();iH();aH();lH();dH();gH();hH();fH();bH();SH();vH();EH();xH();RH();BH();_H();LH();NH();zH();UH();$H();HH();VH();YH();JH();XH();tq();oq();iq();aq();lq();dq();gq();hq();fq();bq();Sq();vq();Eq();xq();Rq();Bq();_q();Lq();Nq();zq();Uq();$q();Hq();Vq();Yq();Jq();Xq();tV={cloudflare:cG.trim(),cloudflare_workers:rG.trim(),cloudwatch:pG.trim(),convex:IG.trim(),datadog:wG.trim(),daytona:PG.trim(),digital_ocean:OG.trim(),e2b:QG.trim(),elastic_cloud:jG.trim(),fluent_bit:GG.trim(),fly_io:KG.trim(),gcp:ZG.trim(),grafana_alloy:nH.trim(),inngest:sH.trim(),langchain:uH.trim(),mastra:mH.trim(),neon:yH.trim(),netlify:CH.trim(),openrouter:kH.trim(),otel:MH.trim(),otel_collector:TH.trim(),otel_metrics:DH.trim(),plain:FH.trim(),posthog:eq.trim(),posthog_sdk:WH.trim(),porter:qH.trim(),prometheus:rq.trim(),railway:cq.trim(),render:pq.trim(),respan:Aq.trim(),sentry:Pq.trim(),sentry_platform:wq.trim(),supabase:Oq.trim(),temporal:Qq.trim(),trigger_dev:jq.trim(),vector:Gq.trim(),vercel:Kq.trim(),sazabi_browser_sdk:Iq.trim(),webhook_events:Zq.trim(),claude_code:eG.trim(),codex:AG.trim()},nV={cloudflare:uG.trim(),cloudflare_workers:sG.trim(),cloudwatch:mG.trim(),convex:CG.trim(),datadog:kG.trim(),daytona:TG.trim(),digital_ocean:DG.trim(),e2b:MG.trim(),elastic_cloud:FG.trim(),fluent_bit:qG.trim(),fly_io:WG.trim(),gcp:eH.trim(),grafana_alloy:rH.trim(),inngest:cH.trim(),langchain:pH.trim(),mastra:AH.trim(),neon:IH.trim(),netlify:wH.trim(),openrouter:PH.trim(),otel:jH.trim(),otel_collector:OH.trim(),otel_metrics:QH.trim(),plain:GH.trim(),posthog:nq.trim(),posthog_sdk:ZH.trim(),porter:KH.trim(),prometheus:sq.trim(),railway:uq.trim(),render:mq.trim(),respan:yq.trim(),sentry:Tq.trim(),sentry_platform:kq.trim(),supabase:Dq.trim(),temporal:Mq.trim(),trigger_dev:Fq.trim(),vector:qq.trim(),vercel:Wq.trim(),sazabi_browser_sdk:Cq.trim(),webhook_events:eV.trim(),claude_code:nG.trim(),codex:yG.trim()}});var qR=(e)=>{let t=nV[e];if(t)return t;return tV[e]};var rV=h(()=>{oV()});var te="available";var VR;var iV=h(()=>{VR={perStreamInstructions:!0,groups:[{id:"enable",section:"config",title:"Enable telemetry in Claude Code settings",actions:[{instruction:"Add the following environment variables to the `env` block in `~/.claude/settings.json` — set `OTEL_EXPORTER_OTLP_ENDPOINT` to your intake URL (above).",payloads:[{kind:"code",label:"~/.claude/settings.json",language:"json",copyLabel:"Claude Code settings",value:`{
6857
6836
  "env": {
6858
6837
  "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
6859
6838
  "OTEL_LOGS_EXPORTER": "otlp",
@@ -6862,7 +6841,7 @@ Do not print \`PUBLIC_KEY\` (or the full keyed URL) in the summary.
6862
6841
  "OTEL_LOG_USER_PROMPTS": "1",
6863
6842
  "OTEL_LOG_ASSISTANT_RESPONSES": "0"
6864
6843
  }
6865
- }`}],notes:[{text:"`OTEL_LOG_USER_PROMPTS` exports raw prompt text (including anything you paste). Remove it to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Keep `OTEL_LOG_ASSISTANT_RESPONSES` at `0` — when unset it falls back to the prompts setting, so enabling prompts alone would also export model responses. Tool content stays redacted unless `OTEL_LOG_TOOL_DETAILS`/`OTEL_LOG_TOOL_CONTENT` are enabled."},{text:"Claude Code metrics are not ingested yet — leave `OTEL_METRICS_EXPORTER` unset; enabling it only ships traffic that Sazabi discards."}]}]},{id:"restart",section:"verify",title:"Restart Claude Code",actions:[{instruction:"Env vars load at startup — telemetry begins with your next Claude Code session, not the current one. Restart Claude Code now."}]}]}});var sV;var aV=h(()=>{iV();sV={id:"claude_code",name:"Claude Code",searchAliases:["claude","anthropic","claude-code","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"claude-code",label:"Claude Code",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Claude Code env-var setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Claude Code session telemetry — prompts, tool calls, and model API requests with token counts and cost — to Sazabi via its built-in OTLP exporter.",features:["Prompt and tool-call events","Token usage & cost per API request","Session and user attribution","No code changes required"],evidenceHints:[".claude/settings.json with CLAUDE_CODE_ENABLE_TELEMETRY or OTEL_* env vars","Claude Code CLI installed and in active use","Anthropic API key or Claude subscription usage"],setupSkill:te,dashboard:{slug:"claude-code",iconKey:"claude-code",intakeSourceId:"claude-code"}}});var KR;var cV=h(()=>{KR={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",actions:[{instruction:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{instruction:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"config",title:"Configure logs destination",actions:[{instruction:"Paste these values into Cloudflare's **Add New Destination** dialog for logs — the endpoint is your **OTLP logs endpoint** (above).",payloads:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]}]},{id:"traces",section:"config",title:"Configure traces destination",actions:[{instruction:"Paste these values into Cloudflare's **Add New Destination** dialog for traces — the endpoint is your **OTLP traces endpoint** (above).",payloads:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]}]},{id:"enable-worker",section:"config",title:"Enable destinations",actions:[{instruction:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{instruction:"Redeploy the Worker after updating Wrangler config.",notes:[{text:"The destination is enabled only after the deployed Worker references it by name."}]}]}]}});var lV;var uV=h(()=>{cV();lV={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"cloudflare-workers",label:"Cloudflare Workers Observability",aliases:["cloudflare"],transform:"otlp-strict-signal",transformOptions:{missingAuthMessage:"Missing Cloudflare Workers Observability auth: provide Authorization: Bearer <publicKey>"}}],lifecycleEligible:!0,subtitle:"Stream Cloudflare Workers Observability logs and traces to Sazabi via OTLP.",features:["Workers Observability OTLP logs","Workers Observability OTLP traces"],evidenceHints:["wrangler.toml/json config with observability or Workers deployments","@cloudflare/workers-types, hono on Workers, or Worker entrypoints such as src/worker.ts","README/docs naming Cloudflare Workers, Pages Functions, or Durable Objects"],setupSkill:te,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var vt,Nf=(e,t="http/protobuf")=>[{instruction:`Add the OpenTelemetry SDK to your ${e}.`,notes:[{text:"Most languages have official OpenTelemetry SDKs available (e.g., `@opentelemetry/api` for Node.js, `opentelemetry-api` for Python, etc.)."}]},{instruction:`Initialize OpenTelemetry in your ${e}.`},{instruction:`Set the following environment variables in your ${e} environment — \`OTEL_EXPORTER_OTLP_ENDPOINT\` is your intake URL (above).`,payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:t,copyLabel:"OTLP protocol"}],notes:[Jke]}],Jke;var Un=h(()=>{vt={label:"Connect",pendingLabel:"Connecting..."},Jke={text:"Most OpenTelemetry SDKs automatically detect these environment variables. If your SDK is already configured in code, use the same endpoint and protocol values there instead."}});var YR,WR,JR;var dV=h(()=>{Un();YR={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."}],actions:[{kind:"instruction",instruction:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions.",payloads:[{kind:"external-link",label:"Open Cloudflare API token template",href:"https://dash.cloudflare.com/profile/api-tokens?permissionGroupKeys=%5B%7B%22key%22%3A%22account_settings%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22account%22%7D%2C%7B%22key%22%3A%22logs%22%2C%22type%22%3A%22edit%22%2C%22scope%22%3A%22zone%22%7D%2C%7B%22key%22%3A%22zone%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22zone%22%7D%5D&name=Sazabi+Cloudflare+Logpush"}]},{kind:"instruction",instruction:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"Cloudflare API token",instruction:"Enter your Cloudflare API token below.",description:"Token with Account Settings Read, Zone Read, and Logs Edit permissions.",placeholder:"Enter your Cloudflare API token"},{id:"accountId",kind:"text",label:"Cloudflare account ID",instruction:"Enter your Cloudflare account ID below.",description:"The 32-character hex ID from your Cloudflare dashboard URL or account overview.",placeholder:"e.g. a1b2c3d4e5f6...",pattern:"^[a-f0-9]{32}$",patternMessage:"Enter the 32-character Cloudflare account ID."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",accountId:"$accountId"},resultAs:"validate"}],metadata:{cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudflare"},WR={content:{kind:"list",listAction:"listLogpushDatasets",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"datasetName",header:"Dataset",cell:"badge"},{field:"scopeDetail",header:"Scope"}],searchPlaceholder:"Search datasets and zones...",searchFields:["datasetName","scopeDetail"],dedupeByConfigField:["scope","zoneId","dataset"],dedupeMissingFieldAsEmpty:!0,emptyState:{noMatches:"No Logpush datasets match your search.",allConfigured:"All Logpush datasets already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{scope:"$item.scope",accountId:"$item.accountId",zoneId:"$item.zoneId",zoneName:"$item.zoneName",dataset:"$item.dataset",datasetName:"$item.datasetName"}}}},JR={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",notes:[{variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."}],actions:[{instruction:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{instruction:"Select **HTTP** as the destination type."}]},{id:"destination",section:"config",title:"Set the destination",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field."}]},{id:"output-options",section:"config",title:"Set output options",actions:[{instruction:"In the Logpush job's **Output options**, set **Timestamp format** to **RFC3339** so Sazabi can parse event times accurately."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare"}});var Zke,Xke,pV;var gV=h(()=>{dV();Zke=["cloudflareApiToken"],Xke={id:"cloudflare-logpush",label:"Cloudflare Logpush",transform:"cloudflare-logpush"},pV={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:Zke,serverOwnedStreamConfigFields:["logpushJobId"],intake:[Xke],subtitle:"Stream your Cloudflare Logpush jobs to Sazabi for edge network observability.",features:["Zone Logpush","Account Logpush","Edge analytics"],evidenceHints:["Cloudflare zones, account Logpush config, or Terraform cloudflare provider","CLOUDFLARE_* environment variables or scripts that call the Cloudflare API","README/docs naming Cloudflare for edge, DNS, CDN, firewall, or Workers traffic"],setupSkill:te,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var ZR,XR,eT,tT,nT,oT;var mV=h(()=>{Un();ZR={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},XR={id:"role-arn",title:"Enter role ARN",actions:[{id:"arn",kind:"text",label:"Role ARN",instruction:"Enter the IAM role ARN below.",placeholder:"arn:aws:iam::123456789012:role/SazabiLogIngestion-Sazabi-...",pattern:"^arn:aws:iam::(\\d{12}):role\\/[\\w+=,.@\\-\\/]+$",patternMessage:"Invalid ARN format. Expected: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"}]},eT={actions:[{kind:"validate",action:"validate",input:{projectId:"${context.projectId}",roleArn:"$arn",externalId:"${context.extras.cloudwatch.externalId}"},resultAs:"validateRole"}],metadata:{roleArn:"$arn",awsAccountId:"$validateRole.awsAccountId",externalId:"${context.extras.cloudwatch.externalId}"},displayName:"AWS Account $validateRole.awsAccountId",button:vt},tT={kind:"choice",title:"Choose setup method",description:"Select how you want to create the CloudWatch IAM role.",options:[{id:"cloudformation",label:"CloudFormation",description:"Launch a stack with the required trust and permissions.",flow:{kind:"multi-step",prefetch:ZR,steps:[{id:"prepare",title:"Launch stack",actions:[{kind:"instruction",instruction:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs.",payloads:[{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"}]},{kind:"instruction",instruction:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},XR],submit:eT}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:ZR,steps:[{id:"prepare",title:"Apply Terraform",actions:[{kind:"instruction",instruction:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs.",payloads:[{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
6844
+ }`}],notes:[{text:"`OTEL_LOG_USER_PROMPTS` exports raw prompt text (including anything you paste). Remove it to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Keep `OTEL_LOG_ASSISTANT_RESPONSES` at `0` — when unset it falls back to the prompts setting, so enabling prompts alone would also export model responses. Tool content stays redacted unless `OTEL_LOG_TOOL_DETAILS`/`OTEL_LOG_TOOL_CONTENT` are enabled."},{text:"Claude Code metrics are not ingested yet — leave `OTEL_METRICS_EXPORTER` unset; enabling it only ships traffic that Sazabi discards."}]}]},{id:"restart",section:"verify",title:"Restart Claude Code",actions:[{instruction:"Env vars load at startup — telemetry begins with your next Claude Code session, not the current one. Restart Claude Code now."}]}]}});var sV;var aV=h(()=>{iV();sV={id:"claude_code",name:"Claude Code",searchAliases:["claude","anthropic","claude-code","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"claude-code",label:"Claude Code",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Claude Code env-var setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Claude Code session telemetry — prompts, tool calls, and model API requests with token counts and cost — to Sazabi via its built-in OTLP exporter.",features:["Prompt and tool-call events","Token usage & cost per API request","Session and user attribution","No code changes required"],evidenceHints:[".claude/settings.json with CLAUDE_CODE_ENABLE_TELEMETRY or OTEL_* env vars","Claude Code CLI installed and in active use","Anthropic API key or Claude subscription usage"],setupSkill:te,dashboard:{slug:"claude-code",iconKey:"claude-code",intakeSourceId:"claude-code"}}});var KR;var cV=h(()=>{KR={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",actions:[{instruction:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{instruction:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"config",title:"Configure logs destination",actions:[{instruction:"Paste these values into Cloudflare's **Add New Destination** dialog for logs — the endpoint is your **OTLP logs endpoint** (above).",payloads:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]}]},{id:"traces",section:"config",title:"Configure traces destination",actions:[{instruction:"Paste these values into Cloudflare's **Add New Destination** dialog for traces — the endpoint is your **OTLP traces endpoint** (above).",payloads:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]}]},{id:"enable-worker",section:"config",title:"Enable destinations",actions:[{instruction:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{instruction:"Redeploy the Worker after updating Wrangler config.",notes:[{text:"The destination is enabled only after the deployed Worker references it by name."}]}]}]}});var lV;var uV=h(()=>{cV();lV={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"cloudflare-workers",label:"Cloudflare Workers Observability",aliases:["cloudflare"],transform:"otlp-strict-signal",transformOptions:{missingAuthMessage:"Missing Cloudflare Workers Observability auth: provide Authorization: Bearer <publicKey>"}}],lifecycleEligible:!0,subtitle:"Stream Cloudflare Workers Observability logs and traces to Sazabi via OTLP.",features:["Workers Observability OTLP logs","Workers Observability OTLP traces"],evidenceHints:["wrangler.toml/json config with observability or Workers deployments","@cloudflare/workers-types, hono on Workers, or Worker entrypoints such as src/worker.ts","README/docs naming Cloudflare Workers, Pages Functions, or Durable Objects"],setupSkill:te,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var vt,Nf=(e,t="http/protobuf")=>[{instruction:`Add the OpenTelemetry SDK to your ${e}.`,notes:[{text:"Most languages have official OpenTelemetry SDKs available (e.g., `@opentelemetry/api` for Node.js, `opentelemetry-api` for Python, etc.)."}]},{instruction:`Initialize OpenTelemetry in your ${e}.`},{instruction:`Set the following environment variables in your ${e} environment — \`OTEL_EXPORTER_OTLP_ENDPOINT\` is your intake URL (above).`,payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:t,copyLabel:"OTLP protocol"}],notes:[Jke]}],Jke;var Un=h(()=>{vt={label:"Connect",pendingLabel:"Connecting..."},Jke={text:"Most OpenTelemetry SDKs automatically detect these environment variables. If your SDK is already configured in code, use the same endpoint and protocol values there instead."}});var YR,WR,JR;var dV=h(()=>{Un();YR={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."}],actions:[{kind:"instruction",instruction:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions.",payloads:[{kind:"external-link",label:"Open Cloudflare API token template",href:"https://dash.cloudflare.com/profile/api-tokens?permissionGroupKeys=%5B%7B%22key%22%3A%22account_settings%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22account%22%7D%2C%7B%22key%22%3A%22logs%22%2C%22type%22%3A%22edit%22%2C%22scope%22%3A%22zone%22%7D%2C%7B%22key%22%3A%22zone%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22zone%22%7D%5D&name=Sazabi+Cloudflare+Logpush"}]},{kind:"instruction",instruction:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"Cloudflare API token",instruction:"Enter your Cloudflare API token below.",description:"Token with Account Settings Read, Zone Read, and Logs Edit permissions.",placeholder:"Enter your Cloudflare API token"},{id:"accountId",kind:"text",label:"Cloudflare account ID",instruction:"Enter your Cloudflare account ID below.",description:"The 32-character hex ID from your Cloudflare dashboard URL or account overview.",placeholder:"e.g. a1b2c3d4e5f6...",pattern:"^[a-f0-9]{32}$",patternMessage:"Enter the 32-character Cloudflare account ID."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",accountId:"$accountId"},resultAs:"validate"}],metadata:{cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/cloudflare"},WR={content:{kind:"list",listAction:"listLogpushDatasets",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"datasetName",header:"Dataset",cell:"badge"},{field:"scopeDetail",header:"Scope"}],searchPlaceholder:"Search datasets and zones...",searchFields:["datasetName","scopeDetail"],dedupeByConfigField:["scope","zoneId","dataset"],dedupeMissingFieldAsEmpty:!0,emptyState:{noMatches:"No Logpush datasets match your search.",allConfigured:"All Logpush datasets already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{scope:"$item.scope",accountId:"$item.accountId",zoneId:"$item.zoneId",zoneName:"$item.zoneName",dataset:"$item.dataset",datasetName:"$item.datasetName"}}}},JR={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",notes:[{variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."}],actions:[{instruction:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{instruction:"Select **HTTP** as the destination type."}]},{id:"destination",section:"config",title:"Set the destination",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field."}]},{id:"output-options",section:"config",title:"Set output options",actions:[{instruction:"In the Logpush job's **Output options**, set **Timestamp format** to **RFC3339** so Sazabi can parse event times accurately."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/cloudflare"}});var Zke,Xke,pV;var gV=h(()=>{dV();Zke=["cloudflareApiToken"],Xke={id:"cloudflare-logpush",label:"Cloudflare Logpush",transform:"cloudflare-logpush"},pV={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:Zke,serverOwnedStreamConfigFields:["logpushJobId"],intake:[Xke],subtitle:"Stream your Cloudflare Logpush jobs to Sazabi for edge network observability.",features:["Zone Logpush","Account Logpush","Edge analytics"],evidenceHints:["Cloudflare zones, account Logpush config, or Terraform cloudflare provider","CLOUDFLARE_* environment variables or scripts that call the Cloudflare API","README/docs naming Cloudflare for edge, DNS, CDN, firewall, or Workers traffic"],setupSkill:te,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var ZR,XR,eT,tT,nT,oT;var mV=h(()=>{Un();ZR={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},XR={id:"role-arn",title:"Enter role ARN",actions:[{id:"arn",kind:"text",label:"Role ARN",instruction:"Enter the IAM role ARN below.",placeholder:"arn:aws:iam::123456789012:role/SazabiLogIngestion-Sazabi-...",pattern:"^arn:aws:iam::(\\d{12}):role\\/[\\w+=,.@\\-\\/]+$",patternMessage:"Invalid ARN format. Expected: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"}]},eT={actions:[{kind:"validate",action:"validate",input:{projectId:"${context.projectId}",roleArn:"$arn",externalId:"${context.extras.cloudwatch.externalId}"},resultAs:"validateRole"}],metadata:{roleArn:"$arn",awsAccountId:"$validateRole.awsAccountId",externalId:"${context.extras.cloudwatch.externalId}"},displayName:"AWS Account $validateRole.awsAccountId",button:vt},tT={kind:"choice",title:"Choose setup method",description:"Select how you want to create the CloudWatch IAM role.",options:[{id:"cloudformation",label:"CloudFormation",description:"Launch a stack with the required trust and permissions.",flow:{kind:"multi-step",prefetch:ZR,steps:[{id:"prepare",title:"Launch stack",actions:[{kind:"instruction",instruction:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs.",payloads:[{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"}]},{kind:"instruction",instruction:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},XR],submit:eT}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:ZR,steps:[{id:"prepare",title:"Apply Terraform",actions:[{kind:"instruction",instruction:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs.",payloads:[{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
6866
6845
 
6867
6846
  resource "aws_iam_role" "sazabi_log_ingestion" {
6868
6847
  name = "SazabiLogIngestion"
@@ -6920,7 +6899,7 @@ EOF
6920
6899
 
6921
6900
  aws iam create-role --role-name SazabiLogIngestion --assume-role-policy-document file://trust-policy.json
6922
6901
  aws iam put-role-policy --role-name SazabiLogIngestion --policy-name SazabiLogSubscriptionManagement --policy-document file://permission-policy.json
6923
- aws iam get-role --role-name SazabiLogIngestion --query 'Role.Arn' --output text`}]}]},XR],submit:eT}}],docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudwatch"},nT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}",pattern:""},columns:[{field:"name",header:"Log group",cell:"mono"},{field:"arn",header:"Region",width:"w-32",cell:"badge",extract:"regex:^arn:aws:logs:([^:]+):",transform:"fallback:—"}],searchPlaceholder:"Search log groups...",searchFields:["name"],dedupeByConfigField:"logGroupName",infoBanner:"Only showing log groups from ${context.projectRegion}. To stream logs from other regions, create a new project for that region in Sazabi.",emptyState:{noMatches:"No log groups found.",allConfigured:"All log groups already have Sazabi log streams configured.",noResults:"No log groups found in ${context.projectRegion} region."},toStreamItem:{displayName:"$item.name",config:{logGroupName:"$item.name",logGroupArn:"$item.arn"}}}},oT={groups:[{id:"prepare",section:"config",title:"Prepare AWS access",notes:[{text:"To forward CloudWatch logs to Sazabi without granting Sazabi a cross-account IAM role, run an OpenTelemetry Collector yourself. The collector reads your log groups with the `awscloudwatch` receiver and exports OTLP to Sazabi. Sazabi never assumes a role in your account on this path."}],actions:[{instruction:"Provision an IAM identity for the collector with permission to read the target log groups, and pin the AWS region.",notes:[{text:"The collector authenticates with the standard AWS SDK credential chain (environment variables, an instance/task role, or a named profile)."}]},{instruction:"Grant that identity these minimum IAM permissions, scoped to the log groups you forward:",payloads:[{kind:"bulleted-list",items:["`logs:DescribeLogGroups`","`logs:GetLogEvents`","`logs:StartLiveTail`"]}],notes:[{text:"Alternatively, forward through a CloudWatch Logs subscription filter into a Firehose or Lambda that emits OTLP to the same endpoint. Either way the transport is customer-run OTLP, not the Sazabi-managed Kinesis path."}]}]},{id:"collector",section:"config",title:"Configure collector",description:"Use an `awscloudwatch` receiver and an `otlphttp` exporter.",notes:[{variant:"requirement",text:"Use the `opentelemetry-collector-contrib` distribution — the `awscloudwatch` receiver ships there, not in the core collector."}],actions:[{instruction:"Add this collector configuration, replacing `YOUR_AWS_REGION` with the region your log groups live in and listing the log group names you want to forward under `groups.named`.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`receivers:
6902
+ aws iam get-role --role-name SazabiLogIngestion --query 'Role.Arn' --output text`}]}]},XR],submit:eT}}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/cloudwatch"},nT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}",pattern:""},columns:[{field:"name",header:"Log group",cell:"mono"},{field:"arn",header:"Region",width:"w-32",cell:"badge",extract:"regex:^arn:aws:logs:([^:]+):",transform:"fallback:—"}],searchPlaceholder:"Search log groups...",searchFields:["name"],dedupeByConfigField:"logGroupName",infoBanner:"Only showing log groups from ${context.projectRegion}. To stream logs from other regions, create a new project for that region in Sazabi.",emptyState:{noMatches:"No log groups found.",allConfigured:"All log groups already have Sazabi log streams configured.",noResults:"No log groups found in ${context.projectRegion} region."},toStreamItem:{displayName:"$item.name",config:{logGroupName:"$item.name",logGroupArn:"$item.arn"}}}},oT={groups:[{id:"prepare",section:"config",title:"Prepare AWS access",notes:[{text:"To forward CloudWatch logs to Sazabi without granting Sazabi a cross-account IAM role, run an OpenTelemetry Collector yourself. The collector reads your log groups with the `awscloudwatch` receiver and exports OTLP to Sazabi. Sazabi never assumes a role in your account on this path."}],actions:[{instruction:"Provision an IAM identity for the collector with permission to read the target log groups, and pin the AWS region.",notes:[{text:"The collector authenticates with the standard AWS SDK credential chain (environment variables, an instance/task role, or a named profile)."}]},{instruction:"Grant that identity these minimum IAM permissions, scoped to the log groups you forward:",payloads:[{kind:"bulleted-list",items:["`logs:DescribeLogGroups`","`logs:GetLogEvents`","`logs:StartLiveTail`"]}],notes:[{text:"Alternatively, forward through a CloudWatch Logs subscription filter into a Firehose or Lambda that emits OTLP to the same endpoint. Either way the transport is customer-run OTLP, not the Sazabi-managed Kinesis path."}]}]},{id:"collector",section:"config",title:"Configure collector",description:"Use an `awscloudwatch` receiver and an `otlphttp` exporter.",notes:[{variant:"requirement",text:"Use the `opentelemetry-collector-contrib` distribution — the `awscloudwatch` receiver ships there, not in the core collector."}],actions:[{instruction:"Add this collector configuration, replacing `YOUR_AWS_REGION` with the region your log groups live in and listing the log group names you want to forward under `groups.named`.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`receivers:
6924
6903
  awscloudwatch:
6925
6904
  region: YOUR_AWS_REGION
6926
6905
  logs:
@@ -6942,7 +6921,7 @@ log_user_prompt = true
6942
6921
 
6943
6922
  [otel.exporter.otlp-http]
6944
6923
  endpoint = "https://\${context.ingestHost}/v1/logs"
6945
- protocol = "binary"`}],notes:[{text:"`log_user_prompt = true` exports raw prompt text (including anything you paste). Set it to `false` to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Codex requires the full logs URL in `endpoint` — it does not append the `/v1/logs` path itself."},{text:"Codex metrics are not ingested yet — leave `metrics_exporter` at its default; pointing it at Sazabi only ships traffic that intake discards."}]}]},{id:"restart",section:"verify",title:"Restart Codex",actions:[{instruction:"Configuration loads at startup — telemetry begins with your next Codex session, not the current one. Restart Codex now."}]}]}});var yV;var bV=h(()=>{fV();yV={id:"codex",name:"Codex",searchAliases:["openai","codex-cli","openai codex","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"codex",label:"Codex",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Codex config.toml setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Codex CLI session telemetry — prompts, tool calls, and model API requests — to Sazabi via Codex's built-in OTLP exporter.",features:["Prompt and tool-call events","Model API request metadata","Session and user attribution","No code changes required"],evidenceHints:["~/.codex/config.toml or .codex/ project configuration","Codex CLI installed and in active use","AGENTS.md files authored for Codex"],setupSkill:te,dashboard:{slug:"codex",iconKey:"codex",intakeSourceId:"codex"}}});var iT,sT,aT;var IV=h(()=>{Un();iT={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",actions:[{kind:"instruction",instruction:"Create a team access token in your [Convex dashboard team settings](https://dashboard.convex.dev)."},{id:"token",kind:"secret",label:"Team access token",instruction:"Enter your team access token below.",placeholder:"eyJ..."}]},{id:"team",title:"Choose team",actions:[{id:"team",kind:"select",label:"Team",instruction:"Select the Convex team whose deployments Sazabi should list.",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:vt}},sT={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",notes:[{variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."}],actions:[{instruction:"In your [Convex dashboard](https://dashboard.convex.dev), open the deployment you want to forward, then go to **Settings > Integrations** and configure a **Webhook** log stream.",notes:[{text:"Log streams are **per deployment** — repeat this setup for each deployment you want to forward. To onboard many deployments at once, connect your Convex account instead and Sazabi creates the log streams for you."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook configuration."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — run a Convex function or hit a deployed endpoint. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/convex"},aT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"slug",header:"Slug",width:"w-48",cell:"muted"}],searchPlaceholder:"Search deployments...",searchFields:["name"],dedupeByConfigField:"deploymentId",emptyState:{noMatches:"No deployments found.",allConfigured:"All deployments already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{deploymentId:"$item.id",deploymentName:"$item.name"}}}}});var txe,nxe,SV;var CV=h(()=>{IV();txe=["accessToken"],nxe={id:"convex",label:"Convex",transform:"convex-webhook"},SV={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:txe,serverOwnedStreamConfigFields:["logStreamId"],secretStreamConfigFields:["deployKey"],intake:[nxe],subtitle:"Forward your Convex deployment logs directly to Sazabi for serverless observability.",features:["Function logs","Database mutations","Scheduled job monitoring"],evidenceHints:["convex/ directory, convex.json, or convex package imports","CONVEX_* or NEXT_PUBLIC_CONVEX_URL environment variables","README/docs naming Convex for serverless functions or database state"],setupSkill:te,dashboard:{iconKey:"convex",intakeSourceId:"convex",streamSelectorLayout:"sidepanel",actions:{list:{options:{procedure:"convex.listTeams",itemsField:"teams",sensitiveInputFields:["token"]},list:{procedure:"convex.listDeployments",itemsField:"deployments",sensitiveInputFields:["token"]}}}}}});var cT;var vV=h(()=>{cT={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/datadog",perStreamInstructions:!0,groups:[{id:"configure",section:"config",title:"Configure the Datadog Agent",actions:[{instruction:"Choose how this Datadog Agent should ship logs to Sazabi, then apply the matching configuration.",payloads:[{kind:"options",options:[{id:"datadog-yaml-dual-ship",label:"`datadog.yaml` dual-ship",description:"Keep the Agent's Datadog API key and add Sazabi as an additional logs endpoint.",payloads:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host",description:"Use this host in `logs_config.additional_endpoints`."},{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
6924
+ protocol = "binary"`}],notes:[{text:"`log_user_prompt = true` exports raw prompt text (including anything you paste). Set it to `false` to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Codex requires the full logs URL in `endpoint` — it does not append the `/v1/logs` path itself."},{text:"Codex metrics are not ingested yet — leave `metrics_exporter` at its default; pointing it at Sazabi only ships traffic that intake discards."}]}]},{id:"restart",section:"verify",title:"Restart Codex",actions:[{instruction:"Configuration loads at startup — telemetry begins with your next Codex session, not the current one. Restart Codex now."}]}]}});var yV;var bV=h(()=>{fV();yV={id:"codex",name:"Codex",searchAliases:["openai","codex-cli","openai codex","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"codex",label:"Codex",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Codex config.toml setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Codex CLI session telemetry — prompts, tool calls, and model API requests — to Sazabi via Codex's built-in OTLP exporter.",features:["Prompt and tool-call events","Model API request metadata","Session and user attribution","No code changes required"],evidenceHints:["~/.codex/config.toml or .codex/ project configuration","Codex CLI installed and in active use","AGENTS.md files authored for Codex"],setupSkill:te,dashboard:{slug:"codex",iconKey:"codex",intakeSourceId:"codex"}}});var iT,sT,aT;var IV=h(()=>{Un();iT={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",actions:[{kind:"instruction",instruction:"Create a team access token in your [Convex dashboard team settings](https://dashboard.convex.dev)."},{id:"token",kind:"secret",label:"Team access token",instruction:"Enter your team access token below.",placeholder:"eyJ..."}]},{id:"team",title:"Choose team",actions:[{id:"team",kind:"select",label:"Team",instruction:"Select the Convex team whose deployments Sazabi should list.",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:vt}},sT={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",notes:[{variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."}],actions:[{instruction:"In your [Convex dashboard](https://dashboard.convex.dev), open the deployment you want to forward, then go to **Settings > Integrations** and configure a **Webhook** log stream.",notes:[{text:"Log streams are **per deployment** — repeat this setup for each deployment you want to forward. To onboard many deployments at once, connect your Convex account instead and Sazabi creates the log streams for you."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook configuration."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — run a Convex function or hit a deployed endpoint. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/convex"},aT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"slug",header:"Slug",width:"w-48",cell:"muted"}],searchPlaceholder:"Search deployments...",searchFields:["name"],dedupeByConfigField:"deploymentId",emptyState:{noMatches:"No deployments found.",allConfigured:"All deployments already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{deploymentId:"$item.id",deploymentName:"$item.name"}}}}});var txe,nxe,SV;var CV=h(()=>{IV();txe=["accessToken"],nxe={id:"convex",label:"Convex",transform:"convex-webhook"},SV={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:txe,serverOwnedStreamConfigFields:["logStreamId"],secretStreamConfigFields:["deployKey"],intake:[nxe],subtitle:"Forward your Convex deployment logs directly to Sazabi for serverless observability.",features:["Function logs","Database mutations","Scheduled job monitoring"],evidenceHints:["convex/ directory, convex.json, or convex package imports","CONVEX_* or NEXT_PUBLIC_CONVEX_URL environment variables","README/docs naming Convex for serverless functions or database state"],setupSkill:te,dashboard:{iconKey:"convex",intakeSourceId:"convex",streamSelectorLayout:"sidepanel",actions:{list:{options:{procedure:"convex.listTeams",itemsField:"teams",sensitiveInputFields:["token"]},list:{procedure:"convex.listDeployments",itemsField:"deployments",sensitiveInputFields:["token"]}}}}}});var cT;var vV=h(()=>{cT={docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/datadog",perStreamInstructions:!0,groups:[{id:"configure",section:"config",title:"Configure the Datadog Agent",actions:[{instruction:"Choose how this Datadog Agent should ship logs to Sazabi, then apply the matching configuration.",payloads:[{kind:"options",options:[{id:"datadog-yaml-dual-ship",label:"`datadog.yaml` dual-ship",description:"Keep the Agent's Datadog API key and add Sazabi as an additional logs endpoint.",payloads:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host",description:"Use this host in `logs_config.additional_endpoints`."},{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
6946
6925
  logs_enabled: true
6947
6926
 
6948
6927
  # Send a copy of logs to Sazabi while the primary Agent config
@@ -6965,7 +6944,7 @@ DD_API_KEY=any-non-empty-value
6965
6944
  DD_LOGS_ENABLED=true
6966
6945
  DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
6967
6946
  DD_LOGS_CONFIG_LOGS_DD_URL=https://\${context.ingestHost}
6968
- DD_LOGS_CONFIG_FORCE_USE_HTTP=true`}],notes:[{text:"`DD_API_KEY` is not used by Sazabi — the intake URL carries your public key in the hostname — but the Datadog Agent requires it to be a non-empty value to start."}]}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart or redeploy the Agent after applying the config.",actions:[{instruction:"Restart or redeploy the Agent so it picks up the updated configuration.",notes:[{variant:"requirement",text:"Avoid configuring both a Sazabi additional endpoint and a Sazabi-only logs URL in the same Agent, or you may send duplicate logs."}]}]}]}});var wV;var EV=h(()=>{vV();wV={id:"datadog",name:"Datadog Agent",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"datadog",label:"Datadog",transform:"datadog-agent"}],lifecycleSkipReason:"Manual SDK/agent setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward your Datadog Agent logs directly to Sazabi for AI-powered observability.",features:["Agent log forwarding","Minimal configuration","Keep existing setup"],evidenceHints:["datadog-agent config, DD_* environment variables, or docker-compose Datadog sidecars","dd-trace, @datadog/*, datadog-lambda-js, or Datadog CI/deploy scripts","README/docs naming Datadog as the current logs, metrics, traces, or APM provider"],setupSkill:te,dashboard:{iconKey:"datadog",intakeSourceId:"datadog"}}});var lT;var kV=h(()=>{lT={groups:[{id:"open-settings",section:"config",title:"Open OpenTelemetry card",notes:[{variant:"requirement",text:"The OpenTelemetry card is visible to organization owners only."}],actions:[{instruction:"Open the [Daytona dashboard](https://app.daytona.io), choose your organization, open **Settings**, and find the **OpenTelemetry** card."}]},{id:"values",section:"config",title:"Set OTLP values",actions:[{instruction:"Set the **OTLP Endpoint** on the Daytona OpenTelemetry card to your intake URL (above)."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the OpenTelemetry card, then restart or start a sandbox.",payloads:[{kind:"bulleted-list",items:["Filter in Sazabi using the resource attributes Daytona stamps on each record: `daytona_organization_id`, `daytona_region_id`, `daytona_snapshot`.","Sazabi currently stores logs and traces from this source. Metrics sent to the endpoint aren't stored yet.","Daytona only retains sandbox telemetry for 3 days in its own dashboard, so Sazabi is the durable store."]}],notes:[{text:"Sandboxes begin exporting telemetry automatically on their next start with no per-sandbox change required."}]}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/daytona"}});var xV;var PV=h(()=>{kV();xV={id:"daytona",name:"Daytona",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"daytona",label:"Daytona",transform:"otlp-signal-dispatch",transformOptions:{unsupportedPathMessage:"Unsupported Daytona OTLP path: expected /v1/logs, /v1/traces, or /v1/metrics",metricsWarningMessage:"Daytona metrics received but not yet supported"}}],lifecycleSkipReason:"Manual webhook setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream sandbox telemetry from your Daytona organization to Sazabi via org-level OpenTelemetry export.",features:["Org-level OTLP logs and traces","Sandbox resource attributes (organization, region, snapshot)","Durable retention beyond Daytona's 3-day window"],evidenceHints:["Daytona SDK/CLI usage, Daytona sandbox config, or DAYTONA_* environment variables","Code execution sandbox infrastructure backed by Daytona snapshots","README/docs naming Daytona for agent or development sandboxes"],setupSkill:te,dashboard:{iconKey:"daytona",intakeSourceId:"daytona"}}});var uT,dT,pT;var RV=h(()=>{Un();uT={kind:"multi-step",steps:[{id:"prepare",title:"Create access token",actions:[{kind:"instruction",instruction:"Create a [DigitalOcean personal access token](https://cloud.digitalocean.com/account/api/tokens) with **Full Access** scope, or use Custom Scopes with `app:read`, `app:update`, `actions:read`, `regions:read`, and `sizes:read` so Sazabi can set up log forwarding on your apps."}]},{id:"credentials",title:"Enter access token",actions:[{id:"token",kind:"secret",label:"Personal access token",instruction:"Enter your personal access token below.",placeholder:"dop_v1_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"}}],metadata:{apiToken:"$token"},button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/digitalocean"},dT={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/digital-ocean",groups:[{id:"open-log-forwarding",section:"config",title:"Open Log Forwarding",actions:[{instruction:"In the [DigitalOcean control panel](https://cloud.digitalocean.com/apps), open the App Platform app you want to forward, then go to **Settings > Log Forwarding** and add a **Datadog** destination. You can also add the destination through your app spec (`app.yaml`) or `doctl apps update`."},{instruction:"Repeat this setup for every app you want to forward — log destinations are configured **per app** and attach to each service, worker, and job.",notes:[{text:"To add forwarding across an app in one step from a picker, connect your DigitalOcean account instead."},{text:"App Platform Functions, Droplets, Spaces, Managed Databases, and Managed Kubernetes are not covered by this path — forward those with Sazabi's [OpenTelemetry endpoint](https://docs.sazabi.com/data/sources/endpoint/opentelemetry)."}]}]},{id:"endpoint",section:"config",title:"Set Datadog destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Endpoint (API URL)** field, and this key into the **API key** field.",payloads:[{kind:"copyable",label:"Datadog API key",value:"${context.publicKey}",copyLabel:"Sazabi public key",description:"App Platform requires a Datadog API key field — the key embedded in the endpoint hostname is what actually authenticates the log stream."}]}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log destination, then trigger activity — deploy the app or hit one of its routes. Logs appear in Sazabi within a few minutes."}]}]},pT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"componentCount",header:"Components",width:"w-40",cell:"badge"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appId",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured.",noItems:"No App Platform apps found in this DigitalOcean account. Create an app in DigitalOcean first, then return here to forward its logs."},toStreamItem:{displayName:"$item.name",config:{appId:"$item.id",appName:"$item.name"}}}}});var oxe,rxe,TV;var BV=h(()=>{RV();oxe=["apiToken"],rxe={id:"digital-ocean",label:"DigitalOcean",transform:"datadog-agent"},TV={id:"digital_ocean",name:"DigitalOcean",searchAliases:["digital ocean","do"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:oxe,serverOwnedStreamConfigFields:["logDestinationName"],intake:[rxe],subtitle:"Forward your DigitalOcean infrastructure logs directly to Sazabi for unified observability.",features:["Log forwarding","App Platform logs"],evidenceHints:[".do/app.yaml, DigitalOcean App Platform specs, or doctl scripts","DIGITALOCEAN_* environment variables or Terraform digitalocean provider resources","README/docs naming DigitalOcean Apps, Droplets, Kubernetes, or Spaces"],setupSkill:te,dashboard:{iconKey:"digital-ocean",intakeSourceId:"digital-ocean",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-text",header:"App",width:"w-32",configField:"appName",fallbackLabel:"Unknown app"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate-token",sensitiveInputFields:["token"]}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var ixe,gT;var OV=h(()=>{ixe=[{instruction:"Set `SAZABI_INTAKE_URL` to your intake URL (above) in the application that creates E2B sandboxes."}],gT={groups:[{id:"values",section:"config",title:"Set environment variables",actions:ixe},{id:"instrument",section:"config",title:"Instrument sandbox logs",actions:[{instruction:"Emit sandbox stdout and stderr through the OpenTelemetry logs SDK.",payloads:[{kind:"code-tabs",label:"SDK integration",tabs:[{id:"typescript",label:"TypeScript",language:"typescript",value:`import { Sandbox } from '@e2b/code-interpreter'
6947
+ DD_LOGS_CONFIG_FORCE_USE_HTTP=true`}],notes:[{text:"`DD_API_KEY` is not used by Sazabi — the intake URL carries your public key in the hostname — but the Datadog Agent requires it to be a non-empty value to start."}]}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart or redeploy the Agent after applying the config.",actions:[{instruction:"Restart or redeploy the Agent so it picks up the updated configuration.",notes:[{variant:"requirement",text:"Avoid configuring both a Sazabi additional endpoint and a Sazabi-only logs URL in the same Agent, or you may send duplicate logs."}]}]}]}});var wV;var EV=h(()=>{vV();wV={id:"datadog",name:"Datadog Agent",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"datadog",label:"Datadog",transform:"datadog-agent"}],lifecycleSkipReason:"Manual SDK/agent setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward your Datadog Agent logs directly to Sazabi for AI-powered observability.",features:["Agent log forwarding","Minimal configuration","Keep existing setup"],evidenceHints:["datadog-agent config, DD_* environment variables, or docker-compose Datadog sidecars","dd-trace, @datadog/*, datadog-lambda-js, or Datadog CI/deploy scripts","README/docs naming Datadog as the current logs, metrics, traces, or APM provider"],setupSkill:te,dashboard:{iconKey:"datadog",intakeSourceId:"datadog"}}});var lT;var kV=h(()=>{lT={groups:[{id:"open-settings",section:"config",title:"Open OpenTelemetry card",notes:[{variant:"requirement",text:"The OpenTelemetry card is visible to organization owners only."}],actions:[{instruction:"Open the [Daytona dashboard](https://app.daytona.io), choose your organization, open **Settings**, and find the **OpenTelemetry** card."}]},{id:"values",section:"config",title:"Set OTLP values",actions:[{instruction:"Set the **OTLP Endpoint** on the Daytona OpenTelemetry card to your intake URL (above)."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the OpenTelemetry card, then restart or start a sandbox.",payloads:[{kind:"bulleted-list",items:["Filter in Sazabi using the resource attributes Daytona stamps on each record: `daytona_organization_id`, `daytona_region_id`, `daytona_snapshot`.","Sazabi currently stores logs and traces from this source. Metrics sent to the endpoint aren't stored yet.","Daytona only retains sandbox telemetry for 3 days in its own dashboard, so Sazabi is the durable store."]}],notes:[{text:"Sandboxes begin exporting telemetry automatically on their next start with no per-sandbox change required."}]}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/daytona"}});var xV;var PV=h(()=>{kV();xV={id:"daytona",name:"Daytona",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"daytona",label:"Daytona",transform:"otlp-signal-dispatch",transformOptions:{unsupportedPathMessage:"Unsupported Daytona OTLP path: expected /v1/logs, /v1/traces, or /v1/metrics",metricsWarningMessage:"Daytona metrics received but not yet supported"}}],lifecycleSkipReason:"Manual webhook setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream sandbox telemetry from your Daytona organization to Sazabi via org-level OpenTelemetry export.",features:["Org-level OTLP logs and traces","Sandbox resource attributes (organization, region, snapshot)","Durable retention beyond Daytona's 3-day window"],evidenceHints:["Daytona SDK/CLI usage, Daytona sandbox config, or DAYTONA_* environment variables","Code execution sandbox infrastructure backed by Daytona snapshots","README/docs naming Daytona for agent or development sandboxes"],setupSkill:te,dashboard:{iconKey:"daytona",intakeSourceId:"daytona"}}});var uT,dT,pT;var RV=h(()=>{Un();uT={kind:"multi-step",steps:[{id:"prepare",title:"Create access token",actions:[{kind:"instruction",instruction:"Create a [DigitalOcean personal access token](https://cloud.digitalocean.com/account/api/tokens) with **Full Access** scope, or use Custom Scopes with `app:read`, `app:update`, `actions:read`, `regions:read`, and `sizes:read` so Sazabi can set up log forwarding on your apps."}]},{id:"credentials",title:"Enter access token",actions:[{id:"token",kind:"secret",label:"Personal access token",instruction:"Enter your personal access token below.",placeholder:"dop_v1_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"}}],metadata:{apiToken:"$token"},button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/digitalocean"},dT={docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/digital-ocean",groups:[{id:"open-log-forwarding",section:"config",title:"Open Log Forwarding",actions:[{instruction:"In the [DigitalOcean control panel](https://cloud.digitalocean.com/apps), open the App Platform app you want to forward, then go to **Settings > Log Forwarding** and add a **Datadog** destination. You can also add the destination through your app spec (`app.yaml`) or `doctl apps update`."},{instruction:"Repeat this setup for every app you want to forward — log destinations are configured **per app** and attach to each service, worker, and job.",notes:[{text:"To add forwarding across an app in one step from a picker, connect your DigitalOcean account instead."},{text:"App Platform Functions, Droplets, Spaces, Managed Databases, and Managed Kubernetes are not covered by this path — forward those with Sazabi's [OpenTelemetry endpoint](https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/opentelemetry)."}]}]},{id:"endpoint",section:"config",title:"Set Datadog destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Endpoint (API URL)** field, and this key into the **API key** field.",payloads:[{kind:"copyable",label:"Datadog API key",value:"${context.publicKey}",copyLabel:"Sazabi public key",description:"App Platform requires a Datadog API key field — the key embedded in the endpoint hostname is what actually authenticates the log stream."}]}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log destination, then trigger activity — deploy the app or hit one of its routes. Logs appear in Sazabi within a few minutes."}]}]},pT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"componentCount",header:"Components",width:"w-40",cell:"badge"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appId",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured.",noItems:"No App Platform apps found in this DigitalOcean account. Create an app in DigitalOcean first, then return here to forward its logs."},toStreamItem:{displayName:"$item.name",config:{appId:"$item.id",appName:"$item.name"}}}}});var oxe,rxe,TV;var BV=h(()=>{RV();oxe=["apiToken"],rxe={id:"digital-ocean",label:"DigitalOcean",transform:"datadog-agent"},TV={id:"digital_ocean",name:"DigitalOcean",searchAliases:["digital ocean","do"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:oxe,serverOwnedStreamConfigFields:["logDestinationName"],intake:[rxe],subtitle:"Forward your DigitalOcean infrastructure logs directly to Sazabi for unified observability.",features:["Log forwarding","App Platform logs"],evidenceHints:[".do/app.yaml, DigitalOcean App Platform specs, or doctl scripts","DIGITALOCEAN_* environment variables or Terraform digitalocean provider resources","README/docs naming DigitalOcean Apps, Droplets, Kubernetes, or Spaces"],setupSkill:te,dashboard:{iconKey:"digital-ocean",intakeSourceId:"digital-ocean",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-text",header:"App",width:"w-32",configField:"appName",fallbackLabel:"Unknown app"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate-token",sensitiveInputFields:["token"]}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var ixe,gT;var OV=h(()=>{ixe=[{instruction:"Set `SAZABI_INTAKE_URL` to your intake URL (above) in the application that creates E2B sandboxes."}],gT={groups:[{id:"values",section:"config",title:"Set environment variables",actions:ixe},{id:"instrument",section:"config",title:"Instrument sandbox logs",actions:[{instruction:"Emit sandbox stdout and stderr through the OpenTelemetry logs SDK.",payloads:[{kind:"code-tabs",label:"SDK integration",tabs:[{id:"typescript",label:"TypeScript",language:"typescript",value:`import { Sandbox } from '@e2b/code-interpreter'
6969
6948
  import { logs, SeverityNumber } from '@opentelemetry/api-logs'
6970
6949
  import { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'
6971
6950
  import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'
@@ -7174,7 +7153,7 @@ output {
7174
7153
  port 443
7175
7154
  logs_uri /v1/logs
7176
7155
  tls on
7177
- tls.verify on`}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",actions:[{instruction:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity.",notes:[{text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}]}});var zV;var jV=h(()=>{MV();zV={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"fluent-bit",label:"Fluent Bit",transform:"otlp-passthrough"}],subtitle:"Forward logs from your Kubernetes cluster or any infrastructure to Sazabi using the Fluent Bit agent.",features:["Kubernetes DaemonSet","Container log collection","Multi-pipeline routing","Low resource footprint"],evidenceHints:["fluent-bit.conf, parsers.conf, Helm values, or Kubernetes DaemonSets","Fluent Bit outputs already shipping container logs","README/docs naming Fluent Bit as the log forwarder"],setupSkill:te,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var AT,fT,yT;var UV=h(()=>{Un();AT={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a read-only organization token from the CLI or the Fly.io dashboard.",payloads:[{kind:"options",options:[{id:"cli",label:"CLI",payloads:[{kind:"code",language:"bash",copyLabel:"flyctl read-only token command",value:"flyctl tokens create readonly -o <org-slug>"}]},{id:"dashboard",label:"Dashboard",payloads:[{kind:"external-link",label:"Open the Fly.io dashboard",href:"https://fly.io/dashboard",description:"Open the org's Tokens tab and create a read-only token."}]}]}]}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Fly.io API token below.",placeholder:"FlyV1 ..."},{id:"orgSlug",kind:"text",label:"Organization slug",instruction:"Enter your organization slug below.",placeholder:"personal"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{provider:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{apiToken:"$token",organizationSlug:"$orgSlug"},button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},fT={groups:[{id:"shipper",section:"config",title:"Run a log shipper",description:"Fly.io has no managed log-drain API, so you run a log shipper inside your Fly organization and point it at Sazabi.",notes:[{text:"The shipper reads Fly's internal NATS log stream, so it must run in the **same Fly organization** as the apps you want to monitor. The shipper is required either way — to also let Sazabi discover and verify your apps from a read-only token, connect your Fly.io account instead."}],actions:[{instruction:"Pick a log-shipper option — you run **one**, not both. **Option A — fly-log-shipper (simplest):** launch the stock [superfly/fly-log-shipper](https://github.com/superfly/fly-log-shipper) image in your org and enable its generic `http` sink with the two secrets below; Sazabi parses Fly's native JSON event format directly. **Option B — dedicated OTLP shipper:** for per-app keys and richer OTLP resource attributes, build a Vector app that wraps events in an OTLP `resourceLogs` envelope and POSTs to the OTLP endpoint below."}]},{id:"endpoint",section:"config",title:"Set the shipper secrets",actions:[{instruction:"Set the fly-log-shipper secrets (Option A): `HTTP_URL` is your intake URL (above); `HTTP_TOKEN` is the key below.",payloads:[{kind:"copyable",label:"`HTTP_TOKEN`",value:"${context.publicKey}",description:"Your Sazabi public key, sent as a bearer token. Paste the raw key with no `Bearer ` prefix."},{kind:"code",label:"Set both secrets on the shipper app",language:"bash",value:'fly secrets set -a <log-shipper-app> \\\n HTTP_URL="https://${context.ingestHost}/fly-log-shipper" \\\n HTTP_TOKEN="${context.publicKey}"'}]},{instruction:"If you chose the dedicated OTLP shipper (Option B), POST OTLP `resourceLogs` to the endpoint below — with the same public key as a bearer token — instead of setting the two secrets above.",payloads:[{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs"}]}]},{id:"verify",section:"verify",title:"Deploy and verify",actions:[{instruction:"Deploy the shipper, then trigger activity — deploy an app or hit a deployed route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/fly-io"},yT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appName",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{appName:"$item.name"}}}}});var sxe,axe,FV;var $V=h(()=>{UV();sxe=["apiToken"],axe={id:"fly-io",label:"Fly.io",transform:"otlp-with-fly-log-shipper"},FV={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:sxe,serverOwnedStreamConfigFields:["webhookUrl"],intake:[axe],subtitle:"Forward your Fly.io application logs directly to Sazabi for global monitoring.",features:["Log shipping","Multi-region logs","Machine monitoring"],evidenceHints:["fly.toml or .fly/ app configuration","FLY_* environment variables or scripts that run flyctl/fly deploy","README/docs naming Fly.io as the deployment host"],setupSkill:te,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"logSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var bT,IT,ST;var GV=h(()=>{Un();bT={kind:"choice",title:"Choose setup method",description:"Select how you want to connect Google Cloud logs.",options:[{id:"service-account",label:"Service account",description:"Let Sazabi set up the log sink, Pub/Sub topic, and pull subscription automatically.",flow:{kind:"multi-step",steps:[{id:"prepare",title:"Prepare access",description:"Create a service account key with permissions for log forwarding.",notes:[{text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."}],actions:[{kind:"instruction",instruction:"Grant the service account the following roles on the target GCP project(s).",payloads:[{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}],notes:[{text:'New or auto-created projects (for example a `gen-lang-client-...` project from Google AI Studio) may also need the Service Usage API enabled first. Sazabi uses that API to turn on the others, but it cannot enable itself. If you hit a "Service Usage API has not been used / is disabled" error, enable it on the project, wait about a minute, then retry.'}]},{kind:"instruction",instruction:"To create the key: go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) in the Google Cloud Console, select (or create) the service account, open **Keys**, then choose **Add key → Create new key → JSON**. Download the file — you'll paste its contents in the next step. Alternatively, use `gcloud iam service-accounts keys create sazabi-key.json --iam-account=YOUR_SERVICE_ACCOUNT_EMAIL`.",payloads:[{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"}]}]},{id:"credentials",title:"Enter service account key",actions:[{id:"key",kind:"secret",label:"Service account key (JSON)",instruction:"Paste your service account key JSON below.",placeholder:'{"type": "service_account", "project_id": "...", ...}'}]}],submit:{actions:[{kind:"validate",action:"validate",input:{serviceAccountKey:"$key"},resultAs:"validateKey"},{kind:"preflight",action:"preflight",input:{serviceAccountKey:"$key"}}],metadata:{serviceAccountKey:"$key"},displayName:"GCP $validateKey.projectId",button:vt}}},{id:"connectionless",label:"Your own collector",description:"Configure the sink, Pub/Sub topic, and collector yourself.",flow:{kind:"connectionless"}}],docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/gcp"},IT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"displayName",header:"Name"},{field:"projectId",header:"Project ID",width:"w-48",cell:"muted"}],searchPlaceholder:"Search projects...",searchFields:["displayName","projectId"],dedupeByConfigField:"gcpProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All accessible projects already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{gcpProjectId:"$item.projectId",gcpProjectName:"$item.displayName"}}}},ST={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/gcp",groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",notes:[{variant:"requirement",text:"Required GCP permissions: the person performing these steps needs a role that grants `logging.sinks.create` (e.g. `roles/logging.configWriter`) and `pubsub.topics.setIamPolicy` (e.g. `roles/pubsub.admin`)."}],actions:[{instruction:"Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`)."},{instruction:"Create a Cloud Logging sink that routes logs to the Pub/Sub topic. Grant the sink's service account the `roles/pubsub.publisher` role on the topic."},{instruction:"Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution."},{instruction:"Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."}]},{id:"collector",section:"config",title:"Configure collector",notes:[{variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."}],actions:[{instruction:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
7156
+ tls.verify on`}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",actions:[{instruction:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity.",notes:[{text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}]}});var zV;var jV=h(()=>{MV();zV={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"fluent-bit",label:"Fluent Bit",transform:"otlp-passthrough"}],subtitle:"Forward logs from your Kubernetes cluster or any infrastructure to Sazabi using the Fluent Bit agent.",features:["Kubernetes DaemonSet","Container log collection","Multi-pipeline routing","Low resource footprint"],evidenceHints:["fluent-bit.conf, parsers.conf, Helm values, or Kubernetes DaemonSets","Fluent Bit outputs already shipping container logs","README/docs naming Fluent Bit as the log forwarder"],setupSkill:te,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var AT,fT,yT;var UV=h(()=>{Un();AT={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a read-only organization token from the CLI or the Fly.io dashboard.",payloads:[{kind:"options",options:[{id:"cli",label:"CLI",payloads:[{kind:"code",language:"bash",copyLabel:"flyctl read-only token command",value:"flyctl tokens create readonly -o <org-slug>"}]},{id:"dashboard",label:"Dashboard",payloads:[{kind:"external-link",label:"Open the Fly.io dashboard",href:"https://fly.io/dashboard",description:"Open the org's Tokens tab and create a read-only token."}]}]}]}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Fly.io API token below.",placeholder:"FlyV1 ..."},{id:"orgSlug",kind:"text",label:"Organization slug",instruction:"Enter your organization slug below.",placeholder:"personal"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{provider:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{apiToken:"$token",organizationSlug:"$orgSlug"},button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/fly-io"},fT={groups:[{id:"shipper",section:"config",title:"Run a log shipper",description:"Fly.io has no managed log-drain API, so you run a log shipper inside your Fly organization and point it at Sazabi.",notes:[{text:"The shipper reads Fly's internal NATS log stream, so it must run in the **same Fly organization** as the apps you want to monitor. The shipper is required either way — to also let Sazabi discover and verify your apps from a read-only token, connect your Fly.io account instead."}],actions:[{instruction:"Pick a log-shipper option — you run **one**, not both. **Option A — fly-log-shipper (simplest):** launch the stock [superfly/fly-log-shipper](https://github.com/superfly/fly-log-shipper) image in your org and enable its generic `http` sink with the two secrets below; Sazabi parses Fly's native JSON event format directly. **Option B — dedicated OTLP shipper:** for per-app keys and richer OTLP resource attributes, build a Vector app that wraps events in an OTLP `resourceLogs` envelope and POSTs to the OTLP endpoint below."}]},{id:"endpoint",section:"config",title:"Set the shipper secrets",actions:[{instruction:"Set the fly-log-shipper secrets (Option A): `HTTP_URL` is your intake URL (above); `HTTP_TOKEN` is the key below.",payloads:[{kind:"copyable",label:"`HTTP_TOKEN`",value:"${context.publicKey}",description:"Your Sazabi public key, sent as a bearer token. Paste the raw key with no `Bearer ` prefix."},{kind:"code",label:"Set both secrets on the shipper app",language:"bash",value:'fly secrets set -a <log-shipper-app> \\\n HTTP_URL="https://${context.ingestHost}/fly-log-shipper" \\\n HTTP_TOKEN="${context.publicKey}"'}]},{instruction:"If you chose the dedicated OTLP shipper (Option B), POST OTLP `resourceLogs` to the endpoint below — with the same public key as a bearer token — instead of setting the two secrets above.",payloads:[{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs"}]}]},{id:"verify",section:"verify",title:"Deploy and verify",actions:[{instruction:"Deploy the shipper, then trigger activity — deploy an app or hit a deployed route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/fly-io"},yT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appName",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{appName:"$item.name"}}}}});var sxe,axe,FV;var $V=h(()=>{UV();sxe=["apiToken"],axe={id:"fly-io",label:"Fly.io",transform:"otlp-with-fly-log-shipper"},FV={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:sxe,serverOwnedStreamConfigFields:["webhookUrl"],intake:[axe],subtitle:"Forward your Fly.io application logs directly to Sazabi for global monitoring.",features:["Log shipping","Multi-region logs","Machine monitoring"],evidenceHints:["fly.toml or .fly/ app configuration","FLY_* environment variables or scripts that run flyctl/fly deploy","README/docs naming Fly.io as the deployment host"],setupSkill:te,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"logSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var bT,IT,ST;var GV=h(()=>{Un();bT={kind:"choice",title:"Choose setup method",description:"Select how you want to connect Google Cloud logs.",options:[{id:"service-account",label:"Service account",description:"Let Sazabi set up the log sink, Pub/Sub topic, and pull subscription automatically.",flow:{kind:"multi-step",steps:[{id:"prepare",title:"Prepare access",description:"Create a service account key with permissions for log forwarding.",notes:[{text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."}],actions:[{kind:"instruction",instruction:"Grant the service account the following roles on the target GCP project(s).",payloads:[{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}],notes:[{text:'New or auto-created projects (for example a `gen-lang-client-...` project from Google AI Studio) may also need the Service Usage API enabled first. Sazabi uses that API to turn on the others, but it cannot enable itself. If you hit a "Service Usage API has not been used / is disabled" error, enable it on the project, wait about a minute, then retry.'}]},{kind:"instruction",instruction:"To create the key: go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) in the Google Cloud Console, select (or create) the service account, open **Keys**, then choose **Add key → Create new key → JSON**. Download the file — you'll paste its contents in the next step. Alternatively, use `gcloud iam service-accounts keys create sazabi-key.json --iam-account=YOUR_SERVICE_ACCOUNT_EMAIL`.",payloads:[{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"}]}]},{id:"credentials",title:"Enter service account key",actions:[{id:"key",kind:"secret",label:"Service account key (JSON)",instruction:"Paste your service account key JSON below.",placeholder:'{"type": "service_account", "project_id": "...", ...}'}]}],submit:{actions:[{kind:"validate",action:"validate",input:{serviceAccountKey:"$key"},resultAs:"validateKey"},{kind:"preflight",action:"preflight",input:{serviceAccountKey:"$key"}}],metadata:{serviceAccountKey:"$key"},displayName:"GCP $validateKey.projectId",button:vt}}},{id:"connectionless",label:"Your own collector",description:"Configure the sink, Pub/Sub topic, and collector yourself.",flow:{kind:"connectionless"}}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/gcp"},IT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"displayName",header:"Name"},{field:"projectId",header:"Project ID",width:"w-48",cell:"muted"}],searchPlaceholder:"Search projects...",searchFields:["displayName","projectId"],dedupeByConfigField:"gcpProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All accessible projects already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{gcpProjectId:"$item.projectId",gcpProjectName:"$item.displayName"}}}},ST={docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/gcp",groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",notes:[{variant:"requirement",text:"Required GCP permissions: the person performing these steps needs a role that grants `logging.sinks.create` (e.g. `roles/logging.configWriter`) and `pubsub.topics.setIamPolicy` (e.g. `roles/pubsub.admin`)."}],actions:[{instruction:"Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`)."},{instruction:"Create a Cloud Logging sink that routes logs to the Pub/Sub topic. Grant the sink's service account the `roles/pubsub.publisher` role on the topic."},{instruction:"Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution."},{instruction:"Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."}]},{id:"collector",section:"config",title:"Configure collector",notes:[{variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."}],actions:[{instruction:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
7178
7157
  googlecloudlogentry_encoding:
7179
7158
 
7180
7159
  receivers:
@@ -7290,7 +7269,7 @@ export const mastra = new Mastra({
7290
7269
 
7291
7270
  // Use your Mastra instance
7292
7271
  const agent = mastra.getAgent("my-agent");
7293
- const response = await agent.generate("Hello, world!");`}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart the service, then run an agent, tool, or workflow to generate a trace."}]}]}});var oK;var rK=h(()=>{nK();oK={id:"mastra",name:"Mastra",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",intake:[{id:"mastra",label:"Mastra",transform:"otlp-passthrough"}],subtitle:"Stream your Mastra agent traces directly to Sazabi for AI workflow observability.",features:["Agent traces","Tool tracing","Workflow monitoring"],evidenceHints:["@mastra packages, mastra.config files, or Mastra agent definitions","MASTRA_* environment variables","README/docs naming Mastra for agents, workflows, or LLM orchestration"],setupSkill:te,dashboard:{iconKey:"mastra",intakeSourceId:"mastra"}}});var kT;var iK=h(()=>{kT={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/neon",groups:[{id:"open-integration",section:"config",title:"Open Neon integration",notes:[{text:"Neon's OpenTelemetry integration forwards Postgres logs to Sazabi."},{variant:"requirement",text:"The integration is available on Neon's **Scale** plan, and both the integration itself and Postgres logs export are currently in Beta."},{variant:"requirement",text:"You'll need admin access on the Neon project to add it."}],actions:[{instruction:"Add Neon's OpenTelemetry integration for Postgres logs.",payloads:[{kind:"external-link",label:"Open Neon integrations",href:"https://console.neon.tech/app/projects",description:"Choose the Neon project you want to monitor, then open the project's **Integrations** page."}]}]},{id:"select-data",section:"config",title:"Select exported data",actions:[{instruction:"In **Select data to export**, enable `Postgres logs` and leave `Metrics` disabled. Neon does not expose a traces export for this integration."},{instruction:"Choose the `HTTP` protocol."},{instruction:"Configure authentication as `Bearer`. Neon adds the `Bearer` prefix to outgoing requests automatically."}]},{id:"values",section:"config",title:"Set integration values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP endpoint URL** field, then paste these values into the Neon OpenTelemetry configuration sidebar.",payloads:[{kind:"copyable",label:"Connection protocol",value:"HTTP"},{kind:"copyable",label:"Data to export",value:"Postgres logs only"},{kind:"copyable",label:"Authentication method",value:"Bearer"},{kind:"copyable",label:"Bearer token value",value:"sazabi",copyLabel:"Neon bearer token value",description:"Neon requires a non-empty Bearer token, but Sazabi authenticates using the public key hex embedded in the endpoint hostname and ignores this value — any placeholder works."},{kind:"copyable",label:"`service.name` resource attribute",value:"neon-postgres",copyLabel:"Neon service.name value",description:"Optional but recommended — paste under **Resource attributes** in Neon. Change the suffix (e.g. `neon-postgres-prod`, `neon-checkout-db`) when you have more than one Neon project so log streams stay easy to filter in Sazabi."}]}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the integration, then wait a few minutes for logs to start arriving; if the compute has Scale to Zero enabled and is currently suspended, run a query against the database to wake it and begin log delivery."},{instruction:"If logs do not arrive after a few minutes, check the Neon integration's status panel for OTLP export errors."}]}]}});var dxe,sK;var aK=h(()=>{iK();dxe=[],sK={id:"neon",name:"Neon",capabilities:["connectionless"],auth:[],delivery:["push"],sensitiveFields:dxe,lifecycleSkipReason:"Manual OTLP setup is not exercised by automated lifecycle tests yet.",intake:[{id:"neon",label:"Neon",transform:"otlp-passthrough"}],subtitle:"Forward Neon Postgres logs to Sazabi for database observability without sending metrics or traces.",features:["Postgres logs","Connection events","Error and warning logs"],evidenceHints:["Neon connection strings, neon.tech hosts, or @neondatabase/serverless packages","DATABASE_URL/POSTGRES_URL values documented as Neon","README/docs naming Neon as the Postgres provider"],setupSkill:te,dashboard:{iconKey:"neon",intakeSourceId:"neon"}}});var xT;var cK=h(()=>{xT={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log drains require a Netlify Enterprise plan."}],actions:[{instruction:"Configure a log drain in your [Netlify site settings](https://app.netlify.com) under **Logs & Metrics > Log Drains**."},{instruction:"Select **General HTTP endpoint** as the service."}]},{id:"values",section:"config",title:"Set drain values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Full URL** field, and set the log drain format below.",payloads:[{kind:"copyable",label:"Log drain format",value:"JSON"}]}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the drain, then deploy or request the site so Netlify emits fresh logs."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/netlify"}});var lK;var uK=h(()=>{cK();lK={id:"netlify",name:"Netlify",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",intake:[{id:"netlify",label:"Netlify",transform:"netlify-drain"}],subtitle:"Forward your Netlify deployment logs directly to Sazabi for Jamstack observability.",features:["Build logs","Function logs","Edge handler logs"],evidenceHints:["netlify.toml, .netlify/, or Netlify build/deploy scripts","NETLIFY_* environment variables or functions under netlify/functions","README/docs naming Netlify as the deployment host"],setupSkill:te,dashboard:{iconKey:"netlify",intakeSourceId:"netlify"}}});var PT;var dK=h(()=>{PT={groups:[{id:"open-form",section:"config",title:"Open observability settings",actions:[{instruction:"In the OpenRouter dashboard, open **Settings > Observability**, toggle **Enable Broadcast** on, then click the edit icon next to **OpenTelemetry Collector**.",payloads:[{kind:"external-link",label:"Settings > Observability",href:"https://openrouter.ai/settings/observability"}]}]},{id:"values",section:"config",title:"Set destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Endpoint** field of the OpenTelemetry Collector destination form."}]},{id:"test",section:"verify",title:"Test and save",description:"OpenRouter saves the destination only after a successful connection test.",actions:[{instruction:"Click **Test Connection** to verify Sazabi accepts the trace.",notes:[{text:"A green check confirms forwarding is enabled."}]}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/openrouter"}});var pK;var gK=h(()=>{dK();pK={id:"openrouter",name:"OpenRouter",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"OpenRouter Broadcast destination setup is not exercised by automated lifecycle tests yet.",intake:[{id:"openrouter",label:"OpenRouter",transform:"otlp-passthrough"}],subtitle:"Forward OpenRouter trace spans to Sazabi from the OpenRouter dashboard.",features:["Trace spans per generation","Token & cost tracking","Model & provider attribution"],evidenceHints:["OpenRouter API URLs, OPENROUTER_* environment variables, or openrouter packages","LLM gateway code sending requests to openrouter.ai","README/docs naming OpenRouter for model routing or tracing"],setupSkill:te,dashboard:{iconKey:"openrouter",intakeSourceId:"openrouter"}}});var RT;var mK=h(()=>{RT={perStreamInstructions:!0,groups:[{id:"copy-config",section:"config",title:"Copy Collector config",actions:[{instruction:"Add the Sazabi exporter and include it in the logs and traces pipelines.",payloads:[{kind:"code-tabs",label:"Collector configuration",description:"Choose the snippet format that matches how you deploy the Collector.",tabs:[{id:"yaml",label:"`otelcol.yaml`",language:"yaml",copyLabel:"Collector config",value:`exporters:
7272
+ const response = await agent.generate("Hello, world!");`}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart the service, then run an agent, tool, or workflow to generate a trace."}]}]}});var oK;var rK=h(()=>{nK();oK={id:"mastra",name:"Mastra",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",intake:[{id:"mastra",label:"Mastra",transform:"otlp-passthrough"}],subtitle:"Stream your Mastra agent traces directly to Sazabi for AI workflow observability.",features:["Agent traces","Tool tracing","Workflow monitoring"],evidenceHints:["@mastra packages, mastra.config files, or Mastra agent definitions","MASTRA_* environment variables","README/docs naming Mastra for agents, workflows, or LLM orchestration"],setupSkill:te,dashboard:{iconKey:"mastra",intakeSourceId:"mastra"}}});var kT;var iK=h(()=>{kT={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/neon",groups:[{id:"open-integration",section:"config",title:"Open Neon integration",notes:[{text:"Neon's OpenTelemetry integration forwards Postgres logs to Sazabi."},{variant:"requirement",text:"The integration is available on Neon's **Scale** plan, and both the integration itself and Postgres logs export are currently in Beta."},{variant:"requirement",text:"You'll need admin access on the Neon project to add it."}],actions:[{instruction:"Add Neon's OpenTelemetry integration for Postgres logs.",payloads:[{kind:"external-link",label:"Open Neon integrations",href:"https://console.neon.tech/app/projects",description:"Choose the Neon project you want to monitor, then open the project's **Integrations** page."}]}]},{id:"select-data",section:"config",title:"Select exported data",actions:[{instruction:"In **Select data to export**, enable `Postgres logs` and leave `Metrics` disabled. Neon does not expose a traces export for this integration."},{instruction:"Choose the `HTTP` protocol."},{instruction:"Configure authentication as `Bearer`. Neon adds the `Bearer` prefix to outgoing requests automatically."}]},{id:"values",section:"config",title:"Set integration values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP endpoint URL** field, then paste these values into the Neon OpenTelemetry configuration sidebar.",payloads:[{kind:"copyable",label:"Connection protocol",value:"HTTP"},{kind:"copyable",label:"Data to export",value:"Postgres logs only"},{kind:"copyable",label:"Authentication method",value:"Bearer"},{kind:"copyable",label:"Bearer token value",value:"sazabi",copyLabel:"Neon bearer token value",description:"Neon requires a non-empty Bearer token, but Sazabi authenticates using the public key hex embedded in the endpoint hostname and ignores this value — any placeholder works."},{kind:"copyable",label:"`service.name` resource attribute",value:"neon-postgres",copyLabel:"Neon service.name value",description:"Optional but recommended — paste under **Resource attributes** in Neon. Change the suffix (e.g. `neon-postgres-prod`, `neon-checkout-db`) when you have more than one Neon project so log streams stay easy to filter in Sazabi."}]}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the integration, then wait a few minutes for logs to start arriving; if the compute has Scale to Zero enabled and is currently suspended, run a query against the database to wake it and begin log delivery."},{instruction:"If logs do not arrive after a few minutes, check the Neon integration's status panel for OTLP export errors."}]}]}});var dxe,sK;var aK=h(()=>{iK();dxe=[],sK={id:"neon",name:"Neon",capabilities:["connectionless"],auth:[],delivery:["push"],sensitiveFields:dxe,lifecycleSkipReason:"Manual OTLP setup is not exercised by automated lifecycle tests yet.",intake:[{id:"neon",label:"Neon",transform:"otlp-passthrough"}],subtitle:"Forward Neon Postgres logs to Sazabi for database observability without sending metrics or traces.",features:["Postgres logs","Connection events","Error and warning logs"],evidenceHints:["Neon connection strings, neon.tech hosts, or @neondatabase/serverless packages","DATABASE_URL/POSTGRES_URL values documented as Neon","README/docs naming Neon as the Postgres provider"],setupSkill:te,dashboard:{iconKey:"neon",intakeSourceId:"neon"}}});var xT;var cK=h(()=>{xT={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log drains require a Netlify Enterprise plan."}],actions:[{instruction:"Configure a log drain in your [Netlify site settings](https://app.netlify.com) under **Logs & Metrics > Log Drains**."},{instruction:"Select **General HTTP endpoint** as the service."}]},{id:"values",section:"config",title:"Set drain values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Full URL** field, and set the log drain format below.",payloads:[{kind:"copyable",label:"Log drain format",value:"JSON"}]}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the drain, then deploy or request the site so Netlify emits fresh logs."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/netlify"}});var lK;var uK=h(()=>{cK();lK={id:"netlify",name:"Netlify",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",intake:[{id:"netlify",label:"Netlify",transform:"netlify-drain"}],subtitle:"Forward your Netlify deployment logs directly to Sazabi for Jamstack observability.",features:["Build logs","Function logs","Edge handler logs"],evidenceHints:["netlify.toml, .netlify/, or Netlify build/deploy scripts","NETLIFY_* environment variables or functions under netlify/functions","README/docs naming Netlify as the deployment host"],setupSkill:te,dashboard:{iconKey:"netlify",intakeSourceId:"netlify"}}});var PT;var dK=h(()=>{PT={groups:[{id:"open-form",section:"config",title:"Open observability settings",actions:[{instruction:"In the OpenRouter dashboard, open **Settings > Observability**, toggle **Enable Broadcast** on, then click the edit icon next to **OpenTelemetry Collector**.",payloads:[{kind:"external-link",label:"Settings > Observability",href:"https://openrouter.ai/settings/observability"}]}]},{id:"values",section:"config",title:"Set destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Endpoint** field of the OpenTelemetry Collector destination form."}]},{id:"test",section:"verify",title:"Test and save",description:"OpenRouter saves the destination only after a successful connection test.",actions:[{instruction:"Click **Test Connection** to verify Sazabi accepts the trace.",notes:[{text:"A green check confirms forwarding is enabled."}]}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/openrouter"}});var pK;var gK=h(()=>{dK();pK={id:"openrouter",name:"OpenRouter",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"OpenRouter Broadcast destination setup is not exercised by automated lifecycle tests yet.",intake:[{id:"openrouter",label:"OpenRouter",transform:"otlp-passthrough"}],subtitle:"Forward OpenRouter trace spans to Sazabi from the OpenRouter dashboard.",features:["Trace spans per generation","Token & cost tracking","Model & provider attribution"],evidenceHints:["OpenRouter API URLs, OPENROUTER_* environment variables, or openrouter packages","LLM gateway code sending requests to openrouter.ai","README/docs naming OpenRouter for model routing or tracing"],setupSkill:te,dashboard:{iconKey:"openrouter",intakeSourceId:"openrouter"}}});var RT;var mK=h(()=>{RT={perStreamInstructions:!0,groups:[{id:"copy-config",section:"config",title:"Copy Collector config",actions:[{instruction:"Add the Sazabi exporter and include it in the logs and traces pipelines.",payloads:[{kind:"code-tabs",label:"Collector configuration",description:"Choose the snippet format that matches how you deploy the Collector.",tabs:[{id:"yaml",label:"`otelcol.yaml`",language:"yaml",copyLabel:"Collector config",value:`exporters:
7294
7273
  otlphttp/sazabi:
7295
7274
  endpoint: "https://\${context.ingestHost}"
7296
7275
 
@@ -7316,7 +7295,7 @@ service:
7316
7295
  traces:
7317
7296
  receivers: [otlp]
7318
7297
  processors: [batch]
7319
- exporters: [otlphttp/sazabi]`}]}]}]},{id:"adjust-pipelines",section:"config",title:"Adjust pipelines",actions:[{instruction:"Match the receivers to the sources you have configured.",notes:[{text:"The `filelog` receiver collects container logs on Kubernetes; the `otlp` receiver accepts spans from instrumented services."}]}]}]}});var hK;var AK=h(()=>{mK();hK={id:"otel_collector",name:"OpenTelemetry Collector",searchAliases:["otel","otel collector","open telemetry collector"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"otel-collector",label:"OpenTelemetry Collector",transform:"otlp-passthrough"}],subtitle:"Forward logs and traces from your infrastructure to Sazabi using the OpenTelemetry Collector.",features:["Kubernetes DaemonSet","Vendor-neutral standard","Extensible via contrib","Logs and traces"],evidenceHints:["otelcol, opentelemetry-collector, or collector config YAML","Kubernetes DaemonSets or Helm values for OpenTelemetry Collector","OTLP receiver/exporter pipelines that can add a Sazabi exporter"],setupSkill:te,dashboard:{iconKey:"otel-collector",intakeSourceId:"otel-collector"}}});var TT;var fK=h(()=>{TT={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",notes:[{text:"Sazabi stores each incoming metric data point as a log record, so you can search metrics alongside your logs and traces and line them up with each other."}],actions:[{instruction:"Add or enable the OpenTelemetry metrics SDK in your application, or configure the OTLP metrics exporter on your OpenTelemetry Collector."}]},{id:"environment",section:"config",title:"Set OTLP metrics environment",actions:[{instruction:"Set these variables in the environment that runs your application or Collector — `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` is your intake URL (above).",payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}],notes:[{text:"These variables work with any OpenTelemetry SDK or Collector that exports OTLP metrics."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Restart or redeploy, then generate a metric to confirm Sazabi receives it as a log record."}]}]}});var yK;var bK=h(()=>{fK();yK={id:"otel_metrics",name:"OpenTelemetry Metrics",searchAliases:["otel metrics","opentelemetry metrics","otlp metrics","metrics as logs"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"otel-metrics",label:"OpenTelemetry Metrics",aliases:["otlp-metrics"],transform:"otlp-metrics-as-logs"}],lifecycleSkipReason:"Manual OTLP metrics setup is not exercised by automated lifecycle tests yet.",subtitle:"Send OpenTelemetry metrics to Sazabi's OTLP intake and store them as searchable log records.",features:["OTLP metric export","Metrics stored as log records","Any OTEL SDK or Collector"],evidenceHints:["OTLP metric exporters (OTEL_EXPORTER_OTLP_METRICS_* env vars) without a metrics backend","OpenTelemetry metrics instrumentation routed to a generic OTLP endpoint","A desire to query metrics alongside logs and traces in one place"],setupSkill:te,dashboard:{slug:"opentelemetry-metrics",iconKey:"opentelemetry-metrics",intakeSourceId:"otel-metrics"}}});var BT;var IK=h(()=>{BT={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",notes:[{text:"Metrics sent to the endpoint aren't stored yet."}],actions:[{instruction:"Add the OpenTelemetry SDK to your application. Most languages have official SDKs available (e.g., `@opentelemetry/api` for Node.js, `opentelemetry-api` for Python, etc.)."},{instruction:"Initialize the OpenTelemetry SDK in your application and configure the OTLP exporters for the signals you want (logs and/or traces)."}]},{id:"environment",section:"config",title:"Set OTLP environment",actions:[{instruction:"Set these variables in the environment that runs your application — `OTEL_EXPORTER_OTLP_ENDPOINT` is your intake URL (above).",payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}],notes:[{text:"These variables work with any OpenTelemetry SDK (Node.js, Python, Go, Java, .NET, etc.)."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Restart or redeploy the application, then generate a test log or trace to confirm Sazabi receives telemetry."}]}]}});var pxe,SK;var CK=h(()=>{IK();pxe={id:"otel-trace",label:"OpenTelemetry Traces",aliases:["mastra","otlp-trace","otlp-traces","otel-traces"],transform:"otlp-traces-only"},SK={id:"otel",name:"OpenTelemetry",searchAliases:["otel","open telemetry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"otel",label:"OpenTelemetry",aliases:["gcl","otlp"],transform:"otlp-passthrough"},pxe],lifecycleSkipReason:"Manual OTLP setup is not exercised by automated lifecycle tests yet.",subtitle:"Send OpenTelemetry logs and traces directly to Sazabi's OTLP-compatible intake for AI-powered observability.",features:["OTLP log export","OTLP trace export","Any OTEL SDK"],evidenceHints:["@opentelemetry packages, opentelemetry-* SDKs, or OTEL_* environment variables","OTLP exporter configuration in application code or deployment manifests","Existing OpenTelemetry instrumentation without a more specific Sazabi source"],setupSkill:te,dashboard:{slug:"opentelemetry",iconKey:"opentelemetry",intakeSourceId:"otel"}}});var OT,_T,DT;var vK=h(()=>{Un();OT={kind:"multi-step",steps:[{id:"prepare",title:"Create API key",actions:[{kind:"instruction",instruction:"In Plain, open **Settings → Machine users** and create a machine user API key. The API key settings live under a workspace-scoped URL (`app.plain.com/workspace/<your-org-id>/settings/machine-users`), so open it from within your own Plain workspace."},{kind:"instruction",instruction:"Grant the key these permissions: `webhookTarget:create`, `webhookTarget:edit`, `webhookTarget:delete`, `webhookTarget:read`, and `subscriptionEventTypes:read`. Workspace read access is included with every key."}]},{id:"credentials",title:"Enter API key",actions:[{id:"apiKey",kind:"secret",label:"Plain API key",instruction:"Enter your Plain API key below.",description:"Machine user API key with webhookTarget and subscriptionEventTypes permissions.",placeholder:"plainApiKey_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{apiKey:"$apiKey"},resultAs:"workspace"}],metadata:{plainApiKey:"$apiKey"},displayName:"$workspace.workspaceName",button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/plain"},_T={groups:[{id:"open-webhooks",section:"config",title:"Open Plain webhooks",actions:[{instruction:"In your [Plain workspace](https://app.plain.com/settings/webhooks), go to **Settings > Webhooks** and click **Create webhook target**.",notes:[{text:"You configure and own this webhook target — you choose which event types it subscribes to in Plain. Sazabi never receives a Plain API key on this path and does not create, edit, or delete the target. To have Sazabi enumerate event types and manage the webhook target for you, connect your Plain account instead."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook target configuration."},{instruction:"Enable the target and select the event types you want to forward."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the webhook target, then trigger a subscribed event in Plain (for example create or update a thread). Events appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/plain"},DT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"eventType",header:"Event type",cell:"mono"},{field:"description",header:"Description",cell:"muted"}],searchPlaceholder:"Search event types...",searchFields:["eventType","description"],dedupeByConfigField:"eventType",dedupeExpandArrayField:"eventTypes",aggregateSelection:{displayName:"Plain events",itemField:"eventType",configField:"eventTypes"},emptyState:{noMatches:"No event types found.",allConfigured:"All Plain event types already have log streams configured.",noItems:"Plain returned no subscribable event types for this API key. Confirm the key has subscriptionEventTypes:read permission."},toStreamItem:{displayName:"$item.eventType",config:{eventType:"$item.eventType"}}}}});var gxe,mxe,wK;var EK=h(()=>{vK();gxe=["plainApiKey"],mxe={id:"plain",label:"Plain",transform:"plain-webhook"},wK={id:"plain",name:"Plain",searchAliases:["plain.com","plain support","plain customer support"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!1,lifecycleSkipReason:"No automated integration fixture yet: Plain has no sandbox workspace API for minting disposable API keys and webhook targets in CI.",sensitiveFields:gxe,serverOwnedStreamConfigFields:["webhookTargetId"],intake:[mxe],subtitle:"Stream Plain customer support events into Sazabi for unified observability of your support workflows.",features:["Webhook event streaming","Multi-event webhook targets","Thread and customer activity"],evidenceHints:["@team-plain/typescript-sdk usage or PLAIN_API_KEY environment variables","core-api.uk.plain.com GraphQL calls or Plain webhook handlers","README/docs naming Plain for customer support, tickets, or threads"],setupSkill:te,dashboard:{iconKey:"plain",intakeSourceId:"plain",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-text",header:"Event types",width:"w-96",configField:"eventTypes",fallbackLabel:"Unknown events"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["apiKey"]}},list:{list:{kind:"source-action",actionId:"list-event-types",itemsField:"eventTypes"}}}}}});var LT;var kK=h(()=>{LT={groups:[{id:"send-telemetry",section:"config",title:"Send OpenTelemetry",actions:[{instruction:"Send OTLP telemetry to Sazabi directly from your app, or from a collector running in Porter.",payloads:[{kind:"external-link",label:"Open Porter dashboard",href:"https://dashboard.porter.run"}],notes:[{text:"Porter does not provide a generic log drain."}]}]},{id:"configure-exporter",section:"config",title:"Configure the exporter",actions:[{instruction:"Set these environment variables on the Porter service you want to monitor.",payloads:[{kind:"code",label:"Porter environment variables",description:"Porter injects the `PORTER_*` values from its app and deployment metadata at runtime. The keyed endpoint URL embeds your project key, so no auth header is needed.",language:"bash",value:`OTEL_EXPORTER_OTLP_ENDPOINT=https://\${context.ingestHost}
7298
+ exporters: [otlphttp/sazabi]`}]}]}]},{id:"adjust-pipelines",section:"config",title:"Adjust pipelines",actions:[{instruction:"Match the receivers to the sources you have configured.",notes:[{text:"The `filelog` receiver collects container logs on Kubernetes; the `otlp` receiver accepts spans from instrumented services."}]}]}]}});var hK;var AK=h(()=>{mK();hK={id:"otel_collector",name:"OpenTelemetry Collector",searchAliases:["otel","otel collector","open telemetry collector"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"otel-collector",label:"OpenTelemetry Collector",transform:"otlp-passthrough"}],subtitle:"Forward logs and traces from your infrastructure to Sazabi using the OpenTelemetry Collector.",features:["Kubernetes DaemonSet","Vendor-neutral standard","Extensible via contrib","Logs and traces"],evidenceHints:["otelcol, opentelemetry-collector, or collector config YAML","Kubernetes DaemonSets or Helm values for OpenTelemetry Collector","OTLP receiver/exporter pipelines that can add a Sazabi exporter"],setupSkill:te,dashboard:{iconKey:"otel-collector",intakeSourceId:"otel-collector"}}});var TT;var fK=h(()=>{TT={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",notes:[{text:"Sazabi stores each incoming metric data point as a log record, so you can search metrics alongside your logs and traces and line them up with each other."}],actions:[{instruction:"Add or enable the OpenTelemetry metrics SDK in your application, or configure the OTLP metrics exporter on your OpenTelemetry Collector."}]},{id:"environment",section:"config",title:"Set OTLP metrics environment",actions:[{instruction:"Set these variables in the environment that runs your application or Collector — `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` is your intake URL (above).",payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}],notes:[{text:"These variables work with any OpenTelemetry SDK or Collector that exports OTLP metrics."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Restart or redeploy, then generate a metric to confirm Sazabi receives it as a log record."}]}]}});var yK;var bK=h(()=>{fK();yK={id:"otel_metrics",name:"OpenTelemetry Metrics",searchAliases:["otel metrics","opentelemetry metrics","otlp metrics","metrics as logs"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"otel-metrics",label:"OpenTelemetry Metrics",aliases:["otlp-metrics"],transform:"otlp-metrics-as-logs"}],lifecycleSkipReason:"Manual OTLP metrics setup is not exercised by automated lifecycle tests yet.",subtitle:"Send OpenTelemetry metrics to Sazabi's OTLP intake and store them as searchable log records.",features:["OTLP metric export","Metrics stored as log records","Any OTEL SDK or Collector"],evidenceHints:["OTLP metric exporters (OTEL_EXPORTER_OTLP_METRICS_* env vars) without a metrics backend","OpenTelemetry metrics instrumentation routed to a generic OTLP endpoint","A desire to query metrics alongside logs and traces in one place"],setupSkill:te,dashboard:{slug:"opentelemetry-metrics",iconKey:"opentelemetry-metrics",intakeSourceId:"otel-metrics"}}});var BT;var IK=h(()=>{BT={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",notes:[{text:"Metrics sent to the endpoint aren't stored yet."}],actions:[{instruction:"Add the OpenTelemetry SDK to your application. Most languages have official SDKs available (e.g., `@opentelemetry/api` for Node.js, `opentelemetry-api` for Python, etc.)."},{instruction:"Initialize the OpenTelemetry SDK in your application and configure the OTLP exporters for the signals you want (logs and/or traces)."}]},{id:"environment",section:"config",title:"Set OTLP environment",actions:[{instruction:"Set these variables in the environment that runs your application — `OTEL_EXPORTER_OTLP_ENDPOINT` is your intake URL (above).",payloads:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}],notes:[{text:"These variables work with any OpenTelemetry SDK (Node.js, Python, Go, Java, .NET, etc.)."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Restart or redeploy the application, then generate a test log or trace to confirm Sazabi receives telemetry."}]}]}});var pxe,SK;var CK=h(()=>{IK();pxe={id:"otel-trace",label:"OpenTelemetry Traces",aliases:["mastra","otlp-trace","otlp-traces","otel-traces"],transform:"otlp-traces-only"},SK={id:"otel",name:"OpenTelemetry",searchAliases:["otel","open telemetry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"otel",label:"OpenTelemetry",aliases:["gcl","otlp"],transform:"otlp-passthrough"},pxe],lifecycleSkipReason:"Manual OTLP setup is not exercised by automated lifecycle tests yet.",subtitle:"Send OpenTelemetry logs and traces directly to Sazabi's OTLP-compatible intake for AI-powered observability.",features:["OTLP log export","OTLP trace export","Any OTEL SDK"],evidenceHints:["@opentelemetry packages, opentelemetry-* SDKs, or OTEL_* environment variables","OTLP exporter configuration in application code or deployment manifests","Existing OpenTelemetry instrumentation without a more specific Sazabi source"],setupSkill:te,dashboard:{slug:"opentelemetry",iconKey:"opentelemetry",intakeSourceId:"otel"}}});var OT,_T,DT;var vK=h(()=>{Un();OT={kind:"multi-step",steps:[{id:"prepare",title:"Create API key",actions:[{kind:"instruction",instruction:"In Plain, open **Settings → Machine users** and create a machine user API key. The API key settings live under a workspace-scoped URL (`app.plain.com/workspace/<your-org-id>/settings/machine-users`), so open it from within your own Plain workspace."},{kind:"instruction",instruction:"Grant the key these permissions: `webhookTarget:create`, `webhookTarget:edit`, `webhookTarget:delete`, `webhookTarget:read`, and `subscriptionEventTypes:read`. Workspace read access is included with every key."}]},{id:"credentials",title:"Enter API key",actions:[{id:"apiKey",kind:"secret",label:"Plain API key",instruction:"Enter your Plain API key below.",description:"Machine user API key with webhookTarget and subscriptionEventTypes permissions.",placeholder:"plainApiKey_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{apiKey:"$apiKey"},resultAs:"workspace"}],metadata:{plainApiKey:"$apiKey"},displayName:"$workspace.workspaceName",button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/plain"},_T={groups:[{id:"open-webhooks",section:"config",title:"Open Plain webhooks",actions:[{instruction:"In your [Plain workspace](https://app.plain.com/settings/webhooks), go to **Settings > Webhooks** and click **Create webhook target**.",notes:[{text:"You configure and own this webhook target — you choose which event types it subscribes to in Plain. Sazabi never receives a Plain API key on this path and does not create, edit, or delete the target. To have Sazabi enumerate event types and manage the webhook target for you, connect your Plain account instead."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook target configuration."},{instruction:"Enable the target and select the event types you want to forward."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the webhook target, then trigger a subscribed event in Plain (for example create or update a thread). Events appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/plain"},DT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"eventType",header:"Event type",cell:"mono"},{field:"description",header:"Description",cell:"muted"}],searchPlaceholder:"Search event types...",searchFields:["eventType","description"],dedupeByConfigField:"eventType",dedupeExpandArrayField:"eventTypes",aggregateSelection:{displayName:"Plain events",itemField:"eventType",configField:"eventTypes"},emptyState:{noMatches:"No event types found.",allConfigured:"All Plain event types already have log streams configured.",noItems:"Plain returned no subscribable event types for this API key. Confirm the key has subscriptionEventTypes:read permission."},toStreamItem:{displayName:"$item.eventType",config:{eventType:"$item.eventType"}}}}});var gxe,mxe,wK;var EK=h(()=>{vK();gxe=["plainApiKey"],mxe={id:"plain",label:"Plain",transform:"plain-webhook"},wK={id:"plain",name:"Plain",searchAliases:["plain.com","plain support","plain customer support"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!1,lifecycleSkipReason:"No automated integration fixture yet: Plain has no sandbox workspace API for minting disposable API keys and webhook targets in CI.",sensitiveFields:gxe,serverOwnedStreamConfigFields:["webhookTargetId"],intake:[mxe],subtitle:"Stream Plain customer support events into Sazabi for unified observability of your support workflows.",features:["Webhook event streaming","Multi-event webhook targets","Thread and customer activity"],evidenceHints:["@team-plain/typescript-sdk usage or PLAIN_API_KEY environment variables","core-api.uk.plain.com GraphQL calls or Plain webhook handlers","README/docs naming Plain for customer support, tickets, or threads"],setupSkill:te,dashboard:{iconKey:"plain",intakeSourceId:"plain",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-text",header:"Event types",width:"w-96",configField:"eventTypes",fallbackLabel:"Unknown events"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["apiKey"]}},list:{list:{kind:"source-action",actionId:"list-event-types",itemsField:"eventTypes"}}}}}});var LT;var kK=h(()=>{LT={groups:[{id:"send-telemetry",section:"config",title:"Send OpenTelemetry",actions:[{instruction:"Send OTLP telemetry to Sazabi directly from your app, or from a collector running in Porter.",payloads:[{kind:"external-link",label:"Open Porter dashboard",href:"https://dashboard.porter.run"}],notes:[{text:"Porter does not provide a generic log drain."}]}]},{id:"configure-exporter",section:"config",title:"Configure the exporter",actions:[{instruction:"Set these environment variables on the Porter service you want to monitor.",payloads:[{kind:"code",label:"Porter environment variables",description:"Porter injects the `PORTER_*` values from its app and deployment metadata at runtime. The keyed endpoint URL embeds your project key, so no auth header is needed.",language:"bash",value:`OTEL_EXPORTER_OTLP_ENDPOINT=https://\${context.ingestHost}
7320
7299
  OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
7321
7300
  OTEL_SERVICE_NAME=$PORTER_APP_SERVICE_NAME
7322
7301
  OTEL_RESOURCE_ATTRIBUTES=service.version=$PORTER_IMAGE_TAG,porter.revision=$PORTER_POD_REVISION,porter.pod.name=$PORTER_POD_NAME`,copyLabel:"Porter environment variables"}],notes:[{text:"You can also put shared values in a Porter environment group."}]},{instruction:"Install the OpenTelemetry SDK if your app does not already initialize OpenTelemetry.",payloads:[{kind:"code-tabs",label:"Install the OpenTelemetry SDK",tabs:[{id:"node",label:"Node.js",language:"bash",value:"bun add @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-proto @opentelemetry/exporter-logs-otlp-proto @opentelemetry/sdk-logs",copyLabel:"Node.js OpenTelemetry install"},{id:"python",label:"Python",language:"bash",value:`pip install opentelemetry-distro opentelemetry-exporter-otlp-proto-http
@@ -7391,7 +7370,7 @@ const config: NextConfig = {
7391
7370
  },
7392
7371
  };
7393
7372
 
7394
- export default config;`}]}]}]}});var hxe,TK;var BK=h(()=>{RK();hxe=[],TK={id:"posthog_sdk",name:"PostHog SDK",searchAliases:["posthog","post hog"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"posthog-sdk",label:"PostHog SDK",transform:"posthog-sdk"}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward PostHog SDK analytics and session replay to Sazabi by repointing posthog-js api_host.",features:["Session replay forwarding","Event capture","SDK integration"],evidenceHints:["posthog-js browser SDK initialization with api_host or capture options","NEXT_PUBLIC_POSTHOG_* browser environment variables","Frontend session replay or product analytics setup that should be proxied through Sazabi"],sensitiveFields:hxe,setupSkill:te,dashboard:{iconKey:"posthog",intakeSourceId:"posthog-sdk"}}});var NT,Axe,MT,zT;var OK=h(()=>{Un();NT={kind:"multi-step",steps:[{id:"prepare",title:"Create key",actions:[{kind:"instruction",instruction:"Create a personal API key in your PostHog account under **Settings > Personal API keys** ([US](https://us.posthog.com/settings/user-api-keys) · [EU](https://eu.posthog.com/settings/user-api-keys))."},{kind:"instruction",instruction:"Grant it these scopes:\n\n- `project:read` - list your projects\n- `organization:read` - show your organization\n- `hog_function:write` - install the webhook destination"}]},{id:"credentials",title:"Enter API key",actions:[{id:"token",kind:"secret",label:"Personal API key",instruction:"Enter your personal API key below.",placeholder:"phx_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"},resultAs:"validate"},{kind:"preflight",action:"preflight",input:{token:"$token",region:"$validate.posthogApiRegion",organizationId:"$validate.posthogOrganizationId"}}],metadata:{posthogPersonalApiKey:"$token",posthogApiRegion:"$validate.posthogApiRegion",posthogOrganizationId:"$validate.posthogOrganizationId",posthogOrganizationName:"$validate.posthogOrganizationName"},button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/posthog"},Axe=[{field:"name",header:"Project"},{field:"organizationName",header:"Organization",width:"w-48",transform:"fallback: - "}],MT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:Axe,searchPlaceholder:"Search projects...",searchFields:["name","organizationName"],dedupeByConfigField:"posthogProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have PostHog destinations configured."},toStreamItem:{displayName:"$item.name",config:{posthogProjectId:"$item.id",posthogProjectName:"$item.name"}}}},zT={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/posthog",groups:[{id:"prepare",section:"config",title:"Open destination form",actions:[{instruction:"Configure an [HTTP Webhook destination](https://${context.posthogRegion}.posthog.com/pipeline/new/hog-template-webhook) in PostHog under **Data Pipeline > Destinations**."}]},{id:"values",section:"config",title:"Set destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Destination URL** field, then set these values in the PostHog HTTP Webhook destination form.",payloads:[{kind:"copyable",label:"Method",value:"POST"},{kind:"code",label:"Body template",language:"json",copyLabel:"Body template",value:`{
7373
+ export default config;`}]}]}]}});var hxe,TK;var BK=h(()=>{RK();hxe=[],TK={id:"posthog_sdk",name:"PostHog SDK",searchAliases:["posthog","post hog"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"posthog-sdk",label:"PostHog SDK",transform:"posthog-sdk"}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward PostHog SDK analytics and session replay to Sazabi by repointing posthog-js api_host.",features:["Session replay forwarding","Event capture","SDK integration"],evidenceHints:["posthog-js browser SDK initialization with api_host or capture options","NEXT_PUBLIC_POSTHOG_* browser environment variables","Frontend session replay or product analytics setup that should be proxied through Sazabi"],sensitiveFields:hxe,setupSkill:te,dashboard:{iconKey:"posthog",intakeSourceId:"posthog-sdk"}}});var NT,Axe,MT,zT;var OK=h(()=>{Un();NT={kind:"multi-step",steps:[{id:"prepare",title:"Create key",actions:[{kind:"instruction",instruction:"Create a personal API key in your PostHog account under **Settings > Personal API keys** ([US](https://us.posthog.com/settings/user-api-keys) · [EU](https://eu.posthog.com/settings/user-api-keys))."},{kind:"instruction",instruction:"Grant it these scopes:\n\n- `project:read` - list your projects\n- `organization:read` - show your organization\n- `hog_function:write` - install the webhook destination"}]},{id:"credentials",title:"Enter API key",actions:[{id:"token",kind:"secret",label:"Personal API key",instruction:"Enter your personal API key below.",placeholder:"phx_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"},resultAs:"validate"},{kind:"preflight",action:"preflight",input:{token:"$token",region:"$validate.posthogApiRegion",organizationId:"$validate.posthogOrganizationId"}}],metadata:{posthogPersonalApiKey:"$token",posthogApiRegion:"$validate.posthogApiRegion",posthogOrganizationId:"$validate.posthogOrganizationId",posthogOrganizationName:"$validate.posthogOrganizationName"},button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/posthog"},Axe=[{field:"name",header:"Project"},{field:"organizationName",header:"Organization",width:"w-48",transform:"fallback: - "}],MT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:Axe,searchPlaceholder:"Search projects...",searchFields:["name","organizationName"],dedupeByConfigField:"posthogProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have PostHog destinations configured."},toStreamItem:{displayName:"$item.name",config:{posthogProjectId:"$item.id",posthogProjectName:"$item.name"}}}},zT={docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/posthog",groups:[{id:"prepare",section:"config",title:"Open destination form",actions:[{instruction:"Configure an [HTTP Webhook destination](https://${context.posthogRegion}.posthog.com/pipeline/new/hog-template-webhook) in PostHog under **Data Pipeline > Destinations**."}]},{id:"values",section:"config",title:"Set destination values",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **Destination URL** field, then set these values in the PostHog HTTP Webhook destination form.",payloads:[{kind:"copyable",label:"Method",value:"POST"},{kind:"code",label:"Body template",language:"json",copyLabel:"Body template",value:`{
7395
7374
  "event": "{event}",
7396
7375
  "person": "{person}"
7397
7376
  }`}]}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the PostHog destination, send a test event, and check Sazabi for the incoming product event."}]}]}});var fxe,yxe,_K;var DK=h(()=>{OK();fxe=["posthogPersonalApiKey"],yxe={id:"posthog",label:"PostHog",transform:"posthog-cdp"},_K={id:"posthog",name:"PostHog",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:fxe,serverOwnedStreamConfigFields:["posthogHogFunctionId"],intake:[yxe],subtitle:"Forward your PostHog events directly to Sazabi for real-time product and error observability.",features:["CDP webhook forwarding","Event property mapping","Real-time streaming"],evidenceHints:["posthog-js, posthog-node, or posthog-python packages","POSTHOG_* or NEXT_PUBLIC_POSTHOG_* environment variables","README/docs naming PostHog for product analytics, feature flags, or session replay"],setupSkill:te,dashboard:{iconKey:"posthog",intakeSourceId:"posthog",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{kind:"source-action",actionId:"validate-personal-api-key",sensitiveInputFields:["token"]},preflight:{kind:"source-action",actionId:"run-preflight-checks",normalize:"preflight",sensitiveInputFields:["token"]}},list:{list:{kind:"source-action",actionId:"list-projects",itemsField:"projects"}}}}}});var jT;var LK=h(()=>{jT={perStreamInstructions:!0,groups:[{id:"collector-config",section:"config",title:"Export metrics through the OpenTelemetry Collector",notes:[{variant:"requirement",text:"Requires the OpenTelemetry Collector (Contrib distribution) with the `prometheus` receiver and `otlphttp` exporter."},{text:"Sazabi ingests each metric data point as a searchable log record, so there are no dashboards to configure."}],actions:[{instruction:"Prometheus does not speak OTLP directly, so run an OpenTelemetry Collector that scrapes your Prometheus targets and forwards the metrics to Sazabi.",payloads:[{kind:"code",label:"Collector configuration",language:"yaml",copyLabel:"OpenTelemetry Collector configuration for Prometheus",description:"Point `scrape_configs.static_configs.targets` at your existing Prometheus targets or scrape endpoints.",value:`receivers:
@@ -7420,7 +7399,7 @@ NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"`,cop
7420
7399
  opentelemetry-bootstrap -a install
7421
7400
 
7422
7401
  # Railway start command example:
7423
- opentelemetry-instrument python app.py`,copyLabel:"Python OpenTelemetry bootstrap"}]}]}]},{id:"deploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Review and deploy the staged variable change set when prompted, then send some traffic to the service.",notes:[{text:"If nothing appears, check the Railway deployment logs for OpenTelemetry exporter errors and confirm your app is sending through OpenTelemetry, not only to stdout."}]}]}]}});var zK;var jK=h(()=>{MK();zK={id:"railway",name:"Railway",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",intake:[{id:"railway",label:"Railway",transform:"otlp-passthrough"}],subtitle:"Forward your Railway deployment logs directly to Sazabi for real-time monitoring.",features:["Log drains","Deployment logs","Service monitoring"],evidenceHints:["railway.json, railway.toml, or Railway deploy scripts","RAILWAY_* environment variables","README/docs naming Railway as the deploy host"],setupSkill:te,dashboard:{iconKey:"railway",intakeSourceId:"railway"}}});var FT,$T,GT;var UK=h(()=>{Un();FT={kind:"multi-step",steps:[{id:"credentials",title:"Enter API key",actions:[{kind:"instruction",instruction:"Create an API key in your [Render dashboard](https://dashboard.render.com/settings#api-keys)."},{id:"token",kind:"secret",label:"API key",instruction:"Enter your Render API key below.",placeholder:"rnd_..."}]},{id:"workspace",title:"Choose workspace",actions:[{id:"workspace",kind:"select",label:"Workspace",instruction:"Select the Render workspace whose services Sazabi should list.",placeholder:"Select a workspace",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"type"}]}],submit:{metadata:{apiToken:"$token",ownerId:"$workspace.id",ownerName:"$workspace.name"},displayName:"$workspace.name",button:vt}},$T={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",actions:[{instruction:"In your [Render dashboard](https://dashboard.render.com), open the workspace you want to forward, then go to **Workspace Settings > Log Streams** and add a log stream.",notes:[{text:"This log stream is **workspace-wide** — Render sends logs from every service in the workspace. To pick individual services instead, connect your Render account and Sazabi sets up a per-service log stream for each one."}]}]},{id:"endpoint",section:"config",title:"Set endpoint and token",actions:[{instruction:"Paste the endpoint and token (above) into the log stream form."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — deploy a service or hit an application route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/render"},GT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"type",header:"Type",width:"w-40",cell:"badge"}],searchPlaceholder:"Search services...",searchFields:["name"],dedupeByConfigField:"serviceId",emptyState:{noMatches:"No services found.",allConfigured:"All services already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{serviceId:"$item.id",serviceName:"$item.name",serviceType:"$item.type"}}}}});var Ixe,Sxe,FK;var $K=h(()=>{UK();Ixe=["apiToken"],Sxe={id:"render-syslog",label:"Render",transform:"otlp-key-stripping-logs"},FK={id:"render",name:"Render",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:Ixe,intake:[Sxe],subtitle:"Forward your Render service logs directly to Sazabi for real-time monitoring.",features:["Log forwarding","Service monitoring","Environment filtering"],evidenceHints:["render.yaml or Render blueprint files","README/docs naming Render as the deploy host","Services, workers, or cron jobs deployed to Render"],setupSkill:te,dashboard:{iconKey:"render",intakeSourceId:"render-syslog",streamSelectorLayout:"sidepanel",connectionMetadataSection:{title:"Render details",description:"The Render workspace linked to this connection.",fields:[{key:"ownerId",label:"Workspace ID",description:"Render workspace linked to this connection."}]},actions:{list:{options:{procedure:"render.listWorkspaces",itemsField:"workspaces",sensitiveInputFields:["token"]},list:{procedure:"render.listServices",itemsField:"services"}}}}}});var HT;var GK=h(()=>{HT={groups:[{id:"environment",section:"config",title:"Set your Respan base URL",actions:[{instruction:"Set `RESPAN_BASE_URL` to your intake URL (above) in the app you want to trace."}]},{id:"install",section:"config",title:"Install the Respan SDK",actions:[{instruction:"Install the Respan SDK in the app you want to trace.",payloads:[{kind:"code",label:"Install",language:"bash",copyLabel:"Install command",value:`# Python
7402
+ opentelemetry-instrument python app.py`,copyLabel:"Python OpenTelemetry bootstrap"}]}]}]},{id:"deploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Review and deploy the staged variable change set when prompted, then send some traffic to the service.",notes:[{text:"If nothing appears, check the Railway deployment logs for OpenTelemetry exporter errors and confirm your app is sending through OpenTelemetry, not only to stdout."}]}]}]}});var zK;var jK=h(()=>{MK();zK={id:"railway",name:"Railway",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",intake:[{id:"railway",label:"Railway",transform:"otlp-passthrough"}],subtitle:"Forward your Railway deployment logs directly to Sazabi for real-time monitoring.",features:["Log drains","Deployment logs","Service monitoring"],evidenceHints:["railway.json, railway.toml, or Railway deploy scripts","RAILWAY_* environment variables","README/docs naming Railway as the deploy host"],setupSkill:te,dashboard:{iconKey:"railway",intakeSourceId:"railway"}}});var FT,$T,GT;var UK=h(()=>{Un();FT={kind:"multi-step",steps:[{id:"credentials",title:"Enter API key",actions:[{kind:"instruction",instruction:"Create an API key in your [Render dashboard](https://dashboard.render.com/settings#api-keys)."},{id:"token",kind:"secret",label:"API key",instruction:"Enter your Render API key below.",placeholder:"rnd_..."}]},{id:"workspace",title:"Choose workspace",actions:[{id:"workspace",kind:"select",label:"Workspace",instruction:"Select the Render workspace whose services Sazabi should list.",placeholder:"Select a workspace",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"type"}]}],submit:{metadata:{apiToken:"$token",ownerId:"$workspace.id",ownerName:"$workspace.name"},displayName:"$workspace.name",button:vt}},$T={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",actions:[{instruction:"In your [Render dashboard](https://dashboard.render.com), open the workspace you want to forward, then go to **Workspace Settings > Log Streams** and add a log stream.",notes:[{text:"This log stream is **workspace-wide** — Render sends logs from every service in the workspace. To pick individual services instead, connect your Render account and Sazabi sets up a per-service log stream for each one."}]}]},{id:"endpoint",section:"config",title:"Set endpoint and token",actions:[{instruction:"Paste the endpoint and token (above) into the log stream form."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — deploy a service or hit an application route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/render"},GT={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"type",header:"Type",width:"w-40",cell:"badge"}],searchPlaceholder:"Search services...",searchFields:["name"],dedupeByConfigField:"serviceId",emptyState:{noMatches:"No services found.",allConfigured:"All services already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{serviceId:"$item.id",serviceName:"$item.name",serviceType:"$item.type"}}}}});var Ixe,Sxe,FK;var $K=h(()=>{UK();Ixe=["apiToken"],Sxe={id:"render-syslog",label:"Render",transform:"otlp-key-stripping-logs"},FK={id:"render",name:"Render",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:Ixe,intake:[Sxe],subtitle:"Forward your Render service logs directly to Sazabi for real-time monitoring.",features:["Log forwarding","Service monitoring","Environment filtering"],evidenceHints:["render.yaml or Render blueprint files","README/docs naming Render as the deploy host","Services, workers, or cron jobs deployed to Render"],setupSkill:te,dashboard:{iconKey:"render",intakeSourceId:"render-syslog",streamSelectorLayout:"sidepanel",connectionMetadataSection:{title:"Render details",description:"The Render workspace linked to this connection.",fields:[{key:"ownerId",label:"Workspace ID",description:"Render workspace linked to this connection."}]},actions:{list:{options:{procedure:"render.listWorkspaces",itemsField:"workspaces",sensitiveInputFields:["token"]},list:{procedure:"render.listServices",itemsField:"services"}}}}}});var HT;var GK=h(()=>{HT={groups:[{id:"environment",section:"config",title:"Set your Respan base URL",actions:[{instruction:"Set `RESPAN_BASE_URL` to your intake URL (above) in the app you want to trace."}]},{id:"install",section:"config",title:"Install the Respan SDK",actions:[{instruction:"Install the Respan SDK in the app you want to trace.",payloads:[{kind:"code",label:"Install",language:"bash",copyLabel:"Install command",value:`# Python
7424
7403
  pip install respan-ai
7425
7404
 
7426
7405
  # TypeScript
@@ -7439,7 +7418,28 @@ const respan = new Respan({
7439
7418
  });
7440
7419
  await respan.initialize();
7441
7420
 
7442
- // All supported LLM and agent calls are now auto-traced and exported to Sazabi.`}],notes:[{text:"The SDK sends its auto-instrumented spans to Sazabi over OTLP/HTTP — you do not need a separate OpenTelemetry exporter."},{text:"Using an agent framework? Pass the matching instrumentor, e.g. `Respan({ instrumentations: [...] })`, exactly as you would when exporting to Respan's own backend — only the base URL changes."},{text:"Already send OpenTelemetry directly (or run an OTel Collector)? Skip the Respan SDK and point your existing OTLP/HTTP trace exporter at the same host with the standard `/v1/traces` path (http/json or http/protobuf). This source accepts both the Respan SDK's `/api/v2/traces` path and the standard OTLP `/v1/traces` path."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart the service, then run an LLM or agent workload to generate a trace."}]}]}});var HK;var qK=h(()=>{GK();HK={id:"respan",name:"Respan",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"respan",label:"Respan",transform:"otlp-passthrough",transformOptions:{tracePathSuffixes:["/api/v2/traces","/v1/traces"]}}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Respan LLM traces directly to Sazabi for AI application observability.",features:["LLM traces","Token & cost tracking","Agent workflow monitoring"],evidenceHints:["respan-ai or @respan/respan packages, or a Respan() initializer","RESPAN_API_KEY environment variables","README/docs naming Respan for LLM tracing or observability"],setupSkill:te,dashboard:{iconKey:"respan",intakeSourceId:"respan"}}});var qT,VT;var VK=h(()=>{Un();qT={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{variant:"requirement",text:"You must be an **Owner** or **Manager** in the Sentry organization — creating an Internal Integration needs the `org:write` scope, which Admin, Member, and Billing roles do not have (Sentry returns 403)."}],actions:[{kind:"instruction",instruction:"Create a Sentry **User Auth Token** (not an Organization Auth Token) with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read** scopes. User Auth Tokens are created under your personal Sentry settings; Organization Auth Tokens (under org settings) require different management and scopes — use a User Auth Token.",payloads:[{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}],notes:[{text:"The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."}]},{kind:"instruction",instruction:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A Sentry User Auth Token (not Organization Auth Token) with the org:write, project:read, and event:read scopes.",placeholder:"Enter your Sentry auth token"},{id:"organizationSlug",kind:"text",label:"Sentry organization slug",instruction:"Enter your Sentry organization slug below.",description:"The slug from your Sentry URL: sentry.io/organizations/<slug>/",placeholder:"e.g. my-org",pattern:"^[a-z0-9][a-z0-9-]*[a-z0-9]$",patternMessage:"Enter a valid Sentry organization slug (lowercase, hyphens allowed)."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",organizationSlug:"$organizationSlug"},resultAs:"validate"}],metadata:{sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:vt},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},VT={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",notes:[{variant:"requirement",text:"Creating an Internal Integration needs the **`org:write`** scope, which Sentry grants only to organization **Owners** and **Managers**. On this path the scope never leaves Sentry — you give Sazabi no auth token."}],actions:[{instruction:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**.",payloads:[{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"}]},{instruction:"Under **Webhooks**, enable webhooks and subscribe to the **Issue** and **Comment** resources. To route alerts as well, enable **Alert Rule Action** so the integration can be added as a notification destination on Issue Alert and Metric Alert rules."}]},{id:"endpoint",section:"config",title:"Set the webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Internal Integration's Webhook URL field."},{instruction:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",actions:[{instruction:"Do something in Sentry to trigger an event — comment on an issue, change an issue's status, or create a fresh issue by throwing an exception in an instrumented project. `issue` and `comment` webhooks arrive within a few minutes."},{instruction:"To stream `event_alert` / `metric_alert` webhooks, edit each Issue Alert or Metric Alert rule in Sentry and add this integration as a notification destination — alerts are opt-in."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var Cxe,vxe,KK;var YK=h(()=>{VK();Cxe=["sentryAuthToken"],vxe={id:"sentry-platform",label:"Sentry Platform",transform:"sentry-platform-webhook"},KK={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:Cxe,serverOwnedStreamConfigFields:["sentryAppSlug"],intake:[vxe],subtitle:"Connect your Sentry organization to stream errors, issues, and alerts to Sazabi in real-time.",features:["Error streaming","Issue tracking","Alert forwarding","Metric alerts"],evidenceHints:["Sentry organization or project config where org-level event forwarding is preferred","sentry-cli release/deploy automation that would benefit from platform context","Multiple Sentry SDK projects that should be connected through one Sentry platform integration"],setupSkill:te,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var KT;var WK=h(()=>{KT={kind:"choice",title:"Choose Sentry SDK",description:"Choose the SDK snippet that matches your application, or copy the DSN for any other official Sentry SDK.",options:[{id:"javascript",label:"JavaScript / Node.js",description:"Initialize `@sentry/node` with the Sazabi DSN.",flow:{groups:[{id:"configure",section:"config",title:"Initialize SDK",actions:[{instruction:"Pick how you want events routed, then initialize the SDK with the matching snippet.",payloads:[{kind:"options",options:[{id:"sazabi-only",label:"Send only to Sazabi",description:"Replaces your Sentry project DSN with the Sazabi DSN — the simplest setup; your existing Sentry project no longer receives these events.",payloads:[{kind:"code",language:"javascript",copyLabel:"JavaScript",value:`import * as Sentry from "@sentry/node";
7421
+ // All supported LLM and agent calls are now auto-traced and exported to Sazabi.`}],notes:[{text:"The SDK sends its auto-instrumented spans to Sazabi over OTLP/HTTP — you do not need a separate OpenTelemetry exporter."},{text:"Using an agent framework? Pass the matching instrumentor, e.g. `Respan({ instrumentations: [...] })`, exactly as you would when exporting to Respan's own backend — only the base URL changes."},{text:"Already send OpenTelemetry directly (or run an OTel Collector)? Skip the Respan SDK and point your existing OTLP/HTTP trace exporter at the same host with the standard `/v1/traces` path (http/json or http/protobuf). This source accepts both the Respan SDK's `/api/v2/traces` path and the standard OTLP `/v1/traces` path."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart the service, then run an LLM or agent workload to generate a trace."}]}]}});var HK;var qK=h(()=>{GK();HK={id:"respan",name:"Respan",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"respan",label:"Respan",transform:"otlp-passthrough",transformOptions:{tracePathSuffixes:["/api/v2/traces","/v1/traces"]}}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Respan LLM traces directly to Sazabi for AI application observability.",features:["LLM traces","Token & cost tracking","Agent workflow monitoring"],evidenceHints:["respan-ai or @respan/respan packages, or a Respan() initializer","RESPAN_API_KEY environment variables","README/docs naming Respan for LLM tracing or observability"],setupSkill:te,dashboard:{iconKey:"respan",intakeSourceId:"respan"}}});var qT;var VK=h(()=>{qT={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/sazabi-browser-sdk",groups:[{id:"install",section:"config",title:"Install the SDK",actions:[{instruction:"Add **@sazabi/browser** to the app you want to observe.",payloads:[{kind:"code-tabs",label:"Install @sazabi/browser",tabs:[{id:"bun",label:"bun",language:"bash",copyLabel:"bun install command",value:"bun add @sazabi/browser"},{id:"npm",label:"npm",language:"bash",copyLabel:"npm install command",value:"npm install @sazabi/browser"},{id:"pnpm",label:"pnpm",language:"bash",copyLabel:"pnpm install command",value:"pnpm add @sazabi/browser"},{id:"yarn",label:"yarn",language:"bash",copyLabel:"yarn install command",value:"yarn add @sazabi/browser"}]}]}]},{id:"initialize",section:"config",title:"Initialize in your app",actions:[{instruction:"Import `@sazabi/browser/register` on the **first line** of your entry module, then call `init()` with your intake URL (above).",payloads:[{kind:"code",label:"Entry module",language:"typescript",copyLabel:"SDK initialization",value:`// Must be the first import: it installs dormant instrumentation before
7422
+ // any other module can capture the native fetch/XHR/history references.
7423
+ import "@sazabi/browser/register";
7424
+
7425
+ import { init } from "@sazabi/browser";
7426
+
7427
+ init({
7428
+ intakeUrl: "https://\${context.ingestHost}",
7429
+ serviceName: "my-web-app",
7430
+ });`}],notes:[{text:"The public key is meant to ship in your browser bundle — it can only write telemetry, never read it."},{text:"Ordering matters: libraries that capture `window.fetch` at module scope win if they load first, and the SDK would then miss their requests."}]},{instruction:"Add each cross-origin API you call to `network.allowlist` so the SDK injects W3C `traceparent` into those requests.",payloads:[{kind:"code",label:"Cross-origin trace propagation",language:"typescript",copyLabel:"Network allowlist",value:`init({
7431
+ intakeUrl: "https://\${context.ingestHost}",
7432
+ serviceName: "my-web-app",
7433
+ network: {
7434
+ // Same-origin requests are allowlisted by default; add each cross-origin
7435
+ // API you want traceparent injected into.
7436
+ allowlist: ["https://api.example.com"],
7437
+ },
7438
+ });`}],notes:[{text:"Your API's CORS configuration must list `traceparent` in `Access-Control-Allow-Headers`, or the browser preflight fails and the requests break. Skip this action if your API is same-origin — those requests are allowlisted already.",variant:"requirement"}]},{instruction:"Call `identify()` on sign-in and `reset()` on sign-out to attribute sessions to a user, and `addEvent()` to mark your own milestones.",payloads:[{kind:"code",label:"Identity and custom marks",language:"typescript",copyLabel:"Identity snippet",value:`import { addEvent, identify, reset } from "@sazabi/browser";
7439
+
7440
+ identify("user_123", { plan: "pro" }); // on sign-in
7441
+ addEvent("checkout_started", { cartValue: 42 }); // custom mark
7442
+ reset(); // on sign-out`}],notes:[{text:"`session.distinct_id` is asserted by the browser, not authenticated — treat it as a claim, not proof of identity."}]}]},{id:"verify",section:"verify",title:"Verify events are arriving",actions:[{instruction:"Load your app and click through a few pages, then watch for events here.",notes:[{text:"The SDK batches and flushes every 5 seconds, and again when the tab is hidden or closed, so the first events land within about 10 seconds of activity."},{text:"In your browser's network tab, filter for `intake` — POSTs to `/v1/logs` should return 200."}]}]}]}});var KK;var YK=h(()=>{VK();KK={id:"sazabi_browser_sdk",name:"Sazabi Browser SDK",searchAliases:["browser","browser sdk","frontend","javascript","rum","session","web"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"sazabi-browser-sdk",label:"Sazabi Browser SDK",aliases:["web"],transform:"otlp-passthrough"}],lifecycleSkipReason:"Browser SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Capture browser sessions — navigation, clicks, errors, and network calls with trace context — with the Sazabi browser SDK.",features:["Session-scoped event stream","Frontend error capture","Network calls with W3C trace context","Frontend-to-backend log correlation"],evidenceHints:["Frontend framework dependencies in package.json (react, vue, svelte, next, vite)","A browser entry point such as index.html or src/main.tsx","@sazabi/browser already present in package.json"],setupSkill:te,dashboard:{iconKey:"sazabi-browser-sdk",intakeSourceId:"sazabi-browser-sdk"}}});var VT,KT;var WK=h(()=>{Un();VT={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{variant:"requirement",text:"You must be an **Owner** or **Manager** in the Sentry organization — creating an Internal Integration needs the `org:write` scope, which Admin, Member, and Billing roles do not have (Sentry returns 403)."}],actions:[{kind:"instruction",instruction:"Create a Sentry **User Auth Token** (not an Organization Auth Token) with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read** scopes. User Auth Tokens are created under your personal Sentry settings; Organization Auth Tokens (under org settings) require different management and scopes — use a User Auth Token.",payloads:[{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}],notes:[{text:"The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."}]},{kind:"instruction",instruction:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A Sentry User Auth Token (not Organization Auth Token) with the org:write, project:read, and event:read scopes.",placeholder:"Enter your Sentry auth token"},{id:"organizationSlug",kind:"text",label:"Sentry organization slug",instruction:"Enter your Sentry organization slug below.",description:"The slug from your Sentry URL: sentry.io/organizations/<slug>/",placeholder:"e.g. my-org",pattern:"^[a-z0-9][a-z0-9-]*[a-z0-9]$",patternMessage:"Enter a valid Sentry organization slug (lowercase, hyphens allowed)."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",organizationSlug:"$organizationSlug"},resultAs:"validate"}],metadata:{sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:vt},docsUrl:"https://docs.sazabi.com/catalogs/log-sources/connect-your-account/sentry"},KT={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",notes:[{variant:"requirement",text:"Creating an Internal Integration needs the **`org:write`** scope, which Sentry grants only to organization **Owners** and **Managers**. On this path the scope never leaves Sentry — you give Sazabi no auth token."}],actions:[{instruction:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**.",payloads:[{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"}]},{instruction:"Under **Webhooks**, enable webhooks and subscribe to the **Issue** and **Comment** resources. To route alerts as well, enable **Alert Rule Action** so the integration can be added as a notification destination on Issue Alert and Metric Alert rules."}]},{id:"endpoint",section:"config",title:"Set the webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Internal Integration's Webhook URL field."},{instruction:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",actions:[{instruction:"Do something in Sentry to trigger an event — comment on an issue, change an issue's status, or create a fresh issue by throwing an exception in an instrumented project. `issue` and `comment` webhooks arrive within a few minutes."},{instruction:"To stream `event_alert` / `metric_alert` webhooks, edit each Issue Alert or Metric Alert rule in Sentry and add this integration as a notification destination — alerts are opt-in."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/sentry"}});var Cxe,vxe,JK;var ZK=h(()=>{WK();Cxe=["sentryAuthToken"],vxe={id:"sentry-platform",label:"Sentry Platform",transform:"sentry-platform-webhook"},JK={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:Cxe,serverOwnedStreamConfigFields:["sentryAppSlug"],intake:[vxe],subtitle:"Connect your Sentry organization to stream errors, issues, and alerts to Sazabi in real-time.",features:["Error streaming","Issue tracking","Alert forwarding","Metric alerts"],evidenceHints:["Sentry organization or project config where org-level event forwarding is preferred","sentry-cli release/deploy automation that would benefit from platform context","Multiple Sentry SDK projects that should be connected through one Sentry platform integration"],setupSkill:te,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var YT;var XK=h(()=>{YT={kind:"choice",title:"Choose Sentry SDK",description:"Choose the SDK snippet that matches your application, or copy the DSN for any other official Sentry SDK.",options:[{id:"javascript",label:"JavaScript / Node.js",description:"Initialize `@sentry/node` with the Sazabi DSN.",flow:{groups:[{id:"configure",section:"config",title:"Initialize SDK",actions:[{instruction:"Pick how you want events routed, then initialize the SDK with the matching snippet.",payloads:[{kind:"options",options:[{id:"sazabi-only",label:"Send only to Sazabi",description:"Replaces your Sentry project DSN with the Sazabi DSN — the simplest setup; your existing Sentry project no longer receives these events.",payloads:[{kind:"code",language:"javascript",copyLabel:"JavaScript",value:`import * as Sentry from "@sentry/node";
7443
7443
 
7444
7444
  Sentry.init({
7445
7445
  dsn: "https://sazabi@\${context.ingestHost}/0",
@@ -7483,7 +7483,7 @@ sentry_sdk.init(
7483
7483
  dsn=SENTRY_DSN,
7484
7484
  enable_logs=True,
7485
7485
  before_send=_forward_to_sazabi,
7486
- )`}],notes:[{text:"The Python SDK has no built-in multiplexed transport, so a second `Client` plus a `before_send` hook forwards a copy of each event to Sazabi; returning `event` keeps your primary Sentry project receiving it."},{text:"`before_send` forwards error events only — structured logs stay on your primary Sentry project on this path. Verify Sazabi delivery with a test exception."}]}]}]}]},{id:"verify",section:"verify",title:"Verify telemetry",actions:[{instruction:"Restart the app, then send a test exception and write a structured log to confirm they arrive in Sazabi.",notes:[{text:"The snippet above already enables structured logging (`enable_logs=True`)."},{text:"This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}]}}]}});var JK;var ZK=h(()=>{WK();JK={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"sentry-dsn",label:"Sentry SDK",transform:"sentry-envelope"}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward Sentry SDK errors, structured logs, and envelope telemetry directly to Sazabi.",features:["Error forwarding","Structured logs","Envelope telemetry","SDK integration"],evidenceHints:["@sentry packages, sentry.properties, SENTRY_DSN, or sentry-cli releases","Sentry.init calls or framework-specific Sentry config files","README/docs naming Sentry as the error tracking provider"],setupSkill:te,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var YT;var XK=h(()=>{YT={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."}],actions:[{instruction:"In the [Supabase dashboard](https://supabase.com/dashboard), open the project whose logs you want to forward, then open **Project Settings > Log Drains** and click **Add destination**."}]},{id:"fields",section:"config",title:"Copy drain fields",actions:[{instruction:"Fill in the **Name** and **Description** fields.",payloads:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."}]},{instruction:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"config",title:"OTLP Endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field."}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",actions:[{instruction:"Fill in the **Protocol** field.",payloads:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"}]},{instruction:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log drain, then trigger activity — run a query or hit your project's API. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/supabase"}});var eY;var tY=h(()=>{XK();eY={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"supabase",label:"Supabase",transform:"supabase-drain"}],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Supabase project logs directly to Sazabi for unified observability.",features:["Database logs","Auth events","Edge Function logs"],evidenceHints:["supabase/ directory, supabase/config.toml, or Supabase CLI scripts","@supabase/* packages, SUPABASE_URL, or SUPABASE_SERVICE_ROLE_KEY","README/docs naming Supabase for Postgres, Auth, Storage, or Edge Functions"],setupSkill:te,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var WT;var nY=h(()=>{Un();WT={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",actions:[...Nf("Temporal worker")]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var oY;var rY=h(()=>{nY();oY={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",intake:[{id:"temporal",label:"Temporal",transform:"otlp-passthrough"}],subtitle:"Forward OpenTelemetry logs and traces from your Temporal workers to Sazabi for durable execution observability.",features:["Worker logs","Workflow and activity traces"],evidenceHints:["@temporalio packages, Temporal worker entrypoints, workflows/, or activities/","TEMPORAL_ADDRESS, TEMPORAL_NAMESPACE, or Temporal Cloud deployment docs","Background workflows or durable orchestration code that already emits OTLP telemetry"],setupSkill:te,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var JT;var iY=h(()=>{JT={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",actions:[{instruction:"Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file."},{instruction:"If your project already sets up OpenTelemetry in code, reuse the Sazabi log intake URL in that setup instead of adding a second exporter."}]},{id:"configure",section:"config",title:"Configure log exporter",actions:[{instruction:"Add the OTLP log exporter to `trigger.config.ts`.",payloads:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
7486
+ )`}],notes:[{text:"The Python SDK has no built-in multiplexed transport, so a second `Client` plus a `before_send` hook forwards a copy of each event to Sazabi; returning `event` keeps your primary Sentry project receiving it."},{text:"`before_send` forwards error events only — structured logs stay on your primary Sentry project on this path. Verify Sazabi delivery with a test exception."}]}]}]}]},{id:"verify",section:"verify",title:"Verify telemetry",actions:[{instruction:"Restart the app, then send a test exception and write a structured log to confirm they arrive in Sazabi.",notes:[{text:"The snippet above already enables structured logging (`enable_logs=True`)."},{text:"This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}]}}]}});var eY;var tY=h(()=>{XK();eY={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"sentry-dsn",label:"Sentry SDK",transform:"sentry-envelope"}],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward Sentry SDK errors, structured logs, and envelope telemetry directly to Sazabi.",features:["Error forwarding","Structured logs","Envelope telemetry","SDK integration"],evidenceHints:["@sentry packages, sentry.properties, SENTRY_DSN, or sentry-cli releases","Sentry.init calls or framework-specific Sentry config files","README/docs naming Sentry as the error tracking provider"],setupSkill:te,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var WT;var nY=h(()=>{WT={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."}],actions:[{instruction:"In the [Supabase dashboard](https://supabase.com/dashboard), open the project whose logs you want to forward, then open **Project Settings > Log Drains** and click **Add destination**."}]},{id:"fields",section:"config",title:"Copy drain fields",actions:[{instruction:"Fill in the **Name** and **Description** fields.",payloads:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."}]},{instruction:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"config",title:"OTLP Endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field."}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",actions:[{instruction:"Fill in the **Protocol** field.",payloads:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"}]},{instruction:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log drain, then trigger activity — run a query or hit your project's API. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/supabase"}});var oY;var rY=h(()=>{nY();oY={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"supabase",label:"Supabase",transform:"supabase-drain"}],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Supabase project logs directly to Sazabi for unified observability.",features:["Database logs","Auth events","Edge Function logs"],evidenceHints:["supabase/ directory, supabase/config.toml, or Supabase CLI scripts","@supabase/* packages, SUPABASE_URL, or SUPABASE_SERVICE_ROLE_KEY","README/docs naming Supabase for Postgres, Auth, Storage, or Edge Functions"],setupSkill:te,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var JT;var iY=h(()=>{Un();JT={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",actions:[...Nf("Temporal worker")]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var sY;var aY=h(()=>{iY();sY={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",intake:[{id:"temporal",label:"Temporal",transform:"otlp-passthrough"}],subtitle:"Forward OpenTelemetry logs and traces from your Temporal workers to Sazabi for durable execution observability.",features:["Worker logs","Workflow and activity traces"],evidenceHints:["@temporalio packages, Temporal worker entrypoints, workflows/, or activities/","TEMPORAL_ADDRESS, TEMPORAL_NAMESPACE, or Temporal Cloud deployment docs","Background workflows or durable orchestration code that already emits OTLP telemetry"],setupSkill:te,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var ZT;var cY=h(()=>{ZT={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",actions:[{instruction:"Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file."},{instruction:"If your project already sets up OpenTelemetry in code, reuse the Sazabi log intake URL in that setup instead of adding a second exporter."}]},{id:"configure",section:"config",title:"Configure log exporter",actions:[{instruction:"Add the OTLP log exporter to `trigger.config.ts`.",payloads:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
7487
7487
  import { defineConfig } from "@trigger.dev/sdk";
7488
7488
 
7489
7489
  export default defineConfig({
@@ -7496,7 +7496,7 @@ export default defineConfig({
7496
7496
  ],
7497
7497
  },
7498
7498
  });
7499
- `,copyLabel:"Trigger.dev config snippet"}],notes:[{text:"Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy Trigger.dev so it picks up the new log exporter, then run a task to confirm its logs arrive in Sazabi.",notes:[{text:"This source stores logs only — trace exporters, metrics exporters, alert webhooks, and management API polling are intentionally out of scope. Use `telemetry.logExporters`; do not configure this source through `telemetry.exporters`, Trigger.dev alert webhooks, or management API polling."}]}]}]}});var sY;var aY=h(()=>{iY();sY={id:"trigger_dev",name:"Trigger.dev",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual trigger.config.ts setup is not exercised by automated lifecycle tests yet.",intake:[{id:"trigger-dev",label:"Trigger.dev",transform:"otlp-passthrough"}],subtitle:"Stream your Trigger.dev job logs directly to Sazabi for background job monitoring.",features:["Task logs","Run failure logs","Background job monitoring"],evidenceHints:["trigger.config.ts/js or @trigger.dev packages","TRIGGER_* environment variables or tasks under trigger/ or src/trigger","README/docs naming Trigger.dev for background jobs"],setupSkill:te,dashboard:{iconKey:"trigger-dev",intakeSourceId:"trigger-dev"}}});var ZT;var cY=h(()=>{ZT={perStreamInstructions:!0,groups:[{id:"copy-config",section:"config",title:"Copy logs pipeline",notes:[{variant:"requirement",text:"Vector 0.51.0 or later is required for the `otlp` encoding codec."}],actions:[{instruction:"Add a remap transform and OpenTelemetry sink to your Vector config.",payloads:[{kind:"code-tabs",label:"Vector configuration",description:"Choose the snippet format that matches how you deploy Vector.",tabs:[{id:"yaml",label:"`vector.yaml`",language:"yaml",copyLabel:"Vector YAML config",value:`transforms:
7499
+ `,copyLabel:"Trigger.dev config snippet"}],notes:[{text:"Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration."}]}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy Trigger.dev so it picks up the new log exporter, then run a task to confirm its logs arrive in Sazabi.",notes:[{text:"This source stores logs only — trace exporters, metrics exporters, alert webhooks, and management API polling are intentionally out of scope. Use `telemetry.logExporters`; do not configure this source through `telemetry.exporters`, Trigger.dev alert webhooks, or management API polling."}]}]}]}});var lY;var uY=h(()=>{cY();lY={id:"trigger_dev",name:"Trigger.dev",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual trigger.config.ts setup is not exercised by automated lifecycle tests yet.",intake:[{id:"trigger-dev",label:"Trigger.dev",transform:"otlp-passthrough"}],subtitle:"Stream your Trigger.dev job logs directly to Sazabi for background job monitoring.",features:["Task logs","Run failure logs","Background job monitoring"],evidenceHints:["trigger.config.ts/js or @trigger.dev packages","TRIGGER_* environment variables or tasks under trigger/ or src/trigger","README/docs naming Trigger.dev for background jobs"],setupSkill:te,dashboard:{iconKey:"trigger-dev",intakeSourceId:"trigger-dev"}}});var XT;var dY=h(()=>{XT={perStreamInstructions:!0,groups:[{id:"copy-config",section:"config",title:"Copy logs pipeline",notes:[{variant:"requirement",text:"Vector 0.51.0 or later is required for the `otlp` encoding codec."}],actions:[{instruction:"Add a remap transform and OpenTelemetry sink to your Vector config.",payloads:[{kind:"code-tabs",label:"Vector configuration",description:"Choose the snippet format that matches how you deploy Vector.",tabs:[{id:"yaml",label:"`vector.yaml`",language:"yaml",copyLabel:"Vector YAML config",value:`transforms:
7500
7500
  sazabi_logs_otlp:
7501
7501
  type: remap
7502
7502
  inputs: ["*"] # replace with explicit source/transform IDs
@@ -7570,33 +7570,10 @@ sinks:
7570
7570
  uri: "https://\${context.ingestHost}/v1/logs"
7571
7571
  method: post
7572
7572
  encoding:
7573
- codec: otlp`}]}]}]},{id:"wire-sources",section:"config",title:"Wire sources",actions:[{instruction:'Replace `inputs: ["*"]` on the `remap` transform with your specific source or transform IDs in production. `["*"]` also matches `internal_metrics` and other unrelated components.',notes:[{variant:"requirement",text:"The sink's `otlp` codec doesn't build the OTLP envelope on its own. If you wire raw sources straight into it, Vector drops every event."},{text:"Sazabi indexes logs and traces from Vector. It accepts metrics at the intake but silently drops them."}]}]},{id:"traces",section:"config",title:"Forward traces (optional)",actions:[{instruction:'Add a second `opentelemetry` sink with `uri` ending in `/v1/traces` and explicit `inputs` referencing an already-OTLP-shaped source, typically an `opentelemetry` Vector source with `use_otlp_decoding.traces: true` (use `inputs: ["otlp_in.traces"]`).',notes:[{text:"No remap is needed for traces."},{variant:"requirement",text:'Do not wire `["*"]` into a traces sink.'}]}]}]}});var lY;var uY=h(()=>{cY();lY={id:"vector",name:"Vector",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"vector",label:"Vector",transform:"otlp-passthrough"}],subtitle:"Forward logs and traces from your infrastructure to Sazabi using the Vector observability pipeline.",features:["Kubernetes DaemonSet","High-throughput pipeline","Built-in transforms","Multiple source types"],evidenceHints:["vector.toml/yaml/json, vector.dev Helm values, or Vector sidecars","VECTOR_* environment variables or VRL transform config","README/docs naming Vector as the observability pipeline"],setupSkill:te,dashboard:{iconKey:"vector",intakeSourceId:"vector"}}});var eB,tB,XT,nB;var dY=h(()=>{Un();eB={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a full-access API token in your [Vercel account settings](https://vercel.com/account/tokens). For team accounts, create the token while scoped to the correct team.",notes:[{text:"A token gets the same permissions as your account."}]}]},{id:"credentials",title:"Enter token",actions:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Vercel API token below.",placeholder:"Enter your Vercel API token"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"},resultAs:"validate"}],metadata:{vercelApiToken:"$token",vercelTeamId:"$validate.teamId",vercelTeamName:"$validate.teamName"},button:vt}},tB={groups:[{id:"open-drains",section:"config",title:"Open Drains",notes:[{variant:"requirement",text:"**Vercel Drains require the Pro or Enterprise plan.** Hobby and Pro Trial teams cannot create drains."}],actions:[{instruction:"In your [Vercel dashboard](https://vercel.com/dashboard), go to **Team Settings > Drains** and create a new drain."},{instruction:"Choose **Logs** as the data to deliver.",notes:[{text:"This path covers logs only — to send traces or Web Analytics events, connect your Vercel account instead and Sazabi creates those drains for you."}]}]},{id:"endpoint",section:"config",title:"Set the endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the drain's endpoint field."}]},{id:"delivery-settings",section:"config",title:"Set delivery options",actions:[{instruction:"Set the delivery format to **JSON**.",notes:[{text:"Sazabi does not parse NDJSON on this endpoint."}]},{instruction:"Pick the projects, environments, and log sources to send.",notes:[{text:"Sazabi accepts every Vercel log source (Static, Lambda, Edge, Build, External, Firewall, Redirect)."}]}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the drain, then send some traffic — push a deployment or hit an application route. Logs show up in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/vercel"},XT=[{field:"name",header:"Project"},{field:"framework",header:"Framework",width:"w-32",cell:"badge",transform:"fallback:Unspecified"}],nB={content:{kind:"tabs",tabs:[{id:"logs",label:"Logs",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:XT,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"logs"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have logs drains configured."},toStreamItem:{displayName:"$item.name (Logs)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"logs"}}}},{id:"traces",label:"Traces",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:XT,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"traces"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have traces drains configured."},toStreamItem:{displayName:"$item.name (Traces)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"traces"}}}},{id:"analytics",label:"Analytics",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:XT,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"analytics"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have analytics drains configured."},toStreamItem:{displayName:"$item.name (Analytics)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"analytics"}}}}]}}});var wxe,Exe,kxe,pY;var gY=h(()=>{dY();wxe=["vercelApiToken"],Exe={id:"vercel",label:"Vercel",transform:"vercel-drain"},kxe={id:"vercel-analytics",label:"Vercel Analytics",transform:"vercel-analytics-drain"},pY={id:"vercel",name:"Vercel",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:wxe,serverOwnedStreamConfigFields:["vercelDrainId"],secretStreamConfigFields:["drainSecret"],intake:[Exe,kxe],subtitle:"Forward your Vercel deployment logs, traces, and Web Analytics events directly to Sazabi for real-time analysis and alerting.",features:["Log forwarding","Trace forwarding","Web Analytics forwarding","Real-time streaming"],evidenceHints:["vercel.json, .vercel/, or Vercel build/deploy scripts","@vercel packages, VERCEL_* environment variables, or GitHub Actions that run vercel","README/docs naming Vercel as the deployment host"],setupSkill:te,dashboard:{iconKey:"vercel",intakeSourceId:"vercel",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-enum-badge",header:"Type",width:"w-24",configField:"drainType",values:[{value:"logs",label:"Logs"},{value:"traces",label:"Traces"},{value:"analytics",label:"Analytics"}],fallbackLabel:"N/A"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate-token"}},list:{list:{kind:"source-action",actionId:"list-projects",itemsField:"projects"}}}}}});var oB;var mY=h(()=>{oB={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/log-sources/endpoint/web",groups:[{id:"install",section:"config",title:"Install the SDK",actions:[{instruction:"Add **@sazabi/browser** to the app you want to observe.",payloads:[{kind:"code-tabs",label:"Install @sazabi/browser",tabs:[{id:"bun",label:"bun",language:"bash",copyLabel:"bun install command",value:"bun add @sazabi/browser"},{id:"npm",label:"npm",language:"bash",copyLabel:"npm install command",value:"npm install @sazabi/browser"},{id:"pnpm",label:"pnpm",language:"bash",copyLabel:"pnpm install command",value:"pnpm add @sazabi/browser"},{id:"yarn",label:"yarn",language:"bash",copyLabel:"yarn install command",value:"yarn add @sazabi/browser"}]}]}]},{id:"initialize",section:"config",title:"Initialize in your app",actions:[{instruction:"Import `@sazabi/browser/register` on the **first line** of your entry module, then call `init()` with your intake URL (above).",payloads:[{kind:"code",label:"Entry module",language:"typescript",copyLabel:"SDK initialization",value:`// Must be the first import: it installs dormant instrumentation before
7574
- // any other module can capture the native fetch/XHR/history references.
7575
- import "@sazabi/browser/register";
7576
-
7577
- import { init } from "@sazabi/browser";
7578
-
7579
- init({
7580
- intakeHost: "https://\${context.ingestHost}",
7581
- publicKey: "\${context.publicKey}",
7582
- serviceName: "my-web-app",
7583
- });`}],notes:[{text:"The public key is meant to ship in your browser bundle — it can only write telemetry, never read it."},{text:"Ordering matters: libraries that capture `window.fetch` at module scope win if they load first, and the SDK would then miss their requests."}]},{instruction:"Add each cross-origin API you call to `network.allowlist` so the SDK injects W3C `traceparent` into those requests.",payloads:[{kind:"code",label:"Cross-origin trace propagation",language:"typescript",copyLabel:"Network allowlist",value:`init({
7584
- intakeHost: "https://\${context.ingestHost}",
7585
- publicKey: "\${context.publicKey}",
7586
- serviceName: "my-web-app",
7587
- network: {
7588
- // Same-origin requests are allowlisted by default; add each cross-origin
7589
- // API you want traceparent injected into.
7590
- allowlist: ["https://api.example.com"],
7591
- },
7592
- });`}],notes:[{text:"Your API's CORS configuration must list `traceparent` in `Access-Control-Allow-Headers`, or the browser preflight fails and the requests break. Skip this action if your API is same-origin — those requests are allowlisted already.",variant:"requirement"}]},{instruction:"Call `identify()` on sign-in and `reset()` on sign-out to attribute sessions to a user, and `addEvent()` to mark your own milestones.",payloads:[{kind:"code",label:"Identity and custom marks",language:"typescript",copyLabel:"Identity snippet",value:`import { addEvent, identify, reset } from "@sazabi/browser";
7593
-
7594
- identify("user_123", { plan: "pro" }); // on sign-in
7595
- addEvent("checkout_started", { cartValue: 42 }); // custom mark
7596
- reset(); // on sign-out`}],notes:[{text:"`session.distinct_id` is asserted by the browser, not authenticated — treat it as a claim, not proof of identity."}]}]},{id:"verify",section:"verify",title:"Verify events are arriving",actions:[{instruction:"Load your app and click through a few pages, then watch for events here.",notes:[{text:"The SDK batches and flushes every 5 seconds, and again when the tab is hidden or closed, so the first events land within about 10 seconds of activity."},{text:"In your browser's network tab, filter for `intake` — POSTs to `/v1/logs` should return 200."}]}]}]}});var hY;var AY=h(()=>{mY();hY={id:"web",name:"Web",searchAliases:["browser","browser sdk","frontend","javascript","rum","session"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"web",label:"Web",transform:"otlp-passthrough"}],lifecycleSkipReason:"Browser SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Capture browser sessions — navigation, clicks, errors, and network calls with trace context — with the Sazabi browser SDK.",features:["Session-scoped event stream","Frontend error capture","Network calls with W3C trace context","Frontend-to-backend log correlation"],evidenceHints:["Frontend framework dependencies in package.json (react, vue, svelte, next, vite)","A browser entry point such as index.html or src/main.tsx","@sazabi/browser already present in package.json"],setupSkill:te,dashboard:{iconKey:"web",intakeSourceId:"web"}}});var rB;var fY=h(()=>{rB={perStreamInstructions:!0,groups:[{id:"endpoint",section:"config",title:"Send events",actions:[{instruction:"Send an HTTP `POST` with a JSON body to your webhook URL (above).",notes:[{text:"A single JSON object is stored as one event; a JSON array of objects is stored as one event per element."},{text:"You can append any path — for example `/deploys` — to record the event's origin; the path is passed through and stored as `webhook.path`."}]}]},{id:"configure-vendor",section:"config",title:"Paste the URL into your vendor",actions:[{instruction:"Open your vendor's webhook or outbound-event settings, add a new endpoint, and paste the URL above. Choose JSON as the payload format if the vendor offers a choice.",notes:[{text:"Sazabi reads the time, severity, and message from common field names when present, and stores every field of the payload under `webhook.*` either way. There is nothing to map or declare."}]}]},{id:"verify",section:"verify",title:"Send a test event and verify",actions:[{instruction:"Trigger a test event from your vendor — most webhook settings pages have a “Send test” button — or POST a sample event yourself, then watch for it below.",payloads:[{kind:"code",label:"Send a test event",language:"bash",copyLabel:"curl test event",value:`curl -X POST \\
7573
+ codec: otlp`}]}]}]},{id:"wire-sources",section:"config",title:"Wire sources",actions:[{instruction:'Replace `inputs: ["*"]` on the `remap` transform with your specific source or transform IDs in production. `["*"]` also matches `internal_metrics` and other unrelated components.',notes:[{variant:"requirement",text:"The sink's `otlp` codec doesn't build the OTLP envelope on its own. If you wire raw sources straight into it, Vector drops every event."},{text:"Sazabi indexes logs and traces from Vector. It accepts metrics at the intake but silently drops them."}]}]},{id:"traces",section:"config",title:"Forward traces (optional)",actions:[{instruction:'Add a second `opentelemetry` sink with `uri` ending in `/v1/traces` and explicit `inputs` referencing an already-OTLP-shaped source, typically an `opentelemetry` Vector source with `use_otlp_decoding.traces: true` (use `inputs: ["otlp_in.traces"]`).',notes:[{text:"No remap is needed for traces."},{variant:"requirement",text:'Do not wire `["*"]` into a traces sink.'}]}]}]}});var pY;var gY=h(()=>{dY();pY={id:"vector",name:"Vector",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"vector",label:"Vector",transform:"otlp-passthrough"}],subtitle:"Forward logs and traces from your infrastructure to Sazabi using the Vector observability pipeline.",features:["Kubernetes DaemonSet","High-throughput pipeline","Built-in transforms","Multiple source types"],evidenceHints:["vector.toml/yaml/json, vector.dev Helm values, or Vector sidecars","VECTOR_* environment variables or VRL transform config","README/docs naming Vector as the observability pipeline"],setupSkill:te,dashboard:{iconKey:"vector",intakeSourceId:"vector"}}});var tB,nB,eB,oB;var mY=h(()=>{Un();tB={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a full-access API token in your [Vercel account settings](https://vercel.com/account/tokens). For team accounts, create the token while scoped to the correct team.",notes:[{text:"A token gets the same permissions as your account."}]}]},{id:"credentials",title:"Enter token",actions:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Vercel API token below.",placeholder:"Enter your Vercel API token"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"},resultAs:"validate"}],metadata:{vercelApiToken:"$token",vercelTeamId:"$validate.teamId",vercelTeamName:"$validate.teamName"},button:vt}},nB={groups:[{id:"open-drains",section:"config",title:"Open Drains",notes:[{variant:"requirement",text:"**Vercel Drains require the Pro or Enterprise plan.** Hobby and Pro Trial teams cannot create drains."}],actions:[{instruction:"In your [Vercel dashboard](https://vercel.com/dashboard), go to **Team Settings > Drains** and create a new drain."},{instruction:"Choose **Logs** as the data to deliver.",notes:[{text:"This path covers logs only — to send traces or Web Analytics events, connect your Vercel account instead and Sazabi creates those drains for you."}]}]},{id:"endpoint",section:"config",title:"Set the endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the drain's endpoint field."}]},{id:"delivery-settings",section:"config",title:"Set delivery options",actions:[{instruction:"Set the delivery format to **JSON**.",notes:[{text:"Sazabi does not parse NDJSON on this endpoint."}]},{instruction:"Pick the projects, environments, and log sources to send.",notes:[{text:"Sazabi accepts every Vercel log source (Static, Lambda, Edge, Build, External, Firewall, Redirect)."}]}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the drain, then send some traffic — push a deployment or hit an application route. Logs show up in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/catalogs/log-sources/send-to-an-endpoint/vercel"},eB=[{field:"name",header:"Project"},{field:"framework",header:"Framework",width:"w-32",cell:"badge",transform:"fallback:Unspecified"}],oB={content:{kind:"tabs",tabs:[{id:"logs",label:"Logs",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:eB,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"logs"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have logs drains configured."},toStreamItem:{displayName:"$item.name (Logs)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"logs"}}}},{id:"traces",label:"Traces",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:eB,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"traces"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have traces drains configured."},toStreamItem:{displayName:"$item.name (Traces)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"traces"}}}},{id:"analytics",label:"Analytics",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:eB,searchPlaceholder:"Search projects...",searchFields:["name","framework"],dedupeByConfigField:"vercelProjectId",dedupeExtraMatch:{drainType:"analytics"},emptyState:{noMatches:"No projects found.",allConfigured:"All projects already have analytics drains configured."},toStreamItem:{displayName:"$item.name (Analytics)",config:{vercelProjectId:"$item.id",vercelProjectName:"$item.name",drainType:"analytics"}}}}]}}});var wxe,Exe,kxe,hY;var AY=h(()=>{mY();wxe=["vercelApiToken"],Exe={id:"vercel",label:"Vercel",transform:"vercel-drain"},kxe={id:"vercel-analytics",label:"Vercel Analytics",transform:"vercel-analytics-drain"},hY={id:"vercel",name:"Vercel",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:wxe,serverOwnedStreamConfigFields:["vercelDrainId"],secretStreamConfigFields:["drainSecret"],intake:[Exe,kxe],subtitle:"Forward your Vercel deployment logs, traces, and Web Analytics events directly to Sazabi for real-time analysis and alerting.",features:["Log forwarding","Trace forwarding","Web Analytics forwarding","Real-time streaming"],evidenceHints:["vercel.json, .vercel/, or Vercel build/deploy scripts","@vercel packages, VERCEL_* environment variables, or GitHub Actions that run vercel","README/docs naming Vercel as the deployment host"],setupSkill:te,dashboard:{iconKey:"vercel",intakeSourceId:"vercel",streamSelectorLayout:"sidepanel",streamTableColumns:[{kind:"config-enum-badge",header:"Type",width:"w-24",configField:"drainType",values:[{value:"logs",label:"Logs"},{value:"traces",label:"Traces"},{value:"analytics",label:"Analytics"}],fallbackLabel:"N/A"}],actions:{submit:{validate:{kind:"source-action",actionId:"validate-token"}},list:{list:{kind:"source-action",actionId:"list-projects",itemsField:"projects"}}}}}});var rB;var fY=h(()=>{rB={perStreamInstructions:!0,groups:[{id:"endpoint",section:"config",title:"Send events",actions:[{instruction:"Send an HTTP `POST` with a JSON body to your webhook URL (above).",notes:[{text:"A single JSON object is stored as one event; a JSON array of objects is stored as one event per element."},{text:"You can append any path — for example `/deploys` — to record the event's origin; the path is passed through and stored as `webhook.path`."}]}]},{id:"configure-vendor",section:"config",title:"Paste the URL into your vendor",actions:[{instruction:"Open your vendor's webhook or outbound-event settings, add a new endpoint, and paste the URL above. Choose JSON as the payload format if the vendor offers a choice.",notes:[{text:"Sazabi reads the time, severity, and message from common field names when present, and stores every field of the payload under `webhook.*` either way. There is nothing to map or declare."}]}]},{id:"verify",section:"verify",title:"Send a test event and verify",actions:[{instruction:"Trigger a test event from your vendor most webhook settings pages have a “Send test” button — or POST a sample event yourself, then watch for it below.",payloads:[{kind:"code",label:"Send a test event",language:"bash",copyLabel:"curl test event",value:`curl -X POST \\
7597
7574
  https://\${context.ingestHost}/test \\
7598
7575
  -H 'content-type: application/json' \\
7599
- -d '{"event":"hello.world","level":"info","message":"first webhook event"}'`}]}]}]}});var yY;var bY=h(()=>{fY();yY={id:"webhook_events",name:"Webhook Events",searchAliases:["webhook","webhooks","json events","http events","generic webhook","event stream"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"webhook-events",label:"Webhook Events",transform:"webhook-events"}],lifecycleSkipReason:"Manual webhook setup is not exercised by automated lifecycle tests yet.",subtitle:"Point any vendor's webhooks at Sazabi. Arbitrary JSON events land as searchable log records with zero vendor-specific configuration.",features:["Any JSON event stream","One keyed URL per endpoint","Full payload preserved as attributes","No schema or field mapping"],evidenceHints:["A vendor that emits plain JSON webhooks without a dedicated Sazabi source","An internal service, deploy bot, or cron that POSTs JSON events","Existing outbound webhook configuration with no other Sazabi destination"],setupSkill:te,dashboard:{slug:"webhook-events",iconKey:"webhook-events",intakeSourceId:"webhook-events"}}});var Mf,zf,jIt,xxe,UIt,FIt,$It,Hc,GIt,HIt,Pxe,Rxe,Txe,qIt;var IY=h(()=>{aV();uV();gV();AV();bV();CV();EV();PV();BV();DV();NV();jV();$V();qV();YV();ZV();tK();rK();aK();uK();gK();AK();bK();CK();EK();PK();BK();DK();NK();jK();$K();qK();YK();ZK();tY();rY();aY();uY();gY();AY();bY();Mf=[sV,pV,lV,hV,yV,SV,wV,xV,TV,_V,QV,zV,FV,HV,KV,JV,eK,oK,sK,lK,pK,SK,hK,yK,wK,xK,_K,TK,QK,zK,FK,HK,KK,JK,eY,oY,sY,lY,pY,hY,yY],zf=Mf,jIt=Object.fromEntries(zf.map((e)=>[e.id,e.sensitiveFields??[]])),xxe=["publicKeyId"],UIt=Object.fromEntries(zf.map((e)=>[e.id,[...new Set([...xxe,...e.serverOwnedStreamConfigFields??[],...e.secretStreamConfigFields??[]])]])),FIt=Object.fromEntries(zf.map((e)=>[e.id,e.secretStreamConfigFields??[]])),$It=Object.fromEntries(zf.flatMap((e)=>[...Object.values(e.dashboard?.actions?.submit??{}),...Object.values(e.dashboard?.actions?.list??{}),...Object.values(e.dashboard?.actions?.prefetch??{})].flatMap((t)=>{let n=t.sensitiveInputFields??[];if(n.length===0)return[];return[["procedure"in t?t.procedure:`${e.id}.${t.actionId}`,n]]}))),Hc=["vercel","cloudflare","railway","render","fly_io","netlify","supabase","digital_ocean","inngest","trigger_dev","temporal","mastra","neon","langchain","daytona","e2b","cloudwatch","convex","datadog","sentry","sentry_platform","openrouter","posthog","posthog_sdk","gcp","otel","otel_metrics","fluent_bit","vector","grafana_alloy","otel_collector","cloudflare_workers","elastic_cloud","porter","respan","plain","prometheus","webhook_events","claude_code","codex","web"],GIt=Mf.map((e)=>({id:e.id,name:e.name,capabilities:e.capabilities})),HIt=Object.fromEntries(Mf.map((e)=>[e.id,{name:e.name,setupSkill:e.setupSkill}])),Pxe={cloudflare:YR,cloudwatch:tT,convex:iT,digital_ocean:uT,fly_io:AT,gcp:bT,plain:OT,posthog:NT,render:FT,sentry_platform:qT,vercel:eB},Rxe={cloudflare:WR,cloudwatch:nT,convex:aT,digital_ocean:pT,fly_io:yT,gcp:IT,plain:DT,posthog:MT,render:GT,vercel:nB},Txe={cloudflare:JR,cloudflare_workers:KR,cloudwatch:oT,convex:sT,datadog:cT,daytona:lT,digital_ocean:dT,fluent_bit:hT,fly_io:fT,grafana_alloy:CT,e2b:gT,elastic_cloud:mT,gcp:ST,inngest:vT,langchain:wT,mastra:ET,neon:kT,netlify:xT,openrouter:PT,otel:BT,otel_collector:RT,otel_metrics:TT,plain:_T,posthog:zT,posthog_sdk:QT,porter:LT,prometheus:jT,railway:UT,render:$T,respan:HT,sentry:KT,sentry_platform:VT,supabase:YT,temporal:WT,trigger_dev:JT,vector:ZT,vercel:tB,webhook_events:rB,claude_code:VR,codex:rT,web:oB},qIt=Mf.map((e)=>({sourceId:e.id,name:e.name,capabilities:e.capabilities,setupAuthModes:e.auth,deliveryModes:e.delivery,hasDashboardMetadata:Boolean(e.dashboard),hasManagedFlow:Boolean(Pxe[e.id]),hasConnectionlessFlow:Boolean(Txe[e.id]),hasStreamSelector:Boolean(Rxe[e.id]),lifecycleEligible:e.lifecycleEligible??!1,lifecycleSkipReason:e.lifecycleSkipReason}))});var SY=h(()=>{IY()});var iB=h(()=>{rV();SY()});var CY,sB,Bxe,jf,Oxe,vY,aB,Hs,fp,wY,EY,kY,Uf,xY,PY,qc,RY,TY,Vc,BY,OY,Ff,_Y,DY,$f,LY,QY,Gf,_xe;var Hf=h(()=>{iB();De();Ve();CY=Hc,sB=a.enum(CY),Bxe=a.enum(["pending","provisioning","active","error"]),jf=a.enum(["managed","connectionless"]),Oxe=a.object({name:a.string().describe("Field name used as the JSON key in metadata."),type:a.string().describe('Zod type name, e.g. "string", "boolean", "enum".'),required:a.boolean().describe("Whether the field is required."),sensitive:a.boolean().describe("Whether the field contains a secret and will be encrypted."),description:a.string().nullable().describe("Human-readable description of the field.")}),vY=a.object({id:a.string().describe("Log source provider identifier."),name:a.string().describe("Human-readable display name."),modes:a.array(jf).describe("Setup modes this provider supports. `managed` log sources take vendor credentials; `connectionless` log sources mint a keyed intake endpoint."),metadataFields:a.array(Oxe).describe("Fields required in the metadata object when creating a managed log source. Empty for connectionless-only providers."),setupSkill:a.string().nullable().describe("Markdown setup skill for AI agents. Null when no skill is available.")}),aB=a.object({kind:a.enum(["url","hostPort"]).describe("Card shape. `url` = a complete keyed URL whose hostname authenticates; `hostPort` = a non-keyed listener host + port whose credential travels separately."),label:a.string().optional().describe("Card label. Present when a log source exposes several endpoints (e.g. separate logs and traces destinations)."),url:a.string().optional().describe("The complete keyed intake URL. Present when kind is `url`."),host:a.string().optional().describe("The regional listener hostname (no scheme). Present when kind is `hostPort`."),port:a.number().int().optional().describe("The listener port. Present when kind is `hostPort`."),description:a.string().optional().describe("Vendor-specific guidance rendered under the value."),extraCredential:a.object({label:a.string(),value:a.string(),description:a.string().optional()}).optional().describe("The credential the sender must attach when the hostname alone does not authenticate. Present when kind is `hostPort`.")}),Hs=a.object({id:a.string().uuid(),logSourceId:a.string().uuid().describe("Root log source ID. Every log stream roots on exactly one log source."),displayName:a.string().nullable().describe("Display name pulled automatically from information available through the log source connection (e.g. the vendor object's name). Null when no connection-derived name exists; connectionless log streams are always nameless."),config:a.record(a.string(),a.unknown()),status:Bxe,errorMessage:a.string().nullable(),enabled:a.boolean().describe("Whether the log stream is currently ingesting. Independent of provisioning status: a paused log stream stays configured but stops accepting new data."),createdAt:a.string().datetime(),endpointCards:a.array(aB).optional().describe("Server-computed endpoint card(s) for this log stream's delivery key — where to point the sender. Present only for log streams that carry their own intake key.")}),fp=a.object({id:a.string().uuid(),provider:sB,mode:jf,name:a.string().describe('Display name — a generated mnemonic (e.g. "amber-falcon"). Assigned at creation and immutable.'),streamCount:a.number().int(),createdAt:a.string().datetime()}),wY=fp.extend({streams:a.array(Hs).describe("The log source's live log streams, newest first.")}),EY=a.object({}),kY=a.object({providers:a.array(vY)}),Uf=w({operationId:"logSources.listProviders",description:"List all supported log source providers with their setup modes and metadata requirements.",backend:"api",route:{method:"GET",path:"/log-sources/providers",tags:["Log Sources"]},input:EY,output:kY,pagination:"none",async:"sync"}),xY=a.object({projectId:a.string().uuid().optional().describe("Project to list log sources for. Auto-filled from SDK context when omitted."),provider:sB.optional().describe("Filter log sources by provider.")}),PY=a.object({logSources:a.array(fp)}),qc=w({operationId:"logSources.list",description:"List log sources within one project.",backend:"api",route:{method:"GET",path:"/log-sources",tags:["Log Sources"]},input:xY,output:PY,pagination:"none",async:"sync"}),RY=a.object({projectId:a.string().uuid().optional().describe("Project to create the log source in. Auto-filled from SDK context when omitted."),provider:sB.describe("Log source provider identifier."),mode:jf.optional().describe("Setup mode. Defaults to `managed` when metadata is provided, otherwise `connectionless`. Must be a mode the provider supports (see `modes` on the provider catalog)."),metadata:a.record(a.string(),a.unknown()).optional().describe("Vendor credentials and configuration for managed setup. Fields vary by provider (see `metadataFields` on the provider catalog). Required for managed mode; must be omitted for connectionless mode.")}).strict(),TY=a.object({logSource:fp.describe("The created log source."),streamId:a.string().uuid().optional().describe("ID of the log stream created alongside the log source. Present for connectionless log sources (which always mint their keyed log stream) and for managed providers that auto-provision a default log stream."),publicKey:a.string().optional().describe("Intake key minted for the log source. Store this securely — it is only shown once. Present for connectionless log sources and for managed providers that ingest through a Sazabi endpoint."),endpointCards:a.array(aB).optional().describe("Server-computed endpoint card(s) for the minted key — where to point the sender. Present for connectionless log sources.")}),Vc=w({operationId:"logSources.create",description:"Create a log source. Managed mode takes vendor credentials in `metadata`, validates them, and provisions delivery behind the log source. Connectionless mode mints the log source plus a keyed log stream and returns the intake key and endpoint card(s) to point the sender at.",backend:"api",route:{method:"POST",path:"/log-sources",successStatus:201,tags:["Log Sources"]},input:RY,output:TY,pagination:"none",async:"sync"}),BY=a.object({logSourceId:a.string().uuid().describe("Log source ID to fetch.")}),OY=a.object({logSource:wY}),Ff=w({operationId:"logSources.get",description:"Get one log source by ID, including its log streams and their endpoint card(s).",backend:"api",route:{method:"GET",path:"/log-sources/{logSourceId}",tags:["Log Sources"]},input:BY,output:OY,pagination:"none",async:"sync"}),_Y=a.object({logSourceId:a.string().uuid().describe("Log source ID to update."),enabled:a.boolean().optional().describe("Pause (`false`) or resume (`true`) ingestion for all of the log source's log streams. Reversible; never deletes anything.")}).strict(),DY=a.object({logSource:fp}),$f=w({operationId:"logSources.update",description:"Update a log source: pause or resume ingestion across its log streams. Log sources cannot be renamed — their generated names are immutable.",backend:"api",route:{method:"PATCH",path:"/log-sources/{logSourceId}",tags:["Log Sources"]},input:_Y,output:DY,pagination:"none",async:"sync"}),LY=a.object({logSourceId:a.string().uuid().describe("Log source ID to delete.")}),QY=a.object({success:a.boolean(),teardownError:a.string().nullable().describe("Null when vendor-side cleanup succeeded or was not needed; error message when remote cleanup failed and must be finished manually.")}),Gf=w({operationId:"logSources.delete",description:"Delete a log source. Tombstones the log source and its log streams, deactivates their intake keys (already-ingested data is preserved with its attribution), and runs vendor-side cleanup for managed log sources when the provider supports it.",backend:"api",route:{method:"DELETE",path:"/log-sources/{logSourceId}",successStatus:200,tags:["Log Sources"]},input:LY,output:QY,pagination:"none",async:"sync"}),_xe={listProviders:Uf.contract,list:qc.contract,create:Vc.contract,get:Ff.contract,update:$f.contract,delete:Gf.contract}});var Dxe,Lxe,cB,Qxe,Nxe,lB,Mxe,zxe,uB,jxe,Uxe,dB,Fxe,$xe,pB,Gxe,Hxe,gB,iCt;var NY=h(()=>{De();Ve();Hf();Dxe=a.object({logSourceId:a.string().uuid().describe("Log source ID to list log streams for."),enabled:a.boolean().optional().describe("Optional filter on log stream ingestion state. Omit to list all log streams; pass true for only enabled log streams or false for only paused log streams.")}),Lxe=a.object({streams:a.array(Hs)}),cB=w({operationId:"logStreams.list",description:"List the log streams that belong to a log source.",backend:"api",route:{method:"GET",path:"/log-streams",tags:["Log Streams"]},input:Dxe,output:Lxe,pagination:"none",async:"sync"}),Qxe=a.object({logSourceId:a.string().uuid().describe("Log source ID to create the log stream under."),config:a.record(a.string(),a.unknown()).optional().describe("Platform-specific log stream configuration.")}).strict(),Nxe=a.object({streamId:a.string().uuid().describe("ID of the created log stream.")}),lB=w({operationId:"logStreams.create",description:"Create a new log stream under a managed log source. Triggers async provisioning; poll the log stream to track it. Connectionless log sources are single-stream — create another log source instead.",backend:"api",route:{method:"POST",path:"/log-streams",successStatus:201,tags:["Log Streams"]},input:Qxe,output:Nxe,pagination:"none",async:"sync"}),Mxe=a.object({streamId:a.string().uuid().describe("Log stream ID to fetch.")}),zxe=a.object({stream:Hs}),uB=w({operationId:"logStreams.get",description:"Get one log stream by ID. Use to poll provisioning status.",backend:"api",route:{method:"GET",path:"/log-streams/{streamId}",tags:["Log Streams"]},input:Mxe,output:zxe,pagination:"none",async:"sync"}),jxe=a.object({streamId:a.string().uuid().describe("Log stream ID to update."),enabled:a.boolean().optional().describe("Pause (`false`) or resume (`true`) ingestion for this log stream. Reversible; never deletes anything.")}).strict(),Uxe=a.object({stream:Hs}),dB=w({operationId:"logStreams.update",description:"Update a log stream: pause or resume its ingestion. Log streams cannot be renamed.",backend:"api",route:{method:"PATCH",path:"/log-streams/{streamId}",tags:["Log Streams"]},input:jxe,output:Uxe,pagination:"none",async:"sync"}),Fxe=a.object({streamId:a.string().uuid().describe("Log stream ID to delete.")}),$xe=a.object({success:a.boolean()}),pB=w({operationId:"logStreams.delete",description:"Delete a log stream. Tombstones the log stream and deactivates its intake key. Deleting a connectionless log source's only log stream tombstones the log source too.",backend:"api",route:{method:"DELETE",path:"/log-streams/{streamId}",successStatus:200,tags:["Log Streams"]},input:Fxe,output:$xe,pagination:"none",async:"sync"}),Gxe=a.object({streamId:a.string().uuid().describe("Log stream ID to reassign."),targetLogSourceId:a.string().uuid().describe("Log source to move the log stream under. Must be a connectionless log source in the same project; the stream's key is rebound to this log source's intake adapter.")}).strict(),Hxe=a.object({stream:Hs}),gB=w({operationId:"logStreams.reassign",description:"Move a log stream to a different connectionless log source in the same project. Preserves the stream's ID, intake key credential, and ingested data; rebinds the key's intake adapter to the target log source's provider so future data is processed as that provider's format.",backend:"api",route:{method:"POST",path:"/log-streams/{streamId}/reassign",successStatus:200,tags:["Log Streams"]},input:Gxe,output:Hxe,pagination:"none",async:"sync"}),iCt={list:cB.contract,create:lB.contract,get:uB.contract,update:dB.contract,delete:pB.contract,reassign:gB.contract}});var MY,zY,jY,UY,FY,$Y,GY,qf,HY,qY,qxe,VY,mB,KY,YY,WY,JY,ZY,XY,eW,tW,Vxe,nW,oW,Kc,Yc,Wc,Jc,Zc,Kxe;var hB=h(()=>{De();Ve();MY=a.enum(["eq","neq","in","contains","starts_with","gt","gte","lt","lte","between","exists"]).describe("Filter operator: 'eq' (equals), 'neq' (not equals), 'in' (in array), 'contains' (substring), 'starts_with' (prefix), 'gt' (greater than), 'gte' (greater than or equal), 'lt' (less than), 'lte' (less than or equal), 'between' (range), 'exists' (field exists)"),zY=a.enum(["any","all","phrase"]).describe("Search mode: 'any' (match any token), 'all' (match all tokens), 'phrase' (exact phrase match)"),jY=a.object({query:a.string().min(1,"Search query must be at least 1 character").max(500,"Search query must be at most 500 characters").describe("Search query text (1-500 characters)"),fields:a.array(a.string()).optional().describe("Fields to search in (defaults to backend allowlist)"),mode:zY.optional().default("all").describe("Token matching mode")}),UY=a.object({field:a.string().describe("Field name to filter on"),op:MY.describe("Filter operator"),value:a.union([a.string(),a.number(),a.boolean(),a.array(a.union([a.string(),a.number()])),a.object({from:a.string(),to:a.string()})]).describe("Filter value (type depends on operator)")}).superRefine((e,t)=>{if(e.op==="in"&&!Array.isArray(e.value))t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be an array when op is 'in'",path:["value"]});if(e.op==="between"){let n=e.value;if(!(typeof n==="object"&&n!==null&&("from"in n)&&("to"in n)))t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be an object with from/to when op is 'between'",path:["value"]})}if(e.op==="exists"&&typeof e.value!=="boolean")t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be boolean when op is 'exists'",path:["value"]})}),FY=a.object({field:a.string().describe("Field name to sort by"),direction:a.enum(["asc","desc"]).default("desc").describe("Sort direction: 'asc' for ascending, 'desc' for descending")}),$Y=a.object({limit:a.number().int().min(1,"Limit must be at least 1").max(1000,"Limit must be at most 1000").default(50).describe("Maximum number of rows to return"),cursor:a.string().optional().describe("Opaque cursor from previous response for pagination")}),GY=a.object({projectId:a.string().uuid().optional().describe("Project to query logs for. Auto-filled from CLI and SDK context when omitted."),search:jY.optional().describe("Full-text search configuration"),filters:a.array(UY).optional().describe("Structured filter clauses (ANDed together). When no `timestamp` filter is provided, queries default to a 24h look-back window; pass an explicit `timestamp` filter to query a different range."),select:a.array(a.string()).optional().describe("Fields to return (defaults to backend default set)"),sort:FY.optional().describe("Sort configuration (defaults to timestamp desc)"),pagination:$Y.optional().describe("Pagination configuration")}),qf=a.enum(["clickhouse","better-stack","datadog","gcp","axiom","cloudwatch","sentry","posthog","mezmo"]),HY=a.enum(["native","external"]),qY=a.object({projectId:a.string().uuid().optional().describe("Project to inspect. Auto-filled from CLI and SDK context when omitted."),question:a.string().trim().min(1).max(2000).optional().describe("Optional natural-language question used to retrieve coherent schema bundles."),topK:a.number().int().min(1).max(32).optional().describe("Max schema bundles to return when question is set (default 8)")}),qxe=a.object({id:a.string().describe("Stable schema-bundle document id"),service:a.string().describe("Emitting service for this co-occurrence shape"),keys:a.array(a.string()).describe("Co-occurring otel_log_attributes keys in this bundle"),rowCount:a.number().nonnegative().describe("Observed row count when the bundle was compiled"),score:a.number().optional().describe("Retrieval rank score when returned from vector search")}),VY=a.object({backend:a.object({id:qf,name:a.string(),kind:HY}).describe("Active log backend for the project"),features:a.array(a.string()).describe("Backend features registered on the server"),commands:a.array(a.enum(["schema","query","volume","patterns","nativeQuery"])).describe("CLI/API commands available for this backend"),queryableFields:a.array(a.string()).describe("Fields accepted by the normalized logs.query contract"),searchableFields:a.array(a.string()).describe("Fields accepted by logs.query full-text search"),question:a.string().optional().describe("Echo of the question used for retrieval when provided"),selectedBundles:a.array(qxe).describe("Question-conditioned coherent schema bundles (empty when question omitted)"),selectedAttributeKeys:a.array(a.string()).describe("Flattened attribute keys from selectedBundles, or recent keys when question omitted"),observedServiceNames:a.array(a.string()).describe("Recently observed service names for this project"),observedAttributeKeys:a.array(a.string()).describe("Observed / selected attribute keys for agent and CLI schema discovery"),indexStatus:a.enum(["ready","empty","unavailable","skipped"]).describe("ready: bundles retrieved; empty: index missing/empty; unavailable: retrieval failed; skipped: no question (legacy path)"),schemaContext:a.record(a.string(),a.any()).optional().describe("Backend-specific schema guidance and examples")}),mB=a.enum(["1m","5m","15m","1h"]),KY=a.enum(["service_name","severity_text","environment"]),YY=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),startDate:a.string().datetime({offset:!0}),endDate:a.string().datetime({offset:!0}),interval:mB.optional().describe("Aggregation bucket size for the volume series"),groupBy:KY.optional().describe("Optional field to split volume series by"),filters:a.object({service_name:a.string().optional(),severity_text:a.string().optional(),environment:a.string().optional()}).optional()}).refine((e)=>new Date(e.startDate)<new Date(e.endDate),{message:"startDate must be before endDate",path:["endDate"]}),WY=a.object({total:a.number().nonnegative(),startDate:a.string().datetime({offset:!0}),endDate:a.string().datetime({offset:!0}),interval:mB,series:a.array(a.object({group:a.string(),total:a.number().nonnegative(),points:a.array(a.object({bucket:a.string(),count:a.number().nonnegative()}))}))}),JY=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:a.string().min(1).max(500).optional().describe("Optional text to match against normalized log patterns"),severity:a.string().optional().describe("Optional severity_text value, for example ERROR"),startDate:a.string().datetime({offset:!0}).optional().describe("Optional earliest last-seen timestamp"),endDate:a.string().datetime({offset:!0}).optional().describe("Optional latest last-seen timestamp"),limit:a.number().int().min(1).max(100).default(25).describe("Maximum number of log patterns to return")}).refine((e)=>!e.startDate||!e.endDate||new Date(e.startDate)<new Date(e.endDate),{message:"startDate must be before endDate",path:["endDate"]}),ZY=a.object({serviceName:a.string().nullable(),fingerprint:a.string(),pattern:a.string(),severity:a.string().nullable(),occurrences:a.number().nonnegative(),firstSeen:a.string().nullable(),lastSeen:a.string().nullable(),representativeId:a.string().nullable()}),XY=a.object({patterns:a.array(ZY),meta:a.object({backendId:qf,count:a.number().int().nonnegative(),took:a.number().nonnegative()})}),eW=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:a.string().min(1,"Query cannot be empty").max(1e4,"Query must be 10000 characters or less")}),tW=a.object({result:a.string().describe("Backend-formatted query result"),format:a.literal("text"),meta:a.object({backendId:qf,took:a.number().nonnegative(),truncated:a.boolean()})}),Vxe=a.object({cursor:a.string().nullable().describe("Cursor for next page (null if no more results)"),hasMore:a.boolean().describe("Whether more results are available")}),nW=a.object({count:a.number().int().nonnegative().describe("Number of log rows returned in this response"),took:a.number().nonnegative().describe("Query execution time in milliseconds")}),oW=a.object({data:a.array(a.record(a.string(),a.any())).describe("Array of log rows with selected fields"),nextCursor:a.string().nullable().describe("Pass as 'cursor' in the next query to fetch the next page. Null when there are no more results."),meta:nW.describe("Query execution metadata")}),Kc=w({operationId:"logs.query",description:"Query logs within one project.",backend:"api",route:{method:"POST",path:"/logs/query",tags:["Logs"]},input:GY,output:oW,pagination:"cursor",async:"sync"}),Yc=w({operationId:"logs.schema",description:"Describe the active log backend, supported commands, query fields, and schema context.",backend:"api",route:{method:"POST",path:"/logs/schema",tags:["Logs"]},input:qY,output:VY,pagination:"none",async:"sync"}),Wc=w({operationId:"logs.volume",description:"Query pre-aggregated log volume for one project.",backend:"api",route:{method:"POST",path:"/logs/volume",tags:["Logs"]},input:YY,output:WY,pagination:"none",async:"sync"}),Jc=w({operationId:"logs.patterns",description:"Query normalized log patterns for discovery workflows.",backend:"api",route:{method:"POST",path:"/logs/patterns",tags:["Logs"]},input:JY,output:XY,pagination:"none",async:"sync"}),Zc=w({operationId:"logs.nativeQuery",description:"Run a read-only query in the log store's native query language, with server-side guardrails.",backend:"api",route:{method:"POST",path:"/logs/native-query",tags:["Logs"]},input:eW,output:tW,pagination:"none",async:"sync"}),Kxe={query:Kc.contract,schema:Yc.contract,volume:Wc.contract,patterns:Jc.contract,nativeQuery:Zc.contract}});var rW=h(()=>{JA()});var AB=h(()=>{rW()});var sW=()=>{};var fB,yB,Vf,Yxe,Wxe,Xc,Kf,aW,cW,bB,lW,uW,Jxe,dW,IB,Zxe,Xxe,ePe,tPe,nPe,oPe,rPe,iPe,sPe,aPe,cPe,lPe,uPe,SB,pW,gW,dPe,CB;var Yf=h(()=>{De();fB=["streamable-http","sse"],yB=["none","headers","oauth","aws-sigv4"],Vf=["none","client_secret_basic","client_secret_post"],Yxe=["preset","custom"],Wxe=["configured","authorizing","connected","error"],Xc=["enabled","disabled","custom-only"],Kf=["enabled","write_blocked","disabled"],aW=a.enum(fB),cW=a.enum(yB),bB=a.enum(Vf),lW=a.enum(Yxe),uW=a.enum(Wxe),Jxe=a.enum(Xc),dW=a.enum(Kf),IB=a.object({id:a.string().min(1),name:a.string().min(1),value:a.string().min(1)}),Zxe=a.object({id:a.string().min(1),name:a.string().min(1),maskedValue:a.string().min(1)}),Xxe=a.object({authMode:a.literal("none")}),ePe=a.object({tokenUrl:a.string().url(),clientId:a.string().min(1),clientSecret:a.string().min(1).optional(),tokenEndpointAuthMethod:bB.optional(),refreshToken:a.string().min(1),headerName:a.string().min(1).default("Authorization"),headerValuePrefix:a.string().default("Bearer "),expiresAt:a.string().datetime().optional()}),tPe=a.object({authMode:a.literal("headers"),headers:a.array(IB),refreshCredentials:ePe.optional()}),nPe=a.object({authMode:a.literal("aws-sigv4"),accessKeyId:a.string().min(1),secretAccessKey:a.string().min(1),sessionToken:a.string().min(1).optional(),region:a.string().min(1),service:a.string().min(1).default("aws-mcp")}),oPe=a.preprocess((e)=>{if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0},a.string().min(1).optional()).optional(),rPe=a.object({accessToken:a.string().min(1),refreshToken:a.string().min(1).optional(),tokenType:a.string().min(1).optional(),scope:oPe,expiresAt:a.string().datetime().optional()}).transform(({scope:e,...t})=>e===void 0?t:{...t,scope:e}),iPe=a.object({authMode:a.literal("oauth"),providerId:a.string().min(1),tokens:rPe,headers:a.array(IB).optional()}),sPe=a.discriminatedUnion("authMode",[Xxe,tPe,iPe,nPe]),aPe=a.string().min(1).regex(/^enc:v1:/,"Encrypted auth config must use enc:v1 format."),cPe=a.object({codeVerifier:a.string().min(1),clientId:a.string().min(1),clientSecret:a.string().min(1).optional(),tokenEndpointAuthMethod:bB.optional(),tokenUrl:a.string().url().optional(),resourceUrl:a.string().url().optional(),projectId:a.string().uuid().optional(),returnTo:a.string().min(1).max(2000).optional(),messageId:a.string().min(1).max(240).optional(),scopes:a.array(a.string().min(1)).optional()}),lPe=a.object({type:a.string().optional(),properties:a.record(a.string(),a.unknown()).optional(),required:a.array(a.string()).optional(),additionalProperties:a.boolean().optional()}).catchall(a.unknown()),uPe=a.object({supportsOAuth:a.boolean().default(!1),supportsCustomHeaders:a.boolean().default(!0),supportsToolDiscovery:a.boolean().default(!0),readOnlyToolNames:a.array(a.string()).default([])}),SB=a.object({name:a.string().min(1),title:a.string().min(1),description:a.string().min(1),inputSchema:lPe,annotations:a.record(a.string(),a.unknown()).default({}),availability:dW,isReadOnly:a.boolean()}),pW=a.object({discoveredAt:a.string().datetime(),tools:a.array(SB)}),gW=a.object({mode:a.enum(["user","system"]),managedBy:a.object({type:a.literal("integration"),id:a.string().min(1),displayName:a.string().min(1),iconKey:a.string().min(1)}).nullable(),capabilities:a.object({canRename:a.boolean(),canEditCredentials:a.boolean(),canSetReadOnly:a.boolean(),canConfigureTools:a.boolean(),canDisconnect:a.boolean()})}),dPe=a.object({id:a.string().uuid(),organizationId:a.string().min(1),projectId:a.string().uuid(),providerId:a.string().min(1),source:lW,displayName:a.string().min(1),connectionKey:a.string().min(1),serverUrl:a.string().url(),transport:aW,authMode:cW,installStatus:uW,installedByUserId:a.string().nullable(),connectedAt:a.string().datetime().nullable(),toolSnapshot:pW.nullable(),enabledToolNames:a.array(a.string()),readOnly:a.boolean().default(!1),version:a.number().int().nonnegative(),createdAt:a.string().datetime(),updatedAt:a.string().datetime(),deletedAt:a.string().datetime().nullable()}),CB=gW});var wB=x(function(fCt,Zf){var mW,hW,AW,fW,yW,bW,IW,SW,CW,vW,wW,EW,kW,Wf,vB,xW,PW,RW,el,TW,BW,OW,_W,DW,LW,QW,NW,MW,Jf,zW,jW,UW;(function(e){var t=typeof global==="object"?global:typeof self==="object"?self:typeof this==="object"?this:{};if(typeof define==="function"&&define.amd)define("tslib",["exports"],function(r){e(n(t,n(r)))});else if(typeof Zf==="object"&&typeof fCt==="object")e(n(t,n(fCt)));else e(n(t));function n(r,o){if(r!==t)if(typeof Object.create==="function")Object.defineProperty(r,"__esModule",{value:!0});else r.__esModule=!0;return function(i,s){return r[i]=o?o(i,s):s}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var c in s)if(Object.prototype.hasOwnProperty.call(s,c))i[c]=s[c]};mW=function(i,s){if(typeof s!=="function"&&s!==null)throw TypeError("Class extends value "+String(s)+" is not a constructor or null");t(i,s);function c(){this.constructor=i}i.prototype=s===null?Object.create(s):(c.prototype=s.prototype,new c)},hW=Object.assign||function(i){for(var s,c=1,l=arguments.length;c<l;c++){s=arguments[c];for(var u in s)if(Object.prototype.hasOwnProperty.call(s,u))i[u]=s[u]}return i},AW=function(i,s){var c={};for(var l in i)if(Object.prototype.hasOwnProperty.call(i,l)&&s.indexOf(l)<0)c[l]=i[l];if(i!=null&&typeof Object.getOwnPropertySymbols==="function"){for(var u=0,l=Object.getOwnPropertySymbols(i);u<l.length;u++)if(s.indexOf(l[u])<0&&Object.prototype.propertyIsEnumerable.call(i,l[u]))c[l[u]]=i[l[u]]}return c},fW=function(i,s,c,l){var u=arguments.length,d=u<3?s:l===null?l=Object.getOwnPropertyDescriptor(s,c):l,p;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")d=Reflect.decorate(i,s,c,l);else for(var g=i.length-1;g>=0;g--)if(p=i[g])d=(u<3?p(d):u>3?p(s,c,d):p(s,c))||d;return u>3&&d&&Object.defineProperty(s,c,d),d},yW=function(i,s){return function(c,l){s(c,l,i)}},bW=function(i,s,c,l,u,d){function p(le){if(le!==void 0&&typeof le!=="function")throw TypeError("Function expected");return le}var g=l.kind,m=g==="getter"?"get":g==="setter"?"set":"value",A=!s&&i?l.static?i:i.prototype:null,f=s||(A?Object.getOwnPropertyDescriptor(A,l.name):{}),S,v=!1;for(var P=c.length-1;P>=0;P--){var O={};for(var K in l)O[K]=K==="access"?{}:l[K];for(var K in l.access)O.access[K]=l.access[K];O.addInitializer=function(le){if(v)throw TypeError("Cannot add initializers after decoration has completed");d.push(p(le||null))};var M=(0,c[P])(g==="accessor"?{get:f.get,set:f.set}:f[m],O);if(g==="accessor"){if(M===void 0)continue;if(M===null||typeof M!=="object")throw TypeError("Object expected");if(S=p(M.get))f.get=S;if(S=p(M.set))f.set=S;if(S=p(M.init))u.unshift(S)}else if(S=p(M))if(g==="field")u.unshift(S);else f[m]=S}if(A)Object.defineProperty(A,l.name,f);v=!0},IW=function(i,s,c){var l=arguments.length>2;for(var u=0;u<s.length;u++)c=l?s[u].call(i,c):s[u].call(i);return l?c:void 0},SW=function(i){return typeof i==="symbol"?i:"".concat(i)},CW=function(i,s,c){if(typeof s==="symbol")s=s.description?"[".concat(s.description,"]"):"";return Object.defineProperty(i,"name",{configurable:!0,value:c?"".concat(c," ",s):s})},vW=function(i,s){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(i,s)},wW=function(i,s,c,l){function u(d){return d instanceof c?d:new c(function(p){p(d)})}return new(c||(c=Promise))(function(d,p){function g(f){try{A(l.next(f))}catch(S){p(S)}}function m(f){try{A(l.throw(f))}catch(S){p(S)}}function A(f){f.done?d(f.value):u(f.value).then(g,m)}A((l=l.apply(i,s||[])).next())})},EW=function(i,s){var c={label:0,sent:function(){if(d[0]&1)throw d[1];return d[1]},trys:[],ops:[]},l,u,d,p=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return p.next=g(0),p.throw=g(1),p.return=g(2),typeof Symbol==="function"&&(p[Symbol.iterator]=function(){return this}),p;function g(A){return function(f){return m([A,f])}}function m(A){if(l)throw TypeError("Generator is already executing.");while(p&&(p=0,A[0]&&(c=0)),c)try{if(l=1,u&&(d=A[0]&2?u.return:A[0]?u.throw||((d=u.return)&&d.call(u),0):u.next)&&!(d=d.call(u,A[1])).done)return d;if(u=0,d)A=[A[0]&2,d.value];switch(A[0]){case 0:case 1:d=A;break;case 4:return c.label++,{value:A[1],done:!1};case 5:c.label++,u=A[1],A=[0];continue;case 7:A=c.ops.pop(),c.trys.pop();continue;default:if((d=c.trys,!(d=d.length>0&&d[d.length-1]))&&(A[0]===6||A[0]===2)){c=0;continue}if(A[0]===3&&(!d||A[1]>d[0]&&A[1]<d[3])){c.label=A[1];break}if(A[0]===6&&c.label<d[1]){c.label=d[1],d=A;break}if(d&&c.label<d[2]){c.label=d[2],c.ops.push(A);break}if(d[2])c.ops.pop();c.trys.pop();continue}A=s.call(i,c)}catch(f){A=[6,f],u=0}finally{l=d=0}if(A[0]&5)throw A[1];return{value:A[0]?A[1]:void 0,done:!0}}},kW=function(i,s){for(var c in i)if(c!=="default"&&!Object.prototype.hasOwnProperty.call(s,c))Jf(s,i,c)},Jf=Object.create?function(i,s,c,l){if(l===void 0)l=c;var u=Object.getOwnPropertyDescriptor(s,c);if(!u||("get"in u?!s.__esModule:u.writable||u.configurable))u={enumerable:!0,get:function(){return s[c]}};Object.defineProperty(i,l,u)}:function(i,s,c,l){if(l===void 0)l=c;i[l]=s[c]},Wf=function(i){var s=typeof Symbol==="function"&&Symbol.iterator,c=s&&i[s],l=0;if(c)return c.call(i);if(i&&typeof i.length==="number")return{next:function(){if(i&&l>=i.length)i=void 0;return{value:i&&i[l++],done:!i}}};throw TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")},vB=function(i,s){var c=typeof Symbol==="function"&&i[Symbol.iterator];if(!c)return i;var l=c.call(i),u,d=[],p;try{while((s===void 0||s-- >0)&&!(u=l.next()).done)d.push(u.value)}catch(g){p={error:g}}finally{try{if(u&&!u.done&&(c=l.return))c.call(l)}finally{if(p)throw p.error}}return d},xW=function(){for(var i=[],s=0;s<arguments.length;s++)i=i.concat(vB(arguments[s]));return i},PW=function(){for(var i=0,s=0,c=arguments.length;s<c;s++)i+=arguments[s].length;for(var l=Array(i),u=0,s=0;s<c;s++)for(var d=arguments[s],p=0,g=d.length;p<g;p++,u++)l[u]=d[p];return l},RW=function(i,s,c){if(c||arguments.length===2){for(var l=0,u=s.length,d;l<u;l++)if(d||!(l in s)){if(!d)d=Array.prototype.slice.call(s,0,l);d[l]=s[l]}}return i.concat(d||Array.prototype.slice.call(s))},el=function(i){return this instanceof el?(this.v=i,this):new el(i)},TW=function(i,s,c){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var l=c.apply(i,s||[]),u,d=[];return u=Object.create((typeof AsyncIterator==="function"?AsyncIterator:Object).prototype),g("next"),g("throw"),g("return",p),u[Symbol.asyncIterator]=function(){return this},u;function p(P){return function(O){return Promise.resolve(O).then(P,S)}}function g(P,O){if(l[P]){if(u[P]=function(K){return new Promise(function(M,le){d.push([P,K,M,le])>1||m(P,K)})},O)u[P]=O(u[P])}}function m(P,O){try{A(l[P](O))}catch(K){v(d[0][3],K)}}function A(P){P.value instanceof el?Promise.resolve(P.value.v).then(f,S):v(d[0][2],P)}function f(P){m("next",P)}function S(P){m("throw",P)}function v(P,O){if(P(O),d.shift(),d.length)m(d[0][0],d[0][1])}},BW=function(i){var s,c;return s={},l("next"),l("throw",function(u){throw u}),l("return"),s[Symbol.iterator]=function(){return this},s;function l(u,d){s[u]=i[u]?function(p){return(c=!c)?{value:el(i[u](p)),done:!1}:d?d(p):p}:d}},OW=function(i){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var s=i[Symbol.asyncIterator],c;return s?s.call(i):(i=typeof Wf==="function"?Wf(i):i[Symbol.iterator](),c={},l("next"),l("throw"),l("return"),c[Symbol.asyncIterator]=function(){return this},c);function l(d){c[d]=i[d]&&function(p){return new Promise(function(g,m){p=i[d](p),u(g,m,p.done,p.value)})}}function u(d,p,g,m){Promise.resolve(m).then(function(A){d({value:A,done:g})},p)}},_W=function(i,s){if(Object.defineProperty)Object.defineProperty(i,"raw",{value:s});else i.raw=s;return i};var n=Object.create?function(i,s){Object.defineProperty(i,"default",{enumerable:!0,value:s})}:function(i,s){i.default=s},r=function(i){return r=Object.getOwnPropertyNames||function(s){var c=[];for(var l in s)if(Object.prototype.hasOwnProperty.call(s,l))c[c.length]=l;return c},r(i)};DW=function(i){if(i&&i.__esModule)return i;var s={};if(i!=null){for(var c=r(i),l=0;l<c.length;l++)if(c[l]!=="default")Jf(s,i,c[l])}return n(s,i),s},LW=function(i){return i&&i.__esModule?i:{default:i}},QW=function(i,s,c,l){if(c==="a"&&!l)throw TypeError("Private accessor was defined without a getter");if(typeof s==="function"?i!==s||!l:!s.has(i))throw TypeError("Cannot read private member from an object whose class did not declare it");return c==="m"?l:c==="a"?l.call(i):l?l.value:s.get(i)},NW=function(i,s,c,l,u){if(l==="m")throw TypeError("Private method is not writable");if(l==="a"&&!u)throw TypeError("Private accessor was defined without a setter");if(typeof s==="function"?i!==s||!u:!s.has(i))throw TypeError("Cannot write private member to an object whose class did not declare it");return l==="a"?u.call(i,c):u?u.value=c:s.set(i,c),c},MW=function(i,s){if(s===null||typeof s!=="object"&&typeof s!=="function")throw TypeError("Cannot use 'in' operator on non-object");return typeof i==="function"?s===i:i.has(s)},zW=function(i,s,c){if(s!==null&&s!==void 0){if(typeof s!=="object"&&typeof s!=="function")throw TypeError("Object expected.");var l,u;if(c){if(!Symbol.asyncDispose)throw TypeError("Symbol.asyncDispose is not defined.");l=s[Symbol.asyncDispose]}if(l===void 0){if(!Symbol.dispose)throw TypeError("Symbol.dispose is not defined.");if(l=s[Symbol.dispose],c)u=l}if(typeof l!=="function")throw TypeError("Object not disposable.");if(u)l=function(){try{u.call(this)}catch(d){return Promise.reject(d)}};i.stack.push({value:s,dispose:l,async:c})}else if(c)i.stack.push({async:!0});return s};var o=typeof SuppressedError==="function"?SuppressedError:function(i,s,c){var l=Error(c);return l.name="SuppressedError",l.error=i,l.suppressed=s,l};jW=function(i){function s(d){i.error=i.hasError?new o(d,i.error,"An error was suppressed during disposal."):d,i.hasError=!0}var c,l=0;function u(){while(c=i.stack.pop())try{if(!c.async&&l===1)return l=0,i.stack.push(c),Promise.resolve().then(u);if(c.dispose){var d=c.dispose.call(c.value);if(c.async)return l|=2,Promise.resolve(d).then(u,function(p){return s(p),u()})}else l|=1}catch(p){s(p)}if(l===1)return i.hasError?Promise.reject(i.error):Promise.resolve();if(i.hasError)throw i.error}return u()},UW=function(i,s){if(typeof i==="string"&&/^\.\.?\//.test(i))return i.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(c,l,u,d,p){return l?s?".jsx":".js":u&&(!d||!p)?c:u+d+"."+p.toLowerCase()+"js"});return i},e("__extends",mW),e("__assign",hW),e("__rest",AW),e("__decorate",fW),e("__param",yW),e("__esDecorate",bW),e("__runInitializers",IW),e("__propKey",SW),e("__setFunctionName",CW),e("__metadata",vW),e("__awaiter",wW),e("__generator",EW),e("__exportStar",kW),e("__createBinding",Jf),e("__values",Wf),e("__read",vB),e("__spread",xW),e("__spreadArrays",PW),e("__spreadArray",RW),e("__await",el),e("__asyncGenerator",TW),e("__asyncDelegator",BW),e("__asyncValues",OW),e("__makeTemplateObject",_W),e("__importStar",DW),e("__importDefault",LW),e("__classPrivateFieldGet",QW),e("__classPrivateFieldSet",NW),e("__classPrivateFieldIn",MW),e("__addDisposableResource",zW),e("__disposeResources",jW),e("__rewriteRelativeImportExtension",UW)})});var EB=x(function(FW){Object.defineProperty(FW,"__esModule",{value:!0});FW.MAX_HASHABLE_LENGTH=FW.INIT=FW.KEY=FW.DIGEST_LENGTH=FW.BLOCK_SIZE=void 0;FW.BLOCK_SIZE=64;FW.DIGEST_LENGTH=32;FW.KEY=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);FW.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];FW.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1});var qW=x(function(GW){Object.defineProperty(GW,"__esModule",{value:!0});GW.RawSha256=void 0;var vo=EB(),APe=function(){function e(){this.state=Int32Array.from(vo.INIT),this.temp=new Int32Array(64),this.buffer=new Uint8Array(64),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}return e.prototype.update=function(t){if(this.finished)throw Error("Attempted to update an already finished hash.");var n=0,r=t.byteLength;if(this.bytesHashed+=r,this.bytesHashed*8>vo.MAX_HASHABLE_LENGTH)throw Error("Cannot hash more than 2^53 - 1 bits");while(r>0)if(this.buffer[this.bufferLength++]=t[n++],r--,this.bufferLength===vo.BLOCK_SIZE)this.hashBuffer(),this.bufferLength=0},e.prototype.digest=function(){if(!this.finished){var t=this.bytesHashed*8,n=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),r=this.bufferLength;if(n.setUint8(this.bufferLength++,128),r%vo.BLOCK_SIZE>=vo.BLOCK_SIZE-8){for(var o=this.bufferLength;o<vo.BLOCK_SIZE;o++)n.setUint8(o,0);this.hashBuffer(),this.bufferLength=0}for(var o=this.bufferLength;o<vo.BLOCK_SIZE-8;o++)n.setUint8(o,0);n.setUint32(vo.BLOCK_SIZE-8,Math.floor(t/4294967296),!0),n.setUint32(vo.BLOCK_SIZE-4,t),this.hashBuffer(),this.finished=!0}var i=new Uint8Array(vo.DIGEST_LENGTH);for(var o=0;o<8;o++)i[o*4]=this.state[o]>>>24&255,i[o*4+1]=this.state[o]>>>16&255,i[o*4+2]=this.state[o]>>>8&255,i[o*4+3]=this.state[o]>>>0&255;return i},e.prototype.hashBuffer=function(){var t=this,n=t.buffer,r=t.state,o=r[0],i=r[1],s=r[2],c=r[3],l=r[4],u=r[5],d=r[6],p=r[7];for(var g=0;g<vo.BLOCK_SIZE;g++){if(g<16)this.temp[g]=(n[g*4]&255)<<24|(n[g*4+1]&255)<<16|(n[g*4+2]&255)<<8|n[g*4+3]&255;else{var m=this.temp[g-2],A=(m>>>17|m<<15)^(m>>>19|m<<13)^m>>>10;m=this.temp[g-15];var f=(m>>>7|m<<25)^(m>>>18|m<<14)^m>>>3;this.temp[g]=(A+this.temp[g-7]|0)+(f+this.temp[g-16]|0)}var S=(((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+(l&u^~l&d)|0)+(p+(vo.KEY[g]+this.temp[g]|0)|0)|0,v=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+(o&i^o&s^i&s)|0;p=d,d=u,u=l,l=c+S|0,c=s,s=i,i=o,o=S+v|0}r[0]+=o,r[1]+=i,r[2]+=s,r[3]+=c,r[4]+=l,r[5]+=u,r[6]+=d,r[7]+=p},e}();GW.RawSha256=APe});var YW=x(function(ICt,KW){var{defineProperty:Xf,getOwnPropertyDescriptor:fPe,getOwnPropertyNames:yPe}=Object,bPe=Object.prototype.hasOwnProperty,IPe=(e,t)=>Xf(e,"name",{value:t,configurable:!0}),SPe=(e,t)=>{for(var n in t)Xf(e,n,{get:t[n],enumerable:!0})},CPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of yPe(t))if(!bPe.call(e,o)&&o!==n)Xf(e,o,{get:()=>t[o],enumerable:!(r=fPe(t,o))||r.enumerable})}return e},vPe=(e)=>CPe(Xf({},"__esModule",{value:!0}),e),VW={};SPe(VW,{isArrayBuffer:()=>wPe});KW.exports=vPe(VW);var wPe=IPe((e)=>typeof ArrayBuffer==="function"&&e instanceof ArrayBuffer||Object.prototype.toString.call(e)==="[object ArrayBuffer]","isArrayBuffer")});var XW=x(function(SCt,ZW){var{defineProperty:ey,getOwnPropertyDescriptor:EPe,getOwnPropertyNames:kPe}=Object,xPe=Object.prototype.hasOwnProperty,WW=(e,t)=>ey(e,"name",{value:t,configurable:!0}),PPe=(e,t)=>{for(var n in t)ey(e,n,{get:t[n],enumerable:!0})},RPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of kPe(t))if(!xPe.call(e,o)&&o!==n)ey(e,o,{get:()=>t[o],enumerable:!(r=EPe(t,o))||r.enumerable})}return e},TPe=(e)=>RPe(ey({},"__esModule",{value:!0}),e),JW={};PPe(JW,{fromArrayBuffer:()=>OPe,fromString:()=>_Pe});ZW.exports=TPe(JW);var BPe=YW(),kB=F("buffer"),OPe=WW((e,t=0,n=e.byteLength-t)=>{if(!(0,BPe.isArrayBuffer)(e))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof e} (${e})`);return kB.Buffer.from(e,t,n)},"fromArrayBuffer"),_Pe=WW((e,t)=>{if(typeof e!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof e} (${e})`);return t?kB.Buffer.from(e,t):kB.Buffer.from(e)},"fromString")});var rJ=x(function(CCt,oJ){var{defineProperty:ty,getOwnPropertyDescriptor:DPe,getOwnPropertyNames:LPe}=Object,QPe=Object.prototype.hasOwnProperty,xB=(e,t)=>ty(e,"name",{value:t,configurable:!0}),NPe=(e,t)=>{for(var n in t)ty(e,n,{get:t[n],enumerable:!0})},MPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of LPe(t))if(!QPe.call(e,o)&&o!==n)ty(e,o,{get:()=>t[o],enumerable:!(r=DPe(t,o))||r.enumerable})}return e},zPe=(e)=>MPe(ty({},"__esModule",{value:!0}),e),eJ={};NPe(eJ,{fromUtf8:()=>nJ,toUint8Array:()=>jPe,toUtf8:()=>UPe});oJ.exports=zPe(eJ);var tJ=XW(),nJ=xB((e)=>{let t=(0,tJ.fromString)(e,"utf8");return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT)},"fromUtf8"),jPe=xB((e)=>{if(typeof e==="string")return nJ(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)},"toUint8Array"),UPe=xB((e)=>{if(typeof e==="string")return e;if(typeof e!=="object"||typeof e.byteOffset!=="number"||typeof e.byteLength!=="number")throw Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.");return(0,tJ.fromArrayBuffer)(e.buffer,e.byteOffset,e.byteLength).toString("utf8")},"toUtf8")});var aJ=x(function(iJ){Object.defineProperty(iJ,"__esModule",{value:!0});iJ.convertToBuffer=void 0;var FPe=rJ(),$Pe=typeof Buffer<"u"&&Buffer.from?function(e){return Buffer.from(e,"utf8")}:FPe.fromUtf8;function GPe(e){if(e instanceof Uint8Array)return e;if(typeof e==="string")return $Pe(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)}iJ.convertToBuffer=GPe});var uJ=x(function(cJ){Object.defineProperty(cJ,"__esModule",{value:!0});cJ.isEmptyData=void 0;function HPe(e){if(typeof e==="string")return e.length===0;return e.byteLength===0}cJ.isEmptyData=HPe});var gJ=x(function(dJ){Object.defineProperty(dJ,"__esModule",{value:!0});dJ.numToUint8=void 0;function qPe(e){return new Uint8Array([(e&4278190080)>>24,(e&16711680)>>16,(e&65280)>>8,e&255])}dJ.numToUint8=qPe});var AJ=x(function(mJ){Object.defineProperty(mJ,"__esModule",{value:!0});mJ.uint32ArrayFrom=void 0;function VPe(e){if(!Uint32Array.from){var t=new Uint32Array(e.length),n=0;while(n<e.length)t[n]=e[n],n+=1;return t}return Uint32Array.from(e)}mJ.uint32ArrayFrom=VPe});var fJ=x(function(tl){Object.defineProperty(tl,"__esModule",{value:!0});tl.uint32ArrayFrom=tl.numToUint8=tl.isEmptyData=tl.convertToBuffer=void 0;var KPe=aJ();Object.defineProperty(tl,"convertToBuffer",{enumerable:!0,get:function(){return KPe.convertToBuffer}});var YPe=uJ();Object.defineProperty(tl,"isEmptyData",{enumerable:!0,get:function(){return YPe.isEmptyData}});var WPe=gJ();Object.defineProperty(tl,"numToUint8",{enumerable:!0,get:function(){return WPe.numToUint8}});var JPe=AJ();Object.defineProperty(tl,"uint32ArrayFrom",{enumerable:!0,get:function(){return JPe.uint32ArrayFrom}})});var SJ=x(function(bJ){Object.defineProperty(bJ,"__esModule",{value:!0});bJ.Sha256=void 0;var yJ=wB(),oy=EB(),ny=qW(),PB=fJ(),XPe=function(){function e(t){this.secret=t,this.hash=new ny.RawSha256,this.reset()}return e.prototype.update=function(t){if((0,PB.isEmptyData)(t)||this.error)return;try{this.hash.update((0,PB.convertToBuffer)(t))}catch(n){this.error=n}},e.prototype.digestSync=function(){if(this.error)throw this.error;if(this.outer){if(!this.outer.finished)this.outer.update(this.hash.digest());return this.outer.digest()}return this.hash.digest()},e.prototype.digest=function(){return yJ.__awaiter(this,void 0,void 0,function(){return yJ.__generator(this,function(t){return[2,this.digestSync()]})})},e.prototype.reset=function(){if(this.hash=new ny.RawSha256,this.secret){this.outer=new ny.RawSha256;var t=eRe(this.secret),n=new Uint8Array(oy.BLOCK_SIZE);n.set(t);for(var r=0;r<oy.BLOCK_SIZE;r++)t[r]^=54,n[r]^=92;this.hash.update(t),this.outer.update(n);for(var r=0;r<t.byteLength;r++)t[r]=0}},e}();bJ.Sha256=XPe;function eRe(e){var t=(0,PB.convertToBuffer)(e);if(t.byteLength>oy.BLOCK_SIZE){var n=new ny.RawSha256;n.update(t),t=n.digest()}var r=new Uint8Array(oy.BLOCK_SIZE);return r.set(t),r}});var CJ=x(function(RB){Object.defineProperty(RB,"__esModule",{value:!0});var tRe=wB();tRe.__exportStar(SJ(),RB)});var ry=()=>{};var vJ="io.modelcontextprotocol/related-task",sy="2.0",Ut,wJ,EJ,DCt,nRe,oRe,TB,so,ay,nn,wo,Eo,on,cy,rRe,iRe,kJ,yp,xJ,PJ,LCt,BB,sRe,OB,aRe,bp,nl,RJ,cRe,lRe,uRe,dRe,pRe,gRe,mRe,hRe,TJ,ARe,_B,fRe,yRe,DB,bRe,Ip,Sp,IRe,Cp,ly,SRe,LB,QB,NB,MB,QCt,zB,jB,UB,CRe,BJ,OJ,FB,_J,vp,ol,DJ,vRe,wRe,LJ,ERe,QJ,$B,kRe,xRe,NJ,MJ,PRe,RRe,TRe,BRe,ORe,_Re,DRe,LRe,QRe,zJ,NRe,MRe,GB,HB,qB,zRe,jRe,URe,VB,FRe,jJ,UJ,$Re,GRe,FJ,HRe,$J,uy,NCt,qRe,VRe,GJ,KRe,HJ,YRe,WRe,JRe,ZRe,XRe,eTe,tTe,nTe,oTe,iy,rTe,iTe,qJ,VJ,KJ,sTe,aTe,cTe,lTe,uTe,dTe,pTe,gTe,mTe,hTe,ATe,fTe,yTe,bTe,ITe,YJ,STe,CTe,WJ,vTe,wTe,ETe,kTe,JJ,xTe,PTe,RTe,TTe,MCt,zCt,jCt,UCt,FCt,$Ct;var qs=h(()=>{AB();Ut=WA((e)=>e!==null&&(typeof e==="object"||typeof e==="function")),wJ=ut([k(),je().int()]),EJ=k(),DCt=Tt({ttl:je().optional(),pollInterval:je().optional()}),nRe=ne({ttl:je().optional()}),oRe=ne({taskId:k()}),TB=Tt({progressToken:wJ.optional(),[vJ]:oRe.optional()}),so=ne({_meta:TB.optional()}),ay=so.extend({task:nRe.optional()}),nn=ne({method:k(),params:so.loose().optional()}),wo=ne({_meta:TB.optional()}),Eo=ne({method:k(),params:wo.loose().optional()}),on=Tt({_meta:TB.optional()}),cy=ut([k(),je().int()]),rRe=ne({jsonrpc:ue(sy),id:cy,...nn.shape}).strict(),iRe=ne({jsonrpc:ue(sy),...Eo.shape}).strict(),kJ=ne({jsonrpc:ue(sy),id:cy,result:on}).strict();(function(e){e[e.ConnectionClosed=-32000]="ConnectionClosed",e[e.RequestTimeout=-32001]="RequestTimeout",e[e.ParseError=-32700]="ParseError",e[e.InvalidRequest=-32600]="InvalidRequest",e[e.MethodNotFound=-32601]="MethodNotFound",e[e.InvalidParams=-32602]="InvalidParams",e[e.InternalError=-32603]="InternalError",e[e.UrlElicitationRequired=-32042]="UrlElicitationRequired"})(yp||(yp={}));xJ=ne({jsonrpc:ue(sy),id:cy.optional(),error:ne({code:je().int(),message:k(),data:lt().optional()})}).strict(),PJ=ut([rRe,iRe,kJ,xJ]),LCt=ut([kJ,xJ]),BB=on.strict(),sRe=wo.extend({requestId:cy.optional(),reason:k().optional()}),OB=Eo.extend({method:ue("notifications/cancelled"),params:sRe}),aRe=ne({src:k(),mimeType:k().optional(),sizes:ee(k()).optional(),theme:tn(["light","dark"]).optional()}),bp=ne({icons:ee(aRe).optional()}),nl=ne({name:k(),title:k().optional()}),RJ=nl.extend({...nl.shape,...bp.shape,version:k(),websiteUrl:k().optional(),description:k().optional()}),cRe=Qc(ne({applyDefaults:Xe().optional()}),tt(k(),lt())),lRe=ap((e)=>{if(e&&typeof e==="object"&&!Array.isArray(e)){if(Object.keys(e).length===0)return{form:{}}}return e},Qc(ne({form:cRe.optional(),url:Ut.optional()}),tt(k(),lt()).optional())),uRe=Tt({list:Ut.optional(),cancel:Ut.optional(),requests:Tt({sampling:Tt({createMessage:Ut.optional()}).optional(),elicitation:Tt({create:Ut.optional()}).optional()}).optional()}),dRe=Tt({list:Ut.optional(),cancel:Ut.optional(),requests:Tt({tools:Tt({call:Ut.optional()}).optional()}).optional()}),pRe=ne({experimental:tt(k(),Ut).optional(),sampling:ne({context:Ut.optional(),tools:Ut.optional()}).optional(),elicitation:lRe.optional(),roots:ne({listChanged:Xe().optional()}).optional(),tasks:uRe.optional(),extensions:tt(k(),Ut).optional()}),gRe=so.extend({protocolVersion:k(),capabilities:pRe,clientInfo:RJ}),mRe=nn.extend({method:ue("initialize"),params:gRe}),hRe=ne({experimental:tt(k(),Ut).optional(),logging:Ut.optional(),completions:Ut.optional(),prompts:ne({listChanged:Xe().optional()}).optional(),resources:ne({subscribe:Xe().optional(),listChanged:Xe().optional()}).optional(),tools:ne({listChanged:Xe().optional()}).optional(),tasks:dRe.optional(),extensions:tt(k(),Ut).optional()}),TJ=on.extend({protocolVersion:k(),capabilities:hRe,serverInfo:RJ,instructions:k().optional()}),ARe=Eo.extend({method:ue("notifications/initialized"),params:wo.optional()}),_B=nn.extend({method:ue("ping"),params:so.optional()}),fRe=ne({progress:je(),total:pt(je()),message:pt(k())}),yRe=ne({...wo.shape,...fRe.shape,progressToken:wJ}),DB=Eo.extend({method:ue("notifications/progress"),params:yRe}),bRe=so.extend({cursor:EJ.optional()}),Ip=nn.extend({params:bRe.optional()}),Sp=on.extend({nextCursor:EJ.optional()}),IRe=tn(["working","input_required","completed","failed","cancelled"]),Cp=ne({taskId:k(),status:IRe,ttl:ut([je(),ep()]),createdAt:k(),lastUpdatedAt:k(),pollInterval:pt(je()),statusMessage:pt(k())}),ly=on.extend({task:Cp}),SRe=wo.merge(Cp),LB=Eo.extend({method:ue("notifications/tasks/status"),params:SRe}),QB=nn.extend({method:ue("tasks/get"),params:so.extend({taskId:k()})}),NB=on.merge(Cp),MB=nn.extend({method:ue("tasks/result"),params:so.extend({taskId:k()})}),QCt=on.loose(),zB=Ip.extend({method:ue("tasks/list")}),jB=Sp.extend({tasks:ee(Cp)}),UB=nn.extend({method:ue("tasks/cancel"),params:so.extend({taskId:k()})}),CRe=on.merge(Cp),BJ=ne({uri:k(),mimeType:pt(k()),_meta:tt(k(),lt()).optional()}),OJ=BJ.extend({text:k()}),FB=k().refine((e)=>{try{return atob(e),!0}catch{return!1}},{message:"Invalid Base64 string"}),_J=BJ.extend({blob:FB}),vp=tn(["user","assistant"]),ol=ne({audience:ee(vp).optional(),priority:je().min(0).max(1).optional(),lastModified:Qi.datetime({offset:!0}).optional()}),DJ=ne({...nl.shape,...bp.shape,uri:k(),description:pt(k()),mimeType:pt(k()),size:pt(je()),annotations:ol.optional(),_meta:pt(Tt({}))}),vRe=ne({...nl.shape,...bp.shape,uriTemplate:k(),description:pt(k()),mimeType:pt(k()),annotations:ol.optional(),_meta:pt(Tt({}))}),wRe=Ip.extend({method:ue("resources/list")}),LJ=Sp.extend({resources:ee(DJ)}),ERe=Ip.extend({method:ue("resources/templates/list")}),QJ=Sp.extend({resourceTemplates:ee(vRe)}),$B=so.extend({uri:k()}),kRe=$B,xRe=nn.extend({method:ue("resources/read"),params:kRe}),NJ=on.extend({contents:ee(ut([OJ,_J]))}),MJ=Eo.extend({method:ue("notifications/resources/list_changed"),params:wo.optional()}),PRe=$B,RRe=nn.extend({method:ue("resources/subscribe"),params:PRe}),TRe=$B,BRe=nn.extend({method:ue("resources/unsubscribe"),params:TRe}),ORe=wo.extend({uri:k()}),_Re=Eo.extend({method:ue("notifications/resources/updated"),params:ORe}),DRe=ne({name:k(),description:pt(k()),required:pt(Xe())}),LRe=ne({...nl.shape,...bp.shape,description:pt(k()),arguments:pt(ee(DRe)),_meta:pt(Tt({}))}),QRe=Ip.extend({method:ue("prompts/list")}),zJ=Sp.extend({prompts:ee(LRe)}),NRe=so.extend({name:k(),arguments:tt(k(),k()).optional()}),MRe=nn.extend({method:ue("prompts/get"),params:NRe}),GB=ne({type:ue("text"),text:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),HB=ne({type:ue("image"),data:FB,mimeType:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),qB=ne({type:ue("audio"),data:FB,mimeType:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),zRe=ne({type:ue("tool_use"),name:k(),id:k(),input:tt(k(),lt()),_meta:tt(k(),lt()).optional()}),jRe=ne({type:ue("resource"),resource:ut([OJ,_J]),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),URe=DJ.extend({type:ue("resource_link")}),VB=ut([GB,HB,qB,URe,jRe]),FRe=ne({role:vp,content:VB}),jJ=on.extend({description:k().optional(),messages:ee(FRe)}),UJ=Eo.extend({method:ue("notifications/prompts/list_changed"),params:wo.optional()}),$Re=ne({title:k().optional(),readOnlyHint:Xe().optional(),destructiveHint:Xe().optional(),idempotentHint:Xe().optional(),openWorldHint:Xe().optional()}),GRe=ne({taskSupport:tn(["required","optional","forbidden"]).optional()}),FJ=ne({...nl.shape,...bp.shape,description:k().optional(),inputSchema:ne({type:ue("object"),properties:tt(k(),Ut).optional(),required:ee(k()).optional()}).catchall(lt()),outputSchema:ne({type:ue("object"),properties:tt(k(),Ut).optional(),required:ee(k()).optional()}).catchall(lt()).optional(),annotations:$Re.optional(),execution:GRe.optional(),_meta:tt(k(),lt()).optional()}),HRe=Ip.extend({method:ue("tools/list")}),$J=Sp.extend({tools:ee(FJ)}),uy=on.extend({content:ee(VB).default([]),structuredContent:tt(k(),lt()).optional(),isError:Xe().optional()}),NCt=uy.or(on.extend({toolResult:lt()})),qRe=ay.extend({name:k(),arguments:tt(k(),lt()).optional()}),VRe=nn.extend({method:ue("tools/call"),params:qRe}),GJ=Eo.extend({method:ue("notifications/tools/list_changed"),params:wo.optional()}),KRe=ne({autoRefresh:Xe().default(!0),debounceMs:je().int().nonnegative().default(300)}),HJ=tn(["debug","info","notice","warning","error","critical","alert","emergency"]),YRe=so.extend({level:HJ}),WRe=nn.extend({method:ue("logging/setLevel"),params:YRe}),JRe=wo.extend({level:HJ,logger:k().optional(),data:lt()}),ZRe=Eo.extend({method:ue("notifications/message"),params:JRe}),XRe=ne({name:k().optional()}),eTe=ne({hints:ee(XRe).optional(),costPriority:je().min(0).max(1).optional(),speedPriority:je().min(0).max(1).optional(),intelligencePriority:je().min(0).max(1).optional()}),tTe=ne({mode:tn(["auto","required","none"]).optional()}),nTe=ne({type:ue("tool_result"),toolUseId:k().describe("The unique identifier for the corresponding tool call."),content:ee(VB).default([]),structuredContent:ne({}).loose().optional(),isError:Xe().optional(),_meta:tt(k(),lt()).optional()}),oTe=rp("type",[GB,HB,qB]),iy=rp("type",[GB,HB,qB,zRe,nTe]),rTe=ne({role:vp,content:ut([iy,ee(iy)]),_meta:tt(k(),lt()).optional()}),iTe=ay.extend({messages:ee(rTe),modelPreferences:eTe.optional(),systemPrompt:k().optional(),includeContext:tn(["none","thisServer","allServers"]).optional(),temperature:je().optional(),maxTokens:je().int(),stopSequences:ee(k()).optional(),metadata:Ut.optional(),tools:ee(FJ).optional(),toolChoice:tTe.optional()}),qJ=nn.extend({method:ue("sampling/createMessage"),params:iTe}),VJ=on.extend({model:k(),stopReason:pt(tn(["endTurn","stopSequence","maxTokens"]).or(k())),role:vp,content:oTe}),KJ=on.extend({model:k(),stopReason:pt(tn(["endTurn","stopSequence","maxTokens","toolUse"]).or(k())),role:vp,content:ut([iy,ee(iy)])}),sTe=ne({type:ue("boolean"),title:k().optional(),description:k().optional(),default:Xe().optional()}),aTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),minLength:je().optional(),maxLength:je().optional(),format:tn(["email","uri","date","date-time"]).optional(),default:k().optional()}),cTe=ne({type:tn(["number","integer"]),title:k().optional(),description:k().optional(),minimum:je().optional(),maximum:je().optional(),default:je().optional()}),lTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),enum:ee(k()),default:k().optional()}),uTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),oneOf:ee(ne({const:k(),title:k()})),default:k().optional()}),dTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),enum:ee(k()),enumNames:ee(k()).optional(),default:k().optional()}),pTe=ut([lTe,uTe]),gTe=ne({type:ue("array"),title:k().optional(),description:k().optional(),minItems:je().optional(),maxItems:je().optional(),items:ne({type:ue("string"),enum:ee(k())}),default:ee(k()).optional()}),mTe=ne({type:ue("array"),title:k().optional(),description:k().optional(),minItems:je().optional(),maxItems:je().optional(),items:ne({anyOf:ee(ne({const:k(),title:k()}))}),default:ee(k()).optional()}),hTe=ut([gTe,mTe]),ATe=ut([dTe,pTe,hTe]),fTe=ut([ATe,sTe,aTe,cTe]),yTe=ay.extend({mode:ue("form").optional(),message:k(),requestedSchema:ne({type:ue("object"),properties:tt(k(),fTe),required:ee(k()).optional()})}),bTe=ay.extend({mode:ue("url"),message:k(),elicitationId:k(),url:k().url()}),ITe=ut([yTe,bTe]),YJ=nn.extend({method:ue("elicitation/create"),params:ITe}),STe=wo.extend({elicitationId:k()}),CTe=Eo.extend({method:ue("notifications/elicitation/complete"),params:STe}),WJ=on.extend({action:tn(["accept","decline","cancel"]),content:ap((e)=>e===null?void 0:e,tt(k(),ut([k(),je(),Xe(),ee(k())])).optional())}),vTe=ne({type:ue("ref/resource"),uri:k()}),wTe=ne({type:ue("ref/prompt"),name:k()}),ETe=so.extend({ref:ut([wTe,vTe]),argument:ne({name:k(),value:k()}),context:ne({arguments:tt(k(),k()).optional()}).optional()}),kTe=nn.extend({method:ue("completion/complete"),params:ETe}),JJ=on.extend({completion:Tt({values:ee(k()).max(100),total:pt(je().int()),hasMore:pt(Xe())})}),xTe=ne({uri:k().startsWith("file://"),name:k().optional(),_meta:tt(k(),lt()).optional()}),PTe=nn.extend({method:ue("roots/list"),params:so.optional()}),RTe=on.extend({roots:ee(xTe)}),TTe=Eo.extend({method:ue("notifications/roots/list_changed"),params:wo.optional()}),MCt=ut([_B,mRe,kTe,WRe,MRe,QRe,wRe,ERe,xRe,RRe,BRe,VRe,HRe,QB,MB,zB,UB]),zCt=ut([OB,DB,ARe,TTe,LB]),jCt=ut([BB,VJ,KJ,WJ,RTe,NB,jB,ly]),UCt=ut([_B,qJ,YJ,PTe,QB,MB,zB,UB]),FCt=ut([OB,DB,ZRe,_Re,MJ,GJ,UJ,LB,CTe]),$Ct=ut([BB,TJ,JJ,jJ,zJ,LJ,QJ,NJ,uy,$J,NB,jB,ly])});var BTe;var dy=h(()=>{BTe=Symbol("Let zodToJsonSchema decide on which parser to use")});var KB=h(()=>{dy()});var ko=()=>{};var YB=h(()=>{Dt()});var WB=()=>{};var py=h(()=>{Dt()});var JB=h(()=>{Dt()});var ZB=()=>{};var XB=h(()=>{Dt()});var eO=h(()=>{Dt();ko()});var tO=h(()=>{Dt()});var Cvt;var gy=h(()=>{Cvt=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});var my=h(()=>{Dt();gy();py();ko()});var nO=h(()=>{Dt();my();ko()});var oO=h(()=>{ko()});var hy=h(()=>{Dt()});var rO=h(()=>{Dt();hy()});var iO=()=>{};var sO=h(()=>{Dt()});var aO=h(()=>{Dt();ko()});var cO=h(()=>{Dt()});var lO=h(()=>{Dt()});var uO=h(()=>{Dt()});var dO=h(()=>{Dt()});var pO=h(()=>{ko()});var gO=h(()=>{ko()});var mO=h(()=>{Dt()});var hO=h(()=>{ko();YB();WB();py();JB();ZB();XB();eO();tO();nO();oO();rO();iO();sO();aO();cO();lO();my();uO();gy();dO();pO();hy();gO();mO()});var Dt=h(()=>{dy();hO();ko()});var ZJ=()=>{};var AO=h(()=>{Dt();KB();ko()});var XJ=h(()=>{AO();dy();KB();Dt();ZJ();ko();YB();WB();py();JB();ZB();XB();eO();tO();nO();oO();rO();iO();sO();aO();cO();lO();mO();my();uO();gy();dO();pO();hy();gO();hO();AO()});var t4=h(()=>{ry();XJ()});var o4=h(()=>{ry();qs();t4()});var kp=x(function(s4){Object.defineProperty(s4,"__esModule",{value:!0});s4.regexpCode=s4.getEsmExportName=s4.getProperty=s4.safeStringify=s4.stringify=s4.strConcat=s4.addCodeArg=s4.str=s4._=s4.nil=s4._Code=s4.Name=s4.IDENTIFIER=s4._CodeOrName=void 0;class Ay{}s4._CodeOrName=Ay;s4.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class rl extends Ay{constructor(e){super();if(!s4.IDENTIFIER.test(e))throw Error("CodeGen: name must be a valid identifier");this.str=e}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}s4.Name=rl;class qo extends Ay{constructor(e){super();this._items=typeof e==="string"?[e]:e}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let e=this._items[0];return e===""||e==='""'}get str(){var e;return(e=this._str)!==null&&e!==void 0?e:this._str=this._items.reduce((t,n)=>`${t}${n}`,"")}get names(){var e;return(e=this._names)!==null&&e!==void 0?e:this._names=this._items.reduce((t,n)=>{if(n instanceof rl)t[n.str]=(t[n.str]||0)+1;return t},{})}}s4._Code=qo;s4.nil=new qo("");function r4(e,...t){let n=[e[0]],r=0;while(r<t.length)yO(n,t[r]),n.push(e[++r]);return new qo(n)}s4._=r4;var fO=new qo("+");function i4(e,...t){let n=[Ep(e[0])],r=0;while(r<t.length)n.push(fO),yO(n,t[r]),n.push(fO,Ep(e[++r]));return UTe(n),new qo(n)}s4.str=i4;function yO(e,t){if(t instanceof qo)e.push(...t._items);else if(t instanceof rl)e.push(t);else e.push(GTe(t))}s4.addCodeArg=yO;function UTe(e){let t=1;while(t<e.length-1){if(e[t]===fO){let n=FTe(e[t-1],e[t+1]);if(n!==void 0){e.splice(t-1,3,n);continue}e[t++]="+"}t++}}function FTe(e,t){if(t==='""')return e;if(e==='""')return t;if(typeof e=="string"){if(t instanceof rl||e[e.length-1]!=='"')return;if(typeof t!="string")return`${e.slice(0,-1)}${t}"`;if(t[0]==='"')return e.slice(0,-1)+t.slice(1);return}if(typeof t=="string"&&t[0]==='"'&&!(e instanceof rl))return`"${e}${t.slice(1)}`;return}function $Te(e,t){return t.emptyStr()?e:e.emptyStr()?t:i4`${e}${t}`}s4.strConcat=$Te;function GTe(e){return typeof e=="number"||typeof e=="boolean"||e===null?e:Ep(Array.isArray(e)?e.join(","):e)}function HTe(e){return new qo(Ep(e))}s4.stringify=HTe;function Ep(e){return JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}s4.safeStringify=Ep;function qTe(e){return typeof e=="string"&&s4.IDENTIFIER.test(e)?new qo(`.${e}`):r4`[${e}]`}s4.getProperty=qTe;function VTe(e){if(typeof e=="string"&&s4.IDENTIFIER.test(e))return new qo(`${e}`);throw Error(`CodeGen: invalid export name: ${e}, use explicit $id name mapping`)}s4.getEsmExportName=VTe;function KTe(e){return new qo(e.toString())}s4.regexpCode=KTe});var CO=x(function(u4){Object.defineProperty(u4,"__esModule",{value:!0});u4.ValueScope=u4.ValueScopeName=u4.Scope=u4.varKinds=u4.UsedValueState=void 0;var Fn=kp();class c4 extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`);this.value=e.value}}var yy;(function(e){e[e.Started=0]="Started",e[e.Completed=1]="Completed"})(yy||(u4.UsedValueState=yy={}));u4.varKinds={const:new Fn.Name("const"),let:new Fn.Name("let"),var:new Fn.Name("var")};class IO{constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,this._parent=t}toName(e){return e instanceof Fn.Name?e:this.name(e)}name(e){return new Fn.Name(this._newName(e))}_newName(e){let t=this._names[e]||this._nameGroup(e);return`${e}${t.index++}`}_nameGroup(e){var t,n;if(((n=(t=this._parent)===null||t===void 0?void 0:t._prefixes)===null||n===void 0?void 0:n.has(e))||this._prefixes&&!this._prefixes.has(e))throw Error(`CodeGen: prefix "${e}" is not allowed in this scope`);return this._names[e]={prefix:e,index:0}}}u4.Scope=IO;class SO extends Fn.Name{constructor(e,t){super(t);this.prefix=e}setValue(e,{property:t,itemIndex:n}){this.value=e,this.scopePath=Fn._`.${new Fn.Name(t)}[${n}]`}}u4.ValueScopeName=SO;var aBe=Fn._`\n`;class l4 extends IO{constructor(e){super(e);this._values={},this._scope=e.scope,this.opts={...e,_n:e.lines?aBe:Fn.nil}}get(){return this._scope}name(e){return new SO(e,this._newName(e))}value(e,t){var n;if(t.ref===void 0)throw Error("CodeGen: ref must be passed in value");let r=this.toName(e),{prefix:o}=r,i=(n=t.key)!==null&&n!==void 0?n:t.ref,s=this._values[o];if(s){let u=s.get(i);if(u)return u}else s=this._values[o]=new Map;s.set(i,r);let c=this._scope[o]||(this._scope[o]=[]),l=c.length;return c[l]=t.ref,r.setValue(t,{property:o,itemIndex:l}),r}getValue(e,t){let n=this._values[e];if(!n)return;return n.get(t)}scopeRefs(e,t=this._values){return this._reduceValues(t,(n)=>{if(n.scopePath===void 0)throw Error(`CodeGen: name "${n}" has no value`);return Fn._`${e}${n.scopePath}`})}scopeCode(e=this._values,t,n){return this._reduceValues(e,(r)=>{if(r.value===void 0)throw Error(`CodeGen: name "${r}" has no value`);return r.value.code},t,n)}_reduceValues(e,t,n={},r){let o=Fn.nil;for(let i in e){let s=e[i];if(!s)continue;let c=n[i]=n[i]||new Map;s.forEach((l)=>{if(c.has(l))return;c.set(l,yy.Started);let u=t(l);if(u){let d=this.opts.es5?u4.varKinds.var:u4.varKinds.const;o=Fn._`${o}${d} ${l} = ${u};${this.opts._n}`}else if(u=r===null||r===void 0?void 0:r(l))o=Fn._`${o}${u}${this.opts._n}`;else throw new c4(l);c.set(l,yy.Completed)})}return o}}u4.ValueScope=l4});var Ne=x(function($n){Object.defineProperty($n,"__esModule",{value:!0});$n.or=$n.and=$n.not=$n.CodeGen=$n.operators=$n.varKinds=$n.ValueScopeName=$n.ValueScope=$n.Scope=$n.Name=$n.regexpCode=$n.stringify=$n.getProperty=$n.nil=$n.strConcat=$n.str=$n._=void 0;var Ue=kp(),Vo=CO(),Ni=kp();Object.defineProperty($n,"_",{enumerable:!0,get:function(){return Ni._}});Object.defineProperty($n,"str",{enumerable:!0,get:function(){return Ni.str}});Object.defineProperty($n,"strConcat",{enumerable:!0,get:function(){return Ni.strConcat}});Object.defineProperty($n,"nil",{enumerable:!0,get:function(){return Ni.nil}});Object.defineProperty($n,"getProperty",{enumerable:!0,get:function(){return Ni.getProperty}});Object.defineProperty($n,"stringify",{enumerable:!0,get:function(){return Ni.stringify}});Object.defineProperty($n,"regexpCode",{enumerable:!0,get:function(){return Ni.regexpCode}});Object.defineProperty($n,"Name",{enumerable:!0,get:function(){return Ni.Name}});var wy=CO();Object.defineProperty($n,"Scope",{enumerable:!0,get:function(){return wy.Scope}});Object.defineProperty($n,"ValueScope",{enumerable:!0,get:function(){return wy.ValueScope}});Object.defineProperty($n,"ValueScopeName",{enumerable:!0,get:function(){return wy.ValueScopeName}});Object.defineProperty($n,"varKinds",{enumerable:!0,get:function(){return wy.varKinds}});$n.operators={GT:new Ue._Code(">"),GTE:new Ue._Code(">="),LT:new Ue._Code("<"),LTE:new Ue._Code("<="),EQ:new Ue._Code("==="),NEQ:new Ue._Code("!=="),NOT:new Ue._Code("!"),OR:new Ue._Code("||"),AND:new Ue._Code("&&"),ADD:new Ue._Code("+")};class Mi{optimizeNodes(){return this}optimizeNames(e,t){return this}}class p4 extends Mi{constructor(e,t,n){super();this.varKind=e,this.name=t,this.rhs=n}render({es5:e,_n:t}){let n=e?Vo.varKinds.var:this.varKind,r=this.rhs===void 0?"":` = ${this.rhs}`;return`${n} ${this.name}${r};`+t}optimizeNames(e,t){if(!e[this.name.str])return;if(this.rhs)this.rhs=sl(this.rhs,e,t);return this}get names(){return this.rhs instanceof Ue._CodeOrName?this.rhs.names:{}}}class EO extends Mi{constructor(e,t,n){super();this.lhs=e,this.rhs=t,this.sideEffects=n}render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}optimizeNames(e,t){if(this.lhs instanceof Ue.Name&&!e[this.lhs.str]&&!this.sideEffects)return;return this.rhs=sl(this.rhs,e,t),this}get names(){let e=this.lhs instanceof Ue.Name?{}:{...this.lhs.names};return vy(e,this.rhs)}}class g4 extends EO{constructor(e,t,n,r){super(e,n,r);this.op=t}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}}class m4 extends Mi{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}}class h4 extends Mi{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}}class A4 extends Mi{constructor(e){super();this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}}class f4 extends Mi{constructor(e){super();this.code=e}render({_n:e}){return`${this.code};`+e}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(e,t){return this.code=sl(this.code,e,t),this}get names(){return this.code instanceof Ue._CodeOrName?this.code.names:{}}}class Ey extends Mi{constructor(e=[]){super();this.nodes=e}render(e){return this.nodes.reduce((t,n)=>t+n.render(e),"")}optimizeNodes(){let{nodes:e}=this,t=e.length;while(t--){let n=e[t].optimizeNodes();if(Array.isArray(n))e.splice(t,1,...n);else if(n)e[t]=n;else e.splice(t,1)}return e.length>0?this:void 0}optimizeNames(e,t){let{nodes:n}=this,r=n.length;while(r--){let o=n[r];if(o.optimizeNames(e,t))continue;dBe(e,o.names),n.splice(r,1)}return n.length>0?this:void 0}get names(){return this.nodes.reduce((e,t)=>Vs(e,t.names),{})}}class zi extends Ey{render(e){return"{"+e._n+super.render(e)+"}"+e._n}}class y4 extends Ey{}class xp extends zi{}xp.kind="else";class Zr extends zi{constructor(e,t){super(t);this.condition=e}render(e){let t=`if(${this.condition})`+super.render(e);if(this.else)t+="else "+this.else.render(e);return t}optimizeNodes(){super.optimizeNodes();let e=this.condition;if(e===!0)return this.nodes;let t=this.else;if(t){let n=t.optimizeNodes();t=this.else=Array.isArray(n)?new xp(n):n}if(t){if(e===!1)return t instanceof Zr?t:t.nodes;if(this.nodes.length)return this;return new Zr(v4(e),t instanceof Zr?[t]:t.nodes)}if(e===!1||!this.nodes.length)return;return this}optimizeNames(e,t){var n;if(this.else=(n=this.else)===null||n===void 0?void 0:n.optimizeNames(e,t),!(super.optimizeNames(e,t)||this.else))return;return this.condition=sl(this.condition,e,t),this}get names(){let e=super.names;if(vy(e,this.condition),this.else)Vs(e,this.else.names);return e}}Zr.kind="if";class il extends zi{}il.kind="for";class b4 extends il{constructor(e){super();this.iteration=e}render(e){return`for(${this.iteration})`+super.render(e)}optimizeNames(e,t){if(!super.optimizeNames(e,t))return;return this.iteration=sl(this.iteration,e,t),this}get names(){return Vs(super.names,this.iteration.names)}}class I4 extends il{constructor(e,t,n,r){super();this.varKind=e,this.name=t,this.from=n,this.to=r}render(e){let t=e.es5?Vo.varKinds.var:this.varKind,{name:n,from:r,to:o}=this;return`for(${t} ${n}=${r}; ${n}<${o}; ${n}++)`+super.render(e)}get names(){let e=vy(super.names,this.from);return vy(e,this.to)}}class vO extends il{constructor(e,t,n,r){super();this.loop=e,this.varKind=t,this.name=n,this.iterable=r}render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(e)}optimizeNames(e,t){if(!super.optimizeNames(e,t))return;return this.iterable=sl(this.iterable,e,t),this}get names(){return Vs(super.names,this.iterable.names)}}class by extends zi{constructor(e,t,n){super();this.name=e,this.args=t,this.async=n}render(e){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(e)}}by.kind="func";class Iy extends Ey{render(e){return"return "+super.render(e)}}Iy.kind="return";class S4 extends zi{render(e){let t="try"+super.render(e);if(this.catch)t+=this.catch.render(e);if(this.finally)t+=this.finally.render(e);return t}optimizeNodes(){var e,t;return super.optimizeNodes(),(e=this.catch)===null||e===void 0||e.optimizeNodes(),(t=this.finally)===null||t===void 0||t.optimizeNodes(),this}optimizeNames(e,t){var n,r;return super.optimizeNames(e,t),(n=this.catch)===null||n===void 0||n.optimizeNames(e,t),(r=this.finally)===null||r===void 0||r.optimizeNames(e,t),this}get names(){let e=super.names;if(this.catch)Vs(e,this.catch.names);if(this.finally)Vs(e,this.finally.names);return e}}class Sy extends zi{constructor(e){super();this.error=e}render(e){return`catch(${this.error})`+super.render(e)}}Sy.kind="catch";class Cy extends zi{render(e){return"finally"+super.render(e)}}Cy.kind="finally";class C4{constructor(e,t={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...t,_n:t.lines?`
7576
+ -d '{"event":"hello.world","level":"info","message":"first webhook event"}'`}]}]}]}});var yY;var bY=h(()=>{fY();yY={id:"webhook_events",name:"Webhook Events",searchAliases:["webhook","webhooks","json events","http events","generic webhook","event stream"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"webhook-events",label:"Webhook Events",transform:"webhook-events"}],lifecycleSkipReason:"Manual webhook setup is not exercised by automated lifecycle tests yet.",subtitle:"Point any vendor's webhooks at Sazabi. Arbitrary JSON events land as searchable log records with zero vendor-specific configuration.",features:["Any JSON event stream","One keyed URL per endpoint","Full payload preserved as attributes","No schema or field mapping"],evidenceHints:["A vendor that emits plain JSON webhooks without a dedicated Sazabi source","An internal service, deploy bot, or cron that POSTs JSON events","Existing outbound webhook configuration with no other Sazabi destination"],setupSkill:te,dashboard:{slug:"webhook-events",iconKey:"webhook-events",intakeSourceId:"webhook-events"}}});var Mf,zf,jIt,xxe,UIt,FIt,$It,Hc,GIt,HIt,Pxe,Rxe,Txe,qIt;var IY=h(()=>{aV();uV();gV();AV();bV();CV();EV();PV();BV();DV();NV();jV();$V();qV();YV();ZV();tK();rK();aK();uK();gK();AK();bK();CK();EK();PK();BK();DK();NK();jK();$K();qK();YK();ZK();tY();rY();aY();uY();gY();AY();bY();Mf=[sV,pV,lV,hV,yV,SV,wV,xV,TV,_V,QV,zV,FV,HV,KV,JV,eK,oK,sK,lK,pK,SK,hK,yK,wK,xK,_K,TK,QK,zK,FK,HK,KK,JK,eY,oY,sY,lY,pY,hY,yY],zf=Mf,jIt=Object.fromEntries(zf.map((e)=>[e.id,e.sensitiveFields??[]])),xxe=["publicKeyId"],UIt=Object.fromEntries(zf.map((e)=>[e.id,[...new Set([...xxe,...e.serverOwnedStreamConfigFields??[],...e.secretStreamConfigFields??[]])]])),FIt=Object.fromEntries(zf.map((e)=>[e.id,e.secretStreamConfigFields??[]])),$It=Object.fromEntries(zf.flatMap((e)=>[...Object.values(e.dashboard?.actions?.submit??{}),...Object.values(e.dashboard?.actions?.list??{}),...Object.values(e.dashboard?.actions?.prefetch??{})].flatMap((t)=>{let n=t.sensitiveInputFields??[];if(n.length===0)return[];return[["procedure"in t?t.procedure:`${e.id}.${t.actionId}`,n]]}))),Hc=["vercel","cloudflare","railway","render","fly_io","netlify","supabase","digital_ocean","inngest","trigger_dev","temporal","mastra","neon","langchain","daytona","e2b","cloudwatch","convex","datadog","sentry","sentry_platform","openrouter","posthog","posthog_sdk","gcp","otel","otel_metrics","fluent_bit","vector","grafana_alloy","otel_collector","cloudflare_workers","elastic_cloud","porter","respan","plain","prometheus","webhook_events","claude_code","codex","sazabi_browser_sdk"],GIt=Mf.map((e)=>({id:e.id,name:e.name,capabilities:e.capabilities})),HIt=Object.fromEntries(Mf.map((e)=>[e.id,{name:e.name,setupSkill:e.setupSkill}])),Pxe={cloudflare:YR,cloudwatch:tT,convex:iT,digital_ocean:uT,fly_io:AT,gcp:bT,plain:OT,posthog:NT,render:FT,sentry_platform:VT,vercel:tB},Rxe={cloudflare:WR,cloudwatch:nT,convex:aT,digital_ocean:pT,fly_io:yT,gcp:IT,plain:DT,posthog:MT,render:GT,vercel:oB},Txe={cloudflare:JR,cloudflare_workers:KR,cloudwatch:oT,convex:sT,datadog:cT,daytona:lT,digital_ocean:dT,fluent_bit:hT,fly_io:fT,grafana_alloy:CT,e2b:gT,elastic_cloud:mT,gcp:ST,inngest:vT,langchain:wT,mastra:ET,neon:kT,netlify:xT,openrouter:PT,otel:BT,otel_collector:RT,otel_metrics:TT,plain:_T,posthog:zT,posthog_sdk:QT,porter:LT,prometheus:jT,railway:UT,render:$T,respan:HT,sentry:YT,sentry_platform:KT,supabase:WT,temporal:JT,trigger_dev:ZT,vector:XT,vercel:nB,webhook_events:rB,claude_code:VR,codex:rT,sazabi_browser_sdk:qT},qIt=Mf.map((e)=>({sourceId:e.id,name:e.name,capabilities:e.capabilities,setupAuthModes:e.auth,deliveryModes:e.delivery,hasDashboardMetadata:Boolean(e.dashboard),hasManagedFlow:Boolean(Pxe[e.id]),hasConnectionlessFlow:Boolean(Txe[e.id]),hasStreamSelector:Boolean(Rxe[e.id]),lifecycleEligible:e.lifecycleEligible??!1,lifecycleSkipReason:e.lifecycleSkipReason}))});var SY=h(()=>{IY()});var iB=h(()=>{rV();SY()});var CY,sB,Bxe,jf,Oxe,vY,aB,Hs,fp,wY,EY,kY,Uf,xY,PY,qc,RY,TY,Vc,BY,OY,Ff,_Y,DY,$f,LY,QY,Gf,_xe;var Hf=h(()=>{iB();De();Ve();CY=Hc,sB=a.enum(CY),Bxe=a.enum(["pending","provisioning","active","error"]),jf=a.enum(["managed","connectionless"]),Oxe=a.object({name:a.string().describe("Field name used as the JSON key in metadata."),type:a.string().describe('Zod type name, e.g. "string", "boolean", "enum".'),required:a.boolean().describe("Whether the field is required."),sensitive:a.boolean().describe("Whether the field contains a secret and will be encrypted."),description:a.string().nullable().describe("Human-readable description of the field.")}),vY=a.object({id:a.string().describe("Log source provider identifier."),name:a.string().describe("Human-readable display name."),modes:a.array(jf).describe("Setup modes this provider supports. `managed` log sources take vendor credentials; `connectionless` log sources mint a keyed intake endpoint."),metadataFields:a.array(Oxe).describe("Fields required in the metadata object when creating a managed log source. Empty for connectionless-only providers."),setupSkill:a.string().nullable().describe("Markdown setup skill for AI agents. Null when no skill is available.")}),aB=a.object({kind:a.enum(["url","hostPort"]).describe("Card shape. `url` = a complete keyed URL whose hostname authenticates; `hostPort` = a non-keyed listener host + port whose credential travels separately."),label:a.string().optional().describe("Card label. Present when a log source exposes several endpoints (e.g. separate logs and traces destinations)."),url:a.string().optional().describe("The complete keyed intake URL. Present when kind is `url`."),host:a.string().optional().describe("The regional listener hostname (no scheme). Present when kind is `hostPort`."),port:a.number().int().optional().describe("The listener port. Present when kind is `hostPort`."),description:a.string().optional().describe("Vendor-specific guidance rendered under the value."),extraCredential:a.object({label:a.string(),value:a.string(),description:a.string().optional()}).optional().describe("The credential the sender must attach when the hostname alone does not authenticate. Present when kind is `hostPort`.")}),Hs=a.object({id:a.string().uuid(),logSourceId:a.string().uuid().describe("Root log source ID. Every log stream roots on exactly one log source."),displayName:a.string().nullable().describe("Display name pulled automatically from information available through the log source connection (e.g. the vendor object's name). Null when no connection-derived name exists; connectionless log streams are always nameless."),config:a.record(a.string(),a.unknown()),status:Bxe,errorMessage:a.string().nullable(),enabled:a.boolean().describe("Whether the log stream is currently ingesting. Independent of provisioning status: a paused log stream stays configured but stops accepting new data."),createdAt:a.string().datetime(),endpointCards:a.array(aB).optional().describe("Server-computed endpoint card(s) for this log stream's delivery key — where to point the sender. Present only for log streams that carry their own intake key.")}),fp=a.object({id:a.string().uuid(),provider:sB,mode:jf,name:a.string().describe('Display name — a generated mnemonic (e.g. "amber-falcon"). Assigned at creation and immutable.'),streamCount:a.number().int(),createdAt:a.string().datetime()}),wY=fp.extend({streams:a.array(Hs).describe("The log source's live log streams, newest first.")}),EY=a.object({}),kY=a.object({providers:a.array(vY)}),Uf=w({operationId:"logSources.listProviders",description:"List all supported log source providers with their setup modes and metadata requirements.",backend:"api",route:{method:"GET",path:"/log-sources/providers",tags:["Log Sources"]},input:EY,output:kY,pagination:"none",async:"sync"}),xY=a.object({projectId:a.string().uuid().optional().describe("Project to list log sources for. Auto-filled from SDK context when omitted."),provider:sB.optional().describe("Filter log sources by provider.")}),PY=a.object({logSources:a.array(fp)}),qc=w({operationId:"logSources.list",description:"List log sources within one project.",backend:"api",route:{method:"GET",path:"/log-sources",tags:["Log Sources"]},input:xY,output:PY,pagination:"none",async:"sync"}),RY=a.object({projectId:a.string().uuid().optional().describe("Project to create the log source in. Auto-filled from SDK context when omitted."),provider:sB.describe("Log source provider identifier."),mode:jf.optional().describe("Setup mode. Defaults to `managed` when metadata is provided, otherwise `connectionless`. Must be a mode the provider supports (see `modes` on the provider catalog)."),metadata:a.record(a.string(),a.unknown()).optional().describe("Vendor credentials and configuration for managed setup. Fields vary by provider (see `metadataFields` on the provider catalog). Required for managed mode; must be omitted for connectionless mode.")}).strict(),TY=a.object({logSource:fp.describe("The created log source."),streamId:a.string().uuid().optional().describe("ID of the log stream created alongside the log source. Present for connectionless log sources (which always mint their keyed log stream) and for managed providers that auto-provision a default log stream."),publicKey:a.string().optional().describe("Intake key minted for the log source. Store this securely — it is only shown once. Present for connectionless log sources and for managed providers that ingest through a Sazabi endpoint."),endpointCards:a.array(aB).optional().describe("Server-computed endpoint card(s) for the minted key — where to point the sender. Present for connectionless log sources.")}),Vc=w({operationId:"logSources.create",description:"Create a log source. Managed mode takes vendor credentials in `metadata`, validates them, and provisions delivery behind the log source. Connectionless mode mints the log source plus a keyed log stream and returns the intake key and endpoint card(s) to point the sender at.",backend:"api",route:{method:"POST",path:"/log-sources",successStatus:201,tags:["Log Sources"]},input:RY,output:TY,pagination:"none",async:"sync"}),BY=a.object({logSourceId:a.string().uuid().describe("Log source ID to fetch.")}),OY=a.object({logSource:wY}),Ff=w({operationId:"logSources.get",description:"Get one log source by ID, including its log streams and their endpoint card(s).",backend:"api",route:{method:"GET",path:"/log-sources/{logSourceId}",tags:["Log Sources"]},input:BY,output:OY,pagination:"none",async:"sync"}),_Y=a.object({logSourceId:a.string().uuid().describe("Log source ID to update."),enabled:a.boolean().optional().describe("Pause (`false`) or resume (`true`) ingestion for all of the log source's log streams. Reversible; never deletes anything.")}).strict(),DY=a.object({logSource:fp}),$f=w({operationId:"logSources.update",description:"Update a log source: pause or resume ingestion across its log streams. Log sources cannot be renamed — their generated names are immutable.",backend:"api",route:{method:"PATCH",path:"/log-sources/{logSourceId}",tags:["Log Sources"]},input:_Y,output:DY,pagination:"none",async:"sync"}),LY=a.object({logSourceId:a.string().uuid().describe("Log source ID to delete.")}),QY=a.object({success:a.boolean(),teardownError:a.string().nullable().describe("Null when vendor-side cleanup succeeded or was not needed; error message when remote cleanup failed and must be finished manually.")}),Gf=w({operationId:"logSources.delete",description:"Delete a log source. Tombstones the log source and its log streams, deactivates their intake keys (already-ingested data is preserved with its attribution), and runs vendor-side cleanup for managed log sources when the provider supports it.",backend:"api",route:{method:"DELETE",path:"/log-sources/{logSourceId}",successStatus:200,tags:["Log Sources"]},input:LY,output:QY,pagination:"none",async:"sync"}),_xe={listProviders:Uf.contract,list:qc.contract,create:Vc.contract,get:Ff.contract,update:$f.contract,delete:Gf.contract}});var Dxe,Lxe,cB,Qxe,Nxe,lB,Mxe,zxe,uB,jxe,Uxe,dB,Fxe,$xe,pB,Gxe,Hxe,gB,iCt;var NY=h(()=>{De();Ve();Hf();Dxe=a.object({logSourceId:a.string().uuid().describe("Log source ID to list log streams for."),enabled:a.boolean().optional().describe("Optional filter on log stream ingestion state. Omit to list all log streams; pass true for only enabled log streams or false for only paused log streams.")}),Lxe=a.object({streams:a.array(Hs)}),cB=w({operationId:"logStreams.list",description:"List the log streams that belong to a log source.",backend:"api",route:{method:"GET",path:"/log-streams",tags:["Log Streams"]},input:Dxe,output:Lxe,pagination:"none",async:"sync"}),Qxe=a.object({logSourceId:a.string().uuid().describe("Log source ID to create the log stream under."),config:a.record(a.string(),a.unknown()).optional().describe("Platform-specific log stream configuration.")}).strict(),Nxe=a.object({streamId:a.string().uuid().describe("ID of the created log stream.")}),lB=w({operationId:"logStreams.create",description:"Create a new log stream under a managed log source. Triggers async provisioning; poll the log stream to track it. Connectionless log sources are single-stream — create another log source instead.",backend:"api",route:{method:"POST",path:"/log-streams",successStatus:201,tags:["Log Streams"]},input:Qxe,output:Nxe,pagination:"none",async:"sync"}),Mxe=a.object({streamId:a.string().uuid().describe("Log stream ID to fetch.")}),zxe=a.object({stream:Hs}),uB=w({operationId:"logStreams.get",description:"Get one log stream by ID. Use to poll provisioning status.",backend:"api",route:{method:"GET",path:"/log-streams/{streamId}",tags:["Log Streams"]},input:Mxe,output:zxe,pagination:"none",async:"sync"}),jxe=a.object({streamId:a.string().uuid().describe("Log stream ID to update."),enabled:a.boolean().optional().describe("Pause (`false`) or resume (`true`) ingestion for this log stream. Reversible; never deletes anything.")}).strict(),Uxe=a.object({stream:Hs}),dB=w({operationId:"logStreams.update",description:"Update a log stream: pause or resume its ingestion. Log streams cannot be renamed.",backend:"api",route:{method:"PATCH",path:"/log-streams/{streamId}",tags:["Log Streams"]},input:jxe,output:Uxe,pagination:"none",async:"sync"}),Fxe=a.object({streamId:a.string().uuid().describe("Log stream ID to delete.")}),$xe=a.object({success:a.boolean()}),pB=w({operationId:"logStreams.delete",description:"Delete a log stream. Tombstones the log stream and deactivates its intake key. Deleting a connectionless log source's only log stream tombstones the log source too.",backend:"api",route:{method:"DELETE",path:"/log-streams/{streamId}",successStatus:200,tags:["Log Streams"]},input:Fxe,output:$xe,pagination:"none",async:"sync"}),Gxe=a.object({streamId:a.string().uuid().describe("Log stream ID to reassign."),targetLogSourceId:a.string().uuid().describe("Log source to move the log stream under. Must be a connectionless log source in the same project; the stream's key is rebound to this log source's intake adapter.")}).strict(),Hxe=a.object({stream:Hs}),gB=w({operationId:"logStreams.reassign",description:"Move a log stream to a different connectionless log source in the same project. Preserves the stream's ID, intake key credential, and ingested data; rebinds the key's intake adapter to the target log source's provider so future data is processed as that provider's format.",backend:"api",route:{method:"POST",path:"/log-streams/{streamId}/reassign",successStatus:200,tags:["Log Streams"]},input:Gxe,output:Hxe,pagination:"none",async:"sync"}),iCt={list:cB.contract,create:lB.contract,get:uB.contract,update:dB.contract,delete:pB.contract,reassign:gB.contract}});var MY,zY,jY,UY,FY,$Y,GY,qf,HY,qY,qxe,VY,mB,KY,YY,WY,JY,ZY,XY,eW,tW,Vxe,nW,oW,Kc,Yc,Wc,Jc,Zc,Kxe;var hB=h(()=>{De();Ve();MY=a.enum(["eq","neq","in","contains","starts_with","gt","gte","lt","lte","between","exists"]).describe("Filter operator: 'eq' (equals), 'neq' (not equals), 'in' (in array), 'contains' (substring), 'starts_with' (prefix), 'gt' (greater than), 'gte' (greater than or equal), 'lt' (less than), 'lte' (less than or equal), 'between' (range), 'exists' (field exists)"),zY=a.enum(["any","all","phrase"]).describe("Search mode: 'any' (match any token), 'all' (match all tokens), 'phrase' (exact phrase match)"),jY=a.object({query:a.string().min(1,"Search query must be at least 1 character").max(500,"Search query must be at most 500 characters").describe("Search query text (1-500 characters)"),fields:a.array(a.string()).optional().describe("Fields to search in (defaults to backend allowlist)"),mode:zY.optional().default("all").describe("Token matching mode")}),UY=a.object({field:a.string().describe("Field name to filter on"),op:MY.describe("Filter operator"),value:a.union([a.string(),a.number(),a.boolean(),a.array(a.union([a.string(),a.number()])),a.object({from:a.string(),to:a.string()})]).describe("Filter value (type depends on operator)")}).superRefine((e,t)=>{if(e.op==="in"&&!Array.isArray(e.value))t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be an array when op is 'in'",path:["value"]});if(e.op==="between"){let n=e.value;if(!(typeof n==="object"&&n!==null&&("from"in n)&&("to"in n)))t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be an object with from/to when op is 'between'",path:["value"]})}if(e.op==="exists"&&typeof e.value!=="boolean")t.addIssue({code:a.ZodIssueCode.custom,message:"Value must be boolean when op is 'exists'",path:["value"]})}),FY=a.object({field:a.string().describe("Field name to sort by"),direction:a.enum(["asc","desc"]).default("desc").describe("Sort direction: 'asc' for ascending, 'desc' for descending")}),$Y=a.object({limit:a.number().int().min(1,"Limit must be at least 1").max(1000,"Limit must be at most 1000").default(50).describe("Maximum number of rows to return"),cursor:a.string().optional().describe("Opaque cursor from previous response for pagination")}),GY=a.object({projectId:a.string().uuid().optional().describe("Project to query logs for. Auto-filled from CLI and SDK context when omitted."),search:jY.optional().describe("Full-text search configuration"),filters:a.array(UY).optional().describe("Structured filter clauses (ANDed together). When no `timestamp` filter is provided, queries default to a 24h look-back window; pass an explicit `timestamp` filter to query a different range."),select:a.array(a.string()).optional().describe("Fields to return (defaults to backend default set)"),sort:FY.optional().describe("Sort configuration (defaults to timestamp desc)"),pagination:$Y.optional().describe("Pagination configuration")}),qf=a.enum(["clickhouse","better-stack","datadog","gcp","axiom","cloudwatch","sentry","posthog","mezmo"]),HY=a.enum(["native","external"]),qY=a.object({projectId:a.string().uuid().optional().describe("Project to inspect. Auto-filled from CLI and SDK context when omitted."),question:a.string().trim().min(1).max(2000).optional().describe("Optional natural-language question used to retrieve coherent schema bundles."),topK:a.number().int().min(1).max(32).optional().describe("Max schema bundles to return when question is set (default 8)")}),qxe=a.object({id:a.string().describe("Stable schema-bundle document id"),service:a.string().describe("Emitting service for this co-occurrence shape"),keys:a.array(a.string()).describe("Co-occurring otel_log_attributes keys in this bundle"),rowCount:a.number().nonnegative().describe("Observed row count when the bundle was compiled"),score:a.number().optional().describe("Retrieval rank score when returned from vector search")}),VY=a.object({backend:a.object({id:qf,name:a.string(),kind:HY}).describe("Active log backend for the project"),features:a.array(a.string()).describe("Backend features registered on the server"),commands:a.array(a.enum(["schema","query","volume","patterns","nativeQuery"])).describe("CLI/API commands available for this backend"),queryableFields:a.array(a.string()).describe("Fields accepted by the normalized logs.query contract"),searchableFields:a.array(a.string()).describe("Fields accepted by logs.query full-text search"),question:a.string().optional().describe("Echo of the question used for retrieval when provided"),selectedBundles:a.array(qxe).describe("Question-conditioned coherent schema bundles (empty when question omitted)"),selectedAttributeKeys:a.array(a.string()).describe("Flattened attribute keys from selectedBundles, or recent keys when question omitted"),observedServiceNames:a.array(a.string()).describe("Recently observed service names for this project"),observedAttributeKeys:a.array(a.string()).describe("Observed / selected attribute keys for agent and CLI schema discovery"),indexStatus:a.enum(["ready","empty","unavailable","skipped"]).describe("ready: bundles retrieved; empty: index missing/empty; unavailable: retrieval failed; skipped: no question (legacy path)"),schemaContext:a.record(a.string(),a.any()).optional().describe("Backend-specific schema guidance and examples")}),mB=a.enum(["1m","5m","15m","1h"]),KY=a.enum(["service_name","severity_text","environment"]),YY=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),startDate:a.string().datetime({offset:!0}),endDate:a.string().datetime({offset:!0}),interval:mB.optional().describe("Aggregation bucket size for the volume series"),groupBy:KY.optional().describe("Optional field to split volume series by"),filters:a.object({service_name:a.string().optional(),severity_text:a.string().optional(),environment:a.string().optional()}).optional()}).refine((e)=>new Date(e.startDate)<new Date(e.endDate),{message:"startDate must be before endDate",path:["endDate"]}),WY=a.object({total:a.number().nonnegative(),startDate:a.string().datetime({offset:!0}),endDate:a.string().datetime({offset:!0}),interval:mB,series:a.array(a.object({group:a.string(),total:a.number().nonnegative(),points:a.array(a.object({bucket:a.string(),count:a.number().nonnegative()}))}))}),JY=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:a.string().min(1).max(500).optional().describe("Optional text to match against normalized log patterns"),severity:a.string().optional().describe("Optional severity_text value, for example ERROR"),startDate:a.string().datetime({offset:!0}).optional().describe("Optional earliest last-seen timestamp"),endDate:a.string().datetime({offset:!0}).optional().describe("Optional latest last-seen timestamp"),limit:a.number().int().min(1).max(100).default(25).describe("Maximum number of log patterns to return")}).refine((e)=>!e.startDate||!e.endDate||new Date(e.startDate)<new Date(e.endDate),{message:"startDate must be before endDate",path:["endDate"]}),ZY=a.object({serviceName:a.string().nullable(),fingerprint:a.string(),pattern:a.string(),severity:a.string().nullable(),occurrences:a.number().nonnegative(),firstSeen:a.string().nullable(),lastSeen:a.string().nullable(),representativeId:a.string().nullable()}),XY=a.object({patterns:a.array(ZY),meta:a.object({backendId:qf,count:a.number().int().nonnegative(),took:a.number().nonnegative()})}),eW=a.object({projectId:a.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:a.string().min(1,"Query cannot be empty").max(1e4,"Query must be 10000 characters or less")}),tW=a.object({result:a.string().describe("Backend-formatted query result"),format:a.literal("text"),meta:a.object({backendId:qf,took:a.number().nonnegative(),truncated:a.boolean()})}),Vxe=a.object({cursor:a.string().nullable().describe("Cursor for next page (null if no more results)"),hasMore:a.boolean().describe("Whether more results are available")}),nW=a.object({count:a.number().int().nonnegative().describe("Number of log rows returned in this response"),took:a.number().nonnegative().describe("Query execution time in milliseconds")}),oW=a.object({data:a.array(a.record(a.string(),a.any())).describe("Array of log rows with selected fields"),nextCursor:a.string().nullable().describe("Pass as 'cursor' in the next query to fetch the next page. Null when there are no more results."),meta:nW.describe("Query execution metadata")}),Kc=w({operationId:"logs.query",description:"Query logs within one project.",backend:"api",route:{method:"POST",path:"/logs/query",tags:["Logs"]},input:GY,output:oW,pagination:"cursor",async:"sync"}),Yc=w({operationId:"logs.schema",description:"Describe the active log backend, supported commands, query fields, and schema context.",backend:"api",route:{method:"POST",path:"/logs/schema",tags:["Logs"]},input:qY,output:VY,pagination:"none",async:"sync"}),Wc=w({operationId:"logs.volume",description:"Query pre-aggregated log volume for one project.",backend:"api",route:{method:"POST",path:"/logs/volume",tags:["Logs"]},input:YY,output:WY,pagination:"none",async:"sync"}),Jc=w({operationId:"logs.patterns",description:"Query normalized log patterns for discovery workflows.",backend:"api",route:{method:"POST",path:"/logs/patterns",tags:["Logs"]},input:JY,output:XY,pagination:"none",async:"sync"}),Zc=w({operationId:"logs.nativeQuery",description:"Run a read-only query in the log store's native query language, with server-side guardrails.",backend:"api",route:{method:"POST",path:"/logs/native-query",tags:["Logs"]},input:eW,output:tW,pagination:"none",async:"sync"}),Kxe={query:Kc.contract,schema:Yc.contract,volume:Wc.contract,patterns:Jc.contract,nativeQuery:Zc.contract}});var rW=h(()=>{JA()});var AB=h(()=>{rW()});var sW=()=>{};var fB,yB,Vf,Yxe,Wxe,Xc,Kf,aW,cW,bB,lW,uW,Jxe,dW,IB,Zxe,Xxe,ePe,tPe,nPe,oPe,rPe,iPe,sPe,aPe,cPe,lPe,uPe,SB,pW,gW,dPe,CB;var Yf=h(()=>{De();fB=["streamable-http","sse"],yB=["none","headers","oauth","aws-sigv4"],Vf=["none","client_secret_basic","client_secret_post"],Yxe=["preset","custom"],Wxe=["configured","authorizing","connected","error"],Xc=["enabled","disabled","custom-only"],Kf=["enabled","write_blocked","disabled"],aW=a.enum(fB),cW=a.enum(yB),bB=a.enum(Vf),lW=a.enum(Yxe),uW=a.enum(Wxe),Jxe=a.enum(Xc),dW=a.enum(Kf),IB=a.object({id:a.string().min(1),name:a.string().min(1),value:a.string().min(1)}),Zxe=a.object({id:a.string().min(1),name:a.string().min(1),maskedValue:a.string().min(1)}),Xxe=a.object({authMode:a.literal("none")}),ePe=a.object({tokenUrl:a.string().url(),clientId:a.string().min(1),clientSecret:a.string().min(1).optional(),tokenEndpointAuthMethod:bB.optional(),refreshToken:a.string().min(1),headerName:a.string().min(1).default("Authorization"),headerValuePrefix:a.string().default("Bearer "),expiresAt:a.string().datetime().optional()}),tPe=a.object({authMode:a.literal("headers"),headers:a.array(IB),refreshCredentials:ePe.optional()}),nPe=a.object({authMode:a.literal("aws-sigv4"),accessKeyId:a.string().min(1),secretAccessKey:a.string().min(1),sessionToken:a.string().min(1).optional(),region:a.string().min(1),service:a.string().min(1).default("aws-mcp")}),oPe=a.preprocess((e)=>{if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0},a.string().min(1).optional()).optional(),rPe=a.object({accessToken:a.string().min(1),refreshToken:a.string().min(1).optional(),tokenType:a.string().min(1).optional(),scope:oPe,expiresAt:a.string().datetime().optional()}).transform(({scope:e,...t})=>e===void 0?t:{...t,scope:e}),iPe=a.object({authMode:a.literal("oauth"),providerId:a.string().min(1),tokens:rPe,headers:a.array(IB).optional()}),sPe=a.discriminatedUnion("authMode",[Xxe,tPe,iPe,nPe]),aPe=a.string().min(1).regex(/^enc:v1:/,"Encrypted auth config must use enc:v1 format."),cPe=a.object({codeVerifier:a.string().min(1),clientId:a.string().min(1),clientSecret:a.string().min(1).optional(),tokenEndpointAuthMethod:bB.optional(),tokenUrl:a.string().url().optional(),resourceUrl:a.string().url().optional(),projectId:a.string().uuid().optional(),returnTo:a.string().min(1).max(2000).optional(),messageId:a.string().min(1).max(240).optional(),scopes:a.array(a.string().min(1)).optional()}),lPe=a.object({type:a.string().optional(),properties:a.record(a.string(),a.unknown()).optional(),required:a.array(a.string()).optional(),additionalProperties:a.boolean().optional()}).catchall(a.unknown()),uPe=a.object({supportsOAuth:a.boolean().default(!1),supportsCustomHeaders:a.boolean().default(!0),supportsToolDiscovery:a.boolean().default(!0),readOnlyToolNames:a.array(a.string()).default([])}),SB=a.object({name:a.string().min(1),title:a.string().min(1),description:a.string().min(1),inputSchema:lPe,annotations:a.record(a.string(),a.unknown()).default({}),availability:dW,isReadOnly:a.boolean()}),pW=a.object({discoveredAt:a.string().datetime(),tools:a.array(SB)}),gW=a.object({mode:a.enum(["user","system"]),managedBy:a.object({type:a.literal("integration"),id:a.string().min(1),displayName:a.string().min(1),iconKey:a.string().min(1)}).nullable(),capabilities:a.object({canRename:a.boolean(),canEditCredentials:a.boolean(),canSetReadOnly:a.boolean(),canConfigureTools:a.boolean(),canDisconnect:a.boolean()})}),dPe=a.object({id:a.string().uuid(),organizationId:a.string().min(1),projectId:a.string().uuid(),providerId:a.string().min(1),source:lW,displayName:a.string().min(1),connectionKey:a.string().min(1),serverUrl:a.string().url(),transport:aW,authMode:cW,installStatus:uW,installedByUserId:a.string().nullable(),connectedAt:a.string().datetime().nullable(),toolSnapshot:pW.nullable(),enabledToolNames:a.array(a.string()),readOnly:a.boolean().default(!1),version:a.number().int().nonnegative(),createdAt:a.string().datetime(),updatedAt:a.string().datetime(),deletedAt:a.string().datetime().nullable()}),CB=gW});var wB=x(function(fCt,Zf){var mW,hW,AW,fW,yW,bW,IW,SW,CW,vW,wW,EW,kW,Wf,vB,xW,PW,RW,el,TW,BW,OW,_W,DW,LW,QW,NW,MW,Jf,zW,jW,UW;(function(e){var t=typeof global==="object"?global:typeof self==="object"?self:typeof this==="object"?this:{};if(typeof define==="function"&&define.amd)define("tslib",["exports"],function(r){e(n(t,n(r)))});else if(typeof Zf==="object"&&typeof fCt==="object")e(n(t,n(fCt)));else e(n(t));function n(r,o){if(r!==t)if(typeof Object.create==="function")Object.defineProperty(r,"__esModule",{value:!0});else r.__esModule=!0;return function(i,s){return r[i]=o?o(i,s):s}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var c in s)if(Object.prototype.hasOwnProperty.call(s,c))i[c]=s[c]};mW=function(i,s){if(typeof s!=="function"&&s!==null)throw TypeError("Class extends value "+String(s)+" is not a constructor or null");t(i,s);function c(){this.constructor=i}i.prototype=s===null?Object.create(s):(c.prototype=s.prototype,new c)},hW=Object.assign||function(i){for(var s,c=1,l=arguments.length;c<l;c++){s=arguments[c];for(var u in s)if(Object.prototype.hasOwnProperty.call(s,u))i[u]=s[u]}return i},AW=function(i,s){var c={};for(var l in i)if(Object.prototype.hasOwnProperty.call(i,l)&&s.indexOf(l)<0)c[l]=i[l];if(i!=null&&typeof Object.getOwnPropertySymbols==="function"){for(var u=0,l=Object.getOwnPropertySymbols(i);u<l.length;u++)if(s.indexOf(l[u])<0&&Object.prototype.propertyIsEnumerable.call(i,l[u]))c[l[u]]=i[l[u]]}return c},fW=function(i,s,c,l){var u=arguments.length,d=u<3?s:l===null?l=Object.getOwnPropertyDescriptor(s,c):l,p;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")d=Reflect.decorate(i,s,c,l);else for(var g=i.length-1;g>=0;g--)if(p=i[g])d=(u<3?p(d):u>3?p(s,c,d):p(s,c))||d;return u>3&&d&&Object.defineProperty(s,c,d),d},yW=function(i,s){return function(c,l){s(c,l,i)}},bW=function(i,s,c,l,u,d){function p(le){if(le!==void 0&&typeof le!=="function")throw TypeError("Function expected");return le}var g=l.kind,m=g==="getter"?"get":g==="setter"?"set":"value",A=!s&&i?l.static?i:i.prototype:null,f=s||(A?Object.getOwnPropertyDescriptor(A,l.name):{}),S,v=!1;for(var P=c.length-1;P>=0;P--){var O={};for(var K in l)O[K]=K==="access"?{}:l[K];for(var K in l.access)O.access[K]=l.access[K];O.addInitializer=function(le){if(v)throw TypeError("Cannot add initializers after decoration has completed");d.push(p(le||null))};var M=(0,c[P])(g==="accessor"?{get:f.get,set:f.set}:f[m],O);if(g==="accessor"){if(M===void 0)continue;if(M===null||typeof M!=="object")throw TypeError("Object expected");if(S=p(M.get))f.get=S;if(S=p(M.set))f.set=S;if(S=p(M.init))u.unshift(S)}else if(S=p(M))if(g==="field")u.unshift(S);else f[m]=S}if(A)Object.defineProperty(A,l.name,f);v=!0},IW=function(i,s,c){var l=arguments.length>2;for(var u=0;u<s.length;u++)c=l?s[u].call(i,c):s[u].call(i);return l?c:void 0},SW=function(i){return typeof i==="symbol"?i:"".concat(i)},CW=function(i,s,c){if(typeof s==="symbol")s=s.description?"[".concat(s.description,"]"):"";return Object.defineProperty(i,"name",{configurable:!0,value:c?"".concat(c," ",s):s})},vW=function(i,s){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(i,s)},wW=function(i,s,c,l){function u(d){return d instanceof c?d:new c(function(p){p(d)})}return new(c||(c=Promise))(function(d,p){function g(f){try{A(l.next(f))}catch(S){p(S)}}function m(f){try{A(l.throw(f))}catch(S){p(S)}}function A(f){f.done?d(f.value):u(f.value).then(g,m)}A((l=l.apply(i,s||[])).next())})},EW=function(i,s){var c={label:0,sent:function(){if(d[0]&1)throw d[1];return d[1]},trys:[],ops:[]},l,u,d,p=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return p.next=g(0),p.throw=g(1),p.return=g(2),typeof Symbol==="function"&&(p[Symbol.iterator]=function(){return this}),p;function g(A){return function(f){return m([A,f])}}function m(A){if(l)throw TypeError("Generator is already executing.");while(p&&(p=0,A[0]&&(c=0)),c)try{if(l=1,u&&(d=A[0]&2?u.return:A[0]?u.throw||((d=u.return)&&d.call(u),0):u.next)&&!(d=d.call(u,A[1])).done)return d;if(u=0,d)A=[A[0]&2,d.value];switch(A[0]){case 0:case 1:d=A;break;case 4:return c.label++,{value:A[1],done:!1};case 5:c.label++,u=A[1],A=[0];continue;case 7:A=c.ops.pop(),c.trys.pop();continue;default:if((d=c.trys,!(d=d.length>0&&d[d.length-1]))&&(A[0]===6||A[0]===2)){c=0;continue}if(A[0]===3&&(!d||A[1]>d[0]&&A[1]<d[3])){c.label=A[1];break}if(A[0]===6&&c.label<d[1]){c.label=d[1],d=A;break}if(d&&c.label<d[2]){c.label=d[2],c.ops.push(A);break}if(d[2])c.ops.pop();c.trys.pop();continue}A=s.call(i,c)}catch(f){A=[6,f],u=0}finally{l=d=0}if(A[0]&5)throw A[1];return{value:A[0]?A[1]:void 0,done:!0}}},kW=function(i,s){for(var c in i)if(c!=="default"&&!Object.prototype.hasOwnProperty.call(s,c))Jf(s,i,c)},Jf=Object.create?function(i,s,c,l){if(l===void 0)l=c;var u=Object.getOwnPropertyDescriptor(s,c);if(!u||("get"in u?!s.__esModule:u.writable||u.configurable))u={enumerable:!0,get:function(){return s[c]}};Object.defineProperty(i,l,u)}:function(i,s,c,l){if(l===void 0)l=c;i[l]=s[c]},Wf=function(i){var s=typeof Symbol==="function"&&Symbol.iterator,c=s&&i[s],l=0;if(c)return c.call(i);if(i&&typeof i.length==="number")return{next:function(){if(i&&l>=i.length)i=void 0;return{value:i&&i[l++],done:!i}}};throw TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")},vB=function(i,s){var c=typeof Symbol==="function"&&i[Symbol.iterator];if(!c)return i;var l=c.call(i),u,d=[],p;try{while((s===void 0||s-- >0)&&!(u=l.next()).done)d.push(u.value)}catch(g){p={error:g}}finally{try{if(u&&!u.done&&(c=l.return))c.call(l)}finally{if(p)throw p.error}}return d},xW=function(){for(var i=[],s=0;s<arguments.length;s++)i=i.concat(vB(arguments[s]));return i},PW=function(){for(var i=0,s=0,c=arguments.length;s<c;s++)i+=arguments[s].length;for(var l=Array(i),u=0,s=0;s<c;s++)for(var d=arguments[s],p=0,g=d.length;p<g;p++,u++)l[u]=d[p];return l},RW=function(i,s,c){if(c||arguments.length===2){for(var l=0,u=s.length,d;l<u;l++)if(d||!(l in s)){if(!d)d=Array.prototype.slice.call(s,0,l);d[l]=s[l]}}return i.concat(d||Array.prototype.slice.call(s))},el=function(i){return this instanceof el?(this.v=i,this):new el(i)},TW=function(i,s,c){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var l=c.apply(i,s||[]),u,d=[];return u=Object.create((typeof AsyncIterator==="function"?AsyncIterator:Object).prototype),g("next"),g("throw"),g("return",p),u[Symbol.asyncIterator]=function(){return this},u;function p(P){return function(O){return Promise.resolve(O).then(P,S)}}function g(P,O){if(l[P]){if(u[P]=function(K){return new Promise(function(M,le){d.push([P,K,M,le])>1||m(P,K)})},O)u[P]=O(u[P])}}function m(P,O){try{A(l[P](O))}catch(K){v(d[0][3],K)}}function A(P){P.value instanceof el?Promise.resolve(P.value.v).then(f,S):v(d[0][2],P)}function f(P){m("next",P)}function S(P){m("throw",P)}function v(P,O){if(P(O),d.shift(),d.length)m(d[0][0],d[0][1])}},BW=function(i){var s,c;return s={},l("next"),l("throw",function(u){throw u}),l("return"),s[Symbol.iterator]=function(){return this},s;function l(u,d){s[u]=i[u]?function(p){return(c=!c)?{value:el(i[u](p)),done:!1}:d?d(p):p}:d}},OW=function(i){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var s=i[Symbol.asyncIterator],c;return s?s.call(i):(i=typeof Wf==="function"?Wf(i):i[Symbol.iterator](),c={},l("next"),l("throw"),l("return"),c[Symbol.asyncIterator]=function(){return this},c);function l(d){c[d]=i[d]&&function(p){return new Promise(function(g,m){p=i[d](p),u(g,m,p.done,p.value)})}}function u(d,p,g,m){Promise.resolve(m).then(function(A){d({value:A,done:g})},p)}},_W=function(i,s){if(Object.defineProperty)Object.defineProperty(i,"raw",{value:s});else i.raw=s;return i};var n=Object.create?function(i,s){Object.defineProperty(i,"default",{enumerable:!0,value:s})}:function(i,s){i.default=s},r=function(i){return r=Object.getOwnPropertyNames||function(s){var c=[];for(var l in s)if(Object.prototype.hasOwnProperty.call(s,l))c[c.length]=l;return c},r(i)};DW=function(i){if(i&&i.__esModule)return i;var s={};if(i!=null){for(var c=r(i),l=0;l<c.length;l++)if(c[l]!=="default")Jf(s,i,c[l])}return n(s,i),s},LW=function(i){return i&&i.__esModule?i:{default:i}},QW=function(i,s,c,l){if(c==="a"&&!l)throw TypeError("Private accessor was defined without a getter");if(typeof s==="function"?i!==s||!l:!s.has(i))throw TypeError("Cannot read private member from an object whose class did not declare it");return c==="m"?l:c==="a"?l.call(i):l?l.value:s.get(i)},NW=function(i,s,c,l,u){if(l==="m")throw TypeError("Private method is not writable");if(l==="a"&&!u)throw TypeError("Private accessor was defined without a setter");if(typeof s==="function"?i!==s||!u:!s.has(i))throw TypeError("Cannot write private member to an object whose class did not declare it");return l==="a"?u.call(i,c):u?u.value=c:s.set(i,c),c},MW=function(i,s){if(s===null||typeof s!=="object"&&typeof s!=="function")throw TypeError("Cannot use 'in' operator on non-object");return typeof i==="function"?s===i:i.has(s)},zW=function(i,s,c){if(s!==null&&s!==void 0){if(typeof s!=="object"&&typeof s!=="function")throw TypeError("Object expected.");var l,u;if(c){if(!Symbol.asyncDispose)throw TypeError("Symbol.asyncDispose is not defined.");l=s[Symbol.asyncDispose]}if(l===void 0){if(!Symbol.dispose)throw TypeError("Symbol.dispose is not defined.");if(l=s[Symbol.dispose],c)u=l}if(typeof l!=="function")throw TypeError("Object not disposable.");if(u)l=function(){try{u.call(this)}catch(d){return Promise.reject(d)}};i.stack.push({value:s,dispose:l,async:c})}else if(c)i.stack.push({async:!0});return s};var o=typeof SuppressedError==="function"?SuppressedError:function(i,s,c){var l=Error(c);return l.name="SuppressedError",l.error=i,l.suppressed=s,l};jW=function(i){function s(d){i.error=i.hasError?new o(d,i.error,"An error was suppressed during disposal."):d,i.hasError=!0}var c,l=0;function u(){while(c=i.stack.pop())try{if(!c.async&&l===1)return l=0,i.stack.push(c),Promise.resolve().then(u);if(c.dispose){var d=c.dispose.call(c.value);if(c.async)return l|=2,Promise.resolve(d).then(u,function(p){return s(p),u()})}else l|=1}catch(p){s(p)}if(l===1)return i.hasError?Promise.reject(i.error):Promise.resolve();if(i.hasError)throw i.error}return u()},UW=function(i,s){if(typeof i==="string"&&/^\.\.?\//.test(i))return i.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(c,l,u,d,p){return l?s?".jsx":".js":u&&(!d||!p)?c:u+d+"."+p.toLowerCase()+"js"});return i},e("__extends",mW),e("__assign",hW),e("__rest",AW),e("__decorate",fW),e("__param",yW),e("__esDecorate",bW),e("__runInitializers",IW),e("__propKey",SW),e("__setFunctionName",CW),e("__metadata",vW),e("__awaiter",wW),e("__generator",EW),e("__exportStar",kW),e("__createBinding",Jf),e("__values",Wf),e("__read",vB),e("__spread",xW),e("__spreadArrays",PW),e("__spreadArray",RW),e("__await",el),e("__asyncGenerator",TW),e("__asyncDelegator",BW),e("__asyncValues",OW),e("__makeTemplateObject",_W),e("__importStar",DW),e("__importDefault",LW),e("__classPrivateFieldGet",QW),e("__classPrivateFieldSet",NW),e("__classPrivateFieldIn",MW),e("__addDisposableResource",zW),e("__disposeResources",jW),e("__rewriteRelativeImportExtension",UW)})});var EB=x(function(FW){Object.defineProperty(FW,"__esModule",{value:!0});FW.MAX_HASHABLE_LENGTH=FW.INIT=FW.KEY=FW.DIGEST_LENGTH=FW.BLOCK_SIZE=void 0;FW.BLOCK_SIZE=64;FW.DIGEST_LENGTH=32;FW.KEY=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);FW.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];FW.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1});var qW=x(function(GW){Object.defineProperty(GW,"__esModule",{value:!0});GW.RawSha256=void 0;var vo=EB(),APe=function(){function e(){this.state=Int32Array.from(vo.INIT),this.temp=new Int32Array(64),this.buffer=new Uint8Array(64),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}return e.prototype.update=function(t){if(this.finished)throw Error("Attempted to update an already finished hash.");var n=0,r=t.byteLength;if(this.bytesHashed+=r,this.bytesHashed*8>vo.MAX_HASHABLE_LENGTH)throw Error("Cannot hash more than 2^53 - 1 bits");while(r>0)if(this.buffer[this.bufferLength++]=t[n++],r--,this.bufferLength===vo.BLOCK_SIZE)this.hashBuffer(),this.bufferLength=0},e.prototype.digest=function(){if(!this.finished){var t=this.bytesHashed*8,n=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),r=this.bufferLength;if(n.setUint8(this.bufferLength++,128),r%vo.BLOCK_SIZE>=vo.BLOCK_SIZE-8){for(var o=this.bufferLength;o<vo.BLOCK_SIZE;o++)n.setUint8(o,0);this.hashBuffer(),this.bufferLength=0}for(var o=this.bufferLength;o<vo.BLOCK_SIZE-8;o++)n.setUint8(o,0);n.setUint32(vo.BLOCK_SIZE-8,Math.floor(t/4294967296),!0),n.setUint32(vo.BLOCK_SIZE-4,t),this.hashBuffer(),this.finished=!0}var i=new Uint8Array(vo.DIGEST_LENGTH);for(var o=0;o<8;o++)i[o*4]=this.state[o]>>>24&255,i[o*4+1]=this.state[o]>>>16&255,i[o*4+2]=this.state[o]>>>8&255,i[o*4+3]=this.state[o]>>>0&255;return i},e.prototype.hashBuffer=function(){var t=this,n=t.buffer,r=t.state,o=r[0],i=r[1],s=r[2],c=r[3],l=r[4],u=r[5],d=r[6],p=r[7];for(var g=0;g<vo.BLOCK_SIZE;g++){if(g<16)this.temp[g]=(n[g*4]&255)<<24|(n[g*4+1]&255)<<16|(n[g*4+2]&255)<<8|n[g*4+3]&255;else{var m=this.temp[g-2],A=(m>>>17|m<<15)^(m>>>19|m<<13)^m>>>10;m=this.temp[g-15];var f=(m>>>7|m<<25)^(m>>>18|m<<14)^m>>>3;this.temp[g]=(A+this.temp[g-7]|0)+(f+this.temp[g-16]|0)}var S=(((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+(l&u^~l&d)|0)+(p+(vo.KEY[g]+this.temp[g]|0)|0)|0,v=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+(o&i^o&s^i&s)|0;p=d,d=u,u=l,l=c+S|0,c=s,s=i,i=o,o=S+v|0}r[0]+=o,r[1]+=i,r[2]+=s,r[3]+=c,r[4]+=l,r[5]+=u,r[6]+=d,r[7]+=p},e}();GW.RawSha256=APe});var YW=x(function(ICt,KW){var{defineProperty:Xf,getOwnPropertyDescriptor:fPe,getOwnPropertyNames:yPe}=Object,bPe=Object.prototype.hasOwnProperty,IPe=(e,t)=>Xf(e,"name",{value:t,configurable:!0}),SPe=(e,t)=>{for(var n in t)Xf(e,n,{get:t[n],enumerable:!0})},CPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of yPe(t))if(!bPe.call(e,o)&&o!==n)Xf(e,o,{get:()=>t[o],enumerable:!(r=fPe(t,o))||r.enumerable})}return e},vPe=(e)=>CPe(Xf({},"__esModule",{value:!0}),e),VW={};SPe(VW,{isArrayBuffer:()=>wPe});KW.exports=vPe(VW);var wPe=IPe((e)=>typeof ArrayBuffer==="function"&&e instanceof ArrayBuffer||Object.prototype.toString.call(e)==="[object ArrayBuffer]","isArrayBuffer")});var XW=x(function(SCt,ZW){var{defineProperty:ey,getOwnPropertyDescriptor:EPe,getOwnPropertyNames:kPe}=Object,xPe=Object.prototype.hasOwnProperty,WW=(e,t)=>ey(e,"name",{value:t,configurable:!0}),PPe=(e,t)=>{for(var n in t)ey(e,n,{get:t[n],enumerable:!0})},RPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of kPe(t))if(!xPe.call(e,o)&&o!==n)ey(e,o,{get:()=>t[o],enumerable:!(r=EPe(t,o))||r.enumerable})}return e},TPe=(e)=>RPe(ey({},"__esModule",{value:!0}),e),JW={};PPe(JW,{fromArrayBuffer:()=>OPe,fromString:()=>_Pe});ZW.exports=TPe(JW);var BPe=YW(),kB=F("buffer"),OPe=WW((e,t=0,n=e.byteLength-t)=>{if(!(0,BPe.isArrayBuffer)(e))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof e} (${e})`);return kB.Buffer.from(e,t,n)},"fromArrayBuffer"),_Pe=WW((e,t)=>{if(typeof e!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof e} (${e})`);return t?kB.Buffer.from(e,t):kB.Buffer.from(e)},"fromString")});var rJ=x(function(CCt,oJ){var{defineProperty:ty,getOwnPropertyDescriptor:DPe,getOwnPropertyNames:LPe}=Object,QPe=Object.prototype.hasOwnProperty,xB=(e,t)=>ty(e,"name",{value:t,configurable:!0}),NPe=(e,t)=>{for(var n in t)ty(e,n,{get:t[n],enumerable:!0})},MPe=(e,t,n,r)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of LPe(t))if(!QPe.call(e,o)&&o!==n)ty(e,o,{get:()=>t[o],enumerable:!(r=DPe(t,o))||r.enumerable})}return e},zPe=(e)=>MPe(ty({},"__esModule",{value:!0}),e),eJ={};NPe(eJ,{fromUtf8:()=>nJ,toUint8Array:()=>jPe,toUtf8:()=>UPe});oJ.exports=zPe(eJ);var tJ=XW(),nJ=xB((e)=>{let t=(0,tJ.fromString)(e,"utf8");return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT)},"fromUtf8"),jPe=xB((e)=>{if(typeof e==="string")return nJ(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)},"toUint8Array"),UPe=xB((e)=>{if(typeof e==="string")return e;if(typeof e!=="object"||typeof e.byteOffset!=="number"||typeof e.byteLength!=="number")throw Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.");return(0,tJ.fromArrayBuffer)(e.buffer,e.byteOffset,e.byteLength).toString("utf8")},"toUtf8")});var aJ=x(function(iJ){Object.defineProperty(iJ,"__esModule",{value:!0});iJ.convertToBuffer=void 0;var FPe=rJ(),$Pe=typeof Buffer<"u"&&Buffer.from?function(e){return Buffer.from(e,"utf8")}:FPe.fromUtf8;function GPe(e){if(e instanceof Uint8Array)return e;if(typeof e==="string")return $Pe(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)}iJ.convertToBuffer=GPe});var uJ=x(function(cJ){Object.defineProperty(cJ,"__esModule",{value:!0});cJ.isEmptyData=void 0;function HPe(e){if(typeof e==="string")return e.length===0;return e.byteLength===0}cJ.isEmptyData=HPe});var gJ=x(function(dJ){Object.defineProperty(dJ,"__esModule",{value:!0});dJ.numToUint8=void 0;function qPe(e){return new Uint8Array([(e&4278190080)>>24,(e&16711680)>>16,(e&65280)>>8,e&255])}dJ.numToUint8=qPe});var AJ=x(function(mJ){Object.defineProperty(mJ,"__esModule",{value:!0});mJ.uint32ArrayFrom=void 0;function VPe(e){if(!Uint32Array.from){var t=new Uint32Array(e.length),n=0;while(n<e.length)t[n]=e[n],n+=1;return t}return Uint32Array.from(e)}mJ.uint32ArrayFrom=VPe});var fJ=x(function(tl){Object.defineProperty(tl,"__esModule",{value:!0});tl.uint32ArrayFrom=tl.numToUint8=tl.isEmptyData=tl.convertToBuffer=void 0;var KPe=aJ();Object.defineProperty(tl,"convertToBuffer",{enumerable:!0,get:function(){return KPe.convertToBuffer}});var YPe=uJ();Object.defineProperty(tl,"isEmptyData",{enumerable:!0,get:function(){return YPe.isEmptyData}});var WPe=gJ();Object.defineProperty(tl,"numToUint8",{enumerable:!0,get:function(){return WPe.numToUint8}});var JPe=AJ();Object.defineProperty(tl,"uint32ArrayFrom",{enumerable:!0,get:function(){return JPe.uint32ArrayFrom}})});var SJ=x(function(bJ){Object.defineProperty(bJ,"__esModule",{value:!0});bJ.Sha256=void 0;var yJ=wB(),oy=EB(),ny=qW(),PB=fJ(),XPe=function(){function e(t){this.secret=t,this.hash=new ny.RawSha256,this.reset()}return e.prototype.update=function(t){if((0,PB.isEmptyData)(t)||this.error)return;try{this.hash.update((0,PB.convertToBuffer)(t))}catch(n){this.error=n}},e.prototype.digestSync=function(){if(this.error)throw this.error;if(this.outer){if(!this.outer.finished)this.outer.update(this.hash.digest());return this.outer.digest()}return this.hash.digest()},e.prototype.digest=function(){return yJ.__awaiter(this,void 0,void 0,function(){return yJ.__generator(this,function(t){return[2,this.digestSync()]})})},e.prototype.reset=function(){if(this.hash=new ny.RawSha256,this.secret){this.outer=new ny.RawSha256;var t=eRe(this.secret),n=new Uint8Array(oy.BLOCK_SIZE);n.set(t);for(var r=0;r<oy.BLOCK_SIZE;r++)t[r]^=54,n[r]^=92;this.hash.update(t),this.outer.update(n);for(var r=0;r<t.byteLength;r++)t[r]=0}},e}();bJ.Sha256=XPe;function eRe(e){var t=(0,PB.convertToBuffer)(e);if(t.byteLength>oy.BLOCK_SIZE){var n=new ny.RawSha256;n.update(t),t=n.digest()}var r=new Uint8Array(oy.BLOCK_SIZE);return r.set(t),r}});var CJ=x(function(RB){Object.defineProperty(RB,"__esModule",{value:!0});var tRe=wB();tRe.__exportStar(SJ(),RB)});var ry=()=>{};var vJ="io.modelcontextprotocol/related-task",sy="2.0",Ut,wJ,EJ,DCt,nRe,oRe,TB,so,ay,nn,wo,Eo,on,cy,rRe,iRe,kJ,yp,xJ,PJ,LCt,BB,sRe,OB,aRe,bp,nl,RJ,cRe,lRe,uRe,dRe,pRe,gRe,mRe,hRe,TJ,ARe,_B,fRe,yRe,DB,bRe,Ip,Sp,IRe,Cp,ly,SRe,LB,QB,NB,MB,QCt,zB,jB,UB,CRe,BJ,OJ,FB,_J,vp,ol,DJ,vRe,wRe,LJ,ERe,QJ,$B,kRe,xRe,NJ,MJ,PRe,RRe,TRe,BRe,ORe,_Re,DRe,LRe,QRe,zJ,NRe,MRe,GB,HB,qB,zRe,jRe,URe,VB,FRe,jJ,UJ,$Re,GRe,FJ,HRe,$J,uy,NCt,qRe,VRe,GJ,KRe,HJ,YRe,WRe,JRe,ZRe,XRe,eTe,tTe,nTe,oTe,iy,rTe,iTe,qJ,VJ,KJ,sTe,aTe,cTe,lTe,uTe,dTe,pTe,gTe,mTe,hTe,ATe,fTe,yTe,bTe,ITe,YJ,STe,CTe,WJ,vTe,wTe,ETe,kTe,JJ,xTe,PTe,RTe,TTe,MCt,zCt,jCt,UCt,FCt,$Ct;var qs=h(()=>{AB();Ut=WA((e)=>e!==null&&(typeof e==="object"||typeof e==="function")),wJ=ut([k(),je().int()]),EJ=k(),DCt=Tt({ttl:je().optional(),pollInterval:je().optional()}),nRe=ne({ttl:je().optional()}),oRe=ne({taskId:k()}),TB=Tt({progressToken:wJ.optional(),[vJ]:oRe.optional()}),so=ne({_meta:TB.optional()}),ay=so.extend({task:nRe.optional()}),nn=ne({method:k(),params:so.loose().optional()}),wo=ne({_meta:TB.optional()}),Eo=ne({method:k(),params:wo.loose().optional()}),on=Tt({_meta:TB.optional()}),cy=ut([k(),je().int()]),rRe=ne({jsonrpc:ue(sy),id:cy,...nn.shape}).strict(),iRe=ne({jsonrpc:ue(sy),...Eo.shape}).strict(),kJ=ne({jsonrpc:ue(sy),id:cy,result:on}).strict();(function(e){e[e.ConnectionClosed=-32000]="ConnectionClosed",e[e.RequestTimeout=-32001]="RequestTimeout",e[e.ParseError=-32700]="ParseError",e[e.InvalidRequest=-32600]="InvalidRequest",e[e.MethodNotFound=-32601]="MethodNotFound",e[e.InvalidParams=-32602]="InvalidParams",e[e.InternalError=-32603]="InternalError",e[e.UrlElicitationRequired=-32042]="UrlElicitationRequired"})(yp||(yp={}));xJ=ne({jsonrpc:ue(sy),id:cy.optional(),error:ne({code:je().int(),message:k(),data:lt().optional()})}).strict(),PJ=ut([rRe,iRe,kJ,xJ]),LCt=ut([kJ,xJ]),BB=on.strict(),sRe=wo.extend({requestId:cy.optional(),reason:k().optional()}),OB=Eo.extend({method:ue("notifications/cancelled"),params:sRe}),aRe=ne({src:k(),mimeType:k().optional(),sizes:ee(k()).optional(),theme:tn(["light","dark"]).optional()}),bp=ne({icons:ee(aRe).optional()}),nl=ne({name:k(),title:k().optional()}),RJ=nl.extend({...nl.shape,...bp.shape,version:k(),websiteUrl:k().optional(),description:k().optional()}),cRe=Qc(ne({applyDefaults:Xe().optional()}),tt(k(),lt())),lRe=ap((e)=>{if(e&&typeof e==="object"&&!Array.isArray(e)){if(Object.keys(e).length===0)return{form:{}}}return e},Qc(ne({form:cRe.optional(),url:Ut.optional()}),tt(k(),lt()).optional())),uRe=Tt({list:Ut.optional(),cancel:Ut.optional(),requests:Tt({sampling:Tt({createMessage:Ut.optional()}).optional(),elicitation:Tt({create:Ut.optional()}).optional()}).optional()}),dRe=Tt({list:Ut.optional(),cancel:Ut.optional(),requests:Tt({tools:Tt({call:Ut.optional()}).optional()}).optional()}),pRe=ne({experimental:tt(k(),Ut).optional(),sampling:ne({context:Ut.optional(),tools:Ut.optional()}).optional(),elicitation:lRe.optional(),roots:ne({listChanged:Xe().optional()}).optional(),tasks:uRe.optional(),extensions:tt(k(),Ut).optional()}),gRe=so.extend({protocolVersion:k(),capabilities:pRe,clientInfo:RJ}),mRe=nn.extend({method:ue("initialize"),params:gRe}),hRe=ne({experimental:tt(k(),Ut).optional(),logging:Ut.optional(),completions:Ut.optional(),prompts:ne({listChanged:Xe().optional()}).optional(),resources:ne({subscribe:Xe().optional(),listChanged:Xe().optional()}).optional(),tools:ne({listChanged:Xe().optional()}).optional(),tasks:dRe.optional(),extensions:tt(k(),Ut).optional()}),TJ=on.extend({protocolVersion:k(),capabilities:hRe,serverInfo:RJ,instructions:k().optional()}),ARe=Eo.extend({method:ue("notifications/initialized"),params:wo.optional()}),_B=nn.extend({method:ue("ping"),params:so.optional()}),fRe=ne({progress:je(),total:pt(je()),message:pt(k())}),yRe=ne({...wo.shape,...fRe.shape,progressToken:wJ}),DB=Eo.extend({method:ue("notifications/progress"),params:yRe}),bRe=so.extend({cursor:EJ.optional()}),Ip=nn.extend({params:bRe.optional()}),Sp=on.extend({nextCursor:EJ.optional()}),IRe=tn(["working","input_required","completed","failed","cancelled"]),Cp=ne({taskId:k(),status:IRe,ttl:ut([je(),ep()]),createdAt:k(),lastUpdatedAt:k(),pollInterval:pt(je()),statusMessage:pt(k())}),ly=on.extend({task:Cp}),SRe=wo.merge(Cp),LB=Eo.extend({method:ue("notifications/tasks/status"),params:SRe}),QB=nn.extend({method:ue("tasks/get"),params:so.extend({taskId:k()})}),NB=on.merge(Cp),MB=nn.extend({method:ue("tasks/result"),params:so.extend({taskId:k()})}),QCt=on.loose(),zB=Ip.extend({method:ue("tasks/list")}),jB=Sp.extend({tasks:ee(Cp)}),UB=nn.extend({method:ue("tasks/cancel"),params:so.extend({taskId:k()})}),CRe=on.merge(Cp),BJ=ne({uri:k(),mimeType:pt(k()),_meta:tt(k(),lt()).optional()}),OJ=BJ.extend({text:k()}),FB=k().refine((e)=>{try{return atob(e),!0}catch{return!1}},{message:"Invalid Base64 string"}),_J=BJ.extend({blob:FB}),vp=tn(["user","assistant"]),ol=ne({audience:ee(vp).optional(),priority:je().min(0).max(1).optional(),lastModified:Qi.datetime({offset:!0}).optional()}),DJ=ne({...nl.shape,...bp.shape,uri:k(),description:pt(k()),mimeType:pt(k()),size:pt(je()),annotations:ol.optional(),_meta:pt(Tt({}))}),vRe=ne({...nl.shape,...bp.shape,uriTemplate:k(),description:pt(k()),mimeType:pt(k()),annotations:ol.optional(),_meta:pt(Tt({}))}),wRe=Ip.extend({method:ue("resources/list")}),LJ=Sp.extend({resources:ee(DJ)}),ERe=Ip.extend({method:ue("resources/templates/list")}),QJ=Sp.extend({resourceTemplates:ee(vRe)}),$B=so.extend({uri:k()}),kRe=$B,xRe=nn.extend({method:ue("resources/read"),params:kRe}),NJ=on.extend({contents:ee(ut([OJ,_J]))}),MJ=Eo.extend({method:ue("notifications/resources/list_changed"),params:wo.optional()}),PRe=$B,RRe=nn.extend({method:ue("resources/subscribe"),params:PRe}),TRe=$B,BRe=nn.extend({method:ue("resources/unsubscribe"),params:TRe}),ORe=wo.extend({uri:k()}),_Re=Eo.extend({method:ue("notifications/resources/updated"),params:ORe}),DRe=ne({name:k(),description:pt(k()),required:pt(Xe())}),LRe=ne({...nl.shape,...bp.shape,description:pt(k()),arguments:pt(ee(DRe)),_meta:pt(Tt({}))}),QRe=Ip.extend({method:ue("prompts/list")}),zJ=Sp.extend({prompts:ee(LRe)}),NRe=so.extend({name:k(),arguments:tt(k(),k()).optional()}),MRe=nn.extend({method:ue("prompts/get"),params:NRe}),GB=ne({type:ue("text"),text:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),HB=ne({type:ue("image"),data:FB,mimeType:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),qB=ne({type:ue("audio"),data:FB,mimeType:k(),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),zRe=ne({type:ue("tool_use"),name:k(),id:k(),input:tt(k(),lt()),_meta:tt(k(),lt()).optional()}),jRe=ne({type:ue("resource"),resource:ut([OJ,_J]),annotations:ol.optional(),_meta:tt(k(),lt()).optional()}),URe=DJ.extend({type:ue("resource_link")}),VB=ut([GB,HB,qB,URe,jRe]),FRe=ne({role:vp,content:VB}),jJ=on.extend({description:k().optional(),messages:ee(FRe)}),UJ=Eo.extend({method:ue("notifications/prompts/list_changed"),params:wo.optional()}),$Re=ne({title:k().optional(),readOnlyHint:Xe().optional(),destructiveHint:Xe().optional(),idempotentHint:Xe().optional(),openWorldHint:Xe().optional()}),GRe=ne({taskSupport:tn(["required","optional","forbidden"]).optional()}),FJ=ne({...nl.shape,...bp.shape,description:k().optional(),inputSchema:ne({type:ue("object"),properties:tt(k(),Ut).optional(),required:ee(k()).optional()}).catchall(lt()),outputSchema:ne({type:ue("object"),properties:tt(k(),Ut).optional(),required:ee(k()).optional()}).catchall(lt()).optional(),annotations:$Re.optional(),execution:GRe.optional(),_meta:tt(k(),lt()).optional()}),HRe=Ip.extend({method:ue("tools/list")}),$J=Sp.extend({tools:ee(FJ)}),uy=on.extend({content:ee(VB).default([]),structuredContent:tt(k(),lt()).optional(),isError:Xe().optional()}),NCt=uy.or(on.extend({toolResult:lt()})),qRe=ay.extend({name:k(),arguments:tt(k(),lt()).optional()}),VRe=nn.extend({method:ue("tools/call"),params:qRe}),GJ=Eo.extend({method:ue("notifications/tools/list_changed"),params:wo.optional()}),KRe=ne({autoRefresh:Xe().default(!0),debounceMs:je().int().nonnegative().default(300)}),HJ=tn(["debug","info","notice","warning","error","critical","alert","emergency"]),YRe=so.extend({level:HJ}),WRe=nn.extend({method:ue("logging/setLevel"),params:YRe}),JRe=wo.extend({level:HJ,logger:k().optional(),data:lt()}),ZRe=Eo.extend({method:ue("notifications/message"),params:JRe}),XRe=ne({name:k().optional()}),eTe=ne({hints:ee(XRe).optional(),costPriority:je().min(0).max(1).optional(),speedPriority:je().min(0).max(1).optional(),intelligencePriority:je().min(0).max(1).optional()}),tTe=ne({mode:tn(["auto","required","none"]).optional()}),nTe=ne({type:ue("tool_result"),toolUseId:k().describe("The unique identifier for the corresponding tool call."),content:ee(VB).default([]),structuredContent:ne({}).loose().optional(),isError:Xe().optional(),_meta:tt(k(),lt()).optional()}),oTe=rp("type",[GB,HB,qB]),iy=rp("type",[GB,HB,qB,zRe,nTe]),rTe=ne({role:vp,content:ut([iy,ee(iy)]),_meta:tt(k(),lt()).optional()}),iTe=ay.extend({messages:ee(rTe),modelPreferences:eTe.optional(),systemPrompt:k().optional(),includeContext:tn(["none","thisServer","allServers"]).optional(),temperature:je().optional(),maxTokens:je().int(),stopSequences:ee(k()).optional(),metadata:Ut.optional(),tools:ee(FJ).optional(),toolChoice:tTe.optional()}),qJ=nn.extend({method:ue("sampling/createMessage"),params:iTe}),VJ=on.extend({model:k(),stopReason:pt(tn(["endTurn","stopSequence","maxTokens"]).or(k())),role:vp,content:oTe}),KJ=on.extend({model:k(),stopReason:pt(tn(["endTurn","stopSequence","maxTokens","toolUse"]).or(k())),role:vp,content:ut([iy,ee(iy)])}),sTe=ne({type:ue("boolean"),title:k().optional(),description:k().optional(),default:Xe().optional()}),aTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),minLength:je().optional(),maxLength:je().optional(),format:tn(["email","uri","date","date-time"]).optional(),default:k().optional()}),cTe=ne({type:tn(["number","integer"]),title:k().optional(),description:k().optional(),minimum:je().optional(),maximum:je().optional(),default:je().optional()}),lTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),enum:ee(k()),default:k().optional()}),uTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),oneOf:ee(ne({const:k(),title:k()})),default:k().optional()}),dTe=ne({type:ue("string"),title:k().optional(),description:k().optional(),enum:ee(k()),enumNames:ee(k()).optional(),default:k().optional()}),pTe=ut([lTe,uTe]),gTe=ne({type:ue("array"),title:k().optional(),description:k().optional(),minItems:je().optional(),maxItems:je().optional(),items:ne({type:ue("string"),enum:ee(k())}),default:ee(k()).optional()}),mTe=ne({type:ue("array"),title:k().optional(),description:k().optional(),minItems:je().optional(),maxItems:je().optional(),items:ne({anyOf:ee(ne({const:k(),title:k()}))}),default:ee(k()).optional()}),hTe=ut([gTe,mTe]),ATe=ut([dTe,pTe,hTe]),fTe=ut([ATe,sTe,aTe,cTe]),yTe=ay.extend({mode:ue("form").optional(),message:k(),requestedSchema:ne({type:ue("object"),properties:tt(k(),fTe),required:ee(k()).optional()})}),bTe=ay.extend({mode:ue("url"),message:k(),elicitationId:k(),url:k().url()}),ITe=ut([yTe,bTe]),YJ=nn.extend({method:ue("elicitation/create"),params:ITe}),STe=wo.extend({elicitationId:k()}),CTe=Eo.extend({method:ue("notifications/elicitation/complete"),params:STe}),WJ=on.extend({action:tn(["accept","decline","cancel"]),content:ap((e)=>e===null?void 0:e,tt(k(),ut([k(),je(),Xe(),ee(k())])).optional())}),vTe=ne({type:ue("ref/resource"),uri:k()}),wTe=ne({type:ue("ref/prompt"),name:k()}),ETe=so.extend({ref:ut([wTe,vTe]),argument:ne({name:k(),value:k()}),context:ne({arguments:tt(k(),k()).optional()}).optional()}),kTe=nn.extend({method:ue("completion/complete"),params:ETe}),JJ=on.extend({completion:Tt({values:ee(k()).max(100),total:pt(je().int()),hasMore:pt(Xe())})}),xTe=ne({uri:k().startsWith("file://"),name:k().optional(),_meta:tt(k(),lt()).optional()}),PTe=nn.extend({method:ue("roots/list"),params:so.optional()}),RTe=on.extend({roots:ee(xTe)}),TTe=Eo.extend({method:ue("notifications/roots/list_changed"),params:wo.optional()}),MCt=ut([_B,mRe,kTe,WRe,MRe,QRe,wRe,ERe,xRe,RRe,BRe,VRe,HRe,QB,MB,zB,UB]),zCt=ut([OB,DB,ARe,TTe,LB]),jCt=ut([BB,VJ,KJ,WJ,RTe,NB,jB,ly]),UCt=ut([_B,qJ,YJ,PTe,QB,MB,zB,UB]),FCt=ut([OB,DB,ZRe,_Re,MJ,GJ,UJ,LB,CTe]),$Ct=ut([BB,TJ,JJ,jJ,zJ,LJ,QJ,NJ,uy,$J,NB,jB,ly])});var BTe;var dy=h(()=>{BTe=Symbol("Let zodToJsonSchema decide on which parser to use")});var KB=h(()=>{dy()});var ko=()=>{};var YB=h(()=>{Dt()});var WB=()=>{};var py=h(()=>{Dt()});var JB=h(()=>{Dt()});var ZB=()=>{};var XB=h(()=>{Dt()});var eO=h(()=>{Dt();ko()});var tO=h(()=>{Dt()});var Cvt;var gy=h(()=>{Cvt=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});var my=h(()=>{Dt();gy();py();ko()});var nO=h(()=>{Dt();my();ko()});var oO=h(()=>{ko()});var hy=h(()=>{Dt()});var rO=h(()=>{Dt();hy()});var iO=()=>{};var sO=h(()=>{Dt()});var aO=h(()=>{Dt();ko()});var cO=h(()=>{Dt()});var lO=h(()=>{Dt()});var uO=h(()=>{Dt()});var dO=h(()=>{Dt()});var pO=h(()=>{ko()});var gO=h(()=>{ko()});var mO=h(()=>{Dt()});var hO=h(()=>{ko();YB();WB();py();JB();ZB();XB();eO();tO();nO();oO();rO();iO();sO();aO();cO();lO();my();uO();gy();dO();pO();hy();gO();mO()});var Dt=h(()=>{dy();hO();ko()});var ZJ=()=>{};var AO=h(()=>{Dt();KB();ko()});var XJ=h(()=>{AO();dy();KB();Dt();ZJ();ko();YB();WB();py();JB();ZB();XB();eO();tO();nO();oO();rO();iO();sO();aO();cO();lO();mO();my();uO();gy();dO();pO();hy();gO();hO();AO()});var t4=h(()=>{ry();XJ()});var o4=h(()=>{ry();qs();t4()});var kp=x(function(s4){Object.defineProperty(s4,"__esModule",{value:!0});s4.regexpCode=s4.getEsmExportName=s4.getProperty=s4.safeStringify=s4.stringify=s4.strConcat=s4.addCodeArg=s4.str=s4._=s4.nil=s4._Code=s4.Name=s4.IDENTIFIER=s4._CodeOrName=void 0;class Ay{}s4._CodeOrName=Ay;s4.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class rl extends Ay{constructor(e){super();if(!s4.IDENTIFIER.test(e))throw Error("CodeGen: name must be a valid identifier");this.str=e}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}s4.Name=rl;class qo extends Ay{constructor(e){super();this._items=typeof e==="string"?[e]:e}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let e=this._items[0];return e===""||e==='""'}get str(){var e;return(e=this._str)!==null&&e!==void 0?e:this._str=this._items.reduce((t,n)=>`${t}${n}`,"")}get names(){var e;return(e=this._names)!==null&&e!==void 0?e:this._names=this._items.reduce((t,n)=>{if(n instanceof rl)t[n.str]=(t[n.str]||0)+1;return t},{})}}s4._Code=qo;s4.nil=new qo("");function r4(e,...t){let n=[e[0]],r=0;while(r<t.length)yO(n,t[r]),n.push(e[++r]);return new qo(n)}s4._=r4;var fO=new qo("+");function i4(e,...t){let n=[Ep(e[0])],r=0;while(r<t.length)n.push(fO),yO(n,t[r]),n.push(fO,Ep(e[++r]));return UTe(n),new qo(n)}s4.str=i4;function yO(e,t){if(t instanceof qo)e.push(...t._items);else if(t instanceof rl)e.push(t);else e.push(GTe(t))}s4.addCodeArg=yO;function UTe(e){let t=1;while(t<e.length-1){if(e[t]===fO){let n=FTe(e[t-1],e[t+1]);if(n!==void 0){e.splice(t-1,3,n);continue}e[t++]="+"}t++}}function FTe(e,t){if(t==='""')return e;if(e==='""')return t;if(typeof e=="string"){if(t instanceof rl||e[e.length-1]!=='"')return;if(typeof t!="string")return`${e.slice(0,-1)}${t}"`;if(t[0]==='"')return e.slice(0,-1)+t.slice(1);return}if(typeof t=="string"&&t[0]==='"'&&!(e instanceof rl))return`"${e}${t.slice(1)}`;return}function $Te(e,t){return t.emptyStr()?e:e.emptyStr()?t:i4`${e}${t}`}s4.strConcat=$Te;function GTe(e){return typeof e=="number"||typeof e=="boolean"||e===null?e:Ep(Array.isArray(e)?e.join(","):e)}function HTe(e){return new qo(Ep(e))}s4.stringify=HTe;function Ep(e){return JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}s4.safeStringify=Ep;function qTe(e){return typeof e=="string"&&s4.IDENTIFIER.test(e)?new qo(`.${e}`):r4`[${e}]`}s4.getProperty=qTe;function VTe(e){if(typeof e=="string"&&s4.IDENTIFIER.test(e))return new qo(`${e}`);throw Error(`CodeGen: invalid export name: ${e}, use explicit $id name mapping`)}s4.getEsmExportName=VTe;function KTe(e){return new qo(e.toString())}s4.regexpCode=KTe});var CO=x(function(u4){Object.defineProperty(u4,"__esModule",{value:!0});u4.ValueScope=u4.ValueScopeName=u4.Scope=u4.varKinds=u4.UsedValueState=void 0;var Fn=kp();class c4 extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`);this.value=e.value}}var yy;(function(e){e[e.Started=0]="Started",e[e.Completed=1]="Completed"})(yy||(u4.UsedValueState=yy={}));u4.varKinds={const:new Fn.Name("const"),let:new Fn.Name("let"),var:new Fn.Name("var")};class IO{constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,this._parent=t}toName(e){return e instanceof Fn.Name?e:this.name(e)}name(e){return new Fn.Name(this._newName(e))}_newName(e){let t=this._names[e]||this._nameGroup(e);return`${e}${t.index++}`}_nameGroup(e){var t,n;if(((n=(t=this._parent)===null||t===void 0?void 0:t._prefixes)===null||n===void 0?void 0:n.has(e))||this._prefixes&&!this._prefixes.has(e))throw Error(`CodeGen: prefix "${e}" is not allowed in this scope`);return this._names[e]={prefix:e,index:0}}}u4.Scope=IO;class SO extends Fn.Name{constructor(e,t){super(t);this.prefix=e}setValue(e,{property:t,itemIndex:n}){this.value=e,this.scopePath=Fn._`.${new Fn.Name(t)}[${n}]`}}u4.ValueScopeName=SO;var aBe=Fn._`\n`;class l4 extends IO{constructor(e){super(e);this._values={},this._scope=e.scope,this.opts={...e,_n:e.lines?aBe:Fn.nil}}get(){return this._scope}name(e){return new SO(e,this._newName(e))}value(e,t){var n;if(t.ref===void 0)throw Error("CodeGen: ref must be passed in value");let r=this.toName(e),{prefix:o}=r,i=(n=t.key)!==null&&n!==void 0?n:t.ref,s=this._values[o];if(s){let u=s.get(i);if(u)return u}else s=this._values[o]=new Map;s.set(i,r);let c=this._scope[o]||(this._scope[o]=[]),l=c.length;return c[l]=t.ref,r.setValue(t,{property:o,itemIndex:l}),r}getValue(e,t){let n=this._values[e];if(!n)return;return n.get(t)}scopeRefs(e,t=this._values){return this._reduceValues(t,(n)=>{if(n.scopePath===void 0)throw Error(`CodeGen: name "${n}" has no value`);return Fn._`${e}${n.scopePath}`})}scopeCode(e=this._values,t,n){return this._reduceValues(e,(r)=>{if(r.value===void 0)throw Error(`CodeGen: name "${r}" has no value`);return r.value.code},t,n)}_reduceValues(e,t,n={},r){let o=Fn.nil;for(let i in e){let s=e[i];if(!s)continue;let c=n[i]=n[i]||new Map;s.forEach((l)=>{if(c.has(l))return;c.set(l,yy.Started);let u=t(l);if(u){let d=this.opts.es5?u4.varKinds.var:u4.varKinds.const;o=Fn._`${o}${d} ${l} = ${u};${this.opts._n}`}else if(u=r===null||r===void 0?void 0:r(l))o=Fn._`${o}${u}${this.opts._n}`;else throw new c4(l);c.set(l,yy.Completed)})}return o}}u4.ValueScope=l4});var Ne=x(function($n){Object.defineProperty($n,"__esModule",{value:!0});$n.or=$n.and=$n.not=$n.CodeGen=$n.operators=$n.varKinds=$n.ValueScopeName=$n.ValueScope=$n.Scope=$n.Name=$n.regexpCode=$n.stringify=$n.getProperty=$n.nil=$n.strConcat=$n.str=$n._=void 0;var Ue=kp(),Vo=CO(),Ni=kp();Object.defineProperty($n,"_",{enumerable:!0,get:function(){return Ni._}});Object.defineProperty($n,"str",{enumerable:!0,get:function(){return Ni.str}});Object.defineProperty($n,"strConcat",{enumerable:!0,get:function(){return Ni.strConcat}});Object.defineProperty($n,"nil",{enumerable:!0,get:function(){return Ni.nil}});Object.defineProperty($n,"getProperty",{enumerable:!0,get:function(){return Ni.getProperty}});Object.defineProperty($n,"stringify",{enumerable:!0,get:function(){return Ni.stringify}});Object.defineProperty($n,"regexpCode",{enumerable:!0,get:function(){return Ni.regexpCode}});Object.defineProperty($n,"Name",{enumerable:!0,get:function(){return Ni.Name}});var wy=CO();Object.defineProperty($n,"Scope",{enumerable:!0,get:function(){return wy.Scope}});Object.defineProperty($n,"ValueScope",{enumerable:!0,get:function(){return wy.ValueScope}});Object.defineProperty($n,"ValueScopeName",{enumerable:!0,get:function(){return wy.ValueScopeName}});Object.defineProperty($n,"varKinds",{enumerable:!0,get:function(){return wy.varKinds}});$n.operators={GT:new Ue._Code(">"),GTE:new Ue._Code(">="),LT:new Ue._Code("<"),LTE:new Ue._Code("<="),EQ:new Ue._Code("==="),NEQ:new Ue._Code("!=="),NOT:new Ue._Code("!"),OR:new Ue._Code("||"),AND:new Ue._Code("&&"),ADD:new Ue._Code("+")};class Mi{optimizeNodes(){return this}optimizeNames(e,t){return this}}class p4 extends Mi{constructor(e,t,n){super();this.varKind=e,this.name=t,this.rhs=n}render({es5:e,_n:t}){let n=e?Vo.varKinds.var:this.varKind,r=this.rhs===void 0?"":` = ${this.rhs}`;return`${n} ${this.name}${r};`+t}optimizeNames(e,t){if(!e[this.name.str])return;if(this.rhs)this.rhs=sl(this.rhs,e,t);return this}get names(){return this.rhs instanceof Ue._CodeOrName?this.rhs.names:{}}}class EO extends Mi{constructor(e,t,n){super();this.lhs=e,this.rhs=t,this.sideEffects=n}render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}optimizeNames(e,t){if(this.lhs instanceof Ue.Name&&!e[this.lhs.str]&&!this.sideEffects)return;return this.rhs=sl(this.rhs,e,t),this}get names(){let e=this.lhs instanceof Ue.Name?{}:{...this.lhs.names};return vy(e,this.rhs)}}class g4 extends EO{constructor(e,t,n,r){super(e,n,r);this.op=t}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}}class m4 extends Mi{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}}class h4 extends Mi{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}}class A4 extends Mi{constructor(e){super();this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}}class f4 extends Mi{constructor(e){super();this.code=e}render({_n:e}){return`${this.code};`+e}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(e,t){return this.code=sl(this.code,e,t),this}get names(){return this.code instanceof Ue._CodeOrName?this.code.names:{}}}class Ey extends Mi{constructor(e=[]){super();this.nodes=e}render(e){return this.nodes.reduce((t,n)=>t+n.render(e),"")}optimizeNodes(){let{nodes:e}=this,t=e.length;while(t--){let n=e[t].optimizeNodes();if(Array.isArray(n))e.splice(t,1,...n);else if(n)e[t]=n;else e.splice(t,1)}return e.length>0?this:void 0}optimizeNames(e,t){let{nodes:n}=this,r=n.length;while(r--){let o=n[r];if(o.optimizeNames(e,t))continue;dBe(e,o.names),n.splice(r,1)}return n.length>0?this:void 0}get names(){return this.nodes.reduce((e,t)=>Vs(e,t.names),{})}}class zi extends Ey{render(e){return"{"+e._n+super.render(e)+"}"+e._n}}class y4 extends Ey{}class xp extends zi{}xp.kind="else";class Zr extends zi{constructor(e,t){super(t);this.condition=e}render(e){let t=`if(${this.condition})`+super.render(e);if(this.else)t+="else "+this.else.render(e);return t}optimizeNodes(){super.optimizeNodes();let e=this.condition;if(e===!0)return this.nodes;let t=this.else;if(t){let n=t.optimizeNodes();t=this.else=Array.isArray(n)?new xp(n):n}if(t){if(e===!1)return t instanceof Zr?t:t.nodes;if(this.nodes.length)return this;return new Zr(v4(e),t instanceof Zr?[t]:t.nodes)}if(e===!1||!this.nodes.length)return;return this}optimizeNames(e,t){var n;if(this.else=(n=this.else)===null||n===void 0?void 0:n.optimizeNames(e,t),!(super.optimizeNames(e,t)||this.else))return;return this.condition=sl(this.condition,e,t),this}get names(){let e=super.names;if(vy(e,this.condition),this.else)Vs(e,this.else.names);return e}}Zr.kind="if";class il extends zi{}il.kind="for";class b4 extends il{constructor(e){super();this.iteration=e}render(e){return`for(${this.iteration})`+super.render(e)}optimizeNames(e,t){if(!super.optimizeNames(e,t))return;return this.iteration=sl(this.iteration,e,t),this}get names(){return Vs(super.names,this.iteration.names)}}class I4 extends il{constructor(e,t,n,r){super();this.varKind=e,this.name=t,this.from=n,this.to=r}render(e){let t=e.es5?Vo.varKinds.var:this.varKind,{name:n,from:r,to:o}=this;return`for(${t} ${n}=${r}; ${n}<${o}; ${n}++)`+super.render(e)}get names(){let e=vy(super.names,this.from);return vy(e,this.to)}}class vO extends il{constructor(e,t,n,r){super();this.loop=e,this.varKind=t,this.name=n,this.iterable=r}render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(e)}optimizeNames(e,t){if(!super.optimizeNames(e,t))return;return this.iterable=sl(this.iterable,e,t),this}get names(){return Vs(super.names,this.iterable.names)}}class by extends zi{constructor(e,t,n){super();this.name=e,this.args=t,this.async=n}render(e){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(e)}}by.kind="func";class Iy extends Ey{render(e){return"return "+super.render(e)}}Iy.kind="return";class S4 extends zi{render(e){let t="try"+super.render(e);if(this.catch)t+=this.catch.render(e);if(this.finally)t+=this.finally.render(e);return t}optimizeNodes(){var e,t;return super.optimizeNodes(),(e=this.catch)===null||e===void 0||e.optimizeNodes(),(t=this.finally)===null||t===void 0||t.optimizeNodes(),this}optimizeNames(e,t){var n,r;return super.optimizeNames(e,t),(n=this.catch)===null||n===void 0||n.optimizeNames(e,t),(r=this.finally)===null||r===void 0||r.optimizeNames(e,t),this}get names(){let e=super.names;if(this.catch)Vs(e,this.catch.names);if(this.finally)Vs(e,this.finally.names);return e}}class Sy extends zi{constructor(e){super();this.error=e}render(e){return`catch(${this.error})`+super.render(e)}}Sy.kind="catch";class Cy extends zi{render(e){return"finally"+super.render(e)}}Cy.kind="finally";class C4{constructor(e,t={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...t,_n:t.lines?`
7600
7577
  `:""},this._extScope=e,this._scope=new Vo.Scope({parent:e}),this._nodes=[new y4]}toString(){return this._root.render(this.opts)}name(e){return this._scope.name(e)}scopeName(e){return this._extScope.name(e)}scopeValue(e,t){let n=this._extScope.value(e,t);return(this._values[n.prefix]||(this._values[n.prefix]=new Set)).add(n),n}getScopeValue(e,t){return this._extScope.getValue(e,t)}scopeRefs(e){return this._extScope.scopeRefs(e,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(e,t,n,r){let o=this._scope.toName(t);if(n!==void 0&&r)this._constants[o.str]=n;return this._leafNode(new p4(e,o,n)),o}const(e,t,n){return this._def(Vo.varKinds.const,e,t,n)}let(e,t,n){return this._def(Vo.varKinds.let,e,t,n)}var(e,t,n){return this._def(Vo.varKinds.var,e,t,n)}assign(e,t,n){return this._leafNode(new EO(e,t,n))}add(e,t){return this._leafNode(new g4(e,$n.operators.ADD,t))}code(e){if(typeof e=="function")e();else if(e!==Ue.nil)this._leafNode(new f4(e));return this}object(...e){let t=["{"];for(let[n,r]of e){if(t.length>1)t.push(",");if(t.push(n),n!==r||this.opts.es5)t.push(":"),(0,Ue.addCodeArg)(t,r)}return t.push("}"),new Ue._Code(t)}if(e,t,n){if(this._blockNode(new Zr(e)),t&&n)this.code(t).else().code(n).endIf();else if(t)this.code(t).endIf();else if(n)throw Error('CodeGen: "else" body without "then" body');return this}elseIf(e){return this._elseNode(new Zr(e))}else(){return this._elseNode(new xp)}endIf(){return this._endBlockNode(Zr,xp)}_for(e,t){if(this._blockNode(e),t)this.code(t).endFor();return this}for(e,t){return this._for(new b4(e),t)}forRange(e,t,n,r,o=this.opts.es5?Vo.varKinds.var:Vo.varKinds.let){let i=this._scope.toName(e);return this._for(new I4(o,i,t,n),()=>r(i))}forOf(e,t,n,r=Vo.varKinds.const){let o=this._scope.toName(e);if(this.opts.es5){let i=t instanceof Ue.Name?t:this.var("_arr",t);return this.forRange("_i",0,Ue._`${i}.length`,(s)=>{this.var(o,Ue._`${i}[${s}]`),n(o)})}return this._for(new vO("of",r,o,t),()=>n(o))}forIn(e,t,n,r=this.opts.es5?Vo.varKinds.var:Vo.varKinds.const){if(this.opts.ownProperties)return this.forOf(e,Ue._`Object.keys(${t})`,n);let o=this._scope.toName(e);return this._for(new vO("in",r,o,t),()=>n(o))}endFor(){return this._endBlockNode(il)}label(e){return this._leafNode(new m4(e))}break(e){return this._leafNode(new h4(e))}return(e){let t=new Iy;if(this._blockNode(t),this.code(e),t.nodes.length!==1)throw Error('CodeGen: "return" should have one node');return this._endBlockNode(Iy)}try(e,t,n){if(!t&&!n)throw Error('CodeGen: "try" without "catch" and "finally"');let r=new S4;if(this._blockNode(r),this.code(e),t){let o=this.name("e");this._currNode=r.catch=new Sy(o),t(o)}if(n)this._currNode=r.finally=new Cy,this.code(n);return this._endBlockNode(Sy,Cy)}throw(e){return this._leafNode(new A4(e))}block(e,t){if(this._blockStarts.push(this._nodes.length),e)this.code(e).endBlock(t);return this}endBlock(e){let t=this._blockStarts.pop();if(t===void 0)throw Error("CodeGen: not in self-balancing block");let n=this._nodes.length-t;if(n<0||e!==void 0&&n!==e)throw Error(`CodeGen: wrong number of nodes: ${n} vs ${e} expected`);return this._nodes.length=t,this}func(e,t=Ue.nil,n,r){if(this._blockNode(new by(e,t,n)),r)this.code(r).endFunc();return this}endFunc(){return this._endBlockNode(by)}optimize(e=1){while(e-- >0)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(e){return this._currNode.nodes.push(e),this}_blockNode(e){this._currNode.nodes.push(e),this._nodes.push(e)}_endBlockNode(e,t){let n=this._currNode;if(n instanceof e||t&&n instanceof t)return this._nodes.pop(),this;throw Error(`CodeGen: not in block "${t?`${e.kind}/${t.kind}`:e.kind}"`)}_elseNode(e){let t=this._currNode;if(!(t instanceof Zr))throw Error('CodeGen: "else" without "if"');return this._currNode=t.else=e,this}get _root(){return this._nodes[0]}get _currNode(){let e=this._nodes;return e[e.length-1]}set _currNode(e){let t=this._nodes;t[t.length-1]=e}}$n.CodeGen=C4;function Vs(e,t){for(let n in t)e[n]=(e[n]||0)+(t[n]||0);return e}function vy(e,t){return t instanceof Ue._CodeOrName?Vs(e,t.names):e}function sl(e,t,n){if(e instanceof Ue.Name)return r(e);if(!o(e))return e;return new Ue._Code(e._items.reduce((i,s)=>{if(s instanceof Ue.Name)s=r(s);if(s instanceof Ue._Code)i.push(...s._items);else i.push(s);return i},[]));function r(i){let s=n[i.str];if(s===void 0||t[i.str]!==1)return i;return delete t[i.str],s}function o(i){return i instanceof Ue._Code&&i._items.some((s)=>s instanceof Ue.Name&&t[s.str]===1&&n[s.str]!==void 0)}}function dBe(e,t){for(let n in t)e[n]=(e[n]||0)-(t[n]||0)}function v4(e){return typeof e=="boolean"||typeof e=="number"||e===null?!e:Ue._`!${wO(e)}`}$n.not=v4;var pBe=w4($n.operators.AND);function gBe(...e){return e.reduce(pBe)}$n.and=gBe;var mBe=w4($n.operators.OR);function hBe(...e){return e.reduce(mBe)}$n.or=hBe;function w4(e){return(t,n)=>t===Ue.nil?n:n===Ue.nil?t:Ue._`${wO(t)} ${e} ${wO(n)}`}function wO(e){return e instanceof Ue.Name?e:Ue._`(${e})`}});var $e=x(function(_4){Object.defineProperty(_4,"__esModule",{value:!0});_4.checkStrictMode=_4.getErrorPath=_4.Type=_4.useFunc=_4.setEvaluated=_4.evaluatedPropsToName=_4.mergeEvaluated=_4.eachItem=_4.unescapeJsonPointer=_4.escapeJsonPointer=_4.escapeFragment=_4.unescapeFragment=_4.schemaRefOrVal=_4.schemaHasRulesButRef=_4.schemaHasRules=_4.checkUnknownRules=_4.alwaysValidSchema=_4.toHash=void 0;var gt=Ne(),bBe=kp();function IBe(e){let t={};for(let n of e)t[n]=!0;return t}_4.toHash=IBe;function SBe(e,t){if(typeof t=="boolean")return t;if(Object.keys(t).length===0)return!0;return P4(e,t),!R4(t,e.self.RULES.all)}_4.alwaysValidSchema=SBe;function P4(e,t=e.schema){let{opts:n,self:r}=e;if(!n.strictSchema)return;if(typeof t==="boolean")return;let o=r.RULES.keywords;for(let i in t)if(!o[i])O4(e,`unknown keyword: "${i}"`)}_4.checkUnknownRules=P4;function R4(e,t){if(typeof e=="boolean")return!e;for(let n in e)if(t[n])return!0;return!1}_4.schemaHasRules=R4;function CBe(e,t){if(typeof e=="boolean")return!e;for(let n in e)if(n!=="$ref"&&t.all[n])return!0;return!1}_4.schemaHasRulesButRef=CBe;function vBe({topSchemaRef:e,schemaPath:t},n,r,o){if(!o){if(typeof n=="number"||typeof n=="boolean")return n;if(typeof n=="string")return gt._`${n}`}return gt._`${e}${t}${(0,gt.getProperty)(r)}`}_4.schemaRefOrVal=vBe;function wBe(e){return T4(decodeURIComponent(e))}_4.unescapeFragment=wBe;function EBe(e){return encodeURIComponent(xO(e))}_4.escapeFragment=EBe;function xO(e){if(typeof e=="number")return`${e}`;return e.replace(/~/g,"~0").replace(/\//g,"~1")}_4.escapeJsonPointer=xO;function T4(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}_4.unescapeJsonPointer=T4;function kBe(e,t){if(Array.isArray(e))for(let n of e)t(n);else t(e)}_4.eachItem=kBe;function k4({mergeNames:e,mergeToName:t,mergeValues:n,resultToName:r}){return(o,i,s,c)=>{let l=s===void 0?i:s instanceof gt.Name?(i instanceof gt.Name?e(o,i,s):t(o,i,s),s):i instanceof gt.Name?(t(o,s,i),i):n(i,s);return c===gt.Name&&!(l instanceof gt.Name)?r(o,l):l}}_4.mergeEvaluated={props:k4({mergeNames:(e,t,n)=>e.if(gt._`${n} !== true && ${t} !== undefined`,()=>{e.if(gt._`${t} === true`,()=>e.assign(n,!0),()=>e.assign(n,gt._`${n} || {}`).code(gt._`Object.assign(${n}, ${t})`))}),mergeToName:(e,t,n)=>e.if(gt._`${n} !== true`,()=>{if(t===!0)e.assign(n,!0);else e.assign(n,gt._`${n} || {}`),PO(e,n,t)}),mergeValues:(e,t)=>e===!0?!0:{...e,...t},resultToName:B4}),items:k4({mergeNames:(e,t,n)=>e.if(gt._`${n} !== true && ${t} !== undefined`,()=>e.assign(n,gt._`${t} === true ? true : ${n} > ${t} ? ${n} : ${t}`)),mergeToName:(e,t,n)=>e.if(gt._`${n} !== true`,()=>e.assign(n,t===!0?!0:gt._`${n} > ${t} ? ${n} : ${t}`)),mergeValues:(e,t)=>e===!0?!0:Math.max(e,t),resultToName:(e,t)=>e.var("items",t)})};function B4(e,t){if(t===!0)return e.var("props",!0);let n=e.var("props",gt._`{}`);if(t!==void 0)PO(e,n,t);return n}_4.evaluatedPropsToName=B4;function PO(e,t,n){Object.keys(n).forEach((r)=>e.assign(gt._`${t}${(0,gt.getProperty)(r)}`,!0))}_4.setEvaluated=PO;var x4={};function xBe(e,t){return e.scopeValue("func",{ref:t,code:x4[t.code]||(x4[t.code]=new bBe._Code(t.code))})}_4.useFunc=xBe;var kO;(function(e){e[e.Num=0]="Num",e[e.Str=1]="Str"})(kO||(_4.Type=kO={}));function PBe(e,t,n){if(e instanceof gt.Name){let r=t===kO.Num;return n?r?gt._`"[" + ${e} + "]"`:gt._`"['" + ${e} + "']"`:r?gt._`"/" + ${e}`:gt._`"/" + ${e}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return n?(0,gt.getProperty)(e).toString():"/"+xO(e)}_4.getErrorPath=PBe;function O4(e,t,n=e.opts.strictSchema){if(!n)return;if(t=`strict mode: ${t}`,n===!0)throw Error(t);e.self.logger.warn(t)}_4.checkStrictMode=O4});var Xr=x(function(L4){Object.defineProperty(L4,"__esModule",{value:!0});var fn=Ne(),qBe={data:new fn.Name("data"),valCxt:new fn.Name("valCxt"),instancePath:new fn.Name("instancePath"),parentData:new fn.Name("parentData"),parentDataProperty:new fn.Name("parentDataProperty"),rootData:new fn.Name("rootData"),dynamicAnchors:new fn.Name("dynamicAnchors"),vErrors:new fn.Name("vErrors"),errors:new fn.Name("errors"),this:new fn.Name("this"),self:new fn.Name("self"),scope:new fn.Name("scope"),json:new fn.Name("json"),jsonPos:new fn.Name("jsonPos"),jsonLen:new fn.Name("jsonLen"),jsonPart:new fn.Name("jsonPart")};L4.default=qBe});var Pp=x(function(z4){Object.defineProperty(z4,"__esModule",{value:!0});z4.extendErrors=z4.resetErrorsCount=z4.reportExtraError=z4.reportError=z4.keyword$DataError=z4.keywordError=void 0;var Ge=Ne(),xy=$e(),Rn=Xr();z4.keywordError={message:({keyword:e})=>Ge.str`must pass "${e}" keyword validation`};z4.keyword$DataError={message:({keyword:e,schemaType:t})=>t?Ge.str`"${e}" keyword must be ${t} ($data)`:Ge.str`"${e}" keyword is invalid ($data)`};function KBe(e,t=z4.keywordError,n,r){let{it:o}=e,{gen:i,compositeRule:s,allErrors:c}=o,l=M4(e,t,n);if(r!==null&&r!==void 0?r:s||c)Q4(i,l);else N4(o,Ge._`[${l}]`)}z4.reportError=KBe;function YBe(e,t=z4.keywordError,n){let{it:r}=e,{gen:o,compositeRule:i,allErrors:s}=r,c=M4(e,t,n);if(Q4(o,c),!(i||s))N4(r,Rn.default.vErrors)}z4.reportExtraError=YBe;function WBe(e,t){e.assign(Rn.default.errors,t),e.if(Ge._`${Rn.default.vErrors} !== null`,()=>e.if(t,()=>e.assign(Ge._`${Rn.default.vErrors}.length`,t),()=>e.assign(Rn.default.vErrors,null)))}z4.resetErrorsCount=WBe;function JBe({gen:e,keyword:t,schemaValue:n,data:r,errsCount:o,it:i}){if(o===void 0)throw Error("ajv implementation error");let s=e.name("err");e.forRange("i",o,Rn.default.errors,(c)=>{if(e.const(s,Ge._`${Rn.default.vErrors}[${c}]`),e.if(Ge._`${s}.instancePath === undefined`,()=>e.assign(Ge._`${s}.instancePath`,(0,Ge.strConcat)(Rn.default.instancePath,i.errorPath))),e.assign(Ge._`${s}.schemaPath`,Ge.str`${i.errSchemaPath}/${t}`),i.opts.verbose)e.assign(Ge._`${s}.schema`,n),e.assign(Ge._`${s}.data`,r)})}z4.extendErrors=JBe;function Q4(e,t){let n=e.const("err",t);e.if(Ge._`${Rn.default.vErrors} === null`,()=>e.assign(Rn.default.vErrors,Ge._`[${n}]`),Ge._`${Rn.default.vErrors}.push(${n})`),e.code(Ge._`${Rn.default.errors}++`)}function N4(e,t){let{gen:n,validateName:r,schemaEnv:o}=e;if(o.$async)n.throw(Ge._`new ${e.ValidationError}(${t})`);else n.assign(Ge._`${r}.errors`,t),n.return(!1)}var Ks={keyword:new Ge.Name("keyword"),schemaPath:new Ge.Name("schemaPath"),params:new Ge.Name("params"),propertyName:new Ge.Name("propertyName"),message:new Ge.Name("message"),schema:new Ge.Name("schema"),parentSchema:new Ge.Name("parentSchema")};function M4(e,t,n){let{createErrors:r}=e.it;if(r===!1)return Ge._`{}`;return ZBe(e,t,n)}function ZBe(e,t,n={}){let{gen:r,it:o}=e,i=[XBe(o,n),eOe(e,n)];return tOe(e,t,i),r.object(...i)}function XBe({errorPath:e},{instancePath:t}){let n=t?Ge.str`${e}${(0,xy.getErrorPath)(t,xy.Type.Str)}`:e;return[Rn.default.instancePath,(0,Ge.strConcat)(Rn.default.instancePath,n)]}function eOe({keyword:e,it:{errSchemaPath:t}},{schemaPath:n,parentSchema:r}){let o=r?t:Ge.str`${t}/${e}`;if(n)o=Ge.str`${o}${(0,xy.getErrorPath)(n,xy.Type.Str)}`;return[Ks.schemaPath,o]}function tOe(e,{params:t,message:n},r){let{keyword:o,data:i,schemaValue:s,it:c}=e,{opts:l,propertyName:u,topSchemaRef:d,schemaPath:p}=c;if(r.push([Ks.keyword,o],[Ks.params,typeof t=="function"?t(e):t||Ge._`{}`]),l.messages)r.push([Ks.message,typeof n=="function"?n(e):n]);if(l.verbose)r.push([Ks.schema,s],[Ks.parentSchema,Ge._`${d}${p}`],[Rn.default.data,i]);if(u)r.push([Ks.propertyName,u])}});var G4=x(function(F4){Object.defineProperty(F4,"__esModule",{value:!0});F4.boolOrEmptySchema=F4.topBoolOrEmptySchema=void 0;var sOe=Pp(),aOe=Ne(),cOe=Xr(),lOe={message:"boolean schema is false"};function uOe(e){let{gen:t,schema:n,validateName:r}=e;if(n===!1)U4(e,!1);else if(typeof n=="object"&&n.$async===!0)t.return(cOe.default.data);else t.assign(aOe._`${r}.errors`,null),t.return(!0)}F4.topBoolOrEmptySchema=uOe;function dOe(e,t){let{gen:n,schema:r}=e;if(r===!1)n.var(t,!1),U4(e);else n.var(t,!0)}F4.boolOrEmptySchema=dOe;function U4(e,t){let{gen:n,data:r}=e,o={gen:n,keyword:"false schema",data:r,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:e};(0,sOe.reportError)(o,lOe,void 0,t)}});var TO=x(function(H4){Object.defineProperty(H4,"__esModule",{value:!0});H4.getRules=H4.isJSONType=void 0;var gOe=["string","number","integer","boolean","null","object","array"],mOe=new Set(gOe);function hOe(e){return typeof e=="string"&&mOe.has(e)}H4.isJSONType=hOe;function AOe(){let e={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...e,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},e.number,e.string,e.array,e.object],post:{rules:[]},all:{},keywords:{}}}H4.getRules=AOe});var BO=x(function(Y4){Object.defineProperty(Y4,"__esModule",{value:!0});Y4.shouldUseRule=Y4.shouldUseGroup=Y4.schemaHasRulesForType=void 0;function yOe({schema:e,self:t},n){let r=t.RULES.types[n];return r&&r!==!0&&V4(e,r)}Y4.schemaHasRulesForType=yOe;function V4(e,t){return t.rules.some((n)=>K4(e,n))}Y4.shouldUseGroup=V4;function K4(e,t){var n;return e[t.keyword]!==void 0||((n=t.definition.implements)===null||n===void 0?void 0:n.some((r)=>e[r]!==void 0))}Y4.shouldUseRule=K4});var Rp=x(function(eZ){Object.defineProperty(eZ,"__esModule",{value:!0});eZ.reportTypeError=eZ.checkDataTypes=eZ.checkDataType=eZ.coerceAndCheckDataType=eZ.getJSONTypes=eZ.getSchemaTypes=eZ.DataType=void 0;var SOe=TO(),COe=BO(),vOe=Pp(),Le=Ne(),J4=$e(),al;(function(e){e[e.Correct=0]="Correct",e[e.Wrong=1]="Wrong"})(al||(eZ.DataType=al={}));function wOe(e){let t=Z4(e.type);if(t.includes("null")){if(e.nullable===!1)throw Error("type: null contradicts nullable: false")}else{if(!t.length&&e.nullable!==void 0)throw Error('"nullable" cannot be used without "type"');if(e.nullable===!0)t.push("null")}return t}eZ.getSchemaTypes=wOe;function Z4(e){let t=Array.isArray(e)?e:e?[e]:[];if(t.every(SOe.isJSONType))return t;throw Error("type must be JSONType or JSONType[]: "+t.join(","))}eZ.getJSONTypes=Z4;function EOe(e,t){let{gen:n,data:r,opts:o}=e,i=kOe(t,o.coerceTypes),s=t.length>0&&!(i.length===0&&t.length===1&&(0,COe.schemaHasRulesForType)(e,t[0]));if(s){let c=_O(t,r,o.strictNumbers,al.Wrong);n.if(c,()=>{if(i.length)xOe(e,t,i);else DO(e)})}return s}eZ.coerceAndCheckDataType=EOe;var X4=new Set(["string","number","integer","boolean","null"]);function kOe(e,t){return t?e.filter((n)=>X4.has(n)||t==="array"&&n==="array"):[]}function xOe(e,t,n){let{gen:r,data:o,opts:i}=e,s=r.let("dataType",Le._`typeof ${o}`),c=r.let("coerced",Le._`undefined`);if(i.coerceTypes==="array")r.if(Le._`${s} == 'object' && Array.isArray(${o}) && ${o}.length == 1`,()=>r.assign(o,Le._`${o}[0]`).assign(s,Le._`typeof ${o}`).if(_O(t,o,i.strictNumbers),()=>r.assign(c,o)));r.if(Le._`${c} !== undefined`);for(let u of n)if(X4.has(u)||u==="array"&&i.coerceTypes==="array")l(u);r.else(),DO(e),r.endIf(),r.if(Le._`${c} !== undefined`,()=>{r.assign(o,c),POe(e,c)});function l(u){switch(u){case"string":r.elseIf(Le._`${s} == "number" || ${s} == "boolean"`).assign(c,Le._`"" + ${o}`).elseIf(Le._`${o} === null`).assign(c,Le._`""`);return;case"number":r.elseIf(Le._`${s} == "boolean" || ${o} === null
7601
7578
  || (${s} == "string" && ${o} && ${o} == +${o})`).assign(c,Le._`+${o}`);return;case"integer":r.elseIf(Le._`${s} === "boolean" || ${o} === null
7602
7579
  || (${s} === "string" && ${o} && ${o} == +${o} && !(${o} % 1))`).assign(c,Le._`+${o}`);return;case"boolean":r.elseIf(Le._`${o} === "false" || ${o} === 0 || ${o} === null`).assign(c,!1).elseIf(Le._`${o} === "true" || ${o} === 1`).assign(c,!0);return;case"null":r.elseIf(Le._`${o} === "" || ${o} === 0 || ${o} === false`),r.assign(c,null);return;case"array":r.elseIf(Le._`${s} === "string" || ${s} === "number"