@squadbase/vite-server 0.1.12-dev.a9ac647 → 0.1.17-dev.24af54e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/cli/index.js +12374 -883
  2. package/dist/connectors/airtable-oauth.js +257 -46
  3. package/dist/connectors/airtable.js +294 -51
  4. package/dist/connectors/amplitude.js +297 -47
  5. package/dist/connectors/anthropic.js +135 -47
  6. package/dist/connectors/asana.js +302 -49
  7. package/dist/connectors/attio.js +277 -49
  8. package/dist/connectors/aws-billing.js +262 -46
  9. package/dist/connectors/azure-sql.js +396 -102
  10. package/dist/connectors/backlog-api-key.js +292 -47
  11. package/dist/connectors/clickup.js +313 -49
  12. package/dist/connectors/cosmosdb.js +280 -50
  13. package/dist/connectors/customerio.js +294 -47
  14. package/dist/connectors/dbt.js +315 -47
  15. package/dist/connectors/freshdesk.js +317 -53
  16. package/dist/connectors/freshsales.js +308 -52
  17. package/dist/connectors/freshservice.js +336 -53
  18. package/dist/connectors/gamma.js +302 -52
  19. package/dist/connectors/gemini.js +134 -47
  20. package/dist/connectors/github.js +361 -49
  21. package/dist/connectors/gmail-oauth.js +179 -7
  22. package/dist/connectors/gmail.js +325 -47
  23. package/dist/connectors/google-ads.js +263 -46
  24. package/dist/connectors/google-analytics-oauth.js +285 -46
  25. package/dist/connectors/google-analytics.js +387 -49
  26. package/dist/connectors/google-audit-log.js +413 -47
  27. package/dist/connectors/google-calendar-oauth.js +234 -46
  28. package/dist/connectors/google-calendar.js +334 -47
  29. package/dist/connectors/google-docs.js +195 -6
  30. package/dist/connectors/google-drive.js +237 -5
  31. package/dist/connectors/google-search-console-oauth.js +231 -46
  32. package/dist/connectors/google-sheets.js +247 -47
  33. package/dist/connectors/google-slides.js +180 -6
  34. package/dist/connectors/grafana.js +307 -49
  35. package/dist/connectors/hubspot-oauth.js +183 -5
  36. package/dist/connectors/hubspot.js +281 -49
  37. package/dist/connectors/influxdb.js +391 -51
  38. package/dist/connectors/intercom-oauth.js +185 -5
  39. package/dist/connectors/intercom.js +277 -49
  40. package/dist/connectors/jdbc.js +737 -110
  41. package/dist/connectors/jira-api-key.js +301 -47
  42. package/dist/connectors/kintone-api-token.js +256 -47
  43. package/dist/connectors/kintone.js +303 -47
  44. package/dist/connectors/linear.js +305 -49
  45. package/dist/connectors/linkedin-ads.js +243 -50
  46. package/dist/connectors/mailchimp-oauth.js +243 -46
  47. package/dist/connectors/mailchimp.js +295 -49
  48. package/dist/connectors/meta-ads-oauth.js +248 -48
  49. package/dist/connectors/meta-ads.js +260 -50
  50. package/dist/connectors/mixpanel.js +313 -47
  51. package/dist/connectors/monday.js +335 -49
  52. package/dist/connectors/mongodb.js +294 -57
  53. package/dist/connectors/notion-oauth.js +206 -5
  54. package/dist/connectors/notion.js +298 -51
  55. package/dist/connectors/openai.js +134 -47
  56. package/dist/connectors/oracle.js +414 -103
  57. package/dist/connectors/outlook-oauth.js +179 -5
  58. package/dist/connectors/powerbi-oauth.js +226 -5
  59. package/dist/connectors/salesforce.js +359 -49
  60. package/dist/connectors/semrush.js +289 -49
  61. package/dist/connectors/sentry.js +264 -50
  62. package/dist/connectors/shopify-oauth.js +162 -5
  63. package/dist/connectors/shopify.js +332 -47
  64. package/dist/connectors/sqlserver.js +390 -102
  65. package/dist/connectors/stripe-api-key.js +244 -46
  66. package/dist/connectors/stripe-oauth.js +177 -5
  67. package/dist/connectors/supabase.js +278 -48
  68. package/dist/connectors/tableau.js +389 -184
  69. package/dist/connectors/tiktok-ads.js +254 -48
  70. package/dist/connectors/wix-store.js +295 -49
  71. package/dist/connectors/zendesk-oauth.js +214 -5
  72. package/dist/connectors/zendesk.js +333 -47
  73. package/dist/index.d.ts +149 -1
  74. package/dist/index.js +13677 -1969
  75. package/dist/main.js +13627 -1927
  76. package/dist/vite-plugin.js +12391 -890
  77. package/package.json +1 -1
