@squadbase/vite-server 0.1.9-dev.08f5c5f → 0.1.9-dev.3841401

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.
@@ -470,7 +470,8 @@ The business logic type for this connector is "sql".
470
470
  - 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')\`
471
471
  - List columns: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
472
472
  - Cross-database queries are not supported on Azure SQL Database (single-DB scope per connection); always reference objects within the connected database.
473
- - Always bound results with \`TOP\` in queries.`,
473
+ - Always bound results with \`TOP\` in queries.
474
+ - 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.`,
474
475
  ja: `### \u30C4\u30FC\u30EB
475
476
 
476
477
  - \`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
@@ -486,7 +487,8 @@ The business logic type for this connector is "sql".
486
487
  - \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')\`
487
488
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
488
489
  - Azure SQL Database \u3067\u306F\u8907\u6570DB\u3092\u307E\u305F\u3044\u3060\u30AF\u30A8\u30EA\u306F\u3067\u304D\u307E\u305B\u3093\uFF08\u63A5\u7D9A\u5358\u4F4D\u30671DB\uFF09\u3002\u63A5\u7D9A\u4E2D\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u307F\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
489
- - \u7D50\u679C\u4EF6\u6570\u306F\u5FC5\u305A \`TOP\` \u3067\u5236\u9650\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
490
+ - \u7D50\u679C\u4EF6\u6570\u306F\u5FC5\u305A \`TOP\` \u3067\u5236\u9650\u3057\u3066\u304F\u3060\u3055\u3044\u3002
491
+ - \u884C\u6570\u5236\u9650\u306E\u4E92\u63DB\u6027: \u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E server-logic \u30B9\u30AD\u30FC\u30DE\u63A8\u8AD6\u306F\u3001\u30AF\u30A8\u30EA\u3092 \`SELECT * FROM (<inner>) AS _sq LIMIT N\` \u306E\u5F62\u3067\u30E9\u30C3\u30D7\u3057\u3066\u304F\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002T-SQL \u306B\u306F \`LIMIT\` \u304C\u7121\u3044\u305F\u3081\u3001\u30B3\u30CD\u30AF\u30BF\u306F \`query()\` \u5185\u3067\u3053\u306E\u30E9\u30C3\u30D1\u3092\u691C\u51FA\u3057\u3001\`<inner>\` \u3092\u305D\u306E\u307E\u307E\u5B9F\u884C\u3057\u3066 JS \u5074\u3067\u5148\u982D N \u884C\u306B\u5207\u308A\u8A70\u3081\u307E\u3059\u3002\u5229\u7528\u8005\u5074\u3067\u5BFE\u51E6\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u81EA\u5206\u3067\u66F8\u304F SQL \u3067\u306F \`LIMIT\` \u3092\u4F7F\u308F\u305A \`TOP\` / \`OFFSET ... FETCH NEXT\` \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002`
490
492
  },
491
493
  tools,
492
494
  async checkConnection(params, _config) {
@@ -504,6 +506,15 @@ The business logic type for this connector is "sql".
504
506
  username: params[parameters.username.slug],
505
507
  password: params[parameters.password.slug]
506
508
  });
509
+ const wrapper = sql.match(
510
+ /^\s*SELECT\s+\*\s+FROM\s+\(([\s\S]+)\)\s+AS\s+_sq\s+LIMIT\s+(\d+)\s*;?\s*$/i
511
+ );
512
+ if (wrapper) {
513
+ const inner = wrapper[1].trim();
514
+ const limit = Number.parseInt(wrapper[2], 10);
515
+ const result = await runMssqlQuery(parsed, inner, { forceEncrypt: true });
516
+ return { rows: result.rows.slice(0, limit) };
517
+ }
507
518
  return runMssqlQuery(parsed, sql, { forceEncrypt: true });
508
519
  }
509
520
  });
