@squadbase/vite-server 0.1.17-dev.7408ec4 → 0.1.17-dev.9d1f952

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 (74) hide show
  1. package/dist/cli/index.js +32 -51
  2. package/dist/connectors/airtable-oauth.js +6 -0
  3. package/dist/connectors/airtable.js +6 -0
  4. package/dist/connectors/amplitude.js +6 -0
  5. package/dist/connectors/asana.js +6 -0
  6. package/dist/connectors/attio.js +6 -0
  7. package/dist/connectors/aws-billing.js +6 -0
  8. package/dist/connectors/azure-sql.js +6 -0
  9. package/dist/connectors/backlog-api-key.js +6 -0
  10. package/dist/connectors/clickup.js +6 -0
  11. package/dist/connectors/cosmosdb.js +6 -0
  12. package/dist/connectors/customerio.js +6 -0
  13. package/dist/connectors/dbt.js +6 -0
  14. package/dist/connectors/freshdesk.js +6 -0
  15. package/dist/connectors/freshsales.js +6 -0
  16. package/dist/connectors/freshservice.js +6 -0
  17. package/dist/connectors/gamma.js +6 -0
  18. package/dist/connectors/github.js +6 -0
  19. package/dist/connectors/gmail-oauth.js +6 -0
  20. package/dist/connectors/gmail.js +6 -0
  21. package/dist/connectors/google-ads.js +6 -0
  22. package/dist/connectors/google-analytics-oauth.js +6 -0
  23. package/dist/connectors/google-analytics.js +53 -64
  24. package/dist/connectors/google-audit-log.js +6 -0
  25. package/dist/connectors/google-calendar-oauth.js +6 -0
  26. package/dist/connectors/google-calendar.js +6 -0
  27. package/dist/connectors/google-docs.js +6 -0
  28. package/dist/connectors/google-drive.js +6 -0
  29. package/dist/connectors/google-search-console-oauth.js +6 -0
  30. package/dist/connectors/google-sheets.js +6 -0
  31. package/dist/connectors/google-slides.js +6 -0
  32. package/dist/connectors/grafana.js +6 -0
  33. package/dist/connectors/hubspot-oauth.js +6 -0
  34. package/dist/connectors/hubspot.js +6 -0
  35. package/dist/connectors/influxdb.js +6 -0
  36. package/dist/connectors/intercom-oauth.js +6 -0
  37. package/dist/connectors/intercom.js +6 -0
  38. package/dist/connectors/jdbc.js +6 -0
  39. package/dist/connectors/jira-api-key.js +6 -0
  40. package/dist/connectors/kintone-api-token.js +6 -0
  41. package/dist/connectors/kintone.js +6 -0
  42. package/dist/connectors/linear.js +6 -0
  43. package/dist/connectors/linkedin-ads.js +6 -0
  44. package/dist/connectors/mailchimp-oauth.js +6 -0
  45. package/dist/connectors/mailchimp.js +6 -0
  46. package/dist/connectors/meta-ads-oauth.js +6 -0
  47. package/dist/connectors/meta-ads.js +6 -0
  48. package/dist/connectors/mixpanel.js +6 -0
  49. package/dist/connectors/monday.js +6 -0
  50. package/dist/connectors/mongodb.js +6 -0
  51. package/dist/connectors/notion-oauth.js +6 -0
  52. package/dist/connectors/notion.js +6 -0
  53. package/dist/connectors/oracle.js +6 -0
  54. package/dist/connectors/outlook-oauth.js +6 -0
  55. package/dist/connectors/powerbi-oauth.js +6 -0
  56. package/dist/connectors/salesforce.js +6 -0
  57. package/dist/connectors/semrush.js +6 -0
  58. package/dist/connectors/sentry.js +6 -0
  59. package/dist/connectors/shopify-oauth.js +6 -0
  60. package/dist/connectors/shopify.js +6 -0
  61. package/dist/connectors/sqlserver.js +6 -0
  62. package/dist/connectors/stripe-api-key.js +6 -0
  63. package/dist/connectors/stripe-oauth.js +6 -0
  64. package/dist/connectors/supabase.js +6 -0
  65. package/dist/connectors/tableau.js +6 -0
  66. package/dist/connectors/tiktok-ads.js +6 -0
  67. package/dist/connectors/wix-store.js +6 -0
  68. package/dist/connectors/zendesk-oauth.js +6 -0
  69. package/dist/connectors/zendesk.js +6 -0
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.js +43 -57
  72. package/dist/main.js +32 -51
  73. package/dist/vite-plugin.js +32 -51
  74. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -804,6 +804,12 @@ async function runSetupFlow(flow, params, ctx, config) {
804
804
  }