@@ -1,48 +1,60 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __esm = (fn, res) => function __init() {
3
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
4
+ };
5
+
1
6
  // ../connectors/src/parameter-definition.ts
2
- var ParameterDefinition = class {
3
- slug;
4
- name;
5
- description;
6
- envVarBaseKey;
7
- type;
8
- secret;
9
- required;
10
- constructor(config) {
11
- this.slug = config.slug;
12
- this.name = config.name;
13
- this.description = config.description;
14
- this.envVarBaseKey = config.envVarBaseKey;
15
- this.type = config.type;
16
- this.secret = config.secret;
17
- this.required = config.required;
18
- }
19
- /**
20
- * Get the parameter value from a ConnectorConnectionObject.
21
- */
22
- getValue(connection2) {
23
- const param = connection2.parameters.find(
24
- (p) => p.parameterSlug === this.slug
25
- );
26
- if (!param || param.value == null) {
27
- throw new Error(
28
- `Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
29
- );
30
- }
31
- return param.value;
32
- }
33
- /**
34
- * Try to get the parameter value. Returns undefined if not found (for optional params).
35
- */
36
- tryGetValue(connection2) {
37
- const param = connection2.parameters.find(
38
- (p) => p.parameterSlug === this.slug
39
- );
40
- if (!param || param.value == null) return void 0;
41
- return param.value;
7
+ var ParameterDefinition;
8
+ var init_parameter_definition = __esm({
9
+ "../connectors/src/parameter-definition.ts"() {
10
+ "use strict";
11
+ ParameterDefinition = class {
12
+ slug;
13
+ name;
14
+ description;
15
+ envVarBaseKey;
16
+ type;
17
+ secret;
18
+ required;
19
+ constructor(config) {
20
+ this.slug = config.slug;
21
+ this.name = config.name;
22
+ this.description = config.description;
23
+ this.envVarBaseKey = config.envVarBaseKey;
24
+ this.type = config.type;
25
+ this.secret = config.secret;
26
+ this.required = config.required;
27
+ }
28
+ /**
29
+ * Get the parameter value from a ConnectorConnectionObject.
30
+ */
31
+ getValue(connection2) {
32
+ const param = connection2.parameters.find(
33
+ (p) => p.parameterSlug === this.slug
34
+ );
35
+ if (!param || param.value == null) {
36
+ throw new Error(
37
+ `Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
38
+ );
39
+ }
40
+ return param.value;
41
+ }
42
+ /**
43
+ * Try to get the parameter value. Returns undefined if not found (for optional params).
44
+ */
45
+ tryGetValue(connection2) {
46
+ const param = connection2.parameters.find(
47
+ (p) => p.parameterSlug === this.slug
48
+ );
49
+ if (!param || param.value == null) return void 0;
50
+ return param.value;
51
+ }
52
+ };
42
53
  }
43
- };
54
+ });
44
55
 
45
56
  // ../connectors/src/connectors/mixpanel/parameters.ts
