hyperpocket 0.3.3__py3-none-any.whl → 0.3.5__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. hyperpocket/auth/activeloop/README.md +8 -0
  2. hyperpocket/auth/activeloop/__init__.py +0 -0
  3. hyperpocket/auth/activeloop/context.py +15 -0
  4. hyperpocket/auth/activeloop/token_context.py +11 -0
  5. hyperpocket/auth/activeloop/token_handler.py +92 -0
  6. hyperpocket/auth/activeloop/token_schema.py +9 -0
  7. hyperpocket/auth/adobe/README.md +8 -0
  8. hyperpocket/auth/adobe/__init__.py +0 -0
  9. hyperpocket/auth/adobe/context.py +15 -0
  10. hyperpocket/auth/adobe/token_context.py +11 -0
  11. hyperpocket/auth/adobe/token_handler.py +89 -0
  12. hyperpocket/auth/adobe/token_schema.py +11 -0
  13. hyperpocket/auth/affinity/README.md +18 -0
  14. hyperpocket/auth/affinity/__init__.py +0 -0
  15. hyperpocket/auth/affinity/context.py +15 -0
  16. hyperpocket/auth/affinity/token_context.py +11 -0
  17. hyperpocket/auth/affinity/token_handler.py +92 -0
  18. hyperpocket/auth/affinity/token_schema.py +11 -0
  19. hyperpocket/auth/agentql/README.md +8 -0
  20. hyperpocket/auth/agentql/__init__.py +0 -0
  21. hyperpocket/auth/agentql/context.py +15 -0
  22. hyperpocket/auth/agentql/token_context.py +11 -0
  23. hyperpocket/auth/agentql/token_handler.py +92 -0
  24. hyperpocket/auth/agentql/token_schema.py +9 -0
  25. hyperpocket/auth/ahrefs/README.md +8 -0
  26. hyperpocket/auth/ahrefs/__init__.py +0 -0
  27. hyperpocket/auth/ahrefs/context.py +15 -0
  28. hyperpocket/auth/ahrefs/token_context.py +11 -0
  29. hyperpocket/auth/ahrefs/token_handler.py +89 -0
  30. hyperpocket/auth/ahrefs/token_schema.py +11 -0
  31. hyperpocket/auth/airtable/README.md +8 -0
  32. hyperpocket/auth/airtable/__init__.py +0 -0
  33. hyperpocket/auth/airtable/context.py +15 -0
  34. hyperpocket/auth/airtable/token_context.py +11 -0
  35. hyperpocket/auth/airtable/token_handler.py +92 -0
  36. hyperpocket/auth/airtable/token_schema.py +11 -0
  37. hyperpocket/auth/alchemy/README.md +8 -0
  38. hyperpocket/auth/alchemy/__init__.py +0 -0
  39. hyperpocket/auth/alchemy/context.py +15 -0
  40. hyperpocket/auth/alchemy/token_context.py +11 -0
  41. hyperpocket/auth/alchemy/token_handler.py +92 -0
  42. hyperpocket/auth/alchemy/token_schema.py +11 -0
  43. hyperpocket/auth/altoviz/README.md +8 -0
  44. hyperpocket/auth/altoviz/__init__.py +0 -0
  45. hyperpocket/auth/altoviz/context.py +15 -0
  46. hyperpocket/auth/altoviz/token_context.py +11 -0
  47. hyperpocket/auth/altoviz/token_handler.py +92 -0
  48. hyperpocket/auth/altoviz/token_schema.py +11 -0
  49. hyperpocket/auth/apitoken/README.md +28 -0
  50. hyperpocket/auth/apitoken/__init__.py +0 -0
  51. hyperpocket/auth/apitoken/context.py +15 -0
  52. hyperpocket/auth/apitoken/token_context.py +12 -0
  53. hyperpocket/auth/apitoken/token_handler.py +89 -0
  54. hyperpocket/auth/apitoken/token_schema.py +9 -0
  55. hyperpocket/auth/asana/README.md +13 -0
  56. hyperpocket/auth/asana/__init__.py +0 -0
  57. hyperpocket/auth/asana/context.py +15 -0
  58. hyperpocket/auth/asana/oauth2_context.py +36 -0
  59. hyperpocket/auth/asana/oauth2_handler.py +158 -0
  60. hyperpocket/auth/asana/oauth2_schema.py +18 -0
  61. hyperpocket/auth/bamboohr/README.md +9 -0
  62. hyperpocket/auth/bamboohr/__init__.py +0 -0
  63. hyperpocket/auth/bamboohr/context.py +15 -0
  64. hyperpocket/auth/bamboohr/token_context.py +11 -0
  65. hyperpocket/auth/bamboohr/token_handler.py +92 -0
  66. hyperpocket/auth/bamboohr/token_schema.py +11 -0
  67. hyperpocket/auth/bitbucket/README.md +13 -0
  68. hyperpocket/auth/bitbucket/__init__.py +0 -0
  69. hyperpocket/auth/bitbucket/context.py +15 -0
  70. hyperpocket/auth/bitbucket/oauth2_context.py +33 -0
  71. hyperpocket/auth/bitbucket/oauth2_handler.py +146 -0
  72. hyperpocket/auth/bitbucket/oauth2_schema.py +18 -0
  73. hyperpocket/auth/bitwarden/README.md +9 -0
  74. hyperpocket/auth/bitwarden/__init__.py +0 -0
  75. hyperpocket/auth/bitwarden/context.py +15 -0
  76. hyperpocket/auth/bitwarden/token_context.py +11 -0
  77. hyperpocket/auth/bitwarden/token_handler.py +92 -0
  78. hyperpocket/auth/bitwarden/token_schema.py +11 -0
  79. hyperpocket/auth/brevo/README.md +9 -0
  80. hyperpocket/auth/brevo/__init__.py +0 -0
  81. hyperpocket/auth/brevo/context.py +15 -0
  82. hyperpocket/auth/brevo/token_context.py +11 -0
  83. hyperpocket/auth/brevo/token_handler.py +89 -0
  84. hyperpocket/auth/brevo/token_schema.py +11 -0
  85. hyperpocket/auth/brex/README.md +9 -0
  86. hyperpocket/auth/brex/__init__.py +0 -0
  87. hyperpocket/auth/brex/context.py +15 -0
  88. hyperpocket/auth/brex/token_context.py +11 -0
  89. hyperpocket/auth/brex/token_handler.py +87 -0
  90. hyperpocket/auth/brex/token_schema.py +11 -0
  91. hyperpocket/auth/cal/README.md +9 -0
  92. hyperpocket/auth/cal/__init__.py +0 -0
  93. hyperpocket/auth/cal/context.py +15 -0
  94. hyperpocket/auth/cal/token_context.py +11 -0
  95. hyperpocket/auth/cal/token_handler.py +85 -0
  96. hyperpocket/auth/cal/token_schema.py +11 -0
  97. hyperpocket/auth/calendly/README.md +13 -0
  98. hyperpocket/auth/canvas/README.md +9 -0
  99. hyperpocket/auth/canvas/__init__.py +0 -0
  100. hyperpocket/auth/canvas/context.py +15 -0
  101. hyperpocket/auth/canvas/token_context.py +11 -0
  102. hyperpocket/auth/canvas/token_handler.py +89 -0
  103. hyperpocket/auth/canvas/token_schema.py +11 -0
  104. hyperpocket/auth/clickup/README.md +9 -0
  105. hyperpocket/auth/clickup/__init__.py +0 -0
  106. hyperpocket/auth/clickup/context.py +15 -0
  107. hyperpocket/auth/clickup/token_context.py +11 -0
  108. hyperpocket/auth/clickup/token_handler.py +92 -0
  109. hyperpocket/auth/clickup/token_schema.py +11 -0
  110. hyperpocket/auth/cloudflare/README.md +9 -0
  111. hyperpocket/auth/cloudflare/__init__.py +0 -0
  112. hyperpocket/auth/cloudflare/context.py +15 -0
  113. hyperpocket/auth/cloudflare/token_context.py +11 -0
  114. hyperpocket/auth/cloudflare/token_handler.py +92 -0
  115. hyperpocket/auth/cloudflare/token_schema.py +11 -0
  116. hyperpocket/auth/dailybot/README.md +9 -0
  117. hyperpocket/auth/dailybot/__init__.py +0 -0
  118. hyperpocket/auth/dailybot/context.py +15 -0
  119. hyperpocket/auth/dailybot/token_context.py +11 -0
  120. hyperpocket/auth/dailybot/token_handler.py +92 -0
  121. hyperpocket/auth/dailybot/token_schema.py +11 -0
  122. hyperpocket/auth/datadog/README.md +9 -0
  123. hyperpocket/auth/datadog/__init__.py +0 -0
  124. hyperpocket/auth/datadog/context.py +15 -0
  125. hyperpocket/auth/datadog/token_context.py +11 -0
  126. hyperpocket/auth/datadog/token_handler.py +92 -0
  127. hyperpocket/auth/datadog/token_schema.py +11 -0
  128. hyperpocket/auth/discord/README.md +14 -0
  129. hyperpocket/auth/discord/__init__.py +0 -0
  130. hyperpocket/auth/discord/context.py +15 -0
  131. hyperpocket/auth/discord/oauth2_context.py +35 -0
  132. hyperpocket/auth/discord/oauth2_handler.py +133 -0
  133. hyperpocket/auth/discord/oauth2_schema.py +18 -0
  134. hyperpocket/auth/discord/token_context.py +11 -0
  135. hyperpocket/auth/discord/token_handler.py +92 -0
  136. hyperpocket/auth/discord/token_schema.py +11 -0
  137. hyperpocket/auth/discordbot/README.md +14 -0
  138. hyperpocket/auth/discordbot/__init__.py +0 -0
  139. hyperpocket/auth/discordbot/context.py +15 -0
  140. hyperpocket/auth/discordbot/token_context.py +11 -0
  141. hyperpocket/auth/discordbot/token_handler.py +92 -0
  142. hyperpocket/auth/discordbot/token_schema.py +11 -0
  143. hyperpocket/auth/elevenlabs/README.md +9 -0
  144. hyperpocket/auth/elevenlabs/__init__.py +0 -0
  145. hyperpocket/auth/elevenlabs/context.py +15 -0
  146. hyperpocket/auth/elevenlabs/token_context.py +11 -0
  147. hyperpocket/auth/elevenlabs/token_handler.py +92 -0
  148. hyperpocket/auth/elevenlabs/token_schema.py +11 -0
  149. hyperpocket/auth/exa/README.md +9 -0
  150. hyperpocket/auth/exa/__init__.py +0 -0
  151. hyperpocket/auth/exa/context.py +15 -0
  152. hyperpocket/auth/exa/token_context.py +11 -0
  153. hyperpocket/auth/exa/token_handler.py +85 -0
  154. hyperpocket/auth/exa/token_schema.py +11 -0
  155. hyperpocket/auth/facebook/README.md +13 -0
  156. hyperpocket/auth/facebook/__init__.py +0 -0
  157. hyperpocket/auth/facebook/context.py +15 -0
  158. hyperpocket/auth/facebook/oauth2_context.py +33 -0
  159. hyperpocket/auth/facebook/oauth2_handler.py +134 -0
  160. hyperpocket/auth/facebook/oauth2_schema.py +17 -0
  161. hyperpocket/auth/finage/README.md +9 -0
  162. hyperpocket/auth/finage/__init__.py +0 -0
  163. hyperpocket/auth/finage/context.py +15 -0
  164. hyperpocket/auth/finage/token_context.py +11 -0
  165. hyperpocket/auth/finage/token_handler.py +89 -0
  166. hyperpocket/auth/finage/token_schema.py +11 -0
  167. hyperpocket/auth/github/README.md +14 -0
  168. hyperpocket/auth/google/README.md +13 -0
  169. hyperpocket/auth/gumloop/README.md +9 -0
  170. hyperpocket/auth/happyrobot/README.md +9 -0
  171. hyperpocket/auth/happyrobot/__init__.py +0 -0
  172. hyperpocket/auth/happyrobot/context.py +15 -0
  173. hyperpocket/auth/happyrobot/token_context.py +11 -0
  174. hyperpocket/auth/happyrobot/token_handler.py +92 -0
  175. hyperpocket/auth/happyrobot/token_schema.py +9 -0
  176. hyperpocket/auth/heygen/README.md +9 -0
  177. hyperpocket/auth/heygen/__init__.py +0 -0
  178. hyperpocket/auth/heygen/context.py +15 -0
  179. hyperpocket/auth/heygen/token_context.py +11 -0
  180. hyperpocket/auth/heygen/token_handler.py +89 -0
  181. hyperpocket/auth/heygen/token_schema.py +11 -0
  182. hyperpocket/auth/hubspot/README.md +14 -0
  183. hyperpocket/auth/hubspot/__init__.py +0 -0
  184. hyperpocket/auth/hubspot/context.py +15 -0
  185. hyperpocket/auth/hubspot/oauth2_context.py +35 -0
  186. hyperpocket/auth/hubspot/oauth2_handler.py +142 -0
  187. hyperpocket/auth/hubspot/oauth2_schema.py +17 -0
  188. hyperpocket/auth/hubspot/token_context.py +11 -0
  189. hyperpocket/auth/hubspot/token_handler.py +92 -0
  190. hyperpocket/auth/hubspot/token_schema.py +11 -0
  191. hyperpocket/auth/jira/README.md +14 -0
  192. hyperpocket/auth/jira/__init__.py +0 -0
  193. hyperpocket/auth/jira/context.py +15 -0
  194. hyperpocket/auth/jira/oauth2_context.py +35 -0
  195. hyperpocket/auth/jira/oauth2_handler.py +135 -0
  196. hyperpocket/auth/jira/oauth2_schema.py +17 -0
  197. hyperpocket/auth/jira/token_context.py +11 -0
  198. hyperpocket/auth/jira/token_handler.py +87 -0
  199. hyperpocket/auth/jira/token_schema.py +11 -0
  200. hyperpocket/auth/klaviyo/README.md +10 -0
  201. hyperpocket/auth/klaviyo/__init__.py +0 -0
  202. hyperpocket/auth/klaviyo/context.py +15 -0
  203. hyperpocket/auth/klaviyo/token_context.py +11 -0
  204. hyperpocket/auth/klaviyo/token_handler.py +92 -0
  205. hyperpocket/auth/klaviyo/token_schema.py +11 -0
  206. hyperpocket/auth/lever/README.md +9 -0
  207. hyperpocket/auth/lever/__init__.py +0 -0
  208. hyperpocket/auth/lever/context.py +15 -0
  209. hyperpocket/auth/lever/token_context.py +11 -0
  210. hyperpocket/auth/lever/token_handler.py +89 -0
  211. hyperpocket/auth/lever/token_schema.py +11 -0
  212. hyperpocket/auth/lever_sandbox/README.md +9 -0
  213. hyperpocket/auth/lever_sandbox/__init__.py +0 -0
  214. hyperpocket/auth/lever_sandbox/context.py +15 -0
  215. hyperpocket/auth/lever_sandbox/token_context.py +11 -0
  216. hyperpocket/auth/lever_sandbox/token_handler.py +94 -0
  217. hyperpocket/auth/lever_sandbox/token_schema.py +11 -0
  218. hyperpocket/auth/linear/README.md +17 -0
  219. hyperpocket/auth/linear/context.py +1 -1
  220. hyperpocket/auth/linear/oauth2_context.py +33 -0
  221. hyperpocket/auth/linear/oauth2_handler.py +155 -0
  222. hyperpocket/auth/linear/oauth2_schema.py +17 -0
  223. hyperpocket/auth/linkedin/README.md +16 -0
  224. hyperpocket/auth/linkedin/__init__.py +0 -0
  225. hyperpocket/auth/linkedin/context.py +15 -0
  226. hyperpocket/auth/linkedin/oauth2_context.py +33 -0
  227. hyperpocket/auth/linkedin/oauth2_handler.py +154 -0
  228. hyperpocket/auth/linkedin/oauth2_schema.py +18 -0
  229. hyperpocket/auth/listennotes/README.md +12 -0
  230. hyperpocket/auth/listennotes/__init__.py +0 -0
  231. hyperpocket/auth/listennotes/context.py +15 -0
  232. hyperpocket/auth/listennotes/token_context.py +11 -0
  233. hyperpocket/auth/listennotes/token_handler.py +92 -0
  234. hyperpocket/auth/listennotes/token_schema.py +11 -0
  235. hyperpocket/auth/mailchimp/README.md +16 -0
  236. hyperpocket/auth/mailchimp/__init__.py +0 -0
  237. hyperpocket/auth/mailchimp/context.py +15 -0
  238. hyperpocket/auth/mailchimp/oauth2_context.py +33 -0
  239. hyperpocket/auth/mailchimp/oauth2_handler.py +153 -0
  240. hyperpocket/auth/mailchimp/oauth2_schema.py +17 -0
  241. hyperpocket/auth/mem0/README.md +11 -0
  242. hyperpocket/auth/mem0/__init__.py +0 -0
  243. hyperpocket/auth/mem0/context.py +15 -0
  244. hyperpocket/auth/mem0/token_context.py +11 -0
  245. hyperpocket/auth/mem0/token_handler.py +87 -0
  246. hyperpocket/auth/mem0/token_schema.py +11 -0
  247. hyperpocket/auth/microsoft_clarity/README.md +12 -0
  248. hyperpocket/auth/microsoft_clarity/__init__.py +0 -0
  249. hyperpocket/auth/microsoft_clarity/context.py +15 -0
  250. hyperpocket/auth/microsoft_clarity/token_context.py +15 -0
  251. hyperpocket/auth/microsoft_clarity/token_handler.py +102 -0
  252. hyperpocket/auth/microsoft_clarity/token_schema.py +11 -0
  253. hyperpocket/auth/neon/README.md +11 -0
  254. hyperpocket/auth/neon/__init__.py +0 -0
  255. hyperpocket/auth/neon/context.py +15 -0
  256. hyperpocket/auth/neon/token_context.py +11 -0
  257. hyperpocket/auth/neon/token_handler.py +87 -0
  258. hyperpocket/auth/neon/token_schema.py +11 -0
  259. hyperpocket/auth/ngrok/README.md +12 -0
  260. hyperpocket/auth/ngrok/__init__.py +0 -0
  261. hyperpocket/auth/ngrok/context.py +15 -0
  262. hyperpocket/auth/ngrok/token_context.py +11 -0
  263. hyperpocket/auth/ngrok/token_handler.py +89 -0
  264. hyperpocket/auth/ngrok/token_schema.py +11 -0
  265. hyperpocket/auth/notion/README.md +10 -20
  266. hyperpocket/auth/notion/oauth2_context.py +33 -0
  267. hyperpocket/auth/notion/oauth2_handler.py +152 -0
  268. hyperpocket/auth/notion/oauth2_schema.py +22 -0
  269. hyperpocket/auth/oncehub/README.md +11 -0
  270. hyperpocket/auth/oncehub/__init__.py +0 -0
  271. hyperpocket/auth/oncehub/context.py +15 -0
  272. hyperpocket/auth/oncehub/token_context.py +11 -0
  273. hyperpocket/auth/oncehub/token_handler.py +92 -0
  274. hyperpocket/auth/oncehub/token_schema.py +11 -0
  275. hyperpocket/auth/pagerduty/README.md +12 -0
  276. hyperpocket/auth/pagerduty/__init__.py +0 -0
  277. hyperpocket/auth/pagerduty/context.py +15 -0
  278. hyperpocket/auth/pagerduty/token_context.py +11 -0
  279. hyperpocket/auth/pagerduty/token_handler.py +92 -0
  280. hyperpocket/auth/pagerduty/token_schema.py +11 -0
  281. hyperpocket/auth/pandadoc/README.md +12 -0
  282. hyperpocket/auth/pandadoc/__init__.py +0 -0
  283. hyperpocket/auth/pandadoc/context.py +15 -0
  284. hyperpocket/auth/pandadoc/token_context.py +11 -0
  285. hyperpocket/auth/pandadoc/token_handler.py +92 -0
  286. hyperpocket/auth/pandadoc/token_schema.py +11 -0
  287. hyperpocket/auth/pipedrive/README.md +12 -0
  288. hyperpocket/auth/pipedrive/__init__.py +0 -0
  289. hyperpocket/auth/pipedrive/context.py +15 -0
  290. hyperpocket/auth/pipedrive/token_context.py +11 -0
  291. hyperpocket/auth/pipedrive/token_handler.py +92 -0
  292. hyperpocket/auth/pipedrive/token_schema.py +11 -0
  293. hyperpocket/auth/posthog/README.md +12 -0
  294. hyperpocket/auth/posthog/__init__.py +0 -0
  295. hyperpocket/auth/posthog/context.py +15 -0
  296. hyperpocket/auth/posthog/token_context.py +11 -0
  297. hyperpocket/auth/posthog/token_handler.py +92 -0
  298. hyperpocket/auth/posthog/token_schema.py +11 -0
  299. hyperpocket/auth/provider.py +59 -0
  300. hyperpocket/auth/ravenseotools/README.md +12 -0
  301. hyperpocket/auth/ravenseotools/__init__.py +0 -0
  302. hyperpocket/auth/ravenseotools/context.py +15 -0
  303. hyperpocket/auth/ravenseotools/token_context.py +11 -0
  304. hyperpocket/auth/ravenseotools/token_handler.py +94 -0
  305. hyperpocket/auth/ravenseotools/token_schema.py +11 -0
  306. hyperpocket/auth/reddit/README.md +16 -0
  307. hyperpocket/auth/salesforce/README.md +16 -0
  308. hyperpocket/auth/salesforce/__init__.py +0 -0
  309. hyperpocket/auth/salesforce/context.py +15 -0
  310. hyperpocket/auth/salesforce/oauth2_context.py +33 -0
  311. hyperpocket/auth/salesforce/oauth2_handler.py +136 -0
  312. hyperpocket/auth/salesforce/oauth2_schema.py +21 -0
  313. hyperpocket/auth/sendgrid/README.md +12 -0
  314. hyperpocket/auth/sendgrid/__init__.py +0 -0
  315. hyperpocket/auth/sendgrid/context.py +15 -0
  316. hyperpocket/auth/sendgrid/token_context.py +11 -0
  317. hyperpocket/auth/sendgrid/token_handler.py +92 -0
  318. hyperpocket/auth/sendgrid/token_schema.py +11 -0
  319. hyperpocket/auth/serpapi/README.md +13 -0
  320. hyperpocket/auth/serpapi/__init__.py +0 -0
  321. hyperpocket/auth/serpapi/context.py +15 -0
  322. hyperpocket/auth/serpapi/token_context.py +11 -0
  323. hyperpocket/auth/serpapi/token_handler.py +96 -0
  324. hyperpocket/auth/serpapi/token_schema.py +11 -0
  325. hyperpocket/auth/slack/README.md +17 -0
  326. hyperpocket/auth/spotify/README.md +15 -0
  327. hyperpocket/auth/spotify/__init__.py +0 -0
  328. hyperpocket/auth/spotify/context.py +15 -0
  329. hyperpocket/auth/spotify/oauth2_context.py +33 -0
  330. hyperpocket/auth/spotify/oauth2_handler.py +163 -0
  331. hyperpocket/auth/spotify/oauth2_schema.py +18 -0
  332. hyperpocket/auth/stripe/README.md +12 -0
  333. hyperpocket/auth/stripe/__init__.py +0 -0
  334. hyperpocket/auth/stripe/context.py +15 -0
  335. hyperpocket/auth/stripe/token_context.py +11 -0
  336. hyperpocket/auth/stripe/token_handler.py +89 -0
  337. hyperpocket/auth/stripe/token_schema.py +11 -0
  338. hyperpocket/auth/supabase/README.md +11 -0
  339. hyperpocket/auth/supabase/__init__.py +0 -0
  340. hyperpocket/auth/supabase/context.py +15 -0
  341. hyperpocket/auth/supabase/token_context.py +11 -0
  342. hyperpocket/auth/supabase/token_handler.py +92 -0
  343. hyperpocket/auth/supabase/token_schema.py +11 -0
  344. hyperpocket/auth/tavily/README.md +11 -0
  345. hyperpocket/auth/tavily/__init__.py +0 -0
  346. hyperpocket/auth/tavily/context.py +15 -0
  347. hyperpocket/auth/tavily/token_context.py +11 -0
  348. hyperpocket/auth/tavily/token_handler.py +89 -0
  349. hyperpocket/auth/tavily/token_schema.py +11 -0
  350. hyperpocket/auth/timekit/README.md +11 -0
  351. hyperpocket/auth/timekit/__init__.py +0 -0
  352. hyperpocket/auth/timekit/context.py +15 -0
  353. hyperpocket/auth/timekit/token_context.py +11 -0
  354. hyperpocket/auth/timekit/token_handler.py +92 -0
  355. hyperpocket/auth/timekit/token_schema.py +11 -0
  356. hyperpocket/auth/trello/README.md +12 -0
  357. hyperpocket/auth/trello/__init__.py +0 -0
  358. hyperpocket/auth/trello/context.py +15 -0
  359. hyperpocket/auth/trello/token_context.py +11 -0
  360. hyperpocket/auth/trello/token_handler.py +89 -0
  361. hyperpocket/auth/trello/token_schema.py +11 -0
  362. hyperpocket/auth/wandb/README.md +11 -0
  363. hyperpocket/auth/wandb/__init__.py +0 -0
  364. hyperpocket/auth/wandb/context.py +15 -0
  365. hyperpocket/auth/wandb/token_context.py +11 -0
  366. hyperpocket/auth/wandb/token_handler.py +89 -0
  367. hyperpocket/auth/wandb/token_schema.py +9 -0
  368. hyperpocket/auth/workiom/README.md +12 -0
  369. hyperpocket/auth/workiom/__init__.py +0 -0
  370. hyperpocket/auth/workiom/context.py +15 -0
  371. hyperpocket/auth/workiom/token_context.py +11 -0
  372. hyperpocket/auth/workiom/token_handler.py +92 -0
  373. hyperpocket/auth/workiom/token_schema.py +11 -0
  374. hyperpocket/auth/x/README.md +15 -0
  375. hyperpocket/auth/zoom/README.md +16 -0
  376. hyperpocket/auth/zoom/__init__.py +0 -0
  377. hyperpocket/auth/zoom/context.py +15 -0
  378. hyperpocket/auth/zoom/oauth2_context.py +33 -0
  379. hyperpocket/auth/zoom/oauth2_handler.py +153 -0
  380. hyperpocket/auth/zoom/oauth2_schema.py +19 -0
  381. hyperpocket/cli/__main__.py +4 -1
  382. hyperpocket/cli/auth_oauth2.py +79 -38
  383. hyperpocket/cli/auth_token.py +28 -16
  384. hyperpocket/cli/codegen/auth/__init__.py +4 -1
  385. hyperpocket/cli/codegen/auth/auth_context_template.py +1 -1
  386. hyperpocket/cli/codegen/auth/auth_oauth2_context_template.py +5 -4
  387. hyperpocket/cli/codegen/auth/auth_oauth2_handler_template.py +20 -45
  388. hyperpocket/cli/codegen/auth/auth_oauth2_schema_template.py +4 -3
  389. hyperpocket/cli/codegen/auth/auth_token_context_template.py +6 -6
  390. hyperpocket/cli/codegen/auth/auth_token_handler_template.py +14 -14
  391. hyperpocket/cli/codegen/auth/auth_token_schema_template.py +3 -3
  392. hyperpocket/cli/codegen/auth/server_auth_template.py +20 -5
  393. hyperpocket/cli/codegen/tool/__init__.py +1 -1
  394. hyperpocket/cli/codegen/tool/tool_main_template.py +1 -0
  395. hyperpocket/cli/{tool.py → tool_create.py} +24 -19
  396. hyperpocket/cli/tool_export.py +240 -0
  397. hyperpocket/config/auth.py +78 -13
  398. hyperpocket/pocket_core.py +5 -3
  399. hyperpocket/server/auth/activeloop.py +25 -0
  400. hyperpocket/server/auth/adobe.py +14 -0
  401. hyperpocket/server/auth/affinity.py +14 -0
  402. hyperpocket/server/auth/agentql.py +25 -0
  403. hyperpocket/server/auth/ahrefs.py +14 -0
  404. hyperpocket/server/auth/airtable.py +14 -0
  405. hyperpocket/server/auth/alchemy.py +14 -0
  406. hyperpocket/server/auth/altoviz.py +14 -0
  407. hyperpocket/server/auth/apitoken.py +16 -0
  408. hyperpocket/server/auth/asana.py +25 -0
  409. hyperpocket/server/auth/bamboohr.py +14 -0
  410. hyperpocket/server/auth/bitbucket.py +25 -0
  411. hyperpocket/server/auth/bitwarden.py +14 -0
  412. hyperpocket/server/auth/brevo.py +14 -0
  413. hyperpocket/server/auth/brex.py +14 -0
  414. hyperpocket/server/auth/cal.py +14 -0
  415. hyperpocket/server/auth/canvas.py +14 -0
  416. hyperpocket/server/auth/clickup.py +14 -0
  417. hyperpocket/server/auth/cloudflare.py +14 -0
  418. hyperpocket/server/auth/dailybot.py +14 -0
  419. hyperpocket/server/auth/datadog.py +14 -0
  420. hyperpocket/server/auth/discord.py +25 -0
  421. hyperpocket/server/auth/discordbot.py +14 -0
  422. hyperpocket/server/auth/elevenlabs.py +14 -0
  423. hyperpocket/server/auth/exa.py +14 -0
  424. hyperpocket/server/auth/facebook.py +25 -0
  425. hyperpocket/server/auth/finage.py +14 -0
  426. hyperpocket/server/auth/happyrobot.py +26 -0
  427. hyperpocket/server/auth/heygen.py +14 -0
  428. hyperpocket/server/auth/hubspot.py +26 -0
  429. hyperpocket/server/auth/jira.py +25 -0
  430. hyperpocket/server/auth/klaviyo.py +14 -0
  431. hyperpocket/server/auth/lever.py +14 -0
  432. hyperpocket/server/auth/lever_sandbox.py +14 -0
  433. hyperpocket/server/auth/linear.py +21 -2
  434. hyperpocket/server/auth/linkedin.py +25 -0
  435. hyperpocket/server/auth/listennotes.py +14 -0
  436. hyperpocket/server/auth/mailchimp.py +25 -0
  437. hyperpocket/server/auth/mem0.py +14 -0
  438. hyperpocket/server/auth/microsoft_clarity.py +14 -0
  439. hyperpocket/server/auth/neon.py +14 -0
  440. hyperpocket/server/auth/ngrok.py +14 -0
  441. hyperpocket/server/auth/notion.py +20 -1
  442. hyperpocket/server/auth/oncehub.py +14 -0
  443. hyperpocket/server/auth/pagerduty.py +14 -0
  444. hyperpocket/server/auth/pandadoc.py +14 -0
  445. hyperpocket/server/auth/pipedrive.py +14 -0
  446. hyperpocket/server/auth/posthog.py +14 -0
  447. hyperpocket/server/auth/ravenseotools.py +14 -0
  448. hyperpocket/server/auth/salesforce.py +25 -0
  449. hyperpocket/server/auth/sendgrid.py +14 -0
  450. hyperpocket/server/auth/serpapi.py +14 -0
  451. hyperpocket/server/auth/spotify.py +25 -0
  452. hyperpocket/server/auth/stripe.py +14 -0
  453. hyperpocket/server/auth/supabase.py +14 -0
  454. hyperpocket/server/auth/tavily.py +14 -0
  455. hyperpocket/server/auth/timekit.py +14 -0
  456. hyperpocket/server/auth/trello.py +14 -0
  457. hyperpocket/server/auth/wandb.py +25 -0
  458. hyperpocket/server/auth/workiom.py +14 -0
  459. hyperpocket/server/auth/zoom.py +25 -0
  460. hyperpocket/server/server.py +9 -6
  461. {hyperpocket-0.3.3.dist-info → hyperpocket-0.3.5.dist-info}/METADATA +1 -1
  462. hyperpocket-0.3.5.dist-info/RECORD +587 -0
  463. hyperpocket-0.3.3.dist-info/RECORD +0 -150
  464. {hyperpocket-0.3.3.dist-info → hyperpocket-0.3.5.dist-info}/WHEEL +0 -0
  465. {hyperpocket-0.3.3.dist-info → hyperpocket-0.3.5.dist-info}/entry_points.txt +0 -0
