@squadbase/vite-server 0.1.17-dev.a9ddcfa → 0.1.17-dev.e4768d1
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 +8941 -3700
- package/dist/connectors/airtable-oauth.js +87 -23
- package/dist/connectors/airtable.js +130 -23
- package/dist/connectors/amplitude.js +47 -23
- package/dist/connectors/anthropic.js +41 -17
- package/dist/connectors/asana.js +76 -25
- package/dist/connectors/attio.js +69 -28
- package/dist/connectors/aws-billing.js +47 -23
- package/dist/connectors/azure-sql.js +322 -25
- package/dist/connectors/backlog-api-key.js +79 -30
- package/dist/connectors/clickup.js +89 -25
- package/dist/connectors/cosmosdb.js +51 -27
- package/dist/connectors/customerio.js +47 -23
- package/dist/connectors/dbt.js +725 -40
- package/dist/connectors/freshdesk.js +121 -23
- package/dist/connectors/freshsales.js +47 -23
- package/dist/connectors/freshservice.js +47 -23
- package/dist/connectors/gamma.js +54 -30
- package/dist/connectors/gemini.js +41 -17
- package/dist/connectors/github.js +51 -27
- package/dist/connectors/gmail-oauth.js +42 -23
- package/dist/connectors/gmail.js +43 -19
- package/dist/connectors/google-ads.js +47 -23
- package/dist/connectors/google-analytics-oauth.js +191 -40
- package/dist/connectors/google-analytics.js +529 -111
- package/dist/connectors/google-audit-log.js +43 -19
- package/dist/connectors/google-calendar-oauth.js +100 -30
- package/dist/connectors/google-calendar.js +100 -26
- package/dist/connectors/google-docs.js +42 -23
- package/dist/connectors/google-drive.js +64 -23
- package/dist/connectors/google-search-console-oauth.js +165 -32
- package/dist/connectors/google-sheets.js +142 -199
- package/dist/connectors/google-slides.js +42 -23
- package/dist/connectors/grafana.js +84 -25
- package/dist/connectors/hackernews.d.ts +5 -0
- package/dist/connectors/hackernews.js +909 -0
- package/dist/connectors/hubspot-oauth.js +73 -22
- package/dist/connectors/hubspot.js +64 -24
- package/dist/connectors/influxdb.js +47 -23
- package/dist/connectors/intercom-oauth.js +104 -25
- package/dist/connectors/intercom.js +51 -27
- package/dist/connectors/jdbc.js +76 -25
- package/dist/connectors/jira-api-key.js +107 -26
- package/dist/connectors/kintone-api-token.js +105 -33
- package/dist/connectors/kintone.js +182 -26
- package/dist/connectors/linear.js +93 -27
- package/dist/connectors/linkedin-ads.js +80 -29
- package/dist/connectors/mailchimp-oauth.js +45 -21
- package/dist/connectors/mailchimp.js +45 -21
- package/dist/connectors/meta-ads-oauth.js +72 -29
- package/dist/connectors/meta-ads.js +74 -29
- package/dist/connectors/mixpanel.js +47 -23
- package/dist/connectors/monday.js +48 -24
- package/dist/connectors/mongodb.js +47 -23
- package/dist/connectors/notion-oauth.js +92 -24
- package/dist/connectors/notion.js +144 -26
- package/dist/connectors/openai.js +41 -17
- package/dist/connectors/oracle.js +316 -26
- package/dist/connectors/outlook-oauth.js +53 -34
- package/dist/connectors/powerbi-oauth.js +45 -26
- package/dist/connectors/salesforce.js +150 -24
- package/dist/connectors/semrush.js +45 -21
- package/dist/connectors/sentry.js +75 -25
- package/dist/connectors/shopify-oauth.js +75 -23
- package/dist/connectors/shopify.js +47 -23
- package/dist/connectors/sqlserver.js +322 -25
- package/dist/connectors/stripe-api-key.js +105 -30
- package/dist/connectors/stripe-oauth.js +102 -32
- package/dist/connectors/supabase.js +315 -21
- package/dist/connectors/tableau.js +54 -30
- package/dist/connectors/tiktok-ads.js +76 -31
- package/dist/connectors/wix-store.js +47 -23
- package/dist/connectors/x.d.ts +5 -0
- package/dist/connectors/x.js +951 -0
- package/dist/connectors/zendesk-oauth.js +87 -25
- package/dist/connectors/zendesk.js +51 -27
- package/dist/index.js +9005 -3709
- package/dist/main.js +9005 -3709
- package/dist/vite-plugin.js +8939 -3698
- package/package.json +12 -4
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __esm = (fn, res) => function __init() {
|
|
3
|
-
|
|
2
|
+
var __esm = (fn, res, err) => function __init() {
|
|
3
|
+
if (err) throw err[0];
|
|
4
|
+
try {
|
|
5
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
+
} catch (e) {
|
|
7
|
+
throw err = [e], e;
|
|
8
|
+
}
|
|
4
9
|
};
|
|
5
10
|
|
|
6
11
|
// ../connectors/src/parameter-definition.ts
|
|
@@ -173,6 +178,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
173
178
|
* `runSetupFlow` from `setup-flow.ts`.
|
|
174
179
|
*/
|
|
175
180
|
setup;
|
|
181
|
+
/**
|
|
182
|
+
* 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
|
|
183
|
+
* メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
|
|
184
|
+
* {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
|
|
185
|
+
* 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
|
|
186
|
+
* `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
|
|
187
|
+
* coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
|
|
188
|
+
*/
|
|
189
|
+
introspect;
|
|
176
190
|
/**
|
|
177
191
|
* Opt-out of the default "verify before save" behavior on connection
|
|
178
192
|
* creation. The backend invokes `checkConnection` synchronously while
|
|
@@ -187,6 +201,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
187
201
|
* the default verify-on-create behavior without opt-in.
|
|
188
202
|
*/
|
|
189
203
|
skipConnectionCheckOnCreate;
|
|
204
|
+
/**
|
|
205
|
+
* 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
|
|
206
|
+
* read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
|
|
207
|
+
* recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
|
|
208
|
+
* driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
|
|
209
|
+
* 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
|
|
210
|
+
*/
|
|
211
|
+
surveyProbes;
|
|
190
212
|
constructor(config) {
|
|
191
213
|
this.slug = config.slug;
|
|
192
214
|
this.authType = config.authType;
|
|
@@ -204,7 +226,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
204
226
|
this.query = config.query;
|
|
205
227
|
this.checkConnection = config.checkConnection;
|
|
206
228
|
this.setup = config.setup;
|
|
229
|
+
this.introspect = config.introspect;
|
|
207
230
|
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
231
|
+
this.surveyProbes = config.surveyProbes;
|
|
208
232
|
}
|
|
209
233
|
get connectorKey() {
|
|
210
234
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -212,7 +236,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
212
236
|
/**
|
|
213
237
|
* Create tools for connections that belong to this connector.
|
|
214
238
|
* Filters connections by connectorKey internally.
|
|
215
|
-
* Returns tools keyed as
|
|
239
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
216
240
|
*/
|
|
217
241
|
createTools(connections, config, opts) {
|
|
218
242
|
const myConnections = connections.filter(
|
|
@@ -222,7 +246,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
222
246
|
for (const t of Object.values(this.tools)) {
|
|
223
247
|
const tool = t.createTool(myConnections, config);
|
|
224
248
|
const originalToModelOutput = tool.toModelOutput;
|
|
225
|
-
result[
|
|
249
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
226
250
|
...tool,
|
|
227
251
|
toModelOutput: async (options) => {
|
|
228
252
|
if (!originalToModelOutput) {
|
|
@@ -242,25 +266,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
242
266
|
if (authType) return `${slug}-${authType}`;
|
|
243
267
|
const LEGACY_NULL_AUTH_TYPE_MAP = {
|
|
244
268
|
// user-password
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
269
|
+
postgresql: "user-password",
|
|
270
|
+
mysql: "user-password",
|
|
271
|
+
clickhouse: "user-password",
|
|
272
|
+
kintone: "user-password",
|
|
249
273
|
"squadbase-db": "user-password",
|
|
250
274
|
// service-account
|
|
251
|
-
|
|
252
|
-
|
|
275
|
+
snowflake: "service-account",
|
|
276
|
+
bigquery: "service-account",
|
|
253
277
|
"google-analytics": "service-account",
|
|
254
278
|
"google-calendar": "service-account",
|
|
255
279
|
"aws-athena": "service-account",
|
|
256
|
-
|
|
280
|
+
redshift: "service-account",
|
|
257
281
|
// api-key
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
282
|
+
databricks: "api-key",
|
|
283
|
+
dbt: "api-key",
|
|
284
|
+
airtable: "api-key",
|
|
285
|
+
openai: "api-key",
|
|
286
|
+
gemini: "api-key",
|
|
287
|
+
anthropic: "api-key",
|
|
264
288
|
"wix-store": "api-key"
|
|
265
289
|
};
|
|
266
290
|
const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
|
|
@@ -352,14 +376,14 @@ var AUTH_TYPES = {
|
|
|
352
376
|
// ../connectors/src/connectors/backlog/setup.ts
|
|
353
377
|
var backlogOnboarding = new ConnectorOnboarding({
|
|
354
378
|
dataOverviewInstructions: {
|
|
355
|
-
en: `1. Call
|
|
356
|
-
2. Call
|
|
357
|
-
3. For key projects, call
|
|
358
|
-
4. Call
|
|
359
|
-
ja: `1.
|
|
360
|
-
2.
|
|
361
|
-
3. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066
|
|
362
|
-
4.
|
|
379
|
+
en: `1. Call connector_backlog-api-key_request with GET space to verify the connection and get space information
|
|
380
|
+
2. Call connector_backlog-api-key_request with GET projects to list all accessible projects
|
|
381
|
+
3. For key projects, call connector_backlog-api-key_request with GET issues?projectId[]={projectId}&count=5&order=desc to retrieve recent issues
|
|
382
|
+
4. Call connector_backlog-api-key_request with GET projects/{projectIdOrKey}/statuses to understand the workflow statuses`,
|
|
383
|
+
ja: `1. connector_backlog-api-key_request \u3067 GET space \u3092\u547C\u3073\u51FA\u3057\u3001\u63A5\u7D9A\u78BA\u8A8D\u3068\u30B9\u30DA\u30FC\u30B9\u60C5\u5831\u3092\u53D6\u5F97
|
|
384
|
+
2. connector_backlog-api-key_request \u3067 GET projects \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
|
|
385
|
+
3. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 connector_backlog-api-key_request \u3067 GET issues?projectId[]={projectId}&count=5&order=desc \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306E\u8AB2\u984C\u3092\u53D6\u5F97
|
|
386
|
+
4. connector_backlog-api-key_request \u3067 GET projects/{projectIdOrKey}/statuses \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u78BA\u8A8D`
|
|
363
387
|
}
|
|
364
388
|
});
|
|
365
389
|
|
|
@@ -408,6 +432,20 @@ async function listStatuses(params, projectIdOrKey) {
|
|
|
408
432
|
if (!res.ok) return [];
|
|
409
433
|
return await res.json();
|
|
410
434
|
}
|
|
435
|
+
async function countIssues(params, projectId, statusId) {
|
|
436
|
+
try {
|
|
437
|
+
const statusParam = statusId ? `&statusId[]=${statusId}` : "";
|
|
438
|
+
const res = await apiFetch(
|
|
439
|
+
params,
|
|
440
|
+
`issues/count?projectId[]=${encodeURIComponent(projectId)}${statusParam}`
|
|
441
|
+
);
|
|
442
|
+
if (!res.ok) return null;
|
|
443
|
+
const data = await res.json();
|
|
444
|
+
return typeof data.count === "number" ? data.count : null;
|
|
445
|
+
} catch {
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
411
449
|
var backlogSetupFlow = {
|
|
412
450
|
initialState: () => ({}),
|
|
413
451
|
steps: [
|
|
@@ -457,14 +495,25 @@ var backlogSetupFlow = {
|
|
|
457
495
|
continue;
|
|
458
496
|
}
|
|
459
497
|
sections.push(`### Project: ${project.name} (${project.projectKey})`, "");
|
|
460
|
-
const [issueTypes, statuses] = await Promise.all([
|
|
498
|
+
const [issueTypes, statuses, totalIssues] = await Promise.all([
|
|
461
499
|
listIssueTypes(rt.params, id),
|
|
462
|
-
listStatuses(rt.params, id)
|
|
500
|
+
listStatuses(rt.params, id),
|
|
501
|
+
countIssues(rt.params, id)
|
|
463
502
|
]);
|
|
503
|
+
if (totalIssues != null) {
|
|
504
|
+
sections.push(`- Total issues: ${totalIssues.toLocaleString()}`);
|
|
505
|
+
}
|
|
464
506
|
sections.push(`- Issue types (${issueTypes.length}):`);
|
|
465
507
|
for (const t of issueTypes) sections.push(` - ${t.name}`);
|
|
508
|
+
const statusCounts = await Promise.all(
|
|
509
|
+
statuses.map((s) => countIssues(rt.params, id, s.id))
|
|
510
|
+
);
|
|
466
511
|
sections.push(`- Statuses (${statuses.length}):`);
|
|
467
|
-
for (
|
|
512
|
+
for (let i = 0; i < statuses.length; i++) {
|
|
513
|
+
const c = statusCounts[i];
|
|
514
|
+
const cStr = c != null ? `: ${c.toLocaleString()} issues` : "";
|
|
515
|
+
sections.push(` - ${statuses[i].name}${cStr}`);
|
|
516
|
+
}
|
|
468
517
|
sections.push("");
|
|
469
518
|
}
|
|
470
519
|
return sections.join("\n");
|
|
@@ -563,7 +612,7 @@ var backlogConnector = new ConnectorPlugin({
|
|
|
563
612
|
systemPrompt: {
|
|
564
613
|
en: `### Tools
|
|
565
614
|
|
|
566
|
-
- \`
|
|
615
|
+
- \`connector_backlog-api-key_request\`: The only way to call the Backlog REST API (v2). Use it to list projects, search issues, get issue details, create/update issues, manage wikis, and retrieve users. Authentication (API key as query parameter) and space URL are configured automatically.
|
|
567
616
|
|
|
568
617
|
### Business Logic
|
|
569
618
|
|
|
@@ -635,7 +684,7 @@ await backlog.request("/api/v2/issues", {
|
|
|
635
684
|
- order: "asc" or "desc"`,
|
|
636
685
|
ja: `### \u30C4\u30FC\u30EB
|
|
637
686
|
|
|
638
|
-
- \`
|
|
687
|
+
- \`connector_backlog-api-key_request\`: Backlog REST API\uFF08v2\uFF09\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u691C\u7D22\u3001\u8AB2\u984C\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001Wiki\u7BA1\u7406\u3001\u30E6\u30FC\u30B6\u30FC\u53D6\u5F97\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u3092\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3068\u3057\u3066\u4ED8\u4E0E\uFF09\u3068\u30B9\u30DA\u30FC\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
639
688
|
|
|
640
689
|
### Business Logic
|
|
641
690
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __esm = (fn, res) => function __init() {
|
|
3
|
-
|
|
2
|
+
var __esm = (fn, res, err) => function __init() {
|
|
3
|
+
if (err) throw err[0];
|
|
4
|
+
try {
|
|
5
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
+
} catch (e) {
|
|
7
|
+
throw err = [e], e;
|
|
8
|
+
}
|
|
4
9
|
};
|
|
5
10
|
|
|
6
11
|
// ../connectors/src/parameter-definition.ts
|
|
@@ -309,6 +314,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
309
314
|
* `runSetupFlow` from `setup-flow.ts`.
|
|
310
315
|
*/
|
|
311
316
|
setup;
|
|
317
|
+
/**
|
|
318
|
+
* 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
|
|
319
|
+
* メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
|
|
320
|
+
* {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
|
|
321
|
+
* 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
|
|
322
|
+
* `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
|
|
323
|
+
* coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
|
|
324
|
+
*/
|
|
325
|
+
introspect;
|
|
312
326
|
/**
|
|
313
327
|
* Opt-out of the default "verify before save" behavior on connection
|
|
314
328
|
* creation. The backend invokes `checkConnection` synchronously while
|
|
@@ -323,6 +337,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
323
337
|
* the default verify-on-create behavior without opt-in.
|
|
324
338
|
*/
|
|
325
339
|
skipConnectionCheckOnCreate;
|
|
340
|
+
/**
|
|
341
|
+
* 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
|
|
342
|
+
* read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
|
|
343
|
+
* recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
|
|
344
|
+
* driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
|
|
345
|
+
* 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
|
|
346
|
+
*/
|
|
347
|
+
surveyProbes;
|
|
326
348
|
constructor(config) {
|
|
327
349
|
this.slug = config.slug;
|
|
328
350
|
this.authType = config.authType;
|
|
@@ -340,7 +362,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
340
362
|
this.query = config.query;
|
|
341
363
|
this.checkConnection = config.checkConnection;
|
|
342
364
|
this.setup = config.setup;
|
|
365
|
+
this.introspect = config.introspect;
|
|
343
366
|
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
367
|
+
this.surveyProbes = config.surveyProbes;
|
|
344
368
|
}
|
|
345
369
|
get connectorKey() {
|
|
346
370
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -348,7 +372,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
348
372
|
/**
|
|
349
373
|
* Create tools for connections that belong to this connector.
|
|
350
374
|
* Filters connections by connectorKey internally.
|
|
351
|
-
* Returns tools keyed as
|
|
375
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
352
376
|
*/
|
|
353
377
|
createTools(connections, config, opts) {
|
|
354
378
|
const myConnections = connections.filter(
|
|
@@ -358,7 +382,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
358
382
|
for (const t of Object.values(this.tools)) {
|
|
359
383
|
const tool = t.createTool(myConnections, config);
|
|
360
384
|
const originalToModelOutput = tool.toModelOutput;
|
|
361
|
-
result[
|
|
385
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
362
386
|
...tool,
|
|
363
387
|
toModelOutput: async (options) => {
|
|
364
388
|
if (!originalToModelOutput) {
|
|
@@ -378,25 +402,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
378
402
|
if (authType) return `${slug}-${authType}`;
|
|
379
403
|
const LEGACY_NULL_AUTH_TYPE_MAP = {
|
|
380
404
|
// user-password
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
405
|
+
postgresql: "user-password",
|
|
406
|
+
mysql: "user-password",
|
|
407
|
+
clickhouse: "user-password",
|
|
408
|
+
kintone: "user-password",
|
|
385
409
|
"squadbase-db": "user-password",
|
|
386
410
|
// service-account
|
|
387
|
-
|
|
388
|
-
|
|
411
|
+
snowflake: "service-account",
|
|
412
|
+
bigquery: "service-account",
|
|
389
413
|
"google-analytics": "service-account",
|
|
390
414
|
"google-calendar": "service-account",
|
|
391
415
|
"aws-athena": "service-account",
|
|
392
|
-
|
|
416
|
+
redshift: "service-account",
|
|
393
417
|
// api-key
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
418
|
+
databricks: "api-key",
|
|
419
|
+
dbt: "api-key",
|
|
420
|
+
airtable: "api-key",
|
|
421
|
+
openai: "api-key",
|
|
422
|
+
gemini: "api-key",
|
|
423
|
+
anthropic: "api-key",
|
|
400
424
|
"wix-store": "api-key"
|
|
401
425
|
};
|
|
402
426
|
const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
|
|
@@ -498,15 +522,15 @@ function normalizeRequestPath(path2, basePathSegment) {
|
|
|
498
522
|
// ../connectors/src/connectors/clickup/setup.ts
|
|
499
523
|
var clickupOnboarding = new ConnectorOnboarding({
|
|
500
524
|
dataOverviewInstructions: {
|
|
501
|
-
en: `1. Call
|
|
502
|
-
2. Call
|
|
525
|
+
en: `1. Call connector_clickup_request with GET /team to list workspaces (the ClickUp API still calls workspaces "teams"). Pick the first workspace's \`id\`.
|
|
526
|
+
2. Call connector_clickup_request with GET /team/{team_id}/space?archived=false to list spaces in the workspace.
|
|
503
527
|
3. Pick one space and list its folders (GET /space/{space_id}/folder?archived=false) and folderless lists (GET /space/{space_id}/list?archived=false). Each folder also contains lists at GET /folder/{folder_id}/list.
|
|
504
|
-
4. Pick one list and call
|
|
528
|
+
4. Pick one list and call connector_clickup_request with GET /list/{list_id}/task?page=0&include_closed=true to sample tasks. Inspect each task's \`status\`, \`assignees\`, \`due_date\`, and \`custom_fields\`.
|
|
505
529
|
5. If custom fields are used, call GET /list/{list_id}/field to get their definitions.`,
|
|
506
|
-
ja: `1.
|
|
507
|
-
2.
|
|
530
|
+
ja: `1. connector_clickup_request \u3067 GET /team \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08ClickUp API \u3067\u306F\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092 "team" \u3068\u547C\u3073\u307E\u3059\uFF09\u3002\u6700\u521D\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E \`id\` \u3092\u9078\u629E\u3057\u307E\u3059\u3002
|
|
531
|
+
2. connector_clickup_request \u3067 GET /team/{team_id}/space?archived=false \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u5185\u306E\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002
|
|
508
532
|
3. \u30B9\u30DA\u30FC\u30B9\u30921\u3064\u9078\u3073\u3001\u30D5\u30A9\u30EB\u30C0\u4E00\u89A7\uFF08GET /space/{space_id}/folder?archived=false\uFF09\u3068\u30D5\u30A9\u30EB\u30C0\u7121\u3057\u30EA\u30B9\u30C8\u4E00\u89A7\uFF08GET /space/{space_id}/list?archived=false\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u5404\u30D5\u30A9\u30EB\u30C0\u5185\u306E\u30EA\u30B9\u30C8\u306F GET /folder/{folder_id}/list \u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\u3002
|
|
509
|
-
4. \u30EA\u30B9\u30C8\u30921\u3064\u9078\u3073\
|
|
533
|
+
4. \u30EA\u30B9\u30C8\u30921\u3064\u9078\u3073\u3001connector_clickup_request \u3067 GET /list/{list_id}/task?page=0&include_closed=true \u3092\u547C\u3073\u51FA\u3057\u3066\u30BF\u30B9\u30AF\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u307E\u3059\u3002\u5404\u30BF\u30B9\u30AF\u306E \`status\`, \`assignees\`, \`due_date\`, \`custom_fields\` \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
510
534
|
5. \u30AB\u30B9\u30BF\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u5229\u7528\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F GET /list/{list_id}/field \u3067\u305D\u306E\u5B9A\u7FA9\u3092\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
|
|
511
535
|
}
|
|
512
536
|
});
|
|
@@ -567,6 +591,21 @@ async function listFolderlessLists(params, spaceId) {
|
|
|
567
591
|
const data = await res.json();
|
|
568
592
|
return data.lists ?? [];
|
|
569
593
|
}
|
|
594
|
+
var CLICKUP_SAMPLE_LISTS_PER_SPACE = 5;
|
|
595
|
+
async function fetchListTaskCount(params, listId) {
|
|
596
|
+
try {
|
|
597
|
+
const res = await apiFetch(
|
|
598
|
+
params,
|
|
599
|
+
`/list/${encodeURIComponent(listId)}/task?archived=false&page=0`
|
|
600
|
+
);
|
|
601
|
+
if (!res.ok) return null;
|
|
602
|
+
const data = await res.json();
|
|
603
|
+
const tasks = data.tasks ?? [];
|
|
604
|
+
return tasks.length >= 100 ? "100+" : String(tasks.length);
|
|
605
|
+
} catch {
|
|
606
|
+
return null;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
570
609
|
var clickupSetupFlow = {
|
|
571
610
|
initialState: () => ({}),
|
|
572
611
|
steps: [
|
|
@@ -636,6 +675,31 @@ var clickupSetupFlow = {
|
|
|
636
675
|
for (const f of folders) sections.push(` - ${f.name}`);
|
|
637
676
|
sections.push(`- Folderless lists (${folderlessLists.length}):`);
|
|
638
677
|
for (const l of folderlessLists) sections.push(` - ${l.name}`);
|
|
678
|
+
const sampled = folderlessLists.slice(0, CLICKUP_SAMPLE_LISTS_PER_SPACE);
|
|
679
|
+
if (sampled.length > 0) {
|
|
680
|
+
const counts = await Promise.all(
|
|
681
|
+
sampled.map((l) => fetchListTaskCount(rt.params, l.id))
|
|
682
|
+
);
|
|
683
|
+
sections.push(
|
|
684
|
+
"",
|
|
685
|
+
rt.language === "ja" ? `- \u30EA\u30B9\u30C8\u5225\u30BF\u30B9\u30AF\u4EF6\u6570 (\u4E0A\u4F4D${sampled.length}\u4EF6):` : `- Task counts (first ${sampled.length} lists):`
|
|
686
|
+
);
|
|
687
|
+
sections.push("");
|
|
688
|
+
sections.push("| List | Tasks |");
|
|
689
|
+
sections.push("|------|-------|");
|
|
690
|
+
for (let i = 0; i < sampled.length; i++) {
|
|
691
|
+
const list = sampled[i];
|
|
692
|
+
const count = counts[i] ?? "-";
|
|
693
|
+
const safeName = list.name.replace(/\|/g, "\\|");
|
|
694
|
+
sections.push(`| ${safeName} | ${count} |`);
|
|
695
|
+
}
|
|
696
|
+
if (folderlessLists.length > sampled.length) {
|
|
697
|
+
sections.push(
|
|
698
|
+
"",
|
|
699
|
+
rt.language === "ja" ? `_\u5168${folderlessLists.length}\u4EF6\u306E\u3046\u3061\u5148\u982D${sampled.length}\u4EF6\u3092\u8868\u793A_` : `_Showing first ${sampled.length} of ${folderlessLists.length} folderless lists._`
|
|
700
|
+
);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
639
703
|
sections.push("");
|
|
640
704
|
}
|
|
641
705
|
return sections.join("\n");
|
|
@@ -766,7 +830,7 @@ var clickupConnector = new ConnectorPlugin({
|
|
|
766
830
|
systemPrompt: {
|
|
767
831
|
en: `### Tools
|
|
768
832
|
|
|
769
|
-
- \`
|
|
833
|
+
- \`connector_clickup_request\`: The only way to call the ClickUp REST API v2. Use it to list workspaces, spaces, folders, lists, tasks, members, and custom fields. Authentication (Personal API Token in the \`Authorization\` header \u2014 no \`Bearer\` prefix) is configured automatically. Provide the API path and optionally append query parameters like \`page\`, \`archived\`, \`include_closed\`.
|
|
770
834
|
|
|
771
835
|
### Business Logic
|
|
772
836
|
|
|
@@ -852,7 +916,7 @@ export default async function handler(c: Context) {
|
|
|
852
916
|
- POST \`/team/{team_id}/time_entries\` \u2014 Create a time entry`,
|
|
853
917
|
ja: `### \u30C4\u30FC\u30EB
|
|
854
918
|
|
|
855
|
-
- \`
|
|
919
|
+
- \`connector_clickup_request\`: ClickUp REST API v2 \u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3001\u30B9\u30DA\u30FC\u30B9\u3001\u30D5\u30A9\u30EB\u30C0\u3001\u30EA\u30B9\u30C8\u3001\u30BF\u30B9\u30AF\u3001\u30E1\u30F3\u30D0\u30FC\u3001\u30AB\u30B9\u30BF\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u53D6\u5F97\u30FB\u66F4\u65B0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Personal API Token \u3092 \`Authorization\` \u30D8\u30C3\u30C0\u30FC\u306B\u8A2D\u5B9A \u2014 \`Bearer\` \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u4ED8\u304D\u307E\u305B\u3093\uFF09\u306F\u81EA\u52D5\u3067\u884C\u308F\u308C\u307E\u3059\u3002API\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066 \`page\`, \`archived\`, \`include_closed\` \u306A\u3069\u306E\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u4ED8\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
856
920
|
|
|
857
921
|
### Business Logic
|
|
858
922
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __esm = (fn, res) => function __init() {
|
|
3
|
-
|
|
2
|
+
var __esm = (fn, res, err) => function __init() {
|
|
3
|
+
if (err) throw err[0];
|
|
4
|
+
try {
|
|
5
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
+
} catch (e) {
|
|
7
|
+
throw err = [e], e;
|
|
8
|
+
}
|
|
4
9
|
};
|
|
5
10
|
|
|
6
11
|
// ../connectors/src/parameter-definition.ts
|
|
@@ -219,6 +224,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
219
224
|
* `runSetupFlow` from `setup-flow.ts`.
|
|
220
225
|
*/
|
|
221
226
|
setup;
|
|
227
|
+
/**
|
|
228
|
+
* 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
|
|
229
|
+
* メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
|
|
230
|
+
* {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
|
|
231
|
+
* 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
|
|
232
|
+
* `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
|
|
233
|
+
* coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
|
|
234
|
+
*/
|
|
235
|
+
introspect;
|
|
222
236
|
/**
|
|
223
237
|
* Opt-out of the default "verify before save" behavior on connection
|
|
224
238
|
* creation. The backend invokes `checkConnection` synchronously while
|
|
@@ -233,6 +247,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
233
247
|
* the default verify-on-create behavior without opt-in.
|
|
234
248
|
*/
|
|
235
249
|
skipConnectionCheckOnCreate;
|
|
250
|
+
/**
|
|
251
|
+
* 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
|
|
252
|
+
* read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
|
|
253
|
+
* recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
|
|
254
|
+
* driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
|
|
255
|
+
* 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
|
|
256
|
+
*/
|
|
257
|
+
surveyProbes;
|
|
236
258
|
constructor(config) {
|
|
237
259
|
this.slug = config.slug;
|
|
238
260
|
this.authType = config.authType;
|
|
@@ -250,7 +272,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
250
272
|
this.query = config.query;
|
|
251
273
|
this.checkConnection = config.checkConnection;
|
|
252
274
|
this.setup = config.setup;
|
|
275
|
+
this.introspect = config.introspect;
|
|
253
276
|
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
277
|
+
this.surveyProbes = config.surveyProbes;
|
|
254
278
|
}
|
|
255
279
|
get connectorKey() {
|
|
256
280
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -258,7 +282,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
258
282
|
/**
|
|
259
283
|
* Create tools for connections that belong to this connector.
|
|
260
284
|
* Filters connections by connectorKey internally.
|
|
261
|
-
* Returns tools keyed as
|
|
285
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
262
286
|
*/
|
|
263
287
|
createTools(connections, config, opts) {
|
|
264
288
|
const myConnections = connections.filter(
|
|
@@ -268,7 +292,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
268
292
|
for (const t of Object.values(this.tools)) {
|
|
269
293
|
const tool = t.createTool(myConnections, config);
|
|
270
294
|
const originalToModelOutput = tool.toModelOutput;
|
|
271
|
-
result[
|
|
295
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
272
296
|
...tool,
|
|
273
297
|
toModelOutput: async (options) => {
|
|
274
298
|
if (!originalToModelOutput) {
|
|
@@ -288,25 +312,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
288
312
|
if (authType) return `${slug}-${authType}`;
|
|
289
313
|
const LEGACY_NULL_AUTH_TYPE_MAP = {
|
|
290
314
|
// user-password
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
315
|
+
postgresql: "user-password",
|
|
316
|
+
mysql: "user-password",
|
|
317
|
+
clickhouse: "user-password",
|
|
318
|
+
kintone: "user-password",
|
|
295
319
|
"squadbase-db": "user-password",
|
|
296
320
|
// service-account
|
|
297
|
-
|
|
298
|
-
|
|
321
|
+
snowflake: "service-account",
|
|
322
|
+
bigquery: "service-account",
|
|
299
323
|
"google-analytics": "service-account",
|
|
300
324
|
"google-calendar": "service-account",
|
|
301
325
|
"aws-athena": "service-account",
|
|
302
|
-
|
|
326
|
+
redshift: "service-account",
|
|
303
327
|
// api-key
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
328
|
+
databricks: "api-key",
|
|
329
|
+
dbt: "api-key",
|
|
330
|
+
airtable: "api-key",
|
|
331
|
+
openai: "api-key",
|
|
332
|
+
gemini: "api-key",
|
|
333
|
+
anthropic: "api-key",
|
|
310
334
|
"wix-store": "api-key"
|
|
311
335
|
};
|
|
312
336
|
const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
|
|
@@ -398,14 +422,14 @@ var AUTH_TYPES = {
|
|
|
398
422
|
// ../connectors/src/connectors/cosmosdb/setup.ts
|
|
399
423
|
var cosmosdbOnboarding = new ConnectorOnboarding({
|
|
400
424
|
dataOverviewInstructions: {
|
|
401
|
-
en: `1. Use
|
|
402
|
-
2. For key containers, sample documents with
|
|
425
|
+
en: `1. Use connector_cosmosdb_listContainers to list all containers in the configured database
|
|
426
|
+
2. For key containers, sample documents with connector_cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
|
|
403
427
|
3. Examine the document structure to understand the schema (Cosmos DB containers are schema-flexible \u2014 items in the same container may have different fields)
|
|
404
|
-
4. Use
|
|
405
|
-
ja: `1.
|
|
406
|
-
2. \u4E3B\u8981\u30B3\u30F3\u30C6\u30CA\u306B\u3064\u3044\u3066
|
|
428
|
+
4. Use connector_cosmosdb_query with GROUP BY to analyse data distribution if needed: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``,
|
|
429
|
+
ja: `1. connector_cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
|
|
430
|
+
2. \u4E3B\u8981\u30B3\u30F3\u30C6\u30CA\u306B\u3064\u3044\u3066 connector_cosmosdb_query \u3067\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0: container="users", sql="SELECT TOP 5 * FROM c"
|
|
407
431
|
3. \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u69CB\u9020\u3092\u78BA\u8A8D\u3057\u3066\u30B9\u30AD\u30FC\u30DE\u3092\u628A\u63E1\uFF08Cosmos DB \u306E\u30B3\u30F3\u30C6\u30CA\u306F\u30B9\u30AD\u30FC\u30DE\u304C\u67D4\u8EDF\u306A\u305F\u3081\u3001\u540C\u3058\u30B3\u30F3\u30C6\u30CA\u5185\u3067\u3082\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u7570\u306A\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\uFF09
|
|
408
|
-
4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066
|
|
432
|
+
4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066 connector_cosmosdb_query \u306E GROUP BY \u3067\u30C7\u30FC\u30BF\u5206\u5E03\u3092\u78BA\u8A8D: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``
|
|
409
433
|
}
|
|
410
434
|
});
|
|
411
435
|
|
|
@@ -717,8 +741,8 @@ var cosmosdbConnector = new ConnectorPlugin({
|
|
|
717
741
|
systemPrompt: {
|
|
718
742
|
en: `### Tools
|
|
719
743
|
|
|
720
|
-
- \`
|
|
721
|
-
- \`
|
|
744
|
+
- \`connector_cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
|
|
745
|
+
- \`connector_cosmosdb_query\`: Executes a Cosmos DB SQL (Core / NoSQL API) query against a single container and returns items. Use for schema exploration, data sampling, and analytical queries. Pass \`partitionKey\` to scope the query to a single partition (cross-partition queries are enabled by default).
|
|
722
746
|
|
|
723
747
|
### Business Logic
|
|
724
748
|
|
|
@@ -763,8 +787,8 @@ export default async function handler(_c: Context) {
|
|
|
763
787
|
- Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
|
|
764
788
|
ja: `### \u30C4\u30FC\u30EB
|
|
765
789
|
|
|
766
|
-
- \`
|
|
767
|
-
- \`
|
|
790
|
+
- \`connector_cosmosdb_listContainers\`: \u8A2D\u5B9A\u3055\u308C\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\uFF08\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AD\u30FC\u306E\u30D1\u30B9\u4ED8\u304D\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30C7\u30FC\u30BF\u63A2\u7D22\u306E\u6700\u521D\u306E\u30B9\u30C6\u30C3\u30D7\u3068\u3057\u3066\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
791
|
+
- \`connector_cosmosdb_query\`: \u5358\u4E00\u306E\u30B3\u30F3\u30C6\u30CA\u306B\u5BFE\u3057\u3066 Cosmos DB SQL\uFF08Core / NoSQL API\uFF09\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u30A2\u30A4\u30C6\u30E0\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3001\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3001\u5206\u6790\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\`partitionKey\` \u3092\u6E21\u3059\u3068\u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3067\u304D\u3001\u672A\u6307\u5B9A\u3060\u3068\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306B\u306A\u308A\u307E\u3059\u3002
|
|
768
792
|
|
|
769
793
|
### Business Logic
|
|
770
794
|
|