@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.
|
|
@@ -222,7 +224,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
222
224
|
/**
|
|
223
225
|
* Create tools for connections that belong to this connector.
|
|
224
226
|
* Filters connections by connectorKey internally.
|
|
225
|
-
* Returns tools keyed as
|
|
227
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
226
228
|
*/
|
|
227
229
|
createTools(connections, config, opts) {
|
|
228
230
|
const myConnections = connections.filter(
|
|
@@ -232,7 +234,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
232
234
|
for (const t of Object.values(this.tools)) {
|
|
233
235
|
const tool = t.createTool(myConnections, config);
|
|
234
236
|
const originalToModelOutput = tool.toModelOutput;
|
|
235
|
-
result[
|
|
237
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
236
238
|
...tool,
|
|
237
239
|
toModelOutput: async (options) => {
|
|
238
240
|
if (!originalToModelOutput) {
|
|
@@ -288,19 +290,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
288
290
|
};
|
|
289
291
|
let state = flow.initialState();
|
|
290
292
|
let answerIdx = 0;
|
|
293
|
+
const pendingParameterUpdates = [];
|
|
291
294
|
for (const step of flow.steps) {
|
|
292
295
|
const ans = ctx.answers[answerIdx];
|
|
293
296
|
if (ans && ans.questionSlug === step.slug) {
|
|
294
297
|
state = step.applyAnswer(state, ans.answer);
|
|
298
|
+
if (step.toParameterUpdates) {
|
|
299
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
300
|
+
}
|
|
295
301
|
answerIdx += 1;
|
|
296
302
|
continue;
|
|
297
303
|
}
|
|
304
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
298
305
|
if (step.type === "text") {
|
|
306
|
+
if (step.fetchOptions) {
|
|
307
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
308
|
+
if (options2.length === 0) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
299
312
|
return {
|
|
300
313
|
type: "nextQuestion",
|
|
301
314
|
questionSlug: step.slug,
|
|
302
315
|
question: step.question[ctx.language],
|
|
303
|
-
questionType: "text"
|
|
316
|
+
questionType: "text",
|
|
317
|
+
allowFreeText: resolvedAllowFreeText,
|
|
318
|
+
...pendingParameterUpdates.length > 0 && {
|
|
319
|
+
parameterUpdates: pendingParameterUpdates
|
|
320
|
+
}
|
|
304
321
|
};
|
|
305
322
|
}
|
|
306
323
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -312,11 +329,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
312
329
|
questionSlug: step.slug,
|
|
313
330
|
question: step.question[ctx.language],
|
|
314
331
|
questionType: step.type,
|
|
315
|
-
options
|
|
332
|
+
options,
|
|
333
|
+
allowFreeText: resolvedAllowFreeText,
|
|
334
|
+
...pendingParameterUpdates.length > 0 && {
|
|
335
|
+
parameterUpdates: pendingParameterUpdates
|
|
336
|
+
}
|
|
316
337
|
};
|
|
317
338
|
}
|
|
318
339
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
319
|
-
return {
|
|
340
|
+
return {
|
|
341
|
+
type: "fulfilled",
|
|
342
|
+
dataInvestigationResult,
|
|
343
|
+
...pendingParameterUpdates.length > 0 && {
|
|
344
|
+
parameterUpdates: pendingParameterUpdates
|
|
345
|
+
}
|
|
346
|
+
};
|
|
320
347
|
}
|
|
321
348
|
async function resolveSetupSelection(params) {
|
|
322
349
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -337,12 +364,12 @@ var AUTH_TYPES = {
|
|
|
337
364
|
// ../connectors/src/connectors/jira/setup.ts
|
|
338
365
|
var jiraOnboarding = new ConnectorOnboarding({
|
|
339
366
|
dataOverviewInstructions: {
|
|
340
|
-
en: `1. Call
|
|
341
|
-
2. For key projects, call
|
|
342
|
-
3. Call
|
|
343
|
-
ja: `1.
|
|
344
|
-
2. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066
|
|
345
|
-
3.
|
|
367
|
+
en: `1. Call connector_jira-api-key_request with GET project to list all accessible projects
|
|
368
|
+
2. For key projects, call connector_jira-api-key_request with POST search to search issues using JQL (e.g., body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] })
|
|
369
|
+
3. Call connector_jira-api-key_request with GET issue/{issueKey} to inspect a sample issue's full details`,
|
|
370
|
+
ja: `1. connector_jira-api-key_request \u3067 GET project \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
|
|
371
|
+
2. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 connector_jira-api-key_request \u3067 POST search \u3092\u4F7F\u7528\u3057\u3066JQL\u3067\u30A4\u30B7\u30E5\u30FC\u3092\u691C\u7D22\uFF08\u4F8B: body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] }\uFF09
|
|
372
|
+
3. connector_jira-api-key_request \u3067 GET issue/{issueKey} \u3092\u547C\u3073\u51FA\u3057\u3001\u30B5\u30F3\u30D7\u30EB\u30A4\u30B7\u30E5\u30FC\u306E\u8A73\u7D30\u3092\u78BA\u8A8D`
|
|
346
373
|
}
|
|
347
374
|
});
|
|
348
375
|
|
|
@@ -404,6 +431,43 @@ async function getProject(params, keyOrId) {
|
|
|
404
431
|
}
|
|
405
432
|
return await res.json();
|
|
406
433
|
}
|
|
434
|
+
async function fetchProjectIssueCount(params, projectKey) {
|
|
435
|
+
try {
|
|
436
|
+
const jql = encodeURIComponent(`project = ${projectKey}`);
|
|
437
|
+
const res = await apiFetch(
|
|
438
|
+
params,
|
|
439
|
+
`search?jql=${jql}&maxResults=0`
|
|
440
|
+
);
|
|
441
|
+
if (!res.ok) return null;
|
|
442
|
+
const data = await res.json();
|
|
443
|
+
return typeof data.total === "number" ? data.total : null;
|
|
444
|
+
} catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
async function fetchStatusBreakdown(params, projectKey) {
|
|
449
|
+
try {
|
|
450
|
+
const jql = encodeURIComponent(
|
|
451
|
+
`project = ${projectKey} ORDER BY created DESC`
|
|
452
|
+
);
|
|
453
|
+
const res = await apiFetch(
|
|
454
|
+
params,
|
|
455
|
+
`search?jql=${jql}&maxResults=100&fields=status`
|
|
456
|
+
);
|
|
457
|
+
if (!res.ok) return null;
|
|
458
|
+
const data = await res.json();
|
|
459
|
+
const issues = data.issues ?? [];
|
|
460
|
+
if (issues.length === 0) return null;
|
|
461
|
+
const breakdown = {};
|
|
462
|
+
for (const issue of issues) {
|
|
463
|
+
const category = issue.fields?.status?.statusCategory?.name ?? "Unknown";
|
|
464
|
+
breakdown[category] = (breakdown[category] ?? 0) + 1;
|
|
465
|
+
}
|
|
466
|
+
return breakdown;
|
|
467
|
+
} catch {
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
407
471
|
var jiraSetupFlow = {
|
|
408
472
|
initialState: () => ({}),
|
|
409
473
|
steps: [
|
|
@@ -444,17 +508,37 @@ var jiraSetupFlow = {
|
|
|
444
508
|
const sections = ["## Jira", ""];
|
|
445
509
|
for (const key of targetKeys) {
|
|
446
510
|
const project = await getProject(rt.params, key);
|
|
447
|
-
|
|
511
|
+
const issueCount = await fetchProjectIssueCount(rt.params, key);
|
|
512
|
+
const countLabel = issueCount == null ? "" : ` - ${issueCount.toLocaleString()} issues`;
|
|
513
|
+
sections.push(
|
|
514
|
+
`### Project: ${project.name} (${project.key})${countLabel}`,
|
|
515
|
+
""
|
|
516
|
+
);
|
|
448
517
|
const lead = project.lead?.displayName ?? "-";
|
|
449
518
|
const typeKey = project.projectTypeKey ?? "-";
|
|
450
519
|
sections.push(`- Lead: ${lead}`);
|
|
451
520
|
sections.push(`- Project type: ${typeKey}`);
|
|
521
|
+
if (issueCount != null) {
|
|
522
|
+
sections.push(`- Total issues: ${issueCount.toLocaleString()}`);
|
|
523
|
+
}
|
|
452
524
|
const issueTypes = project.issueTypes ?? [];
|
|
453
525
|
sections.push(`- Issue types (${issueTypes.length}):`);
|
|
454
526
|
for (const it of issueTypes) {
|
|
455
527
|
const suffix = it.subtask ? " (sub-task)" : "";
|
|
456
528
|
sections.push(` - ${it.name}${suffix}`);
|
|
457
529
|
}
|
|
530
|
+
const breakdown = await fetchStatusBreakdown(rt.params, key);
|
|
531
|
+
if (breakdown && Object.keys(breakdown).length > 0) {
|
|
532
|
+
sections.push("");
|
|
533
|
+
sections.push("**Status category breakdown (from recent 100 issues):**", "");
|
|
534
|
+
sections.push("| Status category | Count |");
|
|
535
|
+
sections.push("|-----------------|-------|");
|
|
536
|
+
for (const [category, count] of Object.entries(breakdown).sort(
|
|
537
|
+
(a, b) => b[1] - a[1]
|
|
538
|
+
)) {
|
|
539
|
+
sections.push(`| ${category} | ${count} |`);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
458
542
|
sections.push("");
|
|
459
543
|
}
|
|
460
544
|
return sections.join("\n");
|
|
@@ -553,7 +637,7 @@ var jiraConnector = new ConnectorPlugin({
|
|
|
553
637
|
systemPrompt: {
|
|
554
638
|
en: `### Tools
|
|
555
639
|
|
|
556
|
-
- \`
|
|
640
|
+
- \`connector_jira-api-key_request\`: The only way to call the Jira Cloud REST API (v3). Use it to list projects, search issues with JQL, get issue details, create/update issues, manage transitions, and add comments. Authentication (Basic Auth with email + API token) and instance URL are configured automatically.
|
|
557
641
|
|
|
558
642
|
### Business Logic
|
|
559
643
|
|
|
@@ -623,7 +707,7 @@ await jira.request("/rest/api/3/issue", {
|
|
|
623
707
|
- Text search: summary ~ "keyword"`,
|
|
624
708
|
ja: `### \u30C4\u30FC\u30EB
|
|
625
709
|
|
|
626
|
-
- \`
|
|
710
|
+
- \`connector_jira-api-key_request\`: Jira Cloud REST API\uFF08v3\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\u3001JQL\u306B\u3088\u308B\u30A4\u30B7\u30E5\u30FC\u691C\u7D22\u3001\u30A4\u30B7\u30E5\u30FC\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u30A4\u30B7\u30E5\u30FC\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001\u30C8\u30E9\u30F3\u30B8\u30B7\u30E7\u30F3\u7BA1\u7406\u3001\u30B3\u30E1\u30F3\u30C8\u8FFD\u52A0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Basic Auth: \u30E1\u30FC\u30EB + API\u30C8\u30FC\u30AF\u30F3\uFF09\u3068\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
627
711
|
|
|
628
712
|
### Business Logic
|
|
629
713
|
|
|
@@ -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.
|
|
@@ -251,7 +253,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
251
253
|
/**
|
|
252
254
|
* Create tools for connections that belong to this connector.
|
|
253
255
|
* Filters connections by connectorKey internally.
|
|
254
|
-
* Returns tools keyed as
|
|
256
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
255
257
|
*/
|
|
256
258
|
createTools(connections, config, opts) {
|
|
257
259
|
const myConnections = connections.filter(
|
|
@@ -261,7 +263,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
261
263
|
for (const t of Object.values(this.tools)) {
|
|
262
264
|
const tool = t.createTool(myConnections, config);
|
|
263
265
|
const originalToModelOutput = tool.toModelOutput;
|
|
264
|
-
result[
|
|
266
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
265
267
|
...tool,
|
|
266
268
|
toModelOutput: async (options) => {
|
|
267
269
|
if (!originalToModelOutput) {
|
|
@@ -317,19 +319,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
317
319
|
};
|
|
318
320
|
let state = flow.initialState();
|
|
319
321
|
let answerIdx = 0;
|
|
322
|
+
const pendingParameterUpdates = [];
|
|
320
323
|
for (const step of flow.steps) {
|
|
321
324
|
const ans = ctx.answers[answerIdx];
|
|
322
325
|
if (ans && ans.questionSlug === step.slug) {
|
|
323
326
|
state = step.applyAnswer(state, ans.answer);
|
|
327
|
+
if (step.toParameterUpdates) {
|
|
328
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
329
|
+
}
|
|
324
330
|
answerIdx += 1;
|
|
325
331
|
continue;
|
|
326
332
|
}
|
|
333
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
327
334
|
if (step.type === "text") {
|
|
335
|
+
if (step.fetchOptions) {
|
|
336
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
337
|
+
if (options2.length === 0) {
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
328
341
|
return {
|
|
329
342
|
type: "nextQuestion",
|
|
330
343
|
questionSlug: step.slug,
|
|
331
344
|
question: step.question[ctx.language],
|
|
332
|
-
questionType: "text"
|
|
345
|
+
questionType: "text",
|
|
346
|
+
allowFreeText: resolvedAllowFreeText,
|
|
347
|
+
...pendingParameterUpdates.length > 0 && {
|
|
348
|
+
parameterUpdates: pendingParameterUpdates
|
|
349
|
+
}
|
|
333
350
|
};
|
|
334
351
|
}
|
|
335
352
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -341,11 +358,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
341
358
|
questionSlug: step.slug,
|
|
342
359
|
question: step.question[ctx.language],
|
|
343
360
|
questionType: step.type,
|
|
344
|
-
options
|
|
361
|
+
options,
|
|
362
|
+
allowFreeText: resolvedAllowFreeText,
|
|
363
|
+
...pendingParameterUpdates.length > 0 && {
|
|
364
|
+
parameterUpdates: pendingParameterUpdates
|
|
365
|
+
}
|
|
345
366
|
};
|
|
346
367
|
}
|
|
347
368
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
348
|
-
return {
|
|
369
|
+
return {
|
|
370
|
+
type: "fulfilled",
|
|
371
|
+
dataInvestigationResult,
|
|
372
|
+
...pendingParameterUpdates.length > 0 && {
|
|
373
|
+
parameterUpdates: pendingParameterUpdates
|
|
374
|
+
}
|
|
375
|
+
};
|
|
349
376
|
}
|
|
350
377
|
|
|
351
378
|
// ../connectors/src/auth-types.ts
|
|
@@ -363,14 +390,14 @@ var kintoneApiTokenOnboarding = new ConnectorOnboarding({
|
|
|
363
390
|
dataOverviewInstructions: {
|
|
364
391
|
en: `Each connection is scoped to a single kintone app (configured via the "app-id" parameter). The request tool auto-injects the configured app id, so you do NOT need to specify "app=" in paths or "app" in bodies. apps.json is NOT available with API Token auth.
|
|
365
392
|
|
|
366
|
-
1. Call
|
|
367
|
-
2. Call
|
|
368
|
-
3. Call
|
|
393
|
+
1. Call connector_kintone-api-key_request with GET app.json to fetch the scoped app's metadata (name, description, creator)
|
|
394
|
+
2. Call connector_kintone-api-key_request with GET app/form/fields.json to get field definitions
|
|
395
|
+
3. Call connector_kintone-api-key_request with GET records.json with query=limit 5 to sample records`,
|
|
369
396
|
ja: `\u5404\u63A5\u7D9A\u306F1\u3064\u306Ekintone\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\uFF08"app-id" \u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u8A2D\u5B9A\uFF09\u3002request \u30C4\u30FC\u30EB\u306F\u8A2D\u5B9A\u3055\u308C\u305F\u30A2\u30D7\u30EAID\u3092\u81EA\u52D5\u6CE8\u5165\u3059\u308B\u305F\u3081\u3001\u30D1\u30B9\u306B "app=" \u3084 body \u306B "app" \u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002API Token \u8A8D\u8A3C\u3067\u306F apps.json \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002
|
|
370
397
|
|
|
371
|
-
1.
|
|
372
|
-
2.
|
|
373
|
-
3.
|
|
398
|
+
1. connector_kintone-api-key_request \u3067 GET app.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30B9\u30B3\u30FC\u30D7\u5BFE\u8C61\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\uFF08\u30A2\u30D7\u30EA\u540D\u3001\u8AAC\u660E\u3001\u4F5C\u6210\u8005\uFF09\u3092\u53D6\u5F97
|
|
399
|
+
2. connector_kintone-api-key_request \u3067 GET app/form/fields.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
|
|
400
|
+
3. connector_kintone-api-key_request \u3067 GET records.json \u3092 query=limit 5 \u3067\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
|
|
374
401
|
}
|
|
375
402
|
});
|
|
376
403
|
|
|
@@ -394,6 +421,7 @@ async function apiFetch(params, path2, init) {
|
|
|
394
421
|
}
|
|
395
422
|
|
|
396
423
|
// ../connectors/src/connectors/kintone-api-token/setup-flow.ts
|
|
424
|
+
var SAMPLE_RECORD_LIMIT = 5;
|
|
397
425
|
async function getAppMetadata(params, appId) {
|
|
398
426
|
const res = await apiFetch(
|
|
399
427
|
params,
|
|
@@ -420,15 +448,28 @@ async function getFormFields(params, appId) {
|
|
|
420
448
|
}
|
|
421
449
|
return await res.json();
|
|
422
450
|
}
|
|
451
|
+
async function getSampleRecords(params, appId) {
|
|
452
|
+
const res = await apiFetch(
|
|
453
|
+
params,
|
|
454
|
+
`records.json?app=${encodeURIComponent(appId)}&query=${encodeURIComponent(`limit ${SAMPLE_RECORD_LIMIT}`)}&totalCount=true`
|
|
455
|
+
);
|
|
456
|
+
if (!res.ok) return { records: [], totalCount: null };
|
|
457
|
+
return await res.json();
|
|
458
|
+
}
|
|
459
|
+
function formatRecordValue(val) {
|
|
460
|
+
if (val == null) return "";
|
|
461
|
+
if (typeof val === "string") return val.length > 50 ? `${val.slice(0, 50)}\u2026` : val;
|
|
462
|
+
if (Array.isArray(val)) return `[${val.length} items]`;
|
|
463
|
+
if (typeof val === "object") return JSON.stringify(val).slice(0, 50);
|
|
464
|
+
return String(val);
|
|
465
|
+
}
|
|
423
466
|
var kintoneApiTokenSetupFlow = {
|
|
424
467
|
initialState: () => ({}),
|
|
425
468
|
steps: [],
|
|
426
469
|
async finalize(_state, rt) {
|
|
427
|
-
const appId = rt.params[
|
|
470
|
+
const appId = rt.params["app-id"];
|
|
428
471
|
if (!appId) {
|
|
429
|
-
|
|
430
|
-
"kintone-api-token setup: missing app-id parameter on finalize"
|
|
431
|
-
);
|
|
472
|
+
return "## kintone\n\n_App ID \u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002_\n";
|
|
432
473
|
}
|
|
433
474
|
const sections = ["## kintone", ""];
|
|
434
475
|
const app = await getAppMetadata(rt.params, appId);
|
|
@@ -438,15 +479,39 @@ var kintoneApiTokenSetupFlow = {
|
|
|
438
479
|
sections.push(app.description, "");
|
|
439
480
|
}
|
|
440
481
|
const fields = await getFormFields(rt.params, appId);
|
|
482
|
+
const fieldEntries = Object.entries(fields.properties ?? {});
|
|
483
|
+
sections.push("#### Fields", "");
|
|
441
484
|
sections.push("| Field code | Label | Type | Required |");
|
|
442
485
|
sections.push("|------------|-------|------|----------|");
|
|
443
|
-
for (const [code, def] of
|
|
486
|
+
for (const [code, def] of fieldEntries) {
|
|
444
487
|
const escapedLabel = (def.label ?? "").replace(/\|/g, "\\|");
|
|
445
488
|
sections.push(
|
|
446
489
|
`| ${code} | ${escapedLabel || "-"} | ${def.type} | ${def.required ? "yes" : "no"} |`
|
|
447
490
|
);
|
|
448
491
|
}
|
|
449
492
|
sections.push("");
|
|
493
|
+
const sampleData = await getSampleRecords(rt.params, appId);
|
|
494
|
+
const totalCount = sampleData.totalCount ? Number(sampleData.totalCount) : null;
|
|
495
|
+
if (totalCount != null) {
|
|
496
|
+
sections.push(`#### Record count: ${totalCount.toLocaleString()}`, "");
|
|
497
|
+
}
|
|
498
|
+
const records = sampleData.records ?? [];
|
|
499
|
+
if (records.length > 0) {
|
|
500
|
+
const sampleFields = fieldEntries.slice(0, 8).map(([code]) => code);
|
|
501
|
+
if (sampleFields.length > 0) {
|
|
502
|
+
sections.push(`#### Sample records (${records.length})`, "");
|
|
503
|
+
sections.push(`| ${sampleFields.join(" | ")} |`);
|
|
504
|
+
sections.push(`| ${sampleFields.map(() => "---").join(" | ")} |`);
|
|
505
|
+
for (const record of records) {
|
|
506
|
+
const cells = sampleFields.map((code) => {
|
|
507
|
+
const cell = record[code];
|
|
508
|
+
return formatRecordValue(cell?.value).replace(/\|/g, "\\|");
|
|
509
|
+
});
|
|
510
|
+
sections.push(`| ${cells.join(" | ")} |`);
|
|
511
|
+
}
|
|
512
|
+
sections.push("");
|
|
513
|
+
}
|
|
514
|
+
}
|
|
450
515
|
return sections.join("\n");
|
|
451
516
|
}
|
|
452
517
|
};
|
|
@@ -569,7 +634,7 @@ var kintoneApiTokenConnector = new ConnectorPlugin({
|
|
|
569
634
|
systemPrompt: {
|
|
570
635
|
en: `### Tools
|
|
571
636
|
|
|
572
|
-
- \`
|
|
637
|
+
- \`connector_kintone-api-key_request\`: The only way to call the kintone REST API. Use it to fetch app metadata/field definitions and read/write records. Authentication (API Token), base URL, and the connection's app id are configured automatically. Each connection is scoped to exactly one app (kintone API tokens are per-app).
|
|
573
638
|
|
|
574
639
|
### App scoping (important)
|
|
575
640
|
|
|
@@ -642,7 +707,7 @@ export default async function handler(c: Context) {
|
|
|
642
707
|
- String: \`like "partial match"\``,
|
|
643
708
|
ja: `### \u30C4\u30FC\u30EB
|
|
644
709
|
|
|
645
|
-
- \`
|
|
710
|
+
- \`connector_kintone-api-key_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\u30FB\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30C8\u30FC\u30AF\u30F3\uFF09\u3001\u30D9\u30FC\u30B9URL\u3001\u304A\u3088\u3073\u63A5\u7D9A\u306E\u30A2\u30D7\u30EAID\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u5404\u63A5\u7D9A\u306F\u3061\u3087\u3046\u30691\u3064\u306E\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\uFF08kintone API\u30C8\u30FC\u30AF\u30F3\u306F\u30A2\u30D7\u30EA\u5358\u4F4D\u306E\u305F\u3081\uFF09\u3002
|
|
646
711
|
|
|
647
712
|
### \u30A2\u30D7\u30EA\u30B9\u30B3\u30FC\u30D7\uFF08\u91CD\u8981\uFF09
|
|
648
713
|
|
|
@@ -720,14 +785,15 @@ export default async function handler(c: Context) {
|
|
|
720
785
|
const baseUrl = params[parameters.baseUrl.slug];
|
|
721
786
|
const apiToken = params[parameters.apiToken.slug];
|
|
722
787
|
const appId = params[parameters.appId.slug];
|
|
723
|
-
if (!baseUrl || !apiToken
|
|
788
|
+
if (!baseUrl || !apiToken) {
|
|
724
789
|
return {
|
|
725
790
|
success: false,
|
|
726
|
-
error: `Missing required parameters: ${parameters.baseUrl.slug}, ${parameters.apiToken.slug}
|
|
791
|
+
error: `Missing required parameters: ${parameters.baseUrl.slug}, ${parameters.apiToken.slug}`
|
|
727
792
|
};
|
|
728
793
|
}
|
|
729
794
|
try {
|
|
730
|
-
const
|
|
795
|
+
const path2 = appId ? `app.json?id=${encodeURIComponent(appId)}` : `app/form/fields.json?app=0`;
|
|
796
|
+
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${path2}`;
|
|
731
797
|
const res = await fetch(url, {
|
|
732
798
|
method: "GET",
|
|
733
799
|
headers: {
|
|
@@ -735,6 +801,15 @@ export default async function handler(c: Context) {
|
|
|
735
801
|
Accept: "application/json"
|
|
736
802
|
}
|
|
737
803
|
});
|
|
804
|
+
if (!appId) {
|
|
805
|
+
if (res.status === 401 || res.status === 403) {
|
|
806
|
+
return {
|
|
807
|
+
success: false,
|
|
808
|
+
error: "kintone API failed: invalid API token"
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
return { success: true };
|
|
812
|
+
}
|
|
738
813
|
if (!res.ok) {
|
|
739
814
|
const data = await res.json().catch(() => null);
|
|
740
815
|
const message = data?.message ?? `HTTP ${res.status} ${res.statusText}`;
|
|
@@ -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.
|
|
@@ -260,7 +262,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
260
262
|
/**
|
|
261
263
|
* Create tools for connections that belong to this connector.
|
|
262
264
|
* Filters connections by connectorKey internally.
|
|
263
|
-
* Returns tools keyed as
|
|
265
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
264
266
|
*/
|
|
265
267
|
createTools(connections, config, opts) {
|
|
266
268
|
const myConnections = connections.filter(
|
|
@@ -270,7 +272,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
270
272
|
for (const t of Object.values(this.tools)) {
|
|
271
273
|
const tool = t.createTool(myConnections, config);
|
|
272
274
|
const originalToModelOutput = tool.toModelOutput;
|
|
273
|
-
result[
|
|
275
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
274
276
|
...tool,
|
|
275
277
|
toModelOutput: async (options) => {
|
|
276
278
|
if (!originalToModelOutput) {
|
|
@@ -326,19 +328,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
326
328
|
};
|
|
327
329
|
let state = flow.initialState();
|
|
328
330
|
let answerIdx = 0;
|
|
331
|
+
const pendingParameterUpdates = [];
|
|
329
332
|
for (const step of flow.steps) {
|
|
330
333
|
const ans = ctx.answers[answerIdx];
|
|
331
334
|
if (ans && ans.questionSlug === step.slug) {
|
|
332
335
|
state = step.applyAnswer(state, ans.answer);
|
|
336
|
+
if (step.toParameterUpdates) {
|
|
337
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
338
|
+
}
|
|
333
339
|
answerIdx += 1;
|
|
334
340
|
continue;
|
|
335
341
|
}
|
|
342
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
336
343
|
if (step.type === "text") {
|
|
344
|
+
if (step.fetchOptions) {
|
|
345
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
346
|
+
if (options2.length === 0) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
337
350
|
return {
|
|
338
351
|
type: "nextQuestion",
|
|
339
352
|
questionSlug: step.slug,
|
|
340
353
|
question: step.question[ctx.language],
|
|
341
|
-
questionType: "text"
|
|
354
|
+
questionType: "text",
|
|
355
|
+
allowFreeText: resolvedAllowFreeText,
|
|
356
|
+
...pendingParameterUpdates.length > 0 && {
|
|
357
|
+
parameterUpdates: pendingParameterUpdates
|
|
358
|
+
}
|
|
342
359
|
};
|
|
343
360
|
}
|
|
344
361
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -350,11 +367,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
350
367
|
questionSlug: step.slug,
|
|
351
368
|
question: step.question[ctx.language],
|
|
352
369
|
questionType: step.type,
|
|
353
|
-
options
|
|
370
|
+
options,
|
|
371
|
+
allowFreeText: resolvedAllowFreeText,
|
|
372
|
+
...pendingParameterUpdates.length > 0 && {
|
|
373
|
+
parameterUpdates: pendingParameterUpdates
|
|
374
|
+
}
|
|
354
375
|
};
|
|
355
376
|
}
|
|
356
377
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
357
|
-
return {
|
|
378
|
+
return {
|
|
379
|
+
type: "fulfilled",
|
|
380
|
+
dataInvestigationResult,
|
|
381
|
+
...pendingParameterUpdates.length > 0 && {
|
|
382
|
+
parameterUpdates: pendingParameterUpdates
|
|
383
|
+
}
|
|
384
|
+
};
|
|
358
385
|
}
|
|
359
386
|
async function resolveSetupSelection(params) {
|
|
360
387
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -375,12 +402,12 @@ var AUTH_TYPES = {
|
|
|
375
402
|
// ../connectors/src/connectors/kintone/setup.ts
|
|
376
403
|
var kintoneOnboarding = new ConnectorOnboarding({
|
|
377
404
|
dataOverviewInstructions: {
|
|
378
|
-
en: `1. Call
|
|
379
|
-
2. For key apps, call
|
|
380
|
-
3. Call
|
|
381
|
-
ja: `1.
|
|
382
|
-
2. \u4E3B\u8981\u30A2\u30D7\u30EA\u306B\u3064\u3044\u3066
|
|
383
|
-
3.
|
|
405
|
+
en: `1. Call connector_kintone_request with GET apps.json to list available apps
|
|
406
|
+
2. For key apps, call connector_kintone_request with GET app/form/fields.json?app={appId} to get field definitions
|
|
407
|
+
3. Call connector_kintone_request with GET records.json?app={appId}&query=limit 5 to sample records`,
|
|
408
|
+
ja: `1. connector_kintone_request \u3067 GET apps.json \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30D7\u30EA\u4E00\u89A7\u3092\u53D6\u5F97
|
|
409
|
+
2. \u4E3B\u8981\u30A2\u30D7\u30EA\u306B\u3064\u3044\u3066 connector_kintone_request \u3067 GET app/form/fields.json?app={appId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
|
|
410
|
+
3. connector_kintone_request \u3067 GET records.json?app={appId}&query=limit 5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
|
|
384
411
|
}
|
|
385
412
|
});
|
|
386
413
|
|
|
@@ -408,6 +435,7 @@ async function apiFetch(params, path2, init) {
|
|
|
408
435
|
// ../connectors/src/connectors/kintone/setup-flow.ts
|
|
409
436
|
var ALL_APPS = "__ALL_APPS__";
|
|
410
437
|
var KINTONE_SETUP_MAX_APPS = 20;
|
|
438
|
+
var SAMPLE_RECORD_LIMIT = 5;
|
|
411
439
|
async function listApps(params) {
|
|
412
440
|
const results = [];
|
|
413
441
|
let offset = 0;
|
|
@@ -441,6 +469,25 @@ async function getFormFields(params, appId) {
|
|
|
441
469
|
}
|
|
442
470
|
return await res.json();
|
|
443
471
|
}
|
|
472
|
+
async function getSampleRecords(params, appId) {
|
|
473
|
+
try {
|
|
474
|
+
const res = await apiFetch(
|
|
475
|
+
params,
|
|
476
|
+
`records.json?app=${encodeURIComponent(appId)}&query=${encodeURIComponent(`limit ${SAMPLE_RECORD_LIMIT}`)}&totalCount=true`
|
|
477
|
+
);
|
|
478
|
+
if (!res.ok) return { records: [], totalCount: null };
|
|
479
|
+
return await res.json();
|
|
480
|
+
} catch {
|
|
481
|
+
return { records: [], totalCount: null };
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function formatRecordValue(val) {
|
|
485
|
+
if (val == null) return "";
|
|
486
|
+
if (typeof val === "string") return val.length > 50 ? `${val.slice(0, 50)}\u2026` : val;
|
|
487
|
+
if (Array.isArray(val)) return `[${val.length} items]`;
|
|
488
|
+
if (typeof val === "object") return JSON.stringify(val).slice(0, 50);
|
|
489
|
+
return String(val);
|
|
490
|
+
}
|
|
444
491
|
var kintoneSetupFlow = {
|
|
445
492
|
initialState: () => ({}),
|
|
446
493
|
steps: [
|
|
@@ -486,15 +533,38 @@ var kintoneSetupFlow = {
|
|
|
486
533
|
sections.push(app.description, "");
|
|
487
534
|
}
|
|
488
535
|
const fields = await getFormFields(rt.params, appId);
|
|
536
|
+
const fieldEntries = Object.entries(fields.properties ?? {});
|
|
489
537
|
sections.push("| Field code | Label | Type | Required |");
|
|
490
538
|
sections.push("|------------|-------|------|----------|");
|
|
491
|
-
for (const [code, def] of
|
|
539
|
+
for (const [code, def] of fieldEntries) {
|
|
492
540
|
const escapedLabel = (def.label ?? "").replace(/\|/g, "\\|");
|
|
493
541
|
sections.push(
|
|
494
542
|
`| ${code} | ${escapedLabel || "-"} | ${def.type} | ${def.required ? "yes" : "no"} |`
|
|
495
543
|
);
|
|
496
544
|
}
|
|
497
545
|
sections.push("");
|
|
546
|
+
const sampleData = await getSampleRecords(rt.params, appId);
|
|
547
|
+
const totalCount = sampleData.totalCount ? Number(sampleData.totalCount) : null;
|
|
548
|
+
if (totalCount != null) {
|
|
549
|
+
sections.push(`#### Record count: ${totalCount.toLocaleString()}`, "");
|
|
550
|
+
}
|
|
551
|
+
const records = sampleData.records ?? [];
|
|
552
|
+
if (records.length > 0) {
|
|
553
|
+
const sampleFields = fieldEntries.slice(0, 8).map(([code]) => code);
|
|
554
|
+
if (sampleFields.length > 0) {
|
|
555
|
+
sections.push(`#### Sample records (${records.length})`, "");
|
|
556
|
+
sections.push(`| ${sampleFields.join(" | ")} |`);
|
|
557
|
+
sections.push(`| ${sampleFields.map(() => "---").join(" | ")} |`);
|
|
558
|
+
for (const record of records) {
|
|
559
|
+
const cells = sampleFields.map((code) => {
|
|
560
|
+
const cell = record[code];
|
|
561
|
+
return formatRecordValue(cell?.value).replace(/\|/g, "\\|");
|
|
562
|
+
});
|
|
563
|
+
sections.push(`| ${cells.join(" | ")} |`);
|
|
564
|
+
}
|
|
565
|
+
sections.push("");
|
|
566
|
+
}
|
|
567
|
+
}
|
|
498
568
|
}
|
|
499
569
|
return sections.join("\n");
|
|
500
570
|
}
|
|
@@ -587,7 +657,7 @@ var kintoneConnector = new ConnectorPlugin({
|
|
|
587
657
|
systemPrompt: {
|
|
588
658
|
en: `### Tools
|
|
589
659
|
|
|
590
|
-
- \`
|
|
660
|
+
- \`connector_kintone_request\`: The only way to call the kintone REST API. Use it to list apps, fetch field definitions, and read/write records. The base URL (e.g., \`https://example.cybozu.com\`) is automatically resolved. See the kintone REST API Reference below for endpoints and the kintone query syntax.
|
|
591
661
|
|
|
592
662
|
### Business Logic
|
|
593
663
|
|
|
@@ -654,7 +724,7 @@ export default async function handler(c: Context) {
|
|
|
654
724
|
- String: \`like "partial match"\``,
|
|
655
725
|
ja: `### \u30C4\u30FC\u30EB
|
|
656
726
|
|
|
657
|
-
- \`
|
|
727
|
+
- \`connector_kintone_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D9\u30FC\u30B9URL\uFF08\u4F8B: \`https://example.cybozu.com\`\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304A\u3088\u3073kintone\u30AF\u30A8\u30EA\u69CB\u6587\u306F\u4E0B\u90E8\u306E\u300Ckintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
658
728
|
|
|
659
729
|
### Business Logic
|
|
660
730
|
|