@squadbase/vite-server 0.1.17-dev.24af54e → 0.1.17-dev.423ee34
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 +4873 -1073
- package/dist/connectors/airtable-oauth.js +78 -11
- package/dist/connectors/airtable.js +74 -11
- package/dist/connectors/amplitude.js +38 -11
- package/dist/connectors/anthropic.js +4 -2
- package/dist/connectors/asana.js +67 -13
- package/dist/connectors/attio.js +60 -16
- package/dist/connectors/aws-billing.js +38 -11
- package/dist/connectors/azure-sql.js +64 -13
- package/dist/connectors/backlog-api-key.js +70 -18
- package/dist/connectors/clickup.js +80 -13
- package/dist/connectors/cosmosdb.js +42 -15
- package/dist/connectors/customerio.js +39 -12
- package/dist/connectors/dbt.js +716 -28
- package/dist/connectors/freshdesk.js +112 -11
- package/dist/connectors/freshsales.js +38 -11
- package/dist/connectors/freshservice.js +38 -11
- package/dist/connectors/gamma.js +47 -20
- package/dist/connectors/gemini.js +4 -2
- package/dist/connectors/github.js +42 -15
- package/dist/connectors/gmail-oauth.js +38 -13
- package/dist/connectors/gmail.js +34 -7
- package/dist/connectors/google-ads.js +38 -11
- package/dist/connectors/google-analytics-oauth.js +182 -28
- package/dist/connectors/google-analytics.js +653 -104
- package/dist/connectors/google-audit-log.js +34 -7
- package/dist/connectors/google-calendar-oauth.js +91 -18
- package/dist/connectors/google-calendar.js +91 -14
- package/dist/connectors/google-docs.js +38 -13
- package/dist/connectors/google-drive.js +60 -13
- package/dist/connectors/google-search-console-oauth.js +156 -20
- package/dist/connectors/google-sheets.js +36 -9
- package/dist/connectors/google-slides.js +38 -13
- package/dist/connectors/grafana.js +75 -13
- package/dist/connectors/hubspot-oauth.js +69 -12
- package/dist/connectors/hubspot.js +55 -12
- package/dist/connectors/influxdb.js +38 -11
- package/dist/connectors/intercom-oauth.js +100 -15
- package/dist/connectors/intercom.js +42 -15
- package/dist/connectors/jdbc.js +36 -9
- package/dist/connectors/jira-api-key.js +98 -14
- package/dist/connectors/kintone-api-token.js +96 -21
- package/dist/connectors/kintone.js +84 -14
- package/dist/connectors/linear.js +84 -15
- package/dist/connectors/linkedin-ads.js +71 -17
- package/dist/connectors/mailchimp-oauth.js +36 -9
- package/dist/connectors/mailchimp.js +36 -9
- package/dist/connectors/meta-ads-oauth.js +63 -17
- package/dist/connectors/meta-ads.js +65 -17
- package/dist/connectors/mixpanel.js +38 -11
- package/dist/connectors/monday.js +39 -12
- package/dist/connectors/mongodb.js +38 -11
- package/dist/connectors/notion-oauth.js +88 -14
- package/dist/connectors/notion.js +90 -14
- package/dist/connectors/openai.js +4 -2
- package/dist/connectors/oracle.js +78 -20
- package/dist/connectors/outlook-oauth.js +48 -23
- package/dist/connectors/powerbi-oauth.js +321 -49
- package/dist/connectors/salesforce.js +72 -12
- package/dist/connectors/semrush.js +374 -52
- package/dist/connectors/sentry.js +66 -13
- package/dist/connectors/shopify-oauth.js +71 -13
- package/dist/connectors/shopify.js +38 -11
- package/dist/connectors/sqlserver.js +64 -13
- package/dist/connectors/stripe-api-key.js +96 -18
- package/dist/connectors/stripe-oauth.js +98 -22
- package/dist/connectors/supabase.js +55 -11
- package/dist/connectors/tableau.js +262 -92
- package/dist/connectors/tiktok-ads.js +67 -19
- package/dist/connectors/wix-store.js +38 -11
- package/dist/connectors/zendesk-oauth.js +83 -15
- package/dist/connectors/zendesk.js +42 -15
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4902 -1077
- package/dist/main.js +4891 -1071
- package/dist/vite-plugin.js +4871 -1071
- package/package.json +1 -1
|
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
|
|
|
16
16
|
type;
|
|
17
17
|
secret;
|
|
18
18
|
required;
|
|
19
|
+
isDeprecated;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.slug = config.slug;
|
|
21
22
|
this.name = config.name;
|
|
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
|
|
|
24
25
|
this.type = config.type;
|
|
25
26
|
this.secret = config.secret;
|
|
26
27
|
this.required = config.required;
|
|
28
|
+
this.isDeprecated = config.isDeprecated ?? false;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Get the parameter value from a ConnectorConnectionObject.
|
|
@@ -224,7 +226,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
224
226
|
/**
|
|
225
227
|
* Create tools for connections that belong to this connector.
|
|
226
228
|
* Filters connections by connectorKey internally.
|
|
227
|
-
* Returns tools keyed as
|
|
229
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
228
230
|
*/
|
|
229
231
|
createTools(connections, config, opts) {
|
|
230
232
|
const myConnections = connections.filter(
|
|
@@ -234,7 +236,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
234
236
|
for (const t of Object.values(this.tools)) {
|
|
235
237
|
const tool = t.createTool(myConnections, config);
|
|
236
238
|
const originalToModelOutput = tool.toModelOutput;
|
|
237
|
-
result[
|
|
239
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
238
240
|
...tool,
|
|
239
241
|
toModelOutput: async (options) => {
|
|
240
242
|
if (!originalToModelOutput) {
|
|
@@ -290,19 +292,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
290
292
|
};
|
|
291
293
|
let state = flow.initialState();
|
|
292
294
|
let answerIdx = 0;
|
|
295
|
+
const pendingParameterUpdates = [];
|
|
293
296
|
for (const step of flow.steps) {
|
|
294
297
|
const ans = ctx.answers[answerIdx];
|
|
295
298
|
if (ans && ans.questionSlug === step.slug) {
|
|
296
299
|
state = step.applyAnswer(state, ans.answer);
|
|
300
|
+
if (step.toParameterUpdates) {
|
|
301
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
302
|
+
}
|
|
297
303
|
answerIdx += 1;
|
|
298
304
|
continue;
|
|
299
305
|
}
|
|
306
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
300
307
|
if (step.type === "text") {
|
|
308
|
+
if (step.fetchOptions) {
|
|
309
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
310
|
+
if (options2.length === 0) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
301
314
|
return {
|
|
302
315
|
type: "nextQuestion",
|
|
303
316
|
questionSlug: step.slug,
|
|
304
317
|
question: step.question[ctx.language],
|
|
305
|
-
questionType: "text"
|
|
318
|
+
questionType: "text",
|
|
319
|
+
allowFreeText: resolvedAllowFreeText,
|
|
320
|
+
...pendingParameterUpdates.length > 0 && {
|
|
321
|
+
parameterUpdates: pendingParameterUpdates
|
|
322
|
+
}
|
|
306
323
|
};
|
|
307
324
|
}
|
|
308
325
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -314,11 +331,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
314
331
|
questionSlug: step.slug,
|
|
315
332
|
question: step.question[ctx.language],
|
|
316
333
|
questionType: step.type,
|
|
317
|
-
options
|
|
334
|
+
options,
|
|
335
|
+
allowFreeText: resolvedAllowFreeText,
|
|
336
|
+
...pendingParameterUpdates.length > 0 && {
|
|
337
|
+
parameterUpdates: pendingParameterUpdates
|
|
338
|
+
}
|
|
318
339
|
};
|
|
319
340
|
}
|
|
320
341
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
321
|
-
return {
|
|
342
|
+
return {
|
|
343
|
+
type: "fulfilled",
|
|
344
|
+
dataInvestigationResult,
|
|
345
|
+
...pendingParameterUpdates.length > 0 && {
|
|
346
|
+
parameterUpdates: pendingParameterUpdates
|
|
347
|
+
}
|
|
348
|
+
};
|
|
322
349
|
}
|
|
323
350
|
async function resolveSetupSelection(params) {
|
|
324
351
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -781,7 +808,7 @@ var googleAuditLogConnector = new ConnectorPlugin({
|
|
|
781
808
|
systemPrompt: {
|
|
782
809
|
en: `### Tools
|
|
783
810
|
|
|
784
|
-
- \`
|
|
811
|
+
- \`connector_google-audit-log-service-account_request_with_delegation\`: Call the Google Workspace Admin SDK Reports API on behalf of a Workspace admin via Domain-wide Delegation. Pass \`subject\` as the admin email; the token will be issued as that user. Always pass \`scopes\`.
|
|
785
812
|
|
|
786
813
|
### OAuth Scopes (pass as \`scopes\` argument)
|
|
787
814
|
|
|
@@ -870,7 +897,7 @@ export default async function handler(c: Context) {
|
|
|
870
897
|
\`\`\``,
|
|
871
898
|
ja: `### \u30C4\u30FC\u30EB
|
|
872
899
|
|
|
873
|
-
- \`
|
|
900
|
+
- \`connector_google-audit-log-service-account_request_with_delegation\`: Domain-wide Delegation \u7D4C\u7531\u3067 Workspace \u7BA1\u7406\u8005\u306B\u306A\u308A\u3059\u307E\u3057\u3066 Google Workspace Admin SDK Reports API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u4EE3\u7406\u5BFE\u8C61\u306E\u7BA1\u7406\u8005\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`subject\` \u3068\u3057\u3066\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30C8\u30FC\u30AF\u30F3\u306F\u305D\u306E\u30E6\u30FC\u30B6\u30FC\u3068\u3057\u3066\u767A\u884C\u3055\u308C\u307E\u3059\u3002\`scopes\` \u3082\u6BCE\u56DE\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
874
901
|
|
|
875
902
|
### OAuth \u30B9\u30B3\u30FC\u30D7 (\`scopes\` \u5F15\u6570\u3067\u6E21\u3059)
|
|
876
903
|
|
|
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
|
|
|
16
16
|
type;
|
|
17
17
|
secret;
|
|
18
18
|
required;
|
|
19
|
+
isDeprecated;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.slug = config.slug;
|
|
21
22
|
this.name = config.name;
|
|
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
|
|
|
24
25
|
this.type = config.type;
|
|
25
26
|
this.secret = config.secret;
|
|
26
27
|
this.required = config.required;
|
|
28
|
+
this.isDeprecated = config.isDeprecated ?? false;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Get the parameter value from a ConnectorConnectionObject.
|
|
@@ -240,7 +242,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
240
242
|
/**
|
|
241
243
|
* Create tools for connections that belong to this connector.
|
|
242
244
|
* Filters connections by connectorKey internally.
|
|
243
|
-
* Returns tools keyed as
|
|
245
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
244
246
|
*/
|
|
245
247
|
createTools(connections, config, opts) {
|
|
246
248
|
const myConnections = connections.filter(
|
|
@@ -250,7 +252,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
250
252
|
for (const t of Object.values(this.tools)) {
|
|
251
253
|
const tool = t.createTool(myConnections, config);
|
|
252
254
|
const originalToModelOutput = tool.toModelOutput;
|
|
253
|
-
result[
|
|
255
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
254
256
|
...tool,
|
|
255
257
|
toModelOutput: async (options) => {
|
|
256
258
|
if (!originalToModelOutput) {
|
|
@@ -306,19 +308,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
306
308
|
};
|
|
307
309
|
let state = flow.initialState();
|
|
308
310
|
let answerIdx = 0;
|
|
311
|
+
const pendingParameterUpdates = [];
|
|
309
312
|
for (const step of flow.steps) {
|
|
310
313
|
const ans = ctx.answers[answerIdx];
|
|
311
314
|
if (ans && ans.questionSlug === step.slug) {
|
|
312
315
|
state = step.applyAnswer(state, ans.answer);
|
|
316
|
+
if (step.toParameterUpdates) {
|
|
317
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
318
|
+
}
|
|
313
319
|
answerIdx += 1;
|
|
314
320
|
continue;
|
|
315
321
|
}
|
|
322
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
316
323
|
if (step.type === "text") {
|
|
324
|
+
if (step.fetchOptions) {
|
|
325
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
326
|
+
if (options2.length === 0) {
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
317
330
|
return {
|
|
318
331
|
type: "nextQuestion",
|
|
319
332
|
questionSlug: step.slug,
|
|
320
333
|
question: step.question[ctx.language],
|
|
321
|
-
questionType: "text"
|
|
334
|
+
questionType: "text",
|
|
335
|
+
allowFreeText: resolvedAllowFreeText,
|
|
336
|
+
...pendingParameterUpdates.length > 0 && {
|
|
337
|
+
parameterUpdates: pendingParameterUpdates
|
|
338
|
+
}
|
|
322
339
|
};
|
|
323
340
|
}
|
|
324
341
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -330,11 +347,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
330
347
|
questionSlug: step.slug,
|
|
331
348
|
question: step.question[ctx.language],
|
|
332
349
|
questionType: step.type,
|
|
333
|
-
options
|
|
350
|
+
options,
|
|
351
|
+
allowFreeText: resolvedAllowFreeText,
|
|
352
|
+
...pendingParameterUpdates.length > 0 && {
|
|
353
|
+
parameterUpdates: pendingParameterUpdates
|
|
354
|
+
}
|
|
334
355
|
};
|
|
335
356
|
}
|
|
336
357
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
337
|
-
return {
|
|
358
|
+
return {
|
|
359
|
+
type: "fulfilled",
|
|
360
|
+
dataInvestigationResult,
|
|
361
|
+
...pendingParameterUpdates.length > 0 && {
|
|
362
|
+
parameterUpdates: pendingParameterUpdates
|
|
363
|
+
}
|
|
364
|
+
};
|
|
338
365
|
}
|
|
339
366
|
async function resolveSetupSelection(params) {
|
|
340
367
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -510,10 +537,10 @@ var googleCalendarOauthOnboarding = new ConnectorOnboarding({
|
|
|
510
537
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
511
538
|
},
|
|
512
539
|
dataOverviewInstructions: {
|
|
513
|
-
en: `1. Call
|
|
514
|
-
2. Call
|
|
515
|
-
ja: `1.
|
|
516
|
-
2.
|
|
540
|
+
en: `1. Call connector_google-calendar-oauth_request with GET /calendars/{calendarId} to get the default calendar's metadata
|
|
541
|
+
2. Call connector_google-calendar-oauth_request with GET /calendars/{calendarId}/events with query params timeMin (current RFC3339 timestamp), singleEvents=true, orderBy=startTime, and maxResults=10 to sample upcoming events`,
|
|
542
|
+
ja: `1. connector_google-calendar-oauth_request \u3067 GET /calendars/{calendarId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97
|
|
543
|
+
2. connector_google-calendar-oauth_request \u3067 GET /calendars/{calendarId}/events \u3092\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF timeMin\uFF08\u73FE\u5728\u306ERFC3339\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\uFF09\u3001singleEvents=true\u3001orderBy=startTime\u3001maxResults=10 \u3067\u547C\u3073\u51FA\u3057\u3001\u76F4\u8FD1\u306E\u30A4\u30D9\u30F3\u30C8\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
|
|
517
544
|
}
|
|
518
545
|
});
|
|
519
546
|
|
|
@@ -537,6 +564,37 @@ async function listCalendars(config) {
|
|
|
537
564
|
const data = await calendarApiFetch(config, url);
|
|
538
565
|
return data.items ?? [];
|
|
539
566
|
}
|
|
567
|
+
async function fetchEventActivity(config, calendarId) {
|
|
568
|
+
try {
|
|
569
|
+
const now = /* @__PURE__ */ new Date();
|
|
570
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1e3);
|
|
571
|
+
const qs = new URLSearchParams({
|
|
572
|
+
maxResults: "250",
|
|
573
|
+
timeMin: thirtyDaysAgo.toISOString(),
|
|
574
|
+
timeMax: now.toISOString(),
|
|
575
|
+
showDeleted: "true"
|
|
576
|
+
});
|
|
577
|
+
const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(
|
|
578
|
+
calendarId
|
|
579
|
+
)}/events?${qs.toString()}`;
|
|
580
|
+
const data = await calendarApiFetch(config, url);
|
|
581
|
+
const items = data.items ?? [];
|
|
582
|
+
const activity = {
|
|
583
|
+
total: items.length,
|
|
584
|
+
confirmed: 0,
|
|
585
|
+
tentative: 0,
|
|
586
|
+
cancelled: 0
|
|
587
|
+
};
|
|
588
|
+
for (const ev of items) {
|
|
589
|
+
if (ev.status === "confirmed") activity.confirmed += 1;
|
|
590
|
+
else if (ev.status === "tentative") activity.tentative += 1;
|
|
591
|
+
else if (ev.status === "cancelled") activity.cancelled += 1;
|
|
592
|
+
}
|
|
593
|
+
return activity;
|
|
594
|
+
} catch {
|
|
595
|
+
return null;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
540
598
|
function displayName(c) {
|
|
541
599
|
return c.summaryOverride ?? c.summary ?? c.id;
|
|
542
600
|
}
|
|
@@ -582,19 +640,34 @@ var googleCalendarOauthSetupFlow = {
|
|
|
582
640
|
);
|
|
583
641
|
return sections.join("\n");
|
|
584
642
|
}
|
|
585
|
-
sections.push(
|
|
586
|
-
|
|
587
|
-
|
|
643
|
+
sections.push(
|
|
644
|
+
"| Calendar | Time Zone | Primary | Access | Events (30d) | Confirmed | Tentative | Cancelled |"
|
|
645
|
+
);
|
|
646
|
+
sections.push(
|
|
647
|
+
"|----------|-----------|---------|--------|--------------|-----------|-----------|-----------|"
|
|
648
|
+
);
|
|
649
|
+
const activities = await Promise.all(
|
|
650
|
+
targetIds.map((id) => fetchEventActivity(rt.config, id))
|
|
651
|
+
);
|
|
652
|
+
for (let i = 0; i < targetIds.length; i++) {
|
|
653
|
+
const id = targetIds[i];
|
|
588
654
|
const c = byId.get(id);
|
|
655
|
+
const activity = activities[i] ?? null;
|
|
656
|
+
const total = activity ? String(activity.total) : "-";
|
|
657
|
+
const confirmed = activity ? String(activity.confirmed) : "-";
|
|
658
|
+
const tentative = activity ? String(activity.tentative) : "-";
|
|
659
|
+
const cancelled = activity ? String(activity.cancelled) : "-";
|
|
589
660
|
if (!c) {
|
|
590
|
-
sections.push(
|
|
661
|
+
sections.push(
|
|
662
|
+
`| ${id} | - | - | - | ${total} | ${confirmed} | ${tentative} | ${cancelled} |`
|
|
663
|
+
);
|
|
591
664
|
continue;
|
|
592
665
|
}
|
|
593
666
|
const tz = c.timeZone ?? "-";
|
|
594
667
|
const primary = c.primary ? "yes" : "no";
|
|
595
668
|
const access = c.accessRole ?? "-";
|
|
596
669
|
sections.push(
|
|
597
|
-
`| ${displayName(c)} | ${tz} | ${primary} | ${access} |`
|
|
670
|
+
`| ${displayName(c)} | ${tz} | ${primary} | ${access} | ${total} | ${confirmed} | ${tentative} | ${cancelled} |`
|
|
598
671
|
);
|
|
599
672
|
}
|
|
600
673
|
sections.push("");
|
|
@@ -756,8 +829,8 @@ var googleCalendarOauthConnector = new ConnectorPlugin({
|
|
|
756
829
|
systemPrompt: {
|
|
757
830
|
en: `### Tools
|
|
758
831
|
|
|
759
|
-
- \`
|
|
760
|
-
- \`
|
|
832
|
+
- \`connector_google-calendar-oauth_request\`: Send authenticated requests to the Google Calendar API v3. Use it to list calendars, get events, and manage calendar data. The {calendarId} placeholder in paths is automatically replaced. Authentication is configured automatically via OAuth.
|
|
833
|
+
- \`connector_google-calendar-oauth_listCalendars\`: List accessible Google Calendars. Use during setup to discover available calendars.
|
|
761
834
|
|
|
762
835
|
### Google Calendar API v3 Reference
|
|
763
836
|
|
|
@@ -821,8 +894,8 @@ console.log(event.summary, event.attendees);
|
|
|
821
894
|
\`\`\``,
|
|
822
895
|
ja: `### \u30C4\u30FC\u30EB
|
|
823
896
|
|
|
824
|
-
- \`
|
|
825
|
-
- \`
|
|
897
|
+
- \`connector_google-calendar-oauth_request\`: Google Calendar API v3\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7\u53D6\u5F97\u3001\u30A4\u30D9\u30F3\u30C8\u306E\u53D6\u5F97\u3001\u30AB\u30EC\u30F3\u30C0\u30FC\u30C7\u30FC\u30BF\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{calendarId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
898
|
+
- \`connector_google-calendar-oauth_listCalendars\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Calendar\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
826
899
|
|
|
827
900
|
### Google Calendar API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
828
901
|
|
|
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
|
|
|
16
16
|
type;
|
|
17
17
|
secret;
|
|
18
18
|
required;
|
|
19
|
+
isDeprecated;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.slug = config.slug;
|
|
21
22
|
this.name = config.name;
|
|
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
|
|
|
24
25
|
this.type = config.type;
|
|
25
26
|
this.secret = config.secret;
|
|
26
27
|
this.required = config.required;
|
|
28
|
+
this.isDeprecated = config.isDeprecated ?? false;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Get the parameter value from a ConnectorConnectionObject.
|
|
@@ -245,7 +247,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
245
247
|
/**
|
|
246
248
|
* Create tools for connections that belong to this connector.
|
|
247
249
|
* Filters connections by connectorKey internally.
|
|
248
|
-
* Returns tools keyed as
|
|
250
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
249
251
|
*/
|
|
250
252
|
createTools(connections, config, opts) {
|
|
251
253
|
const myConnections = connections.filter(
|
|
@@ -255,7 +257,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
255
257
|
for (const t of Object.values(this.tools)) {
|
|
256
258
|
const tool = t.createTool(myConnections, config);
|
|
257
259
|
const originalToModelOutput = tool.toModelOutput;
|
|
258
|
-
result[
|
|
260
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
259
261
|
...tool,
|
|
260
262
|
toModelOutput: async (options) => {
|
|
261
263
|
if (!originalToModelOutput) {
|
|
@@ -311,19 +313,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
311
313
|
};
|
|
312
314
|
let state = flow.initialState();
|
|
313
315
|
let answerIdx = 0;
|
|
316
|
+
const pendingParameterUpdates = [];
|
|
314
317
|
for (const step of flow.steps) {
|
|
315
318
|
const ans = ctx.answers[answerIdx];
|
|
316
319
|
if (ans && ans.questionSlug === step.slug) {
|
|
317
320
|
state = step.applyAnswer(state, ans.answer);
|
|
321
|
+
if (step.toParameterUpdates) {
|
|
322
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
323
|
+
}
|
|
318
324
|
answerIdx += 1;
|
|
319
325
|
continue;
|
|
320
326
|
}
|
|
327
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
321
328
|
if (step.type === "text") {
|
|
329
|
+
if (step.fetchOptions) {
|
|
330
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
331
|
+
if (options2.length === 0) {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
322
335
|
return {
|
|
323
336
|
type: "nextQuestion",
|
|
324
337
|
questionSlug: step.slug,
|
|
325
338
|
question: step.question[ctx.language],
|
|
326
|
-
questionType: "text"
|
|
339
|
+
questionType: "text",
|
|
340
|
+
allowFreeText: resolvedAllowFreeText,
|
|
341
|
+
...pendingParameterUpdates.length > 0 && {
|
|
342
|
+
parameterUpdates: pendingParameterUpdates
|
|
343
|
+
}
|
|
327
344
|
};
|
|
328
345
|
}
|
|
329
346
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -335,11 +352,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
335
352
|
questionSlug: step.slug,
|
|
336
353
|
question: step.question[ctx.language],
|
|
337
354
|
questionType: step.type,
|
|
338
|
-
options
|
|
355
|
+
options,
|
|
356
|
+
allowFreeText: resolvedAllowFreeText,
|
|
357
|
+
...pendingParameterUpdates.length > 0 && {
|
|
358
|
+
parameterUpdates: pendingParameterUpdates
|
|
359
|
+
}
|
|
339
360
|
};
|
|
340
361
|
}
|
|
341
362
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
342
|
-
return {
|
|
363
|
+
return {
|
|
364
|
+
type: "fulfilled",
|
|
365
|
+
dataInvestigationResult,
|
|
366
|
+
...pendingParameterUpdates.length > 0 && {
|
|
367
|
+
parameterUpdates: pendingParameterUpdates
|
|
368
|
+
}
|
|
369
|
+
};
|
|
343
370
|
}
|
|
344
371
|
async function resolveSetupSelection(params) {
|
|
345
372
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -905,6 +932,41 @@ async function listCalendars(params, subject) {
|
|
|
905
932
|
);
|
|
906
933
|
return data.items ?? [];
|
|
907
934
|
}
|
|
935
|
+
async function fetchEventActivity(params, subject, calendarId) {
|
|
936
|
+
try {
|
|
937
|
+
const now = /* @__PURE__ */ new Date();
|
|
938
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1e3);
|
|
939
|
+
const qs = new URLSearchParams({
|
|
940
|
+
maxResults: "250",
|
|
941
|
+
timeMin: thirtyDaysAgo.toISOString(),
|
|
942
|
+
timeMax: now.toISOString(),
|
|
943
|
+
showDeleted: "true"
|
|
944
|
+
});
|
|
945
|
+
const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(
|
|
946
|
+
calendarId
|
|
947
|
+
)}/events?${qs.toString()}`;
|
|
948
|
+
const data = await calendarApiFetch(
|
|
949
|
+
params,
|
|
950
|
+
subject,
|
|
951
|
+
url
|
|
952
|
+
);
|
|
953
|
+
const items = data.items ?? [];
|
|
954
|
+
const activity = {
|
|
955
|
+
total: items.length,
|
|
956
|
+
confirmed: 0,
|
|
957
|
+
tentative: 0,
|
|
958
|
+
cancelled: 0
|
|
959
|
+
};
|
|
960
|
+
for (const ev of items) {
|
|
961
|
+
if (ev.status === "confirmed") activity.confirmed += 1;
|
|
962
|
+
else if (ev.status === "tentative") activity.tentative += 1;
|
|
963
|
+
else if (ev.status === "cancelled") activity.cancelled += 1;
|
|
964
|
+
}
|
|
965
|
+
return activity;
|
|
966
|
+
} catch {
|
|
967
|
+
return null;
|
|
968
|
+
}
|
|
969
|
+
}
|
|
908
970
|
function displayName(c) {
|
|
909
971
|
return c.summaryOverride ?? c.summary ?? c.id;
|
|
910
972
|
}
|
|
@@ -971,19 +1033,34 @@ var googleCalendarSetupFlow = {
|
|
|
971
1033
|
);
|
|
972
1034
|
return sections.join("\n");
|
|
973
1035
|
}
|
|
974
|
-
sections.push(
|
|
975
|
-
|
|
976
|
-
|
|
1036
|
+
sections.push(
|
|
1037
|
+
"| Calendar | Time Zone | Primary | Access | Events (30d) | Confirmed | Tentative | Cancelled |"
|
|
1038
|
+
);
|
|
1039
|
+
sections.push(
|
|
1040
|
+
"|----------|-----------|---------|--------|--------------|-----------|-----------|-----------|"
|
|
1041
|
+
);
|
|
1042
|
+
const activities = await Promise.all(
|
|
1043
|
+
targetIds.map((id) => fetchEventActivity(rt.params, subj, id))
|
|
1044
|
+
);
|
|
1045
|
+
for (let i = 0; i < targetIds.length; i++) {
|
|
1046
|
+
const id = targetIds[i];
|
|
977
1047
|
const c = byId.get(id);
|
|
1048
|
+
const activity = activities[i] ?? null;
|
|
1049
|
+
const total = activity ? String(activity.total) : "-";
|
|
1050
|
+
const confirmed = activity ? String(activity.confirmed) : "-";
|
|
1051
|
+
const tentative = activity ? String(activity.tentative) : "-";
|
|
1052
|
+
const cancelled = activity ? String(activity.cancelled) : "-";
|
|
978
1053
|
if (!c) {
|
|
979
|
-
sections.push(
|
|
1054
|
+
sections.push(
|
|
1055
|
+
`| ${id} | - | - | - | ${total} | ${confirmed} | ${tentative} | ${cancelled} |`
|
|
1056
|
+
);
|
|
980
1057
|
continue;
|
|
981
1058
|
}
|
|
982
1059
|
const tz = c.timeZone ?? "-";
|
|
983
1060
|
const primary = c.primary ? "yes" : "no";
|
|
984
1061
|
const access = c.accessRole ?? "-";
|
|
985
1062
|
sections.push(
|
|
986
|
-
`| ${displayName(c)} | ${tz} | ${primary} | ${access} |`
|
|
1063
|
+
`| ${displayName(c)} | ${tz} | ${primary} | ${access} | ${total} | ${confirmed} | ${tentative} | ${cancelled} |`
|
|
987
1064
|
);
|
|
988
1065
|
}
|
|
989
1066
|
sections.push("");
|
|
@@ -1011,8 +1088,8 @@ var googleCalendarConnector = new ConnectorPlugin({
|
|
|
1011
1088
|
|
|
1012
1089
|
This connector exposes two request tools that correspond to the two ways a Service Account can authenticate against the Google Calendar API:
|
|
1013
1090
|
|
|
1014
|
-
- \`
|
|
1015
|
-
- \`
|
|
1091
|
+
- \`connector_google-calendar-service-account_request_with_delegation\`: Call the Calendar API on behalf of the specified Workspace user via Domain-wide Delegation. Pass \`subject\` as the target user email. Requires Domain-wide Delegation to be authorized for the service account in the Workspace admin console.
|
|
1092
|
+
- \`connector_google-calendar-service-account_request\`: Call the Calendar API as the service account itself (no delegation). Only calendars explicitly shared with the service account email are accessible.
|
|
1016
1093
|
|
|
1017
1094
|
Both tools require a \`scopes\` argument.
|
|
1018
1095
|
|
|
@@ -1109,8 +1186,8 @@ export default async function handler(c: Context) {
|
|
|
1109
1186
|
|
|
1110
1187
|
\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u30FC\u306F\u3001Service Account \u304C Google Calendar API \u306B\u8A8D\u8A3C\u3059\u308B 2 \u3064\u306E\u65B9\u6CD5\u306B\u5BFE\u5FDC\u3059\u308B 2 \u3064\u306E request \u30C4\u30FC\u30EB\u3092\u516C\u958B\u3057\u307E\u3059:
|
|
1111
1188
|
|
|
1112
|
-
- \`
|
|
1113
|
-
- \`
|
|
1189
|
+
- \`connector_google-calendar-service-account_request_with_delegation\`: \u6307\u5B9A\u3055\u308C\u305F Workspace \u30E6\u30FC\u30B6\u30FC\u306B\u4EE3\u308F\u3063\u3066 Domain-wide Delegation \u7D4C\u7531\u3067 Calendar API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u4EE3\u7406\u5BFE\u8C61\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`subject\` \u3068\u3057\u3066\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002Workspace \u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u3067 Service Account \u306E Domain-wide Delegation \u304C\u627F\u8A8D\u3055\u308C\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
|
|
1190
|
+
- \`connector_google-calendar-service-account_request\`: Service Account \u81EA\u8EAB\u3068\u3057\u3066 Calendar API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059 (Domain-wide Delegation \u3092\u4F7F\u308F\u306A\u3044\u7D4C\u8DEF)\u3002Service Account \u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306B\u660E\u793A\u7684\u306B\u5171\u6709\u3055\u308C\u3066\u3044\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u307F\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u3067\u3059\u3002
|
|
1114
1191
|
|
|
1115
1192
|
\u4E21\u30C4\u30FC\u30EB\u3068\u3082 \`scopes\` \u5F15\u6570\u304C\u5FC5\u9808\u3067\u3059\u3002
|
|
1116
1193
|
|
|
@@ -160,7 +160,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
160
160
|
/**
|
|
161
161
|
* Create tools for connections that belong to this connector.
|
|
162
162
|
* Filters connections by connectorKey internally.
|
|
163
|
-
* Returns tools keyed as
|
|
163
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
164
164
|
*/
|
|
165
165
|
createTools(connections, config, opts) {
|
|
166
166
|
const myConnections = connections.filter(
|
|
@@ -170,7 +170,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
170
170
|
for (const t of Object.values(this.tools)) {
|
|
171
171
|
const tool = t.createTool(myConnections, config);
|
|
172
172
|
const originalToModelOutput = tool.toModelOutput;
|
|
173
|
-
result[
|
|
173
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
174
174
|
...tool,
|
|
175
175
|
toModelOutput: async (options) => {
|
|
176
176
|
if (!originalToModelOutput) {
|
|
@@ -226,19 +226,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
226
226
|
};
|
|
227
227
|
let state = flow.initialState();
|
|
228
228
|
let answerIdx = 0;
|
|
229
|
+
const pendingParameterUpdates = [];
|
|
229
230
|
for (const step of flow.steps) {
|
|
230
231
|
const ans = ctx.answers[answerIdx];
|
|
231
232
|
if (ans && ans.questionSlug === step.slug) {
|
|
232
233
|
state = step.applyAnswer(state, ans.answer);
|
|
234
|
+
if (step.toParameterUpdates) {
|
|
235
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
236
|
+
}
|
|
233
237
|
answerIdx += 1;
|
|
234
238
|
continue;
|
|
235
239
|
}
|
|
240
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
236
241
|
if (step.type === "text") {
|
|
242
|
+
if (step.fetchOptions) {
|
|
243
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
244
|
+
if (options2.length === 0) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
237
248
|
return {
|
|
238
249
|
type: "nextQuestion",
|
|
239
250
|
questionSlug: step.slug,
|
|
240
251
|
question: step.question[ctx.language],
|
|
241
|
-
questionType: "text"
|
|
252
|
+
questionType: "text",
|
|
253
|
+
allowFreeText: resolvedAllowFreeText,
|
|
254
|
+
...pendingParameterUpdates.length > 0 && {
|
|
255
|
+
parameterUpdates: pendingParameterUpdates
|
|
256
|
+
}
|
|
242
257
|
};
|
|
243
258
|
}
|
|
244
259
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -250,11 +265,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
250
265
|
questionSlug: step.slug,
|
|
251
266
|
question: step.question[ctx.language],
|
|
252
267
|
questionType: step.type,
|
|
253
|
-
options
|
|
268
|
+
options,
|
|
269
|
+
allowFreeText: resolvedAllowFreeText,
|
|
270
|
+
...pendingParameterUpdates.length > 0 && {
|
|
271
|
+
parameterUpdates: pendingParameterUpdates
|
|
272
|
+
}
|
|
254
273
|
};
|
|
255
274
|
}
|
|
256
275
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
257
|
-
return {
|
|
276
|
+
return {
|
|
277
|
+
type: "fulfilled",
|
|
278
|
+
dataInvestigationResult,
|
|
279
|
+
...pendingParameterUpdates.length > 0 && {
|
|
280
|
+
parameterUpdates: pendingParameterUpdates
|
|
281
|
+
}
|
|
282
|
+
};
|
|
258
283
|
}
|
|
259
284
|
async function resolveSetupSelection(params) {
|
|
260
285
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -285,10 +310,10 @@ function normalizeRequestPath(path2, basePathSegment) {
|
|
|
285
310
|
// ../connectors/src/connectors/google-docs/setup.ts
|
|
286
311
|
var googleDocsOnboarding = new ConnectorOnboarding({
|
|
287
312
|
dataOverviewInstructions: {
|
|
288
|
-
en: `1. Create a new document with
|
|
289
|
-
2. Call
|
|
290
|
-
ja: `1.
|
|
291
|
-
2.
|
|
313
|
+
en: `1. Create a new document with connector_google-docs-oauth_request (POST with body { title: "..." }) or use an existing document ID.
|
|
314
|
+
2. Call connector_google-docs-oauth_request with GET /{documentId} to fetch the document's content and metadata.`,
|
|
315
|
+
ja: `1. connector_google-docs-oauth_request \u3092 POST\uFF08Body: { title: "..." }\uFF09\u3067\u547C\u3073\u51FA\u3057\u3066\u65B0\u3057\u3044\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u4F5C\u6210\u3059\u308B\u304B\u3001\u65E2\u5B58\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8ID\u3092\u5229\u7528\u3057\u307E\u3059\u3002
|
|
316
|
+
2. connector_google-docs-oauth_request \u3067 GET /{documentId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u5185\u5BB9\u3068\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002`
|
|
292
317
|
}
|
|
293
318
|
});
|
|
294
319
|
|
|
@@ -541,9 +566,9 @@ var googleDocsConnector = new ConnectorPlugin({
|
|
|
541
566
|
systemPrompt: {
|
|
542
567
|
en: `### Tools (setup-time only)
|
|
543
568
|
|
|
544
|
-
- \`
|
|
569
|
+
- \`connector_google-docs-oauth_request\`: Call the Google Docs API directly during setup / data overview. Supports read and write operations. Use it to get document content, create new documents, and modify document content via batchUpdate. Authentication is configured automatically via OAuth.
|
|
545
570
|
|
|
546
|
-
> **Important**: The \`
|
|
571
|
+
> **Important**: The \`connector_google-docs-oauth_request\` tool is only available at setup time. Inside server-logic handlers, use the SDK (\`connection(id).createDocument\`, etc.) \u2014 the SDK's fetch is already wired through the OAuth proxy. **Do NOT** hand-roll HTTP calls to \`_sqcore/connections/*/request\` from a handler.
|
|
547
572
|
|
|
548
573
|
### Google Docs API Reference
|
|
549
574
|
|
|
@@ -610,9 +635,9 @@ await docs.batchUpdate(documentId, [
|
|
|
610
635
|
\`\`\``,
|
|
611
636
|
ja: `### \u30C4\u30FC\u30EB\uFF08\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306E\u307F\uFF09
|
|
612
637
|
|
|
613
|
-
- \`
|
|
638
|
+
- \`connector_google-docs-oauth_request\`: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3084\u30C7\u30FC\u30BF\u6982\u8981\u628A\u63E1\u6642\u306B Google Docs API \u3092\u76F4\u63A5\u53E9\u304F\u30C4\u30FC\u30EB\u3067\u3059\u3002\u8AAD\u307F\u53D6\u308A\u3068\u66F8\u304D\u8FBC\u307F\u306E\u4E21\u65B9\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u5BB9\u306E\u53D6\u5F97\u3001\u65B0\u3057\u3044\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u4F5C\u6210\u3001batchUpdate \u306B\u3088\u308B\u5185\u5BB9\u5909\u66F4\u306A\u3069\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth \u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
614
639
|
|
|
615
|
-
> **\u91CD\u8981**: \`
|
|
640
|
+
> **\u91CD\u8981**: \`connector_google-docs-oauth_request\` \u306F\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306E\u307F\u5229\u7528\u53EF\u80FD\u3067\u3059\u3002\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u306E\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u5FC5\u305A SDK\uFF08\`connection(id).createDocument\` \u306A\u3069\uFF09\u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002SDK \u306E fetch \u306F OAuth \u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u65E2\u306B\u914D\u7DDA\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u304B\u3089 \`_sqcore/connections/*/request\` \u3092\u624B\u66F8\u304D\u3067\u547C\u3073\u51FA\u3055\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
|
|
616
641
|
|
|
617
642
|
### Google Docs API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
618
643
|
|