@@ -521,7 +521,7 @@ var clickupConnector = new ConnectorPlugin({
521
521
  description: "Connect to ClickUp for project management, task tracking, time tracking, and team collaboration data via Personal API Token.",
522
522
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5bzXkRjOeFJ7KoWdN55RAK/8b9270e4b09a9760912edae36d805fe4/clickup-icon.webp",
523
523
  parameters,
524
- releaseFlag: { dev1: true, dev2: false, prod: false },
524
+ releaseFlag: { dev1: true, dev2: true, prod: true },
525
525
  categories: ["productivity"],
526
526
  onboarding: clickupOnboarding,
527
527
  systemPrompt: {
@@ -531,8 +531,8 @@ var freshdeskConnector = new ConnectorPlugin({
531
531
  description: "Connect to Freshdesk for customer support ticket, contact, and company data via API key.",
532
532
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/1PSjIfQJgTYmiWriNTx4uE/26905f4120713bda0afd0b23d02a154e/freshdesk-icon.png",
533
533
  parameters,
534
- releaseFlag: { dev1: true, dev2: false, prod: false },
535
- categories: ["productivity"],
534
+ releaseFlag: { dev1: true, dev2: true, prod: true },
535
+ categories: ["crm"],
536
536
  onboarding: freshdeskOnboarding,
537
537
  systemPrompt: {
538
538
  en: `### Tools
@@ -121,7 +121,7 @@ function createClient(params) {
121
121
  return fetch(`${baseUrl}${path2}`, { ...init, headers });
122
122
  },
123
123
  async listContactViews() {
124
- const res = await fetch(`${baseUrl}/contacts/view`, {
124
+ const res = await fetch(`${baseUrl}/contacts/filters`, {
125
125
  method: "GET",
126
126
  headers: authHeaders()
127
127
  });
@@ -174,7 +174,7 @@ function createClient(params) {
174
174
  return await res.json();
175
175
  },
176
176
  async listAccountViews() {
177
- const res = await fetch(`${baseUrl}/sales_accounts/view`, {
177
+ const res = await fetch(`${baseUrl}/sales_accounts/filters`, {
178
178
  method: "GET",
179
179
  headers: authHeaders()
180
180
  });
@@ -195,7 +195,7 @@ function createClient(params) {
195
195
  return await res.json();
196
196
  },
197
197
  async listDealViews() {
198
- const res = await fetch(`${baseUrl}/deals/view`, {
198
+ const res = await fetch(`${baseUrl}/deals/filters`, {
199
199
  method: "GET",
200
200
  headers: authHeaders()
201
201
  });
@@ -403,15 +403,15 @@ function normalizeRequestPath(path2, basePathSegment) {
403
403
  var freshsalesOnboarding = new ConnectorOnboarding({
404
404
  dataOverviewInstructions: {
405
405
  en: `1. Call freshsales_request with GET /selector/owners to confirm credentials and discover sales team members.
406
- 2. Call freshsales_request with GET /contacts/view to list available contact views, then GET /contacts/view/{view_id} to fetch contacts in a view (paginated with \`page\` and \`per_page\`, default 25, max 100).
407
- 3. Repeat the same pattern for accounts (GET /sales_accounts/view) and deals (GET /deals/view).
406
+ 2. Call freshsales_request with GET /contacts/filters to list available contact views (filters), then GET /contacts/view/{view_id} to fetch contacts in a view (paginated with \`page\` and \`per_page\`, default 25, max 100).
407
+ 3. Repeat the same pattern for accounts (GET /sales_accounts/filters \u2192 /sales_accounts/view/{view_id}) and deals (GET /deals/filters \u2192 /deals/view/{view_id}).
408
408
  4. To inspect deal pipeline metadata, call GET /selector/deal_pipelines and GET /selector/deal_stages.
409
- 5. Use the search endpoints (POST /lookup or POST /search) to find specific records by attribute (e.g., look up a contact by email).`,
409
+ 5. Use GET /lookup to find specific records by attribute (e.g., look up a contact by email).`,
410
410
  ja: `1. freshsales_request \u3067 GET /selector/owners \u3092\u547C\u3073\u51FA\u3057\u3001\u8A8D\u8A3C\u60C5\u5831\u306E\u78BA\u8A8D\u3068\u55B6\u696D\u30E1\u30F3\u30D0\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002
411
- 2. freshsales_request \u3067 GET /contacts/view \u3092\u547C\u3073\u51FA\u3057\u3066\u30D3\u30E5\u30FC\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u3001GET /contacts/view/{view_id} \u3067\u5404\u30D3\u30E5\u30FC\u306E\u9023\u7D61\u5148\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08\`page\` \u3068 \`per_page\` \u3067\u30DA\u30FC\u30B8\u30F3\u30B0\u3001\u30C7\u30D5\u30A9\u30EB\u30C825\u3001\u6700\u5927100\uFF09\u3002
412
- 3. \u540C\u3058\u30D1\u30BF\u30FC\u30F3\u3092\u53D6\u5F15\u5148\uFF08GET /sales_accounts/view\uFF09\u3001\u5546\u8AC7\uFF08GET /deals/view\uFF09\u306B\u3082\u9069\u7528\u3057\u307E\u3059\u3002
411
+ 2. freshsales_request \u3067 GET /contacts/filters \u3092\u547C\u3073\u51FA\u3057\u3066\u30D3\u30E5\u30FC\uFF08filters\uFF09\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u3001GET /contacts/view/{view_id} \u3067\u5404\u30D3\u30E5\u30FC\u306E\u9023\u7D61\u5148\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08\`page\` \u3068 \`per_page\` \u3067\u30DA\u30FC\u30B8\u30F3\u30B0\u3001\u30C7\u30D5\u30A9\u30EB\u30C825\u3001\u6700\u5927100\uFF09\u3002
412
+ 3. \u540C\u3058\u30D1\u30BF\u30FC\u30F3\u3092\u53D6\u5F15\u5148\uFF08GET /sales_accounts/filters \u2192 /sales_accounts/view/{view_id}\uFF09\u3001\u5546\u8AC7\uFF08GET /deals/filters \u2192 /deals/view/{view_id}\uFF09\u306B\u3082\u9069\u7528\u3057\u307E\u3059\u3002
413
413
  4. \u5546\u8AC7\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u30E1\u30BF\u60C5\u5831\u306F GET /selector/deal_pipelines \u304A\u3088\u3073 GET /selector/deal_stages \u3067\u53D6\u5F97\u3057\u307E\u3059\u3002
414
- 5. \u7279\u5B9A\u30EC\u30B3\u30FC\u30C9\u3092\u5C5E\u6027\u3067\u691C\u7D22\u3059\u308B\u306B\u306F\u691C\u7D22\u7CFB\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08POST /lookup \u307E\u305F\u306F POST /search\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059\uFF08\u4F8B: \u30E1\u30FC\u30EB\u3067\u9023\u7D61\u5148\u3092\u691C\u7D22\uFF09\u3002`
414
+ 5. \u7279\u5B9A\u30EC\u30B3\u30FC\u30C9\u3092\u5C5E\u6027\u3067\u691C\u7D22\u3059\u308B\u306B\u306F GET /lookup \u3092\u4F7F\u7528\u3057\u307E\u3059\uFF08\u4F8B: \u30E1\u30FC\u30EB\u3067\u9023\u7D61\u5148\u3092\u691C\u7D22\uFF09\u3002`
415
415
  }
416
416
  });
417
417
 
@@ -430,10 +430,10 @@ var inputSchema = z.object({
430
430
  ),
431
431
  connectionId: z.string().describe("ID of the Freshsales connection to use"),
432
432
  method: z.enum(["GET", "POST", "PUT", "DELETE"]).describe(
433
- "HTTP method. GET for reading resources, POST for creating or running search/lookup, PUT for updating, DELETE for removing."
433
+ "HTTP method. GET for reading resources (including /lookup), POST for creating, PUT for updating, DELETE for removing."
434
434
  ),
435
435
  path: z.string().describe(
436
- "API path (e.g., '/contacts', '/contacts/view', '/contacts/view/{view_id}', '/deals/{id}', '/lookup'). Append query parameters such as '?page=1&per_page=100'."
436
+ "API path (e.g., '/contacts', '/contacts/filters', '/contacts/view/{view_id}', '/deals/{id}', '/lookup'). Append query parameters such as '?page=1&per_page=100'."
437
437
  ),
438
438
  body: z.record(z.string(), z.unknown()).optional().describe(
439
439
  'Request body (JSON). For creating a contact: { "contact": { "first_name": "...", "last_name": "...", "email": "..." } }. For lookup: { "q": "john@example.com", "f": "email", "entities": "contact" }.'
@@ -460,20 +460,20 @@ Authentication uses the \`Authorization: Token token=<API_KEY>\` header (handled
460
460
  Provide the API path relative to the base URL (https://<bundle>.myfreshworks.com/crm/sales/api).
461
461
 
462
462
  Common endpoints:
463
- - GET /contacts/view \u2014 List contact views (saved filters)
463
+ - GET /contacts/filters \u2014 List contact views (saved filters)
464
464
  - GET /contacts/view/{view_id} \u2014 List contacts in a view (paginated)
465
465
  - GET /contacts/{id} \u2014 Get a contact (use ?include=owner,creator,deals for related data)
466
466
  - POST /contacts \u2014 Create a contact (body: { "contact": { ... } })
467
467
  - PUT /contacts/{id} \u2014 Update a contact
468
- - GET /sales_accounts/view \u2014 List account views
468
+ - GET /sales_accounts/filters \u2014 List account views
469
469
  - GET /sales_accounts/view/{view_id} \u2014 Accounts in a view
470
- - GET /deals/view \u2014 Deal views
470
+ - GET /deals/filters \u2014 Deal views
471
471
  - GET /deals/view/{view_id} \u2014 Deals in a view
472
472
  - GET /deals/{id} \u2014 Get a deal
473
473
  - POST /deals \u2014 Create a deal
474
- - GET /leads/view \u2014 Lead views (legacy / Sales Cloud only)
474
+ - GET /leads/filters \u2014 Lead views (legacy / Sales Cloud only)
475
475
  - GET /sales_activities \u2014 List sales activities
476
- - POST /lookup?q=...&f=email&entities=contact \u2014 Look up a record by attribute
476
+ - GET /lookup?q=...&f=email&entities=contact \u2014 Look up a record by attribute
477
477
  - GET /selector/owners \u2014 Available owners (sales reps)
478
478
  - GET /selector/deal_pipelines \u2014 Deal pipelines
479
479
  - GET /selector/deal_stages \u2014 Deal stages
@@ -544,8 +544,8 @@ var freshsalesConnector = new ConnectorPlugin({
544
544
  description: "Connect to Freshsales / Freshworks CRM for contact, account, and deal data via API key.",
545
545
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/4UDOrFPM6wOFekbMVljjgl/4acc6060c3a1ff703980e6f4e76a3cd4/629b6c6f7c5cd817694c321f.png",
546
546
  parameters,
547
- releaseFlag: { dev1: true, dev2: false, prod: false },
548
- categories: ["productivity"],
547
+ releaseFlag: { dev1: true, dev2: true, prod: true },
548
+ categories: ["crm"],
549
549
  onboarding: freshsalesOnboarding,
550
550
  systemPrompt: {
551
551
  en: `### Tools
@@ -592,26 +592,26 @@ export default async function handler(c: Context) {
592
592
  #### Resource Endpoints
593
593
 
594
594
  **Contacts**
595
- - GET \`/contacts/view\` \u2014 List saved views
595
+ - GET \`/contacts/filters\` \u2014 List saved views (a.k.a. filters)
596
596
  - GET \`/contacts/view/{view_id}\` \u2014 Contacts in a view (paginated)
597
597
  - GET \`/contacts/{id}\` \u2014 Get a contact (use \`?include=owner,creator,deals,sales_accounts\`)
598
598
  - POST \`/contacts\` \u2014 Create a contact (body: \`{ "contact": { ... } }\`)
599
599
  - PUT \`/contacts/{id}\` \u2014 Update a contact
600
600
 
601
601
  **Sales accounts (companies)**
602
- - GET \`/sales_accounts/view\` \u2014 List saved views
602
+ - GET \`/sales_accounts/filters\` \u2014 List saved views
603
603
  - GET \`/sales_accounts/view/{view_id}\` \u2014 Accounts in a view
604
604
  - GET \`/sales_accounts/{id}\` \u2014 Get an account
605
605
  - POST \`/sales_accounts\` / PUT \`/sales_accounts/{id}\` \u2014 Write
606
606
 
607
607
  **Deals**
608
- - GET \`/deals/view\` \u2014 List saved views
608
+ - GET \`/deals/filters\` \u2014 List saved views
609
609
  - GET \`/deals/view/{view_id}\` \u2014 Deals in a view
610
610
  - GET \`/deals/{id}\` \u2014 Get a deal (use \`?include=owner,deal_stage,sales_account,contacts\`)
611
611
  - POST \`/deals\` / PUT \`/deals/{id}\` \u2014 Write
612
612
 
613
613
  **Leads (Sales Cloud only)**
614
- - GET \`/leads/view\` \u2014 Saved views
614
+ - GET \`/leads/filters\` \u2014 Saved views
615
615
  - GET \`/leads/view/{view_id}\` \u2014 Leads in a view
616
616
  - GET \`/leads/{id}\` \u2014 Get a lead
617
617
 
@@ -622,7 +622,7 @@ export default async function handler(c: Context) {
622
622
  - POST \`/notes\` \u2014 Create a note (body references a target contact/account/deal)
623
623
 
624
624
  **Search & lookup**
625
- - POST \`/lookup\` \u2014 Lookup a record by attribute. Query params: \`q\` (value), \`f\` (field \u2014 typically \`email\`/\`mobile_number\`), \`entities\` (\`contact\`/\`sales_account\`/\`deal\`/\`lead\`).
625
+ - GET \`/lookup\` \u2014 Lookup a record by attribute. Query params: \`q\` (value), \`f\` (field \u2014 typically \`email\`/\`mobile_number\`), \`entities\` (\`contact\`/\`sales_account\`/\`deal\`/\`lead\`).
626
626
 
627
627
  **Selector metadata**
628
628
  - GET \`/selector/owners\` \u2014 Sales reps available as owners
@@ -675,26 +675,26 @@ export default async function handler(c: Context) {
675
675
  #### \u30EA\u30BD\u30FC\u30B9\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
676
676
 
677
677
  **\u9023\u7D61\u5148\uFF08Contacts\uFF09**
678
- - GET \`/contacts/view\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
678
+ - GET \`/contacts/filters\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7\uFF08filters\uFF09
679
679
  - GET \`/contacts/view/{view_id}\` \u2014 \u30D3\u30E5\u30FC\u5185\u306E\u9023\u7D61\u5148\u4E00\u89A7\uFF08\u30DA\u30FC\u30B8\u30F3\u30B0\uFF09
680
680
  - GET \`/contacts/{id}\` \u2014 \u9023\u7D61\u5148\u306E\u53D6\u5F97\uFF08\`?include=owner,creator,deals,sales_accounts\` \u3067\u95A2\u9023\u5C55\u958B\uFF09
681
681
  - POST \`/contacts\` \u2014 \u9023\u7D61\u5148\u306E\u4F5C\u6210\uFF08body: \`{ "contact": { ... } }\`\uFF09
682
682
  - PUT \`/contacts/{id}\` \u2014 \u9023\u7D61\u5148\u306E\u66F4\u65B0
683
683
 
684
684
  **\u53D6\u5F15\u5148\uFF08Sales accounts / \u4F1A\u793E\uFF09**
685
- - GET \`/sales_accounts/view\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
685
+ - GET \`/sales_accounts/filters\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
686
686
  - GET \`/sales_accounts/view/{view_id}\` \u2014 \u30D3\u30E5\u30FC\u5185\u306E\u53D6\u5F15\u5148
687
687
  - GET \`/sales_accounts/{id}\` \u2014 \u53D6\u5F15\u5148\u306E\u53D6\u5F97
688
688
  - POST \`/sales_accounts\` / PUT \`/sales_accounts/{id}\` \u2014 \u4F5C\u6210\u30FB\u66F4\u65B0
689
689
 
690
690
  **\u5546\u8AC7\uFF08Deals\uFF09**
691
- - GET \`/deals/view\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
691
+ - GET \`/deals/filters\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
692
692
  - GET \`/deals/view/{view_id}\` \u2014 \u30D3\u30E5\u30FC\u5185\u306E\u5546\u8AC7
693
693
  - GET \`/deals/{id}\` \u2014 \u5546\u8AC7\u306E\u53D6\u5F97\uFF08\`?include=owner,deal_stage,sales_account,contacts\` \u3067\u95A2\u9023\u5C55\u958B\uFF09
694
694
  - POST \`/deals\` / PUT \`/deals/{id}\` \u2014 \u4F5C\u6210\u30FB\u66F4\u65B0
695
695
 
696
696
  **\u30EA\u30FC\u30C9\uFF08Leads \u2014 Sales Cloud \u306E\u307F\uFF09**
697
- - GET \`/leads/view\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
697
+ - GET \`/leads/filters\` \u2014 \u4FDD\u5B58\u30D3\u30E5\u30FC\u4E00\u89A7
698
698
  - GET \`/leads/view/{view_id}\` \u2014 \u30D3\u30E5\u30FC\u5185\u306E\u30EA\u30FC\u30C9
699
699
  - GET \`/leads/{id}\` \u2014 \u30EA\u30FC\u30C9\u306E\u53D6\u5F97
700
700
 
@@ -705,7 +705,7 @@ export default async function handler(c: Context) {
705
705
  - POST \`/notes\` \u2014 \u30CE\u30FC\u30C8\u306E\u4F5C\u6210\uFF08body \u3067\u9023\u7D61\u5148/\u53D6\u5F15\u5148/\u5546\u8AC7\u3092\u53C2\u7167\uFF09
706
706
 
707
707
  **\u691C\u7D22 & \u30EB\u30C3\u30AF\u30A2\u30C3\u30D7**
708
- - POST \`/lookup\` \u2014 \u5C5E\u6027\u306B\u3088\u308B\u30EC\u30B3\u30FC\u30C9\u691C\u7D22\u3002\u30AF\u30A8\u30EA: \`q\`\uFF08\u5024\uFF09\u3001\`f\`\uFF08\u30D5\u30A3\u30FC\u30EB\u30C9 \u2014 \u901A\u5E38 \`email\`/\`mobile_number\`\uFF09\u3001\`entities\`\uFF08\`contact\`/\`sales_account\`/\`deal\`/\`lead\`\uFF09\u3002
708
+ - GET \`/lookup\` \u2014 \u5C5E\u6027\u306B\u3088\u308B\u30EC\u30B3\u30FC\u30C9\u691C\u7D22\u3002\u30AF\u30A8\u30EA: \`q\`\uFF08\u5024\uFF09\u3001\`f\`\uFF08\u30D5\u30A3\u30FC\u30EB\u30C9 \u2014 \u901A\u5E38 \`email\`/\`mobile_number\`\uFF09\u3001\`entities\`\uFF08\`contact\`/\`sales_account\`/\`deal\`/\`lead\`\uFF09\u3002
709
709
 
710
710
  **\u30BB\u30EC\u30AF\u30BF\u30FC\u30E1\u30BF\u60C5\u5831**
711
711
  - GET \`/selector/owners\` \u2014 \u30AA\u30FC\u30CA\u30FC\uFF08\u55B6\u696D\u62C5\u5F53\uFF09\u4E00\u89A7
@@ -501,7 +501,7 @@ var freshserviceConnector = new ConnectorPlugin({
501
501
  description: "Connect to Freshservice (ITSM) for ticket, agent, asset, and ITIL workflow data via API key.",
502
502
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/6Tj64HZOoIrGgQYDayBosY/3f45b29d3479726b5d245ac38d5a7036/freshservice-icon.svg",
503
503
  parameters,
504
- releaseFlag: { dev1: true, dev2: false, prod: false },
504
+ releaseFlag: { dev1: true, dev2: true, prod: true },
505
505
  categories: ["productivity"],
506
506
  onboarding: freshserviceOnboarding,
507
507
  systemPrompt: {
@@ -592,7 +592,7 @@ var githubConnector = new ConnectorPlugin({
592
592
  description: "Connect to GitHub for repository, issue, pull request, commit, and search data via Personal Access Token (Classic or fine-grained).",
593
593
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2flOAufkhDrLKuOQqEVS3/1f9dcf145680ef77aef149709263e2d4/github-icon.svg",
594
594
  parameters,
595
- releaseFlag: { dev1: true, dev2: false, prod: false },
595
+ releaseFlag: { dev1: true, dev2: true, prod: true },
596
596
  categories: ["productivity"],
597
597
  onboarding: githubOnboarding,
598
598
  systemPrompt: {
@@ -85,13 +85,32 @@ function createClient(params, fetchFn = fetch) {
85
85
  const data = await response.json();
86
86
  return data.siteEntry ?? [];
87
87
  },
88
- async querySearchAnalytics(request, siteUrl) {
89
- const url = resolveSiteUrl(siteUrl);
88
+ async querySearchAnalytics(arg1, arg2) {
89
+ let siteUrlOverride;
90
+ let body;
91
+ if (typeof arg2 === "string") {
92
+ siteUrlOverride = arg2;
93
+ body = arg1;
94
+ } else {
95
+ const {
96
+ siteUrl: siteUrlField,
97
+ requestBody,
98
+ ...rest
99
+ } = arg1 ?? {};
100
+ siteUrlOverride = siteUrlField;
101
+ body = requestBody ?? rest;
102
+ }
103
+ if (!body || !body.startDate || !body.endDate) {
104
+ throw new Error(
105
+ "google-search-console-oauth: querySearchAnalytics requires startDate and endDate. Pass them either as `{ startDate, endDate, ... }` or wrapped in `{ requestBody: { startDate, endDate, ... } }`."
106
+ );
107
+ }
108
+ const url = resolveSiteUrl(siteUrlOverride);
90
109
  const path2 = `/sites/${encodeURIComponent(url)}/searchAnalytics/query`;
91
110
  const response = await this.request(path2, {
92
111
  method: "POST",
93
112
  headers: { "Content-Type": "application/json" },
94
- body: JSON.stringify(request)
113
+ body: JSON.stringify(body)
95
114
  });
96
115
  if (!response.ok) {
97
116
  const text = await response.text();
@@ -574,7 +593,7 @@ var googleSearchConsoleOauthConnector = new ConnectorPlugin({
574
593
  description: "Connect to Google Search Console for search performance, indexing, and sitemap data using OAuth.",
575
594
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/3rPusKosno7i1emOCmskTp/9ed092a4dc95efb74e34e83098ef3905/google-search-console-icon.webp",
576
595
  parameters,
577
- releaseFlag: { dev1: true, dev2: false, prod: false },
596
+ releaseFlag: { dev1: true, dev2: true, prod: true },
578
597
  categories: ["marketing"],
579
598
  onboarding: googleSearchConsoleOauthOnboarding,
580
599
  proxyPolicy: {
@@ -637,7 +656,7 @@ The business logic type for this connector is "typescript". Write handler code u
637
656
  SDK surface (client created via \`connection(connectionId)\`):
638
657
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch (\`path\` is appended to \`https://searchconsole.googleapis.com/webmasters/v3\`; \`{siteUrl}\` placeholders are auto-replaced and URL-encoded).
639
658
  - \`client.listSites()\` \u2014 list sites accessible by the OAuth user.
640
- - \`client.querySearchAnalytics(request, siteUrl?)\` \u2014 query Search Analytics performance data.
659
+ - \`client.querySearchAnalytics(args)\` \u2014 query Search Analytics performance data. Pass a single object: \`{ startDate, endDate, dimensions?, rowLimit?, ... }\`. \`siteUrl\` may be set on the same object to override the connection default. The googleapis-style envelope \`{ siteUrl?, requestBody: { startDate, endDate, ... } }\` is also accepted. \`startDate\` and \`endDate\` (\`YYYY-MM-DD\`) are required.
641
660
  - \`client.listSitemaps(siteUrl?)\` \u2014 list sitemaps submitted for a site.
642
661
 
643
662
  If a handler test fails with \`Connection proxy is not configured\`, retry \u2014 the sandbox is still initializing. Do NOT abandon the SDK and construct OAuth proxy URLs manually.
@@ -653,7 +672,7 @@ const gsc = connection("<connectionId>");
653
672
  const sites = await gsc.listSites();
654
673
  console.log(sites.map(s => \`\${s.siteUrl} (\${s.permissionLevel})\`));
655
674
 
656
- // Top queries for the last 28 days
675
+ // Top queries for the last 28 days \u2014 flat shape (recommended)
657
676
  const { rows } = await gsc.querySearchAnalytics({
658
677
  startDate: "2024-01-01",
659
678
  endDate: "2024-01-28",
@@ -662,6 +681,12 @@ const { rows } = await gsc.querySearchAnalytics({
662
681
  });
663
682
  rows?.forEach(r => console.log(r.keys?.[0], r.clicks, r.impressions));
664
683
 
684
+ // Override the configured site (also accepts requestBody envelope)
685
+ await gsc.querySearchAnalytics({
686
+ siteUrl: "sc-domain:example.com",
687
+ requestBody: { startDate: "2024-01-01", endDate: "2024-01-28", dimensions: ["page"] },
688
+ });
689
+
665
690
  // List sitemaps
666
691
  const sitemaps = await gsc.listSitemaps();
667
692
  sitemaps.forEach(s => console.log(s.path, s.lastSubmitted));
@@ -717,7 +742,7 @@ sitemaps.forEach(s => console.log(s.path, s.lastSubmitted));
717
742
  SDK\uFF08\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\uFF09:
718
743
  - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304D fetch\uFF08\`path\` \u306F \`https://searchconsole.googleapis.com/webmasters/v3\` \u306B\u8FFD\u52A0\u3055\u308C\u3001\`{siteUrl}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306F\u81EA\u52D5\u7684\u306BURL\u30A8\u30F3\u30B3\u30FC\u30C9\u3055\u308C\u7F6E\u63DB\u3055\u308C\u307E\u3059\uFF09\u3002
719
744
  - \`client.listSites()\` \u2014 OAuth \u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30B5\u30A4\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3002
720
- - \`client.querySearchAnalytics(request, siteUrl?)\` \u2014 \u691C\u7D22\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3002
745
+ - \`client.querySearchAnalytics(args)\` \u2014 \u691C\u7D22\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3002\u5F15\u6570\u306F\u5358\u4E00\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067 \`{ startDate, endDate, dimensions?, rowLimit?, ... }\` \u3092\u6E21\u3057\u307E\u3059\u3002\`siteUrl\` \u3092\u540C\u3058\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B\u542B\u3081\u308B\u3068\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u4E0A\u66F8\u304D\u3067\u304D\u307E\u3059\u3002googleapis \u5F62\u5F0F\u306E \`{ siteUrl?, requestBody: { startDate, endDate, ... } }\` \u3082\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002\`startDate\` \u3068 \`endDate\`\uFF08\`YYYY-MM-DD\` \u5F62\u5F0F\uFF09\u306F\u5FC5\u9808\u3067\u3059\u3002
721
746
  - \`client.listSitemaps(siteUrl?)\` \u2014 \u30B5\u30A4\u30C8\u306B\u63D0\u51FA\u6E08\u307F\u306E\u30B5\u30A4\u30C8\u30DE\u30C3\u30D7\u4E00\u89A7\u3092\u53D6\u5F97\u3002
722
747
 
723
748
  \u30CF\u30F3\u30C9\u30E9\u306E\u30C6\u30B9\u30C8\u304C \`Connection proxy is not configured\` \u3067\u5931\u6557\u3059\u308B\u5834\u5408\u306F\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u901A\u5E38\u306F\u30B5\u30F3\u30C9\u30DC\u30C3\u30AF\u30B9\u306E\u521D\u671F\u5316\u4E2D\u306B\u8D77\u304D\u307E\u3059\u3002SDK \u3092\u8AE6\u3081\u3066 OAuth \u30D7\u30ED\u30AD\u30B7\u306E URL \u3092\u81EA\u5206\u3067\u7D44\u307F\u7ACB\u3066\u308B\u3053\u3068\u306F **\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044**\u3002
@@ -733,7 +758,7 @@ const gsc = connection("<connectionId>");
733
758
  const sites = await gsc.listSites();
734
759
  console.log(sites.map(s => \`\${s.siteUrl} (\${s.permissionLevel})\`));
735
760
 
736
- // Top queries for the last 28 days
761
+ // Top queries for the last 28 days \u2014 \u30D5\u30E9\u30C3\u30C8\u5F62\u5F0F\uFF08\u63A8\u5968\uFF09
737
762
  const { rows } = await gsc.querySearchAnalytics({
738
763
  startDate: "2024-01-01",
739
764
  endDate: "2024-01-28",
@@ -742,6 +767,12 @@ const { rows } = await gsc.querySearchAnalytics({
742
767
  });
743
768
  rows?.forEach(r => console.log(r.keys?.[0], r.clicks, r.impressions));
744
769
 
770
+ // siteUrl \u3092\u4E0A\u66F8\u304D\u3059\u308B\u5834\u5408\uFF08requestBody \u30A8\u30F3\u30D9\u30ED\u30FC\u30D7\u3082\u53EF\uFF09
771
+ await gsc.querySearchAnalytics({
772
+ siteUrl: "sc-domain:example.com",
773
+ requestBody: { startDate: "2024-01-01", endDate: "2024-01-28", dimensions: ["page"] },
774
+ });
775
+
745
776
  // List sitemaps
746
777
  const sitemaps = await gsc.listSitemaps();
747
778
  sitemaps.forEach(s => console.log(s.path, s.lastSubmitted));