Skip to content

Commit d0aed14

Browse files
authored
feat(integrations): wave-4 tool-depth (Slack/Asana/Jira/Google Docs/Trello/Monday) + context.dev validation (#5289)
* fix(context_dev): validation pass — add search numResults/country, accuracy fixes Comprehensive /validate-integration of all 22 context.dev tools against the live API docs found the integration clean (no correctness bugs). Applied the actionable items: - search: expose numResults (10-100) + country inputs (API supported them; users were silently capped at 10 results) - accuracy: scrape_html type description (+doc/docx), map meta description (+sitemapsSkipped), brand links description (+contact) - robustness: trim string query values in appendParam * feat(integrations): wave-4 tool-depth — Slack, Asana, Jira, Google Docs, Trello, Monday Deepen six existing blocks with 38 new tools, no new OAuth scopes (all under already-granted scopes), additive/backwards-compatible: - Slack (7): schedule/list/delete scheduled messages; archive/rename/set-topic/set-purpose conversation - Asana (8): create/get project, list workspaces, create subtask, delete task, add followers, create/list sections (via internal routes + contracts) - Jira (5): list/get project, get transitions, list issue types, get fields - Google Docs (6): delete content range, named ranges, paragraph bullets, update paragraph style (documents.batchUpdate) - Trello (7): create board/list, get board/card, add checklist/label/member - Monday (5): change column value, create board/column, get groups, duplicate item Route baseline 873->881 for the 8 new Asana internal routes. * fix(integrations): wave-4 validation pass — fix alignment enum, GraphQL input-object, scope/UI gaps Comprehensive /validate-integration of all 6 modified integrations (existing + new tools) vs live API docs. Fixes: - google_docs: CRITICAL alignment enum LEFT/RIGHT/JUSTIFY -> API enum START/END/JUSTIFIED (mapped); namedStyleType 'unchanged' option; 'zero-based' index wording - monday: CRITICAL search_items columns now emits GraphQL input-object with unquoted keys (was always failing the non-cursor branch) - slack: schedule_message DMs via user-id-as-channel; add channels:manage/groups:write/reactions:read scope descriptions; nextCursor optional - jira: list_projects expand=lead so lead outputs populate (was always null) - trello: get_actions limit now applies to the card path too - asana: add missing 'completed' + 'projects' subBlocks (were unsettable in UI); request permalink_url via opt_fields on create routes * fix(integrations): clamp context.dev search bounds; precise Google Docs index wording - context_dev/search: clamp numResults to the documented 10-100 range; normalize country to trimmed uppercase - google_docs: replace ambiguous '1-based'/'zero-based' index wording with the concrete fact (the document body starts at index 1), matching buildInsertLocation (index<1 appends) and buildContentRange * fix(integrations): validate context.dev country (ISO-2); regenerate google_docs docs - context_dev/search: reject non-2-letter country values with a clear error instead of forwarding them - docs: regenerate google_docs.mdx so the public index-contract wording matches the updated tool descriptions (body starts at index 1) * fix(asana): omit completed unless explicitly set (don't send false on unchecked) The new completion checkbox mapped an unchecked/untouched state to completed:false, which made update_task silently un-complete tasks and search_tasks filter to incomplete. Now only sends completed when the box is checked (undefined otherwise). * fix(slack): expose Destination toggle for schedule_message so DM scheduling is reachable The mapper already routes schedule_message DMs (user-id-as-channel); add schedule_message to the destinationType condition so users can deliberately choose Channel vs DM instead of it only triggering via leftover state.
1 parent ca0a7ff commit d0aed14

93 files changed

Lines changed: 8971 additions & 67 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/docs/content/docs/en/integrations/asana.mdx

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,187 @@ Add a comment (story) to an Asana task
209209
|`gid` | string | Author GID |
210210
|`name` | string | Author name |
211211

212+
### `asana_create_subtask`
213+
214+
Create a subtask under an existing Asana task
215+
216+
#### Input
217+
218+
| Parameter | Type | Required | Description |
219+
| --------- | ---- | -------- | ----------- |
220+
| `taskGid` | string | Yes | GID of the parent Asana task \(numeric string\) |
221+
| `name` | string | Yes | Name of the subtask |
222+
| `notes` | string | No | Notes or description for the subtask |
223+
| `assignee` | string | No | User GID to assign the subtask to |
224+
| `due_on` | string | No | Due date in YYYY-MM-DD format |
225+
226+
#### Output
227+
228+
| Parameter | Type | Description |
229+
| --------- | ---- | ----------- |
230+
| `success` | boolean | Operation success status |
231+
| `ts` | string | Timestamp of the response |
232+
| `gid` | string | Subtask globally unique identifier |
233+
| `name` | string | Subtask name |
234+
| `notes` | string | Subtask notes or description |
235+
| `completed` | boolean | Whether the subtask is completed |
236+
| `created_at` | string | Subtask creation timestamp |
237+
| `permalink_url` | string | URL to the subtask in Asana |
238+
239+
### `asana_delete_task`
240+
241+
Delete an Asana task by its GID (moves it to the trash)
242+
243+
#### Input
244+
245+
| Parameter | Type | Required | Description |
246+
| --------- | ---- | -------- | ----------- |
247+
| `taskGid` | string | Yes | GID of the Asana task to delete \(numeric string\) |
248+
249+
#### Output
250+
251+
| Parameter | Type | Description |
252+
| --------- | ---- | ----------- |
253+
| `success` | boolean | Operation success status |
254+
| `ts` | string | Timestamp of the response |
255+
| `gid` | string | GID of the deleted task |
256+
| `deleted` | boolean | Whether the task was deleted |
257+
258+
### `asana_add_followers`
259+
260+
Add one or more followers to an Asana task
261+
262+
#### Input
263+
264+
| Parameter | Type | Required | Description |
265+
| --------- | ---- | -------- | ----------- |
266+
| `taskGid` | string | Yes | GID of the Asana task \(numeric string\) |
267+
| `followers` | array | Yes | Array of user GIDs to add as followers to the task |
268+
269+
#### Output
270+
271+
| Parameter | Type | Description |
272+
| --------- | ---- | ----------- |
273+
| `success` | boolean | Operation success status |
274+
| `ts` | string | Timestamp of the response |
275+
| `gid` | string | Task globally unique identifier |
276+
| `name` | string | Task name |
277+
| `followers` | array | Current followers on the task after the update |
278+
|`gid` | string | Follower GID |
279+
|`name` | string | Follower name |
280+
281+
### `asana_create_project`
282+
283+
Create a new project in an Asana workspace
284+
285+
#### Input
286+
287+
| Parameter | Type | Required | Description |
288+
| --------- | ---- | -------- | ----------- |
289+
| `workspace` | string | Yes | Asana workspace GID \(numeric string\) where the project will be created |
290+
| `name` | string | Yes | Name of the project |
291+
| `notes` | string | No | Notes or description for the project |
292+
293+
#### Output
294+
295+
| Parameter | Type | Description |
296+
| --------- | ---- | ----------- |
297+
| `success` | boolean | Operation success status |
298+
| `ts` | string | Timestamp of the response |
299+
| `gid` | string | Project globally unique identifier |
300+
| `name` | string | Project name |
301+
| `notes` | string | Project notes or description |
302+
| `archived` | boolean | Whether the project is archived |
303+
| `color` | string | Project color |
304+
| `created_at` | string | Project creation timestamp |
305+
| `modified_at` | string | Project last modified timestamp |
306+
| `permalink_url` | string | URL to the project in Asana |
307+
308+
### `asana_get_project`
309+
310+
Retrieve a single Asana project by its GID
311+
312+
#### Input
313+
314+
| Parameter | Type | Required | Description |
315+
| --------- | ---- | -------- | ----------- |
316+
| `projectGid` | string | Yes | Asana project GID \(numeric string\) to retrieve |
317+
318+
#### Output
319+
320+
| Parameter | Type | Description |
321+
| --------- | ---- | ----------- |
322+
| `success` | boolean | Operation success status |
323+
| `ts` | string | Timestamp of the response |
324+
| `gid` | string | Project globally unique identifier |
325+
| `name` | string | Project name |
326+
| `notes` | string | Project notes or description |
327+
| `archived` | boolean | Whether the project is archived |
328+
| `color` | string | Project color |
329+
| `created_at` | string | Project creation timestamp |
330+
| `modified_at` | string | Project last modified timestamp |
331+
| `permalink_url` | string | URL to the project in Asana |
332+
333+
### `asana_list_workspaces`
334+
335+
List all Asana workspaces and organizations the authenticated user belongs to
336+
337+
#### Input
338+
339+
| Parameter | Type | Required | Description |
340+
| --------- | ---- | -------- | ----------- |
341+
342+
#### Output
343+
344+
| Parameter | Type | Description |
345+
| --------- | ---- | ----------- |
346+
| `success` | boolean | Operation success status |
347+
| `ts` | string | Timestamp of the response |
348+
| `workspaces` | array | Array of workspaces |
349+
|`gid` | string | Workspace GID |
350+
|`name` | string | Workspace name |
351+
|`resource_type` | string | Resource type \(workspace\) |
352+
353+
### `asana_create_section`
354+
355+
Create a new section in an Asana project
356+
357+
#### Input
358+
359+
| Parameter | Type | Required | Description |
360+
| --------- | ---- | -------- | ----------- |
361+
| `projectGid` | string | Yes | GID of the Asana project \(numeric string\) to add the section to |
362+
| `name` | string | Yes | Name of the section |
363+
364+
#### Output
365+
366+
| Parameter | Type | Description |
367+
| --------- | ---- | ----------- |
368+
| `success` | boolean | Operation success status |
369+
| `ts` | string | Timestamp of the response |
370+
| `gid` | string | Section globally unique identifier |
371+
| `name` | string | Section name |
372+
| `created_at` | string | Section creation timestamp |
373+
374+
### `asana_list_sections`
375+
376+
List all sections in an Asana project
377+
378+
#### Input
379+
380+
| Parameter | Type | Required | Description |
381+
| --------- | ---- | -------- | ----------- |
382+
| `projectGid` | string | Yes | GID of the Asana project \(numeric string\) to list sections from |
383+
384+
#### Output
385+
386+
| Parameter | Type | Description |
387+
| --------- | ---- | ----------- |
388+
| `success` | boolean | Operation success status |
389+
| `ts` | string | Timestamp of the response |
390+
| `sections` | array | Array of sections in the project |
391+
|`gid` | string | Section GID |
392+
|`name` | string | Section name |
393+
|`resource_type` | string | Resource type \(section\) |
394+
212395

apps/docs/content/docs/en/integrations/context_dev.mdx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Scrape any URL and return the raw HTML content of the page.
6565
| --------- | ---- | ----------- |
6666
| `html` | string | Raw HTML content of the page |
6767
| `url` | string | The scraped URL |
68-
| `type` | string | Detected content type \(html, xml, json, text, csv, markdown, svg, pdf\) |
68+
| `type` | string | Detected content type \(html, xml, json, text, csv, markdown, svg, pdf, doc, docx\) |
6969

7070
### `context_dev_scrape_images`
7171

@@ -177,7 +177,7 @@ Build a sitemap of a domain and return every discovered page URL.
177177
| --------- | ---- | ----------- |
178178
| `domain` | string | The domain that was mapped |
179179
| `urls` | array | All page URLs discovered from the sitemap |
180-
| `meta` | object | Sitemap discovery stats \(sitemapsDiscovered, sitemapsFetched, errors\) |
180+
| `meta` | object | Sitemap discovery stats \(sitemapsDiscovered, sitemapsFetched, sitemapsSkipped, errors\) |
181181

182182
### `context_dev_search`
183183

@@ -191,6 +191,8 @@ Search the web with natural language and optionally scrape results to markdown.
191191
| `includeDomains` | array | No | Only return results from these domains |
192192
| `excludeDomains` | array | No | Exclude results from these domains |
193193
| `freshness` | string | No | Recency filter \(last_24_hours, last_week, last_month, last_year\) |
194+
| `numResults` | number | No | Number of results to return \(10-100, default 10\) |
195+
| `country` | string | No | Restrict results to a country \(ISO 3166-1 alpha-2 code, e.g. US\) |
194196
| `queryFanout` | boolean | No | Expand the query into parallel variants for broader coverage |
195197
| `markdownEnabled` | boolean | No | Scrape each result page to markdown \(default: false\) |
196198
| `timeoutMS` | number | No | Request timeout in milliseconds \(1000-300000\) |
@@ -449,7 +451,7 @@ Retrieve brand data for a domain: logos, colors, backdrops, socials, address, an
449451
|`email` | string | Brand contact email |
450452
|`phone` | string | Brand contact phone |
451453
|`industries` | json | Industry taxonomy \(eic industry/subindustry pairs\) |
452-
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing\) |
454+
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing, contact\) |
453455
|`primary_language` | string | Primary language of the brand site |
454456

