replicas-engine 0.1.696 → 0.1.697

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.
@@ -3843,7 +3843,6 @@ var HOSTED_COMPOSIO_PLUGIN_DEFINITIONS = [
3843
3843
  ["xero", "xero", "OAUTH2", false, "business", "Xero"],
3844
3844
  ["brex", "brex", "API_KEY", false, "business", "Brex"],
3845
3845
  ["buffer", "buffer", "OAUTH2", false, "business", "Buffer"],
3846
- ["docusign", "docusign", "OAUTH2", false, "business", "DocuSign"],
3847
3846
  ["canva", "canva", "OAUTH2", true, "productivity", "Canva"],
3848
3847
  ["webflow", "webflow", "API_KEY", false, "business", "Webflow"],
3849
3848
  ["firecrawl", "firecrawl", "API_KEY", false, "data", "Firecrawl"],
@@ -6766,7 +6765,7 @@ var DEFAULT_CODEX_ARGS = [
6766
6765
  var MIN_CODEX_CLI_VERSION = "0.144.6";
6767
6766
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
6768
6767
  var codexCliVersionEnsured = null;
6769
- var ENGINE_PACKAGE_VERSION = "0.1.696";
6768
+ var ENGINE_PACKAGE_VERSION = "0.1.697";
6770
6769
  var INITIALIZE_METHOD = "initialize";
6771
6770
  var INITIALIZED_NOTIFICATION = "initialized";
6772
6771
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -7,7 +7,7 @@ import {
7
7
  headlessAgentRequestSchema,
8
8
  putPresignedFile,
9
9
  recoverCompletedTurn
10
- } from "./chunk-CFT4CABT.js";
10
+ } from "./chunk-2YKP6MBQ.js";
11
11
 
12
12
  // src/headless-agent.ts
13
13
  import { createHash } from "crypto";
package/dist/src/index.js CHANGED
@@ -192,7 +192,7 @@ import {
192
192
  serializeCanvasContentResponse,
193
193
  shellQuotePosix,
194
194
  stripAgentDiagnosticErrors
195
- } from "./chunk-CFT4CABT.js";
195
+ } from "./chunk-2YKP6MBQ.js";
196
196
 
197
197
  // src/index.ts
198
198
  import { serve } from "@hono/node-server";
