@commandable/integration-data 0.4.0 → 0.4.1

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.
Files changed (665) hide show
  1. package/dist/credentials-index.d.ts +7 -2
  2. package/dist/credentials-index.d.ts.map +1 -1
  3. package/dist/credentials-index.js +677 -11
  4. package/dist/credentials-index.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/loader.d.ts +119 -1
  10. package/dist/loader.d.ts.map +1 -1
  11. package/dist/loader.js +178 -63
  12. package/dist/loader.js.map +1 -1
  13. package/dist/tools.d.ts +1 -1
  14. package/dist/tools.d.ts.map +1 -1
  15. package/integrations/README.md +52 -0
  16. package/integrations/__tests__/liveHarness.ts +97 -0
  17. package/integrations/__tests__/usageParity.ts +54 -0
  18. package/integrations/airtable/.env.test.example +11 -0
  19. package/integrations/airtable/README.md +27 -0
  20. package/integrations/airtable/__tests__/get_handlers.test.ts +187 -0
  21. package/integrations/airtable/__tests__/usage_parity.test.ts +9 -0
  22. package/integrations/airtable/__tests__/write_and_admin_handlers.test.ts +116 -0
  23. package/integrations/airtable/credentials.json +26 -0
  24. package/integrations/airtable/credentials_hint.md +4 -0
  25. package/integrations/airtable/handlers/create_record.js +12 -0
  26. package/integrations/airtable/handlers/delete_record.js +7 -0
  27. package/integrations/airtable/handlers/get_record.js +4 -0
  28. package/integrations/airtable/handlers/get_table_schema.js +6 -0
  29. package/integrations/airtable/handlers/list_bases.js +4 -0
  30. package/integrations/airtable/handlers/list_records.js +25 -0
  31. package/integrations/airtable/handlers/list_table_fields.js +6 -0
  32. package/integrations/airtable/handlers/list_tables.js +4 -0
  33. package/integrations/airtable/handlers/list_views.js +6 -0
  34. package/integrations/airtable/handlers/search_records.js +6 -0
  35. package/integrations/airtable/handlers/update_record.js +11 -0
  36. package/integrations/airtable/manifest.json +84 -0
  37. package/integrations/airtable/schemas/create_record.json +12 -0
  38. package/integrations/airtable/schemas/delete_record.json +11 -0
  39. package/integrations/airtable/schemas/empty.json +6 -0
  40. package/integrations/airtable/schemas/get_record.json +11 -0
  41. package/integrations/airtable/schemas/id_base.json +9 -0
  42. package/integrations/airtable/schemas/id_base_table.json +10 -0
  43. package/integrations/airtable/schemas/list_records.json +26 -0
  44. package/integrations/airtable/schemas/search_records.json +12 -0
  45. package/integrations/airtable/schemas/update_record.json +13 -0
  46. package/integrations/confluence/.env.test.example +36 -0
  47. package/integrations/confluence/README.md +28 -0
  48. package/integrations/confluence/__tests__/get_handlers.test.ts +121 -0
  49. package/integrations/confluence/__tests__/usage_parity.test.ts +14 -0
  50. package/integrations/confluence/__tests__/write_handlers.test.ts +131 -0
  51. package/integrations/confluence/credentials.json +39 -0
  52. package/integrations/confluence/credentials_hint.md +4 -0
  53. package/integrations/confluence/credentials_hint_api_token.md +9 -0
  54. package/integrations/confluence/credentials_hint_oauth_token.md +8 -0
  55. package/integrations/confluence/handlers/add_comment.js +19 -0
  56. package/integrations/confluence/handlers/add_label.js +16 -0
  57. package/integrations/confluence/handlers/create_page.js +22 -0
  58. package/integrations/confluence/handlers/delete_page.js +17 -0
  59. package/integrations/confluence/handlers/get_comments.js +33 -0
  60. package/integrations/confluence/handlers/get_page_children.js +30 -0
  61. package/integrations/confluence/handlers/get_space.js +22 -0
  62. package/integrations/confluence/handlers/list_spaces.js +39 -0
  63. package/integrations/confluence/handlers/read_page.js +49 -0
  64. package/integrations/confluence/handlers/search_pages.js +42 -0
  65. package/integrations/confluence/handlers/update_page.js +42 -0
  66. package/integrations/confluence/manifest.json +85 -0
  67. package/integrations/confluence/prompt.md +55 -0
  68. package/integrations/confluence/schemas/add_comment.json +22 -0
  69. package/integrations/confluence/schemas/add_label.json +19 -0
  70. package/integrations/confluence/schemas/create_page.json +33 -0
  71. package/integrations/confluence/schemas/delete_page.json +23 -0
  72. package/integrations/confluence/schemas/empty.json +6 -0
  73. package/integrations/confluence/schemas/get_comments.json +24 -0
  74. package/integrations/confluence/schemas/get_page_children.json +28 -0
  75. package/integrations/confluence/schemas/get_space.json +18 -0
  76. package/integrations/confluence/schemas/list_spaces.json +36 -0
  77. package/integrations/confluence/schemas/read_page.json +28 -0
  78. package/integrations/confluence/schemas/search_pages.json +26 -0
  79. package/integrations/confluence/schemas/update_page.json +31 -0
  80. package/integrations/github/.env.test.example +17 -0
  81. package/integrations/github/README.md +75 -0
  82. package/integrations/github/__tests__/get_handlers.test.ts +305 -0
  83. package/integrations/github/__tests__/usage_parity.test.ts +22 -0
  84. package/integrations/github/__tests__/write_handlers.test.ts +496 -0
  85. package/integrations/github/credentials.json +47 -0
  86. package/integrations/github/credentials_hint.md +7 -0
  87. package/integrations/github/credentials_hint_classic_pat.md +8 -0
  88. package/integrations/github/credentials_hint_fine_grained_pat.md +9 -0
  89. package/integrations/github/handlers/add_labels_to_issue.js +12 -0
  90. package/integrations/github/handlers/close_issue.js +5 -0
  91. package/integrations/github/handlers/comment_on_issue.js +5 -0
  92. package/integrations/github/handlers/create_branch.js +33 -0
  93. package/integrations/github/handlers/create_commit.js +84 -0
  94. package/integrations/github/handlers/create_file.js +46 -0
  95. package/integrations/github/handlers/create_issue.js +10 -0
  96. package/integrations/github/handlers/create_or_update_file.js +21 -0
  97. package/integrations/github/handlers/create_pull_request.js +16 -0
  98. package/integrations/github/handlers/create_pull_request_review.js +10 -0
  99. package/integrations/github/handlers/create_release.js +14 -0
  100. package/integrations/github/handlers/create_repo.js +11 -0
  101. package/integrations/github/handlers/delete_branch.js +8 -0
  102. package/integrations/github/handlers/delete_file.js +22 -0
  103. package/integrations/github/handlers/delete_repo.js +6 -0
  104. package/integrations/github/handlers/edit_file.js +52 -0
  105. package/integrations/github/handlers/edit_files.js +107 -0
  106. package/integrations/github/handlers/fork_repo.js +10 -0
  107. package/integrations/github/handlers/get_commit.js +8 -0
  108. package/integrations/github/handlers/get_file_contents.js +21 -0
  109. package/integrations/github/handlers/get_issue.js +4 -0
  110. package/integrations/github/handlers/get_job_logs.js +6 -0
  111. package/integrations/github/handlers/get_latest_release.js +4 -0
  112. package/integrations/github/handlers/get_me.js +4 -0
  113. package/integrations/github/handlers/get_pull_request.js +4 -0
  114. package/integrations/github/handlers/get_pull_request_diff.js +8 -0
  115. package/integrations/github/handlers/get_repo.js +4 -0
  116. package/integrations/github/handlers/get_repo_tree.js +12 -0
  117. package/integrations/github/handlers/get_workflow_run.js +4 -0
  118. package/integrations/github/handlers/list_branches.js +9 -0
  119. package/integrations/github/handlers/list_commits.js +11 -0
  120. package/integrations/github/handlers/list_issue_comments.js +8 -0
  121. package/integrations/github/handlers/list_issues.js +11 -0
  122. package/integrations/github/handlers/list_labels.js +8 -0
  123. package/integrations/github/handlers/list_pull_request_comments.js +8 -0
  124. package/integrations/github/handlers/list_pull_request_files.js +8 -0
  125. package/integrations/github/handlers/list_pull_requests.js +13 -0
  126. package/integrations/github/handlers/list_releases.js +8 -0
  127. package/integrations/github/handlers/list_repos_install.js +4 -0
  128. package/integrations/github/handlers/list_repos_user.js +16 -0
  129. package/integrations/github/handlers/list_tags.js +8 -0
  130. package/integrations/github/handlers/list_workflow_runs.js +11 -0
  131. package/integrations/github/handlers/merge_pull_request.js +14 -0
  132. package/integrations/github/handlers/request_pull_request_reviewers.js +10 -0
  133. package/integrations/github/handlers/search_code.js +8 -0
  134. package/integrations/github/handlers/search_issues.js +8 -0
  135. package/integrations/github/handlers/search_pull_requests.js +8 -0
  136. package/integrations/github/handlers/search_repos.js +10 -0
  137. package/integrations/github/handlers/update_issue.js +15 -0
  138. package/integrations/github/handlers/update_pull_request.js +13 -0
  139. package/integrations/github/manifest.json +92 -0
  140. package/integrations/github/prompt.md +36 -0
  141. package/integrations/github/schemas/add_labels_to_issue.json +12 -0
  142. package/integrations/github/schemas/close_issue.json +10 -0
  143. package/integrations/github/schemas/comment_on_issue.json +11 -0
  144. package/integrations/github/schemas/create_branch.json +12 -0
  145. package/integrations/github/schemas/create_commit.json +25 -0
  146. package/integrations/github/schemas/create_file.json +13 -0
  147. package/integrations/github/schemas/create_issue.json +13 -0
  148. package/integrations/github/schemas/create_or_update_file.json +15 -0
  149. package/integrations/github/schemas/create_pull_request.json +15 -0
  150. package/integrations/github/schemas/create_pull_request_review.json +17 -0
  151. package/integrations/github/schemas/create_release.json +16 -0
  152. package/integrations/github/schemas/create_repo.json +12 -0
  153. package/integrations/github/schemas/delete_branch.json +10 -0
  154. package/integrations/github/schemas/delete_file.json +13 -0
  155. package/integrations/github/schemas/delete_repo.json +10 -0
  156. package/integrations/github/schemas/edit_file.json +26 -0
  157. package/integrations/github/schemas/edit_files.json +39 -0
  158. package/integrations/github/schemas/empty.json +5 -0
  159. package/integrations/github/schemas/fork_repo.json +11 -0
  160. package/integrations/github/schemas/get_commit.json +12 -0
  161. package/integrations/github/schemas/get_file_contents.json +11 -0
  162. package/integrations/github/schemas/get_issue.json +10 -0
  163. package/integrations/github/schemas/get_job_logs.json +10 -0
  164. package/integrations/github/schemas/get_pull_request.json +10 -0
  165. package/integrations/github/schemas/get_pull_request_diff.json +10 -0
  166. package/integrations/github/schemas/get_repo.json +9 -0
  167. package/integrations/github/schemas/get_repo_tree.json +12 -0
  168. package/integrations/github/schemas/get_workflow_run.json +10 -0
  169. package/integrations/github/schemas/list_branches.json +12 -0
  170. package/integrations/github/schemas/list_commits.json +14 -0
  171. package/integrations/github/schemas/list_issue_comments.json +12 -0
  172. package/integrations/github/schemas/list_issues.json +14 -0
  173. package/integrations/github/schemas/list_labels.json +11 -0
  174. package/integrations/github/schemas/list_pull_request_comments.json +12 -0
  175. package/integrations/github/schemas/list_pull_request_files.json +12 -0
  176. package/integrations/github/schemas/list_pull_requests.json +16 -0
  177. package/integrations/github/schemas/list_releases.json +11 -0
  178. package/integrations/github/schemas/list_tags.json +11 -0
  179. package/integrations/github/schemas/list_workflow_runs.json +18 -0
  180. package/integrations/github/schemas/merge_pull_request.json +14 -0
  181. package/integrations/github/schemas/owner_repo.json +9 -0
  182. package/integrations/github/schemas/request_pull_request_reviewers.json +20 -0
  183. package/integrations/github/schemas/search_code.json +10 -0
  184. package/integrations/github/schemas/search_issues.json +10 -0
  185. package/integrations/github/schemas/search_pull_requests.json +10 -0
  186. package/integrations/github/schemas/search_repos.json +12 -0
  187. package/integrations/github/schemas/update_issue.json +15 -0
  188. package/integrations/github/schemas/update_pull_request.json +15 -0
  189. package/integrations/google-calendar/.env.test.example +11 -0
  190. package/integrations/google-calendar/README.md +41 -0
  191. package/integrations/google-calendar/__tests__/get_handlers.test.ts +120 -0
  192. package/integrations/google-calendar/__tests__/usage_parity.test.ts +9 -0
  193. package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +155 -0
  194. package/integrations/google-calendar/credentials.json +59 -0
  195. package/integrations/google-calendar/credentials_hint.md +9 -0
  196. package/integrations/google-calendar/credentials_hint_oauth_token.md +8 -0
  197. package/integrations/google-calendar/credentials_hint_service_account.md +10 -0
  198. package/integrations/google-calendar/handlers/create_event.js +6 -0
  199. package/integrations/google-calendar/handlers/delete_acl.js +6 -0
  200. package/integrations/google-calendar/handlers/delete_event.js +7 -0
  201. package/integrations/google-calendar/handlers/freebusy_query.js +4 -0
  202. package/integrations/google-calendar/handlers/get_acl.js +5 -0
  203. package/integrations/google-calendar/handlers/get_calendar.js +4 -0
  204. package/integrations/google-calendar/handlers/get_event.js +9 -0
  205. package/integrations/google-calendar/handlers/insert_acl.js +6 -0
  206. package/integrations/google-calendar/handlers/list_acl.js +5 -0
  207. package/integrations/google-calendar/handlers/list_calendars.js +4 -0
  208. package/integrations/google-calendar/handlers/list_colors.js +4 -0
  209. package/integrations/google-calendar/handlers/list_events.js +23 -0
  210. package/integrations/google-calendar/handlers/list_settings.js +4 -0
  211. package/integrations/google-calendar/handlers/move_event.js +6 -0
  212. package/integrations/google-calendar/handlers/patch_event.js +5 -0
  213. package/integrations/google-calendar/handlers/quick_add.js +6 -0
  214. package/integrations/google-calendar/handlers/update_acl.js +7 -0
  215. package/integrations/google-calendar/manifest.json +36 -0
  216. package/integrations/google-calendar/prompt.md +68 -0
  217. package/integrations/google-calendar/schemas/create_event.json +34 -0
  218. package/integrations/google-calendar/schemas/delete_acl.json +9 -0
  219. package/integrations/google-calendar/schemas/empty.json +1 -0
  220. package/integrations/google-calendar/schemas/freebusy_query.json +13 -0
  221. package/integrations/google-calendar/schemas/get_acl.json +9 -0
  222. package/integrations/google-calendar/schemas/id_calendar.json +8 -0
  223. package/integrations/google-calendar/schemas/id_calendar_event.json +11 -0
  224. package/integrations/google-calendar/schemas/insert_acl.json +18 -0
  225. package/integrations/google-calendar/schemas/list_events.json +17 -0
  226. package/integrations/google-calendar/schemas/move_event.json +10 -0
  227. package/integrations/google-calendar/schemas/patch_event.json +10 -0
  228. package/integrations/google-calendar/schemas/quick_add.json +9 -0
  229. package/integrations/google-calendar/schemas/update_acl.json +10 -0
  230. package/integrations/google-docs/README.md +30 -0
  231. package/integrations/google-docs/__tests__/get_handlers.test.ts +83 -0
  232. package/integrations/google-docs/__tests__/usage_parity.test.ts +9 -0
  233. package/integrations/google-docs/__tests__/write_handlers.test.ts +238 -0
  234. package/integrations/google-docs/credentials.json +57 -0
  235. package/integrations/google-docs/credentials_hint.md +9 -0
  236. package/integrations/google-docs/credentials_hint_oauth_token.md +8 -0
  237. package/integrations/google-docs/credentials_hint_service_account.md +10 -0
  238. package/integrations/google-docs/handlers/append_text.js +12 -0
  239. package/integrations/google-docs/handlers/batch_update.js +13 -0
  240. package/integrations/google-docs/handlers/create_document.js +9 -0
  241. package/integrations/google-docs/handlers/delete_first_match.js +50 -0
  242. package/integrations/google-docs/handlers/insert_inline_image_after_first_match.js +41 -0
  243. package/integrations/google-docs/handlers/insert_page_break_after_first_match.js +49 -0
  244. package/integrations/google-docs/handlers/insert_table_after_first_match.js +49 -0
  245. package/integrations/google-docs/handlers/insert_text_after_first_match.js +51 -0
  246. package/integrations/google-docs/handlers/read_document.js +189 -0
  247. package/integrations/google-docs/handlers/replace_all_text.js +8 -0
  248. package/integrations/google-docs/handlers/style_first_match.js +42 -0
  249. package/integrations/google-docs/handlers/update_document_style.js +8 -0
  250. package/integrations/google-docs/handlers/update_paragraph_style_for_first_match.js +48 -0
  251. package/integrations/google-docs/manifest.json +44 -0
  252. package/integrations/google-docs/prompt.md +49 -0
  253. package/integrations/google-docs/schemas/append_text.json +10 -0
  254. package/integrations/google-docs/schemas/apply_text_style.json +13 -0
  255. package/integrations/google-docs/schemas/batch_update.json +16 -0
  256. package/integrations/google-docs/schemas/create_document.json +8 -0
  257. package/integrations/google-docs/schemas/delete_content_range.json +11 -0
  258. package/integrations/google-docs/schemas/delete_first_match.json +10 -0
  259. package/integrations/google-docs/schemas/insert_inline_image.json +12 -0
  260. package/integrations/google-docs/schemas/insert_inline_image_after_first_match.json +12 -0
  261. package/integrations/google-docs/schemas/insert_page_break.json +10 -0
  262. package/integrations/google-docs/schemas/insert_page_break_after_first_match.json +11 -0
  263. package/integrations/google-docs/schemas/insert_table.json +12 -0
  264. package/integrations/google-docs/schemas/insert_table_after_first_match.json +13 -0
  265. package/integrations/google-docs/schemas/insert_text_after_first_match.json +12 -0
  266. package/integrations/google-docs/schemas/insert_text_at.json +11 -0
  267. package/integrations/google-docs/schemas/read_document.json +12 -0
  268. package/integrations/google-docs/schemas/replace_all_text.json +12 -0
  269. package/integrations/google-docs/schemas/style_first_match.json +12 -0
  270. package/integrations/google-docs/schemas/update_document_style.json +11 -0
  271. package/integrations/google-docs/schemas/update_paragraph_style.json +13 -0
  272. package/integrations/google-docs/schemas/update_paragraph_style_for_first_match.json +12 -0
  273. package/integrations/google-docs/todo.md +18 -0
  274. package/integrations/google-drive/README.md +26 -0
  275. package/integrations/google-drive/__tests__/handlers.test.ts +145 -0
  276. package/integrations/google-drive/__tests__/usage_parity.test.ts +9 -0
  277. package/integrations/google-drive/credentials.json +59 -0
  278. package/integrations/google-drive/credentials_hint_oauth_token.md +8 -0
  279. package/integrations/google-drive/credentials_hint_service_account.md +10 -0
  280. package/integrations/google-drive/handlers/create_file.js +15 -0
  281. package/integrations/google-drive/handlers/create_folder.js +15 -0
  282. package/integrations/google-drive/handlers/delete_file.js +14 -0
  283. package/integrations/google-drive/handlers/get_file.js +5 -0
  284. package/integrations/google-drive/handlers/get_file_content.js +41 -0
  285. package/integrations/google-drive/handlers/list_files.js +15 -0
  286. package/integrations/google-drive/handlers/move_file.js +12 -0
  287. package/integrations/google-drive/handlers/search_files.js +20 -0
  288. package/integrations/google-drive/handlers/share_file.js +20 -0
  289. package/integrations/google-drive/manifest.json +70 -0
  290. package/integrations/google-drive/prompt.md +59 -0
  291. package/integrations/google-drive/schemas/create_file.json +12 -0
  292. package/integrations/google-drive/schemas/create_folder.json +11 -0
  293. package/integrations/google-drive/schemas/delete_file.json +10 -0
  294. package/integrations/google-drive/schemas/get_file.json +10 -0
  295. package/integrations/google-drive/schemas/get_file_content.json +11 -0
  296. package/integrations/google-drive/schemas/list_files.json +12 -0
  297. package/integrations/google-drive/schemas/move_file.json +12 -0
  298. package/integrations/google-drive/schemas/search_files.json +14 -0
  299. package/integrations/google-drive/schemas/share_file.json +23 -0
  300. package/integrations/google-gmail/.env.test.example +11 -0
  301. package/integrations/google-gmail/README.md +49 -0
  302. package/integrations/google-gmail/__tests__/get_handlers.test.ts +134 -0
  303. package/integrations/google-gmail/__tests__/usage_parity.test.ts +9 -0
  304. package/integrations/google-gmail/__tests__/write_and_admin_handlers.test.ts +211 -0
  305. package/integrations/google-gmail/credentials.json +59 -0
  306. package/integrations/google-gmail/credentials_hint_oauth_token.md +8 -0
  307. package/integrations/google-gmail/credentials_hint_service_account.md +10 -0
  308. package/integrations/google-gmail/handlers/create_draft_email.js +27 -0
  309. package/integrations/google-gmail/handlers/create_label.js +12 -0
  310. package/integrations/google-gmail/handlers/delete_draft.js +13 -0
  311. package/integrations/google-gmail/handlers/delete_label.js +13 -0
  312. package/integrations/google-gmail/handlers/delete_message.js +13 -0
  313. package/integrations/google-gmail/handlers/delete_thread.js +13 -0
  314. package/integrations/google-gmail/handlers/get_draft.js +6 -0
  315. package/integrations/google-gmail/handlers/get_label.js +6 -0
  316. package/integrations/google-gmail/handlers/get_message.js +14 -0
  317. package/integrations/google-gmail/handlers/get_profile.js +5 -0
  318. package/integrations/google-gmail/handlers/get_thread.js +14 -0
  319. package/integrations/google-gmail/handlers/list_drafts.js +15 -0
  320. package/integrations/google-gmail/handlers/list_labels.js +5 -0
  321. package/integrations/google-gmail/handlers/list_messages.js +19 -0
  322. package/integrations/google-gmail/handlers/list_threads.js +19 -0
  323. package/integrations/google-gmail/handlers/modify_message.js +11 -0
  324. package/integrations/google-gmail/handlers/modify_thread.js +11 -0
  325. package/integrations/google-gmail/handlers/read_email.js +56 -0
  326. package/integrations/google-gmail/handlers/send_draft.js +15 -0
  327. package/integrations/google-gmail/handlers/send_email.js +22 -0
  328. package/integrations/google-gmail/handlers/trash_message.js +6 -0
  329. package/integrations/google-gmail/handlers/trash_thread.js +6 -0
  330. package/integrations/google-gmail/handlers/untrash_message.js +6 -0
  331. package/integrations/google-gmail/handlers/untrash_thread.js +6 -0
  332. package/integrations/google-gmail/handlers/update_label.js +15 -0
  333. package/integrations/google-gmail/manifest.json +45 -0
  334. package/integrations/google-gmail/prompt.md +52 -0
  335. package/integrations/google-gmail/schemas/create_draft_email.json +16 -0
  336. package/integrations/google-gmail/schemas/create_label.json +26 -0
  337. package/integrations/google-gmail/schemas/get_message.json +20 -0
  338. package/integrations/google-gmail/schemas/get_profile.json +11 -0
  339. package/integrations/google-gmail/schemas/get_thread.json +20 -0
  340. package/integrations/google-gmail/schemas/id_draft.json +16 -0
  341. package/integrations/google-gmail/schemas/id_label.json +16 -0
  342. package/integrations/google-gmail/schemas/id_message.json +16 -0
  343. package/integrations/google-gmail/schemas/id_thread.json +16 -0
  344. package/integrations/google-gmail/schemas/list_drafts.json +30 -0
  345. package/integrations/google-gmail/schemas/list_labels.json +11 -0
  346. package/integrations/google-gmail/schemas/list_messages.json +35 -0
  347. package/integrations/google-gmail/schemas/list_threads.json +35 -0
  348. package/integrations/google-gmail/schemas/modify_message.json +24 -0
  349. package/integrations/google-gmail/schemas/modify_thread.json +24 -0
  350. package/integrations/google-gmail/schemas/read_email.json +10 -0
  351. package/integrations/google-gmail/schemas/send_draft.json +29 -0
  352. package/integrations/google-gmail/schemas/send_email.json +17 -0
  353. package/integrations/google-gmail/schemas/update_label.json +33 -0
  354. package/integrations/google-sheet/README.md +27 -0
  355. package/integrations/google-sheet/__tests__/get_handlers.test.ts +76 -0
  356. package/integrations/google-sheet/__tests__/usage_parity.test.ts +9 -0
  357. package/integrations/google-sheet/__tests__/write_handlers.test.ts +153 -0
  358. package/integrations/google-sheet/credentials.json +57 -0
  359. package/integrations/google-sheet/credentials_hint.md +9 -0
  360. package/integrations/google-sheet/credentials_hint_oauth_token.md +8 -0
  361. package/integrations/google-sheet/credentials_hint_service_account.md +10 -0
  362. package/integrations/google-sheet/handlers/append_values.js +18 -0
  363. package/integrations/google-sheet/handlers/batch_clear_values.js +6 -0
  364. package/integrations/google-sheet/handlers/batch_update.js +14 -0
  365. package/integrations/google-sheet/handlers/batch_update_values.js +16 -0
  366. package/integrations/google-sheet/handlers/clear_values.js +6 -0
  367. package/integrations/google-sheet/handlers/copy_to_spreadsheet.js +6 -0
  368. package/integrations/google-sheet/handlers/create_spreadsheet.js +5 -0
  369. package/integrations/google-sheet/handlers/get_spreadsheet.js +14 -0
  370. package/integrations/google-sheet/handlers/read_sheet.js +75 -0
  371. package/integrations/google-sheet/handlers/update_values.js +16 -0
  372. package/integrations/google-sheet/manifest.json +77 -0
  373. package/integrations/google-sheet/prompt.md +49 -0
  374. package/integrations/google-sheet/schemas/append_values.json +16 -0
  375. package/integrations/google-sheet/schemas/batch_clear_values.json +10 -0
  376. package/integrations/google-sheet/schemas/batch_update.json +13 -0
  377. package/integrations/google-sheet/schemas/batch_update_values.json +25 -0
  378. package/integrations/google-sheet/schemas/clear_values.json +10 -0
  379. package/integrations/google-sheet/schemas/copy_to_spreadsheet.json +11 -0
  380. package/integrations/google-sheet/schemas/create_spreadsheet.json +11 -0
  381. package/integrations/google-sheet/schemas/get_spreadsheet.json +16 -0
  382. package/integrations/google-sheet/schemas/read_sheet.json +21 -0
  383. package/integrations/google-sheet/schemas/update_values.json +15 -0
  384. package/integrations/google-slides/README.md +28 -0
  385. package/integrations/google-slides/__tests__/get_handlers.test.ts +74 -0
  386. package/integrations/google-slides/__tests__/usage_parity.test.ts +9 -0
  387. package/integrations/google-slides/__tests__/write_handlers.test.ts +131 -0
  388. package/integrations/google-slides/credentials.json +57 -0
  389. package/integrations/google-slides/credentials_hint.md +9 -0
  390. package/integrations/google-slides/credentials_hint_oauth_token.md +8 -0
  391. package/integrations/google-slides/credentials_hint_service_account.md +10 -0
  392. package/integrations/google-slides/handlers/append_text_to_title_of_first_slide.js +17 -0
  393. package/integrations/google-slides/handlers/batch_update.js +15 -0
  394. package/integrations/google-slides/handlers/create_presentation.js +8 -0
  395. package/integrations/google-slides/handlers/create_slide_after_first_match.js +20 -0
  396. package/integrations/google-slides/handlers/get_page_thumbnail.js +12 -0
  397. package/integrations/google-slides/handlers/insert_image_after_first_match.js +19 -0
  398. package/integrations/google-slides/handlers/insert_shape_after_first_match.js +21 -0
  399. package/integrations/google-slides/handlers/read_presentation.js +51 -0
  400. package/integrations/google-slides/handlers/replace_text_first_match.js +9 -0
  401. package/integrations/google-slides/handlers/set_background_color_for_slide_index.js +15 -0
  402. package/integrations/google-slides/handlers/style_text_first_match.js +48 -0
  403. package/integrations/google-slides/manifest.json +42 -0
  404. package/integrations/google-slides/prompt.md +56 -0
  405. package/integrations/google-slides/schemas/append_text_to_title_of_first_slide.json +11 -0
  406. package/integrations/google-slides/schemas/batch_update.json +13 -0
  407. package/integrations/google-slides/schemas/create_presentation.json +8 -0
  408. package/integrations/google-slides/schemas/create_slide_after_first_match.json +11 -0
  409. package/integrations/google-slides/schemas/get_page_thumbnail.json +12 -0
  410. package/integrations/google-slides/schemas/get_presentation.json +9 -0
  411. package/integrations/google-slides/schemas/insert_image_after_first_match.json +13 -0
  412. package/integrations/google-slides/schemas/insert_shape_after_first_match.json +13 -0
  413. package/integrations/google-slides/schemas/replace_text_first_match.json +12 -0
  414. package/integrations/google-slides/schemas/set_background_color_for_slide_index.json +11 -0
  415. package/integrations/google-slides/schemas/style_text_first_match.json +12 -0
  416. package/integrations/hubspot/.env.test.example +20 -0
  417. package/integrations/hubspot/README.md +48 -0
  418. package/integrations/hubspot/__tests__/get_handlers.test.ts +151 -0
  419. package/integrations/hubspot/__tests__/usage_parity.test.ts +10 -0
  420. package/integrations/hubspot/__tests__/write_handlers.test.ts +244 -0
  421. package/integrations/hubspot/credentials.json +50 -0
  422. package/integrations/hubspot/credentials_hint.md +20 -0
  423. package/integrations/hubspot/credentials_hint_oauth_token.md +16 -0
  424. package/integrations/hubspot/handlers/archive_company.js +13 -0
  425. package/integrations/hubspot/handlers/archive_contact.js +13 -0
  426. package/integrations/hubspot/handlers/archive_deal.js +13 -0
  427. package/integrations/hubspot/handlers/archive_ticket.js +13 -0
  428. package/integrations/hubspot/handlers/create_association.js +18 -0
  429. package/integrations/hubspot/handlers/create_company.js +13 -0
  430. package/integrations/hubspot/handlers/create_contact.js +14 -0
  431. package/integrations/hubspot/handlers/create_deal.js +16 -0
  432. package/integrations/hubspot/handlers/create_note.js +44 -0
  433. package/integrations/hubspot/handlers/create_task.js +48 -0
  434. package/integrations/hubspot/handlers/create_ticket.js +15 -0
  435. package/integrations/hubspot/handlers/get_associations.js +14 -0
  436. package/integrations/hubspot/handlers/get_company.js +18 -0
  437. package/integrations/hubspot/handlers/get_contact.js +18 -0
  438. package/integrations/hubspot/handlers/get_deal.js +18 -0
  439. package/integrations/hubspot/handlers/get_ticket.js +20 -0
  440. package/integrations/hubspot/handlers/list_owners.js +12 -0
  441. package/integrations/hubspot/handlers/list_pipelines.js +5 -0
  442. package/integrations/hubspot/handlers/list_properties.js +11 -0
  443. package/integrations/hubspot/handlers/remove_association.js +22 -0
  444. package/integrations/hubspot/handlers/search_companies.js +43 -0
  445. package/integrations/hubspot/handlers/search_contacts.js +43 -0
  446. package/integrations/hubspot/handlers/search_deals.js +43 -0
  447. package/integrations/hubspot/handlers/search_notes.js +43 -0
  448. package/integrations/hubspot/handlers/search_tasks.js +43 -0
  449. package/integrations/hubspot/handlers/search_tickets.js +43 -0
  450. package/integrations/hubspot/handlers/update_company.js +13 -0
  451. package/integrations/hubspot/handlers/update_contact.js +14 -0
  452. package/integrations/hubspot/handlers/update_deal.js +16 -0
  453. package/integrations/hubspot/handlers/update_task.js +17 -0
  454. package/integrations/hubspot/handlers/update_ticket.js +15 -0
  455. package/integrations/hubspot/manifest.json +231 -0
  456. package/integrations/hubspot/prompt.md +69 -0
  457. package/integrations/hubspot/schemas/archive_company.json +13 -0
  458. package/integrations/hubspot/schemas/archive_contact.json +13 -0
  459. package/integrations/hubspot/schemas/archive_deal.json +9 -0
  460. package/integrations/hubspot/schemas/archive_ticket.json +9 -0
  461. package/integrations/hubspot/schemas/create_association.json +24 -0
  462. package/integrations/hubspot/schemas/create_company.json +14 -0
  463. package/integrations/hubspot/schemas/create_contact.json +15 -0
  464. package/integrations/hubspot/schemas/create_deal.json +20 -0
  465. package/integrations/hubspot/schemas/create_note.json +37 -0
  466. package/integrations/hubspot/schemas/create_task.json +51 -0
  467. package/integrations/hubspot/schemas/create_ticket.json +16 -0
  468. package/integrations/hubspot/schemas/empty.json +6 -0
  469. package/integrations/hubspot/schemas/get_associations.json +30 -0
  470. package/integrations/hubspot/schemas/get_company.json +27 -0
  471. package/integrations/hubspot/schemas/get_contact.json +27 -0
  472. package/integrations/hubspot/schemas/get_deal.json +20 -0
  473. package/integrations/hubspot/schemas/get_ticket.json +20 -0
  474. package/integrations/hubspot/schemas/list_owners.json +25 -0
  475. package/integrations/hubspot/schemas/list_pipelines.json +13 -0
  476. package/integrations/hubspot/schemas/list_properties.json +17 -0
  477. package/integrations/hubspot/schemas/remove_association.json +24 -0
  478. package/integrations/hubspot/schemas/search_companies.json +56 -0
  479. package/integrations/hubspot/schemas/search_contacts.json +56 -0
  480. package/integrations/hubspot/schemas/search_deals.json +43 -0
  481. package/integrations/hubspot/schemas/search_notes.json +43 -0
  482. package/integrations/hubspot/schemas/search_tasks.json +43 -0
  483. package/integrations/hubspot/schemas/search_tickets.json +43 -0
  484. package/integrations/hubspot/schemas/update_company.json +20 -0
  485. package/integrations/hubspot/schemas/update_contact.json +21 -0
  486. package/integrations/hubspot/schemas/update_deal.json +19 -0
  487. package/integrations/hubspot/schemas/update_task.json +31 -0
  488. package/integrations/hubspot/schemas/update_ticket.json +18 -0
  489. package/integrations/jira/.env.test.example +41 -0
  490. package/integrations/jira/README.md +46 -0
  491. package/integrations/jira/__tests__/get_handlers.test.ts +193 -0
  492. package/integrations/jira/__tests__/usage_parity.test.ts +14 -0
  493. package/integrations/jira/__tests__/write_handlers.test.ts +157 -0
  494. package/integrations/jira/credentials.json +39 -0
  495. package/integrations/jira/credentials_hint.md +4 -0
  496. package/integrations/jira/credentials_hint_api_token.md +6 -0
  497. package/integrations/jira/credentials_hint_oauth_token.md +6 -0
  498. package/integrations/jira/handlers/add_comment.js +9 -0
  499. package/integrations/jira/handlers/assign_issue.js +11 -0
  500. package/integrations/jira/handlers/create_issue.js +37 -0
  501. package/integrations/jira/handlers/create_sprint.js +19 -0
  502. package/integrations/jira/handlers/delete_issue.js +10 -0
  503. package/integrations/jira/handlers/get_backlog_issues.js +13 -0
  504. package/integrations/jira/handlers/get_board.js +6 -0
  505. package/integrations/jira/handlers/get_issue.js +63 -0
  506. package/integrations/jira/handlers/get_issue_comments.js +31 -0
  507. package/integrations/jira/handlers/get_myself.js +14 -0
  508. package/integrations/jira/handlers/get_project.js +28 -0
  509. package/integrations/jira/handlers/get_sprint.js +5 -0
  510. package/integrations/jira/handlers/get_sprint_issues.js +13 -0
  511. package/integrations/jira/handlers/get_transitions.js +23 -0
  512. package/integrations/jira/handlers/list_boards.js +34 -0
  513. package/integrations/jira/handlers/list_projects.js +29 -0
  514. package/integrations/jira/handlers/list_sprints.js +29 -0
  515. package/integrations/jira/handlers/move_issues_to_sprint.js +11 -0
  516. package/integrations/jira/handlers/search_issues.js +43 -0
  517. package/integrations/jira/handlers/search_users.js +21 -0
  518. package/integrations/jira/handlers/transition_issue.js +44 -0
  519. package/integrations/jira/handlers/update_issue.js +40 -0
  520. package/integrations/jira/handlers/update_sprint.js +20 -0
  521. package/integrations/jira/manifest.json +204 -0
  522. package/integrations/jira/prompt.md +80 -0
  523. package/integrations/jira/schemas/add_comment.json +16 -0
  524. package/integrations/jira/schemas/assign_issue.json +16 -0
  525. package/integrations/jira/schemas/create_issue.json +49 -0
  526. package/integrations/jira/schemas/create_sprint.json +29 -0
  527. package/integrations/jira/schemas/delete_issue.json +12 -0
  528. package/integrations/jira/schemas/empty.json +6 -0
  529. package/integrations/jira/schemas/get_backlog_issues.json +33 -0
  530. package/integrations/jira/schemas/get_board.json +13 -0
  531. package/integrations/jira/schemas/get_issue.json +23 -0
  532. package/integrations/jira/schemas/get_issue_comments.json +23 -0
  533. package/integrations/jira/schemas/get_project.json +17 -0
  534. package/integrations/jira/schemas/get_sprint.json +13 -0
  535. package/integrations/jira/schemas/get_sprint_issues.json +33 -0
  536. package/integrations/jira/schemas/get_transitions.json +12 -0
  537. package/integrations/jira/schemas/list_boards.json +27 -0
  538. package/integrations/jira/schemas/list_projects.json +22 -0
  539. package/integrations/jira/schemas/list_sprints.json +29 -0
  540. package/integrations/jira/schemas/move_issues_to_sprint.json +19 -0
  541. package/integrations/jira/schemas/search_issues.json +28 -0
  542. package/integrations/jira/schemas/search_users.json +18 -0
  543. package/integrations/jira/schemas/transition_issue.json +38 -0
  544. package/integrations/jira/schemas/update_issue.json +47 -0
  545. package/integrations/jira/schemas/update_sprint.json +33 -0
  546. package/integrations/new_integration_prompt.md +216 -0
  547. package/integrations/notion/.env.test.example +13 -0
  548. package/integrations/notion/README.md +42 -0
  549. package/integrations/notion/__tests__/get_handlers.test.ts +156 -0
  550. package/integrations/notion/__tests__/usage_parity.test.ts +9 -0
  551. package/integrations/notion/__tests__/write_and_admin_handlers.test.ts +186 -0
  552. package/integrations/notion/credentials.json +27 -0
  553. package/integrations/notion/credentials_hint.md +5 -0
  554. package/integrations/notion/handlers/append_block_children.js +7 -0
  555. package/integrations/notion/handlers/create_comment.js +10 -0
  556. package/integrations/notion/handlers/create_database.js +11 -0
  557. package/integrations/notion/handlers/create_page.js +13 -0
  558. package/integrations/notion/handlers/delete_block.js +8 -0
  559. package/integrations/notion/handlers/get_me.js +4 -0
  560. package/integrations/notion/handlers/list_block_children.js +10 -0
  561. package/integrations/notion/handlers/list_comments.js +14 -0
  562. package/integrations/notion/handlers/list_users.js +10 -0
  563. package/integrations/notion/handlers/query_database.js +10 -0
  564. package/integrations/notion/handlers/retrieve_block.js +4 -0
  565. package/integrations/notion/handlers/retrieve_database.js +4 -0
  566. package/integrations/notion/handlers/retrieve_page.js +4 -0
  567. package/integrations/notion/handlers/retrieve_page_property_item.js +10 -0
  568. package/integrations/notion/handlers/retrieve_user.js +4 -0
  569. package/integrations/notion/handlers/search.js +11 -0
  570. package/integrations/notion/handlers/update_block.js +7 -0
  571. package/integrations/notion/handlers/update_database.js +10 -0
  572. package/integrations/notion/handlers/update_page_properties.js +10 -0
  573. package/integrations/notion/manifest.json +169 -0
  574. package/integrations/notion/prompt.md +26 -0
  575. package/integrations/notion/schemas/append_block_children.json +10 -0
  576. package/integrations/notion/schemas/create_comment.json +18 -0
  577. package/integrations/notion/schemas/create_database.json +18 -0
  578. package/integrations/notion/schemas/create_page.json +22 -0
  579. package/integrations/notion/schemas/delete_block.json +9 -0
  580. package/integrations/notion/schemas/empty.json +6 -0
  581. package/integrations/notion/schemas/id_block.json +9 -0
  582. package/integrations/notion/schemas/id_database.json +9 -0
  583. package/integrations/notion/schemas/id_page.json +9 -0
  584. package/integrations/notion/schemas/id_user.json +9 -0
  585. package/integrations/notion/schemas/list_block_children.json +11 -0
  586. package/integrations/notion/schemas/list_comments.json +15 -0
  587. package/integrations/notion/schemas/list_users.json +9 -0
  588. package/integrations/notion/schemas/query_database.json +13 -0
  589. package/integrations/notion/schemas/retrieve_page_property_item.json +12 -0
  590. package/integrations/notion/schemas/search.json +27 -0
  591. package/integrations/notion/schemas/update_block.json +10 -0
  592. package/integrations/notion/schemas/update_database.json +13 -0
  593. package/integrations/notion/schemas/update_page_properties.json +13 -0
  594. package/integrations/trello/.env.test.example +9 -0
  595. package/integrations/trello/README.md +50 -0
  596. package/integrations/trello/__tests__/get_handlers.test.ts +225 -0
  597. package/integrations/trello/__tests__/usage_parity.test.ts +9 -0
  598. package/integrations/trello/__tests__/write_and_admin_handlers.test.ts +171 -0
  599. package/integrations/trello/credentials.json +32 -0
  600. package/integrations/trello/credentials_hint.md +4 -0
  601. package/integrations/trello/handlers/add_checklist_to_card.js +5 -0
  602. package/integrations/trello/handlers/add_member_to_card.js +5 -0
  603. package/integrations/trello/handlers/archive_list.js +5 -0
  604. package/integrations/trello/handlers/close_board.js +6 -0
  605. package/integrations/trello/handlers/create_board.js +11 -0
  606. package/integrations/trello/handlers/create_card.js +13 -0
  607. package/integrations/trello/handlers/create_list.js +7 -0
  608. package/integrations/trello/handlers/delete_board.js +13 -0
  609. package/integrations/trello/handlers/delete_card.js +9 -0
  610. package/integrations/trello/handlers/get_board.js +4 -0
  611. package/integrations/trello/handlers/get_board_cards.js +4 -0
  612. package/integrations/trello/handlers/get_board_custom_fields.js +4 -0
  613. package/integrations/trello/handlers/get_board_labels.js +4 -0
  614. package/integrations/trello/handlers/get_board_lists.js +4 -0
  615. package/integrations/trello/handlers/get_board_members.js +4 -0
  616. package/integrations/trello/handlers/get_board_memberships.js +4 -0
  617. package/integrations/trello/handlers/get_card.js +4 -0
  618. package/integrations/trello/handlers/get_card_actions.js +4 -0
  619. package/integrations/trello/handlers/get_card_attachments.js +4 -0
  620. package/integrations/trello/handlers/get_card_checklists.js +4 -0
  621. package/integrations/trello/handlers/get_card_custom_field_items.js +4 -0
  622. package/integrations/trello/handlers/get_card_members.js +4 -0
  623. package/integrations/trello/handlers/get_list.js +4 -0
  624. package/integrations/trello/handlers/get_list_cards.js +4 -0
  625. package/integrations/trello/handlers/get_member.js +4 -0
  626. package/integrations/trello/handlers/get_member_boards.js +4 -0
  627. package/integrations/trello/handlers/get_member_organizations.js +4 -0
  628. package/integrations/trello/handlers/get_organization.js +4 -0
  629. package/integrations/trello/handlers/get_organization_boards.js +4 -0
  630. package/integrations/trello/handlers/move_card_to_list.js +5 -0
  631. package/integrations/trello/handlers/remove_member_from_card.js +9 -0
  632. package/integrations/trello/handlers/search.js +5 -0
  633. package/integrations/trello/handlers/update_card.js +19 -0
  634. package/integrations/trello/handlers/update_list.js +11 -0
  635. package/integrations/trello/manifest.json +245 -0
  636. package/integrations/trello/schemas/add_checklist_to_card.json +10 -0
  637. package/integrations/trello/schemas/add_member_to_card.json +10 -0
  638. package/integrations/trello/schemas/archive_list.json +9 -0
  639. package/integrations/trello/schemas/close_board.json +10 -0
  640. package/integrations/trello/schemas/create_board.json +12 -0
  641. package/integrations/trello/schemas/create_card.json +13 -0
  642. package/integrations/trello/schemas/create_list.json +11 -0
  643. package/integrations/trello/schemas/delete_board.json +10 -0
  644. package/integrations/trello/schemas/delete_card.json +9 -0
  645. package/integrations/trello/schemas/display_trello_cards.json +45 -0
  646. package/integrations/trello/schemas/empty.json +5 -0
  647. package/integrations/trello/schemas/get_member.json +5 -0
  648. package/integrations/trello/schemas/id_board.json +8 -0
  649. package/integrations/trello/schemas/id_card.json +8 -0
  650. package/integrations/trello/schemas/id_list.json +8 -0
  651. package/integrations/trello/schemas/id_org.json +8 -0
  652. package/integrations/trello/schemas/move_card_to_list.json +10 -0
  653. package/integrations/trello/schemas/remove_member_from_card.json +10 -0
  654. package/integrations/trello/schemas/search.json +8 -0
  655. package/integrations/trello/schemas/update_card.json +16 -0
  656. package/integrations/trello/schemas/update_list.json +12 -0
  657. package/package.json +4 -3
  658. package/dist/generated/registry.d.ts +0 -3
  659. package/dist/generated/registry.d.ts.map +0 -1
  660. package/dist/generated/registry.js +0 -11889
  661. package/dist/generated/registry.js.map +0 -1
  662. package/dist/types.d.ts +0 -88
  663. package/dist/types.d.ts.map +0 -1
  664. package/dist/types.js +0 -2
  665. package/dist/types.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ async (input) => {
2
+ const extractSlideText = (slide) => {
3
+ const lines = []
4
+ for (const element of slide?.pageElements || []) {
5
+ const textElements = element?.shape?.text?.textElements || []
6
+ let combined = ''
7
+ for (const t of textElements) {
8
+ combined += t?.textRun?.content || ''
9
+ }
10
+ const trimmed = combined
11
+ .split('\n')
12
+ .map((line) => line.trim())
13
+ .filter(Boolean)
14
+ lines.push(...trimmed)
15
+ }
16
+ return lines
17
+ }
18
+
19
+ const { presentationId } = input
20
+ const path = `/presentations/${encodeURIComponent(presentationId)}`
21
+ const res = await integration.fetch(path)
22
+ const presentation = await res.json()
23
+
24
+ const title = presentation?.title || 'Untitled presentation'
25
+ const deckId = presentation?.presentationId || presentationId
26
+ const slides = presentation?.slides || []
27
+
28
+ const lines = [
29
+ `Presentation: "${title}" (ID: ${deckId})`,
30
+ `URL: https://docs.google.com/presentation/d/${deckId}/edit`,
31
+ `Total Slides: ${slides.length}`,
32
+ '',
33
+ ]
34
+
35
+ for (let i = 0; i < slides.length; i += 1) {
36
+ const slide = slides[i]
37
+ const slideId = slide?.objectId || `slide_${i + 1}`
38
+ const elementCount = (slide?.pageElements || []).length
39
+ lines.push(`Slide ${i + 1}: ID ${slideId}, ${elementCount} element(s)`)
40
+
41
+ const textLines = extractSlideText(slide)
42
+ if (!textLines.length) {
43
+ lines.push(' > (No text content)')
44
+ } else {
45
+ for (const text of textLines) lines.push(` > ${text}`)
46
+ }
47
+ lines.push('')
48
+ }
49
+
50
+ return lines.join('\n').trim()
51
+ }
@@ -0,0 +1,9 @@
1
+ async (input) => {
2
+ const { presentationId, findText, replaceText, matchCase } = input
3
+ const res = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}:batchUpdate`, {
4
+ method: 'POST',
5
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: Boolean(matchCase) }, replaceText } }] },
6
+ })
7
+ const out = await res.json()
8
+ return out?.presentationId ? { ...out, applied: true } : { presentationId, applied: true, replies: out?.replies || [] }
9
+ }
@@ -0,0 +1,15 @@
1
+ async (input) => {
2
+ const { presentationId, slideIndex, rgbColor } = input
3
+ const presRes = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}`)
4
+ const pres = await presRes.json()
5
+ const slide = (pres?.slides || [])[slideIndex]
6
+ if (!slide?.objectId)
7
+ return { presentationId, applied: false, replies: [] }
8
+ const color = { color: { rgbColor } }
9
+ const res = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}:batchUpdate`, {
10
+ method: 'POST',
11
+ body: { requests: [{ updatePageProperties: { objectId: slide.objectId, pageProperties: { pageBackgroundFill: { solidFill: color } }, fields: 'pageBackgroundFill.solidFill.color' } }] },
12
+ })
13
+ const out = await res.json()
14
+ return out?.presentationId ? { ...out, applied: true } : { presentationId, applied: true, replies: out?.replies || [] }
15
+ }
@@ -0,0 +1,48 @@
1
+ async (input) => {
2
+ const { presentationId, findText, textStyle, fields } = input
3
+ // Replace first match with a marker to derive objectId/range
4
+ const marker = `__CMD_MARK_${Date.now()}__`
5
+ const rep = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}:batchUpdate`, {
6
+ method: 'POST',
7
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
8
+ })
9
+ await rep.json()
10
+ // Scan pages for marker and apply style to that range on the text element
11
+ const presRes = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}`)
12
+ const pres = await presRes.json()
13
+ let targetObjectId = null
14
+ let startIndex = -1
15
+ let endIndex = -1
16
+ for (const slide of (pres?.slides || [])) {
17
+ for (const el of (slide.pageElements || [])) {
18
+ const text = el.shape?.text
19
+ if (!text)
20
+ continue
21
+ for (const pe of (text.textElements || [])) {
22
+ const t = pe.textRun?.content
23
+ if (!t)
24
+ continue
25
+ const idx = t.indexOf(marker)
26
+ if (idx >= 0) {
27
+ targetObjectId = el.objectId
28
+ startIndex = (pe.startIndex || 0) + idx
29
+ endIndex = startIndex + marker.length
30
+ break
31
+ }
32
+ }
33
+ if (targetObjectId)
34
+ break
35
+ }
36
+ if (targetObjectId)
37
+ break
38
+ }
39
+ if (!targetObjectId)
40
+ return { presentationId, applied: false, replies: [] }
41
+ const requests = [
42
+ { updateTextStyle: { objectId: targetObjectId, style: textStyle, textRange: { type: 'FIXED_RANGE', startIndex, endIndex }, fields: fields || Object.keys(textStyle || {}).join(',') } },
43
+ { replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } },
44
+ ]
45
+ const res = await integration.fetch(`/presentations/${encodeURIComponent(presentationId)}:batchUpdate`, { method: 'POST', body: { requests } })
46
+ const out = await res.json()
47
+ return out?.presentationId ? { ...out, applied: true } : { presentationId, applied: true, replies: out?.replies || [] }
48
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "google-slides",
3
+ "version": "0.1.0",
4
+ "baseUrl": "https://slides.googleapis.com/v1",
5
+ "tools": [
6
+ {
7
+ "name": "read_presentation",
8
+ "description": "Read a Google Slides presentation and return a human-readable summary including the title, slide count, and text content extracted from each slide. Returns the text found in all shapes on each slide with slide IDs for reference. Use this to understand what is in a presentation before editing. For low-level modifications, use batch_update.",
9
+ "inputSchema": "schemas/get_presentation.json",
10
+ "handler": "handlers/read_presentation.js",
11
+ "scope": "read"
12
+ },
13
+ {
14
+ "name": "get_page_thumbnail",
15
+ "description": "Generate a thumbnail image URL for a specific slide (page) in a presentation. Requires the presentation ID and the slide's objectId (page ID from read_presentation). Returns a contentUrl for the thumbnail image. Useful for previewing slides.",
16
+ "inputSchema": "schemas/get_page_thumbnail.json",
17
+ "handler": "handlers/get_page_thumbnail.js",
18
+ "scope": "read"
19
+ },
20
+ {
21
+ "name": "create_presentation",
22
+ "description": "Create a new empty Google Slides presentation with an optional title. Returns the created presentation's metadata including its presentationId, which is needed for all subsequent operations.",
23
+ "inputSchema": "schemas/create_presentation.json",
24
+ "handler": "handlers/create_presentation.js",
25
+ "scope": "write"
26
+ },
27
+ {
28
+ "name": "batch_update",
29
+ "description": "Send a presentations.batchUpdate request for low-level slide modifications. Accepts an array of requests (createSlide, deleteObject, insertText, deleteText, createShape, createTable, replaceAllText, updateTextStyle, updateShapeProperties, etc.). For common text and styling operations, prefer the higher-level tools: replace_text_first_match, style_text_first_match, insert_shape_after_first_match, etc.",
30
+ "inputSchema": "schemas/batch_update.json",
31
+ "handler": "handlers/batch_update.js",
32
+ "scope": "write"
33
+ },
34
+ { "name": "append_text_to_title_of_slide_index", "description": "Append text to the title shape of a specific slide by its 0-based index (slideIndex=0 is the first slide, default). Fetches the presentation to find the title shape's objectId then inserts text at the end of its content.", "inputSchema": "schemas/append_text_to_title_of_first_slide.json", "handler": "handlers/append_text_to_title_of_first_slide.js", "scope": "write" },
35
+ { "name": "replace_text_first_match", "description": "Replace the first occurrence of text anywhere in the presentation with new text. Note: the Slides API replaceAllText always replaces all occurrences; this tool uses replaceAllText internally. For replacing only one instance, use style_text_first_match to locate and style the match, then follow up with batch_update. Returns the API response.", "inputSchema": "schemas/replace_text_first_match.json", "handler": "handlers/replace_text_first_match.js", "scope": "write" },
36
+ { "name": "style_text_first_match", "description": "Find the first occurrence of text in the presentation and apply a text style to it (bold, italic, fontSize, foregroundColor, etc.). Uses a marker pattern: replaces the text with a unique marker, finds the marker's objectId and range, applies the style, then restores the original text. Returns {applied: true/false}.", "inputSchema": "schemas/style_text_first_match.json", "handler": "handlers/style_text_first_match.js", "scope": "write" },
37
+ { "name": "insert_shape_after_first_match", "description": "Find the first slide containing a text match and insert a rectangle shape on that slide at the specified position. Positions use EMU units (1 inch = 914400 EMU). Returns {applied: true/false}.", "inputSchema": "schemas/insert_shape_after_first_match.json", "handler": "handlers/insert_shape_after_first_match.js", "scope": "write" },
38
+ { "name": "insert_image_after_first_match", "description": "Find the first slide containing a text match and insert an image on that slide from a URL. Position and size use EMU units (1 inch = 914400 EMU). Returns {applied: true/false}.", "inputSchema": "schemas/insert_image_after_first_match.json", "handler": "handlers/insert_image_after_first_match.js", "scope": "write" },
39
+ { "name": "create_slide_after_first_match", "description": "Find the first slide containing a text match and create a new blank slide immediately after it. Useful for inserting slides at a specific position in the deck. Returns {applied: true/false} and the new slide's objectId.", "inputSchema": "schemas/create_slide_after_first_match.json", "handler": "handlers/create_slide_after_first_match.js", "scope": "write" },
40
+ { "name": "set_background_color_for_slide_index", "description": "Set the background color for a specific slide by its 0-based index (slideIndex=0 is the first slide). Provide r, g, b values in 0.0-1.0 range (e.g. r=1.0, g=0.0, b=0.0 for red). Fetches the presentation first to resolve the slide's objectId from the index.", "inputSchema": "schemas/set_background_color_for_slide_index.json", "handler": "handlers/set_background_color_for_slide_index.js", "scope": "write" }
41
+ ]
42
+ }
@@ -0,0 +1,56 @@
1
+ ## Presentation and slide IDs
2
+
3
+ The presentationId appears in the Google Slides URL:
4
+ `https://docs.google.com/presentation/d/{presentationId}/edit`
5
+
6
+ Each slide has an `objectId` (a string like `p` or `g12345abcde`). Use `read_presentation` first to discover slide objectIds and extracted text content by slide.
7
+
8
+ ## Slide addressing
9
+
10
+ The higher-level tools use `slideIndex` (0-based integer):
11
+ - `slideIndex=0` — first slide
12
+ - `slideIndex=1` — second slide
13
+
14
+ The lower-level `batch_update` requires `objectId` strings. Use `read_presentation` output to map slide order and IDs before editing.
15
+ If you need raw structure details, call `batch_update` only for the operation you are performing.
16
+
17
+ ## First-match tools
18
+
19
+ The `*_first_match` tools search all slides for text content by JSON-stringifying each slide's content. They use the marker pattern (replace → find → act → restore), making 3 API calls per operation. They return `{applied: true/false}`.
20
+
21
+ ## EMU units
22
+
23
+ Positions and sizes in the `batch_update` API use EMU (English Metric Units):
24
+ - 1 inch = 914400 EMU
25
+ - 1 cm ≈ 360000 EMU
26
+ - Standard slide dimensions: 9144000 × 5143500 EMU (10 × 5.625 inches, 16:9)
27
+
28
+ ## Common batch_update operations
29
+
30
+ ```json
31
+ { "requests": [
32
+ { "createSlide": { "insertionIndex": 1, "slideLayoutReference": { "predefinedLayout": "BLANK" } } },
33
+ { "insertText": { "objectId": "shapeId", "text": "Hello World", "insertionIndex": 0 } },
34
+ { "updateTextStyle": {
35
+ "objectId": "shapeId",
36
+ "style": { "bold": true, "fontSize": { "magnitude": 24, "unit": "PT" } },
37
+ "fields": "bold,fontSize",
38
+ "textRange": { "type": "ALL" }
39
+ }},
40
+ { "replaceAllText": {
41
+ "containsText": { "text": "{{placeholder}}" },
42
+ "replaceText": "New value"
43
+ }}
44
+ ]}
45
+ ```
46
+
47
+ ## Predefined slide layouts
48
+
49
+ Use with `createSlide`: `BLANK`, `CAPTION_ONLY`, `TITLE`, `TITLE_AND_BODY`, `TITLE_AND_TWO_COLUMNS`, `TITLE_ONLY`, `SECTION_HEADER`, `SECTION_TITLE_AND_DESCRIPTION`, `ONE_COLUMN_TEXT`, `MAIN_POINT`, `BIG_NUMBER`
50
+
51
+ ## Colors
52
+
53
+ In `batch_update`, colors use RGB values in 0.0–1.0 range:
54
+ ```json
55
+ { "opaqueColor": { "rgbColor": { "red": 1.0, "green": 0.5, "blue": 0.0 } } }
56
+ ```
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "text": { "type": "string" },
7
+ "slideIndex": { "type": "number", "minimum": 0, "description": "Zero-based slide index to target (default 0)." }
8
+ },
9
+ "required": ["presentationId", "text"],
10
+ "additionalProperties": false
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["presentationId", "requests"],
5
+ "properties": {
6
+ "presentationId": { "type": "string", "description": "ID of the presentation." },
7
+ "requests": { "type": "array", "items": { "type": "object" }, "description": "Array of Slides API requests." },
8
+ "writeControl": { "type": "object", "description": "Optional write control object." },
9
+ "includePresentationInResponse": { "type": "boolean" },
10
+ "responsePageObjectIds": { "type": "array", "items": { "type": "string" } }
11
+ },
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "title": { "type": "string", "description": "Optional title for the new presentation." }
6
+ },
7
+ "additionalProperties": false
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "findText": { "type": "string" },
7
+ "layout": { "type": "string", "default": "BLANK" }
8
+ },
9
+ "required": ["presentationId", "findText"],
10
+ "additionalProperties": false
11
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["presentationId", "pageObjectId"],
5
+ "properties": {
6
+ "presentationId": { "type": "string", "description": "ID of the presentation." },
7
+ "pageObjectId": { "type": "string", "description": "Object ID of the page (slide)." },
8
+ "thumbnailProperties.thumbnailSize": { "type": "string", "enum": ["THUMBNAIL_SIZE_UNSPECIFIED", "LARGE", "MEDIUM", "SMALL"], "description": "Requested size hint for the thumbnail." },
9
+ "thumbnailProperties.mimeType": { "type": "string", "enum": ["PNG", "JPEG"], "description": "Requested image MIME type." }
10
+ },
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["presentationId"],
5
+ "properties": {
6
+ "presentationId": { "type": "string", "description": "ID of the presentation." }
7
+ },
8
+ "additionalProperties": false
9
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "findText": { "type": "string" },
7
+ "uri": { "type": "string" },
8
+ "width": { "type": "number", "default": 2000000 },
9
+ "height": { "type": "number", "default": 2000000 }
10
+ },
11
+ "required": ["presentationId", "findText", "uri"],
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "findText": { "type": "string" },
7
+ "shapeType": { "type": "string", "default": "RECTANGLE" },
8
+ "width": { "type": "number", "default": 2000000 },
9
+ "height": { "type": "number", "default": 1000000 }
10
+ },
11
+ "required": ["presentationId", "findText"],
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "findText": { "type": "string" },
7
+ "replaceText": { "type": "string" },
8
+ "matchCase": { "type": "boolean" }
9
+ },
10
+ "required": ["presentationId", "findText", "replaceText"],
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "slideIndex": { "type": "number", "minimum": 0 },
7
+ "rgbColor": { "type": "object", "properties": { "red": { "type": "number" }, "green": { "type": "number" }, "blue": { "type": "number" } }, "required": ["red", "green", "blue"] }
8
+ },
9
+ "required": ["presentationId", "slideIndex", "rgbColor"],
10
+ "additionalProperties": false
11
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "presentationId": { "type": "string" },
6
+ "findText": { "type": "string" },
7
+ "textStyle": { "type": "object" },
8
+ "fields": { "type": "string" }
9
+ },
10
+ "required": ["presentationId", "findText", "textStyle"],
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,20 @@
1
+ # HubSpot live integration tests
2
+ #
3
+ # HUBSPOT_TOKEN is a private app access token.
4
+ # Create one at: https://developers.hubspot.com/docs/api/private-apps
5
+ # Required scopes: crm.objects.contacts.read/write, crm.objects.companies.read/write,
6
+ # crm.objects.deals.read/write, tickets (read/write), notes (read/write)
7
+ HUBSPOT_TOKEN=
8
+ #
9
+ # Optional: seed IDs for read tests (the suite will discover them automatically if omitted)
10
+ HUBSPOT_TEST_CONTACT_ID=
11
+ HUBSPOT_TEST_COMPANY_ID=
12
+ HUBSPOT_TEST_DEAL_ID=
13
+ HUBSPOT_TEST_TICKET_ID=
14
+ #
15
+ # Optional: pipeline/stage IDs for write tests
16
+ # Find these in HubSpot: Settings → CRM → Deals/Tickets → Pipelines
17
+ HUBSPOT_TEST_DEAL_PIPELINE_ID=
18
+ HUBSPOT_TEST_DEAL_STAGE_ID=
19
+ HUBSPOT_TEST_TICKET_PIPELINE_ID=
20
+ HUBSPOT_TEST_TICKET_STAGE_ID=
@@ -0,0 +1,48 @@
1
+ # HubSpot
2
+
3
+ **31 tools**
4
+
5
+ ![HubSpot tests](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/theomccabe/771bd329f303087690c522afa1baa6f3/raw/test-hubspot.json)
6
+
7
+ ## Credential variants
8
+
9
+ | Variant | Label |
10
+ |---|---|
11
+ | `private_app_token` | Private App Token _(default)_ |
12
+ | `oauth_token` | OAuth Access Token |
13
+
14
+ ## Tools
15
+
16
+ | Tool | Scope | Description |
17
+ |---|---|---|
18
+ | `search_contacts` | read | Search for contacts. Use query for simple free-text search, and filters for precise prope… |
19
+ | `get_contact` | read | Get a contact by ID. Use properties to request specific fields, and associations to inclu… |
20
+ | `create_contact` | write | Create a contact. Provide common fields (firstname/lastname/email) and/or a properties ma… |
21
+ | `update_contact` | write | Update a contact by ID. Provide any fields to update as common fields and/or in the prope… |
22
+ | `archive_contact` | write | Archive (delete) a contact by ID. This moves the record to the recycle bin. |
23
+ | `search_companies` | read | Search for companies. Use query for free-text search and filters for property-based filte… |
24
+ | `get_company` | read | Get a company by ID. Use properties to request specific fields, and associations to inclu… |
25
+ | `create_company` | write | Create a company. Provide name/domain and/or a properties map for other HubSpot company p… |
26
+ | `update_company` | write | Update a company by ID. Provide any fields to update as common fields and/or in the prope… |
27
+ | `archive_company` | write | Archive (delete) a company by ID. This moves the record to the recycle bin. |
28
+ | `list_owners` | read | List CRM owners (users) available in the HubSpot account. Useful for assigning owners to … |
29
+ | `list_properties` | read | List properties for an object type (e.g. contacts, companies, deals, tickets). Use this t… |
30
+ | `list_pipelines` | read | List pipelines and stages for an object type (commonly deals or tickets). Use this to fin… |
31
+ | `get_associations` | read | Get associations from a CRM record to another object type. Returns the associated record … |
32
+ | `create_association` | write | Create a default (unlabeled) association between two CRM records. Example: associate a co… |
33
+ | `remove_association` | write | Remove an association between two CRM records. This uses HubSpot's association batch arch… |
34
+ | `search_deals` | read | Search for deals. Use query for free-text search and filters for property-based filtering… |
35
+ | `get_deal` | read | Get a deal by ID. Use properties to request specific fields, and associations to include … |
36
+ | `create_deal` | write | Create a deal. Provide dealname/amount/pipeline/dealstage and/or a properties map for oth… |
37
+ | `update_deal` | write | Update a deal by ID. Common updates include moving stages via dealstage. Fields not provi… |
38
+ | `archive_deal` | write | Archive (delete) a deal by ID. This moves the record to the recycle bin. |
39
+ | `search_tickets` | read | Search for tickets. Use query for free-text search and filters for property-based filteri… |
40
+ | `get_ticket` | read | Get a ticket by ID. Use properties to request specific fields, and associations to includ… |
41
+ | `create_ticket` | write | Create a ticket. Provide subject/content/pipeline/stage and/or a properties map for other… |
42
+ | `update_ticket` | write | Update a ticket by ID. Common updates include changing hs_pipeline_stage. Fields not prov… |
43
+ | `archive_ticket` | write | Archive (delete) a ticket by ID. This moves the record to the recycle bin. |
44
+ | `search_notes` | read | Search notes. Use query for free-text search and filters for precise property-based filte… |
45
+ | `create_note` | write | Create a note and (optionally) associate it to one or more CRM records (contacts, compani… |
46
+ | `search_tasks` | read | Search tasks. Use query for free-text search and filters for precise property-based filte… |
47
+ | `create_task` | write | Create a task and (optionally) associate it to one or more CRM records. Provide subject/b… |
48
+ | `update_task` | write | Update a task by ID. Common updates include setting hs_task_status to COMPLETED. |
@@ -0,0 +1,151 @@
1
+ import { beforeAll, describe, expect, it } from 'vitest'
2
+ import {
3
+ createCredentialStore,
4
+ createIntegrationNode,
5
+ createProxy,
6
+ createToolbox,
7
+ hasEnv,
8
+ } from '../../__tests__/liveHarness.js'
9
+
10
+ // LIVE HubSpot read tests using credentials
11
+ // Required env vars:
12
+ // - HUBSPOT_TOKEN
13
+ //
14
+ // Optional env vars:
15
+ // - HUBSPOT_TEST_CONTACT_ID
16
+ // - HUBSPOT_TEST_COMPANY_ID
17
+ // - HUBSPOT_TEST_DEAL_ID
18
+ // - HUBSPOT_TEST_TICKET_ID
19
+
20
+ const env = process.env as Record<string, string | undefined>
21
+ const suite = hasEnv('HUBSPOT_TOKEN') ? describe : describe.skip
22
+
23
+ suite('hubspot read handlers (live)', () => {
24
+ const ctx: {
25
+ contactId?: string
26
+ companyId?: string
27
+ dealId?: string
28
+ ticketId?: string
29
+ } = {}
30
+
31
+ let read: Record<string, (input: any) => Promise<any>>
32
+
33
+ beforeAll(async () => {
34
+ ctx.contactId = env.HUBSPOT_TEST_CONTACT_ID
35
+ ctx.companyId = env.HUBSPOT_TEST_COMPANY_ID
36
+ ctx.dealId = env.HUBSPOT_TEST_DEAL_ID
37
+ ctx.ticketId = env.HUBSPOT_TEST_TICKET_ID
38
+
39
+ const credentialStore = createCredentialStore(async () => ({ token: env.HUBSPOT_TOKEN || '' }))
40
+ const proxy = createProxy(credentialStore)
41
+ const node = createIntegrationNode('hubspot')
42
+ const toolbox = createToolbox('hubspot', proxy, node)
43
+
44
+ // IMPORTANT: These literal tool-name strings are intentionally present so usage-parity can verify coverage.
45
+ read = {
46
+ search_contacts: toolbox.read('search_contacts'),
47
+ get_contact: toolbox.read('get_contact'),
48
+ search_companies: toolbox.read('search_companies'),
49
+ get_company: toolbox.read('get_company'),
50
+ list_owners: toolbox.read('list_owners'),
51
+ list_properties: toolbox.read('list_properties'),
52
+ list_pipelines: toolbox.read('list_pipelines'),
53
+ get_associations: toolbox.read('get_associations'),
54
+ search_deals: toolbox.read('search_deals'),
55
+ get_deal: toolbox.read('get_deal'),
56
+ search_tickets: toolbox.read('search_tickets'),
57
+ get_ticket: toolbox.read('get_ticket'),
58
+ search_notes: toolbox.read('search_notes'),
59
+ search_tasks: toolbox.read('search_tasks'),
60
+ // read tools in the manifest are limited to those above; remaining tools are write-scoped
61
+ }
62
+
63
+ expect(read).toBeTruthy()
64
+ }, 60000)
65
+
66
+ it('search_contacts returns results (or empty)', async () => {
67
+ const result = await read.search_contacts({ limit: 1 })
68
+ expect(result).toBeTruthy()
69
+ }, 30000)
70
+
71
+ it('search_companies returns results (or empty)', async () => {
72
+ const result = await read.search_companies({ limit: 1 })
73
+ expect(result).toBeTruthy()
74
+ }, 30000)
75
+
76
+ it('list_owners returns owners', async () => {
77
+ const result = await read.list_owners({ limit: 1 })
78
+ expect(result).toBeTruthy()
79
+ }, 30000)
80
+
81
+ it('list_properties(contacts) returns properties', async () => {
82
+ const result = await read.list_properties({ objectType: 'contacts' })
83
+ expect(result).toBeTruthy()
84
+ }, 30000)
85
+
86
+ it('list_pipelines(deals) returns pipelines', async () => {
87
+ const result = await read.list_pipelines({ objectType: 'deals' })
88
+ expect(result).toBeTruthy()
89
+ }, 30000)
90
+
91
+ it('get_contact returns a contact when HUBSPOT_TEST_CONTACT_ID is set', async () => {
92
+ if (!ctx.contactId)
93
+ return expect(true).toBe(true)
94
+ const result = await read.get_contact({ id: ctx.contactId })
95
+ expect(result?.id).toBeTruthy()
96
+ }, 30000)
97
+
98
+ it('get_company returns a company when HUBSPOT_TEST_COMPANY_ID is set', async () => {
99
+ if (!ctx.companyId)
100
+ return expect(true).toBe(true)
101
+ const result = await read.get_company({ id: ctx.companyId })
102
+ expect(result?.id).toBeTruthy()
103
+ }, 30000)
104
+
105
+ it('get_deal returns a deal when HUBSPOT_TEST_DEAL_ID is set', async () => {
106
+ if (!ctx.dealId)
107
+ return expect(true).toBe(true)
108
+ const result = await read.get_deal({ id: ctx.dealId })
109
+ expect(result?.id).toBeTruthy()
110
+ }, 30000)
111
+
112
+ it('get_ticket returns a ticket when HUBSPOT_TEST_TICKET_ID is set', async () => {
113
+ if (!ctx.ticketId)
114
+ return expect(true).toBe(true)
115
+ const result = await read.get_ticket({ id: ctx.ticketId })
116
+ expect(result?.id).toBeTruthy()
117
+ }, 30000)
118
+
119
+ it('search_deals returns results (or empty)', async () => {
120
+ const result = await read.search_deals({ limit: 1 })
121
+ expect(result).toBeTruthy()
122
+ }, 30000)
123
+
124
+ it('search_tickets returns results (or empty)', async () => {
125
+ const result = await read.search_tickets({ limit: 1 })
126
+ expect(result).toBeTruthy()
127
+ }, 30000)
128
+
129
+ it('search_notes returns results (or empty)', async () => {
130
+ const result = await read.search_notes({ limit: 1 })
131
+ expect(result).toBeTruthy()
132
+ }, 30000)
133
+
134
+ it('search_tasks returns results (or empty)', async () => {
135
+ const result = await read.search_tasks({ limit: 1 })
136
+ expect(result).toBeTruthy()
137
+ }, 30000)
138
+
139
+ it('get_associations returns associations when HUBSPOT_TEST_CONTACT_ID is set', async () => {
140
+ if (!ctx.contactId)
141
+ return expect(true).toBe(true)
142
+ const result = await read.get_associations({
143
+ fromObjectType: 'contacts',
144
+ fromObjectId: ctx.contactId,
145
+ toObjectType: 'companies',
146
+ limit: 1,
147
+ })
148
+ expect(result).toBeTruthy()
149
+ }, 30000)
150
+ })
151
+
@@ -0,0 +1,10 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { getMissingToolUsages } from '../../__tests__/usageParity.js'
3
+
4
+ describe('hubspot static usage parity', () => {
5
+ it('every manifest tool is referenced in tests', () => {
6
+ const missing = getMissingToolUsages({ integrationName: 'hubspot', importMetaUrl: import.meta.url })
7
+ expect(missing, `Missing handler usages in tests: ${missing.join(', ')}`).toEqual([])
8
+ })
9
+ })
10
+