455457
### `context_dev_get_brand_by_name`
@@ -488,7 +490,7 @@ Retrieve brand data by company name: logos, colors, socials, address, and indust
488490
|`email` | string | Brand contact email |
489491
|`phone` | string | Brand contact phone |
490492
|`industries` | json | Industry taxonomy \(eic industry/subindustry pairs\) |
491-
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing\) |
493+
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing, contact\) |
492494
|`primary_language` | string | Primary language of the brand site |
493495

494496
### `context_dev_get_brand_by_email`
@@ -526,7 +528,7 @@ Retrieve brand data from a work email address. Free/disposable emails are reject
526528
|`email` | string | Brand contact email |
527529
|`phone` | string | Brand contact phone |
528530
|`industries` | json | Industry taxonomy \(eic industry/subindustry pairs\) |
529-
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing\) |
531+
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing, contact\) |
530532
|`primary_language` | string | Primary language of the brand site |
531533

532534
### `context_dev_get_brand_by_ticker`
@@ -565,7 +567,7 @@ Retrieve brand data for a public company by its stock ticker symbol.
565567
|`email` | string | Brand contact email |
566568
|`phone` | string | Brand contact phone |
567569
|`industries` | json | Industry taxonomy \(eic industry/subindustry pairs\) |
568-
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing\) |
570+
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing, contact\) |
569571
|`primary_language` | string | Primary language of the brand site |
570572

571573
### `context_dev_get_brand_simplified`
@@ -632,7 +634,7 @@ Identify the brand behind a raw bank/card transaction descriptor and return its
632634
|`email` | string | Brand contact email |
633635
|`phone` | string | Brand contact phone |
634636
|`industries` | json | Industry taxonomy \(eic industry/subindustry pairs\) |
635-
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing\) |
637+
|`links` | json | Key brand links \(careers, privacy, terms, blog, pricing, contact\) |
636638
|`primary_language` | string | Primary language of the brand site |
637639

638640
### `context_dev_prefetch_domain`

0 commit comments

Comments
 (0)