@@ -9419,17 +9419,21 @@ async function getDefaultOpencodeModel(provider) {
9419
9419
  function getOpenCodeGoModel(model) {
9420
9420
  return model.replace(/^[^/]+\//, "");
9421
9421
  }
9422
- function opencodeConfig(provider, model) {
9422
+ function opencodeConfig(provider, model, providerModels = [model]) {
9423
9423
  let config;
9424
9424
  if (provider === OPENCODE_GO_PROVIDER) {
9425
9425
  config = {
9426
9426
  enabled_providers: [OPENCODE_GO_PROVIDER],
9427
9427
  model: `${OPENCODE_GO_PROVIDER}/${model}`,
9428
+ provider: {
9429
+ [OPENCODE_GO_PROVIDER]: {
9430
+ models: Object.fromEntries(providerModels.map((candidate) => [candidate, {}]))
9431
+ }
9432
+ },
9428
9433
  permission: OPENCODE_WORKSPACE_PERMISSION,
9429
9434
  share: "disabled"
9430
9435
  };
9431
9436
  } else if (provider === ASTER_PROVIDER) {
9432
- const models = getConfiguredOpencodeModels(model, provider);
9433
9437
  config = {
9434
9438
  enabled_providers: [ASTER_PROVIDER],
9435
9439
  model: `${ASTER_PROVIDER}/${model}`,
@@ -9438,20 +9442,19 @@ function opencodeConfig(provider, model) {
9438
9442
  npm: "@ai-sdk/openai-compatible",
9439
9443
  name: "Aster",
9440
9444
  options: { baseURL: ASTER_BASE_URL },
9441
- models: Object.fromEntries(models.map((candidate) => [candidate, {}]))
9445
+ models: Object.fromEntries(providerModels.map((candidate) => [candidate, {}]))
9442
9446
  }
9443
9447
  },
9444
9448
  permission: OPENCODE_WORKSPACE_PERMISSION,
9445
9449
  share: "disabled"
9446
9450
  };
9447
9451
  } else {
9448
- const models = getConfiguredOpencodeModels(model, provider);
9449
9452
  config = {
9450
9453
  enabled_providers: ["openrouter"],
9451
9454
  model: `openrouter/${model}`,
9452
9455
  provider: {
9453
9456
  openrouter: {
9454
- models: Object.fromEntries(models.map((candidate) => [candidate, {}]))
9457
+ models: Object.fromEntries(providerModels.map((candidate) => [candidate, {}]))
9455
9458
  }
9456
9459
  },
9457
9460
  permission: OPENCODE_WORKSPACE_PERMISSION,
@@ -9460,9 +9463,6 @@ function opencodeConfig(provider, model) {
9460
9463
  }
9461
9464
  return config;
9462
9465
  }
9463
- function getConfiguredOpencodeModels(model, provider) {
9464
- return [.../* @__PURE__ */ new Set([model, ...provider === ASTER_PROVIDER ? ASTER_MODELS : []])];
9465
- }
9466
9466
  function opencodeCommandToSlashCommand(command) {
9467
9467
  return createProviderSlashCommand("opencode", command.name, command.description);
9468
9468
  }
@@ -9592,6 +9592,7 @@ var OpencodeManager = class extends CodingAgentManager {
9592
9592
  historyFile;
9593
9593
  activeAbortController = null;
9594
9594
  configuredModels = /* @__PURE__ */ new Set();
9595
+ clientUpdate = Promise.resolve();
9595
9596
  providerId = "openrouter";
9596
9597
  eventAbortController = null;
9597
9598
  eventSubscriptionReady = Promise.resolve();
@@ -9656,7 +9657,7 @@ var OpencodeManager = class extends CodingAgentManager {
9656
9657
  this.slashCommandsRequest ??= (async () => {
9657
9658
  try {
9658
9659
  const provider = await getOpencodeProvider();
9659
- const client2 = await this.ensureClient(await getDefaultOpencodeModel(provider), provider);
9660
+ const client2 = await this.ensureClient(await getDefaultOpencodeModel(provider), provider, true);
9660
9661
  const directories = [this.workingDirectory, ...await getAgentAdditionalDirectories()];
9661
9662
  const perDirectory = await Promise.all(directories.map(async (directory) => {
9662
9663
  try {
@@ -9686,68 +9687,80 @@ var OpencodeManager = class extends CodingAgentManager {
9686
9687
  })();
9687
9688
  return this.slashCommandsRequest;
9688
9689
  }
9689
- async ensureClient(model, providerId) {
9690
- if (this.client && this.providerId !== providerId) {
9690
+ async ensureClient(model, providerId, reuseExisting = false) {
9691
+ const previousUpdate = this.clientUpdate;
9692
+ let finishUpdate = () => {
9693
+ };
9694
+ this.clientUpdate = new Promise((resolve5) => {
9695
+ finishUpdate = resolve5;
9696
+ });
9697
+ await previousUpdate;
9698
+ try {
9699
+ if (reuseExisting && this.client) return this.client;
9700
+ if (this.client && this.providerId !== providerId) {
9701
+ this.eventAbortController?.abort();
9702
+ this.server?.close();
9703
+ this.client = null;
9704
+ this.server = null;
9705
+ this.configuredModels.clear();
9706
+ }
9707
+ this.providerId = providerId;
9708
+ const configuredModel = providerId === OPENCODE_GO_PROVIDER ? getOpenCodeGoModel(model) : model;
9709
+ const providerModels = providerId === OPENCODE_GO_PROVIDER ? Object.keys((await fetchOpenCodeGoCatalog()).models) : providerId === ASTER_PROVIDER ? ASTER_MODELS : await getAllowedOpenRouterModels();
9710
+ if (!providerModels.includes(configuredModel)) {
9711
+ throw new Error(`Model ${configuredModel} is not available through ${providerId}.`);
9712
+ }
9713
+ if (this.client && this.configuredModels.has(configuredModel)) {
9714
+ return this.client;
9715
+ }
9716
+ if (!await hasOpencodeCredentials(providerId)) {
9717
+ throw new Error("OpenCode Go, Aster, or OpenRouter credentials are not configured for Opencode in this workspace.");
9718
+ }
9691
9719
  this.eventAbortController?.abort();
9692
9720
  this.server?.close();
9693
- this.client = null;
9694
- this.server = null;
9695
- this.configuredModels.clear();
9696
- }
9697
- this.providerId = providerId;
9698
- const configuredModel = providerId === OPENCODE_GO_PROVIDER ? getOpenCodeGoModel(model) : model;
9699
- const providerModels = providerId === ASTER_PROVIDER ? ASTER_MODELS : providerId === "openrouter" ? await getAllowedOpenRouterModels() : null;
9700
- if (providerModels && !providerModels.includes(configuredModel)) {
9701
- throw new Error(`Model ${configuredModel} is not available through ${providerId}.`);
9702
- }
9703
- if (this.client && (providerId === OPENCODE_GO_PROVIDER || this.configuredModels.has(configuredModel))) {
9704
- return this.client;
9705
- }
9706
- if (!await hasOpencodeCredentials(providerId)) {
9707
- throw new Error("OpenCode Go, Aster, or OpenRouter credentials are not configured for Opencode in this workspace.");
9708
- }
9709
- this.eventAbortController?.abort();
9710
- this.server?.close();
9711
- const pathEntries = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
9712
- if (!pathEntries.includes(OPENCODE_SHIM_DIR)) {
9713
- process.env.PATH = [OPENCODE_SHIM_DIR, ...pathEntries].join(delimiter);
9714
- }
9715
- const password = process.env.OPENCODE_SERVER_PASSWORD || randomBytes2(24).toString("base64url");
9716
- process.env.OPENCODE_SERVER_PASSWORD = password;
9717
- const config = opencodeConfig(providerId, configuredModel);
9718
- const mcp = await readProvisionedOpencodeMcpConfig();
9719
- if (mcp && Object.keys(mcp).length > 0) config.mcp = mcp;
9720
- const server = await createOpencodeServer({
9721
- port: 0,
9722
- timeout: OPENCODE_SERVER_STARTUP_TIMEOUT_MS,
9723
- config
9724
- });
9725
- const client2 = createOpencodeClient({
9726
- baseUrl: server.url,
9727
- fetch: opencodeFetch,
9728
- headers: {
9729
- Authorization: `Basic ${Buffer.from(`opencode:${password}`).toString("base64")}`
9730
- }
9731
- });
9732
- this.client = client2;
9733
- this.server = server;
9734
- this.configuredModels = this.providerId === OPENCODE_GO_PROVIDER ? /* @__PURE__ */ new Set() : new Set(getConfiguredOpencodeModels(model, providerId));
9735
- const eventController = new AbortController();
9736
- this.eventAbortController = eventController;
9737
- this.eventSubscriptionReady = new Promise((resolve5) => {
9738
- this.resolveEventSubscriptionReady = resolve5;
9739
- });
9740
- this.subscribeToEvents(client2, eventController).catch((error) => {
9741
- this.resolveEventSubscriptionReady?.();
9742
- this.resolveEventSubscriptionReady = null;
9743
- console.error("[OpencodeManager] Event subscription failed:", error);
9744
- this.recordHistoryEvent("opencode-error", opencodeErrorPayload(error), this.historyFile);
9745
- });
9746
- await Promise.race([
9747
- this.eventSubscriptionReady,
9748
- new Promise((resolve5) => setTimeout(resolve5, 2e3))
9749
- ]);
9750
- return client2;
9721
+ const pathEntries = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
9722
+ if (!pathEntries.includes(OPENCODE_SHIM_DIR)) {
9723
+ process.env.PATH = [OPENCODE_SHIM_DIR, ...pathEntries].join(delimiter);
9724
+ }
9725
+ const password = process.env.OPENCODE_SERVER_PASSWORD || randomBytes2(24).toString("base64url");
9726
+ process.env.OPENCODE_SERVER_PASSWORD = password;
9727
+ const config = opencodeConfig(providerId, configuredModel, providerModels);
9728
+ const mcp = await readProvisionedOpencodeMcpConfig();
9729
+ if (mcp && Object.keys(mcp).length > 0) config.mcp = mcp;
9730
+ const server = await createOpencodeServer({
9731
+ port: 0,
9732
+ timeout: OPENCODE_SERVER_STARTUP_TIMEOUT_MS,
9733
+ config
9734
+ });
9735
+ const client2 = createOpencodeClient({
9736
+ baseUrl: server.url,
9737
+ fetch: opencodeFetch,
9738
+ headers: {
9739
+ Authorization: `Basic ${Buffer.from(`opencode:${password}`).toString("base64")}`
9740
+ }
9741
+ });
9742
+ this.client = client2;
9743
+ this.server = server;
9744
+ this.configuredModels = new Set(providerModels);
9745
+ const eventController = new AbortController();
9746
+ this.eventAbortController = eventController;
9747
+ this.eventSubscriptionReady = new Promise((resolve5) => {
9748
+ this.resolveEventSubscriptionReady = resolve5;
9749
+ });
9750
+ this.subscribeToEvents(client2, eventController).catch((error) => {
9751
+ this.resolveEventSubscriptionReady?.();
9752
+ this.resolveEventSubscriptionReady = null;
9753
+ console.error("[OpencodeManager] Event subscription failed:", error);
9754
+ this.recordHistoryEvent("opencode-error", opencodeErrorPayload(error), this.historyFile);
9755
+ });
9756
+ await Promise.race([
9757
+ this.eventSubscriptionReady,
9758
+ new Promise((resolve5) => setTimeout(resolve5, 2e3))
9759
+ ]);
9760
+ return client2;
9761
+ } finally {
9762
+ finishUpdate();
9763
+ }
9751
9764
  }
9752
9765
  async ensureSession(client2, model, agent, variant) {
9753
9766
  if (this.sessionId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.696",
3
+ "version": "0.1.697",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -1,7 +1,7 @@
1
1
  // Generated from shared/src by generate-workspace-sdk-types.mjs; do not edit.
2
2
  export declare const HOSTED_PLUGIN_AUTH_SCHEMES: readonly ["API_KEY", "BASIC", "BEARER_TOKEN", "DCR_OAUTH", "OAUTH1", "OAUTH2"];
3
3
  export type HostedPluginAuthScheme = (typeof HOSTED_PLUGIN_AUTH_SCHEMES)[number];
4
- declare const HOSTED_COMPOSIO_PLUGIN_DEFINITIONS: readonly [["notion", "notion", "OAUTH2", true, "productivity", "Notion"], ["jira", "jira", "OAUTH2", true, "productivity", "Jira"], ["confluence", "confluence", "OAUTH2", true, "productivity", "Confluence"], ["googlecalendar", "googlecalendar", "OAUTH2", true, "productivity", "Google Calendar"], ["microsoftteams", "microsoft_teams", "OAUTH2", true, "productivity", "Microsoft Teams"], ["outlook", "outlook", "OAUTH2", true, "productivity", "Outlook"], ["bitbucket", "bitbucket", "OAUTH2", true, "data", "Bitbucket"], ["datadog", "datadog", "API_KEY", false, "data", "Datadog"], ["pagerduty", "pagerduty", "OAUTH2", true, "data", "PagerDuty"], ["intercom", "intercom", "OAUTH2", true, "business", "Intercom"], ["zendesk", "zendesk", "OAUTH2", true, "business", "Zendesk"], ["hubspot", "hubspot", "OAUTH2", true, "business", "HubSpot"], ["supabase", "supabase", "OAUTH2", true, "data", "Supabase"], ["figma", "figma", "OAUTH2", true, "productivity", "Figma"], ["launchdarkly", "launch_darkly", "API_KEY", false, "data", "LaunchDarkly"], ["asana", "asana", "OAUTH2", true, "productivity", "Asana"], ["clickup", "clickup", "OAUTH2", true, "productivity", "ClickUp"], ["trello", "trello", "OAUTH1", true, "productivity", "Trello"], ["todoist", "todoist", "OAUTH2", true, "productivity", "Todoist"], ["airtable", "airtable", "OAUTH2", true, "productivity", "Airtable"], ["coda", "coda", "API_KEY", false, "productivity", "Coda"], ["miro", "miro", "OAUTH2", true, "productivity", "Miro"], ["sharepoint", "share_point", "OAUTH2", true, "productivity", "SharePoint"], ["onedrive", "one_drive", "OAUTH2", true, "productivity", "OneDrive"], ["googleslides", "googleslides", "OAUTH2", true, "productivity", "Google Slides"], ["googlemeet", "googlemeet", "OAUTH2", true, "productivity", "Google Meet"], ["googletasks", "googletasks", "OAUTH2", true, "productivity", "Google Tasks"], ["dropbox", "dropbox", "OAUTH2", true, "productivity", "Dropbox"], ["box", "box", "OAUTH2", true, "productivity", "Box"], ["discord", "discord", "OAUTH2", true, "productivity", "Discord"], ["discordbot", "discordbot", "OAUTH2", true, "productivity", "Discord Bot"], ["zoom", "zoom", "OAUTH2", true, "productivity", "Zoom"], ["googlechat", "google_chat", "OAUTH2", false, "productivity", "Google Chat"], ["newrelic", "new_relic", "API_KEY", false, "data", "New Relic"], ["betterstack", "better_stack", "API_KEY", false, "data", "Better Stack"], ["incidentio", "incident_io", "API_KEY", false, "data", "incident.io"], ["grafana", "grafana", "BEARER_TOKEN", false, "data", "Grafana"], ["honeycomb", "honeycomb_mcp", "DCR_OAUTH", false, "data", "Honeycomb MCP"], ["bugsnag", "bugsnag", "API_KEY", false, "data", "Bugsnag"], ["circleci", "circleci", "API_KEY", false, "data", "CircleCI"], ["buildkite", "buildkite", "API_KEY", false, "data", "Buildkite"], ["dockerhub", "docker_hub", "API_KEY", false, "data", "Docker Hub"], ["digitalocean", "digital_ocean", "OAUTH2", true, "data", "DigitalOcean"], ["railway", "railway", "API_KEY", false, "data", "Railway"], ["render", "render", "API_KEY", false, "data", "Render"], ["firebase", "firebase", "API_KEY", false, "data", "Firebase"], ["cloudinary", "cloudinary", "API_KEY", false, "data", "Cloudinary"], ["configcat", "configcat", "API_KEY", false, "data", "ConfigCat"], ["contextdev", "context_dev", "API_KEY", false, "data", "Context.dev"], ["googleanalytics", "google_analytics", "OAUTH2", true, "data", "Google Analytics"], ["googlebigquery", "googlebigquery", "OAUTH2", true, "data", "Google BigQuery"], ["amplitude", "amplitude", "API_KEY", false, "data", "Amplitude"], ["mixpanel", "mixpanel", "BASIC", false, "data", "Mixpanel"], ["segment", "segment", "API_KEY", false, "data", "Segment"], ["databricks", "databricks", "API_KEY", false, "data", "Databricks"], ["snowflake", "snowflake", "OAUTH2", false, "data", "Snowflake"], ["algolia", "algolia", "API_KEY", false, "data", "Algolia"], ["elasticsearch", "elasticsearch", "API_KEY", false, "data", "Elasticsearch"], ["salesforce", "salesforce", "OAUTH2", true, "business", "Salesforce"], ["pipedrive", "pipedrive", "API_KEY", false, "business", "Pipedrive"], ["close", "close", "API_KEY", false, "business", "Close"], ["apollo", "apollo", "API_KEY", false, "business", "Apollo"], ["gong", "gong", "OAUTH2", true, "business", "Gong"], ["freshdesk", "freshdesk", "API_KEY", false, "business", "Freshdesk"], ["helpscout", "help_scout", "OAUTH2", false, "business", "Help Scout"], ["servicenow", "servicenow", "BASIC", false, "business", "ServiceNow"], ["mailchimp", "mailchimp", "OAUTH2", true, "business", "Mailchimp"], ["customerio", "customerio", "API_KEY", false, "business", "Customer.io"], ["klaviyo", "klaviyo", "API_KEY", false, "business", "Klaviyo"], ["shopify", "shopify", "API_KEY", false, "business", "Shopify"], ["quickbooks", "quickbooks", "OAUTH2", true, "business", "QuickBooks"], ["xero", "xero", "OAUTH2", false, "business", "Xero"], ["brex", "brex", "API_KEY", false, "business", "Brex"], ["buffer", "buffer", "OAUTH2", false, "business", "Buffer"], ["docusign", "docusign", "OAUTH2", false, "business", "DocuSign"], ["canva", "canva", "OAUTH2", true, "productivity", "Canva"], ["webflow", "webflow", "API_KEY", false, "business", "Webflow"], ["firecrawl", "firecrawl", "API_KEY", false, "data", "Firecrawl"], ["browserbase", "browserbase_tool", "API_KEY", false, "data", "Browserbase"], ["exa", "exa", "API_KEY", false, "data", "Exa"], ["youtube", "youtube", "OAUTH2", true, "business", "YouTube"], ["twitter", "twitter", "OAUTH2", false, "business", "Twitter/X"], ["instagram", "instagram", "OAUTH2", true, "business", "Instagram"], ["facebook", "facebook", "OAUTH2", true, "business", "Facebook"]];
4
+ declare const HOSTED_COMPOSIO_PLUGIN_DEFINITIONS: readonly [["notion", "notion", "OAUTH2", true, "productivity", "Notion"], ["jira", "jira", "OAUTH2", true, "productivity", "Jira"], ["confluence", "confluence", "OAUTH2", true, "productivity", "Confluence"], ["googlecalendar", "googlecalendar", "OAUTH2", true, "productivity", "Google Calendar"], ["microsoftteams", "microsoft_teams", "OAUTH2", true, "productivity", "Microsoft Teams"], ["outlook", "outlook", "OAUTH2", true, "productivity", "Outlook"], ["bitbucket", "bitbucket", "OAUTH2", true, "data", "Bitbucket"], ["datadog", "datadog", "API_KEY", false, "data", "Datadog"], ["pagerduty", "pagerduty", "OAUTH2", true, "data", "PagerDuty"], ["intercom", "intercom", "OAUTH2", true, "business", "Intercom"], ["zendesk", "zendesk", "OAUTH2", true, "business", "Zendesk"], ["hubspot", "hubspot", "OAUTH2", true, "business", "HubSpot"], ["supabase", "supabase", "OAUTH2", true, "data", "Supabase"], ["figma", "figma", "OAUTH2", true, "productivity", "Figma"], ["launchdarkly", "launch_darkly", "API_KEY", false, "data", "LaunchDarkly"], ["asana", "asana", "OAUTH2", true, "productivity", "Asana"], ["clickup", "clickup", "OAUTH2", true, "productivity", "ClickUp"], ["trello", "trello", "OAUTH1", true, "productivity", "Trello"], ["todoist", "todoist", "OAUTH2", true, "productivity", "Todoist"], ["airtable", "airtable", "OAUTH2", true, "productivity", "Airtable"], ["coda", "coda", "API_KEY", false, "productivity", "Coda"], ["miro", "miro", "OAUTH2", true, "productivity", "Miro"], ["sharepoint", "share_point", "OAUTH2", true, "productivity", "SharePoint"], ["onedrive", "one_drive", "OAUTH2", true, "productivity", "OneDrive"], ["googleslides", "googleslides", "OAUTH2", true, "productivity", "Google Slides"], ["googlemeet", "googlemeet", "OAUTH2", true, "productivity", "Google Meet"], ["googletasks", "googletasks", "OAUTH2", true, "productivity", "Google Tasks"], ["dropbox", "dropbox", "OAUTH2", true, "productivity", "Dropbox"], ["box", "box", "OAUTH2", true, "productivity", "Box"], ["discord", "discord", "OAUTH2", true, "productivity", "Discord"], ["discordbot", "discordbot", "OAUTH2", true, "productivity", "Discord Bot"], ["zoom", "zoom", "OAUTH2", true, "productivity", "Zoom"], ["googlechat", "google_chat", "OAUTH2", false, "productivity", "Google Chat"], ["newrelic", "new_relic", "API_KEY", false, "data", "New Relic"], ["betterstack", "better_stack", "API_KEY", false, "data", "Better Stack"], ["incidentio", "incident_io", "API_KEY", false, "data", "incident.io"], ["grafana", "grafana", "BEARER_TOKEN", false, "data", "Grafana"], ["honeycomb", "honeycomb_mcp", "DCR_OAUTH", false, "data", "Honeycomb MCP"], ["bugsnag", "bugsnag", "API_KEY", false, "data", "Bugsnag"], ["circleci", "circleci", "API_KEY", false, "data", "CircleCI"], ["buildkite", "buildkite", "API_KEY", false, "data", "Buildkite"], ["dockerhub", "docker_hub", "API_KEY", false, "data", "Docker Hub"], ["digitalocean", "digital_ocean", "OAUTH2", true, "data", "DigitalOcean"], ["railway", "railway", "API_KEY", false, "data", "Railway"], ["render", "render", "API_KEY", false, "data", "Render"], ["firebase", "firebase", "API_KEY", false, "data", "Firebase"], ["cloudinary", "cloudinary", "API_KEY", false, "data", "Cloudinary"], ["configcat", "configcat", "API_KEY", false, "data", "ConfigCat"], ["contextdev", "context_dev", "API_KEY", false, "data", "Context.dev"], ["googleanalytics", "google_analytics", "OAUTH2", true, "data", "Google Analytics"], ["googlebigquery", "googlebigquery", "OAUTH2", true, "data", "Google BigQuery"], ["amplitude", "amplitude", "API_KEY", false, "data", "Amplitude"], ["mixpanel", "mixpanel", "BASIC", false, "data", "Mixpanel"], ["segment", "segment", "API_KEY", false, "data", "Segment"], ["databricks", "databricks", "API_KEY", false, "data", "Databricks"], ["snowflake", "snowflake", "OAUTH2", false, "data", "Snowflake"], ["algolia", "algolia", "API_KEY", false, "data", "Algolia"], ["elasticsearch", "elasticsearch", "API_KEY", false, "data", "Elasticsearch"], ["salesforce", "salesforce", "OAUTH2", true, "business", "Salesforce"], ["pipedrive", "pipedrive", "API_KEY", false, "business", "Pipedrive"], ["close", "close", "API_KEY", false, "business", "Close"], ["apollo", "apollo", "API_KEY", false, "business", "Apollo"], ["gong", "gong", "OAUTH2", true, "business", "Gong"], ["freshdesk", "freshdesk", "API_KEY", false, "business", "Freshdesk"], ["helpscout", "help_scout", "OAUTH2", false, "business", "Help Scout"], ["servicenow", "servicenow", "BASIC", false, "business", "ServiceNow"], ["mailchimp", "mailchimp", "OAUTH2", true, "business", "Mailchimp"], ["customerio", "customerio", "API_KEY", false, "business", "Customer.io"], ["klaviyo", "klaviyo", "API_KEY", false, "business", "Klaviyo"], ["shopify", "shopify", "API_KEY", false, "business", "Shopify"], ["quickbooks", "quickbooks", "OAUTH2", true, "business", "QuickBooks"], ["xero", "xero", "OAUTH2", false, "business", "Xero"], ["brex", "brex", "API_KEY", false, "business", "Brex"], ["buffer", "buffer", "OAUTH2", false, "business", "Buffer"], ["canva", "canva", "OAUTH2", true, "productivity", "Canva"], ["webflow", "webflow", "API_KEY", false, "business", "Webflow"], ["firecrawl", "firecrawl", "API_KEY", false, "data", "Firecrawl"], ["browserbase", "browserbase_tool", "API_KEY", false, "data", "Browserbase"], ["exa", "exa", "API_KEY", false, "data", "Exa"], ["youtube", "youtube", "OAUTH2", true, "business", "YouTube"], ["twitter", "twitter", "OAUTH2", false, "business", "Twitter/X"], ["instagram", "instagram", "OAUTH2", true, "business", "Instagram"], ["facebook", "facebook", "OAUTH2", true, "business", "Facebook"]];
5
5
  type HostedComposioPlugin = {
6
6
  id: (typeof HOSTED_COMPOSIO_PLUGIN_DEFINITIONS)[number][0];
7
7
  backend: 'composio';