@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.
- package/dist/cli/index.js +32 -51
- package/dist/connectors/airtable-oauth.js +6 -0
- package/dist/connectors/airtable.js +6 -0
- package/dist/connectors/amplitude.js +6 -0
- package/dist/connectors/asana.js +6 -0
- package/dist/connectors/attio.js +6 -0
- package/dist/connectors/aws-billing.js +6 -0
- package/dist/connectors/azure-sql.js +6 -0
- package/dist/connectors/backlog-api-key.js +6 -0
- package/dist/connectors/clickup.js +6 -0
- package/dist/connectors/cosmosdb.js +6 -0
- package/dist/connectors/customerio.js +6 -0
- package/dist/connectors/dbt.js +6 -0
- package/dist/connectors/freshdesk.js +6 -0
- package/dist/connectors/freshsales.js +6 -0
- package/dist/connectors/freshservice.js +6 -0
- package/dist/connectors/gamma.js +6 -0
- package/dist/connectors/github.js +6 -0
- package/dist/connectors/gmail-oauth.js +6 -0
- package/dist/connectors/gmail.js +6 -0
- package/dist/connectors/google-ads.js +6 -0
- package/dist/connectors/google-analytics-oauth.js +6 -0
- package/dist/connectors/google-analytics.js +53 -64
- package/dist/connectors/google-audit-log.js +6 -0
- package/dist/connectors/google-calendar-oauth.js +6 -0
- package/dist/connectors/google-calendar.js +6 -0
- package/dist/connectors/google-docs.js +6 -0
- package/dist/connectors/google-drive.js +6 -0
- package/dist/connectors/google-search-console-oauth.js +6 -0
- package/dist/connectors/google-sheets.js +6 -0
- package/dist/connectors/google-slides.js +6 -0
- package/dist/connectors/grafana.js +6 -0
- package/dist/connectors/hubspot-oauth.js +6 -0
- package/dist/connectors/hubspot.js +6 -0
- package/dist/connectors/influxdb.js +6 -0
- package/dist/connectors/intercom-oauth.js +6 -0
- package/dist/connectors/intercom.js +6 -0
- package/dist/connectors/jdbc.js +6 -0
- package/dist/connectors/jira-api-key.js +6 -0
- package/dist/connectors/kintone-api-token.js +6 -0
- package/dist/connectors/kintone.js +6 -0
- package/dist/connectors/linear.js +6 -0
- package/dist/connectors/linkedin-ads.js +6 -0
- package/dist/connectors/mailchimp-oauth.js +6 -0
- package/dist/connectors/mailchimp.js +6 -0
- package/dist/connectors/meta-ads-oauth.js +6 -0
- package/dist/connectors/meta-ads.js +6 -0
- package/dist/connectors/mixpanel.js +6 -0
- package/dist/connectors/monday.js +6 -0
- package/dist/connectors/mongodb.js +6 -0
- package/dist/connectors/notion-oauth.js +6 -0
- package/dist/connectors/notion.js +6 -0
- package/dist/connectors/oracle.js +6 -0
- package/dist/connectors/outlook-oauth.js +6 -0
- package/dist/connectors/powerbi-oauth.js +6 -0
- package/dist/connectors/salesforce.js +6 -0
- package/dist/connectors/semrush.js +6 -0
- package/dist/connectors/sentry.js +6 -0
- package/dist/connectors/shopify-oauth.js +6 -0
- package/dist/connectors/shopify.js +6 -0
- package/dist/connectors/sqlserver.js +6 -0
- package/dist/connectors/stripe-api-key.js +6 -0
- package/dist/connectors/stripe-oauth.js +6 -0
- package/dist/connectors/supabase.js +6 -0
- package/dist/connectors/tableau.js +6 -0
- package/dist/connectors/tiktok-ads.js +6 -0
- package/dist/connectors/wix-store.js +6 -0
- package/dist/connectors/zendesk-oauth.js +6 -0
- package/dist/connectors/zendesk.js +6 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +43 -57
- package/dist/main.js +32 -51
- package/dist/vite-plugin.js +32 -51
- 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: "
|
|
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
|
|
7856
|
+
async fetchOptions(state) {
|
|
7865
7857
|
if (state.properties?.length) return [];
|
|
7866
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
package/dist/vite-plugin.js
CHANGED
|
@@ -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: "
|
|
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
|
|
7857
|
+
async fetchOptions(state) {
|
|
7866
7858
|
if (state.properties?.length) return [];
|
|
7867
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|