nodal-agents 0.1.0

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 (239) hide show
  1. package/README.md +81 -0
  2. package/cli.js +14113 -0
  3. package/migrations/0000_flashy_clea.sql +529 -0
  4. package/migrations/0001_exotic_shooting_star.sql +3 -0
  5. package/migrations/0002_gray_devos.sql +39 -0
  6. package/migrations/0003_stormy_thaddeus_ross.sql +1 -0
  7. package/migrations/0004_married_deadpool.sql +3 -0
  8. package/migrations/0005_tense_hedge_knight.sql +1 -0
  9. package/migrations/0006_credentials_table.sql +25 -0
  10. package/migrations/0007_free_speed.sql +16 -0
  11. package/migrations/0008_curious_thor_girl.sql +17 -0
  12. package/migrations/meta/0000_snapshot.json +3957 -0
  13. package/migrations/meta/0001_snapshot.json +3977 -0
  14. package/migrations/meta/0002_snapshot.json +4210 -0
  15. package/migrations/meta/0003_snapshot.json +4216 -0
  16. package/migrations/meta/0004_snapshot.json +4237 -0
  17. package/migrations/meta/0005_snapshot.json +4244 -0
  18. package/migrations/meta/0006_snapshot.json +4330 -0
  19. package/migrations/meta/0007_snapshot.json +4330 -0
  20. package/migrations/meta/0008_snapshot.json +4447 -0
  21. package/migrations/meta/_journal.json +69 -0
  22. package/package.json +63 -0
  23. package/runner.js +13181 -0
  24. package/web/.next/BUILD_ID +1 -0
  25. package/web/.next/app-path-routes-manifest.json +28 -0
  26. package/web/.next/build-manifest.json +20 -0
  27. package/web/.next/package.json +1 -0
  28. package/web/.next/prerender-manifest.json +109 -0
  29. package/web/.next/react-loadable-manifest.json +14 -0
  30. package/web/.next/required-server-files.json +351 -0
  31. package/web/.next/routes-manifest.json +216 -0
  32. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +2 -0
  33. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js.nft.json +1 -0
  34. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -0
  35. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +2 -0
  36. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js.nft.json +1 -0
  37. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -0
  38. package/web/.next/server/app/(dashboard)/agents/page.js +2 -0
  39. package/web/.next/server/app/(dashboard)/agents/page.js.nft.json +1 -0
  40. package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -0
  41. package/web/.next/server/app/(dashboard)/approvals/page.js +2 -0
  42. package/web/.next/server/app/(dashboard)/approvals/page.js.nft.json +1 -0
  43. package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -0
  44. package/web/.next/server/app/(dashboard)/automations/page.js +2 -0
  45. package/web/.next/server/app/(dashboard)/automations/page.js.nft.json +1 -0
  46. package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -0
  47. package/web/.next/server/app/(dashboard)/billing/page.js +2 -0
  48. package/web/.next/server/app/(dashboard)/billing/page.js.nft.json +1 -0
  49. package/web/.next/server/app/(dashboard)/billing/page_client-reference-manifest.js +1 -0
  50. package/web/.next/server/app/(dashboard)/connectors/page.js +2 -0
  51. package/web/.next/server/app/(dashboard)/connectors/page.js.nft.json +1 -0
  52. package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -0
  53. package/web/.next/server/app/(dashboard)/credentials/page.js +2 -0
  54. package/web/.next/server/app/(dashboard)/credentials/page.js.nft.json +1 -0
  55. package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -0
  56. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +2 -0
  57. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js.nft.json +1 -0
  58. package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -0
  59. package/web/.next/server/app/(dashboard)/jobs/page.js +2 -0
  60. package/web/.next/server/app/(dashboard)/jobs/page.js.nft.json +1 -0
  61. package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -0
  62. package/web/.next/server/app/(dashboard)/logs/page.js +2 -0
  63. package/web/.next/server/app/(dashboard)/logs/page.js.nft.json +1 -0
  64. package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -0
  65. package/web/.next/server/app/(dashboard)/memories/page.js +2 -0
  66. package/web/.next/server/app/(dashboard)/memories/page.js.nft.json +1 -0
  67. package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -0
  68. package/web/.next/server/app/(dashboard)/settings/page.js +2 -0
  69. package/web/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -0
  70. package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -0
  71. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +2 -0
  72. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js.nft.json +1 -0
  73. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -0
  74. package/web/.next/server/app/(dashboard)/skills/page.js +2 -0
  75. package/web/.next/server/app/(dashboard)/skills/page.js.nft.json +1 -0
  76. package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -0
  77. package/web/.next/server/app/(dashboard)/stats/page.js +2 -0
  78. package/web/.next/server/app/(dashboard)/stats/page.js.nft.json +1 -0
  79. package/web/.next/server/app/(dashboard)/stats/page_client-reference-manifest.js +1 -0
  80. package/web/.next/server/app/_global-error/page.js +32 -0
  81. package/web/.next/server/app/_global-error/page.js.nft.json +1 -0
  82. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  83. package/web/.next/server/app/_global-error.html +1 -0
  84. package/web/.next/server/app/_global-error.meta +16 -0
  85. package/web/.next/server/app/_global-error.rsc +18 -0
  86. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +18 -0
  87. package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  88. package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  89. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  90. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +7 -0
  91. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  92. package/web/.next/server/app/_not-found/page.js +2 -0
  93. package/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  94. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  95. package/web/.next/server/app/_not-found.html +1 -0
  96. package/web/.next/server/app/_not-found.meta +16 -0
  97. package/web/.next/server/app/_not-found.rsc +17 -0
  98. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
  99. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +5 -0
  100. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +7 -0
  101. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -0
  102. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  103. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  104. package/web/.next/server/app/api/auth/[...all]/route.js +1 -0
  105. package/web/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  106. package/web/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  107. package/web/.next/server/app/api/health/route.js +1 -0
  108. package/web/.next/server/app/api/health/route.js.nft.json +1 -0
  109. package/web/.next/server/app/api/health/route_client-reference-manifest.js +1 -0
  110. package/web/.next/server/app/api/oauth/[provider]/callback/route.js +1 -0
  111. package/web/.next/server/app/api/oauth/[provider]/callback/route.js.nft.json +1 -0
  112. package/web/.next/server/app/api/oauth/[provider]/callback/route_client-reference-manifest.js +1 -0
  113. package/web/.next/server/app/api/oauth/[provider]/start/route.js +1 -0
  114. package/web/.next/server/app/api/oauth/[provider]/start/route.js.nft.json +1 -0
  115. package/web/.next/server/app/api/oauth/[provider]/start/route_client-reference-manifest.js +1 -0
  116. package/web/.next/server/app/auth/callback/route.js +1 -0
  117. package/web/.next/server/app/auth/callback/route.js.nft.json +1 -0
  118. package/web/.next/server/app/auth/callback/route_client-reference-manifest.js +1 -0
  119. package/web/.next/server/app/index.html +1 -0
  120. package/web/.next/server/app/index.meta +16 -0
  121. package/web/.next/server/app/index.rsc +16 -0
  122. package/web/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  123. package/web/.next/server/app/index.segments/_full.segment.rsc +16 -0
  124. package/web/.next/server/app/index.segments/_head.segment.rsc +5 -0
  125. package/web/.next/server/app/index.segments/_index.segment.rsc +7 -0
  126. package/web/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  127. package/web/.next/server/app/login/page.js +2 -0
  128. package/web/.next/server/app/login/page.js.nft.json +1 -0
  129. package/web/.next/server/app/login/page_client-reference-manifest.js +1 -0
  130. package/web/.next/server/app/onboarding/page.js +2 -0
  131. package/web/.next/server/app/onboarding/page.js.nft.json +1 -0
  132. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -0
  133. package/web/.next/server/app/onboarding.html +1 -0
  134. package/web/.next/server/app/onboarding.meta +15 -0
  135. package/web/.next/server/app/onboarding.rsc +17 -0
  136. package/web/.next/server/app/onboarding.segments/_full.segment.rsc +17 -0
  137. package/web/.next/server/app/onboarding.segments/_head.segment.rsc +5 -0
  138. package/web/.next/server/app/onboarding.segments/_index.segment.rsc +7 -0
  139. package/web/.next/server/app/onboarding.segments/_tree.segment.rsc +2 -0
  140. package/web/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +5 -0
  141. package/web/.next/server/app/onboarding.segments/onboarding.segment.rsc +5 -0
  142. package/web/.next/server/app/page.js +2 -0
  143. package/web/.next/server/app/page.js.nft.json +1 -0
  144. package/web/.next/server/app/page_client-reference-manifest.js +1 -0
  145. package/web/.next/server/app-paths-manifest.json +28 -0
  146. package/web/.next/server/chunks/1006.js +1 -0
  147. package/web/.next/server/chunks/168.js +8 -0
  148. package/web/.next/server/chunks/2187.js +1 -0
  149. package/web/.next/server/chunks/2275.js +120 -0
  150. package/web/.next/server/chunks/2422.js +1 -0
  151. package/web/.next/server/chunks/3159.js +45 -0
  152. package/web/.next/server/chunks/3699.js +1 -0
  153. package/web/.next/server/chunks/3807.js +1 -0
  154. package/web/.next/server/chunks/3865.js +9 -0
  155. package/web/.next/server/chunks/3869.js +1 -0
  156. package/web/.next/server/chunks/3938.js +1 -0
  157. package/web/.next/server/chunks/4574.js +1 -0
  158. package/web/.next/server/chunks/4674.js +18 -0
  159. package/web/.next/server/chunks/5376.js +1 -0
  160. package/web/.next/server/chunks/5402.js +65 -0
  161. package/web/.next/server/chunks/5449.js +1 -0
  162. package/web/.next/server/chunks/5754.js +62 -0
  163. package/web/.next/server/chunks/5962.js +1 -0
  164. package/web/.next/server/chunks/6128.js +1 -0
  165. package/web/.next/server/chunks/6402.js +1 -0
  166. package/web/.next/server/chunks/6605.js +12 -0
  167. package/web/.next/server/chunks/6697.js +1 -0
  168. package/web/.next/server/chunks/6764.js +1 -0
  169. package/web/.next/server/chunks/6896.js +2 -0
  170. package/web/.next/server/chunks/8464.js +2 -0
  171. package/web/.next/server/chunks/9606.js +428 -0
  172. package/web/.next/server/functions-config-manifest.json +14 -0
  173. package/web/.next/server/middleware-build-manifest.js +1 -0
  174. package/web/.next/server/middleware-manifest.json +6 -0
  175. package/web/.next/server/middleware-react-loadable-manifest.js +1 -0
  176. package/web/.next/server/middleware.js +18 -0
  177. package/web/.next/server/next-font-manifest.js +1 -0
  178. package/web/.next/server/next-font-manifest.json +1 -0
  179. package/web/.next/server/pages/404.html +1 -0
  180. package/web/.next/server/pages/500.html +1 -0
  181. package/web/.next/server/pages-manifest.json +4 -0
  182. package/web/.next/server/prefetch-hints.json +1 -0
  183. package/web/.next/server/server-reference-manifest.js +1 -0
  184. package/web/.next/server/server-reference-manifest.json +1 -0
  185. package/web/.next/server/webpack-runtime.js +1 -0
  186. package/web/.next/static/chunks/174.f5bd28884efa0000.js +1 -0
  187. package/web/.next/static/chunks/203.02a2bd001ebbe608.js +1 -0
  188. package/web/.next/static/chunks/231-fbb2baea2de90085.js +1 -0
  189. package/web/.next/static/chunks/363-483f33abe1809381.js +1 -0
  190. package/web/.next/static/chunks/45-b78e94bb1c396542.js +1 -0
  191. package/web/.next/static/chunks/504-baed39064a242351.js +1 -0
  192. package/web/.next/static/chunks/511-487710d0fe16fbe3.js +1 -0
  193. package/web/.next/static/chunks/678-46261e73dea11bc7.js +1 -0
  194. package/web/.next/static/chunks/724-1d09b7ea367babbe.js +32 -0
  195. package/web/.next/static/chunks/a7a8b010-64b9ea0922a3e9c1.js +1 -0
  196. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-1cbc88f6ea30c04e.js +1 -0
  197. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/page-c3393e2e0665b0a7.js +1 -0
  198. package/web/.next/static/chunks/app/(dashboard)/agents/page-fe6937dec50415e9.js +1 -0
  199. package/web/.next/static/chunks/app/(dashboard)/approvals/page-9509351c92665fc1.js +1 -0
  200. package/web/.next/static/chunks/app/(dashboard)/automations/page-d06b5eb3ec1ada30.js +1 -0
  201. package/web/.next/static/chunks/app/(dashboard)/billing/page-88165ec8f0c4df6b.js +1 -0
  202. package/web/.next/static/chunks/app/(dashboard)/connectors/page-9189af92fc7cddd4.js +1 -0
  203. package/web/.next/static/chunks/app/(dashboard)/credentials/page-9ad4cfdfb3fda068.js +1 -0
  204. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-fdaeff5be0544e4c.js +1 -0
  205. package/web/.next/static/chunks/app/(dashboard)/jobs/page-c1ddb55d4de1ae7d.js +1 -0
  206. package/web/.next/static/chunks/app/(dashboard)/layout-7ad84dfaa376ab9f.js +2 -0
  207. package/web/.next/static/chunks/app/(dashboard)/logs/page-a6006d9cc2590a0a.js +1 -0
  208. package/web/.next/static/chunks/app/(dashboard)/memories/page-8466e02527ae909b.js +1 -0
  209. package/web/.next/static/chunks/app/(dashboard)/settings/page-d7dd2b7586e23ec9.js +1 -0
  210. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-7c1e1566a93b3a65.js +1 -0
  211. package/web/.next/static/chunks/app/(dashboard)/skills/page-30cbb1e29d7e5147.js +1 -0
  212. package/web/.next/static/chunks/app/(dashboard)/stats/page-ddf08b608a2840c5.js +1 -0
  213. package/web/.next/static/chunks/app/_global-error/page-ddf08b608a2840c5.js +1 -0
  214. package/web/.next/static/chunks/app/_not-found/page-ddf08b608a2840c5.js +1 -0
  215. package/web/.next/static/chunks/app/api/auth/[...all]/route-ddf08b608a2840c5.js +1 -0
  216. package/web/.next/static/chunks/app/api/health/route-ddf08b608a2840c5.js +1 -0
  217. package/web/.next/static/chunks/app/api/oauth/[provider]/callback/route-ddf08b608a2840c5.js +1 -0
  218. package/web/.next/static/chunks/app/api/oauth/[provider]/start/route-ddf08b608a2840c5.js +1 -0
  219. package/web/.next/static/chunks/app/auth/callback/route-ddf08b608a2840c5.js +1 -0
  220. package/web/.next/static/chunks/app/error-41d8134c91e8652d.js +1 -0
  221. package/web/.next/static/chunks/app/layout-fb836a3464648614.js +1 -0
  222. package/web/.next/static/chunks/app/login/page-176e4c02453c9ce9.js +1 -0
  223. package/web/.next/static/chunks/app/not-found-88165ec8f0c4df6b.js +1 -0
  224. package/web/.next/static/chunks/app/onboarding/page-ddf08b608a2840c5.js +1 -0
  225. package/web/.next/static/chunks/app/page-ddf08b608a2840c5.js +1 -0
  226. package/web/.next/static/chunks/e5009a55-3b270d90dfdebefa.js +1 -0
  227. package/web/.next/static/chunks/framework-a208e71e7c780968.js +1 -0
  228. package/web/.next/static/chunks/main-949172f5a58d52c4.js +5 -0
  229. package/web/.next/static/chunks/main-app-ad34d1b1511b9a1c.js +1 -0
  230. package/web/.next/static/chunks/next/dist/client/components/builtin/app-error-ddf08b608a2840c5.js +1 -0
  231. package/web/.next/static/chunks/next/dist/client/components/builtin/forbidden-ddf08b608a2840c5.js +1 -0
  232. package/web/.next/static/chunks/next/dist/client/components/builtin/global-error-c836ffb6bc7442ca.js +1 -0
  233. package/web/.next/static/chunks/next/dist/client/components/builtin/unauthorized-ddf08b608a2840c5.js +1 -0
  234. package/web/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  235. package/web/.next/static/chunks/webpack-ea6870dc3308aa05.js +1 -0
  236. package/web/.next/static/css/bd2cf2f17af36e40.css +1 -0
  237. package/web/.next/static/vTtlbto9aMl3tYcTyV1GL/_buildManifest.js +1 -0
  238. package/web/.next/static/vTtlbto9aMl3tYcTyV1GL/_ssgManifest.js +1 -0
  239. package/web/server.js +44 -0
