@commandable/integration-data 0.0.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 (335) hide show
  1. package/dist/credentials-index.d.ts +30 -0
  2. package/dist/credentials-index.d.ts.map +1 -0
  3. package/dist/credentials-index.js +292 -0
  4. package/dist/credentials-index.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/loader.d.ts +69 -0
  10. package/dist/loader.d.ts.map +1 -0
  11. package/dist/loader.js +164 -0
  12. package/dist/loader.js.map +1 -0
  13. package/integrations/README.md +52 -0
  14. package/integrations/airtable/__tests__/get_handlers.test.ts +137 -0
  15. package/integrations/airtable/__tests__/usage_parity.test.ts +35 -0
  16. package/integrations/airtable/__tests__/write_and_admin_handlers.test.ts +113 -0
  17. package/integrations/airtable/credentials.json +20 -0
  18. package/integrations/airtable/credentials_hint.md +4 -0
  19. package/integrations/airtable/handlers/create_record.js +12 -0
  20. package/integrations/airtable/handlers/delete_record.js +7 -0
  21. package/integrations/airtable/handlers/get_record.js +4 -0
  22. package/integrations/airtable/handlers/get_table_schema.js +6 -0
  23. package/integrations/airtable/handlers/list_bases.js +4 -0
  24. package/integrations/airtable/handlers/list_records.js +25 -0
  25. package/integrations/airtable/handlers/list_table_fields.js +6 -0
  26. package/integrations/airtable/handlers/list_tables.js +4 -0
  27. package/integrations/airtable/handlers/list_views.js +6 -0
  28. package/integrations/airtable/handlers/search_records.js +6 -0
  29. package/integrations/airtable/handlers/update_record.js +11 -0
  30. package/integrations/airtable/manifest.json +83 -0
  31. package/integrations/airtable/schemas/create_record.json +12 -0
  32. package/integrations/airtable/schemas/delete_record.json +11 -0
  33. package/integrations/airtable/schemas/empty.json +6 -0
  34. package/integrations/airtable/schemas/get_record.json +11 -0
  35. package/integrations/airtable/schemas/id_base.json +9 -0
  36. package/integrations/airtable/schemas/id_base_table.json +10 -0
  37. package/integrations/airtable/schemas/list_records.json +26 -0
  38. package/integrations/airtable/schemas/search_records.json +12 -0
  39. package/integrations/airtable/schemas/update_record.json +13 -0
  40. package/integrations/github/__tests__/get_handlers.test.ts +117 -0
  41. package/integrations/github/__tests__/usage_parity.test.ts +34 -0
  42. package/integrations/github/__tests__/write_handlers.test.ts +311 -0
  43. package/integrations/github/credentials.json +20 -0
  44. package/integrations/github/credentials_hint.md +7 -0
  45. package/integrations/github/handlers/add_labels_to_issue.js +12 -0
  46. package/integrations/github/handlers/close_issue.js +5 -0
  47. package/integrations/github/handlers/comment_on_issue.js +5 -0
  48. package/integrations/github/handlers/create_branch.js +33 -0
  49. package/integrations/github/handlers/create_commit.js +91 -0
  50. package/integrations/github/handlers/create_issue.js +10 -0
  51. package/integrations/github/handlers/create_or_update_file.js +21 -0
  52. package/integrations/github/handlers/create_pull_request.js +16 -0
  53. package/integrations/github/handlers/create_repo.js +11 -0
  54. package/integrations/github/handlers/delete_repo.js +6 -0
  55. package/integrations/github/handlers/get_issue.js +4 -0
  56. package/integrations/github/handlers/get_repo.js +4 -0
  57. package/integrations/github/handlers/list_branches.js +4 -0
  58. package/integrations/github/handlers/list_commits.js +12 -0
  59. package/integrations/github/handlers/list_issues.js +12 -0
  60. package/integrations/github/handlers/list_pull_requests.js +8 -0
  61. package/integrations/github/handlers/list_repos_install.js +4 -0
  62. package/integrations/github/handlers/list_repos_user.js +4 -0
  63. package/integrations/github/handlers/merge_pull_request.js +14 -0
  64. package/integrations/github/handlers/update_issue.js +15 -0
  65. package/integrations/github/manifest.json +26 -0
  66. package/integrations/github/schemas/add_labels_to_issue.json +12 -0
  67. package/integrations/github/schemas/close_issue.json +10 -0
  68. package/integrations/github/schemas/comment_on_issue.json +11 -0
  69. package/integrations/github/schemas/create_branch.json +12 -0
  70. package/integrations/github/schemas/create_commit.json +25 -0
  71. package/integrations/github/schemas/create_issue.json +13 -0
  72. package/integrations/github/schemas/create_or_update_file.json +15 -0
  73. package/integrations/github/schemas/create_pull_request.json +15 -0
  74. package/integrations/github/schemas/create_repo.json +12 -0
  75. package/integrations/github/schemas/delete_repo.json +10 -0
  76. package/integrations/github/schemas/empty.json +5 -0
  77. package/integrations/github/schemas/get_issue.json +10 -0
  78. package/integrations/github/schemas/get_repo.json +9 -0
  79. package/integrations/github/schemas/list_commits.json +12 -0
  80. package/integrations/github/schemas/list_issues.json +12 -0
  81. package/integrations/github/schemas/list_pull_requests.json +10 -0
  82. package/integrations/github/schemas/merge_pull_request.json +14 -0
  83. package/integrations/github/schemas/owner_repo.json +9 -0
  84. package/integrations/github/schemas/update_issue.json +15 -0
  85. package/integrations/google-calendar/__tests__/get_handlers.test.ts +112 -0
  86. package/integrations/google-calendar/__tests__/usage_parity.test.ts +34 -0
  87. package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +161 -0
  88. package/integrations/google-calendar/credentials.json +36 -0
  89. package/integrations/google-calendar/credentials_hint.md +9 -0
  90. package/integrations/google-calendar/handlers/create_event.js +6 -0
  91. package/integrations/google-calendar/handlers/delete_acl.js +6 -0
  92. package/integrations/google-calendar/handlers/delete_event.js +7 -0
  93. package/integrations/google-calendar/handlers/freebusy_query.js +4 -0
  94. package/integrations/google-calendar/handlers/get_acl.js +5 -0
  95. package/integrations/google-calendar/handlers/get_calendar.js +4 -0
  96. package/integrations/google-calendar/handlers/get_event.js +5 -0
  97. package/integrations/google-calendar/handlers/insert_acl.js +6 -0
  98. package/integrations/google-calendar/handlers/list_acl.js +5 -0
  99. package/integrations/google-calendar/handlers/list_calendars.js +4 -0
  100. package/integrations/google-calendar/handlers/list_colors.js +4 -0
  101. package/integrations/google-calendar/handlers/list_events.js +21 -0
  102. package/integrations/google-calendar/handlers/list_settings.js +4 -0
  103. package/integrations/google-calendar/handlers/move_event.js +6 -0
  104. package/integrations/google-calendar/handlers/patch_event.js +5 -0
  105. package/integrations/google-calendar/handlers/quick_add.js +6 -0
  106. package/integrations/google-calendar/handlers/update_acl.js +7 -0
  107. package/integrations/google-calendar/handlers/update_event.js +5 -0
  108. package/integrations/google-calendar/manifest.json +26 -0
  109. package/integrations/google-calendar/schemas/create_event.json +34 -0
  110. package/integrations/google-calendar/schemas/delete_acl.json +9 -0
  111. package/integrations/google-calendar/schemas/empty.json +1 -0
  112. package/integrations/google-calendar/schemas/freebusy_query.json +13 -0
  113. package/integrations/google-calendar/schemas/get_acl.json +9 -0
  114. package/integrations/google-calendar/schemas/id_calendar.json +8 -0
  115. package/integrations/google-calendar/schemas/id_calendar_event.json +9 -0
  116. package/integrations/google-calendar/schemas/insert_acl.json +18 -0
  117. package/integrations/google-calendar/schemas/list_events.json +15 -0
  118. package/integrations/google-calendar/schemas/move_event.json +10 -0
  119. package/integrations/google-calendar/schemas/patch_event.json +10 -0
  120. package/integrations/google-calendar/schemas/quick_add.json +9 -0
  121. package/integrations/google-calendar/schemas/update_acl.json +10 -0
  122. package/integrations/google-calendar/schemas/update_event.json +10 -0
  123. package/integrations/google-docs/__tests__/get_handlers.test.ts +72 -0
  124. package/integrations/google-docs/__tests__/usage_parity.test.ts +34 -0
  125. package/integrations/google-docs/__tests__/write_handlers.test.ts +249 -0
  126. package/integrations/google-docs/credentials.json +36 -0
  127. package/integrations/google-docs/credentials_hint.md +9 -0
  128. package/integrations/google-docs/handlers/append_text.js +12 -0
  129. package/integrations/google-docs/handlers/batch_update.js +13 -0
  130. package/integrations/google-docs/handlers/create_document.js +9 -0
  131. package/integrations/google-docs/handlers/delete_first_match.js +50 -0
  132. package/integrations/google-docs/handlers/get_document.js +12 -0
  133. package/integrations/google-docs/handlers/get_document_structured.js +6 -0
  134. package/integrations/google-docs/handlers/get_document_text.js +17 -0
  135. package/integrations/google-docs/handlers/insert_inline_image_after_first_match.js +41 -0
  136. package/integrations/google-docs/handlers/insert_page_break_after_first_match.js +49 -0
  137. package/integrations/google-docs/handlers/insert_table_after_first_match.js +49 -0
  138. package/integrations/google-docs/handlers/insert_text_after_first_match.js +51 -0
  139. package/integrations/google-docs/handlers/replace_all_text.js +8 -0
  140. package/integrations/google-docs/handlers/style_first_match.js +42 -0
  141. package/integrations/google-docs/handlers/update_document_style.js +8 -0
  142. package/integrations/google-docs/handlers/update_paragraph_style_for_first_match.js +48 -0
  143. package/integrations/google-docs/manifest.json +58 -0
  144. package/integrations/google-docs/schemas/append_text.json +10 -0
  145. package/integrations/google-docs/schemas/apply_text_style.json +13 -0
  146. package/integrations/google-docs/schemas/batch_update.json +16 -0
  147. package/integrations/google-docs/schemas/create_document.json +8 -0
  148. package/integrations/google-docs/schemas/delete_content_range.json +11 -0
  149. package/integrations/google-docs/schemas/delete_first_match.json +10 -0
  150. package/integrations/google-docs/schemas/get_document.json +11 -0
  151. package/integrations/google-docs/schemas/get_document_structured.json +9 -0
  152. package/integrations/google-docs/schemas/get_document_text.json +9 -0
  153. package/integrations/google-docs/schemas/insert_inline_image.json +12 -0
  154. package/integrations/google-docs/schemas/insert_inline_image_after_first_match.json +13 -0
  155. package/integrations/google-docs/schemas/insert_page_break.json +10 -0
  156. package/integrations/google-docs/schemas/insert_page_break_after_first_match.json +11 -0
  157. package/integrations/google-docs/schemas/insert_table.json +12 -0
  158. package/integrations/google-docs/schemas/insert_table_after_first_match.json +13 -0
  159. package/integrations/google-docs/schemas/insert_text_after_first_match.json +12 -0
  160. package/integrations/google-docs/schemas/insert_text_at.json +11 -0
  161. package/integrations/google-docs/schemas/replace_all_text.json +12 -0
  162. package/integrations/google-docs/schemas/style_first_match.json +12 -0
  163. package/integrations/google-docs/schemas/update_document_style.json +11 -0
  164. package/integrations/google-docs/schemas/update_paragraph_style.json +13 -0
  165. package/integrations/google-docs/schemas/update_paragraph_style_for_first_match.json +12 -0
  166. package/integrations/google-sheet/__tests__/get_handlers.test.ts +129 -0
  167. package/integrations/google-sheet/__tests__/usage_parity.test.ts +35 -0
  168. package/integrations/google-sheet/__tests__/write_handlers.test.ts +171 -0
  169. package/integrations/google-sheet/credentials.json +36 -0
  170. package/integrations/google-sheet/credentials_hint.md +9 -0
  171. package/integrations/google-sheet/handlers/append_values.js +18 -0
  172. package/integrations/google-sheet/handlers/batch_clear_values.js +6 -0
  173. package/integrations/google-sheet/handlers/batch_clear_values_by_data_filter.js +6 -0
  174. package/integrations/google-sheet/handlers/batch_get_values.js +16 -0
  175. package/integrations/google-sheet/handlers/batch_update.js +14 -0
  176. package/integrations/google-sheet/handlers/batch_update_values.js +16 -0
  177. package/integrations/google-sheet/handlers/batch_update_values_by_data_filter.js +16 -0
  178. package/integrations/google-sheet/handlers/clear_values.js +6 -0
  179. package/integrations/google-sheet/handlers/copy_to_spreadsheet.js +6 -0
  180. package/integrations/google-sheet/handlers/create_spreadsheet.js +5 -0
  181. package/integrations/google-sheet/handlers/get_developer_metadata.js +6 -0
  182. package/integrations/google-sheet/handlers/get_spreadsheet.js +12 -0
  183. package/integrations/google-sheet/handlers/get_spreadsheet_by_data_filter.js +10 -0
  184. package/integrations/google-sheet/handlers/get_values.js +14 -0
  185. package/integrations/google-sheet/handlers/get_values_by_data_filter.js +14 -0
  186. package/integrations/google-sheet/handlers/search_developer_metadata.js +7 -0
  187. package/integrations/google-sheet/handlers/update_values.js +16 -0
  188. package/integrations/google-sheet/manifest.json +125 -0
  189. package/integrations/google-sheet/schemas/append_values.json +16 -0
  190. package/integrations/google-sheet/schemas/batch_clear_values.json +10 -0
  191. package/integrations/google-sheet/schemas/batch_clear_values_by_data_filter.json +10 -0
  192. package/integrations/google-sheet/schemas/batch_get_values.json +13 -0
  193. package/integrations/google-sheet/schemas/batch_update.json +13 -0
  194. package/integrations/google-sheet/schemas/batch_update_values.json +25 -0
  195. package/integrations/google-sheet/schemas/batch_update_values_by_data_filter.json +25 -0
  196. package/integrations/google-sheet/schemas/clear_values.json +10 -0
  197. package/integrations/google-sheet/schemas/copy_to_spreadsheet.json +11 -0
  198. package/integrations/google-sheet/schemas/create_spreadsheet.json +11 -0
  199. package/integrations/google-sheet/schemas/get_developer_metadata.json +10 -0
  200. package/integrations/google-sheet/schemas/get_spreadsheet.json +15 -0
  201. package/integrations/google-sheet/schemas/get_spreadsheet_by_data_filter.json +11 -0
  202. package/integrations/google-sheet/schemas/get_values.json +13 -0
  203. package/integrations/google-sheet/schemas/get_values_by_data_filter.json +17 -0
  204. package/integrations/google-sheet/schemas/search_developer_metadata.json +14 -0
  205. package/integrations/google-sheet/schemas/update_values.json +15 -0
  206. package/integrations/google-slides/__tests__/get_handlers.test.ts +69 -0
  207. package/integrations/google-slides/__tests__/usage_parity.test.ts +34 -0
  208. package/integrations/google-slides/__tests__/write_handlers.test.ts +125 -0
  209. package/integrations/google-slides/credentials.json +36 -0
  210. package/integrations/google-slides/credentials_hint.md +9 -0
  211. package/integrations/google-slides/handlers/append_text_to_title_of_first_slide.js +17 -0
  212. package/integrations/google-slides/handlers/batch_update.js +15 -0
  213. package/integrations/google-slides/handlers/create_presentation.js +8 -0
  214. package/integrations/google-slides/handlers/create_slide_after_first_match.js +20 -0
  215. package/integrations/google-slides/handlers/get_page_thumbnail.js +12 -0
  216. package/integrations/google-slides/handlers/get_presentation.js +6 -0
  217. package/integrations/google-slides/handlers/insert_image_after_first_match.js +19 -0
  218. package/integrations/google-slides/handlers/insert_shape_after_first_match.js +21 -0
  219. package/integrations/google-slides/handlers/replace_text_first_match.js +9 -0
  220. package/integrations/google-slides/handlers/set_background_color_for_slide_index.js +15 -0
  221. package/integrations/google-slides/handlers/style_text_first_match.js +48 -0
  222. package/integrations/google-slides/manifest.json +41 -0
  223. package/integrations/google-slides/schemas/append_text_to_title_of_first_slide.json +11 -0
  224. package/integrations/google-slides/schemas/batch_update.json +13 -0
  225. package/integrations/google-slides/schemas/create_presentation.json +8 -0
  226. package/integrations/google-slides/schemas/create_slide_after_first_match.json +11 -0
  227. package/integrations/google-slides/schemas/get_page_thumbnail.json +12 -0
  228. package/integrations/google-slides/schemas/get_presentation.json +9 -0
  229. package/integrations/google-slides/schemas/insert_image_after_first_match.json +13 -0
  230. package/integrations/google-slides/schemas/insert_shape_after_first_match.json +13 -0
  231. package/integrations/google-slides/schemas/replace_text_first_match.json +12 -0
  232. package/integrations/google-slides/schemas/set_background_color_for_slide_index.json +11 -0
  233. package/integrations/google-slides/schemas/style_text_first_match.json +12 -0
  234. package/integrations/new_integration_prompt.md +41 -0
  235. package/integrations/notion/__tests__/get_handlers.test.ts +153 -0
  236. package/integrations/notion/__tests__/usage_parity.test.ts +34 -0
  237. package/integrations/notion/__tests__/write_and_admin_handlers.test.ts +190 -0
  238. package/integrations/notion/credentials.json +21 -0
  239. package/integrations/notion/credentials_hint.md +5 -0
  240. package/integrations/notion/handlers/append_block_children.js +7 -0
  241. package/integrations/notion/handlers/create_comment.js +10 -0
  242. package/integrations/notion/handlers/create_database.js +11 -0
  243. package/integrations/notion/handlers/create_page.js +13 -0
  244. package/integrations/notion/handlers/delete_block.js +8 -0
  245. package/integrations/notion/handlers/get_me.js +4 -0
  246. package/integrations/notion/handlers/list_block_children.js +10 -0
  247. package/integrations/notion/handlers/list_comments.js +14 -0
  248. package/integrations/notion/handlers/list_users.js +10 -0
  249. package/integrations/notion/handlers/query_database.js +10 -0
  250. package/integrations/notion/handlers/retrieve_block.js +4 -0
  251. package/integrations/notion/handlers/retrieve_database.js +4 -0
  252. package/integrations/notion/handlers/retrieve_page.js +4 -0
  253. package/integrations/notion/handlers/retrieve_page_property_item.js +10 -0
  254. package/integrations/notion/handlers/retrieve_user.js +4 -0
  255. package/integrations/notion/handlers/search.js +11 -0
  256. package/integrations/notion/handlers/update_block.js +7 -0
  257. package/integrations/notion/handlers/update_database.js +10 -0
  258. package/integrations/notion/handlers/update_page_properties.js +10 -0
  259. package/integrations/notion/manifest.json +139 -0
  260. package/integrations/notion/prompt.md +26 -0
  261. package/integrations/notion/schemas/append_block_children.json +10 -0
  262. package/integrations/notion/schemas/create_comment.json +18 -0
  263. package/integrations/notion/schemas/create_database.json +18 -0
  264. package/integrations/notion/schemas/create_page.json +22 -0
  265. package/integrations/notion/schemas/delete_block.json +9 -0
  266. package/integrations/notion/schemas/empty.json +6 -0
  267. package/integrations/notion/schemas/id_block.json +9 -0
  268. package/integrations/notion/schemas/id_database.json +9 -0
  269. package/integrations/notion/schemas/id_page.json +9 -0
  270. package/integrations/notion/schemas/id_user.json +9 -0
  271. package/integrations/notion/schemas/list_block_children.json +11 -0
  272. package/integrations/notion/schemas/list_comments.json +15 -0
  273. package/integrations/notion/schemas/list_users.json +9 -0
  274. package/integrations/notion/schemas/query_database.json +13 -0
  275. package/integrations/notion/schemas/retrieve_page_property_item.json +12 -0
  276. package/integrations/notion/schemas/search.json +27 -0
  277. package/integrations/notion/schemas/update_block.json +10 -0
  278. package/integrations/notion/schemas/update_database.json +13 -0
  279. package/integrations/notion/schemas/update_page_properties.json +13 -0
  280. package/integrations/trello/__tests__/get_handlers.test.ts +240 -0
  281. package/integrations/trello/__tests__/usage_parity.test.ts +34 -0
  282. package/integrations/trello/__tests__/write_and_admin_handlers.test.ts +189 -0
  283. package/integrations/trello/credentials.json +26 -0
  284. package/integrations/trello/credentials_hint.md +4 -0
  285. package/integrations/trello/handlers/add_checklist_to_card.js +5 -0
  286. package/integrations/trello/handlers/add_member_to_card.js +5 -0
  287. package/integrations/trello/handlers/archive_list.js +5 -0
  288. package/integrations/trello/handlers/create_card.js +13 -0
  289. package/integrations/trello/handlers/create_list.js +7 -0
  290. package/integrations/trello/handlers/delete_card.js +9 -0
  291. package/integrations/trello/handlers/get_board.js +4 -0
  292. package/integrations/trello/handlers/get_board_cards.js +4 -0
  293. package/integrations/trello/handlers/get_board_custom_fields.js +4 -0
  294. package/integrations/trello/handlers/get_board_labels.js +4 -0
  295. package/integrations/trello/handlers/get_board_lists.js +4 -0
  296. package/integrations/trello/handlers/get_board_members.js +4 -0
  297. package/integrations/trello/handlers/get_board_memberships.js +4 -0
  298. package/integrations/trello/handlers/get_card.js +4 -0
  299. package/integrations/trello/handlers/get_card_actions.js +4 -0
  300. package/integrations/trello/handlers/get_card_attachments.js +4 -0
  301. package/integrations/trello/handlers/get_card_checklists.js +4 -0
  302. package/integrations/trello/handlers/get_card_custom_field_items.js +4 -0
  303. package/integrations/trello/handlers/get_card_members.js +4 -0
  304. package/integrations/trello/handlers/get_list.js +4 -0
  305. package/integrations/trello/handlers/get_list_cards.js +4 -0
  306. package/integrations/trello/handlers/get_member.js +4 -0
  307. package/integrations/trello/handlers/get_member_boards.js +4 -0
  308. package/integrations/trello/handlers/get_member_organizations.js +4 -0
  309. package/integrations/trello/handlers/get_organization.js +4 -0
  310. package/integrations/trello/handlers/get_organization_boards.js +4 -0
  311. package/integrations/trello/handlers/move_card_to_list.js +5 -0
  312. package/integrations/trello/handlers/remove_member_from_card.js +9 -0
  313. package/integrations/trello/handlers/search.js +5 -0
  314. package/integrations/trello/handlers/update_card.js +19 -0
  315. package/integrations/trello/handlers/update_list.js +11 -0
  316. package/integrations/trello/manifest.json +231 -0
  317. package/integrations/trello/schemas/add_checklist_to_card.json +10 -0
  318. package/integrations/trello/schemas/add_member_to_card.json +10 -0
  319. package/integrations/trello/schemas/archive_list.json +9 -0
  320. package/integrations/trello/schemas/create_card.json +13 -0
  321. package/integrations/trello/schemas/create_list.json +11 -0
  322. package/integrations/trello/schemas/delete_card.json +9 -0
  323. package/integrations/trello/schemas/display_trello_cards.json +45 -0
  324. package/integrations/trello/schemas/empty.json +5 -0
  325. package/integrations/trello/schemas/get_member.json +5 -0
  326. package/integrations/trello/schemas/id_board.json +8 -0
  327. package/integrations/trello/schemas/id_card.json +8 -0
  328. package/integrations/trello/schemas/id_list.json +8 -0
  329. package/integrations/trello/schemas/id_org.json +8 -0
  330. package/integrations/trello/schemas/move_card_to_list.json +10 -0
  331. package/integrations/trello/schemas/remove_member_from_card.json +10 -0
  332. package/integrations/trello/schemas/search.json +8 -0
  333. package/integrations/trello/schemas/update_card.json +16 -0
  334. package/integrations/trello/schemas/update_list.json +12 -0
  335. package/package.json +45 -0
