@sazabi/cli 0.13.17-dev.gd6a3649 → 0.13.17-dev.gf70548b

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 +9 -9
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6766,7 +6766,7 @@ When events are arriving, report back:
6766
6766
  - That events are landing, with payload fields preserved under \`webhook.*\`.
6767
6767
 
6768
6768
  Do not print \`PUBLIC_KEY\` (or the full keyed URL) in the summary.
6769
- `;var SD=()=>{};var TD,AD;var CD=g(()=>{UA();KA();GA();BA();HA();WA();XA();FA();VA();tC();oC();rC();cC();hC();uC();dC();yC();mC();vC();fC();OC();SC();TC();CC();DC();NC();jC();UC();KC();GC();BC();HC();WC();XC();FC();VC();tL();oL();rL();cL();hL();uL();dL();yL();mL();vL();fL();OL();SL();TL();CL();DL();NL();jL();UL();KL();GL();BL();HL();WL();XL();FL();VL();tD();oD();rD();cD();hD();uD();dD();yD();mD();vD();fD();OD();SD();TD={cloudflare:EA.trim(),cloudflare_workers:JA.trim(),cloudwatch:MA.trim(),convex:ZA.trim(),datadog:eC.trim(),daytona:iC.trim(),digital_ocean:sC.trim(),e2b:gC.trim(),elastic_cloud:pC.trim(),fluent_bit:kC.trim(),fly_io:PC.trim(),gcp:AC.trim(),grafana_alloy:zC.trim(),inngest:RC.trim(),langchain:xC.trim(),mastra:qC.trim(),neon:YC.trim(),netlify:QC.trim(),openrouter:nL.trim(),otel:aL.trim(),otel_collector:lL.trim(),otel_metrics:bL.trim(),plain:wL.trim(),posthog:$L.trim(),posthog_sdk:LL.trim(),porter:IL.trim(),prometheus:_L.trim(),railway:EL.trim(),render:JL.trim(),respan:ML.trim(),sentry:ZL.trim(),sentry_platform:eD.trim(),supabase:iD.trim(),temporal:sD.trim(),trigger_dev:gD.trim(),vector:pD.trim(),vercel:kD.trim(),webhook_events:PD.trim()},AD={cloudflare:xA.trim(),cloudflare_workers:qA.trim(),cloudwatch:YA.trim(),convex:QA.trim(),datadog:nC.trim(),daytona:aC.trim(),digital_ocean:lC.trim(),e2b:bC.trim(),elastic_cloud:wC.trim(),fluent_bit:IC.trim(),fly_io:$C.trim(),gcp:LC.trim(),grafana_alloy:_C.trim(),inngest:EC.trim(),langchain:JC.trim(),mastra:MC.trim(),neon:ZC.trim(),netlify:eL.trim(),openrouter:iL.trim(),otel:sL.trim(),otel_collector:gL.trim(),otel_metrics:pL.trim(),plain:kL.trim(),posthog:AL.trim(),posthog_sdk:zL.trim(),porter:PL.trim(),prometheus:RL.trim(),railway:xL.trim(),render:qL.trim(),respan:YL.trim(),sentry:QL.trim(),sentry_platform:nD.trim(),supabase:aD.trim(),temporal:lD.trim(),trigger_dev:bD.trim(),vector:wD.trim(),vercel:ID.trim(),webhook_events:$D.trim()}});var gv=(e)=>{let t=AD[e];if(t)return t;return TD[e]};var LD=g(()=>{CD()});var H="available";var Ee,zh=(e)=>[`Add the OpenTelemetry SDK to your ${e}. Most languages have official OpenTelemetry SDKs available (e.g., \`@opentelemetry/api\` for Node.js, \`opentelemetry-api\` for Python, etc.).`,`Initialize OpenTelemetry in your ${e}.`,`Set the following environment variables in your ${e} environment.`],_o=(e="http/protobuf")=>[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_ENDPOINT`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:e,copyLabel:"OTLP protocol"}],Nh;var pt=g(()=>{Ee={label:"Connect",pendingLabel:"Connecting..."},Nh={kind:"prose",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 dv,bv,yv;var DD=g(()=>{pt();dv={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Cloudflare token with Logpush permissions.",steps:[{kind:"prose",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions."},{kind:"prose",text:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."},{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"}]},{id:"credentials",title:"Enter credentials",description:"Enter your token and account ID.",steps:[{id:"token",kind:"secret",label:"Cloudflare API token",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",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:{connectionMode:"managed",cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudflare"},bv={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 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"}}}},yv={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",description:"Create an HTTP Logpush job in Cloudflare.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{kind:"prose",text:"Select **HTTP** as the destination type."}]},{id:"destination",section:"endpoint",title:"Copy destination URL",description:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}/v1/logs"}]},{id:"output-options",section:"config",title:"Set output options",description:"Use a timestamp format Sazabi can parse reliably.",steps:[{kind:"prose",text:"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 YQ,zD;var ND=g(()=>{DD();YQ=["cloudflareApiToken"],zD={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:YQ,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:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var pv;var _D=g(()=>{pv={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",description:"Add separate Cloudflare Workers Observability destinations for logs and traces.",steps:[{kind:"prose",text:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{kind:"prose",text:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"endpoint",title:"Configure logs destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for logs.",steps:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"OTLP logs endpoint",value:"https://${context.ingestHost}/v1/logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]},{id:"traces",section:"endpoint",title:"Configure traces destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for traces.",steps:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"OTLP traces endpoint",value:"https://${context.ingestHost}/v1/traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]},{id:"enable-worker",section:"config",title:"Enable destinations",description:"Opt each Worker into the destination names you created.",steps:[{kind:"prose",text:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{kind:"prose",text:"Redeploy the Worker after updating Wrangler config. The destination is enabled only after the deployed Worker references it by name."}]}]}});var jD;var RD=g(()=>{_D();jD={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var mv,wv,vv,kv,fv,Iv;var UD=g(()=>{pt();mv={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},wv={id:"role-arn",title:"Enter role ARN",description:"Enter the IAM Role ARN created by your selected setup method.",steps:[{id:"arn",kind:"text",label:"Role ARN",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"}]},vv={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}",connectionMode:"managed"},displayName:"AWS Account $validateRole.awsAccountId",button:Ee},kv={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:mv,steps:[{id:"prepare",title:"Launch stack",description:"Create the IAM role from Sazabi's CloudFormation template.",steps:[{kind:"prose",text:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"},{kind:"prose",text:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},wv],submit:vv}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Apply Terraform",description:"Add the IAM role and policy resources to your Terraform stack.",steps:[{kind:"prose",text:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
6769
+ `;var SD=()=>{};var TD,AD;var CD=g(()=>{UA();KA();GA();BA();HA();WA();XA();FA();VA();tC();oC();rC();cC();hC();uC();dC();yC();mC();vC();fC();OC();SC();TC();CC();DC();NC();jC();UC();KC();GC();BC();HC();WC();XC();FC();VC();tL();oL();rL();cL();hL();uL();dL();yL();mL();vL();fL();OL();SL();TL();CL();DL();NL();jL();UL();KL();GL();BL();HL();WL();XL();FL();VL();tD();oD();rD();cD();hD();uD();dD();yD();mD();vD();fD();OD();SD();TD={cloudflare:EA.trim(),cloudflare_workers:JA.trim(),cloudwatch:MA.trim(),convex:ZA.trim(),datadog:eC.trim(),daytona:iC.trim(),digital_ocean:sC.trim(),e2b:gC.trim(),elastic_cloud:pC.trim(),fluent_bit:kC.trim(),fly_io:PC.trim(),gcp:AC.trim(),grafana_alloy:zC.trim(),inngest:RC.trim(),langchain:xC.trim(),mastra:qC.trim(),neon:YC.trim(),netlify:QC.trim(),openrouter:nL.trim(),otel:aL.trim(),otel_collector:lL.trim(),otel_metrics:bL.trim(),plain:wL.trim(),posthog:$L.trim(),posthog_sdk:LL.trim(),porter:IL.trim(),prometheus:_L.trim(),railway:EL.trim(),render:JL.trim(),respan:ML.trim(),sentry:ZL.trim(),sentry_platform:eD.trim(),supabase:iD.trim(),temporal:sD.trim(),trigger_dev:gD.trim(),vector:pD.trim(),vercel:kD.trim(),webhook_events:PD.trim()},AD={cloudflare:xA.trim(),cloudflare_workers:qA.trim(),cloudwatch:YA.trim(),convex:QA.trim(),datadog:nC.trim(),daytona:aC.trim(),digital_ocean:lC.trim(),e2b:bC.trim(),elastic_cloud:wC.trim(),fluent_bit:IC.trim(),fly_io:$C.trim(),gcp:LC.trim(),grafana_alloy:_C.trim(),inngest:EC.trim(),langchain:JC.trim(),mastra:MC.trim(),neon:ZC.trim(),netlify:eL.trim(),openrouter:iL.trim(),otel:sL.trim(),otel_collector:gL.trim(),otel_metrics:pL.trim(),plain:kL.trim(),posthog:AL.trim(),posthog_sdk:zL.trim(),porter:PL.trim(),prometheus:RL.trim(),railway:xL.trim(),render:qL.trim(),respan:YL.trim(),sentry:QL.trim(),sentry_platform:nD.trim(),supabase:aD.trim(),temporal:lD.trim(),trigger_dev:bD.trim(),vector:wD.trim(),vercel:ID.trim(),webhook_events:$D.trim()}});var gv=(e)=>{let t=AD[e];if(t)return t;return TD[e]};var LD=g(()=>{CD()});var H="available";var Ee,zh=(e)=>[`Add the OpenTelemetry SDK to your ${e}. Most languages have official OpenTelemetry SDKs available (e.g., \`@opentelemetry/api\` for Node.js, \`opentelemetry-api\` for Python, etc.).`,`Initialize OpenTelemetry in your ${e}.`,`Set the following environment variables in your ${e} environment.`],_o=(e="http/protobuf")=>[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_ENDPOINT`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:e,copyLabel:"OTLP protocol"}],Nh;var pt=g(()=>{Ee={label:"Connect",pendingLabel:"Connecting..."},Nh={kind:"prose",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 dv,bv,yv;var DD=g(()=>{pt();dv={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Cloudflare token with Logpush permissions.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions."},{kind:"prose",text:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."},{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"}]},{id:"credentials",title:"Enter credentials",description:"Enter your token and account ID.",steps:[{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:{connectionMode:"managed",cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudflare"},bv={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 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"}}}},yv={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",description:"Create an HTTP Logpush job in Cloudflare.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{kind:"prose",text:"Select **HTTP** as the destination type."}]},{id:"destination",section:"endpoint",title:"Copy destination URL",description:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}/v1/logs"}]},{id:"output-options",section:"config",title:"Set output options",description:"Use a timestamp format Sazabi can parse reliably.",steps:[{kind:"prose",text:"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 YQ,zD;var ND=g(()=>{DD();YQ=["cloudflareApiToken"],zD={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:YQ,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:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var pv;var _D=g(()=>{pv={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",description:"Add separate Cloudflare Workers Observability destinations for logs and traces.",steps:[{kind:"prose",text:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{kind:"prose",text:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"endpoint",title:"Configure logs destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for logs.",steps:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"OTLP logs endpoint",value:"https://${context.ingestHost}/v1/logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]},{id:"traces",section:"endpoint",title:"Configure traces destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for traces.",steps:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"OTLP traces endpoint",value:"https://${context.ingestHost}/v1/traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]},{id:"enable-worker",section:"config",title:"Enable destinations",description:"Opt each Worker into the destination names you created.",steps:[{kind:"prose",text:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{kind:"prose",text:"Redeploy the Worker after updating Wrangler config. The destination is enabled only after the deployed Worker references it by name."}]}]}});var jD;var RD=g(()=>{_D();jD={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var mv,wv,vv,kv,fv,Iv;var UD=g(()=>{pt();mv={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},wv={id:"role-arn",title:"Enter role ARN",description:"Enter the IAM Role ARN created by your selected setup method.",steps:[{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"}]},vv={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}",connectionMode:"managed"},displayName:"AWS Account $validateRole.awsAccountId",button:Ee},kv={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:mv,steps:[{id:"prepare",title:"Launch stack",description:"Create the IAM role from Sazabi's CloudFormation template.",steps:[{kind:"prose",text:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"},{kind:"prose",text:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},wv],submit:vv}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Apply Terraform",description:"Add the IAM role and policy resources to your Terraform stack.",steps:[{kind:"prose",text:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
6770
6770
 
6771
6771
  resource "aws_iam_role" "sazabi_log_ingestion" {
6772
6772
  name = "SazabiLogIngestion"
@@ -6841,7 +6841,7 @@ service:
6841
6841
  pipelines:
6842
6842
  logs:
6843
6843
  receivers: [awscloudwatch]
6844
- exporters: [otlphttp]`},{kind:"prose",text:"Replace `YOUR_AWS_REGION` with the region your log groups live in, and list the log group names you want to forward under `groups.named`. The key is embedded in the endpoint hostname, so no OTLP auth header is required."}]},{id:"run",section:"verify",title:"Run and verify",description:"Deploy the collector and generate logs in the AWS account.",steps:[{kind:"prose",text:"After the collector is running, write a new log event in one of the forwarded log groups and check the collector logs for export errors. Logs should appear in Sazabi within a few minutes."}]}]}});var XQ,ED;var KD=g(()=>{UD();XQ=["externalId"],ED={id:"cloudwatch",name:"CloudWatch",searchAliases:["aws","amazon","amazon web services","amazon cloudwatch"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,requiresConnectionPublicKey:!0,sensitiveFields:XQ,subtitle:"Stream your AWS CloudWatch logs directly to Sazabi for real-time analysis and alerting.",features:["Log forwarding","Real-time streaming","Multi-region support"],evidenceHints:["AWS ECS, Lambda, CloudFormation, CDK, SAM, Serverless, or Terraform AWS resources","CloudWatch log group names, awslogs drivers, or logs:* IAM permissions","AWS_REGION/AWS_DEFAULT_REGION environment variables with runtime logging to CloudWatch"],setupSkill:H,dashboard:{iconKey:"cloudwatch",intakeSourceId:"cloudwatch",streamSelectorLayout:"sidepanel",connectionMetadataSection:{title:"AWS account details",description:"The AWS account and IAM role used for log ingestion.",fields:[{key:"awsAccountId",label:"AWS account ID",description:"AWS account connected to this data source."},{key:"roleArn",label:"IAM role ARN",description:"IAM role Sazabi assumes for log ingestion."}]},actions:{submit:{validate:{kind:"source-action",actionId:"validate-role"}},list:{list:{kind:"source-action",actionId:"list-log-groups",itemsField:"logGroups"}},prefetch:{prefetch:{kind:"source-action",actionId:"get-setup-info"}}}}}});var Ov,Pv,Sv;var xD=g(()=>{pt();Ov={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",description:"Enter a Convex team access token.",steps:[{kind:"prose",text:"You can create one in your [Convex dashboard team settings](https://dashboard.convex.dev)."},{id:"token",kind:"secret",label:"Team access token",placeholder:"eyJ..."}]},{id:"team",title:"Choose team",description:"Select the Convex team whose deployments Sazabi should list.",steps:[{id:"team",kind:"select",label:"Team",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{connectionMode:"managed",accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:Ee}},Pv={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",description:"Add a webhook log stream in the Convex dashboard.",steps:[{kind:"note",variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."},{kind:"prose",text:"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."},{kind:"prose",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:"endpoint",title:"Copy webhook URL",description:"Paste your Sazabi intake URL (above) into the webhook configuration.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key is embedded in the hostname, so the webhook needs no custom headers."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Sv={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 ZQ,GD;var JD=g(()=>{xD();ZQ=["accessToken"],GD={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:ZQ,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:H,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 $v;var BD=g(()=>{$v={kind:"choice",perStreamInstructions:!0,title:"Choose Agent configuration",description:"Choose whether this Datadog Agent should dual-ship to Datadog and Sazabi or send only to Sazabi.",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.",flow:{groups:[{id:"values",title:"Copy Sazabi values",description:"Use this host in `logs_config.additional_endpoints`.",steps:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host"}]},{id:"configure",title:"Apply `datadog.yaml` config",description:"Add Sazabi as an additional endpoint without changing the Agent's root Datadog API key.",steps:[{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
6844
+ exporters: [otlphttp]`},{kind:"prose",text:"Replace `YOUR_AWS_REGION` with the region your log groups live in, and list the log group names you want to forward under `groups.named`. The key is embedded in the endpoint hostname, so no OTLP auth header is required."}]},{id:"run",section:"verify",title:"Run and verify",description:"Deploy the collector and generate logs in the AWS account.",steps:[{kind:"prose",text:"After the collector is running, write a new log event in one of the forwarded log groups and check the collector logs for export errors. Logs should appear in Sazabi within a few minutes."}]}]}});var XQ,ED;var KD=g(()=>{UD();XQ=["externalId"],ED={id:"cloudwatch",name:"CloudWatch",searchAliases:["aws","amazon","amazon web services","amazon cloudwatch"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,requiresConnectionPublicKey:!0,sensitiveFields:XQ,subtitle:"Stream your AWS CloudWatch logs directly to Sazabi for real-time analysis and alerting.",features:["Log forwarding","Real-time streaming","Multi-region support"],evidenceHints:["AWS ECS, Lambda, CloudFormation, CDK, SAM, Serverless, or Terraform AWS resources","CloudWatch log group names, awslogs drivers, or logs:* IAM permissions","AWS_REGION/AWS_DEFAULT_REGION environment variables with runtime logging to CloudWatch"],setupSkill:H,dashboard:{iconKey:"cloudwatch",intakeSourceId:"cloudwatch",streamSelectorLayout:"sidepanel",connectionMetadataSection:{title:"AWS account details",description:"The AWS account and IAM role used for log ingestion.",fields:[{key:"awsAccountId",label:"AWS account ID",description:"AWS account connected to this data source."},{key:"roleArn",label:"IAM role ARN",description:"IAM role Sazabi assumes for log ingestion."}]},actions:{submit:{validate:{kind:"source-action",actionId:"validate-role"}},list:{list:{kind:"source-action",actionId:"list-log-groups",itemsField:"logGroups"}},prefetch:{prefetch:{kind:"source-action",actionId:"get-setup-info"}}}}}});var Ov,Pv,Sv;var xD=g(()=>{pt();Ov={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",description:"Enter a Convex team access token.",steps:[{kind:"prose",text:"You can create one 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",description:"Select the Convex team whose deployments Sazabi should list.",steps:[{id:"team",kind:"select",label:"Team",instruction:"Select your team below.",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{connectionMode:"managed",accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:Ee}},Pv={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",description:"Add a webhook log stream in the Convex dashboard.",steps:[{kind:"note",variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."},{kind:"prose",text:"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."},{kind:"prose",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:"endpoint",title:"Copy webhook URL",description:"Paste your Sazabi intake URL (above) into the webhook configuration.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key is embedded in the hostname, so the webhook needs no custom headers."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Sv={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 ZQ,GD;var JD=g(()=>{xD();ZQ=["accessToken"],GD={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:ZQ,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:H,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 $v;var BD=g(()=>{$v={kind:"choice",perStreamInstructions:!0,title:"Choose Agent configuration",description:"Choose whether this Datadog Agent should dual-ship to Datadog and Sazabi or send only to Sazabi.",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.",flow:{groups:[{id:"values",title:"Copy Sazabi values",description:"Use this host in `logs_config.additional_endpoints`.",steps:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host"}]},{id:"configure",title:"Apply `datadog.yaml` config",description:"Add Sazabi as an additional endpoint without changing the Agent's root Datadog API key.",steps:[{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
6845
6845
  logs_enabled: true
6846
6846
 
6847
6847
  # Send a copy of logs to Sazabi while the primary Agent config
@@ -6864,7 +6864,7 @@ DD_API_KEY=any-non-empty-value
6864
6864
  DD_LOGS_ENABLED=true
6865
6865
  DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
6866
6866
  DD_LOGS_CONFIG_LOGS_DD_URL=https://\${context.ingestHost}
6867
- DD_LOGS_CONFIG_FORCE_USE_HTTP=true`}]},{id:"restart",title:"Restart and verify",description:"Redeploy the ECS task definition after changing the sidecar environment.",steps:[{kind:"prose",text:"Redeploy the ECS task definition so the sidecar picks up the new environment."},{kind:"note",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."},{kind:"note",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 qD;var HD=g(()=>{BD();qD={id:"datadog",name:"Datadog Agent",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"datadog",intakeSourceId:"datadog"}}});var Tv;var MD=g(()=>{Tv={groups:[{id:"open-settings",section:"config",title:"Open OpenTelemetry card",description:"Find the organization-level OpenTelemetry settings in Daytona.",steps:[{kind:"note",variant:"requirement",text:"The OpenTelemetry card is visible to organization owners only."},{kind:"prose",text:"Open the [Daytona dashboard](https://app.daytona.io), choose your organization, open **Settings**, and find the **OpenTelemetry** card."}]},{id:"values",section:"endpoint",title:"Copy OTLP values",description:"Set the endpoint on the Daytona OpenTelemetry card. The key is embedded in the URL, so no authorization header is needed.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}"}]},{id:"save",section:"verify",title:"Save and verify",description:"Restart or start a sandbox so Daytona exports fresh telemetry.",steps:[{kind:"prose",text:"Save the OpenTelemetry card, then restart or start a sandbox. Sandboxes begin exporting telemetry automatically on their next start with no per-sandbox change required."},{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."]}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/daytona"}});var WD;var YD=g(()=>{MD();WD={id:"daytona",name:"Daytona",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"daytona",intakeSourceId:"daytona"}}});var Av,Cv,Lv;var XD=g(()=>{pt();Av={kind:"multi-step",steps:[{id:"prepare",title:"Create access token",description:"Create a DigitalOcean token with App Platform permissions.",steps:[{kind:"prose",text:"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",description:"Enter your personal access token.",steps:[{id:"token",kind:"secret",label:"Personal access token",placeholder:"dop_v1_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"}}],metadata:{connectionMode:"managed",apiToken:"$token"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/digitalocean"},Cv={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/digital-ocean",groups:[{id:"open-log-forwarding",section:"config",title:"Open Log Forwarding",description:"Add a Datadog log destination to your App Platform app.",steps:[{kind:"prose",text:"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`."},{kind:"prose",text:"Log destinations are configured **per app** and attach to each service, worker, and job. Repeat this setup for every app you want to forward. To add forwarding across an app in one step from a picker, connect your DigitalOcean account instead."},{kind:"note",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:"endpoint",title:"Copy Datadog destination values",description:"Paste these into the Datadog log destination fields.",steps:[{kind:"copyable",label:"Datadog endpoint (API URL)",value:"https://${context.ingestHost}",copyLabel:"DigitalOcean Datadog endpoint"},{kind:"copyable",label:"Datadog API key",value:"${context.publicKey}",copyLabel:"Sazabi public key",description:"App Platform requires a Datadog API key field. Paste your Sazabi public key here — the key embedded in the endpoint hostname is what actually authenticates the stream."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"Save the log destination, then trigger activity — deploy the app or hit one of its routes. Logs appear in Sazabi within a few minutes."}]}]},Lv={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 FQ,ZD;var FD=g(()=>{XD();FQ=["apiToken"],ZD={id:"digital_ocean",name:"DigitalOcean",searchAliases:["digital ocean","do"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:FQ,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:H,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 QD,Dv;var VD=g(()=>{QD=[{kind:"copyable",label:"`SAZABI_INTAKE_URL`",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Intake URL"}],Dv={kind:"choice",title:"Choose E2B SDK",description:"Pick the SDK your sandbox code runs on.",options:[{id:"typescript",label:"TypeScript",description:"Use the E2B TypeScript SDK and OpenTelemetry logs exporter.",flow:{groups:[{id:"values",title:"Copy environment variables",description:"Set these values in the application that creates E2B sandboxes.",steps:QD},{id:"instrument",title:"Instrument sandbox logs",description:"Emit sandbox stdout and stderr through the OpenTelemetry logs SDK.",steps:[{kind:"code",label:"TypeScript SDK integration",language:"typescript",copyLabel:"TypeScript code",value:`import { Sandbox } from '@e2b/code-interpreter'
6867
+ DD_LOGS_CONFIG_FORCE_USE_HTTP=true`}]},{id:"restart",title:"Restart and verify",description:"Redeploy the ECS task definition after changing the sidecar environment.",steps:[{kind:"prose",text:"Redeploy the ECS task definition so the sidecar picks up the new environment."},{kind:"note",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."},{kind:"note",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 qD;var HD=g(()=>{BD();qD={id:"datadog",name:"Datadog Agent",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"datadog",intakeSourceId:"datadog"}}});var Tv;var MD=g(()=>{Tv={groups:[{id:"open-settings",section:"config",title:"Open OpenTelemetry card",description:"Find the organization-level OpenTelemetry settings in Daytona.",steps:[{kind:"note",variant:"requirement",text:"The OpenTelemetry card is visible to organization owners only."},{kind:"prose",text:"Open the [Daytona dashboard](https://app.daytona.io), choose your organization, open **Settings**, and find the **OpenTelemetry** card."}]},{id:"values",section:"endpoint",title:"Copy OTLP values",description:"Set the endpoint on the Daytona OpenTelemetry card. The key is embedded in the URL, so no authorization header is needed.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}"}]},{id:"save",section:"verify",title:"Save and verify",description:"Restart or start a sandbox so Daytona exports fresh telemetry.",steps:[{kind:"prose",text:"Save the OpenTelemetry card, then restart or start a sandbox. Sandboxes begin exporting telemetry automatically on their next start with no per-sandbox change required."},{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."]}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/daytona"}});var WD;var YD=g(()=>{MD();WD={id:"daytona",name:"Daytona",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"daytona",intakeSourceId:"daytona"}}});var Av,Cv,Lv;var XD=g(()=>{pt();Av={kind:"multi-step",steps:[{id:"prepare",title:"Create access token",description:"Create a DigitalOcean token with App Platform permissions.",steps:[{kind:"prose",text:"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",description:"Enter your personal access token.",steps:[{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:{connectionMode:"managed",apiToken:"$token"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/digitalocean"},Cv={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/digital-ocean",groups:[{id:"open-log-forwarding",section:"config",title:"Open Log Forwarding",description:"Add a Datadog log destination to your App Platform app.",steps:[{kind:"prose",text:"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`."},{kind:"prose",text:"Log destinations are configured **per app** and attach to each service, worker, and job. Repeat this setup for every app you want to forward. To add forwarding across an app in one step from a picker, connect your DigitalOcean account instead."},{kind:"note",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:"endpoint",title:"Copy Datadog destination values",description:"Paste these into the Datadog log destination fields.",steps:[{kind:"copyable",label:"Datadog endpoint (API URL)",value:"https://${context.ingestHost}",copyLabel:"DigitalOcean Datadog endpoint"},{kind:"copyable",label:"Datadog API key",value:"${context.publicKey}",copyLabel:"Sazabi public key",description:"App Platform requires a Datadog API key field. Paste your Sazabi public key here — the key embedded in the endpoint hostname is what actually authenticates the stream."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"Save the log destination, then trigger activity — deploy the app or hit one of its routes. Logs appear in Sazabi within a few minutes."}]}]},Lv={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 FQ,ZD;var FD=g(()=>{XD();FQ=["apiToken"],ZD={id:"digital_ocean",name:"DigitalOcean",searchAliases:["digital ocean","do"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:FQ,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:H,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 QD,Dv;var VD=g(()=>{QD=[{kind:"copyable",label:"`SAZABI_INTAKE_URL`",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Intake URL"}],Dv={kind:"choice",title:"Choose E2B SDK",description:"Pick the SDK your sandbox code runs on.",options:[{id:"typescript",label:"TypeScript",description:"Use the E2B TypeScript SDK and OpenTelemetry logs exporter.",flow:{groups:[{id:"values",title:"Copy environment variables",description:"Set these values in the application that creates E2B sandboxes.",steps:QD},{id:"instrument",title:"Instrument sandbox logs",description:"Emit sandbox stdout and stderr through the OpenTelemetry logs SDK.",steps:[{kind:"code",label:"TypeScript SDK integration",language:"typescript",copyLabel:"TypeScript code",value:`import { Sandbox } from '@e2b/code-interpreter'
6868
6868
  import { logs, SeverityNumber } from '@opentelemetry/api-logs'
6869
6869
  import { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'
6870
6870
  import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'
@@ -7073,7 +7073,7 @@ output {
7073
7073
  port 443
7074
7074
  logs_uri /v1/logs
7075
7075
  tls on
7076
- tls.verify on`}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart Fluent Bit after changing the output configuration.",steps:[{kind:"prose",text:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity."},{kind:"note",text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}});var az;var cz=g(()=>{rz();az={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var _v,jv,Rv;var sz=g(()=>{pt();_v={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a read-only Fly.io organization token.",steps:[{kind:"prose",text:"From the CLI: `flyctl tokens create readonly -o <org-slug>`."},{kind:"prose",text:"Or open the org's Tokens tab in the [Fly.io dashboard](https://fly.io/dashboard) and create a read-only token."}]},{id:"credentials",title:"Enter credentials",description:"Enter the token and organization slug Sazabi should use.",steps:[{id:"token",kind:"secret",label:"API token",placeholder:"FlyV1 ..."},{id:"orgSlug",kind:"text",label:"Organization slug",placeholder:"personal"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{dataSourceType:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{connectionMode:"managed",apiToken:"$token",organizationSlug:"$orgSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},jv={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.",steps:[{kind:"note",text:"Fly forwards logs from its internal NATS log stream, so you deploy a shipper into 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."},{kind:"prose",text:"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:"endpoint",title:"Set the shipper secrets",description:"Paste these into the fly-log-shipper app (Option A). The `/fly-log-shipper` path tells Sazabi to parse Fly's native event format.",steps:[{kind:"copyable",label:"`HTTP_URL`",value:"https://${context.ingestHost}/fly-log-shipper",description:"The `/fly-log-shipper` path suffix is required — it routes the payload to the Fly event parser."},{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}"'},{kind:"note",text:"**Option B (dedicated OTLP shipper)** uses the endpoint below instead of the two secrets above: POST OTLP `resourceLogs` here with the same public key as a bearer token. The full `Dockerfile` and `vector.toml` are in the setup guide."},{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs",description:"POST OTLP `resourceLogs` here, with your Sazabi public key as a bearer token."}]},{id:"verify",section:"verify",title:"Deploy and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Rv={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 QQ,hz;var lz=g(()=>{sz();QQ=["apiToken"],hz={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:QQ,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:H,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"dataSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Uv,Ev,Kv;var uz=g(()=>{pt();Uv={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.",steps:[{kind:"prose",text:"Provide a GCP service account key with permissions to enable APIs and create log sinks, Pub/Sub topics, and pull subscriptions."},{kind:"prose",text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."},{kind:"prose",text:"The service account needs the following roles on the target GCP project(s):"},{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"prose",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:"prose",text:"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`."},{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}]},{id:"credentials",title:"Enter service account key",description:"Enter the service account JSON so Sazabi can validate it.",steps:[{id:"key",kind:"secret",label:"Service account key (JSON)",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",connectionMode:"managed"},displayName:"GCP $validateKey.projectId",button:Ee}}},{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"},Ev={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"}}}},Kv={groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",steps:[{kind:"note",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`)."},{kind:"note",text:"To forward Google Cloud Logging data to Sazabi, create a log sink that routes logs to a Pub/Sub topic, then deploy an OpenTelemetry Collector with a `googlecloudpubsub` receiver that subscribes to that topic and exports to Sazabi."},{kind:"ordered-steps",items:["Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`).","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.","Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution.","Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use these values in the collector exporter configuration.",steps:[{kind:"copyable",label:"`OTLP endpoint`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"}]},{id:"collector",section:"config",title:"Configure collector",description:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",steps:[{kind:"note",variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."},{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
7076
+ tls.verify on`}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart Fluent Bit after changing the output configuration.",steps:[{kind:"prose",text:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity."},{kind:"note",text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}});var az;var cz=g(()=>{rz();az={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var _v,jv,Rv;var sz=g(()=>{pt();_v={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a read-only Fly.io organization token.",steps:[{kind:"prose",text:"From the CLI: `flyctl tokens create readonly -o <org-slug>`."},{kind:"prose",text:"Or open the org's Tokens tab in the [Fly.io dashboard](https://fly.io/dashboard) and create a read-only token."}]},{id:"credentials",title:"Enter credentials",description:"Enter the token and organization slug Sazabi should use.",steps:[{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:{dataSourceType:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{connectionMode:"managed",apiToken:"$token",organizationSlug:"$orgSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},jv={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.",steps:[{kind:"note",text:"Fly forwards logs from its internal NATS log stream, so you deploy a shipper into 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."},{kind:"prose",text:"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:"endpoint",title:"Set the shipper secrets",description:"Paste these into the fly-log-shipper app (Option A). The `/fly-log-shipper` path tells Sazabi to parse Fly's native event format.",steps:[{kind:"copyable",label:"`HTTP_URL`",value:"https://${context.ingestHost}/fly-log-shipper",description:"The `/fly-log-shipper` path suffix is required — it routes the payload to the Fly event parser."},{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}"'},{kind:"note",text:"**Option B (dedicated OTLP shipper)** uses the endpoint below instead of the two secrets above: POST OTLP `resourceLogs` here with the same public key as a bearer token. The full `Dockerfile` and `vector.toml` are in the setup guide."},{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs",description:"POST OTLP `resourceLogs` here, with your Sazabi public key as a bearer token."}]},{id:"verify",section:"verify",title:"Deploy and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Rv={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 QQ,hz;var lz=g(()=>{sz();QQ=["apiToken"],hz={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:QQ,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:H,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"dataSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Uv,Ev,Kv;var uz=g(()=>{pt();Uv={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.",steps:[{kind:"prose",text:"Provide a GCP service account key with permissions to enable APIs and create log sinks, Pub/Sub topics, and pull subscriptions."},{kind:"note",text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."},{kind:"prose",text:"The service account needs the following roles on the target GCP project(s):"},{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"note",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:"prose",text:"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`."},{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}]},{id:"credentials",title:"Enter service account key",description:"Enter the service account JSON so Sazabi can validate it.",steps:[{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",connectionMode:"managed"},displayName:"GCP $validateKey.projectId",button:Ee}}},{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"},Ev={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"}}}},Kv={groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",steps:[{kind:"note",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`)."},{kind:"note",text:"To forward Google Cloud Logging data to Sazabi, create a log sink that routes logs to a Pub/Sub topic, then deploy an OpenTelemetry Collector with a `googlecloudpubsub` receiver that subscribes to that topic and exports to Sazabi."},{kind:"ordered-steps",items:["Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`).","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.","Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution.","Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use these values in the collector exporter configuration.",steps:[{kind:"copyable",label:"`OTLP endpoint`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"}]},{id:"collector",section:"config",title:"Configure collector",description:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",steps:[{kind:"note",variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."},{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
7077
7077
  googlecloudlogentry_encoding:
7078
7078
 
7079
7079
  receivers:
@@ -7215,7 +7215,7 @@ service:
7215
7215
  traces:
7216
7216
  receivers: [otlp]
7217
7217
  processors: [batch]
7218
- exporters: [otlphttp/sazabi]`}]}]},{id:"adjust-pipelines",section:"config",title:"Adjust pipelines",description:"Match the receivers to the sources you have configured.",steps:[{kind:"note",text:"The `filelog` receiver collects container logs on Kubernetes; the `otlp` receiver accepts spans from instrumented services."}]}]}});var Kz;var xz=g(()=>{Ez();Kz={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.",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:H,dashboard:{iconKey:"otel-collector",intakeSourceId:"otel-collector"}}});var Xv;var Gz=g(()=>{Xv={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",description:"Configure your application or OpenTelemetry Collector to export OTLP metrics to Sazabi.",steps:[{kind:"note",text:"These variables work with any OpenTelemetry SDK or Collector that exports OTLP metrics."},{kind:"note",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."},{kind:"ordered-steps",items:["Add or enable the OpenTelemetry metrics SDK in your application, or configure the OTLP metrics exporter on your OpenTelemetry Collector.","Point the OTLP metrics exporter at the Sazabi endpoint in the next step.","Set the environment variables so the exporter sends metrics to Sazabi."]}]},{id:"environment",section:"endpoint",title:"Copy OTLP metrics environment",description:"Set these variables in the environment that runs your application or Collector.",steps:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`",value:"https://${context.ingestHost}/v1/metrics",copyLabel:"OTLP metrics endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart the application or Collector so the OpenTelemetry exporter reads the new variables.",steps:[{kind:"prose",text:"Restart or redeploy, then generate a metric to confirm Sazabi receives it as a log record."}]}]}});var Jz;var Bz=g(()=>{Gz();Jz={id:"otel_metrics",name:"OpenTelemetry Metrics",searchAliases:["otel metrics","opentelemetry metrics","otlp metrics","metrics as logs"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{slug:"opentelemetry-metrics",iconKey:"opentelemetry-metrics",intakeSourceId:"otel-metrics"}}});var Zv,Fv,Qv;var qz=g(()=>{pt();Zv={kind:"multi-step",steps:[{id:"prepare",title:"Create API key",description:"Create a Plain API key with webhook permissions.",steps:[{kind:"prose",text:"In Plain, open **Settings → API keys** and create a machine user API key."},{kind:"prose",text:"Grant the key these permissions: `webhookTarget:create`, `webhookTarget:edit`, `webhookTarget:delete`, `webhookTarget:read`, and `subscriptionEventTypes:read`. Workspace read access is included with every key."},{kind:"external-link",label:"Open Plain API key settings",href:"https://app.plain.com/settings/api-keys"}]},{id:"credentials",title:"Enter API key",description:"Enter the API key so Sazabi can validate workspace access.",steps:[{id:"apiKey",kind:"secret",label:"Plain API key",description:"Machine user API key with webhookTarget and subscriptionEventTypes permissions.",placeholder:"plainApiKey_..."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{apiKey:"$apiKey"},resultAs:"workspace"}],metadata:{connectionMode:"managed",plainApiKey:"$apiKey"},displayName:"$workspace.workspaceName",button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/plain"},Fv={groups:[{id:"open-webhooks",section:"config",title:"Open Plain webhooks",description:"Add a webhook target in the Plain dashboard.",steps:[{kind:"prose",text:"In your [Plain workspace](https://app.plain.com/settings/webhooks), go to **Settings > Webhooks** and click **Create webhook target**."},{kind:"note",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:"endpoint",title:"Copy webhook URL",description:"Paste your Sazabi intake URL (above) into the webhook target configuration.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key is embedded in the hostname, so the webhook needs no custom headers or query parameters."},{kind:"prose",text:"Enable the target and select the event types you want to forward."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Qv={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 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 t9,Hz;var Mz=g(()=>{qz();t9=["plainApiKey"],Hz={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:t9,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:H,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 Vv;var Wz=g(()=>{Vv={groups:[{id:"send-telemetry",section:"config",title:"Send OpenTelemetry",description:"Export OTLP telemetry to Sazabi from your Porter app or a collector running in Porter.",steps:[{kind:"prose",text:"Porter does not provide a generic log drain. Send OTLP telemetry to Sazabi directly from your app, or from a collector running in Porter."},{kind:"external-link",label:"Open Porter dashboard",href:"https://dashboard.porter.run"},{kind:"ordered-steps",items:["Add the environment variables below to the Porter service you want to monitor. You can also put shared values in a Porter environment group.","For Node.js apps, add an `instrumentation.cjs` (below) and load it from your start command with `NODE_OPTIONS='--require ./instrumentation.cjs' <start command>`. For other runtimes, initialize OpenTelemetry before the app handles requests, or run an OpenTelemetry Collector, Vector, or Fluent Bit service in Porter.","Redeploy the Porter service, then generate a request or test log line.","Return to Sazabi and check for incoming logs or traces. If nothing appears, check the Porter logs for OpenTelemetry exporter errors."]}]},{id:"configure-exporter",section:"config",title:"Configure the exporter",description:"Set the OTLP environment variables and initialize the OpenTelemetry SDK.",steps:[{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}
7218
+ exporters: [otlphttp/sazabi]`}]}]},{id:"adjust-pipelines",section:"config",title:"Adjust pipelines",description:"Match the receivers to the sources you have configured.",steps:[{kind:"note",text:"The `filelog` receiver collects container logs on Kubernetes; the `otlp` receiver accepts spans from instrumented services."}]}]}});var Kz;var xz=g(()=>{Ez();Kz={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.",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:H,dashboard:{iconKey:"otel-collector",intakeSourceId:"otel-collector"}}});var Xv;var Gz=g(()=>{Xv={perStreamInstructions:!0,groups:[{id:"instrument",section:"config",title:"Instrument application",description:"Configure your application or OpenTelemetry Collector to export OTLP metrics to Sazabi.",steps:[{kind:"note",text:"These variables work with any OpenTelemetry SDK or Collector that exports OTLP metrics."},{kind:"note",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."},{kind:"ordered-steps",items:["Add or enable the OpenTelemetry metrics SDK in your application, or configure the OTLP metrics exporter on your OpenTelemetry Collector.","Point the OTLP metrics exporter at the Sazabi endpoint in the next step.","Set the environment variables so the exporter sends metrics to Sazabi."]}]},{id:"environment",section:"endpoint",title:"Copy OTLP metrics environment",description:"Set these variables in the environment that runs your application or Collector.",steps:[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`",value:"https://${context.ingestHost}/v1/metrics",copyLabel:"OTLP metrics endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:"http/protobuf",copyLabel:"OTLP protocol"}]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart the application or Collector so the OpenTelemetry exporter reads the new variables.",steps:[{kind:"prose",text:"Restart or redeploy, then generate a metric to confirm Sazabi receives it as a log record."}]}]}});var Jz;var Bz=g(()=>{Gz();Jz={id:"otel_metrics",name:"OpenTelemetry Metrics",searchAliases:["otel metrics","opentelemetry metrics","otlp metrics","metrics as logs"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{slug:"opentelemetry-metrics",iconKey:"opentelemetry-metrics",intakeSourceId:"otel-metrics"}}});var Zv,Fv,Qv;var qz=g(()=>{pt();Zv={kind:"multi-step",steps:[{id:"prepare",title:"Create API key",description:"Create a Plain API key with webhook permissions.",steps:[{kind:"prose",text:"In Plain, open **Settings → API keys** and create a machine user API key."},{kind:"prose",text:"Grant the key these permissions: `webhookTarget:create`, `webhookTarget:edit`, `webhookTarget:delete`, `webhookTarget:read`, and `subscriptionEventTypes:read`. Workspace read access is included with every key."},{kind:"external-link",label:"Open Plain API key settings",href:"https://app.plain.com/settings/api-keys"}]},{id:"credentials",title:"Enter API key",description:"Enter the API key so Sazabi can validate workspace access.",steps:[{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:{connectionMode:"managed",plainApiKey:"$apiKey"},displayName:"$workspace.workspaceName",button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/plain"},Fv={groups:[{id:"open-webhooks",section:"config",title:"Open Plain webhooks",description:"Add a webhook target in the Plain dashboard.",steps:[{kind:"prose",text:"In your [Plain workspace](https://app.plain.com/settings/webhooks), go to **Settings > Webhooks** and click **Create webhook target**."},{kind:"note",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:"endpoint",title:"Copy webhook URL",description:"Paste your Sazabi intake URL (above) into the webhook target configuration.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key is embedded in the hostname, so the webhook needs no custom headers or query parameters."},{kind:"prose",text:"Enable the target and select the event types you want to forward."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"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"},Qv={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 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 t9,Hz;var Mz=g(()=>{qz();t9=["plainApiKey"],Hz={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:t9,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:H,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 Vv;var Wz=g(()=>{Vv={groups:[{id:"send-telemetry",section:"config",title:"Send OpenTelemetry",description:"Export OTLP telemetry to Sazabi from your Porter app or a collector running in Porter.",steps:[{kind:"prose",text:"Porter does not provide a generic log drain. Send OTLP telemetry to Sazabi directly from your app, or from a collector running in Porter."},{kind:"external-link",label:"Open Porter dashboard",href:"https://dashboard.porter.run"},{kind:"ordered-steps",items:["Add the environment variables below to the Porter service you want to monitor. You can also put shared values in a Porter environment group.","For Node.js apps, add an `instrumentation.cjs` (below) and load it from your start command with `NODE_OPTIONS='--require ./instrumentation.cjs' <start command>`. For other runtimes, initialize OpenTelemetry before the app handles requests, or run an OpenTelemetry Collector, Vector, or Fluent Bit service in Porter.","Redeploy the Porter service, then generate a request or test log line.","Return to Sazabi and check for incoming logs or traces. If nothing appears, check the Porter logs for OpenTelemetry exporter errors."]}]},{id:"configure-exporter",section:"config",title:"Configure the exporter",description:"Set the OTLP environment variables and initialize the OpenTelemetry SDK.",steps:[{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}
7219
7219
  OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
7220
7220
  OTEL_SERVICE_NAME=$PORTER_APP_SERVICE_NAME
7221
7221
  OTEL_RESOURCE_ATTRIBUTES=service.version=$PORTER_IMAGE_TAG,porter.revision=$PORTER_POD_REVISION,porter.pod.name=$PORTER_POD_NAME`,copyLabel:"Porter environment variables"},{kind:"code-tabs",label:"Install the OpenTelemetry SDK",description:"Install the SDK if your app does not already initialize OpenTelemetry. Node.js apps then add the `instrumentation.cjs` shown below.",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
@@ -7249,7 +7249,7 @@ try {
7249
7249
  });
7250
7250
  } catch (err) {
7251
7251
  console.error("OpenTelemetry initialization failed", err);
7252
- }`,copyLabel:"Node.js instrumentation.cjs",collapsible:!0},{kind:"prose",text:"Load `instrumentation.cjs` from your **start command** only, for example `NODE_OPTIONS='--require ./instrumentation.cjs' node server.js`. Do not set a global `NODE_OPTIONS` environment variable: it also applies during build and install, where the relative `--require` path resolves from inside `node_modules/<pkg>/` and breaks dependency postinstall scripts. If your platform forces an env var, use an absolute path such as `--require /workspace/instrumentation.cjs`."}]}]}});var Yz;var Xz=g(()=>{Wz();Yz={id:"porter",name:"Porter",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleEligible:!1,lifecycleSkipReason:"Manual OTEL setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward your Porter application logs and traces directly to Sazabi for real-time monitoring.",features:["Application logs","Deployment logs","Service monitoring"],evidenceHints:["porter.yaml or .github/workflows/porter.yml","PORTER_* environment variables","README/docs naming Porter (porter.run) as the deploy host"],setupSkill:H,dashboard:{iconKey:"porter",intakeSourceId:"porter"}}});var ek,n9,tk,nk;var Zz=g(()=>{pt();ek={kind:"multi-step",steps:[{id:"prepare",title:"Create key",description:"Create a PostHog personal API key with the required scopes.",steps:[{kind:"prose",text:"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:"prose",text:"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",description:"Enter the API key so Sazabi can validate the organization.",steps:[{id:"token",kind:"secret",label:"Personal API key",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",connectionMode:"managed"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/posthog"},n9=[{field:"name",header:"Project"},{field:"organizationName",header:"Organization",width:"w-48",transform:"fallback: - "}],tk={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:n9,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"}}}},nk={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/posthog",groups:[{id:"prepare",section:"config",title:"Open destination form",description:"Create an HTTP Webhook destination in PostHog.",steps:[{kind:"prose",text:"Configure an [HTTP Webhook destination](https://${context.posthogRegion}.posthog.com/pipeline/new/hog-template-webhook) in PostHog under **Data Pipeline > Destinations**."},{kind:"prose",text:"Use the values in the next step and set your webhook body template to the default event and person payload."}]},{id:"values",section:"endpoint",title:"Copy destination values",description:"Paste these values into the PostHog HTTP Webhook destination form.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}"},{kind:"copyable",label:"Method",value:"POST"},{kind:"code",label:"Body template",language:"json",copyLabel:"Body template",value:`{
7252
+ }`,copyLabel:"Node.js instrumentation.cjs",collapsible:!0},{kind:"prose",text:"Load `instrumentation.cjs` from your **start command** only, for example `NODE_OPTIONS='--require ./instrumentation.cjs' node server.js`. Do not set a global `NODE_OPTIONS` environment variable: it also applies during build and install, where the relative `--require` path resolves from inside `node_modules/<pkg>/` and breaks dependency postinstall scripts. If your platform forces an env var, use an absolute path such as `--require /workspace/instrumentation.cjs`."}]}]}});var Yz;var Xz=g(()=>{Wz();Yz={id:"porter",name:"Porter",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleEligible:!1,lifecycleSkipReason:"Manual OTEL setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward your Porter application logs and traces directly to Sazabi for real-time monitoring.",features:["Application logs","Deployment logs","Service monitoring"],evidenceHints:["porter.yaml or .github/workflows/porter.yml","PORTER_* environment variables","README/docs naming Porter (porter.run) as the deploy host"],setupSkill:H,dashboard:{iconKey:"porter",intakeSourceId:"porter"}}});var ek,n9,tk,nk;var Zz=g(()=>{pt();ek={kind:"multi-step",steps:[{id:"prepare",title:"Create key",description:"Create a PostHog personal API key with the required scopes.",steps:[{kind:"prose",text:"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:"prose",text:"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",description:"Enter the API key so Sazabi can validate the organization.",steps:[{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",connectionMode:"managed"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/posthog"},n9=[{field:"name",header:"Project"},{field:"organizationName",header:"Organization",width:"w-48",transform:"fallback: - "}],tk={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:n9,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"}}}},nk={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/posthog",groups:[{id:"prepare",section:"config",title:"Open destination form",description:"Create an HTTP Webhook destination in PostHog.",steps:[{kind:"prose",text:"Configure an [HTTP Webhook destination](https://${context.posthogRegion}.posthog.com/pipeline/new/hog-template-webhook) in PostHog under **Data Pipeline > Destinations**."},{kind:"prose",text:"Use the values in the next step and set your webhook body template to the default event and person payload."}]},{id:"values",section:"endpoint",title:"Copy destination values",description:"Paste these values into the PostHog HTTP Webhook destination form.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}"},{kind:"copyable",label:"Method",value:"POST"},{kind:"code",label:"Body template",language:"json",copyLabel:"Body template",value:`{
7253
7253
  "event": "{event}",
7254
7254
  "person": "{person}"
7255
7255
  }`}]},{id:"verify",section:"verify",title:"Save and verify",description:"Save the destination and confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"Save the PostHog destination, send a test event, and check Sazabi for the incoming product event."}]}]}});var o9,Fz;var Qz=g(()=>{Zz();o9=["posthogPersonalApiKey"],Fz={id:"posthog",name:"PostHog",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:o9,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:H,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 ok;var Vz=g(()=>{ok={perStreamInstructions:!0,groups:[{id:"plan-proxy",section:"config",title:"Plan reverse proxy",description:"Send capture traffic to Sazabi and keep PostHog config and assets going to PostHog.",steps:[{kind:"prose",text:"Configure posthog-js to use a reverse proxy as `api_host`."},{kind:"prose",text:"Send capture paths (`/e/`, `/i/`, `/s/`) to Sazabi, and send PostHog config, flags, and assets to PostHog."},{kind:"note",text:"Session replay is controlled by your PostHog project settings, not a `posthog.init` option."}]},{id:"target",section:"endpoint",title:"Copy capture target",description:"Use this as the upstream destination for capture-path proxy rules.",steps:[{kind:"copyable",label:"Sazabi capture target",value:"https://${context.ingestHost}",copyLabel:"URL"}]},{id:"initialize",section:"config",title:"Initialize posthog-js",description:"Point posthog-js at your reverse proxy path.",steps:[{kind:"code-tabs",label:"Initialize posthog-js",tabs:[{id:"javascript",label:"JavaScript",language:"javascript",copyLabel:"JavaScript",value:`import posthog from "posthog-js";
@@ -7319,7 +7319,7 @@ NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"`,cop
7319
7319
  opentelemetry-bootstrap -a install
7320
7320
 
7321
7321
  # Railway start command example:
7322
- opentelemetry-instrument python app.py`,copyLabel:"Python OpenTelemetry bootstrap"}]},{id:"deploy",title:"Redeploy and verify",description:"Deploy the staged variable changes, then send some traffic to the service.",steps:[{kind:"prose",text:"Railway stages variable changes, so review and deploy the change set when prompted."},{kind:"note",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 cN;var sN=g(()=>{aN();cN={id:"railway",name:"Railway",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"railway",intakeSourceId:"railway"}}});var ak,ck,sk;var hN=g(()=>{pt();ak={kind:"multi-step",steps:[{id:"credentials",title:"Enter API key",description:"Enter a Render API key.",steps:[{kind:"prose",text:"Enter your Render API key to connect your workspace."},{kind:"prose",text:"You can create an API key in your [Render dashboard](https://dashboard.render.com/settings#api-keys)."},{id:"token",kind:"secret",label:"API key",placeholder:"rnd_..."}]},{id:"workspace",title:"Choose workspace",description:"Pick the Render workspace whose services Sazabi should list.",steps:[{id:"workspace",kind:"select",label:"Workspace",placeholder:"Select a workspace",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"type"}]}],submit:{metadata:{connectionMode:"managed",apiToken:"$token",ownerId:"$workspace.id",ownerName:"$workspace.name"},displayName:"$workspace.name",button:Ee}},ck={groups:[{id:"open-log-streams",title:"Open Log Streams",description:"Add a log stream in the Render dashboard.",steps:[{kind:"prose",text:"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."},{kind:"note",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",title:"Set endpoint and token",description:"Paste these values into the log stream form.",steps:[{kind:"copyable",label:"Endpoint",value:"${context.projectRegion}.otel.${context.intakeDomain}:6514",description:"A syslog endpoint (host and port, no scheme). Render sends logs here as RFC5424 syslog over TLS."},{kind:"copyable",label:"Token",value:"${context.publicKey}",description:"Render adds this token to every log line so Sazabi can verify the stream."}]},{id:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},sk={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 r9,lN;var uN=g(()=>{hN();r9=["apiToken"],lN={id:"render",name:"Render",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:r9,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:H,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 hk;var gN=g(()=>{hk={groups:[{id:"environment",section:"endpoint",title:"Copy your Respan base URL",description:"Copy the keyed Respan base URL for this project. The public key is embedded in the hostname, so no auth header is needed. The Respan SDK appends its own `/api/v2/traces` path, so use this base host (no path).",steps:[{kind:"copyable",label:"`RESPAN_BASE_URL`",value:"https://${context.ingestHost}",copyLabel:"Respan base URL"}]},{id:"install",section:"config",title:"Install the Respan SDK",description:"Install the Respan SDK in the app you want to trace. It auto-instruments supported LLM and agent frameworks (OpenAI, Anthropic, Bedrock, Vertex, LangChain, and more).",steps:[{kind:"code",label:"Install",language:"bash",copyLabel:"Install command",value:`# Python
7322
+ opentelemetry-instrument python app.py`,copyLabel:"Python OpenTelemetry bootstrap"}]},{id:"deploy",title:"Redeploy and verify",description:"Deploy the staged variable changes, then send some traffic to the service.",steps:[{kind:"prose",text:"Railway stages variable changes, so review and deploy the change set when prompted."},{kind:"note",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 cN;var sN=g(()=>{aN();cN={id:"railway",name:"Railway",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"railway",intakeSourceId:"railway"}}});var ak,ck,sk;var hN=g(()=>{pt();ak={kind:"multi-step",steps:[{id:"credentials",title:"Enter API key",description:"Enter a Render API key.",steps:[{kind:"prose",text:"You can 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",description:"Pick the Render workspace whose services Sazabi should list.",steps:[{id:"workspace",kind:"select",label:"Workspace",instruction:"Select your Render workspace below.",placeholder:"Select a workspace",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"type"}]}],submit:{metadata:{connectionMode:"managed",apiToken:"$token",ownerId:"$workspace.id",ownerName:"$workspace.name"},displayName:"$workspace.name",button:Ee}},ck={groups:[{id:"open-log-streams",title:"Open Log Streams",description:"Add a log stream in the Render dashboard.",steps:[{kind:"prose",text:"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."},{kind:"note",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",title:"Set endpoint and token",description:"Paste these values into the log stream form.",steps:[{kind:"copyable",label:"Endpoint",value:"${context.projectRegion}.otel.${context.intakeDomain}:6514",description:"A syslog endpoint (host and port, no scheme). Render sends logs here as RFC5424 syslog over TLS."},{kind:"copyable",label:"Token",value:"${context.publicKey}",description:"Render adds this token to every log line so Sazabi can verify the stream."}]},{id:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},sk={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 r9,lN;var uN=g(()=>{hN();r9=["apiToken"],lN={id:"render",name:"Render",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:r9,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:H,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 hk;var gN=g(()=>{hk={groups:[{id:"environment",section:"endpoint",title:"Copy your Respan base URL",description:"Copy the keyed Respan base URL for this project. The public key is embedded in the hostname, so no auth header is needed. The Respan SDK appends its own `/api/v2/traces` path, so use this base host (no path).",steps:[{kind:"copyable",label:"`RESPAN_BASE_URL`",value:"https://${context.ingestHost}",copyLabel:"Respan base URL"}]},{id:"install",section:"config",title:"Install the Respan SDK",description:"Install the Respan SDK in the app you want to trace. It auto-instruments supported LLM and agent frameworks (OpenAI, Anthropic, Bedrock, Vertex, LangChain, and more).",steps:[{kind:"code",label:"Install",language:"bash",copyLabel:"Install command",value:`# Python
7323
7323
  pip install respan-ai
7324
7324
 
7325
7325
  # TypeScript
@@ -7381,7 +7381,7 @@ def _forward_to_sazabi(event, hint):
7381
7381
  sentry_sdk.init(
7382
7382
  dsn=SENTRY_DSN,
7383
7383
  before_send=_forward_to_sazabi,
7384
- )`,description:"Returning `event` keeps your primary Sentry project receiving it while the secondary client forwards a copy to Sazabi."}]},{id:"verify",title:"Verify telemetry",description:"Restart the app, send a test exception, and write a structured log.",steps:[{kind:"prose",text:"Turn on structured logging in the SDK first. This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}}]}});var pN;var mN=g(()=>{yN();pN={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var uk,gk;var wN=g(()=>{pt();uk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Sentry user auth token with org write access.",steps:[{kind:"prose",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)."},{kind:"prose",text:"Create a Sentry user auth token with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read**. The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."},{kind:"prose",text:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."},{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}]},{id:"credentials",title:"Enter credentials",description:"Enter the auth token and organization slug, then Sazabi validates them.",steps:[{id:"token",kind:"secret",label:"Sentry auth token",description:"A 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",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:{connectionMode:"managed",sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},gk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",description:"Create a Sentry Internal Integration in your organization's developer settings.",steps:[{kind:"note",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."},{kind:"prose",text:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**."},{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"},{kind:"prose",text:"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:"endpoint",title:"Set the webhook URL",description:"Paste this URL into the Internal Integration's Webhook URL field.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key sits inside the hostname, so the webhook needs no custom headers."},{kind:"prose",text:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"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."},{kind:"prose",text:"**Alerts are opt-in.** 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."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var a9,vN;var kN=g(()=>{wN();a9=["sentryAuthToken"],vN={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:a9,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:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var dk;var fN=g(()=>{dk={groups:[{id:"open-form",section:"config",title:"Open log drain form",description:"Create an OTLP log drain in the Supabase project settings.",steps:[{kind:"note",variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."},{kind:"prose",text:"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",description:"Fill in these fields in order. Each one matches a field in the Supabase form.",steps:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."},{kind:"prose",text:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"endpoint",title:"OTLP Endpoint",description:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}/v1/logs"}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",description:"Complete the remaining fields in the Supabase form.",steps:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"},{kind:"prose",text:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",description:"Save the drain and generate fresh Supabase logs.",steps:[{kind:"prose",text:"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 IN;var ON=g(()=>{fN();IN={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var bk;var PN=g(()=>{pt();bk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",steps:[{kind:"ordered-steps",items:zh("Temporal worker")}]},{id:"environment",section:"endpoint",title:"Copy OTLP environment",description:"Set these variables where your Temporal workers run.",steps:[Nh,..._o()]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart your workers so the OpenTelemetry SDK picks up the new variables.",steps:[{kind:"prose",text:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var SN;var $N=g(()=>{PN();SN={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var yk;var TN=g(()=>{yk={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",description:"Install the OTLP logs exporter and decide where to set it up.",steps:[{kind:"ordered-steps",items:["Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file.","Set `telemetry.logExporters` directly in `trigger.config.ts`. Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration.","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:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use this keyed intake URL in your Trigger.dev config.",steps:[{kind:"copyable",label:"Sazabi log intake URL",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Sazabi log intake URL"}]},{id:"configure",section:"config",title:"Configure log exporter",description:"Add the OTLP log exporter to `trigger.config.ts`.",steps:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
7384
+ )`,description:"Returning `event` keeps your primary Sentry project receiving it while the secondary client forwards a copy to Sazabi."}]},{id:"verify",title:"Verify telemetry",description:"Restart the app, send a test exception, and write a structured log.",steps:[{kind:"prose",text:"Turn on structured logging in the SDK first. This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}}]}});var pN;var mN=g(()=>{yN();pN={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var uk,gk;var wN=g(()=>{pt();uk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Sentry user auth token with org write access.",steps:[{kind:"note",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)."},{kind:"prose",text:"Create a Sentry user auth token with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read**. The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."},{kind:"prose",text:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."},{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}]},{id:"credentials",title:"Enter credentials",description:"Enter the auth token and organization slug, then Sazabi validates them.",steps:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A 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:{connectionMode:"managed",sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},gk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",description:"Create a Sentry Internal Integration in your organization's developer settings.",steps:[{kind:"note",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."},{kind:"prose",text:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**."},{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"},{kind:"prose",text:"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:"endpoint",title:"Set the webhook URL",description:"Paste this URL into the Internal Integration's Webhook URL field.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key sits inside the hostname, so the webhook needs no custom headers."},{kind:"prose",text:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"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."},{kind:"prose",text:"**Alerts are opt-in.** 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."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var a9,vN;var kN=g(()=>{wN();a9=["sentryAuthToken"],vN={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:a9,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:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var dk;var fN=g(()=>{dk={groups:[{id:"open-form",section:"config",title:"Open log drain form",description:"Create an OTLP log drain in the Supabase project settings.",steps:[{kind:"note",variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."},{kind:"prose",text:"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",description:"Fill in these fields in order. Each one matches a field in the Supabase form.",steps:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."},{kind:"prose",text:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"endpoint",title:"OTLP Endpoint",description:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}/v1/logs"}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",description:"Complete the remaining fields in the Supabase form.",steps:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"},{kind:"prose",text:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",description:"Save the drain and generate fresh Supabase logs.",steps:[{kind:"prose",text:"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 IN;var ON=g(()=>{fN();IN={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var bk;var PN=g(()=>{pt();bk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",steps:[{kind:"ordered-steps",items:zh("Temporal worker")}]},{id:"environment",section:"endpoint",title:"Copy OTLP environment",description:"Set these variables where your Temporal workers run.",steps:[Nh,..._o()]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart your workers so the OpenTelemetry SDK picks up the new variables.",steps:[{kind:"prose",text:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var SN;var $N=g(()=>{PN();SN={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var yk;var TN=g(()=>{yk={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",description:"Install the OTLP logs exporter and decide where to set it up.",steps:[{kind:"ordered-steps",items:["Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file.","Set `telemetry.logExporters` directly in `trigger.config.ts`. Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration.","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:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use this keyed intake URL in your Trigger.dev config.",steps:[{kind:"copyable",label:"Sazabi log intake URL",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Sazabi log intake URL"}]},{id:"configure",section:"config",title:"Configure log exporter",description:"Add the OTLP log exporter to `trigger.config.ts`.",steps:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
7385
7385
  import { defineConfig } from "@trigger.dev/sdk";
7386
7386
 
7387
7387
  export default defineConfig({
@@ -7468,7 +7468,7 @@ sinks:
7468
7468
  uri: "https://\${context.ingestHost}/v1/logs"
7469
7469
  method: post
7470
7470
  encoding:
7471
- codec: otlp`}]}]},{id:"wire-sources",section:"config",title:"Wire sources",description:"Point the remap transform at the log sources you actually want to forward.",steps:[{kind:"prose",text:'Replace `inputs: ["*"]` on the `remap` transform with your specific source or transform IDs in production. `["*"]` also matches `internal_metrics` and other unrelated components.'},{kind:"note",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."},{kind:"note",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)",description:"Add a separate traces sink only when your source is already OTLP-shaped.",steps:[{kind:"prose",text:'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"]`).'},{kind:"note",text:"No remap is needed for traces."},{kind:"prose",text:'Do not wire `["*"]` into a traces sink.'}]}]}});var DN;var zN=g(()=>{LN();DN={id:"vector",name:"Vector",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"vector",intakeSourceId:"vector"}}});var wk,vk,mk,kk;var NN=g(()=>{pt();wk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Vercel API token for the account or team to connect.",steps:[{kind:"prose",text:"Create a full-access API token in your [Vercel account settings](https://vercel.com/account/tokens). A token gets the same permissions as your account; for team accounts, create the token while scoped to the correct team."}]},{id:"credentials",title:"Enter token",description:"Enter the token so Sazabi can check the Vercel account.",steps:[{id:"token",kind:"secret",label:"API token",placeholder:"Enter your Vercel API token"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token"},resultAs:"validate"}],metadata:{connectionMode:"managed",vercelApiToken:"$token",vercelTeamId:"$validate.teamId",vercelTeamName:"$validate.teamName"},button:Ee}},vk={groups:[{id:"open-drains",section:"config",title:"Open Drains",description:"Create a log drain in the Vercel dashboard.",steps:[{kind:"note",variant:"requirement",text:"**Vercel Drains require the Pro or Enterprise plan.** Hobby and Pro Trial teams cannot create drains."},{kind:"prose",text:"In your [Vercel dashboard](https://vercel.com/dashboard), go to **Team Settings > Drains** and create a new drain."},{kind:"prose",text:"Choose **Logs** as the data to deliver. 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:"endpoint",title:"Copy endpoint URL",description:"Paste your Sazabi intake URL (above) into the drain's endpoint field.",steps:[{kind:"copyable",label:"Endpoint URL",value:"https://${context.ingestHost}"},{kind:"note",text:"The hostname already includes your key, so the drain needs no custom headers."}]},{id:"delivery-settings",section:"config",title:"Set delivery options",description:"Deliver JSON from every log source you want to send.",steps:[{kind:"prose",text:"Set the delivery format to **JSON**. Sazabi does not parse NDJSON on this endpoint."},{kind:"prose",text:"Pick the projects, environments, and log sources to send. Sazabi accepts every Vercel log source (Static, Lambda, Edge, Build, External, Firewall, Redirect)."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},mk=[{field:"name",header:"Project"},{field:"framework",header:"Framework",width:"w-32",cell:"badge",transform:"fallback:Unspecified"}],kk={content:{kind:"tabs",tabs:[{id:"logs",label:"Logs",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:mk,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:mk,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:mk,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 c9,_N;var jN=g(()=>{NN();c9=["vercelApiToken"],_N={id:"vercel",name:"Vercel",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:c9,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:H,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 fk;var RN=g(()=>{fk={perStreamInstructions:!0,groups:[{id:"endpoint",section:"endpoint",title:"Copy your webhook URL",description:"Each stream has its own keyed URL. The key is embedded in the hostname, so no extra headers or secrets are needed — treat the URL itself as the credential.",steps:[{kind:"prose",text:"Send an HTTP `POST` with a JSON body. A single JSON object is stored as one event; a JSON array of objects is stored as one event per element."},{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}",copyLabel:"Webhook URL"},{kind:"note",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",description:"Add the URL as a webhook or event-notification destination in whatever system emits the events.",steps:[{kind:"prose",text:"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."},{kind:"note",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",description:"Trigger an event from your vendor, or send one yourself, then confirm it arrives.",steps:[{kind:"prose",text:"Most webhook settings pages have a “Send test” button. If not, POST a sample event yourself and watch for it below."},{kind:"code",label:"Send a test event",language:"bash",copyLabel:"curl test event",value:`curl -X POST \\
7471
+ codec: otlp`}]}]},{id:"wire-sources",section:"config",title:"Wire sources",description:"Point the remap transform at the log sources you actually want to forward.",steps:[{kind:"prose",text:'Replace `inputs: ["*"]` on the `remap` transform with your specific source or transform IDs in production. `["*"]` also matches `internal_metrics` and other unrelated components.'},{kind:"note",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."},{kind:"note",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)",description:"Add a separate traces sink only when your source is already OTLP-shaped.",steps:[{kind:"prose",text:'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"]`).'},{kind:"note",text:"No remap is needed for traces."},{kind:"prose",text:'Do not wire `["*"]` into a traces sink.'}]}]}});var DN;var zN=g(()=>{LN();DN={id:"vector",name:"Vector",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",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:H,dashboard:{iconKey:"vector",intakeSourceId:"vector"}}});var wk,vk,mk,kk;var NN=g(()=>{pt();wk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Vercel API token for the account or team to connect.",steps:[{kind:"prose",text:"Create a full-access API token in your [Vercel account settings](https://vercel.com/account/tokens). A token gets the same permissions as your account; for team accounts, create the token while scoped to the correct team."}]},{id:"credentials",title:"Enter token",description:"Enter the token so Sazabi can check the Vercel account.",steps:[{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:{connectionMode:"managed",vercelApiToken:"$token",vercelTeamId:"$validate.teamId",vercelTeamName:"$validate.teamName"},button:Ee}},vk={groups:[{id:"open-drains",section:"config",title:"Open Drains",description:"Create a log drain in the Vercel dashboard.",steps:[{kind:"note",variant:"requirement",text:"**Vercel Drains require the Pro or Enterprise plan.** Hobby and Pro Trial teams cannot create drains."},{kind:"prose",text:"In your [Vercel dashboard](https://vercel.com/dashboard), go to **Team Settings > Drains** and create a new drain."},{kind:"prose",text:"Choose **Logs** as the data to deliver. 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:"endpoint",title:"Copy endpoint URL",description:"Paste your Sazabi intake URL (above) into the drain's endpoint field.",steps:[{kind:"copyable",label:"Endpoint URL",value:"https://${context.ingestHost}"},{kind:"note",text:"The hostname already includes your key, so the drain needs no custom headers."}]},{id:"delivery-settings",section:"config",title:"Set delivery options",description:"Deliver JSON from every log source you want to send.",steps:[{kind:"prose",text:"Set the delivery format to **JSON**. Sazabi does not parse NDJSON on this endpoint."},{kind:"prose",text:"Pick the projects, environments, and log sources to send. Sazabi accepts every Vercel log source (Static, Lambda, Edge, Build, External, Firewall, Redirect)."}]},{id:"verify",section:"verify",title:"Save and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"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"},mk=[{field:"name",header:"Project"},{field:"framework",header:"Framework",width:"w-32",cell:"badge",transform:"fallback:Unspecified"}],kk={content:{kind:"tabs",tabs:[{id:"logs",label:"Logs",content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:mk,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:mk,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:mk,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 c9,_N;var jN=g(()=>{NN();c9=["vercelApiToken"],_N={id:"vercel",name:"Vercel",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:c9,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:H,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 fk;var RN=g(()=>{fk={perStreamInstructions:!0,groups:[{id:"endpoint",section:"endpoint",title:"Copy your webhook URL",description:"Each stream has its own keyed URL. The key is embedded in the hostname, so no extra headers or secrets are needed — treat the URL itself as the credential.",steps:[{kind:"prose",text:"Send an HTTP `POST` with a JSON body. A single JSON object is stored as one event; a JSON array of objects is stored as one event per element."},{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}",copyLabel:"Webhook URL"},{kind:"note",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",description:"Add the URL as a webhook or event-notification destination in whatever system emits the events.",steps:[{kind:"prose",text:"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."},{kind:"note",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",description:"Trigger an event from your vendor, or send one yourself, then confirm it arrives.",steps:[{kind:"prose",text:"Most webhook settings pages have a “Send test” button. If not, POST a sample event yourself and watch for it below."},{kind:"code",label:"Send a test event",language:"bash",copyLabel:"curl test event",value:`curl -X POST \\
7472
7472
  https://\${context.ingestHost}/test \\
7473
7473
  -H 'content-type: application/json' \\
7474
7474
  -d '{"event":"hello.world","level":"info","message":"first webhook event"}'`}]}]}});var UN;var EN=g(()=>{RN();UN={id:"webhook_events",name:"Webhook Events",searchAliases:["webhook","webhooks","json events","http events","generic webhook","event stream"],capabilities:["connectionless"],auth:[],delivery:["push"],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:H,dashboard:{slug:"webhook-events",iconKey:"webhook-events",intakeSourceId:"webhook-events"}}});var _h,KN,j$e,R$e,_i,U$e,E$e,s9,h9,l9,K$e;var xN=g(()=>{ND();RD();KD();JD();HD();YD();FD();tz();iz();cz();lz();dz();pz();vz();Iz();Sz();Az();Dz();_z();Uz();xz();Bz();Mz();Xz();Qz();tN();iN();sN();uN();bN();mN();kN();ON();$N();CN();zN();jN();EN();_h=[zD,jD,ED,GD,qD,WD,ZD,ez,oz,az,hz,gz,yz,wz,fz,Pz,Tz,Lz,Nz,Rz,Kz,Jz,Hz,Yz,Fz,eN,oN,cN,lN,dN,vN,pN,IN,SN,AN,DN,_N,UN],KN=_h,j$e=Object.fromEntries(KN.map((e)=>[e.id,e.sensitiveFields??[]])),R$e=Object.fromEntries(KN.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]]}))),_i=["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"],U$e=_h.map((e)=>({id:e.id,name:e.name,capabilities:e.capabilities})),E$e=Object.fromEntries(_h.map((e)=>[e.id,{name:e.name,setupSkill:e.setupSkill}])),s9={cloudflare:dv,cloudwatch:kv,convex:Ov,digital_ocean:Av,fly_io:_v,gcp:Uv,plain:Zv,posthog:ek,render:ak,sentry_platform:uk,vercel:wk},h9={cloudflare:bv,cloudwatch:fv,convex:Sv,digital_ocean:Lv,fly_io:Rv,gcp:Ev,plain:Qv,posthog:tk,render:sk,vercel:kk},l9={cloudflare:yv,cloudflare_workers:pv,cloudwatch:Iv,convex:Pv,datadog:$v,daytona:Tv,digital_ocean:Cv,fluent_bit:Nv,fly_io:jv,grafana_alloy:xv,e2b:Dv,elastic_cloud:zv,gcp:Kv,inngest:Gv,langchain:Jv,mastra:Bv,neon:qv,netlify:Hv,openrouter:Mv,otel:Wv,otel_collector:Yv,otel_metrics:Xv,plain:Fv,posthog:nk,posthog_sdk:ok,porter:Vv,prometheus:ik,railway:rk,render:ck,respan:hk,sentry:lk,sentry_platform:gk,supabase:dk,temporal:bk,trigger_dev:yk,vector:pk,vercel:vk,webhook_events:fk},K$e=_h.map((e)=>({sourceId:e.id,name:e.name,capabilities:e.capabilities,setupAuthModes:e.auth,deliveryModes:e.delivery,hasDashboardMetadata:Boolean(e.dashboard),hasManagedFlow:Boolean(s9[e.id]),hasConnectionlessFlow:Boolean(l9[e.id]),hasStreamSelector:Boolean(h9[e.id]),lifecycleEligible:e.lifecycleEligible??!1,lifecycleSkipReason:e.lifecycleSkipReason}))});var GN=g(()=>{xN()});var Ik=g(()=>{LD();GN()});var JN,Ea,u9,g9,BN,Ok,jh,qN,HN,Rh,MN,WN,ji,YN,XN,Uh,ZN,Pk,FN,QN,Eh,VN,e_,Kh,t_,n_,Ri,o_,i_,xh,r_,a_,Gh,c_,s_,Jh,h_,l_,Bh,u_,g_,qh,d_,b_,Hh,d9;var Sk=g(()=>{Ik();ve();_e();JN=_i,Ea=c.enum(JN),u9=c.enum(["pending","provisioning","active","error"]),g9=c.object({name:c.string().describe("Field name used as the JSON key in metadata."),type:c.string().describe('Zod type name, e.g. "string", "boolean", "enum".'),required:c.boolean().describe("Whether the field is required."),sensitive:c.boolean().describe("Whether the field contains a secret and will be encrypted."),description:c.string().nullable().describe("Human-readable description of the field.")}),BN=c.object({id:c.string().describe("Data source type identifier."),name:c.string().describe("Human-readable display name."),metadataFields:c.array(g9).describe("Fields required in the metadata object when creating a connection."),setupSkill:c.string().nullable().describe("Markdown setup skill for AI agents. Null when no skill is available.")}),Ok=c.object({id:c.string().uuid(),projectId:c.string().uuid(),dataSourceType:Ea,displayName:c.string().nullable(),createdAt:c.string().datetime()}),jh=c.object({id:c.string().uuid(),connectionId:c.string().uuid().nullable().describe("Backing connection ID. Null for connectionless streams, which ingest directly without a managed connection."),displayName:c.string(),config:c.record(c.string(),c.unknown()),status:u9,errorMessage:c.string().nullable(),enabled:c.boolean().describe("Whether the stream is currently ingesting. Independent of provisioning status: a paused stream stays configured but stops accepting new data."),createdAt:c.string().datetime()}),qN=c.object({}),HN=c.object({types:c.array(BN)}),Rh=T({operationId:"dataSources.listTypes",description:"List all supported data source types with their metadata requirements.",backend:"api",route:{method:"GET",path:"/data-sources/types",tags:["Data Sources"]},input:qN,output:HN,pagination:"none",async:"sync"}),MN=c.object({projectId:c.string().uuid().optional().describe("Project to list connections for. Auto-filled from SDK context when omitted."),dataSourceType:Ea.optional().describe("Filter connections by data source type.")}),WN=c.object({connections:c.array(Ok)}),ji=T({operationId:"dataSources.listConnections",description:"List data source connections within one project.",backend:"api",route:{method:"GET",path:"/data-sources/connections",tags:["Data Sources"]},input:MN,output:WN,pagination:"none",async:"sync"}),YN=c.object({connectionId:c.string().uuid().describe("Connection ID to fetch.")}),XN=c.object({connection:Ok}),Uh=T({operationId:"dataSources.getConnection",description:"Get one data source connection by ID.",backend:"api",route:{method:"GET",path:"/data-sources/connections/{connectionId}",tags:["Data Sources"]},input:YN,output:XN,pagination:"none",async:"sync"}),ZN=c.enum(["managed","connectionless"]),Pk=c.object({id:c.string().uuid(),dataSourceType:Ea,mode:ZN,label:c.string().nullable(),connectionId:c.string().uuid().nullable(),streamCount:c.number().int(),createdAt:c.string().datetime(),connectionDisplayName:c.string().nullish(),streamName:c.string().nullish()}),FN=c.object({projectId:c.string().uuid().optional().describe("Project to list instances for. Auto-filled from SDK context when omitted."),dataSourceType:Ea.optional().describe("Filter instances by data source type.")}),QN=c.object({instances:c.array(Pk)}),Eh=T({operationId:"dataSources.listInstances",description:"List data source instances within one project.",backend:"api",route:{method:"GET",path:"/data-sources/instances",tags:["Data Sources"]},input:FN,output:QN,pagination:"none",async:"sync"}),VN=c.object({instanceId:c.string().uuid().describe("Instance ID to fetch."),projectId:c.string().uuid().optional().describe("Project the instance belongs to. Auto-filled from SDK context when omitted.")}),e_=c.object({instance:Pk}),Kh=T({operationId:"dataSources.getInstance",description:"Get one data source instance by ID.",backend:"api",route:{method:"GET",path:"/data-sources/instances/{instanceId}",tags:["Data Sources"]},input:VN,output:e_,pagination:"none",async:"sync"}),t_=c.object({projectId:c.string().uuid().optional().describe("Project to create the connection in. Auto-filled from SDK context when omitted."),dataSourceType:Ea.describe("Data source type identifier."),metadata:c.record(c.string(),c.unknown()).describe("Platform-specific credentials. Fields vary by data source type."),displayName:c.string().optional().describe("Optional human-readable name for this connection.")}),n_=c.object({connectionId:c.string().uuid().describe("ID of the created connection."),publicKey:c.string().describe("Auto-generated public key for this connection. Store this securely — it is only shown once.")}),Ri=T({operationId:"dataSources.createConnection",description:"Create a new data source connection. Validates credentials, encrypts sensitive fields, and auto-generates a public key.",backend:"api",route:{method:"POST",path:"/data-sources/connections",successStatus:201,tags:["Data Sources"]},input:t_,output:n_,pagination:"none",async:"sync"}),o_=c.object({connectionId:c.string().uuid().describe("Connection ID to list streams for."),enabled:c.boolean().optional().describe("Optional filter on stream ingestion state. Omit to list all streams; pass true for only enabled streams or false for only paused streams.")}),i_=c.object({streams:c.array(jh)}),xh=T({operationId:"dataSources.listStreams",description:"List streams for a data source connection.",backend:"api",route:{method:"GET",path:"/data-sources/connections/{connectionId}/streams",tags:["Data Sources"]},input:o_,output:i_,pagination:"none",async:"sync"}),r_=c.object({instanceId:c.string().uuid().describe("Instance ID to list streams for."),enabled:c.boolean().optional().describe("Optional filter on stream ingestion state. Omit to list all streams; pass true for only enabled streams or false for only paused streams.")}),a_=c.object({streams:c.array(jh)}),Gh=T({operationId:"dataSources.listInstanceStreams",description:"List the streams that belong to a data source instance.",backend:"api",route:{method:"GET",path:"/data-sources/instances/{instanceId}/streams",tags:["Data Sources"]},input:r_,output:a_,pagination:"none",async:"sync"}),c_=c.object({connectionId:c.string().uuid().describe("Connection ID to create the stream under."),displayName:c.string().describe("Resource name, e.g. service or app name."),config:c.record(c.string(),c.unknown()).describe("Platform-specific stream configuration.")}),s_=c.object({streamId:c.string().uuid().describe("ID of the created stream."),publicKey:c.string().optional().describe("Auto-generated public key for this stream. Returned only when the data source mints a per-stream key (sources that send to a Sazabi endpoint). Store this securely — it is only shown once.")}),Jh=T({operationId:"dataSources.createStream",description:"Create a new stream for a data source connection. Triggers async provisioning.",backend:"api",route:{method:"POST",path:"/data-sources/connections/{connectionId}/streams",successStatus:201,tags:["Data Sources"]},input:c_,output:s_,pagination:"none",async:"sync"}),h_=c.object({streamId:c.string().uuid().describe("Stream ID to fetch.")}),l_=c.object({stream:jh}),Bh=T({operationId:"dataSources.getStream",description:"Get one data source stream by ID. Use to poll provisioning status.",backend:"api",route:{method:"GET",path:"/data-sources/streams/{streamId}",tags:["Data Sources"]},input:h_,output:l_,pagination:"none",async:"sync"}),u_=c.object({streamId:c.string().uuid().describe("Stream ID to delete.")}),g_=c.object({success:c.boolean()}),qh=T({operationId:"dataSources.deleteStream",description:"Delete a data source stream. For sources that send to a Sazabi endpoint, also deletes the stream's public key.",backend:"api",route:{method:"DELETE",path:"/data-sources/streams/{streamId}",successStatus:204,tags:["Data Sources"]},input:u_,output:g_,pagination:"none",async:"sync"}),d_=c.object({connectionId:c.string().uuid().describe("Connection ID to disconnect.")}),b_=c.object({success:c.boolean(),connectionTeardownError:c.string().nullable().describe("Null when teardown succeeded; error message when remote cleanup failed.")}),Hh=T({operationId:"dataSources.disconnectConnection",description:"Disconnect a data source connection. Removes the connection, all associated streams, and their public keys. Provider-side cleanup runs asynchronously when the source supports it.",backend:"api",route:{method:"DELETE",path:"/data-sources/connections/{connectionId}",successStatus:200,tags:["Data Sources"]},input:d_,output:b_,pagination:"none",async:"sync"}),d9={listTypes:Rh.contract,listConnections:ji.contract,getConnection:Uh.contract,listInstances:Eh.contract,getInstance:Kh.contract,createConnection:Ri.contract,disconnectConnection:Hh.contract,listStreams:xh.contract,listInstanceStreams:Gh.contract,createStream:Jh.contract,getStream:Bh.contract,deleteStream:qh.contract}});var b9,$k,y9,p9,m9,w9,v9,y_,k9,f9,p_,I9,O9,m_,P9,S9,w_;var v_=g(()=>{ve();_e();b9=["slack","github","linear","pagerduty","victorops","rootly","incident_io","webhook","teams","bitbucket","jira"],$k=c.enum(b9),y9=c.enum(["oauth","app_installation","api_key"]),p9=c.enum(["alert_routing","inbound_webhooks","messaging","code_search","health_check"]),m9=c.enum(["pending","connected","error","revoked"]),w9=c.enum(["healthy","unhealthy","unknown"]),v9=c.object({id:$k.describe("Integration provider identifier."),name:c.string().describe("Human-readable display name."),description:c.string().describe("Short description of the provider."),authType:y9.describe("Auth flow used to connect this provider."),capabilities:c.array(p9).describe("Capabilities the provider exposes once connected."),connectionCount:c.number().int().describe("Number of active connections for this provider in the organization, including error-status connections that need attention.")}),y_=c.object({id:c.string().uuid(),provider:$k,displayName:c.string().nullable(),status:m9,isActive:c.boolean().describe("Whether this connection counts as connected (status 'connected' or 'error'). An error-status connection is the organization's connection — broken, not absent."),needsAttention:c.boolean().describe("Whether the connection should surface a reconnect prompt (status 'error' or health status 'unhealthy')."),metadata:c.record(c.string(),c.unknown()).describe("Non-secret provider metadata (e.g. workspace/team names)."),healthStatus:w9,healthMessage:c.string().nullable(),healthCheckedAt:c.string().datetime().nullable(),healthConsecutiveFailures:c.number().int(),connectedBy:c.string().nullable(),createdAt:c.string().datetime(),updatedAt:c.string().datetime()}),k9=c.object({organizationId:c.string().min(1).optional().describe("Organization to list providers for. Auto-filled from CLI and SDK context when omitted.")}),f9=c.object({providers:c.array(v9)}),p_=T({operationId:"integrations.listProviders",description:"List supported integration providers and how many connections the organization has for each.",backend:"api",route:{method:"GET",path:"/integrations/providers",tags:["Integrations"]},input:k9,output:f9,pagination:"none",async:"sync"}),I9=c.object({organizationId:c.string().min(1).optional().describe("Organization to list connections for. Auto-filled from CLI and SDK context when omitted."),provider:$k.optional().describe("Filter connections by provider.")}),O9=c.object({connections:c.array(y_)}),m_=T({operationId:"integrations.listConnections",description:"List integration connections and their connection state for the organization.",backend:"api",route:{method:"GET",path:"/integrations/connections",tags:["Integrations"]},input:I9,output:O9,pagination:"none",async:"sync"}),P9=c.object({organizationId:c.string().min(1).optional().describe("Organization the connection belongs to. Auto-filled from CLI and SDK context when omitted."),connectionId:c.string().uuid().describe("Connection ID to fetch.")}),S9=c.object({connection:y_}),w_=T({operationId:"integrations.getConnection",description:"Get one integration connection by ID (non-secret config only).",backend:"api",route:{method:"GET",path:"/integrations/connections/{connectionId}",tags:["Integrations"]},input:P9,output:S9,pagination:"none",async:"sync"})});var kn,$9,T9,k_,Mh,Wh,f_,Tk,I_,Ak,O_,P_,A9,C9,S_,$_,T_,A_,C_,L_,D_,z_,N_,__,j_,R_,U_,Ui,Yh,Xh,Zh,Fh,Qh,Vh,Ck,el,tl,L9;var Lk=g(()=>{ve();_e();kn=c.object({id:c.string().uuid(),projectId:c.string().uuid(),name:c.string(),description:c.string().nullable(),status:c.enum(["open","resolved","ignored"]),severity:c.enum(["low","medium","high","critical"]),statusComponentId:c.string().uuid().nullable(),createdAt:c.string().datetime(),resolvedAt:c.string().datetime().nullable(),mutedAt:c.string().datetime().nullable(),muteHitCount:c.number().int().nonnegative(),lastActivityAt:c.string().datetime().nullable(),lastDeliveredAt:c.string().datetime().nullable(),locked:c.boolean(),redacted:c.boolean()}),$9=c.object({channelId:c.string().nullable(),channelName:c.string().nullable(),threadTs:c.string().nullable(),permalink:c.string().nullable(),workspaceName:c.string().nullable()}),T9=kn.extend({slackChannels:c.array($9)}),k_=kn.extend({delivery:c.record(c.string(),c.unknown()).nullable().optional()}),Mh=c.object({projectId:c.string().uuid().optional().describe("Project to create the issue in. Auto-filled from CLI and SDK context when omitted."),name:c.string().trim().min(1).optional().describe("Stable issue name for indexing and mute matching. When omitted, the name is derived from contentMdx."),contentMdx:c.string().trim().min(1,"contentMdx cannot be empty").describe("Safe Sazabi MDX document for the issue body (impact, root cause, remediation, evidence)."),severity:c.enum(["low","medium","high","critical"]).default("medium").describe("Issue severity used for prioritization and triage."),statusComponentId:c.string().uuid().optional().describe("Optional status component ID to link to the issue."),statusStartedAt:c.string().datetime({offset:!0}).optional().describe("Optional ISO timestamp for when the linked status-page incident began.")}),Wh=Mh.superRefine((e,t)=>{if(e.statusStartedAt&&!e.statusComponentId)t.addIssue({code:"custom",path:["statusStartedAt"],message:"statusStartedAt requires statusComponentId."})}),f_=c.object({issue:kn,duplicateIssueId:c.string().uuid().optional().describe("Present when creation reused an existing open issue instead of creating a new one.")}),Tk=c.object({projectId:c.string().uuid().optional().describe("Project to list issues for. Auto-filled from CLI and SDK context when omitted."),limit:c.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of issues to return per page."),cursor:c.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),status:c.enum(["open","resolved","ignored"]).optional().describe("Filter by issue status."),severity:c.enum(["low","medium","high","critical"]).optional().describe("Filter by severity."),statusComponentId:c.string().uuid().optional().describe("Filter by status component ID.")}),I_=c.object({issues:c.array(kn),nextCursor:c.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),Ak=Tk.extend({name:c.string().trim().optional().describe("Case-insensitive partial match on issue name."),includeDeliveryMetadata:c.union([c.boolean(),c.stringbool()]).default(!1).describe("When true, include raw delivery metadata in each issue.")}),O_=c.object({issues:c.array(k_),nextCursor:c.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),P_=Ak.omit({limit:!0,cursor:!0,includeDeliveryMetadata:!0}),A9=c.object({open:c.number().int().nonnegative(),resolved:c.number().int().nonnegative(),ignored:c.number().int().nonnegative()}),C9=c.object({low:c.number().int().nonnegative(),medium:c.number().int().nonnegative(),high:c.number().int().nonnegative(),critical:c.number().int().nonnegative()}),S_=c.object({total:c.number().int().nonnegative(),byStatus:A9,bySeverity:C9,filters:c.object({name:c.string().nullable(),status:c.enum(["open","resolved","ignored"]).nullable(),severity:c.enum(["low","medium","high","critical"]).nullable(),statusComponentId:c.string().uuid().nullable()})}),$_=c.object({issueId:c.string().uuid().describe("Issue ID to retrieve.")}),T_=c.object({issue:T9}),A_=c.object({issueId:c.string().uuid().describe("Issue ID to resolve."),statusResolvedAt:c.string().datetime({offset:!0}).optional().describe("Optional ISO timestamp for when the linked status-page incident ended.")}),C_=c.object({issue:kn}),L_=c.object({issueId:c.string().uuid().describe("Issue ID to ignore.")}),D_=c.object({issue:kn}),z_=c.object({issueId:c.string().uuid().describe("Issue ID to reopen.")}),N_=c.object({issue:kn}),__=c.object({issueId:c.string().uuid().describe("Issue ID to mute.")}),j_=c.object({issue:kn}),R_=c.object({issueId:c.string().uuid().describe("Issue ID to unmute.")}),U_=c.object({issue:kn}),Ui=T({operationId:"issues.create",description:"Create an issue in a project, returning an existing open issue when root-cause deduplication finds a match.",backend:"api",route:{method:"POST",path:"/issues",tags:["Issues"],successStatus:201},input:Wh,output:f_,pagination:"none",async:"sync"}),Yh=T({operationId:"issues.list",description:"List issues in a project, optionally filtered by status and severity.",backend:"api",route:{method:"GET",path:"/issues",tags:["Issues"]},input:Tk,output:I_,pagination:"cursor",async:"sync"}),Xh=T({operationId:"issues.search",description:"Search issues in a project by name, status, and severity.",backend:"api",route:{method:"GET",path:"/issues/search",tags:["Issues"]},input:Ak,output:O_,pagination:"cursor",async:"sync"}),Zh=T({operationId:"issues.count",description:"Count issues in a project with status and severity breakdowns.",backend:"api",route:{method:"GET",path:"/issues/count",tags:["Issues"]},input:P_,output:S_,pagination:"none",async:"sync"}),Fh=T({operationId:"issues.get",description:"Get a single issue by ID.",backend:"api",route:{method:"GET",path:"/issues/{issueId}",tags:["Issues"]},input:$_,output:T_,pagination:"none",async:"sync"}),Qh=T({operationId:"issues.resolve",description:"Resolve an open issue.",backend:"api",route:{method:"POST",path:"/issues/{issueId}/resolve",tags:["Issues"]},input:A_,output:C_,pagination:"none",async:"sync"}),Vh=T({operationId:"issues.ignore",description:"Ignore an open issue.",backend:"api",route:{method:"POST",path:"/issues/{issueId}/ignore",tags:["Issues"]},input:L_,output:D_,pagination:"none",async:"sync"}),Ck=T({operationId:"issues.reopen",description:"Reopen a resolved or ignored issue.",backend:"api",route:{method:"POST",path:"/issues/{issueId}/reopen",tags:["Issues"]},input:z_,output:N_,pagination:"none",async:"sync"}),el=T({operationId:"issues.mute",description:"Mute an issue, suppressing future re-fires without changing status.",backend:"api",route:{method:"POST",path:"/issues/{issueId}/mute",tags:["Issues"]},input:__,output:j_,pagination:"none",async:"sync"}),tl=T({operationId:"issues.unmute",description:"Unmute an issue, preserving its current status.",backend:"api",route:{method:"POST",path:"/issues/{issueId}/unmute",tags:["Issues"]},input:R_,output:U_,pagination:"none",async:"sync"}),L9={count:Zh.contract,create:Ui.contract,list:Yh.contract,search:Xh.contract,get:Fh.contract,resolve:Qh.contract,ignore:Vh.contract,mute:el.contract,unmute:tl.contract}});var Dk,E_,nl,ol,K_,x_,G_,J_,il,zk,B_,q_,H_,M_,W_,Y_,X_,Z_,F_,Q_,V_,ej,Ei,Ki,xi,Gi,Ji,rl,al,cl,sl,hl,D9,z9;var Nk=g(()=>{ve();_e();Dk=/^[a-zA-Z0-9\s\-_]+$/,E_=c.object({id:c.string().uuid(),name:c.string(),expiresAt:c.string().datetime().nullable(),lastUsedAt:c.string().datetime().nullable(),createdAt:c.string().datetime()}),nl=E_.extend({projectId:c.string().uuid(),dataSourceConnectionId:c.string().uuid().nullable().describe("Linked data source connection ID when this key is scoped to one data source."),deactivatedAt:c.string().datetime().nullable().describe("Timestamp when this public key was deactivated.")}),ol=E_.extend({projectId:c.string().uuid().nullable()}),K_=c.object({projectId:c.string().uuid().optional().describe("Project to list keys for. Auto-filled from CLI and SDK context when omitted."),limit:c.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of keys to return per page."),cursor:c.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),x_=c.object({publicKeys:c.array(nl),nextCursor:c.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),G_=c.object({secretKeys:c.array(ol),nextCursor:c.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),J_=c.object({projectId:c.string().uuid().optional().describe("Project containing the key. Auto-filled from CLI and SDK context when omitted."),keyId:c.string().uuid().describe("Key ID to fetch.")}),il=c.object({publicKey:nl}),zk=c.object({secretKey:ol}),B_=c.object({publicKey:nl.extend({value:c.string()})}),q_=c.object({projectId:c.string().uuid().optional().describe("Project to ensure the log forwarding key for. Auto-filled from CLI and SDK context when omitted.")}),H_=c.object({secretKey:ol.extend({value:c.string()})}),M_=c.object({projectId:c.string().uuid().optional().describe("Project containing the key. Auto-filled from CLI and SDK context when omitted."),keyId:c.string().uuid().describe("Key ID to update."),name:c.string().min(1,"Name is required").max(100,"Name must be 100 characters or less").regex(Dk,"Name can only contain letters, numbers, spaces, hyphens, and underscores").optional().describe("New human-readable name for the key."),expiresAt:c.string().datetime().nullable().optional().describe("New expiration timestamp for the key, or null to clear it.")}),W_=c.object({params:c.object({keyId:c.string().uuid().describe("Public key ID to deactivate.")}),query:c.object({projectId:c.string().uuid().optional().describe("Project containing the key. Auto-filled from CLI and SDK context when omitted.")})}).transform(({params:e,query:t})=>({...t,...e})),Y_=il,X_=c.void(),Z_=c.object({limit:c.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of keys to return per page."),cursor:c.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),F_=c.object({keyId:c.string().uuid().describe("Key ID to fetch.")}),Q_=c.object({projectId:c.string().uuid().optional().describe("Project to scope this key to. When set, the key can only access resources within this project. Omit for organization-wide access."),name:c.string().min(1,"Name is required").max(100,"Name must be 100 characters or less").regex(Dk,"Name can only contain letters, numbers, spaces, hyphens, and underscores").describe("Human-readable name for the key."),expiresAt:c.string().datetime().optional().describe("Optional expiration timestamp for the key.")}),V_=c.object({keyId:c.string().uuid().describe("Key ID to update."),name:c.string().min(1,"Name is required").max(100,"Name must be 100 characters or less").regex(Dk,"Name can only contain letters, numbers, spaces, hyphens, and underscores").optional().describe("New human-readable name for the key."),expiresAt:c.string().datetime().nullable().optional().describe("New expiration timestamp for the key, or null to clear it.")}),ej=c.object({params:c.object({keyId:c.string().uuid().describe("Key ID to delete.")})}).transform(({params:e})=>({...e})),Ei=T({operationId:"publicKeys.list",description:"List public keys within one project.",backend:"api",route:{method:"GET",path:"/public-keys",tags:["Public Keys"]},input:K_,output:x_,pagination:"cursor",async:"sync",examples:[{name:"list-public-keys",input:{projectId:"11111111-1111-4111-8111-111111111111",limit:25},output:{publicKeys:[{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",name:"CLI forwarder",dataSourceConnectionId:null,deactivatedAt:null,expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}],nextCursor:null}}]}),Ki=T({operationId:"publicKeys.get",description:"Get one public key within one project.",backend:"api",route:{method:"GET",path:"/public-keys/{keyId}",tags:["Public Keys"]},input:J_,output:il,pagination:"none",async:"sync",examples:[{name:"get-public-key",input:{projectId:"11111111-1111-4111-8111-111111111111",keyId:"22222222-2222-4222-8222-222222222222"},output:{publicKey:{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",name:"CLI forwarder",dataSourceConnectionId:null,deactivatedAt:null,expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}}}]}),xi=T({operationId:"publicKeys.ensureLogForwarding",description:"Ensure a reusable project-scoped public key exists for CLI log forwarding.",backend:"api",route:{method:"POST",path:"/public-keys/log-forwarding/ensure",tags:["Public Keys"]},input:q_,output:B_,pagination:"none",async:"sync",examples:[{name:"ensure-log-forwarding-public-key",input:{projectId:"11111111-1111-4111-8111-111111111111"},output:{publicKey:{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",name:"sazabi-cli-forward",dataSourceConnectionId:null,deactivatedAt:null,expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z",value:"sazabi_public_example"}}}]}),Gi=T({operationId:"publicKeys.update",description:"Update one public key within one project.",backend:"api",route:{method:"PATCH",path:"/public-keys/{keyId}",tags:["Public Keys"]},input:M_,output:il,pagination:"none",async:"sync",examples:[{name:"rename-public-key",input:{projectId:"11111111-1111-4111-8111-111111111111",keyId:"22222222-2222-4222-8222-222222222222",name:"Updated CLI forwarder"},output:{publicKey:{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",name:"Updated CLI forwarder",dataSourceConnectionId:null,deactivatedAt:null,expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}}}]}),Ji=T({operationId:"publicKeys.deactivate",description:"Deactivate one public key within one project. Recently validated requests may continue to authenticate for a short period after deactivation.",backend:"api",route:{method:"POST",path:"/public-keys/{keyId}/deactivate",tags:["Public Keys"],inputStructure:"detailed"},input:W_,output:Y_,pagination:"none",async:"sync"}),rl=T({operationId:"secretKeys.list",description:"List secret keys within the organization.",backend:"api",route:{method:"GET",path:"/secret-keys",tags:["Secret Keys"]},input:Z_,output:G_,pagination:"cursor",async:"sync",examples:[{name:"list-secret-keys",input:{limit:25},output:{secretKeys:[{id:"33333333-3333-4333-8333-333333333333",projectId:null,name:"CI agent",expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}],nextCursor:null}}]}),al=T({operationId:"secretKeys.get",description:"Get one secret key within the organization.",backend:"api",route:{method:"GET",path:"/secret-keys/{keyId}",tags:["Secret Keys"]},input:F_,output:zk,pagination:"none",async:"sync",examples:[{name:"get-secret-key",input:{keyId:"33333333-3333-4333-8333-333333333333"},output:{secretKey:{id:"33333333-3333-4333-8333-333333333333",projectId:null,name:"CI agent",expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}}}]}),cl=T({operationId:"secretKeys.create",description:"Create one secret key within the organization.",backend:"api",route:{method:"POST",path:"/secret-keys",successStatus:201,tags:["Secret Keys"]},input:Q_,output:H_,pagination:"none",async:"sync",examples:[{name:"create-secret-key",input:{name:"CI agent"},output:{secretKey:{id:"33333333-3333-4333-8333-333333333333",projectId:null,name:"CI agent",expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z",value:"sazabi_secret_example"}}}]}),sl=T({operationId:"secretKeys.update",description:"Update one secret key within the organization.",backend:"api",route:{method:"PATCH",path:"/secret-keys/{keyId}",tags:["Secret Keys"]},input:V_,output:zk,pagination:"none",async:"sync",examples:[{name:"rename-secret-key",input:{keyId:"33333333-3333-4333-8333-333333333333",name:"Updated CI agent"},output:{secretKey:{id:"33333333-3333-4333-8333-333333333333",projectId:null,name:"Updated CI agent",expiresAt:null,lastUsedAt:null,createdAt:"2026-01-01T00:00:00.000Z"}}}]}),hl=T({operationId:"secretKeys.delete",description:"Delete one secret key within the organization.",backend:"api",route:{method:"DELETE",path:"/secret-keys/{keyId}",successStatus:204,tags:["Secret Keys"],inputStructure:"detailed"},input:ej,output:X_,pagination:"none",async:"sync"}),D9={list:Ei.contract,get:Ki.contract,ensureLogForwarding:xi.contract,update:Gi.contract,deactivate:Ji.contract},z9={list:rl.contract,get:al.contract,create:cl.contract,update:sl.contract,delete:hl.contract}});var tj,nj,oj,ij,rj,aj,cj,Ka,sj,hj,lj,_k,uj,gj,dj,bj,yj,pj,mj,wj,vj,kj,N9,fj,Ij,Bi,qi,Hi,Mi,Wi,ll,_9;var jk=g(()=>{ve();_e();tj=c.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)"),nj=c.enum(["any","all","phrase"]).describe("Search mode: 'any' (match any token), 'all' (match all tokens), 'phrase' (exact phrase match)"),oj=c.object({query:c.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:c.array(c.string()).optional().describe("Fields to search in (defaults to backend allowlist)"),mode:nj.optional().default("all").describe("Token matching mode")}),ij=c.object({field:c.string().describe("Field name to filter on"),op:tj.describe("Filter operator"),value:c.union([c.string(),c.number(),c.boolean(),c.array(c.union([c.string(),c.number()])),c.object({from:c.string(),to:c.string()})]).describe("Filter value (type depends on operator)")}).superRefine((e,t)=>{if(e.op==="in"&&!Array.isArray(e.value))t.addIssue({code:c.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:c.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:c.ZodIssueCode.custom,message:"Value must be boolean when op is 'exists'",path:["value"]})}),rj=c.object({field:c.string().describe("Field name to sort by"),direction:c.enum(["asc","desc"]).default("desc").describe("Sort direction: 'asc' for ascending, 'desc' for descending")}),aj=c.object({limit:c.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:c.string().optional().describe("Opaque cursor from previous response for pagination")}),cj=c.object({projectId:c.string().uuid().optional().describe("Project to query logs for. Auto-filled from CLI and SDK context when omitted."),search:oj.optional().describe("Full-text search configuration"),filters:c.array(ij).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:c.array(c.string()).optional().describe("Fields to return (defaults to backend default set)"),sort:rj.optional().describe("Sort configuration (defaults to timestamp desc)"),pagination:aj.optional().describe("Pagination configuration")}),Ka=c.enum(["clickhouse","better-stack","datadog","gcp","axiom","cloudwatch","sentry","posthog","mezmo"]),sj=c.enum(["native","external"]),hj=c.object({projectId:c.string().uuid().optional().describe("Project to inspect. Auto-filled from CLI and SDK context when omitted.")}),lj=c.object({backend:c.object({id:Ka,name:c.string(),kind:sj}).describe("Active log backend for the project"),features:c.array(c.string()).describe("Backend features registered on the server"),commands:c.array(c.enum(["schema","query","volume","patterns","nativeQuery"])).describe("CLI/API commands available for this backend"),queryableFields:c.array(c.string()).describe("Fields accepted by the normalized logs.query contract"),searchableFields:c.array(c.string()).describe("Fields accepted by logs.query full-text search"),observedServiceNames:c.array(c.string()).describe("Recently observed service names for this project"),observedAttributeKeys:c.array(c.string()).describe("Recently observed log attribute keys for this project"),schemaContext:c.record(c.string(),c.any()).optional().describe("Backend-specific schema guidance and examples")}),_k=c.enum(["1m","5m","15m","1h"]),uj=c.enum(["service_name","severity_text","environment"]),gj=c.object({projectId:c.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),startDate:c.string().datetime({offset:!0}),endDate:c.string().datetime({offset:!0}),interval:_k.optional().describe("Aggregation bucket size for the volume series"),groupBy:uj.optional().describe("Optional field to split volume series by"),filters:c.object({service_name:c.string().optional(),severity_text:c.string().optional(),environment:c.string().optional()}).optional()}).refine((e)=>new Date(e.startDate)<new Date(e.endDate),{message:"startDate must be before endDate",path:["endDate"]}),dj=c.object({total:c.number().nonnegative(),startDate:c.string().datetime({offset:!0}),endDate:c.string().datetime({offset:!0}),interval:_k,series:c.array(c.object({group:c.string(),total:c.number().nonnegative(),points:c.array(c.object({bucket:c.string(),count:c.number().nonnegative()}))}))}),bj=c.object({projectId:c.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:c.string().min(1).max(500).optional().describe("Optional text to match against normalized log patterns"),severity:c.string().optional().describe("Optional severity_text value, for example ERROR"),startDate:c.string().datetime({offset:!0}).optional().describe("Optional earliest last-seen timestamp"),endDate:c.string().datetime({offset:!0}).optional().describe("Optional latest last-seen timestamp"),limit:c.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"]}),yj=c.object({serviceName:c.string().nullable(),fingerprint:c.string(),pattern:c.string(),severity:c.string().nullable(),occurrences:c.number().nonnegative(),firstSeen:c.string().nullable(),lastSeen:c.string().nullable(),representativeId:c.string().nullable()}),pj=c.object({patterns:c.array(yj),meta:c.object({backendId:Ka,count:c.number().int().nonnegative(),took:c.number().nonnegative()})}),mj=c.object({projectId:c.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:c.string().min(1,"Query cannot be empty").max(1e4,"Query must be 10000 characters or less")}),wj=c.object({result:c.string().describe("Backend-formatted query result"),format:c.literal("text"),meta:c.object({backendId:Ka,took:c.number().nonnegative(),truncated:c.boolean()})}),vj=c.object({projectId:c.string().uuid().optional().describe("Project to query. Auto-filled from CLI and SDK context when omitted."),query:c.string().min(1,"Query must be at least 1 character long.").max(4000,"Query must be at most 4000 characters").describe("Natural-language logs question. Examples: 'api request failures in the last day', 'timeouts in intake', 'top ERROR patterns for public-api'.")}),kj=c.object({answer:c.string().describe("Evidence-backed natural-language answer to the logs question"),steps:c.number().int().nonnegative().describe("Number of nested model steps used"),toolCalls:c.number().int().nonnegative().describe("Number of nested tool calls used"),compacted:c.boolean().describe("Whether nested messages were compacted during the search"),meta:c.object({backendId:Ka,took:c.number().nonnegative(),modelProvider:c.string().optional(),modelId:c.string().optional()})}),N9=c.object({cursor:c.string().nullable().describe("Cursor for next page (null if no more results)"),hasMore:c.boolean().describe("Whether more results are available")}),fj=c.object({count:c.number().int().nonnegative().describe("Number of log rows returned in this response"),took:c.number().nonnegative().describe("Query execution time in milliseconds")}),Ij=c.object({data:c.array(c.record(c.string(),c.any())).describe("Array of log rows with selected fields"),nextCursor:c.string().nullable().describe("Pass as 'cursor' in the next query to fetch the next page. Null when there are no more results."),meta:fj.describe("Query execution metadata")}),Bi=T({operationId:"logs.query",description:"Query logs within one project.",backend:"api",route:{method:"POST",path:"/logs/query",tags:["Logs"]},input:cj,output:Ij,pagination:"cursor",async:"sync"}),qi=T({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:hj,output:lj,pagination:"none",async:"sync"}),Hi=T({operationId:"logs.volume",description:"Query pre-aggregated log volume for one project.",backend:"api",route:{method:"POST",path:"/logs/volume",tags:["Logs"]},input:gj,output:dj,pagination:"none",async:"sync"}),Mi=T({operationId:"logs.patterns",description:"Query normalized log patterns for discovery workflows.",backend:"api",route:{method:"POST",path:"/logs/patterns",tags:["Logs"]},input:bj,output:pj,pagination:"none",async:"sync"}),Wi=T({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:mj,output:wj,pagination:"none",async:"sync"}),ll=T({operationId:"logs.searchNatural",summary:"Natural Language Log Search",description:"Search project logs by asking a natural-language question. Experimental.",backend:"api",route:{method:"POST",path:"/logs/search-natural",tags:["Logs"]},input:vj,output:kj,pagination:"none",async:"sync"}),_9={query:Bi.contract,schema:qi.contract,volume:Hi.contract,patterns:Mi.contract,nativeQuery:Wi.contract,searchNatural:ll.contract}});var Oj=g(()=>{Dh()});var Rk=g(()=>{Oj()});var Sj=()=>{};var Uk,Ek,ul,j9,R9,Yi,gl,$j,Tj,Kk,Aj,Cj,U9,Lj,xk,E9,K9,x9,G9,J9,B9,q9,H9,M9,W9,Y9,X9,Z9,Gk,Dj,zj,F9,Jk;var dl=g(()=>{ve();Uk=["streamable-http","sse"],Ek=["none","headers","oauth","aws-sigv4"],ul=["none","client_secret_basic","client_secret_post"],j9=["preset","custom"],R9=["configured","authorizing","connected","error"],Yi=["enabled","disabled","custom-only"],gl=["enabled","write_blocked","disabled"],$j=c.enum(Uk),Tj=c.enum(Ek),Kk=c.enum(ul),Aj=c.enum(j9),Cj=c.enum(R9),U9=c.enum(Yi),Lj=c.enum(gl),xk=c.object({id:c.string().min(1),name:c.string().min(1),value:c.string().min(1)}),E9=c.object({id:c.string().min(1),name:c.string().min(1),maskedValue:c.string().min(1)}),K9=c.object({authMode:c.literal("none")}),x9=c.object({tokenUrl:c.string().url(),clientId:c.string().min(1),clientSecret:c.string().min(1).optional(),tokenEndpointAuthMethod:Kk.optional(),refreshToken:c.string().min(1),headerName:c.string().min(1).default("Authorization"),headerValuePrefix:c.string().default("Bearer "),expiresAt:c.string().datetime().optional()}),G9=c.object({authMode:c.literal("headers"),headers:c.array(xk),refreshCredentials:x9.optional()}),J9=c.object({authMode:c.literal("aws-sigv4"),accessKeyId:c.string().min(1),secretAccessKey:c.string().min(1),sessionToken:c.string().min(1).optional(),region:c.string().min(1),service:c.string().min(1).default("aws-mcp")}),B9=c.preprocess((e)=>{if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0},c.string().min(1).optional()).optional(),q9=c.object({accessToken:c.string().min(1),refreshToken:c.string().min(1).optional(),tokenType:c.string().min(1).optional(),scope:B9,expiresAt:c.string().datetime().optional()}).transform(({scope:e,...t})=>{return e===void 0?t:{...t,scope:e}}),H9=c.object({authMode:c.literal("oauth"),providerId:c.string().min(1),tokens:q9,headers:c.array(xk).optional()}),M9=c.discriminatedUnion("authMode",[K9,G9,H9,J9]),W9=c.string().min(1).regex(/^enc:v1:/,"Encrypted auth config must use enc:v1 format."),Y9=c.object({codeVerifier:c.string().min(1),clientId:c.string().min(1),clientSecret:c.string().min(1).optional(),tokenEndpointAuthMethod:Kk.optional(),tokenUrl:c.string().url().optional(),resourceUrl:c.string().url().optional(),projectId:c.string().uuid().optional(),returnTo:c.string().min(1).max(2000).optional(),messageId:c.string().min(1).max(240).optional(),scopes:c.array(c.string().min(1)).optional()}),X9=c.object({type:c.string().optional(),properties:c.record(c.string(),c.unknown()).optional(),required:c.array(c.string()).optional(),additionalProperties:c.boolean().optional()}).catchall(c.unknown()),Z9=c.object({supportsOAuth:c.boolean().default(!1),supportsCustomHeaders:c.boolean().default(!0),supportsToolDiscovery:c.boolean().default(!0),readOnlyToolNames:c.array(c.string()).default([])}),Gk=c.object({name:c.string().min(1),title:c.string().min(1),description:c.string().min(1),inputSchema:X9,annotations:c.record(c.string(),c.unknown()).default({}),availability:Lj,isReadOnly:c.boolean()}),Dj=c.object({discoveredAt:c.string().datetime(),tools:c.array(Gk)}),zj=c.object({mode:c.enum(["user","system"]),managedBy:c.object({type:c.literal("integration"),id:c.string().min(1),displayName:c.string().min(1),iconKey:c.string().min(1)}).nullable(),capabilities:c.object({canRename:c.boolean(),canEditCredentials:c.boolean(),canSetReadOnly:c.boolean(),canConfigureTools:c.boolean(),canDisconnect:c.boolean()})}),F9=c.object({id:c.string().uuid(),organizationId:c.string().min(1),projectId:c.string().uuid(),providerId:c.string().min(1),source:Aj,displayName:c.string().min(1),connectionKey:c.string().min(1),serverUrl:c.string().url(),transport:$j,authMode:Tj,installStatus:Cj,installedByUserId:c.string().nullable(),connectedAt:c.string().datetime().nullable(),toolSnapshot:Dj.nullable(),enabledToolNames:c.array(c.string()),readOnly:c.boolean().default(!1),version:c.number().int().nonnegative(),createdAt:c.string().datetime(),updatedAt:c.string().datetime(),deletedAt:c.string().datetime().nullable()}),Jk=zj});var qk=K((iAe,pl)=>{var Nj,_j,jj,Rj,Uj,Ej,Kj,xj,Gj,Jj,Bj,qj,Hj,bl,Bk,Mj,Wj,Yj,Xi,Xj,Zj,Fj,Qj,Vj,e1,t1,n1,o1,yl,i1,r1,a1;(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(i){e(n(t,n(i)))});else if(typeof pl==="object"&&typeof iAe==="object")e(n(t,n(iAe)));else e(n(t));function n(i,o){if(i!==t)if(typeof Object.create==="function")Object.defineProperty(i,"__esModule",{value:!0});else i.__esModule=!0;return function(r,a){return i[r]=o?o(r,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var s in a)if(Object.prototype.hasOwnProperty.call(a,s))r[s]=a[s]};Nj=function(r,a){if(typeof a!=="function"&&a!==null)throw TypeError("Class extends value "+String(a)+" is not a constructor or null");t(r,a);function s(){this.constructor=r}r.prototype=a===null?Object.create(a):(s.prototype=a.prototype,new s)},_j=Object.assign||function(r){for(var a,s=1,h=arguments.length;s<h;s++){a=arguments[s];for(var l in a)if(Object.prototype.hasOwnProperty.call(a,l))r[l]=a[l]}return r},jj=function(r,a){var s={};for(var h in r)if(Object.prototype.hasOwnProperty.call(r,h)&&a.indexOf(h)<0)s[h]=r[h];if(r!=null&&typeof Object.getOwnPropertySymbols==="function"){for(var l=0,h=Object.getOwnPropertySymbols(r);l<h.length;l++)if(a.indexOf(h[l])<0&&Object.prototype.propertyIsEnumerable.call(r,h[l]))s[h[l]]=r[h[l]]}return s},Rj=function(r,a,s,h){var l=arguments.length,u=l<3?a:h===null?h=Object.getOwnPropertyDescriptor(a,s):h,d;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")u=Reflect.decorate(r,a,s,h);else for(var b=r.length-1;b>=0;b--)if(d=r[b])u=(l<3?d(u):l>3?d(a,s,u):d(a,s))||u;return l>3&&u&&Object.defineProperty(a,s,u),u},Uj=function(r,a){return function(s,h){a(s,h,r)}},Ej=function(r,a,s,h,l,u){function d(Ue){if(Ue!==void 0&&typeof Ue!=="function")throw TypeError("Function expected");return Ue}var b=h.kind,y=b==="getter"?"get":b==="setter"?"set":"value",w=!a&&r?h.static?r:r.prototype:null,k=a||(w?Object.getOwnPropertyDescriptor(w,h.name):{}),O,A=!1;for(var L=s.length-1;L>=0;L--){var q={};for(var Y in h)q[Y]=Y==="access"?{}:h[Y];for(var Y in h.access)q.access[Y]=h.access[Y];q.addInitializer=function(Ue){if(A)throw TypeError("Cannot add initializers after decoration has completed");u.push(d(Ue||null))};var E=(0,s[L])(b==="accessor"?{get:k.get,set:k.set}:k[y],q);if(b==="accessor"){if(E===void 0)continue;if(E===null||typeof E!=="object")throw TypeError("Object expected");if(O=d(E.get))k.get=O;if(O=d(E.set))k.set=O;if(O=d(E.init))l.unshift(O)}else if(O=d(E))if(b==="field")l.unshift(O);else k[y]=O}if(w)Object.defineProperty(w,h.name,k);A=!0},Kj=function(r,a,s){var h=arguments.length>2;for(var l=0;l<a.length;l++)s=h?a[l].call(r,s):a[l].call(r);return h?s:void 0},xj=function(r){return typeof r==="symbol"?r:"".concat(r)},Gj=function(r,a,s){if(typeof a==="symbol")a=a.description?"[".concat(a.description,"]"):"";return Object.defineProperty(r,"name",{configurable:!0,value:s?"".concat(s," ",a):a})},Jj=function(r,a){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(r,a)},Bj=function(r,a,s,h){function l(u){return u instanceof s?u:new s(function(d){d(u)})}return new(s||(s=Promise))(function(u,d){function b(k){try{w(h.next(k))}catch(O){d(O)}}function y(k){try{w(h.throw(k))}catch(O){d(O)}}function w(k){k.done?u(k.value):l(k.value).then(b,y)}w((h=h.apply(r,a||[])).next())})},qj=function(r,a){var s={label:0,sent:function(){if(u[0]&1)throw u[1];return u[1]},trys:[],ops:[]},h,l,u,d=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return d.next=b(0),d.throw=b(1),d.return=b(2),typeof Symbol==="function"&&(d[Symbol.iterator]=function(){return this}),d;function b(w){return function(k){return y([w,k])}}function y(w){if(h)throw TypeError("Generator is already executing.");while(d&&(d=0,w[0]&&(s=0)),s)try{if(h=1,l&&(u=w[0]&2?l.return:w[0]?l.throw||((u=l.return)&&u.call(l),0):l.next)&&!(u=u.call(l,w[1])).done)return u;if(l=0,u)w=[w[0]&2,u.value];switch(w[0]){case 0:case 1:u=w;break;case 4:return s.label++,{value:w[1],done:!1};case 5:s.label++,l=w[1],w=[0];continue;case 7:w=s.ops.pop(),s.trys.pop();continue;default:if((u=s.trys,!(u=u.length>0&&u[u.length-1]))&&(w[0]===6||w[0]===2)){s=0;continue}if(w[0]===3&&(!u||w[1]>u[0]&&w[1]<u[3])){s.label=w[1];break}if(w[0]===6&&s.label<u[1]){s.label=u[1],u=w;break}if(u&&s.label<u[2]){s.label=u[2],s.ops.push(w);break}if(u[2])s.ops.pop();s.trys.pop();continue}w=a.call(r,s)}catch(k){w=[6,k],l=0}finally{h=u=0}if(w[0]&5)throw w[1];return{value:w[0]?w[1]:void 0,done:!0}}},Hj=function(r,a){for(var s in r)if(s!=="default"&&!Object.prototype.hasOwnProperty.call(a,s))yl(a,r,s)},yl=Object.create?function(r,a,s,h){if(h===void 0)h=s;var l=Object.getOwnPropertyDescriptor(a,s);if(!l||("get"in l?!a.__esModule:l.writable||l.configurable))l={enumerable:!0,get:function(){return a[s]}};Object.defineProperty(r,h,l)}:function(r,a,s,h){if(h===void 0)h=s;r[h]=a[s]},bl=function(r){var a=typeof Symbol==="function"&&Symbol.iterator,s=a&&r[a],h=0;if(s)return s.call(r);if(r&&typeof r.length==="number")return{next:function(){if(r&&h>=r.length)r=void 0;return{value:r&&r[h++],done:!r}}};throw TypeError(a?"Object is not iterable.":"Symbol.iterator is not defined.")},Bk=function(r,a){var s=typeof Symbol==="function"&&r[Symbol.iterator];if(!s)return r;var h=s.call(r),l,u=[],d;try{while((a===void 0||a-- >0)&&!(l=h.next()).done)u.push(l.value)}catch(b){d={error:b}}finally{try{if(l&&!l.done&&(s=h.return))s.call(h)}finally{if(d)throw d.error}}return u},Mj=function(){for(var r=[],a=0;a<arguments.length;a++)r=r.concat(Bk(arguments[a]));return r},Wj=function(){for(var r=0,a=0,s=arguments.length;a<s;a++)r+=arguments[a].length;for(var h=Array(r),l=0,a=0;a<s;a++)for(var u=arguments[a],d=0,b=u.length;d<b;d++,l++)h[l]=u[d];return h},Yj=function(r,a,s){if(s||arguments.length===2){for(var h=0,l=a.length,u;h<l;h++)if(u||!(h in a)){if(!u)u=Array.prototype.slice.call(a,0,h);u[h]=a[h]}}return r.concat(u||Array.prototype.slice.call(a))},Xi=function(r){return this instanceof Xi?(this.v=r,this):new Xi(r)},Xj=function(r,a,s){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var h=s.apply(r,a||[]),l,u=[];return l=Object.create((typeof AsyncIterator==="function"?AsyncIterator:Object).prototype),b("next"),b("throw"),b("return",d),l[Symbol.asyncIterator]=function(){return this},l;function d(L){return function(q){return Promise.resolve(q).then(L,O)}}function b(L,q){if(h[L]){if(l[L]=function(Y){return new Promise(function(E,Ue){u.push([L,Y,E,Ue])>1||y(L,Y)})},q)l[L]=q(l[L])}}function y(L,q){try{w(h[L](q))}catch(Y){A(u[0][3],Y)}}function w(L){L.value instanceof Xi?Promise.resolve(L.value.v).then(k,O):A(u[0][2],L)}function k(L){y("next",L)}function O(L){y("throw",L)}function A(L,q){if(L(q),u.shift(),u.length)y(u[0][0],u[0][1])}},Zj=function(r){var a,s;return a={},h("next"),h("throw",function(l){throw l}),h("return"),a[Symbol.iterator]=function(){return this},a;function h(l,u){a[l]=r[l]?function(d){return(s=!s)?{value:Xi(r[l](d)),done:!1}:u?u(d):d}:u}},Fj=function(r){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var a=r[Symbol.asyncIterator],s;return a?a.call(r):(r=typeof bl==="function"?bl(r):r[Symbol.iterator](),s={},h("next"),h("throw"),h("return"),s[Symbol.asyncIterator]=function(){return this},s);function h(u){s[u]=r[u]&&function(d){return new Promise(function(b,y){d=r[u](d),l(b,y,d.done,d.value)})}}function l(u,d,b,y){Promise.resolve(y).then(function(w){u({value:w,done:b})},d)}},Qj=function(r,a){if(Object.defineProperty)Object.defineProperty(r,"raw",{value:a});else r.raw=a;return r};var n=Object.create?function(r,a){Object.defineProperty(r,"default",{enumerable:!0,value:a})}:function(r,a){r.default=a},i=function(r){return i=Object.getOwnPropertyNames||function(a){var s=[];for(var h in a)if(Object.prototype.hasOwnProperty.call(a,h))s[s.length]=h;return s},i(r)};Vj=function(r){if(r&&r.__esModule)return r;var a={};if(r!=null){for(var s=i(r),h=0;h<s.length;h++)if(s[h]!=="default")yl(a,r,s[h])}return n(a,r),a},e1=function(r){return r&&r.__esModule?r:{default:r}},t1=function(r,a,s,h){if(s==="a"&&!h)throw TypeError("Private accessor was defined without a getter");if(typeof a==="function"?r!==a||!h:!a.has(r))throw TypeError("Cannot read private member from an object whose class did not declare it");return s==="m"?h:s==="a"?h.call(r):h?h.value:a.get(r)},n1=function(r,a,s,h,l){if(h==="m")throw TypeError("Private method is not writable");if(h==="a"&&!l)throw TypeError("Private accessor was defined without a setter");if(typeof a==="function"?r!==a||!l:!a.has(r))throw TypeError("Cannot write private member to an object whose class did not declare it");return h==="a"?l.call(r,s):l?l.value=s:a.set(r,s),s},o1=function(r,a){if(a===null||typeof a!=="object"&&typeof a!=="function")throw TypeError("Cannot use 'in' operator on non-object");return typeof r==="function"?a===r:r.has(a)},i1=function(r,a,s){if(a!==null&&a!==void 0){if(typeof a!=="object"&&typeof a!=="function")throw TypeError("Object expected.");var h,l;if(s){if(!Symbol.asyncDispose)throw TypeError("Symbol.asyncDispose is not defined.");h=a[Symbol.asyncDispose]}if(h===void 0){if(!Symbol.dispose)throw TypeError("Symbol.dispose is not defined.");if(h=a[Symbol.dispose],s)l=h}if(typeof h!=="function")throw TypeError("Object not disposable.");if(l)h=function(){try{l.call(this)}catch(u){return Promise.reject(u)}};r.stack.push({value:a,dispose:h,async:s})}else if(s)r.stack.push({async:!0});return a};var o=typeof SuppressedError==="function"?SuppressedError:function(r,a,s){var h=Error(s);return h.name="SuppressedError",h.error=r,h.suppressed=a,h};r1=function(r){function a(u){r.error=r.hasError?new o(u,r.error,"An error was suppressed during disposal."):u,r.hasError=!0}var s,h=0;function l(){while(s=r.stack.pop())try{if(!s.async&&h===1)return h=0,r.stack.push(s),Promise.resolve().then(l);if(s.dispose){var u=s.dispose.call(s.value);if(s.async)return h|=2,Promise.resolve(u).then(l,function(d){return a(d),l()})}else h|=1}catch(d){a(d)}if(h===1)return r.hasError?Promise.reject(r.error):Promise.resolve();if(r.hasError)throw r.error}return l()},a1=function(r,a){if(typeof r==="string"&&/^\.\.?\//.test(r))return r.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(s,h,l,u,d){return h?a?".jsx":".js":l&&(!u||!d)?s:l+u+"."+d.toLowerCase()+"js"});return r},e("__extends",Nj),e("__assign",_j),e("__rest",jj),e("__decorate",Rj),e("__param",Uj),e("__esDecorate",Ej),e("__runInitializers",Kj),e("__propKey",xj),e("__setFunctionName",Gj),e("__metadata",Jj),e("__awaiter",Bj),e("__generator",qj),e("__exportStar",Hj),e("__createBinding",yl),e("__values",bl),e("__read",Bk),e("__spread",Mj),e("__spreadArrays",Wj),e("__spreadArray",Yj),e("__await",Xi),e("__asyncGenerator",Xj),e("__asyncDelegator",Zj),e("__asyncValues",Fj),e("__makeTemplateObject",Qj),e("__importStar",Vj),e("__importDefault",e1),e("__classPrivateFieldGet",t1),e("__classPrivateFieldSet",n1),e("__classPrivateFieldIn",o1),e("__addDisposableResource",i1),e("__disposeResources",r1),e("__rewriteRelativeImportExtension",a1)})});var Hk=K((c1)=>{Object.defineProperty(c1,"__esModule",{value:!0});c1.MAX_HASHABLE_LENGTH=c1.INIT=c1.KEY=c1.DIGEST_LENGTH=c1.BLOCK_SIZE=void 0;c1.BLOCK_SIZE=64;c1.DIGEST_LENGTH=32;c1.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]);c1.INIT=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];c1.MAX_HASHABLE_LENGTH=Math.pow(2,53)-1});var u1=K((h1)=>{Object.defineProperty(h1,"__esModule",{value:!0});h1.RawSha256=void 0;var Bt=Hk(),nV=function(){function e(){this.state=Int32Array.from(Bt.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,i=t.byteLength;if(this.bytesHashed+=i,this.bytesHashed*8>Bt.MAX_HASHABLE_LENGTH)throw Error("Cannot hash more than 2^53 - 1 bits");while(i>0)if(this.buffer[this.bufferLength++]=t[n++],i--,this.bufferLength===Bt.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),i=this.bufferLength;if(n.setUint8(this.bufferLength++,128),i%Bt.BLOCK_SIZE>=Bt.BLOCK_SIZE-8){for(var o=this.bufferLength;o<Bt.BLOCK_SIZE;o++)n.setUint8(o,0);this.hashBuffer(),this.bufferLength=0}for(var o=this.bufferLength;o<Bt.BLOCK_SIZE-8;o++)n.setUint8(o,0);n.setUint32(Bt.BLOCK_SIZE-8,Math.floor(t/4294967296),!0),n.setUint32(Bt.BLOCK_SIZE-4,t),this.hashBuffer(),this.finished=!0}var r=new Uint8Array(Bt.DIGEST_LENGTH);for(var o=0;o<8;o++)r[o*4]=this.state[o]>>>24&255,r[o*4+1]=this.state[o]>>>16&255,r[o*4+2]=this.state[o]>>>8&255,r[o*4+3]=this.state[o]>>>0&255;return r},e.prototype.hashBuffer=function(){var t=this,n=t.buffer,i=t.state,o=i[0],r=i[1],a=i[2],s=i[3],h=i[4],l=i[5],u=i[6],d=i[7];for(var b=0;b<Bt.BLOCK_SIZE;b++){if(b<16)this.temp[b]=(n[b*4]&255)<<24|(n[b*4+1]&255)<<16|(n[b*4+2]&255)<<8|n[b*4+3]&255;else{var y=this.temp[b-2],w=(y>>>17|y<<15)^(y>>>19|y<<13)^y>>>10;y=this.temp[b-15];var k=(y>>>7|y<<25)^(y>>>18|y<<14)^y>>>3;this.temp[b]=(w+this.temp[b-7]|0)+(k+this.temp[b-16]|0)}var O=(((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+(h&l^~h&u)|0)+(d+(Bt.KEY[b]+this.temp[b]|0)|0)|0,A=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+(o&r^o&a^r&a)|0;d=u,u=l,l=h,h=s+O|0,s=a,a=r,r=o,o=O+A|0}i[0]+=o,i[1]+=r,i[2]+=a,i[3]+=s,i[4]+=h,i[5]+=l,i[6]+=u,i[7]+=d},e}();h1.RawSha256=nV});var b1=K((cAe,d1)=>{var{defineProperty:ml,getOwnPropertyDescriptor:oV,getOwnPropertyNames:iV}=Object,rV=Object.prototype.hasOwnProperty,aV=(e,t)=>ml(e,"name",{value:t,configurable:!0}),cV=(e,t)=>{for(var n in t)ml(e,n,{get:t[n],enumerable:!0})},sV=(e,t,n,i)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of iV(t))if(!rV.call(e,o)&&o!==n)ml(e,o,{get:()=>t[o],enumerable:!(i=oV(t,o))||i.enumerable})}return e},hV=(e)=>sV(ml({},"__esModule",{value:!0}),e),g1={};cV(g1,{isArrayBuffer:()=>lV});d1.exports=hV(g1);var lV=aV((e)=>typeof ArrayBuffer==="function"&&e instanceof ArrayBuffer||Object.prototype.toString.call(e)==="[object ArrayBuffer]","isArrayBuffer")});var w1=K((sAe,m1)=>{var{defineProperty:wl,getOwnPropertyDescriptor:uV,getOwnPropertyNames:gV}=Object,dV=Object.prototype.hasOwnProperty,y1=(e,t)=>wl(e,"name",{value:t,configurable:!0}),bV=(e,t)=>{for(var n in t)wl(e,n,{get:t[n],enumerable:!0})},yV=(e,t,n,i)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of gV(t))if(!dV.call(e,o)&&o!==n)wl(e,o,{get:()=>t[o],enumerable:!(i=uV(t,o))||i.enumerable})}return e},pV=(e)=>yV(wl({},"__esModule",{value:!0}),e),p1={};bV(p1,{fromArrayBuffer:()=>wV,fromString:()=>vV});m1.exports=pV(p1);var mV=b1(),Mk=zP("buffer"),wV=y1((e,t=0,n=e.byteLength-t)=>{if(!(0,mV.isArrayBuffer)(e))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof e} (${e})`);return Mk.Buffer.from(e,t,n)},"fromArrayBuffer"),vV=y1((e,t)=>{if(typeof e!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof e} (${e})`);return t?Mk.Buffer.from(e,t):Mk.Buffer.from(e)},"fromString")});var O1=K((hAe,I1)=>{var{defineProperty:vl,getOwnPropertyDescriptor:kV,getOwnPropertyNames:fV}=Object,IV=Object.prototype.hasOwnProperty,Wk=(e,t)=>vl(e,"name",{value:t,configurable:!0}),OV=(e,t)=>{for(var n in t)vl(e,n,{get:t[n],enumerable:!0})},PV=(e,t,n,i)=>{if(t&&typeof t==="object"||typeof t==="function"){for(let o of fV(t))if(!IV.call(e,o)&&o!==n)vl(e,o,{get:()=>t[o],enumerable:!(i=kV(t,o))||i.enumerable})}return e},SV=(e)=>PV(vl({},"__esModule",{value:!0}),e),v1={};OV(v1,{fromUtf8:()=>f1,toUint8Array:()=>$V,toUtf8:()=>TV});I1.exports=SV(v1);var k1=w1(),f1=Wk((e)=>{let t=(0,k1.fromString)(e,"utf8");return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT)},"fromUtf8"),$V=Wk((e)=>{if(typeof e==="string")return f1(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)},"toUint8Array"),TV=Wk((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,k1.fromArrayBuffer)(e.buffer,e.byteOffset,e.byteLength).toString("utf8")},"toUtf8")});var $1=K((P1)=>{Object.defineProperty(P1,"__esModule",{value:!0});P1.convertToBuffer=void 0;var AV=O1(),CV=typeof Buffer<"u"&&Buffer.from?function(e){return Buffer.from(e,"utf8")}:AV.fromUtf8;function LV(e){if(e instanceof Uint8Array)return e;if(typeof e==="string")return CV(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(e)}P1.convertToBuffer=LV});var C1=K((T1)=>{Object.defineProperty(T1,"__esModule",{value:!0});T1.isEmptyData=void 0;function DV(e){if(typeof e==="string")return e.length===0;return e.byteLength===0}T1.isEmptyData=DV});var z1=K((L1)=>{Object.defineProperty(L1,"__esModule",{value:!0});L1.numToUint8=void 0;function zV(e){return new Uint8Array([(e&4278190080)>>24,(e&16711680)>>16,(e&65280)>>8,e&255])}L1.numToUint8=zV});var j1=K((N1)=>{Object.defineProperty(N1,"__esModule",{value:!0});N1.uint32ArrayFrom=void 0;function NV(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)}N1.uint32ArrayFrom=NV});var R1=K((Zi)=>{Object.defineProperty(Zi,"__esModule",{value:!0});Zi.uint32ArrayFrom=Zi.numToUint8=Zi.isEmptyData=Zi.convertToBuffer=void 0;var _V=$1();Object.defineProperty(Zi,"convertToBuffer",{enumerable:!0,get:function(){return _V.convertToBuffer}});var jV=C1();Object.defineProperty(Zi,"isEmptyData",{enumerable:!0,get:function(){return jV.isEmptyData}});var RV=z1();Object.defineProperty(Zi,"numToUint8",{enumerable:!0,get:function(){return RV.numToUint8}});var UV=j1();Object.defineProperty(Zi,"uint32ArrayFrom",{enumerable:!0,get:function(){return UV.uint32ArrayFrom}})});var x1=K((E1)=>{Object.defineProperty(E1,"__esModule",{value:!0});E1.Sha256=void 0;var U1=qk(),fl=Hk(),kl=u1(),Yk=R1(),KV=function(){function e(t){this.secret=t,this.hash=new kl.RawSha256,this.reset()}return e.prototype.update=function(t){if((0,Yk.isEmptyData)(t)||this.error)return;try{this.hash.update((0,Yk.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 U1.__awaiter(this,void 0,void 0,function(){return U1.__generator(this,function(t){return[2,this.digestSync()]})})},e.prototype.reset=function(){if(this.hash=new kl.RawSha256,this.secret){this.outer=new kl.RawSha256;var t=xV(this.secret),n=new Uint8Array(fl.BLOCK_SIZE);n.set(t);for(var i=0;i<fl.BLOCK_SIZE;i++)t[i]^=54,n[i]^=92;this.hash.update(t),this.outer.update(n);for(var i=0;i<t.byteLength;i++)t[i]=0}},e}();E1.Sha256=KV;function xV(e){var t=(0,Yk.convertToBuffer)(e);if(t.byteLength>fl.BLOCK_SIZE){var n=new kl.RawSha256;n.update(t),t=n.digest()}var i=new Uint8Array(fl.BLOCK_SIZE);return i.set(t),i}});var G1=K((Xk)=>{Object.defineProperty(Xk,"__esModule",{value:!0});var GV=qk();GV.__exportStar(x1(),Xk)});var Il=()=>{};var J1="io.modelcontextprotocol/related-task",Pl="2.0",qe,B1,q1,fAe,JV,BV,Zk,zt,Sl,Ve,qt,Ht,et,$l,qV,HV,H1,xa,M1,W1,IAe,Fk,MV,Qk,WV,Ga,Fi,Y1,YV,XV,ZV,FV,QV,VV,e3,t3,X1,n3,Vk,o3,i3,ef,r3,Ja,Ba,a3,qa,Tl,c3,tf,nf,of,rf,OAe,af,cf,sf,s3,Z1,F1,hf,Q1,Ha,Qi,V1,h3,l3,eR,u3,tR,lf,g3,d3,nR,oR,b3,y3,p3,m3,w3,v3,k3,f3,I3,iR,O3,P3,uf,gf,df,S3,$3,T3,bf,A3,rR,aR,C3,L3,cR,D3,sR,Al,PAe,z3,N3,hR,_3,lR,j3,R3,U3,E3,K3,x3,G3,J3,B3,Ol,q3,H3,uR,gR,dR,M3,W3,Y3,X3,Z3,F3,Q3,V3,e8,t8,n8,o8,i8,r8,a8,bR,c8,s8,yR,h8,l8,u8,g8,pR,d8,b8,y8,p8,SAe,$Ae,TAe,AAe,CAe,LAe;var jo=g(()=>{Rk();qe=Lh((e)=>e!==null&&(typeof e==="object"||typeof e==="function")),B1=Ce([v(),be().int()]),q1=v(),fAe=xe({ttl:be().optional(),pollInterval:be().optional()}),JV=G({ttl:be().optional()}),BV=G({taskId:v()}),Zk=xe({progressToken:B1.optional(),[J1]:BV.optional()}),zt=G({_meta:Zk.optional()}),Sl=zt.extend({task:JV.optional()}),Ve=G({method:v(),params:zt.loose().optional()}),qt=G({_meta:Zk.optional()}),Ht=G({method:v(),params:qt.loose().optional()}),et=xe({_meta:Zk.optional()}),$l=Ce([v(),be().int()]),qV=G({jsonrpc:Z(Pl),id:$l,...Ve.shape}).strict(),HV=G({jsonrpc:Z(Pl),...Ht.shape}).strict(),H1=G({jsonrpc:Z(Pl),id:$l,result:et}).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"})(xa||(xa={}));M1=G({jsonrpc:Z(Pl),id:$l.optional(),error:G({code:be().int(),message:v(),data:Ae().optional()})}).strict(),W1=Ce([qV,HV,H1,M1]),IAe=Ce([H1,M1]),Fk=et.strict(),MV=qt.extend({requestId:$l.optional(),reason:v().optional()}),Qk=Ht.extend({method:Z("notifications/cancelled"),params:MV}),WV=G({src:v(),mimeType:v().optional(),sizes:x(v()).optional(),theme:Qe(["light","dark"]).optional()}),Ga=G({icons:x(WV).optional()}),Fi=G({name:v(),title:v().optional()}),Y1=Fi.extend({...Fi.shape,...Ga.shape,version:v(),websiteUrl:v().optional(),description:v().optional()}),YV=zi(G({applyDefaults:Oe().optional()}),Se(v(),Ae())),XV=Ra((e)=>{if(e&&typeof e==="object"&&!Array.isArray(e)){if(Object.keys(e).length===0)return{form:{}}}return e},zi(G({form:YV.optional(),url:qe.optional()}),Se(v(),Ae()).optional())),ZV=xe({list:qe.optional(),cancel:qe.optional(),requests:xe({sampling:xe({createMessage:qe.optional()}).optional(),elicitation:xe({create:qe.optional()}).optional()}).optional()}),FV=xe({list:qe.optional(),cancel:qe.optional(),requests:xe({tools:xe({call:qe.optional()}).optional()}).optional()}),QV=G({experimental:Se(v(),qe).optional(),sampling:G({context:qe.optional(),tools:qe.optional()}).optional(),elicitation:XV.optional(),roots:G({listChanged:Oe().optional()}).optional(),tasks:ZV.optional(),extensions:Se(v(),qe).optional()}),VV=zt.extend({protocolVersion:v(),capabilities:QV,clientInfo:Y1}),e3=Ve.extend({method:Z("initialize"),params:VV}),t3=G({experimental:Se(v(),qe).optional(),logging:qe.optional(),completions:qe.optional(),prompts:G({listChanged:Oe().optional()}).optional(),resources:G({subscribe:Oe().optional(),listChanged:Oe().optional()}).optional(),tools:G({listChanged:Oe().optional()}).optional(),tasks:FV.optional(),extensions:Se(v(),qe).optional()}),X1=et.extend({protocolVersion:v(),capabilities:t3,serverInfo:Y1,instructions:v().optional()}),n3=Ht.extend({method:Z("notifications/initialized"),params:qt.optional()}),Vk=Ve.extend({method:Z("ping"),params:zt.optional()}),o3=G({progress:be(),total:De(be()),message:De(v())}),i3=G({...qt.shape,...o3.shape,progressToken:B1}),ef=Ht.extend({method:Z("notifications/progress"),params:i3}),r3=zt.extend({cursor:q1.optional()}),Ja=Ve.extend({params:r3.optional()}),Ba=et.extend({nextCursor:q1.optional()}),a3=Qe(["working","input_required","completed","failed","cancelled"]),qa=G({taskId:v(),status:a3,ttl:Ce([be(),Ca()]),createdAt:v(),lastUpdatedAt:v(),pollInterval:De(be()),statusMessage:De(v())}),Tl=et.extend({task:qa}),c3=qt.merge(qa),tf=Ht.extend({method:Z("notifications/tasks/status"),params:c3}),nf=Ve.extend({method:Z("tasks/get"),params:zt.extend({taskId:v()})}),of=et.merge(qa),rf=Ve.extend({method:Z("tasks/result"),params:zt.extend({taskId:v()})}),OAe=et.loose(),af=Ja.extend({method:Z("tasks/list")}),cf=Ba.extend({tasks:x(qa)}),sf=Ve.extend({method:Z("tasks/cancel"),params:zt.extend({taskId:v()})}),s3=et.merge(qa),Z1=G({uri:v(),mimeType:De(v()),_meta:Se(v(),Ae()).optional()}),F1=Z1.extend({text:v()}),hf=v().refine((e)=>{try{return atob(e),!0}catch{return!1}},{message:"Invalid Base64 string"}),Q1=Z1.extend({blob:hf}),Ha=Qe(["user","assistant"]),Qi=G({audience:x(Ha).optional(),priority:be().min(0).max(1).optional(),lastModified:ro.datetime({offset:!0}).optional()}),V1=G({...Fi.shape,...Ga.shape,uri:v(),description:De(v()),mimeType:De(v()),size:De(be()),annotations:Qi.optional(),_meta:De(xe({}))}),h3=G({...Fi.shape,...Ga.shape,uriTemplate:v(),description:De(v()),mimeType:De(v()),annotations:Qi.optional(),_meta:De(xe({}))}),l3=Ja.extend({method:Z("resources/list")}),eR=Ba.extend({resources:x(V1)}),u3=Ja.extend({method:Z("resources/templates/list")}),tR=Ba.extend({resourceTemplates:x(h3)}),lf=zt.extend({uri:v()}),g3=lf,d3=Ve.extend({method:Z("resources/read"),params:g3}),nR=et.extend({contents:x(Ce([F1,Q1]))}),oR=Ht.extend({method:Z("notifications/resources/list_changed"),params:qt.optional()}),b3=lf,y3=Ve.extend({method:Z("resources/subscribe"),params:b3}),p3=lf,m3=Ve.extend({method:Z("resources/unsubscribe"),params:p3}),w3=qt.extend({uri:v()}),v3=Ht.extend({method:Z("notifications/resources/updated"),params:w3}),k3=G({name:v(),description:De(v()),required:De(Oe())}),f3=G({...Fi.shape,...Ga.shape,description:De(v()),arguments:De(x(k3)),_meta:De(xe({}))}),I3=Ja.extend({method:Z("prompts/list")}),iR=Ba.extend({prompts:x(f3)}),O3=zt.extend({name:v(),arguments:Se(v(),v()).optional()}),P3=Ve.extend({method:Z("prompts/get"),params:O3}),uf=G({type:Z("text"),text:v(),annotations:Qi.optional(),_meta:Se(v(),Ae()).optional()}),gf=G({type:Z("image"),data:hf,mimeType:v(),annotations:Qi.optional(),_meta:Se(v(),Ae()).optional()}),df=G({type:Z("audio"),data:hf,mimeType:v(),annotations:Qi.optional(),_meta:Se(v(),Ae()).optional()}),S3=G({type:Z("tool_use"),name:v(),id:v(),input:Se(v(),Ae()),_meta:Se(v(),Ae()).optional()}),$3=G({type:Z("resource"),resource:Ce([F1,Q1]),annotations:Qi.optional(),_meta:Se(v(),Ae()).optional()}),T3=V1.extend({type:Z("resource_link")}),bf=Ce([uf,gf,df,T3,$3]),A3=G({role:Ha,content:bf}),rR=et.extend({description:v().optional(),messages:x(A3)}),aR=Ht.extend({method:Z("notifications/prompts/list_changed"),params:qt.optional()}),C3=G({title:v().optional(),readOnlyHint:Oe().optional(),destructiveHint:Oe().optional(),idempotentHint:Oe().optional(),openWorldHint:Oe().optional()}),L3=G({taskSupport:Qe(["required","optional","forbidden"]).optional()}),cR=G({...Fi.shape,...Ga.shape,description:v().optional(),inputSchema:G({type:Z("object"),properties:Se(v(),qe).optional(),required:x(v()).optional()}).catchall(Ae()),outputSchema:G({type:Z("object"),properties:Se(v(),qe).optional(),required:x(v()).optional()}).catchall(Ae()).optional(),annotations:C3.optional(),execution:L3.optional(),_meta:Se(v(),Ae()).optional()}),D3=Ja.extend({method:Z("tools/list")}),sR=Ba.extend({tools:x(cR)}),Al=et.extend({content:x(bf).default([]),structuredContent:Se(v(),Ae()).optional(),isError:Oe().optional()}),PAe=Al.or(et.extend({toolResult:Ae()})),z3=Sl.extend({name:v(),arguments:Se(v(),Ae()).optional()}),N3=Ve.extend({method:Z("tools/call"),params:z3}),hR=Ht.extend({method:Z("notifications/tools/list_changed"),params:qt.optional()}),_3=G({autoRefresh:Oe().default(!0),debounceMs:be().int().nonnegative().default(300)}),lR=Qe(["debug","info","notice","warning","error","critical","alert","emergency"]),j3=zt.extend({level:lR}),R3=Ve.extend({method:Z("logging/setLevel"),params:j3}),U3=qt.extend({level:lR,logger:v().optional(),data:Ae()}),E3=Ht.extend({method:Z("notifications/message"),params:U3}),K3=G({name:v().optional()}),x3=G({hints:x(K3).optional(),costPriority:be().min(0).max(1).optional(),speedPriority:be().min(0).max(1).optional(),intelligencePriority:be().min(0).max(1).optional()}),G3=G({mode:Qe(["auto","required","none"]).optional()}),J3=G({type:Z("tool_result"),toolUseId:v().describe("The unique identifier for the corresponding tool call."),content:x(bf).default([]),structuredContent:G({}).loose().optional(),isError:Oe().optional(),_meta:Se(v(),Ae()).optional()}),B3=Na("type",[uf,gf,df]),Ol=Na("type",[uf,gf,df,S3,J3]),q3=G({role:Ha,content:Ce([Ol,x(Ol)]),_meta:Se(v(),Ae()).optional()}),H3=Sl.extend({messages:x(q3),modelPreferences:x3.optional(),systemPrompt:v().optional(),includeContext:Qe(["none","thisServer","allServers"]).optional(),temperature:be().optional(),maxTokens:be().int(),stopSequences:x(v()).optional(),metadata:qe.optional(),tools:x(cR).optional(),toolChoice:G3.optional()}),uR=Ve.extend({method:Z("sampling/createMessage"),params:H3}),gR=et.extend({model:v(),stopReason:De(Qe(["endTurn","stopSequence","maxTokens"]).or(v())),role:Ha,content:B3}),dR=et.extend({model:v(),stopReason:De(Qe(["endTurn","stopSequence","maxTokens","toolUse"]).or(v())),role:Ha,content:Ce([Ol,x(Ol)])}),M3=G({type:Z("boolean"),title:v().optional(),description:v().optional(),default:Oe().optional()}),W3=G({type:Z("string"),title:v().optional(),description:v().optional(),minLength:be().optional(),maxLength:be().optional(),format:Qe(["email","uri","date","date-time"]).optional(),default:v().optional()}),Y3=G({type:Qe(["number","integer"]),title:v().optional(),description:v().optional(),minimum:be().optional(),maximum:be().optional(),default:be().optional()}),X3=G({type:Z("string"),title:v().optional(),description:v().optional(),enum:x(v()),default:v().optional()}),Z3=G({type:Z("string"),title:v().optional(),description:v().optional(),oneOf:x(G({const:v(),title:v()})),default:v().optional()}),F3=G({type:Z("string"),title:v().optional(),description:v().optional(),enum:x(v()),enumNames:x(v()).optional(),default:v().optional()}),Q3=Ce([X3,Z3]),V3=G({type:Z("array"),title:v().optional(),description:v().optional(),minItems:be().optional(),maxItems:be().optional(),items:G({type:Z("string"),enum:x(v())}),default:x(v()).optional()}),e8=G({type:Z("array"),title:v().optional(),description:v().optional(),minItems:be().optional(),maxItems:be().optional(),items:G({anyOf:x(G({const:v(),title:v()}))}),default:x(v()).optional()}),t8=Ce([V3,e8]),n8=Ce([F3,Q3,t8]),o8=Ce([n8,M3,W3,Y3]),i8=Sl.extend({mode:Z("form").optional(),message:v(),requestedSchema:G({type:Z("object"),properties:Se(v(),o8),required:x(v()).optional()})}),r8=Sl.extend({mode:Z("url"),message:v(),elicitationId:v(),url:v().url()}),a8=Ce([i8,r8]),bR=Ve.extend({method:Z("elicitation/create"),params:a8}),c8=qt.extend({elicitationId:v()}),s8=Ht.extend({method:Z("notifications/elicitation/complete"),params:c8}),yR=et.extend({action:Qe(["accept","decline","cancel"]),content:Ra((e)=>e===null?void 0:e,Se(v(),Ce([v(),be(),Oe(),x(v())])).optional())}),h8=G({type:Z("ref/resource"),uri:v()}),l8=G({type:Z("ref/prompt"),name:v()}),u8=zt.extend({ref:Ce([l8,h8]),argument:G({name:v(),value:v()}),context:G({arguments:Se(v(),v()).optional()}).optional()}),g8=Ve.extend({method:Z("completion/complete"),params:u8}),pR=et.extend({completion:xe({values:x(v()).max(100),total:De(be().int()),hasMore:De(Oe())})}),d8=G({uri:v().startsWith("file://"),name:v().optional(),_meta:Se(v(),Ae()).optional()}),b8=Ve.extend({method:Z("roots/list"),params:zt.optional()}),y8=et.extend({roots:x(d8)}),p8=Ht.extend({method:Z("notifications/roots/list_changed"),params:qt.optional()}),SAe=Ce([Vk,e3,g8,R3,P3,I3,l3,u3,d3,y3,m3,N3,D3,nf,rf,af,sf]),$Ae=Ce([Qk,ef,n3,p8,tf]),TAe=Ce([Fk,gR,dR,yR,y8,of,cf,Tl]),AAe=Ce([Vk,uR,bR,b8,nf,rf,af,sf]),CAe=Ce([Qk,ef,E3,v3,oR,hR,aR,tf,s8]),LAe=Ce([Fk,X1,pR,rR,iR,eR,tR,nR,Al,sR,of,cf,Tl])});var m8;var Cl=g(()=>{m8=Symbol("Let zodToJsonSchema decide on which parser to use")});var yf=g(()=>{Cl()});var Mt=()=>{};var pf=g(()=>{Je()});var mf=()=>{};var Ll=g(()=>{Je()});var wf=g(()=>{Je()});var vf=()=>{};var kf=g(()=>{Je()});var ff=g(()=>{Je();Mt()});var If=g(()=>{Je()});var hCe;var Dl=g(()=>{hCe=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});var zl=g(()=>{Je();Dl();Ll();Mt()});var Of=g(()=>{Je();zl();Mt()});var Pf=g(()=>{Mt()});var Nl=g(()=>{Je()});var Sf=g(()=>{Je();Nl()});var $f=()=>{};var Tf=g(()=>{Je()});var Af=g(()=>{Je();Mt()});var Cf=g(()=>{Je()});var Lf=g(()=>{Je()});var Df=g(()=>{Je()});var zf=g(()=>{Je()});var Nf=g(()=>{Mt()});var _f=g(()=>{Mt()});var jf=g(()=>{Je()});var Rf=g(()=>{Mt();pf();mf();Ll();wf();vf();kf();ff();If();Of();Pf();Sf();$f();Tf();Af();Cf();Lf();zl();Df();Dl();zf();Nf();Nl();_f();jf()});var Je=g(()=>{Cl();Rf();Mt()});var mR=()=>{};var Uf=g(()=>{Je();yf();Mt()});var wR=g(()=>{Uf();Cl();yf();Je();mR();Mt();pf();mf();Ll();wf();vf();kf();ff();If();Of();Pf();Sf();$f();Tf();Af();Cf();Lf();jf();zl();Df();Dl();zf();Nf();Nl();_f();Rf();Uf()});var kR=g(()=>{Il();wR()});var IR=g(()=>{Il();jo();kR()});var Ya=K((SR)=>{Object.defineProperty(SR,"__esModule",{value:!0});SR.regexpCode=SR.getEsmExportName=SR.getProperty=SR.safeStringify=SR.stringify=SR.strConcat=SR.addCodeArg=SR.str=SR._=SR.nil=SR._Code=SR.Name=SR.IDENTIFIER=SR._CodeOrName=void 0;class _l{}SR._CodeOrName=_l;SR.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class Vi extends _l{constructor(e){super();if(!SR.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}}}SR.Name=Vi;class nn extends _l{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 Vi)t[n.str]=(t[n.str]||0)+1;return t},{})}}SR._Code=nn;SR.nil=new nn("");function OR(e,...t){let n=[e[0]],i=0;while(i<t.length)Kf(n,t[i]),n.push(e[++i]);return new nn(n)}SR._=OR;var Ef=new nn("+");function PR(e,...t){let n=[Wa(e[0])],i=0;while(i<t.length)n.push(Ef),Kf(n,t[i]),n.push(Ef,Wa(e[++i]));return T8(n),new nn(n)}SR.str=PR;function Kf(e,t){if(t instanceof nn)e.push(...t._items);else if(t instanceof Vi)e.push(t);else e.push(L8(t))}SR.addCodeArg=Kf;function T8(e){let t=1;while(t<e.length-1){if(e[t]===Ef){let n=A8(e[t-1],e[t+1]);if(n!==void 0){e.splice(t-1,3,n);continue}e[t++]="+"}t++}}function A8(e,t){if(t==='""')return e;if(e==='""')return t;if(typeof e=="string"){if(t instanceof Vi||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 Vi))return`"${e}${t.slice(1)}`;return}function C8(e,t){return t.emptyStr()?e:e.emptyStr()?t:PR`${e}${t}`}SR.strConcat=C8;function L8(e){return typeof e=="number"||typeof e=="boolean"||e===null?e:Wa(Array.isArray(e)?e.join(","):e)}function D8(e){return new nn(Wa(e))}SR.stringify=D8;function Wa(e){return JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}SR.safeStringify=Wa;function z8(e){return typeof e=="string"&&SR.IDENTIFIER.test(e)?new nn(`.${e}`):OR`[${e}]`}SR.getProperty=z8;function N8(e){if(typeof e=="string"&&SR.IDENTIFIER.test(e))return new nn(`${e}`);throw Error(`CodeGen: invalid export name: ${e}, use explicit $id name mapping`)}SR.getEsmExportName=N8;function _8(e){return new nn(e.toString())}SR.regexpCode=_8});var Bf=K((CR)=>{Object.defineProperty(CR,"__esModule",{value:!0});CR.ValueScope=CR.ValueScopeName=CR.Scope=CR.varKinds=CR.UsedValueState=void 0;var Ot=Ya();class TR extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`);this.value=e.value}}var Rl;(function(e){e[e.Started=0]="Started",e[e.Completed=1]="Completed"})(Rl||(CR.UsedValueState=Rl={}));CR.varKinds={const:new Ot.Name("const"),let:new Ot.Name("let"),var:new Ot.Name("var")};class Gf{constructor({prefixes:e,parent:t}={}){this._names={},this._prefixes=e,this._parent=t}toName(e){return e instanceof Ot.Name?e:this.name(e)}name(e){return new Ot.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}}}CR.Scope=Gf;class Jf extends Ot.Name{constructor(e,t){super(t);this.prefix=e}setValue(e,{property:t,itemIndex:n}){this.value=e,this.scopePath=Ot._`.${new Ot.Name(t)}[${n}]`}}CR.ValueScopeName=Jf;var W8=Ot._`\n`;class AR extends Gf{constructor(e){super(e);this._values={},this._scope=e.scope,this.opts={...e,_n:e.lines?W8:Ot.nil}}get(){return this._scope}name(e){return new Jf(e,this._newName(e))}value(e,t){var n;if(t.ref===void 0)throw Error("CodeGen: ref must be passed in value");let i=this.toName(e),{prefix:o}=i,r=(n=t.key)!==null&&n!==void 0?n:t.ref,a=this._values[o];if(a){let l=a.get(r);if(l)return l}else a=this._values[o]=new Map;a.set(r,i);let s=this._scope[o]||(this._scope[o]=[]),h=s.length;return s[h]=t.ref,i.setValue(t,{property:o,itemIndex:h}),i}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 Ot._`${e}${n.scopePath}`})}scopeCode(e=this._values,t,n){return this._reduceValues(e,(i)=>{if(i.value===void 0)throw Error(`CodeGen: name "${i}" has no value`);return i.value.code},t,n)}_reduceValues(e,t,n={},i){let o=Ot.nil;for(let r in e){let a=e[r];if(!a)continue;let s=n[r]=n[r]||new Map;a.forEach((h)=>{if(s.has(h))return;s.set(h,Rl.Started);let l=t(h);if(l){let u=this.opts.es5?CR.varKinds.var:CR.varKinds.const;o=Ot._`${o}${u} ${h} = ${l};${this.opts._n}`}else if(l=i===null||i===void 0?void 0:i(h))o=Ot._`${o}${l}${this.opts._n}`;else throw new TR(h);s.set(h,Rl.Completed)})}return o}}CR.ValueScope=AR});var ge=K((Pt)=>{Object.defineProperty(Pt,"__esModule",{value:!0});Pt.or=Pt.and=Pt.not=Pt.CodeGen=Pt.operators=Pt.varKinds=Pt.ValueScopeName=Pt.ValueScope=Pt.Scope=Pt.Name=Pt.regexpCode=Pt.stringify=Pt.getProperty=Pt.nil=Pt.strConcat=Pt.str=Pt._=void 0;var ye=Ya(),on=Bf(),ao=Ya();Object.defineProperty(Pt,"_",{enumerable:!0,get:function(){return ao._}});Object.defineProperty(Pt,"str",{enumerable:!0,get:function(){return ao.str}});Object.defineProperty(Pt,"strConcat",{enumerable:!0,get:function(){return ao.strConcat}});Object.defineProperty(Pt,"nil",{enumerable:!0,get:function(){return ao.nil}});Object.defineProperty(Pt,"getProperty",{enumerable:!0,get:function(){return ao.getProperty}});Object.defineProperty(Pt,"stringify",{enumerable:!0,get:function(){return ao.stringify}});Object.defineProperty(Pt,"regexpCode",{enumerable:!0,get:function(){return ao.regexpCode}});Object.defineProperty(Pt,"Name",{enumerable:!0,get:function(){return ao.Name}});var Jl=Bf();Object.defineProperty(Pt,"Scope",{enumerable:!0,get:function(){return Jl.Scope}});Object.defineProperty(Pt,"ValueScope",{enumerable:!0,get:function(){return Jl.ValueScope}});Object.defineProperty(Pt,"ValueScopeName",{enumerable:!0,get:function(){return Jl.ValueScopeName}});Object.defineProperty(Pt,"varKinds",{enumerable:!0,get:function(){return Jl.varKinds}});Pt.operators={GT:new ye._Code(">"),GTE:new ye._Code(">="),LT:new ye._Code("<"),LTE:new ye._Code("<="),EQ:new ye._Code("==="),NEQ:new ye._Code("!=="),NOT:new ye._Code("!"),OR:new ye._Code("||"),AND:new ye._Code("&&"),ADD:new ye._Code("+")};class co{optimizeNodes(){return this}optimizeNames(e,t){return this}}class DR extends co{constructor(e,t,n){super();this.varKind=e,this.name=t,this.rhs=n}render({es5:e,_n:t}){let n=e?on.varKinds.var:this.varKind,i=this.rhs===void 0?"":` = ${this.rhs}`;return`${n} ${this.name}${i};`+t}optimizeNames(e,t){if(!e[this.name.str])return;if(this.rhs)this.rhs=tr(this.rhs,e,t);return this}get names(){return this.rhs instanceof ye._CodeOrName?this.rhs.names:{}}}class Mf extends co{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 ye.Name&&!e[this.lhs.str]&&!this.sideEffects)return;return this.rhs=tr(this.rhs,e,t),this}get names(){let e=this.lhs instanceof ye.Name?{}:{...this.lhs.names};return Gl(e,this.rhs)}}class zR extends Mf{constructor(e,t,n,i){super(e,n,i);this.op=t}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}}class NR extends co{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}}class _R extends co{constructor(e){super();this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}}class jR extends co{constructor(e){super();this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}}class RR extends co{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=tr(this.code,e,t),this}get names(){return this.code instanceof ye._CodeOrName?this.code.names:{}}}class Bl extends co{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,i=n.length;while(i--){let o=n[i];if(o.optimizeNames(e,t))continue;F8(e,o.names),n.splice(i,1)}return n.length>0?this:void 0}get names(){return this.nodes.reduce((e,t)=>Ro(e,t.names),{})}}class so extends Bl{render(e){return"{"+e._n+super.render(e)+"}"+e._n}}class UR extends Bl{}class Xa extends so{}Xa.kind="else";class Rn extends so{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 Xa(n):n}if(t){if(e===!1)return t instanceof Rn?t:t.nodes;if(this.nodes.length)return this;return new Rn(JR(e),t instanceof Rn?[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=tr(this.condition,e,t),this}get names(){let e=super.names;if(Gl(e,this.condition),this.else)Ro(e,this.else.names);return e}}Rn.kind="if";class er extends so{}er.kind="for";class ER extends er{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=tr(this.iteration,e,t),this}get names(){return Ro(super.names,this.iteration.names)}}class KR extends er{constructor(e,t,n,i){super();this.varKind=e,this.name=t,this.from=n,this.to=i}render(e){let t=e.es5?on.varKinds.var:this.varKind,{name:n,from:i,to:o}=this;return`for(${t} ${n}=${i}; ${n}<${o}; ${n}++)`+super.render(e)}get names(){let e=Gl(super.names,this.from);return Gl(e,this.to)}}class qf extends er{constructor(e,t,n,i){super();this.loop=e,this.varKind=t,this.name=n,this.iterable=i}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=tr(this.iterable,e,t),this}get names(){return Ro(super.names,this.iterable.names)}}class Ul extends so{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)}}Ul.kind="func";class El extends Bl{render(e){return"return "+super.render(e)}}El.kind="return";class xR extends so{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,i;return super.optimizeNames(e,t),(n=this.catch)===null||n===void 0||n.optimizeNames(e,t),(i=this.finally)===null||i===void 0||i.optimizeNames(e,t),this}get names(){let e=super.names;if(this.catch)Ro(e,this.catch.names);if(this.finally)Ro(e,this.finally.names);return e}}class Kl extends so{constructor(e){super();this.error=e}render(e){return`catch(${this.error})`+super.render(e)}}Kl.kind="catch";class xl extends so{render(e){return"finally"+super.render(e)}}xl.kind="finally";class GR{constructor(e,t={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...t,_n:t.lines?`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sazabi/cli",
3
- "version": "0.13.17-dev.gd6a3649",
3
+ "version": "0.13.17-dev.gf70548b",
4
4
  "description": "The Sazabi CLI",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",