@sazabi/cli 0.17.0-dev.gf51cbd3 → 0.17.0
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.
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8614,7 +8614,7 @@ Connect 1Password so Sazabi agents can work with your vaults and secrets through
|
|
|
8614
8614
|
`)}],evidenceHints:["drive.google.com / docs.google.com links, or Google Drive file IDs in runbooks","googleapis / google-auth-library packages, or GOOGLE_* / GDRIVE_* environment variables","README/runbooks naming Google Drive as a document or asset store"],helpText:"Search and read files and metadata in a Google Drive through Google's hosted MCP server."})});var sG;var hG=g(()=>{ne();sG=D({id:"grafana",label:"Grafana Cloud",iconKey:"grafana",defaultServerUrl:"https://mcp.grafana.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"grafana",callbackPathSegment:"grafana",authorizationUrl:"https://mcp.grafana.com/mcp/oauth/authorize",tokenUrl:"https://mcp.grafana.com/mcp/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp.grafana.com/mcp/oauth/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"grafana:read",label:"Read",description:"Read Grafana dashboards, panels, metrics, logs, traces, alerts, and incidents."},{value:"grafana:write",label:"Write",description:"Create and modify Grafana resources. Write tools require explicit approval per your organization's tool policy."}],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["grafana.net / grafana.com links, Grafana dashboards, or GRAFANA_* environment variables","Prometheus, Loki, Tempo, or Mimir data sources wired into Grafana","README/runbooks naming Grafana for dashboards, metrics, logs, traces, or alerts"],helpText:"Browse Grafana dashboards, metrics, logs, traces, and alerts across your Grafana Cloud stack."})});var lG;var uG=g(()=>{ne();lG=D({id:"granola",label:"Granola",iconKey:"granola",defaultServerUrl:"https://mcp.granola.ai/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"granola",callbackPathSegment:"granola",authorizationUrl:"https://mcp-auth.granola.ai/oauth2/authorize",tokenUrl:"https://mcp-auth.granola.ai/oauth2/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp-auth.granola.ai/oauth2/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["granola.ai meeting links, Granola notes exports, or GRANOLA_* environment variables","Incident, customer-call, or product-feedback docs naming Granola","Operational runbooks that refer to meeting notes or transcripts in Granola"],helpText:"Search and browse Granola meeting notes, transcripts, and folders."})});var gG;var dG=g(()=>{ne();gG=D({id:"happenstance",label:"Happenstance",iconKey:"happenstance",defaultServerUrl:"https://happenstance.ai/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"happenstance",callbackPathSegment:"happenstance",authorizationUrl:"https://happenstance.ai/oauth/authorize",tokenUrl:"https://clerk.happenstance.ai/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://clerk.happenstance.ai/oauth/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"profile",label:"Profile",description:"Read your Happenstance profile."},{value:"email",label:"Email",description:"Read the email associated with your Happenstance account."},{value:"offline_access",label:"Offline access",description:"Keep the connection alive by refreshing access without re-authentication."}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["happenstance.ai links or references to a Happenstance network/graph","HAPPENSTANCE_* environment variables or scripts calling Happenstance APIs","Docs naming Happenstance as the people/relationship search tool"],helpText:"Search your Happenstance network to find and get introduced to people."})});var yG;var bG=g(()=>{ne();yG=D({id:"honeycomb",label:"Honeycomb",iconKey:"honeycomb",defaultServerUrl:"https://mcp.honeycomb.io/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"honeycomb",callbackPathSegment:"honeycomb",authorizationUrl:"https://ui.honeycomb.io/oauth/authorize",tokenUrl:"https://ui.honeycomb.io/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://ui.honeycomb.io/oauth/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"mcp:read",label:"Read",description:"Query Honeycomb environments, datasets, columns, boards, triggers, SLOs, and run queries."},{value:"mcp:write",label:"Write",description:"Create and update Honeycomb boards, triggers, and other resources."}],scopesUserSelectable:!1,regions:[{label:"United States (US)",serverUrl:"https://mcp.honeycomb.io/mcp"},{label:"Europe (EU)",serverUrl:"https://mcp.eu1.honeycomb.io/mcp",authorizationUrl:"https://ui.eu1.honeycomb.io/oauth/authorize",tokenUrl:"https://ui.eu1.honeycomb.io/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://ui.eu1.honeycomb.io/oauth/register",tokenEndpointAuthMethod:"none"}}],capabilityOverrides:{allowWriteTools:!0},evidenceHints:["honeycomb.io URLs, HONEYCOMB_API_KEY / HONEYCOMB_DATASET environment variables, or honeycomb:// dataset URIs","libhoney, @honeycombio packages, or OpenTelemetry exporters pointed at api.honeycomb.io / api.eu1.honeycomb.io","README/runbooks naming Honeycomb as the observability or tracing provider"],helpText:"Query Honeycomb environments, datasets, columns, boards, triggers, and run queries."})});var mG;var pG=g(()=>{ne();mG=D({id:"incident-io",label:"incident.io",iconKey:"incident-io",defaultServerUrl:"https://mcp.incident.io/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"incident-io",callbackPathSegment:"incident-io",authorizationUrl:"https://app.incident.io/auth/plugin/authorize",tokenUrl:"https://app.incident.io/auth/plugin/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp.incident.io/mcp/oauth/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["incident.io alert-source URLs, escalation docs, or incident IDs","INCIDENT_IO_* environment variables or webhooks into incident.io","README/runbooks naming incident.io for incidents, alerts, or on-call"],helpText:"Browse incidents, alerts, and on-call.",skill:"incident-io",setupSkill:"incident-io-setup"})});var wG;var fG=g(()=>{ne();wG=D({id:"intercom",label:"Intercom",iconKey:"intercom",defaultServerUrl:"https://mcp.intercom.com/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Intercom config, INTERCOM_* environment variables, or intercom-client packages","Support inbox, conversations, help center, or customer messaging docs naming Intercom","README/docs naming Intercom for support threads or customer conversations"],helpText:"Read Intercom support conversations, contacts, and help center content using an Intercom API access token. US-hosted Intercom workspaces only.",setupGroups:[{id:"developer-app",title:"Open Intercom developer settings",description:"Use an Intercom app with an access token for the workspace you want to connect.",body:"In Intercom, go to **Settings > Integrations > Developer Hub**, open (or create) an app for your workspace, and confirm it has the permissions you want agents to use. The hosted MCP server lives at `https://mcp.intercom.com/mcp` and currently supports US-hosted Intercom workspaces only."},{id:"access-token",title:"Copy your access token",description:"Copy the Intercom API access token the hosted MCP server will use.",body:"From your Intercom app's **Authentication** section, copy the access token. Paste the raw token into Sazabi — Sazabi adds the `Bearer ` prefix and sends it in the `Authorization` header.",fieldKeys:["accessToken"]}],validateCredentials:UE,normalizeHeaders:RE})});var kG;var vG=g(()=>{ne();kG=D({id:"langfuse",label:"Langfuse",iconKey:"langfuse",defaultServerUrl:"https://us.cloud.langfuse.com/api/public/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",regions:[{label:"United States (US)",serverUrl:"https://us.cloud.langfuse.com/api/public/mcp"},{label:"Europe (EU)",serverUrl:"https://cloud.langfuse.com/api/public/mcp"},{label:"Asia Pacific (JP)",serverUrl:"https://jp.cloud.langfuse.com/api/public/mcp"}],capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Langfuse SDK usage (langfuse, langfuse-langchain) or @langfuse packages","LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY / LANGFUSE_HOST environment variables","README/docs naming Langfuse as the LLM tracing, evaluation, or observability provider"],helpText:"Query Langfuse traces, observations, metrics, scores, comments, and prompts using project API keys.",setupGroups:[{id:"region",title:"Pick your Langfuse Cloud region",description:"Select the Langfuse Cloud region that hosts your project (or use the custom connector for a self-hosted deployment).",body:"Langfuse Cloud is region-scoped: US (`https://us.cloud.langfuse.com`), EU (`https://cloud.langfuse.com`), or JP (`https://jp.cloud.langfuse.com`). Choose the region matching your Langfuse account; the hosted MCP server lives at `/api/public/mcp` on that host."},{id:"api-keys",title:"Create project API keys",description:"Generate the Langfuse project API key pair the hosted MCP server will use.",body:"In Langfuse, open **Project settings → API keys** and create a new key pair. Copy the Public key (`pk-lf-...`) and Secret key (`sk-lf-...`). Sazabi combines them into an HTTP Basic `Authorization` header (`Basic base64(publicKey:secretKey)`) and sends it to the MCP server. Paste the combined `Authorization` value into Sazabi.",fieldKeys:["authorization"]}],validateCredentials:eq,normalizeHeaders:QE})});var SG;var PG=g(()=>{ne();SG=D({id:"langsmith",label:"LangSmith",iconKey:"langsmith",defaultServerUrl:"https://api.smith.langchain.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"langsmith",callbackPathSegment:"langsmith",authorizationUrl:"https://api.smith.langchain.com/oauth/authorize",tokenUrl:"https://api.smith.langchain.com/oauth/token",resourceUrl:"https://api.smith.langchain.com/mcp",dynamicClientRegistration:{registrationEndpoint:"https://api.smith.langchain.com/oauth/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[],scopesUserSelectable:!1,regions:[{label:"GCP United States (US)",serverUrl:"https://api.smith.langchain.com/mcp"},{label:"GCP Europe (EU)",serverUrl:"https://eu.api.smith.langchain.com/mcp",authorizationUrl:"https://eu.api.smith.langchain.com/oauth/authorize",tokenUrl:"https://eu.api.smith.langchain.com/oauth/token",resourceUrl:"https://eu.api.smith.langchain.com/mcp",dynamicClientRegistration:{registrationEndpoint:"https://eu.api.smith.langchain.com/oauth/register",tokenEndpointAuthMethod:"none"}},{label:"GCP Asia Pacific (APAC)",serverUrl:"https://apac.api.smith.langchain.com/mcp",authorizationUrl:"https://apac.api.smith.langchain.com/oauth/authorize",tokenUrl:"https://apac.api.smith.langchain.com/oauth/token",resourceUrl:"https://apac.api.smith.langchain.com/mcp",dynamicClientRegistration:{registrationEndpoint:"https://apac.api.smith.langchain.com/oauth/register",tokenEndpointAuthMethod:"none"}},{label:"AWS United States (US)",serverUrl:"https://aws.api.smith.langchain.com/mcp",authorizationUrl:"https://aws.api.smith.langchain.com/oauth/authorize",tokenUrl:"https://aws.api.smith.langchain.com/oauth/token",resourceUrl:"https://aws.api.smith.langchain.com/mcp",dynamicClientRegistration:{registrationEndpoint:"https://aws.api.smith.langchain.com/oauth/register",tokenEndpointAuthMethod:"none"}}],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["LANGSMITH_* or LANGCHAIN_* environment variables, or langsmith SDK usage","LangSmith tracing projects, runs, datasets, or evaluations","README/docs naming LangSmith for LLM tracing, evals, or observability"],helpText:"Query LangSmith tracing projects, runs, datasets, and evaluations to investigate LLM application behavior."})});var $G;var IG=g(()=>{ne();$G=D({id:"linear",label:"Linear",iconKey:"linear",defaultServerUrl:"https://mcp.linear.app/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"linear",callbackPathSegment:"linear",authorizationUrl:"https://mcp.linear.app/authorize",tokenUrl:"https://mcp.linear.app/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp.linear.app/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"read",label:"Read",description:"Read Linear issues, projects, teams, comments, and related data."},{value:"write",label:"Write",description:"Create and update Linear issues, comments, and project data."}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},skill:"linear",setupSkill:"linear-setup",evidenceHints:["linear.app URLs, Linear issue keys, or team/project IDs in docs","LINEAR_* environment variables or scripts that call Linear APIs","README/runbooks naming Linear as the issue tracker or planning system"],helpText:"Browse and manage Linear issues and projects."})});var LG;var TG=g(()=>{ne();LG=D({id:"logfire",label:"Pydantic Logfire",iconKey:"logfire",defaultServerUrl:"https://logfire-us.pydantic.dev/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"logfire",callbackPathSegment:"logfire",authorizationUrl:"https://logfire-us.pydantic.dev/api/oauth/authorize",tokenUrl:"https://logfire-us.pydantic.dev/api/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://logfire-us.pydantic.dev/api/oauth/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"openid",required:!0},{value:"organization:read_channel"},{value:"project:read"},{value:"project:read_alert"},{value:"project:read_dashboard"},{value:"project:read_variables"}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Pydantic Logfire config, LOGFIRE_* environment variables, or logfire SDK packages","Python/Pydantic observability docs naming Logfire","Alerts, dashboards, or traces hosted in Logfire"],helpText:"Query Pydantic Logfire traces, metrics, and exceptions, and browse projects, alerts, dashboards, and schedules."})});var OG;var AG=g(()=>{ne();OG=D({id:"mercury",label:"Mercury",iconKey:"mercury",defaultServerUrl:"https://mcp.mercury.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"mercury",callbackPathSegment:"mercury",authorizationUrl:"https://mcp.mercury.com/authorize",tokenUrl:"https://mcp.mercury.com/token",resourceUrl:"https://mcp.mercury.com/mcp",omitScopeFromAuthorizationUrl:!0,dynamicClientRegistration:{registrationEndpoint:"https://mcp.mercury.com/register",tokenEndpointAuthMethod:"client_secret_basic",includeScopesInRegistration:!0}},getAvailableScopes:async()=>[{value:"read",label:"Read access",description:"Read Mercury accounts, cards, recipients, transactions, treasury, and organization data."}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!1},skill:"mercury",setupSkill:"mercury-setup",evidenceHints:["Mercury dashboard links, mercury.com references, or Mercury API usage","MERCURY_* environment variables or docs mentioning Mercury banking","Treasury, card, account, recipient, or transaction workflows backed by Mercury"],helpText:"Search Mercury banking data including accounts, cards, recipients, transactions, treasury, and organization records."})});var CG;var DG=g(()=>{ne();CG=D({id:"neon",label:"Neon",iconKey:"neon",defaultServerUrl:"https://mcp.neon.tech/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"neon",callbackPathSegment:"neon",authorizationUrl:"https://mcp.neon.tech/api/authorize",tokenUrl:"https://mcp.neon.tech/api/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp.neon.tech/api/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"read",label:"Read",description:"Read Neon projects, branches, databases, and run queries."},{value:"write",label:"Write",description:"Create and modify Neon projects, branches, and databases."},{value:"*",label:"Full access",description:"All access - read and manage every Neon resource the connected account can reach."}],getUrlConfiguration:async()=>({docsUrl:"https://neon.com/docs/ai/neon-mcp-server",instructions:"Start with https://mcp.neon.tech/mcp. To narrow access, append query params such as `?readonly=true`, `&projectId=<id>`, and/or `&category=<groups>`, then copy the resulting Server URL.",defaultServerUrl:"https://mcp.neon.tech/mcp",imageKeys:["mcp.neon.projects-console","mcp.neon.project-settings-details"],optional:!0}),capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Neon connection strings, neon.tech hosts, or @neondatabase/serverless packages","DATABASE_URL/POSTGRES_URL values documented as Neon","README/docs naming Neon as the Postgres provider"],helpText:"Manage Neon projects, branches, databases, and run SQL queries."})});var zG;var _G=g(()=>{ne();zG=D({id:"notion",label:"Notion",iconKey:"notion",defaultServerUrl:"https://mcp.notion.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"notion",callbackPathSegment:"notion",authorizationUrl:"https://mcp.notion.com/authorize",tokenUrl:"https://mcp.notion.com/token",resourceUrl:"https://mcp.notion.com/mcp",dynamicClientRegistration:{registrationEndpoint:"https://mcp.notion.com/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"default",label:"Default",description:"Access Notion pages, databases, and workspace content via MCP."}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},skill:"notion",setupSkill:"notion-setup",evidenceHints:["notion.so URLs, Notion page IDs, or database IDs in docs","NOTION_* environment variables or scripts that call Notion APIs","README/runbooks naming Notion as the wiki or knowledge base"],helpText:"Browse and manage Notion pages, databases, and workspace content."})});var jG;var NG=g(()=>{ne();jG=D({id:"1password",label:"1Password",iconKey:"onepassword",defaultServerUrl:"https://developer.1password.com/get-started/secure-ai-access",transport:"streamable-http",authMode:"none",availability:"disabled",getUrlConfiguration:async()=>null,evidenceHints:["1Password service-account tokens (ops_...), op CLI usage, or OP_SERVICE_ACCOUNT_TOKEN","1password.com / *.1password.com references, or op:// secret references","README/docs naming 1Password as the secrets manager or vault"],helpText:"Access 1Password via its documented secure AI access options. A general-purpose hosted MCP server is not available today; use the 1Password CLI (op) sandbox preset instead."})});var xG;var RG=g(()=>{ne();xG=D({id:"paper",label:"Paper MCP",iconKey:"paper",defaultServerUrl:"http://127.0.0.1:29979/mcp",transport:"streamable-http",authMode:"none",availability:"disabled",getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["paper.design URLs, Paper Desktop app references, or PAPER_* environment variables","Design files, component libraries, or design-system docs naming Paper","HTML-to-PDF slide or presentation workflows that reference Paper"],helpText:"Read and write Paper design files, including nodes, selections, text content, and design-system elements."})});var UG;var MG=g(()=>{ne();UG=D({id:"plain",label:"Plain",iconKey:"plain",defaultServerUrl:"https://mcp.plain.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"plain",callbackPathSegment:"plain",authorizationUrl:"https://signin.auth.plain.com/oauth2/authorize",tokenUrl:"https://signin.auth.plain.com/oauth2/token",dynamicClientRegistration:{registrationEndpoint:"https://signin.auth.plain.com/oauth2/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"openid",required:!0},{value:"offline_access",required:!0}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["plain.com links, Plain customer/thread IDs, or PLAIN_* environment variables","Support inbox, customer thread, or tenant docs naming Plain","Code or scripts syncing customers, tenants, or support threads with Plain"],helpText:"Search and manage Plain support threads, customers, and tenants.",skill:"plain",setupSkill:"plain-setup"})});var KG;var EG=g(()=>{ne();KG=D({id:"planetscale",label:"PlanetScale",iconKey:"planetscale",defaultServerUrl:"https://mcp.pscale.dev/mcp/planetscale",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"planetscale",callbackPathSegment:"planetscale",authorizationUrl:"https://app.planetscale.com/oauth/authorize",tokenUrl:"https://auth.planetscale.com/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://auth.planetscale.com/oauth/registration",tokenEndpointAuthMethod:"client_secret_basic"}},getAvailableScopes:async()=>[{value:"read_databases"},{value:"read_user"},{value:"read_organization"},{value:"write_databases"},{value:"write_organization"}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["PlanetScale connection strings, pscale CLI config, or planetscale.com links","PLANETSCALE_* or DATABASE_URL values documented as PlanetScale","README/docs naming PlanetScale for MySQL, branching, or schema changes"],helpText:"Query PlanetScale databases, inspect schema, and browse Insights data.",skill:"planetscale",setupSkill:"planetscale-setup"})});var qG;var GG=g(()=>{ne();qG=D({id:"posthog",label:"PostHog",iconKey:"posthog",defaultServerUrl:"https://mcp.posthog.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"posthog",callbackPathSegment:"posthog",authorizationUrl:"https://oauth.posthog.com/oauth/authorize/",tokenUrl:"https://oauth.posthog.com/oauth/token/",dynamicClientRegistration:{registrationEndpoint:"https://oauth.posthog.com/oauth/register/",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"query:read"},{value:"insight:read"},{value:"insight:write"},{value:"feature_flag:read"},{value:"feature_flag:write"},{value:"experiment:read"},{value:"experiment:write"},{value:"dashboard:read"},{value:"dashboard:write"},{value:"event_definition:read"},{value:"event_definition:write"},{value:"person:read"},{value:"user:read"},{value:"user:write"},{value:"organization:read"},{value:"project:read"},{value:"project:write"},{value:"survey:read"},{value:"survey:write"},{value:"error_tracking:read"},{value:"logs:read"},{value:"tracing:read"}],getUrlConfiguration:async()=>({docsUrl:"https://posthog.com/docs/model-context-protocol/faq",instructions:"Add ?features=<groups> or ?tools=<names> to limit which tools are exposed (e.g. https://mcp.posthog.com/mcp?features=flags,workspace), then copy the Server URL.",defaultServerUrl:"https://mcp.posthog.com/mcp",imageKeys:["mcp.posthog.settings-page"],optional:!0}),capabilityOverrides:{allowWriteTools:!0},evidenceHints:["posthog-js, posthog-node, POSTHOG_* or NEXT_PUBLIC_POSTHOG_* environment variables","Feature flag, experiment, session replay, or product analytics code using PostHog","README/docs naming PostHog for analytics, flags, experiments, logs, or tracing"],helpText:"Query PostHog analytics, feature flags, and experiments.",skill:"posthog",setupSkill:"posthog-setup"})});var JG;var HG=g(()=>{ne();JG=D({id:"pylon",label:"Pylon",iconKey:"pylon",defaultServerUrl:"https://mcp.usepylon.com",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"pylon",callbackPathSegment:"pylon",authorizationUrl:"https://o.auth.usepylon.com/oauth2/authorize",tokenUrl:"https://o.auth.usepylon.com/oauth2/token",dynamicClientRegistration:{registrationEndpoint:"https://o.auth.usepylon.com/oauth2/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"openid",required:!0},{value:"offline_access",required:!0}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["usepylon.com links, Pylon issue/account IDs, or PYLON_* environment variables","Customer support workflows or account runbooks naming Pylon","Code or scripts syncing support issues, accounts, or contacts with Pylon"],helpText:"Search and manage Pylon support issues, accounts, and contacts.",skill:"pylon",setupSkill:"pylon-setup"})});var BG;var WG=g(()=>{ne();BG=D({id:"railway",label:"Railway",iconKey:"railway",defaultServerUrl:"https://mcp.railway.com",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"railway",callbackPathSegment:"railway",authorizationUrl:"https://backboard.railway.com/oauth/auth",tokenUrl:"https://backboard.railway.com/oauth/token",resourceUrl:"https://mcp.railway.com",dynamicClientRegistration:{registrationEndpoint:"https://backboard.railway.com/oauth/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"openid",required:!0},{value:"profile",required:!0},{value:"email",required:!0},{value:"offline_access",required:!0},{value:"workspace:member",label:"Workspace access",description:"Read and manage Railway projects, services, deployments, variables, and logs in the workspaces the connected account belongs to."}],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},skill:"railway",setupSkill:"railway-setup",evidenceHints:["railway.app / railway.com links, RAILWAY_* environment variables, or a railway.json/railway.toml in the repo","Deploy workflows or runbooks naming Railway as the hosting/PaaS provider","Railway project/service/environment IDs referenced in docs or CI"],helpText:"Manage Railway projects, services, deployments, variables, and logs."})});var ZG;var FG=g(()=>{ne();ZG=D({id:"render",label:"Render",iconKey:"render",defaultServerUrl:"https://mcp.render.com/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["render.com links, RENDER_* environment variables, or a render.yaml in the repo","Deploy workflows or runbooks naming Render as the hosting/PaaS provider","Render service/deploy IDs referenced in docs or CI"],helpText:"Manage Render services, deploys, environment variables, logs, and metrics.",setupGroups:[{id:"api-key",title:"Create an API key",description:"Create or copy the Render API key Sazabi will send to Render's hosted MCP endpoint.",body:"Create a Render [API key](https://dashboard.render.com/settings/api-keys) in **Account Settings > API Keys**, then paste it below.",fieldKeys:["apiKey"]}],validateCredentials:KE,normalizeHeaders:ME})});var XG;var YG=g(()=>{ne();XG=D({id:"rentahuman",label:"RentAHuman",iconKey:"rentahuman",defaultServerUrl:"https://rentahuman.ai/api/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["rentahuman.ai, RENTAHUMAN_API_KEY environment variables, or RentAHuman API keys","rentahuman-mcp usage or a rentahuman.ai/api/mcp server URL in MCP client config","README/docs naming RentAHuman for hiring humans or human-in-the-loop work"],helpText:"Hire and coordinate human workers for real-world tasks with RentAHuman's hosted MCP server using an API key.",setupGroups:[{id:"api-key",title:"Create an API key",description:"Create or copy the RentAHuman API key Sazabi will send to its hosted MCP endpoint.",body:"Create or copy an API key from the [RentAHuman API keys page](https://rentahuman.ai/account/api-keys), then paste it below. Sazabi stores it securely and sends it as the `X-API-Key` header.",fieldKeys:["apiKey"]}],validateCredentials:ZE,normalizeHeaders:WE,skill:"rentahuman",setupSkill:"rentahuman-setup"})});var QG;var VG=g(()=>{ne();QG=D({id:"resend",label:"Resend",iconKey:"resend",defaultServerUrl:"https://mcp.resend.com/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Resend email API usage, RESEND_API_KEY environment variables, or the resend SDK","resend-mcp usage or a mcp.resend.com server URL in MCP client config","README/docs naming Resend for transactional or marketing email"],helpText:"Send transactional emails and manage domains, contacts, and audiences with Resend's hosted MCP server using your Resend API key.",setupGroups:[{id:"api-key",title:"Create an API key",description:"Create or copy the Resend API key Sazabi will send to Resend's hosted MCP endpoint.",body:"Create or copy an API key from the [Resend dashboard](https://resend.com/api-keys), then paste it below. Sazabi stores it securely and sends it as the `Authorization: Bearer` token to Resend's MCP endpoint (`https://mcp.resend.com/mcp`).",fieldKeys:["apiKey"]}],validateCredentials:nq,normalizeHeaders:tq,skill:"resend",setupSkill:"resend-setup"})});var eJ;var tJ=g(()=>{ne();eJ=D({id:"respan",label:"Respan",iconKey:"respan",defaultServerUrl:"https://mcp.respan.ai/api/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Respan / Keywords AI observability usage, RESPAN_API_KEY environment variables, or the respan-ai / keywordsai SDK","respan-mcp usage or a mcp.respan.ai server URL in MCP client config","README/docs naming Respan or Keywords AI for LLM logs, traces, or prompt management"],helpText:"Query LLM request logs, traces, prompts, and customer data from your Respan account using Respan's hosted MCP server and your Respan API key.",setupGroups:[{id:"api-key",title:"Create an API key",description:"Create or copy the Respan API key Sazabi will send to Respan's hosted MCP endpoint.",body:"Create or copy an API key from the [Respan dashboard](https://platform.respan.ai/platform/api/api-keys), then paste it below. Sazabi stores it securely and sends it as the `Authorization: Bearer` token to Respan's MCP endpoint (`https://mcp.respan.ai/api/mcp`).",fieldKeys:["apiKey"]}],validateCredentials:rq,normalizeHeaders:oq,skill:"respan",setupSkill:"respan-setup"})});var nJ;var oJ=g(()=>{ne();nJ=D({id:"salesforce",label:"Salesforce",iconKey:"salesforce",defaultServerUrl:"https://api.salesforce.com/platform/mcp/v1/platform/sobject-all",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"salesforce",callbackPathSegment:"salesforce",authorizationUrl:"https://login.salesforce.com/services/oauth2/authorize",tokenUrl:"https://login.salesforce.com/services/oauth2/token"},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"mcp_api",label:"MCP API access",description:"Access Salesforce data and metadata (sObjects, Apex invocable actions, Flows) through the hosted MCP server. Salesforce hosted MCP External Client Apps require the MCP-specific `mcp_api` scope."},{value:"refresh_token",label:"Offline access",description:"Refresh the access token without requiring the user to re-authenticate.",required:!0}],capabilityOverrides:{allowWriteTools:!0},setupGroups:[{id:"external-client-app",title:"Register an External Client App in Salesforce",description:"Salesforce hosted MCP servers do not support automatic client registration. An admin must create an External Client App (ECA) in the org and enable it for the hosted MCP server.",body:["1. In Salesforce Setup, open **App Manager** and create a new **External Client App**.","2. Enable OAuth, add the **mcp_api** and **refresh_token (offline access)** scopes, and require PKCE.","3. Set the callback URL to the Sazabi Salesforce MCP callback URL shown on this page.","4. Enable the app for your hosted MCP server under **Setup → MCP Servers**.","5. Provide the generated **Consumer Key (Client ID)** and **Consumer Secret (Client Secret)** to your Sazabi deployment configuration."].join(`
|
|
8615
8615
|
`)}],evidenceHints:["force.com / my.salesforce.com URLs, SALESFORCE_* or SFDC_* environment variables, or sf/sfdx CLI usage","jsforce, simple-salesforce, or @salesforce packages","README/runbooks naming Salesforce as the CRM or system of record"],helpText:"Query Salesforce data and metadata, and run Apex invocable actions and Flows exposed by a hosted MCP server."})});var rJ;var iJ=g(()=>{ne();rJ=D({id:"sentry",label:"Sentry",iconKey:"sentry",defaultServerUrl:"https://mcp.sentry.dev/mcp",serverUrlPathSuffixMaxSegments:2,transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"sentry",callbackPathSegment:"sentry",authorizationUrl:"https://mcp.sentry.dev/oauth/authorize",tokenUrl:"https://mcp.sentry.dev/oauth/token",useServerUrlAsResource:!0,dynamicClientRegistration:{registrationEndpoint:"https://mcp.sentry.dev/oauth/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"org:read"},{value:"project:write"},{value:"team:write"},{value:"event:write"}],getUrlConfiguration:async()=>({docsUrl:"https://mcp.sentry.dev/",instructions:"Copy `https://mcp.sentry.dev/mcp` for broad access. To scope this connection to one organization or project, copy a path-scoped URL such as `https://mcp.sentry.dev/mcp/your-org` or `https://mcp.sentry.dev/mcp/your-org/your-project`.",defaultServerUrl:"https://mcp.sentry.dev/mcp",imageKeys:["mcp.sentry.url-configuration-page"],optional:!0}),capabilityOverrides:{allowWriteTools:!0},evidenceHints:["@sentry packages, sentry.properties, SENTRY_* environment variables, or sentry-cli usage","Sentry.init calls, release/deploy automation, or Sentry alert docs","README/docs naming Sentry as the error tracking provider"],helpText:"Browse Sentry organizations, teams, projects, and events."})});var aJ;var cJ=g(()=>{ne();aJ=D({id:"signoz",label:"SigNoz",iconKey:"signoz",defaultServerUrl:"https://mcp.us.signoz.cloud/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!0},evidenceHints:["SigNoz config, SIGNOZ_* environment variables, or signoz.io links","OpenTelemetry Collector exporting to SigNoz, or a signoz docker-compose / self-hosted deployment","README/docs naming SigNoz for metrics, logs, traces, alerts, or dashboards"],helpText:"Query SigNoz metrics, logs, traces, alerts, and dashboards to investigate production issues.",setupGroups:[{id:"instance",title:"Find your SigNoz instance",description:"Point Sazabi at the SigNoz instance whose telemetry you want to query.",body:"For SigNoz Cloud, use the regional MCP endpoint for your account, such as `https://mcp.us.signoz.cloud/mcp` (replace the region as needed). For self-hosted SigNoz, use your instance's MCP endpoint and set the SigNoz base URL below so the server knows which instance to target.",fieldKeys:["signozUrl"]},{id:"api-key",title:"Create an API key",description:"Create or copy the SigNoz API key Sazabi will send to SigNoz's MCP endpoint.",body:"In SigNoz, go to **Settings > API Keys** and create or copy an API key. Alert, dashboard, and notification-channel tools require an admin-level key. Paste it below.",fieldKeys:["apiKey"]}],validateCredentials:qE,normalizeHeaders:EE})});var sJ;var hJ=g(()=>{ne();sJ=D({id:"stripe",label:"Stripe MCP",iconKey:"stripe",defaultServerUrl:"https://mcp.stripe.com",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"stripe",callbackPathSegment:"stripe",authorizationUrl:"https://access.stripe.com/mcp/oauth2/authorize",tokenUrl:"https://access.stripe.com/mcp/oauth2/token",resourceUrl:"https://mcp.stripe.com",dynamicClientRegistration:{registrationEndpoint:"https://access.stripe.com/mcp/oauth2/register",tokenEndpointAuthMethod:"none"}},getAvailableScopes:async()=>[{value:"mcp",label:"MCP access",description:"Access the Stripe MCP server tools for the connected account.",required:!0}],scopesUserSelectable:!1,getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Stripe dashboard URLs, `sk_`/`rk_`/`pk_` API keys, or Stripe object IDs (cus_, pi_, ch_)","STRIPE_* environment variables or code that imports the `stripe` SDK","README/runbooks naming Stripe for billing, payments, or subscriptions"],helpText:"Query and manage Stripe payments, customers, and billing."})});var lJ;var uJ=g(()=>{ne();lJ=D({id:"supabase",label:"Supabase",iconKey:"supabase",defaultServerUrl:"https://mcp.supabase.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"supabase",callbackPathSegment:"supabase",authorizationUrl:"https://api.supabase.com/v1/oauth/authorize",tokenUrl:"https://api.supabase.com/v1/oauth/token",dynamicClientRegistration:{registrationEndpoint:"https://api.supabase.com/platform/oauth/apps/register",tokenEndpointAuthMethod:"client_secret_post"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"analytics:read"},{value:"auth:read"},{value:"auth:write"},{value:"database:read"},{value:"database:write"},{value:"domains:read"},{value:"domains:write"},{value:"edge_functions:read"},{value:"edge_functions:write"},{value:"environment:read"},{value:"environment:write"},{value:"organizations:read"},{value:"projects:read"},{value:"projects:write"},{value:"rest:read"},{value:"rest:write"},{value:"secrets:read"},{value:"secrets:write"},{value:"storage:read"}],getUrlConfiguration:async()=>({docsUrl:"https://supabase.com/docs/guides/getting-started/mcp#step-2-configure-your-ai-tool",instructions:"Choose your project and options in the Supabase configuration panel, then copy the generated Server URL.",defaultServerUrl:"https://mcp.supabase.com/mcp",optional:!0}),capabilityOverrides:{allowWriteTools:!0},evidenceHints:["supabase/ directory, supabase/config.toml, or @supabase packages","SUPABASE_* or NEXT_PUBLIC_SUPABASE_* environment variables","README/docs naming Supabase for Postgres, Auth, Storage, or Edge Functions"],helpText:"Manage Supabase organizations, projects, databases, and run SQL.",skill:"supabase",setupSkill:"supabase-setup"})});var gJ;var dJ=g(()=>{ne();gJ=D({id:"superhuman",label:"Superhuman",iconKey:"superhuman",defaultServerUrl:"https://mcp.mail.superhuman.com/mcp",transport:"streamable-http",authMode:"oauth",availability:"enabled",oauth:{providerConfigKey:"superhuman",callbackPathSegment:"superhuman",authorizationUrl:"https://mcp.auth.mail.superhuman.com/oauth2/authorize",tokenUrl:"https://mcp.auth.mail.superhuman.com/oauth2/token",dynamicClientRegistration:{registrationEndpoint:"https://mcp.auth.mail.superhuman.com/oauth2/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"email",required:!0},{value:"offline_access",required:!0},{value:"openid",required:!0},{value:"profile",required:!0}],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["Superhuman mail links, SUPERHUMAN_* environment variables, or support workflows naming Superhuman","Customer communication runbooks that depend on email search or drafting","Docs naming Superhuman Mail for sales, support, or founder-led customer comms"],helpText:"Search, draft, send, and triage emails in Superhuman Mail."})});var yJ;var bJ=g(()=>{ne();yJ=D({id:"the-context-company",label:"The Context Company",iconKey:"the-context-company",defaultServerUrl:"https://api.thecontext.company/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{allowWriteTools:!1},evidenceHints:["The Context Company, context company, or context observability references","insight_search, get_agent_runs, or get_agent_sessions tool usage","THE_CONTEXT_COMPANY_API_KEY or api.thecontext.company in MCP configuration"],helpText:"Query agent insights, runs, and sessions through The Context Company's read-only hosted MCP server.",setupGroups:[{id:"api-key",title:"Create a read-only API key",description:"Create the API key The Context Company's hosted MCP server will use.",body:"Create a read-only API key in [The Context Company](https://docs.thecontext.company/access-data/mcp), then paste the raw key below. Sazabi sends it as `Authorization: Bearer <key>` to `https://api.thecontext.company/mcp`.",fieldKeys:["apiKey"]}],validateCredentials:_E,normalizeHeaders:zE,skill:"the-context-company",setupSkill:"the-context-company-setup"})});var mJ;var pJ=g(()=>{ne();mJ=D({id:"vercel",label:"Vercel",iconKey:"vercel",defaultServerUrl:"https://mcp.vercel.com",transport:"streamable-http",authMode:"oauth",availability:"disabled",oauth:{providerConfigKey:"vercel",callbackPathSegment:"vercel",authorizationUrl:"https://vercel.com/oauth/authorize",tokenUrl:"https://vercel.com/api/login/oauth/token",resourceUrl:"https://mcp.vercel.com",dynamicClientRegistration:{registrationEndpoint:"https://vercel.com/api/login/oauth/register",tokenEndpointAuthMethod:"none"}},scopesUserSelectable:!1,getAvailableScopes:async()=>[{value:"openid",required:!0},{value:"offline_access",required:!0}],getUrlConfiguration:async()=>null,capabilityOverrides:{allowWriteTools:!0},evidenceHints:["vercel.com links, VERCEL_* environment variables, or a vercel.json in the repo","Deploy workflows or runbooks naming Vercel as the frontend/hosting provider","Vercel project/deployment IDs or preview URLs referenced in docs or CI"],helpText:"Manage Vercel projects, deployments, and access Vercel platform documentation."})});var wJ;var fJ=g(()=>{ne();wJ=D({id:"x",label:"X",iconKey:"x",defaultServerUrl:"https://api.x.com/mcp",transport:"streamable-http",authMode:"headers",availability:"enabled",capabilityOverrides:{readOnlyToolNames:["search_news","get_news","get_trends_by_woeid","get_posts_by_ids","get_posts_counts_recent","search_posts_all","get_posts_by_id","get_posts_liking_users","get_posts_quoted_posts","get_posts_reposted_by","get_users_by_usernames","get_users_by_username","get_users_me","search_users","get_users_by_id","get_users_bookmarks","get_users_bookmark_folders","get_users_bookmarks_by_folder_id","get_users_mentions","get_users_timeline","get_users_posts"]},evidenceHints:["X (Twitter) API usage, X_BEARER_TOKEN, or TWITTER_* environment variables","twitter-api-v2, tweepy, or other X/Twitter API client packages","README/docs naming the X API, X Developer Platform, or tweet automation"],helpText:"Search X posts and access real-time X data using an X API OAuth 2.0 Bearer token.",setupGroups:[{id:"developer-app",title:"Open the X Developer Portal",description:"Use an X developer project/app with access to the X API v2.",body:"Go to the [X Developer Portal](https://developer.x.com/en/portal/dashboard), open the project and app you want Sazabi to use, and confirm the app has access to the API tiers you need. The hosted MCP server lives at `https://api.x.com/mcp`."},{id:"bearer-token",title:"Create an OAuth 2.0 Bearer token",description:"Generate the OAuth 2.0 access token the hosted MCP server will use.",body:"In your app's **Keys and tokens**, generate an OAuth 2.0 access token and copy it. Paste the raw token into Sazabi — Sazabi adds the `Bearer ` prefix and sends it in the `Authorization` header.",fieldKeys:["accessToken"]}],validateCredentials:jE,normalizeHeaders:DE,skill:"x",setupSkill:"x-setup"})});var kJ,SJe;var vJ=g(()=>{yq();mq();wq();kq();T$();T$();Pq();Iq();Tq();Aq();Dq();_q();Nq();Rq();Mq();Eq();Gq();Hq();Wq();Fq();Yq();Vq();tG();oG();iG();cG();hG();uG();dG();bG();pG();fG();vG();PG();IG();TG();AG();DG();_G();NG();RG();MG();EG();GG();HG();WG();FG();YG();VG();tJ();oJ();iJ();cJ();hJ();uJ();dJ();bJ();pJ();fJ();kJ=[lJ,Xq,Qq,dq,bq,pq,fq,vq,Sq,$q,Lq,Oq,Cq,zq,xq,Uq,Kq,qq,jq,Jq,Bq,eG,nG,rG,aG,sG,lG,gG,yG,mG,wG,kG,SG,$G,LG,OG,CG,zG,jG,xG,UG,KG,qG,JG,BG,XG,ZG,QG,eJ,nJ,rJ,aJ,sJ,gJ,yJ,mJ,wJ,Zq],SJe=new Map(kJ.map((e)=>[e.id,e]))});var SJ=()=>{};var PJ=()=>{};var $J=()=>{};var IJ=()=>{};var LJ=()=>{};var TJ=()=>{};var OJ=()=>{};var AJ=()=>{};var CJ=()=>{};var DJ=()=>{};var zJ=()=>{};var _J=()=>{};var jJ=()=>{};var NJ=()=>{};var xJ=()=>{};var RJ=()=>{};var UJ=()=>{};var MJ=()=>{};var KJ=()=>{};var EJ=()=>{};var qJ=()=>{};var GJ=()=>{};var JJ=()=>{};var HJ=()=>{};var BJ=()=>{};var WJ=()=>{};var ZJ=()=>{};var FJ=()=>{};var XJ=()=>{};var YJ=()=>{};var QJ=()=>{};var VJ=()=>{};var eH=()=>{};var tH=()=>{};var nH=()=>{};var oH=()=>{};var rH=()=>{};var iH=()=>{};var aH=()=>{};var cH=()=>{};var sH=g(()=>{SJ();PJ();$J();IJ();LJ();TJ();OJ();AJ();CJ();DJ();zJ();_J();jJ();NJ();xJ();RJ();UJ();MJ();KJ();EJ();qJ();GJ();JJ();HJ();BJ();WJ();ZJ();FJ();XJ();YJ();QJ();VJ();eH();tH();nH();oH();rH();iH();aH();cH()});var hH=()=>{};var lH=()=>{};var uH=g(()=>{_R();uu();$E();sq();vJ();I$();sH();hH();lH()});var gH,Zle,dH,Fle,yH,Xle,bH,mH,Lg,pH,wH,fH,vi,kH,vH,Si,SH,PH,Pi,$H,Yle,IH,Tg,Qle;var O$=g(()=>{uH();be();Le();gH=["configured","authorizing","connected","error"],Zle=a.enum(gH),dH=["preset","custom"],Fle=a.enum(dH),yH=["streamable-http","sse"],Xle=a.enum(yH),bH=["none","headers","oauth","aws-sigv4"],mH=a.enum(bH),Lg=a.object({connectionId:a.string().uuid().describe("Connection ID."),connectionKey:a.string().describe("Stable key used to reference this connector in tool calls."),providerId:a.string().describe('Provider identifier, e.g. "linear".'),displayName:a.string().describe("Human-readable connector name."),source:Fle.describe("Whether the connector is a built-in preset or a custom server."),installStatus:Zle.describe("Current connection lifecycle status."),authMode:mH.describe("Authentication mode."),transport:Xle.describe("Transport protocol."),serverUrl:a.string().describe("MCP server URL."),readOnly:a.boolean().describe("Whether the connector is restricted to read-only tools."),management:IS.describe("Lifecycle owner and supported connector mutations."),enabledToolCount:a.number().int().nonnegative().describe("Number of tools enabled and available for this connector."),connectedAt:a.string().datetime().nullable().describe("When the connector last became connected, if ever."),createdAt:a.string().datetime(),updatedAt:a.string().datetime()}),pH=a.object({name:a.string().describe("Tool name as invoked."),title:a.string().describe("Human-readable tool title."),description:a.string().describe("Tool description."),isReadOnly:a.boolean().describe("Whether the tool is considered read-only."),enabled:a.boolean().describe("Whether the tool is enabled and available given the connector config.")}),wH=a.object({projectId:a.string().uuid().optional().describe("Project to list connectors for. Auto-filled from SDK context when omitted."),connectedOnly:a.boolean().optional().describe("When true, only return connectors that are connected.")}),fH=a.object({connectors:a.array(Lg)}),vi=P({operationId:"mcpConnectors.list",description:"List configured MCP connectors within one project with provider, status, and enabled-tool count.",backend:"api",route:{method:"GET",path:"/mcp-connectors",tags:["MCP Connectors"]},input:wH,output:fH,pagination:"none",async:"sync"}),kH=a.object({connectionId:a.string().uuid().describe("Connection ID to fetch."),projectId:a.string().uuid().optional().describe("Project the connector belongs to. Auto-filled from SDK context when omitted.")}),vH=a.object({connector:Lg}),Si=P({operationId:"mcpConnectors.get",description:"Get one configured MCP connector by connection ID.",backend:"api",route:{method:"GET",path:"/mcp-connectors/{connectionId}",tags:["MCP Connectors"]},input:kH,output:vH,pagination:"none",async:"sync"}),SH=a.object({connectionId:a.string().uuid().describe("Connection ID to inspect."),projectId:a.string().uuid().optional().describe("Project the connector belongs to. Auto-filled from SDK context when omitted.")}),PH=a.object({connector:Lg,tools:a.array(pH)}),Pi=P({operationId:"mcpConnectors.details",description:"Inspect one MCP connector's tool surface, including each tool's name, description, and read-only status.",backend:"api",route:{method:"GET",path:"/mcp-connectors/{connectionId}/details",tags:["MCP Connectors"]},input:SH,output:PH,pagination:"none",async:"sync"}),$H=a.object({providerId:a.string().describe('Provider identifier, e.g. "linear".'),label:a.string().describe("Human-readable provider name."),authMode:mH.describe("Authentication mode."),availability:a.enum(oi).describe("Whether the provider is enabled or coming soon."),setupSkill:a.string().nullable().describe("Markdown setup skill for AI agents. Null when no skill is available.")}),Yle=a.object({}),IH=a.object({providers:a.array($H)}),Tg=P({operationId:"mcpConnectors.listProviders",description:"List all supported MCP connector providers with their auth mode and setup skill.",backend:"api",route:{method:"GET",path:"/mcp-connectors/providers",tags:["MCP Connectors"]},input:Yle,output:IH,pagination:"none",async:"sync"}),Qle={list:vi.contract,get:Si.contract,details:Pi.contract,listProviders:Tg.contract}});var $i,Vle,eue,tue,nue,oue,rue,iue,A$,ZZe;var Og=g(()=>{be();Le();$i=a.enum(["admin","member"]),Vle=a.object({id:a.string().min(1),name:a.string(),slug:a.string(),logo:a.string().nullable().optional(),role:$i}),eue=a.object({id:a.string().min(1),name:a.string().nullable(),email:a.string().email()}),tue=a.object({credentialType:a.literal("user"),user:eue,activeOrganizationId:a.string().min(1).nullable(),organizations:a.array(Vle).describe("Organizations the user belongs to, including membership role.")}),nue=a.object({credentialType:a.literal("secret"),organization:a.object({id:a.string().min(1),name:a.string(),slug:a.string(),logo:a.string().nullable().optional()}),keyName:a.string()}),oue=a.object({credentialType:a.literal("partner"),superorganization:a.object({id:a.string().uuid(),name:a.string()})}),rue=a.object({}),iue=a.discriminatedUnion("credentialType",[tue,nue,oue]),A$=P({operationId:"me.get",description:"Return the identity and available context for the current credential.",backend:"api",route:{method:"GET",path:"/me",tags:["Auth"]},input:rue,output:iue,pagination:"none",async:"sync"}),ZZe=A$.contract});var LH,aue,cue,sue,hue,lue,uue,C$,D$,z$,VZe;var TH=g(()=>{be();Le();Og();LH=a.object({membershipId:a.string().min(1).describe("Organization membership record ID."),userId:a.string().min(1).describe("User ID for the organization member."),name:a.string().nullable().describe("Display name for the member, when available."),email:a.string().email().describe("Email address for the member."),imageUrl:a.string().nullable().describe("Profile image URL for the member, when available."),role:$i.describe("Organization role."),createdAt:a.string().datetime().describe("When the membership was created.")}),aue=a.object({organizationId:a.string().min(1).optional().describe("Organization to list members for. Auto-filled from CLI and SDK context when omitted.")}),cue=a.object({members:a.array(LH).describe("Members visible within the selected organization.")}),sue=a.object({organizationId:a.string().min(1).optional().describe("Organization containing the member. Auto-filled from CLI and SDK context when omitted."),userId:a.string().min(1).describe("User ID of the member to update."),role:$i.describe("Role to assign.")}),hue=a.object({member:LH.describe("Updated organization member.")}),lue=a.object({params:a.object({userId:a.string().min(1).describe("User ID of the member to remove.")}),query:a.object({organizationId:a.string().min(1).optional().describe("Organization containing the member. Auto-filled from CLI and SDK context when omitted.")})}).transform(({params:e,query:t})=>({...t,...e})),uue=a.object({removedUserId:a.string().min(1).describe("User ID removed from the organization.")}),C$=P({operationId:"members.list",description:"List members in an organization.",backend:"api",route:{method:"GET",path:"/members",tags:["Members"]},input:aue,output:cue,pagination:"none",async:"sync",examples:[{name:"organization-members",input:{organizationId:"organization-123"},output:{members:[{membershipId:"membership-123",userId:"user-123",name:"Alex Admin",email:"alex@example.com",imageUrl:null,role:"admin",createdAt:"2026-01-01T00:00:00.000Z"}]}}]}),D$=P({operationId:"members.updateRole",description:"Update a member's organization role.",backend:"api",route:{method:"PATCH",path:"/members/{userId}/role",tags:["Members"]},input:sue,output:hue,pagination:"none",async:"sync",examples:[{name:"promote-member",input:{organizationId:"organization-123",userId:"user-456",role:"admin"},output:{member:{membershipId:"membership-456",userId:"user-456",name:"Mina Member",email:"mina@example.com",imageUrl:null,role:"admin",createdAt:"2026-01-01T00:00:00.000Z"}}}]}),z$=P({operationId:"members.remove",description:"Remove a member from an organization.",backend:"api",route:{method:"DELETE",path:"/members/{userId}",tags:["Members"],inputStructure:"detailed"},input:lue,output:uue,pagination:"none",async:"sync"}),VZe={list:C$.contract,updateRole:D$.contract,remove:z$.contract}});var AH,CH,Ag,DH,Cg,OH=4194304,_$,j$,gue=(e)=>{let t=e.split(",").map((r)=>r.trim()).filter(Boolean),n=a.array(Ag).safeParse(t);if(!n.success)throw Error("Kind filter must be a comma-separated list of note, runbook, or change.");return n.data},Gc,N$,x$,zH,_H,jH,NH,xH,RH,UH,MH,KH,EH,qH,GH,Ii,Li,Ti,Oi,Ai,due;var R$=g(()=>{be();Le();AH=["note","runbook"],CH=["note","runbook","change"],Ag=a.enum(CH),DH=a.enum(AH),Cg=a.string().min(1).max(512).refine((e)=>!e.startsWith("/"),{message:"Path must be relative without a leading slash."}).describe("Relative memory path, for example AGENTS.md or notes/architecture.md."),_$=a.string().min(1).refine((e)=>new TextEncoder().encode(e).length<=OH,{message:`Memory body must be at most ${OH} bytes (4 MiB).`}).describe("Document body stored in project memory."),j$=a.string().regex(/^(\d+)(s|m|h|d)$/u,"Duration must use s, m, h, or d units, for example 7d or 30m.").describe("Relative time window, for example 7d or 30m."),Gc=a.string().min(1).transform(gue).describe("Comma-separated kinds, for example note,runbook."),N$=a.object({id:a.string().uuid(),projectId:a.string().uuid(),kind:Ag,managed:a.boolean(),path:a.string().nullable(),title:a.string().nullable(),contentHash:a.string(),attrs:a.record(a.string(),a.unknown()),createdAt:a.string().datetime(),updatedAt:a.string().datetime()}),x$=N$.extend({body:_$}),zH=a.object({projectId:a.string().uuid().optional().describe("Project that owns the document. Auto-filled from CLI and SDK context when omitted."),path:Cg.describe("Relative path for the curated document."),body:_$,kind:DH.default("note").describe("Curated document kind. Only note and runbook may be written through the API."),title:a.string().max(500).optional().describe("Optional display title. Defaults to the path basename.")}),_H=a.object({document:x$}),jH=a.object({projectId:a.string().uuid().optional().describe("Project that owns the document. Auto-filled from CLI and SDK context when omitted."),id:a.string().uuid().optional().describe("Document id."),path:Cg.optional().describe("Relative curated path.")}).superRefine((e,t)=>{let n=e.id!==void 0,r=e.path!==void 0;if(n===r)t.addIssue({code:"custom",message:"Provide exactly one of id or path."})}),NH=a.object({document:x$}),xH=a.object({projectId:a.string().uuid().optional().describe("Project to list memory for. Auto-filled from CLI and SDK context when omitted."),kind:Gc.optional(),since:j$.optional().describe("Only return documents updated within this window, for example 7d."),service:a.string().min(1).optional().describe("Filter to documents whose attrs.services contains this value."),pathPrefix:a.string().min(1).optional().describe("Filter to paths starting with this prefix."),managed:a.coerce.boolean().optional(),cursor:a.string().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of documents to return per page.")}),RH=a.object({documents:a.array(N$),nextCursor:a.string().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),UH=a.object({documentId:a.string().uuid(),kind:Ag,managed:a.boolean(),path:a.string().nullable(),title:a.string().nullable(),snippet:a.string(),score:a.number()}),MH=a.object({calibrated:a.literal(!0),minScoreThreshold:a.number(),queryTerms:a.array(a.string()),message:a.string()}),KH=a.object({projectId:a.string().uuid().optional().describe("Project to search memory for. Auto-filled from CLI and SDK context when omitted."),query:a.string().trim().min(1).max(500).describe("Natural-language search query."),kind:Gc.optional(),since:j$.optional(),service:a.string().min(1).optional(),pathPrefix:a.string().min(1).optional(),managed:a.coerce.boolean().optional(),limit:a.coerce.number().int().min(1).max(50).default(10).describe("Maximum ranked search hits to return.")}),EH=a.object({hits:a.array(UH),emptyVerdict:MH.nullable()}),qH=a.object({projectId:a.string().uuid().optional().describe("Project that owns the document. Auto-filled from CLI and SDK context when omitted."),id:a.string().uuid().optional().describe("Document id."),path:Cg.optional()}).superRefine((e,t)=>{let n=e.id!==void 0,r=e.path!==void 0;if(n===r)t.addIssue({code:"custom",message:"Provide exactly one of id or path."})}),GH=a.object({deleted:a.boolean()}),Ii=P({operationId:"memory.put",description:"Create or replace a curated project memory document. Embeds on success.",backend:"api",route:{method:"PUT",path:"/memory",tags:["Memory"]},input:zH,output:_H,pagination:"none",async:"sync"}),Li=P({operationId:"memory.get",description:"Get one project memory document by id or path.",backend:"api",route:{method:"GET",path:"/memory/document",tags:["Memory"]},input:jH,output:NH,pagination:"none",async:"sync"}),Ti=P({operationId:"memory.list",description:"List project memory catalog rows without embedding search.",backend:"api",route:{method:"GET",path:"/memory",tags:["Memory"]},input:xH,output:RH,pagination:"cursor",async:"sync"}),Oi=P({operationId:"memory.search",description:"Hybrid semantic and keyword search over project memory documents.",backend:"api",route:{method:"POST",path:"/memory/search",tags:["Memory"]},input:KH,output:EH,pagination:"none",async:"sync"}),Ai=P({operationId:"memory.delete",description:"Soft-delete a curated project memory document by id or path.",backend:"api",route:{method:"DELETE",path:"/memory/document",successStatus:204,tags:["Memory"]},input:qH,output:GH,pagination:"none",async:"sync"}),due={put:Ii.contract,get:Li.contract,list:Ti.contract,search:Oi.contract,delete:Ai.contract}});var JH,HH,yue,bue,mue,pue,wue,Jc,fue,kue,vue,U$,M$,K$,E$,aFe;var Dg=g(()=>{be();Le();JH=a.enum(["processing","completed","aborted","error"]),HH=a.object({id:a.string().uuid(),threadId:a.string().uuid(),userMessageId:a.string().uuid().nullable(),assistantMessageId:a.string().uuid().nullable(),parentRunId:a.string().uuid().nullable(),workflowRunId:a.string().nullable(),status:JH,source:a.enum(["app","api","mcp","slack","teams","linear","github","agent","cli"]),createdAt:a.string().datetime(),updatedAt:a.string().datetime(),completedAt:a.string().datetime().nullable()}),yue=a.object({projectId:a.string().uuid().optional().describe("Project ID to list runs for. Auto-filled from CLI and SDK context when omitted."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of runs to return per page."),cursor:a.string().datetime().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),bue=a.object({runs:a.array(HH),nextCursor:a.string().datetime().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),mue=a.object({threadId:a.string().uuid().describe("Thread ID to list runs for."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of runs to return per page."),cursor:a.string().datetime().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),pue=a.object({runs:a.array(HH),nextCursor:a.string().datetime().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),wue=a.object({runId:a.string().uuid().describe("Run ID returned by a deferred operation.")}),Jc=a.object({completed:a.boolean().describe("Whether the run has reached a terminal status."),threadId:a.string().uuid().describe("Thread ID associated with the run."),runId:a.string().uuid().describe("Run ID for subsequent polling."),messageId:a.string().uuid().optional().describe("ID of the user message that triggered this run."),status:JH.describe("Current run lifecycle status."),response:a.string().nullable().describe("Assistant response text when the run has completed.")}),fue=Jc.describe("Current run state and, when complete, the assistant response."),kue=a.object({runId:a.string().uuid().describe("Run ID of the in-flight run to request cancellation for.")}),vue=a.object({success:a.literal(!0).describe("Always true when the cancellation request was accepted.")}),U$=P({operationId:"runs.list",description:"List deferred runs within one project.",backend:"api",route:{method:"GET",path:"/runs",tags:["Runs"]},input:yue,output:bue,pagination:"cursor",async:"sync"}),M$=P({operationId:"runs.listForThread",summary:"List Runs for a Thread",description:"List deferred runs for one thread.",backend:"api",route:{method:"GET",path:"/threads/{threadId}/runs",tags:["Runs"]},input:mue,output:pue,pagination:"cursor",async:"sync"}),K$=P({operationId:"runs.get",description:"Get the current result for a deferred run by run ID.",backend:"api",route:{method:"GET",path:"/runs/{runId}",tags:["Runs"]},input:wue,output:fue,pagination:"none",async:"sync",examples:[{name:"processing-run",input:{runId:"33333333-3333-4333-8333-333333333333"},output:{completed:!1,threadId:"22222222-2222-4222-8222-222222222222",runId:"33333333-3333-4333-8333-333333333333",status:"processing",response:null}}]}),E$=P({operationId:"runs.cancel",description:"Request cancellation of an in-flight run. Idempotent and best-effort: returns success even when the run has already reached a terminal status.",backend:"api",route:{method:"POST",path:"/runs/{runId}/cancel",tags:["Runs"]},input:kue,output:vue,pagination:"none",async:"sync",examples:[{name:"cancel-processing-run",input:{runId:"33333333-3333-4333-8333-333333333333"},output:{success:!0}}]}),aFe={list:U$.contract,listForThread:M$.contract,get:K$.contract,cancel:E$.contract}});var zg=(e,t,n)=>{let r=t?20000:1e4;if(e.length>r)n.addIssue({code:"too_big",maximum:r,type:"string",inclusive:!0,message:`Message cannot exceed ${r} characters`,origin:"string",path:["message"]})},_g=(e,t,n)=>{if(e&&!t)n.addIssue({code:"custom",message:"ambientServiceRun requires an automationId",path:["ambientServiceRun"]})};var BH,Hc,Sue,Pue,$ue,Iue,Lue,Tue,Oue,Aue,Cue,q$,Due,zue,_ue,jue,Nue,xue,Rue,Uue,Mue,Kue,Eue,que,G$,J$,H$,B$,W$,Z$,WH,Gue,Jue,Hue,Bue,ZH,Wue,Zue,Fue,Xue,Yue,Que,Xo="22222222-2222-4222-8222-222222222222",FH="11111111-1111-4111-8111-111111111111",Vue="44444444-4444-4444-8444-444444444444",XH="55555555-5555-4555-8555-555555555555",F$,X$,Y$,Q$,V$,dFe;var eI=g(()=>{be();Le();Dg();BH=a.enum(["slack","teams","linear","github","app","mcp","agent","api","cli"]),Hc=a.object({id:a.string().uuid(),projectId:a.string().uuid(),title:a.string().nullable(),status:a.enum(["regular","archived"]),source:BH.nullable(),createdAt:a.string().datetime(),updatedAt:a.string().datetime()}),Sue=a.object({type:a.literal("message"),message:a.string()}),Pue=a.object({type:a.literal("reasoning"),reasoning:a.string(),status:a.enum(["in_progress","complete"]).optional()}),$ue=a.object({type:a.literal("tool_call"),name:a.string(),params:a.any().optional(),result:a.any().optional(),status:a.enum(["in_progress","success","error","unknown"]).optional(),toolCallId:a.string().optional(),durationMs:a.number().nonnegative().optional()}),Iue=a.object({type:a.literal("artifact"),name:a.enum(["timeseries","table","log_detail","integration_required","alert_card","issue_card","mdx"]),data:a.any(),toolCallId:a.string().optional()}),Lue=a.object({type:a.literal("fork"),sourceThreadId:a.string(),sourceMessageId:a.string(),sourceThreadTitle:a.string().nullable()}),Tue=a.object({type:a.literal("summary"),summary:a.string()}),Oue=a.object({type:a.literal("slack_context"),channelId:a.string(),isTruncated:a.boolean().optional(),messages:a.array(a.object({timestamp:a.string(),slackUserId:a.string().optional(),displayName:a.string(),text:a.string(),isBot:a.boolean(),files:a.array(a.object({name:a.string(),mimetype:a.string(),size:a.number().optional(),attachmentId:a.string().uuid().optional(),ingestionStatus:a.enum(["attached","unsupported","oversized","skipped","unavailable"]).optional()})).optional()}))}),Aue=a.object({type:a.literal("teams_context"),conversationId:a.string(),isTruncated:a.boolean().optional(),messages:a.array(a.object({activityId:a.string().optional(),displayName:a.string(),text:a.string(),isBot:a.boolean(),createdDateTime:a.string().optional()}))}),Cue=a.union([Sue,Pue,$ue,Iue,Lue,Tue,Oue,Aue]),q$=a.object({id:a.string().uuid(),role:a.enum(["user","assistant"]),content:a.array(Cue),source:BH,createdAt:a.string().datetime()}),Due=a.object({projectId:a.string().uuid().optional().describe("Project to list threads for. Auto-filled from CLI and SDK context when omitted."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of threads to return per page."),cursor:a.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),status:a.enum(["regular","archived"]).optional().describe("Filter by thread status. 'regular' returns active threads, 'archived' returns archived threads.")}),zue=a.object({threads:a.array(Hc).describe("The page of threads matching the query."),nextCursor:a.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),_ue=a.object({threadId:a.string().uuid().describe("Thread ID returned by threads.list or threads.create.")}),jue=a.object({thread:Hc.describe("The requested thread."),messages:a.array(q$).describe("Messages currently stored on the thread in chronological order.")}),Nue=a.object({projectId:a.string().uuid().optional().describe("Project to create the thread in. Auto-filled from CLI and SDK context when omitted."),message:a.string().min(1,"Message cannot be empty").describe("Initial user message that starts the thread."),wait:a.boolean().default(!0).describe("Whether the server should wait for the agent run before responding."),timeoutSeconds:a.coerce.number().int().min(1).max(20).default(20).describe("Maximum seconds to wait when wait is true before handing off to polling."),automationId:a.string().uuid().optional().describe("Internal automation context. Set by the Sazabi CLI when an automation script starts an agent run."),ambientServiceRun:a.literal(!0).optional().describe("Internal marker for scheduler-originated ambient service work. Honored only for system secret-key requests with matching automation context.")}).superRefine((e,t)=>{zg(e.message,e.automationId,t),_g(e.ambientServiceRun,e.automationId,t)}),xue=Jc.describe("Deferred run result for creating a thread."),Rue=a.object({threadId:a.string().uuid().describe("Thread ID whose current processing status should be returned.")}),Uue=a.object({status:a.enum(["idle","processing"]),lastRunStatus:a.enum(["error"]).nullable()}),Mue=a.object({threadId:a.string().uuid().describe("Thread ID whose active run should be stopped.")}),Kue=a.object({success:a.literal(!0).describe("Always true when the stop request was accepted.")}),Eue=a.object({threadId:a.string().uuid().describe("Thread ID of the thread to update."),status:a.enum(["regular","archived"]).describe("New status for the thread. 'archived' hides the thread from the sidebar.")}),que=a.object({thread:Hc.describe("The updated thread.")}),G$=P({operationId:"threads.list",description:"List threads in a project, optionally filtered by status.",backend:"api",route:{method:"GET",path:"/threads",tags:["Threads"]},input:Due,output:zue,pagination:"cursor",async:"sync",examples:[{name:"active-threads",input:{projectId:"11111111-1111-4111-8111-111111111111",status:"regular",limit:10},output:{threads:[{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",title:"API returning 500s",status:"regular",source:"api",createdAt:"2026-01-01T00:00:00.000Z",updatedAt:"2026-01-01T00:05:00.000Z"}],nextCursor:null}}]}),J$=P({operationId:"threads.get",description:"Get a thread and its messages.",backend:"api",route:{method:"GET",path:"/threads/{threadId}",tags:["Threads"]},input:_ue,output:jue,pagination:"none",async:"sync"}),H$=P({operationId:"threads.getStatus",description:"Get the current processing status for a thread.",backend:"api",route:{method:"GET",path:"/threads/{threadId}/status",tags:["Threads"]},input:Rue,output:Uue,pagination:"none",async:"sync",examples:[{name:"processing-thread",input:{threadId:"22222222-2222-4222-8222-222222222222"},output:{status:"processing",lastRunStatus:null}}]}),B$=P({operationId:"threads.stop",description:"Stop a thread's in-flight run. Idempotent and best-effort: returns success even when the thread has no active run.",backend:"api",route:{method:"POST",path:"/threads/{threadId}/stop",tags:["Threads"]},input:Mue,output:Kue,pagination:"none",async:"sync",examples:[{name:"stop-processing-thread",input:{threadId:"22222222-2222-4222-8222-222222222222"},output:{success:!0}}]}),W$=P({operationId:"threads.create",description:"Create a thread with an initial message and optionally wait for the agent response.",backend:"api",route:{method:"POST",path:"/threads",tags:["Threads"],successStatus:201},input:Nue,output:xue,pagination:"none",async:"deferred",examples:[{name:"async-handoff",input:{projectId:"11111111-1111-4111-8111-111111111111",message:"Investigate elevated 500s in production.",wait:!1,timeoutSeconds:20},output:{completed:!1,threadId:"22222222-2222-4222-8222-222222222222",runId:"33333333-3333-4333-8333-333333333333",status:"processing",response:null}}]}),Z$=P({operationId:"threads.update",description:"Update a thread's status.",backend:"api",route:{method:"PATCH",path:"/threads/{threadId}",tags:["Threads"]},input:Eue,output:que,pagination:"none",async:"sync",examples:[{name:"archive-thread",input:{threadId:"22222222-2222-4222-8222-222222222222",status:"archived"},output:{thread:{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",title:"API returning 500s",status:"archived",source:"api",createdAt:"2026-01-01T00:00:00.000Z",updatedAt:"2026-01-01T00:10:00.000Z"}}}]}),WH=a.enum(["private","organization"]),Gue=a.object({threadId:a.string().uuid().describe("Thread ID of the source thread to fork."),messageId:a.string().uuid().describe("Message ID in the source thread to fork from. The new thread copies messages up to and including this message.")}),Jue=a.object({thread:Hc.describe("The newly created forked thread.")}),Hue=a.object({threadId:a.string().uuid().describe("Thread ID of the thread to update."),visibility:WH.describe("New visibility. 'private' restricts the thread to its owner; 'organization' shares it with the organization.")}),Bue=a.object({thread:Hc.describe("The updated thread."),visibility:WH.describe("The thread's resulting visibility.")}),ZH=a.object({shareId:a.string().uuid().describe("Unique identifier for the snapshot."),threadId:a.string().uuid().describe("Thread the snapshot was taken from."),url:a.string().describe("Public read-only URL for the snapshot."),createdAt:a.string().datetime()}),Wue=a.object({threadId:a.string().uuid().describe("Thread ID to create a public read-only snapshot for.")}),Zue=a.object({share:ZH.describe("The created share link.")}),Fue=a.object({threadId:a.string().uuid().describe("Thread ID the snapshot belongs to."),shareId:a.string().uuid().describe("Snapshot ID to revoke.")}),Xue=a.void(),Yue=a.object({threadId:a.string().uuid().describe("Thread ID to list public snapshots for.")}),Que=a.object({shares:a.array(ZH).describe("Active share links for the thread.")}),F$=P({operationId:"threads.fork",description:"Fork a thread from a specific message, creating a new thread that copies messages up to that point.",backend:"api",route:{method:"POST",path:"/threads/{threadId}/fork",tags:["Threads"],successStatus:201},input:Gue,output:Jue,pagination:"none",async:"sync",examples:[{name:"fork-from-message",input:{threadId:Xo,messageId:Vue},output:{thread:{id:"66666666-6666-4666-8666-666666666666",projectId:FH,title:"API returning 500s (fork)",status:"regular",source:"api",createdAt:"2026-01-01T00:20:00.000Z",updatedAt:"2026-01-01T00:20:00.000Z"}}}]}),X$=P({operationId:"threads.setVisibility",description:"Set a thread's visibility to private or organization.",backend:"api",route:{method:"PATCH",path:"/threads/{threadId}/visibility",tags:["Threads"]},input:Hue,output:Bue,pagination:"none",async:"sync",examples:[{name:"make-private",input:{threadId:Xo,visibility:"private"},output:{thread:{id:Xo,projectId:FH,title:"API returning 500s",status:"regular",source:"api",createdAt:"2026-01-01T00:00:00.000Z",updatedAt:"2026-01-01T00:30:00.000Z"},visibility:"private"}}]}),Y$=P({operationId:"threads.createShareLink",description:"Create a public read-only share link for a thread's current messages.",backend:"api",route:{method:"POST",path:"/threads/{threadId}/share",tags:["Threads"],successStatus:201},input:Wue,output:Zue,pagination:"none",async:"sync",examples:[{name:"create-share-link",input:{threadId:Xo},output:{share:{shareId:XH,threadId:Xo,url:"https://app.sazabi.com/share/55555555-5555-4555-8555-555555555555",createdAt:"2026-01-01T00:40:00.000Z"}}}]}),Q$=P({operationId:"threads.listShareLinks",description:"List active public share links for a thread.",backend:"api",route:{method:"GET",path:"/threads/{threadId}/share",tags:["Threads"]},input:Yue,output:Que,pagination:"none",async:"sync",examples:[{name:"list-share-links",input:{threadId:Xo},output:{shares:[{shareId:XH,threadId:Xo,url:"https://app.sazabi.com/share/55555555-5555-4555-8555-555555555555",createdAt:"2026-01-01T00:40:00.000Z"}]}}]}),V$=P({operationId:"threads.revokeShareLink",description:"Revoke a public share link for a thread.",backend:"api",route:{method:"DELETE",path:"/threads/{threadId}/share/{shareId}",successStatus:204,tags:["Threads"]},input:Fue,output:Xue,pagination:"none",async:"sync"}),dFe={list:G$.contract,get:J$.contract,getStatus:H$.contract,stop:B$.contract,create:W$.contract,update:Z$.contract,fork:F$.contract,setVisibility:X$.contract,createShareLink:Y$.contract,listShareLinks:Q$.contract,revokeShareLink:V$.contract}});var ege,tge,nge,oge,YH,QH;var VH=g(()=>{be();Le();Dg();eI();ege=a.object({threadId:a.string().uuid().describe("Thread ID to list messages for."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of messages to return per page."),cursor:a.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),tge=a.object({messages:a.array(q$),nextCursor:a.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),nge=a.object({threadId:a.string().uuid().describe("Thread ID to append the message to."),message:a.string().min(1,"Message cannot be empty").describe("Message body to append to the thread."),wait:a.boolean().default(!0).describe("Whether the server should wait for the appended message run before responding."),timeoutSeconds:a.coerce.number().int().min(1).max(20).default(20).describe("Maximum seconds to wait when wait is true before handing off to polling."),automationId:a.string().uuid().optional().describe("Internal automation context. Set by the Sazabi CLI when an automation script starts an agent run."),ambientServiceRun:a.literal(!0).optional().describe("Internal marker for scheduler-originated ambient service work. Honored only for system secret-key requests with matching automation context.")}).superRefine((e,t)=>{zg(e.message,e.automationId,t),_g(e.ambientServiceRun,e.automationId,t)}),oge=Jc.describe("Deferred run result for appending a message to an existing thread."),YH=P({operationId:"messages.list",description:"List messages in a thread with cursor pagination.",backend:"api",route:{method:"GET",path:"/threads/{threadId}/messages",tags:["Messages"]},input:ege,output:tge,pagination:"cursor",async:"sync",examples:[{name:"thread-messages",input:{threadId:"22222222-2222-4222-8222-222222222222",limit:2},output:{messages:[{id:"33333333-3333-4333-8333-333333333333",role:"user",content:[{type:"message",message:"What changed in the intake pipeline?"}],source:"api",createdAt:"2026-01-01T00:00:00.000Z"}],nextCursor:null}}]}),QH=P({operationId:"messages.append",description:"Append a user message to an existing thread and trigger a deferred run.",backend:"api",route:{method:"POST",path:"/threads/{threadId}/messages",successStatus:201,tags:["Messages"]},input:nge,output:oge,pagination:"none",async:"deferred",examples:[{name:"append-processing",input:{threadId:"22222222-2222-4222-8222-222222222222",message:"Follow up on the intake backlog.",wait:!1,timeoutSeconds:20},output:{completed:!1,threadId:"22222222-2222-4222-8222-222222222222",runId:"33333333-3333-4333-8333-333333333333",status:"processing",response:null}}]})});var xt,tB,tI,Ci,nB,jg,fo,oB,eB;var Bc=g(()=>{be();xt={IN_APP:"in_app",SLACK:"slack",SLACK_CHANNEL:"slack_channel",TEAMS_CHANNEL:"teams_channel",EMAIL:"email",SMS:"sms",INCIDENT_IO:"incident_io",PAGERDUTY:"pagerduty",ROOTLY:"rootly",WEBHOOK:"webhook"},tB=[xt.IN_APP,xt.SLACK,xt.EMAIL,xt.SMS],tI=[xt.SLACK_CHANNEL,xt.TEAMS_CHANNEL,xt.INCIDENT_IO,xt.PAGERDUTY,xt.ROOTLY,xt.WEBHOOK],Ci=Object.values(xt),nB=[...Ci,"victorops"],jg=a.enum(Ci),fo=a.enum(tI),oB=[{channel:"in_app",name:"In-app",description:"Show notifications in your Sazabi notification feed.",scope:"personal",destinationManagement:"none",personalSettingsPath:"/settings/notifications"},{channel:"email",name:"Email",description:"Send notifications to your account email address.",scope:"personal",destinationManagement:"none",personalSettingsPath:"/settings/notifications"},{channel:"sms",name:"SMS",description:"Send notifications to your verified phone number.",scope:"personal",destinationManagement:"none",personalSettingsPath:"/settings/account?phone-number=add"},{channel:"slack",name:"Slack DMs",description:"Send personal notifications by Slack DM.",scope:"personal",destinationManagement:"none",personalSettingsPath:"/settings/connected-accounts/slack"},{channel:"slack_channel",name:"Slack",description:"Post this project's alerts to selected Slack channels.",scope:"project",destinationManagement:"slack_channels",projectIntegrationPath:"slack"},{channel:"teams_channel",name:"Microsoft Teams",description:"Post this project's alerts to selected Microsoft Teams channels.",scope:"project",destinationManagement:"teams_channels",projectIntegrationPath:"teams"},{channel:"incident_io",name:"incident.io",description:"Route this project's alerts to incident.io.",scope:"project",destinationManagement:"integration_connections",projectIntegrationPath:"incident-io"},{channel:"pagerduty",name:"PagerDuty",description:"Route this project's alerts to PagerDuty.",scope:"project",destinationManagement:"integration_connections",projectIntegrationPath:"pagerduty"},{channel:"rootly",name:"Rootly",description:"Route this project's alerts to Rootly.",scope:"project",destinationManagement:"integration_connections",projectIntegrationPath:"rootly"},{channel:"webhook",name:"Webhooks",description:"Send this project's alerts to configured HTTPS endpoints.",scope:"project",destinationManagement:"webhook_endpoints",projectSettingsPath:"webhooks"}],eB=new Set(oB.map(({channel:e})=>e));if(eB.size!==Ci.length||Ci.some((e)=>!eB.has(e)))throw Error("Notification channel definitions must represent every channel")});var rB,rge=(e,t)=>e.value===t.value&&e.label===t.label&&e.scope===t.scope&&e.role===t.role&&e.defaultOff===t.defaultOff&&(e.deliveryConditions??[]).join(",")===(t.deliveryConditions??[]).join(","),kt=(e)=>{for(let t of Object.values(e)){let n=rB.get(t.value);if(n&&!rge(n,t))throw Error(`Notification type registered twice with conflicting definitions: ${t.value}`);if(t.role!==void 0&&t.scope!=="org")throw Error(`Notification type role restrictions require org scope: ${t.value}`);if(t.label.trim().length===0)throw Error(`Notification type needs a display label: ${t.value}`);rB.set(t.value,t)}return e};var qn=g(()=>{rB=new Map});var iB;var aB=g(()=>{qn();iB=kt({AUTOMATION_FINISHED:{value:"automation_finished",label:"Automation completed",scope:"project",defaultOff:!0},AUTOMATION_RUN_FAILED:{value:"automation_run_failed",label:"Automation run failed",scope:"project"}})});var cB;var sB=g(()=>{qn();cB=kt({BILLING_PLAN_UPGRADE_APPLIED:{value:"billing_plan_upgrade_applied",label:"Billing upgrade applied",scope:"org",role:"admin"},BILLING_PLAN_DOWNGRADE_SCHEDULED:{value:"billing_plan_downgrade_scheduled",label:"Billing downgrade scheduled",scope:"org",role:"admin"},BILLING_PLAN_DOWNGRADE_APPLIED:{value:"billing_plan_downgrade_applied",label:"Billing downgrade applied",scope:"org",role:"admin"},BILLING_CREDIT_BALANCE_LOW:{value:"billing_credit_balance_low",label:"Billing credits low",scope:"org",role:"admin"},BILLING_CREDIT_BALANCE_DEPLETED:{value:"billing_credit_balance_depleted",label:"Billing credits depleted",scope:"org",role:"admin"},BILLING_AUTO_TOP_UP_SETTINGS_CHANGED:{value:"billing_auto_top_up_settings_changed",label:"Billing auto top-up changed",scope:"org",role:"admin"},BILLING_AUTO_TOP_UP_FAILED:{value:"billing_auto_top_up_failed",label:"Billing auto top-up failed",scope:"org",role:"admin"},BILLING_INVOICE_PAID:{value:"billing_invoice_paid",label:"Billing invoice paid",scope:"org",role:"admin"},BILLING_NEGATIVE_BALANCE_COLLECTED:{value:"billing_negative_balance_collected",label:"Billing outstanding balance charged",scope:"org",role:"admin"},BILLING_NEGATIVE_BALANCE_COLLECTION_FAILED:{value:"billing_negative_balance_collection_failed",label:"Billing outstanding balance charge failed",scope:"org",role:"admin"}})});var hB;var lB=g(()=>{qn();hB=kt({INTEGRATION_CONNECTED:{value:"integration_connected",label:"Integration connected",scope:"org",defaultOff:!0},INTEGRATION_DISCONNECTED:{value:"integration_disconnected",label:"Integration disconnected",scope:"org"}})});var uB;var gB=g(()=>{qn();uB=kt({ISSUE_TRIGGERED:{value:"issue_triggered",label:"Issue triggered",scope:"project",deliveryConditions:["component","severity"]},ISSUE_RESOLVED:{value:"issue_resolved",label:"Issue resolved",scope:"project",deliveryConditions:["component","severity"]},ISSUE_IGNORED:{value:"issue_ignored",label:"Issue ignored",scope:"project",deliveryConditions:["component","severity"]}})});var dB;var yB=g(()=>{qn();dB=kt({PROJECT_CREATED:{value:"project_created",label:"Project created",scope:"org",defaultOff:!0},PROJECT_DELETED:{value:"project_deleted",label:"Project deleted",scope:"org",defaultOff:!0},MEMBER_INVITED:{value:"member_invited",label:"Member invited",scope:"org",defaultOff:!0},USER_REMOVED:{value:"user_removed",label:"Member removed",scope:"org",defaultOff:!0},MCP_CONNECTOR_ADDED:{value:"mcp_connector_added",label:"MCP connector added",scope:"org",defaultOff:!0},MCP_CONNECTOR_REMOVED:{value:"mcp_connector_removed",label:"MCP connector removed",scope:"org",defaultOff:!0},SECRET_KEY_CREATED:{value:"secret_key_created",label:"Secret key created",scope:"org",defaultOff:!0},SECRET_KEY_DELETED:{value:"secret_key_deleted",label:"Secret key deleted",scope:"org",defaultOff:!0}})});var bB;var mB=g(()=>{qn();bB=kt({SANDBOX_CREATED:{value:"sandbox_created",label:"Sandbox connected",scope:"project",defaultOff:!0},SANDBOX_DELETED:{value:"sandbox_deleted",label:"Sandbox disconnected",scope:"project",defaultOff:!0},LOG_SOURCE_CONNECTED:{value:"log_source_connected",label:"Log source connected",scope:"project",defaultOff:!0},LOG_SOURCE_DISCONNECTED:{value:"log_source_disconnected",label:"Log source disconnected",scope:"project"},GITHUB_CONNECTED:{value:"github_connected",label:"GitHub connected",scope:"project",defaultOff:!0},GITHUB_DISCONNECTED:{value:"github_disconnected",label:"GitHub disconnected",scope:"project"},CODE_REPO_CONNECTED:{value:"code_repo_connected",label:"Code repository connected",scope:"project",defaultOff:!0},CODE_REPO_DISCONNECTED:{value:"code_repo_disconnected",label:"Code repository disconnected",scope:"project"},PUBLIC_KEY_DEACTIVATED:{value:"public_key_deactivated",label:"Public key deactivated",scope:"project"}})});var pB;var wB=g(()=>{qn();pB=kt({SECURITY_ALERT:{value:"security_alert",label:"Security alert",scope:"org",role:"admin"}})});var nI,at,age,oI=(e)=>{let t=age.get(e)?.label;if(t)return t;let n=e.replace(/_/g," ").trim();return n?n.charAt(0).toUpperCase()+n.slice(1):e};var Wc=g(()=>{aB();sB();lB();gB();yB();mB();wB();qn();nI={...pB,...dB,...hB,...iB,...uB,...bB,...cB},at=Object.fromEntries(Object.entries(nI).map(([e,t])=>[e,t.value])),age=new Map(Object.values(nI).map((e)=>[e.value,e]))});var rI,kB,ZFe,In,FFe;var Zc=g(()=>{Wc();Bc();Bc();rI=Object.values(at),kB=[at.BILLING_PLAN_UPGRADE_APPLIED,at.BILLING_PLAN_DOWNGRADE_SCHEDULED,at.BILLING_PLAN_DOWNGRADE_APPLIED,at.BILLING_CREDIT_BALANCE_LOW,at.BILLING_CREDIT_BALANCE_DEPLETED,at.BILLING_AUTO_TOP_UP_SETTINGS_CHANGED,at.BILLING_AUTO_TOP_UP_FAILED,at.BILLING_INVOICE_PAID,at.BILLING_NEGATIVE_BALANCE_COLLECTED,at.BILLING_NEGATIVE_BALANCE_COLLECTION_FAILED],ZFe=new Set(kB),In=[at.ISSUE_TRIGGERED,at.ISSUE_RESOLVED,at.ISSUE_IGNORED,at.AUTOMATION_RUN_FAILED],FFe=new Set(In)});var Fc,vB,SB=(e)=>typeof e==="string"&&(e in vB)?vB[e]:e,sge;var PB=g(()=>{Bc();be();Zc();Fc=a.enum(rI),vB={data_source_connected:"log_source_connected",data_source_disconnected:"log_source_disconnected"},sge=a.preprocess(SB,Fc)});var hge;var $B=g(()=>{Wc();Zc();hge=In.map((e)=>({notificationType:e,label:oI(e)}))});var IB=g(()=>{Wc();Zc()});var iI=g(()=>{Bc();Wc();Zc();PB();$B();IB()});var uge,gge,dge,yge,bge,mge,pge,aI,xXe;var LB=g(()=>{iI();be();Le();uge=a.enum(["ready","missing","degraded","unavailable"]),gge=a.object({id:a.string(),label:a.string(),status:a.enum(["active","inactive","degraded"]),statusLabel:a.string()}),dge=a.object({channel:jg,name:a.string(),description:a.string(),scope:a.enum(["personal","project"]),enabled:a.boolean().nullable(),preferenceId:a.string().nullable(),prerequisite:a.object({status:uge,statusLabel:a.string(),message:a.string()}),action:a.object({label:a.string(),href:a.string()}).nullable(),destinations:a.array(gge),destinationManagement:a.enum(["none","slack_channels","teams_channels","integration_connections","webhook_endpoints"]),canCreateDestinations:a.boolean(),supportedNotificationTypes:a.array(Fc)}),yge=a.object({channel:fo,enabled:a.boolean(),preferenceId:a.string().nullable()}),bge=a.object({channel:fo,notificationType:Fc,enabled:a.boolean(),preferenceId:a.string()}),mge=a.object({projectId:a.string().uuid().optional().describe("Project to inspect. Auto-filled from CLI and SDK context when omitted.")}),pge=a.object({channelCards:a.array(dge).length(10),channels:a.array(yge),notificationTypePreferences:a.array(bge),issueNotificationMinSeverity:a.enum(["low","medium","high","critical"])}),aI=P({operationId:"notificationChannels.getProject",summary:"List Project Notification Channels",description:"List a project's notification channels with preferences, prerequisites, connection state, configured destinations, and supported notification types.",backend:"api",route:{method:"GET",path:"/notification-channels",tags:["Notification channels"]},input:mge,output:pge,pagination:"none",async:"sync"}),xXe={getProject:aI.contract}});var TB,sI,OB,hI,EXe,qXe,lI,uI=(e,t)=>{if((e.componentIds?.length||e.componentId)&&"componentIds"in e.condition&&e.condition.componentIds?.length)t.addIssue({code:"custom",path:["condition","componentIds"],message:"Use componentIds instead of legacy condition.componentIds."});if(e.componentIds?.length&&e.componentId)t.addIssue({code:"custom",path:["componentId"],message:"Use componentIds instead of componentId."})},GXe,AB,cI,gI,Xc,CB,wge,fge,kge,vge,Sge,Pge,$ge,Ige,Lge,dI,yI,bI,mI,pI,JXe;var DB=g(()=>{iI();be();Le();TB=a.enum(["low","medium","high","critical"]),sI=a.object({severities:a.array(TB).min(1).optional()}).strict(),OB=a.object({componentIds:a.array(a.string().uuid()).min(1).optional(),severities:a.array(TB).min(1).optional()}).strict(),hI=a.object({channel:fo,destinationKey:a.string().min(1)}),EXe=a.object({destinations:a.array(hI).min(1),notificationTypes:a.array(a.enum(In)).min(1),componentIds:a.array(a.string().uuid()).min(1).optional().describe("Stable component registry IDs matched by this rule."),includeDescendants:a.boolean().default(!1).describe("Whether the rule also matches descendant components."),condition:sI}),qXe=a.object({destinations:a.array(hI).min(1),notificationTypes:a.array(a.enum(In)).min(1),condition:OB}),lI=a.object({destinations:a.array(hI).min(1),notificationTypes:a.array(a.enum(In)).min(1),componentIds:a.array(a.string().uuid()).min(1).optional().describe("Stable component registry IDs matched by this rule."),componentId:a.string().uuid().optional().describe("Deprecated single-component compatibility input."),includeDescendants:a.boolean().default(!1).describe("Whether the rule also matches descendant components."),condition:a.union([sI,OB])}),GXe=lI.superRefine(uI),AB=a.object({id:a.string(),channel:fo,destinationKey:a.string(),displayName:a.string()}),cI=a.object({id:a.string().uuid(),label:a.string(),lifecycle:a.enum(["active","retired","merged"])}),gI=a.object({id:a.string().uuid(),projectId:a.string().uuid(),notificationTypes:a.array(a.enum(In)),destinations:a.array(AB),condition:sI,component:cI.nullable(),componentId:a.string().uuid().nullable(),includeDescendants:a.boolean(),suspendedAt:a.string().datetime().nullable(),suspensionReason:a.string().nullable(),components:a.array(cI),createdAt:a.string().datetime(),updatedAt:a.string().datetime()}),Xc=a.object({projectId:a.string().uuid().optional().describe("Project whose notification delivery rules are being managed.")}),CB=a.string().uuid().describe("Logical notification delivery rule ID."),wge=Xc,fge=a.object({rules:a.array(gI)}),kge=a.object({destinations:a.array(AB),notificationTypes:a.array(a.object({notificationType:a.enum(In),label:a.string(),conditions:a.array(a.enum(["component","severity"]))})),components:a.array(cI)}),vge=Xc.extend(lI.shape).superRefine(uI),Sge=gI,Pge=Xc.extend({...lI.shape,ruleId:CB}).superRefine(uI),$ge=gI,Ige=Xc.extend({ruleId:CB}),Lge=a.object({removed:a.boolean()}),dI=P({operationId:"notificationDeliveryRules.list",description:"List the positive delivery rules for a project.",backend:"api",route:{method:"GET",path:"/notification-delivery-rules",tags:["Notification delivery rules"]},input:wge,output:fge,pagination:"none",async:"sync"}),yI=P({operationId:"notificationDeliveryRules.options",description:"List available destinations, events, and conditions for project delivery rules.",backend:"api",route:{method:"GET",path:"/notification-delivery-rules/options",tags:["Notification delivery rules"]},input:Xc,output:kge,pagination:"none",async:"sync"}),bI=P({operationId:"notificationDeliveryRules.create",description:"Create a positive project notification delivery rule.",backend:"api",route:{method:"POST",path:"/notification-delivery-rules",tags:["Notification delivery rules"]},input:vge,output:Sge,pagination:"none",async:"sync"}),mI=P({operationId:"notificationDeliveryRules.update",description:"Replace a positive delivery rule atomically.",backend:"api",route:{method:"PUT",path:"/notification-delivery-rules/{ruleId}",tags:["Notification delivery rules"]},input:Pge,output:$ge,pagination:"none",async:"sync"}),pI=P({operationId:"notificationDeliveryRules.delete",description:"Delete a positive delivery rule without deleting its reusable destinations.",backend:"api",route:{method:"DELETE",path:"/notification-delivery-rules/{ruleId}",tags:["Notification delivery rules"]},input:Ige,output:Lge,pagination:"none",async:"sync"}),JXe={list:dI.contract,options:yI.contract,create:bI.contract,update:mI.contract,delete:pI.contract}});var wI,Tge,Oge,Age,Cge,Dge,zge,fI,_ge,jge,kI,Nge,xge,vI,Rge,Uge,SI,Mge,Kge,PI,ZXe;var zB=g(()=>{be();Le();wI=a.enum(["accept-invite","create-organization","billing","configure-project","connect-github-account","install-github-app","configure-code-search","install-slack-app","configure-slack-notifications","trigger-issue","confirm-issue","finish"]),Tge=a.enum(["needs-onboarding","blocked","ready"]),Oge=a.enum(["incomplete","complete","skipped"]),Age=a.object({invitationId:a.string(),organizationId:a.string(),organizationName:a.string(),organizationSlug:a.string(),organizationImageUrl:a.string().nullable(),inviterName:a.string().nullable()}),Cge=a.object({gate:Tge,canonicalStep:wI.nullable(),organizationId:a.string().nullable(),projectId:a.string().nullable(),completionByStep:a.record(wI,Oge),githubSkipped:a.boolean(),githubAppSkipped:a.boolean(),slackSkipped:a.boolean(),sampleIssueId:a.string().nullable(),actorRole:a.enum(["admin","member"]).nullable(),requiredStep:a.union([wI,a.literal("select-organization")]).nullable(),isCompleted:a.boolean(),onboardingRecommendationsThreadId:a.string().nullable(),hasOrganizations:a.boolean(),hasPaidBillingSubscription:a.boolean(),billingStepEnabled:a.boolean(),pendingInvitations:a.array(Age)}),Dge=a.object({}),zge=a.object({onboarding:Cge}),fI=P({operationId:"onboarding.getState",description:"Read onboarding progress for the authenticated user.",backend:"api",route:{method:"GET",path:"/onboarding/state",tags:["Onboarding"]},input:Dge,output:zge,pagination:"none",async:"sync"}),_ge=a.object({integration:a.enum(["github","slack"]).describe("Integration onboarding step to skip.")}),jge=a.object({skipped:a.literal(!0)}),kI=P({operationId:"onboarding.skipIntegration",description:"Skip a GitHub or Slack integration step during onboarding.",backend:"api",route:{method:"POST",path:"/onboarding/skip-integration",tags:["Onboarding"]},input:_ge,output:jge,pagination:"none",async:"sync"}),Nge=a.object({}),xge=a.object({skipped:a.literal(!0)}),vI=P({operationId:"onboarding.skipGithubAppInstallation",summary:"Skip GitHub App Installation",description:"Skip GitHub App installation during onboarding.",backend:"api",route:{method:"POST",path:"/onboarding/skip-github-app",tags:["Onboarding"]},input:Nge,output:xge,pagination:"none",async:"sync"}),Rge=a.object({}),Uge=a.object({skipped:a.literal(!0)}),SI=P({operationId:"onboarding.skipSampleIssue",summary:"Skip Test Issue",description:"Skip the optional test issue during onboarding.",backend:"api",route:{method:"POST",path:"/onboarding/skip-sample-issue",tags:["Onboarding"]},input:Rge,output:Uge,pagination:"none",async:"sync"}),Mge=a.object({projectId:a.string().uuid().describe("Project that completed onboarding.")}),Kge=a.object({completed:a.boolean()}),PI=P({operationId:"onboarding.finish",description:"Mark onboarding complete when all prerequisites are satisfied.",backend:"api",route:{method:"POST",path:"/onboarding/finish",tags:["Onboarding"]},input:Mge,output:Kge,pagination:"none",async:"sync"}),ZXe={getState:fI.contract,skipIntegration:kI.contract,skipGithubAppInstallation:vI.contract,skipSampleIssue:SI.contract,finish:PI.contract}});var Ng,Ege,qge,Gge,Jge,Hge,Bge,Wge,Zge,Fge,Xge,$I,II,LI,TI,VXe;var _B=g(()=>{be();Le();Og();Ng=a.object({id:a.string().min(1),name:a.string(),slug:a.string(),logo:a.string().nullable().optional()}),Ege=Ng.extend({role:$i.optional()}),qge=a.object({}),Gge=a.object({organizations:a.array(Ege).describe("Organizations available to the current credential.")}),Jge=a.object({organizationId:a.string().min(1).describe("Organization ID to fetch.")}),Hge=a.object({organization:Ng}),Bge=a.object({organizationId:a.string().min(1).describe("Organization ID to update. SDK and CLI callers can auto-fill this before dispatch."),name:a.string().trim().min(1).max(100).describe("New organization name.")}),Wge=a.object({organization:Ng.describe("Updated organization.")}),Zge=a.string().trim().min(1,"Name is required").max(100,"Name must be 100 characters or less").regex(/^[\p{L}\p{N} _-]+$/u,"Name can only contain letters, numbers, spaces, hyphens, and underscores"),Fge=a.object({name:Zge.describe("Organization display name.")}),Xge=a.object({organization:Ng}),$I=P({operationId:"organizations.create",description:"Create an organization for the authenticated user.",backend:"api",route:{method:"POST",path:"/organizations",tags:["Organizations"],successStatus:201},input:Fge,output:Xge,pagination:"none",async:"sync"}),II=P({operationId:"organizations.list",description:"List organizations available to the current credential.",backend:"api",route:{method:"GET",path:"/organizations",tags:["Organizations"]},input:qge,output:Gge,pagination:"none",async:"sync"}),LI=P({operationId:"organizations.get",description:"Get one organization by ID.",backend:"api",route:{method:"GET",path:"/organizations/{organizationId}",tags:["Organizations"]},input:Jge,output:Hge,pagination:"none",async:"sync"}),TI=P({operationId:"organizations.update",description:"Update one organization.",backend:"api",route:{method:"PATCH",path:"/organizations/{organizationId}",tags:["Organizations"]},input:Bge,output:Wge,pagination:"none",async:"sync",examples:[{name:"rename-organization",input:{organizationId:"organization-123",name:"Observed Platform"},output:{organization:{id:"organization-123",name:"Observed Platform",slug:"acme",logo:null}}}]}),VXe={list:II.contract,get:LI.contract,create:$I.contract,update:TI.contract}});var Di,Yc,jB,NB,xB,RB,UB,MB,KB,xg,Rg,Ug,EB,qB,Mg,GB,JB,Kg,Yge;var OI=g(()=>{be();Le();Di=a.enum(["us-east-1","us-east-2","us-west-1","us-west-2","eu-central-1","eu-central-2","eu-north-1","eu-south-1","eu-south-2","eu-west-1","eu-west-2","eu-west-3"]),Yc=a.object({id:a.string().uuid(),organizationId:a.string().min(1),name:a.string(),region:Di}),jB=a.object({organizationId:a.string().min(1).optional().describe("Organization to list projects for. Auto-filled from CLI and SDK context when omitted.")}),NB=a.object({projects:a.array(Yc).describe("Projects visible within the selected organization.")}),xB=a.object({projectId:a.string().uuid().describe("Project ID to fetch.")}),RB=a.string().trim().min(1,"Name is required").max(100,"Name must be 100 characters or less").regex(/^[\p{L}\p{N} _-]+$/u,"Name can only contain letters, numbers, spaces, hyphens, and underscores"),UB=a.object({organizationId:a.string().min(1).optional().describe("Organization to create the project under. Auto-filled from CLI and SDK context when omitted."),name:RB.describe("Project name."),region:Di.optional().default("us-west-2").describe("AWS region where the new project should be created.")}),MB=a.object({project:Yc}),KB=a.object({project:Yc}),xg=P({operationId:"projects.list",description:"List projects in an organization.",backend:"api",route:{method:"GET",path:"/projects",tags:["Projects"]},input:jB,output:NB,pagination:"none",async:"sync"}),Rg=P({operationId:"projects.get",description:"Get one project by ID.",backend:"api",route:{method:"GET",path:"/projects/{projectId}",tags:["Projects"]},input:xB,output:KB,pagination:"none",async:"sync"}),Ug=P({operationId:"projects.create",description:"Create one project in an organization.",backend:"api",route:{method:"POST",path:"/projects",successStatus:201,tags:["Projects"]},input:UB,output:MB,pagination:"none",async:"sync"}),EB=a.object({projectId:a.string().uuid().describe("Project ID to update."),name:RB.optional().describe("New project name.")}),qB=a.object({project:Yc}),Mg=P({operationId:"projects.update",description:"Update (rename) one project by ID. User credentials require the `settings:write` organization permission (admin or owner role).",backend:"api",route:{method:"PATCH",path:"/projects/{projectId}",tags:["Projects"]},input:EB,output:qB,pagination:"none",async:"sync"}),GB=a.object({projectId:a.string().uuid().describe("Project ID to delete.")}),JB=a.void(),Kg=P({operationId:"projects.delete",description:"Delete one project by ID. User credentials require the `settings:write` organization permission (admin or owner role).",backend:"api",route:{method:"DELETE",path:"/projects/{projectId}",successStatus:204,tags:["Projects"]},input:GB,output:JB,pagination:"none",async:"sync"}),Yge={list:xg.contract,get:Rg.contract,create:Ug.contract,update:Mg.contract,delete:Kg.contract}});var HB,Qge,Vge,ede,tde,nde,AI,aYe;var BB=g(()=>{be();Le();HB=a.enum(["open","merged","closed"]),Qge=a.enum(["review_required","approved","changes_requested"]),Vge=a.enum(["passing","failing","pending"]),ede=a.object({id:a.string().uuid(),projectId:a.string().uuid(),repositoryFullName:a.string(),pullRequestId:a.string().describe("Provider-native pull request identifier (GitHub PR number or Bitbucket PR id), serialized as a string."),githubPullRequestId:a.number().int().describe("Deprecated: use pullRequestId. Numeric form of the provider-native pull request identifier; kept for backward compatibility."),title:a.string().nullable(),url:a.string().nullable(),status:HB.nullable(),reviewState:Qge.nullable(),checksState:Vge.nullable(),requestedByUserId:a.string().nullable(),authorLogin:a.string().nullable().describe("Forge login that authored the pull request (often the Sazabi app identity)."),githubAuthorLogin:a.string().nullable().describe("Deprecated: use authorLogin. Kept for backward compatibility."),threadId:a.string().uuid().nullable(),runId:a.string().uuid().nullable(),createdAt:a.string().datetime(),mergedAt:a.string().datetime().nullable(),closedAt:a.string().datetime().nullable()}),tde=a.object({projectId:a.string().uuid().optional().describe("Project to list pull requests for. Auto-filled from CLI and SDK context when omitted."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of pull requests to return per page."),cursor:a.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),status:HB.optional().describe("Filter by pull request status (open, merged, or closed)."),repositoryFullName:a.string().trim().optional().describe("Filter by repository full name, for example owner/repo. Case-insensitive."),requestedByUserId:a.string().trim().optional().describe("Filter by the Sazabi user who requested the pull request. Pass 'me' to filter to the authenticated user.")}),nde=a.object({pullRequests:a.array(ede),nextCursor:a.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),AI=P({operationId:"pullRequests.list",description:"List pull requests that Sazabi opened, optionally filtered by status, repository, and requesting user.",backend:"api",route:{method:"GET",path:"/pull-requests",tags:["Pull Requests"]},input:tde,output:nde,pagination:"cursor",async:"sync"}),aYe={list:AI.contract}});var WB,ZB,FB,XB,YB,Qc;var CI=g(()=>{be();Le();WB=a.enum(["data_source","mcp_connector","sandbox_cli","integration"]),ZB=a.enum(["connected","recommended"]),FB=a.object({kind:WB.describe("What the recommendation targets: a data source, MCP connector, sandbox CLI, or integration."),targetId:a.string().describe("Exact catalog id for the kind (data source type, MCP provider id, sandbox CLI preset type, or integration provider id)."),status:ZB.describe("Resolved live against current connections: connected (already set up) or recommended (suggested, not yet connected)."),roiScore:a.number().int().min(0).max(100).describe("Intrinsic ROI score, 0–100 — a normalized blend of how valuable, how easy to connect, and how proven the item is. A pure function of the item; computed live on read, never stored."),priority:a.number().int().min(1).describe("1-based rank within this list, sorted by roiScore (best first). Items are already returned in priority order; the field lets consumers recover the rank without trusting array position.")}),XB=a.object({projectId:a.string().uuid().optional().describe("Project to list recommendations for. Auto-filled from CLI and SDK context when omitted.")}),YB=a.object({recommendations:a.array(FB).describe("The project's configuration recommendations, deduped by (kind, targetId), with status resolved live and each item's ROI score. Returned in priority order (highest roiScore first).")}),Qc=P({operationId:"recommendations.list",description:"List a project's configuration recommendations (data sources, MCP connectors, sandbox CLIs, and integrations) with each item's live connection status.",backend:"api",route:{method:"GET",path:"/recommendations",tags:["Recommendations"]},input:XB,output:YB,pagination:"none",async:"sync"})});var QB,ode,VB,Eg,eW,tW,nW,oW,zi,rW,iW,aW,qg,rde;var DI=g(()=>{be();Le();QB=a.object({type:a.string().describe("Preset type identifier."),label:a.string().describe("Human-readable display name."),executableNames:a.array(a.string()).describe("CLI binary names installed by this preset."),envVarKeys:a.array(a.string()).describe("Environment variables required for authentication."),setupSkill:a.string().nullable().describe("Markdown setup skill for AI agents. Null when no skill is available.")}),ode=a.object({}),VB=a.object({types:a.array(QB)}),Eg=P({operationId:"sandboxPresets.listTypes",description:"List all supported sandbox CLI types with their environment variable requirements and setup skills.",backend:"api",route:{method:"GET",path:"/sandbox-presets/types",tags:["Sandbox Presets"]},input:ode,output:VB,pagination:"none",async:"sync"}),eW=a.enum(["github_app","personal_access_token","stored_credentials"]),tW=a.object({presetType:a.string().describe("Preset type identifier."),credentialSource:eW.describe("Authoritative credential source for the preset."),isSystemManaged:a.boolean().describe("Whether the connection follows an integration lifecycle."),fallbackConfigured:a.boolean().describe("Whether user-provided fallback credentials are stored for this preset."),envVarKeys:a.array(a.string()).describe("Stored environment variable names. Secret values are omitted.")}),nW=a.object({projectId:a.string().uuid().optional().describe("Project to inspect. Required for organization-scoped keys; auto-filled from a project-scoped key when omitted.")}),oW=a.object({connections:a.array(tW)}),zi=P({operationId:"sandboxPresets.listConnections",description:"List a project's stored and integration-backed sandbox CLI connections without returning secret values.",backend:"api",route:{method:"GET",path:"/sandbox-presets/connections",tags:["Sandbox Presets"]},input:nW,output:oW,pagination:"none",async:"sync"}),rW=a.object({key:a.string().min(1).max(256).regex(/^[A-Za-z_][A-Za-z0-9_]*$/,"Environment variable keys must match /^[A-Za-z_][A-Za-z0-9_]*$/.").describe("Environment variable name (e.g. KUBECONFIG_CONTENTS)."),value:a.string().max(10240).describe("Secret value. Encrypted at rest; never returned by any API response.")}),iW=a.object({projectId:a.string().uuid().optional().describe("Project to configure. Required for organization-scoped keys; auto-filled from a project-scoped key when omitted."),presetType:a.string().min(1).describe("Preset type identifier (e.g. kubectl, aws, github)."),environmentVariables:a.array(rW).max(100).describe("Full set of env vars for this preset. Replaces any previously stored values for the preset.")}),aW=a.object({projectId:a.string().uuid().describe("Project the preset was written to."),presetType:a.string().describe("Preset type that was upserted."),envVarKeys:a.array(a.string()).describe("Env var key names now stored for this preset. Values are never returned.")}),qg=P({operationId:"sandboxPresets.upsertPreset",summary:"Upsert CLI Connection",description:"Set or replace a project's sandbox CLI connection environment variables (e.g. the kubectl CLI's KUBECONFIG_CONTENTS). Values are encrypted server-side and never returned. Requires a secret key scoped to the target project's organization.",backend:"api",route:{method:"POST",path:"/sandbox-presets/config",successStatus:200,tags:["Sandbox Presets"]},input:iW,output:aW,pagination:"none",async:"sync"}),rde={listConnections:zi.contract,listTypes:Eg.contract,upsertPreset:qg.contract}});var Gg,cW=1048576,zI,sW,_I,ide,ade,cde,sde,hde,lde,ude,gde,dde,yde,jI,NI,xI,RI,UI,mYe;var hW=g(()=>{be();Le();Gg=a.string().min(1).max(64).regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/,"Name must start with a letter or digit and contain only letters, digits, underscores, and hyphens (max 64 characters).").describe("Script name. Must be unique within the project among non-deleted scripts."),zI=a.string().min(1).refine((e)=>new TextEncoder().encode(e).length<=cW,{message:`Script content must be at most ${cW} bytes (1 MiB).`}).describe("Bash script body materialized as /home/sazabi/scripts/<name>.sh in the sandbox."),sW=a.object({id:a.string().uuid(),projectId:a.string().uuid(),name:a.string(),description:a.string().nullable(),contentHash:a.string().describe("sha256 hex digest of the script content."),createdAt:a.string().datetime(),updatedAt:a.string().datetime()}),_I=sW.extend({content:zI}),ide=a.object({projectId:a.string().uuid().optional().describe("Project to list scripts for. Auto-filled from CLI and SDK context when omitted."),search:a.string().optional().describe("Case-insensitive partial match on script name."),cursor:a.string().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of scripts to return per page.")}),ade=a.object({scripts:a.array(sW),nextCursor:a.string().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),cde=a.object({name:Gg.describe("Script name to fetch."),projectId:a.string().uuid().optional().describe("Project that owns the script. Auto-filled from CLI and SDK context when omitted.")}),sde=a.object({script:_I}),hde=a.object({projectId:a.string().uuid().optional().describe("Project that owns the script. Auto-filled from CLI and SDK context when omitted."),name:Gg.describe("Script name. Must be unique within the project among non-deleted scripts."),content:zI,description:a.string().max(500).nullable().optional().describe("Optional human-readable description.")}),lde=a.object({script:_I}),ude=a.object({name:Gg.describe("Script to update."),projectId:a.string().uuid().optional().describe("Project that owns the script. Auto-filled from CLI and SDK context when omitted."),content:zI.optional().describe("New script body. Omit to leave content unchanged."),description:a.string().max(500).nullable().optional().describe("New description, or null to clear it. Omit to leave unchanged.")}),gde=a.object({script:_I}),dde=a.object({name:Gg.describe("Script to delete."),projectId:a.string().uuid().optional().describe("Project that owns the script. Auto-filled from CLI and SDK context when omitted.")}),yde=a.object({deleted:a.boolean()}),jI=P({operationId:"scripts.list",description:"List durable bash scripts stored for a project.",backend:"api",route:{method:"GET",path:"/scripts",tags:["Scripts"]},input:ide,output:ade,pagination:"cursor",async:"sync"}),NI=P({operationId:"scripts.get",description:"Get a single project script by name, including its body.",backend:"api",route:{method:"GET",path:"/scripts/{name}",tags:["Scripts"]},input:cde,output:sde,pagination:"none",async:"sync"}),xI=P({operationId:"scripts.create",description:"Create a durable bash script for a project.",backend:"api",route:{method:"POST",path:"/scripts",successStatus:201,tags:["Scripts"]},input:hde,output:lde,pagination:"none",async:"sync"}),RI=P({operationId:"scripts.update",description:"Update a project script's body and/or description.",backend:"api",route:{method:"PATCH",path:"/scripts/{name}",tags:["Scripts"]},input:ude,output:gde,pagination:"none",async:"sync"}),UI=P({operationId:"scripts.delete",description:"Soft-delete a project script by name.",backend:"api",route:{method:"DELETE",path:"/scripts/{name}",successStatus:204,tags:["Scripts"]},input:dde,output:yde,pagination:"none",async:"sync"}),mYe={list:jI.contract,get:NI.contract,create:xI.contract,update:RI.contract,delete:UI.contract}});var MI,lW,uW,gW,dW,_i,ji,bde;var KI=g(()=>{be();Le();MI=a.object({projectId:a.string().uuid().optional().describe("Project to search within. Auto-filled from CLI and SDK context when omitted."),query:a.string().trim().min(1,"Query must be at least 1 character").max(500,"Query must be at most 500 characters"),limit:a.coerce.number().min(1).max(100).default(20).describe("Maximum number of search results to return."),page:a.coerce.number().min(1).default(1).describe("One-based page number.")}),lW=MI.extend({status:a.enum(["regular","archived"]).optional().describe("Optional thread status filter.")}),uW=MI.extend({threadId:a.string().uuid().optional().describe("Optional thread restriction for message search."),role:a.enum(["user","assistant"]).optional().describe("Optional message role filter.")}),gW=a.object({threads:a.array(a.object({id:a.string().uuid(),projectId:a.string().uuid().optional(),title:a.string(),status:a.enum(["regular","archived"]),labels:a.array(a.string()),createdAt:a.string().datetime(),updatedAt:a.string().datetime(),highlights:a.array(a.string()),score:a.number().optional()})),pagination:a.object({page:a.number(),limit:a.number(),totalResults:a.number(),totalPages:a.number()}).describe("Page-based pagination metadata for the current search result.")}),dW=a.object({messages:a.array(a.object({id:a.string().uuid(),threadId:a.string().uuid(),threadTitle:a.string(),role:a.enum(["user","assistant"]),content:a.string(),createdAt:a.string().datetime(),updatedAt:a.string().datetime(),highlights:a.array(a.string()),score:a.number().optional()})),pagination:a.object({page:a.number(),limit:a.number(),totalResults:a.number(),totalPages:a.number()}).describe("Page-based pagination metadata for the current search result.")}),_i=P({operationId:"search.threads",description:"Search threads within one project.",backend:"api",route:{method:"GET",path:"/search/threads",tags:["Search"]},input:lW,output:gW,pagination:"page",async:"sync",examples:[{name:"search-open-incidents",input:{projectId:"11111111-1111-4111-8111-111111111111",query:"payment timeout",status:"regular",limit:10,page:1},output:{threads:[{id:"22222222-2222-4222-8222-222222222222",projectId:"11111111-1111-4111-8111-111111111111",title:"Payment timeout in us-west-2",status:"regular",labels:["payments","timeout"],createdAt:"2026-01-01T00:00:00.000Z",updatedAt:"2026-01-02T00:00:00.000Z",highlights:["payment timeout"],score:123.45}],pagination:{page:1,limit:10,totalResults:1,totalPages:1}}}]}),ji=P({operationId:"search.messages",description:"Search messages within one project.",backend:"api",route:{method:"GET",path:"/search/messages",tags:["Search"]},input:uW,output:dW,pagination:"page",async:"sync",examples:[{name:"search-assistant-messages",input:{projectId:"11111111-1111-4111-8111-111111111111",query:"rollback",role:"assistant",limit:10,page:1},output:{messages:[{id:"33333333-3333-4333-8333-333333333333",threadId:"22222222-2222-4222-8222-222222222222",threadTitle:"Deployment rollback guidance",role:"assistant",content:"Rollback the ingestion deployment and confirm queue depth.",createdAt:"2026-01-02T00:00:00.000Z",updatedAt:"2026-01-02T00:00:00.000Z",highlights:["Rollback the ingestion deployment"],score:98.76}],pagination:{page:1,limit:10,totalResults:1,totalPages:1}}}]}),bde={threads:_i.contract,messages:ji.contract}});var es,bW,mW,pW,wW,fW,kW,vW,SW,PW,mde,JI,$W,Jg,Hg,Ni,Bg,Wg,IW,LW,Zg,TW,OW,xi,EI,pde,AW,CW,DW,wde,zW,_W,jW,HI,NW,xW,RW,Fg,Xg,Yg,Qg,ts,UW,qI,MW,ns,BI,KW,EW,fde,kde,WI,qW,GW,JW,HW,BW,WW,ZW,ZI,Vg,ed,td,nd,FI,FW,GI,Vc,XI,vde,od,XW,YW,QW,VW,yW,eZ,tZ,nZ,rd,id,oZ,YI,rZ,iZ,aZ,cZ,sZ,ad,cd,Sde;var QI=g(()=>{be();Le();es=a.object({id:a.string().uuid(),projectId:a.string().uuid(),name:a.string(),description:a.string().nullable(),origin:a.enum(["user_declared","code_detected","log_observed"]),lifecycle:a.enum(["active","retired","merged"]),observationState:a.enum(["observed","stale","unobserved"]),registryRevision:a.number().int().nonnegative(),canonicalComponentId:a.string().uuid(),mergedIntoComponentId:a.string().uuid().nullable(),currentStatus:a.enum(["operational","degraded","outage"]).describe("Current health status of this component."),firstSeenAt:a.string().datetime(),lastSeenAt:a.string().datetime(),deletedAt:a.string().datetime().nullable().describe("Timestamp when this component was retired, if any."),retiredAt:a.string().datetime().nullable(),retirementReason:a.string().nullable(),legacyStateUnknown:a.boolean().describe("True only for migration-era inactive rows whose retirement authority is unknown.")}),bW=a.object({projectId:a.string().uuid().optional().describe("Project to list status components for. Auto-filled from CLI and SDK context when omitted."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of components to return per page."),cursor:a.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page."),includeDeleted:a.union([a.boolean(),a.stringbool()]).default(!1).describe("When true, include retired and merged components.")}),mW=a.object({statusComponents:a.array(es),nextCursor:a.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),pW=a.object({componentId:a.string().uuid().describe("Status component ID to retrieve.")}),wW=a.object({statusComponent:es}),fW=a.object({projectId:a.string().uuid().optional().describe("Project to register the status component in. Auto-filled from CLI and SDK context when omitted."),name:a.string().trim().min(1,"Name is required").describe("Evidence-backed component name to register."),description:a.string().trim().min(1,"Description cannot be empty").optional().describe("Optional component description."),requestId:a.string().uuid().optional().describe("Project-scoped idempotency key. Reuse only for an identical registration request.")}),kW=a.object({statusComponent:es}),vW=a.object({componentId:a.string().uuid().describe("Active component ID to rename."),name:a.string().trim().min(1,"Name is required"),requestId:a.string().uuid().describe("Project-scoped idempotency key for this exact rename."),reason:a.string().trim().min(1,"Reason cannot be empty").describe("Customer-visible audit reason for renaming the component.")}),SW=a.object({statusComponent:es}),PW=a.object({componentId:a.string().uuid().describe("Status component ID to deregister."),reason:a.string().trim().min(1,"Reason cannot be empty").optional().describe("Optional reason for audit logging.")}),mde=a.object({openIssueIds:a.array(a.string().uuid()),activeComponentIssueIds:a.array(a.string().uuid()),automationBindingIds:a.array(a.string().uuid()),notificationRuleIds:a.array(a.string().uuid()),dataSourceMappingIds:a.array(a.string().uuid()),observationIds:a.array(a.string().uuid()),relationshipIds:a.array(a.string().uuid()),recommendationScopeIds:a.array(a.string().uuid()),externalIncidentIds:a.array(a.string().uuid()),authorizedDeliveryIds:a.array(a.string().uuid()),authorizedAutomationRunIds:a.array(a.string().uuid())}),JI=a.object({requestedComponentId:a.string().uuid(),canonicalComponentId:a.string().uuid(),canonicalComponentName:a.string(),lifecycle:a.enum(["active","retired"]),affectedComponentIds:a.array(a.string().uuid()),componentRevisions:a.record(a.string().uuid(),a.number().int().nonnegative()),requiresCanonicalGroupConfirmation:a.boolean(),recommendationScopeEnabled:a.literal(!1),dependents:mde,counts:a.record(a.string(),a.number().int().nonnegative())}),$W=a.discriminatedUnion("status",[a.object({status:a.literal("observation_withdrawn"),componentId:a.string().uuid(),sourceType:a.literal("secret_key"),withdrawn:a.boolean()}),a.object({status:a.literal("retirement_confirmation_required"),preview:JI})]),Jg=P({operationId:"statusComponents.list",description:"List status page components in a project.",backend:"api",route:{method:"GET",path:"/status-components",tags:["Status Components"]},input:bW,output:mW,pagination:"cursor",async:"sync"}),Hg=P({operationId:"statusComponents.get",description:"Get a single status component by ID.",backend:"api",route:{method:"GET",path:"/status-components/{componentId}",tags:["Status Components"]},input:pW,output:wW,pagination:"none",async:"sync"}),Ni=P({operationId:"statusComponents.register",description:"Register a status page component in a project, or refresh an existing active component with the same name.",backend:"api",route:{method:"POST",path:"/status-components",tags:["Status Components"]},input:fW,output:kW,pagination:"none",async:"sync"}),Bg=P({operationId:"statusComponents.deregister",description:"Withdraw this credential's component observation, or return a retirement preview for a human caller.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/deregister",tags:["Status Components"]},input:PW,output:$W,pagination:"none",async:"sync"}),Wg=P({operationId:"statusComponents.rename",description:"Rename an active component while reserving its previous exact name as an alias.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/rename",tags:["Status Components"]},input:vW,output:SW,pagination:"none",async:"sync"}),IW=a.object({componentId:a.string().uuid().describe("Component whose owning team to set."),teamId:a.string().uuid().nullable().describe("Team to assign as owner, or null to unassign.")}),LW=a.object({componentId:a.string().uuid().describe("Component that was updated."),teamId:a.string().uuid().nullable().describe("Owning team after the update, or null when unassigned.")}),Zg=P({operationId:"statusComponents.assignTeam",description:"Assign a component to an owning team, reassign it, or unassign it. A component is owned by at most one team.",backend:"api",route:{method:"PUT",path:"/status-components/{componentId}/team",tags:["Status Components"]},input:IW,output:LW,pagination:"none",async:"sync"}),TW=a.object({componentId:a.string().uuid().describe("Component or merged-source ID whose canonical group to retire.")}),OW=a.object({preview:JI}),xi=a.record(a.string().uuid(),a.number().int().nonnegative()),EI=a.object({id:a.string().uuid(),rowRevision:a.number().int().nonnegative()}),pde=a.object({notificationRules:a.array(EI),automationBindings:a.array(EI),relationships:a.array(EI)}),AW=a.object({componentId:a.string().uuid().describe("Component or merged-source ID confirmed by the preview."),requestId:a.string().uuid().describe("Project-scoped idempotency key for this exact retirement."),reason:a.string().trim().min(1,"Reason cannot be empty").describe("Customer-visible audit reason for retiring the component."),componentRevisions:xi.describe("Exact canonical-group revisions returned by retirementPreview."),confirmCanonicalGroup:a.boolean().default(!1).describe("Explicitly confirm retiring the complete canonical group when the request used a merged source.")}),CW=a.object({operationId:a.string().uuid(),status:a.enum(["committed","complete","followup_failed"]),requestedComponentId:a.string().uuid(),canonicalComponentId:a.string().uuid(),affectedComponentIds:a.array(a.string().uuid()),counts:a.record(a.string(),a.number().int().nonnegative()),authorizedDeliveryIds:a.array(a.string().uuid()),authorizedAutomationRunIds:a.array(a.string().uuid()),manualExternalIncidentIds:a.array(a.string().uuid()),issueAutomationSuppressions:a.number().int().nonnegative(),outboxEffectCount:a.number().int().nonnegative(),manifest:pde,followups:a.record(a.string(),a.unknown()).optional()}),DW=a.object({result:CW}),wde=a.object({notificationRuleIds:a.array(a.string().uuid()),automationBindingIds:a.array(a.string().uuid()),recommendationScopeIds:a.array(a.string().uuid()),relationshipIds:a.array(a.string().uuid())}),zW=a.object({componentId:a.string().uuid().describe("Retired component or merged-source ID to inspect."),retirementOperationId:a.string().uuid().optional().describe("Optional retirement operation to verify; defaults to the component's current retirement.")}),_W=a.object({requestedComponentId:a.string().uuid(),canonicalComponentId:a.string().uuid(),canonicalComponentName:a.string(),retirementOperationId:a.string().uuid(),affectedComponentIds:a.array(a.string().uuid()),componentRevisions:xi,eligible:wde}),jW=a.object({preview:_W}),HI=a.object({notificationRuleIds:a.array(a.string().uuid()).default([]),automationBindingIds:a.array(a.string().uuid()).default([]),recommendationScopeIds:a.array(a.string().uuid()).default([]),relationshipIds:a.array(a.string().uuid()).default([])}),NW=a.object({componentId:a.string().uuid().describe("Retired component or merged-source ID confirmed by preview."),retirementOperationId:a.string().uuid().describe("Retirement operation whose unchanged dependents may be restored."),requestId:a.string().uuid().describe("Project-scoped idempotency key for this exact restoration."),reason:a.string().trim().min(1,"Reason cannot be empty").describe("Customer-visible audit reason for restoring the component."),componentRevisions:xi.describe("Exact canonical-group revisions returned by restorationPreview."),selections:HI.default({notificationRuleIds:[],automationBindingIds:[],recommendationScopeIds:[],relationshipIds:[]}).describe("Only these still-eligible dependents are restored; omitted selections restore none.")}),xW=a.object({operationId:a.string().uuid(),status:a.literal("complete"),requestedComponentId:a.string().uuid(),canonicalComponentId:a.string().uuid(),affectedComponentIds:a.array(a.string().uuid()),restored:HI}),RW=a.object({result:xW}),Fg=P({operationId:"statusComponents.retirementPreview",description:"Preview every synchronous and follow-up consequence of retiring a canonical component group.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/retirement/preview",tags:["Status Components"]},input:TW,output:OW,pagination:"none",async:"sync"}),Xg=P({operationId:"statusComponents.retire",description:"Atomically retire a confirmed canonical component group and durably enqueue lifecycle follow-ups.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/retire",tags:["Status Components"]},input:AW,output:DW,pagination:"none",async:"sync"}),Yg=P({operationId:"statusComponents.restorationPreview",description:"Preview unchanged retirement-owned dependents that remain eligible for explicit restoration.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/restoration/preview",tags:["Status Components"]},input:zW,output:jW,pagination:"none",async:"sync"}),Qg=P({operationId:"statusComponents.restore",description:"Restore a retired canonical component and only the explicitly selected eligible dependents.",backend:"api",route:{method:"POST",path:"/status-components/{componentId}/restore",tags:["Status Components"]},input:NW,output:RW,pagination:"none",async:"sync"}),ts=a.enum(["part_of","depends_on"]).describe("Relationship semantics: part_of is an acyclic child-to-parent edge; depends_on may be cyclic."),UW=a.enum(["observed","stale","unobserved"]),qI=a.object({originalComponentId:a.string().uuid(),effectiveComponentId:a.string().uuid(),name:a.string(),lifecycle:a.enum(["active","retired","merged"]),observationState:UW}),MW=a.object({id:a.string().uuid(),source:qI,target:qI,relationshipType:ts,createdAt:a.string().datetime(),endedAt:a.string().datetime().nullable(),endReason:a.string().nullable(),rowRevision:a.number().int().nonnegative()}),ns=a.object({projectId:a.string().uuid().optional().describe("Project containing the component topology. Auto-filled from CLI and SDK context when omitted.")}),BI=a.object({sourceComponentId:a.string().uuid().describe("Child or dependency-source component ID."),targetComponentId:a.string().uuid().describe("Parent or dependency-target component ID."),relationshipType:ts}),KW=ns.extend({includeHistorical:a.union([a.boolean(),a.stringbool()]).default(!1).describe("Include historically ended relationships.")}),EW=a.object({relationships:a.array(MW)}),fde=a.object({ruleId:a.string().uuid(),ruleGroupId:a.string().uuid().nullable(),ownerComponentId:a.string().uuid(),destinationIds:a.array(a.string().uuid()),beforeComponentIds:a.array(a.string().uuid()),afterComponentIds:a.array(a.string().uuid())}),kde=a.object({bindingId:a.string().uuid(),automationId:a.string().uuid(),ownerComponentId:a.string().uuid(),beforeComponentIds:a.array(a.string().uuid()),afterComponentIds:a.array(a.string().uuid())}),WI=a.object({notificationRules:a.array(fde),automationBindings:a.array(kde)}),qW=BI.extend({action:a.enum(["add","remove"]),organizationId:a.string(),projectId:a.string().uuid(),relationshipId:a.string().uuid().nullable(),componentRevisions:a.record(a.string().uuid(),a.number().int().nonnegative()),policyImpact:WI,confirmationRequired:a.boolean()}),GW=ns.merge(BI).extend({action:a.enum(["add","remove"]).describe("Topology mutation to preview without changing the graph.")}),JW=a.object({preview:qW}),HW=ns.merge(BI).extend({requestId:a.string().uuid().describe("Project-scoped idempotency key for this exact mutation."),reason:a.string().trim().min(1,"Reason cannot be empty"),componentRevisions:a.record(a.string().uuid(),a.number().int().nonnegative()),confirmPolicyImpact:a.boolean().default(!1).describe("Confirm the descendant-scoped notification and automation changes shown by preview.")}),BW=HW,WW=HW,ZW=a.object({action:a.enum(["add","remove"]),relationshipId:a.string().uuid(),sourceComponentId:a.string().uuid(),targetComponentId:a.string().uuid(),relationshipType:ts,policyImpact:WI}),ZI=a.object({result:ZW}),Vg=P({operationId:"statusComponents.relationships.list",description:"List active or historical component topology edges.",backend:"api",route:{method:"GET",path:"/status-components/relationships",tags:["Status Components"]},input:KW,output:EW,pagination:"none",async:"sync"}),ed=P({operationId:"statusComponents.relationships.preview",description:"Preview descendant-scoped notification and automation impact for a topology change.",backend:"api",route:{method:"POST",path:"/status-components/relationships/preview",tags:["Status Components"]},input:GW,output:JW,pagination:"none",async:"sync"}),td=P({operationId:"statusComponents.relationships.add",description:"Add a confirmed, tenant-safe component topology edge.",backend:"api",route:{method:"POST",path:"/status-components/relationships",tags:["Status Components"]},input:BW,output:ZI,pagination:"none",async:"sync"}),nd=P({operationId:"statusComponents.relationships.remove",description:"Historically end a confirmed component topology edge.",backend:"api",route:{method:"POST",path:"/status-components/relationships/remove",tags:["Status Components"]},input:WW,output:ZI,pagination:"none",async:"sync"}),FI=a.enum(["suspend","move"]),FW=a.object({disposition:FI,beforeComponentIds:a.array(a.string().uuid()).describe("Exact effective component set returned by mergePreview."),afterComponentIds:a.array(a.string().uuid()).describe("Exact effective component set that ownership would have on the target.")}),GI=a.object({kind:a.enum(["notification_rule","automation_binding"]),policyId:a.string().uuid(),sourceRowRevision:a.number().int().nonnegative(),sourceComponentId:a.string().uuid(),equivalentPolicyId:a.string().uuid().nullable(),equivalent:a.boolean(),defaultDisposition:a.enum(["deduplicate","suspend"]),allowedDispositions:a.array(FI),beforeComponentIds:a.array(a.string().uuid()),afterComponentIds:a.array(a.string().uuid())}),Vc=a.object({kind:a.enum(["notification_rule","automation_binding"]),policyId:a.string().uuid(),ownerComponentId:a.string().uuid(),rowRevision:a.number().int().nonnegative(),beforeComponentIds:a.array(a.string().uuid()),afterComponentIds:a.array(a.string().uuid())}),XI=a.object({relationshipId:a.string().uuid(),action:a.enum(["rewire","close_self","close_duplicate"]),relationshipType:ts,beforeSourceComponentId:a.string().uuid(),beforeTargetComponentId:a.string().uuid(),afterSourceComponentId:a.string().uuid(),afterTargetComponentId:a.string().uuid(),survivingRelationshipId:a.string().uuid().nullable(),beforeRowRevision:a.number().int().nonnegative(),afterRowRevision:a.number().int().nonnegative().nullable()}),vde=a.object({openIssueIds:a.array(a.string().uuid()),componentIssueIds:a.array(a.string().uuid()),observationIds:a.array(a.string().uuid()),dataSourceMappingIds:a.array(a.string().uuid()),nameIds:a.array(a.string().uuid()),relationshipIds:a.array(a.string().uuid()),recommendationScopeIds:a.array(a.string().uuid())}),od=a.object({sourceComponentId:a.string().uuid().describe("Active or retired component whose independent grain is removed."),targetComponentId:a.string().uuid().describe("Active terminal component that becomes the canonical target.")}),XW=ns.merge(od),YW=od.extend({organizationId:a.string(),projectId:a.string().uuid(),sourceGroupComponentIds:a.array(a.string().uuid()),targetGroupComponentIds:a.array(a.string().uuid()),affectedComponentIds:a.array(a.string().uuid()),componentRevisions:xi,inventory:vde,notificationPolicies:a.array(GI),automationBindings:a.array(GI),notificationScopeChanges:a.array(Vc),automationScopeChanges:a.array(Vc),relationshipChanges:a.array(XI),recommendationScopeEnabled:a.literal(!1),dependentCount:a.number().int().nonnegative(),ordinaryTransactionLimit:a.number().int().positive(),operatorAssistanceRequired:a.boolean(),confirmationRequired:a.boolean()}),QW=a.object({preview:YW}),VW=ns.merge(od).extend({requestId:a.string().uuid().describe("Project-scoped idempotency key for this exact consolidation."),reason:a.string().trim().min(1,"Reason cannot be empty").describe("Customer-visible audit reason for consolidation."),componentRevisions:xi.describe("Exact canonical-group revisions returned by mergePreview."),policyDispositions:a.record(a.string().uuid(),FW).describe("Exactly one disposition for every non-equivalent source policy; each repeats the previewed effective sets."),confirmPolicyImpact:a.boolean().default(!1).describe("Explicitly acknowledge every before/after policy scope change shown by mergePreview.")}),yW=a.object({policyId:a.string().uuid(),action:a.enum(["deduplicated","suspended","moved"]),equivalentPolicyId:a.string().uuid().nullable(),beforeRowRevision:a.number().int().nonnegative(),afterRowRevision:a.number().int().nonnegative(),beforeComponentIds:a.array(a.string().uuid()),afterComponentIds:a.array(a.string().uuid())}),eZ=a.object({componentRevisions:xi,redirectedComponentIds:a.array(a.string().uuid()),dataSourceMappingIds:a.array(a.string().uuid()),movedAliasIds:a.array(a.string().uuid()),historicalDisplayIds:a.array(a.string().uuid()),relationshipChanges:a.array(XI),notificationPolicies:a.array(yW),automationBindings:a.array(yW),notificationScopeChanges:a.array(Vc),automationScopeChanges:a.array(Vc),recommendationScopeIds:a.array(a.string().uuid())}),tZ=od.extend({operationId:a.string().uuid(),status:a.literal("complete"),affectedComponentIds:a.array(a.string().uuid()),manifest:eZ}),nZ=a.object({result:tZ}),rd=P({operationId:"statusComponents.mergePreview",description:"Preview one-hop redirects, historical preservation, operational rebinding, topology contraction, and policy dispositions for component consolidation.",backend:"api",route:{method:"POST",path:"/status-components/merge/preview",tags:["Status Components"]},input:XW,output:QW,pagination:"none",async:"sync"}),id=P({operationId:"statusComponents.merge",description:"Consolidate a source into an active terminal target without rewriting historical issue or observation attribution.",backend:"api",route:{method:"POST",path:"/status-components/merge",tags:["Status Components"]},input:VW,output:nZ,pagination:"none",async:"sync"}),oZ=a.enum(["degraded","outage"]).describe("Severity of a status-page incident. 'outage' marks the component down; 'degraded' marks partial impact."),YI=a.object({id:a.string().uuid(),componentId:a.string().uuid(),projectId:a.string().uuid(),severity:oZ,summary:a.string().describe("Human-readable summary of the status-page issue."),startedAt:a.string().datetime().describe("When the incident began affecting the component."),resolvedAt:a.string().datetime().nullable().describe("When the incident was resolved, or null while ongoing.")}),rZ=a.object({projectId:a.string().uuid().optional().describe("Project to list status-page issues for. Auto-filled from CLI and SDK context when omitted."),componentId:a.string().uuid().optional().describe("Restrict results to a single component."),activeOnly:a.union([a.boolean(),a.stringbool()]).default(!1).describe("When true, return only unresolved (ongoing) issues."),limit:a.coerce.number().int().min(1).max(100).default(50).describe("Maximum number of issues to return per page."),cursor:a.string().uuid().optional().describe("Cursor from a previous response's nextCursor to fetch the next page.")}),iZ=a.object({incidents:a.array(YI),nextCursor:a.string().uuid().nullable().describe("Pass as 'cursor' to fetch the next page. Null when there are no more results.")}),aZ=a.object({timestamp:a.string().datetime(),status:a.enum(["operational","degraded","outage","unknown"]).describe("Worst component status observed during this timeline bucket.")}),cZ=a.object({componentId:a.string().uuid().describe("Status component to build the timeline for."),windowStart:a.string().datetime({offset:!0}).optional().describe("Start of the timeline window. Defaults to 7 days before windowEnd."),windowEnd:a.string().datetime({offset:!0}).optional().describe("End of the timeline window. Defaults to now.")}),sZ=a.object({componentId:a.string().uuid(),windowStart:a.string().datetime(),windowEnd:a.string().datetime(),timeline:a.array(aZ),incidents:a.array(YI)}),ad=P({operationId:"statusComponents.incidents.list",description:"List status-page issues in a project.",backend:"api",route:{method:"GET",path:"/status-incidents",tags:["Status Components"]},input:rZ,output:iZ,pagination:"cursor",async:"sync"}),cd=P({operationId:"statusComponents.timeline",description:"Get the dense status timeline and incidents for a component over a time window.",backend:"api",route:{method:"GET",path:"/status-components/{componentId}/timeline",tags:["Status Components"]},input:cZ,output:sZ,pagination:"none",async:"sync"}),Sde={list:Jg.contract,get:Hg.contract,register:Ni.contract,deregister:Bg.contract,rename:Wg.contract,assignTeam:Zg.contract,retirementPreview:Fg.contract,retire:Xg.contract,restorationPreview:Yg.contract,restore:Qg.contract,mergePreview:rd.contract,merge:id.contract,relationships:{list:Vg.contract,preview:ed.contract,add:td.contract,remove:nd.contract},incidents:{list:ad.contract},timeline:cd.contract}});var hZ;var lZ=g(()=>{hZ=["onboarding","setup"]});var uZ,gZ,dZ,yZ,os;var VI=g(()=>{lZ();be();Le();uZ=a.enum(hZ),gZ=a.object({id:a.string().describe("Unique task identifier (e.g. install_github_app)."),label:a.string().describe("Short human-readable task name."),description:a.string().describe("Explanation of what needs to be completed to satisfy this task."),instructions:a.string().describe("Step-by-step instructions for completing this task."),completed:a.boolean().describe("Whether the task has been completed."),completedAt:a.string().datetime().nullable().describe("ISO 8601 timestamp of when the task was completed, or null."),category:uZ.describe("Task category: onboarding (core setup steps) or setup (additional configuration).")}),dZ=a.object({projectId:a.string().uuid().optional().describe("Project to list tasks for. Auto-filled from CLI and SDK context when omitted.")}),yZ=a.object({tasks:a.array(gZ).describe("All onboarding and setup tasks with their current completion status.")}),os=P({operationId:"tasks.list",description:"List all onboarding and setup tasks for a project, including their current completion status and a description of what is required to complete each task.",backend:"api",route:{method:"GET",path:"/tasks",tags:["Tasks"]},input:dZ,output:yZ,pagination:"none",async:"sync"})});var Pde,$de,Yo,Ide,Lde,Tde,Ode,Ade,Cde,Dde,zde,_de,jde,Nde,xde,Rde,Ude,eL,tL,nL,oL,rL,iL,aL,DYe;var bZ=g(()=>{be();Le();Pde=a.object({id:a.string().uuid().describe("Team ID."),name:a.string().describe("Team name, unique among the org's active teams."),description:a.string().nullable().describe("Optional team description."),createdAt:a.string().datetime().describe("When the team was created."),memberCount:a.number().int().nonnegative().describe("Number of active members in the team.")}),$de=a.object({userId:a.string().min(1).describe("User ID of the team member."),name:a.string().nullable().describe("Display name for the member, when available."),email:a.string().email().describe("Email address for the member."),addedAt:a.string().datetime().describe("When the member was added to the team.")}),Yo=a.string().min(1).optional().describe("Organization to operate on. Auto-filled from CLI and SDK context when omitted."),Ide=a.object({organizationId:Yo}),Lde=a.object({teams:a.array(Pde).describe("Active teams in the organization.")}),Tde=a.object({organizationId:Yo,name:a.string().trim().min(1).describe("Team name."),description:a.string().trim().min(1).optional().describe("Optional team description.")}),Ode=a.object({id:a.string().uuid().describe("ID of the created team.")}),Ade=a.object({organizationId:Yo,teamId:a.string().uuid().describe("Team to update."),name:a.string().trim().min(1).optional().describe("New team name."),description:a.string().trim().min(1).nullable().optional().describe("New team description; null clears it.")}),Cde=a.object({id:a.string().uuid().describe("ID of the updated team.")}),Dde=a.object({params:a.object({teamId:a.string().uuid().describe("Team to delete.")}),query:a.object({organizationId:Yo})}).transform(({params:e,query:t})=>({...t,...e})),zde=a.object({success:a.literal(!0).describe("The team and its memberships were removed.")}),_de=a.object({organizationId:Yo,teamId:a.string().uuid().describe("Team to add the member to."),userId:a.string().min(1).describe("User ID of an active organization member to add.")}),jde=a.object({id:a.string().uuid().describe("ID of the team membership.")}),Nde=a.object({params:a.object({teamId:a.string().uuid().describe("Team to remove the member from."),userId:a.string().min(1).describe("User ID of the member to remove.")}),query:a.object({organizationId:Yo})}).transform(({params:e,query:t})=>({...t,...e})),xde=a.object({success:a.literal(!0).describe("The membership was removed.")}),Rde=a.object({organizationId:Yo,teamId:a.string().uuid().describe("Team to list members for.")}),Ude=a.object({members:a.array($de).describe("Active members of the team.")}),eL=P({operationId:"teams.list",description:"List teams in an organization.",backend:"api",route:{method:"GET",path:"/teams",tags:["Teams"]},input:Ide,output:Lde,pagination:"none",async:"sync",examples:[{name:"organization-teams",input:{organizationId:"organization-123"},output:{teams:[{id:"5c0f9866-31ab-4237-94cc-a1d0ba2f6de2",name:"Payments",description:"Owns checkout and billing components.",createdAt:"2026-01-01T00:00:00.000Z",memberCount:4}]}}]}),tL=P({operationId:"teams.create",description:"Create a team in an organization.",backend:"api",route:{method:"POST",path:"/teams",tags:["Teams"],successStatus:201},input:Tde,output:Ode,pagination:"none",async:"sync"}),nL=P({operationId:"teams.update",description:"Rename a team or update its description.",backend:"api",route:{method:"PATCH",path:"/teams/{teamId}",tags:["Teams"]},input:Ade,output:Cde,pagination:"none",async:"sync"}),oL=P({operationId:"teams.delete",description:"Delete a team, its memberships, and its component-ownership assignments.",backend:"api",route:{method:"DELETE",path:"/teams/{teamId}",tags:["Teams"],inputStructure:"detailed"},input:Dde,output:zde,pagination:"none",async:"sync"}),rL=P({operationId:"teams.addMember",description:"Add an active organization member to a team.",backend:"api",route:{method:"POST",path:"/teams/{teamId}/members",tags:["Teams"],successStatus:201},input:_de,output:jde,pagination:"none",async:"sync"}),iL=P({operationId:"teams.removeMember",description:"Remove a member from a team.",backend:"api",route:{method:"DELETE",path:"/teams/{teamId}/members/{userId}",tags:["Teams"],inputStructure:"detailed"},input:Nde,output:xde,pagination:"none",async:"sync"}),aL=P({operationId:"teams.listMembers",description:"List a team's active members.",backend:"api",route:{method:"GET",path:"/teams/{teamId}/members",tags:["Teams"]},input:Rde,output:Ude,pagination:"none",async:"sync"}),DYe={list:eL.contract,create:tL.contract,update:nL.contract,delete:oL.contract,addMember:rL.contract,removeMember:iL.contract,listMembers:aL.contract}});var cL;var mZ=g(()=>{oD();iD();lD();qk();Hk();FD();dS();mS();wS();O$();Og();TH();R$();VH();LB();DB();zB();_B();OI();BB();CI();Dg();DI();hW();KI();QI();VI();bZ();eI();cL={me:A$.contract,automations:{list:Tk.contract,get:Ok.contract,create:Ak.contract,update:Ck.contract,enable:Dk.contract,disable:zk.contract,runs:{list:_k.contract,get:jk.contract,logs:Nk.contract}},logs:{query:Qr.contract,schema:Vr.contract,volume:ei.contract,patterns:ti.contract,nativeQuery:ni.contract,searchNatural:su.contract},dataSources:{listTypes:Gl.contract,listInstances:Zr.contract,createInstance:Fr.contract,getInstance:Jl.contract,updateInstance:Hl.contract,deleteInstance:Bl.contract,listStreams:Wl.contract,createStream:Zl.contract,getStream:Fl.contract,updateStream:Xl.contract,deleteStream:Yl.contract},logSources:{listProviders:Vl.contract,list:Xr.contract,create:Yr.contract,get:eu.contract,update:tu.contract,delete:nu.contract,listStreams:ou.contract,createStream:ru.contract,getStream:iu.contract,updateStream:au.contract,deleteStream:cu.contract},integrations:{listProviders:cD.contract,listConnections:sD.contract,getConnection:hD.contract},notificationChannels:{getProject:aI.contract},notificationDeliveryRules:{list:dI.contract,options:yI.contract,create:bI.contract,update:mI.contract,delete:pI.contract},mcpConnectors:{listProviders:Tg.contract,list:vi.contract,get:Si.contract,details:Pi.contract},sandboxPresets:{listConnections:zi.contract,listTypes:Eg.contract,upsertPreset:qg.contract},scripts:{list:jI.contract,get:NI.contract,create:xI.contract,update:RI.contract,delete:UI.contract},logMatchExpressions:{list:Zk.contract,get:Fk.contract,create:Xk.contract,update:Yk.contract,disable:Qk.contract},memory:{put:Ii.contract,get:Li.contract,list:Ti.contract,search:Oi.contract,delete:Ai.contract},onboarding:{getState:fI.contract,skipIntegration:kI.contract,skipGithubAppInstallation:vI.contract,skipSampleIssue:SI.contract,finish:PI.contract},organizations:{list:II.contract,get:LI.contract,create:$I.contract,update:TI.contract},members:{list:C$.contract,updateRole:D$.contract,remove:z$.contract},teams:{list:eL.contract,create:tL.contract,update:nL.contract,delete:oL.contract,addMember:rL.contract,removeMember:iL.contract,listMembers:aL.contract},publicKeys:{list:Gr.contract,get:Jr.contract,ensureLogForwarding:Hr.contract,update:Br.contract,deactivate:Wr.contract},secretKeys:{list:jl.contract,get:Nl.contract,create:xl.contract,update:Rl.contract,delete:Ul.contract},projects:{list:xg.contract,get:Rg.contract,create:Ug.contract,update:Mg.contract,delete:Kg.contract},search:{threads:_i.contract,messages:ji.contract},messages:{list:YH.contract,append:QH.contract},threads:{list:G$.contract,get:J$.contract,getStatus:H$.contract,stop:B$.contract,create:W$.contract,update:Z$.contract,fork:F$.contract,setVisibility:X$.contract,createShareLink:Y$.contract,listShareLinks:Q$.contract,revokeShareLink:V$.contract},runs:{list:U$.contract,listForThread:M$.contract,get:K$.contract,cancel:E$.contract},pullRequests:{list:AI.contract},issues:{count:Pl.contract,create:qr.contract,list:vl.contract,search:Sl.contract,get:$l.contract,resolve:Il.contract,ignore:Ll.contract,reopen:Tl.contract,reassignAndReopen:Ol.contract,mute:Al.contract,unmute:Cl.contract},billing:{getSummary:xk.contract,getUsage:Rk.contract,listTransactions:Uk.contract},tasks:{list:os.contract},recommendations:{list:Qc.contract},statusComponents:{list:Jg.contract,get:Hg.contract,register:Ni.contract,deregister:Bg.contract,rename:Wg.contract,assignTeam:Zg.contract,retirementPreview:Fg.contract,retire:Xg.contract,restorationPreview:Yg.contract,restore:Qg.contract,mergePreview:rd.contract,merge:id.contract,relationships:{list:Vg.contract,preview:ed.contract,add:td.contract,remove:nd.contract},incidents:{list:ad.contract},timeline:cd.contract}}});var Ri=g(()=>{YC();mZ();qk();Hk();dS();mS();wS();O$();R$();OI();CI();DI();KI();QI();VI()});var Mde="https://api.sazabi.com",Kde="x-sazabi-client-source",wZ=(e)=>{return{streamRun:async(t)=>{return pZ({options:e,path:`/runs/${encodeURIComponent(t.runId)}/stream`,cursor:t.cursor,signal:t.signal})},streamThread:async(t)=>{return pZ({options:e,path:`/threads/${encodeURIComponent(t.threadId)}/stream`,cursor:t.cursor,signal:t.signal})}}},pZ=async(e)=>{let t=e.options.fetch??globalThis.fetch;if(!t)throw Error("Fetch transport is not available in this runtime.");let n=await e.options.credentialProvider.getToken(),r=Ede(e.options.apiBaseUrl,e.path,e.cursor);return Gde({url:r,token:n,clientSource:e.options.clientSource,initialCursor:e.cursor,signal:e.signal,fetch:t})},Ede=(e,t,n)=>{let r=qde(e??Mde),o=new URL(`${r}${t}`);if(n)o.searchParams.set(Sk,n);return o.toString()},qde=(e)=>{let t=e.replace(/\/+$/,"");return t.endsWith("/v1")?t:`${t}/v1`},Gde=async(e)=>{let t=[],n=[],r=!1,o=!1,i,c=e.initialCursor,s=new AbortController,h=(k)=>{if(r)return;r=!0,i=k;while(n.length>0)n.shift()?.({value:void 0,done:!0})},l=(k)=>{let L=n.shift();if(L){L({value:k,done:!1});return}t.push(k)},u=(k)=>{if(k.event===$k){let A=Zde(k.data);if(A!==void 0)c=A;return}if(k.data===Ik){o=!0,s.abort(),h();return}let L=Fde(k.data);if(L)l(L)},d=()=>{o=!0,s.abort(),h()};if(e.signal)if(e.signal.aborted)o=!0,s.abort();else e.signal.addEventListener("abort",d,{once:!0});let y={[Symbol.asyncIterator](){return y},get cursor(){return c},next:async()=>{if(t.length>0)return{value:t.shift(),done:!1};if(r){if(i)throw i;return{value:void 0,done:!0}}return new Promise((k)=>{n.push(k)}).then((k)=>{if(k.done&&i)throw i;return k})},return:async()=>{return o=!0,s.abort(),h(),{value:void 0,done:!0}},throw:async(k)=>{throw o=!0,s.abort(),h(k instanceof Error?k:Error(String(k))),k},close:async()=>{o=!0,s.abort(),h()}};if(o)return h(),y;let p=await e.fetch(e.url,{method:Pk,headers:Jde(e.token,e.clientSource),signal:s.signal});if(await Hde(p))h();else Bde(p,u).then(()=>h()).catch((k)=>{if(Yde(k)||o||e.signal?.aborted){h();return}h(Qde(k))});return y},Jde=(e,t)=>{return{accept:"text/event-stream",authorization:`Bearer ${e}`,...t?{[Kde]:t}:{}}},Hde=async(e)=>{if(e.status===204)return!0;if(e.ok&&e.body)return!1;let t=await Xde(e);if(e.status===401)throw Error("Authentication failed. Check your credential.");if(e.status===403)throw Error(`Forbidden (403): ${t||"Credential may not have access to this resource"}`);if(e.status===404)throw Error(`Not found (404): ${t||"Run or thread not found"}`);if(e.status===400)throw Error(`Invalid stream cursor (400): ${t||"The provided cursor was rejected"}`);if(e.status>=400&&e.status<500&&e.status!==429)throw Error(`Client error (${e.status}): ${t}`);if(!e.body)throw Error("Agent stream response did not include a body.");throw Error(e.status===429?`Rate limited (429): ${t}`:`Server error (${e.status}): ${t}`)},Bde=async(e,t)=>{let n=e.body?.getReader();if(!n)throw Error("Agent stream response did not include a body.");let r=new TextDecoder,o="",i=Wde(t);try{while(!0){let c=await n.read();if(c.done)break;o+=r.decode(c.value,{stream:!0});let s=o.split(/\r\n|\r|\n/);o=s.pop()??"";for(let h of s)i.line(h)}if(o+=r.decode(),o)for(let c of o.split(/\r\n|\r|\n/))i.line(c);i.flush()}finally{n.releaseLock()}},Wde=(e)=>{let t="message",n=[],r=()=>{t="message",n=[]},o=()=>{if(n.length===0){r();return}e({event:t,data:n.join(`
|
|
8616
8616
|
`)}),r()};return{line:(i)=>{if(i===""){o();return}if(i.startsWith(":"))return;let c=i.indexOf(":"),s=c===-1?i:i.slice(0,c),h=c===-1?"":i.slice(c+1),l=h.startsWith(" ")?h.slice(1):h;if(s==="event"){t=l||"message";return}if(s==="data")n.push(l)},flush:o}},Zde=(e)=>{try{let t=vk.safeParse(JSON.parse(e));return t.success?t.data.streamNextOffset:void 0}catch{return}},Fde=(e)=>{try{let t=kk.safeParse(JSON.parse(e));return t.success?t.data:void 0}catch{return}},Xde=async(e)=>{try{return await e.text()}catch{return""}},Yde=(e)=>{return e instanceof Error&&e.name==="AbortError"},Qde=(e)=>{return e instanceof Error?e:Error(String(e))};var fZ=g(()=>{Ri()});var sL,hL,lL,kZ;var vZ=g(()=>{be();sL=a.object({severities:a.array(a.string()).optional().describe("Limit results to the listed severities."),services:a.array(a.string()).optional().describe("Limit results to the listed service names."),environments:a.array(a.string()).optional().describe("Limit results to the listed deployment environments."),searchTerm:a.string().optional().describe("Case-insensitive substring match against the log body."),traceId:a.string().optional().describe("Limit results to one trace ID."),attributes:a.record(a.string(),a.string()).optional().describe("Limit results to logs whose attributes contain every listed key with an exactly equal value.")}),hL=a.object({service:a.string(),namespace:a.string(),environment:a.string(),host:a.string(),container:a.string(),pod:a.string()}),lL=a.object({id:a.string(),timestamp:a.string().datetime(),severity:a.string(),body:a.string(),service:a.string(),traceId:a.string(),spanId:a.string(),attributes:a.record(a.string(),a.string()),resource:hL}),kZ=a.object({type:a.literal("logs"),timestamp:a.string().datetime(),data:a.array(lL)})});var Vde="https://{region}.intake.sazabi.com",eye="https://{region}.tail.sazabi.com",$Z=500,tye=5000,IZ="sazabi.public_key",nye="x-sazabi-internal-log-forwarding-secret",oye="x-sazabi-internal-log-forwarding-source",rye=(e)=>{return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e},LZ=(e)=>{let t=rye(e);return t==="localhost"||t==="127.0.0.1"||t==="::1"},iye,aye,cye,TZ=(e)=>{let t=new Map;return{tail:async(n)=>{let r=await fye(e.credentialProvider,n.projectId,"logs.tail"),o=await kye(e,t,r,n.region,"logs.tail"),i=lye({projectId:r,region:o,filters:n.filters,apiBaseUrl:e.apiBaseUrl,tailBaseUrl:e.tailBaseUrl}),c=await e.credentialProvider.getToken(),s=e.fetch??globalThis.fetch;if(!s)throw Error("Fetch transport is not available in this runtime.");return Sye({token:c,url:i,signal:n.signal,fetch:s})},forward:async(n)=>{let r=await vye(e,t,n.projectId??await e.credentialProvider.getProjectId?.(),n.region,"logs.forward"),o=yye(r,e.intakeBaseUrl),i=e.fetch??globalThis.fetch,c=mye(n.logs,n.publicKey),s=Cye(c);return await Aye(i,o,c,wye(n.sazabiInternalForwarding)),{forwardedCount:s,failedCount:0}}}},sye="3010",hye,lye=(e)=>{let t=(e.tailBaseUrl??uye({region:e.region,apiBaseUrl:e.apiBaseUrl})).replace("{region}",e.region),n=gye(t);n.searchParams.set("projectId",e.projectId);let r=dye(e.filters);if(r)n.searchParams.set("filters",r);return n.toString()},uye=(e)=>{if(e.apiBaseUrl)try{let t=new URL(e.apiBaseUrl).hostname;if(t.endsWith(".sazabi.dev")){let n=t.includes(".staging.")?"staging.sazabi.dev":"development.sazabi.dev";return`https://${e.region}.tail.${n}`}}catch{}return eye.replace("{region}",e.region)},gye=(e)=>{let t=(()=>{try{return new URL(e)}catch{return null}})();if(!t)throw Error(`Invalid tail base URL: ${e}`);if(LZ(t.hostname)){if(t.protocol="http:",!t.port||hye.has(t.port))t.port=sye;return t.pathname="/v1/tail",t.search="",t.hash="",t}if(t.protocol==="ws:"||t.protocol==="wss:")t.protocol=t.protocol==="wss:"?"https:":"http:";if(t.protocol!=="http:"&&t.protocol!=="https:")throw Error(`Invalid tail base URL protocol: ${t.protocol}. Expected http:, https:, ws:, or wss:.`);return t.pathname="/v1/tail",t.search="",t.hash="",t},dye=(e)=>{if(!e)return;let t=Object.entries(e).filter(([,n])=>n!==void 0&&(!Array.isArray(n)||n.length>0)&&(typeof n!=="object"||Array.isArray(n)||n===null||Object.keys(n).length>0)&&n!=="");if(t.length===0)return;return JSON.stringify(Object.fromEntries(t))},yye=(e,t)=>{let n=(t??Vde).replace("{region}",e),r=n.endsWith("/")?n.slice(0,-1):n,o=bye(r);if(o)return o;let i=r.match(/^https:\/\/([a-z0-9-]+)\.intake\.([a-z0-9.]+)$/);return`${i?`https://otlp.${i[1]}.intake.${i[2]}`:r}/v1/logs`},bye=(e)=>{let t=(()=>{try{return new URL(e)}catch{return null}})();if(!t)return;if(!LZ(t.hostname))return;return t.pathname="/adapters/otlp",t.toString()},mye=(e,t)=>{let n=e.resourceLogs;if(!n||n.length===0)return{...e,resourceLogs:[{resource:{attributes:[OZ(t)]},scopeLogs:[]}]};return{...e,resourceLogs:n.map((r)=>({...r,resource:{...r.resource,attributes:pye(r.resource?.attributes,t)}}))}},pye=(e,t)=>{return[...(e??[]).filter((r)=>r?.key!==IZ),OZ(t)]},OZ=(e)=>({key:IZ,value:{stringValue:e}}),wye=(e)=>{if(!e?.secret)return{};return{[nye]:e.secret,...e.source?{[oye]:e.source}:{}}},fye=async(e,t,n)=>{let r=t??await e.getProjectId?.();if(r)return r;throw DZ(n,"Project ID is required",["projectId"])},kye=async(e,t,n,r,o)=>{return r??await AZ(e,t,n)},vye=async(e,t,n,r,o)=>{if(r)return r;if(!n)throw DZ(o,"Project ID is required",["projectId"]);return AZ(e,t,n)},AZ=async(e,t,n)=>{let r=t.get(n);if(r)return r;let o=e.raw.projects.get({projectId:n}).then((i)=>i.project.region);t.set(n,o);try{return await o}catch(i){throw t.delete(n),i}},Sye=async(e)=>{let t=[],n=[],r=!1,o=!1,i,c=0,s,h,l=(L)=>{if(r)return;r=!0,i=L;while(n.length>0){let A=n.shift();if(A)A({value:void 0,done:!0})}},u=(L)=>{let A=n.shift();if(A){A({value:L,done:!1});return}t.push(L)},d=()=>{h?.abort()},y=(L)=>{if(L.event!=="log"){if(L.id)s=L.id;return}let A=Tye(L.data);for(let K of A)u(K);if(L.id)s=L.id},p=async(L)=>{let A=!1;while(!r&&!o){let K=new AbortController,x=()=>K.abort();h=K;let Y=!1;e.signal?.addEventListener("abort",x,{once:!0});try{let E=await e.fetch(Pye(e.url,s),{method:"GET",headers:{accept:"text/event-stream",authorization:`Bearer ${e.token}`},signal:K.signal});await $ye(E),c=0,A=!0,L(),await Iye(E,y),Y=!0}catch(E){if(PZ(E)||e.signal?.aborted)break;let we=SZ(E);if(!A||Oye(we))throw we;Y=!0}finally{if(e.signal?.removeEventListener("abort",x),h===K)h=void 0}if(r||o||e.signal?.aborted)break;if(!Y)continue;c+=1,await CZ(Math.min($Z*2**(c-1),tye),e.signal)}};if(e.signal?.addEventListener("abort",()=>{o=!0,d(),l()},{once:!0}),e.signal?.aborted)o=!0,d(),l();await new Promise((L,A)=>{let K=!1;p(()=>{if(!K)K=!0,L()}).catch((Y)=>{let E=SZ(Y);if(!K){K=!0,A(E);return}if(!PZ(Y))l(E)})});let k={[Symbol.asyncIterator](){return k},next:async()=>{if(t.length>0)return{value:t.shift(),done:!1};if(r){if(i)throw i;return{value:void 0,done:!0}}return new Promise((L)=>{n.push(L)}).then((L)=>{if(L.done&&i)throw i;return L})},return:async()=>{return o=!0,d(),l(),{value:void 0,done:!0}},throw:async(L)=>{throw o=!0,d(),l(L instanceof Error?L:Error(String(L))),L}};return k},Pye=(e,t)=>{if(!t)return e;let n=new URL(e);return n.searchParams.set("cursor",t),n.toString()},$ye=async(e)=>{if(e.ok&&e.body)return;let t=await e.text();if(e.status===401)throw Error("Authentication failed. Check your credential.");if(e.status===403){if(/not served by this region/i.test(t))throw Error(`Wrong region (403): ${t||"Project is not served by this region"}`);throw Error(`Forbidden (403): ${t||"Credential may not have access to this project"}`)}if(e.status>=400&&e.status<500&&e.status!==429)throw Error(`Client error (${e.status}): ${t}`);if(!e.body)throw Error("Tail stream response did not include a body.");throw Error(e.status===429?`Rate limited (429): ${t}`:`Server error (${e.status}): ${t}`)},Iye=async(e,t)=>{let n=e.body?.getReader();if(!n)throw Error("Tail stream response did not include a body.");let r=new TextDecoder,o="",i=Lye(t);try{while(!0){let c=await n.read();if(c.done)break;o+=r.decode(c.value,{stream:!0});let s=o.split(/\r\n|\r|\n/);o=s.pop()??"";for(let h of s)i.line(h)}if(o+=r.decode(),o){let c=o.split(/\r\n|\r|\n/);for(let s of c)i.line(s)}i.flush()}finally{n.releaseLock()}},Lye=(e)=>{let t="message",n,r=[],o=()=>{t="message",n=void 0,r=[]},i=()=>{if(r.length===0&&!n){o();return}e({event:t,data:r.join(`
|
|
8617
|
-
`),...n?{id:n}:{}}),o()};return{line:(c)=>{if(c===""){i();return}if(c.startsWith(":"))return;let s=c.indexOf(":"),h=s===-1?c:c.slice(0,s),l=s===-1?"":c.slice(s+1),u=l.startsWith(" ")?l.slice(1):l;if(h==="event"){t=u||"message";return}if(h==="data"){r.push(u);return}if(h==="id"&&!u.includes("\x00"))n=u},flush:i}},Tye=(e)=>{try{let t=kZ.safeParse(JSON.parse(e));if(!t.success)return[];return t.data.data}catch{return[]}},SZ=(e)=>{return e instanceof Error?e:Error(String(e))},PZ=(e)=>{return e instanceof Error&&e.name==="AbortError"},Oye=(e)=>{return e.message.startsWith("Authentication failed")||e.message.startsWith("Forbidden (")||e.message.startsWith("Wrong region (")||e.message.startsWith("Client error (")},Aye=async(e,t,n,r={},o=3,i=1e4)=>{let c;for(let s=0;s<=o;s+=1){let h=new AbortController,l=globalThis.setTimeout(()=>h.abort(),i);try{let u=await e(t,{method:"POST",headers:{"content-type":"application/json",...r},body:JSON.stringify(n),signal:h.signal});if(u.ok)return;let d=await u.text();if(u.status===401||u.status===403)throw Error("Authentication failed. Check your public key.");if(u.status>=400&&u.status<500&&u.status!==429)throw Error(`Client error (${u.status}): ${d}`);c=Error(u.status===429?`Rate limited (429): ${d}`:`Server error (${u.status}): ${d}`)}catch(u){let d=u instanceof Error?u.message:String(u);if(d.startsWith("Authentication failed")||d.startsWith("Client error ("))throw u instanceof Error?u:Error(d);c=u instanceof Error&&u.name==="AbortError"?Error("Request timed out"):u instanceof Error?u:Error(String(u))}finally{globalThis.clearTimeout(l)}if(s<o)await CZ($Z*2**s)}throw Error(`Failed after ${o+1} attempts: ${c?.message??"Unknown error"}`)},Cye=(e)=>{return e.resourceLogs?.reduce((t,n)=>t+(n.scopeLogs?.reduce((r,o)=>r+(o.logRecords?.length??0),0)??0),0)??0},CZ=async(e,t)=>{if(t?.aborted)return;await new Promise((n)=>{let r=globalThis.setTimeout(n,e);t?.addEventListener("abort",()=>{globalThis.clearTimeout(r),n()},{once:!0})})},DZ=(e,t,n)=>{return new Qe("BAD_REQUEST",{message:t,data:{operationId:e,missingContext:n}})};var uL=g(()=>{lr();vZ();be();iye=a.object({projectId:a.string().uuid().optional().describe("Project to tail logs for. Auto-filled from CLI and SDK context when omitted."),filters:sL.optional().describe("Optional filters applied by the tail SSE service.")}),aye=a.object({publicKey:a.string().min(1).describe("Public key for intake auth. Create or list one via the public key endpoints."),logs:a.custom((e)=>typeof e==="object"&&e!==null).describe("OTLP logs export request payload to send to the intake service.")}),cye=a.object({forwardedCount:a.number().int().nonnegative().describe("Number of log records accepted by the intake request."),failedCount:a.number().int().nonnegative().describe("Number of log records rejected by the intake request.")}),hye=new Set(["15006","3010"])});var gL="https://api.sazabi.com",_Z="https://api.platform.sazabi.com",jZ="sazabi-cli",Dye="urn:ietf:params:oauth:grant-type:device_code",NZ=(e)=>{let t=hy(new Sy(cL,{url:zye(e.apiBaseUrl??gL),headers:async()=>{let o=new Headers({authorization:`Bearer ${await e.credentialProvider.getToken()}`});if(e.clientSource)o.set("x-sazabi-client-source",e.clientSource);return o},fetch:e.fetch,customErrorResponseBodyDecoder:(o,i)=>{let c=Mye(o);if(!c)return null;return new Qe(c.code,{message:c.message,status:i.status,data:{operationId:c.operationId,missingContext:c.missingContext}})}})),n=TZ({raw:t,credentialProvider:e.credentialProvider,fetch:e.fetch,apiBaseUrl:e.apiBaseUrl??gL,intakeBaseUrl:e.intakeBaseUrl,tailBaseUrl:e.tailBaseUrl}),r=wZ({credentialProvider:e.credentialProvider,fetch:e.fetch,apiBaseUrl:e.apiBaseUrl??gL,clientSource:e.clientSource});return{raw:t,me:async()=>t.me({}),automations:{list:async(o={})=>t.automations.list(await te(e.credentialProvider,o,"automations.list")),get:async(o)=>t.automations.get(await te(e.credentialProvider,o,"automations.get")),create:async(o)=>t.automations.create(await te(e.credentialProvider,o,"automations.create")),update:async(o)=>t.automations.update(await te(e.credentialProvider,o,"automations.update")),enable:async(o)=>t.automations.enable(await te(e.credentialProvider,o,"automations.enable")),disable:async(o)=>t.automations.disable(await te(e.credentialProvider,o,"automations.disable")),runs:{list:async(o)=>t.automations.runs.list(await te(e.credentialProvider,o,"automations.runs.list")),get:async(o)=>t.automations.runs.get(await te(e.credentialProvider,o,"automations.runs.get")),logs:async(o)=>t.automations.runs.logs(await te(e.credentialProvider,o,"automations.runs.logs"))}},logs:{...n,query:async(o={})=>t.logs.query(await te(e.credentialProvider,o,Qr.operationId)),schema:async(o={})=>t.logs.schema(await te(e.credentialProvider,o,Vr.operationId)),volume:async(o)=>t.logs.volume(await te(e.credentialProvider,o,ei.operationId)),patterns:async(o={})=>t.logs.patterns(await te(e.credentialProvider,o,ti.operationId)),nativeQuery:async(o)=>t.logs.nativeQuery(await te(e.credentialProvider,o,ni.operationId))},organizations:{list:async()=>t.organizations.list({}),get:async(o)=>t.organizations.get(o),update:async(o)=>t.organizations.update(await jye(e.credentialProvider,o))},members:{list:async(o={})=>t.members.list(await Fe(e.credentialProvider,o)),updateRole:async(o)=>t.members.updateRole(await Fe(e.credentialProvider,o)),remove:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.members.remove({params:{userId:i.userId},query:{organizationId:i.organizationId}})}},teams:{list:async(o={})=>t.teams.list(await Fe(e.credentialProvider,o)),create:async(o)=>t.teams.create(await Fe(e.credentialProvider,o)),update:async(o)=>t.teams.update(await Fe(e.credentialProvider,o)),delete:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.teams.delete({params:{teamId:i.teamId},query:{organizationId:i.organizationId}})},addMember:async(o)=>t.teams.addMember(await Fe(e.credentialProvider,o)),removeMember:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.teams.removeMember({params:{teamId:i.teamId,userId:i.userId},query:{organizationId:i.organizationId}})},listMembers:async(o)=>t.teams.listMembers(await Fe(e.credentialProvider,o))},publicKeys:{list:async(o={})=>t.publicKeys.list(await te(e.credentialProvider,o,Gr.operationId)),get:async(o)=>t.publicKeys.get(await te(e.credentialProvider,o,Jr.operationId)),ensureLogForwarding:async(o={})=>t.publicKeys.ensureLogForwarding(await te(e.credentialProvider,o,Hr.operationId)),update:async(o)=>t.publicKeys.update(await te(e.credentialProvider,o,Br.operationId)),deactivate:async(o)=>{let i=await te(e.credentialProvider,o,Wr.operationId);return t.publicKeys.deactivate({params:{keyId:i.keyId},query:{projectId:i.projectId}})}},secretKeys:{list:async(o={})=>t.secretKeys.list(o),get:async(o)=>t.secretKeys.get(o),create:async(o)=>t.secretKeys.create(o),update:async(o)=>t.secretKeys.update(o),delete:async(o)=>{await t.secretKeys.delete({params:{keyId:o.keyId}})}},search:{threads:async(o)=>t.search.threads(await te(e.credentialProvider,o,_i.operationId)),messages:async(o)=>t.search.messages(await te(e.credentialProvider,o,ji.operationId))},projects:{list:async(o={})=>t.projects.list(await _ye(e.credentialProvider,o)),get:async(o)=>t.projects.get(o),create:async(o)=>t.projects.create(await Fe(e.credentialProvider,o))},messages:{list:async(o)=>t.messages.list(o),append:async(o)=>zZ(t,await t.messages.append(Uye(o)))},threads:{list:async(o={})=>t.threads.list(await Nye(e.credentialProvider,o)),get:async(o)=>t.threads.get(o),getStatus:async(o)=>t.threads.getStatus(o),stop:async(o)=>t.threads.stop(o),create:async(o)=>zZ(t,await t.threads.create(await Rye(e.credentialProvider,o))),update:async(o)=>t.threads.update(o),fork:async(o)=>t.threads.fork(o),setVisibility:async(o)=>t.threads.setVisibility(o),createShareLink:async(o)=>t.threads.createShareLink(o),listShareLinks:async(o)=>t.threads.listShareLinks(o),revokeShareLink:async(o)=>t.threads.revokeShareLink(o),stream:async(o)=>r.streamThread(o)},runs:{list:async(o={})=>t.runs.list(await xye(e.credentialProvider,o)),listForThread:async(o)=>t.runs.listForThread(o),get:async(o)=>t.runs.get(o),cancel:async(o)=>t.runs.cancel(o),stream:async(o)=>r.streamRun(o)},dataSources:{listTypes:async()=>t.dataSources.listTypes({}),instances:{list:async(o={})=>t.dataSources.listInstances(await te(e.credentialProvider,o,Zr.operationId)),get:async(o)=>t.dataSources.getInstance(o),create:async(o)=>t.dataSources.createInstance(await te(e.credentialProvider,o,Fr.operationId)),update:async(o)=>t.dataSources.updateInstance(o),delete:async(o)=>t.dataSources.deleteInstance(o)},streams:{list:async(o)=>t.dataSources.listStreams(o),get:async(o)=>t.dataSources.getStream(o),create:async(o)=>t.dataSources.createStream(o),update:async(o)=>t.dataSources.updateStream(o),delete:async(o)=>t.dataSources.deleteStream(o)}},logSources:{listProviders:async()=>t.logSources.listProviders({}),list:async(o={})=>t.logSources.list(await te(e.credentialProvider,o,Xr.operationId)),get:async(o)=>t.logSources.get(o),create:async(o)=>t.logSources.create(await te(e.credentialProvider,o,Yr.operationId)),update:async(o)=>t.logSources.update(o),delete:async(o)=>t.logSources.delete(o),streams:{list:async(o)=>t.logSources.listStreams(o),get:async(o)=>t.logSources.getStream(o),create:async(o)=>t.logSources.createStream(o),update:async(o)=>t.logSources.updateStream(o),delete:async(o)=>t.logSources.deleteStream(o)}},integrations:{listProviders:async(o={})=>t.integrations.listProviders(await Fe(e.credentialProvider,o)),listConnections:async(o={})=>t.integrations.listConnections(await Fe(e.credentialProvider,o)),getConnection:async(o)=>t.integrations.getConnection(await Fe(e.credentialProvider,o))},mcpConnectors:{list:async(o={})=>t.mcpConnectors.list(await te(e.credentialProvider,o,vi.operationId)),get:async(o)=>t.mcpConnectors.get(await te(e.credentialProvider,o,Si.operationId)),details:async(o)=>t.mcpConnectors.details(await te(e.credentialProvider,o,Pi.operationId)),listProviders:async()=>t.mcpConnectors.listProviders({})},sandboxPresets:{listConnections:async(o={})=>t.sandboxPresets.listConnections(await te(e.credentialProvider,o,zi.operationId)),listTypes:async()=>t.sandboxPresets.listTypes({})},memory:{list:async(o={})=>t.memory.list(await te(e.credentialProvider,o,Ti.operationId)),get:async(o)=>t.memory.get(await te(e.credentialProvider,o,Li.operationId)),put:async(o)=>t.memory.put(await te(e.credentialProvider,o,Ii.operationId)),search:async(o)=>t.memory.search(await te(e.credentialProvider,o,Oi.operationId)),delete:async(o)=>t.memory.delete(await te(e.credentialProvider,o,Ai.operationId))},logMatchExpressions:{list:async(o={})=>t.logMatchExpressions.list(await te(e.credentialProvider,o,"logMatchExpressions.list")),get:async(o)=>t.logMatchExpressions.get(await te(e.credentialProvider,o,"logMatchExpressions.get")),create:async(o)=>t.logMatchExpressions.create(await te(e.credentialProvider,o,"logMatchExpressions.create")),update:async(o)=>t.logMatchExpressions.update(await te(e.credentialProvider,o,"logMatchExpressions.update")),disable:async(o)=>t.logMatchExpressions.disable(await te(e.credentialProvider,o,"logMatchExpressions.disable"))},scripts:{list:async(o={})=>t.scripts.list(await te(e.credentialProvider,o,"scripts.list")),get:async(o)=>t.scripts.get(await te(e.credentialProvider,o,"scripts.get")),create:async(o)=>t.scripts.create(await te(e.credentialProvider,o,"scripts.create")),update:async(o)=>t.scripts.update(await te(e.credentialProvider,o,"scripts.update")),delete:async(o)=>t.scripts.delete(await te(e.credentialProvider,o,"scripts.delete"))},issues:{count:async(o={})=>t.issues.count(await te(e.credentialProvider,o,"issues.count")),create:async(o)=>t.issues.create(await te(e.credentialProvider,o,qr.operationId)),list:async(o={})=>t.issues.list(await te(e.credentialProvider,o,"issues.list")),search:async(o={})=>t.issues.search(await te(e.credentialProvider,o,"issues.search")),get:async(o)=>t.issues.get(o),resolve:async(o)=>t.issues.resolve(o),ignore:async(o)=>t.issues.ignore(o),reopen:async(o)=>t.issues.reopen(o),mute:async(o)=>t.issues.mute(o),unmute:async(o)=>t.issues.unmute(o)},pullRequests:{list:async(o={})=>t.pullRequests.list(await te(e.credentialProvider,o,"pullRequests.list"))},statusComponents:{list:async(o={})=>t.statusComponents.list(await te(e.credentialProvider,o,"statusComponents.list")),get:async(o)=>t.statusComponents.get(o),register:async(o)=>t.statusComponents.register(await te(e.credentialProvider,o,Ni.operationId)),deregister:async(o)=>t.statusComponents.deregister({componentId:o.componentId,...o.reason!==void 0?{reason:o.reason}:{}}),rename:async(o)=>t.statusComponents.rename(o),assignTeam:async(o)=>t.statusComponents.assignTeam(o),retirementPreview:async(o)=>t.statusComponents.retirementPreview(o),retire:async(o)=>t.statusComponents.retire(o),restorationPreview:async(o)=>t.statusComponents.restorationPreview(o),restore:async(o)=>t.statusComponents.restore(o),mergePreview:async(o)=>t.statusComponents.mergePreview(await te(e.credentialProvider,o,"statusComponents.mergePreview")),merge:async(o)=>t.statusComponents.merge(await te(e.credentialProvider,o,"statusComponents.merge")),relationships:{list:async(o={})=>t.statusComponents.relationships.list(await te(e.credentialProvider,o,"statusComponents.relationships.list")),preview:async(o)=>t.statusComponents.relationships.preview(await te(e.credentialProvider,o,"statusComponents.relationships.preview")),add:async(o)=>t.statusComponents.relationships.add(await te(e.credentialProvider,o,"statusComponents.relationships.add")),remove:async(o)=>t.statusComponents.relationships.remove(await te(e.credentialProvider,o,"statusComponents.relationships.remove"))},incidents:{list:async(o={})=>t.statusComponents.incidents.list(await te(e.credentialProvider,o,"statusComponents.incidents.list"))},timeline:async(o)=>t.statusComponents.timeline(o)},billing:{getSummary:async(o={})=>t.billing.getSummary(await Fe(e.credentialProvider,o)),getUsage:async(o={})=>t.billing.getUsage(await Fe(e.credentialProvider,o)),listTransactions:async(o={})=>t.billing.listTransactions(await Fe(e.credentialProvider,o))},tasks:{list:async(o={})=>t.tasks.list(await te(e.credentialProvider,o,os.operationId))},recommendations:{list:async(o={})=>t.recommendations.list(await te(e.credentialProvider,o,Qc.operationId))}}},yL=async(e={})=>{let t=await UZ(e.fetch)(xZ(e.apiBaseUrl??_Z,"/device/code"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:e.clientId??jZ,...e.scope?{scope:e.scope}:{}})}),n=await t.json();if(!t.ok)throw Kye(n,t.status);let r=n;return{deviceCode:Ui(r.device_code,"device_code"),userCode:Ui(r.user_code,"user_code"),verificationUri:Ui(r.verification_uri,"verification_uri"),verificationUriComplete:Ui(r.verification_uri_complete,"verification_uri_complete"),expiresIn:dL(r.expires_in,"expires_in"),interval:dL(r.interval,"interval")}},bL=async(e)=>{let t=await UZ(e.fetch)(xZ(e.apiBaseUrl??_Z,"/device/token"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({grant_type:Dye,device_code:e.deviceCode,client_id:e.clientId??jZ})}),n=await t.json();if(t.ok){let o=n;return{status:"authorized",accessToken:Ui(o.access_token,"access_token"),tokenType:Ui(o.token_type,"token_type"),expiresIn:dL(o.expires_in,"expires_in"),scope:typeof o.scope==="string"?o.scope:""}}let r=RZ(n);if(!r)throw Error(`Device authorization failed with status ${t.status}`);if(r.error==="authorization_pending")return{status:"pending"};if(r.error==="slow_down")return{status:"pending",interval:10};if(r.error==="access_denied")return{status:"denied",message:r.errorDescription};if(r.error==="expired_token"||r.error==="invalid_grant")return{status:"expired",message:r.errorDescription};throw Error(r.errorDescription)},zye=(e)=>{let t=e.replace(/\/+$/,"");return t.endsWith("/v1")?t:`${t}/v1`},xZ=(e,t)=>{return`${e.replace(/\/+$/,"")}/api/auth${t}`},_ye=async(e,t)=>{return Fe(e,t)},Fe=async(e,t)=>{let n=t.organizationId??await e.getOrganizationId?.();return n?{...t,organizationId:n}:t},jye=async(e,t)=>{let n=t.organizationId??await e.getOrganizationId?.();if(!n)throw new Qe("BAD_REQUEST",{message:"Organization ID is required",data:{operationId:"organizations.update",missingContext:["organizationId"]},status:400});return{...t,organizationId:n}},te=async(e,t,n)=>{let r=t.projectId??await e.getProjectId?.();if(!r)throw new Qe("BAD_REQUEST",{message:"Project ID is required",data:{operationId:n,missingContext:["projectId"]},status:400});return{...t,projectId:r}},Nye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},xye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},Rye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},Uye=(e)=>{return{threadId:e.threadId,message:e.message,wait:e.wait??!0,timeoutSeconds:e.timeoutSeconds??20,...e.automationId!==void 0?{automationId:e.automationId}:{}}},Mye=(e)=>{if(!e||typeof e!=="object")return null;let t=e;if(typeof t.code!=="string"||typeof t.message!=="string"||typeof t.operationId!=="string")return null;return{code:t.code,message:t.message,operationId:t.operationId,missingContext:Array.isArray(t.missingContext)?t.missingContext.filter((n)=>typeof n==="string"):[]}},RZ=(e)=>{if(!e||typeof e!=="object")return null;let t=e;if(typeof t.error!=="string"||typeof t.error_description!=="string")return null;return{error:t.error,errorDescription:t.error_description}},Kye=(e,t)=>{let n=RZ(e);return Error(n?.errorDescription??`Device authorization failed with status ${t}`)},UZ=(e)=>{return e??globalThis.fetch},zZ=(e,t)=>({result:t,poll:()=>e.runs.get({runId:t.runId}),waitForCompletion:async(n={})=>Eye(e,t,n)}),Eye=async(e,t,n)=>{if(t.completed)return t;let r=n.intervalMs??2000,o=Date.now(),i=t;while(!i.completed){if(n.timeoutMs!==void 0&&Date.now()-o>=n.timeoutMs)return i;await qye(r),i=await e.runs.get({runId:i.runId})}return i},qye=async(e)=>{await new Promise((t)=>globalThis.setTimeout(t,e))},Ui=(e,t)=>{if(typeof e==="string")return e;throw Error(`Expected '${t}' to be a string.`)},dL=(e,t)=>{if(typeof e==="number")return e;throw Error(`Expected '${t}' to be a number.`)};var mL=g(()=>{lr();ZT();Ri();fZ();uL();uL()});var We=(e)=>({success:!0,value:e}),Me=(e,t,n)=>({success:!1,error:e,...t!==void 0&&{statusCode:t},...n!==void 0&&{errorPayload:n}}),w=(e,t,n)=>{if(!e.success){let r=`${t}: ${e.error}`;if(n)return b(e.errorPayload??r);return m(r)}return e.value};var ie=g(()=>{ee()});var Gye="https://api.sazabi.com",O=async(e)=>{try{return We(await e())}catch(t){let n=Jye(t),r=Hye(t),o=t instanceof Error?t.message:String(t);return Me(o,r,n)}},Jye=(e)=>{if(!e||typeof e!=="object")return;let t=e;if(typeof t.code!=="string"||typeof t.message!=="string"||!t.data||typeof t.data!=="object")return;let n=t.data;if(typeof n.operationId!=="string")return;return{code:t.code,message:t.message,operationId:n.operationId,missingContext:Array.isArray(n.missingContext)?n.missingContext.filter((r)=>typeof r==="string"):[]}},Hye=(e)=>{if(!e||typeof e!=="object")return;let t=e;return typeof t.status==="number"?t.status:void 0},Gn=(e)=>{let t=NZ({apiBaseUrl:e.baseUrl??Gye,clientSource:"cli",credentialProvider:{getToken:()=>e.token,getOrganizationId:()=>e.organizationId,getProjectId:()=>e.projectId},intakeBaseUrl:e.intakeBaseUrl,tailBaseUrl:e.tailBaseUrl});return{me:()=>O(()=>t.me()),automations:{list:(n={})=>O(()=>t.automations.list(n)),get:(n)=>O(()=>t.automations.get({automationId:n})),create:(n)=>O(()=>t.automations.create(n)),update:(n)=>O(()=>t.automations.update(n)),enable:(n)=>O(()=>t.automations.enable({automationId:n})),disable:(n)=>O(()=>t.automations.disable({automationId:n})),runs:{list:(n,r={})=>O(()=>t.automations.runs.list({automationId:n,...r})),get:(n,r)=>O(()=>t.automations.runs.get({automationId:n,runId:r})),logs:(n,r)=>O(()=>t.automations.runs.logs({automationId:n,runId:r}))}},logs:{tail:(n)=>O(()=>t.logs.tail(n)),forward:(n)=>O(()=>t.logs.forward(n)),query:(n={})=>O(()=>t.logs.query(n)),schema:(n={})=>O(()=>t.logs.schema(n)),volume:(n)=>O(()=>t.logs.volume(n)),patterns:(n={})=>O(()=>t.logs.patterns(n)),nativeQuery:(n)=>O(()=>t.logs.nativeQuery(n))},organizations:{list:()=>O(()=>t.organizations.list()),get:(n)=>O(()=>t.organizations.get({organizationId:n})),rename:(n,r)=>O(()=>t.organizations.update({organizationId:r,name:n}))},members:{list:(n={})=>O(()=>t.members.list(n)),updateRole:(n,r,o)=>O(()=>t.members.updateRole({organizationId:o,userId:n,role:r})),remove:(n,r)=>O(()=>t.members.remove({organizationId:r,userId:n}))},teams:{list:(n={})=>O(()=>t.teams.list(n)),create:(n,r,o)=>O(()=>t.teams.create({organizationId:o,name:n,...r!==void 0?{description:r}:{}})),update:(n,r,o)=>O(()=>t.teams.update({organizationId:o,teamId:n,...r.name!==void 0?{name:r.name}:{},...r.description!==void 0?{description:r.description}:{}})),delete:(n,r)=>O(()=>t.teams.delete({organizationId:r,teamId:n})),addMember:(n,r,o)=>O(()=>t.teams.addMember({organizationId:o,teamId:n,userId:r})),removeMember:(n,r,o)=>O(()=>t.teams.removeMember({organizationId:o,teamId:n,userId:r})),listMembers:(n,r)=>O(()=>t.teams.listMembers({organizationId:r,teamId:n}))},projects:{list:(n={})=>O(()=>t.projects.list(n)),get:(n)=>O(()=>t.projects.get({projectId:n})),create:(n)=>O(()=>t.projects.create(n))},threads:{list:(n={})=>O(()=>t.threads.list(n)),get:(n)=>O(()=>t.threads.get({threadId:n})),create:(n)=>O(()=>t.threads.create(n)),getStatus:(n)=>O(()=>t.threads.getStatus({threadId:n})),update:(n,r)=>O(()=>t.threads.update({threadId:n,status:r})),fork:(n,r)=>O(()=>t.threads.fork({threadId:n,messageId:r})),setVisibility:(n,r)=>O(()=>t.threads.setVisibility({threadId:n,visibility:r})),createShareLink:(n)=>O(()=>t.threads.createShareLink({threadId:n})),listShareLinks:(n)=>O(()=>t.threads.listShareLinks({threadId:n})),revokeShareLink:(n,r)=>O(()=>t.threads.revokeShareLink({threadId:n,shareId:r})),stop:(n)=>O(()=>t.threads.stop({threadId:n})),stream:(n)=>O(()=>t.threads.stream(n))},messages:{list:(n,r={})=>O(()=>t.messages.list({threadId:n,...r})),append:(n,r,o,i,c,s)=>O(()=>t.messages.append({threadId:n,message:r,wait:o,timeoutSeconds:i,...c!==void 0?{automationId:c}:{},...s?{ambientServiceRun:s}:{}}))},runs:{get:(n)=>O(()=>t.runs.get({runId:n})),cancel:(n)=>O(()=>t.runs.cancel({runId:n})),stream:(n)=>O(()=>t.runs.stream(n))},search:{threads:(n)=>O(()=>t.search.threads(n)),messages:(n)=>O(()=>t.search.messages(n))},publicKeys:{list:(n)=>O(()=>t.publicKeys.list(n)),get:(n,r)=>O(()=>t.publicKeys.get(r?{keyId:n,projectId:r}:{keyId:n})),ensureLogForwarding:(n)=>O(()=>t.publicKeys.ensureLogForwarding(n)),update:(n)=>O(()=>t.publicKeys.update(n)),deactivate:(n)=>O(()=>t.publicKeys.deactivate(n))},secretKeys:{list:(n)=>O(()=>t.secretKeys.list(n)),get:(n)=>O(()=>t.secretKeys.get({keyId:n})),create:(n)=>O(()=>t.secretKeys.create(n)),update:(n)=>O(()=>t.secretKeys.update(n)),delete:(n)=>O(()=>t.secretKeys.delete(n))},issues:{count:(n={})=>O(()=>t.issues.count(n)),create:(n)=>O(()=>t.issues.create(n)),list:(n={})=>O(()=>t.issues.list(n)),search:(n={})=>O(()=>t.issues.search(n)),get:(n)=>O(()=>t.issues.get({issueId:n})),resolve:(n)=>O(()=>t.issues.resolve({issueId:n})),ignore:(n)=>O(()=>t.issues.ignore({issueId:n})),reopen:(n)=>O(()=>t.issues.reopen({issueId:n})),mute:(n)=>O(()=>t.issues.mute({issueId:n})),unmute:(n)=>O(()=>t.issues.unmute({issueId:n}))},pullRequests:{list:(n={})=>O(()=>t.pullRequests.list(n))},statusComponents:{list:(n={})=>O(()=>t.statusComponents.list(n)),get:(n)=>O(()=>t.statusComponents.get({componentId:n})),register:(n)=>O(()=>t.statusComponents.register(n)),deregister:(n,r)=>O(()=>t.statusComponents.deregister({componentId:n,...r!==void 0?{reason:r}:{}})),rename:(n)=>O(()=>t.statusComponents.rename(n)),retirementPreview:(n)=>O(()=>t.statusComponents.retirementPreview(n)),retire:(n)=>O(()=>t.statusComponents.retire(n)),restorationPreview:(n)=>O(()=>t.statusComponents.restorationPreview(n)),restore:(n)=>O(()=>t.statusComponents.restore(n)),mergePreview:(n)=>O(()=>t.statusComponents.mergePreview(n)),merge:(n)=>O(()=>t.statusComponents.merge(n)),relationships:{list:(n={})=>O(()=>t.statusComponents.relationships.list(n)),preview:(n)=>O(()=>t.statusComponents.relationships.preview(n)),add:(n)=>O(()=>t.statusComponents.relationships.add(n)),remove:(n)=>O(()=>t.statusComponents.relationships.remove(n))},incidents:{list:(n={})=>O(()=>t.statusComponents.incidents.list(n))},timeline:(n)=>O(()=>t.statusComponents.timeline(n))},billing:{getSummary:(n={})=>O(()=>t.billing.getSummary(n)),getUsage:(n={})=>O(()=>t.billing.getUsage(n)),listTransactions:(n={})=>O(()=>t.billing.listTransactions(n))},tasks:{list:(n={})=>O(()=>t.tasks.list(n))},recommendations:{list:(n={})=>O(()=>t.recommendations.list(n))},dataSources:{listTypes:()=>O(()=>t.dataSources.listTypes()),instances:{list:(n)=>O(()=>t.dataSources.instances.list(n)),get:(n)=>O(()=>t.dataSources.instances.get({instanceId:n})),create:(n)=>O(()=>t.dataSources.instances.create(n)),update:(n)=>O(()=>t.dataSources.instances.update(n)),delete:(n)=>O(()=>t.dataSources.instances.delete({instanceId:n}))},streams:{list:(n)=>O(()=>t.dataSources.streams.list({instanceId:n})),get:(n)=>O(()=>t.dataSources.streams.get({streamId:n})),create:(n)=>O(()=>t.dataSources.streams.create(n)),update:(n)=>O(()=>t.dataSources.streams.update(n)),delete:(n)=>O(()=>t.dataSources.streams.delete({streamId:n}))}},logSources:{listProviders:()=>O(()=>t.logSources.listProviders()),list:(n)=>O(()=>t.logSources.list(n)),get:(n)=>O(()=>t.logSources.get({logSourceId:n})),create:(n)=>O(()=>t.logSources.create(n)),update:(n)=>O(()=>t.logSources.update(n)),delete:(n)=>O(()=>t.logSources.delete({logSourceId:n})),streams:{list:(n)=>O(()=>t.logSources.streams.list({logSourceId:n})),get:(n)=>O(()=>t.logSources.streams.get({streamId:n})),create:(n)=>O(()=>t.logSources.streams.create(n)),update:(n)=>O(()=>t.logSources.streams.update(n)),delete:(n)=>O(()=>t.logSources.streams.delete({streamId:n}))}},integrations:{listProviders:()=>O(()=>t.integrations.listProviders()),listConnections:(n)=>O(()=>t.integrations.listConnections(n)),getConnection:(n)=>O(()=>t.integrations.getConnection({connectionId:n}))},mcpConnectors:{list:(n)=>O(()=>t.mcpConnectors.list(n)),get:(n)=>O(()=>t.mcpConnectors.get(n)),details:(n)=>O(()=>t.mcpConnectors.details(n)),listProviders:()=>O(()=>t.mcpConnectors.listProviders())},sandboxPresets:{listTypes:()=>O(()=>t.sandboxPresets.listTypes())},memory:{list:(n={})=>O(()=>t.memory.list(n)),get:(n)=>O(()=>t.memory.get(n)),search:(n)=>O(()=>t.memory.search(n)),put:(n)=>O(()=>t.memory.put({kind:"note",...n})),delete:(n)=>O(()=>t.memory.delete(n))},logMatchExpressions:{list:(n={})=>O(()=>t.logMatchExpressions.list(n)),get:(n)=>O(()=>t.logMatchExpressions.get({expressionId:n})),create:(n)=>O(()=>t.logMatchExpressions.create(n)),update:(n,r={})=>O(()=>t.logMatchExpressions.update({expressionId:n,...r})),disable:(n)=>O(()=>t.logMatchExpressions.disable({expressionId:n}))},scripts:{list:(n={})=>O(()=>t.scripts.list(n)),get:(n)=>O(()=>t.scripts.get({name:n})),create:(n)=>O(()=>t.scripts.create(n)),update:(n,r={})=>O(()=>t.scripts.update({name:n,...r})),delete:(n)=>O(()=>t.scripts.delete({name:n}))}}};var rs=g(()=>{mL();ie()});var MZ;var KZ=g(()=>{MZ={version:2,activeProfile:"default",profiles:{default:{}}}});import*as Jn from"node:fs";import*as EZ from"node:os";import*as fL from"node:path";var yt=(e)=>{if(e===void 0||e===null)return;if(typeof e==="string")return e.length>0?e:void 0;return},pL,Mi,Bye=()=>{if(!Jn.existsSync(pL))Jn.mkdirSync(pL,{recursive:!0,mode:448})},wL,qZ=(e)=>{wL=e},GZ=(e)=>({token:yt(e.token),activeOrganizationId:yt(e.activeOrganizationId??e.organizationId),organizationName:yt(e.organizationName),activeProjectId:yt(e.activeProjectId??e.defaultProjectId),apiBaseUrl:yt(e.apiBaseUrl),authBaseUrl:yt(e.authBaseUrl),webBaseUrl:yt(e.webBaseUrl),intakeBaseUrl:yt(e.intakeBaseUrl),tailBaseUrl:yt(e.tailBaseUrl),apiDomain:yt(e.apiDomain),webDomain:yt(e.webDomain),intakeDomain:yt(e.intakeDomain),tailDomain:yt(e.tailDomain),forwardPublicKey:yt(e.forwardPublicKey),forwardPublicKeyProjectId:yt(e.forwardPublicKeyProjectId)}),Wye=(e)=>({version:2,activeProfile:"default",profiles:{default:GZ(e)}}),Zye=(e)=>{let t=yt(e.activeProfile)??"default",n=typeof e.profiles==="object"&&e.profiles!==null?e.profiles:{},r={};for(let[o,i]of Object.entries(n)){if(typeof i!=="object"||i===null)continue;r[o]=GZ(i)}if(!r[t])r[t]={};return{version:2,activeProfile:t,profiles:r}},Re=()=>{try{if(!Jn.existsSync(Mi))return We(MZ);let e=Jn.readFileSync(Mi,"utf-8"),t=JSON.parse(e),n=typeof t.version==="number"?t.version:void 0;if(n!==void 0&&n>2)return Me("Settings file requires a newer CLI version. Upgrade with 'npm install -g @sazabi/cli@latest'.");if(n===2)return We(Zye(t));let r=Wye(t),o=Xe(r);if(!o.success)return o;return We(r)}catch(e){let t=e instanceof Error?e.message:String(e);return Me(t)}},Xe=(e)=>{try{return Bye(),Jn.writeFileSync(Mi,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),We(void 0)}catch(t){let n=t instanceof Error?t.message:String(t);return Me(n)}},Ln=(e,t)=>{if(t)return t;if(wL)return wL;let n=process.env.SAZABI_PROFILE?.trim();if(n)return n;return e.activeProfile??"default"},Rt=(e,t)=>{let n=Ln(e,t),r=e.profiles[n];if(r)return We(r);if(n==="default")return We({});return Me(`Profile '${n}' does not exist. Run 'sazabi profiles create ${n}' first.`)},Hn=()=>{let e=Re();if(!e.success)return e;return Rt(e.value)},Ut=(e,t,n)=>{let r=Ln(e,n);if(!e.profiles[r])return Me(`Profile '${r}' does not exist. Run 'sazabi profiles create ${r}' first.`);return We({...e,profiles:{...e.profiles,[r]:{...e.profiles[r],...t}}})},Bn=(e)=>{if(!e?.forwardPublicKey&&!e?.forwardPublicKeyProjectId)return{};return{forwardPublicKey:void 0,forwardPublicKeyProjectId:void 0}};var Vt=g(()=>{KZ();ie();pL=fL.join(EZ.homedir(),".sazabi"),Mi=fL.join(pL,"settings.json")});var Tn=(e)=>{let{cliFlag:t,globalUrl:n,globalDomain:r,buildUrlFromDomain:o,defaultUrl:i}=e;if(t)return t;let c=process.env.SAZABI_API_URL?.trim();if(c)return c;if(n)return n;if(r)return o(r);return i},C=(e)=>{let{tokenFlag:t,organizationIdFlag:n,projectIdFlag:r,jsonMode:o}=e,i=t?.trim(),c=process.env.SAZABI_TOKEN?.trim(),s=process.env.SAZABI_ORGANIZATION_ID?.trim(),h=process.env.SAZABI_PROJECT_ID?.trim(),l=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",o),u=l.token?.trim(),d=(i&&i.length>0?i:void 0)||(c&&c.length>0?c:void 0)||u,y=i&&i.length>0?"flag":c&&c.length>0?"environment":"settings";if(!d||d.length===0){if(o)return b("Not authenticated. Set SAZABI_TOKEN, pass --token, run 'sazabi auth login', or run 'sazabi auth save <token>'.");return m("Not authenticated. Set SAZABI_TOKEN, pass --token, run 'sazabi auth login', or run 'sazabi auth save <token>'.")}let p,f;if(n)p=n,f="flag";else if(s&&s.length>0)p=s,f="environment";else if(l.activeOrganizationId)p=l.activeOrganizationId,f="settings";let k,L;if(r)k=r,L="flag";else if(h&&h.length>0)k=h,L="environment";else if(l.activeProjectId)k=l.activeProjectId,L="settings";return{token:d,type:"token",projectId:k,organizationId:p,tokenSource:y,organizationSource:f,projectSource:L}},vL=(e)=>{let t=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e?.jsonMode);return Tn({cliFlag:e?.apiBaseUrlFlag,globalUrl:t.apiBaseUrl,globalDomain:t.apiDomain,buildUrlFromDomain:(n)=>`https://api.${n}`,defaultUrl:"https://api.sazabi.com"})},z=(e)=>{let t=vL({apiBaseUrlFlag:e.apiBaseUrlFlag,jsonMode:e.jsonMode});return Gn({token:e.token,baseUrl:t,organizationId:e.organizationId,projectId:e.projectId})},JZ,kL,hd=async(e)=>{let t=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e.jsonMode),n=Tn({cliFlag:e.apiBaseUrlFlag,globalUrl:t.apiBaseUrl,globalDomain:t.apiDomain,buildUrlFromDomain:(h)=>`https://api.${h}`,defaultUrl:"https://api.sazabi.com"}),r=`${e.token}@${n}@${e.projectId??""}`,o=JZ.get(r);if(o)return o;let i=kL.get(r);if(i)return i;if(!e.projectId){if(e.jsonMode)return b("Project ID is required. Run 'sazabi projects use <project-id>' or set SAZABI_PROJECT_ID.");return m("Project ID is required. Run 'sazabi projects use <project-id>' or set SAZABI_PROJECT_ID.")}let c=e.projectId,s=(async()=>{let l=await Gn({token:e.token,baseUrl:n,projectId:c}).projects.get(c),d=w(l,"Couldn't fetch project info (run 'sazabi projects list' to verify the project ID)",e.jsonMode).project;return JZ.set(r,d),d})();kL.set(r,s);try{return await s}finally{kL.delete(r)}},sd=(e)=>{let t=e.trim().toLowerCase(),n=/^[a-z][a-z0-9+.-]*:\/\//.test(t)?t:`https://${t}`,r=t;try{r=new URL(n).hostname.toLowerCase()}catch{r=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,"").replace(/[/?#].*$/,"").replace(/:\d+$/,"")}return`https://app.${r.replace(/^(?:app\.)+/,"")}`},Ki=(e)=>{let t=(r)=>r.replace(/\/+$/,"");if(e)return t(e);let n=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)");if(n.webBaseUrl)return t(n.webBaseUrl);if(n.webDomain)return sd(n.webDomain);if(n.apiDomain)return sd(n.apiDomain);return"https://app.sazabi.com"},On=(e,t)=>{if(e&&e.length>0)return e;let n="No project selected. Pass --project-id, set SAZABI_PROJECT_ID, or run 'sazabi projects use <project-id>'.";if(t)return b(n);return m(n)},ko=(e,t)=>{return`${Ki(t)}/projects/${e}`},Ye=(e,t,n,r)=>{let o=`${Ki(n)}/projects/${e}/threads/${t}`;return r?`${o}?messageId=${encodeURIComponent(r)}`:o},HZ=(e,t,n,r)=>{return Ye(e,t,n,r)},BZ=(e,t,n)=>{return`${ko(e,n)}/issues/${t}`},WZ=(e,t,n)=>{return`${ko(e,n)}/automations/${t}`},ZZ=(e,t)=>{return`${ko(e,t)}/status`},ld=(e,t,n)=>{return`${ko(e,n)}/settings/log-source-providers/${t}`},FZ=(e,t,n)=>{return`${ko(e,n)}/settings/mcp-connectors/${t}`},XZ=(e,t,n)=>{return`${ko(e,n)}/settings/sandbox/catalog/${t}`},YZ=(e,t)=>{return`https://otlp.${t}.intake.${e}`};var ce=g(()=>{ee();rs();ie();Vt();JZ=new Map,kL=new Map});var Cd,CY=(e)=>{Cd.set(e.name,e)},Dd=(e)=>{return Cd.get(e)},ks=()=>{return Array.from(Cd.values())},DY=(e)=>{return Cd.has(e)};var WL=g(()=>{Cd=new Map});async function YL(e){let t=await e.publicKeys.list({limit:20});if(!t.success)return[];return t.value.publicKeys.map((n)=>({value:n.id,description:n.name}))}async function QL(e){let t=await e.secretKeys.list({limit:20});if(!t.success)return[];return t.value.secretKeys.map((n)=>({value:n.id,description:n.name}))}async function Wi(e){let t=await e.logSources.list();if(!t.success)return[];return t.value.logSources.map((n)=>({value:n.id,description:n.name??n.provider}))}async function Ss(e){let t=await e.dataSources.instances.list();if(!t.success)return[];return t.value.instances.map((n)=>({value:n.id,description:n.name??n.dataSourceType}))}async function jY(e){let t=await e.members.list();if(!t.success)return[];return t.value.members.map((n)=>({value:n.userId,description:n.name??n.email}))}var Vve=3000,eSe,NY=async(e,t,n)=>{try{let r=eSe[e]?.[t];if(!r)return[];let o=Hn();if(!o.success)return[];let i=o.value,c=process.env.SAZABI_TOKEN?.trim()||i.token?.trim();if(!c)return[];let s=Tn({globalUrl:i.apiBaseUrl,globalDomain:i.apiDomain,buildUrlFromDomain:(u)=>`https://api.${u}`,defaultUrl:"https://api.sazabi.com"}),h=Gn({token:c,baseUrl:s,organizationId:i.activeOrganizationId,projectId:i.activeProjectId});return(await Promise.race([r(h),new Promise((u)=>setTimeout(()=>u([]),Vve))])).filter((u)=>u.value.startsWith(n))}catch{return[]}};var xY=g(()=>{rs();ce();Vt();eSe={threads:{get:async(e)=>{let t=await e.threads.list({limit:20});if(!t.success)return[];return t.value.threads.map((n)=>({value:n.id,description:n.title??void 0}))}},projects:{use:async(e)=>{let t=await e.projects.list();if(!t.success)return[];return t.value.projects.map((n)=>({value:n.id,description:n.name}))}},organizations:{use:async(e)=>{let t=await e.organizations.list();if(!t.success)return[];return t.value.organizations.map((n)=>({value:n.id,description:n.name}))},rename:async(e)=>{let t=await e.organizations.list();if(!t.success)return[];return t.value.organizations.map((n)=>({value:n.id,description:n.name}))}},"public-keys":{get:YL,update:YL,deactivate:YL},"secret-keys":{get:QL,update:QL,delete:QL},"log-sources":{get:Wi,rename:Wi,enable:Wi,disable:Wi,delete:Wi,remove:Wi},"data-sources":{get:Ss,rename:Ss,enable:Ss,disable:Ss,delete:Ss},members:{"update-role":jY,remove:jY}}});var UY={};yn(UY,{parseCompletionContext:()=>oSe,getCompletions:()=>rSe});var tSe,nSe,oSe=(e)=>{let t=e.length>0?e:[""],n=t.length-1,r=t[n]??"";return{words:t,currentIndex:n,partial:r}},rSe=async(e)=>{let{words:t,currentIndex:n,partial:r}=e,o=t[n-1];if(o==="--profile")return sSe(r);let i=cSe(t),c=Math.max(0,i.length-(t.length-n));if(c===0)return iSe(r);let s=i[0]??"",h=Dd(s);if(!h)return[];if(c===1&&h.subcommands){if(r.startsWith("-"))return RY(h.options,i);return aSe(h,r)}let l=h.subcommands?i[1]:void 0,d=(l?h.subcommands?.[l]:void 0)?.options??h.options;if(r.startsWith("-"))return RY(d,i);if(o?.startsWith("--")){let y=o.slice(2);if(d?.[y]?.type==="string"){let f=`${s}:${l??""}`,k=nSe[f]?.[y]??tSe[y];if(k)return k.filter((L)=>L.startsWith(r)).map((L)=>({value:L}));return[]}}return NY(s,l??"",r)},iSe=(e)=>{let n=ks().filter((o)=>o.name.startsWith(e)).map((o)=>({value:o.name,description:o.description})),r=[{value:"--help",description:"Show help"},{value:"--version",description:"Show version"},{value:"--profile",description:"Use a named profile"}];for(let o of r)if(o.value.startsWith(e))n.push(o);return n},aSe=(e,t)=>{if(!e.subcommands)return[];return Object.values(e.subcommands).filter((n)=>n.name.startsWith(t)).map((n)=>({value:n.name,description:n.description}))},RY=(e,t)=>{let n=t[t.length-1]??"",r=new Set(t.filter((i)=>i.startsWith("--")).map((i)=>i.replace(/=.*/,""))),o=[];if(!r.has("--help")&&"--help".startsWith(n))o.push({value:"--help",description:"Show help"});if(!r.has("--profile")&&"--profile".startsWith(n))o.push({value:"--profile",description:"Use a named profile"});if(!e)return o;for(let[i,c]of Object.entries(e)){let s=`--${i}`;if(r.has(s))continue;if(!s.startsWith(n))continue;o.push({value:s,description:c.description})}return o},cSe=(e)=>{let t=[];for(let n=0;n<e.length;n++){let r=e[n];if(r==="--profile"&&n+1<e.length)n++;else if(r.startsWith("--profile="));else t.push(r)}return t},sSe=(e)=>{try{let t=Re();if(!t.success)return[];return Object.keys(t.value.profiles).filter((n)=>n.startsWith(e)).map((n)=>({value:n,description:n===t.value.activeProfile?"active":void 0}))}catch{return[]}};var MY=g(()=>{WL();Vt();xY();tSe={status:["regular","archived"],format:["json","text"]},nSe={"members:update-role":{role:["admin","member"]},"messages:search":{role:["user","assistant"]},"messages:list":{role:["user","assistant"]}}});ee();ee();ee();import{parseArgs as yQ}from"node:util";var $=(e,t,n={})=>{let r=yQ({args:e,options:t,allowPositionals:Boolean(n.allowPositionals),strict:!1,tokens:!0}),o=Object.hasOwn(t,"json")&&r.values.json===!0,i=new Set(Object.keys(t)),c=new Set(Object.entries(t).map(([,h])=>h.short).filter((h)=>Boolean(h))),s=[];if(Array.isArray(r.tokens))for(let h of r.tokens){if(h.kind!=="option")continue;let l=h.name,u=l.length>1;if(!(i.has(l)||!u&&c.has(l))){let y=u?`--${l}`:`-${l}`;if(!s.includes(y))s.push(y)}}for(let h of Object.keys(r.values))if(!i.has(h)){let l=h.length>1?`--${h}`:`-${h}`;if(!s.includes(l))s.push(l)}if(s.length>0){let h=`Unknown option${s.length>1?"s":""}: ${s.join(", ")}. Run the command with -h for usage.`;if(o)b(h);m(h)}for(let[h,l]of Object.entries(t))if(l.type==="string"&&r.values[h]===!0){let u=h.length===1?`-${h}`:`--${h}`,d=`Option ${u} requires a value. Use '${u} <value>'.`;if(o)b(d);m(d)}for(let[h,l]of Object.entries(t)){let u=r.values[h];if(l.type==="string"&&typeof u==="string"){if(u.startsWith("--")||u.length===2&&u[0]==="-"&&/[a-zA-Z]/.test(u.charAt(1))){let p=`Option ${h.length===1?`-${h}`:`--${h}`} received "${u}" as its value. Did you forget to provide a value?`;if(o)b(p);m(p)}}}return{values:r.values,positionals:r.positionals}};var Ts=(e,t)=>{if(e?.json?.type!=="boolean")throw Error(`${t} must include a boolean --json option (enforced by CommandBuilder)`)};class bT{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(e,t,n){this.name=e,this.description=t,this.handler=n}withOptions(e){return this.options=e,this}withSubcommands(e){return this.subcommands=e,this}withExamples(e){return this.examples=e,this}withPositionalArgs(e){return this.positionalArgs=e,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Subcommand "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson&&this.handler)Ts(this.options,`Subcommand "${this.name}"`);if(!this.allowNoJson&&this.subcommands){for(let[e,t]of Object.entries(this.subcommands))if(!t.subcommands)Ts(t.options,`Subcommand "${this.name} ${e}"`)}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}class mT{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(e,t){this.name=e,this.description=t}withHandler(e){return this.handler=e,this}withSubcommands(e){return this.subcommands=e,this}withOptions(e){return this.options=e,this}withExamples(e){return this.examples=e,this}withPositionalArgs(e){return this.positionalArgs=e,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Command "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson){if(this.handler)Ts(this.options,`Command "${this.name}"`);if(this.subcommands)for(let[e,t]of Object.entries(this.subcommands)){if(t.subcommands)continue;Ts(t.options,`Subcommand "${this.name} ${e}"`)}}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}var Q=(e,t)=>{return new mT(e,t)},S=(e,t,n)=>{return new bT(e,t,n)};ee();var ut=(e,t,n,r,o)=>{let i=Number.parseInt(e,10);if(Number.isNaN(i)||i<t||i>n){let c=`${r} must be between ${t} and ${n}.`;if(o)return b(c);return m(c)}return i},Dt=(e,t,n,r)=>{if(!t.includes(e)){let o=t.map((c)=>`"${c}"`).join(" or "),i=`${n} must be ${o}.`;if(r)return b(i);return m(i)}return e};ee();ce();ie();var PL=(e)=>{let t=[];for(let n of e){let r=0;for(let o of n.content){if(o.type!=="artifact")continue;t.push({id:`${n.id}:${r}`,messageId:n.id,name:o.name,toolCallId:o.toolCallId??null,createdAt:n.createdAt,data:o.data}),r+=1}}return t},VZ=(e)=>{let t=e.lastIndexOf(":");if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1);if(!/^\d+$/.test(r))return null;return{messageId:n,index:Number.parseInt(r,10)}},eF=(e,t)=>{return PL(e).find((n)=>n.id===t)},SL=(e)=>typeof e==="object"&&e!==null&&!Array.isArray(e),QZ=(e)=>{let t=e===null||e===void 0?"":typeof e==="object"?JSON.stringify(e):String(e);if(/[",\n\r]/.test(t))return`"${t.replace(/"/g,'""')}"`;return t},Fye=(e)=>{if(Array.isArray(e)&&e.every(SL))return e;if(SL(e))for(let t of["rows","data","items","points"]){let n=e[t];if(Array.isArray(n)&&n.every(SL))return n}return null},tF=(e)=>{let t=Fye(e);if(!t||t.length===0)return null;let n=[];for(let o of t)for(let i of Object.keys(o))if(!n.includes(i))n.push(i);if(n.length===0)return null;let r=[n.map(QZ).join(",")];for(let o of t)r.push(n.map((i)=>QZ(o[i])).join(","));return r.join(`
|
|
8617
|
+
`),...n?{id:n}:{}}),o()};return{line:(c)=>{if(c===""){i();return}if(c.startsWith(":"))return;let s=c.indexOf(":"),h=s===-1?c:c.slice(0,s),l=s===-1?"":c.slice(s+1),u=l.startsWith(" ")?l.slice(1):l;if(h==="event"){t=u||"message";return}if(h==="data"){r.push(u);return}if(h==="id"&&!u.includes("\x00"))n=u},flush:i}},Tye=(e)=>{try{let t=kZ.safeParse(JSON.parse(e));if(!t.success)return[];return t.data.data}catch{return[]}},SZ=(e)=>{return e instanceof Error?e:Error(String(e))},PZ=(e)=>{return e instanceof Error&&e.name==="AbortError"},Oye=(e)=>{return e.message.startsWith("Authentication failed")||e.message.startsWith("Forbidden (")||e.message.startsWith("Wrong region (")||e.message.startsWith("Client error (")},Aye=async(e,t,n,r={},o=3,i=1e4)=>{let c;for(let s=0;s<=o;s+=1){let h=new AbortController,l=globalThis.setTimeout(()=>h.abort(),i);try{let u=await e(t,{method:"POST",headers:{"content-type":"application/json",...r},body:JSON.stringify(n),signal:h.signal});if(u.ok)return;let d=await u.text();if(u.status===401||u.status===403)throw Error("Authentication failed. Check your public key.");if(u.status>=400&&u.status<500&&u.status!==429)throw Error(`Client error (${u.status}): ${d}`);c=Error(u.status===429?`Rate limited (429): ${d}`:`Server error (${u.status}): ${d}`)}catch(u){let d=u instanceof Error?u.message:String(u);if(d.startsWith("Authentication failed")||d.startsWith("Client error ("))throw u instanceof Error?u:Error(d);c=u instanceof Error&&u.name==="AbortError"?Error("Request timed out"):u instanceof Error?u:Error(String(u))}finally{globalThis.clearTimeout(l)}if(s<o)await CZ($Z*2**s)}throw Error(`Failed after ${o+1} attempts: ${c?.message??"Unknown error"}`)},Cye=(e)=>{return e.resourceLogs?.reduce((t,n)=>t+(n.scopeLogs?.reduce((r,o)=>r+(o.logRecords?.length??0),0)??0),0)??0},CZ=async(e,t)=>{if(t?.aborted)return;await new Promise((n)=>{let r=globalThis.setTimeout(n,e);t?.addEventListener("abort",()=>{globalThis.clearTimeout(r),n()},{once:!0})})},DZ=(e,t,n)=>{return new Qe("BAD_REQUEST",{message:t,data:{operationId:e,missingContext:n}})};var uL=g(()=>{lr();vZ();be();iye=a.object({projectId:a.string().uuid().optional().describe("Project to tail logs for. Auto-filled from CLI and SDK context when omitted."),filters:sL.optional().describe("Optional filters applied by the tail SSE service.")}),aye=a.object({publicKey:a.string().min(1).describe("Public key for intake auth. Create or list one via the public key endpoints."),logs:a.custom((e)=>typeof e==="object"&&e!==null).describe("OTLP logs export request payload to send to the intake service.")}),cye=a.object({forwardedCount:a.number().int().nonnegative().describe("Number of log records accepted by the intake request."),failedCount:a.number().int().nonnegative().describe("Number of log records rejected by the intake request.")}),hye=new Set(["15006","3010"])});var gL="https://api.sazabi.com",_Z="https://api.platform.sazabi.com",jZ="sazabi-cli",Dye="urn:ietf:params:oauth:grant-type:device_code",NZ=(e)=>{let t=hy(new Sy(cL,{url:zye(e.apiBaseUrl??gL),headers:async()=>{let o=new Headers({authorization:`Bearer ${await e.credentialProvider.getToken()}`});if(e.clientSource)o.set("x-sazabi-client-source",e.clientSource);return o},fetch:e.fetch,customErrorResponseBodyDecoder:(o,i)=>{let c=Mye(o);if(!c)return null;return new Qe(c.code,{message:c.message,status:i.status,data:{operationId:c.operationId,missingContext:c.missingContext}})}})),n=TZ({raw:t,credentialProvider:e.credentialProvider,fetch:e.fetch,apiBaseUrl:e.apiBaseUrl??gL,intakeBaseUrl:e.intakeBaseUrl,tailBaseUrl:e.tailBaseUrl}),r=wZ({credentialProvider:e.credentialProvider,fetch:e.fetch,apiBaseUrl:e.apiBaseUrl??gL,clientSource:e.clientSource});return{raw:t,me:async()=>t.me({}),automations:{list:async(o={})=>t.automations.list(await te(e.credentialProvider,o,"automations.list")),get:async(o)=>t.automations.get(await te(e.credentialProvider,o,"automations.get")),create:async(o)=>t.automations.create(await te(e.credentialProvider,o,"automations.create")),update:async(o)=>t.automations.update(await te(e.credentialProvider,o,"automations.update")),enable:async(o)=>t.automations.enable(await te(e.credentialProvider,o,"automations.enable")),disable:async(o)=>t.automations.disable(await te(e.credentialProvider,o,"automations.disable")),runs:{list:async(o)=>t.automations.runs.list(await te(e.credentialProvider,o,"automations.runs.list")),get:async(o)=>t.automations.runs.get(await te(e.credentialProvider,o,"automations.runs.get")),logs:async(o)=>t.automations.runs.logs(await te(e.credentialProvider,o,"automations.runs.logs"))}},logs:{...n,query:async(o={})=>t.logs.query(await te(e.credentialProvider,o,Qr.operationId)),schema:async(o={})=>t.logs.schema(await te(e.credentialProvider,o,Vr.operationId)),volume:async(o)=>t.logs.volume(await te(e.credentialProvider,o,ei.operationId)),patterns:async(o={})=>t.logs.patterns(await te(e.credentialProvider,o,ti.operationId)),nativeQuery:async(o)=>t.logs.nativeQuery(await te(e.credentialProvider,o,ni.operationId))},organizations:{list:async()=>t.organizations.list({}),get:async(o)=>t.organizations.get(o),update:async(o)=>t.organizations.update(await jye(e.credentialProvider,o))},members:{list:async(o={})=>t.members.list(await Fe(e.credentialProvider,o)),updateRole:async(o)=>t.members.updateRole(await Fe(e.credentialProvider,o)),remove:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.members.remove({params:{userId:i.userId},query:{organizationId:i.organizationId}})}},teams:{list:async(o={})=>t.teams.list(await Fe(e.credentialProvider,o)),create:async(o)=>t.teams.create(await Fe(e.credentialProvider,o)),update:async(o)=>t.teams.update(await Fe(e.credentialProvider,o)),delete:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.teams.delete({params:{teamId:i.teamId},query:{organizationId:i.organizationId}})},addMember:async(o)=>t.teams.addMember(await Fe(e.credentialProvider,o)),removeMember:async(o)=>{let i=await Fe(e.credentialProvider,o);return t.teams.removeMember({params:{teamId:i.teamId,userId:i.userId},query:{organizationId:i.organizationId}})},listMembers:async(o)=>t.teams.listMembers(await Fe(e.credentialProvider,o))},publicKeys:{list:async(o={})=>t.publicKeys.list(await te(e.credentialProvider,o,Gr.operationId)),get:async(o)=>t.publicKeys.get(await te(e.credentialProvider,o,Jr.operationId)),ensureLogForwarding:async(o={})=>t.publicKeys.ensureLogForwarding(await te(e.credentialProvider,o,Hr.operationId)),update:async(o)=>t.publicKeys.update(await te(e.credentialProvider,o,Br.operationId)),deactivate:async(o)=>{let i=await te(e.credentialProvider,o,Wr.operationId);return t.publicKeys.deactivate({params:{keyId:i.keyId},query:{projectId:i.projectId}})}},secretKeys:{list:async(o={})=>t.secretKeys.list(o),get:async(o)=>t.secretKeys.get(o),create:async(o)=>t.secretKeys.create(o),update:async(o)=>t.secretKeys.update(o),delete:async(o)=>{await t.secretKeys.delete({params:{keyId:o.keyId}})}},search:{threads:async(o)=>t.search.threads(await te(e.credentialProvider,o,_i.operationId)),messages:async(o)=>t.search.messages(await te(e.credentialProvider,o,ji.operationId))},projects:{list:async(o={})=>t.projects.list(await _ye(e.credentialProvider,o)),get:async(o)=>t.projects.get(o),create:async(o)=>t.projects.create(await Fe(e.credentialProvider,o))},messages:{list:async(o)=>t.messages.list(o),append:async(o)=>zZ(t,await t.messages.append(Uye(o)))},threads:{list:async(o={})=>t.threads.list(await Nye(e.credentialProvider,o)),get:async(o)=>t.threads.get(o),getStatus:async(o)=>t.threads.getStatus(o),stop:async(o)=>t.threads.stop(o),create:async(o)=>zZ(t,await t.threads.create(await Rye(e.credentialProvider,o))),update:async(o)=>t.threads.update(o),fork:async(o)=>t.threads.fork(o),setVisibility:async(o)=>t.threads.setVisibility(o),createShareLink:async(o)=>t.threads.createShareLink(o),listShareLinks:async(o)=>t.threads.listShareLinks(o),revokeShareLink:async(o)=>t.threads.revokeShareLink(o),stream:async(o)=>r.streamThread(o)},runs:{list:async(o={})=>t.runs.list(await xye(e.credentialProvider,o)),listForThread:async(o)=>t.runs.listForThread(o),get:async(o)=>t.runs.get(o),cancel:async(o)=>t.runs.cancel(o),stream:async(o)=>r.streamRun(o)},dataSources:{listTypes:async()=>t.dataSources.listTypes({}),instances:{list:async(o={})=>t.dataSources.listInstances(await te(e.credentialProvider,o,Zr.operationId)),get:async(o)=>t.dataSources.getInstance(o),create:async(o)=>t.dataSources.createInstance(await te(e.credentialProvider,o,Fr.operationId)),update:async(o)=>t.dataSources.updateInstance(o),delete:async(o)=>t.dataSources.deleteInstance(o)},streams:{list:async(o)=>t.dataSources.listStreams(o),get:async(o)=>t.dataSources.getStream(o),create:async(o)=>t.dataSources.createStream(o),update:async(o)=>t.dataSources.updateStream(o),delete:async(o)=>t.dataSources.deleteStream(o)}},logSources:{listProviders:async()=>t.logSources.listProviders({}),list:async(o={})=>t.logSources.list(await te(e.credentialProvider,o,Xr.operationId)),get:async(o)=>t.logSources.get(o),create:async(o)=>t.logSources.create(await te(e.credentialProvider,o,Yr.operationId)),update:async(o)=>t.logSources.update(o),delete:async(o)=>t.logSources.delete(o),streams:{list:async(o)=>t.logSources.listStreams(o),get:async(o)=>t.logSources.getStream(o),create:async(o)=>t.logSources.createStream(o),update:async(o)=>t.logSources.updateStream(o),delete:async(o)=>t.logSources.deleteStream(o)}},integrations:{listProviders:async(o={})=>t.integrations.listProviders(await Fe(e.credentialProvider,o)),listConnections:async(o={})=>t.integrations.listConnections(await Fe(e.credentialProvider,o)),getConnection:async(o)=>t.integrations.getConnection(await Fe(e.credentialProvider,o))},mcpConnectors:{list:async(o={})=>t.mcpConnectors.list(await te(e.credentialProvider,o,vi.operationId)),get:async(o)=>t.mcpConnectors.get(await te(e.credentialProvider,o,Si.operationId)),details:async(o)=>t.mcpConnectors.details(await te(e.credentialProvider,o,Pi.operationId)),listProviders:async()=>t.mcpConnectors.listProviders({})},sandboxPresets:{listConnections:async(o={})=>t.sandboxPresets.listConnections(await te(e.credentialProvider,o,zi.operationId)),listTypes:async()=>t.sandboxPresets.listTypes({})},memory:{list:async(o={})=>t.memory.list(await te(e.credentialProvider,o,Ti.operationId)),get:async(o)=>t.memory.get(await te(e.credentialProvider,o,Li.operationId)),put:async(o)=>t.memory.put(await te(e.credentialProvider,o,Ii.operationId)),search:async(o)=>t.memory.search(await te(e.credentialProvider,o,Oi.operationId)),delete:async(o)=>t.memory.delete(await te(e.credentialProvider,o,Ai.operationId))},logMatchExpressions:{list:async(o={})=>t.logMatchExpressions.list(await te(e.credentialProvider,o,"logMatchExpressions.list")),get:async(o)=>t.logMatchExpressions.get(await te(e.credentialProvider,o,"logMatchExpressions.get")),create:async(o)=>t.logMatchExpressions.create(await te(e.credentialProvider,o,"logMatchExpressions.create")),update:async(o)=>t.logMatchExpressions.update(await te(e.credentialProvider,o,"logMatchExpressions.update")),disable:async(o)=>t.logMatchExpressions.disable(await te(e.credentialProvider,o,"logMatchExpressions.disable"))},scripts:{list:async(o={})=>t.scripts.list(await te(e.credentialProvider,o,"scripts.list")),get:async(o)=>t.scripts.get(await te(e.credentialProvider,o,"scripts.get")),create:async(o)=>t.scripts.create(await te(e.credentialProvider,o,"scripts.create")),update:async(o)=>t.scripts.update(await te(e.credentialProvider,o,"scripts.update")),delete:async(o)=>t.scripts.delete(await te(e.credentialProvider,o,"scripts.delete"))},issues:{count:async(o={})=>t.issues.count(await te(e.credentialProvider,o,"issues.count")),create:async(o)=>t.issues.create(await te(e.credentialProvider,o,qr.operationId)),list:async(o={})=>t.issues.list(await te(e.credentialProvider,o,"issues.list")),search:async(o={})=>t.issues.search(await te(e.credentialProvider,o,"issues.search")),get:async(o)=>t.issues.get(o),resolve:async(o)=>t.issues.resolve(o),ignore:async(o)=>t.issues.ignore(o),reopen:async(o)=>t.issues.reopen(o),mute:async(o)=>t.issues.mute(o),unmute:async(o)=>t.issues.unmute(o)},pullRequests:{list:async(o={})=>t.pullRequests.list(await te(e.credentialProvider,o,"pullRequests.list"))},statusComponents:{list:async(o={})=>t.statusComponents.list(await te(e.credentialProvider,o,"statusComponents.list")),get:async(o)=>t.statusComponents.get(o),register:async(o)=>t.statusComponents.register(await te(e.credentialProvider,o,Ni.operationId)),deregister:async(o)=>t.statusComponents.deregister({componentId:o.componentId,...o.reason!==void 0?{reason:o.reason}:{}}),rename:async(o)=>t.statusComponents.rename(o),assignTeam:async(o)=>t.statusComponents.assignTeam(o),retirementPreview:async(o)=>t.statusComponents.retirementPreview(o),retire:async(o)=>t.statusComponents.retire(o),restorationPreview:async(o)=>t.statusComponents.restorationPreview(o),restore:async(o)=>t.statusComponents.restore(o),mergePreview:async(o)=>t.statusComponents.mergePreview(await te(e.credentialProvider,o,"statusComponents.mergePreview")),merge:async(o)=>t.statusComponents.merge(await te(e.credentialProvider,o,"statusComponents.merge")),relationships:{list:async(o={})=>t.statusComponents.relationships.list(await te(e.credentialProvider,o,"statusComponents.relationships.list")),preview:async(o)=>t.statusComponents.relationships.preview(await te(e.credentialProvider,o,"statusComponents.relationships.preview")),add:async(o)=>t.statusComponents.relationships.add(await te(e.credentialProvider,o,"statusComponents.relationships.add")),remove:async(o)=>t.statusComponents.relationships.remove(await te(e.credentialProvider,o,"statusComponents.relationships.remove"))},incidents:{list:async(o={})=>t.statusComponents.incidents.list(await te(e.credentialProvider,o,"statusComponents.incidents.list"))},timeline:async(o)=>t.statusComponents.timeline(o)},billing:{getSummary:async(o={})=>t.billing.getSummary(await Fe(e.credentialProvider,o)),getUsage:async(o={})=>t.billing.getUsage(await Fe(e.credentialProvider,o)),listTransactions:async(o={})=>t.billing.listTransactions(await Fe(e.credentialProvider,o))},tasks:{list:async(o={})=>t.tasks.list(await te(e.credentialProvider,o,os.operationId))},recommendations:{list:async(o={})=>t.recommendations.list(await te(e.credentialProvider,o,Qc.operationId))}}},yL=async(e={})=>{let t=await UZ(e.fetch)(xZ(e.apiBaseUrl??_Z,"/device/code"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:e.clientId??jZ,...e.scope?{scope:e.scope}:{}})}),n=await t.json();if(!t.ok)throw Kye(n,t.status);let r=n;return{deviceCode:Ui(r.device_code,"device_code"),userCode:Ui(r.user_code,"user_code"),verificationUri:Ui(r.verification_uri,"verification_uri"),verificationUriComplete:Ui(r.verification_uri_complete,"verification_uri_complete"),expiresIn:dL(r.expires_in,"expires_in"),interval:dL(r.interval,"interval")}},bL=async(e)=>{let t=await UZ(e.fetch)(xZ(e.apiBaseUrl??_Z,"/device/token"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({grant_type:Dye,device_code:e.deviceCode,client_id:e.clientId??jZ})}),n=await t.json();if(t.ok){let o=n;return{status:"authorized",accessToken:Ui(o.access_token,"access_token"),tokenType:Ui(o.token_type,"token_type"),expiresIn:dL(o.expires_in,"expires_in"),scope:typeof o.scope==="string"?o.scope:""}}let r=RZ(n);if(!r)throw Error(`Device authorization failed with status ${t.status}`);if(r.error==="authorization_pending")return{status:"pending"};if(r.error==="slow_down")return{status:"pending",interval:10};if(r.error==="access_denied")return{status:"denied",message:r.errorDescription};if(r.error==="expired_token"||r.error==="invalid_grant")return{status:"expired",message:r.errorDescription};throw Error(r.errorDescription)},zye=(e)=>{let t=e.replace(/\/+$/,"");return t.endsWith("/v1")?t:`${t}/v1`},xZ=(e,t)=>{return`${e.replace(/\/+$/,"")}/api/auth${t}`},_ye=async(e,t)=>{return Fe(e,t)},Fe=async(e,t)=>{let n=t.organizationId??await e.getOrganizationId?.();return n?{...t,organizationId:n}:t},jye=async(e,t)=>{let n=t.organizationId??await e.getOrganizationId?.();if(!n)throw new Qe("BAD_REQUEST",{message:"Organization ID is required",data:{operationId:"organizations.update",missingContext:["organizationId"]},status:400});return{...t,organizationId:n}},te=async(e,t,n)=>{let r=t.projectId??await e.getProjectId?.();if(!r)throw new Qe("BAD_REQUEST",{message:"Project ID is required",data:{operationId:n,missingContext:["projectId"]},status:400});return{...t,projectId:r}},Nye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},xye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},Rye=async(e,t)=>{let n=t.projectId??await e.getProjectId?.();return n?{...t,projectId:n}:t},Uye=(e)=>{return{threadId:e.threadId,message:e.message,wait:e.wait??!0,timeoutSeconds:e.timeoutSeconds??20,...e.automationId!==void 0?{automationId:e.automationId}:{}}},Mye=(e)=>{if(!e||typeof e!=="object")return null;let t=e;if(typeof t.code!=="string"||typeof t.message!=="string"||typeof t.operationId!=="string")return null;return{code:t.code,message:t.message,operationId:t.operationId,missingContext:Array.isArray(t.missingContext)?t.missingContext.filter((n)=>typeof n==="string"):[]}},RZ=(e)=>{if(!e||typeof e!=="object")return null;let t=e;if(typeof t.error!=="string"||typeof t.error_description!=="string")return null;return{error:t.error,errorDescription:t.error_description}},Kye=(e,t)=>{let n=RZ(e);return Error(n?.errorDescription??`Device authorization failed with status ${t}`)},UZ=(e)=>{return e??globalThis.fetch},zZ=(e,t)=>({result:t,poll:()=>e.runs.get({runId:t.runId}),waitForCompletion:async(n={})=>Eye(e,t,n)}),Eye=async(e,t,n)=>{if(t.completed)return t;let r=n.intervalMs??2000,o=Date.now(),i=t;while(!i.completed){if(n.timeoutMs!==void 0&&Date.now()-o>=n.timeoutMs)return i;await qye(r),i=await e.runs.get({runId:i.runId})}return i},qye=async(e)=>{await new Promise((t)=>globalThis.setTimeout(t,e))},Ui=(e,t)=>{if(typeof e==="string")return e;throw Error(`Expected '${t}' to be a string.`)},dL=(e,t)=>{if(typeof e==="number")return e;throw Error(`Expected '${t}' to be a number.`)};var mL=g(()=>{lr();ZT();Ri();fZ();uL();uL()});var We=(e)=>({success:!0,value:e}),Me=(e,t,n)=>({success:!1,error:e,...t!==void 0&&{statusCode:t},...n!==void 0&&{errorPayload:n}}),w=(e,t,n)=>{if(!e.success){let r=`${t}: ${e.error}`;if(n)return b(e.errorPayload??r);return m(r)}return e.value};var ie=g(()=>{ee()});var Gye="https://api.sazabi.com",O=async(e)=>{try{return We(await e())}catch(t){let n=Jye(t),r=Hye(t),o=t instanceof Error?t.message:String(t);return Me(o,r,n)}},Jye=(e)=>{if(!e||typeof e!=="object")return;let t=e;if(typeof t.code!=="string"||typeof t.message!=="string"||!t.data||typeof t.data!=="object")return;let n=t.data;if(typeof n.operationId!=="string")return;return{code:t.code,message:t.message,operationId:n.operationId,missingContext:Array.isArray(n.missingContext)?n.missingContext.filter((r)=>typeof r==="string"):[]}},Hye=(e)=>{if(!e||typeof e!=="object")return;let t=e;return typeof t.status==="number"?t.status:void 0},Gn=(e)=>{let t=NZ({apiBaseUrl:e.baseUrl??Gye,clientSource:"cli",credentialProvider:{getToken:()=>e.token,getOrganizationId:()=>e.organizationId,getProjectId:()=>e.projectId},intakeBaseUrl:e.intakeBaseUrl,tailBaseUrl:e.tailBaseUrl});return{me:()=>O(()=>t.me()),automations:{list:(n={})=>O(()=>t.automations.list(n)),get:(n)=>O(()=>t.automations.get({automationId:n})),create:(n)=>O(()=>t.automations.create(n)),update:(n)=>O(()=>t.automations.update(n)),enable:(n)=>O(()=>t.automations.enable({automationId:n})),disable:(n)=>O(()=>t.automations.disable({automationId:n})),runs:{list:(n,r={})=>O(()=>t.automations.runs.list({automationId:n,...r})),get:(n,r)=>O(()=>t.automations.runs.get({automationId:n,runId:r})),logs:(n,r)=>O(()=>t.automations.runs.logs({automationId:n,runId:r}))}},logs:{tail:(n)=>O(()=>t.logs.tail(n)),forward:(n)=>O(()=>t.logs.forward(n)),query:(n={})=>O(()=>t.logs.query(n)),schema:(n={})=>O(()=>t.logs.schema(n)),volume:(n)=>O(()=>t.logs.volume(n)),patterns:(n={})=>O(()=>t.logs.patterns(n)),nativeQuery:(n)=>O(()=>t.logs.nativeQuery(n))},organizations:{list:()=>O(()=>t.organizations.list()),get:(n)=>O(()=>t.organizations.get({organizationId:n})),rename:(n,r)=>O(()=>t.organizations.update({organizationId:r,name:n}))},members:{list:(n={})=>O(()=>t.members.list(n)),updateRole:(n,r,o)=>O(()=>t.members.updateRole({organizationId:o,userId:n,role:r})),remove:(n,r)=>O(()=>t.members.remove({organizationId:r,userId:n}))},teams:{list:(n={})=>O(()=>t.teams.list(n)),create:(n,r,o)=>O(()=>t.teams.create({organizationId:o,name:n,...r!==void 0?{description:r}:{}})),update:(n,r,o)=>O(()=>t.teams.update({organizationId:o,teamId:n,...r.name!==void 0?{name:r.name}:{},...r.description!==void 0?{description:r.description}:{}})),delete:(n,r)=>O(()=>t.teams.delete({organizationId:r,teamId:n})),addMember:(n,r,o)=>O(()=>t.teams.addMember({organizationId:o,teamId:n,userId:r})),removeMember:(n,r,o)=>O(()=>t.teams.removeMember({organizationId:o,teamId:n,userId:r})),listMembers:(n,r)=>O(()=>t.teams.listMembers({organizationId:r,teamId:n}))},projects:{list:(n={})=>O(()=>t.projects.list(n)),get:(n)=>O(()=>t.projects.get({projectId:n})),create:(n)=>O(()=>t.projects.create(n))},threads:{list:(n={})=>O(()=>t.threads.list(n)),get:(n)=>O(()=>t.threads.get({threadId:n})),create:(n)=>O(()=>t.threads.create(n)),getStatus:(n)=>O(()=>t.threads.getStatus({threadId:n})),update:(n,r)=>O(()=>t.threads.update({threadId:n,status:r})),fork:(n,r)=>O(()=>t.threads.fork({threadId:n,messageId:r})),setVisibility:(n,r)=>O(()=>t.threads.setVisibility({threadId:n,visibility:r})),createShareLink:(n)=>O(()=>t.threads.createShareLink({threadId:n})),listShareLinks:(n)=>O(()=>t.threads.listShareLinks({threadId:n})),revokeShareLink:(n,r)=>O(()=>t.threads.revokeShareLink({threadId:n,shareId:r})),stop:(n)=>O(()=>t.threads.stop({threadId:n})),stream:(n)=>O(()=>t.threads.stream(n))},messages:{list:(n,r={})=>O(()=>t.messages.list({threadId:n,...r})),append:(n,r,o,i,c,s)=>O(()=>t.messages.append({threadId:n,message:r,wait:o,timeoutSeconds:i,...c!==void 0?{automationId:c}:{},...s?{ambientServiceRun:s}:{}}))},runs:{get:(n)=>O(()=>t.runs.get({runId:n})),cancel:(n)=>O(()=>t.runs.cancel({runId:n})),stream:(n)=>O(()=>t.runs.stream(n))},search:{threads:(n)=>O(()=>t.search.threads(n)),messages:(n)=>O(()=>t.search.messages(n))},publicKeys:{list:(n)=>O(()=>t.publicKeys.list(n)),get:(n,r)=>O(()=>t.publicKeys.get(r?{keyId:n,projectId:r}:{keyId:n})),ensureLogForwarding:(n)=>O(()=>t.publicKeys.ensureLogForwarding(n)),update:(n)=>O(()=>t.publicKeys.update(n)),deactivate:(n)=>O(()=>t.publicKeys.deactivate(n))},secretKeys:{list:(n)=>O(()=>t.secretKeys.list(n)),get:(n)=>O(()=>t.secretKeys.get({keyId:n})),create:(n)=>O(()=>t.secretKeys.create(n)),update:(n)=>O(()=>t.secretKeys.update(n)),delete:(n)=>O(()=>t.secretKeys.delete(n))},issues:{count:(n={})=>O(()=>t.issues.count(n)),create:(n)=>O(()=>t.issues.create(n)),list:(n={})=>O(()=>t.issues.list(n)),search:(n={})=>O(()=>t.issues.search(n)),get:(n)=>O(()=>t.issues.get({issueId:n})),resolve:(n)=>O(()=>t.issues.resolve({issueId:n})),ignore:(n)=>O(()=>t.issues.ignore({issueId:n})),reopen:(n)=>O(()=>t.issues.reopen({issueId:n})),mute:(n)=>O(()=>t.issues.mute({issueId:n})),unmute:(n)=>O(()=>t.issues.unmute({issueId:n}))},pullRequests:{list:(n={})=>O(()=>t.pullRequests.list(n))},statusComponents:{list:(n={})=>O(()=>t.statusComponents.list(n)),get:(n)=>O(()=>t.statusComponents.get({componentId:n})),register:(n)=>O(()=>t.statusComponents.register(n)),deregister:(n,r)=>O(()=>t.statusComponents.deregister({componentId:n,...r!==void 0?{reason:r}:{}})),rename:(n)=>O(()=>t.statusComponents.rename(n)),retirementPreview:(n)=>O(()=>t.statusComponents.retirementPreview(n)),retire:(n)=>O(()=>t.statusComponents.retire(n)),restorationPreview:(n)=>O(()=>t.statusComponents.restorationPreview(n)),restore:(n)=>O(()=>t.statusComponents.restore(n)),mergePreview:(n)=>O(()=>t.statusComponents.mergePreview(n)),merge:(n)=>O(()=>t.statusComponents.merge(n)),relationships:{list:(n={})=>O(()=>t.statusComponents.relationships.list(n)),preview:(n)=>O(()=>t.statusComponents.relationships.preview(n)),add:(n)=>O(()=>t.statusComponents.relationships.add(n)),remove:(n)=>O(()=>t.statusComponents.relationships.remove(n))},incidents:{list:(n={})=>O(()=>t.statusComponents.incidents.list(n))},timeline:(n)=>O(()=>t.statusComponents.timeline(n))},billing:{getSummary:(n={})=>O(()=>t.billing.getSummary(n)),getUsage:(n={})=>O(()=>t.billing.getUsage(n)),listTransactions:(n={})=>O(()=>t.billing.listTransactions(n))},tasks:{list:(n={})=>O(()=>t.tasks.list(n))},recommendations:{list:(n={})=>O(()=>t.recommendations.list(n))},dataSources:{listTypes:()=>O(()=>t.dataSources.listTypes()),instances:{list:(n)=>O(()=>t.dataSources.instances.list(n)),get:(n)=>O(()=>t.dataSources.instances.get({instanceId:n})),create:(n)=>O(()=>t.dataSources.instances.create(n)),update:(n)=>O(()=>t.dataSources.instances.update(n)),delete:(n)=>O(()=>t.dataSources.instances.delete({instanceId:n}))},streams:{list:(n)=>O(()=>t.dataSources.streams.list({instanceId:n})),get:(n)=>O(()=>t.dataSources.streams.get({streamId:n})),create:(n)=>O(()=>t.dataSources.streams.create(n)),update:(n)=>O(()=>t.dataSources.streams.update(n)),delete:(n)=>O(()=>t.dataSources.streams.delete({streamId:n}))}},logSources:{listProviders:()=>O(()=>t.logSources.listProviders()),list:(n)=>O(()=>t.logSources.list(n)),get:(n)=>O(()=>t.logSources.get({logSourceId:n})),create:(n)=>O(()=>t.logSources.create(n)),update:(n)=>O(()=>t.logSources.update(n)),delete:(n)=>O(()=>t.logSources.delete({logSourceId:n})),streams:{list:(n)=>O(()=>t.logSources.streams.list({logSourceId:n})),get:(n)=>O(()=>t.logSources.streams.get({streamId:n})),create:(n)=>O(()=>t.logSources.streams.create(n)),update:(n)=>O(()=>t.logSources.streams.update(n)),delete:(n)=>O(()=>t.logSources.streams.delete({streamId:n}))}},integrations:{listProviders:()=>O(()=>t.integrations.listProviders()),listConnections:(n)=>O(()=>t.integrations.listConnections(n)),getConnection:(n)=>O(()=>t.integrations.getConnection({connectionId:n}))},mcpConnectors:{list:(n)=>O(()=>t.mcpConnectors.list(n)),get:(n)=>O(()=>t.mcpConnectors.get(n)),details:(n)=>O(()=>t.mcpConnectors.details(n)),listProviders:()=>O(()=>t.mcpConnectors.listProviders())},sandboxPresets:{listTypes:()=>O(()=>t.sandboxPresets.listTypes())},memory:{list:(n={})=>O(()=>t.memory.list(n)),get:(n)=>O(()=>t.memory.get(n)),search:(n)=>O(()=>t.memory.search(n)),put:(n)=>O(()=>t.memory.put({kind:"note",...n})),delete:(n)=>O(()=>t.memory.delete(n))},logMatchExpressions:{list:(n={})=>O(()=>t.logMatchExpressions.list(n)),get:(n)=>O(()=>t.logMatchExpressions.get({expressionId:n})),create:(n)=>O(()=>t.logMatchExpressions.create(n)),update:(n,r={})=>O(()=>t.logMatchExpressions.update({expressionId:n,...r})),disable:(n)=>O(()=>t.logMatchExpressions.disable({expressionId:n}))},scripts:{list:(n={})=>O(()=>t.scripts.list(n)),get:(n)=>O(()=>t.scripts.get({name:n})),create:(n)=>O(()=>t.scripts.create(n)),update:(n,r={})=>O(()=>t.scripts.update({name:n,...r})),delete:(n)=>O(()=>t.scripts.delete({name:n}))}}};var rs=g(()=>{mL();ie()});var MZ;var KZ=g(()=>{MZ={version:2,activeProfile:"default",profiles:{default:{}}}});import*as Jn from"node:fs";import*as EZ from"node:os";import*as fL from"node:path";var yt=(e)=>{if(e===void 0||e===null)return;if(typeof e==="string")return e.length>0?e:void 0;return},pL,Mi,Bye=()=>{if(!Jn.existsSync(pL))Jn.mkdirSync(pL,{recursive:!0,mode:448})},wL,qZ=(e)=>{wL=e},GZ=(e)=>({token:yt(e.token),activeOrganizationId:yt(e.activeOrganizationId??e.organizationId),organizationName:yt(e.organizationName),activeProjectId:yt(e.activeProjectId??e.defaultProjectId),apiBaseUrl:yt(e.apiBaseUrl),authBaseUrl:yt(e.authBaseUrl),webBaseUrl:yt(e.webBaseUrl),intakeBaseUrl:yt(e.intakeBaseUrl),tailBaseUrl:yt(e.tailBaseUrl),apiDomain:yt(e.apiDomain),webDomain:yt(e.webDomain),intakeDomain:yt(e.intakeDomain),tailDomain:yt(e.tailDomain),forwardPublicKey:yt(e.forwardPublicKey),forwardPublicKeyProjectId:yt(e.forwardPublicKeyProjectId)}),Wye=(e)=>({version:2,activeProfile:"default",profiles:{default:GZ(e)}}),Zye=(e)=>{let t=yt(e.activeProfile)??"default",n=typeof e.profiles==="object"&&e.profiles!==null?e.profiles:{},r={};for(let[o,i]of Object.entries(n)){if(typeof i!=="object"||i===null)continue;r[o]=GZ(i)}if(!r[t])r[t]={};return{version:2,activeProfile:t,profiles:r}},Re=()=>{try{if(!Jn.existsSync(Mi))return We(MZ);let e=Jn.readFileSync(Mi,"utf-8"),t=JSON.parse(e),n=typeof t.version==="number"?t.version:void 0;if(n!==void 0&&n>2)return Me("Settings file requires a newer CLI version. Upgrade with 'npm install -g @sazabi/cli@latest'.");if(n===2)return We(Zye(t));let r=Wye(t),o=Xe(r);if(!o.success)return o;return We(r)}catch(e){let t=e instanceof Error?e.message:String(e);return Me(t)}},Xe=(e)=>{try{return Bye(),Jn.writeFileSync(Mi,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384}),We(void 0)}catch(t){let n=t instanceof Error?t.message:String(t);return Me(n)}},Ln=(e,t)=>{if(t)return t;if(wL)return wL;let n=process.env.SAZABI_PROFILE?.trim();if(n)return n;return e.activeProfile??"default"},Rt=(e,t)=>{let n=Ln(e,t),r=e.profiles[n];if(r)return We(r);if(n==="default")return We({});return Me(`Profile '${n}' does not exist. Run 'sazabi profiles create ${n}' first.`)},Hn=()=>{let e=Re();if(!e.success)return e;return Rt(e.value)},Ut=(e,t,n)=>{let r=Ln(e,n);if(!e.profiles[r])return Me(`Profile '${r}' does not exist. Run 'sazabi profiles create ${r}' first.`);return We({...e,profiles:{...e.profiles,[r]:{...e.profiles[r],...t}}})},Bn=(e)=>{if(!e?.forwardPublicKey&&!e?.forwardPublicKeyProjectId)return{};return{forwardPublicKey:void 0,forwardPublicKeyProjectId:void 0}};var Vt=g(()=>{KZ();ie();pL=fL.join(EZ.homedir(),".sazabi"),Mi=fL.join(pL,"settings.json")});var Tn=(e)=>{let{cliFlag:t,globalUrl:n,globalDomain:r,buildUrlFromDomain:o,defaultUrl:i}=e;if(t)return t;let c=process.env.SAZABI_API_URL?.trim();if(c)return c;if(n)return n;if(r)return o(r);return i},C=(e)=>{let{tokenFlag:t,organizationIdFlag:n,projectIdFlag:r,jsonMode:o}=e,i=t?.trim(),c=process.env.SAZABI_TOKEN?.trim(),s=process.env.SAZABI_ORGANIZATION_ID?.trim(),h=process.env.SAZABI_PROJECT_ID?.trim(),l=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",o),u=l.token?.trim(),d=(i&&i.length>0?i:void 0)||(c&&c.length>0?c:void 0)||u,y=i&&i.length>0?"flag":c&&c.length>0?"environment":"settings";if(!d||d.length===0){if(o)return b("Not authenticated. Set SAZABI_TOKEN, pass --token, run 'sazabi auth login', or run 'sazabi auth save <token>'.");return m("Not authenticated. Set SAZABI_TOKEN, pass --token, run 'sazabi auth login', or run 'sazabi auth save <token>'.")}let p,f;if(n)p=n,f="flag";else if(s&&s.length>0)p=s,f="environment";else if(l.activeOrganizationId)p=l.activeOrganizationId,f="settings";let k,L;if(r)k=r,L="flag";else if(h&&h.length>0)k=h,L="environment";else if(l.activeProjectId)k=l.activeProjectId,L="settings";return{token:d,type:"token",projectId:k,organizationId:p,tokenSource:y,organizationSource:f,projectSource:L}},vL=(e)=>{let t=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e?.jsonMode);return Tn({cliFlag:e?.apiBaseUrlFlag,globalUrl:t.apiBaseUrl,globalDomain:t.apiDomain,buildUrlFromDomain:(n)=>`https://api.${n}`,defaultUrl:"https://api.sazabi.com"})},z=(e)=>{let t=vL({apiBaseUrlFlag:e.apiBaseUrlFlag,jsonMode:e.jsonMode});return Gn({token:e.token,baseUrl:t,organizationId:e.organizationId,projectId:e.projectId})},JZ,kL,hd=async(e)=>{let t=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e.jsonMode),n=Tn({cliFlag:e.apiBaseUrlFlag,globalUrl:t.apiBaseUrl,globalDomain:t.apiDomain,buildUrlFromDomain:(h)=>`https://api.${h}`,defaultUrl:"https://api.sazabi.com"}),r=`${e.token}@${n}@${e.projectId??""}`,o=JZ.get(r);if(o)return o;let i=kL.get(r);if(i)return i;if(!e.projectId){if(e.jsonMode)return b("Project ID is required. Run 'sazabi projects use <project-id>' or set SAZABI_PROJECT_ID.");return m("Project ID is required. Run 'sazabi projects use <project-id>' or set SAZABI_PROJECT_ID.")}let c=e.projectId,s=(async()=>{let l=await Gn({token:e.token,baseUrl:n,projectId:c}).projects.get(c),d=w(l,"Couldn't fetch project info (run 'sazabi projects list' to verify the project ID)",e.jsonMode).project;return JZ.set(r,d),d})();kL.set(r,s);try{return await s}finally{kL.delete(r)}},sd=(e)=>{let t=e.trim().toLowerCase(),n=/^[a-z][a-z0-9+.-]*:\/\//.test(t)?t:`https://${t}`,r=t;try{r=new URL(n).hostname.toLowerCase()}catch{r=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,"").replace(/[/?#].*$/,"").replace(/:\d+$/,"")}return`https://app.${r.replace(/^(?:app\.)+/,"")}`},Ki=(e)=>{let t=(r)=>r.replace(/\/+$/,"");if(e)return t(e);let n=w(Hn(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)");if(n.webBaseUrl)return t(n.webBaseUrl);if(n.webDomain)return sd(n.webDomain);if(n.apiDomain)return sd(n.apiDomain);return"https://app.sazabi.com"},On=(e,t)=>{if(e&&e.length>0)return e;let n="No project selected. Pass --project-id, set SAZABI_PROJECT_ID, or run 'sazabi projects use <project-id>'.";if(t)return b(n);return m(n)},ko=(e,t)=>{return`${Ki(t)}/projects/${e}`},Ye=(e,t,n,r)=>{let o=`${Ki(n)}/projects/${e}/threads/${t}`;return r?`${o}?messageId=${encodeURIComponent(r)}`:o},HZ=(e,t,n,r)=>{return Ye(e,t,n,r)},BZ=(e,t,n)=>{return`${ko(e,n)}/issues/${t}`},WZ=(e,t,n)=>{return`${ko(e,n)}/automations/${t}`},ZZ=(e,t)=>{return`${ko(e,t)}/status`},ld=(e,t,n)=>{return`${ko(e,n)}/settings/log-streams/${t}`},FZ=(e,t,n)=>{return`${ko(e,n)}/settings/mcp-connectors/${t}`},XZ=(e,t,n)=>{return`${ko(e,n)}/settings/sandbox/catalog/${t}`},YZ=(e,t)=>{return`https://otlp.${t}.intake.${e}`};var ce=g(()=>{ee();rs();ie();Vt();JZ=new Map,kL=new Map});var Cd,CY=(e)=>{Cd.set(e.name,e)},Dd=(e)=>{return Cd.get(e)},ks=()=>{return Array.from(Cd.values())},DY=(e)=>{return Cd.has(e)};var WL=g(()=>{Cd=new Map});async function YL(e){let t=await e.publicKeys.list({limit:20});if(!t.success)return[];return t.value.publicKeys.map((n)=>({value:n.id,description:n.name}))}async function QL(e){let t=await e.secretKeys.list({limit:20});if(!t.success)return[];return t.value.secretKeys.map((n)=>({value:n.id,description:n.name}))}async function Wi(e){let t=await e.logSources.list();if(!t.success)return[];return t.value.logSources.map((n)=>({value:n.id,description:n.name??n.provider}))}async function Ss(e){let t=await e.dataSources.instances.list();if(!t.success)return[];return t.value.instances.map((n)=>({value:n.id,description:n.name??n.dataSourceType}))}async function jY(e){let t=await e.members.list();if(!t.success)return[];return t.value.members.map((n)=>({value:n.userId,description:n.name??n.email}))}var Vve=3000,eSe,NY=async(e,t,n)=>{try{let r=eSe[e]?.[t];if(!r)return[];let o=Hn();if(!o.success)return[];let i=o.value,c=process.env.SAZABI_TOKEN?.trim()||i.token?.trim();if(!c)return[];let s=Tn({globalUrl:i.apiBaseUrl,globalDomain:i.apiDomain,buildUrlFromDomain:(u)=>`https://api.${u}`,defaultUrl:"https://api.sazabi.com"}),h=Gn({token:c,baseUrl:s,organizationId:i.activeOrganizationId,projectId:i.activeProjectId});return(await Promise.race([r(h),new Promise((u)=>setTimeout(()=>u([]),Vve))])).filter((u)=>u.value.startsWith(n))}catch{return[]}};var xY=g(()=>{rs();ce();Vt();eSe={threads:{get:async(e)=>{let t=await e.threads.list({limit:20});if(!t.success)return[];return t.value.threads.map((n)=>({value:n.id,description:n.title??void 0}))}},projects:{use:async(e)=>{let t=await e.projects.list();if(!t.success)return[];return t.value.projects.map((n)=>({value:n.id,description:n.name}))}},organizations:{use:async(e)=>{let t=await e.organizations.list();if(!t.success)return[];return t.value.organizations.map((n)=>({value:n.id,description:n.name}))},rename:async(e)=>{let t=await e.organizations.list();if(!t.success)return[];return t.value.organizations.map((n)=>({value:n.id,description:n.name}))}},"public-keys":{get:YL,update:YL,deactivate:YL},"secret-keys":{get:QL,update:QL,delete:QL},"log-sources":{get:Wi,rename:Wi,enable:Wi,disable:Wi,delete:Wi,remove:Wi},"data-sources":{get:Ss,rename:Ss,enable:Ss,disable:Ss,delete:Ss},members:{"update-role":jY,remove:jY}}});var UY={};yn(UY,{parseCompletionContext:()=>oSe,getCompletions:()=>rSe});var tSe,nSe,oSe=(e)=>{let t=e.length>0?e:[""],n=t.length-1,r=t[n]??"";return{words:t,currentIndex:n,partial:r}},rSe=async(e)=>{let{words:t,currentIndex:n,partial:r}=e,o=t[n-1];if(o==="--profile")return sSe(r);let i=cSe(t),c=Math.max(0,i.length-(t.length-n));if(c===0)return iSe(r);let s=i[0]??"",h=Dd(s);if(!h)return[];if(c===1&&h.subcommands){if(r.startsWith("-"))return RY(h.options,i);return aSe(h,r)}let l=h.subcommands?i[1]:void 0,d=(l?h.subcommands?.[l]:void 0)?.options??h.options;if(r.startsWith("-"))return RY(d,i);if(o?.startsWith("--")){let y=o.slice(2);if(d?.[y]?.type==="string"){let f=`${s}:${l??""}`,k=nSe[f]?.[y]??tSe[y];if(k)return k.filter((L)=>L.startsWith(r)).map((L)=>({value:L}));return[]}}return NY(s,l??"",r)},iSe=(e)=>{let n=ks().filter((o)=>o.name.startsWith(e)).map((o)=>({value:o.name,description:o.description})),r=[{value:"--help",description:"Show help"},{value:"--version",description:"Show version"},{value:"--profile",description:"Use a named profile"}];for(let o of r)if(o.value.startsWith(e))n.push(o);return n},aSe=(e,t)=>{if(!e.subcommands)return[];return Object.values(e.subcommands).filter((n)=>n.name.startsWith(t)).map((n)=>({value:n.name,description:n.description}))},RY=(e,t)=>{let n=t[t.length-1]??"",r=new Set(t.filter((i)=>i.startsWith("--")).map((i)=>i.replace(/=.*/,""))),o=[];if(!r.has("--help")&&"--help".startsWith(n))o.push({value:"--help",description:"Show help"});if(!r.has("--profile")&&"--profile".startsWith(n))o.push({value:"--profile",description:"Use a named profile"});if(!e)return o;for(let[i,c]of Object.entries(e)){let s=`--${i}`;if(r.has(s))continue;if(!s.startsWith(n))continue;o.push({value:s,description:c.description})}return o},cSe=(e)=>{let t=[];for(let n=0;n<e.length;n++){let r=e[n];if(r==="--profile"&&n+1<e.length)n++;else if(r.startsWith("--profile="));else t.push(r)}return t},sSe=(e)=>{try{let t=Re();if(!t.success)return[];return Object.keys(t.value.profiles).filter((n)=>n.startsWith(e)).map((n)=>({value:n,description:n===t.value.activeProfile?"active":void 0}))}catch{return[]}};var MY=g(()=>{WL();Vt();xY();tSe={status:["regular","archived"],format:["json","text"]},nSe={"members:update-role":{role:["admin","member"]},"messages:search":{role:["user","assistant"]},"messages:list":{role:["user","assistant"]}}});ee();ee();ee();import{parseArgs as yQ}from"node:util";var $=(e,t,n={})=>{let r=yQ({args:e,options:t,allowPositionals:Boolean(n.allowPositionals),strict:!1,tokens:!0}),o=Object.hasOwn(t,"json")&&r.values.json===!0,i=new Set(Object.keys(t)),c=new Set(Object.entries(t).map(([,h])=>h.short).filter((h)=>Boolean(h))),s=[];if(Array.isArray(r.tokens))for(let h of r.tokens){if(h.kind!=="option")continue;let l=h.name,u=l.length>1;if(!(i.has(l)||!u&&c.has(l))){let y=u?`--${l}`:`-${l}`;if(!s.includes(y))s.push(y)}}for(let h of Object.keys(r.values))if(!i.has(h)){let l=h.length>1?`--${h}`:`-${h}`;if(!s.includes(l))s.push(l)}if(s.length>0){let h=`Unknown option${s.length>1?"s":""}: ${s.join(", ")}. Run the command with -h for usage.`;if(o)b(h);m(h)}for(let[h,l]of Object.entries(t))if(l.type==="string"&&r.values[h]===!0){let u=h.length===1?`-${h}`:`--${h}`,d=`Option ${u} requires a value. Use '${u} <value>'.`;if(o)b(d);m(d)}for(let[h,l]of Object.entries(t)){let u=r.values[h];if(l.type==="string"&&typeof u==="string"){if(u.startsWith("--")||u.length===2&&u[0]==="-"&&/[a-zA-Z]/.test(u.charAt(1))){let p=`Option ${h.length===1?`-${h}`:`--${h}`} received "${u}" as its value. Did you forget to provide a value?`;if(o)b(p);m(p)}}}return{values:r.values,positionals:r.positionals}};var Ts=(e,t)=>{if(e?.json?.type!=="boolean")throw Error(`${t} must include a boolean --json option (enforced by CommandBuilder)`)};class bT{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(e,t,n){this.name=e,this.description=t,this.handler=n}withOptions(e){return this.options=e,this}withSubcommands(e){return this.subcommands=e,this}withExamples(e){return this.examples=e,this}withPositionalArgs(e){return this.positionalArgs=e,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Subcommand "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson&&this.handler)Ts(this.options,`Subcommand "${this.name}"`);if(!this.allowNoJson&&this.subcommands){for(let[e,t]of Object.entries(this.subcommands))if(!t.subcommands)Ts(t.options,`Subcommand "${this.name} ${e}"`)}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}class mT{name;description;handler;subcommands;options;examples;positionalArgs;allowNoJson=!1;constructor(e,t){this.name=e,this.description=t}withHandler(e){return this.handler=e,this}withSubcommands(e){return this.subcommands=e,this}withOptions(e){return this.options=e,this}withExamples(e){return this.examples=e,this}withPositionalArgs(e){return this.positionalArgs=e,this}build(){if(!this.handler&&!this.subcommands)throw Error(`Command "${this.name}" must have either a handler or subcommands`);if(!this.allowNoJson){if(this.handler)Ts(this.options,`Command "${this.name}"`);if(this.subcommands)for(let[e,t]of Object.entries(this.subcommands)){if(t.subcommands)continue;Ts(t.options,`Subcommand "${this.name} ${e}"`)}}return{name:this.name,description:this.description,handler:this.handler,subcommands:this.subcommands,options:this.options,examples:this.examples,positionalArgs:this.positionalArgs}}allowWithoutJson(){return this.allowNoJson=!0,this}}var Q=(e,t)=>{return new mT(e,t)},S=(e,t,n)=>{return new bT(e,t,n)};ee();var ut=(e,t,n,r,o)=>{let i=Number.parseInt(e,10);if(Number.isNaN(i)||i<t||i>n){let c=`${r} must be between ${t} and ${n}.`;if(o)return b(c);return m(c)}return i},Dt=(e,t,n,r)=>{if(!t.includes(e)){let o=t.map((c)=>`"${c}"`).join(" or "),i=`${n} must be ${o}.`;if(r)return b(i);return m(i)}return e};ee();ce();ie();var PL=(e)=>{let t=[];for(let n of e){let r=0;for(let o of n.content){if(o.type!=="artifact")continue;t.push({id:`${n.id}:${r}`,messageId:n.id,name:o.name,toolCallId:o.toolCallId??null,createdAt:n.createdAt,data:o.data}),r+=1}}return t},VZ=(e)=>{let t=e.lastIndexOf(":");if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1);if(!/^\d+$/.test(r))return null;return{messageId:n,index:Number.parseInt(r,10)}},eF=(e,t)=>{return PL(e).find((n)=>n.id===t)},SL=(e)=>typeof e==="object"&&e!==null&&!Array.isArray(e),QZ=(e)=>{let t=e===null||e===void 0?"":typeof e==="object"?JSON.stringify(e):String(e);if(/[",\n\r]/.test(t))return`"${t.replace(/"/g,'""')}"`;return t},Fye=(e)=>{if(Array.isArray(e)&&e.every(SL))return e;if(SL(e))for(let t of["rows","data","items","points"]){let n=e[t];if(Array.isArray(n)&&n.every(SL))return n}return null},tF=(e)=>{let t=Fye(e);if(!t||t.length===0)return null;let n=[];for(let o of t)for(let i of Object.keys(o))if(!n.includes(i))n.push(i);if(n.length===0)return null;let r=[n.map(QZ).join(",")];for(let o of t)r.push(n.map((i)=>QZ(o[i])).join(","));return r.join(`
|
|
8618
8618
|
`)};var Xye=100,nF=100,Yye=async(e,t,n)=>{let r=[],o;for(let i=0;i<nF;i++){let c=await e.messages.list(t,{limit:Xye,...o?{cursor:o}:{}}),s=w(c,"Couldn't get artifact (check the thread ID and try again)",n);if(r.push(...s.messages),!s.nextCursor)break;o=s.nextCursor}if(o&&!n)console.error(`Warning: reached the ${nF}-page limit; the artifact may exist beyond the scanned messages.`);return r},Qye=(e,t,n)=>{if(t)return t;let r=`--thread-id is required to locate artifact '${e}'. Usage: sazabi artifacts get <artifact-id> --thread-id <thread-id>`;if(n)b(r);else m(r);return},Vye=(e,t)=>{if(t.json){J({id:e.id,messageId:e.messageId,name:e.name,toolCallId:e.toolCallId,createdAt:e.createdAt,data:e.data});return}if(t.format==="csv"){let n=tF(e.data);if(n===null){m(`Artifact '${e.id}' (${e.name}) has no embedded rows to render as CSV. Built-in table/timeseries artifacts persist query parameters rather than result rows, so only artifacts that embed their data (such as custom artifacts) can be exported as CSV. Use --json or the default output to inspect this artifact.`);return}console.log(n);return}console.log(JSON.stringify(e.data,null,2))},oF=async(e,t)=>{if(!VZ(e)){let h=`Invalid artifact ID: '${e}'. Expected format '<message-id>:<index>' (from 'sazabi artifacts list').`;if(t.json)return b(h);return m(h)}let r=Qye(e,t.threadId,t.json);if(!r)return;let o=C({tokenFlag:t.token,jsonMode:t.json}),i=z({token:o.token,projectId:o.projectId,apiBaseUrlFlag:t.apiBaseUrl}),c=await Yye(i,r,t.json),s=eF(c,e);if(!s){let h=`Artifact '${e}' not found in thread '${r}'. Run 'sazabi artifacts list --thread-id ${r}' to see available artifacts.`;if(t.json)return b(h);return m(h)}Vye(s,t)};ee();ce();ie();var ebe={id:{label:"ID",type:{kind:"string"}},name:{label:"Type",type:{kind:"string"}},toolCallId:{label:"Tool call",type:{kind:"nullable-string",emptyLabel:"(none)"}},createdAt:{label:"Created",type:{kind:"date"}}},tbe={schema:ebe,columns:["id","name","toolCallId","createdAt"],header:"Artifacts",emptyMessage:"No artifacts found in this thread."},nbe=100,rF=100,obe=async(e,t,n)=>{let r=[],o;for(let i=0;i<rF;i++){let c=await e.messages.list(t,{limit:nbe,...o?{cursor:o}:{}}),s=w(c,"Couldn't list artifacts (check the thread ID and try again)",n);if(r.push(...s.messages),!s.nextCursor)break;o=s.nextCursor}if(o&&!n)console.error(`Warning: reached the ${rF}-page limit; artifact list may be incomplete for this thread.`);return r},iF=async(e)=>{let t=C({tokenFlag:e.token,jsonMode:e.json}),n=z({token:t.token,projectId:t.projectId,apiBaseUrlFlag:e.apiBaseUrl}),r=await obe(n,e.threadId,e.json),i=PL(r).map((c)=>({id:c.id,name:c.name,toolCallId:c.toolCallId,createdAt:c.createdAt}));H(tbe,i,{json:e.json})};var aF=Q("artifacts","Retrieve artifacts produced in a thread").withSubcommands({list:S("list","List artifacts produced in a thread",async(e)=>{let{values:t}=$(e,{token:{type:"string"},"thread-id":{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}}),n=t["thread-id"];if(!n){if(t.json)return b("--thread-id is required. Usage: sazabi artifacts list --thread-id <thread-id>");return m("--thread-id is required. Usage: sazabi artifacts list --thread-id <thread-id>")}await iF({threadId:n,token:t.token,json:t.json,apiBaseUrl:t["api-base-url"]})}).withOptions({token:{type:"string",description:"Override authentication token"},"thread-id":{type:"string",description:"Thread to list artifacts for (required)"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi artifacts list --thread-id <thread-id> # List artifacts in a thread","sazabi artifacts list --thread-id <thread-id> --json # Output as JSON"]).build(),get:S("get","Get a single artifact's data",async(e)=>{let{values:t,positionals:n}=$(e,{token:{type:"string"},"thread-id":{type:"string"},format:{type:"string"},json:{type:"boolean"},"api-base-url":{type:"string"}},{allowPositionals:!0}),r=n[0];if(!r){if(t.json)return b("Artifact ID is required. Usage: sazabi artifacts get <artifact-id> --thread-id <thread-id>");return m("Artifact ID is required. Usage: sazabi artifacts get <artifact-id> --thread-id <thread-id>")}if(n.length>1){let i=n.slice(1).join(", ");if(t.json)return b(`Unexpected arguments: ${i}.`);return m(`Unexpected arguments: ${i}.`)}let o;if(t.format)o=Dt(t.format,["json","csv"],"Format",t.json);await oF(r,{token:t.token,threadId:t["thread-id"],format:o,json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<artifact-id>").withOptions({token:{type:"string",description:"Override authentication token"},"thread-id":{type:"string",description:"Thread the artifact belongs to (required)"},format:{type:"string",description:"Output format for non-JSON mode: json (default) or csv"},json:{type:"boolean",description:"Output as JSON"},"api-base-url":{type:"string",description:"Override API base URL"}}).withExamples(["sazabi artifacts get <artifact-id> --thread-id <thread-id> # Print artifact data","sazabi artifacts get <artifact-id> --thread-id <thread-id> --format csv # Render table/timeseries as CSV","sazabi artifacts get <artifact-id> --thread-id <thread-id> --json # Output as JSON"]).build()}).withExamples(["sazabi artifacts list --thread-id <thread-id> # List artifacts in a thread","sazabi artifacts get <artifact-id> --thread-id <thread-id> # Get one artifact's data"]).build();ee();mL();import{spawn as rbe}from"node:child_process";var j={token:{type:"string"},"api-base-url":{type:"string"},json:{type:"boolean"}},_={token:{type:"string",description:"Override token"},"api-base-url":{type:"string",description:"Override API base URL"},json:{type:"boolean",description:"Output as JSON"}};ce();ie();Vt();var Ei=(e)=>{if(e==="flag")return"from flag";if(e==="environment")return"from environment";return"from settings"},ibe=async(e={})=>{let t=C({jsonMode:e.json}),n=z({token:t.token,organizationId:t.organizationId,projectId:t.projectId,apiBaseUrlFlag:e.apiBaseUrl,jsonMode:e.json}),r=w(await n.me(),"Couldn't fetch authentication details (run 'sazabi auth login' to sign in again)",e.json);if(e.json){J({credential:r,activeOrganizationId:t.organizationId,activeProjectId:t.projectId,tokenSource:t.tokenSource,organizationSource:t.organizationSource,projectSource:t.projectSource});return}if(Pe("Authentication"),r.credentialType==="user"){fe({Type:`User token (${Ei(t.tokenSource)})`,User:r.user.name??r.user.email,Email:r.user.email,"Active organization":t.organizationId&&t.organizationSource?`${t.organizationId} (${Ei(t.organizationSource)})`:lt("(none)"),"Active project":t.projectId&&t.projectSource?`${t.projectId} (${Ei(t.projectSource)})`:lt("(none)"),Organizations:r.organizations.length.toString(),"Dashboard URL":Ki()});return}if(r.credentialType==="secret"){fe({Type:`Secret key (${Ei(t.tokenSource)})`,Organization:r.organization.name,"Key name":r.keyName,"Active project":t.projectId&&t.projectSource?`${t.projectId} (${Ei(t.projectSource)})`:lt("(none)"),"Dashboard URL":Ki()});return}fe({Type:`Partner key (${Ei(t.tokenSource)})`,Superorganization:r.superorganization.name,"Dashboard URL":Ki()})},abe=async(e,t={})=>{let n=e.trim();if(!n){if(t.json)return b("Token is required.");return m("Token is required.")}let r=w(Re(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",t.json);await $L({token:n,options:t,cliSettings:r,status:"saved"})},cF=(e)=>{let t=process.platform,n,r;if(t==="darwin")n="open",r=[e];else if(t==="win32")n="cmd",r=["/c","start","",e];else n="xdg-open",r=[e];let o=rbe(n,r,{detached:!0,stdio:"ignore"});o.on("error",()=>{}),o.unref()},sF=(e)=>new Promise((t)=>setTimeout(t,e)),cbe=async(e={})=>{let t=w(Re(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e.json),n=Ln(t),r=t.profiles[n]??{},o=IL(r,e.apiBaseUrl),i=hF(o,e.authBaseUrl??r.authBaseUrl),c;try{c=await yL({apiBaseUrl:i})}catch(y){let p=y instanceof Error?y.message:String(y);if(e.json)return b(`Failed to initiate sign-up: ${p}`);return m(`Failed to initiate sign-up: ${p}`)}let s=uF({profile:r,publicApiBaseUrl:o,authBaseUrl:i,apiBaseUrlOverride:e.apiBaseUrl,authBaseUrlOverride:e.authBaseUrl,webBaseUrlOverride:e.webBaseUrl,verificationUriComplete:c.verificationUriComplete}),h=`/login/cli?user_code=${encodeURIComponent(c.userCode)}`,l=`${s}/sign-up?returnTo=${encodeURIComponent(h)}`,u=new Date(Date.now()+c.expiresIn*1000),d=c.interval*1000;if(!e.json)le(),Pe("Create a Sazabi account"),le(),bn(`Opening ${ze.info(l)}`),le(),cF(l),ae("Waiting for sign-up to complete...");while(new Date<u){await sF(d);try{let y=await bL({apiBaseUrl:i,deviceCode:c.deviceCode});if(y.status==="pending"){d=(y.interval??c.interval)*1000;continue}if(y.status==="denied"){if(e.json)return b("Sign-up was denied.");return le(),m("Sign-up was denied.")}if(y.status==="expired"){if(e.json)return b("Sign-up request expired. Try again.");return le(),m("Sign-up request expired. Try again.")}await $L({token:y.accessToken,options:e,cliSettings:t,status:"authorized"});return}catch(y){let p=y instanceof Error?y.message:String(y);if(e.json)return b(`Sign-up failed: ${p}`);return le(),m(`Sign-up failed: ${p}`)}}if(e.json)return b("Sign-up request expired. Try again.");return le(),m("Sign-up request expired. Try again.")},sbe=async(e={})=>{let t=w(Re(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e.json),n=Ln(t),r=t.profiles[n]??{},o=IL(r,e.apiBaseUrl),i=hF(o,e.authBaseUrl??r.authBaseUrl),c;try{c=await yL({apiBaseUrl:i})}catch(d){let y=d instanceof Error?d.message:String(d);if(e.json)return b(`Failed to initiate login: ${y}`);return m(`Failed to initiate login: ${y}`)}let s=uF({profile:r,publicApiBaseUrl:o,authBaseUrl:i,apiBaseUrlOverride:e.apiBaseUrl,authBaseUrlOverride:e.authBaseUrl,webBaseUrlOverride:e.webBaseUrl,verificationUriComplete:c.verificationUriComplete}),h=mbe(c.verificationUriComplete,s),l=new Date(Date.now()+c.expiresIn*1000),u=c.interval*1000;if(!e.json)le(),Pe("Sign in to Sazabi"),le(),bn("Enter this code in your browser:"),le(),bn(ze.bold(c.userCode),4),le(),bn(`Opening ${ze.info(h)}`),le(),cF(h),ae("Waiting for authorization...");while(new Date<l){await sF(u);try{let d=await bL({apiBaseUrl:i,deviceCode:c.deviceCode});if(d.status==="pending"){u=(d.interval??c.interval)*1000;continue}if(d.status==="denied"){if(e.json)return b("Authorization was denied.");return le(),m("Authorization was denied.")}if(d.status==="expired"){if(e.json)return b("Authorization request expired. Try again.");return le(),m("Authorization request expired. Try again.")}await $L({token:d.accessToken,options:e,cliSettings:t,status:"authorized"});return}catch(d){let y=d instanceof Error?d.message:String(d);if(e.json)return b(`Authorization failed: ${y}`);return le(),m(`Authorization failed: ${y}`)}}if(e.json)return b("Authorization request expired. Try again.");return le(),m("Authorization request expired. Try again.")},hbe=(e)=>{let t=w(Re(),"Couldn't read settings (check that ~/.sazabi/settings.json is readable)",e.json),n=w(Rt(t),"Couldn't resolve profile (run 'sazabi profiles list' to see available profiles)",e.json),r=Boolean(n.token),o=w(Ut(t,{token:void 0,activeOrganizationId:void 0,organizationName:void 0,activeProjectId:void 0,...Bn(n)}),"Failed to update profile",e.json);if(w(Xe(o),"Failed to remove credentials",e.json),e.json){J({removed:r});return}if(r){F("Signed out.");return}ae("No credentials were saved.")},$L=async({token:e,options:t,cliSettings:n,status:r})=>{let o=Ln(n),i=n.profiles[o]??{},c=IL(i,t.apiBaseUrl),s=z({token:e,apiBaseUrlFlag:t.apiBaseUrl,jsonMode:t.json}),h=w(await s.me(),`Couldn't resolve authenticated context at ${c} (pass --api-base-url to target a different environment)`,t.json);if(r==="authorized"&&h.credentialType!=="user"){if(t.json)return b("Expected a user session from device authorization.");return m("Expected a user session from device authorization.")}let l=n.profiles[o]?n:{...n,profiles:{...n.profiles,[o]:{}}},u=l.profiles[o],d=await lbe({client:s,credential:h,currentProjectId:u.activeProjectId,jsonMode:t.json}),y=u.token!==e||u.activeOrganizationId!==d.activeOrganizationId||u.activeProjectId!==d.activeProjectId,p=w(Ut(l,{token:e,activeOrganizationId:d.activeOrganizationId,organizationName:d.activeOrganizationName,activeProjectId:d.activeProjectId,apiBaseUrl:t.apiBaseUrl??u.apiBaseUrl,authBaseUrl:t.authBaseUrl??u.authBaseUrl,webBaseUrl:t.webBaseUrl??u.webBaseUrl,...y&&Bn(u)}),"Failed to update profile",t.json);if(w(Xe(p),"Failed to save credentials",t.json),t.json){J({status:r,credential:h,activeOrganizationId:d.activeOrganizationId,activeProjectId:d.activeProjectId,projects:d.projects});return}if(le(),F(r==="authorized"?"Signed in.":"Token saved."),le(),gbe({credential:h,activeOrganizationName:d.activeOrganizationName,activeProjectId:d.activeProjectId,projects:d.projects}),d.projects.length>0){le(),Pe("Available projects");for(let f of d.projects){let L=f.id===d.activeProjectId?ze.success(" (active)"):"";bn(`${f.name} (${f.region})${L}`)}}},lbe=async({client:e,credential:t,currentProjectId:n,jsonMode:r})=>{if(t.credentialType==="partner")return{projects:[]};let o=t.credentialType==="user"?t.activeOrganizationId??t.organizations[0]?.id:t.organization.id,i=t.credentialType==="user"?t.organizations.find((s)=>s.id===o)?.name:t.organization.name,c=o?w(await e.projects.list({organizationId:o}),"Couldn't fetch projects (check your organization access and try again)",r).projects:[];return{activeOrganizationId:o,activeOrganizationName:i,activeProjectId:ube(c,n),projects:c}},ube=(e,t)=>{if(t&&e.some((n)=>n.id===t))return t;return e[0]?.id},gbe=({credential:e,activeOrganizationName:t,activeProjectId:n,projects:r})=>{if(e.credentialType==="user"){fe({Type:"User token",User:e.user.name??e.user.email,Organizations:e.organizations.length.toString(),"Active organization":t??"(none)","Active project":r.find((o)=>o.id===n)?.name??"(none)"});return}if(e.credentialType==="secret"){fe({Type:"Secret key",Organization:e.organization.name,"Key name":e.keyName,"Active project":r.find((o)=>o.id===n)?.name??"(none)"});return}fe({Type:"Partner key",Superorganization:e.superorganization.name})},IL=(e,t)=>{return Tn({cliFlag:t,globalUrl:e.apiBaseUrl,globalDomain:e.apiDomain,buildUrlFromDomain:(n)=>`https://api.${n}`,defaultUrl:"https://api.sazabi.com"})},hF=(e,t)=>{if(t)return t;try{let n=new URL(e);if(["localhost","127.0.0.1"].includes(n.hostname)&&["15005","15009"].includes(n.port))return n.port="15001",n.toString().replace(/\/$/,"");if(n.hostname==="api.sazabi.com")return n.hostname="api.platform.sazabi.com",n.toString().replace(/\/$/,"");if(n.hostname==="api.staging.sazabi.dev")return n.hostname="api.platform.staging.sazabi.dev",n.toString().replace(/\/$/,"");return n.toString().replace(/\/$/,"")}catch{return e}},lF=(e)=>e.replace(/\/+$/,""),Mt=(e)=>(e?.trim().length??0)>0,dbe=(e)=>{if(!Mt(e))return;try{let t=new URL(e);return`${t.protocol}//${t.host}`}catch{return}},qi=(e)=>{if(!Mt(e))return;try{let n=new URL(e).hostname.toLowerCase();if(["localhost","127.0.0.1"].includes(n))return"https://localhost:5173";if(["api.staging.sazabi.dev","api.platform.staging.sazabi.dev"].includes(n))return"https://app.staging.sazabi.dev";if(["api.sazabi.com","api.platform.sazabi.com"].includes(n))return"https://app.sazabi.com"}catch{return}return},ybe=(e)=>{if(Mt(e.webBaseUrl))return lF(e.webBaseUrl);if(Mt(e.webDomain))return sd(e.webDomain);return},bbe=({profile:e,publicApiBaseUrl:t})=>{if(!(Mt(e.authBaseUrl)||Mt(e.apiBaseUrl)||Mt(e.apiDomain)))return;if(Mt(e.authBaseUrl)){let r=qi(e.authBaseUrl);if(r)return r}return qi(t)},uF=({profile:e,publicApiBaseUrl:t,authBaseUrl:n,apiBaseUrlOverride:r,authBaseUrlOverride:o,webBaseUrlOverride:i,verificationUriComplete:c})=>{if(Mt(i))return lF(i);let s=process.env.SAZABI_API_URL?.trim(),h=Mt(o)||Mt(r)||Mt(s),l=dbe(c);if(h){let y=Mt(o)?qi(n):qi(t);if(y)return y;if(l)return l}let u=ybe(e);if(u)return u;let d=bbe({profile:e,publicApiBaseUrl:t});if(d)return d;if(l)return l;return"https://app.sazabi.com"},mbe=(e,t)=>{if(!t)return e;try{let n=new URL(e),r=new URL(t);return n.protocol=r.protocol,n.host=r.host,n.toString()}catch{return e}},gF=Q("auth","Manage authentication credentials").withSubcommands({signup:S("signup","Create a new Sazabi account via browser",async(e)=>{let{values:t,positionals:n}=$(e,{...j,"auth-base-url":{type:"string"},"web-base-url":{type:"string"}},{allowPositionals:!0});if(n.length>0){let r=n.join(", ");if(t.json)return b(`Unexpected arguments: ${r}.`);return m(`Unexpected arguments: ${r}.`)}await cbe({json:t.json,apiBaseUrl:t["api-base-url"],authBaseUrl:t["auth-base-url"],webBaseUrl:t["web-base-url"]})}).withOptions({..._,"auth-base-url":{type:"string",description:"Override auth API base URL"},"web-base-url":{type:"string",description:"Override web app base URL"}}).withExamples(["sazabi auth signup # Create a new account via browser"]).build(),login:S("login","Authenticate via browser",async(e)=>{let{values:t,positionals:n}=$(e,{...j,"auth-base-url":{type:"string"},"web-base-url":{type:"string"}},{allowPositionals:!0});if(n.length>0){let r=n.join(", ");if(t.json)return b(`Unexpected arguments: ${r}.`);return m(`Unexpected arguments: ${r}.`)}await sbe({json:t.json,apiBaseUrl:t["api-base-url"],authBaseUrl:t["auth-base-url"],webBaseUrl:t["web-base-url"]})}).withOptions({..._,"auth-base-url":{type:"string",description:"Override auth API base URL"},"web-base-url":{type:"string",description:"Override web app base URL"}}).withExamples(["sazabi auth login # Authenticate via browser"]).build(),save:S("save","Save an existing bearer token",async(e)=>{let{values:t,positionals:n}=$(e,{...j,"web-base-url":{type:"string"}},{allowPositionals:!0}),r=n[0];if(!r){if(t.json)return b("Token is required.");return m("Token is required.")}if(n.length>1){let o=n.slice(1).join(", ");if(t.json)return b(`Unexpected arguments: ${o}.`);return m(`Unexpected arguments: ${o}.`)}await abe(r,{json:t.json,apiBaseUrl:t["api-base-url"],webBaseUrl:t["web-base-url"]})}).withPositionalArgs("<token>").withOptions({..._,"web-base-url":{type:"string",description:"Override web app base URL"}}).withExamples(["sazabi auth save sazabi_secret_xxx # Save a secret key for future commands"]).build(),logout:S("logout","Remove saved credentials",async(e)=>{let{values:t,positionals:n}=$(e,j,{allowPositionals:!0});if(n.length>0){let r=n.join(", ");if(t.json)return b(`Unexpected arguments: ${r}.`);return m(`Unexpected arguments: ${r}.`)}hbe({json:t.json})}).withOptions(_).withExamples(["sazabi auth logout # Remove saved credentials"]).build(),whoami:S("whoami","Display current authentication context",async(e)=>{let{values:t,positionals:n}=$(e,j,{allowPositionals:!0});if(n.length>0){let r=n.join(", ");if(t.json)return b(`Unexpected arguments: ${r}.`);return m(`Unexpected arguments: ${r}.`)}await ibe({json:t.json,apiBaseUrl:t["api-base-url"]})}).withOptions(_).withExamples(["sazabi auth whoami # Show current context","sazabi auth whoami --json # Output as JSON"]).build()}).withExamples(["sazabi auth signup # Create a new account via browser","sazabi auth login # Authenticate via browser","sazabi auth save sazabi_secret_xxx # Save an existing token","sazabi auth logout # Remove saved credentials","sazabi auth whoami # Show current context"]).build();ee();ce();ie();var is=(e)=>({id:e.id,name:e.name,status:e.enabled?"active":"paused",source:e.source,kind:e.kind,health:e.health,cronExpression:e.cronExpression,timezone:e.timezone,timeoutSeconds:e.timeoutSeconds,successRate:e.successRate,runCount:e.runCount,failedRunCount:e.failedRunCount,lastRunStatus:e.lastRun?.status??null,lastRunAt:e.lastRun?.startedAt??null,scriptIdentifier:"scriptIdentifier"in e?e.scriptIdentifier:null,scriptId:"scriptId"in e?e.scriptId:null,scriptName:"scriptName"in e?e.scriptName:null,canToggle:"canToggle"in e?e.canToggle:null,createdAt:"createdAt"in e?e.createdAt:null,updatedAt:"updatedAt"in e?e.updatedAt:null}),yF={id:{label:"ID",type:{kind:"id"}},url:{label:"URL",type:{kind:"nullable-string"}},name:{label:"Name",type:{kind:"string"}},status:{label:"Status",type:{kind:"custom",render:(e)=>e==="active"?"Enabled":"Disabled",serialize:(e)=>e}},source:{label:"Source",type:{kind:"string"}},kind:{label:"Kind",type:{kind:"string"}},health:{label:"Health",type:{kind:"string"}},cronExpression:{label:"Cron",type:{kind:"nullable-string",emptyLabel:"(n/a)"}},timezone:{label:"Timezone",type:{kind:"string"}},timeoutSeconds:{label:"Timeout (s)",type:{kind:"custom",render:(e)=>e==null?"(none)":String(e),serialize:(e)=>e}},successRate:{label:"Success rate",type:{kind:"custom",render:(e)=>e==null?"(n/a)":`${Math.round(Number(e)*100)}%`,serialize:(e)=>e}},runCount:{label:"Runs (7d)",type:{kind:"number"}},failedRunCount:{label:"Failures (7d)",type:{kind:"number"}},lastRunStatus:{label:"Last run status",type:{kind:"nullable-string",emptyLabel:"(never)"}},lastRunAt:{label:"Last run",type:{kind:"nullable-date",emptyLabel:"(never)"}},scriptIdentifier:{label:"Script",type:{kind:"nullable-string"}},scriptId:{label:"Script ID",type:{kind:"nullable-string"}},scriptName:{label:"Script name",type:{kind:"nullable-string"}},canToggle:{label:"Can toggle",type:{kind:"custom",render:(e)=>e==null?"(n/a)":e?"yes":"no",serialize:(e)=>e}},createdAt:{label:"Created at",type:{kind:"nullable-date"}},updatedAt:{label:"Updated at",type:{kind:"nullable-date"}}},pbe={schema:yF,columns:["name","status","health","cronExpression","lastRunAt"],jsonFields:["id","name","status","source","kind","health","cronExpression","timezone","timeoutSeconds","successRate","runCount","failedRunCount","lastRunStatus","lastRunAt"],header:"Automations",emptyMessage:"No automations found."},ud={layout:"field-list",schema:yF,fields:["id","url","name","status","source","kind","health","cronExpression","timezone","timeoutSeconds","successRate","runCount","failedRunCount","lastRunStatus","lastRunAt","scriptIdentifier","scriptId","scriptName","canToggle","createdAt","updatedAt"],title:"Automation"},bF=(e)=>({id:e.id,automationRunKey:e.automationRunKey,status:e.status,scheduledAt:e.scheduledAt,dueAt:e.dueAt,startedAt:e.startedAt,completedAt:e.completedAt,durationMs:e.durationMs,exitCode:e.exitCode,errorMessage:e.errorMessage,automationId:"automationId"in e?e.automationId:null}),mF={id:{label:"ID",type:{kind:"id"}},automationId:{label:"Automation",type:{kind:"nullable-string"}},automationRunKey:{label:"Run key",type:{kind:"string"}},status:{label:"Status",type:{kind:"string"}},scheduledAt:{label:"Scheduled at",type:{kind:"nullable-date"}},dueAt:{label:"Due at",type:{kind:"nullable-date"}},startedAt:{label:"Started at",type:{kind:"date"}},completedAt:{label:"Completed at",type:{kind:"nullable-date"}},durationMs:{label:"Duration (ms)",type:{kind:"custom",render:(e)=>e==null?"(n/a)":String(e),serialize:(e)=>e}},exitCode:{label:"Exit code",type:{kind:"custom",render:(e)=>e==null?"(n/a)":String(e),serialize:(e)=>e}},errorMessage:{label:"Error",type:{kind:"nullable-string",emptyLabel:"(none)"}}},wbe={schema:mF,columns:["status","startedAt","durationMs","exitCode"],jsonFields:["id","automationRunKey","status","scheduledAt","dueAt","startedAt","completedAt","durationMs","exitCode","errorMessage"],header:"Automation runs",emptyMessage:"No automation runs found."},fbe={layout:"field-list",schema:mF,fields:["id","automationId","automationRunKey","status","scheduledAt","dueAt","startedAt","completedAt","durationMs","exitCode","errorMessage"],title:"Automation run"},kbe=(e)=>({status:e.status,exitCode:e.exitCode,truncated:e.truncated,durationMs:e.durationMs,startedAt:e.startedAt,completedAt:e.completedAt,stdout:e.stdout,stderr:e.stderr}),vbe={status:{label:"Status",type:{kind:"string"}},exitCode:{label:"Exit code",type:{kind:"custom",render:(e)=>e==null?"(n/a)":String(e),serialize:(e)=>e}},truncated:{label:"Truncated",type:{kind:"custom",render:(e)=>e?"yes":"no",serialize:(e)=>e}},durationMs:{label:"Duration (ms)",type:{kind:"custom",render:(e)=>e==null?"(n/a)":String(e),serialize:(e)=>e}},startedAt:{label:"Started at",type:{kind:"nullable-date"}},completedAt:{label:"Completed at",type:{kind:"nullable-date"}},stdout:{label:"Stdout",type:{kind:"custom",render:(e)=>e?String(e):"(empty)",serialize:(e)=>e}},stderr:{label:"Stderr",type:{kind:"custom",render:(e)=>e?String(e):"(empty)",serialize:(e)=>e}}},Sbe={layout:"field-list",schema:vbe,fields:["status","exitCode","truncated","durationMs","startedAt","completedAt","stdout","stderr"],title:"Automation run logs"},vo=(e)=>{let t=C({tokenFlag:e.token,projectIdFlag:e.projectId,jsonMode:e.json});return{client:z({token:t.token,organizationId:t.organizationId,projectId:t.projectId,apiBaseUrlFlag:e.apiBaseUrl,jsonMode:e.json}),projectId:t.projectId}},gd=(e,t)=>t?{...e,url:WZ(t,e.id)}:e,Pbe=async(e)=>{let{client:t}=vo(e),n=w(await t.automations.list({search:e.search,status:e.status,source:e.source,health:e.health,sort:e.sort,limit:e.limit,cursor:e.cursor}),"Couldn't list automations (check the active project and try again)",e.json);H(pbe,n.automations.map(is),{json:e.json,nextCursor:n.nextCursor})},$be=async(e,t)=>{let{client:n,projectId:r}=vo(t),o=w(await n.automations.get(e),"Couldn't get automation (run 'sazabi automations list' to see automation IDs)",t.json);U(ud,gd(is(o.automation),r),{json:t.json})},Ibe=async(e,t)=>{let n=t.scriptId!==void 0,r=t.script!==void 0,o=t.expressionId!==void 0,i=Number(n)+Number(r)+Number(o),c=(u)=>{if(t.json){b(u);return}m(u)};if(i!==1){c("Provide exactly one of --script-id, --script, or --expression-id.");return}if(o){if(t.cronExpression!==void 0||t.timezone!==void 0||t.timeoutSeconds!==void 0){c("Cron and timeout flags are not used with --expression-id log-match automations.");return}if(!t.description?.trim()){c("--description is required for log-match automations (investigation instructions).");return}}let{client:s,projectId:h}=vo(t),l=w(await s.automations.create({name:e,...t.description!==void 0?{description:t.description}:{},...t.scriptId!==void 0?{scriptId:t.scriptId}:{},...t.script!==void 0?{script:t.script}:{},...t.expressionId!==void 0?{expressionId:t.expressionId}:{},...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},...t.timezone!==void 0?{timezone:t.timezone}:{},...t.timeoutSeconds!==void 0?{timeoutSeconds:t.timeoutSeconds}:{},...t.enabled!==void 0?{enabled:t.enabled}:{}}),o?"Couldn't create log-match automation (check the expression ID and description)":"Couldn't create automation (check the script name/ID and try again)",t.json);if(!t.json)F(`Automation "${l.automation.name}" created.`);U(ud,gd(is(l.automation),h),{json:t.json})},Lbe=async(e,t)=>{if(t.name===void 0&&t.description===void 0&&t.clearDescription!==!0&&t.cronExpression===void 0&&t.timezone===void 0&&t.timeoutSeconds===void 0){if(t.json){b("Nothing to update. Provide --name, --description, --clear-description, --cron-expression, --timezone, or --timeout-seconds.");return}m("Nothing to update. Provide --name, --description, --clear-description, --cron-expression, --timezone, or --timeout-seconds.");return}if(t.description!==void 0&&t.clearDescription===!0){if(t.json){b("Use either --description or --clear-description, not both.");return}m("Use either --description or --clear-description, not both.");return}let{client:n,projectId:r}=vo(t),o=w(await n.automations.update({automationId:e,...t.name!==void 0?{name:t.name}:{},...t.clearDescription?{description:null}:t.description!==void 0?{description:t.description}:{},...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},...t.timezone!==void 0?{timezone:t.timezone}:{},...t.timeoutSeconds!==void 0?{timeoutSeconds:t.timeoutSeconds}:{}}),"Couldn't update automation (run 'sazabi automations list' to see automation IDs)",t.json);if(!t.json)F(`Automation "${o.automation.name}" updated.`);U(ud,gd(is(o.automation),r),{json:t.json})},pF=async(e,t,n)=>{let{client:r,projectId:o}=vo(n),i=w(t?await r.automations.enable(e):await r.automations.disable(e),t?"Failed to enable automation":"Failed to disable automation",n.json),c=gd(is(i.automation),o);if(!n.json)F(`Automation "${c.name}" is now ${t?"enabled":"disabled"}.`);U(ud,c,{json:n.json})},Tbe=async(e,t)=>pF(e,!0,t),Obe=async(e,t)=>pF(e,!1,t),Abe=async(e,t)=>{let{client:n}=vo(t),r=w(await n.automations.runs.list(e,{status:t.status,limit:t.limit,cursor:t.cursor}),"Couldn't list automation runs (run 'sazabi automations list' to see automation IDs)",t.json);H(wbe,r.runs.map(bF),{json:t.json,nextCursor:r.nextCursor})},Cbe=async(e,t,n)=>{let{client:r}=vo(n),o=w(await r.automations.runs.get(e,t),"Couldn't get automation run (run 'sazabi automations runs list <automation-id>' to see run IDs)",n.json);U(fbe,bF(o.run),{json:n.json})},Dbe=async(e,t,n)=>{let{client:r}=vo(n),o=w(await r.automations.runs.logs(e,t),"Couldn't get automation run logs (run 'sazabi automations runs list <automation-id>' to see run IDs)",n.json);U(Sbe,kbe(o.logs),{json:n.json})},Wn={...j,"project-id":{type:"string"}},Zn={..._,"project-id":{type:"string",description:"Override active project ID"}},zbe=(e,t)=>{let n=e[0];if(!n){if(t){b("Automation name is required.");return}m("Automation name is required.");return}return n},Qo=(e,t)=>{let n=e[0];if(!n){if(t){b("Automation ID is required.");return}m("Automation ID is required.");return}return n},dF=(e,t)=>{let n=e[1];if(!n){if(t){b("Run ID is required.");return}m("Run ID is required.");return}return n},wF=Q("automations","Manage scheduled automations").withSubcommands({list:S("list","List automations in the active project",async(e)=>{let{values:t}=$(e,{...Wn,search:{type:"string"},status:{type:"string"},source:{type:"string"},health:{type:"string"},sort:{type:"string"},limit:{type:"string"},cursor:{type:"string"}}),n=(u)=>{if(t.json){b(u);return}m(u)},r=t.status;if(r!==void 0&&r!=="active"&&r!=="paused")return n(`Invalid --status value "${r}". Expected "active" or "paused".`);let o=t.source;if(o!==void 0&&o!=="sazabi_managed"&&o!=="custom")return n(`Invalid --source value "${o}". Expected "sazabi_managed" or "custom".`);let i=t.health,c=["healthy","failing","never_run"];if(i!==void 0&&!c.includes(i))return n(`Invalid --health value "${i}". Expected one of: ${c.join(", ")}.`);let s=t.sort,h=["name","last_run","failures","runs"];if(s!==void 0&&!h.includes(s))return n(`Invalid --sort value "${s}". Expected one of: ${h.join(", ")}.`);let l;if(t.limit!==void 0){if(l=Number(t.limit),!Number.isInteger(l)||l<1||l>100)return n(`Invalid --limit value "${t.limit}". Expected an integer between 1 and 100.`)}await Pbe({token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"],search:t.search,status:r,source:o,health:i,sort:s,limit:l,cursor:t.cursor})}).withOptions({...Zn,search:{type:"string",description:"Filter by automation name (case-insensitive)"},status:{type:"string",description:"Filter by status: active or paused"},source:{type:"string",description:"Filter by source: sazabi_managed or custom"},health:{type:"string",description:"Filter by health: healthy, failing, or never_run"},sort:{type:"string",description:"Sort by: name, last_run, failures, or runs"},limit:{type:"string",description:"Maximum number of automations to return (default: 50, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"}}).withExamples(["sazabi automations list # List all automations","sazabi automations list --status paused # List paused automations"]).build(),get:S("get","Get one automation by ID",async(e)=>{let{values:t,positionals:n}=$(e,Wn,{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;await $be(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<automation-id>").withOptions(Zn).withExamples(["sazabi automations get <automation-id> # Get one automation"]).build(),create:S("create","Create an automation",async(e)=>{let{values:t,positionals:n}=$(e,{...Wn,description:{type:"string"},"script-id":{type:"string"},script:{type:"string"},"expression-id":{type:"string"},"cron-expression":{type:"string"},timezone:{type:"string"},"timeout-seconds":{type:"string"},enabled:{type:"boolean"}},{allowPositionals:!0}),r=zbe(n,t.json);if(!r)return;let o=(c)=>{if(t.json){b(c);return}m(c)},i;if(t["timeout-seconds"]!==void 0){if(i=Number(t["timeout-seconds"]),!Number.isInteger(i)||i<1||i>3600)return o(`Invalid --timeout-seconds value "${t["timeout-seconds"]}". Expected an integer between 1 and 3600.`)}await Ibe(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"],description:t.description,scriptId:t["script-id"],script:t.script,expressionId:t["expression-id"],cronExpression:t["cron-expression"],timezone:t.timezone,timeoutSeconds:i,enabled:t.enabled})}).withPositionalArgs("<name>").withOptions({...Zn,description:{type:"string",description:"Human-readable description (required for log-match automations)"},"script-id":{type:"string",description:"Project script ID to run (cron automations)"},script:{type:"string",description:"Project script name to run (cron automations)"},"expression-id":{type:"string",description:"Log-match expression ID to bind (creates a log-match investigation automation)"},"cron-expression":{type:"string",description:"Cron schedule expression"},timezone:{type:"string",description:"IANA timezone for the schedule"},"timeout-seconds":{type:"string",description:"Run timeout in seconds (1-3600)"},enabled:{type:"boolean",description:"Create the automation enabled"}}).withExamples(["sazabi automations create deploy-nightly --script health --cron-expression '0 3 * * *' # Create from a DB-backed script by name","sazabi automations create deploy-nightly --script-id <script-id> # Create by script ID",'sazabi automations create "Investigate Plain tickets" --expression-id <uuid> --description "When a new Plain ticket is created, investigate …" # Create a log-match investigation automation']).build(),update:S("update","Update an automation",async(e)=>{let{values:t,positionals:n}=$(e,{...Wn,name:{type:"string"},description:{type:"string"},"clear-description":{type:"boolean"},"cron-expression":{type:"string"},timezone:{type:"string"},"timeout-seconds":{type:"string"}},{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;let o=(c)=>{if(t.json){b(c);return}m(c)},i;if(t["timeout-seconds"]!==void 0){if(i=Number(t["timeout-seconds"]),!Number.isInteger(i)||i<1||i>3600)return o(`Invalid --timeout-seconds value "${t["timeout-seconds"]}". Expected an integer between 1 and 3600.`)}await Lbe(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"],name:t.name,description:t.description,clearDescription:t["clear-description"],cronExpression:t["cron-expression"],timezone:t.timezone,timeoutSeconds:i})}).withPositionalArgs("<automation-id>").withOptions({...Zn,name:{type:"string",description:"New automation name"},description:{type:"string",description:"New human-readable description"},"clear-description":{type:"boolean",description:"Clear the automation description"},"cron-expression":{type:"string",description:"New cron schedule expression"},timezone:{type:"string",description:"New IANA timezone for the schedule"},"timeout-seconds":{type:"string",description:"New run timeout in seconds (1-3600)"}}).withExamples(["sazabi automations update <automation-id> --cron-expression '0 4 * * *' # Change the schedule"]).build(),enable:S("enable","Enable an automation",async(e)=>{let{values:t,positionals:n}=$(e,Wn,{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;await Tbe(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<automation-id>").withOptions(Zn).withExamples(["sazabi automations enable <automation-id> # Enable an automation"]).build(),disable:S("disable","Disable an automation",async(e)=>{let{values:t,positionals:n}=$(e,Wn,{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;await Obe(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<automation-id>").withOptions(Zn).withExamples(["sazabi automations disable <automation-id> # Disable an automation"]).build(),runs:S("runs","Inspect automation runs").withSubcommands({list:S("list","List runs for an automation",async(e)=>{let{values:t,positionals:n}=$(e,{...Wn,status:{type:"string"},limit:{type:"string"},cursor:{type:"string"}},{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;let o=(h)=>{if(t.json){b(h);return}m(h)},i=t.status,c=["running","succeeded","failed","timed_out","cancelled"];if(i!==void 0&&!c.includes(i))return o(`Invalid --status value "${i}". Expected one of: ${c.join(", ")}.`);let s;if(t.limit!==void 0){if(s=Number(t.limit),!Number.isInteger(s)||s<1||s>100)return o(`Invalid --limit value "${t.limit}". Expected an integer between 1 and 100.`)}await Abe(r,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"],status:i,limit:s,cursor:t.cursor})}).withPositionalArgs("<automation-id>").withOptions({...Zn,status:{type:"string",description:"Filter by run status: running, succeeded, failed, timed_out, or cancelled"},limit:{type:"string",description:"Maximum number of runs to return (default: 50, max: 100)"},cursor:{type:"string",description:"Pagination cursor from previous response"}}).withExamples(["sazabi automations runs list <automation-id> # List runs for an automation","sazabi automations runs list <automation-id> --status failed # List failed runs"]).build(),get:S("get","Get one automation run by ID",async(e)=>{let{values:t,positionals:n}=$(e,Wn,{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;let o=dF(n,t.json);if(!o)return;await Cbe(r,o,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<automation-id> <run-id>").withOptions(Zn).withExamples(["sazabi automations runs get <automation-id> <run-id> # Get one automation run"]).build(),logs:S("logs","Get the captured logs for an automation run",async(e)=>{let{values:t,positionals:n}=$(e,Wn,{allowPositionals:!0}),r=Qo(n,t.json);if(!r)return;let o=dF(n,t.json);if(!o)return;await Dbe(r,o,{token:t.token,projectId:t["project-id"],json:t.json,apiBaseUrl:t["api-base-url"]})}).withPositionalArgs("<automation-id> <run-id>").withOptions(Zn).withExamples(["sazabi automations runs logs <automation-id> <run-id> # Get captured logs for a run"]).build()}).withExamples(["sazabi automations runs list <automation-id> # List runs for an automation","sazabi automations runs get <automation-id> <run-id> # Get one run","sazabi automations runs logs <automation-id> <run-id> # Get captured logs for a run"]).build()}).withExamples(["sazabi automations list # List all automations","sazabi automations get <automation-id> # Get one automation","sazabi automations create deploy-nightly --script health --cron-expression '0 3 * * *' # Create from a DB-backed script by name","sazabi automations update <automation-id> --cron-expression '0 4 * * *' # Change the schedule","sazabi automations enable <automation-id> # Enable an automation","sazabi automations disable <automation-id> # Disable an automation","sazabi automations runs list <automation-id> # List runs for an automation","sazabi automations runs get <automation-id> <run-id> # Get one run","sazabi automations runs logs <automation-id> <run-id> # Get captured logs for a run"]).build();ee();ce();ie();var LL=(e)=>{let t=e.json,n=C({tokenFlag:e.token,jsonMode:t});return{client:z({token:n.token,organizationId:n.organizationId,projectId:n.projectId,apiBaseUrlFlag:e["api-base-url"],jsonMode:t}),json:t??!1}},_be={plan:{label:"Plan",type:{kind:"string"}},status:{label:"Status",type:{kind:"string"}},currency:{label:"Currency",type:{kind:"string"}},balance:{label:"Current balance",type:{kind:"string"}},targetBalance:{label:"Target balance",type:{kind:"string"}},cycle:{label:"Cycle",type:{kind:"string"}},estimate:{label:"Est. total",type:{kind:"string"}},pendingDowngrade:{label:"Pending downgrade",type:{kind:"string"}}},jbe={layout:"field-list",schema:_be,fields:["plan","status","currency","balance","targetBalance","cycle","estimate","pendingDowngrade"]},Nbe=(e)=>({plan:e.planName??"—",status:e.status,currency:e.currency??"—",balance:e.currentBalance??"—",targetBalance:e.targetCreditBalance??"—",cycle:e.currentCycle?`${e.currentCycle.startsAt.slice(0,10)} - ${e.currentCycle.endsAt.slice(0,10)}`:"—",estimate:e.currentPeriodEstimate?`${e.currentPeriodEstimate.totalAmount} ${e.currentPeriodEstimate.currency}`:"—",pendingDowngrade:e.pendingDowngrade?`${e.pendingDowngrade.planName??"—"} (effective ${e.pendingDowngrade.effectiveAt.slice(0,10)})`:"—"}),xbe=async(e)=>{let{values:t}=$(e,j),{client:n,json:r}=LL(t),o=w(await n.billing.getSummary(),"Couldn't fetch billing summary (check your organization access and try again)",r);if(!r){if(Pe("Billing summary"),!o.billable&&o.nonBillableReason)fe({"Not billable":o.nonBillableReason})}U(jbe,Nbe(o),{json:r})},Rbe={logs_ingested_bytes:"Log data (GB)",input_tokens:"Input tokens",output_tokens:"Output tokens"},Ube=(e)=>{let t=Number.parseFloat(e);if(Number.isNaN(t))return e;return(t/1e9).toFixed(3)},Mbe=(e,t)=>{if(t==="logs_ingested_bytes")return Ube(e);let n=Number.parseInt(e,10);return Number.isNaN(n)?e:n.toLocaleString()},Kbe={dimension:{label:"Dimension",type:{kind:"string"}},total:{label:"Total quantity",type:{kind:"string"}},credits:{label:"Credits consumed",type:{kind:"string"}}},Ebe={schema:Kbe,columns:["dimension","total","credits"],emptyMessage:"No usage recorded for this billing cycle."},qbe=async(e)=>{let{values:t}=$(e,{...j,cycle:{type:"string"}}),{client:n,json:r}=LL(t);if(t.cycle&&t.cycle!=="current"&&t.cycle!=="previous"){if(r)return b("--cycle must be 'current' or 'previous'.");m("--cycle must be 'current' or 'previous'.");return}let o=t.cycle??"current",i=w(await n.billing.getUsage({cycle:o}),"Couldn't fetch billing usage (check your organization access and try again)",r);if(!r){if(Pe(`Billing usage (${o} cycle)`),i.cycle)fe({Cycle:`${i.cycle.startsAt.slice(0,10)} - ${i.cycle.endsAt.slice(0,10)}`})}let c=i.usage.map((s)=>{let h=s.dimension;return{dimension:Rbe[h]??s.dimension,total:Mbe(s.totalQuantity,h),credits:s.creditsConsumed}});H(Ebe,c,{json:r})},Gbe={occurredAt:{label:"Date",type:{kind:"date"}},type:{label:"Type",type:{kind:"string"}},delta:{label:"Credit delta",type:{kind:"string"}},balance:{label:"Balance after",type:{kind:"string"}}},Jbe={schema:Gbe,columns:["occurredAt","type","delta","balance"],emptyMessage:"No billing transactions found."},Hbe=async(e)=>{let{values:t}=$(e,{...j,limit:{type:"string"},page:{type:"string"}}),{client:n,json:r}=LL(t),o,i;if(t.limit){if(o=Number.parseInt(t.limit,10),Number.isNaN(o)||o<1||o>100){if(r)return b("--limit must be a positive integer (max 100).");m("--limit must be a positive integer (max 100).");return}}if(t.page){if(i=Number.parseInt(t.page,10),Number.isNaN(i)||i<1){if(r)return b("--page must be a positive integer.");m("--page must be a positive integer.");return}}let c=w(await n.billing.listTransactions({limit:o??10,page:i??1}),"Couldn't fetch billing transactions (check your organization access and try again)",r);if(!r)Pe("Billing transactions");let s=c.items.map((h)=>({occurredAt:h.occurredAt,type:h.transactionType,delta:h.creditDelta,balance:h.balanceAfter}));if(H(Jbe,s,{json:r,count:c.pagination.total}),!r&&c.pagination.hasNext){let h=(i??1)+1;fe({"Next page":`Use --page ${h} for more results.`})}},Bbe=S("summary","Show the billing summary for your organization",async(e)=>{await xbe(e)}).withOptions(_).withExamples(["sazabi billing summary # Show billing summary","sazabi billing summary --json # Output as JSON"]).build(),Wbe=S("usage","Show per-dimension usage for the current or previous cycle",async(e)=>{await qbe(e)}).withOptions({..._,cycle:{type:"string",description:"Which cycle to report (current or previous)"}}).withExamples(["sazabi billing usage # Current cycle usage","sazabi billing usage --cycle previous # Previous cycle usage","sazabi billing usage --json # Output as JSON"]).build(),Zbe=S("transactions","List recent credit ledger transactions",async(e)=>{await Hbe(e)}).withOptions({..._,limit:{type:"string",description:"Max results per page (default 10, max 100)"},page:{type:"string",description:"Page number (1-indexed)"}}).withExamples(["sazabi billing transactions # Recent transactions","sazabi billing transactions --limit 50 # More results","sazabi billing transactions --page 2 # Next page","sazabi billing transactions --json # Output as JSON"]).build(),fF=Q("billing","View billing summary, usage, and transactions").withSubcommands({summary:Bbe,usage:Wbe,transactions:Zbe}).withExamples(["sazabi billing summary # Show billing plan and balance","sazabi billing usage # Show usage for current cycle","sazabi billing transactions # List recent transactions"]).build();ee();var kF=()=>`
|
|
8619
8619
|
_sazabi() {
|
|
8620
8620
|
local -a completions
|