@@ -0,0 +1,137 @@
1
+ import { beforeAll, describe, expect, it } from 'vitest'
2
+ import { IntegrationProxy } from '../../../src/integrations/proxy.js'
3
+ import { loadIntegrationTools } from '../../../src/integrations/dataLoader.js'
4
+
5
+ // LIVE Airtable integration tests using managed OAuth
6
+ // Required env vars:
7
+ // - COMMANDABLE_MANAGED_OAUTH_BASE_URL
8
+ // - COMMANDABLE_MANAGED_OAUTH_SECRET_KEY
9
+ // - AIRTABLE_TEST_CONNECTION_ID (managed OAuth connection for provider 'airtable')
10
+
11
+ interface Ctx {
12
+ baseId?: string
13
+ tableId?: string
14
+ recordId?: string
15
+ }
16
+
17
+ const env = process.env as Record<string, string>
18
+ const hasEnv = (...keys: string[]) => keys.every(k => !!env[k] && env[k].trim().length > 0)
19
+ const suite = hasEnv(
20
+ 'COMMANDABLE_MANAGED_OAUTH_BASE_URL',
21
+ 'COMMANDABLE_MANAGED_OAUTH_SECRET_KEY',
22
+ 'AIRTABLE_TEST_CONNECTION_ID',
23
+ )
24
+ ? describe
25
+ : describe.skip
26
+
27
+ suite('airtable read handlers (live)', () => {
28
+ const ctx: Ctx = {}
29
+ let buildHandler: (name: string) => ((input: any) => Promise<any>)
30
+
31
+ beforeAll(async () => {
32
+ const { COMMANDABLE_MANAGED_OAUTH_BASE_URL, COMMANDABLE_MANAGED_OAUTH_SECRET_KEY, AIRTABLE_TEST_CONNECTION_ID } = env
33
+
34
+ const proxy = new IntegrationProxy({
35
+ managedOAuthBaseUrl: COMMANDABLE_MANAGED_OAUTH_BASE_URL,
36
+ managedOAuthSecretKey: COMMANDABLE_MANAGED_OAUTH_SECRET_KEY,
37
+ })
38
+ const integrationNode = { id: 'node-airtable', type: 'airtable', label: 'Airtable', connectionId: AIRTABLE_TEST_CONNECTION_ID } as any
39
+
40
+ const tools = loadIntegrationTools('airtable')
41
+ expect(tools).toBeTruthy()
42
+
43
+ buildHandler = (name: string) => {
44
+ const tool = tools!.read.find(t => t.name === name)
45
+ expect(tool, `tool ${name} exists`).toBeTruthy()
46
+ const integration = {
47
+ fetch: (path: string, init?: RequestInit) => proxy.call(integrationNode, path, init),
48
+ }
49
+ const build = new Function('integration', `return (${tool!.handlerCode});`)
50
+ return build(integration) as (input: any) => Promise<any>
51
+ }
52
+
53
+ // Discover base -> table -> record for tests
54
+ const list_bases = buildHandler('list_bases')
55
+ const bases = await list_bases({})
56
+ ctx.baseId = bases?.bases?.[0]?.id || bases?.[0]?.id
57
+
58
+ if (ctx.baseId) {
59
+ const list_tables = buildHandler('list_tables')
60
+ const tablesResp = await list_tables({ baseId: ctx.baseId })
61
+ const tables = tablesResp?.tables || tablesResp
62
+ ctx.tableId = tables?.[0]?.id
63
+
64
+ if (ctx.tableId) {
65
+ const list_records = buildHandler('list_records')
66
+ const recs = await list_records({ baseId: ctx.baseId, tableId: ctx.tableId, pageSize: 1 })
67
+ const records = recs?.records || recs
68
+ ctx.recordId = records?.[0]?.id
69
+ }
70
+ }
71
+ }, 60000)
72
+
73
+ it('list_bases returns bases', async () => {
74
+ const handler = buildHandler('list_bases')
75
+ const result = await handler({})
76
+ expect(result).toBeTruthy()
77
+ }, 30000)
78
+
79
+ it('list_tables returns tables for base', async () => {
80
+ if (!ctx.baseId)
81
+ return expect(true).toBe(true)
82
+ const handler = buildHandler('list_tables')
83
+ const result = await handler({ baseId: ctx.baseId })
84
+ expect(result).toBeTruthy()
85
+ }, 30000)
86
+
87
+ it('get_table_schema returns a table schema', async () => {
88
+ if (!ctx.baseId || !ctx.tableId)
89
+ return expect(true).toBe(true)
90
+ const handler = buildHandler('get_table_schema')
91
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId })
92
+ expect(result?.id || result?.name).toBeTruthy()
93
+ }, 30000)
94
+
95
+ it('list_table_fields returns fields', async () => {
96
+ if (!ctx.baseId || !ctx.tableId)
97
+ return expect(true).toBe(true)
98
+ const handler = buildHandler('list_table_fields')
99
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId })
100
+ expect(Array.isArray(result)).toBe(true)
101
+ }, 30000)
102
+
103
+ it('list_views returns views', async () => {
104
+ if (!ctx.baseId || !ctx.tableId)
105
+ return expect(true).toBe(true)
106
+ const handler = buildHandler('list_views')
107
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId })
108
+ expect(Array.isArray(result)).toBe(true)
109
+ }, 30000)
110
+
111
+ it('list_records returns records', async () => {
112
+ if (!ctx.baseId || !ctx.tableId)
113
+ return expect(true).toBe(true)
114
+ const handler = buildHandler('list_records')
115
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId, pageSize: 3 })
116
+ expect(result).toBeTruthy()
117
+ }, 30000)
118
+
119
+ it('get_record returns a record by id', async () => {
120
+ if (!ctx.baseId || !ctx.tableId || !ctx.recordId)
121
+ return expect(true).toBe(true)
122
+ const handler = buildHandler('get_record')
123
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId, recordId: ctx.recordId })
124
+ expect(result?.id).toBe(ctx.recordId)
125
+ }, 30000)
126
+
127
+ it('search_records returns matching records', async () => {
128
+ if (!ctx.baseId || !ctx.tableId)
129
+ return expect(true).toBe(true)
130
+ const list_fields = buildHandler('list_table_fields')
131
+ const fields: any[] = await list_fields({ baseId: ctx.baseId, tableId: ctx.tableId })
132
+ const fieldName = fields?.[0]?.name || 'Name'
133
+ const handler = buildHandler('search_records')
134
+ const result = await handler({ baseId: ctx.baseId, tableId: ctx.tableId, field: fieldName, value: '' })
135
+ expect(result).toBeTruthy()
136
+ }, 30000)
137
+ })
@@ -0,0 +1,35 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs'
2
+ import { resolve } from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+ import { describe, expect, it } from 'vitest'
5
+ import { loadIntegrationManifest } from '../../../src/integrations/dataLoader.js'
6
+
7
+ function escapeRegExp(str: string): string {
8
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
9
+ }
10
+
11
+ describe('airtable static usage parity', () => {
12
+ it('every manifest tool is referenced in tests via build*(name)', () => {
13
+ const manifest = loadIntegrationManifest('airtable')!
14
+ const toolNames = (manifest.tools as any[]).map(t => t.name)
15
+
16
+ const testsDir = fileURLToPath(new URL('.', import.meta.url))
17
+ expect(existsSync(testsDir)).toBe(true)
18
+ const testFiles = readdirSync(testsDir)
19
+ .filter(f => /\.test\.(t|j)s$/.test(f) && !f.includes('usage_parity.test'))
20
+ .map(f => resolve(testsDir, f))
21
+
22
+ const fileContents = testFiles.map(f => readFileSync(f, 'utf8'))
23
+
24
+ const missing: string[] = []
25
+ for (const name of toolNames) {
26
+ // Matches buildRead('x'), buildWrite('x'), buildAdmin('x'), buildHandler('x'), buildReadHandler('x'), buildWriteHandler('x')
27
+ const nameRe = new RegExp(`build(?:Read|Write|Admin)?(?:Handler)?\\(\\s*['\"\`]${escapeRegExp(name)}['\"\`]\\s*\\)`, 'm')
28
+ const found = fileContents.some(src => nameRe.test(src))
29
+ if (!found)
30
+ missing.push(name)
31
+ }
32
+
33
+ expect(missing, `Missing handler usages in tests: ${missing.join(', ')}`).toEqual([])
34
+ })
35
+ })
@@ -0,0 +1,113 @@
1
+ import { beforeAll, describe, expect, it } from 'vitest'
2
+ import { IntegrationProxy } from '../../../src/integrations/proxy.js'
3
+ import { loadIntegrationTools } from '../../../src/integrations/dataLoader.js'
4
+
5
+ // LIVE Airtable write tests using managed OAuth
6
+ // Required env vars for write tests:
7
+ // - COMMANDABLE_MANAGED_OAUTH_BASE_URL
8
+ // - COMMANDABLE_MANAGED_OAUTH_SECRET_KEY
9
+ // - AIRTABLE_TEST_CONNECTION_ID (managed OAuth connection for provider 'airtable')
10
+ // Optional env for choosing base/table (otherwise picks first available):
11
+ // - AIRTABLE_TEST_WRITE_BASE_ID
12
+ // - AIRTABLE_TEST_WRITE_TABLE_ID
13
+
14
+ interface Ctx {
15
+ baseId?: string
16
+ tableId?: string
17
+ createdRecordId?: string
18
+ }
19
+
20
+ const env = process.env as Record<string, string>
21
+ const hasEnv = (...keys: string[]) => keys.every(k => !!env[k] && env[k].trim().length > 0)
22
+ const suite = hasEnv(
23
+ 'COMMANDABLE_MANAGED_OAUTH_BASE_URL',
24
+ 'COMMANDABLE_MANAGED_OAUTH_SECRET_KEY',
25
+ 'AIRTABLE_TEST_CONNECTION_ID',
26
+ )
27
+ ? describe
28
+ : describe.skip
29
+
30
+ suite('airtable write handlers (live)', () => {
31
+ const ctx: Ctx = {}
32
+ let buildWriteHandler: (name: string) => ((input: any) => Promise<any>)
33
+ let buildReadHandler: (name: string) => ((input: any) => Promise<any>)
34
+
35
+ beforeAll(async () => {
36
+ const { COMMANDABLE_MANAGED_OAUTH_BASE_URL, COMMANDABLE_MANAGED_OAUTH_SECRET_KEY, AIRTABLE_TEST_CONNECTION_ID } = env
37
+
38
+ const proxy = new IntegrationProxy({
39
+ managedOAuthBaseUrl: COMMANDABLE_MANAGED_OAUTH_BASE_URL,
40
+ managedOAuthSecretKey: COMMANDABLE_MANAGED_OAUTH_SECRET_KEY,
41
+ })
42
+ const integrationNode = { id: 'node-airtable', type: 'airtable', label: 'Airtable', connectionId: AIRTABLE_TEST_CONNECTION_ID } as any
43
+
44
+ const tools = loadIntegrationTools('airtable')
45
+ expect(tools).toBeTruthy()
46
+
47
+ buildWriteHandler = (name: string) => {
48
+ const tool = tools!.write.find(t => t.name === name)
49
+ expect(tool, `write tool ${name} exists`).toBeTruthy()
50
+ const integration = { fetch: (path: string, init?: RequestInit) => proxy.call(integrationNode, path, init) }
51
+ const build = new Function('integration', `return (${tool!.handlerCode});`)
52
+ return build(integration) as (input: any) => Promise<any>
53
+ }
54
+
55
+ buildReadHandler = (name: string) => {
56
+ const tool = tools!.read.find(t => t.name === name)
57
+ expect(tool, `read tool ${name} exists`).toBeTruthy()
58
+ const integration = { fetch: (path: string, init?: RequestInit) => proxy.call(integrationNode, path, init) }
59
+ const build = new Function('integration', `return (${tool!.handlerCode});`)
60
+ return build(integration) as (input: any) => Promise<any>
61
+ }
62
+
63
+ // Resolve base/table for write tests
64
+ ctx.baseId = env.AIRTABLE_TEST_WRITE_BASE_ID
65
+ ctx.tableId = env.AIRTABLE_TEST_WRITE_TABLE_ID
66
+
67
+ if (!ctx.baseId || !ctx.tableId) {
68
+ const list_bases = buildReadHandler('list_bases')
69
+ const bases = await list_bases({})
70
+ ctx.baseId = ctx.baseId || (bases?.bases?.[0]?.id || bases?.[0]?.id)
71
+ if (ctx.baseId) {
72
+ const list_tables = buildReadHandler('list_tables')
73
+ const tablesResp = await list_tables({ baseId: ctx.baseId })
74
+ const tables = tablesResp?.tables || tablesResp
75
+ ctx.tableId = ctx.tableId || tables?.[0]?.id
76
+ }
77
+ }
78
+ }, 60000)
79
+
80
+ it('create_record -> get_record -> update_record -> delete_record roundtrip', async () => {
81
+ if (!ctx.baseId || !ctx.tableId)
82
+ return expect(true).toBe(true)
83
+
84
+ // Assume a single writable column named 'Name' per test setup
85
+ const fieldName = 'Name'
86
+
87
+ // Create
88
+ const create_record = buildWriteHandler('create_record')
89
+ const created = await create_record({ baseId: ctx.baseId, tableId: ctx.tableId, fields: { [fieldName]: `CmdTest ${Date.now()}` } })
90
+ const createdRec = created?.records?.[0] || created
91
+ expect(createdRec?.id).toBeTruthy()
92
+ ctx.createdRecordId = createdRec.id
93
+
94
+ // Read
95
+ const get_record = buildReadHandler('get_record')
96
+ const got = await get_record({ baseId: ctx.baseId, tableId: ctx.tableId, recordId: ctx.createdRecordId })
97
+ expect(got?.id).toBe(ctx.createdRecordId)
98
+
99
+ // Update
100
+ const update_record = buildWriteHandler('update_record')
101
+ const updated = await update_record({ baseId: ctx.baseId, tableId: ctx.tableId, recordId: ctx.createdRecordId, fields: { [fieldName]: `CmdTest Updated ${Date.now()}` } })
102
+ const updatedRec = updated?.records?.[0] || updated
103
+ expect(updatedRec?.id).toBe(ctx.createdRecordId)
104
+
105
+ // Delete
106
+ const delete_record = buildWriteHandler('delete_record')
107
+ const del = await delete_record({ baseId: ctx.baseId, tableId: ctx.tableId, recordId: ctx.createdRecordId })
108
+ const deletedRec = del?.records?.[0] || del
109
+ expect(deletedRec?.deleted === true || deletedRec?.id === ctx.createdRecordId).toBe(true)
110
+ }, 90000)
111
+ })
112
+
113
+ // Admin operations are not available on standard plans; omitted.
@@ -0,0 +1,20 @@
1
+ {
2
+ "schema": {
3
+ "type": "object",
4
+ "properties": {
5
+ "token": {
6
+ "type": "string",
7
+ "title": "Personal Access Token",
8
+ "description": "Airtable personal access token."
9
+ }
10
+ },
11
+ "required": ["token"],
12
+ "additionalProperties": false
13
+ },
14
+ "injection": {
15
+ "headers": {
16
+ "Authorization": "Bearer {{token}}"
17
+ }
18
+ }
19
+ }
20
+
@@ -0,0 +1,4 @@
1
+ Create an Airtable personal access token and paste it here.
2
+
3
+ You can generate one in Airtable account settings under developer tools / personal access tokens.
4
+
@@ -0,0 +1,12 @@
1
+ async (input) => {
2
+ const path = `/${input.baseId}/${input.tableId}`
3
+ const body = {
4
+ records: [
5
+ { fields: input.fields },
6
+ ],
7
+ typecast: !!input.typecast,
8
+ }
9
+ const res = await integration.fetch(path, { method: 'POST', body })
10
+ const data = await res.json()
11
+ return data
12
+ }
@@ -0,0 +1,7 @@
1
+ async (input) => {
2
+ const path = `/${input.baseId}/${input.tableId}`
3
+ const params = new URLSearchParams()
4
+ params.set('records[]', input.recordId)
5
+ const res = await integration.fetch(`${path}?${params.toString()}`, { method: 'DELETE' })
6
+ return await res.json()
7
+ }
@@ -0,0 +1,4 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/${input.baseId}/${input.tableId}/${input.recordId}`)
3
+ return await res.json()
4
+ }
@@ -0,0 +1,6 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/meta/bases/${input.baseId}/tables`)
3
+ const data = await res.json()
4
+ const table = (data?.tables || data)?.find?.(t => t.id === input.tableId || t.name === input.tableId)
5
+ return table || null
6
+ }
@@ -0,0 +1,4 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/meta/bases`)
3
+ return await res.json()
4
+ }
@@ -0,0 +1,25 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (input.view)
4
+ params.set('view', input.view)
5
+ if (input.maxRecords)
6
+ params.set('maxRecords', String(input.maxRecords))
7
+ if (input.pageSize)
8
+ params.set('pageSize', String(input.pageSize))
9
+ if (input.filterByFormula)
10
+ params.set('filterByFormula', input.filterByFormula)
11
+ if (input.sort && Array.isArray(input.sort)) {
12
+ input.sort.forEach((s, i) => {
13
+ if (s && typeof s === 'object') {
14
+ if (s.field)
15
+ params.set(`sort[${i}][field]`, String(s.field))
16
+ if (s.direction)
17
+ params.set(`sort[${i}][direction]`, String(s.direction))
18
+ }
19
+ })
20
+ }
21
+ const qs = params.toString()
22
+ const path = `/${input.baseId}/${input.tableId}${qs ? `?${qs}` : ''}`
23
+ const res = await integration.fetch(path)
24
+ return await res.json()
25
+ }
@@ -0,0 +1,6 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/meta/bases/${input.baseId}/tables`)
3
+ const data = await res.json()
4
+ const table = (data?.tables || data)?.find?.(t => t.id === input.tableId || t.name === input.tableId)
5
+ return table?.fields || []
6
+ }
@@ -0,0 +1,4 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/meta/bases/${input.baseId}/tables`)
3
+ return await res.json()
4
+ }
@@ -0,0 +1,6 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/meta/bases/${input.baseId}/tables`)
3
+ const data = await res.json()
4
+ const table = (data?.tables || data)?.find?.(t => t.id === input.tableId || t.name === input.tableId)
5
+ return table?.views || []
6
+ }
@@ -0,0 +1,6 @@
1
+ async (input) => {
2
+ const formula = `{${input.field}} = "${input.value}"`
3
+ const params = new URLSearchParams({ filterByFormula: formula })
4
+ const res = await integration.fetch(`/${input.baseId}/${input.tableId}?${params.toString()}`)
5
+ return await res.json()
6
+ }
@@ -0,0 +1,11 @@
1
+ async (input) => {
2
+ const path = `/${input.baseId}/${input.tableId}`
3
+ const body = {
4
+ records: [
5
+ { id: input.recordId, fields: input.fields },
6
+ ],
7
+ typecast: !!input.typecast,
8
+ }
9
+ const res = await integration.fetch(path, { method: 'PATCH', body })
10
+ return await res.json()
11
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "airtable",
3
+ "version": "0.1.0",
4
+ "tools": [
5
+ {
6
+ "name": "list_bases",
7
+ "description": "List bases available to the authenticated user.",
8
+ "inputSchema": "schemas/empty.json",
9
+ "handler": "handlers/list_bases.js",
10
+ "scope": "read"
11
+ },
12
+ {
13
+ "name": "list_tables",
14
+ "description": "List tables in a base (metadata).",
15
+ "inputSchema": "schemas/id_base.json",
16
+ "handler": "handlers/list_tables.js",
17
+ "scope": "read"
18
+ },
19
+ {
20
+ "name": "get_table_schema",
21
+ "description": "Fetch a table's schema (fields, views) by tableId via metadata.",
22
+ "inputSchema": "schemas/id_base_table.json",
23
+ "handler": "handlers/get_table_schema.js",
24
+ "scope": "read"
25
+ },
26
+ {
27
+ "name": "list_table_fields",
28
+ "description": "List fields for a table (metadata).",
29
+ "inputSchema": "schemas/id_base_table.json",
30
+ "handler": "handlers/list_table_fields.js",
31
+ "scope": "read"
32
+ },
33
+ {
34
+ "name": "list_views",
35
+ "description": "List views for a table (metadata).",
36
+ "inputSchema": "schemas/id_base_table.json",
37
+ "handler": "handlers/list_views.js",
38
+ "scope": "read"
39
+ },
40
+ {
41
+ "name": "list_records",
42
+ "description": "List records from a table with optional filters.",
43
+ "inputSchema": "schemas/list_records.json",
44
+ "handler": "handlers/list_records.js",
45
+ "scope": "read"
46
+ },
47
+ {
48
+ "name": "get_record",
49
+ "description": "Fetch a single record by recordId.",
50
+ "inputSchema": "schemas/get_record.json",
51
+ "handler": "handlers/get_record.js",
52
+ "scope": "read"
53
+ },
54
+ {
55
+ "name": "search_records",
56
+ "description": "Search records in a table using a field and value (filterByFormula).",
57
+ "inputSchema": "schemas/search_records.json",
58
+ "handler": "handlers/search_records.js",
59
+ "scope": "read"
60
+ },
61
+ {
62
+ "name": "create_record",
63
+ "description": "Create a record in a table.",
64
+ "inputSchema": "schemas/create_record.json",
65
+ "handler": "handlers/create_record.js",
66
+ "scope": "write"
67
+ },
68
+ {
69
+ "name": "update_record",
70
+ "description": "Update a record in a table.",
71
+ "inputSchema": "schemas/update_record.json",
72
+ "handler": "handlers/update_record.js",
73
+ "scope": "write"
74
+ },
75
+ {
76
+ "name": "delete_record",
77
+ "description": "Delete a record from a table.",
78
+ "inputSchema": "schemas/delete_record.json",
79
+ "handler": "handlers/delete_record.js",
80
+ "scope": "write"
81
+ }
82
+ ]
83
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "baseId": { "type": "string", "description": "Airtable base ID" },
6
+ "tableId": { "type": "string", "description": "Airtable table ID or name" },
7
+ "fields": { "type": "object", "description": "Field values for the new record" },
8
+ "typecast": { "type": "boolean", "description": "Coerce values to field types" }
9
+ },
10
+ "required": ["baseId", "tableId", "fields"],
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "baseId": { "type": "string" },
6
+ "tableId": { "type": "string" },
7
+ "recordId": { "type": "string" }
8
+ },
9
+ "required": ["baseId", "tableId", "recordId"],
10
+ "additionalProperties": false
11
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {},
5
+ "additionalProperties": false
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["baseId", "tableId", "recordId"],
5
+ "properties": {
6
+ "baseId": { "type": "string" },
7
+ "tableId": { "type": "string" },
8
+ "recordId": { "type": "string" }
9
+ },
10
+ "additionalProperties": false
11
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["baseId"],
5
+ "properties": {
6
+ "baseId": { "type": "string", "description": "Airtable base ID" }
7
+ },
8
+ "additionalProperties": false
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["baseId", "tableId"],
5
+ "properties": {
6
+ "baseId": { "type": "string", "description": "Airtable base ID" },
7
+ "tableId": { "type": "string", "description": "Airtable table ID (tbl...)" }
8
+ },
9
+ "additionalProperties": false
10
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["baseId", "tableId"],
5
+ "properties": {
6
+ "baseId": { "type": "string" },
7
+ "tableId": { "type": "string" },
8
+ "view": { "type": "string", "description": "Optional view name or ID" },
9
+ "maxRecords": { "type": "integer", "minimum": 1 },
10
+ "pageSize": { "type": "integer", "minimum": 1 },
11
+ "filterByFormula": { "type": "string" },
12
+ "sort": {
13
+ "type": "array",
14
+ "items": {
15
+ "type": "object",
16
+ "required": ["field"],
17
+ "properties": {
18
+ "field": { "type": "string" },
19
+ "direction": { "type": "string", "enum": ["asc", "desc"] }
20
+ },
21
+ "additionalProperties": false
22
+ }
23
+ }
24
+ },
25
+ "additionalProperties": false
26
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "required": ["baseId", "tableId", "field", "value"],
5
+ "properties": {
6
+ "baseId": { "type": "string" },
7
+ "tableId": { "type": "string" },
8
+ "field": { "type": "string", "description": "Field name to match" },
9
+ "value": { "type": "string", "description": "Value to search for" }
10
+ },
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "baseId": { "type": "string" },
6
+ "tableId": { "type": "string" },
7
+ "recordId": { "type": "string" },
8
+ "fields": { "type": "object" },
9
+ "typecast": { "type": "boolean" }
10
+ },
11
+ "required": ["baseId", "tableId", "recordId", "fields"],
12
+ "additionalProperties": false
13
+ }