@@ -0,0 +1,12 @@
1
+ "use strict";exports.id=6605,exports.ids=[6605],exports.modules={16605:(a,b,c)=>{c.d(b,{iU:()=>c1,dd:()=>c8,f_:()=>dj,bN:()=>cZ,Cy:()=>cN,LN:()=>dO,Jc:()=>c9,AS:()=>dw,Ev:()=>df,rT:()=>cO,hP:()=>c7,Mo:()=>dQ,t3:()=>c3,X1:()=>dA,TD:()=>dg,P7:()=>c$,Ro:()=>cS,lV:()=>cY,dO:()=>ds,rf:()=>cV,_N:()=>cW,M3:()=>dE,oA:()=>dB,cj:()=>dt,cu:()=>dm,iu:()=>dS,$z:()=>cM,By:()=>da,Le:()=>c4,Jb:()=>cU,oG:()=>dN,y4:()=>c0,Hy:()=>du,EA:()=>di,$5:()=>dd,c6:()=>dq,Zz:()=>dr,CV:()=>dc,cr:()=>c6,e4:()=>cT,AH:()=>dT,fl:()=>dR,eP:()=>dz,ZG:()=>c2,_x:()=>dn,fG:()=>cR,pu:()=>dD,QT:()=>dP,rv:()=>dG,fI:()=>dy,Rz:()=>dl});var d=c(43607),e=c(87388),f=c(66402),g=c(85754),h=c(40034);class i extends Error{constructor(a,b){super(b??a),this.name="DeliveryError",this.code=a}}async function j(a,b,c,d,e=1e4){let f,g=`https://api.telegram.org/bot${a}/${b}`,h=new AbortController,k=setTimeout(()=>h.abort(),e);d?.addEventListener("abort",()=>h.abort(),{once:!0});try{f=await fetch(g,{method:"POST",headers:{"Content-Type":"application/json"},body:void 0!==c?JSON.stringify(c):"{}",signal:h.signal})}catch(c){if(c instanceof Error&&"AbortError"===c.name)throw new i("telegram_request_failed",`telegram_timeout: Telegram API did not respond within ${e/1e3}s`);let b=String(c.message??c).replaceAll(a,"[REDACTED]");throw new i("telegram_request_failed",`telegram_request_failed: network error: ${b}`)}finally{clearTimeout(k)}let l=await f.json().catch(()=>({}));if(!f.ok||!l.ok){let a=l.description??"";if(401===f.status||404===f.status)throw new i("telegram_invalid_token",`telegram_invalid_token: ${a}`);throw new i("telegram_request_failed",`telegram_request_failed: ${a}`)}if(void 0===l.result)throw new i("telegram_request_failed","telegram_request_failed: no result in response");return l.result}async function k(a){let b=await j(a,"getMe");return{id:b.id,username:b.username,firstName:b.first_name,canJoinGroups:b.can_join_groups??!1,canReadAllGroupMessages:b.can_read_all_group_messages??!1}}async function l(a){let b=a.timeout??25,c={offset:a.offset,timeout:b,allowed_updates:["message","callback_query"]};void 0!==a.limit&&(c.limit=a.limit);let d=1e3*b+5e3;return await j(a.botToken,"getUpdates",c,a.signal,d)}class m extends Error{constructor(a,b,c){super(b),this.name="MemoryError",this.code=a,void 0!==c&&(this.cause=c)}}class n extends m{constructor(a){super("MEMORY_NOT_FOUND",`memory.not_found:${a}`),this.name="MemoryNotFoundError"}}async function o(a,b,c,d){let e={updatedAt:new Date};void 0!==d.fact&&(e.fact=d.fact),void 0!==d.category&&(e.category=d.category),void 0!==d.importance&&(e.importance=d.importance),void 0!==d.skill_tags&&(e.skillTags=d.skill_tags),void 0!==d.archived&&(e.archived=d.archived),void 0!==d.valid_to&&(e.validTo=d.valid_to?new Date(d.valid_to):null);let f=(await a.update(h.RK).set(e).where((0,h.Uo)((0,h.eq)(h.RK.id,b),(0,h.eq)(h.RK.entityId,c))).returning())[0];if(!f)throw new n(b);return q(f)}async function p(a,b,c){if(0===(await a.delete(h.RK).where((0,h.Uo)((0,h.eq)(h.RK.id,b),(0,h.eq)(h.RK.entityId,c))).returning()).length)throw new n(b)}function q(a){return{id:a.id,entity_id:a.entityId??null,agent_id:a.agentId??null,fact:a.fact,category:a.category??"context",importance:a.importance??3,source:a.source??"agent",skill_tags:a.skillTags??[],memory_layer:a.memoryLayer??null,valid_from:a.validFrom?.toISOString()??null,valid_to:a.validTo?.toISOString()??null,fact_hash:a.factHash??null,archived:a.archived??!1,last_accessed_at:a.lastAccessedAt?.toISOString()??null,access_count:a.accessCount??0,created_at:a.createdAt?.toISOString()??new Date().toISOString(),updated_at:a.updatedAt?.toISOString()??new Date().toISOString()}}async function r(a,b){var c;let d,e,{entityId:f}=b;if(!f)throw new m("INVALID_ENTITY","memory.list.entity_id_required");let g=b.page??1,i=g<=0?1:g,j=Math.min(Math.max(1,b.pageSize??50),200),k=(i-1)*j,l=(c=b,d=[(0,h.eq)(h.RK.entityId,c.entityId),(0,h.eq)(h.RK.archived,c.archived??!1)],c.agentId&&d.push((0,h.eq)(h.RK.agentId,c.agentId)),c.category&&d.push((0,h.eq)(h.RK.category,c.category)),c.tags&&c.tags.length>0&&d.push((0,h.ll)`${h.RK.skillTags} && ${h.ll.raw((e=c.tags.map(a=>`'${a.replace(/\\/g,"\\\\").replace(/'/g,"''")}'`).join(","),`ARRAY[${e}]`))}::text[]`),(0,h.Uo)(...d)),n=function(a="recent"){switch(a){case"importance":return(0,h.i8)(h.RK.importance);case"last_accessed":return(0,h.i8)(h.RK.lastAccessedAt);default:return(0,h.i8)(h.RK.updatedAt)}}(b.sort),o=await a.select({count:(0,h.ll)`count(*)`}).from(h.RK).where(l),p=Number(o[0]?.count??0),r=(await a.select().from(h.RK).where(l).orderBy(n).limit(j).offset(k)).map(a=>q(a));return{items:r,page:i,pageSize:j,totalCount:p,hasMore:k+r.length<p}}c(42667);var s=c(98472),t=c(48161),u=c(95488),v=c(42112),w=c(75224),x=c(73024),y=c(76760);let z=process.env.NODALAI_CONFIG_PATH??(0,y.join)((0,t.homedir)(),".nodalai","config.json");function A(){if(!(0,x.existsSync)(z))return null;try{let a=(0,x.readFileSync)(z,"utf-8"),b=JSON.parse(a);if("object"!=typeof b||null===b)return null;return b}catch{return null}}function B(a){let b=A();if(!b)throw Error("cli_config_missing");let c={...b,...a};(0,x.writeFileSync)(z,JSON.stringify(c,null,2),"utf-8")}var C=c(17030),D=c(96591),E=c(54856);function F(a,b=new Date){try{return E.CronExpressionParser.parse(a.trim(),{currentDate:b}).next().toDate()}catch{return null}}var G=c(15726);class H extends Error{constructor(a,b,c){super(b),this.name="NotionAdapterError",this.code=a,this.status=c}}function I(a){if(a instanceof G.om){let b,c=a.status;switch(c){case 400:b="notion_validation_error";break;case 401:b="notion_unauthorized";break;case 403:b="notion_forbidden";break;case 404:b="notion_not_found";break;case 409:b="notion_conflict";break;case 429:b="notion_rate_limited";break;case 503:b="notion_service_unavailable";break;default:b="notion_unknown"}return new H(b,a.message,c)}return a instanceof Error?new H("notion_unknown",a.message):new H("notion_unknown",String(a))}function J(a,b){let c=null==a?"":String(a);if(!c)return[{type:"text",text:{content:""}}];let d=[],e=[],f=0;for(let a of c){let c=a.codePointAt(0)>65535?2:1;if(f+c>2e3){let g={type:"text",text:{content:e.join("")}};b&&(g.annotations=b),d.push(g),e.length=0,e.push(a),f=c}else e.push(a),f+=c}if(e.length>0){let a={type:"text",text:{content:e.join("")}};b&&(a.annotations=b),d.push(a)}return d}function K(a){let b=a.type;if("title"===b)return(a.title??[]).map(a=>a.plain_text).join("");if("rich_text"===b)return(a.rich_text??[]).map(a=>a.plain_text).join("");if("select"===b){let b=a.select;return b?.name??""}if("multi_select"===b)return(a.multi_select??[]).map(a=>a.name).join(", ");if("status"===b){let b=a.status;return b?.name??""}if("number"===b||"checkbox"===b||"url"===b||"email"===b||"phone_number"===b){let c=a[b];return null!=c?String(c):""}if("date"===b){let b=a.date;return b?b.end?`${b.start} → ${b.end}`:b.start:""}if("relation"===b)return(a.relation??[]).map(a=>a.id).join(", ");if("formula"===b){let b=a.formula;return b?String(b[b.type]??""):""}if("rollup"===b){let b=a.rollup;return b?String(b[b.type]??""):""}return"people"===b?(a.people??[]).map(a=>a.name??a.id).join(", "):"created_time"===b?String(a.created_time??""):"last_edited_time"===b?String(a.last_edited_time??""):""}function L(a,b,c){let d=c?.[a]?.type;switch(d||("boolean"==typeof b?"checkbox":"number"==typeof b?"number":"string"==typeof b&&b.startsWith("http")?"url":"rich_text")){case"title":return{title:J(String(b??""))};case"rich_text":default:return{rich_text:J(String(b??""))};case"number":{let a=Number(b);return isNaN(a)?{rich_text:J(String(b))}:{number:a}}case"checkbox":return{checkbox:!!b};case"url":return{url:null!=b?String(b).slice(0,2e3):null};case"select":return{select:{name:String(b).slice(0,100)}};case"multi_select":return{multi_select:(Array.isArray(b)?b:String(b).split(",")).map(a=>({name:String(a).trim().slice(0,100)}))};case"date":return{date:{start:String(b)}};case"email":return{email:String(b)};case"phone_number":return{phone_number:String(b)}}}function M(a){for(let b of Object.values(a.properties??{}))if("title"===b.type)return(b.title??[]).map(a=>a.plain_text).join("");let b=a.title;return Array.isArray(b)?b.map(a=>a.plain_text).join(""):"(untitled)"}let N=g.Ik({query:g.Yj().describe("Text to search for in page and database titles."),limit:g.ai().int().min(1).max(100).optional().default(10).describe("Max results to return (1–100, default 10)."),filter_type:g.k5(["page","database"]).optional().describe("Optional: restrict results to pages or databases only.")});async function O(a,b=100,c=500){let d,e=[];for(let f=0;f<20;f++){let f=await a(d,Math.min(b,100));if(e.push(...f.results),e.length>=c||!f.has_more||!f.next_cursor)break;d=f.next_cursor}return e.slice(0,c)}async function P(a,b,c=300){return O(async(c,d)=>{let e=await a.blocks.children.list({block_id:b,start_cursor:c,page_size:d});return{results:e.results.filter(a=>"block"===a.object),has_more:e.has_more,next_cursor:e.next_cursor}},100,c)}function Q(a){return a.map(a=>a.plain_text).join("")}function R(a){switch(a.type){case"paragraph":return Q(a.paragraph.rich_text);case"heading_1":return`# ${Q(a.heading_1.rich_text)}`;case"heading_2":return`## ${Q(a.heading_2.rich_text)}`;case"heading_3":return`### ${Q(a.heading_3.rich_text)}`;case"bulleted_list_item":return`- ${Q(a.bulleted_list_item.rich_text)}`;case"numbered_list_item":return`1. ${Q(a.numbered_list_item.rich_text)}`;case"to_do":{let b=a.to_do.checked;return`[${b?"x":" "}] ${Q(a.to_do.rich_text)}`}case"code":{let b=a.code.language,c=Q(a.code.rich_text);return`\`\`\`${b}
2
+ ${c}
3
+ \`\`\``}case"quote":return`> ${Q(a.quote.rich_text)}`;case"callout":{let b=Q(a.callout.rich_text),c=a.callout.icon,d=c?.type==="emoji"?c.emoji:"";return d?`${d} ${b}`:b}case"divider":return"---";case"toggle":return Q(a.toggle.rich_text);case"table_of_contents":return"[table of contents]";case"child_page":return`[child page: ${a.child_page.title}]`;case"child_database":return`[child database: ${a.child_database.title}]`;case"image":{let b="external"===a.image.type?a.image.external.url:a.image.file.url;return`[image: ${b}]`}case"video":{let b="external"===a.video.type?a.video.external.url:a.video.file.url;return`[video: ${b}]`}case"file":{let b="external"===a.file.type?a.file.external.url:a.file.file.url;return`[file: ${b}]`}case"pdf":{let b="external"===a.pdf.type?a.pdf.external.url:a.pdf.file.url;return`[pdf: ${b}]`}case"bookmark":return`[bookmark: ${a.bookmark.url}]`;case"embed":return`[embed: ${a.embed.url}]`;default:return null}}let S=g.Ik({page_id:g.Yj().describe("Notion page ID (UUID or dashed UUID).")}),T=g.Ik({page_id:g.Yj().describe("Notion page or block ID whose content to read."),max_blocks:g.ai().int().min(1).max(1e3).optional().default(300).describe("Maximum number of blocks to fetch (default 300).")}),U=g.Ik({parent_page_id:g.Yj().optional().describe("ID of the parent PAGE. Use when creating a sub-page inside another page. Mutually exclusive with parent_database_id."),parent_database_id:g.Yj().optional().describe("ID of the parent DATABASE. Use when creating a new row inside a database. Mutually exclusive with parent_page_id."),title:g.Yj().describe("Title of the new page."),content:g.Yj().optional().describe("Optional paragraph text to add as the first block. Auto-chunked if >2000 chars.")}),V=g.Ik({page_id:g.Yj().describe("Page ID to update."),properties:g.g1(g.Yj(),g.L5()).describe('Properties to update as key-value pairs. Example: {"Status": "Done", "Priority": "High", "Score": 95}')}),W=g.Ik({page_id:g.Yj().describe("Page ID to archive.")}),X=g.Ik({block_id:g.Yj().describe("Block ID to retrieve.")}),Y=g.Ik({type:g.k5(["paragraph","heading_1","heading_2","heading_3","bulleted_list_item","numbered_list_item","to_do","code","quote","callout","toggle","divider"]).describe("Block type."),content:g.Yj().optional().default("").describe("Text content for the block (not used for divider)."),language:g.Yj().optional().describe('Programming language for code blocks (e.g. "python", "javascript").'),checked:g.zM().optional().default(!1).describe("Whether a to_do block is checked.")}),Z=g.Ik({page_id:g.Yj().describe("Page or block ID to append content to."),blocks:g.YO(Y).min(1).max(100).describe('Array of blocks to add. Example: [{"type": "heading_2", "content": "Summary"}, {"type": "paragraph", "content": "The results show..."}]')});function $(a){if("divider"===a.type)return{object:"block",type:"divider",divider:{}};let b=J(a.content??"");return"code"===a.type?{object:"block",type:"code",code:{rich_text:b,language:a.language??"plain text"}}:"to_do"===a.type?{object:"block",type:"to_do",to_do:{rich_text:b,checked:a.checked??!1}}:{object:"block",type:a.type,[a.type]:{rich_text:b}}}let _=g.Ik({block_id:g.Yj().describe("Block ID to update."),content:g.Yj().describe("New text content for the block.")}),aa=g.Ik({block_id:g.Yj().describe("Block ID to delete (archive).")}),ab=g.Ik({database_id:g.Yj().describe("Notion database ID (UUID)."),filter:g.g1(g.Yj(),g.L5()).optional().describe('Optional Notion filter object. Example: {"property": "Status", "select": {"equals": "Applied"}}'),page_size:g.ai().int().min(1).max(100).optional().default(50).describe("Rows per request (1–100, default 50)."),max_rows:g.ai().int().min(1).max(1e3).optional().default(500).describe("Total rows to collect across pagination (default 500, max 1000).")}),ac=g.Ik({database_id:g.Yj().describe("Notion database ID (UUID).")}),ad=g.Ik({database_id:g.Yj().describe("Notion database ID to add a row to."),properties:g.g1(g.Yj(),g.L5()).describe('Row properties as key-value pairs. Example: {"Name": "Acme Corp", "Status": "Applied", "Score": 95}')}),ae=g.Ik({page_id:g.Yj().describe("Page ID of the database row to update."),database_id:g.Yj().optional().describe("Optional: database ID to fetch schema for type coercion. If omitted, types are inferred from values."),properties:g.g1(g.Yj(),g.L5()).describe('Properties to update as key-value pairs. Example: {"Status": "Done", "Score": 100}')}),af=g.k5(["title","rich_text","number","checkbox","url","email","phone_number","date","select","multi_select","status"]),ag=g.Ik({parent_page_id:g.Yj().describe("Page ID that will contain the new database."),title:g.Yj().describe("Database title."),columns:g.g1(g.Yj(),af).describe('Column definitions as {name: type}. One must be "title". Example: {"Name": "title", "Status": "select", "URL": "url", "Score": "number"}')});function ah(a){switch(a){case"title":return{title:{}};case"select":return{select:{options:[]}};case"multi_select":return{multi_select:{options:[]}};case"status":return{status:{}};default:return{[a]:{}}}}let ai=g.Ik({database_id:g.Yj().describe("Database ID to update."),title:g.Yj().optional().describe("Optional new title for the database."),new_columns:g.g1(g.Yj(),af).optional().describe("New columns to add as {name: type}. Same types as notion_create_database. Cannot modify existing column types (Notion API limitation).")}),aj=g.Ik({block_id:g.Yj().describe("Page or block ID to list comments for."),page_size:g.ai().int().min(1).max(50).optional().default(50).describe("Max comments to return (default 50).")}),ak=g.Ik({page_id:g.Yj().describe("Page ID to comment on."),text:g.Yj().describe("Comment text.")}),al=g.Ik({page_size:g.ai().int().min(1).max(100).optional().default(100).describe("Max users to return (default 100).")}),am=g.Ik({user_id:g.Yj().describe("Notion user ID.")}),an=[{slug:"notion_search",name:"Search",risk:"read",requiresApproval:!1,description:"Search pages and databases by title."},{slug:"notion_get_page",name:"Get page",risk:"read",requiresApproval:!1,description:"Retrieve page properties by ID."},{slug:"notion_get_page_content",name:"Get page content",risk:"read",requiresApproval:!1,description:"Read all blocks inside a page."},{slug:"notion_get_block",name:"Get block",risk:"read",requiresApproval:!1,description:"Retrieve a single block and its children."},{slug:"notion_query_database",name:"Query database",risk:"read",requiresApproval:!1,description:"Filter and sort rows in a Notion database."},{slug:"notion_get_database",name:"Get database",risk:"read",requiresApproval:!1,description:"Retrieve database schema and properties."},{slug:"notion_list_comments",name:"List comments",risk:"read",requiresApproval:!1,description:"List all comments on a page or block."},{slug:"notion_list_users",name:"List users",risk:"read",requiresApproval:!1,description:"List workspace members."},{slug:"notion_get_user",name:"Get user",risk:"read",requiresApproval:!1,description:"Retrieve a workspace member by ID."},{slug:"notion_create_page",name:"Create page",risk:"write",requiresApproval:!1,description:"Create a new page inside a parent page or database."},{slug:"notion_update_page",name:"Update page",risk:"write",requiresApproval:!1,description:"Update page properties."},{slug:"notion_append_blocks",name:"Append blocks",risk:"write",requiresApproval:!1,description:"Append content blocks to a page or block."},{slug:"notion_update_block",name:"Update block",risk:"write",requiresApproval:!1,description:"Update an existing block content."},{slug:"notion_create_database_entry",name:"Create database entry",risk:"write",requiresApproval:!1,description:"Add a new row to a Notion database."},{slug:"notion_update_database_entry",name:"Update database entry",risk:"write",requiresApproval:!1,description:"Update properties on an existing database row."},{slug:"notion_create_database",name:"Create database",risk:"write",requiresApproval:!1,description:"Create a new database inside a parent page."},{slug:"notion_update_database",name:"Update database",risk:"write",requiresApproval:!1,description:"Update database title or property schema."},{slug:"notion_add_comment",name:"Add comment",risk:"write",requiresApproval:!1,description:"Add a comment to a page or block."},{slug:"notion_archive_page",name:"Archive page",risk:"destructive",requiresApproval:!0,description:"Archive (soft-delete) a page."},{slug:"notion_delete_block",name:"Delete block",risk:"destructive",requiresApproval:!0,description:"Permanently delete a block."}];function ao(a){var b;let c=(b=function(a){if("apiKey"in a&&a.apiKey)return a.apiKey;if(!a.accessToken)throw Error("NotionAdapterOptions: either apiKey or accessToken must be a non-empty string.");return a.accessToken}(a),new G.Kj({auth:b}));return[{name:"notion_search",description:"Search across all pages and databases in Notion. Returns matching page titles, IDs, and URLs.",inputSchema:N,riskLevel:"read",async execute(a){try{let b={query:a.query,page_size:a.limit};a.filter_type&&(b.filter={property:"object",value:a.filter_type});let d=(await c.search(b)).results.map(a=>{let b=a.object,c=a.id,d="url"in a?a.url:"",e=M(a);return{object:b,id:c,title:e,url:d}});return{total:d.length,results:d}}catch(a){throw I(a)}}},{name:"notion_get_page",description:"Retrieve a Notion page by its ID. Returns the page title and a summary of its properties.",inputSchema:S,riskLevel:"read",async execute(a){try{let b=await c.pages.retrieve({page_id:a.page_id});if(!("properties"in b))throw I(Error("notion_not_found"));let d=M(b),e="url"in b?b.url:"",f={};for(let[a,c]of Object.entries(b.properties)){if("title"===c.type)continue;let b=K(c);b&&(f[a]=b.slice(0,200))}return{id:b.id,title:d,url:e,created_time:"created_time"in b?String(b.created_time):"",last_edited_time:"last_edited_time"in b?String(b.last_edited_time):"",properties:f}}catch(a){throw I(a)}}},{name:"notion_get_page_content",description:"Read the full text content of a Notion page (paragraphs, headings, lists, code, etc.). Use this after notion_search or notion_get_page to read what is actually written on the page.",inputSchema:T,riskLevel:"read",async execute(a){try{let b=await c.pages.retrieve({page_id:a.page_id}),d=M(b),e=await P(c,a.page_id,a.max_blocks),f=function(a,b=15e3){let c=[];for(let b of a){let a=R(b);null!==a&&c.push(a)}let d=c.join("\n\n");return d.length>b?d.slice(0,b)+"\n\n[...content truncated...]":d}(e);return{id:a.page_id,title:d,content:f||"(no extractable text content)",block_count:e.length}}catch(a){throw I(a)}}},{name:"notion_get_block",description:"Retrieve a specific Notion block by ID. Returns the block type and its text content.",inputSchema:X,riskLevel:"read",async execute(a){try{let b=await c.blocks.retrieve({block_id:a.block_id});return{id:b.id,type:"type"in b?String(b.type):"unknown",text:R(b),has_children:"has_children"in b&&!!b.has_children}}catch(a){throw I(a)}}},{name:"notion_query_database",description:"Query a Notion database with optional filters. Without a filter, returns all entries. Returns rows with their properties.",inputSchema:ab,riskLevel:"read",async execute(a){try{let b=!1,d=await O(async(b,d)=>{let e={database_id:a.database_id,page_size:d};a.filter&&(e.filter=a.filter),b&&(e.start_cursor=b);let f=await c.databases.query(e);return{results:f.results,has_more:f.has_more,next_cursor:f.next_cursor}},a.page_size,a.max_rows);d.length>=a.max_rows&&(b=!0);let e=d.map(a=>{let b={id:a.id,url:"url"in a?String(a.url):""};if("properties"in a)for(let[c,d]of Object.entries(a.properties)){let a=K(d);a&&(b[c]=a)}return b});return{total:e.length,has_more:b,rows:e}}catch(a){throw I(a)}}},{name:"notion_get_database",description:"Get the schema of a Notion database (column names, types, and select/multi_select options). Call this to discover database structure before querying or creating rows.",inputSchema:ac,riskLevel:"read",async execute(a){try{let b=await c.databases.retrieve({database_id:a.database_id}),d=("title"in b?b.title:[]).map(a=>a.plain_text).join("")||"(untitled)",e="url"in b?String(b.url):"",f=Object.entries(b.properties).map(([a,b])=>{let c={name:a,type:b.type};return"select"===b.type?c.options=(b.select?.options??[]).slice(0,20).map(a=>a.name):"multi_select"===b.type?c.options=(b.multi_select?.options??[]).slice(0,20).map(a=>a.name):"status"===b.type&&(c.options=(b.status?.options??[]).slice(0,20).map(a=>a.name)),c});return{id:b.id,title:d,url:e,columns:f}}catch(a){throw I(a)}}},{name:"notion_list_comments",description:"List comments on a Notion page or block.",inputSchema:aj,riskLevel:"read",async execute(a){try{let b=(await c.comments.list({block_id:a.block_id,page_size:a.page_size})).results.map(a=>{let b=a.rich_text.map(a=>a.plain_text).join(""),c=a.created_by;return{id:a.id,author_id:c?.id??"",author_name:c?.name??"",text:b.slice(0,500),created_time:a.created_time}});return{total:b.length,comments:b}}catch(a){throw I(a)}}},{name:"notion_list_users",description:"List all users in the Notion workspace.",inputSchema:al,riskLevel:"read",async execute(a){try{let b=(await c.users.list({page_size:a.page_size})).results.map(a=>{let b="person"===a.type&&"person"in a?a.person:null;return{id:a.id,name:a.name??"",type:a.type??"unknown",email:b?.email??"",avatar_url:a.avatar_url??""}});return{total:b.length,users:b}}catch(a){throw I(a)}}},{name:"notion_get_user",description:"Get details about a specific Notion user by their ID.",inputSchema:am,riskLevel:"read",async execute(a){try{let b=await c.users.retrieve({user_id:a.user_id}),d="person"===b.type&&"person"in b?b.person:null;return{id:b.id,name:b.name??"",type:b.type??"unknown",email:d?.email??"",avatar_url:b.avatar_url??""}}catch(a){throw I(a)}}},{name:"notion_create_page",description:"Create a new Notion page. Provide EITHER parent_page_id (to nest under a page) OR parent_database_id (to create a row in a database) — not both.",inputSchema:U,riskLevel:"write",async execute(a){if(a.parent_page_id&&a.parent_database_id)throw I(Error("Provide either parent_page_id OR parent_database_id, not both."));if(!a.parent_page_id&&!a.parent_database_id)throw I(Error("Must provide parent_page_id or parent_database_id."));try{let b,d="title";if(a.parent_database_id){b={database_id:a.parent_database_id};try{let b=await c.databases.retrieve({database_id:a.parent_database_id});for(let[a,c]of Object.entries(b.properties))if("title"===c.type){d=a;break}}catch{}}else b={type:"page_id",page_id:a.parent_page_id};let e={[d]:{title:J(a.title)}},f=[];a.content&&f.push({object:"block",type:"paragraph",paragraph:{rich_text:J(a.content)}});let g=await c.pages.create({parent:b,properties:e,...f.length>0&&{children:f}});return{id:g.id,url:"url"in g?String(g.url):"",title:a.title}}catch(a){throw I(a)}}},{name:"notion_update_page",description:"Update properties of a Notion page (title, status, select, text, number, etc.). Use notion_query_database first to discover the correct property names and types.",inputSchema:V,riskLevel:"write",async execute(a){try{let b=null;try{let d=await c.pages.retrieve({page_id:a.page_id}),e="parent"in d?d.parent:null;if(e?.type==="database_id"&&e.database_id){let a=await c.databases.retrieve({database_id:e.database_id});for(let[c,d]of(b={},Object.entries(a.properties)))b[c]={type:d.type}}}catch{}let d={};for(let[c,e]of Object.entries(a.properties))null!=e&&(d[c]=L(c,e,b));return await c.pages.update({page_id:a.page_id,properties:d}),{id:a.page_id,updated_properties:Object.keys(d).length}}catch(a){throw I(a)}}},{name:"notion_append_blocks",description:"Add content blocks to an existing Notion page. Supports paragraphs, headings, lists, code blocks, quotes, and dividers.",inputSchema:Z,riskLevel:"write",async execute(a){try{let b=a.blocks.map($);return await c.blocks.children.append({block_id:a.page_id,children:b}),{page_id:a.page_id,appended_count:b.length}}catch(a){throw I(a)}}},{name:"notion_update_block",description:"Update the text content of an existing Notion block. The block type is preserved.",inputSchema:_,riskLevel:"write",async execute(a){try{let b=await c.blocks.retrieve({block_id:a.block_id}),d="type"in b?String(b.type):"paragraph",e=J(a.content),f={block_id:a.block_id,[d]:{rich_text:e}};return await c.blocks.update(f),{id:a.block_id}}catch(a){throw I(a)}}},{name:"notion_create_database_entry",description:"Create a new row (entry) in a Notion database. Use notion_get_database first to discover property names and types.",inputSchema:ad,riskLevel:"write",async execute(a){try{let b=null,d="Name";try{let e=await c.databases.retrieve({database_id:a.database_id});for(let[a,c]of(b={},Object.entries(e.properties))){let e=c.type;b[a]={type:e},"title"===e&&(d=a)}}catch{}let e={};for(let[c,d]of Object.entries(a.properties))null!=d&&(e[c]=L(c,d,b));if(!e[d]){let b=Object.entries(a.properties).find(([,a])=>"string"==typeof a&&a);b&&(e[d]={title:J(b[1])})}let f=await c.pages.create({parent:{database_id:a.database_id},properties:e});return{id:f.id,url:"url"in f?String(f.url):""}}catch(a){throw I(a)}}},{name:"notion_update_database_entry",description:"Update properties of a Notion database row. Use notion_get_database to discover property names and types.",inputSchema:ae,riskLevel:"write",async execute(a){try{let b=null,d=a.database_id;if(d)try{let a=await c.databases.retrieve({database_id:d});for(let[c,d]of(b={},Object.entries(a.properties)))b[c]={type:d.type}}catch{}else try{let d=await c.pages.retrieve({page_id:a.page_id}),e="parent"in d?d.parent:null;if(e?.type==="database_id"&&e.database_id){let a=await c.databases.retrieve({database_id:e.database_id});for(let[c,d]of(b={},Object.entries(a.properties)))b[c]={type:d.type}}}catch{}let e={};for(let[c,d]of Object.entries(a.properties))null!=d&&(e[c]=L(c,d,b));return await c.pages.update({page_id:a.page_id,properties:e}),{id:a.page_id,updated_properties:Object.keys(e).length}}catch(a){throw I(a)}}},{name:"notion_create_database",description:"Create a new database inside a Notion page. Define columns with their types (title, rich_text, select, multi_select, number, checkbox, url, date, email).",inputSchema:ag,riskLevel:"write",async execute(a){try{let b={};for(let[c,d]of Object.entries(a.columns))b[c]=ah(d);let d=await c.databases.create({parent:{type:"page_id",page_id:a.parent_page_id},title:[{type:"text",text:{content:a.title}}],properties:b});return{id:d.id,url:"url"in d?String(d.url):"",title:a.title}}catch(a){throw I(a)}}},{name:"notion_update_database",description:"Update a database schema — add new columns or rename the database. Cannot modify existing column types (Notion API limitation).",inputSchema:ai,riskLevel:"write",async execute(a){if(!a.title&&!a.new_columns)throw I(Error("Provide title and/or new_columns to update."));try{let b={},d=[];if(a.title&&(b.title=[{type:"text",text:{content:a.title}}],d.push(`title → "${a.title}"`)),a.new_columns&&Object.keys(a.new_columns).length>0){let c={};for(let[b,d]of Object.entries(a.new_columns))c[b]=ah(d);b.properties=c,d.push(`${Object.keys(a.new_columns).length} column(s) added`)}return await c.databases.update({database_id:a.database_id,...b}),{id:a.database_id,changes:d}}catch(a){throw I(a)}}},{name:"notion_add_comment",description:"Add a comment to a Notion page.",inputSchema:ak,riskLevel:"write",async execute(a){try{return{id:(await c.comments.create({parent:{page_id:a.page_id},rich_text:J(a.text)})).id,page_id:a.page_id}}catch(a){throw I(a)}}},{name:"notion_archive_page",description:"Archive (soft-delete) a Notion page. The page can be restored from trash.",inputSchema:W,riskLevel:"destructive",async execute(a){try{return await c.pages.update({page_id:a.page_id,archived:!0}),{id:a.page_id,archived:!0}}catch(a){throw I(a)}}},{name:"notion_delete_block",description:"Delete (archive) a specific block from a Notion page.",inputSchema:aa,riskLevel:"destructive",async execute(a){try{return await c.blocks.delete({block_id:a.block_id}),{id:a.block_id,deleted:!0}}catch(a){throw I(a)}}}]}class ap extends Error{constructor(a,b,c){super(b),this.name="AirtableApiError",this.code=a,this.status=c}}function aq(a){return a instanceof ap?a:a instanceof Error?new ap("airtable_unknown",a.message):new ap("airtable_unknown",String(a))}let ar="https://api.airtable.com/v0",as=g.Ik({}),at=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it.")}),au=g.Ik({field:g.Yj().describe("Field name to sort by."),direction:g.k5(["asc","desc"]).optional().describe("Sort direction (default asc).")}),av=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID (tblXXXXXXXX) or name within the base. Use airtable_list_tables to find it."),view:g.Yj().optional().describe("Name or ID of the view to use."),pageSize:g.ai().int().min(1).max(100).optional().default(100).describe("Number of records per page (1–100, default 100)."),offset:g.Yj().optional().describe("Pagination offset token from a previous response."),fields:g.YO(g.Yj()).optional().describe("List of field names to return. Omit to return all fields."),filterByFormula:g.Yj().optional().describe("Airtable formula to filter records. Example: \"AND({Status}='Active',{Score}>80)\""),sort:g.YO(au).optional().describe("List of sort objects with field and optional direction.")}),aw=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID or name within the base."),recordId:g.Yj().describe("The record ID (recXXXXXXXX) to retrieve.")}),ax=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID or name within the base."),records:g.YO(g.Ik({fields:g.g1(g.Yj(),g.L5())})).min(1).max(10).describe('Array of records to create, each with a fields object. Max 10 per call. Example: [{"fields": {"Name": "Alice", "Status": "Active"}}]'),typecast:g.zM().optional().describe("If true, Airtable will attempt to convert string values to the appropriate field type. Default false.")}),ay=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID or name within the base."),recordId:g.Yj().describe("The record ID (recXXXXXXXX) to update."),fields:g.g1(g.Yj(),g.L5()).describe('Fields to update as key-value pairs. Only specified fields are changed (PATCH semantics). Example: {"Status": "Done", "Score": 95}'),typecast:g.zM().optional().describe("If true, attempt to convert string values to the appropriate field type.")}),az=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID or name within the base."),recordId:g.Yj().describe("The record ID (recXXXXXXXX) to replace."),fields:g.g1(g.Yj(),g.L5()).describe("Complete field set to write. Fields NOT included will be cleared (PUT semantics). Use airtable_update_record for partial updates."),typecast:g.zM().optional().describe("If true, attempt to convert string values to the appropriate field type.")}),aA=g.Ik({baseId:g.Yj().describe("The Airtable base ID (e.g. appXXXXXXXX). Use airtable_list_bases to find it."),tableIdOrName:g.Yj().describe("The table ID or name within the base."),recordId:g.Yj().describe("The record ID (recXXXXXXXX) to delete. This action is permanent and cannot be undone.")}),aB=[{slug:"airtable_list_bases",name:"List bases",risk:"read",requiresApproval:!1,description:"List all Airtable bases the integration has access to."},{slug:"airtable_list_tables",name:"List tables",risk:"read",requiresApproval:!1,description:"List all tables and field schemas in a base."},{slug:"airtable_list_records",name:"List records",risk:"read",requiresApproval:!1,description:"List records in a table with optional filtering, sorting, and pagination."},{slug:"airtable_get_record",name:"Get record",risk:"read",requiresApproval:!1,description:"Retrieve a single record by its ID."},{slug:"airtable_create_records",name:"Create records",risk:"write",requiresApproval:!1,description:"Create one or more records in a table (max 10 per call)."},{slug:"airtable_update_record",name:"Update record",risk:"write",requiresApproval:!1,description:"Update specific fields on a record (PATCH — unlisted fields unchanged)."},{slug:"airtable_replace_record",name:"Replace record",risk:"write",requiresApproval:!1,description:"Fully replace all fields on a record (PUT — unlisted fields cleared)."},{slug:"airtable_delete_record",name:"Delete record",risk:"destructive",requiresApproval:!0,description:"Permanently delete a single record. This action is irreversible."}];function aC(a){if(!a.accessToken)throw Error("AirtableAdapterOptions: accessToken must be a non-empty string.");let b=function(a){async function b(b,c,d){let e,f;try{e=await fetch(c,{method:b,headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},...void 0!==d&&{body:JSON.stringify(d)}})}catch(a){throw aq(a)}try{f=await e.json()}catch{f={}}if(!e.ok){let a,b=f;throw a="object"==typeof b?.error&&null!==b.error?b.error.message??e.statusText:"string"==typeof b?.error?b.error:b?.message?b.message:e.statusText,function(a,b){let c;switch(!0){case 401===a:c="airtable_unauthorized";break;case 403===a:c="airtable_forbidden";break;case 404===a:c="airtable_not_found";break;case 422===a:c="airtable_validation_error";break;case 429===a:c="airtable_rate_limited";break;case a>=500:c="airtable_transient";break;default:c="airtable_client_error"}return new ap(c,b,a)}(e.status,a)}return f}return{get:(a,c)=>b("GET",function(a,b,c){let d=new URL(`${a}${b}`);if(c)for(let[a,b]of Object.entries(c))if(Array.isArray(b))for(let c of b)d.searchParams.append(a,String(c));else null!=b&&d.searchParams.set(a,String(b));return d.toString()}(ar,a,c)),post:(a,c)=>b("POST",`${ar}${a}`,c),patch:(a,c)=>b("PATCH",`${ar}${a}`,c),put:(a,c)=>b("PUT",`${ar}${a}`,c),delete:a=>b("DELETE",`${ar}${a}`)}}(a.accessToken);return[{name:"airtable_list_bases",description:"List all Airtable bases the integration has access to. Returns base IDs and names needed for other airtable_ tools.",inputSchema:as,riskLevel:"read",async execute(a){try{return{bases:((await b.get("/meta/bases")).bases??[]).map(a=>({id:a.id,name:a.name,permissionLevel:a.permissionLevel}))}}catch(a){throw aq(a)}}},{name:"airtable_list_tables",description:"List all tables in an Airtable base including their field schemas. Use this to discover table IDs and field names before reading or writing records.",inputSchema:at,riskLevel:"read",async execute(a){try{return{tables:((await b.get(`/meta/bases/${a.baseId}/tables`)).tables??[]).map(a=>({id:a.id,name:a.name,primaryFieldId:a.primaryFieldId,fields:(a.fields??[]).map(a=>({id:a.id,name:a.name,type:a.type}))}))}}catch(a){throw aq(a)}}},{name:"airtable_list_records",description:"List records in an Airtable table. Supports filtering by formula, sorting, field selection, and pagination via offset token.",inputSchema:av,riskLevel:"read",async execute(a){try{let c={pageSize:a.pageSize??100};if(a.view&&(c.view=a.view),a.offset&&(c.offset=a.offset),a.filterByFormula&&(c.filterByFormula=a.filterByFormula),a.fields&&a.fields.length>0&&(c["fields[]"]=a.fields),a.sort&&a.sort.length>0)for(let b=0;b<a.sort.length;b++){let d=a.sort[b];d&&(c[`sort[${b}][field]`]=d.field,d.direction&&(c[`sort[${b}][direction]`]=d.direction))}let d=await b.get(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}`,c);return{records:(d.records??[]).map(a=>({id:a.id,fields:a.fields??{},createdTime:a.createdTime})),offset:d.offset}}catch(a){throw aq(a)}}},{name:"airtable_get_record",description:"Retrieve a single record from an Airtable table by its record ID. Returns all field values.",inputSchema:aw,riskLevel:"read",async execute(a){try{let c=await b.get(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}/${a.recordId}`);return{id:c.id,fields:c.fields??{},createdTime:c.createdTime}}catch(a){throw aq(a)}}},{name:"airtable_create_records",description:"Create one or more records in an Airtable table. Max 10 records per call. Field names must match the table schema exactly.",inputSchema:ax,riskLevel:"write",async execute(a){try{let c={records:a.records};return a.typecast&&(c.typecast=!0),{records:((await b.post(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}`,c)).records??[]).map(a=>({id:a.id,fields:a.fields??{},createdTime:a.createdTime}))}}catch(a){throw aq(a)}}},{name:"airtable_update_record",description:"Update specific fields on a single Airtable record (PATCH — only listed fields are changed, others remain). Use airtable_replace_record to overwrite all fields.",inputSchema:ay,riskLevel:"write",async execute(a){try{let c={fields:a.fields};a.typecast&&(c.typecast=!0);let d=await b.patch(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}/${a.recordId}`,c);return{id:d.id,fields:d.fields??{},createdTime:d.createdTime}}catch(a){throw aq(a)}}},{name:"airtable_replace_record",description:"Fully replace all fields on a single Airtable record (PUT — fields not listed are cleared to empty). Use airtable_update_record for partial field updates.",inputSchema:az,riskLevel:"write",async execute(a){try{let c={fields:a.fields};a.typecast&&(c.typecast=!0);let d=await b.put(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}/${a.recordId}`,c);return{id:d.id,fields:d.fields??{},createdTime:d.createdTime}}catch(a){throw aq(a)}}},{name:"airtable_delete_record",description:"Permanently delete a single record from an Airtable table. This is irreversible — confirm the record ID with airtable_get_record before deleting.",inputSchema:aA,riskLevel:"destructive",async execute(a){try{return{id:(await b.delete(`/${a.baseId}/${encodeURIComponent(a.tableIdOrName)}/${a.recordId}`)).id,deleted:!0}}catch(a){throw aq(a)}}}]}var aD=c(2370);class aE extends Error{constructor(a,b,c){super(b),this.name="DriveAdapterError",this.code=a,this.status=c}}function aF(a){if("object"==typeof a&&null!==a){let b="number"==typeof a.code?a.code:void 0,c="string"==typeof a.message?a.message:String(a);if(void 0!==b){let a;switch(b){case 400:a="drive_validation_error";break;case 401:a="drive_unauthorized";break;case 403:a="drive_forbidden";break;case 404:a="drive_not_found";break;case 409:a="drive_conflict";break;case 429:a="drive_rate_limited";break;case 503:a="drive_service_unavailable";break;default:a="drive_unknown"}return new aE(a,c,b)}}return a instanceof aE?a:a instanceof Error?new aE("drive_unknown",a.message):new aE("drive_unknown",String(a))}async function aG(a,b=100,c=100){let d,e=[],f=Math.min(c,1e3);for(let c=0;c<20;c++){let c=Math.min(b,1e3,f-e.length),g=await a(d,c);if(e.push(...g.items),e.length>=f||!g.nextPageToken||0===g.items.length)break;d=g.nextPageToken}return e.slice(0,f)}let aH=g.Ik({query:g.Yj().optional().describe("Google Drive search query. Examples: 'name contains \"resume\"' or '\"folder-id\" in parents' or 'mimeType=\"application/pdf\"'. Leave empty to list recent files."),max_results:g.ai().int().min(1).max(1e3).optional().describe("Max files to return (1–1000, default 20)."),order_by:g.Yj().optional().describe("Sort order. Examples: 'modifiedTime desc', 'name', 'createdTime'. Default: 'modifiedTime desc'.")});var aI=c(31187);async function aJ(a){return(await aI.extractRawText({buffer:a})).value}var aK=c(56308);async function aL(a){let b=new aK.Cm({data:a});return(await b.getText()).text}var aM=c(59124),aN=c.n(aM);async function aO(a){let b=new(aN()).Workbook;await b.xlsx.load(a);let c=[];return b.eachSheet(a=>{c.push(`--- Sheet: ${a.name} ---`);let b=0;a.eachRow(a=>{if(b>=200)return;let d=[];a.eachCell({includeEmpty:!1},a=>{let b=a.value;null==b?d.push(""):"object"==typeof b&&"result"in b?d.push(String(b.result??"")):"object"==typeof b&&b instanceof Date?d.push(b.toISOString().slice(0,10)):d.push(String(b))}),d.length>0&&(c.push(d.join(" ")),b++)}),b>=200&&c.push("[sheet truncated at 200 rows]")}),c.join("\n")}function aP(a){return a.toString("utf-8")}async function aQ(a,b,c){if(a.byteLength>0x1900000)throw new aE("drive_file_too_large",`File exceeds the 25 MB extraction limit (${Math.round(a.byteLength/1024/1024)} MB).`);let d=b.toLowerCase(),e=c.toLowerCase();if("application/vnd.openxmlformats-officedocument.wordprocessingml.document"===d||e.endsWith(".docx"))return aJ(a);if("application/pdf"===d||e.endsWith(".pdf"))return aL(a);if("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"===d||e.endsWith(".xlsx"))return aO(a);if("application/vnd.openxmlformats-officedocument.presentationml.presentation"===d||e.endsWith(".pptx"))throw new aE("drive_pptx_extraction_unsupported","PPTX text extraction is not yet supported. Export the file to Google Slides or PDF first.");if("application/json"===d||e.endsWith(".json"))try{let b=a.toString("utf-8"),c=JSON.parse(b);return JSON.stringify(c,null,2)}catch{return aP(a)}if(d.startsWith("text/")||"application/xml"===d||"application/javascript"===d||"application/typescript"===d)return aP(a);try{if((a.slice(0,1e3).toString("utf-8").match(/�/g)??[]).length>20)throw new aE("drive_unknown",`Binary file format (${b||"unknown"}) — cannot extract text.`);return aP(a)}catch(a){if(a instanceof aE)throw a;throw new aE("drive_unknown",`Binary file format (${b||"unknown"}) — cannot extract text.`)}}let aR=g.Ik({file_id:g.Yj().describe("The Google Drive file ID (from drive_list_files or drive_get_file_info).")}),aS=g.Ik({name:g.Yj().describe("File name including extension, e.g. 'cover_letter.txt'."),content:g.Yj().describe("Text content of the file."),folder_id:g.Yj().optional().describe("Optional Drive folder ID to place the file in."),mime_type:g.Yj().optional().describe("MIME type of the file. Default: 'text/plain'.")}),aT=g.Ik({file_id:g.Yj().describe("Google Drive file ID.")}),aU=g.Ik({name:g.Yj().describe("Folder name."),parent_id:g.Yj().optional().describe("Optional parent folder ID. Creates in root if omitted.")}),aV=g.Ik({file_id:g.Yj().describe("File ID to move."),new_parent_id:g.Yj().describe("Destination folder ID.")}),aW=g.Ik({file_id:g.Yj().describe("File ID to rename."),new_name:g.Yj().describe("New file name (including extension).")}),aX=g.Ik({file_id:g.Yj().describe("File ID to copy."),new_name:g.Yj().optional().describe("Optional name for the copy."),folder_id:g.Yj().optional().describe("Optional destination folder ID for the copy.")}),aY=g.Ik({file_id:g.Yj().describe("File ID to move to trash.")}),aZ=g.Ik({file_id:g.Yj().describe("File ID to share."),email:g.Yj().optional().describe("Email address to share with. Omit for link sharing (anyone with link)."),role:g.k5(["reader","writer","commenter","owner"]).optional().describe("Permission role: 'reader', 'writer', 'commenter', or 'owner'. Default: 'reader'."),type:g.k5(["user","group","domain","anyone"]).optional().describe("Permission type: 'user', 'group', 'domain', or 'anyone'. Defaults to 'user' if email provided, 'anyone' otherwise.")}),a$=g.Ik({file_id:g.Yj().describe("File ID to list permissions for.")}),a_=g.Ik({file_id:g.Yj().describe("Google Drive file ID. Must be a Google Workspace file (Doc, Sheet, Slide, etc.)."),mime_type:g.Yj().describe("Target MIME type. Examples: 'text/plain', 'text/csv', 'application/pdf', 'text/html', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'.")});class a0 extends Error{constructor(a,b,c){super(b),this.name="GmailAdapterError",this.code=a,this.status=c}}function a1(a){if("object"==typeof a&&null!==a){let b="number"==typeof a.code?a.code:void 0,c="string"==typeof a.message?a.message:String(a);if(void 0!==b){let a;switch(b){case 400:a="gmail_validation_error";break;case 401:a="gmail_unauthorized";break;case 403:a="gmail_forbidden";break;case 404:a="gmail_message_not_found";break;case 429:a="gmail_quota_exceeded";break;case 503:a="gmail_service_unavailable";break;default:a="gmail_unknown"}return new a0(a,c,b)}}return a instanceof a0?a:a instanceof Error?new a0("gmail_unknown",a.message):new a0("gmail_unknown",String(a))}async function a2(a,b=100,c=100){let d,e=[],f=Math.min(c,500);for(let c=0;c<20;c++){let c=Math.min(b,500,f-e.length),g=await a(d,c);if(e.push(...g.items),e.length>=f||!g.nextPageToken||0===g.items.length)break;d=g.nextPageToken}return e.slice(0,f)}function a3(a){let b=a.body?.data;if(!b)return"";if(!b)return"";let c=b.replace(/-/g,"+").replace(/_/g,"/"),d=(4-c.length%4)%4,e=c+"=".repeat(d);try{return Buffer.from(e,"base64").toString("utf-8")}catch{return""}}function a4(a){if(!a)return"";let b=a.mimeType??"";if(b.startsWith("text/plain"))return a3(a);if(b.startsWith("text/html"))return a3(a).replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<[^>]+>/g," ").replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/[ \t]+/g," ").replace(/\n\s*\n\s*\n/g,"\n\n").trim();if(b.startsWith("multipart/")){let b=a.parts??[];for(let a of b)if((a.mimeType??"").startsWith("text/plain")){let b=a4(a);if(b.trim())return b}for(let a of b)if((a.mimeType??"").startsWith("text/html")){let b=a4(a);if(b.trim())return b}for(let a of b)if((a.mimeType??"").startsWith("multipart/")){let b=a4(a);if(b.trim())return b}}return""}function a5(a){let b={};for(let c of a?.headers??[])c.name&&null!=c.value&&(b[c.name.toLowerCase()]=c.value);return b}let a6={".html":"text/html",".htm":"text/html",".csv":"text/csv",".tsv":"text/tab-separated-values",".json":"application/json",".xml":"application/xml",".md":"text/markdown",".markdown":"text/markdown",".txt":"text/plain",".log":"text/plain",".js":"text/javascript",".css":"text/css",".yaml":"application/yaml",".yml":"application/yaml"};function a7(a){if(![...a].some(a=>a.charCodeAt(0)>127))return a;let b=Buffer.from(a,"utf-8").toString("base64");return`=?utf-8?B?${b}?=`}function a8(a){let b,{to:c,subject:d,body:e,from:f,cc:g,bcc:h,replyTo:i,inReplyTo:j,references:k,attachments:l}=a,m=l&&l.length>0,n=e.includes("<")&&e.includes(">")&&/<[a-zA-Z][^>]*>/.test(e);if(m){let a=`nodalai_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`,m=Buffer.from(e,"utf-8").toString("base64"),p=[];f&&p.push(`From: ${f}`),p.push(`To: ${c}`),g&&p.push(`Cc: ${g}`),h&&p.push(`Bcc: ${h}`),i&&p.push(`Reply-To: ${i}`),p.push(`Subject: ${a7(d)}`),j&&p.push(`In-Reply-To: ${j}`),k&&p.push(`References: ${k}`),p.push("MIME-Version: 1.0"),p.push(`Content-Type: multipart/mixed; boundary="${a}"`);let q=[];for(let b of(q.push([`--${a}`,`Content-Type: ${n?"text/html; charset=utf-8":"text/plain; charset=utf-8"}`,"Content-Transfer-Encoding: base64","",m.match(/.{1,76}/g)?.join("\r\n")??m].join("\r\n")),l)){var o;let c=b.mimeType??a6[(o=b.filename).includes(".")?"."+o.split(".").pop().toLowerCase():""]??"application/octet-stream",d=a7(b.filename),e=("base64"===b.encoding?Buffer.from(b.content,"base64"):Buffer.from(b.content,"utf-8")).toString("base64");q.push([`--${a}`,`Content-Type: ${c}; name="${d}"`,"Content-Transfer-Encoding: base64",`Content-Disposition: attachment; filename="${d}"`,"",e.match(/.{1,76}/g)?.join("\r\n")??e].join("\r\n"))}b=p.join("\r\n")+"\r\n\r\n"+q.join("\r\n")+`\r
4
+ --${a}--`}else{let a=Buffer.from(e,"utf-8").toString("base64"),l=[];f&&l.push(`From: ${f}`),l.push(`To: ${c}`),g&&l.push(`Cc: ${g}`),h&&l.push(`Bcc: ${h}`),i&&l.push(`Reply-To: ${i}`),l.push(`Subject: ${a7(d)}`),j&&l.push(`In-Reply-To: ${j}`),k&&l.push(`References: ${k}`),l.push("MIME-Version: 1.0"),l.push(`Content-Type: ${n?"text/html; charset=utf-8":"text/plain; charset=utf-8"}`),l.push("Content-Transfer-Encoding: base64"),l.push(""),l.push(a.match(/.{1,76}/g)?.join("\r\n")??a),b=l.join("\r\n")}return Buffer.from(b).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}let a9=g.Ik({filename:g.Yj().describe("File name shown in the email, e.g. 'report.html'."),content:g.Yj().describe("File content as a string (plain text by default, or base64 if encoding is base64)."),mimeType:g.Yj().optional().describe("MIME type, e.g. 'text/html'. Inferred from filename if omitted."),encoding:g.k5(["text","base64"]).optional().describe("How content is encoded. Default 'text'. Use 'base64' for pre-encoded binaries.")}),ba=g.Ik({to:g.Yj().describe("Recipient email address or comma-separated list."),subject:g.Yj().describe("Email subject line."),body:g.Yj().describe("Email body — plain text or HTML."),cc:g.Yj().optional().describe("CC address(es), comma-separated."),bcc:g.Yj().optional().describe("BCC address(es), comma-separated."),reply_to:g.Yj().optional().describe("Reply-To header."),attachments:g.YO(a9).optional().describe("Optional file attachments. Each item: {filename, content, mimeType?, encoding?}. Default encoding is 'text' — pass the file content as a plain string. Use encoding='base64' only when you hold pre-encoded binary content.")}),bb=g.Ik({query:g.Yj().optional().describe("Gmail search query. Examples: 'is:unread', 'from:alice@example.com', 'subject:invoice newer_than:7d'. Default: lists recent messages in inbox."),max_results:g.ai().int().min(1).max(500).optional().describe("Max messages to return (1–500, default 20)."),include_spam_trash:g.zM().optional().describe("Include messages from SPAM and TRASH (default false).")}),bc=g.Ik({message_id:g.Yj().describe("Gmail message ID (from gmail_list_messages).")}),bd=g.Ik({message_id:g.Yj().describe("ID of the message to reply to."),body:g.Yj().describe("Reply body — plain text or HTML."),cc:g.Yj().optional().describe("CC address(es), comma-separated."),attachments:g.YO(a9).optional().describe("Optional attachments to include with the reply.")}),be=g.Ik({message_id:g.Yj().describe("ID of the message to forward."),to:g.Yj().describe("Recipient(s), comma-separated."),note:g.Yj().optional().describe("Optional note prepended before the forwarded body."),cc:g.Yj().optional().describe("CC address(es), comma-separated.")}),bf=g.Ik({message_id:g.Yj().describe("Gmail message ID."),add_labels:g.YO(g.Yj()).optional().describe("Label IDs or system labels to add, e.g. ['STARRED', 'IMPORTANT']."),remove_labels:g.YO(g.Yj()).optional().describe("Label IDs or system labels to remove, e.g. ['UNREAD', 'INBOX'].")}),bg=g.Ik({message_id:g.Yj().describe("Gmail message ID to move to Trash.")}),bh=g.Ik({message_id:g.Yj().describe("Gmail message ID to restore from Trash.")}),bi=g.Ik({message_id:g.Yj().describe("Gmail message ID to permanently delete.")}),bj=g.Ik({query:g.Yj().optional().describe("Gmail search query. Examples: 'is:unread', 'from:alice@example.com label:work'."),max_results:g.ai().int().min(1).max(500).optional().describe("Max threads to return (1–500, default 20)."),include_spam_trash:g.zM().optional().describe("Include threads from SPAM and TRASH (default false).")}),bk=g.Ik({thread_id:g.Yj().describe("Gmail thread ID (from gmail_list_threads or gmail_list_messages).")}),bl=g.Ik({thread_id:g.Yj().describe("Gmail thread ID."),add_labels:g.YO(g.Yj()).optional().describe("Label IDs or system labels to add to all messages in the thread, e.g. ['STARRED']."),remove_labels:g.YO(g.Yj()).optional().describe("Label IDs or system labels to remove from all messages, e.g. ['UNREAD'].")}),bm=g.Ik({thread_id:g.Yj().describe("Gmail thread ID to move to Trash.")}),bn=g.Ik({}),bo=g.Ik({label_id:g.Yj().describe("Label ID (from gmail_list_labels). System labels: 'INBOX', 'SENT', etc.")}),bp=g.Ik({name:g.Yj().describe("Label name. Use '/' for nesting, e.g. 'Clients/Acme'."),label_list_visibility:g.k5(["labelShow","labelShowIfUnread","labelHide"]).optional().describe("Sidebar visibility (default labelShow)."),message_list_visibility:g.k5(["show","hide"]).optional().describe("Visibility in message list (default show).")}),bq=g.Ik({label_id:g.Yj().describe("Label ID to update (from gmail_list_labels)."),name:g.Yj().optional().describe("New label name."),label_list_visibility:g.k5(["labelShow","labelShowIfUnread","labelHide"]).optional().describe("Sidebar visibility."),message_list_visibility:g.k5(["show","hide"]).optional().describe("Message list visibility.")}),br=g.Ik({label_id:g.Yj().describe("Label ID to permanently delete (cannot delete system labels like INBOX).")}),bs=g.Ik({filename:g.Yj().describe("File name shown in the email, e.g. 'report.html'."),content:g.Yj().describe("File content as a string (plain text by default)."),mimeType:g.Yj().optional().describe("MIME type. Inferred from filename if omitted."),encoding:g.k5(["text","base64"]).optional().describe("'text' (default) or 'base64' for binaries.")}),bt=g.Ik({max_results:g.ai().int().min(1).max(500).optional().describe("Max drafts to return (default 20)."),query:g.Yj().optional().describe("Optional Gmail search query.")}),bu=g.Ik({to:g.Yj().describe("Recipient email address."),subject:g.Yj().describe("Email subject line."),body:g.Yj().describe("Email body — plain text or HTML."),cc:g.Yj().optional().describe("CC address(es), comma-separated."),bcc:g.Yj().optional().describe("BCC address(es), comma-separated."),reply_to_message_id:g.Yj().optional().describe("If provided, sets In-Reply-To and threadId so this draft is a reply in-thread."),attachments:g.YO(bs).optional().describe("Optional file attachments.")}),bv=g.Ik({draft_id:g.Yj().describe("Draft ID to update (from gmail_list_drafts or gmail_create_draft)."),to:g.Yj().describe("Recipient email address."),subject:g.Yj().describe("Email subject line."),body:g.Yj().describe("Email body — plain text or HTML."),cc:g.Yj().optional().describe("CC address(es), comma-separated."),bcc:g.Yj().optional().describe("BCC address(es), comma-separated."),attachments:g.YO(bs).optional().describe("Optional file attachments.")}),bw=g.Ik({draft_id:g.Yj().describe("Draft ID to send (from gmail_list_drafts or gmail_create_draft).")}),bx=g.Ik({draft_id:g.Yj().describe("Draft ID to permanently delete.")}),by=g.Ik({message_id:g.Yj().describe("Gmail message ID containing the attachment."),attachment_id:g.Yj().describe("Attachment ID (from gmail_get_message attachments list)."),filename:g.Yj().optional().describe("Filename hint (for display only, not required).")}),bz=g.Ik({start_history_id:g.Yj().describe("The historyId to start listing changes from. Get an initial historyId from gmail_list_messages or gmail_get_message (historyId field)."),max_results:g.ai().int().min(1).max(500).optional().describe("Max history records to return (default 100)."),label_id:g.Yj().optional().describe("Filter history records by label ID.")});class bA extends Error{constructor(a,b,c){super(b),this.name="SheetsAdapterError",this.code=a,this.status=c}}function bB(a){if("object"==typeof a&&null!==a){let b="number"==typeof a.code?a.code:void 0,c="string"==typeof a.message?a.message:String(a);if(void 0!==b){let a;switch(b){case 400:{let b=c.toLowerCase();a=b.includes("range")||b.includes("a1 notation")||b.includes("unable to parse")?"sheets_invalid_range":"sheets_validation_error";break}case 401:a="sheets_unauthorized";break;case 403:a="sheets_forbidden";break;case 404:a="sheets_not_found";break;case 429:a="sheets_rate_limited";break;case 503:a="sheets_service_unavailable";break;default:a="sheets_unknown"}return new bA(a,c,b)}}return a instanceof bA?a:a instanceof Error?new bA("sheets_unknown",a.message):new bA("sheets_unknown",String(a))}function bC(a){return null==a?"":"number"==typeof a||"boolean"==typeof a||"string"==typeof a?a:String(a)}function bD(a){return a.map(bC)}function bE(a){return a?a.map(bD):[]}function bF(a){let b,c,d,e=a.trim();if(!e)throw new bA("sheets_invalid_range","Empty range string");let f=e.indexOf("!");if(-1!==f){let a=e.slice(0,f);c=e.slice(f+1),a.startsWith("'")&&a.endsWith("'")&&(a=a.slice(1,-1).replace(/''/g,"'")),b=a}else c=e,b=void 0;if(!c||!/^[A-Za-z0-9:$]+$/.test(c))throw new bA("sheets_invalid_range",`Invalid cell range portion: '${c}' in '${a}'`);if(void 0!==b){let a=/[\s!'"\\]/.test(b)?`'${b.replace(/'/g,"''")}'`:b;d=`${a}!${c}`}else d=c;return{sheetName:b,cellRange:c,canonical:d}}let bG=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),range:g.Yj().describe("A1-notation range, e.g. 'Sheet1!A1:D10' or 'A:A' for a full column."),value_render_option:g.k5(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional().describe("How values are rendered. FORMATTED_VALUE (default) returns display strings. UNFORMATTED_VALUE returns raw numbers/booleans. FORMULA returns formula strings.")}),bH=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_name:g.Yj().optional().describe("Sheet tab name (default: first sheet).")}),bI=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),ranges:g.YO(g.Yj()).min(1).max(50).describe("Array of A1-notation ranges to read in a single API call (max 50)."),value_render_option:g.k5(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional().describe("How values are rendered (default FORMATTED_VALUE).")}),bJ=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),range:g.Yj().describe("A1-notation range. The top-left cell anchors the write, e.g. 'Sheet1!A1'."),values:g.YO(g.YO(g.L5())).describe("2D array of values to write. Example: [['Name','Score'],['Alice',95]]."),value_input_option:g.k5(["RAW","USER_ENTERED"]).optional().describe("RAW stores strings as-is; USER_ENTERED parses numbers/dates/formulas like a human typing (default).")}),bK=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),range:g.Yj().describe("Sheet name or range that identifies where to append, e.g. 'Sheet1' or 'Sheet1!A:Z'. Sheets auto-detects the last row with data and appends after it."),values:g.YO(g.YO(g.L5())).describe("2D array of rows to append. For a single row: [['Name','Score']]. For multiple: [['Alice',95],['Bob',87]]."),value_input_option:g.k5(["RAW","USER_ENTERED"]).optional().describe("RAW stores strings as-is; USER_ENTERED parses numbers/dates/formulas (default).")}),bL=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),range:g.Yj().describe("A1-notation range to clear, e.g. 'Sheet1!A2:Z100'. Formatting is preserved.")}),bM=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),updates:g.YO(g.Ik({range:g.Yj().describe("A1-notation range, e.g. 'Sheet1!A1'."),values:g.YO(g.YO(g.L5())).describe("2D array of values to write.")})).min(1).max(50).describe("Array of range+values pairs to write in a single API call (max 50)."),value_input_option:g.k5(["RAW","USER_ENTERED"]).optional().describe("RAW stores strings as-is; USER_ENTERED parses numbers/dates/formulas (default).")}),bN=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_name:g.Yj().optional().describe("Sheet tab name (default: first sheet)."),column:g.Yj().describe("Header name of the column to search (from row 1)."),equals:g.Yj().optional().describe("Return rows where the column value exactly equals this string."),contains:g.Yj().optional().describe("Return rows where the column value contains this substring (case-sensitive)."),limit:g.ai().int().min(1).max(1e3).optional().describe("Max matching rows to return (default 100, max 1000).")}),bO=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit).")}),bP=g.Ik({title:g.Yj().describe("Title for the new spreadsheet."),sheet_title:g.Yj().optional().describe("Title for the first sheet tab (default: 'Sheet1').")}),bQ=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),title:g.Yj().describe("Title for the new sheet tab."),index:g.ai().int().min(0).optional().describe("Zero-based position to insert the sheet (default: appended at end).")}),bR=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID (not the tab name). Get it from sheets_get_metadata.")}),bS=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),source_sheet_id:g.ai().int().describe("Numeric ID of the sheet to duplicate. Get it from sheets_get_metadata."),new_sheet_name:g.Yj().optional().describe('Name for the duplicated sheet (defaults to "Copy of <original>").'),insert_sheet_index:g.ai().int().min(0).optional().describe("Zero-based position to insert the duplicate (default: appended at end).")}),bT=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),new_title:g.Yj().describe("New tab name for the sheet.")}),bU=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),start_row_index:g.ai().int().min(0).describe("Zero-based start row index (inclusive)."),end_row_index:g.ai().int().min(1).describe("Zero-based end row index (exclusive). E.g. rows 0–1 → endRowIndex=1."),start_column_index:g.ai().int().min(0).describe("Zero-based start column index (inclusive)."),end_column_index:g.ai().int().min(1).describe("Zero-based end column index (exclusive). E.g. columns 0–3 → endColumnIndex=3."),bold:g.zM().optional().describe("Set bold text."),italic:g.zM().optional().describe("Set italic text."),font_size:g.ai().int().min(1).optional().describe("Font size in points."),background_color:g.Ik({red:g.ai().min(0).max(1).describe("Red channel 0–1."),green:g.ai().min(0).max(1).describe("Green channel 0–1."),blue:g.ai().min(0).max(1).describe("Blue channel 0–1.")}).optional().describe("Background fill color (RGB, each channel 0–1)."),foreground_color:g.Ik({red:g.ai().min(0).max(1).describe("Red channel 0–1."),green:g.ai().min(0).max(1).describe("Green channel 0–1."),blue:g.ai().min(0).max(1).describe("Blue channel 0–1.")}).optional().describe("Text foreground color (RGB, each channel 0–1)."),number_format:g.Ik({type:g.k5(["TEXT","NUMBER","PERCENT","CURRENCY","DATE","TIME","DATE_TIME","SCIENTIFIC"]).describe("Number format type."),pattern:g.Yj().optional().describe("Optional format pattern, e.g. '#,##0.00' for currency.")}).optional().describe("Number format to apply."),horizontal_alignment:g.k5(["LEFT","CENTER","RIGHT"]).optional().describe("Horizontal text alignment.")}),bV=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),start_column_index:g.ai().int().min(0).describe("Zero-based start column index (inclusive)."),end_column_index:g.ai().int().min(1).describe("Zero-based end column index (exclusive). E.g. columns 0–3 → endColumnIndex=3."),pixel_size:g.ai().int().min(0).optional().describe("Column width in pixels. Omit to auto-resize to fit content.")}),bW=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),frozen_row_count:g.ai().int().min(0).optional().describe("Number of rows to freeze at the top (0 to unfreeze, default 0)."),frozen_column_count:g.ai().int().min(0).optional().describe("Number of columns to freeze at the left (0 to unfreeze, default 0).")}),bX=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),start_row_index:g.ai().int().min(0).describe("Zero-based start row index (inclusive). Usually 0 for the header row."),end_row_index:g.ai().int().min(1).describe("Zero-based end row index (exclusive)."),start_column_index:g.ai().int().min(0).describe("Zero-based start column index (inclusive)."),end_column_index:g.ai().int().min(1).describe("Zero-based end column index (exclusive).")}),bY=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata.")}),bZ=g.Ik({dimension_index:g.ai().int().min(0).describe("Zero-based column index to sort by."),sort_order:g.k5(["ASCENDING","DESCENDING"]).describe("Sort direction: 'ASCENDING' or 'DESCENDING'.")}),b$=g.Ik({spreadsheet_id:g.Yj().describe("The spreadsheet ID from the URL (between /d/ and /edit)."),sheet_id:g.ai().int().describe("Numeric sheet ID. Get it from sheets_get_metadata."),start_row_index:g.ai().int().min(0).describe("Zero-based start row index (inclusive). Set to 1 to exclude the header row."),end_row_index:g.ai().int().min(1).describe("Zero-based end row index (exclusive)."),start_column_index:g.ai().int().min(0).describe("Zero-based start column index (inclusive)."),end_column_index:g.ai().int().min(1).describe("Zero-based end column index (exclusive)."),sort_specs:g.YO(bZ).min(1).describe("Array of sort specs (primary, secondary, ...). Each: { dimension_index, sort_order }. Example: [{ dimension_index: 2, sort_order: 'DESCENDING' }].")});class b_ extends Error{constructor(a,b,c){super(b),this.name="DocsAdapterError",this.code=a,this.status=c}}function b0(a){if("object"==typeof a&&null!==a){let b="number"==typeof a.code?a.code:void 0,c="string"==typeof a.message?a.message:String(a);if(void 0!==b){let a;switch(b){case 400:a="docs_invalid_request";break;case 401:a="docs_unauthorized";break;case 403:a="docs_forbidden";break;case 404:a="docs_not_found";break;case 429:a="docs_rate_limited";break;case 503:a="docs_service_unavailable";break;default:a="docs_unknown"}return new b_(a,c,b)}}return a instanceof b_?a:a instanceof Error?new b_("docs_unknown",a.message):new b_("docs_unknown",String(a))}function b1(a){let b=[];for(let c of a.content??[])c.paragraph?b.push(b2(c.paragraph)):c.table?b.push(function(a){let b=[];for(let c of a.tableRows??[]){let a=[];for(let b of c.tableCells??[]){let c=(b.content??[]).map(a=>a.paragraph?b2(a.paragraph):"").join("").replace(/\n$/,"");a.push(c)}b.push(a.join(" ")+"\n")}return b.join("")}(c.table)):c.sectionBreak&&b.push("\n");return b.join("")}function b2(a){let b=[];for(let c of a.elements??[])c.textRun?.content?b.push(c.textRun.content):c.inlineObjectElement?b.push("[image]"):c.horizontalRule&&b.push("\n---\n");return b.join("")}function b3(a){return{insertText:{endOfSegmentLocation:{segmentId:""},text:a}}}function b4(a,b,c){return{updateParagraphStyle:{range:{startIndex:a,endIndex:b},paragraphStyle:{namedStyleType:c},fields:"namedStyleType"}}}let b5=g.Ik({title:g.Yj().describe("Title for the new document."),content:g.Yj().optional().describe("Optional initial text content to insert into the document body.")}),b6=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit).")}),b7=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit).")}),b8=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),text:g.Yj().describe("Text to insert."),index:g.ai().int().min(1).describe("Document body index at which to insert text. Index 1 = beginning of body. Use docs_get to inspect element indices. Insertions shift all subsequent content.")}),b9=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),text:g.Yj().describe("Text to append at the end of the document. Use \\n for line breaks.")}),ca=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),find:g.Yj().describe("The exact text string to find in the document."),replace:g.Yj().describe("The text to replace all found occurrences with."),match_case:g.zM().optional().describe("Whether to match case exactly (default: true).")}),cb=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),start_index:g.ai().int().min(1).describe("Start of the range to delete (inclusive). Get indices from docs_get."),end_index:g.ai().int().min(2).describe("End of the range to delete (exclusive). Content at [startIndex, endIndex) is removed.")}),cc=g.k5(["NORMAL_TEXT","TITLE","SUBTITLE","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6"]),cd=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),text:g.Yj().describe("Paragraph text. A newline is appended automatically if not present."),index:g.ai().int().min(1).describe("Document body index at which to insert the paragraph. Index 1 = beginning of body. Use docs_get to find indices."),named_style:cc.optional().describe("Optional named paragraph style to apply after inserting (e.g. HEADING_1, NORMAL_TEXT).")}),ce=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),index:g.ai().int().min(1).describe("Document body index at which to insert the page break.")}),cf=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),index:g.ai().int().min(1).describe("Document body index at which to insert the table."),rows:g.ai().int().min(1).max(100).describe("Number of rows in the table (1–100)."),columns:g.ai().int().min(1).max(20).describe("Number of columns in the table (1–20).")}),cg=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),image_uri:g.Yj().url().describe("Public URL of the image to insert (must be publicly accessible)."),index:g.ai().int().min(1).describe("Document body index at which to insert the image."),width_pt:g.ai().positive().optional().describe("Optional image width in points (1pt ≈ 1.333px). Omit to use source dimensions."),height_pt:g.ai().positive().optional().describe("Optional image height in points. Omit to use source dimensions.")}),ch=g.k5(["NORMAL_TEXT","TITLE","SUBTITLE","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6"]),ci=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),start_index:g.ai().int().min(1).describe("Start of the text range to format (inclusive). Get indices from docs_get."),end_index:g.ai().int().min(2).describe("End of the text range to format (exclusive)."),bold:g.zM().optional().describe("Apply bold formatting."),italic:g.zM().optional().describe("Apply italic formatting."),underline:g.zM().optional().describe("Apply underline formatting."),strikethrough:g.zM().optional().describe("Apply strikethrough formatting."),font_size_pt:g.ai().positive().optional().describe("Font size in points (e.g. 12, 14, 18)."),foreground_color:g.Ik({red:g.ai().min(0).max(1).describe("Red channel 0–1."),green:g.ai().min(0).max(1).describe("Green channel 0–1."),blue:g.ai().min(0).max(1).describe("Blue channel 0–1.")}).optional().describe("Text foreground color (RGB, each channel 0–1)."),font_family:g.Yj().optional().describe('Font family name (e.g. "Arial", "Times New Roman", "Roboto").')}),cj=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),start_index:g.ai().int().min(1).describe("Start of the paragraph range (inclusive). Get indices from docs_get."),end_index:g.ai().int().min(2).describe("End of the paragraph range (exclusive)."),named_style:ch.describe("The paragraph style to apply: NORMAL_TEXT, TITLE, SUBTITLE, HEADING_1 through HEADING_6.")}),ck=g.Ik({document_id:g.Yj().describe("The Google Doc ID (from the URL: docs.google.com/document/d/{ID}/edit)."),requests:g.YO(g.g1(g.Yj(),g.L5())).min(1).describe("Array of Google Docs API Request objects. Each object must have exactly one key matching a Docs API operation (e.g. insertText, deleteContentRange, updateParagraphStyle, replaceAllText, etc.). See https://developers.google.com/docs/api/reference/rest/v1/documents/request for the full schema.")});var cl=c(45160);class cm extends Error{constructor(a,b,c){super(b),this.name="FirecrawlApiError",this.code=a,this.status=c}}function cn(a){return a instanceof cm?a:a instanceof Error?new cm("firecrawl_unknown",a.message):new cm("firecrawl_unknown",String(a))}let co=g.Ik({url:g.Yj().url().describe("The URL to scrape."),formats:g.YO(g.k5(["markdown","html","links"])).optional().default(["markdown"]).describe("Content formats to return. Defaults to ['markdown'].")}),cp=g.Ik({url:g.Yj().url().describe("The root URL whose site to map."),search:g.Yj().optional().describe("Optional keyword filter — only return URLs matching this term.")}),cq=g.Ik({query:g.Yj().min(1).describe("The search query to send to Firecrawl."),limit:g.ai().int().min(1).max(100).optional().describe("Maximum number of results to return (1–100).")}),cr=g.Ik({url:g.Yj().url().describe("The root URL to crawl."),limit:g.ai().int().min(1).max(100).optional().describe("Maximum number of pages to crawl (1–100).")}),cs=g.Ik({id:g.Yj().min(1).describe("The crawl job ID returned by firecrawl_crawl_start.")});var ct=c(27833),cu=c(99740);let cv=g.Ik({actorId:g.Yj().describe('The actor ID or name in the format "owner/actor-name" (e.g. "apify/web-scraper") or just the actor ID.'),input:g.g1(g.Yj(),g.L5()).optional().describe("Input object to pass to the actor. Structure depends on the actor. Omit to use actor defaults.")}),cw=g.Ik({runId:g.Yj().describe("The Apify run ID to retrieve metadata for.")}),cx=g.Ik({limit:g.ai().int().min(1).max(1e3).optional().default(100).describe("Maximum number of datasets to return (default 100, max 1000)."),offset:g.ai().int().min(0).optional().default(0).describe("Number of datasets to skip (for pagination). Default 0.")}),cy=g.Ik({datasetId:g.Yj().describe("The Apify dataset ID to read from. Use apify_run_actor to get the datasetId from a run, or apify_list_datasets to browse existing datasets."),limit:g.ai().int().min(1).max(1e3).optional().default(100).describe("Maximum number of items to return (default 100, max 1000)."),offset:g.ai().int().min(0).optional().default(0).describe("Number of items to skip (for pagination). Default 0.")});var cz=c(43286);class cA extends Error{constructor(a,b,c){super(b),this.name="TavilyApiError",this.code=a,this.status=c}}function cB(a){if(a instanceof cA)return a;if(a instanceof Error){let d=/status[:\s]+(\d{3})/i.exec(a.message);if(d){let e;var b=parseInt(d[1]??"0",10),c=a.message;switch(!0){case 401===b:e="tavily_unauthorized";break;case 403===b:e="tavily_forbidden";break;case 404===b:e="tavily_not_found";break;case 422===b:e="tavily_validation_error";break;case 429===b:e="tavily_rate_limited";break;case b>=500:e="tavily_transient";break;default:e="tavily_client_error"}return new cA(e,c,b)}return new cA("tavily_unknown",a.message)}return new cA("tavily_unknown",String(a))}let cC=g.Ik({query:g.Yj().min(1).describe("The search query to send to Tavily."),searchDepth:g.k5(["basic","advanced"]).optional().describe('Search depth: "basic" is faster, "advanced" is more thorough. Default: "basic".'),maxResults:g.ai().int().min(1).max(20).optional().describe("Maximum number of results to return (1–20, default 5)."),includeImages:g.zM().optional().describe("Whether to include image results. Default: false."),topic:g.k5(["general","news"]).optional().describe('Search topic category: "general" or "news". Default: "general".')}),cD=g.Ik({urls:g.YO(g.Yj().url()).min(1).max(20).describe("Array of URLs to extract content from (max 20)."),extractDepth:g.k5(["basic","advanced"]).optional().describe('Extraction depth: "basic" or "advanced". Default: "basic".')}),cE=g.Ik({url:g.Yj().url().describe("The seed URL to start crawling from."),maxDepth:g.ai().int().min(1).max(5).optional().describe("Maximum link depth to follow from the seed URL (1–5, default 1)."),limit:g.ai().int().min(1).max(50).optional().describe("Maximum number of pages to scrape (1–50, default 10).")}),cF={"google-drive":{credentialType:"google-oauth",toolFactory:a=>{let b,d;return(b=new aD.q7g.auth.OAuth2).setCredentials({access_token:a}),[(d=aD.q7g.drive({version:"v3",auth:b}),{name:"drive_list_files",description:"List files in Google Drive. Optionally filter by folder or search query. Returns file names and IDs needed for drive_read_file.",inputSchema:aH,riskLevel:"read",async execute(a){try{let b=Math.min(a.max_results??20,1e3),c=await aG(async(b,c)=>{let e={pageSize:c,fields:"nextPageToken,files(id,name,mimeType,modifiedTime,size)",orderBy:a.order_by??"modifiedTime desc",...b&&{pageToken:b},...a.query&&{q:a.query}},f=await d.files.list(e);return{items:f.data.files??[],nextPageToken:f.data.nextPageToken}},Math.min(b,100),b);return{total:c.length,files:c.map(a=>({id:a.id??"",name:a.name??"",mimeType:a.mimeType??"",modifiedTime:a.modifiedTime??"",size:null!=a.size?Number(a.size):null}))}}catch(a){throw aF(a)}}}),{name:"drive_read_file",description:"Read the text content of a file from Google Drive. Handles Google Docs (exported as plain text), plain text, DOCX, PDF, XLSX. Use drive_list_files first to get the file ID.",inputSchema:aR,riskLevel:"read",async execute(a){try{let b,c=(await d.files.get({fileId:a.file_id,fields:"id,name,mimeType,size"})).data,e=c.mimeType??"",f=c.name??"",g=null!=c.size?Number(c.size):null;if(null!=g&&g>0x1900000)throw new aE("drive_file_too_large",`File exceeds the 25 MB extraction limit (${Math.round(g/1024/1024)} MB).`);if(e.startsWith("application/vnd.google-apps.")){let c;c="application/vnd.google-apps.document"===e?"text/plain":"application/vnd.google-apps.spreadsheet"===e?"text/csv":"text/plain";let f=await d.files.export({fileId:a.file_id,mimeType:c},{responseType:"text"});b="string"==typeof f.data?f.data:String(f.data)}else{let c=await d.files.get({fileId:a.file_id,alt:"media"},{responseType:"arraybuffer"}),g=Buffer.from(c.data);b=await aQ(g,e,f)}let h=b.length>15e3,i=h?b.slice(0,15e3)+"\n\n[...file truncated at 15000 chars...]":b;return{file_id:a.file_id,name:f,mimeType:e,content:i,truncated:h,char_count:i.length}}catch(a){throw aF(a)}}},{name:"drive_get_file_info",description:"Get detailed metadata for a file: size, owner, sharing status, dates, MIME type, parent folders.",inputSchema:aT,riskLevel:"read",async execute(a){try{let b=(await d.files.get({fileId:a.file_id,fields:"id,name,mimeType,size,createdTime,modifiedTime,owners,shared,webViewLink,parents"})).data,c=(b.owners??[]).map(a=>a.displayName??a.emailAddress??"");return{id:b.id??"",name:b.name??"",mimeType:b.mimeType??"",sizeBytes:null!=b.size?Number(b.size):null,createdTime:b.createdTime??"",modifiedTime:b.modifiedTime??"",owners:c,shared:b.shared??!1,webViewLink:b.webViewLink??"",parents:b.parents??[]}}catch(a){throw aF(a)}}},{name:"drive_list_permissions",description:"List who has access to a file and their permission levels.",inputSchema:a$,riskLevel:"read",async execute(a){try{let b=((await d.permissions.list({fileId:a.file_id,fields:"permissions(id,role,type,emailAddress,displayName)"})).data.permissions??[]).map(a=>({id:a.id??"",role:a.role??"",type:a.type??"",email:a.emailAddress??null,displayName:a.displayName??null}));return{total:b.length,permissions:b}}catch(a){throw aF(a)}}},{name:"drive_export_file",description:"Export a Google Workspace file (Doc, Sheet, Slide) to a different format. Common: Google Doc → text/plain or application/pdf, Google Sheet → text/csv, Google Slides → application/pdf. Use drive_read_file for regular (non-Workspace) files.",inputSchema:a_,riskLevel:"read",async execute(a){try{if(a.mime_type.startsWith("text/")||"application/json"===a.mime_type){let b=await d.files.export({fileId:a.file_id,mimeType:a.mime_type},{responseType:"text"}),c="string"==typeof b.data?b.data:String(b.data),e=c.length>15e3,f=e?c.slice(0,15e3)+"\n\n[...export truncated at 15000 chars...]":c;return{file_id:a.file_id,mime_type:a.mime_type,content:f,truncated:e,byte_size:Buffer.byteLength(c,"utf-8")}}{let b=(await d.files.export({fileId:a.file_id,mimeType:a.mime_type},{responseType:"arraybuffer"})).data.byteLength;return{file_id:a.file_id,mime_type:a.mime_type,content:`Binary export complete (${b} bytes). Use a text-based MIME type (e.g. text/plain, text/csv) to get readable content.`,truncated:!1,byte_size:b}}}catch(a){throw aF(a)}}},{name:"drive_upload_file",description:"Create a new file in Google Drive with text content.",inputSchema:aS,riskLevel:"write",async execute(a){try{let b=a.mime_type??"text/plain",e={name:a.name,mimeType:b,...a.folder_id&&{parents:[a.folder_id]}},{Readable:f}=await Promise.resolve().then(c.t.bind(c,27910,23)),g={mimeType:b,body:f.from([Buffer.from(a.content,"utf-8")])},h=await d.files.create({requestBody:e,media:g,fields:"id,name,webViewLink"});return{id:h.data.id??"",name:h.data.name??a.name,webViewLink:h.data.webViewLink??""}}catch(a){throw aF(a)}}},{name:"drive_create_folder",description:"Create a new folder in Google Drive.",inputSchema:aU,riskLevel:"write",async execute(a){try{let b={name:a.name,mimeType:"application/vnd.google-apps.folder",...a.parent_id&&{parents:[a.parent_id]}},c=await d.files.create({requestBody:b,fields:"id,name,webViewLink"});return{id:c.data.id??"",name:c.data.name??a.name,webViewLink:c.data.webViewLink??""}}catch(a){throw aF(a)}}},{name:"drive_move_file",description:"Move a file to a different folder in Google Drive.",inputSchema:aV,riskLevel:"write",async execute(a){try{let b=((await d.files.get({fileId:a.file_id,fields:"id,name,parents"})).data.parents??[]).join(","),c=await d.files.update({fileId:a.file_id,addParents:a.new_parent_id,removeParents:b||void 0,fields:"id,name,parents"});return{id:c.data.id??"",name:c.data.name??"",parents:c.data.parents??[]}}catch(a){throw aF(a)}}},{name:"drive_rename_file",description:"Rename a file in Google Drive.",inputSchema:aW,riskLevel:"write",async execute(a){try{let b=await d.files.update({fileId:a.file_id,requestBody:{name:a.new_name},fields:"id,name"});return{id:b.data.id??"",name:b.data.name??a.new_name}}catch(a){throw aF(a)}}},{name:"drive_copy_file",description:"Create a copy of a file in Google Drive.",inputSchema:aX,riskLevel:"write",async execute(a){try{let b={};a.new_name&&(b.name=a.new_name),a.folder_id&&(b.parents=[a.folder_id]);let c=await d.files.copy({fileId:a.file_id,requestBody:Object.keys(b).length>0?b:void 0,fields:"id,name,webViewLink"});return{id:c.data.id??"",name:c.data.name??"",webViewLink:c.data.webViewLink??""}}catch(a){throw aF(a)}}},{name:"drive_share_file",description:"Share a file with a user or make it accessible via link. Provide email for user sharing, or omit for anyone-with-link sharing.",inputSchema:aZ,riskLevel:"write",async execute(a){try{let b=a.role??"reader",c=a.type??(a.email?"user":"anyone"),e={role:b,type:c,...a.email&&{emailAddress:a.email}},f=await d.permissions.create({fileId:a.file_id,requestBody:e,fields:"id,role,type,emailAddress",sendNotificationEmail:"user"===c||"group"===c});return{permission_id:f.data.id??"",role:f.data.role??b,type:f.data.type??c,email:f.data.emailAddress??null}}catch(a){throw aF(a)}}},{name:"drive_delete_file",description:"Move a file to trash in Google Drive. This is reversible — the file can be restored from the Drive trash.",inputSchema:aY,riskLevel:"destructive",async execute(a){try{let b=await d.files.update({fileId:a.file_id,requestBody:{trashed:!0},fields:"id,name,trashed"});return{id:b.data.id??"",name:b.data.name??"",trashed:b.data.trashed??!0}}catch(a){throw aF(a)}}}]},operations:[{slug:"drive_list_files",name:"List files",risk:"read",requiresApproval:!1,description:"Search and list files in Google Drive."},{slug:"drive_read_file",name:"Read file",risk:"read",requiresApproval:!1,description:"Download and read file content."},{slug:"drive_get_file_info",name:"Get file info",risk:"read",requiresApproval:!1,description:"Retrieve file metadata (name, size, mimeType, owners)."},{slug:"drive_list_permissions",name:"List permissions",risk:"read",requiresApproval:!1,description:"List sharing permissions on a file or folder."},{slug:"drive_export_file",name:"Export file",risk:"read",requiresApproval:!1,description:"Export a Google Workspace file (Docs, Sheets) to a target format."},{slug:"drive_upload_file",name:"Upload file",risk:"write",requiresApproval:!1,description:"Upload a new file to Google Drive."},{slug:"drive_create_folder",name:"Create folder",risk:"write",requiresApproval:!1,description:"Create a new folder."},{slug:"drive_move_file",name:"Move file",risk:"write",requiresApproval:!1,description:"Move a file to a different folder."},{slug:"drive_rename_file",name:"Rename file",risk:"write",requiresApproval:!1,description:"Rename a file or folder."},{slug:"drive_copy_file",name:"Copy file",risk:"write",requiresApproval:!1,description:"Make a copy of a file."},{slug:"drive_share_file",name:"Share file",risk:"write",requiresApproval:!1,description:"Add or update sharing permissions on a file."},{slug:"drive_delete_file",name:"Delete file",risk:"destructive",requiresApproval:!0,description:"Permanently delete a file or folder from Google Drive."}]},gmail:{credentialType:"google-oauth",toolFactory:a=>{let b,c;return(b=new aD.q7g.auth.OAuth2).setCredentials({access_token:a}),[(c=aD.q7g.gmail({version:"v1",auth:b}),{name:"gmail_list_messages",description:"List Gmail messages matching a query. Returns message IDs, thread IDs, sender, subject, date and snippet. Use gmail_get_message to read the full body, or gmail_get_thread for the full conversation.",inputSchema:bb,riskLevel:"read",async execute(a){try{let b=Math.min(a.max_results??20,500),d=await a2(async(b,d)=>{let e={userId:"me",maxResults:d,includeSpamTrash:a.include_spam_trash??!1,...b&&{pageToken:b},...a.query&&{q:a.query}},f=await c.users.messages.list(e);return{items:f.data.messages??[],nextPageToken:f.data.nextPageToken}},Math.min(b,100),b),e=await Promise.all(d.map(async a=>{try{let b=await c.users.messages.get({userId:"me",id:a.id,format:"metadata",metadataHeaders:["Subject","From","Date"]}),d=a5(b.data.payload??void 0);return{messageId:b.data.id??a.id??"",threadId:b.data.threadId??a.threadId??"",from:d.from??"",subject:d.subject??"",date:d.date??"",snippet:b.data.snippet??"",labelIds:b.data.labelIds??[]}}catch{return{messageId:a.id??"",threadId:a.threadId??"",from:"",subject:"",date:"",snippet:"",labelIds:[]}}}));return{total:e.length,messages:e}}catch(a){throw a1(a)}}}),{name:"gmail_get_message",description:"Get the full content of a Gmail message including decoded body and attachment metadata. Use gmail_get_attachment to download an attachment by its ID.",inputSchema:bc,riskLevel:"read",async execute(a){try{let b=(await c.users.messages.get({userId:"me",id:a.message_id,format:"full"})).data,d=b.payload??void 0,e=a5(d),f=a4(d).trim(),g=f.length>1e4;g&&(f=f.slice(0,1e4)+"\n\n[...body truncated]");let h=function a(b,c=[]){if(!b)return c;let d=b.body?.attachmentId;for(let e of(d&&b.filename&&c.push({attachmentId:d,filename:b.filename,mimeType:b.mimeType??"application/octet-stream",size:b.body?.size??0}),b.parts??[]))a(e,c);return c}(d);return{messageId:b.id??"",threadId:b.threadId??"",from:e.from??"",to:e.to??"",cc:e.cc??"",subject:e.subject??"",date:e.date??"",body:f,truncated:g,labelIds:b.labelIds??[],attachments:h}}catch(a){throw a1(a)}}},{name:"gmail_list_threads",description:"List Gmail conversation threads matching a query. Returns thread IDs and snippets. Use gmail_get_thread to read the full conversation.",inputSchema:bj,riskLevel:"read",async execute(a){try{let b=Math.min(a.max_results??20,500),d=await a2(async(b,d)=>{let e={userId:"me",maxResults:d,includeSpamTrash:a.include_spam_trash??!1,...b&&{pageToken:b},...a.query&&{q:a.query}},f=await c.users.threads.list(e);return{items:f.data.threads??[],nextPageToken:f.data.nextPageToken}},Math.min(b,100),b);return{total:d.length,threads:d.map(a=>({threadId:a.id??"",snippet:a.snippet??"",historyId:a.historyId??""}))}}catch(a){throw a1(a)}}},{name:"gmail_get_thread",description:"Fetch a full Gmail conversation thread with all messages, decoded bodies and headers.",inputSchema:bk,riskLevel:"read",async execute(a){try{let b=(await c.users.threads.get({userId:"me",id:a.thread_id,format:"full"})).data,d=(b.messages??[]).map(a=>{let b=a.payload??void 0,c=a5(b),d=a4(b).trim();return d.length>5e3&&(d=d.slice(0,5e3)+"\n\n[...truncated]"),{messageId:a.id??"",from:c.from??"",to:c.to??"",subject:c.subject??"",date:c.date??"",snippet:a.snippet??"",body:d,labelIds:a.labelIds??[]}});return{threadId:b.id??"",messages:d}}catch(a){throw a1(a)}}},{name:"gmail_list_labels",description:"List all Gmail labels — both system labels (INBOX, SENT, TRASH, SPAM, etc.) and user-created labels. Returns label IDs needed for gmail_modify_labels.",inputSchema:bn,riskLevel:"read",async execute(){try{let a=((await c.users.labels.list({userId:"me"})).data.labels??[]).map(a=>({id:a.id??"",name:a.name??"",type:a.type??"",messageListVisibility:a.messageListVisibility??"",labelListVisibility:a.labelListVisibility??"",messagesTotal:a.messagesTotal??0,messagesUnread:a.messagesUnread??0,threadsTotal:a.threadsTotal??0,threadsUnread:a.threadsUnread??0}));return{total:a.length,labels:a}}catch(a){throw a1(a)}}},{name:"gmail_get_label",description:"Get details and message counts for a specific Gmail label.",inputSchema:bo,riskLevel:"read",async execute(a){try{let b=(await c.users.labels.get({userId:"me",id:a.label_id})).data;return{id:b.id??"",name:b.name??"",type:b.type??"",messagesTotal:b.messagesTotal??0,messagesUnread:b.messagesUnread??0,threadsTotal:b.threadsTotal??0,threadsUnread:b.threadsUnread??0}}catch(a){throw a1(a)}}},{name:"gmail_list_drafts",description:"List Gmail drafts with their IDs, subjects and snippets. Use draft_id with gmail_send_draft to send or gmail_update_draft to edit.",inputSchema:bt,riskLevel:"read",async execute(a){try{let b=Math.min(a.max_results??20,500),d=await a2(async(b,d)=>{let e={userId:"me",maxResults:d,...b&&{pageToken:b},...a.query&&{q:a.query}},f=await c.users.drafts.list(e);return{items:f.data.drafts??[],nextPageToken:f.data.nextPageToken}},Math.min(b,100),b),e=await Promise.all(d.map(async a=>{let b=a.id??"";try{let a=(await c.users.drafts.get({userId:"me",id:b,format:"metadata"})).data.message??{},d=a5(a.payload??void 0);return{draftId:b,messageId:a.id??"",to:d.to??"",subject:d.subject??"",snippet:a.snippet??""}}catch{return{draftId:b,messageId:a.message?.id??"",to:"",subject:"",snippet:""}}}));return{total:e.length,drafts:e}}catch(a){throw a1(a)}}},{name:"gmail_get_attachment",description:"Download an email attachment by message ID and attachment ID. Returns base64url-encoded content. Get attachment IDs from gmail_get_message. Size cap: 25 MB.",inputSchema:by,riskLevel:"read",async execute(a){try{let b=(await c.users.messages.attachments.get({userId:"me",messageId:a.message_id,id:a.attachment_id})).data,d=b.size??0;if(d>0x1900000)throw new a0("gmail_attachment_too_large",`Attachment exceeds the 25 MB limit (${Math.round(d/1024/1024)} MB).`);return{attachmentId:a.attachment_id,messageId:a.message_id,filename:a.filename??"",sizeBytes:d,data:b.data??""}}catch(a){throw a1(a)}}},{name:"gmail_list_history",description:"List Gmail mailbox changes since a given historyId. Useful for incremental sync — only fetch changes since last check. Returns the latest historyId to use in subsequent calls.",inputSchema:bz,riskLevel:"read",async execute(a){try{let b={userId:"me",startHistoryId:a.start_history_id,maxResults:Math.min(a.max_results??100,500),historyTypes:["messageAdded","messageDeleted","labelAdded","labelRemoved"],...a.label_id&&{labelId:a.label_id}},d=(await c.users.history.list(b)).data,e=(d.history??[]).map(a=>({id:a.id??"",messages:(a.messages??[]).map(a=>({messageId:a.id??"",threadId:a.threadId??""})),messagesAdded:(a.messagesAdded??[]).map(a=>({messageId:a.message?.id??"",labelIds:a.message?.labelIds??[]})),messagesDeleted:(a.messagesDeleted??[]).map(a=>({messageId:a.message?.id??""})),labelsAdded:(a.labelsAdded??[]).map(a=>({messageId:a.message?.id??"",labelIds:a.labelIds??[]})),labelsRemoved:(a.labelsRemoved??[]).map(a=>({messageId:a.message?.id??"",labelIds:a.labelIds??[]}))}));return{historyId:d.historyId??"",history:e}}catch(a){throw a1(a)}}},{name:"gmail_send_email",description:"Send an email via Gmail. Supports plain text and HTML bodies, CC, BCC, Reply-To, and file attachments. Use attachments to send reports, CSVs, or HTML files as real files rather than pasting content inline.",inputSchema:ba,riskLevel:"write",async execute(a){try{let b=a8({to:a.to,subject:a.subject,body:a.body,cc:a.cc,bcc:a.bcc,replyTo:a.reply_to,attachments:a.attachments}),d=await c.users.messages.send({userId:"me",requestBody:{raw:b}});return{messageId:d.data.id??"",threadId:d.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_reply_message",description:"Reply to a Gmail message in-thread. Automatically sets In-Reply-To, References, subject (Re: prefix), and threadId. Fetches the original message headers to build correct threading.",inputSchema:bd,riskLevel:"write",async execute(a){try{let b=(await c.users.messages.get({userId:"me",id:a.message_id,format:"metadata",metadataHeaders:["Subject","From","To","Message-ID","Message-Id","References"]})).data,d=a5(b.payload??void 0),e=b.threadId??void 0,f=d.subject??"",g=f.toLowerCase().startsWith("re:")?f:`Re: ${f}`,h=d.from??"",i=d["message-id"]??d["message-id"]??"",j=d.references??"",k=i?j?`${j} ${i}`:i:j,l={raw:a8({to:h,subject:g,body:a.body,cc:a.cc,inReplyTo:i||void 0,references:k||void 0,attachments:a.attachments})};e&&(l.threadId=e);let m=await c.users.messages.send({userId:"me",requestBody:l});return{messageId:m.data.id??"",threadId:m.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_forward_message",description:"Forward a Gmail message to new recipients. Quotes the original body and prepends Fwd: to the subject.",inputSchema:be,riskLevel:"write",async execute(a){try{let b=(await c.users.messages.get({userId:"me",id:a.message_id,format:"full"})).data.payload??void 0,d=a5(b),e=d.subject??"",f=e.toLowerCase().startsWith("fwd:")?e:`Fwd: ${e}`,g=a4(b).trim(),h=a.note?`${a.note}
5
+
6
+ `:"",i=`${h}---------- Forwarded message ----------
7
+ From: ${d.from??""}
8
+ Date: ${d.date??""}
9
+ Subject: ${e}
10
+ To: ${d.to??""}
11
+
12
+ `+g,j=a8({to:a.to,subject:f,body:i,cc:a.cc}),k=await c.users.messages.send({userId:"me",requestBody:{raw:j}});return{messageId:k.data.id??"",threadId:k.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_modify_labels",description:"Add or remove labels on a Gmail message. System labels: INBOX, UNREAD, STARRED, IMPORTANT, TRASH, SPAM. Use to mark as read (remove UNREAD), star, archive (remove INBOX), etc.",inputSchema:bf,riskLevel:"write",async execute(a){try{if(!a.add_labels?.length&&!a.remove_labels?.length)throw new a0("gmail_validation_error","Provide at least one of add_labels or remove_labels.");let b=await c.users.messages.modify({userId:"me",id:a.message_id,requestBody:{addLabelIds:a.add_labels??[],removeLabelIds:a.remove_labels??[]}});return{messageId:b.data.id??"",labelIds:b.data.labelIds??[]}}catch(a){throw a1(a)}}},{name:"gmail_trash_message",description:"Move a Gmail message to the Trash folder. Recoverable for 30 days. Prefer this over permanent delete.",inputSchema:bg,riskLevel:"write",async execute(a){try{let b=await c.users.messages.trash({userId:"me",id:a.message_id});return{messageId:b.data.id??"",threadId:b.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_untrash_message",description:"Restore a Gmail message from the Trash folder.",inputSchema:bh,riskLevel:"write",async execute(a){try{let b=await c.users.messages.untrash({userId:"me",id:a.message_id});return{messageId:b.data.id??"",threadId:b.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_modify_thread_labels",description:"Add or remove labels on all messages in a Gmail thread at once. Use to archive a thread (remove INBOX), mark all as read (remove UNREAD), etc.",inputSchema:bl,riskLevel:"write",async execute(a){try{return{threadId:(await c.users.threads.modify({userId:"me",id:a.thread_id,requestBody:{addLabelIds:a.add_labels??[],removeLabelIds:a.remove_labels??[]}})).data.id??""}}catch(a){throw a1(a)}}},{name:"gmail_trash_thread",description:"Move an entire Gmail conversation thread to the Trash folder. Recoverable for 30 days.",inputSchema:bm,riskLevel:"write",async execute(a){try{return{threadId:(await c.users.threads.trash({userId:"me",id:a.thread_id})).data.id??""}}catch(a){throw a1(a)}}},{name:"gmail_create_label",description:"Create a new Gmail user label. Use '/' in the name to nest labels, e.g. 'Projects/Nodal-Agents'.",inputSchema:bp,riskLevel:"write",async execute(a){try{let b=await c.users.labels.create({userId:"me",requestBody:{name:a.name,labelListVisibility:a.label_list_visibility??"labelShow",messageListVisibility:a.message_list_visibility??"show"}});return{id:b.data.id??"",name:b.data.name??""}}catch(a){throw a1(a)}}},{name:"gmail_update_label",description:"Update an existing Gmail user label — rename it or change its visibility.",inputSchema:bq,riskLevel:"write",async execute(a){try{let b={};void 0!==a.name&&(b.name=a.name),void 0!==a.label_list_visibility&&(b.labelListVisibility=a.label_list_visibility),void 0!==a.message_list_visibility&&(b.messageListVisibility=a.message_list_visibility);let d=await c.users.labels.patch({userId:"me",id:a.label_id,requestBody:b});return{id:d.data.id??"",name:d.data.name??""}}catch(a){throw a1(a)}}},{name:"gmail_create_draft",description:"Create a draft email in Gmail (not sent). Use reply_to_message_id to create a reply draft in-thread with correct threading headers.",inputSchema:bu,riskLevel:"write",async execute(a){try{let b,d,e,f=a.subject;if(a.reply_to_message_id){let g=(await c.users.messages.get({userId:"me",id:a.reply_to_message_id,format:"metadata",metadataHeaders:["Subject","Message-ID","Message-Id","References"]})).data;b=g.threadId??void 0;let h=a5(g.payload??void 0),i=h.subject??"";i&&!f.toLowerCase().startsWith("re:")&&(f=i.toLowerCase().startsWith("re:")?i:`Re: ${i}`);let j=h["message-id"]??"",k=h.references??"";d=j||void 0,e=j?k?`${k} ${j}`:j:k||void 0}let g={message:{raw:a8({to:a.to,subject:f,body:a.body,cc:a.cc,bcc:a.bcc,inReplyTo:d,references:e,attachments:a.attachments}),...b&&{threadId:b}}},h=await c.users.drafts.create({userId:"me",requestBody:g});return{draftId:h.data.id??"",messageId:h.data.message?.id??""}}catch(a){throw a1(a)}}},{name:"gmail_update_draft",description:"Overwrite an existing Gmail draft with new content. Use this to revise a draft before sending.",inputSchema:bv,riskLevel:"write",async execute(a){try{let b=a8({to:a.to,subject:a.subject,body:a.body,cc:a.cc,bcc:a.bcc,attachments:a.attachments}),d=await c.users.drafts.update({userId:"me",id:a.draft_id,requestBody:{message:{raw:b}}});return{draftId:d.data.id??a.draft_id,messageId:d.data.message?.id??""}}catch(a){throw a1(a)}}},{name:"gmail_send_draft",description:"Send an existing Gmail draft. The draft is dispatched as an email and can no longer be edited.",inputSchema:bw,riskLevel:"write",async execute(a){try{let b=await c.users.drafts.send({userId:"me",requestBody:{id:a.draft_id}});return{messageId:b.data.id??"",threadId:b.data.threadId??""}}catch(a){throw a1(a)}}},{name:"gmail_delete_message",description:"Permanently delete a Gmail message. This is irreversible — the message cannot be recovered. Consider gmail_trash_message for recoverable deletion.",inputSchema:bi,riskLevel:"destructive",async execute(a){try{return await c.users.messages.delete({userId:"me",id:a.message_id}),{deleted:!0,messageId:a.message_id}}catch(a){throw a1(a)}}},{name:"gmail_delete_label",description:"Permanently delete a Gmail user label. Cannot delete system labels (INBOX, SENT, etc.). Messages with this label are NOT deleted — they simply lose the label.",inputSchema:br,riskLevel:"destructive",async execute(a){try{return await c.users.labels.delete({userId:"me",id:a.label_id}),{deleted:!0,labelId:a.label_id}}catch(a){throw a1(a)}}},{name:"gmail_delete_draft",description:"Permanently delete a Gmail draft. This is irreversible.",inputSchema:bx,riskLevel:"destructive",async execute(a){try{return await c.users.drafts.delete({userId:"me",id:a.draft_id}),{deleted:!0,draftId:a.draft_id}}catch(a){throw a1(a)}}}]},operations:[{slug:"gmail_list_messages",name:"List messages",risk:"read",requiresApproval:!1,description:"Search and list emails by query."},{slug:"gmail_get_message",name:"Get message",risk:"read",requiresApproval:!1,description:"Retrieve a single email by ID."},{slug:"gmail_list_threads",name:"List threads",risk:"read",requiresApproval:!1,description:"List email conversation threads."},{slug:"gmail_get_thread",name:"Get thread",risk:"read",requiresApproval:!1,description:"Retrieve all messages in a thread."},{slug:"gmail_list_labels",name:"List labels",risk:"read",requiresApproval:!1,description:"List all Gmail labels."},{slug:"gmail_get_label",name:"Get label",risk:"read",requiresApproval:!1,description:"Retrieve a single label by ID."},{slug:"gmail_list_drafts",name:"List drafts",risk:"read",requiresApproval:!1,description:"List email drafts."},{slug:"gmail_get_attachment",name:"Get attachment",risk:"read",requiresApproval:!1,description:"Download an email attachment by ID."},{slug:"gmail_list_history",name:"List history",risk:"read",requiresApproval:!1,description:"List mailbox history changes since a given historyId."},{slug:"gmail_reply_message",name:"Reply to message",risk:"write",requiresApproval:!1,description:"Send a reply in an existing thread."},{slug:"gmail_forward_message",name:"Forward message",risk:"write",requiresApproval:!1,description:"Forward an email to new recipients."},{slug:"gmail_modify_labels",name:"Modify labels",risk:"write",requiresApproval:!1,description:"Add or remove labels on a message."},{slug:"gmail_trash_message",name:"Trash message",risk:"write",requiresApproval:!1,description:"Move a message to Trash (reversible)."},{slug:"gmail_untrash_message",name:"Untrash message",risk:"write",requiresApproval:!1,description:"Restore a message from Trash."},{slug:"gmail_modify_thread_labels",name:"Modify thread labels",risk:"write",requiresApproval:!1,description:"Add or remove labels on all messages in a thread."},{slug:"gmail_trash_thread",name:"Trash thread",risk:"write",requiresApproval:!1,description:"Move an entire thread to Trash (reversible)."},{slug:"gmail_create_label",name:"Create label",risk:"write",requiresApproval:!1,description:"Create a new Gmail label."},{slug:"gmail_update_label",name:"Update label",risk:"write",requiresApproval:!1,description:"Rename or update a Gmail label."},{slug:"gmail_create_draft",name:"Create draft",risk:"write",requiresApproval:!1,description:"Compose an email draft without sending."},{slug:"gmail_update_draft",name:"Update draft",risk:"write",requiresApproval:!1,description:"Update an existing email draft."},{slug:"gmail_send_email",name:"Send email",risk:"destructive",requiresApproval:!0,description:"Send an email from the connected mailbox (irreversible)."},{slug:"gmail_send_draft",name:"Send draft",risk:"destructive",requiresApproval:!0,description:"Send a saved draft (irreversible)."},{slug:"gmail_delete_message",name:"Delete message",risk:"destructive",requiresApproval:!0,description:"Permanently delete a message (bypasses Trash)."},{slug:"gmail_delete_label",name:"Delete label",risk:"destructive",requiresApproval:!0,description:"Permanently delete a Gmail label."},{slug:"gmail_delete_draft",name:"Delete draft",risk:"destructive",requiresApproval:!0,description:"Permanently delete an email draft."}]},"google-sheets":{credentialType:"google-oauth",toolFactory:a=>{let b,c;return(b=new aD.q7g.auth.OAuth2).setCredentials({access_token:a}),[(c=aD.q7g.sheets({version:"v4",auth:b}),{name:"sheets_read_range",description:"Read a specific A1-notation range from a Google Sheet. Returns a 2D array of cell values. Capped at 10,000 rows — use a smaller range if exceeded.",inputSchema:bG,riskLevel:"read",async execute(a){try{bF(a.range);let b=await c.spreadsheets.values.get({spreadsheetId:a.spreadsheet_id,range:a.range,valueRenderOption:a.value_render_option??"FORMATTED_VALUE"}),d=b.data.values??[];if(d.length>1e4)throw new bA("sheets_range_too_large",`Range returned ${d.length} rows which exceeds the 10000-row cap. Use a smaller range.`);let e=bE(d),f=e.reduce((a,b)=>Math.max(a,b.length),0);return{range:b.data.range??a.range,rows:e.length,cols:f,values:e}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}}),{name:"sheets_read_all",description:"Read all values from a sheet tab. Returns the full 2D array. Capped at 10,000 rows — use sheets_read_range for partial reads on large sheets.",inputSchema:bH,riskLevel:"read",async execute(a){try{let b=a.sheet_name;if(!b){let d=await c.spreadsheets.get({spreadsheetId:a.spreadsheet_id,fields:"sheets.properties.title"});b=d.data.sheets?.[0]?.properties?.title??"Sheet1"}let d=`'${b.replace(/'/g,"''")}'`,e=(await c.spreadsheets.values.get({spreadsheetId:a.spreadsheet_id,range:d,valueRenderOption:"FORMATTED_VALUE"})).data.values??[];if(e.length>1e4)throw new bA("sheets_range_too_large",`Sheet has ${e.length} rows which exceeds the 10000-row cap. Use sheets_read_range with a smaller range.`);let f=bE(e),g=(f[0]??[]).map(a=>String(a)),h=f.slice(1);return{sheetName:b,headers:g,rowCount:h.length,values:f}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_batch_read_ranges",description:"Read multiple A1-notation ranges from a spreadsheet in a single API call. Efficient for dashboards that need data from several tabs or ranges at once.",inputSchema:bI,riskLevel:"read",async execute(a){try{for(let b of a.ranges)bF(b);return{results:((await c.spreadsheets.values.batchGet({spreadsheetId:a.spreadsheet_id,ranges:a.ranges,valueRenderOption:a.value_render_option??"FORMATTED_VALUE"})).data.valueRanges??[]).map(a=>{let b=a.values??[],c=bE(b),d=c.reduce((a,b)=>Math.max(a,b.length),0);return{range:a.range??"",rows:c.length,cols:d,values:c}})}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_get_metadata",description:"Get metadata about a Google Spreadsheet: title, list of sheet tabs with their dimensions, and named ranges. Use this to discover sheet names before reading.",inputSchema:bO,riskLevel:"read",async execute(a){try{let b=(await c.spreadsheets.get({spreadsheetId:a.spreadsheet_id,fields:"spreadsheetId,properties.title,spreadsheetUrl,sheets.properties,namedRanges"})).data,d=(b.sheets??[]).map(a=>({sheetId:a.properties?.sheetId??0,title:a.properties?.title??"",index:a.properties?.index??0,rowCount:a.properties?.gridProperties?.rowCount??0,colCount:a.properties?.gridProperties?.columnCount??0,hidden:a.properties?.hidden??!1})),e=(b.namedRanges??[]).map(a=>({name:a.name??"",range:a.range?`${a.range.sheetId}!R${a.range.startRowIndex}C${a.range.startColumnIndex}:R${a.range.endRowIndex}C${a.range.endColumnIndex}`:""}));return{spreadsheetId:b.spreadsheetId??a.spreadsheet_id,title:b.properties?.title??"",url:b.spreadsheetUrl??"",sheets:d,namedRanges:e}}catch(a){throw bB(a)}}},{name:"sheets_find_rows",description:"Find rows in a Google Sheet where a column matches a value. More efficient than reading all rows when you know what you are looking for. Provide exactly one of: equals or contains.",inputSchema:bN,riskLevel:"read",async execute(a){try{let b=[a.equals,a.contains].filter(a=>void 0!==a);if(1!==b.length)throw new bA("sheets_validation_error","Provide exactly one of: equals, contains.");let d=a.sheet_name;if(!d){let b=await c.spreadsheets.get({spreadsheetId:a.spreadsheet_id,fields:"sheets.properties.title"});d=b.data.sheets?.[0]?.properties?.title??"Sheet1"}let e=`'${d.replace(/'/g,"''")}'`,f=(await c.spreadsheets.values.get({spreadsheetId:a.spreadsheet_id,range:e,valueRenderOption:"FORMATTED_VALUE"})).data.values??[];if(0===f.length)return{column:a.column,rowCount:0,headers:[],rows:[]};let g=(f[0]??[]).map(a=>String(a??"")),h=g.indexOf(a.column);if(-1===h)throw new bA("sheets_validation_error",`Column '${a.column}' not found. Available columns: ${g.join(", ")}`);let i=a.limit??100,j=f.slice(1),k=[];for(let b=0;b<j.length&&k.length<i;b++){let c=j[b]??[],d=String(c[h]??"");if(void 0!==a.equals?d===a.equals:d.includes(a.contains)){let a={_row:b+2};for(let b=0;b<g.length;b++){let d=g[b];if(void 0!==d){let e=c[b];a[d]=null==e?"":e}}k.push(a)}}return{column:a.column,rowCount:k.length,headers:g,rows:k}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_write_range",description:"Write (overwrite) a 2D array of values into a Google Sheet range. Existing values in the range are replaced. Use sheets_append_row to add rows at the end.",inputSchema:bJ,riskLevel:"write",async execute(a){try{bF(a.range);let b=await c.spreadsheets.values.update({spreadsheetId:a.spreadsheet_id,range:a.range,valueInputOption:a.value_input_option??"USER_ENTERED",requestBody:{values:a.values}});return{updatedRange:b.data.updatedRange??a.range,updatedRows:b.data.updatedRows??0,updatedCols:b.data.updatedColumns??0,updatedCells:b.data.updatedCells??0}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_append_row",description:"Append one or more rows to the end of a Google Sheet (after the last row with data). Pass a 2D array — e.g. [['Alice', 95]] for one row or [['Alice',95],['Bob',87]] for multiple.",inputSchema:bK,riskLevel:"write",async execute(a){try{let b=(await c.spreadsheets.values.append({spreadsheetId:a.spreadsheet_id,range:a.range,valueInputOption:a.value_input_option??"USER_ENTERED",insertDataOption:"INSERT_ROWS",requestBody:{values:a.values}})).data.updates;return{updatedRange:b?.updatedRange??a.range,updatedRows:b?.updatedRows??0,updatedCells:b?.updatedCells??0}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_clear_range",description:"Clear values from a range in a Google Sheet. Cell formatting and structure are preserved. To delete rows entirely, use sheets_delete_sheet and recreate, or use write with empty values.",inputSchema:bL,riskLevel:"write",async execute(a){try{return bF(a.range),{clearedRange:(await c.spreadsheets.values.clear({spreadsheetId:a.spreadsheet_id,range:a.range})).data.clearedRange??a.range}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_batch_update_values",description:"Write values to multiple ranges in a single API call. More efficient than calling sheets_write_range repeatedly.",inputSchema:bM,riskLevel:"write",async execute(a){try{for(let b of a.updates)bF(b.range);let b=await c.spreadsheets.values.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{valueInputOption:a.value_input_option??"USER_ENTERED",data:a.updates.map(a=>({range:a.range,values:a.values}))}}),d=(b.data.responses??[]).map(a=>({updatedRange:a.updatedRange??"",updatedCells:a.updatedCells??0}));return{totalUpdatedCells:b.data.totalUpdatedCells??0,totalUpdatedRows:b.data.totalUpdatedRows??0,responses:d}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_create_spreadsheet",description:"Create a new Google Spreadsheet. Returns the spreadsheet ID and URL. The new spreadsheet will be placed in the root of the authenticated user Drive.",inputSchema:bP,riskLevel:"write",async execute(a){try{let b=await c.spreadsheets.create({requestBody:{properties:{title:a.title},sheets:[{properties:{title:a.sheet_title??"Sheet1"}}]}});return{spreadsheetId:b.data.spreadsheetId??"",title:b.data.properties?.title??a.title,url:b.data.spreadsheetUrl??"",firstSheetId:b.data.sheets?.[0]?.properties?.sheetId??0}}catch(a){throw bB(a)}}},{name:"sheets_add_sheet",description:"Add a new sheet tab to an existing Google Spreadsheet.",inputSchema:bQ,riskLevel:"write",async execute(a){try{let b=await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[{addSheet:{properties:{title:a.title,...void 0!==a.index&&{index:a.index}}}}]}}),d=b.data.replies?.[0]?.addSheet?.properties;return{sheetId:d?.sheetId??0,title:d?.title??a.title,index:d?.index??0}}catch(a){throw bB(a)}}},{name:"sheets_duplicate_sheet",description:"Copy a sheet tab within the same Google Spreadsheet. Duplicates all data, formatting, and formulas.",inputSchema:bS,riskLevel:"write",async execute(a){try{var b,d,e;let f=a.insert_sheet_index;if(void 0===f){let b=await c.spreadsheets.get({spreadsheetId:a.spreadsheet_id,fields:"sheets.properties.index"});f=b.data.sheets?.length??1}let g=await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.source_sheet_id,d=f,e=a.new_sheet_name,{duplicateSheet:{sourceSheetId:b,insertSheetIndex:d,...void 0!==e&&{newSheetName:e}}})]}}),h=g.data.replies?.[0]?.duplicateSheet?.properties;return{sheetId:h?.sheetId??0,title:h?.title??a.new_sheet_name??"",index:h?.index??f}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_rename_sheet",description:"Rename a sheet tab in a Google Spreadsheet.",inputSchema:bT,riskLevel:"write",async execute(a){try{var b,d;return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.sheet_id,d=a.new_title,{updateSheetProperties:{properties:{sheetId:b,title:d},fields:"title"}})]}}),{sheetId:a.sheet_id,title:a.new_title}}catch(a){throw bB(a)}}},{name:"sheets_format_range",description:"Apply formatting to a cell range in a Google Sheet: bold, italic, font size, background color, text color, number format, and alignment. Uses zero-based row/column indices.",inputSchema:bU,riskLevel:"write",async execute(a){try{var b,d,e,f,g,h;let i={},j=[],k={};if(void 0!==a.bold&&(k.bold=a.bold,j.push("textFormat.bold")),void 0!==a.italic&&(k.italic=a.italic,j.push("textFormat.italic")),void 0!==a.font_size&&(k.fontSize=a.font_size,j.push("textFormat.fontSize")),void 0!==a.foreground_color&&(k.foregroundColor={red:a.foreground_color.red,green:a.foreground_color.green,blue:a.foreground_color.blue},j.push("textFormat.foregroundColor")),Object.keys(k).length>0&&(i.textFormat=k),void 0!==a.background_color&&(i.backgroundColor={red:a.background_color.red,green:a.background_color.green,blue:a.background_color.blue},j.push("backgroundColor")),void 0!==a.number_format&&(i.numberFormat={type:a.number_format.type,...void 0!==a.number_format.pattern&&{pattern:a.number_format.pattern}},j.push("numberFormat")),void 0!==a.horizontal_alignment&&(i.horizontalAlignment=a.horizontal_alignment,j.push("horizontalAlignment")),0===j.length)throw new bA("sheets_validation_error","Provide at least one formatting property.");return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.sheet_id,d=a.start_row_index,e=a.end_row_index,f=a.start_column_index,g=a.end_column_index,h=j.join(","),{repeatCell:{range:{sheetId:b,startRowIndex:d,endRowIndex:e,startColumnIndex:f,endColumnIndex:g},cell:{userEnteredFormat:i},fields:`userEnteredFormat(${h})`}})]}}),{formatted:!0,sheetId:a.sheet_id}}catch(a){if(a instanceof bA)throw a;throw bB(a)}}},{name:"sheets_resize_columns",description:"Resize columns in a Google Sheet. Provide pixel_size for a fixed width, or omit to auto-resize columns to fit their content.",inputSchema:bV,riskLevel:"write",async execute(a){try{var b,d,e,f,g,h,i;let j=void 0!==a.pixel_size?(b=a.sheet_id,d=a.start_column_index,e=a.end_column_index,f=a.pixel_size,{updateDimensionProperties:{range:{sheetId:b,dimension:"COLUMNS",startIndex:d,endIndex:e},properties:{pixelSize:f},fields:"pixelSize"}}):(g=a.sheet_id,h=a.start_column_index,i=a.end_column_index,{autoResizeDimensions:{dimensions:{sheetId:g,dimension:"COLUMNS",startIndex:h,endIndex:i}}});return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[j]}}),{resized:!0,sheetId:a.sheet_id,startColumnIndex:a.start_column_index,endColumnIndex:a.end_column_index}}catch(a){throw bB(a)}}},{name:"sheets_freeze_panes",description:"Freeze rows and/or columns in a Google Sheet so they stay visible while scrolling. Set frozen_row_count=1 to freeze the header row. Set to 0 to unfreeze.",inputSchema:bW,riskLevel:"write",async execute(a){try{var b;let d=a.frozen_row_count??0,e=a.frozen_column_count??0;return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.sheet_id,{updateSheetProperties:{properties:{sheetId:b,gridProperties:{frozenRowCount:d,frozenColumnCount:e}},fields:"gridProperties.frozenRowCount,gridProperties.frozenColumnCount"}})]}}),{frozenRowCount:d,frozenColumnCount:e,sheetId:a.sheet_id}}catch(a){throw bB(a)}}},{name:"sheets_set_basic_filter",description:"Apply a basic auto-filter to a range in a Google Sheet. Adds dropdown arrows to the header row for filtering. Uses zero-based row/column indices.",inputSchema:bX,riskLevel:"write",async execute(a){try{var b,d,e,f,g;return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.sheet_id,d=a.start_row_index,e=a.end_row_index,f=a.start_column_index,g=a.end_column_index,{setBasicFilter:{filter:{range:{sheetId:b,startRowIndex:d,endRowIndex:e,startColumnIndex:f,endColumnIndex:g}}}})]}}),{filterApplied:!0,sheetId:a.sheet_id}}catch(a){throw bB(a)}}},{name:"sheets_clear_basic_filter",description:"Remove the basic auto-filter from a sheet tab.",inputSchema:bY,riskLevel:"write",async execute(a){try{return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[{clearBasicFilter:{sheetId:a.sheet_id}}]}}),{filterCleared:!0,sheetId:a.sheet_id}}catch(a){throw bB(a)}}},{name:"sheets_sort_range",description:"Sort a range of cells in a Google Sheet by one or more columns. Supports multi-level sort (primary + secondary columns). Uses zero-based row/column indices.",inputSchema:b$,riskLevel:"write",async execute(a){try{var b,d,e,f,g,h;return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[(b=a.sheet_id,d=a.start_row_index,e=a.end_row_index,f=a.start_column_index,g=a.end_column_index,h=a.sort_specs.map(a=>({dimensionIndex:a.dimension_index,sortOrder:a.sort_order})),{sortRange:{range:{sheetId:b,startRowIndex:d,endRowIndex:e,startColumnIndex:f,endColumnIndex:g},sortSpecs:h}})]}}),{sorted:!0,sheetId:a.sheet_id}}catch(a){throw bB(a)}}},{name:"sheets_delete_sheet",description:"Permanently delete a sheet tab from a Google Spreadsheet. This is irreversible. Get the numeric sheetId from sheets_get_metadata (not the tab name).",inputSchema:bR,riskLevel:"destructive",async execute(a){try{return await c.spreadsheets.batchUpdate({spreadsheetId:a.spreadsheet_id,requestBody:{requests:[{deleteSheet:{sheetId:a.sheet_id}}]}}),{deleted:!0,sheetId:a.sheet_id}}catch(a){throw bB(a)}}}]},operations:[{slug:"sheets_read_range",name:"Read range",risk:"read",requiresApproval:!1,description:"Read values from a cell range (e.g. A1:C10)."},{slug:"sheets_read_all",name:"Read all",risk:"read",requiresApproval:!1,description:"Read all values from a sheet."},{slug:"sheets_batch_read_ranges",name:"Batch read ranges",risk:"read",requiresApproval:!1,description:"Read multiple cell ranges in a single request."},{slug:"sheets_get_metadata",name:"Get metadata",risk:"read",requiresApproval:!1,description:"Retrieve spreadsheet metadata and sheet list."},{slug:"sheets_find_rows",name:"Find rows",risk:"read",requiresApproval:!1,description:"Search rows matching a column value."},{slug:"sheets_write_range",name:"Write range",risk:"write",requiresApproval:!1,description:"Write values to a cell range."},{slug:"sheets_append_row",name:"Append row",risk:"write",requiresApproval:!1,description:"Append a new row at the end of a sheet."},{slug:"sheets_clear_range",name:"Clear range",risk:"write",requiresApproval:!1,description:"Clear values in a cell range."},{slug:"sheets_batch_update_values",name:"Batch update values",risk:"write",requiresApproval:!1,description:"Write values to multiple ranges in one request."},{slug:"sheets_create_spreadsheet",name:"Create spreadsheet",risk:"write",requiresApproval:!1,description:"Create a new Google Sheets spreadsheet."},{slug:"sheets_add_sheet",name:"Add sheet",risk:"write",requiresApproval:!1,description:"Add a new sheet tab to a spreadsheet."},{slug:"sheets_duplicate_sheet",name:"Duplicate sheet",risk:"write",requiresApproval:!1,description:"Duplicate an existing sheet tab."},{slug:"sheets_rename_sheet",name:"Rename sheet",risk:"write",requiresApproval:!1,description:"Rename a sheet tab."},{slug:"sheets_format_range",name:"Format range",risk:"write",requiresApproval:!1,description:"Apply formatting (bold, color, number format) to a cell range."},{slug:"sheets_resize_columns",name:"Resize columns",risk:"write",requiresApproval:!1,description:"Resize column widths in a sheet."},{slug:"sheets_freeze_panes",name:"Freeze panes",risk:"write",requiresApproval:!1,description:"Freeze rows or columns in a sheet."},{slug:"sheets_set_basic_filter",name:"Set basic filter",risk:"write",requiresApproval:!1,description:"Apply a basic filter to a sheet range."},{slug:"sheets_clear_basic_filter",name:"Clear basic filter",risk:"write",requiresApproval:!1,description:"Remove the basic filter from a sheet."},{slug:"sheets_sort_range",name:"Sort range",risk:"write",requiresApproval:!1,description:"Sort a range by one or more columns."},{slug:"sheets_delete_sheet",name:"Delete sheet",risk:"destructive",requiresApproval:!0,description:"Permanently delete a sheet tab from a spreadsheet."}]},"google-docs":{credentialType:"google-oauth",toolFactory:a=>{let b,c;return(b=new aD.q7g.auth.OAuth2).setCredentials({access_token:a}),[(c=aD.q7g.docs({version:"v1",auth:b}),{name:"docs_get",description:"Get the full structured content of a Google Document as JSON: title, body (with all paragraphs, tables, and structural elements), plus headers and footers. Capped at 100,000 characters of body text — use docs_get_text for plain text extraction.",inputSchema:b6,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data;if(b.body){let a=b1(b.body);if(a.length>1e5)throw new b_("docs_document_too_large",`Document body contains ${a.length} characters which exceeds the 100000-character cap.`)}let d=Object.entries(b.headers??{}).map(([a,b])=>({headerId:a,text:b.content?b1({content:b.content}):""})),e=Object.entries(b.footers??{}).map(([a,b])=>({footerId:a,text:b.content?b1({content:b.content}):""}));return{documentId:b.documentId??a.document_id,title:b.title??"",body:b.body??{},headers:d,footers:e,revisionId:b.revisionId??""}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}}),{name:"docs_get_text",description:"Get the plain text content of a Google Document. Parses the document body, joining all paragraph runs, handling tables (tab-separated cells), and headings. Capped at 100,000 characters — throws docs_document_too_large if exceeded.",inputSchema:b7,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data,d=b.body?b1(b.body):"";if(d.length>1e5)throw new b_("docs_document_too_large",`Document contains ${d.length} characters which exceeds the 100000-character cap.`);return{documentId:b.documentId??a.document_id,title:b.title??"",text:d,charCount:d.length}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_create",description:"Create a new Google Document with the given title. Optionally provide initial text content. Returns the document ID and URL. The document is placed in the authenticated user's Drive root.",inputSchema:b5,riskLevel:"write",async execute(a){try{let b=await c.documents.create({requestBody:{title:a.title}}),d=b.data.documentId??"",e=b.data.title??a.title;if(a.content&&a.content.length>0){let b=a.content.endsWith("\n")?a.content:a.content+"\n";await c.documents.batchUpdate({documentId:d,requestBody:{requests:[b3(b)]}})}return{documentId:d,title:e,url:`https://docs.google.com/document/d/${d}/edit`}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_insert_text",description:"Insert text at a specific index in a Google Document body. Index 1 = start of body. Use docs_get to find element indices. This shifts all subsequent content forward.",inputSchema:b8,riskLevel:"write",async execute(a){try{var b;return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.text,{insertText:{location:{index:a.index},text:b}})]}}),{inserted:!0,documentId:a.document_id,index:a.index,charCount:a.text.length}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_append_text",description:"Append text to the end of a Google Document. Uses endOfSegmentLocation — always inserts at the very end of the body, regardless of the current document length. Use \\n for line breaks.",inputSchema:b9,riskLevel:"write",async execute(a){try{let b=a.text.endsWith("\n")?a.text:a.text+"\n";return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[b3(b)]}}),{appended:!0,documentId:a.document_id,charCount:b.length}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_replace_text",description:"Find and replace all occurrences of a text string in a Google Document. Replaces every match in the document body. Returns the number of occurrences changed (0 means the text was not found).",inputSchema:ca,riskLevel:"write",async execute(a){try{var b,d;let e=a.match_case??!0,f=await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.find,d=a.replace,{replaceAllText:{containsText:{text:b,matchCase:e},replaceText:d}})]}}),g=f.data.replies?.[0]?.replaceAllText?.occurrencesChanged??0;return{documentId:a.document_id,occurrencesChanged:g}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_insert_paragraph",description:"Insert a new paragraph at a specific index in a Google Document. Optionally apply a named paragraph style (HEADING_1…HEADING_6, TITLE, SUBTITLE, NORMAL_TEXT). A paragraph in Docs is defined by a trailing \\n — this is appended automatically.",inputSchema:cd,riskLevel:"write",async execute(a){try{var b;let d=a.text.endsWith("\n")?a.text:a.text+"\n",e=[(b=a.index,{insertText:{location:{index:b},text:d.endsWith("\n")?d:d+"\n"}})];if(a.named_style){let b=d.length;e.push(b4(a.index,a.index+b,a.named_style))}return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:e}}),{inserted:!0,documentId:a.document_id,index:a.index}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_insert_page_break",description:"Insert a page break at a specific index in a Google Document. Useful for separating sections onto distinct pages.",inputSchema:ce,riskLevel:"write",async execute(a){try{return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[{insertPageBreak:{location:{index:a.index}}}]}}),{inserted:!0,documentId:a.document_id,index:a.index}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_insert_table",description:"Insert a table with N rows \xd7 M columns at a specific index in a Google Document. After insertion, use docs_insert_text to populate individual cells.",inputSchema:cf,riskLevel:"write",async execute(a){try{var b,d,e;return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.index,d=a.rows,e=a.columns,{insertTable:{location:{index:b},rows:d,columns:e}})]}}),{inserted:!0,documentId:a.document_id,rows:a.rows,columns:a.columns,index:a.index}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_insert_image",description:"Insert an inline image from a public URL at a specific index in a Google Document. Optionally specify width/height in points. The image URL must be publicly accessible.",inputSchema:cg,riskLevel:"write",async execute(a){try{var b,d,e,f;let g;return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.index,d=a.image_uri,e=a.width_pt,f=a.height_pt,g=void 0!==e||void 0!==f?{width:void 0!==e?{magnitude:e,unit:"PT"}:void 0,height:void 0!==f?{magnitude:f,unit:"PT"}:void 0}:void 0,{insertInlineImage:{location:{index:b},uri:d,...void 0!==g&&{objectSize:g}}})]}}),{inserted:!0,documentId:a.document_id,index:a.index,imageUri:a.image_uri}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_format_text",description:"Apply character-level formatting to a text range in a Google Document: bold, italic, underline, strikethrough, font size, foreground color, and font family. Use docs_get to find the start/end indices of the text to format.",inputSchema:ci,riskLevel:"write",async execute(a){try{var b,d,e;if(a.end_index<=a.start_index)throw new b_("docs_invalid_request",`end_index (${a.end_index}) must be greater than start_index (${a.start_index}).`);let f={},g=[];if(void 0!==a.bold&&(f.bold=a.bold,g.push("bold")),void 0!==a.italic&&(f.italic=a.italic,g.push("italic")),void 0!==a.underline&&(f.underline=a.underline,g.push("underline")),void 0!==a.strikethrough&&(f.strikethrough=a.strikethrough,g.push("strikethrough")),void 0!==a.font_size_pt&&(f.fontSize={magnitude:a.font_size_pt,unit:"PT"},g.push("fontSize")),void 0!==a.foreground_color&&(f.foregroundColor={color:{rgbColor:{red:a.foreground_color.red,green:a.foreground_color.green,blue:a.foreground_color.blue}}},g.push("foregroundColor")),void 0!==a.font_family&&(f.weightedFontFamily={fontFamily:a.font_family},g.push("weightedFontFamily")),0===g.length)throw new b_("docs_invalid_request","Provide at least one formatting property (bold, italic, underline, font_size_pt, etc.).");return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.start_index,d=a.end_index,e=g.join(","),{updateTextStyle:{range:{startIndex:b,endIndex:d},textStyle:f,fields:e}})]}}),{formatted:!0,documentId:a.document_id,startIndex:a.start_index,endIndex:a.end_index}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_apply_named_style",description:"Apply a named paragraph style to a range in a Google Document: HEADING_1 through HEADING_6, TITLE, SUBTITLE, or NORMAL_TEXT. Use docs_get to find the paragraph start/end indices.",inputSchema:cj,riskLevel:"write",async execute(a){try{if(a.end_index<=a.start_index)throw new b_("docs_invalid_request",`end_index (${a.end_index}) must be greater than start_index (${a.start_index}).`);return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[b4(a.start_index,a.end_index,a.named_style)]}}),{applied:!0,documentId:a.document_id,startIndex:a.start_index,endIndex:a.end_index,namedStyle:a.named_style}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_batch_update",description:"Execute multiple Google Docs API update requests in a single call (escape hatch for advanced agents). Accepts any valid Docs API Request objects — insertText, deleteContentRange, updateTextStyle, updateParagraphStyle, replaceAllText, insertTable, insertInlineImage, and more. All requests are applied atomically in order. Use this when other docs_* tools do not cover your use case.",inputSchema:ck,riskLevel:"write",async execute(a){try{let b=await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:a.requests}});return{documentId:a.document_id,repliesCount:b.data.replies?.length??0,writeControl:b.data.writeControl??void 0}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}},{name:"docs_delete_content_range",description:"Delete a range of content from a Google Document body by index. The range [startIndex, endIndex) is removed — this is irreversible. Use docs_get to find the correct indices before deleting. To delete the whole document, use drive_delete_file from the Drive adapter instead.",inputSchema:cb,riskLevel:"destructive",async execute(a){try{var b,d;if(a.end_index<=a.start_index)throw new b_("docs_invalid_request",`end_index (${a.end_index}) must be greater than start_index (${a.start_index}).`);return await c.documents.batchUpdate({documentId:a.document_id,requestBody:{requests:[(b=a.start_index,d=a.end_index,{deleteContentRange:{range:{startIndex:b,endIndex:d}}})]}}),{deleted:!0,documentId:a.document_id,startIndex:a.start_index,endIndex:a.end_index}}catch(a){if(a instanceof b_)throw a;throw b0(a)}}}]},operations:[{slug:"docs_get",name:"Get document",risk:"read",requiresApproval:!1,description:"Retrieve full document structure and content."},{slug:"docs_get_text",name:"Get document text",risk:"read",requiresApproval:!1,description:"Extract plain text from a Google Doc."},{slug:"docs_create",name:"Create document",risk:"write",requiresApproval:!1,description:"Create a new Google Docs document."},{slug:"docs_insert_text",name:"Insert text",risk:"write",requiresApproval:!1,description:"Insert text at a specific index in the document."},{slug:"docs_append_text",name:"Append text",risk:"write",requiresApproval:!1,description:"Append text at the end of the document."},{slug:"docs_replace_text",name:"Replace text",risk:"write",requiresApproval:!1,description:"Find and replace text throughout the document."},{slug:"docs_insert_paragraph",name:"Insert paragraph",risk:"write",requiresApproval:!1,description:"Insert a new paragraph at a given index."},{slug:"docs_insert_page_break",name:"Insert page break",risk:"write",requiresApproval:!1,description:"Insert a page break at a given index."},{slug:"docs_insert_table",name:"Insert table",risk:"write",requiresApproval:!1,description:"Insert a table with specified rows and columns."},{slug:"docs_insert_image",name:"Insert image",risk:"write",requiresApproval:!1,description:"Insert an image from a URL into the document."},{slug:"docs_format_text",name:"Format text",risk:"write",requiresApproval:!1,description:"Apply text formatting (bold, italic, color) to a range."},{slug:"docs_apply_named_style",name:"Apply named style",risk:"write",requiresApproval:!1,description:"Apply a heading or paragraph style to a range."},{slug:"docs_batch_update",name:"Batch update",risk:"write",requiresApproval:!1,description:"Send multiple document update requests in a single API call."},{slug:"docs_delete_content_range",name:"Delete content range",risk:"destructive",requiresApproval:!0,description:"Delete a range of content from the document (irreversible)."}]},"notion-oauth":{credentialType:"notion-oauth",toolFactory:a=>ao({accessToken:a}),operations:an},notion:{credentialType:"api_key",toolFactory:a=>ao({accessToken:a}),operations:an},"airtable-oauth":{credentialType:"airtable-oauth",toolFactory:a=>aC({accessToken:a}),operations:aB},airtable:{credentialType:"api_key",toolFactory:a=>aC({accessToken:a}),operations:aB},firecrawl:{credentialType:"api_key",toolFactory:a=>(function(a){var b;if(!a.accessToken)throw Error("FirecrawlAdapterOptions: accessToken must be a non-empty string.");let c=(b=a.accessToken,new cl.Jn({apiKey:b}));return[{name:"firecrawl_scrape",description:"Scrape a single web page and return its content. Supports markdown (default), raw HTML, and extracted links.",inputSchema:co,riskLevel:"read",async execute(a){try{let b=await c.scrape(a.url,{formats:a.formats});return{url:a.url,...void 0!==b.markdown&&{markdown:b.markdown},...void 0!==b.html&&{html:b.html},...void 0!==b.links&&{links:b.links}}}catch(a){throw cn(a)}}},{name:"firecrawl_crawl_start",description:"Start an async crawl job for a website. Returns a job ID. Use firecrawl_crawl_status to poll for results.",inputSchema:cr,riskLevel:"read",async execute(a){try{let b=await c.startCrawl(a.url,{...void 0!==a.limit&&{limit:a.limit}});return{id:b.id,url:b.url}}catch(a){throw cn(a)}}},{name:"firecrawl_crawl_status",description:'Get the current status and partial results of a Firecrawl crawl job. Poll this until status is "completed", "failed", or "cancelled".',inputSchema:cs,riskLevel:"read",async execute(a){try{let b=await c.getCrawlStatus(a.id);return{id:b.id,status:b.status,total:b.total,completed:b.completed,data:(b.data??[]).map(a=>({...a.metadata?.url!==void 0&&{url:a.metadata.url},...void 0!==a.markdown&&{markdown:a.markdown},...void 0!==a.html&&{html:a.html}}))}}catch(a){throw cn(a)}}},{name:"firecrawl_map",description:"Discover all URLs on a website (sitemap-aware). Returns a list of links with optional titles and descriptions. Use the search param to filter results.",inputSchema:cp,riskLevel:"read",async execute(a){try{return{links:((await c.map(a.url,{...void 0!==a.search&&{search:a.search}})).links??[]).map(a=>({url:a.url,...void 0!==a.title&&{title:a.title},...void 0!==a.description&&{description:a.description}}))}}catch(a){throw cn(a)}}},{name:"firecrawl_search",description:"Search the web via Firecrawl and return a list of web results (URL, title, description).",inputSchema:cq,riskLevel:"read",async execute(a){try{return{results:((await c.search(a.query,{...void 0!==a.limit&&{limit:a.limit}})).web??[]).map(a=>({url:a.url??"",...void 0!==a.title&&{title:a.title},...void 0!==a.description&&{description:a.description}}))}}catch(a){throw cn(a)}}}]})({accessToken:a}),operations:[{slug:"firecrawl_scrape",name:"Scrape page",risk:"read",requiresApproval:!1,description:"Scrape a single URL and return its content as markdown, HTML, and/or links."},{slug:"firecrawl_crawl_start",name:"Start crawl",risk:"read",requiresApproval:!1,description:"Start an async crawl job for a site. Returns a job ID to poll with firecrawl_crawl_status."},{slug:"firecrawl_crawl_status",name:"Get crawl status",risk:"read",requiresApproval:!1,description:"Poll the status and partial results of a Firecrawl crawl job by its ID."},{slug:"firecrawl_map",name:"Map site",risk:"read",requiresApproval:!1,description:"Discover all URLs on a site (sitemap-aware). Optionally filter by a search term."},{slug:"firecrawl_search",name:"Search web",risk:"read",requiresApproval:!1,description:"Search the web via Firecrawl and return structured results."}]},apify:{credentialType:"api_key",toolFactory:a=>(function(a){var b;if(!a.accessToken)throw Error("ApifyAdapterOptions: accessToken must be a non-empty string.");let d=(b=a.accessToken,new ct.rj({token:b}));return[{name:"apify_run_actor",description:"Start an Apify actor run and wait for it to finish (blocking). Returns the run ID, output dataset ID, and final status. This tool consumes Apify platform credits — use apify_get_dataset_items to retrieve results after the run succeeds.",inputSchema:cv,riskLevel:"write",async execute(a){try{let b=await d.actor(a.actorId).call(a.input);return{runId:b.id,datasetId:b.defaultDatasetId,status:b.status}}catch(a){throw(0,cu.G)(a)}}},{name:"apify_get_run",description:"Retrieve metadata for an Apify actor run by its run ID. Returns status, actor ID, dataset ID, and timestamps.",inputSchema:cw,riskLevel:"read",async execute(a){try{let b=await d.run(a.runId).get();if(!b){let{ApifyApiError:b}=await Promise.resolve().then(c.bind(c,99740));throw new b("apify_not_found",`Run ${a.runId} not found`,404)}return{id:b.id,actId:b.actId,status:b.status,startedAt:b.startedAt?b.startedAt.toISOString():null,finishedAt:b.finishedAt?b.finishedAt.toISOString():null,defaultDatasetId:b.defaultDatasetId,defaultKeyValueStoreId:b.defaultKeyValueStoreId}}catch(a){throw(0,cu.G)(a)}}},{name:"apify_list_datasets",description:"List datasets in the user's Apify account. Returns dataset IDs and names needed for apify_get_dataset_items.",inputSchema:cx,riskLevel:"read",async execute(a){try{let b=await d.datasets().list({limit:a.limit??100,offset:a.offset??0});return{datasets:b.items.map(a=>({id:a.id,name:a.name??null,itemCount:a.itemCount??0,createdAt:a.createdAt.toISOString(),modifiedAt:a.modifiedAt.toISOString()})),total:b.total,count:b.count,offset:b.offset}}catch(a){throw(0,cu.G)(a)}}},{name:"apify_get_dataset_items",description:"Retrieve items from an Apify dataset. Use the datasetId returned by apify_run_actor or from apify_list_datasets. Supports limit/offset pagination (max 1000 items per call).",inputSchema:cy,riskLevel:"read",async execute(a){try{let b=await d.dataset(a.datasetId).listItems({limit:a.limit??100,offset:a.offset??0});return{items:b.items,total:b.total,count:b.count,offset:b.offset}}catch(a){throw(0,cu.G)(a)}}}]})({accessToken:a}),operations:[{slug:"apify_run_actor",name:"Run actor",risk:"write",requiresApproval:!1,description:"Start an Apify actor run and wait for it to finish. Consumes Apify platform credits."},{slug:"apify_get_run",name:"Get run",risk:"read",requiresApproval:!1,description:"Retrieve metadata for an Apify actor run by its run ID."},{slug:"apify_list_datasets",name:"List datasets",risk:"read",requiresApproval:!1,description:"List datasets in the user's Apify account with optional pagination."},{slug:"apify_get_dataset_items",name:"Get dataset items",risk:"read",requiresApproval:!1,description:"Retrieve items from an Apify dataset. Supports limit and offset pagination."}]},tavily:{credentialType:"api_key",toolFactory:a=>(function(a){var b;let c;if(!a.accessToken)throw Error("TavilyAdapterOptions: accessToken must be a non-empty string.");let d=(b=a.accessToken,c=(0,cz.Y)({apiKey:b}),{search:(a,b)=>c.search(a,b),extract:(a,b)=>c.extract(a,b),crawl:(a,b)=>c.crawl(a,b)});return[{name:"tavily_search",description:'Search the web using Tavily. Returns ranked results with titles, URLs, content snippets, and relevance scores. Use topic="news" for current events.',inputSchema:cC,riskLevel:"read",async execute(a,b){try{let b=await d.search(a.query,{searchDepth:a.searchDepth??"basic",maxResults:a.maxResults??5,includeImages:a.includeImages??!1,topic:a.topic??"general"});return{query:b.query,answer:b.answer,results:(b.results??[]).map(a=>({title:a.title,url:a.url,content:a.content,score:a.score,publishedDate:a.publishedDate})),images:(b.images??[]).map(a=>({url:a.url,description:a.description})),responseTime:b.responseTime}}catch(a){throw cB(a)}}},{name:"tavily_extract",description:"Extract the full text content from one or more URLs (max 20). Returns the raw content of each page and a list of URLs that failed to extract.",inputSchema:cD,riskLevel:"read",async execute(a,b){try{let b=await d.extract(a.urls,{extractDepth:a.extractDepth??"basic"});return{results:(b.results??[]).map(a=>({url:a.url,title:a.title,rawContent:a.rawContent})),failedResults:(b.failedResults??[]).map(a=>({url:a.url,error:a.error})),responseTime:b.responseTime}}catch(a){throw cB(a)}}},{name:"tavily_crawl",description:"Crawl from a seed URL and return scraped content for all reachable pages up to a depth and page limit. Useful for comprehensive site content extraction.",inputSchema:cE,riskLevel:"read",async execute(a,b){try{let b=await d.crawl(a.url,{maxDepth:a.maxDepth??1,limit:a.limit??10});return{baseUrl:b.baseUrl,results:(b.results??[]).map(a=>({url:a.url,rawContent:a.rawContent})),responseTime:b.responseTime}}catch(a){throw cB(a)}}}]})({accessToken:a}),operations:[{slug:"tavily_search",name:"Web search",risk:"read",requiresApproval:!1,description:"Search the web using Tavily. Returns ranked results with titles, URLs, and content snippets."},{slug:"tavily_extract",name:"Extract content",risk:"read",requiresApproval:!1,description:"Extract the full text content from one or more URLs (max 20)."},{slug:"tavily_crawl",name:"Crawl site",risk:"read",requiresApproval:!1,description:"Crawl from a seed URL and return scraped content for all reachable pages up to a depth and limit."}]}};var cG=c(75749);function cH(a){return{ok:!0,data:a}}function cI(a,b){return{ok:!1,code:a,message:b}}async function cJ(){let a,b=(0,u.Iz)();try{let b=await (0,f.headers)();a=new Request("http://localhost/",{headers:b})}catch{a=new Request("http://localhost/")}return(0,v.oC)(a,b)}let cK=g.Ik({slug:g.Yj().min(1).max(80).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with dashes"),name:g.Yj().min(1).max(120),personality:g.Yj().min(1),model:g.Yj().min(1),llmKeyId:g.Yj().guid().optional(),role:g.k5(["worker","router","planner"]).default("worker"),subAgentIds:g.YO(g.Yj().guid()).default([])}).refine(a=>"worker"!==a.role||0===a.subAgentIds.length,{message:"Sub-agents only apply when role is router or planner",path:["subAgentIds"]}),cL=g.Ik({prompt:g.Yj().min(1),agentId:g.Yj().guid("Must select a valid agent"),priority:g.k5(["low","medium","high"]).default("medium"),sendViaTelegram:g.KC([g.eu("true"),g.eu("false"),g.zM()]).optional().transform(a=>!0===a||"true"===a)});async function cM(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select().from(h.X6).where((0,h.eq)(h.X6.entityId,a.entityId)).orderBy((0,h.i8)(h.X6.createdAt));return cH(c)}catch(a){return console.error("[listAgentsAction]",a),cI("db_error","Failed to load agents")}}async function cN(a){try{let b=await cJ(),c=cK.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let{role:d,subAgentIds:f}=c.data,g=(0,u.Lf)();if(f.length>0&&(await g.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.RV)(h.X6.id,f),(0,h.eq)(h.X6.entityId,b.entityId)))).length!==f.length)return cI("validation_failed","One or more sub-agents not found in this workspace");let{dbRole:i,orchestratorMode:j}=cQ(d),[k]=await g.insert(h.X6).values({entityId:b.entityId,slug:c.data.slug,name:c.data.name,personality:c.data.personality,model:c.data.model,llmKeyId:c.data.llmKeyId??null,role:i,orchestratorMode:j}).returning({id:h.X6.id});if(!k)return cI("db_error","Insert returned no row");return f.length>0&&await g.insert(h.Qj).values(f.map(a=>({orchestratorId:k.id,subAgentId:a,entityId:b.entityId}))),(0,e.revalidatePath)("/agents"),cH({id:k.id})}catch(b){console.error("[createAgentAction]",b);let a=b instanceof Error?b.message:"";if(a.includes("unique")||a.includes("23505"))return cI("conflict","An agent with this slug already exists");return cI("db_error","Failed to create agent")}}async function cO(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");let c=(0,u.Lf)(),[d]=await c.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,b.entityId)));if(!d)return cI("not_found","Agent not found");return await c.delete(h.X6).where((0,h.eq)(h.X6.id,a)),(0,e.revalidatePath)("/agents"),cH(void 0)}catch(a){return console.error("[deleteAgentAction]",a),cI("db_error","Failed to delete agent")}}let cP=g.Ik({id:g.Yj().guid(),name:g.Yj().min(1).max(120),personality:g.Yj().min(1),model:g.Yj().min(1),llmKeyId:g.Yj().guid().nullable().optional(),role:g.k5(["worker","router","planner"]),subAgentIds:g.YO(g.Yj().guid()).default([])});function cQ(a){return"worker"===a?{dbRole:"agent",orchestratorMode:null}:{dbRole:"orchestrator",orchestratorMode:a}}async function cR(a){try{let b=await cJ(),c=cP.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,name:f,personality:g,model:i,llmKeyId:j,role:k,subAgentIds:l}=c.data,m=(0,u.Lf)(),[n]=await m.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,d),(0,h.eq)(h.X6.entityId,b.entityId)));if(!n)return cI("not_found","Agent not found");let{dbRole:o,orchestratorMode:p}=cQ(k),q={name:f,personality:g,model:i,role:o,orchestratorMode:p,updatedAt:new Date};return void 0!==j&&(q.llmKeyId=j),await m.update(h.X6).set(q).where((0,h.eq)(h.X6.id,d)),await m.delete(h.Qj).where((0,h.eq)(h.Qj.orchestratorId,d)),"worker"!==k&&l.length>0&&await m.insert(h.Qj).values(l.map(a=>({orchestratorId:d,subAgentId:a,entityId:b.entityId}))),await m.update(h.ME).set({systemPrompt:null,updatedAt:new Date}).where((0,h.Uo)((0,h.eq)(h.ME.agentId,d),(0,h.KL)(h.ME.status,["completed","failed","cancelled"]))),(0,e.revalidatePath)("/agents"),cH(void 0)}catch(a){return console.error("[updateAgentAction]",a),cI("db_error","Failed to update agent")}}async function cS(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");let c=(0,u.Lf)(),[d]=await c.select().from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,b.entityId)));if(!d)return cI("not_found","Agent not found");let e=await c.select({subAgentId:h.Qj.subAgentId}).from(h.Qj).where((0,h.eq)(h.Qj.orchestratorId,a));return cH({...d,orchestratorMode:d.orchestratorMode??null,subAgentIds:e.map(a=>a.subAgentId)})}catch(a){return console.error("[getAgentForEditAction]",a),cI("db_error","Failed to load agent")}}async function cT(a){try{let b=await cJ(),c=cL.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),[f]=await d.select({id:h.X6.id,slug:h.X6.slug}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,c.data.agentId),(0,h.eq)(h.X6.entityId,b.entityId)));if(!f)return cI("not_found","Agent not found");let g=null;if(c.data.sendViaTelegram){let[a]=await d.select({chatId:h.X6.lastSeenChatIdTelegram}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,c.data.agentId),(0,h.eq)(h.X6.entityId,b.entityId))).limit(1);if(!a?.chatId)return cI("no_telegram_recipient_known","DM the bot first to register a recipient.");g=a.chatId}let[i]=await d.insert(h.ME).values({entityId:b.entityId,agentId:f.id,status:"pending",channel:"api",task:c.data.prompt,...g?{chatId:g}:{}}).returning({id:h.ME.id});if(!i)return cI("db_error","Failed to create job");let j=`${w._.RUNNER_URL}/api/worker`;return w._.WORKER_SECRET?fetch(j,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${w._.WORKER_SECRET}`},body:JSON.stringify({jobId:i.id})}).catch(a=>{console.error("[sendTaskAction] runner ping failed:",a)}):console.error("[sendTaskAction] WORKER_SECRET missing — cannot ping runner"),(0,e.revalidatePath)("/jobs"),cH({jobId:i.id})}catch(a){return console.error("[sendTaskAction]",a),cI("db_error","Failed to send task")}}async function cU(a={}){try{let b=await cJ(),c=Math.min(a.limit??50,100),d=(0,u.Lf)(),e=await d.select({id:h.ME.id,entityId:h.ME.entityId,agentId:h.ME.agentId,status:h.ME.status,channel:h.ME.channel,task:h.ME.task,result:h.ME.result,error:h.ME.error,chainCount:h.ME.chainCount,inputTokens:h.ME.inputTokens,outputTokens:h.ME.outputTokens,createdAt:h.ME.createdAt,completedAt:h.ME.completedAt}).from(h.ME).where((0,h.eq)(h.ME.entityId,b.entityId)).orderBy((0,h.i8)(h.ME.createdAt)).limit(c);return cH(e)}catch(a){return console.error("[listJobsAction]",a),cI("db_error","Failed to load jobs")}}async function cV(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid job id");let c=(0,u.Lf)(),[d]=await c.select({job:h.ME,agentName:h.X6.name,agentSlug:h.X6.slug}).from(h.ME).leftJoin(h.X6,(0,h.eq)(h.X6.id,h.ME.agentId)).where((0,h.Uo)((0,h.eq)(h.ME.id,a),(0,h.eq)(h.ME.entityId,b.entityId)));if(!d)return cI("not_found","Job not found");let e=await c.select({id:h.ME.id,agentName:h.X6.name,agentSlug:h.X6.slug,status:h.ME.status,result:h.ME.result,error:h.ME.error,createdAt:h.ME.createdAt,completedAt:h.ME.completedAt}).from(h.ME).leftJoin(h.X6,(0,h.eq)(h.X6.id,h.ME.agentId)).where((0,h.eq)(h.ME.parentJobId,a)).orderBy(h.ME.createdAt);return cH({...d.job,agentName:d.agentName,agentSlug:d.agentSlug,children:e})}catch(a){return console.error("[getJobDetailAction]",a),cI("db_error","Failed to load job")}}async function cW(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid job id");let c=(0,u.Lf)(),[d]=await c.select({status:h.ME.status,result:h.ME.result,error:h.ME.error}).from(h.ME).where((0,h.Uo)((0,h.eq)(h.ME.id,a),(0,h.eq)(h.ME.entityId,b.entityId)));if(!d)return cI("not_found","Job not found");return cH({status:d.status??"pending",result:d.result,error:d.error})}catch(a){return console.error("[getJobStatusAction]",a),cI("db_error","Failed to load job status")}}let cX=g.Ik({agentId:g.Yj().guid(),botToken:g.Yj().min(20,"Token looks too short").max(200,"Token looks too long").regex(/^\d+:[A-Za-z0-9_-]+$/,"Token must look like 123456789:AAAAA...")});async function cY(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");let c=(0,u.Lf)(),[d]=await c.select({id:h.X6.id,slug:h.X6.slug,name:h.X6.name,botToken:h.X6.telegramBotToken,botUsername:h.X6.telegramBotUsername,lastSeenChatIdTelegram:h.X6.lastSeenChatIdTelegram}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,b.entityId)));if(!d)return cI("not_found","Agent not found");return cH({agentId:d.id,agentSlug:d.slug,agentName:d.name,status:d.botToken?"connected":"disconnected",botUsername:d.botUsername,lastSeenChatIdTelegram:d.lastSeenChatIdTelegram})}catch(a){return console.error("[getAgentTelegramConfigAction]",a),cI("db_error","Failed to load Telegram config")}}async function cZ(a){try{let b,c=await cJ(),d=cX.safeParse(a);if(!d.success)return cI("validation_failed",d.error.issues[0]?.message??"Invalid input");let{agentId:f,botToken:g}=d.data,j=(0,u.Lf)(),[m]=await j.select({id:h.X6.id,slug:h.X6.slug,name:h.X6.name}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,f),(0,h.eq)(h.X6.entityId,c.entityId)));if(!m)return cI("not_found","Agent not found");try{b=await k(g)}catch(a){if(a instanceof i&&"telegram_invalid_token"===a.code)return cI("telegram_invalid_token","Telegram rejected this token. Double-check it from @BotFather.");throw a}let n=0;try{let a=await l({botToken:g,offset:-1,timeout:0,limit:1});a.length>0&&(n=Math.max(...a.map(a=>a.update_id))+1)}catch{}return await j.update(h.X6).set({telegramBotToken:g,telegramBotUsername:b.username,telegramOffset:n,updatedAt:new Date}).where((0,h.eq)(h.X6.id,f)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${f}/telegram`),cH({agentId:m.id,agentSlug:m.slug,agentName:m.name,status:"connected",botUsername:b.username,lastSeenChatIdTelegram:null})}catch(a){return console.error("[configureAgentTelegramAction]",a),cI("db_error","Failed to configure Telegram")}}async function c$(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");let c=(0,u.Lf)(),[d]=await c.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,b.entityId)));if(!d)return cI("not_found","Agent not found");return await c.update(h.X6).set({telegramBotToken:null,telegramBotUsername:null,telegramOffset:null,updatedAt:new Date}).where((0,h.eq)(h.X6.id,a)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${a}/telegram`),cH(void 0)}catch(a){return console.error("[disconnectAgentTelegramAction]",a),cI("db_error","Failed to disconnect Telegram")}}let c_=g.Ik({agentId:g.Yj().guid().optional(),category:g.k5(["preference","context","outcome","learned_rule"]).optional(),tag:g.Yj().min(1).max(80).optional(),archived:g.zM().default(!1),page:g.ai().int().min(1).default(1),pageSize:g.ai().int().min(1).max(200).default(50)});async function c0(a={}){try{let b=await cJ(),c=c_.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),e=await r(d,{entityId:b.entityId,agentId:c.data.agentId,category:c.data.category,tags:c.data.tag?[c.data.tag]:void 0,archived:c.data.archived,page:c.data.page,pageSize:c.data.pageSize,sort:"recent"}),f=Array.from(new Set(e.items.map(a=>a.agent_id).filter(a=>null!==a))),g=new Map;if(f.length>0)for(let a of(await d.select({id:h.X6.id,name:h.X6.name,slug:h.X6.slug}).from(h.X6).where((0,h.RV)(h.X6.id,f))))g.set(a.id,{name:a.name,slug:a.slug});let i=e.items.map(a=>{let b=a.agent_id?g.get(a.agent_id):null;return{...a,agentName:b?.name??null,agentSlug:b?.slug??null}});return cH({items:i,page:e.page,pageSize:e.pageSize,totalCount:e.totalCount,hasMore:e.hasMore})}catch(a){return console.error("[listMemoriesAction]",a),cI("db_error","Failed to load memories")}}async function c1(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid memory id");let c=(0,u.Lf)();return await o(c,a,b.entityId,{archived:!0}),(0,e.revalidatePath)("/memories"),cH(void 0)}catch(a){if(a instanceof n)return cI("not_found","Memory not found");return console.error("[archiveMemoryAction]",a),cI("db_error","Failed to archive memory")}}async function c2(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid memory id");let c=(0,u.Lf)();return await o(c,a,b.entityId,{archived:!1}),(0,e.revalidatePath)("/memories"),cH(void 0)}catch(a){if(a instanceof n)return cI("not_found","Memory not found");return console.error("[unarchiveMemoryAction]",a),cI("db_error","Failed to unarchive memory")}}async function c3(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid memory id");let c=(0,u.Lf)();return await p(c,a,b.entityId),(0,e.revalidatePath)("/memories"),cH(void 0)}catch(a){if(a instanceof n)return cI("not_found","Memory not found");return console.error("[deleteMemoryAction]",a),cI("db_error","Failed to delete memory")}}async function c4(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select().from(h.tK).where((0,h.eq)(h.tK.entityId,a.entityId)),d=[...new Set(c.map(a=>a.credentialId).filter(a=>null!==a))],e=d.length>0?await b.select().from(h.z3).where((0,h.RV)(h.z3.id,d)):[],f=new Map;for(let a of e)f.set(a.id,a);let g=new Map;for(let a of e)try{let b=a.payload,c=b.startsWith("enc:v1:")?(0,s.Yc)(b):b,d=JSON.parse(c);g.set(a.id,{accountName:"string"==typeof d.accountName?d.accountName:null,expiresAt:"string"==typeof d.expiresAt&&d.expiresAt?new Date(d.expiresAt):null,scopes:"string"==typeof d.scopes?d.scopes:null})}catch{g.set(a.id,{accountName:null,expiresAt:null,scopes:null})}let i=new Map;for(let a of c)i.set(a.slug,a);let j=C.Y.map(a=>{let b=i.get(a.slug);if(!b)return{catalogSlug:a.slug,label:a.label,authType:a.authType,docsHint:a.docsHint,connector:null};let c=b.credentialId?f.get(b.credentialId):void 0,d=b.credentialId?g.get(b.credentialId)??null:null;return{catalogSlug:a.slug,label:a.label,authType:a.authType,docsHint:a.docsHint,connector:{id:b.id,slug:b.slug,name:b.name,authType:b.authType,active:b.active??!0,hasApiKey:!!b.apiKey,credentialId:b.credentialId??null,credentialName:c?.name??null,credentialType:c?c.type:null,credentialAccountName:d?.accountName??null,credentialExpiresAt:d?.expiresAt??null,credentialScopes:d?.scopes??null,createdAt:b.createdAt,updatedAt:b.updatedAt}}});return cH(j)}catch(a){return console.error("[listConnectorsAction]",a),cI("db_error","Failed to load connectors")}}let c5=g.Ik({slug:g.Yj().min(1).max(80),name:g.Yj().min(1).max(120).optional(),apiKey:g.Yj().min(1,"API key is required")});async function c6(a){try{let b=await cJ(),c=c5.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=C.Y.find(a=>a.slug===c.data.slug);if(!d)return cI("validation_failed","Unknown connector slug");if("api_key"!==d.authType)return cI("validation_failed",`Connector ${c.data.slug} uses ${d.authType}, not api_key`);let f=(0,u.Lf)(),[g]=await f.select({id:h.tK.id}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.entityId,b.entityId),(0,h.eq)(h.tK.slug,c.data.slug))),i=c.data.name??d.label,j=(0,s.ph)(c.data.apiKey)?c.data.apiKey:(0,s.w)(c.data.apiKey);if(g)return await f.update(h.tK).set({name:i,apiKey:j,authType:"api_key",active:!0,updatedAt:new Date}).where((0,h.eq)(h.tK.id,g.id)),(0,e.revalidatePath)("/connectors"),cH({id:g.id});let[k]=await f.insert(h.tK).values({entityId:b.entityId,slug:c.data.slug,name:i,apiKey:j,authType:"api_key",active:!0}).returning({id:h.tK.id});if(!k)return cI("db_error","Insert returned no row");return(0,e.revalidatePath)("/connectors"),cH({id:k.id})}catch(a){return console.error("[saveApiKeyConnectorAction]",a),cI("db_error","Failed to save connector")}}async function c7(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid connector id");let c=(0,u.Lf)(),[d]=await c.select({id:h.tK.id}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.id,a),(0,h.eq)(h.tK.entityId,b.entityId)));if(!d)return cI("not_found","Connector not found");return await c.delete(h.tK).where((0,h.eq)(h.tK.id,a)),(0,e.revalidatePath)("/connectors"),cH(void 0)}catch(a){return console.error("[deleteConnectorAction]",a),cI("db_error","Failed to delete connector")}}async function c8(a,b){try{let c=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid connector id");if(null!==b&&!g.Yj().guid().safeParse(b).success)return cI("validation_failed","Invalid credential id");let d=(0,u.Lf)(),[f]=await d.select({id:h.tK.id,slug:h.tK.slug,authType:h.tK.authType}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.id,a),(0,h.eq)(h.tK.entityId,c.entityId)));if(!f)return cI("not_found","Connector not found");if("oauth2"!==f.authType)return cI("invalid_auth_type","Only OAuth2 connectors support credential assignment");if(null!==b){let[a]=await d.select({id:h.z3.id,ownerUserId:h.z3.ownerUserId,type:h.z3.type}).from(h.z3).where((0,h.eq)(h.z3.id,b));if(!a)return cI("not_found","Credential not found");if(a.ownerUserId!==c.userId)return cI("forbidden","Access denied");let e=(0,D.ZH)(f.slug);if(e&&e.credentialType!==a.type)return cI("type_mismatch",`Credential type '${a.type}' is not compatible with connector '${f.slug}' (expects '${e.credentialType}')`)}return await d.update(h.tK).set({credentialId:b,updatedAt:new Date}).where((0,h.eq)(h.tK.id,a)),(0,e.revalidatePath)("/connectors"),cH(void 0)}catch(b){console.error("[assignCredentialAction]",b);let a=b instanceof Error?b.message:String(b);return cI("db_error",`Failed to assign credential: ${a}`)}}async function c9(a,b){try{let c,d=await cJ();if(!g.Yj().min(1).max(80).safeParse(a).success)return cI("validation_failed","Invalid connector slug");if(!g.Yj().guid().safeParse(b).success)return cI("validation_failed","Invalid credential id");let f=C.Y.find(b=>b.slug===a);if(!f)return cI("validation_failed","Unknown connector slug");if("oauth2"!==f.authType)return cI("invalid_auth_type","Only OAuth2 connectors support credential assignment");let i=(0,u.Lf)(),[j]=await i.select({id:h.z3.id,ownerUserId:h.z3.ownerUserId,type:h.z3.type}).from(h.z3).where((0,h.eq)(h.z3.id,b));if(!j)return cI("not_found","Credential not found");if(j.ownerUserId!==d.userId)return cI("forbidden","Access denied");if(f.credentialType&&f.credentialType!==j.type)return cI("type_mismatch",`Credential type '${j.type}' is not compatible with connector '${a}' (expects '${f.credentialType}')`);let[k]=await i.select({id:h.tK.id}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.entityId,d.entityId),(0,h.eq)(h.tK.slug,a)));if(k)await i.update(h.tK).set({credentialId:b,active:!0,updatedAt:new Date}).where((0,h.eq)(h.tK.id,k.id)),c=k.id;else{let[e]=await i.insert(h.tK).values({entityId:d.entityId,slug:a,name:f.label,authType:"oauth2",credentialId:b,active:!0}).returning({id:h.tK.id});if(!e)return cI("db_error","Insert returned no row");c=e.id}return(0,e.revalidatePath)("/connectors"),cH({connectorId:c})}catch(b){console.error("[createOrAssignOAuthConnectorAction]",b);let a=b instanceof Error?b.message:String(b);return cI("db_error",`Failed to assign credential: ${a}`)}}async function da(a={}){try{let b=await cJ(),c=(0,u.Lf)(),d=a.status??"pending",e=(0,h.eq)(h.MZ.entityId,b.entityId),f="all"===d?e:(0,h.Uo)(e,(0,h.eq)(h.MZ.status,d)),g=await c.select({id:h.MZ.id,jobId:h.MZ.jobId,agentId:h.MZ.agentId,agentName:h.X6.name,agentSlug:h.X6.slug,toolName:h.MZ.toolName,toolInput:h.MZ.toolInput,status:h.MZ.status,requestedAt:h.MZ.requestedAt,resolvedAt:h.MZ.resolvedAt,resolvedBy:h.MZ.resolvedBy,expiresAt:h.MZ.expiresAt,notes:h.MZ.notes,jobTask:h.ME.task}).from(h.MZ).leftJoin(h.X6,(0,h.eq)(h.X6.id,h.MZ.agentId)).leftJoin(h.ME,(0,h.eq)(h.ME.id,h.MZ.jobId)).where(f).orderBy((0,h.i8)(h.MZ.requestedAt)).limit(100);return cH(g.map(a=>({...a,status:a.status??"pending"})))}catch(a){return console.error("[listApprovalsAction]",a),cI("db_error","Failed to load approvals")}}let db=g.Ik({approvalRequestId:g.Yj().guid(),decision:g.k5(["approve","reject"]),notes:g.Yj().max(5e3).optional()});async function dc(a){try{let b;await cJ();let c=db.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!w._.WORKER_SECRET)return console.error("[resolveApprovalAction] WORKER_SECRET missing"),cI("config_error","WORKER_SECRET is not set");let d=`${w._.RUNNER_URL}/api/approve`;try{b=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${w._.WORKER_SECRET}`},body:JSON.stringify(c.data)})}catch(a){return console.error("[resolveApprovalAction] fetch failed",a),cI("runner_unreachable","Runner did not respond")}if(!b.ok){let a=(await b.json().catch(()=>({}))).error??`runner_${b.status}`;return cI(a,`Runner rejected: ${a}`)}let f=await b.json();return(0,e.revalidatePath)("/approvals"),(0,e.revalidatePath)("/jobs"),(0,e.revalidatePath)(`/jobs/${f.jobId}`),cH({jobId:f.jobId,decision:f.decision})}catch(a){return console.error("[resolveApprovalAction]",a),cI("db_error","Failed to resolve approval")}}async function dd(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select({id:h.eK.id,name:h.eK.name,slug:h.eK.slug,content:h.eK.content,description:h.eK.description,active:h.eK.active,requiredBuiltins:h.eK.requiredBuiltins,createdAt:h.eK.createdAt,updatedAt:h.eK.updatedAt}).from(h.eK).where((0,h.eq)(h.eK.entityId,a.entityId)).orderBy((0,h.i8)(h.eK.updatedAt));if(0===c.length)return cH([]);let d=await b.select({skillId:h.$m.skillId,c:(0,h.ll)`count(*)`}).from(h.$m).where((0,h.Uo)((0,h.eq)(h.$m.entityId,a.entityId),(0,h.RV)(h.$m.skillId,c.map(a=>a.id)))).groupBy(h.$m.skillId),e=new Map;for(let a of d)e.set(a.skillId,Number(a.c));return cH(c.map(a=>({id:a.id,name:a.name,slug:a.slug,content:a.content,description:a.description,active:a.active??!0,requiredBuiltins:a.requiredBuiltins??[],assignmentCount:e.get(a.id)??0,createdAt:a.createdAt,updatedAt:a.updatedAt})))}catch(a){return console.error("[listSkillsAction]",a),cI("db_error","Failed to load skills")}}let de=g.Ik({slug:g.Yj().min(1).max(80).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with dashes"),name:g.Yj().min(1).max(120),content:g.Yj().min(1),description:g.Yj().max(500).optional()});async function df(a){try{let b=await cJ(),c=de.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),[f]=await d.insert(h.eK).values({entityId:b.entityId,slug:c.data.slug,name:c.data.name,content:c.data.content,defaultContent:c.data.content,description:c.data.description??null,active:!0}).returning({id:h.eK.id});if(!f)return cI("db_error","Insert returned no row");return(0,e.revalidatePath)("/skills"),cH({id:f.id})}catch(b){console.error("[createSkillAction]",b);let a=b instanceof Error?b.message:"";if(a.includes("unique")||a.includes("23505"))return cI("conflict","A skill with this slug already exists");return cI("db_error","Failed to create skill")}}async function dg(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid skill id");let c=(0,u.Lf)(),[d]=await c.select({id:h.eK.id}).from(h.eK).where((0,h.Uo)((0,h.eq)(h.eK.id,a),(0,h.eq)(h.eK.entityId,b.entityId)));if(!d)return cI("not_found","Skill not found");return await c.delete(h.eK).where((0,h.eq)(h.eK.id,a)),(0,e.revalidatePath)("/skills"),cH(void 0)}catch(a){return console.error("[deleteSkillAction]",a),cI("db_error","Failed to delete skill")}}let dh=g.Ik({skillId:g.Yj().guid(),agentId:g.Yj().guid()});async function di(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid skill id");let c=(0,u.Lf)(),[d]=await c.select({id:h.eK.id}).from(h.eK).where((0,h.Uo)((0,h.eq)(h.eK.id,a),(0,h.eq)(h.eK.entityId,b.entityId)));if(!d)return cI("not_found","Skill not found");let e=await c.select({id:h.X6.id,name:h.X6.name,slug:h.X6.slug}).from(h.X6).where((0,h.eq)(h.X6.entityId,b.entityId)).orderBy(h.X6.name),f=await c.select({agentId:h.$m.agentId}).from(h.$m).where((0,h.eq)(h.$m.skillId,a)),i=new Set(f.map(a=>a.agentId));return cH(e.map(a=>({agentId:a.id,agentName:a.name,agentSlug:a.slug,assigned:i.has(a.id)})))}catch(a){return console.error("[listSkillAssignmentsAction]",a),cI("db_error","Failed to load skill assignments")}}async function dj(a){try{let b=await cJ(),c=dh.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),[f]=await d.select({id:h.eK.id}).from(h.eK).where((0,h.Uo)((0,h.eq)(h.eK.id,c.data.skillId),(0,h.eq)(h.eK.entityId,b.entityId)));if(!f)return cI("not_found","Skill not found");let[g]=await d.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,c.data.agentId),(0,h.eq)(h.X6.entityId,b.entityId)));if(!g)return cI("not_found","Agent not found");let[i]=await d.select({id:h.$m.id}).from(h.$m).where((0,h.Uo)((0,h.eq)(h.$m.skillId,c.data.skillId),(0,h.eq)(h.$m.agentId,c.data.agentId)));if(i)return(0,e.revalidatePath)("/skills"),cH(void 0);return await d.insert(h.$m).values({entityId:b.entityId,skillId:c.data.skillId,agentId:c.data.agentId}),(0,e.revalidatePath)("/skills"),cH(void 0)}catch(a){return console.error("[assignSkillAction]",a),cI("db_error","Failed to assign skill")}}let dk=g.Ik({id:g.Yj().guid(),name:g.Yj().min(1).max(120),description:g.Yj().max(500).optional(),content:g.Yj().min(1),active:g.zM().optional()});async function dl(a){try{let b=await cJ(),c=dk.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,name:f,description:g,content:i,active:j}=c.data,k=(0,u.Lf)(),[l]=await k.select({id:h.eK.id}).from(h.eK).where((0,h.Uo)((0,h.eq)(h.eK.id,d),(0,h.eq)(h.eK.entityId,b.entityId)));if(!l)return cI("not_found","Skill not found");return await k.update(h.eK).set({name:f,description:g??null,content:i,...void 0!==j?{active:j}:{},updatedAt:new Date}).where((0,h.eq)(h.eK.id,d)),(0,e.revalidatePath)("/skills"),cH(void 0)}catch(a){return console.error("[updateSkillAction]",a),cI("db_error","Failed to update skill")}}async function dm(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid skill id");let c=(0,u.Lf)(),[d]=await c.select({id:h.eK.id,name:h.eK.name,slug:h.eK.slug,content:h.eK.content,description:h.eK.description,active:h.eK.active,requiredBuiltins:h.eK.requiredBuiltins,createdAt:h.eK.createdAt,updatedAt:h.eK.updatedAt}).from(h.eK).where((0,h.Uo)((0,h.eq)(h.eK.id,a),(0,h.eq)(h.eK.entityId,b.entityId)));if(!d)return cI("not_found","Skill not found");return cH({id:d.id,name:d.name,slug:d.slug,content:d.content,description:d.description,active:d.active??!0,requiredBuiltins:d.requiredBuiltins??[],assignmentCount:0,createdAt:d.createdAt,updatedAt:d.updatedAt})}catch(a){return console.error("[getSkillByIdAction]",a),cI("db_error","Failed to load skill")}}async function dn(a){try{let b=await cJ(),c=dh.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)();return await d.delete(h.$m).where((0,h.Uo)((0,h.eq)(h.$m.skillId,c.data.skillId),(0,h.eq)(h.$m.agentId,c.data.agentId),(0,h.eq)(h.$m.entityId,b.entityId))),(0,e.revalidatePath)("/skills"),cH(void 0)}catch(a){return console.error("[unassignSkillAction]",a),cI("db_error","Failed to unassign skill")}}let dp=g.Ik({agentId:g.Yj().guid().optional(),toolName:g.Yj().min(1).max(120).optional(),jobId:g.Yj().guid().optional(),page:g.ai().int().min(1).default(1),pageSize:g.ai().int().min(1).max(200).default(50)});async function dq(a={}){try{let b=await cJ(),c=dp.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),e=[(0,h.eq)(h.Ky.entityId,b.entityId)];c.data.toolName&&e.push((0,h.eq)(h.Ky.toolName,c.data.toolName)),c.data.jobId&&e.push((0,h.eq)(h.Ky.jobId,c.data.jobId));let f=(c.data.page-1)*c.data.pageSize,g=c.data.agentId?await d.select({id:h.Ky.id,jobId:h.Ky.jobId,agentId:h.ME.agentId,toolName:h.Ky.toolName,toolInput:h.Ky.toolInput,toolOutput:h.Ky.toolOutput,durationMs:h.Ky.durationMs,turn:h.Ky.turn,createdAt:h.Ky.createdAt}).from(h.Ky).leftJoin(h.ME,(0,h.eq)(h.ME.id,h.Ky.jobId)).where((0,h.Uo)(...e,(0,h.eq)(h.ME.agentId,c.data.agentId))).orderBy((0,h.i8)(h.Ky.createdAt)).limit(c.data.pageSize).offset(f):await d.select({id:h.Ky.id,jobId:h.Ky.jobId,agentId:h.ME.agentId,toolName:h.Ky.toolName,toolInput:h.Ky.toolInput,toolOutput:h.Ky.toolOutput,durationMs:h.Ky.durationMs,turn:h.Ky.turn,createdAt:h.Ky.createdAt}).from(h.Ky).leftJoin(h.ME,(0,h.eq)(h.ME.id,h.Ky.jobId)).where((0,h.Uo)(...e)).orderBy((0,h.i8)(h.Ky.createdAt)).limit(c.data.pageSize).offset(f),i=Array.from(new Set(g.map(a=>a.agentId).filter(a=>null!==a))),j=new Map;if(i.length>0)for(let a of(await d.select({id:h.X6.id,name:h.X6.name,slug:h.X6.slug}).from(h.X6).where((0,h.RV)(h.X6.id,i))))j.set(a.id,{name:a.name,slug:a.slug});let k=g.map(a=>{let b=a.agentId?j.get(a.agentId):null;return{id:a.id,jobId:a.jobId,agentId:a.agentId,agentName:b?.name??null,agentSlug:b?.slug??null,toolName:a.toolName,toolInput:a.toolInput,toolOutput:a.toolOutput,durationMs:a.durationMs,turn:a.turn,createdAt:a.createdAt}});return cH({items:k,page:c.data.page,pageSize:c.data.pageSize})}catch(a){return console.error("[listToolCallsAction]",a),cI("db_error","Failed to load tool calls")}}async function dr(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.selectDistinct({toolName:h.Ky.toolName}).from(h.Ky).where((0,h.eq)(h.Ky.entityId,a.entityId)).orderBy(h.Ky.toolName);return cH(c.map(a=>a.toolName))}catch(a){return console.error("[listToolNamesAction]",a),cI("db_error","Failed to load tool names")}}async function ds(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select({status:h.ME.status,count:(0,h.ll)`count(*)`,inputTokens:(0,h.ll)`coalesce(sum(${h.ME.inputTokens}), 0)`,outputTokens:(0,h.ll)`coalesce(sum(${h.ME.outputTokens}), 0)`,durationMs:(0,h.ll)`coalesce(sum(${h.ME.totalDurationMs}), 0)`}).from(h.ME).where((0,h.eq)(h.ME.entityId,a.entityId)).groupBy(h.ME.status),d={},e=0,f=0,g=0,i=0;for(let a of c){let b=a.status??"unknown",c=Number(a.count);d[b]=(d[b]??0)+c,e+=c,f+=Number(a.inputTokens),g+=Number(a.outputTokens),i+=Number(a.durationMs)}let j=d.completed??0,k=j>0?i/j:null,[l]=await b.select({count:(0,h.ll)`count(*)`}).from(h.Ky).where((0,h.eq)(h.Ky.entityId,a.entityId)),m=Number(l?.count??0),n=(await b.select({agentId:h.ME.agentId,agentName:h.X6.name,agentSlug:h.X6.slug,jobCount:(0,h.ll)`count(*)`,inputTokens:(0,h.ll)`coalesce(sum(${h.ME.inputTokens}), 0)`,outputTokens:(0,h.ll)`coalesce(sum(${h.ME.outputTokens}), 0)`}).from(h.ME).leftJoin(h.X6,(0,h.eq)(h.X6.id,h.ME.agentId)).where((0,h.eq)(h.ME.entityId,a.entityId)).groupBy(h.ME.agentId,h.X6.name,h.X6.slug).orderBy((0,h.i8)((0,h.ll)`count(*)`))).filter(a=>!!(a.agentId&&a.agentName&&a.agentSlug)).map(a=>({agentId:a.agentId,agentName:a.agentName,agentSlug:a.agentSlug,jobCount:Number(a.jobCount),inputTokens:Number(a.inputTokens),outputTokens:Number(a.outputTokens)})),[o]=await b.select({count:(0,h.ll)`count(*)`}).from(h.X6).where((0,h.eq)(h.X6.entityId,a.entityId)),p=Number(o?.count??0);return cH({totalJobs:e,statusCounts:d,totalInputTokens:f,totalOutputTokens:g,totalDurationMs:i,avgDurationMs:k,totalToolCalls:m,agentCount:p,perAgent:n})}catch(a){return console.error("[getEntityStatsAction]",a),cI("db_error","Failed to load stats")}}async function dt(){try{let a=await cJ();return cH({llm:{provider:w._.LLM_PROVIDER??null,model:w._.LLM_MODEL??null,baseURL:w._.LLM_BASE_URL??null},authMode:w._.AUTH_MODE,runnerUrl:w._.RUNNER_URL,appUrl:w._.NEXT_PUBLIC_APP_URL,workerSecretConfigured:!!w._.WORKER_SECRET,user:{userId:a.userId,entityId:a.entityId}})}catch(a){return console.error("[getSettingsAction]",a),cI("db_error","Failed to load settings")}}async function du(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select({id:h.uQ.id,agentId:h.uQ.agentId,agentName:h.X6.name,agentSlug:h.X6.slug,name:h.uQ.name,cronExpr:h.uQ.cronExpr,task:h.uQ.task,active:h.uQ.active,lastRun:h.uQ.lastRun,nextRun:h.uQ.nextRun,lastStatus:h.uQ.lastStatus,createdAt:h.uQ.createdAt,updatedAt:h.uQ.updatedAt}).from(h.uQ).leftJoin(h.X6,(0,h.eq)(h.X6.id,h.uQ.agentId)).where((0,h.eq)(h.uQ.entityId,a.entityId)).orderBy((0,h.i8)(h.uQ.updatedAt));return cH(c.map(a=>({...a,active:a.active??!0})))}catch(a){return console.error("[listSchedulesAction]",a),cI("db_error","Failed to load schedules")}}let dv=g.Ik({agentId:g.Yj().guid("Pick an agent"),name:g.Yj().min(1).max(120),cronExpr:g.Yj().min(1).max(100),task:g.Yj().min(1)});async function dw(a){try{let b=await cJ(),c=dv.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),[f]=await d.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,c.data.agentId),(0,h.eq)(h.X6.entityId,b.entityId)));if(!f)return cI("not_found","Agent not found");let g=F(c.data.cronExpr);if(!g)return cI("validation_failed","Invalid cron expression");let[i]=await d.insert(h.uQ).values({entityId:b.entityId,agentId:c.data.agentId,type:"cron",name:c.data.name,cronExpr:c.data.cronExpr,task:c.data.task,active:!0,nextRun:g}).returning({id:h.uQ.id});if(!i)return cI("db_error","Insert returned no row");return(0,e.revalidatePath)("/automations"),cH({id:i.id})}catch(a){return console.error("[createScheduleAction]",a),cI("db_error","Failed to create schedule")}}let dx=g.Ik({id:g.Yj().guid(),agentId:g.Yj().guid("Pick an agent"),name:g.Yj().min(1).max(120),cronExpr:g.Yj().min(1).max(100),task:g.Yj().min(1)});async function dy(a){try{let b=await cJ(),c=dx.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),[f]=await d.select({id:h.uQ.id}).from(h.uQ).where((0,h.Uo)((0,h.eq)(h.uQ.id,c.data.id),(0,h.eq)(h.uQ.entityId,b.entityId)));if(!f)return cI("not_found","Schedule not found");let[g]=await d.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,c.data.agentId),(0,h.eq)(h.X6.entityId,b.entityId)));if(!g)return cI("not_found","Agent not found");let i=F(c.data.cronExpr);if(!i)return cI("validation_failed","Invalid cron expression");return await d.update(h.uQ).set({agentId:c.data.agentId,name:c.data.name,cronExpr:c.data.cronExpr,task:c.data.task,nextRun:i,updatedAt:new Date}).where((0,h.eq)(h.uQ.id,c.data.id)),(0,e.revalidatePath)("/automations"),cH(void 0)}catch(a){return console.error("[updateScheduleAction]",a),cI("db_error","Failed to update schedule")}}async function dz(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid schedule id");let c=(0,u.Lf)(),[d]=await c.select({id:h.uQ.id,active:h.uQ.active}).from(h.uQ).where((0,h.Uo)((0,h.eq)(h.uQ.id,a),(0,h.eq)(h.uQ.entityId,b.entityId)));if(!d)return cI("not_found","Schedule not found");let f=!(d.active??!0);return await c.update(h.uQ).set({active:f,updatedAt:new Date}).where((0,h.eq)(h.uQ.id,a)),(0,e.revalidatePath)("/automations"),cH({active:f})}catch(a){return console.error("[toggleScheduleAction]",a),cI("db_error","Failed to toggle schedule")}}async function dA(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid schedule id");let c=(0,u.Lf)(),[d]=await c.select({id:h.uQ.id}).from(h.uQ).where((0,h.Uo)((0,h.eq)(h.uQ.id,a),(0,h.eq)(h.uQ.entityId,b.entityId)));if(!d)return cI("not_found","Schedule not found");return await c.delete(h.uQ).where((0,h.eq)(h.uQ.id,a)),(0,e.revalidatePath)("/automations"),cH(void 0)}catch(a){return console.error("[deleteScheduleAction]",a),cI("db_error","Failed to delete schedule")}}async function dB(){try{await cJ();let a=function(){let a=A();if(!a)return{configuredMode:"local-trust",googleConfigured:!1,configPathExists:!1};let b=a.auth??null,c=a.bind;return{configuredMode:b?.mode??("lan"===c?"local-auth":"local-trust"),googleConfigured:!!(b?.googleClientId&&b?.googleClientSecret),configPathExists:!0}}();return cH({runtimeMode:w._.AUTH_MODE,configuredMode:a.configuredMode,googleConfigured:a.googleConfigured,googleAvailableInRuntime:!!(w._.GOOGLE_CLIENT_ID&&w._.GOOGLE_CLIENT_SECRET),configPathExists:a.configPathExists})}catch(a){return console.error("[getSecuritySettingsAction]",a),cI("db_error","Failed to load security settings")}}let dC=g.Ik({mode:g.k5(["local-trust","local-auth"]),googleClientId:g.Yj().max(200).optional(),googleClientSecret:g.Yj().max(200).optional(),clearGoogle:g.zM().default(!1)});async function dD(a){try{await cJ();let b=dC.safeParse(a);if(!b.success)return cI("validation_failed",b.error.issues[0]?.message??"Invalid input");let c=A();if(!c)return cI("cli_config_missing","Cannot find ~/.nodalai/config.json — run `nodal-agents init` first.");let d={...c.auth??{},mode:b.data.mode};b.data.clearGoogle?(delete d.googleClientId,delete d.googleClientSecret):(b.data.googleClientId&&b.data.googleClientId.trim().length>0&&(d.googleClientId=b.data.googleClientId.trim()),b.data.googleClientSecret&&b.data.googleClientSecret.trim().length>0&&(d.googleClientSecret=b.data.googleClientSecret.trim()));try{B({auth:d})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cI("cli_config_missing","Config file disappeared between read and write.");throw b}(0,e.revalidatePath)("/settings");let f=b.data.mode!==w._.AUTH_MODE;return cH({requiresRestart:f})}catch(a){return console.error("[updateAuthSettingsAction]",a),cI("db_error","Failed to update auth settings")}}async function dE(){try{let a;await cJ();let b=(a=A())?{configuredBind:"lan"===a.bind?"lan":"loopback",configPathExists:!0}:{configuredBind:"loopback",configPathExists:!1},c="0.0.0.0"===w._.BIND?"lan":"loopback";return cH({configuredBind:b.configuredBind,runtimeBind:c,lanAddresses:function(){let a=(0,t.networkInterfaces)(),b=[];for(let c of Object.values(a))if(c)for(let a of c)"IPv4"!==a.family||a.internal||b.push(a.address);return b}(),webPort:function(a){try{let b=new URL(a);if(b.port)return Number(b.port);return"https:"===b.protocol?443:80}catch{return 3e3}}(w._.NEXT_PUBLIC_APP_URL),configPathExists:b.configPathExists})}catch(a){return console.error("[getNetworkSettingsAction]",a),cI("db_error","Failed to load network settings")}}let dF=g.Ik({bind:g.k5(["loopback","lan"])});async function dG(a){try{await cJ();let b=dF.safeParse(a);if(!b.success)return cI("validation_failed",b.error.issues[0]?.message??"Invalid input");try{B({bind:b.data.bind})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cI("cli_config_missing","Cannot find ~/.nodalai/config.json — run `nodal-agents init` first.");throw b}(0,e.revalidatePath)("/settings");let c="0.0.0.0"===w._.BIND?"lan":"loopback";return cH({requiresRestart:b.data.bind!==c})}catch(a){return console.error("[updateNetworkSettingsAction]",a),cI("db_error","Failed to update network settings")}}let dH=["anthropic","openai","openai-compatible","ollama","openrouter","google","mistral","groq"],dI=g.Yj().optional().transform(a=>a&&a.length>0?a:null).pipe(g.Yj().url().nullable().or(g.ch())),dJ=g.Ik({provider:g.k5(dH),baseUrl:dI,apiKey:g.Yj().optional(),nickname:g.Yj().min(1).max(120),defaultModel:g.Yj().min(1).max(200),isActive:g.zM().default(!0)}),dK=g.Ik({id:g.Yj().guid(),provider:g.k5(dH),baseUrl:dI,apiKey:g.Yj().optional(),nickname:g.Yj().min(1).max(120),defaultModel:g.Yj().min(1).max(200),isActive:g.zM()}),dL=g.Ik({provider:g.k5(dH),baseUrl:dI,apiKey:g.Yj().optional(),model:g.Yj().optional(),keyId:g.Yj().guid().optional()});function dM(a,b){return b&&0!==b.length?a.replaceAll(b,"[REDACTED]"):a}async function dN(){try{let a=await cJ(),b=(0,u.Lf)(),c=await b.select({id:h.hG.id,provider:h.hG.provider,baseUrl:h.hG.baseUrl,nickname:h.hG.nickname,defaultModel:h.hG.defaultModel,isActive:h.hG.isActive,hasApiKey:(0,h.ll)`(${h.hG.apiKey} <> '')`,apiKeyLast4:h.hG.apiKeyLast4}).from(h.hG).where((0,h.eq)(h.hG.entityId,a.entityId)).orderBy((0,h.i8)(h.hG.createdAt));return cH(c.map(a=>({id:a.id,provider:a.provider,baseUrl:a.baseUrl,nickname:a.nickname,defaultModel:a.defaultModel,isActive:a.isActive,hasApiKey:!!a.hasApiKey,apiKeyLast4:a.apiKeyLast4?a.apiKeyLast4:null})))}catch(a){return console.error("[listLlmKeysAction]",a),cI("db_error","Failed to load LLM providers")}}async function dO(a){try{let b=await cJ(),c=dJ.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,u.Lf)(),f=c.data.apiKey??"",[g]=await d.insert(h.hG).values({entityId:b.entityId,provider:c.data.provider,apiKey:(0,s.w)(f),apiKeyLast4:(0,s.nK)(f),baseUrl:c.data.baseUrl,nickname:c.data.nickname,defaultModel:c.data.defaultModel,isActive:c.data.isActive}).returning({id:h.hG.id});if(!g)return cI("db_error","Insert returned no row");return(0,e.revalidatePath)("/settings"),cH({id:g.id})}catch(a){return console.error("[createLlmKeyAction]",a),cI("db_error","Failed to create LLM provider")}}async function dP(a){try{let b=await cJ(),c=dK.safeParse(a);if(!c.success)return cI("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,provider:f,baseUrl:g,apiKey:i,nickname:j,defaultModel:k,isActive:l}=c.data,m=(0,u.Lf)(),[n]=await m.select({id:h.hG.id}).from(h.hG).where((0,h.Uo)((0,h.eq)(h.hG.id,d),(0,h.eq)(h.hG.entityId,b.entityId)));if(!n)return cI("not_found","LLM provider not found");let o={provider:f,baseUrl:g,nickname:j,defaultModel:k,isActive:l,updatedAt:new Date};return i&&i.length>0&&(o.apiKey=(0,s.w)(i),o.apiKeyLast4=(0,s.nK)(i)),await m.update(h.hG).set(o).where((0,h.eq)(h.hG.id,d)),(0,e.revalidatePath)("/settings"),cH(void 0)}catch(a){return console.error("[updateLlmKeyAction]",a),cI("db_error","Failed to update LLM provider")}}async function dQ(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid LLM provider id");let c=(0,u.Lf)(),[d]=await c.select({id:h.hG.id}).from(h.hG).where((0,h.Uo)((0,h.eq)(h.hG.id,a),(0,h.eq)(h.hG.entityId,b.entityId)));if(!d)return cI("not_found","LLM provider not found");return await c.delete(h.hG).where((0,h.eq)(h.hG.id,a)),(0,e.revalidatePath)("/settings"),cH(void 0)}catch(a){return console.error("[deleteLlmKeyAction]",a),cI("db_error","Failed to delete LLM provider")}}async function dR(a){let b;try{let c=await cJ(),d=dL.safeParse(a);if(!d.success)return cI("validation_failed",d.error.issues[0]?.message??"Invalid input");let{provider:e,baseUrl:f}=d.data;if((!(b=d.data.apiKey)||0===b.length)&&d.data.keyId){let a=(0,u.Lf)(),[e]=await a.select({apiKey:h.hG.apiKey}).from(h.hG).where((0,h.Uo)((0,h.eq)(h.hG.id,d.data.keyId),(0,h.eq)(h.hG.entityId,c.entityId)));if(!e)return cI("not_found","LLM provider not found");b=e.apiKey?(0,s.Yc)(e.apiKey):void 0}if(d.data.keyId&&(!b||0===b.length))return cI("no_api_key_provided","API key is required to test");let g={anthropic:{canonicalBase:"https://api.anthropic.com/v1",path:"/models",auth:"x-api-key"},openai:{canonicalBase:"https://api.openai.com/v1",path:"/models",auth:"bearer"},openrouter:{canonicalBase:"https://openrouter.ai/api/v1",path:"/auth/key",auth:"bearer"},google:{canonicalBase:"https://generativelanguage.googleapis.com/v1beta",path:"/models",auth:"query"},mistral:{canonicalBase:"https://api.mistral.ai/v1",path:"/models",auth:"bearer"},groq:{canonicalBase:"https://api.groq.com/openai/v1",path:"/models",auth:"bearer"},"openai-compatible":{canonicalBase:null,path:"/models",auth:"bearer"},ollama:{canonicalBase:null,path:"/api/tags",auth:"none"}}[e],i=(f??"").replace(/\/$/,"")||g.canonicalBase;if(!i)return cI("validation_failed",`baseUrl is required for ${e}`);let j={Accept:"application/json"},k=`${i}${g.path}`;"bearer"===g.auth&&b&&(j.Authorization=`Bearer ${b}`),"x-api-key"===g.auth&&b&&(j["x-api-key"]=b,j["anthropic-version"]="2023-06-01"),"query"===g.auth&&(k=`${k}?key=${encodeURIComponent(b??"")}`);let l=await fetch(k,{method:"GET",headers:j});if(!l.ok){let a=(await l.text().catch(()=>"")).slice(0,200);return cI("connection_failed",dM(`${e} responded ${l.status}: ${a}`,b))}let m=null;try{let a=await l.json(),b=a.data??a.models;Array.isArray(b)&&(m=b.length)}catch{}return cH({message:null!==m?`Connected, ${m} models available`:"Connected"})}catch(a){return cI("connection_failed",dM(a instanceof Error?a.message:"Unknown error",b))}}async function dS(a){try{let b=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");let c=(0,u.Lf)(),[d]=await c.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,b.entityId)));if(!d)return cI("not_found","Agent not found");let e=await c.select({id:h.tK.id,slug:h.tK.slug,name:h.tK.name,credentialId:h.tK.credentialId,active:h.tK.active}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.entityId,b.entityId),(0,h.eq)(h.tK.active,!0)));if(0===e.length)return cH([]);let f=[...new Set(e.map(a=>a.credentialId).filter(a=>null!==a))],i=new Map;if(f.length>0)for(let a of(await c.select({id:h.z3.id,name:h.z3.name}).from(h.z3).where((0,h.RV)(h.z3.id,f))))i.set(a.id,a.name);let j=await c.select({connectorId:h.XT.connectorId,enabledOperations:h.XT.enabledOperations}).from(h.XT).where((0,h.eq)(h.XT.agentId,a)),k=new Map;for(let a of j)k.set(a.connectorId,{enabledOperations:a.enabledOperations??null});let l=[];for(let a of e){let b=cF[a.slug];if(!b)continue;let c=k.get(a.id);l.push({connectorId:a.id,slug:a.slug,label:a.name,credentialName:a.credentialId?i.get(a.credentialId)??null:null,assigned:void 0!==c,enabledOperations:c?.enabledOperations??null,availableOperations:b.operations})}return cH(l)}catch(a){return console.error("[listAgentConnectorsAction]",a),cI("db_error","Failed to load agent connectors")}}async function dT(a,b,c,d){try{let f=await cJ();if(!g.Yj().guid().safeParse(a).success)return cI("validation_failed","Invalid agent id");if(!g.Yj().guid().safeParse(b).success)return cI("validation_failed","Invalid connector id");let i=(0,u.Lf)(),[j]=await i.select({id:h.X6.id}).from(h.X6).where((0,h.Uo)((0,h.eq)(h.X6.id,a),(0,h.eq)(h.X6.entityId,f.entityId)));if(!j)return cI("not_found","Agent not found");let[k]=await i.select({id:h.tK.id}).from(h.tK).where((0,h.Uo)((0,h.eq)(h.tK.id,b),(0,h.eq)(h.tK.entityId,f.entityId)));if(!k)return cI("not_found","Connector not found");return c?await i.insert(h.XT).values({agentId:a,connectorId:b,entityId:f.entityId,enabledOperations:d??null}).onConflictDoUpdate({target:[h.XT.agentId,h.XT.connectorId],set:{enabledOperations:d??null,updatedAt:new Date}}):await i.delete(h.XT).where((0,h.Uo)((0,h.eq)(h.XT.agentId,a),(0,h.eq)(h.XT.connectorId,b))),(0,e.revalidatePath)("/agents"),cH(void 0)}catch(a){return console.error("[setAgentConnectorAssignmentAction]",a),cI("db_error","Failed to update connector assignment")}}(0,cG.D)([cM,cN,cO,cR,cS,cT,cU,cV,cW,cY,cZ,c$,c0,c1,c2,c3,c4,c6,c7,c8,c9,da,dc,dd,df,dg,di,dj,dl,dm,dn,dq,dr,ds,dt,du,dw,dy,dz,dA,dB,dD,dE,dG,dN,dO,dP,dQ,dR,dS,dT]),(0,d.A)(cM,"00cb62b80aae1180aca3ba065d442b310c4eda339c",null),(0,d.A)(cN,"40d679af5fc128628b1d3de970e489244445eb92d7",null),(0,d.A)(cO,"4086d1b3405509af963433b4d0a1e603927768649a",null),(0,d.A)(cR,"40bfc0d7451b404b78549488b43a5ab9cd0774db86",null),(0,d.A)(cS,"404460f49393bef81bf7ab7a6958cdab795bb7137f",null),(0,d.A)(cT,"406ff824fdd4f44a6f654e27108c9d452e7be9e620",null),(0,d.A)(cU,"40103d01fbf115abfdb97483c71f5c8a90aff55548",null),(0,d.A)(cV,"40b5547ad9c9e68f7d1312356effcf4580b5afa6a2",null),(0,d.A)(cW,"402490f531ec1ab6616055d7beb2e811c393644499",null),(0,d.A)(cY,"4016090b61a210b11dbe26f2643899c92eed169557",null),(0,d.A)(cZ,"4016f2963b634d574704a96ed23a949c03fd8924e9",null),(0,d.A)(c$,"40f3ad2f5445525be3a87ca6a6db6490b4ae49bd5d",null),(0,d.A)(c0,"40de5df0586e375ef835b86b1120bd75c57a453a68",null),(0,d.A)(c1,"40c6341922e2afaf4eec92be3f81c206d591802776",null),(0,d.A)(c2,"40ee84d73cd36a07e60542045b5c1f849b82a07d7f",null),(0,d.A)(c3,"400136355083428342bf17e243ce78ceeb405e6ebc",null),(0,d.A)(c4,"002a9146422737fadc4c1be96b99617eb324f16f74",null),(0,d.A)(c6,"40f592e072817ad6226f35ec56ee68795ab50fbbcc",null),(0,d.A)(c7,"4036c80fbbbf7681b51e0425774969eb9bf44a1c57",null),(0,d.A)(c8,"600da3ee864c97178af244a4e77453171211545c7c",null),(0,d.A)(c9,"601aa685b0444bd7447e318dc38136f5f9760acdbb",null),(0,d.A)(da,"402cd6ce0c188d060c7294fd597af8b2a9613a20db",null),(0,d.A)(dc,"40a0a3dfb05fd9e29a52bdbb52d27edf818609f910",null),(0,d.A)(dd,"00eec7f2d1c7b4e8298753dfba96df2a9a78b8a133",null),(0,d.A)(df,"405d194c22928c2be11c81853135b56b18f297616f",null),(0,d.A)(dg,"40bb331a961af16ba2a1d2e87f3f2619784d202448",null),(0,d.A)(di,"403663baa79c7eeb4a035032aa78dec5b6ac39002c",null),(0,d.A)(dj,"404fd364eef42df3b728923526009168a909fbc70a",null),(0,d.A)(dl,"40c81dd184fe2b4a6eca984cdb19b314b5f223b04b",null),(0,d.A)(dm,"40356d74de28757899cbb7fc742b6c8ccf1b3987b8",null),(0,d.A)(dn,"40a5420a805d48017cb681d96467a4f3a55e81129e",null),(0,d.A)(dq,"404978a96bf8448977b0286b9fea88186dd2427769",null),(0,d.A)(dr,"004937b6dd436b5f0c930fb963f292a1804893e546",null),(0,d.A)(ds,"00314a53c4188d9b0ec9bcb2dc18a1a829789e2b21",null),(0,d.A)(dt,"0074bd8ad42d4e9c7f21cfd198fe9c7d189730fc2c",null),(0,d.A)(du,"003b71db37e3313c84b5f892954c644311dcdd139d",null),(0,d.A)(dw,"409c74ae0001509a0665a05d754aa6c00a53ac63ce",null),(0,d.A)(dy,"4036dccfd836547574d7b1a2d35d2e1f6128f19d63",null),(0,d.A)(dz,"408e203f348affcf78adf58badc7f441dcb09aa706",null),(0,d.A)(dA,"4027c9eb7c179a2e12bf684055cb25c5968c7a4cfe",null),(0,d.A)(dB,"00edc5538e809093e8e3c03005c9f0154708363d2a",null),(0,d.A)(dD,"408e285ce3e953613af24846af0f2dc6a56012a71d",null),(0,d.A)(dE,"00434135531afb121be5346cc674ac347fa9d61479",null),(0,d.A)(dG,"40db68977baa289b621f83b06e60258f44d26fee48",null),(0,d.A)(dN,"00877677e85a0d3b4da7069fb64e9105eec0ab3fd2",null),(0,d.A)(dO,"403d2d46dc8114439c70f38da70e8d8bbd885fc3c2",null),(0,d.A)(dP,"400f40aef9e0270d8ebcd4d98dc6465275eb776709",null),(0,d.A)(dQ,"403893d8123be77d9b1dddec11e8b06cfaa5ae657f",null),(0,d.A)(dR,"40e2114bbb6356ea6e0fc1cae68788c935b25befc9",null),(0,d.A)(dS,"402a5a0fcfda45431900b8db3e868320ac3320d697",null),(0,d.A)(dT,"781446e9afe23a533e4351217986cb9dadbf58e477",null)},17030:(a,b,c)=>{c.d(b,{Y:()=>d});let d=[{slug:"notion",label:"Notion",authType:"api_key",docsHint:"Create a Notion integration at notion.so/my-integrations and copy its internal secret."},{slug:"notion-oauth",label:"Notion (OAuth)",authType:"oauth2",credentialType:"notion-oauth",docsHint:"Public Integration via OAuth — create one at notion.so/my-integrations (Public type) and authorize from your dashboard."},{slug:"google-drive",label:"Google Drive",authType:"oauth2",credentialType:"google-oauth",docsHint:"OAuth flow — uses your Google credential (create one under Credentials)."},{slug:"gmail",label:"Gmail",authType:"oauth2",credentialType:"google-oauth",docsHint:"OAuth flow — uses your Google credential (create one under Credentials)."},{slug:"google-sheets",label:"Google Sheets",authType:"oauth2",credentialType:"google-oauth",docsHint:"OAuth flow — uses your Google credential (create one under Credentials)."},{slug:"google-docs",label:"Google Docs",authType:"oauth2",credentialType:"google-oauth",docsHint:"OAuth flow — uses your Google credential (create one under Credentials)."},{slug:"airtable-oauth",label:"Airtable (OAuth)",authType:"oauth2",credentialType:"airtable-oauth",docsHint:"OAuth flow for Airtable Public Integrations (recommended)."},{slug:"airtable",label:"Airtable",authType:"api_key",docsHint:"Personal Access Token — airtable.com/create/tokens."},{slug:"apify",label:"Apify",authType:"api_key",docsHint:"Token API Apify — console.apify.com/account/integrations."},{slug:"firecrawl",label:"Firecrawl",authType:"api_key",docsHint:"API key Firecrawl — firecrawl.dev/account."},{slug:"tavily",label:"Tavily",authType:"api_key",docsHint:"API key Tavily — app.tavily.com."}]},96591:(a,b,c)=>{c.d(b,{ZH:()=>d.ZH,ip:()=>d.R3});var d=c(42667)},99740:(a,b,c)=>{c.d(b,{ApifyApiError:()=>d,G:()=>e});class d extends Error{constructor(a,b,c){super(b),this.name="ApifyApiError",this.code=a,this.status=c}}function e(a){if(a instanceof d)return a;if(null!==a&&"object"==typeof a&&"statusCode"in a&&"number"==typeof a.statusCode){let c,e=a.message??`Apify API error ${a.statusCode}`;var b=a.statusCode;switch(!0){case 401===b:c="apify_unauthorized";break;case 403===b:c="apify_forbidden";break;case 404===b:c="apify_not_found";break;case 422===b:c="apify_validation_error";break;case 429===b:c="apify_rate_limited";break;case b>=500:c="apify_transient";break;default:c="apify_client_error"}return new d(c,e,b)}return a instanceof Error?new d("apify_unknown",a.message):new d("apify_unknown",String(a))}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=6697,exports.ids=[6697],exports.modules={66697:(a,b,c)=>{c.d(b,{NodeSqliteDialect:()=>n});var d=c(61204),e=c(47291),f=c(2329),g=c(37406),h=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!0}async acquireMigrationLock(){}async releaseMigrationLock(){}get supportsOutput(){return!0}},i=class{#a;#b=new k;#c;#d;constructor(a){this.#a={...a}}async init(){this.#c=this.#a.database,this.#d=new j(this.#c),this.#a.onCreateConnection&&await this.#a.onCreateConnection(this.#d)}async acquireConnection(){return await this.#b.lock(),this.#d}async beginTransaction(a){await a.executeQuery(d.E.raw("begin"))}async commitTransaction(a){await a.executeQuery(d.E.raw("commit"))}async rollbackTransaction(a){await a.executeQuery(d.E.raw("rollback"))}async releaseConnection(){this.#b.unlock()}async destroy(){this.#c?.close()}},j=class{#c;constructor(a){this.#c=a}executeQuery(a){let{sql:b,parameters:c}=a;return Promise.resolve({rows:this.#c.prepare(b).all(...c)})}async *streamQuery(){throw Error("Streaming query is not supported by SQLite driver.")}},k=class{#e;#f;async lock(){for(;void 0!==this.#e;)await this.#e;this.#e=new Promise(a=>{this.#f=a})}unlock(){let a=this.#f;this.#e=void 0,this.#f=void 0,a?.()}},l=class{#c;constructor(a){this.#c=a}async getSchemas(){return[]}async getTables(a={withInternalKyselyTables:!1}){let b=this.#c.selectFrom("sqlite_schema").where("type","=","table").where("name","not like","sqlite_%").select("name").$castTo();return a.withInternalKyselyTables||(b=b.where("name","!=",e.kQ).where("name","!=",e.sy)),Promise.all((await b.execute()).map(({name:a})=>this.#g(a)))}async getMetadata(a){return{tables:await this.getTables(a)}}async #g(a){let b=this.#c,c=(await b.selectFrom("sqlite_master").where("name","=",a).select("sql").$castTo().execute())[0]?.sql?.split(/[\(\),]/)?.find(a=>a.toLowerCase().includes("autoincrement"))?.split(/\s+/)?.[0]?.replace(/["`]/g,"");return{name:a,columns:(await b.selectFrom((0,f.l)`pragma_table_info(${a})`.as("table_info")).select(["name","type","notnull","dflt_value"]).execute()).map(a=>({name:a.name,dataType:a.type,isNullable:!a.notnull,isAutoIncrementing:a.name===c,hasDefaultValue:null!=a.dflt_value})),isView:!0}}},m=class extends g.n{getCurrentParameterPlaceholder(){return"?"}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getAutoIncrement(){return"autoincrement"}},n=class{#a;constructor(a){this.#a={...a}}createDriver(){return new i(this.#a)}createQueryCompiler(){return new m}createAdapter(){return new h}createIntrospector(a){return new l(a)}}}};