57
+ init_parameter_definition();
46
58
  var parameters = {
47
59
  serviceAccountUsername: new ParameterDefinition({
48
60
  slug: "service-account-username",
@@ -273,6 +285,28 @@ var ConnectorPlugin = class _ConnectorPlugin {
273
285
  tools;
274
286
  query;
275
287
  checkConnection;
288
+ /**
289
+ * SQPD-1212: Logic-based, rule-driven connection setup. Connectors that
290
+ * implement this expose a step-by-step exploration flow (database/schema/
291
+ * table/etc. discovery) that the dashboard backend drives via the
292
+ * `/connections/:connectionId/setup` endpoint. Implement by delegating to
293
+ * `runSetupFlow` from `setup-flow.ts`.
294
+ */
295
+ setup;
296
+ /**
297
+ * Opt-out of the default "verify before save" behavior on connection
298
+ * creation. The backend invokes `checkConnection` synchronously while
299
+ * creating the connection and aborts (no row inserted) if it fails — this
300
+ * flag disables that for connectors where the check cannot succeed pre-save:
301
+ *
302
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
303
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
304
+ * connectionId, which doesn't exist until the row is saved
305
+ *
306
+ * Exceptions are the explicit position; new credential-input connectors get
307
+ * the default verify-on-create behavior without opt-in.
308
+ */
309
+ skipConnectionCheckOnCreate;
276
310
  constructor(config) {
277
311
  this.slug = config.slug;
278
312
  this.authType = config.authType;
@@ -289,6 +323,8 @@ var ConnectorPlugin = class _ConnectorPlugin {
289
323
  this.tools = config.tools;
290
324
  this.query = config.query;
291
325
  this.checkConnection = config.checkConnection;
326
+ this.setup = config.setup;
327
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
292
328
  }
293
329
  get connectorKey() {
294
330
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -353,6 +389,46 @@ var ConnectorPlugin = class _ConnectorPlugin {
353
389
  }
354
390
  };
355
391
 
392
+ // ../connectors/src/setup-flow.ts
393
+ async function runSetupFlow(flow, params, ctx, config) {
394
+ const runtime = {
395
+ params,
396
+ language: ctx.language,
397
+ config
398
+ };
399
+ let state = flow.initialState();
400
+ let answerIdx = 0;
401
+ for (const step of flow.steps) {
402
+ const ans = ctx.answers[answerIdx];
403
+ if (ans && ans.questionSlug === step.slug) {
404
+ state = step.applyAnswer(state, ans.answer);
405
+ answerIdx += 1;
406
+ continue;
407
+ }
408
+ if (step.type === "text") {
409
+ return {
410
+ type: "nextQuestion",
411
+ questionSlug: step.slug,
412
+ question: step.question[ctx.language],
413
+ questionType: "text"
414
+ };
415
+ }
416
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
417
+ if (options.length === 0) {
418
+ continue;
419
+ }
420
+ return {
421
+ type: "nextQuestion",
422
+ questionSlug: step.slug,
423
+ question: step.question[ctx.language],
424
+ questionType: step.type,
425
+ options
426
+ };
427
+ }
428
+ const dataInvestigationResult = await flow.finalize(state, runtime);
429
+ return { type: "fulfilled", dataInvestigationResult };
430
+ }
431
+
356
432
  // ../connectors/src/auth-types.ts
357
433
  var AUTH_TYPES = {
358
434
  OAUTH: "oauth",
@@ -383,6 +459,137 @@ NOTE: The Query API endpoints (insights, funnels, retention) require a bookmark_
383
459
  }
384
460
  });
385
461
 
462
+ // ../connectors/src/connectors/mixpanel/utils.ts
463
+ function getQueryBaseUrl(params) {
464
+ const region = params[parameters.region.slug];
465
+ if (region === "eu") return "https://eu.mixpanel.com/api";
466
+ if (region === "in") return "https://in.mixpanel.com/api";
467
+ return "https://mixpanel.com/api";
468
+ }
469
+ async function apiFetch(params, path2, init) {
470
+ const username = params[parameters.serviceAccountUsername.slug];
471
+ const secret = params[parameters.serviceAccountSecret.slug];
472
+ const projectId = params[parameters.projectId.slug];
473
+ if (!username || !secret || !projectId) {
474
+ throw new Error(
475
+ "mixpanel: missing required parameters: service-account-username, service-account-secret, project-id"
476
+ );
477
+ }
478
+ const base = getQueryBaseUrl(params);
479
+ const url = new URL(`${base}${path2.startsWith("/") ? "" : "/"}${path2}`);
480
+ if (!url.searchParams.has("project_id")) {
481
+ url.searchParams.set("project_id", projectId);
482
+ }
483
+ const headers = new Headers(init?.headers);
484
+ headers.set("Authorization", `Basic ${btoa(`${username}:${secret}`)}`);
485
+ if (!headers.has("Accept")) headers.set("Accept", "application/json");
486
+ return fetch(url.toString(), { ...init, headers });
487
+ }
488
+
489
+ // ../connectors/src/connectors/mixpanel/setup-flow.ts
490
+ var MIXPANEL_SETUP_MAX_ENTITIES = 10;
491
+ var MIXPANEL_SETUP_MAX_EVENTS = 50;
492
+ var ENTITY_LABELS = {
493
+ events: { en: "Events", ja: "Events (\u30A4\u30D9\u30F3\u30C8)" },
494
+ userProperties: {
495
+ en: "User properties",
496
+ ja: "User properties (\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D1\u30C6\u30A3)"
497
+ },
498
+ cohorts: { en: "Cohorts", ja: "Cohorts (\u30B3\u30DB\u30FC\u30C8)" },
499
+ funnels: { en: "Funnels", ja: "Funnels (\u30D5\u30A1\u30CD\u30EB)" },
500
+ retentionReports: {
501
+ en: "Retention reports",
502
+ ja: "Retention reports (\u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u30EC\u30DD\u30FC\u30C8)"
503
+ }
504
+ };
505
+ var ENTITY_DESCRIPTIONS = {
506
+ events: {
507
+ en: "Tracked event names.",
508
+ ja: "\u8FFD\u8DE1\u3055\u308C\u3066\u3044\u308B\u30A4\u30D9\u30F3\u30C8\u540D\u3002"
509
+ },
510
+ userProperties: {
511
+ en: "User-level properties available for segmentation.",
512
+ ja: "\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u3048\u308B\u30E6\u30FC\u30B6\u30FC\u30EC\u30D9\u30EB\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u3002"
513
+ },
514
+ cohorts: {
515
+ en: "Saved user cohorts.",
516
+ ja: "\u4FDD\u5B58\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u30B3\u30DB\u30FC\u30C8\u3002"
517
+ },
518
+ funnels: {
519
+ en: "Saved funnel definitions.",
520
+ ja: "\u4FDD\u5B58\u6E08\u307F\u306E\u30D5\u30A1\u30CD\u30EB\u5B9A\u7FA9\u3002"
521
+ },
522
+ retentionReports: {
523
+ en: "Saved retention reports.",
524
+ ja: "\u4FDD\u5B58\u6E08\u307F\u306E\u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u30EC\u30DD\u30FC\u30C8\u3002"
525
+ }
526
+ };
527
+ var ENTITY_VALUES = [
528
+ "events",
529
+ "userProperties",
530
+ "cohorts",
531
+ "funnels",
532
+ "retentionReports"
533
+ ];
534
+ async function fetchEventNames(params) {
535
+ try {
536
+ const res = await apiFetch(params, "/2.0/events/names?type=general");
537
+ if (!res.ok) return [];
538
+ const data = await res.json();
539
+ if (!Array.isArray(data)) return [];
540
+ return data.filter((v) => typeof v === "string");
541
+ } catch {
542
+ return [];
543
+ }
544
+ }
545
+ var mixpanelSetupFlow = {
546
+ initialState: () => ({}),
547
+ steps: [
548
+ {
549
+ slug: "entities",
550
+ type: "multiSelect",
551
+ question: {
552
+ ja: "\u5BFE\u8C61\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
553
+ en: "Select target entities (multi-select allowed)"
554
+ },
555
+ async fetchOptions(_state, rt) {
556
+ return ENTITY_VALUES.map((value) => ({
557
+ value,
558
+ label: ENTITY_LABELS[value][rt.language]
559
+ }));
560
+ },
561
+ applyAnswer: (state, answer) => ({ ...state, entities: answer })
562
+ }
563
+ ],
564
+ async finalize(state, rt) {
565
+ if (!state.entities) {
566
+ throw new Error("Mixpanel setup: incomplete state on finalize");
567
+ }
568
+ const selected = state.entities.filter(
569
+ (e) => ENTITY_VALUES.includes(e)
570
+ ).slice(0, MIXPANEL_SETUP_MAX_ENTITIES);
571
+ const sections = ["## Mixpanel", ""];
572
+ for (const entity of selected) {
573
+ sections.push(`### ${ENTITY_LABELS[entity].en}`, "");
574
+ sections.push(ENTITY_DESCRIPTIONS[entity][rt.language], "");
575
+ if (entity === "events") {
576
+ const names = (await fetchEventNames(rt.params)).slice(
577
+ 0,
578
+ MIXPANEL_SETUP_MAX_EVENTS
579
+ );
580
+ if (names.length > 0) {
581
+ sections.push("Event names:", "");
582
+ for (const name of names) {
583
+ sections.push(`- ${name}`);
584
+ }
585
+ sections.push("");
586
+ }
587
+ }
588
+ }
589
+ return sections.join("\n");
590
+ }
591
+ };
592
+
386
593
  // ../connectors/src/connectors/mixpanel/tools/request.ts
387
594
  import { z } from "zod";
388
595
  var REQUEST_TIMEOUT_MS = 6e4;
@@ -640,7 +847,46 @@ export default async function handler(c: Context) {
640
847
 
641
848
  \u91CD\u8981: Insights\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F\u3001Mixpanel UI\u306E\u65E2\u5B58\u30EC\u30DD\u30FC\u30C8\u306Ebookmark_id\u304C\u5FC5\u8981\u3067\u3059\u3002\u30A2\u30C9\u30DB\u30C3\u30AF\u306A\u30A4\u30D9\u30F3\u30C8\u5206\u6790\u306B\u306F\u3001Export API\u3067\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u53D6\u5F97\u3057\u3001\u30B3\u30FC\u30C9\u4E0A\u3067\u96C6\u8A08\u3057\u3066\u304F\u3060\u3055\u3044\u3002Export API\u304C\u6700\u3082\u67D4\u8EDF\u3067\u5E83\u304F\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u3059\u3002`
642
849
  },
643
- tools
850
+ tools,
851
+ setup: (params, ctx, config) => runSetupFlow(mixpanelSetupFlow, params, ctx, config),
852
+ async checkConnection(params, _config) {
853
+ const username = params[parameters.serviceAccountUsername.slug];
854
+ const secret = params[parameters.serviceAccountSecret.slug];
855
+ const projectId = params[parameters.projectId.slug];
856
+ if (!username || !secret || !projectId) {
857
+ return {
858
+ success: false,
859
+ error: "Missing required parameters: service-account-username, service-account-secret, and project-id"
860
+ };
861
+ }
862
+ const region = params[parameters.region.slug];
863
+ const queryBase = region === "eu" ? "https://eu.mixpanel.com/api/query" : region === "in" ? "https://in.mixpanel.com/api/query" : "https://mixpanel.com/api/query";
864
+ try {
865
+ const res = await fetch(
866
+ `${queryBase}/events/names?project_id=${encodeURIComponent(projectId)}&type=general&limit=1`,
867
+ {
868
+ method: "GET",
869
+ headers: {
870
+ Authorization: `Basic ${btoa(`${username}:${secret}`)}`,
871
+ Accept: "application/json"
872
+ }
873
+ }
874
+ );
875
+ if (!res.ok) {
876
+ const errorText = await res.text().catch(() => res.statusText);
877
+ return {
878
+ success: false,
879
+ error: `Mixpanel API failed: HTTP ${res.status} ${errorText}`
880
+ };
881
+ }
882
+ return { success: true };
883
+ } catch (error) {
884
+ return {
885
+ success: false,
886
+ error: error instanceof Error ? error.message : String(error)
887
+ };
888
+ }
889
+ }
644
890
  });
645
891
 
646
892
  // src/connectors/create-connector-sdk.ts
@@ -669,6 +915,7 @@ function resolveEnvVarOptional(entry, key) {
669
915
  import { getContext } from "hono/context-storage";
670
916
  import { getCookie } from "hono/cookie";
671
917
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
918
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
672
919
  function normalizeHeaders(input) {
673
920
  const out = {};
674
921
  if (!input) return out;
@@ -677,6 +924,11 @@ function normalizeHeaders(input) {
677
924
  });
678
925
  return out;
679
926
  }
927
+ function extractInputUrl(input) {
928
+ if (typeof input === "string") return input;
929
+ if (input instanceof URL) return input.href;
930
+ return input.url;
931
+ }
680
932
  function createSandboxProxyFetch(connectionId) {
681
933
  return async (input, init) => {
682
934
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -686,10 +938,17 @@ function createSandboxProxyFetch(connectionId) {
686
938
  "Connection proxy is not configured. Please check your deployment settings."
687
939
  );
688
940
  }
689
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
941
+ const originalUrl = extractInputUrl(input);
942
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
943
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
944
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
945
+ return fetch(sessionUrl, {
946
+ method: "POST",
947
+ headers: { Authorization: `Bearer ${token}` }
948
+ });
949
+ }
690
950
  const originalMethod = init?.method ?? "GET";
691
951
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
692
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
693
952
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
694
953
  return fetch(proxyUrl, {
695
954
  method: "POST",
@@ -715,10 +974,9 @@ function createDeployedAppProxyFetch(connectionId) {
715
974
  }
716
975
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
717
976
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
977
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
718
978
  return async (input, init) => {
719
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
720
- const originalMethod = init?.method ?? "GET";
721
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
979
+ const originalUrl = extractInputUrl(input);
722
980
  const c = getContext();
723
981
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
724
982
  if (!appSession) {
@@ -726,6 +984,14 @@ function createDeployedAppProxyFetch(connectionId) {
726
984
  "No authentication method available for connection proxy."
727
985
  );
728
986
  }
987
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
988
+ return fetch(sessionUrl, {
989
+ method: "POST",
990
+ headers: { Authorization: `Bearer ${appSession}` }
991
+ });
992
+ }
993
+ const originalMethod = init?.method ?? "GET";
994
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
729
995
  return fetch(proxyUrl, {
730
996
  method: "POST",
731
997
  headers: {