@@ -2,13 +2,13 @@ from jinja2 import Template
2
2
 
3
3
 
4
4
  def get_auth_token_context_template() -> Template:
5
- return Template("""
6
- from hyperpocket.auth.{{ service_name }}.context import {{ caplitalized_service_name }}AuthContext
7
- from hyperpocket.auth.{{ service_name }}.token_schema import {{ caplitalized_service_name }}TokenResponse
8
- class {{ caplitalized_service_name }}TokenAuthContext({{ caplitalized_service_name }}AuthContext):
5
+ return Template("""\
6
+ from hyperpocket.auth.{{ service_name }}.context import {{ capitalized_service_name }}AuthContext
7
+ from hyperpocket.auth.{{ service_name }}.token_schema import {{ capitalized_service_name }}TokenResponse
8
+ class {{ capitalized_service_name }}TokenAuthContext({{ capitalized_service_name }}AuthContext):
9
9
  @classmethod
10
- def from_{{ service_name }}_token_response(cls, response: {{ caplitalized_service_name }}TokenResponse):
11
- description = f'{{ caplitalized_service_name }} Token Context logged in'
10
+ def from_{{ service_name }}_token_response(cls, response: {{ capitalized_service_name }}TokenResponse):
11
+ description = f'{{ capitalized_service_name }} Token Context logged in'
12
12
  return cls(
13
13
  access_token=response.access_token,
14
14
  description=description,
@@ -2,22 +2,22 @@ from jinja2 import Template
2
2
 
3
3
 
4
4
  def get_auth_token_handler_template() -> Template:
5
- return Template("""
5
+ return Template("""\
6
6
  from typing import Optional
7
7
  from urllib.parse import urljoin, urlencode
8
8
 
9
9
  from hyperpocket.auth import AuthProvider
10
10
  from hyperpocket.auth.context import AuthContext
11
11
  from hyperpocket.auth.handler import AuthHandlerInterface, AuthenticateRequest
12
- from hyperpocket.auth.{{ service_name }}.token_context import {{ caplitalized_service_name }}TokenAuthContext
13
- from hyperpocket.auth.{{ service_name }}.token_schema import {{ caplitalized_service_name }}TokenResponse, {{ caplitalized_service_name }}TokenRequest
12
+ from hyperpocket.auth.{{ service_name }}.token_context import {{ capitalized_service_name }}TokenAuthContext
13
+ from hyperpocket.auth.{{ service_name }}.token_schema import {{ capitalized_service_name }}TokenResponse, {{ capitalized_service_name }}TokenRequest
14
14
  from hyperpocket.config import config
15
15
  from hyperpocket.futures import FutureStore
16
16
 
17
17
 
18
- class {{ caplitalized_service_name }}TokenAuthHandler(AuthHandlerInterface):
18
+ class {{ capitalized_service_name }}TokenAuthHandler(AuthHandlerInterface):
19
19
  name: str = "{{ auth_handler_name }}-token"
20
- description: str = "This handler is used to authenticate users using the {{ caplitalized_service_name }} token."
20
+ description: str = "This handler is used to authenticate users using the {{ capitalized_service_name }} token."
21
21
  scoped: bool = False
22
22
 
23
23
  _TOKEN_URL: str = urljoin(config().public_base_url + "/", f"{config().callback_url_rewrite_prefix}/auth/token")
@@ -30,7 +30,7 @@ class {{ caplitalized_service_name }}TokenAuthHandler(AuthHandlerInterface):
30
30
  def recommended_scopes() -> set[str]:
31
31
  return set()
32
32
 
33
- def prepare(self, auth_req: {{ caplitalized_service_name }}TokenRequest, thread_id: str, profile: str,
33
+ def prepare(self, auth_req: {{ capitalized_service_name }}TokenRequest, thread_id: str, profile: str,
34
34
  future_uid: str, *args, **kwargs) -> str:
35
35
  redirect_uri = urljoin(
36
36
  config().public_base_url + "/",
@@ -45,19 +45,19 @@ class {{ caplitalized_service_name }}TokenAuthHandler(AuthHandlerInterface):
45
45
 
46
46
  return f'User needs to authenticate using the following URL: {url}'
47
47
 
48
- async def authenticate(self, auth_req: {{ caplitalized_service_name }}TokenRequest, future_uid: str, *args, **kwargs) -> AuthContext:
48
+ async def authenticate(self, auth_req: {{ capitalized_service_name }}TokenRequest, future_uid: str, *args, **kwargs) -> AuthContext:
49
49
  future_data = FutureStore.get_future(future_uid)
50
50
  access_token = await future_data.future
51
51
 
52
- response = {{ caplitalized_service_name }}TokenResponse(access_token=access_token)
53
- context = {{ caplitalized_service_name }}TokenAuthContext.from_{{ service_name }}_token_response(response)
52
+ response = {{ capitalized_service_name }}TokenResponse(access_token=access_token)
53
+ context = {{ capitalized_service_name }}TokenAuthContext.from_{{ service_name }}_token_response(response)
54
54
 
55
55
  return context
56
56
 
57
- async def refresh(self, auth_req: {{ caplitalized_service_name }}TokenRequest, context: AuthContext, *args, **kwargs) -> AuthContext:
58
- raise Exception("{{ caplitalized_service_name }} token doesn't support refresh")
57
+ async def refresh(self, auth_req: {{ capitalized_service_name }}TokenRequest, context: AuthContext, *args, **kwargs) -> AuthContext:
58
+ raise Exception("{{ capitalized_service_name }} token doesn't support refresh")
59
59
 
60
- def _make_auth_url(self, auth_req: {{ caplitalized_service_name }}TokenRequest, redirect_uri: str, state: str):
60
+ def _make_auth_url(self, auth_req: {{ capitalized_service_name }}TokenRequest, redirect_uri: str, state: str):
61
61
  params = {
62
62
  "redirect_uri": redirect_uri,
63
63
  "state": state,
@@ -65,6 +65,6 @@ class {{ caplitalized_service_name }}TokenAuthHandler(AuthHandlerInterface):
65
65
  auth_url = f"{self._TOKEN_URL}?{urlencode(params)}"
66
66
  return auth_url
67
67
 
68
- def make_request(self, auth_scopes: Optional[list[str]] = None, **kwargs) -> {{ caplitalized_service_name }}TokenRequest:
69
- return {{ caplitalized_service_name }}TokenRequest()
68
+ def make_request(self, auth_scopes: Optional[list[str]] = None, **kwargs) -> {{ capitalized_service_name }}TokenRequest:
69
+ return {{ capitalized_service_name }}TokenRequest()
70
70
  """)
@@ -2,12 +2,12 @@ from jinja2 import Template
2
2
 
3
3
 
4
4
  def get_auth_token_schema_template() -> Template:
5
- return Template("""
5
+ return Template("""\
6
6
  from typing import List, Optional
7
7
  from pydantic import BaseModel
8
8
  from hyperpocket.auth.schema import AuthenticateRequest, AuthenticateResponse
9
- class {{ caplitalized_service_name }}TokenRequest(AuthenticateRequest):
9
+ class {{ capitalized_service_name }}TokenRequest(AuthenticateRequest):
10
10
  pass
11
- class {{ caplitalized_service_name }}TokenResponse(AuthenticateResponse):
11
+ class {{ capitalized_service_name }}TokenResponse(AuthenticateResponse):
12
12
  access_token: str
13
13
  """)
@@ -2,24 +2,39 @@ from jinja2 import Template
2
2
 
3
3
 
4
4
  def get_server_auth_token_template() -> Template:
5
- return Template('''
5
+ return Template("""\
6
6
  from fastapi import APIRouter
7
7
  from starlette.responses import HTMLResponse
8
8
  from hyperpocket.futures import FutureStore
9
+
9
10
  {{ service_name }}_auth_router = APIRouter(
10
11
  prefix="/{{ service_name }}"
11
12
  )
13
+
14
+
15
+ @{{ service_name }}_auth_router.get("/oauth2/callback")
16
+ async def {{ service_name }}_oauth2_callback(state: str, code: str):
17
+ try:
18
+ FutureStore.resolve_future(state, code)
19
+ except ValueError:
20
+ return HTMLResponse(content="failed")
21
+
22
+ return HTMLResponse(content="success")
23
+
24
+
12
25
  @{{ service_name }}_auth_router.get("/token/callback")
13
26
  async def {{ service_name }}_token_callback(state: str, token: str):
14
27
  try:
15
28
  FutureStore.resolve_future(state, token)
16
29
  except ValueError:
17
30
  return HTMLResponse(content="failed")
31
+
18
32
  return HTMLResponse(content="success")
19
- ''')
20
-
33
+ """)
34
+
35
+
21
36
  def get_server_auth_oauth2_template() -> Template:
22
- return Template('''
37
+ return Template("""\
23
38
  from fastapi import APIRouter
24
39
  from starlette.responses import HTMLResponse
25
40
  from hyperpocket.futures import FutureStore
@@ -47,4 +62,4 @@ async def {{ service_name }}_token_callback(state: str, token: str):
47
62
  return HTMLResponse(content="failed")
48
63
 
49
64
  return HTMLResponse(content="success")
50
- ''')
65
+ """)
@@ -1,3 +1,3 @@
1
1
  from .tool_main_template import get_tool_main_template
2
2
 
3
- __all__ = ["get_tool_main_template"]
3
+ __all__ = ["get_tool_main_template"]
@@ -1,5 +1,6 @@
1
1
  from jinja2 import Template
2
2
 
3
+
3
4
  def get_tool_main_template() -> Template:
4
5
  return Template('''import json
5
6
  import os
@@ -9,16 +9,20 @@ from hyperpocket.cli.codegen.tool import get_tool_main_template
9
9
 
10
10
 
11
11
  @click.command()
12
- @click.argument('tool_name', type=str)
12
+ @click.argument("tool_name", type=str)
13
13
  def create_tool_template(tool_name, language="python"):
14
14
  """Create a tool template with the specified tool name."""
15
15
 
16
16
  # Validate tool_name
17
- if not tool_name.islower() or not tool_name.replace('_', '').isalpha():
18
- raise ValueError("tool_name must be lowercase and contain only letters and underscores")
17
+ if not tool_name.islower() or not tool_name.replace("_", "").isalpha():
18
+ raise ValueError(
19
+ "tool_name must be lowercase and contain only letters and underscores"
20
+ )
19
21
 
20
- tool_directory_name = tool_name.replace('_', '-')
21
- capitalized_tool_name = ''.join([word.capitalize() for word in tool_name.split('_')])
22
+ tool_directory_name = tool_name.replace("_", "-")
23
+ capitalized_tool_name = "".join(
24
+ [word.capitalize() for word in tool_name.split("_")]
25
+ )
22
26
 
23
27
  # Create tool directory
24
28
  print(f"Generating tool package directory for {tool_name}")
@@ -37,31 +41,32 @@ def create_tool_template(tool_name, language="python"):
37
41
  subprocess.run(["uv", "init"], cwd=tool_path, check=True)
38
42
  os.remove(tool_path / "hello.py")
39
43
  elif shutil.which("poetry"):
40
- subprocess.run(["poetry", "init", "--no-interaction"], cwd=tool_path, check=True)
44
+ subprocess.run(
45
+ ["poetry", "init", "--no-interaction"], cwd=tool_path, check=True
46
+ )
41
47
  else:
42
48
  raise ValueError("uv or poetry must be installed to generate tool project")
43
49
 
44
50
  # Create __init__.py file
45
- init_file = tool_module_path / '__init__.py'
51
+ init_file = tool_module_path / "__init__.py"
46
52
  if not init_file.exists():
47
- init_file.write_text(f'''from .__main__ import main
53
+ init_file.write_text(f"""from .__main__ import main
48
54
 
49
55
  __all__ = ["main"]
50
- ''')
56
+ """)
51
57
 
52
58
  # Create __main__.py file
53
59
  print(f"Generating tool main file for {tool_name}")
54
- main_file = tool_module_path / '__main__.py'
60
+ main_file = tool_module_path / "__main__.py"
55
61
  if not main_file.exists():
56
62
  main_content = get_tool_main_template().render(
57
- capitalized_tool_name=capitalized_tool_name,
58
- tool_name=tool_name
63
+ capitalized_tool_name=capitalized_tool_name, tool_name=tool_name
59
64
  )
60
65
  main_file.write_text(main_content)
61
66
 
62
67
  # Create config.toml
63
68
  print(f"Generating config.toml file for {tool_name}")
64
- config_file = tool_path / 'config.toml'
69
+ config_file = tool_path / "config.toml"
65
70
  if not config_file.exists():
66
71
  config_file.write_text(f'''name = "{tool_name}"
67
72
  description = ""
@@ -75,23 +80,23 @@ scopes = []
75
80
 
76
81
  # Create .gitignore
77
82
  print(f"Generating .gitignore file for {tool_name}")
78
- gitignore_file = tool_path / '.gitignore'
83
+ gitignore_file = tool_path / ".gitignore"
79
84
  gitignore_file.touch()
80
85
 
81
86
  # Create README.md
82
87
  print(f"Generating README.md file for {tool_name}")
83
- readme_file = tool_path / 'README.md'
88
+ readme_file = tool_path / "README.md"
84
89
  if not readme_file.exists():
85
- readme_file.write_text(f'# {tool_name}\n\n')
90
+ readme_file.write_text(f"# {tool_name}\n\n")
86
91
 
87
92
  # Create schema.json
88
93
  print(f"Generating schema.json file for {tool_name}")
89
- schema_file = tool_path / 'schema.json'
94
+ schema_file = tool_path / "schema.json"
90
95
  schema_file.touch()
91
96
 
92
97
 
93
98
  @click.command()
94
- @click.argument('tool_path', type=str, required=False)
99
+ @click.argument("tool_path", type=str, required=False)
95
100
  def build_tool(tool_path):
96
101
  """Build the tool at the specified path or current directory."""
97
102
 
@@ -99,7 +104,7 @@ def build_tool(tool_path):
99
104
 
100
105
  # Determine the tool directory
101
106
  if tool_path is None:
102
- if not (cwd / 'config.toml').exists():
107
+ if not (cwd / "config.toml").exists():
103
108
  raise ValueError("Current working directory must be a tool directory")
104
109
  else:
105
110
  potential_path = Path(tool_path)
@@ -0,0 +1,240 @@
1
+ import os
2
+ import re
3
+ import ast
4
+ import json
5
+ import toml
6
+ import importlib
7
+ import inspect
8
+ import shutil
9
+ from typing import Callable
10
+ from pathlib import Path
11
+ import click
12
+
13
+ from hyperpocket.cli.tool_create import create_tool_template
14
+
15
+
16
+ @click.command()
17
+ @click.argument("target", type=str, required=False)
18
+ def export_tool(target, language="python"):
19
+ """Convert the specified tool to a local tool."""
20
+
21
+ target_path = Path.cwd() / target if target else Path.cwd()
22
+
23
+ if target_path.is_file():
24
+ process_tool_file(target_path, language)
25
+ elif target_path.is_dir():
26
+ process_tool_directory(target_path, language)
27
+ else:
28
+ raise ValueError("Invalid target path")
29
+
30
+
31
+ def process_tool_file(target_path: Path, language: str):
32
+ """Process a single Python file containing function_tool decorated functions."""
33
+ decorated_functions = find_function_tool_decorated_functions(target_path)
34
+
35
+ if not decorated_functions:
36
+ raise ValueError("No function_tool decorated functions found in target file")
37
+ if len(decorated_functions) > 1:
38
+ raise ValueError(
39
+ "Multiple function_tool decorated functions found in target file"
40
+ )
41
+
42
+ func = load_functions_as_callable(decorated_functions, target_path)
43
+ tool_name = func.func.__name__.replace("-", "_")
44
+ cleaned_code = clean_tool_source_code(target_path.read_text())
45
+ tool_main_code = transform_function_to_pydantic(cleaned_code, func)
46
+
47
+ generate_tool_template(tool_name)
48
+ generate_tool_files(target_path, tool_name, tool_main_code, func, language)
49
+
50
+
51
+ def process_tool_directory(target_path: Path, language: str):
52
+ """Process a directory containing function_tool decorated functions."""
53
+ decorated_function_file = None
54
+
55
+ for file in target_path.glob("*.py"):
56
+ decorated_functions = find_function_tool_decorated_functions(file)
57
+ if len(decorated_functions) == 1:
58
+ decorated_function_file = file
59
+ break
60
+ elif len(decorated_functions) > 1:
61
+ raise ValueError(
62
+ "Multiple function_tool decorated functions found in target file"
63
+ )
64
+
65
+ if not decorated_function_file:
66
+ raise ValueError(
67
+ "No function_tool decorated functions found in target directory"
68
+ )
69
+
70
+ func = load_functions_as_callable(decorated_functions, decorated_function_file)
71
+ tool_name = func.func.__name__.replace("-", "_")
72
+ cleaned_code = clean_tool_source_code(decorated_function_file.read_text())
73
+ tool_main_code = transform_function_to_pydantic(cleaned_code, func)
74
+
75
+ if tool_name != decorated_function_file.stem:
76
+ raise ValueError("Tool name must match the file name")
77
+
78
+ generate_tool_template(tool_name)
79
+ copy_tool_directory(target_path, tool_name)
80
+ generate_tool_files(target_path, tool_name, tool_main_code, func, language)
81
+
82
+
83
+ def find_function_tool_decorated_functions(file_path: Path):
84
+ """Find all functions decorated with @function_tool in a given Python file."""
85
+ with open(file_path, "r", encoding="utf-8") as f:
86
+ source_code = f.read()
87
+
88
+ tree = ast.parse(source_code)
89
+ decorated_functions = [
90
+ node.name
91
+ for node in ast.walk(tree)
92
+ if isinstance(node, ast.FunctionDef)
93
+ and any(
94
+ isinstance(decorator, ast.Call) and decorator.func.id == "function_tool"
95
+ for decorator in node.decorator_list
96
+ )
97
+ ]
98
+
99
+ return decorated_functions
100
+
101
+
102
+ def load_functions_as_callable(decorated_functions, file_path: Path):
103
+ """Load function_tool decorated function as a callable object."""
104
+ module_name = file_path.stem
105
+ spec = importlib.util.spec_from_file_location(module_name, str(file_path))
106
+ module = importlib.util.module_from_spec(spec)
107
+ spec.loader.exec_module(module)
108
+
109
+ return getattr(module, decorated_functions[0])
110
+
111
+
112
+ def clean_tool_source_code(source_code: str) -> str:
113
+ """Remove hyperpocket import, function_tool decorator, and main execution block."""
114
+ source_code = re.sub(
115
+ r"^from hyperpocket\.tool .*?\n", "", source_code, flags=re.MULTILINE
116
+ )
117
+ source_code = re.sub(
118
+ r"@function_tool\([\s\S]*?\)\n", "", source_code, flags=re.MULTILINE
119
+ )
120
+ source_code = re.sub(
121
+ r"\nif __name__ == [\"']__main__[\"']:[\s\S]*",
122
+ "",
123
+ source_code,
124
+ flags=re.MULTILINE,
125
+ )
126
+ return source_code.strip()
127
+
128
+
129
+ def transform_function_to_pydantic(tool_source_code: str, func: Callable):
130
+ """Transform function into a Pydantic-based CLI tool."""
131
+ function_code = extract_function_code(func)
132
+
133
+ tree = ast.parse(function_code)
134
+ function_name = func.func.__name__
135
+
136
+ for node in tree.body:
137
+ if isinstance(node, ast.FunctionDef) and node.name == function_name:
138
+ params = {
139
+ arg.arg: arg.annotation.id
140
+ for arg in node.args.args
141
+ if isinstance(arg.annotation, ast.Name)
142
+ }
143
+ properties = func.argument_json_schema["properties"]
144
+
145
+ model_name = function_name.title().replace("_", "") + "Request"
146
+ model_fields = [
147
+ f' {name}: {type_} = Field(..., description="{properties[name]["description"]}")'
148
+ for name, type_ in params.items()
149
+ ]
150
+ model_code = (
151
+ f"class {model_name}(BaseModel):\n" + "\n".join(model_fields) + "\n"
152
+ )
153
+
154
+ main_code = f"""def main():
155
+ req = json.load(sys.stdin.buffer)
156
+ req_typed = {model_name}.model_validate(req)
157
+ response = {function_name}(**req_typed.model_dump())
158
+
159
+ print(json.dumps(response))
160
+
161
+
162
+ if __name__ == "__main__":
163
+ main()
164
+ """
165
+ import_code = """import json
166
+ import os
167
+ import sys
168
+
169
+ from pydantic import BaseModel, Field
170
+ """
171
+ return (
172
+ import_code
173
+ + "\n"
174
+ + tool_source_code
175
+ + "\n\n"
176
+ + model_code
177
+ + "\n"
178
+ + main_code
179
+ )
180
+
181
+ return None
182
+
183
+
184
+ def extract_function_code(func: Callable) -> str:
185
+ """Extract function definition as a string."""
186
+ tool_source_code = inspect.getsource(func.func.__code__)
187
+ match = re.search(r"def\s+\w+\(.*\):[\s\S]*", tool_source_code)
188
+ return match.group(0) if match else ""
189
+
190
+
191
+ def generate_tool_template(tool_name: str):
192
+ """Generate tool template using Click context forwarding."""
193
+ ctx = click.Context(create_tool_template)
194
+ ctx.forward(create_tool_template, tool_name=tool_name)
195
+
196
+
197
+ def copy_tool_directory(src_path: Path, tool_name: str):
198
+ """Copy the tool directory to the new tool directory."""
199
+ tool_directory_name = tool_name.replace("_", "-")
200
+ dst_path = src_path.parent / tool_directory_name / tool_name
201
+
202
+ if dst_path.exists():
203
+ shutil.rmtree(dst_path)
204
+
205
+ shutil.copytree(src_path, dst_path)
206
+ os.remove(dst_path / f"{tool_name}.py")
207
+
208
+ init_file = src_path.parent / tool_directory_name / tool_name / "__init__.py"
209
+ init_file.write_text(f"from .__main__ import main\n\n__all__ = ['main']")
210
+
211
+
212
+ def generate_tool_files(
213
+ target_path: Path,
214
+ tool_name: str,
215
+ tool_main_code: str,
216
+ func: Callable,
217
+ language: str,
218
+ ):
219
+ """Generate config.toml, __main__.py, and schema.json for the tool."""
220
+ tool_directory_name = tool_name.replace("_", "-")
221
+
222
+ config_file = target_path.parent / tool_directory_name / "config.toml"
223
+ config_data = {
224
+ "name": func.name,
225
+ "description": func.description,
226
+ "language": language,
227
+ "auth": json.loads(func.auth.model_dump_json()),
228
+ "tool_vars": func.default_tool_vars,
229
+ }
230
+
231
+ with open(config_file, "w", encoding="utf-8") as f:
232
+ f.write(toml.dumps(config_data))
233
+
234
+ main_file = target_path.parent / tool_directory_name / tool_name / "__main__.py"
235
+ with open(main_file, "w", encoding="utf-8") as f:
236
+ f.write(tool_main_code)
237
+
238
+ schema_file = target_path.parent / tool_directory_name / "schema.json"
239
+ with open(schema_file, "w", encoding="utf-8") as f:
240
+ f.write(json.dumps(func.argument_json_schema, indent=4))
@@ -7,29 +7,81 @@ class BaseAuthConfig(BaseModel):
7
7
  use_recommended_scope: bool = Field(default=True)
8
8
 
9
9
 
10
- class SlackAuthConfig(BaseAuthConfig):
10
+ class OAuth2AuthConfig(BaseAuthConfig):
11
11
  client_id: str
12
12
  client_secret: str
13
13
 
14
14
 
15
- class GoogleAuthConfig(BaseAuthConfig):
16
- client_id: str
17
- client_secret: str
15
+ class SlackAuthConfig(OAuth2AuthConfig):
16
+ pass
18
17
 
19
18
 
20
- class GithubAuthConfig(BaseAuthConfig):
21
- client_id: str
22
- client_secret: str
19
+ class GoogleAuthConfig(OAuth2AuthConfig):
20
+ pass
23
21
 
24
22
 
25
- class CalendlyAuthConfig(BaseAuthConfig):
26
- client_id: str
27
- client_secret: str
23
+ class GithubAuthConfig(OAuth2AuthConfig):
24
+ pass
28
25
 
29
26
 
30
- class XAuthConfig(BaseAuthConfig):
31
- client_id: str
32
- client_secret: str
27
+ class CalendlyAuthConfig(OAuth2AuthConfig):
28
+ pass
29
+
30
+
31
+ class XAuthConfig(OAuth2AuthConfig):
32
+ pass
33
+
34
+
35
+ class JiraAuthConfig(OAuth2AuthConfig):
36
+ pass
37
+
38
+
39
+ class HubspotAuthConfig(OAuth2AuthConfig):
40
+ pass
41
+
42
+
43
+ class DiscordAuthConfig(OAuth2AuthConfig):
44
+ pass
45
+
46
+
47
+ class ZoomAuthConfig(OAuth2AuthConfig):
48
+ pass
49
+
50
+
51
+ class AsanaAuthConfig(OAuth2AuthConfig):
52
+ pass
53
+
54
+
55
+ class MailchimpAuthConfig(OAuth2AuthConfig):
56
+ pass
57
+
58
+
59
+ class BitbucketAuthConfig(OAuth2AuthConfig):
60
+ pass
61
+
62
+
63
+ class NotionAuthConfig(OAuth2AuthConfig):
64
+ pass
65
+
66
+
67
+ class LinkedinAuthConfig(OAuth2AuthConfig):
68
+ pass
69
+
70
+
71
+ class LinearAuthConfig(OAuth2AuthConfig):
72
+ pass
73
+
74
+
75
+ class SalesForceAuthConfig(OAuth2AuthConfig):
76
+ domain_url: str
77
+
78
+
79
+ class SpotifyAuthConfig(OAuth2AuthConfig):
80
+ pass
81
+
82
+
83
+ class FacebookAuthConfig(OAuth2AuthConfig):
84
+ pass
33
85
 
34
86
 
35
87
  class AuthConfig(BaseModel):
@@ -38,6 +90,19 @@ class AuthConfig(BaseModel):
38
90
  github: Optional[GithubAuthConfig] = None
39
91
  calendly: Optional[CalendlyAuthConfig] = None
40
92
  x: Optional[XAuthConfig] = None
93
+ jira: Optional[JiraAuthConfig] = None
94
+ hubspot: Optional[HubspotAuthConfig] = None
95
+ discord: Optional[DiscordAuthConfig] = None
96
+ zoom: Optional[ZoomAuthConfig] = None
97
+ asana: Optional[AsanaAuthConfig] = None
98
+ mailchimp: Optional[MailchimpAuthConfig] = None
99
+ bitbucket: Optional[BitbucketAuthConfig] = None
100
+ notion: Optional[NotionAuthConfig] = None
101
+ salesforce: Optional[SalesForceAuthConfig] = None
102
+ spotify: Optional[SpotifyAuthConfig] = None
103
+ linkedin: Optional[LinkedinAuthConfig] = None
104
+ linear: Optional[LinearAuthConfig] = None
105
+ facebook: Optional[FacebookAuthConfig] = None
41
106
  use_prebuilt_auth: bool = Field(default=True)
42
107
 
43
108
 
@@ -298,11 +298,13 @@ class PocketCore:
298
298
  repo_url=tool_like
299
299
  )
300
300
  lock = GitLock(repository_url=base_repo_url, git_ref=git_ref)
301
- parsed_tool_like = WasmToolRequest(lock=lock, rel_path=rel_path, tool_vars={})
301
+ parsed_tool_like = WasmToolRequest(
302
+ lock=lock, rel_path=rel_path, tool_vars={}
303
+ )
302
304
  else:
303
305
  parsed_tool_like = None
304
306
  RuntimeError(
305
- f"Can't convert to ToolRequest. it might be wrong github url or local path. path: {tool_like}")
307
+ f"Can't convert to ToolRequest. it might be wrong github url or local path. path: {tool_like}"
308
+ )
306
309
 
307
310
  return parsed_tool_like
308
-
@@ -0,0 +1,25 @@
1
+ from fastapi import APIRouter
2
+ from starlette.responses import HTMLResponse
3
+ from hyperpocket.futures import FutureStore
4
+
5
+ activeloop_auth_router = APIRouter(prefix="/activeloop")
6
+
7
+
8
+ @activeloop_auth_router.get("/oauth2/callback")
9
+ async def activeloop_oauth2_callback(state: str, code: str):
10
+ try:
11
+ FutureStore.resolve_future(state, code)
12
+ except ValueError:
13
+ return HTMLResponse(content="failed")
14
+
15
+ return HTMLResponse(content="success")
16
+
17
+
18
+ @activeloop_auth_router.get("/token/callback")
19
+ async def activeloop_token_callback(state: str, token: str):
20
+ try:
21
+ FutureStore.resolve_future(state, token)
22
+ except ValueError:
23
+ return HTMLResponse(content="failed")
24
+
25
+ return HTMLResponse(content="success")