805
805
  const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
806
806
  if (step.type === "text") {
807
+ if (step.fetchOptions) {
808
+ const options2 = await step.fetchOptions(state, runtime);
809
+ if (options2.length === 0) {
810
+ continue;
811
+ }
812
+ }
807
813
  return {
808
814
  type: "nextQuestion",
809
815
  questionSlug: step.slug,
@@ -7601,15 +7607,6 @@ var parameters13 = {
7601
7607
  type: "base64EncodedJson",
7602
7608
  secret: true,
7603
7609
  required: true
7604
- }),
7605
- propertyId: new ParameterDefinition({
7606
- slug: "property-id",
7607
- name: "Google Analytics Property ID",
7608
- description: "The Google Analytics 4 property ID (e.g., 123456789). Automatically set during the setup flow.",
7609
- envVarBaseKey: "GA_PROPERTY_ID",
7610
- type: "text",
7611
- secret: false,
7612
- required: false
7613
7610
  })
7614
7611
  };
7615
7612
 
@@ -7847,40 +7844,23 @@ var googleAnalyticsSetupFlow = {
7847
7844
  return [];
7848
7845
  }
7849
7846
  },
7850
- applyAnswer: (state, answer) => ({ ...state, properties: answer }),
7851
- toParameterUpdates: (state) => {
7852
- const first = state.properties?.find((v) => v !== ALL_PROPERTIES);
7853
- return first ? [{ slug: parameters13.propertyId.slug, value: first }] : [];
7854
- }
7847
+ applyAnswer: (state, answer) => ({ ...state, properties: answer })
7855
7848
  },
7856
7849
  {
7857
7850
  slug: "manualPropertyId",
7858
- type: "select",
7859
- allowFreeText: true,
7851
+ type: "text",
7860
7852
  question: {
7861
7853
  ja: "GA4 \u30D7\u30ED\u30D1\u30C6\u30A3 ID \u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: 123456789\uFF09\u3002GA4 \u7BA1\u7406\u753B\u9762 > \u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002",
7862
7854
  en: "Enter your GA4 Property ID (e.g., 123456789). Found in GA4 Admin > Property Settings."
7863
7855
  },
7864
- async fetchOptions(state, rt) {
7856
+ async fetchOptions(state) {
7865
7857
  if (state.properties?.length) return [];
7866
- const existing = rt.params[parameters13.propertyId.slug];
7867
- return existing ? [{ value: existing, label: existing }] : [
7868
- {
7869
- value: "example",
7870
- label: rt.language === "ja" ? "\u4F8B: 123456789" : "Example: 123456789"
7871
- }
7872
- ];
7858
+ return [{ value: "_show", label: "" }];
7873
7859
  },
7874
7860
  applyAnswer: (state, answer) => ({
7875
7861
  ...state,
7876
7862
  manualPropertyId: answer[0]
7877
- }),
7878
- toParameterUpdates: (state) => state.manualPropertyId ? [
7879
- {
7880
- slug: parameters13.propertyId.slug,
7881
- value: state.manualPropertyId
7882
- }
7883
- ] : []
7863
+ })
7884
7864
  }
7885
7865
  ],
7886
7866
  async finalize(state, rt) {
@@ -7936,7 +7916,7 @@ var googleAnalyticsSetupFlow = {
7936
7916
  }
7937
7917
  return sections.join("\n");
7938
7918
  }
