@squadbase/vite-server 0.1.3 → 0.1.4-dev.1
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 +265 -71
- package/dist/connectors/airtable-oauth.js +10 -0
- package/dist/connectors/airtable.js +10 -0
- package/dist/connectors/amplitude.js +10 -0
- package/dist/connectors/anthropic.js +10 -0
- package/dist/connectors/asana.js +10 -0
- package/dist/connectors/attio.js +487 -110
- package/dist/connectors/backlog-api-key.js +10 -0
- package/dist/connectors/customerio.js +10 -0
- package/dist/connectors/dbt.js +10 -0
- package/dist/connectors/gamma.js +10 -0
- package/dist/connectors/gemini.js +10 -0
- package/dist/connectors/gmail-oauth.js +10 -0
- package/dist/connectors/gmail.js +14 -4
- package/dist/connectors/google-ads.js +10 -0
- package/dist/connectors/google-analytics-oauth.js +10 -0
- package/dist/connectors/google-analytics.js +10 -0
- package/dist/connectors/google-calendar-oauth.js +10 -0
- package/dist/connectors/google-calendar.js +14 -6
- package/dist/connectors/google-docs.js +10 -0
- package/dist/connectors/google-drive.js +10 -0
- package/dist/connectors/google-sheets.js +10 -0
- package/dist/connectors/google-slides.js +10 -0
- package/dist/connectors/grafana.js +10 -0
- package/dist/connectors/hubspot-oauth.js +10 -0
- package/dist/connectors/hubspot.js +10 -0
- package/dist/connectors/intercom-oauth.js +10 -0
- package/dist/connectors/intercom.js +10 -0
- package/dist/connectors/jira-api-key.js +10 -0
- package/dist/connectors/kintone-api-token.js +10 -0
- package/dist/connectors/kintone.js +10 -0
- package/dist/connectors/linkedin-ads.js +10 -0
- package/dist/connectors/mailchimp-oauth.js +10 -0
- package/dist/connectors/mailchimp.js +10 -0
- package/dist/connectors/mixpanel.js +10 -0
- package/dist/connectors/notion-oauth.js +10 -0
- package/dist/connectors/notion.js +10 -0
- package/dist/connectors/openai.js +10 -0
- package/dist/connectors/sentry.js +10 -0
- package/dist/connectors/shopify-oauth.js +10 -0
- package/dist/connectors/shopify.js +10 -0
- package/dist/connectors/stripe-api-key.js +10 -0
- package/dist/connectors/stripe-oauth.js +10 -0
- package/dist/connectors/wix-store.js +10 -0
- package/dist/connectors/zendesk-oauth.js +10 -0
- package/dist/connectors/zendesk.js +10 -0
- package/dist/index.js +265 -71
- package/dist/main.js +265 -71
- package/dist/vite-plugin.js +265 -71
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -67234,7 +67234,8 @@ The business logic type for this connector is "sql".
|
|
|
67234
67234
|
},
|
|
67235
67235
|
async query(params, sql, namedParams) {
|
|
67236
67236
|
const { Pool } = await import("pg");
|
|
67237
|
-
const
|
|
67237
|
+
const cleanSql = sql.replace(/;\s*$/, "");
|
|
67238
|
+
const { text, values } = buildPositionalParams(cleanSql, namedParams);
|
|
67238
67239
|
const pool = new Pool({
|
|
67239
67240
|
connectionString: params[parameters3.connectionUrl.slug],
|
|
67240
67241
|
ssl: { rejectUnauthorized: false },
|
|
@@ -67586,7 +67587,7 @@ var bigqueryOnboarding = new ConnectorOnboarding({
|
|
|
67586
67587
|
- \`options\`: \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3002\u5404 option \u306E \`label\` \u306F \`\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D (id: \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8ID)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8ID
|
|
67587
67588
|
3. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E \`label\` \u304C\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u5C4A\u304F\u306E\u3067\u3001\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u3080
|
|
67588
67589
|
4. \`${listDatasetsToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u9078\u629E\u3055\u308C\u305F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u306E\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
|
|
67589
|
-
5. \`askUserQuestion\` \u3092\u547C\u3073\u51FA\u3059\
|
|
67590
|
+
5. \`askUserQuestion\` \u3092\u547C\u3073\u51FA\u3059\uFF08type: "select", multiSelect: true, allowFreeText: true\uFF09:
|
|
67590
67591
|
- \`question\`: \u4F7F\u7528\u3059\u308B\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u3092\u9078\u629E\u3059\u308B\u3088\u3046\u4FC3\u3059\u3002\u300C\u4E0A\u8A18\u4EE5\u5916\u306E\u30D1\u30D6\u30EA\u30C3\u30AF\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u306F \`bigquery-public-data.{\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u540D}\` \u306E\u5F62\u5F0F\u3067\u81EA\u7531\u5165\u529B\u3067\u304D\u307E\u3059\u300D\u3068\u660E\u8A18\u3059\u308B
|
|
67591
67592
|
- \`options\`: \u4EE5\u4E0B\u3092\u9806\u756A\u306B\u7D50\u5408\u3059\u308B
|
|
67592
67593
|
1. \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8: \u5404 \`{ label: datasetId, description: location }\`
|
|
@@ -67618,7 +67619,7 @@ var bigqueryOnboarding = new ConnectorOnboarding({
|
|
|
67618
67619
|
- \`options\`: The project list. Each option's \`label\` should be \`Project Name (id: project-id)\`, \`value\` should be the project ID
|
|
67619
67620
|
3. The \`label\` of the user's selected project will arrive as a message. Proceed to the next step
|
|
67620
67621
|
4. Call \`${listDatasetsToolName}\` to get the list of datasets in the selected project
|
|
67621
|
-
5. Call \`askUserQuestion\` (multiSelect: true):
|
|
67622
|
+
5. Call \`askUserQuestion\` (type: "select", multiSelect: true, allowFreeText: true):
|
|
67622
67623
|
- \`question\`: Ask the user to select datasets. State that other public datasets can be entered freely in the format \`bigquery-public-data.{dataset_name}\`
|
|
67623
67624
|
- \`options\`: Concatenate in order:
|
|
67624
67625
|
1. Project datasets: each \`{ label: datasetId, description: location }\`
|
|
@@ -68048,7 +68049,7 @@ var bigqueryOnboarding2 = new ConnectorOnboarding({
|
|
|
68048
68049
|
- \`options\`: \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3002\u5404 option \u306E \`label\` \u306F \`\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D (id: \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8ID)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8ID
|
|
68049
68050
|
3. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E \`label\` \u304C\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u5C4A\u304F\u306E\u3067\u3001\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u3080
|
|
68050
68051
|
4. \`${listDatasetsToolName2}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u9078\u629E\u3055\u308C\u305F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u306E\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
|
|
68051
|
-
5. \`askUserQuestion\` \u3092\u547C\u3073\u51FA\u3059\
|
|
68052
|
+
5. \`askUserQuestion\` \u3092\u547C\u3073\u51FA\u3059\uFF08type: "select", multiSelect: true, allowFreeText: true\uFF09:
|
|
68052
68053
|
- \`question\`: \u4F7F\u7528\u3059\u308B\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u3092\u9078\u629E\u3059\u308B\u3088\u3046\u4FC3\u3059\u3002\u300C\u4E0A\u8A18\u4EE5\u5916\u306E\u30D1\u30D6\u30EA\u30C3\u30AF\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u306F \`bigquery-public-data.{\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u540D}\` \u306E\u5F62\u5F0F\u3067\u81EA\u7531\u5165\u529B\u3067\u304D\u307E\u3059\u300D\u3068\u660E\u8A18\u3059\u308B
|
|
68053
68054
|
- \`options\`: \u4EE5\u4E0B\u3092\u9806\u756A\u306B\u7D50\u5408\u3059\u308B
|
|
68054
68055
|
1. \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8: \u5404 \`{ label: datasetId, description: location }\`
|
|
@@ -68080,7 +68081,7 @@ var bigqueryOnboarding2 = new ConnectorOnboarding({
|
|
|
68080
68081
|
- \`options\`: The project list. Each option's \`label\` should be \`Project Name (id: project-id)\`, \`value\` should be the project ID
|
|
68081
68082
|
3. The \`label\` of the user's selected project will arrive as a message. Proceed to the next step
|
|
68082
68083
|
4. Call \`${listDatasetsToolName2}\` to get the list of datasets in the selected project
|
|
68083
|
-
5. Call \`askUserQuestion\` (multiSelect: true):
|
|
68084
|
+
5. Call \`askUserQuestion\` (type: "select", multiSelect: true, allowFreeText: true):
|
|
68084
68085
|
- \`question\`: Ask the user to select datasets. State that other public datasets can be entered freely in the format \`bigquery-public-data.{dataset_name}\`
|
|
68085
68086
|
- \`options\`: Concatenate in order:
|
|
68086
68087
|
1. Project datasets: each \`{ label: datasetId, description: location }\`
|
|
@@ -71166,10 +71167,9 @@ var googleCalendarOnboarding = new ConnectorOnboarding({
|
|
|
71166
71167
|
ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Google Calendar\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u63A5\u7D9A\u4F5C\u6210\u6642\u306B\u306F\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8JSON\u306E\u307F\u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3001\u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3084\u30AB\u30EC\u30F3\u30C0\u30FCID\u306F\u3053\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u53D6\u5F97\u3057\u307E\u3059\u3002
|
|
71167
71168
|
|
|
71168
71169
|
1. \`askUserQuestion\` \u3067\u30E6\u30FC\u30B6\u30FC\u306B\u3001\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304CDomain-wide Delegation\u3067\u4EE3\u7406\u30A2\u30AF\u30BB\u30B9\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u30D2\u30A2\u30EA\u30F3\u30B0\u3059\u308B:
|
|
71170
|
+
- \`type\`: \`"freeText"\`
|
|
71169
71171
|
- \`question\`: \u300C\u30A2\u30AF\u30BB\u30B9\u3057\u305F\u3044\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u6301\u3064\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u3042\u308B\u5834\u5408\u306F\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u5165\u529B\u53EF\uFF09\u300D
|
|
71170
|
-
- \`
|
|
71171
|
-
- \`options\`: \`[]\`\uFF08\u9078\u629E\u80A2\u306A\u3057\u30FB\u81EA\u7531\u5165\u529B\u306E\u307F\uFF09
|
|
71172
|
-
- \`allowFreeText\`: \`true\`
|
|
71172
|
+
- \`placeholder\`: \`"user@example.com, admin@example.com"\`
|
|
71173
71173
|
2. \u30E6\u30FC\u30B6\u30FC\u304B\u3089\u53D7\u3051\u53D6\u3063\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\uFF08\u30AB\u30F3\u30DE\u533A\u5207\u308A\u5BFE\u5FDC\uFF09\u3092 \`updateConnectionParameters\` \u3067\u4FDD\u5B58\u3059\u308B:
|
|
71174
71174
|
- \`parameterSlug\`: \`"impersonate-email"\`
|
|
71175
71175
|
- \`options\`: \`[{ value: <\u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u6587\u5B57\u5217>, label: <\u540C\u3058\u5024> }]\`\uFF081\u4EF6\u306E\u307F\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u9078\u629E\u3055\u308C\u308B\uFF09
|
|
@@ -71194,10 +71194,9 @@ var googleCalendarOnboarding = new ConnectorOnboarding({
|
|
|
71194
71194
|
en: `Follow these steps to set up the Google Calendar connection. Only the service account JSON is provided at connection creation time \u2014 the target user email and calendar ID are collected during this setup flow.
|
|
71195
71195
|
|
|
71196
71196
|
1. Call \`askUserQuestion\` to ask the user for the Google Workspace user email the service account will impersonate via Domain-wide Delegation:
|
|
71197
|
+
- \`type\`: \`"freeText"\`
|
|
71197
71198
|
- \`question\`: "Please enter the email address of the user whose calendar you want to access (comma-separated list allowed for multiple users)"
|
|
71198
|
-
- \`
|
|
71199
|
-
- \`options\`: \`[]\` (no preset choices \u2014 free text only)
|
|
71200
|
-
- \`allowFreeText\`: \`true\`
|
|
71199
|
+
- \`placeholder\`: \`"user@example.com, admin@example.com"\`
|
|
71201
71200
|
2. Save the email(s) the user provided (comma-separated supported) via \`updateConnectionParameters\`:
|
|
71202
71201
|
- \`parameterSlug\`: \`"impersonate-email"\`
|
|
71203
71202
|
- \`options\`: \`[{ value: <the email string entered>, label: <same value> }]\` (a single option is auto-selected)
|
|
@@ -75940,7 +75939,8 @@ The business logic type for this connector is "sql".
|
|
|
75940
75939
|
},
|
|
75941
75940
|
async query(params, sql, namedParams) {
|
|
75942
75941
|
const { Pool } = await import("pg");
|
|
75943
|
-
const
|
|
75942
|
+
const cleanSql = sql.replace(/;\s*$/, "");
|
|
75943
|
+
const { text, values } = buildPositionalParams(cleanSql, namedParams);
|
|
75944
75944
|
const pool = new Pool({
|
|
75945
75945
|
connectionString: params[parameters28.connectionUrl.slug],
|
|
75946
75946
|
ssl: { rejectUnauthorized: false },
|
|
@@ -76454,14 +76454,18 @@ export default async function handler(c: Context) {
|
|
|
76454
76454
|
// ../connectors/src/connectors/attio/setup.ts
|
|
76455
76455
|
var attioOnboarding = new ConnectorOnboarding({
|
|
76456
76456
|
dataOverviewInstructions: {
|
|
76457
|
-
en: `1. Call attio_request with GET /objects to
|
|
76458
|
-
2.
|
|
76459
|
-
3. Call attio_request with POST /objects/
|
|
76460
|
-
4.
|
|
76461
|
-
|
|
76462
|
-
|
|
76463
|
-
|
|
76464
|
-
|
|
76457
|
+
en: `1. Call attio_request with GET /objects to discover the object slugs actually configured in this workspace (typically people, companies, deals, plus any custom objects).
|
|
76458
|
+
2. For each object you plan to use, call attio_request with GET /objects/{slug}/attributes to explore its attributes
|
|
76459
|
+
3. Call attio_request with POST /objects/{slug}/records/query with { "limit": 5 } to sample records
|
|
76460
|
+
4. Call attio_request with GET /workspace_members (top-level, snake_case) to list team members. The response shape is \`{ data: [{ id: { workspace_member_id }, first_name, last_name, email_address, ... }] }\`. You need this mapping in dashboard handlers to resolve \`owner\` and other actor-reference fields (which return \`referenced_actor_id\`, not a name). Sample one record that has an \`owner\` and confirm the shape \`{ referenced_actor_type, referenced_actor_id }\`, then use \`client.getWorkspaceMemberMap()\` in handlers to resolve IDs to names.
|
|
76461
|
+
5. If an endpoint later returns 403 (tasks / threads / webhooks / meetings require specific scopes), call GET /self to inspect the token's active scopes.
|
|
76462
|
+
6. Explore lists via GET /lists as needed, and use /notes, /tasks, /threads, /comments, /webhooks, /meetings when the question requires them.`,
|
|
76463
|
+
ja: `1. attio_request \u3067 GET /objects \u3092\u547C\u3073\u51FA\u3057\u3001\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306B\u5B9F\u5728\u3059\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8slug\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u901A\u5E38\u306F people / companies / deals\u3001\u52A0\u3048\u3066\u8A2D\u5B9A\u6E08\u307F\u306E\u30AB\u30B9\u30BF\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF09
|
|
76464
|
+
2. \u4F7F\u3046\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3054\u3068\u306B attio_request \u3067 GET /objects/{slug}/attributes \u3092\u547C\u3073\u51FA\u3057\u3001\u5C5E\u6027\u3092\u78BA\u8A8D
|
|
76465
|
+
3. attio_request \u3067 POST /objects/{slug}/records/query \u3092 { "limit": 5 } \u3067\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
|
|
76466
|
+
4. attio_request \u3067 GET /workspace_members\uFF08\u30C8\u30C3\u30D7\u30EC\u30D9\u30EB\u3001\u30B9\u30CD\u30FC\u30AF\u30B1\u30FC\u30B9\uFF09\u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u30E1\u30F3\u30D0\u30FC\u4E00\u89A7\u3092\u53D6\u5F97\u3002\u30EC\u30B9\u30DD\u30F3\u30B9\u306F \`{ data: [{ id: { workspace_member_id }, first_name, last_name, email_address, ... }] }\` \u306E\u5F62\u5F0F\u3067\u3059\u3002\u3053\u306E\u30DE\u30C3\u30D4\u30F3\u30B0\u306F\u3001\`owner\` \u306A\u3069\u306E actor-reference \u30D5\u30A3\u30FC\u30EB\u30C9\uFF08\`referenced_actor_id\` \u3092\u8FD4\u3059\uFF09\u3092\u540D\u524D\u306B\u89E3\u6C7A\u3059\u308B\u305F\u3081\u306B\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u30CF\u30F3\u30C9\u30E9\u3067\u5FC5\u9808\u3067\u3059\u3002\`owner\` \u3092\u6301\u3064\u30EC\u30B3\u30FC\u30C9\u30921\u4EF6\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u3001\`{ referenced_actor_type, referenced_actor_id }\` \u306E\u5F62\u3092\u78BA\u8A8D\u3057\u305F\u4E0A\u3067\u3001\u30CF\u30F3\u30C9\u30E9\u3067\u306F \`client.getWorkspaceMemberMap()\` \u3092\u4F7F\u3063\u3066 ID \u2192 \u540D\u524D \u306B\u89E3\u6C7A\u3057\u3066\u304F\u3060\u3055\u3044
|
|
76467
|
+
5. \u5F8C\u6BB5\u3067 403 \u304C\u51FA\u305F\u5834\u5408\uFF08tasks / threads / webhooks / meetings \u306A\u3069\u306F\u500B\u5225\u306E scope \u304C\u5FC5\u8981\uFF09\u306F\u3001GET /self \u3092\u547C\u3073\u51FA\u3057\u3066API\u30C8\u30FC\u30AF\u30F3\u306E\u6709\u52B9 scope \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044
|
|
76468
|
+
6. \u5FC5\u8981\u306B\u5FDC\u3058\u3066 GET /lists \u3067\u30EA\u30B9\u30C8\u3092\u63A2\u7D22\u3057\u3001/notes\u3001/tasks\u3001/threads\u3001/comments\u3001/webhooks\u3001/meetings \u3082\u6D3B\u7528\u3057\u3066\u304F\u3060\u3055\u3044`
|
|
76465
76469
|
}
|
|
76466
76470
|
});
|
|
76467
76471
|
|
|
@@ -76487,11 +76491,11 @@ var inputSchema39 = z39.object({
|
|
|
76487
76491
|
"Brief description of what you intend to accomplish with this tool call"
|
|
76488
76492
|
),
|
|
76489
76493
|
connectionId: z39.string().describe("ID of the Attio connection to use"),
|
|
76490
|
-
method: z39.enum(["GET", "POST", "PATCH", "DELETE"]).describe(
|
|
76491
|
-
"HTTP method. GET for reading resources, POST for creating
|
|
76494
|
+
method: z39.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
|
|
76495
|
+
"HTTP method. GET for reading resources and list endpoints, POST for creating records/querying/asserting, PATCH for partial updates (append multiselect), PUT for full updates (overwrite multiselect), DELETE for removing."
|
|
76492
76496
|
),
|
|
76493
76497
|
path: z39.string().describe(
|
|
76494
|
-
"API path (
|
|
76498
|
+
"Attio REST API path relative to https://api.attio.com/v2 (include the leading slash). Examples: '/self', '/objects', '/objects/people/attributes', '/objects/people/records/query', '/objects/companies/records/{record_id}', '/workspace_members', '/workspace_members/{workspace_member_id}', '/lists', '/lists/{list_id}/entries/query', '/notes', '/tasks', '/threads', '/comments', '/webhooks', '/meetings'."
|
|
76495
76499
|
),
|
|
76496
76500
|
body: z39.record(z39.string(), z39.unknown()).optional().describe("Request body (JSON) for POST/PATCH requests")
|
|
76497
76501
|
});
|
|
@@ -76508,10 +76512,10 @@ var outputSchema39 = z39.discriminatedUnion("success", [
|
|
|
76508
76512
|
]);
|
|
76509
76513
|
var requestTool20 = new ConnectorTool({
|
|
76510
76514
|
name: "request",
|
|
76511
|
-
description: `Send authenticated requests to the Attio REST API.
|
|
76515
|
+
description: `Send authenticated requests to the Attio REST API (base URL: https://api.attio.com/v2).
|
|
76512
76516
|
Authentication is handled automatically using the API Key (Bearer token).
|
|
76513
|
-
Use this tool for
|
|
76514
|
-
|
|
76517
|
+
Use this tool for every Attio API interaction, including: querying records (people, companies, deals, and any custom objects configured in the workspace) and their attributes, listing/getting/creating/updating/deleting records and list entries, reading workspace members, and working with notes, tasks, threads, comments, webhooks, and meetings. Call GET /self to introspect the current API token.
|
|
76518
|
+
Record queries use POST /objects/{object}/records/query with a JSON body containing \`filter\`, \`sorts\`, \`limit\`, and \`offset\`. Record updates use PATCH (append multiselect) or PUT (overwrite multiselect). Workspace members, tasks, webhooks, notes, threads, comments, and meetings live at top-level paths \u2014 the workspace-members path uses a snake_case underscore: /workspace_members.`,
|
|
76515
76519
|
inputSchema: inputSchema39,
|
|
76516
76520
|
outputSchema: outputSchema39,
|
|
76517
76521
|
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
@@ -76570,19 +76574,69 @@ var attioConnector = new ConnectorPlugin({
|
|
|
76570
76574
|
systemPrompt: {
|
|
76571
76575
|
en: `### Tools
|
|
76572
76576
|
|
|
76573
|
-
- \`attio_request\`: The only way to call the Attio REST API. Use it
|
|
76577
|
+
- \`attio_request\`: The only way to call the Attio REST API. Use it for every Attio resource \u2014 records (people, companies, deals, and any custom objects configured in the workspace), their attributes, lists and entries, workspace members, notes, tasks, threads, comments, webhooks, and meetings. Authentication (Bearer token) is configured automatically. Querying records uses POST \`/objects/{object}/records/query\` with a JSON body. Use PATCH for partial updates (append multiselect) and PUT for full updates (overwrite multiselect). Always call GET \`/objects\` first to discover the actual object slugs in this workspace.
|
|
76574
76578
|
|
|
76575
76579
|
### Business Logic
|
|
76576
76580
|
|
|
76577
|
-
The business logic type for this connector is "typescript". Use the connector SDK in your handler
|
|
76581
|
+
The business logic type for this connector is "typescript". Use the connector SDK in your handler; authentication is handled by the SDK client.
|
|
76578
76582
|
|
|
76579
76583
|
SDK methods (client created via \`connection(connectionId)\`):
|
|
76580
76584
|
- \`client.request(path, init?)\` \u2014 low-level authenticated fetch
|
|
76581
|
-
- \`client.
|
|
76582
|
-
- \`client.
|
|
76583
|
-
- \`client.
|
|
76584
|
-
- \`client.getRecord(object, recordId)\`
|
|
76585
|
-
- \`client.queryListEntries(listId, options?)\`
|
|
76585
|
+
- \`client.self()\` \u2014 current API token introspection (GET /self) \u2014 returns workspace id, scopes, token status
|
|
76586
|
+
- Objects: \`client.listObjects()\`, \`client.getObject(object)\`, \`client.listObjectViews(object)\`
|
|
76587
|
+
- Attributes: \`client.listAttributes(object)\`, \`client.getAttribute(object, attribute)\`, \`client.listSelectOptions(object, attribute)\`, \`client.listStatuses(object, attribute)\`
|
|
76588
|
+
- Records: \`client.queryRecords(object, options?)\`, \`client.getRecord(object, recordId)\`, \`client.createRecord(object, data)\`, \`client.updateRecord(object, recordId, data)\` (PATCH), \`client.overwriteRecord(object, recordId, data)\` (PUT), \`client.deleteRecord(object, recordId)\`, \`client.assertRecord(object, data)\`, \`client.listRecordEntries(object, recordId)\`
|
|
76589
|
+
- Lists & entries: \`client.listLists()\`, \`client.getList(listId)\`, \`client.listListViews(listId)\`, \`client.queryListEntries(listId, options?)\`, \`client.getListEntry(listId, entryId)\`, \`client.createListEntry(listId, data)\`, \`client.updateListEntry(listId, entryId, data)\`, \`client.overwriteListEntry(listId, entryId, data)\`, \`client.deleteListEntry(listId, entryId)\`, \`client.assertListEntry(listId, data)\`
|
|
76590
|
+
- Workspace members: \`client.listWorkspaceMembers()\`, \`client.getWorkspaceMember(workspaceMemberId)\`, \`client.getWorkspaceMemberMap()\` (returns \`Map<workspace_member_id, { id, name, email }>\` \u2014 use to resolve \`owner\` / actor-reference fields to names)
|
|
76591
|
+
- Notes: \`client.listNotes(options?)\`, \`client.getNote(noteId)\`, \`client.createNote(data)\`, \`client.updateNote(noteId, data)\`, \`client.deleteNote(noteId)\`
|
|
76592
|
+
- Tasks: \`client.listTasks(options?)\`, \`client.getTask(taskId)\`, \`client.createTask(data)\`, \`client.updateTask(taskId, data)\`, \`client.deleteTask(taskId)\`
|
|
76593
|
+
- Threads & comments: \`client.listThreads(options?)\`, \`client.getThread(threadId)\`, \`client.createComment(data)\`, \`client.getComment(commentId)\`, \`client.updateComment(commentId, data)\`, \`client.deleteComment(commentId)\`
|
|
76594
|
+
- Webhooks: \`client.listWebhooks()\`, \`client.getWebhook(webhookId)\`, \`client.createWebhook(data)\`, \`client.updateWebhook(webhookId, data)\`, \`client.deleteWebhook(webhookId)\`
|
|
76595
|
+
- Meetings: \`client.listMeetings(options?)\`, \`client.getMeeting(meetingId)\`
|
|
76596
|
+
|
|
76597
|
+
### CRITICAL: Owner / Actor reference resolution
|
|
76598
|
+
|
|
76599
|
+
Fields like \`owner\` \u2014 and any \`actor-reference\` attribute \u2014 in Attio record \`values\` do **not** contain names. They carry actor IDs shaped like:
|
|
76600
|
+
\`\`\`json
|
|
76601
|
+
{ "referenced_actor_type": "workspace-member", "referenced_actor_id": "<workspace_member_id>" }
|
|
76602
|
+
\`\`\`
|
|
76603
|
+
Rendering that raw leaves opaque IDs in the UI (e.g. \`owner_name\` stays as a UUID). **Always** resolve these IDs to names before returning them. Do this by fetching workspace members once and joining on \`workspace_member_id\`.
|
|
76604
|
+
|
|
76605
|
+
- Use \`client.getWorkspaceMemberMap()\` \u2014 it returns a typed \`Map<workspace_member_id, { id, name, email }>\` ready to join with actor references.
|
|
76606
|
+
- The workspace-member endpoint is top-level: \`GET /workspace_members\`.
|
|
76607
|
+
- Fetch \`client.getWorkspaceMemberMap()\` in parallel with \`queryRecords\` via \`Promise.all\` (single fetch, joined in-memory).
|
|
76608
|
+
|
|
76609
|
+
Example \u2014 owner-based performance with names resolved:
|
|
76610
|
+
\`\`\`ts
|
|
76611
|
+
import type { Context } from "hono";
|
|
76612
|
+
import { connection } from "@squadbase/vite-server/connectors/attio";
|
|
76613
|
+
|
|
76614
|
+
const attio = connection("<connectionId>");
|
|
76615
|
+
|
|
76616
|
+
export default async function handler(c: Context) {
|
|
76617
|
+
const [{ data: deals }, memberMap] = await Promise.all([
|
|
76618
|
+
attio.queryRecords("deals", { limit: 500 }),
|
|
76619
|
+
attio.getWorkspaceMemberMap(),
|
|
76620
|
+
]);
|
|
76621
|
+
|
|
76622
|
+
const byOwner = new Map<string, { owner_name: string; count: number }>();
|
|
76623
|
+
for (const deal of deals) {
|
|
76624
|
+
const values = (deal as { values?: Record<string, unknown[]> }).values ?? {};
|
|
76625
|
+
const ownerCell = (values.owner ?? [])[0] as
|
|
76626
|
+
| { referenced_actor_id?: string }
|
|
76627
|
+
| undefined;
|
|
76628
|
+
const ownerId = ownerCell?.referenced_actor_id ?? "unassigned";
|
|
76629
|
+
const ownerName = memberMap.get(ownerId)?.name ?? "Unassigned";
|
|
76630
|
+
const prev = byOwner.get(ownerId) ?? { owner_name: ownerName, count: 0 };
|
|
76631
|
+
prev.count += 1;
|
|
76632
|
+
byOwner.set(ownerId, prev);
|
|
76633
|
+
}
|
|
76634
|
+
|
|
76635
|
+
return c.json({ rows: Array.from(byOwner.values()) });
|
|
76636
|
+
}
|
|
76637
|
+
\`\`\`
|
|
76638
|
+
|
|
76639
|
+
### Minimal example
|
|
76586
76640
|
|
|
76587
76641
|
\`\`\`ts
|
|
76588
76642
|
import type { Context } from "hono";
|
|
@@ -76607,39 +76661,129 @@ export default async function handler(c: Context) {
|
|
|
76607
76661
|
- Base URL: \`https://api.attio.com/v2\`
|
|
76608
76662
|
- Authentication: Bearer token (handled automatically)
|
|
76609
76663
|
- Querying records uses POST with JSON body (not GET with query params)
|
|
76610
|
-
|
|
76611
|
-
|
|
76612
|
-
|
|
76613
|
-
|
|
76614
|
-
-
|
|
76615
|
-
|
|
76616
|
-
|
|
76617
|
-
-
|
|
76618
|
-
-
|
|
76619
|
-
-
|
|
76620
|
-
-
|
|
76621
|
-
- GET \`/
|
|
76622
|
-
|
|
76623
|
-
|
|
76624
|
-
|
|
76625
|
-
|
|
76626
|
-
- \`
|
|
76627
|
-
- \`
|
|
76664
|
+
- Update semantics: PATCH appends multiselect values, PUT overwrites them
|
|
76665
|
+
- Many list endpoints support \`limit\` and \`offset\` for pagination
|
|
76666
|
+
|
|
76667
|
+
#### Meta
|
|
76668
|
+
- GET \`/self\` \u2014 current API token introspection (workspace id, scopes, token status)
|
|
76669
|
+
|
|
76670
|
+
#### Objects & Attributes
|
|
76671
|
+
- GET \`/objects\` \u2014 list all objects in the workspace (default: people, companies, deals; plus any custom objects configured)
|
|
76672
|
+
- GET \`/objects/{object}\` \u2014 get a single object
|
|
76673
|
+
- GET \`/objects/{object}/views\` \u2014 list views for an object
|
|
76674
|
+
- GET \`/objects/{object}/attributes\` \u2014 list attributes for an object
|
|
76675
|
+
- GET \`/objects/{object}/attributes/{attribute}\` \u2014 get an attribute
|
|
76676
|
+
- GET \`/objects/{object}/attributes/{attribute}/options\` \u2014 list select options
|
|
76677
|
+
- GET \`/objects/{object}/attributes/{attribute}/statuses\` \u2014 list statuses
|
|
76678
|
+
|
|
76679
|
+
#### Records
|
|
76680
|
+
- POST \`/objects/{object}/records/query\` \u2014 query records (filter / sorts / limit / offset)
|
|
76681
|
+
- GET \`/objects/{object}/records/{record_id}\` \u2014 get a record
|
|
76682
|
+
- POST \`/objects/{object}/records\` \u2014 create a record (body: \`{ "data": { ... } }\`)
|
|
76683
|
+
- PATCH \`/objects/{object}/records/{record_id}\` \u2014 update (append multiselect)
|
|
76684
|
+
- PUT \`/objects/{object}/records/{record_id}\` \u2014 update (overwrite multiselect)
|
|
76685
|
+
- DELETE \`/objects/{object}/records/{record_id}\` \u2014 delete a record
|
|
76686
|
+
- PUT \`/objects/{object}/records\` \u2014 assert (upsert) by matching attribute
|
|
76687
|
+
- GET \`/objects/{object}/records/{record_id}/entries\` \u2014 list list entries that reference the record
|
|
76688
|
+
|
|
76689
|
+
#### Lists & Entries
|
|
76690
|
+
- GET \`/lists\` \u2014 list all lists
|
|
76691
|
+
- GET \`/lists/{list_id}\` \u2014 get a list
|
|
76692
|
+
- GET \`/lists/{list_id}/views\` \u2014 list views for a list
|
|
76693
|
+
- POST \`/lists/{list_id}/entries/query\` \u2014 query list entries
|
|
76694
|
+
- GET \`/lists/{list_id}/entries/{entry_id}\` \u2014 get a list entry
|
|
76695
|
+
- POST \`/lists/{list_id}/entries\` \u2014 create an entry
|
|
76696
|
+
- PATCH \`/lists/{list_id}/entries/{entry_id}\` \u2014 update (append multiselect)
|
|
76697
|
+
- PUT \`/lists/{list_id}/entries/{entry_id}\` \u2014 update (overwrite multiselect)
|
|
76698
|
+
- DELETE \`/lists/{list_id}/entries/{entry_id}\` \u2014 delete an entry
|
|
76699
|
+
- PUT \`/lists/{list_id}/entries\` \u2014 assert (upsert) a list entry by parent
|
|
76700
|
+
|
|
76701
|
+
#### Workspace Members
|
|
76702
|
+
- GET \`/workspace_members\` \u2014 list every member of the workspace (team members, their roles, and access levels)
|
|
76703
|
+
- GET \`/workspace_members/{workspace_member_id}\` \u2014 get a single workspace member
|
|
76704
|
+
|
|
76705
|
+
#### Notes, Tasks, Threads & Comments
|
|
76706
|
+
- \`/notes\` (GET list, POST create) and \`/notes/{note_id}\` (GET / PATCH / DELETE). Filter list notes with \`?parent_object={object}&parent_record_id={id}\`.
|
|
76707
|
+
- \`/tasks\` (GET list, POST create) and \`/tasks/{task_id}\` (GET / PATCH / DELETE)
|
|
76708
|
+
- \`/threads\` (GET list) and \`/threads/{thread_id}\` (GET)
|
|
76709
|
+
- \`/comments\` (POST create) and \`/comments/{comment_id}\` (GET / PATCH / DELETE)
|
|
76710
|
+
|
|
76711
|
+
#### Webhooks
|
|
76712
|
+
- GET \`/webhooks\`, POST \`/webhooks\`, GET/PATCH/DELETE \`/webhooks/{webhook_id}\`
|
|
76713
|
+
|
|
76714
|
+
#### Meetings
|
|
76715
|
+
- GET \`/meetings\`, GET \`/meetings/{meeting_id}\`
|
|
76716
|
+
|
|
76717
|
+
#### Query Body (for POST /objects/{object}/records/query and /lists/{list_id}/entries/query)
|
|
76718
|
+
- \`filter\` \u2014 filter conditions
|
|
76719
|
+
- \`sorts\` \u2014 array of sort specifications
|
|
76720
|
+
- \`limit\` \u2014 max records per page (default 25)
|
|
76721
|
+
- \`offset\` \u2014 pagination offset`,
|
|
76628
76722
|
ja: `### \u30C4\u30FC\u30EB
|
|
76629
76723
|
|
|
76630
|
-
- \`attio_request\`: Attio REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EC\u30B3\u30FC\u30C9\uFF08people\u3001companies\u3001deals\
|
|
76724
|
+
- \`attio_request\`: Attio REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EC\u30B3\u30FC\u30C9\uFF08people\u3001companies\u3001deals\u3001\u304A\u3088\u3073\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306B\u8A2D\u5B9A\u3055\u308C\u305F\u30AB\u30B9\u30BF\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF09\u3068\u305D\u306E\u5C5E\u6027\u3001\u30EA\u30B9\u30C8\u3068\u30A8\u30F3\u30C8\u30EA\u3001\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u30E1\u30F3\u30D0\u30FC\u3001\u30CE\u30FC\u30C8\u3001\u30BF\u30B9\u30AF\u3001\u30B9\u30EC\u30C3\u30C9\u3001\u30B3\u30E1\u30F3\u30C8\u3001Webhook\u3001\u30DF\u30FC\u30C6\u30A3\u30F3\u30B0\u306A\u3069\u3001\u3059\u3079\u3066\u306EAttio\u30EA\u30BD\u30FC\u30B9\u306E\u64CD\u4F5C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Bearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30EC\u30B3\u30FC\u30C9\u306E\u30AF\u30A8\u30EA\u306B\u306F POST \`/objects/{object}/records/query\` \u3092\u30D5\u30A3\u30EB\u30BF\u4ED8\u304D\u306EJSON\u30DC\u30C7\u30A3\u3067\u4F7F\u7528\u3057\u307E\u3059\u3002\u90E8\u5206\u66F4\u65B0\uFF08multiselect\u306E\u8FFD\u52A0\uFF09\u306B\u306FPATCH\u3001\u5168\u7F6E\u63DB\uFF08multiselect\u306E\u4E0A\u66F8\u304D\uFF09\u306B\u306FPUT\u3092\u4F7F\u3044\u307E\u3059\u3002**\u5FC5\u305A** \u6700\u521D\u306B GET \`/objects\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306B\u5B9F\u5728\u3059\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8slug\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
76631
76725
|
|
|
76632
76726
|
### Business Logic
|
|
76633
76727
|
|
|
76634
|
-
\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\
|
|
76728
|
+
\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u8A8D\u8A3C\u306FSDK\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u5074\u3067\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
76635
76729
|
|
|
76636
76730
|
SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
|
|
76637
76731
|
- \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
|
|
76638
|
-
- \`client.
|
|
76639
|
-
- \`client.
|
|
76640
|
-
- \`client.
|
|
76641
|
-
- \`client.getRecord(object, recordId)\`
|
|
76642
|
-
- \`client.queryListEntries(listId, options?)\`
|
|
76732
|
+
- \`client.identify()\` \u2014 \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9/\u30C8\u30FC\u30AF\u30F3\u60C5\u5831\uFF08GET /meta/identify\uFF09
|
|
76733
|
+
- Objects: \`client.listObjects()\`, \`client.getObject(object)\`, \`client.listObjectViews(object)\`
|
|
76734
|
+
- Attributes: \`client.listAttributes(object)\`, \`client.getAttribute(object, attribute)\`, \`client.listSelectOptions(object, attribute)\`, \`client.listStatuses(object, attribute)\`
|
|
76735
|
+
- Records: \`client.queryRecords(object, options?)\`, \`client.getRecord(object, recordId)\`, \`client.createRecord(object, data)\`, \`client.updateRecord(object, recordId, data)\` (PATCH), \`client.overwriteRecord(object, recordId, data)\` (PUT), \`client.deleteRecord(object, recordId)\`, \`client.assertRecord(object, data)\`, \`client.listRecordEntries(object, recordId)\`
|
|
76736
|
+
- Lists & entries: \`client.listLists()\`, \`client.getList(listId)\`, \`client.listListViews(listId)\`, \`client.queryListEntries(listId, options?)\`, \`client.getListEntry(listId, entryId)\`, \`client.createListEntry(listId, data)\`, \`client.updateListEntry(listId, entryId, data)\`, \`client.overwriteListEntry(listId, entryId, data)\`, \`client.deleteListEntry(listId, entryId)\`, \`client.assertListEntry(listId, data)\`
|
|
76737
|
+
- Workspace members: \`client.listWorkspaceMembers()\`, \`client.getWorkspaceMember(workspaceMemberId)\`, \`client.getWorkspaceMemberMap()\` (returns \`Map<workspace_member_id, { id, name, email }>\` \u2014 use to resolve \`owner\` / actor-reference fields to names)
|
|
76738
|
+
- Notes: \`client.listNotes(options?)\`, \`client.getNote(noteId)\`, \`client.createNote(data)\`, \`client.updateNote(noteId, data)\`, \`client.deleteNote(noteId)\`
|
|
76739
|
+
- Tasks: \`client.listTasks(options?)\`, \`client.getTask(taskId)\`, \`client.createTask(data)\`, \`client.updateTask(taskId, data)\`, \`client.deleteTask(taskId)\`
|
|
76740
|
+
- Threads & comments: \`client.listThreads(options?)\`, \`client.getThread(threadId)\`, \`client.createComment(data)\`, \`client.getComment(commentId)\`, \`client.updateComment(commentId, data)\`, \`client.deleteComment(commentId)\`
|
|
76741
|
+
- Webhooks: \`client.listWebhooks()\`, \`client.getWebhook(webhookId)\`, \`client.createWebhook(data)\`, \`client.updateWebhook(webhookId, data)\`, \`client.deleteWebhook(webhookId)\`
|
|
76742
|
+
- Meetings: \`client.listMeetings(options?)\`, \`client.getMeeting(meetingId)\`
|
|
76743
|
+
|
|
76744
|
+
### \u91CD\u8981: Owner / Actor reference \u306E\u540D\u524D\u89E3\u6C7A
|
|
76745
|
+
|
|
76746
|
+
\u30EC\u30B3\u30FC\u30C9\u5024\u306E \`owner\`\uFF08\u304A\u3088\u3073 \`actor-reference\` \u578B\u306E\u5C5E\u6027\uFF09\u306F\u540D\u524D\u3067\u306F\u306A\u304F\u3001\u6B21\u306E\u3088\u3046\u306Aactor ID\u3092\u542B\u307F\u307E\u3059\uFF1A
|
|
76747
|
+
\`\`\`json
|
|
76748
|
+
{ "referenced_actor_type": "workspace-member", "referenced_actor_id": "<workspace_member_id>" }
|
|
76749
|
+
\`\`\`
|
|
76750
|
+
\u3053\u308C\u3092\u305D\u306E\u307E\u307E\u8FD4\u3059\u3068UI\u306B\u4E0D\u900F\u660E\u306AID\uFF08\`owner_name\` \u304CUUID\u306E\u307E\u307E\u7B49\uFF09\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002**\u5FC5\u305A** \u30CF\u30F3\u30C9\u30E9\u5185\u3067 \`workspace_member_id\` \u2192 \u540D\u524D\u3078\u89E3\u6C7A\u3057\u3066\u304B\u3089\u8FD4\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
76751
|
+
|
|
76752
|
+
- \u89E3\u6C7A\u306B\u306F \`client.getWorkspaceMemberMap()\` \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F \`Map<workspace_member_id, { id, name, email }>\` \u3092\u8FD4\u3057\u3001\u305D\u306E\u307E\u307Eactor reference\u3068\u7D50\u5408\u3067\u304D\u307E\u3059\u3002
|
|
76753
|
+
- \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u30E1\u30F3\u30D0\u30FC\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F\u30C8\u30C3\u30D7\u30EC\u30D9\u30EB\u306E \`GET /workspace_members\` \u3067\u3059\u3002
|
|
76754
|
+
- \`queryRecords\` \u3068 \`getWorkspaceMemberMap\` \u306F \`Promise.all\` \u3067\u4E26\u5217\u53D6\u5F97\u3057\u3001\u30E1\u30E2\u30EA\u4E0A\u3067\u7D50\u5408\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u90FD\u5EA6\u53D6\u5F97\u305B\u305A\u4E00\u62EC\u53D6\u5F97\uFF09\u3002
|
|
76755
|
+
|
|
76756
|
+
\u4F8B \u2014 owner\u3054\u3068\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\uFF08\u540D\u524D\u89E3\u6C7A\u8FBC\u307F\uFF09:
|
|
76757
|
+
\`\`\`ts
|
|
76758
|
+
import type { Context } from "hono";
|
|
76759
|
+
import { connection } from "@squadbase/vite-server/connectors/attio";
|
|
76760
|
+
|
|
76761
|
+
const attio = connection("<connectionId>");
|
|
76762
|
+
|
|
76763
|
+
export default async function handler(c: Context) {
|
|
76764
|
+
const [{ data: deals }, memberMap] = await Promise.all([
|
|
76765
|
+
attio.queryRecords("deals", { limit: 500 }),
|
|
76766
|
+
attio.getWorkspaceMemberMap(),
|
|
76767
|
+
]);
|
|
76768
|
+
|
|
76769
|
+
const byOwner = new Map<string, { owner_name: string; count: number }>();
|
|
76770
|
+
for (const deal of deals) {
|
|
76771
|
+
const values = (deal as { values?: Record<string, unknown[]> }).values ?? {};
|
|
76772
|
+
const ownerCell = (values.owner ?? [])[0] as
|
|
76773
|
+
| { referenced_actor_id?: string }
|
|
76774
|
+
| undefined;
|
|
76775
|
+
const ownerId = ownerCell?.referenced_actor_id ?? "unassigned";
|
|
76776
|
+
const ownerName = memberMap.get(ownerId)?.name ?? "\u672A\u5272\u5F53";
|
|
76777
|
+
const prev = byOwner.get(ownerId) ?? { owner_name: ownerName, count: 0 };
|
|
76778
|
+
prev.count += 1;
|
|
76779
|
+
byOwner.set(ownerId, prev);
|
|
76780
|
+
}
|
|
76781
|
+
|
|
76782
|
+
return c.json({ rows: Array.from(byOwner.values()) });
|
|
76783
|
+
}
|
|
76784
|
+
\`\`\`
|
|
76785
|
+
|
|
76786
|
+
### \u6700\u5C0F\u30B5\u30F3\u30D7\u30EB
|
|
76643
76787
|
|
|
76644
76788
|
\`\`\`ts
|
|
76645
76789
|
import type { Context } from "hono";
|
|
@@ -76664,20 +76808,60 @@ export default async function handler(c: Context) {
|
|
|
76664
76808
|
- \u30D9\u30FC\u30B9URL: \`https://api.attio.com/v2\`
|
|
76665
76809
|
- \u8A8D\u8A3C: Bearer\u30C8\u30FC\u30AF\u30F3\uFF08\u81EA\u52D5\u8A2D\u5B9A\uFF09
|
|
76666
76810
|
- \u30EC\u30B3\u30FC\u30C9\u306E\u30AF\u30A8\u30EA\u306B\u306FGET\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u306F\u306A\u304FPOST\u3067JSON\u30DC\u30C7\u30A3\u3092\u4F7F\u7528\u3057\u307E\u3059
|
|
76811
|
+
- \u66F4\u65B0\u30BB\u30DE\u30F3\u30C6\u30A3\u30AF\u30B9: PATCH\u306Fmultiselect\u5024\u3092\u8FFD\u52A0\u3001PUT\u306F\u4E0A\u66F8\u304D
|
|
76812
|
+
- \u591A\u304F\u306E\u4E00\u89A7\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F \`limit\` \u3068 \`offset\` \u306B\u3088\u308B\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u30B5\u30DD\u30FC\u30C8
|
|
76667
76813
|
|
|
76668
|
-
####
|
|
76669
|
-
- GET \`/
|
|
76814
|
+
#### Meta
|
|
76815
|
+
- GET \`/self\` \u2014 \u73FE\u5728\u306EAPI\u30C8\u30FC\u30AF\u30F3\u306E\u60C5\u5831\uFF08workspace id / scopes / \u6709\u52B9\u72B6\u614B\uFF09
|
|
76816
|
+
|
|
76817
|
+
#### Objects & Attributes
|
|
76818
|
+
- GET \`/objects\` \u2014 \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u5168\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\u306F people / companies / deals\u3001\u52A0\u3048\u3066\u8A2D\u5B9A\u6E08\u307F\u306E\u30AB\u30B9\u30BF\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF09
|
|
76819
|
+
- GET \`/objects/{object}\` \u2014 \u5358\u4E00\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u53D6\u5F97
|
|
76820
|
+
- GET \`/objects/{object}/views\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u30D3\u30E5\u30FC\u4E00\u89A7
|
|
76670
76821
|
- GET \`/objects/{object}/attributes\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u5C5E\u6027\u4E00\u89A7
|
|
76671
|
-
-
|
|
76822
|
+
- GET \`/objects/{object}/attributes/{attribute}\` \u2014 \u5C5E\u6027\u306E\u53D6\u5F97
|
|
76823
|
+
- GET \`/objects/{object}/attributes/{attribute}/options\` \u2014 \u30BB\u30EC\u30AF\u30C8\u9078\u629E\u80A2\u306E\u4E00\u89A7
|
|
76824
|
+
- GET \`/objects/{object}/attributes/{attribute}/statuses\` \u2014 \u30B9\u30C6\u30FC\u30BF\u30B9\u4E00\u89A7
|
|
76825
|
+
|
|
76826
|
+
#### Records
|
|
76827
|
+
- POST \`/objects/{object}/records/query\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u691C\u7D22\uFF08filter / sorts / limit / offset\uFF09
|
|
76672
76828
|
- GET \`/objects/{object}/records/{record_id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
|
|
76673
|
-
- POST \`/objects/{object}/records\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210
|
|
76674
|
-
- PATCH \`/objects/{object}/records/{record_id}\` \u2014 \
|
|
76829
|
+
- POST \`/objects/{object}/records\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210\uFF08body: \`{ "data": { ... } }\`\uFF09
|
|
76830
|
+
- PATCH \`/objects/{object}/records/{record_id}\` \u2014 \u66F4\u65B0\uFF08multiselect\u8FFD\u52A0\uFF09
|
|
76831
|
+
- PUT \`/objects/{object}/records/{record_id}\` \u2014 \u66F4\u65B0\uFF08multiselect\u4E0A\u66F8\u304D\uFF09
|
|
76675
76832
|
- DELETE \`/objects/{object}/records/{record_id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u524A\u9664
|
|
76676
|
-
-
|
|
76677
|
-
-
|
|
76678
|
-
- GET \`/notes?parent_object={object}&parent_record_id={id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u30CE\u30FC\u30C8\u3092\u53D6\u5F97
|
|
76833
|
+
- PUT \`/objects/{object}/records\` \u2014 \u4E00\u81F4\u5C5E\u6027\u306B\u3088\u308B\u30A2\u30B5\u30FC\u30C8\uFF08upsert\uFF09
|
|
76834
|
+
- GET \`/objects/{object}/records/{record_id}/entries\` \u2014 \u30EC\u30B3\u30FC\u30C9\u3092\u53C2\u7167\u3059\u308B\u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u4E00\u89A7
|
|
76679
76835
|
|
|
76680
|
-
####
|
|
76836
|
+
#### Lists & Entries
|
|
76837
|
+
- GET \`/lists\` \u2014 \u30EA\u30B9\u30C8\u4E00\u89A7
|
|
76838
|
+
- GET \`/lists/{list_id}\` \u2014 \u30EA\u30B9\u30C8\u306E\u53D6\u5F97
|
|
76839
|
+
- GET \`/lists/{list_id}/views\` \u2014 \u30EA\u30B9\u30C8\u306E\u30D3\u30E5\u30FC\u4E00\u89A7
|
|
76840
|
+
- POST \`/lists/{list_id}/entries/query\` \u2014 \u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u306E\u691C\u7D22
|
|
76841
|
+
- GET \`/lists/{list_id}/entries/{entry_id}\` \u2014 \u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u306E\u53D6\u5F97
|
|
76842
|
+
- POST \`/lists/{list_id}/entries\` \u2014 \u30A8\u30F3\u30C8\u30EA\u4F5C\u6210
|
|
76843
|
+
- PATCH \`/lists/{list_id}/entries/{entry_id}\` \u2014 \u66F4\u65B0\uFF08multiselect\u8FFD\u52A0\uFF09
|
|
76844
|
+
- PUT \`/lists/{list_id}/entries/{entry_id}\` \u2014 \u66F4\u65B0\uFF08multiselect\u4E0A\u66F8\u304D\uFF09
|
|
76845
|
+
- DELETE \`/lists/{list_id}/entries/{entry_id}\` \u2014 \u30A8\u30F3\u30C8\u30EA\u524A\u9664
|
|
76846
|
+
- PUT \`/lists/{list_id}/entries\` \u2014 \u89AA\u30EC\u30B3\u30FC\u30C9\u306B\u3088\u308B\u30A2\u30B5\u30FC\u30C8\uFF08upsert\uFF09
|
|
76847
|
+
|
|
76848
|
+
#### Workspace Members\uFF08\u30C1\u30FC\u30E0\u30E1\u30F3\u30D0\u30FC\uFF09
|
|
76849
|
+
- GET \`/workspace_members\` \u2014 \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u5168\u30E1\u30F3\u30D0\u30FC\u4E00\u89A7\uFF08\u30ED\u30FC\u30EB\u3084\u30A2\u30AF\u30BB\u30B9\u30EC\u30D9\u30EB\u3092\u542B\u3080\uFF09
|
|
76850
|
+
- GET \`/workspace_members/{workspace_member_id}\` \u2014 \u5358\u4E00\u30E1\u30F3\u30D0\u30FC\u306E\u53D6\u5F97
|
|
76851
|
+
|
|
76852
|
+
#### Notes, Tasks, Threads & Comments
|
|
76853
|
+
- \`/notes\`\uFF08GET \u4E00\u89A7 / POST \u4F5C\u6210\uFF09\u3001\`/notes/{note_id}\`\uFF08GET / PATCH / DELETE\uFF09\u3002\u4E00\u89A7\u306F \`?parent_object={object}&parent_record_id={id}\` \u3067\u7D5E\u308A\u8FBC\u307F\u53EF\u80FD
|
|
76854
|
+
- \`/tasks\`\uFF08GET \u4E00\u89A7 / POST \u4F5C\u6210\uFF09\u3001\`/tasks/{task_id}\`\uFF08GET / PATCH / DELETE\uFF09
|
|
76855
|
+
- \`/threads\`\uFF08GET \u4E00\u89A7\uFF09\u3001\`/threads/{thread_id}\`\uFF08GET\uFF09
|
|
76856
|
+
- \`/comments\`\uFF08POST \u4F5C\u6210\uFF09\u3001\`/comments/{comment_id}\`\uFF08GET / PATCH / DELETE\uFF09
|
|
76857
|
+
|
|
76858
|
+
#### Webhooks
|
|
76859
|
+
- GET \`/webhooks\`\u3001POST \`/webhooks\`\u3001GET/PATCH/DELETE \`/webhooks/{webhook_id}\`
|
|
76860
|
+
|
|
76861
|
+
#### Meetings
|
|
76862
|
+
- GET \`/meetings\`\u3001GET \`/meetings/{meeting_id}\`
|
|
76863
|
+
|
|
76864
|
+
#### \u30AF\u30A8\u30EA\u30DC\u30C7\u30A3 (POST /objects/{object}/records/query \u304A\u3088\u3073 /lists/{list_id}/entries/query)
|
|
76681
76865
|
- \`filter\` \u2014 \u30D5\u30A3\u30EB\u30BF\u6761\u4EF6
|
|
76682
76866
|
- \`sorts\` \u2014 \u30BD\u30FC\u30C8\u6307\u5B9A\u306E\u914D\u5217
|
|
76683
76867
|
- \`limit\` \u2014 \u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u6700\u5927\u30EC\u30B3\u30FC\u30C9\u6570\uFF08\u30C7\u30D5\u30A9\u30EB\u30C825\uFF09
|
|
@@ -82004,9 +82188,9 @@ var gmailOnboarding = new ConnectorOnboarding({
|
|
|
82004
82188
|
ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Gmail\uFF08\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\uFF09\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u63A5\u7D9A\u4F5C\u6210\u6642\u306B\u306F\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8JSON\u306E\u307F\u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3001\u59D4\u4EFB\u5BFE\u8C61\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u3053\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u53D6\u5F97\u3057\u307E\u3059\u3002
|
|
82005
82189
|
|
|
82006
82190
|
1. \`askUserQuestion\` \u3067\u3001\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304CDomain-wide Delegation\u3067\u4EE3\u7406\u30A2\u30AF\u30BB\u30B9\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u30D2\u30A2\u30EA\u30F3\u30B0\u3059\u308B:
|
|
82191
|
+
- \`type\`: \`"freeText"\`
|
|
82007
82192
|
- \`question\`: \u300CGmail\u3092\u53C2\u7167\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u300D
|
|
82008
|
-
- \`
|
|
82009
|
-
- \`options\`: \`[{ label: "\u4F8B: user@example.com", description: "\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u4EE3\u7406\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B" }, { label: "\u5225\u306E\u4F8B: admin@example.com", description: "\u7BA1\u7406\u8005\u30E6\u30FC\u30B6\u30FC\u3084\u5171\u6709\u30E1\u30FC\u30EB\u30DC\u30C3\u30AF\u30B9\u306E\u30A2\u30C9\u30EC\u30B9\u3067\u3082\u53EF" }]\` \uFF08\`allowFreeText: true\` \u306E\u305F\u3081\u81EA\u7531\u5165\u529B\u53EF\uFF09
|
|
82193
|
+
- \`placeholder\`: \`"user@example.com"\`
|
|
82010
82194
|
2. \u53D7\u3051\u53D6\u3063\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`updateConnectionParameters\` \u3067\u4FDD\u5B58\u3059\u308B:
|
|
82011
82195
|
- \`parameterSlug\`: \`"delegated-user-email"\`
|
|
82012
82196
|
- \`options\`: \`[{ value: <\u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>, label: <\u540C\u3058\u5024> }]\`\uFF081\u4EF6\u306E\u307F\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u9078\u629E\u3055\u308C\u308B\uFF09
|
|
@@ -82031,9 +82215,9 @@ var gmailOnboarding = new ConnectorOnboarding({
|
|
|
82031
82215
|
en: `Follow these steps to set up the Gmail (Service Account) connection. Only the service account JSON is provided at connection creation time \u2014 the delegated user email is collected during this setup flow.
|
|
82032
82216
|
|
|
82033
82217
|
1. Call \`askUserQuestion\` to ask the user for the Google Workspace user email the service account will impersonate via Domain-wide Delegation:
|
|
82218
|
+
- \`type\`: \`"freeText"\`
|
|
82034
82219
|
- \`question\`: "Please enter the email address of the Google Workspace user whose Gmail mailbox you want to access"
|
|
82035
|
-
- \`
|
|
82036
|
-
- \`options\`: \`[{ label: "e.g., user@example.com", description: "The user whose mailbox the service account will impersonate" }, { label: "e.g., admin@example.com", description: "An admin user or shared mailbox is also fine" }]\` (free text entry is allowed because \`allowFreeText: true\`)
|
|
82220
|
+
- \`placeholder\`: \`"user@example.com"\`
|
|
82037
82221
|
2. Save the email via \`updateConnectionParameters\`:
|
|
82038
82222
|
- \`parameterSlug\`: \`"delegated-user-email"\`
|
|
82039
82223
|
- \`options\`: \`[{ value: <entered email>, label: <same value> }]\` (a single option is auto-selected)
|
|
@@ -86212,6 +86396,14 @@ function resolveEnvVarOptional(entry, key) {
|
|
|
86212
86396
|
import { getContext } from "hono/context-storage";
|
|
86213
86397
|
import { getCookie } from "hono/cookie";
|
|
86214
86398
|
var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
|
|
86399
|
+
function normalizeHeaders(input) {
|
|
86400
|
+
const out = {};
|
|
86401
|
+
if (!input) return out;
|
|
86402
|
+
new Headers(input).forEach((value, key) => {
|
|
86403
|
+
out[key] = value;
|
|
86404
|
+
});
|
|
86405
|
+
return out;
|
|
86406
|
+
}
|
|
86215
86407
|
function createSandboxProxyFetch(connectionId) {
|
|
86216
86408
|
return async (input, init) => {
|
|
86217
86409
|
const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
|
|
@@ -86235,6 +86427,7 @@ function createSandboxProxyFetch(connectionId) {
|
|
|
86235
86427
|
body: JSON.stringify({
|
|
86236
86428
|
url: originalUrl,
|
|
86237
86429
|
method: originalMethod,
|
|
86430
|
+
headers: normalizeHeaders(init?.headers),
|
|
86238
86431
|
body: originalBody
|
|
86239
86432
|
})
|
|
86240
86433
|
});
|
|
@@ -86269,6 +86462,7 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
86269
86462
|
body: JSON.stringify({
|
|
86270
86463
|
url: originalUrl,
|
|
86271
86464
|
method: originalMethod,
|
|
86465
|
+
headers: normalizeHeaders(init?.headers),
|
|
86272
86466
|
body: originalBody
|
|
86273
86467
|
})
|
|
86274
86468
|
});
|