@squadbase/vite-server 0.1.17-dev.a107052 → 0.1.17-dev.d4fff69
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 +4284 -820
- package/dist/connectors/airtable-oauth.js +48 -8
- package/dist/connectors/airtable.js +44 -8
- package/dist/connectors/amplitude.js +8 -8
- package/dist/connectors/anthropic.js +2 -2
- package/dist/connectors/asana.js +37 -10
- package/dist/connectors/attio.js +30 -13
- package/dist/connectors/aws-billing.js +8 -8
- package/dist/connectors/azure-sql.js +47 -10
- package/dist/connectors/backlog-api-key.js +40 -15
- package/dist/connectors/clickup.js +50 -10
- package/dist/connectors/cosmosdb.js +12 -12
- package/dist/connectors/customerio.js +8 -8
- package/dist/connectors/dbt.js +686 -25
- package/dist/connectors/freshdesk.js +82 -8
- package/dist/connectors/freshsales.js +8 -8
- package/dist/connectors/freshservice.js +8 -8
- package/dist/connectors/gamma.js +15 -15
- package/dist/connectors/gemini.js +2 -2
- package/dist/connectors/github.js +12 -12
- package/dist/connectors/gmail-oauth.js +10 -10
- package/dist/connectors/gmail.js +4 -4
- package/dist/connectors/google-ads.js +8 -8
- package/dist/connectors/google-analytics-oauth.js +152 -25
- package/dist/connectors/google-analytics.js +475 -95
- package/dist/connectors/google-audit-log.js +4 -4
- package/dist/connectors/google-calendar-oauth.js +61 -15
- package/dist/connectors/google-calendar.js +61 -11
- package/dist/connectors/google-docs.js +10 -10
- package/dist/connectors/google-drive.js +32 -10
- package/dist/connectors/google-search-console-oauth.js +126 -17
- package/dist/connectors/google-sheets.js +6 -6
- package/dist/connectors/google-slides.js +10 -10
- package/dist/connectors/grafana.js +45 -10
- package/dist/connectors/hackernews.d.ts +5 -0
- package/dist/connectors/hackernews.js +890 -0
- package/dist/connectors/hubspot-oauth.js +41 -9
- package/dist/connectors/hubspot.js +25 -9
- package/dist/connectors/influxdb.js +8 -8
- package/dist/connectors/intercom-oauth.js +72 -12
- package/dist/connectors/intercom.js +12 -12
- package/dist/connectors/jdbc.js +37 -10
- package/dist/connectors/jira-api-key.js +68 -11
- package/dist/connectors/kintone-api-token.js +66 -18
- package/dist/connectors/kintone.js +54 -11
- package/dist/connectors/linear.js +54 -12
- package/dist/connectors/linkedin-ads.js +41 -14
- package/dist/connectors/mailchimp-oauth.js +6 -6
- package/dist/connectors/mailchimp.js +6 -6
- package/dist/connectors/meta-ads-oauth.js +33 -14
- package/dist/connectors/meta-ads.js +35 -14
- package/dist/connectors/mixpanel.js +8 -8
- package/dist/connectors/monday.js +9 -9
- package/dist/connectors/mongodb.js +8 -8
- package/dist/connectors/notion-oauth.js +60 -11
- package/dist/connectors/notion.js +60 -11
- package/dist/connectors/openai.js +2 -2
- package/dist/connectors/oracle.js +39 -11
- package/dist/connectors/outlook-oauth.js +21 -21
- package/dist/connectors/powerbi-oauth.js +13 -13
- package/dist/connectors/salesforce.js +42 -9
- package/dist/connectors/semrush.js +6 -6
- package/dist/connectors/sentry.js +36 -10
- package/dist/connectors/shopify-oauth.js +43 -10
- package/dist/connectors/shopify.js +8 -8
- package/dist/connectors/sqlserver.js +47 -10
- package/dist/connectors/stripe-api-key.js +66 -15
- package/dist/connectors/stripe-oauth.js +70 -19
- package/dist/connectors/supabase.js +31 -6
- package/dist/connectors/tableau.js +15 -15
- package/dist/connectors/tiktok-ads.js +37 -16
- package/dist/connectors/wix-store.js +8 -8
- package/dist/connectors/x.d.ts +5 -0
- package/dist/connectors/x.js +927 -0
- package/dist/connectors/zendesk-oauth.js +55 -12
- package/dist/connectors/zendesk.js +12 -12
- package/dist/index.js +4302 -818
- package/dist/main.js +4302 -818
- package/dist/vite-plugin.js +4282 -818
- package/package.json +9 -1
|
@@ -308,7 +308,7 @@ async function runMssqlQuery(parsed, sql, options = {}) {
|
|
|
308
308
|
try {
|
|
309
309
|
const result = await pool.request().query(sql);
|
|
310
310
|
const recordset = result.recordset ?? [];
|
|
311
|
-
return { rows: recordset };
|
|
311
|
+
return { rows: recordset, rowsAffected: result.rowsAffected ?? [] };
|
|
312
312
|
} finally {
|
|
313
313
|
await pool.close();
|
|
314
314
|
}
|
|
@@ -513,7 +513,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
513
513
|
/**
|
|
514
514
|
* Create tools for connections that belong to this connector.
|
|
515
515
|
* Filters connections by connectorKey internally.
|
|
516
|
-
* Returns tools keyed as
|
|
516
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
517
517
|
*/
|
|
518
518
|
createTools(connections, config, opts) {
|
|
519
519
|
const myConnections = connections.filter(
|
|
@@ -523,7 +523,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
523
523
|
for (const t of Object.values(this.tools)) {
|
|
524
524
|
const tool = t.createTool(myConnections, config);
|
|
525
525
|
const originalToModelOutput = tool.toModelOutput;
|
|
526
|
-
result[
|
|
526
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
527
527
|
...tool,
|
|
528
528
|
toModelOutput: async (options) => {
|
|
529
529
|
if (!originalToModelOutput) {
|
|
@@ -650,6 +650,12 @@ var AUTH_TYPES = {
|
|
|
650
650
|
USER_PASSWORD: "user-password"
|
|
651
651
|
};
|
|
652
652
|
|
|
653
|
+
// ../connectors/src/lib/sql-dml.ts
|
|
654
|
+
function isDmlStatement(sql) {
|
|
655
|
+
const stripped = sql.replace(/^(\s*(--[^\n]*\n|\/\*[\s\S]*?\*\/))+/, "").trimStart();
|
|
656
|
+
return /^(insert|update|delete|merge)\b/i.test(stripped);
|
|
657
|
+
}
|
|
658
|
+
|
|
653
659
|
// ../connectors/src/lib/unwrap-sample-limit.ts
|
|
654
660
|
var STRICT_WRAPPER_RE = /^\s*SELECT\s+\*\s+FROM\s+\(([\s\S]+)\)\s+AS\s+\w+\s+LIMIT\s+(\d+)\s*;?\s*$/i;
|
|
655
661
|
var TRAILING_LIMIT_RE = /\s+LIMIT\s+(\d+)\s*;?\s*$/i;
|
|
@@ -756,6 +762,28 @@ function buildFlow(options) {
|
|
|
756
762
|
fetchAll: () => fetchTableNames(rt.params, schema),
|
|
757
763
|
limit: SQLSERVER_SETUP_MAX_TABLES
|
|
758
764
|
});
|
|
765
|
+
let rowCounts = /* @__PURE__ */ new Map();
|
|
766
|
+
try {
|
|
767
|
+
const countRows = await runSqlServerSetupQuery(
|
|
768
|
+
rt.params,
|
|
769
|
+
`SELECT t.TABLE_NAME, SUM(p.rows) AS row_count
|
|
770
|
+
FROM INFORMATION_SCHEMA.TABLES t
|
|
771
|
+
JOIN sys.partitions p
|
|
772
|
+
ON OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME) = p.object_id
|
|
773
|
+
AND p.index_id IN (0, 1)
|
|
774
|
+
WHERE t.TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
775
|
+
AND t.TABLE_TYPE IN ('BASE TABLE', 'VIEW')
|
|
776
|
+
GROUP BY t.TABLE_NAME`,
|
|
777
|
+
forceEncrypt
|
|
778
|
+
);
|
|
779
|
+
rowCounts = new Map(
|
|
780
|
+
countRows.map((r) => [
|
|
781
|
+
String(r["TABLE_NAME"] ?? ""),
|
|
782
|
+
Number(r["row_count"] ?? 0)
|
|
783
|
+
])
|
|
784
|
+
);
|
|
785
|
+
} catch {
|
|
786
|
+
}
|
|
759
787
|
const sections = [
|
|
760
788
|
`## ${connectorName}`,
|
|
761
789
|
"",
|
|
@@ -772,7 +800,9 @@ function buildFlow(options) {
|
|
|
772
800
|
ORDER BY ORDINAL_POSITION`,
|
|
773
801
|
forceEncrypt
|
|
774
802
|
);
|
|
775
|
-
|
|
803
|
+
const rowCount = rowCounts.get(table);
|
|
804
|
+
const heading = typeof rowCount === "number" ? `#### Table: ${table} (~${rowCount.toLocaleString()} rows)` : `#### Table: ${table}`;
|
|
805
|
+
sections.push(heading, "");
|
|
776
806
|
sections.push("| Column | Type | Nullable | Default |");
|
|
777
807
|
sections.push("|--------|------|----------|---------|");
|
|
778
808
|
for (const c of cols) {
|
|
@@ -805,11 +835,11 @@ init_utils();
|
|
|
805
835
|
// ../connectors/src/connectors/azure-sql/setup.ts
|
|
806
836
|
var azureSqlOnboarding = new ConnectorOnboarding({
|
|
807
837
|
dataOverviewInstructions: {
|
|
808
|
-
en: `1. Use
|
|
838
|
+
en: `1. Use connector_azure-sql_executeQuery to confirm the database flavor: \`SELECT @@VERSION\` (Azure SQL returns "Microsoft SQL Azure \u2026")
|
|
809
839
|
2. List user tables: \`SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\`
|
|
810
840
|
3. For key tables, fetch column info: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
|
|
811
841
|
4. Sample up to 3 tables. Azure SQL is T-SQL, so use \`TOP\` rather than \`LIMIT\`: \`SELECT TOP 5 * FROM <schema>.<table_name>\``,
|
|
812
|
-
ja: `1.
|
|
842
|
+
ja: `1. connector_azure-sql_executeQuery \u3067\u30D5\u30EC\u30FC\u30D0\u30FC\u3092\u78BA\u8A8D: \`SELECT @@VERSION\`\uFF08Azure SQL \u306F "Microsoft SQL Azure \u2026" \u3092\u8FD4\u3057\u307E\u3059\uFF09
|
|
813
843
|
2. \u30E6\u30FC\u30B6\u30FC\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\`
|
|
814
844
|
3. \u4E3B\u8981\u30C6\u30FC\u30D6\u30EB\u306E\u30AB\u30E9\u30E0\u60C5\u5831: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
|
|
815
845
|
4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u6700\u59273\u30C6\u30FC\u30D6\u30EB\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3002Azure SQL \u306F T-SQL \u306E\u305F\u3081 \`LIMIT\` \u3067\u306F\u306A\u304F \`TOP\` \u3092\u4F7F\u7528: \`SELECT TOP 5 * FROM <schema>.<table_name>\``
|
|
@@ -841,6 +871,9 @@ var outputSchema = z.discriminatedUnion("success", [
|
|
|
841
871
|
z.object({
|
|
842
872
|
success: z.literal(true),
|
|
843
873
|
rowCount: z.number(),
|
|
874
|
+
rowsAffected: z.number().optional().describe(
|
|
875
|
+
"Affected rows for INSERT/UPDATE/DELETE; undefined for SELECT"
|
|
876
|
+
),
|
|
844
877
|
truncated: z.boolean(),
|
|
845
878
|
rows: z.array(z.record(z.string(), z.unknown()))
|
|
846
879
|
}),
|
|
@@ -854,7 +887,8 @@ var executeQueryTool = new ConnectorTool({
|
|
|
854
887
|
description: `Execute a T-SQL query against Azure SQL Database. Returns up to ${MAX_ROWS} rows.
|
|
855
888
|
Use for: schema exploration via \`INFORMATION_SCHEMA\`, data sampling, and analytical queries.
|
|
856
889
|
Azure SQL is T-SQL: use \`TOP n\` instead of \`LIMIT n\`. Identifiers can be wrapped in square brackets.
|
|
857
|
-
Avoid loading large amounts of data; always include \`TOP\` in queries
|
|
890
|
+
Avoid loading large amounts of data; always include \`TOP\` in queries.
|
|
891
|
+
For INSERT/UPDATE/DELETE, \`rowCount\` is 0 and \`rows\` is empty (rowCount counts returned rows, not affected rows) \u2014 this is normal, not a failure; check \`rowsAffected\` for the number of affected rows.`,
|
|
858
892
|
inputSchema,
|
|
859
893
|
outputSchema,
|
|
860
894
|
async execute({ connectionId, sql }, connections) {
|
|
@@ -881,7 +915,7 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
|
|
|
881
915
|
};
|
|
882
916
|
}
|
|
883
917
|
try {
|
|
884
|
-
const { rows } = await runMssqlQuery(parsed, sql, {
|
|
918
|
+
const { rows, rowsAffected } = await runMssqlQuery(parsed, sql, {
|
|
885
919
|
forceEncrypt: true,
|
|
886
920
|
tunnelParams: connectionParamsToRecord(connection2)
|
|
887
921
|
});
|
|
@@ -889,6 +923,9 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
|
|
|
889
923
|
return {
|
|
890
924
|
success: true,
|
|
891
925
|
rowCount: Math.min(rows.length, MAX_ROWS),
|
|
926
|
+
// tedious counts SELECT result rows in rowsAffected too, so only
|
|
927
|
+
// report it for DML. Multi-statement batches are summed.
|
|
928
|
+
rowsAffected: isDmlStatement(sql) ? rowsAffected.reduce((sum, n) => sum + n, 0) : void 0,
|
|
892
929
|
truncated,
|
|
893
930
|
rows: rows.slice(0, MAX_ROWS)
|
|
894
931
|
};
|
|
@@ -915,7 +952,7 @@ var azureSqlConnector = new ConnectorPlugin({
|
|
|
915
952
|
systemPrompt: {
|
|
916
953
|
en: `### Tools
|
|
917
954
|
|
|
918
|
-
- \`
|
|
955
|
+
- \`connector_azure-sql_executeQuery\`: Executes a T-SQL query against Azure SQL Database and returns rows. Use for schema exploration via \`INFORMATION_SCHEMA\` and data sampling. See the SQL Reference below for Azure SQL-specific notes.
|
|
919
956
|
|
|
920
957
|
### Business Logic
|
|
921
958
|
|
|
@@ -932,7 +969,7 @@ The business logic type for this connector is "sql".
|
|
|
932
969
|
- Row-limit compatibility: the platform's server-logic schema inference may wrap your query as \`SELECT * FROM (<inner>) AS _sq LIMIT N\`. T-SQL does not understand \`LIMIT\`, so the connector detects this exact wrapper at \`query()\` time, executes \`<inner>\` directly, and slices the first N rows in JS. You do not need to handle this \u2014 but do not author your own \`LIMIT\` clauses; use \`TOP\` / \`OFFSET ... FETCH NEXT\` in queries you write.`,
|
|
933
970
|
ja: `### \u30C4\u30FC\u30EB
|
|
934
971
|
|
|
935
|
-
- \`
|
|
972
|
+
- \`connector_azure-sql_executeQuery\`: Azure SQL Database \u306B\u5BFE\u3057\u3066 T-SQL \u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`INFORMATION_SCHEMA\` \u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002Azure SQL \u56FA\u6709\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
936
973
|
|
|
937
974
|
### Business Logic
|
|
938
975
|
|
|
@@ -212,7 +212,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
212
212
|
/**
|
|
213
213
|
* Create tools for connections that belong to this connector.
|
|
214
214
|
* Filters connections by connectorKey internally.
|
|
215
|
-
* Returns tools keyed as
|
|
215
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
216
216
|
*/
|
|
217
217
|
createTools(connections, config, opts) {
|
|
218
218
|
const myConnections = connections.filter(
|
|
@@ -222,7 +222,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
222
222
|
for (const t of Object.values(this.tools)) {
|
|
223
223
|
const tool = t.createTool(myConnections, config);
|
|
224
224
|
const originalToModelOutput = tool.toModelOutput;
|
|
225
|
-
result[
|
|
225
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
226
226
|
...tool,
|
|
227
227
|
toModelOutput: async (options) => {
|
|
228
228
|
if (!originalToModelOutput) {
|
|
@@ -352,14 +352,14 @@ var AUTH_TYPES = {
|
|
|
352
352
|
// ../connectors/src/connectors/backlog/setup.ts
|
|
353
353
|
var backlogOnboarding = new ConnectorOnboarding({
|
|
354
354
|
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.
|
|
355
|
+
en: `1. Call connector_backlog-api-key_request with GET space to verify the connection and get space information
|
|
356
|
+
2. Call connector_backlog-api-key_request with GET projects to list all accessible projects
|
|
357
|
+
3. For key projects, call connector_backlog-api-key_request with GET issues?projectId[]={projectId}&count=5&order=desc to retrieve recent issues
|
|
358
|
+
4. Call connector_backlog-api-key_request with GET projects/{projectIdOrKey}/statuses to understand the workflow statuses`,
|
|
359
|
+
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
|
|
360
|
+
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
|
|
361
|
+
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
|
|
362
|
+
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
363
|
}
|
|
364
364
|
});
|
|
365
365
|
|
|
@@ -408,6 +408,20 @@ async function listStatuses(params, projectIdOrKey) {
|
|
|
408
408
|
if (!res.ok) return [];
|
|
409
409
|
return await res.json();
|
|
410
410
|
}
|
|
411
|
+
async function countIssues(params, projectId, statusId) {
|
|
412
|
+
try {
|
|
413
|
+
const statusParam = statusId ? `&statusId[]=${statusId}` : "";
|
|
414
|
+
const res = await apiFetch(
|
|
415
|
+
params,
|
|
416
|
+
`issues/count?projectId[]=${encodeURIComponent(projectId)}${statusParam}`
|
|
417
|
+
);
|
|
418
|
+
if (!res.ok) return null;
|
|
419
|
+
const data = await res.json();
|
|
420
|
+
return typeof data.count === "number" ? data.count : null;
|
|
421
|
+
} catch {
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
411
425
|
var backlogSetupFlow = {
|
|
412
426
|
initialState: () => ({}),
|
|
413
427
|
steps: [
|
|
@@ -457,14 +471,25 @@ var backlogSetupFlow = {
|
|
|
457
471
|
continue;
|
|
458
472
|
}
|
|
459
473
|
sections.push(`### Project: ${project.name} (${project.projectKey})`, "");
|
|
460
|
-
const [issueTypes, statuses] = await Promise.all([
|
|
474
|
+
const [issueTypes, statuses, totalIssues] = await Promise.all([
|
|
461
475
|
listIssueTypes(rt.params, id),
|
|
462
|
-
listStatuses(rt.params, id)
|
|
476
|
+
listStatuses(rt.params, id),
|
|
477
|
+
countIssues(rt.params, id)
|
|
463
478
|
]);
|
|
479
|
+
if (totalIssues != null) {
|
|
480
|
+
sections.push(`- Total issues: ${totalIssues.toLocaleString()}`);
|
|
481
|
+
}
|
|
464
482
|
sections.push(`- Issue types (${issueTypes.length}):`);
|
|
465
483
|
for (const t of issueTypes) sections.push(` - ${t.name}`);
|
|
484
|
+
const statusCounts = await Promise.all(
|
|
485
|
+
statuses.map((s) => countIssues(rt.params, id, s.id))
|
|
486
|
+
);
|
|
466
487
|
sections.push(`- Statuses (${statuses.length}):`);
|
|
467
|
-
for (
|
|
488
|
+
for (let i = 0; i < statuses.length; i++) {
|
|
489
|
+
const c = statusCounts[i];
|
|
490
|
+
const cStr = c != null ? `: ${c.toLocaleString()} issues` : "";
|
|
491
|
+
sections.push(` - ${statuses[i].name}${cStr}`);
|
|
492
|
+
}
|
|
468
493
|
sections.push("");
|
|
469
494
|
}
|
|
470
495
|
return sections.join("\n");
|
|
@@ -563,7 +588,7 @@ var backlogConnector = new ConnectorPlugin({
|
|
|
563
588
|
systemPrompt: {
|
|
564
589
|
en: `### Tools
|
|
565
590
|
|
|
566
|
-
- \`
|
|
591
|
+
- \`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
592
|
|
|
568
593
|
### Business Logic
|
|
569
594
|
|
|
@@ -635,7 +660,7 @@ await backlog.request("/api/v2/issues", {
|
|
|
635
660
|
- order: "asc" or "desc"`,
|
|
636
661
|
ja: `### \u30C4\u30FC\u30EB
|
|
637
662
|
|
|
638
|
-
- \`
|
|
663
|
+
- \`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
664
|
|
|
640
665
|
### Business Logic
|
|
641
666
|
|
|
@@ -348,7 +348,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
348
348
|
/**
|
|
349
349
|
* Create tools for connections that belong to this connector.
|
|
350
350
|
* Filters connections by connectorKey internally.
|
|
351
|
-
* Returns tools keyed as
|
|
351
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
352
352
|
*/
|
|
353
353
|
createTools(connections, config, opts) {
|
|
354
354
|
const myConnections = connections.filter(
|
|
@@ -358,7 +358,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
358
358
|
for (const t of Object.values(this.tools)) {
|
|
359
359
|
const tool = t.createTool(myConnections, config);
|
|
360
360
|
const originalToModelOutput = tool.toModelOutput;
|
|
361
|
-
result[
|
|
361
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
362
362
|
...tool,
|
|
363
363
|
toModelOutput: async (options) => {
|
|
364
364
|
if (!originalToModelOutput) {
|
|
@@ -498,15 +498,15 @@ function normalizeRequestPath(path2, basePathSegment) {
|
|
|
498
498
|
// ../connectors/src/connectors/clickup/setup.ts
|
|
499
499
|
var clickupOnboarding = new ConnectorOnboarding({
|
|
500
500
|
dataOverviewInstructions: {
|
|
501
|
-
en: `1. Call
|
|
502
|
-
2. Call
|
|
501
|
+
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\`.
|
|
502
|
+
2. Call connector_clickup_request with GET /team/{team_id}/space?archived=false to list spaces in the workspace.
|
|
503
503
|
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
|
|
504
|
+
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
505
|
5. If custom fields are used, call GET /list/{list_id}/field to get their definitions.`,
|
|
506
|
-
ja: `1.
|
|
507
|
-
2.
|
|
506
|
+
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
|
|
507
|
+
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
508
|
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\
|
|
509
|
+
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
510
|
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
511
|
}
|
|
512
512
|
});
|
|
@@ -567,6 +567,21 @@ async function listFolderlessLists(params, spaceId) {
|
|
|
567
567
|
const data = await res.json();
|
|
568
568
|
return data.lists ?? [];
|
|
569
569
|
}
|
|
570
|
+
var CLICKUP_SAMPLE_LISTS_PER_SPACE = 5;
|
|
571
|
+
async function fetchListTaskCount(params, listId) {
|
|
572
|
+
try {
|
|
573
|
+
const res = await apiFetch(
|
|
574
|
+
params,
|
|
575
|
+
`/list/${encodeURIComponent(listId)}/task?archived=false&page=0`
|
|
576
|
+
);
|
|
577
|
+
if (!res.ok) return null;
|
|
578
|
+
const data = await res.json();
|
|
579
|
+
const tasks = data.tasks ?? [];
|
|
580
|
+
return tasks.length >= 100 ? "100+" : String(tasks.length);
|
|
581
|
+
} catch {
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
570
585
|
var clickupSetupFlow = {
|
|
571
586
|
initialState: () => ({}),
|
|
572
587
|
steps: [
|
|
@@ -636,6 +651,31 @@ var clickupSetupFlow = {
|
|
|
636
651
|
for (const f of folders) sections.push(` - ${f.name}`);
|
|
637
652
|
sections.push(`- Folderless lists (${folderlessLists.length}):`);
|
|
638
653
|
for (const l of folderlessLists) sections.push(` - ${l.name}`);
|
|
654
|
+
const sampled = folderlessLists.slice(0, CLICKUP_SAMPLE_LISTS_PER_SPACE);
|
|
655
|
+
if (sampled.length > 0) {
|
|
656
|
+
const counts = await Promise.all(
|
|
657
|
+
sampled.map((l) => fetchListTaskCount(rt.params, l.id))
|
|
658
|
+
);
|
|
659
|
+
sections.push(
|
|
660
|
+
"",
|
|
661
|
+
rt.language === "ja" ? `- \u30EA\u30B9\u30C8\u5225\u30BF\u30B9\u30AF\u4EF6\u6570 (\u4E0A\u4F4D${sampled.length}\u4EF6):` : `- Task counts (first ${sampled.length} lists):`
|
|
662
|
+
);
|
|
663
|
+
sections.push("");
|
|
664
|
+
sections.push("| List | Tasks |");
|
|
665
|
+
sections.push("|------|-------|");
|
|
666
|
+
for (let i = 0; i < sampled.length; i++) {
|
|
667
|
+
const list = sampled[i];
|
|
668
|
+
const count = counts[i] ?? "-";
|
|
669
|
+
const safeName = list.name.replace(/\|/g, "\\|");
|
|
670
|
+
sections.push(`| ${safeName} | ${count} |`);
|
|
671
|
+
}
|
|
672
|
+
if (folderlessLists.length > sampled.length) {
|
|
673
|
+
sections.push(
|
|
674
|
+
"",
|
|
675
|
+
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._`
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
639
679
|
sections.push("");
|
|
640
680
|
}
|
|
641
681
|
return sections.join("\n");
|
|
@@ -766,7 +806,7 @@ var clickupConnector = new ConnectorPlugin({
|
|
|
766
806
|
systemPrompt: {
|
|
767
807
|
en: `### Tools
|
|
768
808
|
|
|
769
|
-
- \`
|
|
809
|
+
- \`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
810
|
|
|
771
811
|
### Business Logic
|
|
772
812
|
|
|
@@ -852,7 +892,7 @@ export default async function handler(c: Context) {
|
|
|
852
892
|
- POST \`/team/{team_id}/time_entries\` \u2014 Create a time entry`,
|
|
853
893
|
ja: `### \u30C4\u30FC\u30EB
|
|
854
894
|
|
|
855
|
-
- \`
|
|
895
|
+
- \`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
896
|
|
|
857
897
|
### Business Logic
|
|
858
898
|
|
|
@@ -258,7 +258,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
258
258
|
/**
|
|
259
259
|
* Create tools for connections that belong to this connector.
|
|
260
260
|
* Filters connections by connectorKey internally.
|
|
261
|
-
* Returns tools keyed as
|
|
261
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
262
262
|
*/
|
|
263
263
|
createTools(connections, config, opts) {
|
|
264
264
|
const myConnections = connections.filter(
|
|
@@ -268,7 +268,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
268
268
|
for (const t of Object.values(this.tools)) {
|
|
269
269
|
const tool = t.createTool(myConnections, config);
|
|
270
270
|
const originalToModelOutput = tool.toModelOutput;
|
|
271
|
-
result[
|
|
271
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
272
272
|
...tool,
|
|
273
273
|
toModelOutput: async (options) => {
|
|
274
274
|
if (!originalToModelOutput) {
|
|
@@ -398,14 +398,14 @@ var AUTH_TYPES = {
|
|
|
398
398
|
// ../connectors/src/connectors/cosmosdb/setup.ts
|
|
399
399
|
var cosmosdbOnboarding = new ConnectorOnboarding({
|
|
400
400
|
dataOverviewInstructions: {
|
|
401
|
-
en: `1. Use
|
|
402
|
-
2. For key containers, sample documents with
|
|
401
|
+
en: `1. Use connector_cosmosdb_listContainers to list all containers in the configured database
|
|
402
|
+
2. For key containers, sample documents with connector_cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
|
|
403
403
|
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
|
|
404
|
+
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\``,
|
|
405
|
+
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
|
|
406
|
+
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
407
|
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
|
|
408
|
+
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
409
|
}
|
|
410
410
|
});
|
|
411
411
|
|
|
@@ -717,8 +717,8 @@ var cosmosdbConnector = new ConnectorPlugin({
|
|
|
717
717
|
systemPrompt: {
|
|
718
718
|
en: `### Tools
|
|
719
719
|
|
|
720
|
-
- \`
|
|
721
|
-
- \`
|
|
720
|
+
- \`connector_cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
|
|
721
|
+
- \`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
722
|
|
|
723
723
|
### Business Logic
|
|
724
724
|
|
|
@@ -763,8 +763,8 @@ export default async function handler(_c: Context) {
|
|
|
763
763
|
- Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
|
|
764
764
|
ja: `### \u30C4\u30FC\u30EB
|
|
765
765
|
|
|
766
|
-
- \`
|
|
767
|
-
- \`
|
|
766
|
+
- \`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
|
|
767
|
+
- \`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
768
|
|
|
769
769
|
### Business Logic
|
|
770
770
|
|
|
@@ -295,7 +295,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
295
295
|
/**
|
|
296
296
|
* Create tools for connections that belong to this connector.
|
|
297
297
|
* Filters connections by connectorKey internally.
|
|
298
|
-
* Returns tools keyed as
|
|
298
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
299
299
|
*/
|
|
300
300
|
createTools(connections, config, opts) {
|
|
301
301
|
const myConnections = connections.filter(
|
|
@@ -305,7 +305,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
305
305
|
for (const t of Object.values(this.tools)) {
|
|
306
306
|
const tool = t.createTool(myConnections, config);
|
|
307
307
|
const originalToModelOutput = tool.toModelOutput;
|
|
308
|
-
result[
|
|
308
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
309
309
|
...tool,
|
|
310
310
|
toModelOutput: async (options) => {
|
|
311
311
|
if (!originalToModelOutput) {
|
|
@@ -430,12 +430,12 @@ var AUTH_TYPES = {
|
|
|
430
430
|
// ../connectors/src/connectors/customerio/setup.ts
|
|
431
431
|
var customerioOnboarding = new ConnectorOnboarding({
|
|
432
432
|
dataOverviewInstructions: {
|
|
433
|
-
en: `1. Call
|
|
434
|
-
2. Call
|
|
433
|
+
en: `1. Call connector_customerio_request with GET /v1/segments to list all segments
|
|
434
|
+
2. Call connector_customerio_request with GET /v1/campaigns to list all campaigns
|
|
435
435
|
3. Pick a segment and call GET /v1/segments/{segment_id}/membership to view member IDs
|
|
436
436
|
4. Pick a customer ID and call GET /v1/customers/{id}/attributes to view customer attributes`,
|
|
437
|
-
ja: `1.
|
|
438
|
-
2.
|
|
437
|
+
ja: `1. connector_customerio_request \u3067 GET /v1/segments \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30BB\u30B0\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
|
|
438
|
+
2. connector_customerio_request \u3067 GET /v1/campaigns \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
|
|
439
439
|
3. \u30BB\u30B0\u30E1\u30F3\u30C8\u3092\u9078\u629E\u3057 GET /v1/segments/{segment_id}/membership \u3067\u30E1\u30F3\u30D0\u30FCID\u3092\u78BA\u8A8D
|
|
440
440
|
4. \u9867\u5BA2ID\u3092\u9078\u629E\u3057 GET /v1/customers/{id}/attributes \u3067\u9867\u5BA2\u5C5E\u6027\u3092\u78BA\u8A8D`
|
|
441
441
|
}
|
|
@@ -667,7 +667,7 @@ var customerioConnector = new ConnectorPlugin({
|
|
|
667
667
|
systemPrompt: {
|
|
668
668
|
en: `### Tools
|
|
669
669
|
|
|
670
|
-
- \`
|
|
670
|
+
- \`connector_customerio_request\`: The only way to call the Customer.io App API. Use it to read customer data, manage campaigns and segments, send transactional messages, and trigger broadcasts. Authentication (Bearer token with App API Key) is configured automatically.
|
|
671
671
|
|
|
672
672
|
### Business Logic
|
|
673
673
|
|
|
@@ -751,7 +751,7 @@ export default async function handler(c: Context) {
|
|
|
751
751
|
- Pagination uses cursor-based \`start\` parameter for customer listing`,
|
|
752
752
|
ja: `### \u30C4\u30FC\u30EB
|
|
753
753
|
|
|
754
|
-
- \`
|
|
754
|
+
- \`connector_customerio_request\`: Customer.io App API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u9867\u5BA2\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u53D6\u308A\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3084\u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u7BA1\u7406\u3001\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u9001\u4FE1\u3001\u30D6\u30ED\u30FC\u30C9\u30AD\u30E3\u30B9\u30C8\u306E\u30C8\u30EA\u30AC\u30FC\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08App API\u30AD\u30FC\u306B\u3088\u308BBearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
755
755
|
|
|
756
756
|
### Business Logic
|
|
757
757
|
|