7939
- const propertyId = state.manualPropertyId ?? rt.params[parameters13.propertyId.slug];
7919
+ const propertyId = state.manualPropertyId;
7940
7920
  if (propertyId) {
7941
7921
  sections.push(`### Property: ${propertyId}`, "");
7942
7922
  const { dimensions, metrics } = await getMetadata(
@@ -7947,7 +7927,7 @@ var googleAnalyticsSetupFlow = {
7947
7927
  return sections.join("\n");
7948
7928
  }
7949
7929
  sections.push(
7950
- "_Could not list GA4 accounts. Please enable the Google Analytics Admin API in your GCP project, or set the Property ID parameter manually._",
7930
+ "_Could not list GA4 accounts. Please enable the Google Analytics Admin API in your GCP project. Property ID can be specified per request at runtime._",
7951
7931
  ""
7952
7932
  );
7953
7933
  return sections.join("\n");
@@ -7961,8 +7941,9 @@ var REQUEST_TIMEOUT_MS10 = 6e4;
7961
7941
  var inputSchema20 = z20.object({
7962
7942
  toolUseIntent: z20.string().optional().describe("Brief description of what you intend to accomplish with this tool call"),
7963
7943
  connectionId: z20.string().describe("ID of the Google Analytics connection to use"),
7944
+ propertyId: z20.string().describe("GA4 property ID (e.g., '123456789')"),
7964
7945
  method: z20.enum(["GET", "POST"]).describe("HTTP method"),
7965
- path: z20.string().describe("API path (e.g., 'properties/{propertyId}:runReport'). {propertyId} is automatically replaced."),
7946
+ path: z20.string().describe("API path (e.g., 'properties/{propertyId}:runReport'). {propertyId} is replaced with the propertyId parameter."),
7966
7947
  body: z20.record(z20.string(), z20.unknown()).optional().describe("POST request body (JSON)")
7967
7948
  });
7968
7949
  var outputSchema20 = z20.discriminatedUnion("success", [
@@ -7980,10 +7961,10 @@ var requestTool3 = new ConnectorTool({
7980
7961
  name: "request",
7981
7962
  description: `Send authenticated requests to the Google Analytics Data API.
7982
7963
  Authentication is handled automatically using a service account.
7983
- {propertyId} in the path is automatically replaced with the connection's property-id.`,
7964
+ {propertyId} in the path is automatically replaced with the propertyId parameter.`,
7984
7965
  inputSchema: inputSchema20,
7985
7966
  outputSchema: outputSchema20,
7986
- async execute({ connectionId, method, path: path6, body }, connections) {
7967
+ async execute({ connectionId, propertyId, method, path: path6, body }, connections) {
7987
7968
  const connection2 = connections.find((c) => c.id === connectionId);
7988
7969
  if (!connection2) {
7989
7970
  return { success: false, error: `Connection ${connectionId} not found` };
@@ -7992,7 +7973,6 @@ Authentication is handled automatically using a service account.
7992
7973
  try {
7993
7974
  const { GoogleAuth } = await import("google-auth-library");
7994
7975
  const keyJsonBase64 = parameters13.serviceAccountKeyJsonBase64.getValue(connection2);
7995
- const propertyId = parameters13.propertyId.getValue(connection2);
7996
7976
  const credentials = JSON.parse(
7997
7977
  Buffer.from(keyJsonBase64, "base64").toString("utf-8")
7998
7978
  );
@@ -8052,7 +8032,7 @@ var googleAnalyticsConnector = new ConnectorPlugin({
8052
8032
  systemPrompt: {
8053
8033
  en: `### Tools
8054
8034
 
8055
- - \`google-analytics-service-account_request\`: The only way to call the GA4 Data API. Use it to fetch metadata, run reports, or run realtime reports. See the GA4 Data API Reference below for available endpoints and request bodies.
8035
+ - \`google-analytics-service-account_request\`: The only way to call the GA4 Data API. Use it to fetch metadata, run reports, or run realtime reports. Requires a \`propertyId\` parameter. See the GA4 Data API Reference below for available endpoints and request bodies.
8056
8036
 
8057
8037
  ### Business Logic
8058
8038
 
@@ -8061,9 +8041,11 @@ The business logic type for this connector is "typescript". Use the connector SD
8061
8041
  SDK methods (client created via \`connection(connectionId)\`):
8062
8042
  - \`client.runReport(request)\` \u2014 run a GA4 report
8063
8043
  - \`client.runRealtimeReport(request)\` \u2014 run a realtime report
8064
- - \`client.getMetadata()\` \u2014 fetch available dimensions/metrics
8044
+ - \`client.getMetadata(request)\` \u2014 fetch available dimensions/metrics
8065
8045
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
8066
8046
 
8047
+ **IMPORTANT**: You MUST always include \`propertyId\` in every SDK method call. The property ID is obtained during the setup flow. Without it, the request will fail.
8048
+
8067
8049
  \`\`\`ts
8068
8050
  import type { Context } from "hono";
8069
8051
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
@@ -8071,12 +8053,14 @@ import { connection } from "@squadbase/vite-server/connectors/google-analytics";
8071
8053
  const ga = connection("<connectionId>");
8072
8054
 
8073
8055
  export default async function handler(c: Context) {
8074
- const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8056
+ const { propertyId, startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8057
+ propertyId: string;
8075
8058
  startDate?: string;
8076
8059
  endDate?: string;
8077
8060
  }>();
8078
8061
 
8079
8062
  const { rows } = await ga.runReport({
8063
+ propertyId,
8080
8064
  dateRanges: [{ startDate, endDate }],
8081
8065
  dimensions: [{ name: "date" }],
8082
8066
  metrics: [{ name: "activeUsers" }, { name: "sessions" }],
@@ -8120,7 +8104,7 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8120
8104
  - Relative: \`"today"\`, \`"yesterday"\`, \`"7daysAgo"\`, \`"30daysAgo"\``,
8121
8105
  ja: `### \u30C4\u30FC\u30EB
8122
8106
 
8123
- - \`google-analytics-service-account_request\`: GA4 Data API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CGA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
8107
+ - \`google-analytics-service-account_request\`: GA4 Data API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\`propertyId\` \u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u304C\u5FC5\u8981\u3067\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CGA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
8124
8108
 
8125
8109
  ### Business Logic
8126
8110
 
@@ -8129,9 +8113,11 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8129
8113
  SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
8130
8114
  - \`client.runReport(request)\` \u2014 GA4\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
8131
8115
  - \`client.runRealtimeReport(request)\` \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
8132
- - \`client.getMetadata()\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97
8116
+ - \`client.getMetadata(request)\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97
8133
8117
  - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
8134
8118
 
8119
+ **\u91CD\u8981**: \u3059\u3079\u3066\u306ESDK\u30E1\u30BD\u30C3\u30C9\u547C\u3073\u51FA\u3057\u306B\u306F\u5FC5\u305A \`propertyId\` \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u30D7\u30ED\u30D1\u30C6\u30A3ID\u306F\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u30D5\u30ED\u30FC\u3067\u53D6\u5F97\u3055\u308C\u307E\u3059\u3002\u6307\u5B9A\u3057\u306A\u3044\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u5931\u6557\u3057\u307E\u3059\u3002
8120
+
8135
8121
  \`\`\`ts
8136
8122
  import type { Context } from "hono";
8137
8123
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
@@ -8139,12 +8125,14 @@ import { connection } from "@squadbase/vite-server/connectors/google-analytics";
8139
8125
  const ga = connection("<connectionId>");
8140
8126
 
8141
8127
  export default async function handler(c: Context) {
8142
- const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8128
+ const { propertyId, startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8129
+ propertyId: string;
8143
8130
  startDate?: string;
8144
8131
  endDate?: string;
8145
8132
  }>();
8146
8133
 
8147
8134
  const { rows } = await ga.runReport({
8135
+ propertyId,
8148
8136
  dateRanges: [{ startDate, endDate }],
8149
8137
  dimensions: [{ name: "date" }],
8150
8138
  metrics: [{ name: "activeUsers" }, { name: "sessions" }],
@@ -8197,15 +8185,8 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8197
8185
  error: "google-analytics: missing service account key"
8198
8186
  };
8199
8187
  }
8200
- const propertyId = params[parameters13.propertyId.slug];
8201
- if (!propertyId) {
8202
- return { success: true };
8203
- }
8204
8188
  try {
8205
- const res = await dataFetch(
8206
- params,
8207
- `/properties/${propertyId}/metadata`
8208
- );
8189
+ const res = await dataFetch(params, `/metadata`);
8209
8190
  if (!res.ok) {
8210
8191
  const body = await res.text().catch(() => res.statusText);
8211
8192
  return {
@@ -805,6 +805,12 @@ async function runSetupFlow(flow, params, ctx, config) {
805
805
  }
806
806
  const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
807
807
  if (step.type === "text") {
808
+ if (step.fetchOptions) {
809
+ const options2 = await step.fetchOptions(state, runtime);
810
+ if (options2.length === 0) {
811
+ continue;
812
+ }
813
+ }
808
814
  return {
809
815
  type: "nextQuestion",
810
816
  questionSlug: step.slug,
@@ -7602,15 +7608,6 @@ var parameters13 = {
7602
7608
  type: "base64EncodedJson",
7603
7609
  secret: true,
7604
7610
  required: true
7605
- }),
7606
- propertyId: new ParameterDefinition({
7607
- slug: "property-id",
7608
- name: "Google Analytics Property ID",
7609
- description: "The Google Analytics 4 property ID (e.g., 123456789). Automatically set during the setup flow.",
7610
- envVarBaseKey: "GA_PROPERTY_ID",
7611
- type: "text",
7612
- secret: false,
7613
- required: false
7614
7611
  })
7615
7612
  };
7616
7613
 
@@ -7848,40 +7845,23 @@ var googleAnalyticsSetupFlow = {
7848
7845
  return [];
7849
7846
  }
7850
7847
  },
7851
- applyAnswer: (state, answer) => ({ ...state, properties: answer }),
7852
- toParameterUpdates: (state) => {
7853
- const first = state.properties?.find((v) => v !== ALL_PROPERTIES);
7854
- return first ? [{ slug: parameters13.propertyId.slug, value: first }] : [];
7855
- }
7848
+ applyAnswer: (state, answer) => ({ ...state, properties: answer })
7856
7849
  },
7857
7850
  {
7858
7851
  slug: "manualPropertyId",
7859
- type: "select",
7860
- allowFreeText: true,
7852
+ type: "text",
7861
7853
  question: {
7862
7854
  ja: "GA4 \u30D7\u30ED\u30D1\u30C6\u30A3 ID \u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: 123456789\uFF09\u3002GA4 \u7BA1\u7406\u753B\u9762 > \u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002",
7863
7855
  en: "Enter your GA4 Property ID (e.g., 123456789). Found in GA4 Admin > Property Settings."
7864
7856
  },
7865
- async fetchOptions(state, rt) {
7857
+ async fetchOptions(state) {
7866
7858
  if (state.properties?.length) return [];
7867
- const existing = rt.params[parameters13.propertyId.slug];
7868
- return existing ? [{ value: existing, label: existing }] : [
7869
- {
7870
- value: "example",
7871
- label: rt.language === "ja" ? "\u4F8B: 123456789" : "Example: 123456789"
7872
- }
7873
- ];
7859
+ return [{ value: "_show", label: "" }];
7874
7860
  },
7875
7861
  applyAnswer: (state, answer) => ({
7876
7862
  ...state,
7877
7863
  manualPropertyId: answer[0]
7878
- }),
7879
- toParameterUpdates: (state) => state.manualPropertyId ? [
7880
- {
7881
- slug: parameters13.propertyId.slug,
7882
- value: state.manualPropertyId
7883
- }
7884
- ] : []
7864
+ })
7885
7865
  }
7886
7866
  ],
7887
7867
  async finalize(state, rt) {
@@ -7937,7 +7917,7 @@ var googleAnalyticsSetupFlow = {
7937
7917
  }
7938
7918
  return sections.join("\n");
7939
7919
  }
7940
- const propertyId = state.manualPropertyId ?? rt.params[parameters13.propertyId.slug];
7920
+ const propertyId = state.manualPropertyId;
7941
7921
  if (propertyId) {
7942
7922
  sections.push(`### Property: ${propertyId}`, "");
7943
7923
  const { dimensions, metrics } = await getMetadata(
@@ -7948,7 +7928,7 @@ var googleAnalyticsSetupFlow = {
7948
7928
  return sections.join("\n");
7949
7929
  }
7950
7930
  sections.push(
7951
- "_Could not list GA4 accounts. Please enable the Google Analytics Admin API in your GCP project, or set the Property ID parameter manually._",
7931
+ "_Could not list GA4 accounts. Please enable the Google Analytics Admin API in your GCP project. Property ID can be specified per request at runtime._",
7952
7932
  ""
7953
7933
  );
7954
7934
  return sections.join("\n");
@@ -7962,8 +7942,9 @@ var REQUEST_TIMEOUT_MS10 = 6e4;
7962
7942
  var inputSchema20 = z20.object({
7963
7943
  toolUseIntent: z20.string().optional().describe("Brief description of what you intend to accomplish with this tool call"),
7964
7944
  connectionId: z20.string().describe("ID of the Google Analytics connection to use"),
7945
+ propertyId: z20.string().describe("GA4 property ID (e.g., '123456789')"),
7965
7946
  method: z20.enum(["GET", "POST"]).describe("HTTP method"),
7966
- path: z20.string().describe("API path (e.g., 'properties/{propertyId}:runReport'). {propertyId} is automatically replaced."),
7947
+ path: z20.string().describe("API path (e.g., 'properties/{propertyId}:runReport'). {propertyId} is replaced with the propertyId parameter."),
7967
7948
  body: z20.record(z20.string(), z20.unknown()).optional().describe("POST request body (JSON)")
7968
7949
  });
7969
7950
  var outputSchema20 = z20.discriminatedUnion("success", [
@@ -7981,10 +7962,10 @@ var requestTool3 = new ConnectorTool({
7981
7962
  name: "request",
7982
7963
  description: `Send authenticated requests to the Google Analytics Data API.
7983
7964
  Authentication is handled automatically using a service account.
7984
- {propertyId} in the path is automatically replaced with the connection's property-id.`,
7965
+ {propertyId} in the path is automatically replaced with the propertyId parameter.`,
7985
7966
  inputSchema: inputSchema20,
7986
7967
  outputSchema: outputSchema20,
7987
- async execute({ connectionId, method, path: path4, body }, connections) {
7968
+ async execute({ connectionId, propertyId, method, path: path4, body }, connections) {
7988
7969
  const connection = connections.find((c) => c.id === connectionId);
7989
7970
  if (!connection) {
7990
7971
  return { success: false, error: `Connection ${connectionId} not found` };
@@ -7993,7 +7974,6 @@ Authentication is handled automatically using a service account.
7993
7974
  try {
7994
7975
  const { GoogleAuth } = await import("google-auth-library");
7995
7976
  const keyJsonBase64 = parameters13.serviceAccountKeyJsonBase64.getValue(connection);
7996
- const propertyId = parameters13.propertyId.getValue(connection);
7997
7977
  const credentials = JSON.parse(
7998
7978
  Buffer.from(keyJsonBase64, "base64").toString("utf-8")
7999
7979
  );
@@ -8053,7 +8033,7 @@ var googleAnalyticsConnector = new ConnectorPlugin({
8053
8033
  systemPrompt: {
8054
8034
  en: `### Tools
8055
8035
 
8056
- - \`google-analytics-service-account_request\`: The only way to call the GA4 Data API. Use it to fetch metadata, run reports, or run realtime reports. See the GA4 Data API Reference below for available endpoints and request bodies.
8036
+ - \`google-analytics-service-account_request\`: The only way to call the GA4 Data API. Use it to fetch metadata, run reports, or run realtime reports. Requires a \`propertyId\` parameter. See the GA4 Data API Reference below for available endpoints and request bodies.
8057
8037
 
8058
8038
  ### Business Logic
8059
8039
 
@@ -8062,9 +8042,11 @@ The business logic type for this connector is "typescript". Use the connector SD
8062
8042
  SDK methods (client created via \`connection(connectionId)\`):
8063
8043
  - \`client.runReport(request)\` \u2014 run a GA4 report
8064
8044
  - \`client.runRealtimeReport(request)\` \u2014 run a realtime report
8065
- - \`client.getMetadata()\` \u2014 fetch available dimensions/metrics
8045
+ - \`client.getMetadata(request)\` \u2014 fetch available dimensions/metrics
8066
8046
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
8067
8047
 
8048
+ **IMPORTANT**: You MUST always include \`propertyId\` in every SDK method call. The property ID is obtained during the setup flow. Without it, the request will fail.
8049
+
8068
8050
  \`\`\`ts
8069
8051
  import type { Context } from "hono";
8070
8052
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
@@ -8072,12 +8054,14 @@ import { connection } from "@squadbase/vite-server/connectors/google-analytics";
8072
8054
  const ga = connection("<connectionId>");
8073
8055
 
8074
8056
  export default async function handler(c: Context) {
8075
- const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8057
+ const { propertyId, startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8058
+ propertyId: string;
8076
8059
  startDate?: string;
8077
8060
  endDate?: string;
8078
8061
  }>();
8079
8062
 
8080
8063
  const { rows } = await ga.runReport({
8064
+ propertyId,
8081
8065
  dateRanges: [{ startDate, endDate }],
8082
8066
  dimensions: [{ name: "date" }],
8083
8067
  metrics: [{ name: "activeUsers" }, { name: "sessions" }],
@@ -8121,7 +8105,7 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8121
8105
  - Relative: \`"today"\`, \`"yesterday"\`, \`"7daysAgo"\`, \`"30daysAgo"\``,
8122
8106
  ja: `### \u30C4\u30FC\u30EB
8123
8107
 
8124
- - \`google-analytics-service-account_request\`: GA4 Data API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CGA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
8108
+ - \`google-analytics-service-account_request\`: GA4 Data API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\`propertyId\` \u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u304C\u5FC5\u8981\u3067\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CGA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
8125
8109
 
8126
8110
  ### Business Logic
8127
8111
 
@@ -8130,9 +8114,11 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8130
8114
  SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
8131
8115
  - \`client.runReport(request)\` \u2014 GA4\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
8132
8116
  - \`client.runRealtimeReport(request)\` \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
8133
- - \`client.getMetadata()\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97
8117
+ - \`client.getMetadata(request)\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97
8134
8118
  - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
8135
8119
 
8120
+ **\u91CD\u8981**: \u3059\u3079\u3066\u306ESDK\u30E1\u30BD\u30C3\u30C9\u547C\u3073\u51FA\u3057\u306B\u306F\u5FC5\u305A \`propertyId\` \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u30D7\u30ED\u30D1\u30C6\u30A3ID\u306F\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u30D5\u30ED\u30FC\u3067\u53D6\u5F97\u3055\u308C\u307E\u3059\u3002\u6307\u5B9A\u3057\u306A\u3044\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u5931\u6557\u3057\u307E\u3059\u3002
8121
+
8136
8122
  \`\`\`ts
8137
8123
  import type { Context } from "hono";
8138
8124
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
@@ -8140,12 +8126,14 @@ import { connection } from "@squadbase/vite-server/connectors/google-analytics";
8140
8126
  const ga = connection("<connectionId>");
8141
8127
 
8142
8128
  export default async function handler(c: Context) {
8143
- const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8129
+ const { propertyId, startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
8130
+ propertyId: string;
8144
8131
  startDate?: string;
8145
8132
  endDate?: string;
8146
8133
  }>();
8147
8134
 
8148
8135
  const { rows } = await ga.runReport({
8136
+ propertyId,
8149
8137
  dateRanges: [{ startDate, endDate }],
8150
8138
  dimensions: [{ name: "date" }],
8151
8139
  metrics: [{ name: "activeUsers" }, { name: "sessions" }],
@@ -8198,15 +8186,8 @@ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conv
8198
8186
  error: "google-analytics: missing service account key"
8199
8187
  };
8200
8188
  }
8201
- const propertyId = params[parameters13.propertyId.slug];
8202
- if (!propertyId) {
8203
- return { success: true };
8204
- }
8205
8189
  try {
8206
- const res = await dataFetch(
8207
- params,
8208
- `/properties/${propertyId}/metadata`
8209
- );
8190
+ const res = await dataFetch(params, `/metadata`);
8210
8191
  if (!res.ok) {
8211
8192
  const body = await res.text().catch(() => res.statusText);
8212
8193
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squadbase/vite-server",
3
- "version": "0.1.17-dev.7408ec4",
3
+ "version": "0.1.17-dev.9d1f952",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {