nodal-agents 0.4.0 → 0.4.2

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 (174) hide show
  1. package/README.md +38 -14
  2. package/cli.js +16 -1
  3. package/migrations/0030_agent_fallback_llm_keys.sql +6 -0
  4. package/migrations/0031_llm_key_capabilities.sql +7 -0
  5. package/migrations/0032_drop_llm_key_model_caps.sql +9 -0
  6. package/migrations/0033_agent_fallback_chain.sql +21 -0
  7. package/migrations/meta/_journal.json +28 -0
  8. package/package.json +1 -1
  9. package/runner.js +512 -79
  10. package/web/.next/BUILD_ID +1 -1
  11. package/web/.next/build-manifest.json +2 -2
  12. package/web/.next/prerender-manifest.json +3 -3
  13. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +3 -3
  14. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +1 -1
  17. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js.nft.json +1 -1
  18. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
  19. package/web/.next/server/app/(dashboard)/agents/page.js +2 -2
  20. package/web/.next/server/app/(dashboard)/agents/page.js.nft.json +1 -1
  21. package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/approvals/page.js +2 -2
  23. package/web/.next/server/app/(dashboard)/approvals/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/automations/page.js +1 -1
  26. package/web/.next/server/app/(dashboard)/automations/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/billing/page.js +1 -1
  29. package/web/.next/server/app/(dashboard)/billing/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/billing/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/chat/page.js +2 -2
  32. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/connectors/page.js +1 -1
  35. package/web/.next/server/app/(dashboard)/connectors/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/credentials/page.js +1 -1
  38. package/web/.next/server/app/(dashboard)/credentials/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +2 -2
  41. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/jobs/page.js +2 -2
  44. package/web/.next/server/app/(dashboard)/jobs/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/llm-providers/page.js +2 -2
  47. package/web/.next/server/app/(dashboard)/llm-providers/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/logs/page.js +1 -1
  50. package/web/.next/server/app/(dashboard)/logs/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/mcp/page.js +2 -2
  53. package/web/.next/server/app/(dashboard)/mcp/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/memories/page.js +2 -2
  56. package/web/.next/server/app/(dashboard)/memories/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/page.js +3 -3
  59. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/settings/page.js +2 -2
  62. package/web/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +1 -1
  65. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/skills/new/page.js +2 -2
  68. package/web/.next/server/app/(dashboard)/skills/new/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/skills/page.js +2 -2
  71. package/web/.next/server/app/(dashboard)/skills/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/_global-error.html +1 -1
  75. package/web/.next/server/app/_global-error.rsc +2 -2
  76. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  77. package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
  81. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  82. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/_not-found.html +1 -1
  84. package/web/.next/server/app/_not-found.rsc +3 -3
  85. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  86. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  87. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  88. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  89. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  90. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  91. package/web/.next/server/app/api/oauth/[provider]/callback/route.js +1 -1
  92. package/web/.next/server/app/api/oauth/[provider]/start/route.js +1 -1
  93. package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/onboarding.html +1 -1
  96. package/web/.next/server/app/onboarding.rsc +3 -3
  97. package/web/.next/server/app/onboarding.segments/_full.segment.rsc +3 -3
  98. package/web/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  99. package/web/.next/server/app/onboarding.segments/_index.segment.rsc +3 -3
  100. package/web/.next/server/app/onboarding.segments/_tree.segment.rsc +2 -2
  101. package/web/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  102. package/web/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  103. package/web/.next/server/chunks/1945.js +1 -0
  104. package/web/.next/server/chunks/3233.js +1 -0
  105. package/web/.next/server/chunks/4574.js +1 -1
  106. package/web/.next/server/chunks/4808.js +1 -0
  107. package/web/.next/server/chunks/4839.js +1 -0
  108. package/web/.next/server/chunks/{3057.js → 7466.js} +1 -1
  109. package/web/.next/server/chunks/7741.js +3 -3
  110. package/web/.next/server/chunks/8206.js +1 -0
  111. package/web/.next/server/chunks/8398.js +1 -0
  112. package/web/.next/server/chunks/{7557.js → 9606.js} +2 -2
  113. package/web/.next/server/middleware-build-manifest.js +1 -1
  114. package/web/.next/server/pages/404.html +1 -1
  115. package/web/.next/server/pages/500.html +1 -1
  116. package/web/.next/server/server-reference-manifest.js +1 -1
  117. package/web/.next/server/server-reference-manifest.json +1 -1
  118. package/web/.next/static/chunks/{9060-df7c0c4c6fa27737.js → 2575-e660568bd1a9bcb6.js} +2 -2
  119. package/web/.next/static/chunks/3233-e6efb7fb1fa24591.js +1 -0
  120. package/web/.next/static/chunks/5436-c1006a40e59853ed.js +1 -0
  121. package/web/.next/static/chunks/7025-7afa82fda10bddc4.js +62 -0
  122. package/web/.next/static/chunks/{5801-e411029984b17b8b.js → 8396-f3502b9af3172006.js} +1 -1
  123. package/web/.next/static/chunks/{8503-ced632da5c3fce79.js → 9098-2bfef80a73c706b3.js} +1 -1
  124. package/web/.next/static/chunks/9123-20653d928e33410a.js +1 -0
  125. package/web/.next/static/chunks/{6679-7c76034b83edeb06.js → 9582-fbf7c8d9b2a39101.js} +1 -1
  126. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-a8e293c54c818084.js +2 -0
  127. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/{page-e6b35d5f361044a9.js → page-7a94ae67b2c3c9c3.js} +1 -1
  128. package/web/.next/static/chunks/app/(dashboard)/agents/page-b258b8975ac6450b.js +1 -0
  129. package/web/.next/static/chunks/app/(dashboard)/approvals/page-79dea6e91956eeba.js +1 -0
  130. package/web/.next/static/chunks/app/(dashboard)/automations/page-3b863b7af8e2c1a3.js +1 -0
  131. package/web/.next/static/chunks/app/(dashboard)/chat/page-4d965bb7ee3732db.js +1 -0
  132. package/web/.next/static/chunks/app/(dashboard)/connectors/page-4a437ba82f4086da.js +1 -0
  133. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-be20dcbf25c8f3ce.js +1 -0
  134. package/web/.next/static/chunks/app/(dashboard)/jobs/page-94a311f688a255d8.js +1 -0
  135. package/web/.next/static/chunks/app/(dashboard)/layout-e1b0d4fad2926646.js +1 -0
  136. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-e5e2c4e2b783d37f.js +1 -0
  137. package/web/.next/static/chunks/app/(dashboard)/mcp/page-c071c54f76273ac4.js +1 -0
  138. package/web/.next/static/chunks/app/(dashboard)/memories/page-8ca0b34ad35eb1fa.js +1 -0
  139. package/web/.next/static/chunks/app/(dashboard)/{page-fc49d7ed8e472118.js → page-fb50e1576a3ab2e4.js} +1 -1
  140. package/web/.next/static/chunks/app/(dashboard)/settings/page-7b256e9c462e97f8.js +1 -0
  141. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-12930816795e8b20.js +1 -0
  142. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-e3a19abaf7468db9.js +1 -0
  143. package/web/.next/static/chunks/app/(dashboard)/skills/page-43f1475a0bc9c45f.js +1 -0
  144. package/web/.next/static/css/78ead23854ab041e.css +3 -0
  145. package/web/.next/server/chunks/1511.js +0 -1
  146. package/web/.next/server/chunks/2103.js +0 -1
  147. package/web/.next/server/chunks/211.js +0 -1
  148. package/web/.next/server/chunks/8178.js +0 -1
  149. package/web/.next/server/chunks/9201.js +0 -1
  150. package/web/.next/server/chunks/9824.js +0 -1
  151. package/web/.next/static/chunks/1165-ec573be2aa63710b.js +0 -1
  152. package/web/.next/static/chunks/2569-6b5e0af9c1f584a4.js +0 -1
  153. package/web/.next/static/chunks/6522-3f865de55adb618d.js +0 -1
  154. package/web/.next/static/chunks/921-f437093debcddbb3.js +0 -1
  155. package/web/.next/static/chunks/9421-d522a48618c4fe37.js +0 -62
  156. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-d3724fbf38b71806.js +0 -2
  157. package/web/.next/static/chunks/app/(dashboard)/agents/page-b58294bf588f4581.js +0 -1
  158. package/web/.next/static/chunks/app/(dashboard)/approvals/page-b9e504918d043b6d.js +0 -1
  159. package/web/.next/static/chunks/app/(dashboard)/automations/page-4807e81e2af3030e.js +0 -1
  160. package/web/.next/static/chunks/app/(dashboard)/chat/page-2c8f9571a443f250.js +0 -1
  161. package/web/.next/static/chunks/app/(dashboard)/connectors/page-72ccb0e3a5ed6f2d.js +0 -1
  162. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-40172a14d0b1368f.js +0 -1
  163. package/web/.next/static/chunks/app/(dashboard)/jobs/page-d4a3a16745e02fd1.js +0 -1
  164. package/web/.next/static/chunks/app/(dashboard)/layout-4d5634ba460464d7.js +0 -1
  165. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-90fb785e2ab32759.js +0 -1
  166. package/web/.next/static/chunks/app/(dashboard)/mcp/page-426478332dfe8313.js +0 -1
  167. package/web/.next/static/chunks/app/(dashboard)/memories/page-aa46f5f7efbfa262.js +0 -1
  168. package/web/.next/static/chunks/app/(dashboard)/settings/page-1cc10beb46234c7d.js +0 -1
  169. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-0b61f21847f4c7a0.js +0 -1
  170. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-9de96e643c361732.js +0 -1
  171. package/web/.next/static/chunks/app/(dashboard)/skills/page-4566512d74e54bfe.js +0 -1
  172. package/web/.next/static/css/0a81480f93d3ab37.css +0 -3
  173. /package/web/.next/static/{9FXcaPSw8KYgjKzjKLpT2 → ZuUX-HBTQOhLf0tFI6JQI}/_buildManifest.js +0 -0
  174. /package/web/.next/static/{9FXcaPSw8KYgjKzjKLpT2 → ZuUX-HBTQOhLf0tFI6JQI}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- exports.id=7741,exports.ids=[7741],exports.modules={3808:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(1887),f=c(64565);function g({placeholder:a="Search agents, skills, runs…",keyboardShortcut:b=!0,onSubmit:c,className:h=""}){let i=(0,f.useRef)(null);return(0,d.jsxs)("form",{onSubmit:a=>{a.preventDefault(),c?.(i.current?.value??"")},className:`flex h-[34px] min-w-[280px] items-center gap-2 rounded-md border border-rule-2 bg-paper px-3 text-[12.5px] text-ink-4 ${h}`,children:[(0,d.jsx)(e.e,{size:13,className:"shrink-0"}),(0,d.jsx)("input",{ref:i,type:"search",placeholder:a,className:"flex-1 border-0 bg-transparent text-[13px] leading-none text-ink outline-none placeholder:text-ink-4"}),(0,d.jsx)("span",{className:"rounded-[5px] border border-rule bg-black/5 px-1.5 py-[1px] font-mono text-[11px] leading-none text-ink-4 dark:bg-white/[0.06]",children:"/"})]})}},5786:(a,b,c)=>{"use strict";c.d(b,{ch:()=>da,iU:()=>dw,dd:()=>dO,f_:()=>d_,S2:()=>dp,bN:()=>ds,Cy:()=>c4,Ql:()=>eI,LN:()=>ex,PD:()=>dF,Jc:()=>dP,AS:()=>ee,Ev:()=>dX,Og:()=>cX,rT:()=>c5,hP:()=>dC,xV:()=>eJ,Mo:()=>ez,hl:()=>dL,t3:()=>dy,X1:()=>ei,TD:()=>dY,Hp:()=>c$,z_:()=>dh,P7:()=>dt,VZ:()=>ea,Ro:()=>di,lV:()=>dr,UR:()=>eN,dO:()=>d8,rf:()=>dl,_N:()=>dm,gE:()=>dI,M3:()=>en,JD:()=>eD,oA:()=>ek,cj:()=>eb,cu:()=>d3,$4:()=>d9,iu:()=>eB,Ko:()=>c2,ei:()=>dM,Sh:()=>c9,$z:()=>c1,By:()=>dS,ZA:()=>eK,Le:()=>dz,BO:()=>eH,Jb:()=>dk,oG:()=>ew,pD:()=>dD,y4:()=>dv,Hy:()=>ec,EA:()=>d$,$5:()=>dV,c6:()=>d6,Zz:()=>d7,vu:()=>dg,zh:()=>cW,PH:()=>db,yU:()=>dQ,qo:()=>dG,oC:()=>cZ,Ke:()=>c3,JH:()=>d2,CV:()=>dU,HO:()=>ej,cr:()=>dB,WH:()=>eM,e4:()=>dj,AH:()=>eC,wj:()=>dN,Sb:()=>eF,Wq:()=>cY,fl:()=>eA,eP:()=>eh,ZG:()=>dx,_x:()=>d4,fG:()=>c8,pu:()=>em,wI:()=>dR,QT:()=>ey,c2:()=>dH,f2:()=>dK,rv:()=>ep,fI:()=>eg,Rz:()=>d1,Oc:()=>df});var d=c(43607),e=c(87388),f=c(66402),g=c(61989),h=c(51455),i=c(76760),j=c(77598),k=c(90454);class l extends Error{constructor(a,b){super(b??a),this.name="DeliveryError",this.code=a}}async function m(a,b,c,d,e=1e4){let f,g=`https://api.telegram.org/bot${a}/${b}`,h=new AbortController,i=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 l("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 l("telegram_request_failed",`telegram_request_failed: network error: ${b}`)}finally{clearTimeout(i)}let j=await f.json().catch(()=>({}));if(!f.ok||!j.ok){let a=j.description??"";if(401===f.status||404===f.status)throw new l("telegram_invalid_token",`telegram_invalid_token: ${a}`);throw new l("telegram_request_failed",`telegram_request_failed: ${a}`)}if(void 0===j.result)throw new l("telegram_request_failed","telegram_request_failed: no result in response");return j.result}async function n(a){let b=await m(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 o(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 m(a.botToken,"getUpdates",c,a.signal,d)}class p extends Error{constructor(a,b,c){super(b),this.name="MemoryError",this.code=a,void 0!==c&&(this.cause=c)}}class q extends p{constructor(a){super("MEMORY_NOT_FOUND",`memory.not_found:${a}`),this.name="MemoryNotFoundError"}}var r=c(94621);async function s(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(k.RK).set(e).where((0,k.Uo)((0,k.eq)(k.RK.id,b),(0,k.eq)(k.RK.entityId,c))).returning())[0];if(!f)throw new q(b);return u(f)}async function t(a,b,c){if(0===(await a.delete(k.RK).where((0,k.Uo)((0,k.eq)(k.RK.id,b),(0,k.eq)(k.RK.entityId,c))).returning()).length)throw new q(b)}function u(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 v(a,b){var c;let d,e,{entityId:f}=b;if(!f)throw new p("INVALID_ENTITY","memory.list.entity_id_required");let g=b.page??1,h=g<=0?1:g,i=Math.min(Math.max(1,b.pageSize??50),200),j=(h-1)*i,l=(c=b,d=[(0,k.eq)(k.RK.entityId,c.entityId),(0,k.eq)(k.RK.archived,c.archived??!1)],c.agentId&&d.push((0,k.eq)(k.RK.agentId,c.agentId)),c.category&&d.push((0,k.eq)(k.RK.category,c.category)),c.tags&&c.tags.length>0&&d.push((0,k.ll)`${k.RK.skillTags} && ${k.ll.raw((e=c.tags.map(a=>`'${a.replace(/\\/g,"\\\\").replace(/'/g,"''")}'`).join(","),`ARRAY[${e}]`))}::text[]`),(0,k.Uo)(...d)),m=function(a="recent"){switch(a){case"importance":return(0,k.i8)(k.RK.importance);case"last_accessed":return(0,k.i8)(k.RK.lastAccessedAt);default:return(0,k.i8)(k.RK.updatedAt)}}(b.sort),n=await a.select({count:(0,k.ll)`count(*)`}).from(k.RK).where(l),o=Number(n[0]?.count??0),q=(await a.select().from(k.RK).where(l).orderBy(m).limit(i).offset(j)).map(a=>u(a));return{items:q,page:h,pageSize:i,totalCount:o,hasMore:j+q.length<o}}var w=c(98472),x=c(48161),y=c(95488),z=c(42112),A=c(75224),B=c(73024);let C=process.env.NODALAI_CONFIG_PATH??(0,i.join)((0,x.homedir)(),".nodalai","config.json");function D(){if(!(0,B.existsSync)(C))return null;try{let a=(0,B.readFileSync)(C,"utf-8"),b=JSON.parse(a);if("object"!=typeof b||null===b)return null;return b}catch{return null}}function E(a){let b=D();if(!b)throw Error("cli_config_missing");let c={...b,...a};(0,B.writeFileSync)(C,JSON.stringify(c,null,2),"utf-8")}var F=c(17030);let G=Array.from({length:42},(a,b)=>{let c=String(b+1).padStart(2,"0");return{id:`avatar-${c}`,url:`/avatars/avatar-${c}.png`}});function H(a){return null==a||"string"==typeof a&&G.some(b=>b.url===a)}let I=[{slug:"cogni-cortex",label:"Cogni Cortex",description:"The Cortex — a social network for AI agents. Gives an agent ~28 tools to read the feed, post, vote, comment, and store memories.",serverUrl:"https://cogni-web-psi.vercel.app/api/mcp",transport:"http",authScheme:"header",authParamName:"x-api-key",keyPrefix:["cog_"],verifyToolName:"get_home",docsHint:'API key starting with cog_ — created in the Cogni app when a human registers an agent in "I control it" mode.'},{slug:"stripe",label:"Stripe",description:"Payment processing — read customers, products, prices, invoices, subscriptions; create coupons, payment links, refunds.",serverUrl:"https://mcp.stripe.com",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["sk_","rk_"],verifyToolName:"retrieve_balance",docsHint:"Use a Restricted API Key (rk_test_… or rk_live_…) from https://dashboard.stripe.com/apikeys for least privilege — recommended. Standard secret keys (sk_test_… or sk_live_…) also work."},{slug:"composio",label:"Composio",description:"Meta-toolkit: a Composio MCP server you provision exposes hundreds of tools across Gmail, Slack, GitHub, Linear, and more — configured per-server on composio.dev.",serverUrl:null,transport:"http",authScheme:"header",authParamName:"x-api-key",keyPrefix:[],verifyToolName:null,docsHint:"Create an MCP server at https://app.composio.dev, paste its full URL here (format: https://backend.composio.dev/v3/mcp/<server-id>?user_id=<user-id>) plus your Composio API key."},{slug:"mcp-filesystem",label:"Filesystem",description:"Read and write files on the host machine. Useful for broad disk access outside an agent workspace. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <root-directory> in the args with the absolute path of the folder to expose (e.g. /home/user/docs). The server restricts all operations to that tree.",command:"npx",args:["-y","@modelcontextprotocol/server-filesystem@2026.1.14","<root-directory>"]},{slug:"mcp-fetch",label:"Fetch",description:"Fetch web pages and convert them to clean Markdown or plain text for agents. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No API key required. The server fetches URLs on behalf of the agent.",command:"npx",args:["-y","mcp-fetch-server@1.1.2"]},{slug:"mcp-git",label:"Git",description:"Run git operations (status, diff, log, commit, branch, etc.) on a local repository. First run downloads the package via npx (requires network, ~5–10 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <repo-path> in the args with the absolute path to the git repository root (e.g. /home/user/myrepo). No API key required.",command:"npx",args:["-y","@cyanheads/git-mcp-server@2.15.1","--repo","<repo-path>"]},{slug:"mcp-github",label:"GitHub",description:"Read and manage GitHub repositories, issues, PRs, and code via a Personal Access Token. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create a GitHub Personal Access Token (PAT) at https://github.com/settings/tokens with the repo scope and paste it as the GITHUB_PERSONAL_ACCESS_TOKEN env var below.",command:"npx",args:["-y","@modelcontextprotocol/server-github@2025.4.8"],envVarNames:["GITHUB_PERSONAL_ACCESS_TOKEN"]},{slug:"mcp-postgres",label:"PostgreSQL",description:"Run read-only SQL queries against a PostgreSQL database. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <connection-string> in the args with your Postgres connection URL (e.g. postgresql://user:pass@host:5432/dbname). The server connects in read-only mode.",command:"npx",args:["-y","@modelcontextprotocol/server-postgres@0.6.2","<connection-string>"]},{slug:"mcp-sequential-thinking",label:"Sequential Thinking",description:"Structured multi-step reasoning helper — guides agents through decomposing complex problems step-by-step before acting. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No configuration needed. Add it to an agent to enable structured reasoning scaffolding.",command:"npx",args:["-y","@modelcontextprotocol/server-sequential-thinking@2025.12.18"]},{slug:"mcp-playwright",label:"Playwright",description:"Browser automation — navigate pages, click, type, screenshot, and extract content from the web via a headless browser. First run downloads the package via npx (requires network, ~10–30 s latency for browser binary).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No API key required. Playwright launches a local headless browser — make sure Chromium or Chrome is available on the host machine.",command:"npx",args:["-y","@playwright/mcp@0.0.75"]},{slug:"linear",label:"Linear",description:"Manage Linear issues, projects, teams, and cycles via a personal API key. Requires a Linear account.",serverUrl:null,transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["lin_api_"],verifyToolName:null,docsHint:"Create a Personal API key at https://linear.app/settings/api. Paste the full URL of your Linear MCP endpoint (format: https://mcp.linear.app/sse) and your API key."},{slug:"sentry",label:"Sentry",description:"Query Sentry issues, events, and releases for debugging. Auth via a Sentry auth token.",serverUrl:null,transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create a Sentry Auth Token at https://sentry.io/settings/account/api/auth-tokens/. Paste the full URL of your Sentry MCP endpoint and your token."},{slug:"n8n",label:"n8n",description:"Workflow automation — let an agent list, read, build, and trigger n8n workflows on your instance. Runs the n8n-mcp server locally via npx.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Set N8N_API_URL to your n8n instance (e.g. https://n8n.example.com) and N8N_API_KEY to an API key from Settings → n8n API. First run downloads the package via npx.",command:"npx",args:["-y","n8n-mcp"],envVarNames:["N8N_API_URL","N8N_API_KEY"],status:"pending"},{slug:"supabase",label:"Supabase",description:"Manage a Supabase project — list tables, run read-only SQL, inspect logs and advisors. Runs the official Supabase MCP server locally via npx (read-only by default).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <project-ref> in the args with your project ref (Project Settings → General). Set SUPABASE_ACCESS_TOKEN to a Personal Access Token from supabase.com/dashboard/account/tokens. Remove --read-only to allow writes.",command:"npx",args:["-y","@supabase/mcp-server-supabase@latest","--read-only","--project-ref=<project-ref>"],envVarNames:["SUPABASE_ACCESS_TOKEN"],status:"pending"},{slug:"airtable",label:"Airtable",description:"Read and write Airtable bases — list bases and tables, query records, create and update rows. Official hosted Airtable MCP server.",serverUrl:"https://mcp.airtable.com/mcp",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["pat"],verifyToolName:null,docsHint:'Create a Personal Access Token at airtable.com/create/tokens (scopes: data.records:read/write, schema.bases:read) and paste it here as a Bearer token. (Airtable API keys are deprecated — use a PAT, which starts with "pat".) After connecting, pick which bases the integration can access at airtable.com/?integrations=thirdParty.'},{slug:"notion",label:"Notion",description:"Read and update Notion pages and databases — search, fetch, create, and edit content. Runs the official Notion MCP server locally via npx.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:'Create an internal integration at notion.so/my-integrations, share the target pages/databases with it, and set NOTION_TOKEN to the integration secret (starts with ntn_). (Older package builds want OPENAPI_MCP_HEADERS instead — a JSON string {"Authorization":"Bearer ntn_…","Notion-Version":"2022-06-28"}.)',command:"npx",args:["-y","@notionhq/notion-mcp-server"],envVarNames:["NOTION_TOKEN"],status:"pending"},{slug:"apify",label:"Apify",description:"Run Apify Actors — thousands of ready-made scrapers and automation tools for social media, search engines, maps, e-commerce, and any website. Connects to the hosted Apify MCP server.",serverUrl:"https://mcp.apify.com",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create an API token in the Apify Console (Settings → API & Integrations) and paste it here as a Bearer token. The hosted server runs Actors on your behalf.",status:"pending"},{slug:"custom-http-mcp",label:"Custom MCP (HTTP)",description:"Connect any HTTP-streaming MCP server. You provide the URL, auth, and a short slug for tool naming.",serverUrl:null,transport:"http",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:'Anything that speaks the MCP Streamable HTTP protocol. The "Server slug" you choose becomes the tool name prefix.'},{slug:"custom-stdio-mcp",label:"Custom MCP (stdio)",description:"Run a local MCP server as a subprocess. Use this for filesystem, sqlite, github, fetch, and other npm/python MCP packages that expect to be spawned by their host.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Runs locally with your permissions — only connect MCP servers you trust. Env var values are encrypted at rest."}],J=[{slug:"obsidian",name:"Obsidian",description:"Read, search, create, and edit notes in the Obsidian vault.",requiredBuiltins:[],content:`Skill pour travailler sur un vault Obsidian via le syst\xe8me de fichiers : lire, lister, chercher, cr\xe9er, \xe9diter des notes, avec ma\xeetrise compl\xe8te de la syntaxe Obsidian Flavored Markdown.
1
+ exports.id=7741,exports.ids=[7741],exports.modules={3808:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(1887),f=c(64565);function g({placeholder:a="Search agents, skills, runs…",keyboardShortcut:b=!0,onSubmit:c,className:h=""}){let i=(0,f.useRef)(null);return(0,d.jsxs)("form",{onSubmit:a=>{a.preventDefault(),c?.(i.current?.value??"")},className:`flex h-[34px] min-w-[280px] items-center gap-2 rounded-md border border-rule-2 bg-paper px-3 text-[12.5px] text-ink-4 ${h}`,children:[(0,d.jsx)(e.e,{size:13,className:"shrink-0"}),(0,d.jsx)("input",{ref:i,type:"search",placeholder:a,className:"flex-1 border-0 bg-transparent text-[13px] leading-none text-ink outline-none placeholder:text-ink-4"}),(0,d.jsx)("span",{className:"rounded-[5px] border border-rule bg-black/5 px-1.5 py-[1px] font-mono text-[11px] leading-none text-ink-4 dark:bg-white/[0.06]",children:"/"})]})}},5786:(a,b,c)=>{"use strict";c.d(b,{ch:()=>da,iU:()=>dw,dd:()=>dO,f_:()=>d_,S2:()=>dp,bN:()=>ds,Cy:()=>c4,Ql:()=>eJ,LN:()=>ex,PD:()=>dF,Jc:()=>dP,AS:()=>ee,Ev:()=>dX,Og:()=>cX,rT:()=>c5,hP:()=>dC,xV:()=>eK,Mo:()=>eA,hl:()=>dL,t3:()=>dy,X1:()=>ei,TD:()=>dY,Hp:()=>c$,z_:()=>dh,P7:()=>dt,VZ:()=>ea,Ro:()=>di,lV:()=>dr,UR:()=>eO,dO:()=>d8,rf:()=>dl,_N:()=>dm,gE:()=>dI,M3:()=>en,JD:()=>eE,oA:()=>ek,cj:()=>eb,cu:()=>d3,$4:()=>d9,iu:()=>eC,Ko:()=>c2,ei:()=>dM,Sh:()=>c9,$z:()=>c1,By:()=>dS,ZA:()=>eL,Le:()=>dz,BO:()=>eI,Jb:()=>dk,oG:()=>ew,pD:()=>dD,y4:()=>dv,Hy:()=>ec,EA:()=>d$,$5:()=>dV,c6:()=>d6,Zz:()=>d7,vu:()=>dg,zh:()=>cW,PH:()=>db,yU:()=>dQ,qo:()=>dG,oC:()=>cZ,Ke:()=>c3,JH:()=>d2,CV:()=>dU,HO:()=>ej,cr:()=>dB,WH:()=>eN,e4:()=>dj,AH:()=>eD,wj:()=>dN,Ru:()=>ez,Sb:()=>eG,Wq:()=>cY,fl:()=>eB,eP:()=>eh,ZG:()=>dx,_x:()=>d4,fG:()=>c8,pu:()=>em,wI:()=>dR,QT:()=>ey,c2:()=>dH,f2:()=>dK,rv:()=>ep,fI:()=>eg,Rz:()=>d1,Oc:()=>df});var d=c(43607),e=c(87388),f=c(66402),g=c(61989),h=c(51455),i=c(76760),j=c(77598),k=c(90454);class l extends Error{constructor(a,b){super(b??a),this.name="DeliveryError",this.code=a}}async function m(a,b,c,d,e=1e4){let f,g=`https://api.telegram.org/bot${a}/${b}`,h=new AbortController,i=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 l("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 l("telegram_request_failed",`telegram_request_failed: network error: ${b}`)}finally{clearTimeout(i)}let j=await f.json().catch(()=>({}));if(!f.ok||!j.ok){let a=j.description??"";if(401===f.status||404===f.status)throw new l("telegram_invalid_token",`telegram_invalid_token: ${a}`);throw new l("telegram_request_failed",`telegram_request_failed: ${a}`)}if(void 0===j.result)throw new l("telegram_request_failed","telegram_request_failed: no result in response");return j.result}async function n(a){let b=await m(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 o(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 m(a.botToken,"getUpdates",c,a.signal,d)}class p extends Error{constructor(a,b,c){super(b),this.name="MemoryError",this.code=a,void 0!==c&&(this.cause=c)}}class q extends p{constructor(a){super("MEMORY_NOT_FOUND",`memory.not_found:${a}`),this.name="MemoryNotFoundError"}}var r=c(36535);async function s(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(k.RK).set(e).where((0,k.Uo)((0,k.eq)(k.RK.id,b),(0,k.eq)(k.RK.entityId,c))).returning())[0];if(!f)throw new q(b);return u(f)}async function t(a,b,c){if(0===(await a.delete(k.RK).where((0,k.Uo)((0,k.eq)(k.RK.id,b),(0,k.eq)(k.RK.entityId,c))).returning()).length)throw new q(b)}function u(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 v(a,b){var c;let d,e,{entityId:f}=b;if(!f)throw new p("INVALID_ENTITY","memory.list.entity_id_required");let g=b.page??1,h=g<=0?1:g,i=Math.min(Math.max(1,b.pageSize??50),200),j=(h-1)*i,l=(c=b,d=[(0,k.eq)(k.RK.entityId,c.entityId),(0,k.eq)(k.RK.archived,c.archived??!1)],c.agentId&&d.push((0,k.eq)(k.RK.agentId,c.agentId)),c.category&&d.push((0,k.eq)(k.RK.category,c.category)),c.tags&&c.tags.length>0&&d.push((0,k.ll)`${k.RK.skillTags} && ${k.ll.raw((e=c.tags.map(a=>`'${a.replace(/\\/g,"\\\\").replace(/'/g,"''")}'`).join(","),`ARRAY[${e}]`))}::text[]`),(0,k.Uo)(...d)),m=function(a="recent"){switch(a){case"importance":return(0,k.i8)(k.RK.importance);case"last_accessed":return(0,k.i8)(k.RK.lastAccessedAt);default:return(0,k.i8)(k.RK.updatedAt)}}(b.sort),n=await a.select({count:(0,k.ll)`count(*)`}).from(k.RK).where(l),o=Number(n[0]?.count??0),q=(await a.select().from(k.RK).where(l).orderBy(m).limit(i).offset(j)).map(a=>u(a));return{items:q,page:h,pageSize:i,totalCount:o,hasMore:j+q.length<o}}var w=c(98472),x=c(48161),y=c(95488),z=c(42112),A=c(75224),B=c(73024);let C=process.env.NODALAI_CONFIG_PATH??(0,i.join)((0,x.homedir)(),".nodalai","config.json");function D(){if(!(0,B.existsSync)(C))return null;try{let a=(0,B.readFileSync)(C,"utf-8"),b=JSON.parse(a);if("object"!=typeof b||null===b)return null;return b}catch{return null}}function E(a){let b=D();if(!b)throw Error("cli_config_missing");let c={...b,...a};(0,B.writeFileSync)(C,JSON.stringify(c,null,2),"utf-8")}var F=c(17030);let G=Array.from({length:42},(a,b)=>{let c=String(b+1).padStart(2,"0");return{id:`avatar-${c}`,url:`/avatars/avatar-${c}.png`}});function H(a){return null==a||"string"==typeof a&&G.some(b=>b.url===a)}let I=[{slug:"cogni-cortex",label:"Cogni Cortex",description:"The Cortex — a social network for AI agents. Gives an agent ~28 tools to read the feed, post, vote, comment, and store memories.",serverUrl:"https://cogni-web-psi.vercel.app/api/mcp",transport:"http",authScheme:"header",authParamName:"x-api-key",keyPrefix:["cog_"],verifyToolName:"get_home",docsHint:'API key starting with cog_ — created in the Cogni app when a human registers an agent in "I control it" mode.'},{slug:"stripe",label:"Stripe",description:"Payment processing — read customers, products, prices, invoices, subscriptions; create coupons, payment links, refunds.",serverUrl:"https://mcp.stripe.com",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["sk_","rk_"],verifyToolName:"retrieve_balance",docsHint:"Use a Restricted API Key (rk_test_… or rk_live_…) from https://dashboard.stripe.com/apikeys for least privilege — recommended. Standard secret keys (sk_test_… or sk_live_…) also work."},{slug:"composio",label:"Composio",description:"Meta-toolkit: a Composio MCP server you provision exposes hundreds of tools across Gmail, Slack, GitHub, Linear, and more — configured per-server on composio.dev.",serverUrl:null,transport:"http",authScheme:"header",authParamName:"x-api-key",keyPrefix:[],verifyToolName:null,docsHint:"Create an MCP server at https://app.composio.dev, paste its full URL here (format: https://backend.composio.dev/v3/mcp/<server-id>?user_id=<user-id>) plus your Composio API key."},{slug:"mcp-filesystem",label:"Filesystem",description:"Read and write files on the host machine. Useful for broad disk access outside an agent workspace. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <root-directory> in the args with the absolute path of the folder to expose (e.g. /home/user/docs). The server restricts all operations to that tree.",command:"npx",args:["-y","@modelcontextprotocol/server-filesystem@2026.1.14","<root-directory>"]},{slug:"mcp-fetch",label:"Fetch",description:"Fetch web pages and convert them to clean Markdown or plain text for agents. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No API key required. The server fetches URLs on behalf of the agent.",command:"npx",args:["-y","mcp-fetch-server@1.1.2"]},{slug:"mcp-git",label:"Git",description:"Run git operations (status, diff, log, commit, branch, etc.) on a local repository. First run downloads the package via npx (requires network, ~5–10 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <repo-path> in the args with the absolute path to the git repository root (e.g. /home/user/myrepo). No API key required.",command:"npx",args:["-y","@cyanheads/git-mcp-server@2.15.1","--repo","<repo-path>"]},{slug:"mcp-github",label:"GitHub",description:"Read and manage GitHub repositories, issues, PRs, and code via a Personal Access Token. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create a GitHub Personal Access Token (PAT) at https://github.com/settings/tokens with the repo scope and paste it as the GITHUB_PERSONAL_ACCESS_TOKEN env var below.",command:"npx",args:["-y","@modelcontextprotocol/server-github@2025.4.8"],envVarNames:["GITHUB_PERSONAL_ACCESS_TOKEN"]},{slug:"mcp-postgres",label:"PostgreSQL",description:"Run read-only SQL queries against a PostgreSQL database. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <connection-string> in the args with your Postgres connection URL (e.g. postgresql://user:pass@host:5432/dbname). The server connects in read-only mode.",command:"npx",args:["-y","@modelcontextprotocol/server-postgres@0.6.2","<connection-string>"]},{slug:"mcp-sequential-thinking",label:"Sequential Thinking",description:"Structured multi-step reasoning helper — guides agents through decomposing complex problems step-by-step before acting. First run downloads the package via npx (requires network, ~5 s latency).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No configuration needed. Add it to an agent to enable structured reasoning scaffolding.",command:"npx",args:["-y","@modelcontextprotocol/server-sequential-thinking@2025.12.18"]},{slug:"mcp-playwright",label:"Playwright",description:"Browser automation — navigate pages, click, type, screenshot, and extract content from the web via a headless browser. First run downloads the package via npx (requires network, ~10–30 s latency for browser binary).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"No API key required. Playwright launches a local headless browser — make sure Chromium or Chrome is available on the host machine.",command:"npx",args:["-y","@playwright/mcp@0.0.75"]},{slug:"linear",label:"Linear",description:"Manage Linear issues, projects, teams, and cycles via a personal API key. Requires a Linear account.",serverUrl:null,transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["lin_api_"],verifyToolName:null,docsHint:"Create a Personal API key at https://linear.app/settings/api. Paste the full URL of your Linear MCP endpoint (format: https://mcp.linear.app/sse) and your API key."},{slug:"sentry",label:"Sentry",description:"Query Sentry issues, events, and releases for debugging. Auth via a Sentry auth token.",serverUrl:null,transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create a Sentry Auth Token at https://sentry.io/settings/account/api/auth-tokens/. Paste the full URL of your Sentry MCP endpoint and your token."},{slug:"n8n",label:"n8n",description:"Workflow automation — let an agent list, read, build, and trigger n8n workflows on your instance. Runs the n8n-mcp server locally via npx.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Set N8N_API_URL to your n8n instance (e.g. https://n8n.example.com) and N8N_API_KEY to an API key from Settings → n8n API. First run downloads the package via npx.",command:"npx",args:["-y","n8n-mcp"],envVarNames:["N8N_API_URL","N8N_API_KEY"],status:"pending"},{slug:"supabase",label:"Supabase",description:"Manage a Supabase project — list tables, run read-only SQL, inspect logs and advisors. Runs the official Supabase MCP server locally via npx (read-only by default).",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Replace <project-ref> in the args with your project ref (Project Settings → General). Set SUPABASE_ACCESS_TOKEN to a Personal Access Token from supabase.com/dashboard/account/tokens. Remove --read-only to allow writes.",command:"npx",args:["-y","@supabase/mcp-server-supabase@latest","--read-only","--project-ref=<project-ref>"],envVarNames:["SUPABASE_ACCESS_TOKEN"],status:"pending"},{slug:"airtable",label:"Airtable",description:"Read and write Airtable bases — list bases and tables, query records, create and update rows. Official hosted Airtable MCP server.",serverUrl:"https://mcp.airtable.com/mcp",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:["pat"],verifyToolName:null,docsHint:'Create a Personal Access Token at airtable.com/create/tokens (scopes: data.records:read/write, schema.bases:read) and paste it here as a Bearer token. (Airtable API keys are deprecated — use a PAT, which starts with "pat".) After connecting, pick which bases the integration can access at airtable.com/?integrations=thirdParty.'},{slug:"notion",label:"Notion",description:"Read and update Notion pages and databases — search, fetch, create, and edit content. Runs the official Notion MCP server locally via npx.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:'Create an internal integration at notion.so/my-integrations, share the target pages/databases with it, and set NOTION_TOKEN to the integration secret (starts with ntn_). (Older package builds want OPENAPI_MCP_HEADERS instead — a JSON string {"Authorization":"Bearer ntn_…","Notion-Version":"2022-06-28"}.)',command:"npx",args:["-y","@notionhq/notion-mcp-server"],envVarNames:["NOTION_TOKEN"],status:"pending"},{slug:"apify",label:"Apify",description:"Run Apify Actors — thousands of ready-made scrapers and automation tools for social media, search engines, maps, e-commerce, and any website. Connects to the hosted Apify MCP server.",serverUrl:"https://mcp.apify.com",transport:"http",authScheme:"bearer",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Create an API token in the Apify Console (Settings → API & Integrations) and paste it here as a Bearer token. The hosted server runs Actors on your behalf.",status:"pending"},{slug:"custom-http-mcp",label:"Custom MCP (HTTP)",description:"Connect any HTTP-streaming MCP server. You provide the URL, auth, and a short slug for tool naming.",serverUrl:null,transport:"http",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:'Anything that speaks the MCP Streamable HTTP protocol. The "Server slug" you choose becomes the tool name prefix.'},{slug:"custom-stdio-mcp",label:"Custom MCP (stdio)",description:"Run a local MCP server as a subprocess. Use this for filesystem, sqlite, github, fetch, and other npm/python MCP packages that expect to be spawned by their host.",serverUrl:null,transport:"stdio",authScheme:"header",authParamName:"Authorization",keyPrefix:[],verifyToolName:null,docsHint:"Runs locally with your permissions — only connect MCP servers you trust. Env var values are encrypted at rest."}],J=[{slug:"obsidian",name:"Obsidian",description:"Read, search, create, and edit notes in the Obsidian vault.",requiredBuiltins:[],content:`Skill pour travailler sur un vault Obsidian via le syst\xe8me de fichiers : lire, lister, chercher, cr\xe9er, \xe9diter des notes, avec ma\xeetrise compl\xe8te de la syntaxe Obsidian Flavored Markdown.
2
2
 
3
3
  ### Setup
4
4
 
@@ -1207,7 +1207,7 @@ Date: ${d.date??""}
1207
1207
  Subject: ${e}
1208
1208
  To: ${d.to??""}
1209
1209
 
1210
- `+g,j=bk({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 bd(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:br,riskLevel:"write",async execute(a){try{if(!a.add_labels?.length&&!a.remove_labels?.length)throw new bc("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 bd(a)}}},{name:"gmail_trash_message",description:"Move a Gmail message to the Trash folder. Recoverable for 30 days. Prefer this over permanent delete.",inputSchema:bs,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 bd(a)}}},{name:"gmail_untrash_message",description:"Restore a Gmail message from the Trash folder.",inputSchema:bt,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 bd(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:bx,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 bd(a)}}},{name:"gmail_trash_thread",description:"Move an entire Gmail conversation thread to the Trash folder. Recoverable for 30 days.",inputSchema:by,riskLevel:"write",async execute(a){try{return{threadId:(await c.users.threads.trash({userId:"me",id:a.thread_id})).data.id??""}}catch(a){throw bd(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:bB,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 bd(a)}}},{name:"gmail_update_label",description:"Update an existing Gmail user label — rename it or change its visibility.",inputSchema:bC,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 bd(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:bG,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=bh(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:bk({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 bd(a)}}},{name:"gmail_update_draft",description:"Overwrite an existing Gmail draft with new content. Use this to revise a draft before sending.",inputSchema:bH,riskLevel:"write",async execute(a){try{let b=bk({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 bd(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:bI,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 bd(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:bu,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 bd(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:bD,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 bd(a)}}},{name:"gmail_delete_draft",description:"Permanently delete a Gmail draft. This is irreversible.",inputSchema:bJ,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 bd(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 aO.google.auth.OAuth2).setCredentials({access_token:a}),[(c=aO.google.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:bS,riskLevel:"read",async execute(a){try{bR(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 bM("sheets_range_too_large",`Range returned ${d.length} rows which exceeds the 10000-row cap. Use a smaller range.`);let e=bQ(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 bM)throw a;throw bN(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:bT,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 bM("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=bQ(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 bM)throw a;throw bN(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:bU,riskLevel:"read",async execute(a){try{for(let b of a.ranges)bR(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=bQ(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 bM)throw a;throw bN(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:b$,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 bN(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:bZ,riskLevel:"read",async execute(a){try{let b=[a.equals,a.contains].filter(a=>void 0!==a);if(1!==b.length)throw new bM("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 bM("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 bM)throw a;throw bN(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:bV,riskLevel:"write",async execute(a){try{bR(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 bM)throw a;throw bN(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:bW,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 bM)throw a;throw bN(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:bX,riskLevel:"write",async execute(a){try{return bR(a.range),{clearedRange:(await c.spreadsheets.values.clear({spreadsheetId:a.spreadsheet_id,range:a.range})).data.clearedRange??a.range}}catch(a){if(a instanceof bM)throw a;throw bN(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:bY,riskLevel:"write",async execute(a){try{for(let b of a.updates)bR(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 bM)throw a;throw bN(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:b_,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 bN(a)}}},{name:"sheets_add_sheet",description:"Add a new sheet tab to an existing Google Spreadsheet.",inputSchema:b0,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 bN(a)}}},{name:"sheets_duplicate_sheet",description:"Copy a sheet tab within the same Google Spreadsheet. Duplicates all data, formatting, and formulas.",inputSchema:b2,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 bM)throw a;throw bN(a)}}},{name:"sheets_rename_sheet",description:"Rename a sheet tab in a Google Spreadsheet.",inputSchema:b3,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 bN(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:b4,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 bM("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 bM)throw a;throw bN(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:b5,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 bN(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:b6,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 bN(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:b7,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 bN(a)}}},{name:"sheets_clear_basic_filter",description:"Remove the basic auto-filter from a sheet tab.",inputSchema:b8,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 bN(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:ca,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 bN(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:b1,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 bN(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 aO.google.auth.OAuth2).setCredentials({access_token:a}),[(c=aO.google.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:ci,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data;if(b.body){let a=cd(b.body);if(a.length>1e5)throw new cb("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?cd({content:b.content}):""})),e=Object.entries(b.footers??{}).map(([a,b])=>({footerId:a,text:b.content?cd({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 cb)throw a;throw cc(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:cj,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data,d=b.body?cd(b.body):"";if(d.length>1e5)throw new cb("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 cb)throw a;throw cc(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:ch,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:[cf(b)]}})}return{documentId:d,title:e,url:`https://docs.google.com/document/d/${d}/edit`}}catch(a){if(a instanceof cb)throw a;throw cc(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:ck,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 cb)throw a;throw cc(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:cl,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:[cf(b)]}}),{appended:!0,documentId:a.document_id,charCount:b.length}}catch(a){if(a instanceof cb)throw a;throw cc(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:cm,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 cb)throw a;throw cc(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:cp,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(cg(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 cb)throw a;throw cc(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:cq,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 cb)throw a;throw cc(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:cr,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 cb)throw a;throw cc(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:cs,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 cb)throw a;throw cc(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:cu,riskLevel:"write",async execute(a){try{var b,d,e;if(a.end_index<=a.start_index)throw new cb("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 cb("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 cb)throw a;throw cc(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:cv,riskLevel:"write",async execute(a){try{if(a.end_index<=a.start_index)throw new cb("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:[cg(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 cb)throw a;throw cc(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:cw,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 cb)throw a;throw cc(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:cn,riskLevel:"destructive",async execute(a){try{var b,d;if(a.end_index<=a.start_index)throw new cb("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 cb)throw a;throw cc(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=>az({accessToken:a}),operations:ay},notion:{credentialType:"api_key",toolFactory:a=>az({accessToken:a}),operations:ay},"airtable-oauth":{credentialType:"airtable-oauth",toolFactory:a=>aN({accessToken:a}),operations:aM},airtable:{credentialType:"api_key",toolFactory:a=>aN({accessToken:a}),operations:aM},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 cx.FirecrawlClient({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:cA,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 cz(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:cD,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 cz(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:cE,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 cz(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:cB,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 cz(a)}}},{name:"firecrawl_search",description:"Search the web via Firecrawl and return a list of web results (URL, title, description).",inputSchema:cC,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 cz(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 cF.ApifyClient({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:cH,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,cG.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:cI,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,cG.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:cJ,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,cG.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:cK,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,cG.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,cL.tavily)({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:cO,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 cN(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:cP,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 cN(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:cQ,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 cN(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 cS=c(75749);function cT(a){return{ok:!0,data:a}}function cU(a,b){return{ok:!1,code:a,message:b}}async function cV(){let a,b=(0,y.Iz)();try{let b=await (0,f.headers)();a=new Request("http://localhost/",{headers:b})}catch{a=new Request("http://localhost/")}let c=await (0,z.oC)(a,b);return(0,y.a1)(c,a)}async function cW(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.O5.id,name:k.O5.name,slug:k.O5.slug,icon:k.O5.icon,role:k.V.role}).from(k.V).innerJoin(k.O5,(0,k.eq)(k.O5.id,k.V.entityId)).where((0,k.eq)(k.V.userId,a.userId)).orderBy(k.O5.createdAt);return cT(c.map(b=>({id:b.id,name:b.name,slug:b.slug,icon:b.icon,role:b.role??"member",active:b.id===a.entityId})))}catch(a){return console.error("[listWorkspacesAction]",a),cU("db_error","Failed to list workspaces")}}async function cX(a){try{let b,c=await cV(),d=g.Ik({name:g.Yj().min(1).max(60),icon:g.Yj().max(8).optional()}).safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),h=crypto.randomUUID();return await f.insert(k.O5).values({id:h,userId:c.userId,name:d.data.name,slug:(b=d.data.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),`${b||"workspace"}-${(0,j.randomBytes)(3).toString("hex")}`),icon:d.data.icon??"\uD83D\uDDC2️"}),await f.insert(k.V).values({entityId:h,userId:c.userId,role:"owner"}),(0,e.revalidatePath)("/","layout"),cT({id:h})}catch(a){return console.error("[createWorkspaceAction]",a),cU("db_error","Failed to create workspace")}}async function cY(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid()}).safeParse(a);if(!c.success)return cU("validation_failed","Invalid workspace id");let d=(0,y.Lf)(),[h]=await d.select({id:k.V.id}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,c.data.id)));if(!h)return cU("not_found","Workspace not found");return(await (0,f.cookies)()).set(y.St,c.data.id,{path:"/",httpOnly:!0,sameSite:"lax",maxAge:31536e3}),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[switchWorkspaceAction]",a),cU("db_error","Failed to switch workspace")}}async function cZ(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid(),name:g.Yj().min(1).max(60),icon:g.Yj().max(8).optional()}).safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({role:k.V.role}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,c.data.id)));if(!f)return cU("not_found","Workspace not found");return await d.update(k.O5).set({name:c.data.name,...c.data.icon?{icon:c.data.icon}:{},updatedAt:new Date}).where((0,k.eq)(k.O5.id,c.data.id)),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[renameWorkspaceAction]",a),cU("db_error","Failed to rename workspace")}}async function c$(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid()}).safeParse(a);if(!c.success)return cU("validation_failed","Invalid workspace id");if(c.data.id===b.entityId)return cU("validation_failed","Switch to another workspace before deleting this one.");let d=(0,y.Lf)(),f=await d.select({entityId:k.V.entityId,role:k.V.role}).from(k.V).where((0,k.eq)(k.V.userId,b.userId));if(f.length<=1)return cU("validation_failed","Cannot delete your only workspace.");let h=f.find(a=>a.entityId===c.data.id);if(!h)return cU("not_found","Workspace not found");if("owner"!==h.role)return cU("forbidden","Only the owner can delete a workspace.");return await d.delete(k.O5).where((0,k.eq)(k.O5.id,c.data.id)),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[deleteWorkspaceAction]",a),cU("db_error","Failed to delete workspace")}}let c_=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([]),avatarUrl:g.Yj().max(200).optional().nullable().transform(a=>a&&""!==a.trim()?a.trim():null)}).refine(a=>"worker"!==a.role||0===a.subAgentIds.length,{message:"Sub-agents only apply when role is router or planner",path:["subAgentIds"]}),c0=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 c1(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)).orderBy(k.X6.position,k.X6.name,(0,k.i8)(k.X6.createdAt));return cT(c)}catch(a){return console.error("[listAgentsAction]",a),cU("db_error","Failed to load agents")}}async function c2(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)).orderBy(k.X6.position,k.X6.name),d=await b.select({orchestratorId:k.Qj.orchestratorId,subAgentId:k.Qj.subAgentId}).from(k.Qj).where((0,k.eq)(k.Qj.entityId,a.entityId)),e=new Map;for(let a of c)e.set(a.id,a);let f=new Map,g=new Set;for(let a of d){let b=f.get(a.orchestratorId)??new Set;b.add(a.subAgentId),f.set(a.orchestratorId,b),g.add(a.subAgentId)}let h=[];for(let a of c.filter(a=>"orchestrator"===a.role)){let b=f.get(a.id)??new Set,c=Array.from(b).map(a=>e.get(a)).filter(a=>!!a).sort((a,b)=>a.position-b.position||a.name.localeCompare(b.name));h.push({orchestrator:a,workers:c})}let i=c.filter(a=>"orchestrator"!==a.role&&!g.has(a.id)).sort((a,b)=>a.position-b.position||a.name.localeCompare(b.name));return i.length>0&&h.push({orchestrator:null,workers:i}),cT(h)}catch(a){return console.error("[listAgentGroupsAction]",a),cU("db_error","Failed to load agent groups")}}async function c3(a){try{let b=await cV();if(!Array.isArray(a)||0===a.length)return cU("validation_failed","No agent ids provided");for(let b of a)if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed",`Invalid agent id: ${b}`);let c=new Set,d=[];for(let b of a)c.has(b)||(c.add(b),d.push(b));let f=(0,y.Lf)();if((await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.entityId,b.entityId),(0,k.RV)(k.X6.id,d)))).length!==d.length)return cU("not_found","One or more agents not in this workspace");let h=new Date;for(let a=0;a<d.length;a++){let b=d[a];b&&await f.update(k.X6).set({position:10*a,updatedAt:h}).where((0,k.eq)(k.X6.id,b))}return(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[reorderAgentsAction]",a),cU("db_error","Failed to reorder agents")}}async function c4(a){try{let b=await cV(),c=c_.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!H(c.data.avatarUrl))return cU("validation_failed","Unknown avatar — pick one from the gallery");let{dbRole:d,orchestratorMode:f}=c7(c.data.role),g=(0,y.Lf)(),h=await (0,k.S$)(g,b.entityId,{slug:c.data.slug,name:c.data.name,personality:c.data.personality,model:c.data.model,llmKeyId:c.data.llmKeyId??null,role:d,orchestratorMode:f,avatarUrl:c.data.avatarUrl,subAgentIds:c.data.subAgentIds});if("error"in h)return cU("conflict","An agent with this slug already exists");return(0,e.revalidatePath)("/agents"),cT({id:h.id})}catch(a){if(console.error("[createAgentAction]",a),"sub_agents_not_found"===(a instanceof Error?a.message:""))return cU("validation_failed","One or more sub-agents not found in this workspace");return cU("db_error","Failed to create agent")}}async function c5(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return await c.delete(k.X6).where((0,k.eq)(k.X6.id,a)),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[deleteAgentAction]",a),cU("db_error","Failed to delete agent")}}let c6=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([]),avatarUrl:g.Yj().max(200).optional().nullable().transform(a=>a&&""!==a.trim()?a.trim():null)});function c7(a){return"worker"===a?{dbRole:"agent",orchestratorMode:null}:{dbRole:"orchestrator",orchestratorMode:a}}async function c8(a){try{let b=await cV(),c=c6.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!H(c.data.avatarUrl))return cU("validation_failed","Unknown avatar — pick one from the gallery");let{id:d,name:f,personality:g,model:h,llmKeyId:i,role:j,subAgentIds:l,avatarUrl:m}=c.data,n=(0,y.Lf)(),[o]=await n.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d),(0,k.eq)(k.X6.entityId,b.entityId)));if(!o)return cU("not_found","Agent not found");let{dbRole:p,orchestratorMode:q}=c7(j),r={name:f,personality:g,model:h,role:p,orchestratorMode:q,updatedAt:new Date};return void 0!==i&&(r.llmKeyId=i),void 0!==m&&(r.avatarUrl=m),await n.update(k.X6).set(r).where((0,k.eq)(k.X6.id,d)),await n.delete(k.Qj).where((0,k.eq)(k.Qj.orchestratorId,d)),"worker"!==j&&l.length>0&&await n.insert(k.Qj).values(l.map(a=>({orchestratorId:d,subAgentId:a,entityId:b.entityId}))),await n.update(k.ME).set({systemPrompt:null,updatedAt:new Date}).where((0,k.Uo)((0,k.eq)(k.ME.agentId,d),(0,k.KL)(k.ME.status,["completed","failed","cancelled"]))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[updateAgentAction]",a),cU("db_error","Failed to update agent")}}async function c9(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select().from(k.Kq).where((0,k.eq)(k.Kq.agentId,a)).orderBy(k.Kq.position,k.Kq.label);return cT(e)}catch(a){return console.error("[listAgentWorkspacesAction]",a),cU("db_error","Failed to load workspaces")}}async function da(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let f=g.Yj().min(1).max(80).safeParse(b);if(!f.success)return cU("validation_failed","Label must be 1-80 characters");let h=f.data.trim(),i=c.trim();if(!i)return cU("validation_failed","Path is required");if(!/^([A-Za-z]:[/\\]|\/|\\\\)/.test(i))return cU("validation_failed","Path must be absolute (e.g. /home/user/notes or C:\\Users\\you\\notes)");let j=(0,y.Lf)(),[l]=await j.select({id:k.X6.id,entityId:k.X6.entityId}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!l)return cU("not_found","Agent not found");let[m]=await j.insert(k.Kq).values({agentId:a,entityId:l.entityId,label:h,path:i,position:0}).returning({id:k.Kq.id});if(!m)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)(`/agents/${a}/edit`),cT({id:m.id})}catch(b){console.error("[addAgentWorkspaceAction]",b);let a=b instanceof Error?b.message:"";if(a.includes("unique")||a.includes("23505"))return cU("conflict","A workspace with this label already exists for this agent");return cU("db_error","Failed to add workspace")}}async function db(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid workspace id");let c=(0,y.Lf)(),[d]=await c.select({agentId:k.Kq.agentId}).from(k.Kq).where((0,k.eq)(k.Kq.id,a));if(!d)return cU("not_found","Workspace not found");let[f]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Workspace not found");return await c.delete(k.Kq).where((0,k.eq)(k.Kq.id,a)),(0,e.revalidatePath)(`/agents/${d.agentId}/edit`),cT(void 0)}catch(a){return console.error("[removeAgentWorkspaceAction]",a),cU("db_error","Failed to remove workspace")}}let dc={"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".docx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":".xlsx","application/vnd.openxmlformats-officedocument.presentationml.presentation":".pptx","application/pdf":".pdf","text/plain":".txt","text/markdown":".md","text/csv":".csv","text/x-markdown":".md","application/octet-stream":""},dd=new Set([".docx",".xlsx",".pptx",".pdf",".txt",".md",".csv"]);async function de(a,b){if(!(0,i.isAbsolute)(a))return{ok:!1,reason:"Workspace root is not an absolute path."};let c=(0,i.basename)(b);if(!c||c.startsWith("."))return{ok:!1,reason:`Invalid filename: "${b}"`};let d=await (0,h.realpath)(a).catch(()=>null);if(!d)return{ok:!1,reason:`Workspace directory does not exist: "${a}"`};let e=(0,i.resolve)(d,c),f=d.endsWith(i.sep)?d:d+i.sep;return e===d||e.startsWith(f)?{ok:!0,resolved:e}:{ok:!1,reason:`Path traversal blocked for filename "${b}".`}}async function df(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().min(1).max(80).safeParse(b).success)return cU("validation_failed","Invalid workspace label");let f=(0,y.Lf)(),[l]=await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!l)return cU("not_found","Agent not found");let[m]=await f.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!m)return cU("not_found",`Workspace "${b}" not found for this agent`);let n=c.get("file");if(!(n instanceof File))return cU("validation_failed",'No file provided in FormData (field "file")');if(n.size>0x1900000)return cU("file_too_large",`File is ${n.size} bytes (max 26214400). Compress or split it first.`);let o=n.name.slice(n.name.lastIndexOf(".")).toLowerCase(),p=n.type in dc,q=dd.has(o);if(!p&&!q)return cU("unsupported_file_type",`File type "${n.type}" / extension "${o}" is not allowed. Allowed: ${[...dd].join(", ")}.`);if("application/octet-stream"===n.type&&!q)return cU("unsupported_file_type",`Extension "${o}" is not allowed. Allowed: ${[...dd].join(", ")}.`);await (0,h.mkdir)(m.path,{recursive:!0});let r=await de(m.path,n.name);if(!r.ok)return cU("path_traversal_blocked",r.reason);let s=(0,i.dirname)(r.resolved),t=(0,i.join)(s,`.${(0,i.basename)(r.resolved)}.${(0,j.randomBytes)(6).toString("hex")}.tmp`),u=await n.arrayBuffer();try{await (0,h.writeFile)(t,Buffer.from(u)),await (0,h.rename)(t,r.resolved)}catch(a){throw await (0,h.unlink)(t).catch(()=>void 0),a}return(0,e.revalidatePath)(`/agents/${a}/edit`),cT({filename:(0,i.basename)(r.resolved),bytes:n.size})}catch(a){return console.error("[uploadToWorkspaceAction]",a),cU("db_error","Upload failed")}}async function dg(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let d=(0,y.Lf)(),[e]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,c.entityId)));if(!e)return cU("not_found","Agent not found");let[f]=await d.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!f)return cU("not_found",`Workspace "${b}" not found for this agent`);if(!await (0,h.stat)(f.path).then(a=>a.isDirectory()).catch(()=>!1))return cT([]);let j=await (0,h.readdir)(f.path,{withFileTypes:!0}),l=[];for(let a of j){if(!a.isFile())continue;let b=(0,i.join)(f.path,a.name),c=await (0,h.stat)(b).catch(()=>null);c&&l.push({name:a.name,size:c.size,modifiedAt:c.mtime.toISOString()})}return l.sort((a,b)=>a.name.localeCompare(b.name)),cT(l)}catch(a){return console.error("[listWorkspaceFilesAction]",a),cU("db_error","Failed to list workspace files")}}async function dh(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let f=(0,y.Lf)(),[i]=await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await f.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!j)return cU("not_found",`Workspace "${b}" not found for this agent`);let l=await de(j.path,c);if(!l.ok)return cU("path_traversal_blocked",l.reason);return await (0,h.unlink)(l.resolved),(0,e.revalidatePath)(`/agents/${a}/edit`),cT(void 0)}catch(a){if("ENOENT"===a.code)return cU("not_found",`File "${c}" not found in workspace`);return console.error("[deleteWorkspaceFileAction]",a),cU("db_error","Failed to delete file")}}async function di(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select().from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({subAgentId:k.Qj.subAgentId}).from(k.Qj).where((0,k.eq)(k.Qj.orchestratorId,a));return cT({...d,orchestratorMode:d.orchestratorMode??null,subAgentIds:e.map(a=>a.subAgentId)})}catch(a){return console.error("[getAgentForEditAction]",a),cU("db_error","Failed to load agent")}}async function dj(a){try{let b=await cV(),c=c0.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.X6.id,slug:k.X6.slug}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Agent not found");let g=null;if(c.data.sendViaTelegram){let[a]=await d.select({chatId:k.X6.lastSeenChatIdTelegram}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId))).limit(1);if(!a?.chatId)return cU("no_telegram_recipient_known","DM the bot first to register a recipient.");g=a.chatId}let[h]=await d.insert(k.ME).values({entityId:b.entityId,agentId:f.id,status:"pending",channel:"api",task:c.data.prompt,...g?{chatId:g}:{}}).returning({id:k.ME.id});if(!h)return cU("db_error","Failed to create job");let i=`${A._.RUNNER_URL}/api/worker`;return A._.WORKER_SECRET?fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({jobId:h.id})}).catch(a=>{console.error("[sendTaskAction] runner ping failed:",a)}):console.error("[sendTaskAction] WORKER_SECRET missing — cannot ping runner"),(0,e.revalidatePath)("/jobs"),cT({jobId:h.id})}catch(a){return console.error("[sendTaskAction]",a),cU("db_error","Failed to send task")}}async function dk(a={}){try{let b=await cV(),c=Math.min(a.limit??50,100),d=(0,y.Lf)(),e=await d.select({id:k.ME.id,entityId:k.ME.entityId,agentId:k.ME.agentId,status:k.ME.status,channel:k.ME.channel,task:k.ME.task,result:k.ME.result,error:k.ME.error,chainCount:k.ME.chainCount,inputTokens:k.ME.inputTokens,outputTokens:k.ME.outputTokens,createdAt:k.ME.createdAt,completedAt:k.ME.completedAt}).from(k.ME).where((0,k.eq)(k.ME.entityId,b.entityId)).orderBy((0,k.i8)(k.ME.createdAt)).limit(c);return cT(e)}catch(a){return console.error("[listJobsAction]",a),cU("db_error","Failed to load jobs")}}async function dl(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({job:k.ME,agentName:k.X6.name,agentSlug:k.X6.slug}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");let e=await c.select({id:k.ME.id,agentName:k.X6.name,agentSlug:k.X6.slug,status:k.ME.status,result:k.ME.result,error:k.ME.error,createdAt:k.ME.createdAt,completedAt:k.ME.completedAt}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.parentJobId,a)).orderBy(k.ME.createdAt);return cT({...d.job,agentName:d.agentName,agentSlug:d.agentSlug,children:e})}catch(a){return console.error("[getJobDetailAction]",a),cU("db_error","Failed to load job")}}async function dm(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status,result:k.ME.result,error:k.ME.error}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");return cT({status:d.status??"pending",result:d.result,error:d.error})}catch(a){return console.error("[getJobStatusAction]",a),cU("db_error","Failed to load job status")}}let dn=new Set(["completed","failed","cancelled"]);async function dp(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");let f=d.status??"pending";if(dn.has(f))return cU("already_terminal",`Job is already ${f}`);return await c.execute((0,k.ll)`
1210
+ `+g,j=bk({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 bd(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:br,riskLevel:"write",async execute(a){try{if(!a.add_labels?.length&&!a.remove_labels?.length)throw new bc("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 bd(a)}}},{name:"gmail_trash_message",description:"Move a Gmail message to the Trash folder. Recoverable for 30 days. Prefer this over permanent delete.",inputSchema:bs,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 bd(a)}}},{name:"gmail_untrash_message",description:"Restore a Gmail message from the Trash folder.",inputSchema:bt,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 bd(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:bx,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 bd(a)}}},{name:"gmail_trash_thread",description:"Move an entire Gmail conversation thread to the Trash folder. Recoverable for 30 days.",inputSchema:by,riskLevel:"write",async execute(a){try{return{threadId:(await c.users.threads.trash({userId:"me",id:a.thread_id})).data.id??""}}catch(a){throw bd(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:bB,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 bd(a)}}},{name:"gmail_update_label",description:"Update an existing Gmail user label — rename it or change its visibility.",inputSchema:bC,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 bd(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:bG,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=bh(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:bk({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 bd(a)}}},{name:"gmail_update_draft",description:"Overwrite an existing Gmail draft with new content. Use this to revise a draft before sending.",inputSchema:bH,riskLevel:"write",async execute(a){try{let b=bk({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 bd(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:bI,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 bd(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:bu,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 bd(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:bD,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 bd(a)}}},{name:"gmail_delete_draft",description:"Permanently delete a Gmail draft. This is irreversible.",inputSchema:bJ,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 bd(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 aO.google.auth.OAuth2).setCredentials({access_token:a}),[(c=aO.google.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:bS,riskLevel:"read",async execute(a){try{bR(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 bM("sheets_range_too_large",`Range returned ${d.length} rows which exceeds the 10000-row cap. Use a smaller range.`);let e=bQ(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 bM)throw a;throw bN(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:bT,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 bM("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=bQ(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 bM)throw a;throw bN(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:bU,riskLevel:"read",async execute(a){try{for(let b of a.ranges)bR(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=bQ(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 bM)throw a;throw bN(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:b$,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 bN(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:bZ,riskLevel:"read",async execute(a){try{let b=[a.equals,a.contains].filter(a=>void 0!==a);if(1!==b.length)throw new bM("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 bM("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 bM)throw a;throw bN(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:bV,riskLevel:"write",async execute(a){try{bR(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 bM)throw a;throw bN(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:bW,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 bM)throw a;throw bN(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:bX,riskLevel:"write",async execute(a){try{return bR(a.range),{clearedRange:(await c.spreadsheets.values.clear({spreadsheetId:a.spreadsheet_id,range:a.range})).data.clearedRange??a.range}}catch(a){if(a instanceof bM)throw a;throw bN(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:bY,riskLevel:"write",async execute(a){try{for(let b of a.updates)bR(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 bM)throw a;throw bN(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:b_,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 bN(a)}}},{name:"sheets_add_sheet",description:"Add a new sheet tab to an existing Google Spreadsheet.",inputSchema:b0,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 bN(a)}}},{name:"sheets_duplicate_sheet",description:"Copy a sheet tab within the same Google Spreadsheet. Duplicates all data, formatting, and formulas.",inputSchema:b2,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 bM)throw a;throw bN(a)}}},{name:"sheets_rename_sheet",description:"Rename a sheet tab in a Google Spreadsheet.",inputSchema:b3,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 bN(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:b4,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 bM("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 bM)throw a;throw bN(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:b5,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 bN(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:b6,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 bN(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:b7,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 bN(a)}}},{name:"sheets_clear_basic_filter",description:"Remove the basic auto-filter from a sheet tab.",inputSchema:b8,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 bN(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:ca,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 bN(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:b1,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 bN(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 aO.google.auth.OAuth2).setCredentials({access_token:a}),[(c=aO.google.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:ci,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data;if(b.body){let a=cd(b.body);if(a.length>1e5)throw new cb("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?cd({content:b.content}):""})),e=Object.entries(b.footers??{}).map(([a,b])=>({footerId:a,text:b.content?cd({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 cb)throw a;throw cc(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:cj,riskLevel:"read",async execute(a){try{let b=(await c.documents.get({documentId:a.document_id})).data,d=b.body?cd(b.body):"";if(d.length>1e5)throw new cb("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 cb)throw a;throw cc(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:ch,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:[cf(b)]}})}return{documentId:d,title:e,url:`https://docs.google.com/document/d/${d}/edit`}}catch(a){if(a instanceof cb)throw a;throw cc(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:ck,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 cb)throw a;throw cc(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:cl,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:[cf(b)]}}),{appended:!0,documentId:a.document_id,charCount:b.length}}catch(a){if(a instanceof cb)throw a;throw cc(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:cm,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 cb)throw a;throw cc(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:cp,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(cg(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 cb)throw a;throw cc(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:cq,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 cb)throw a;throw cc(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:cr,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 cb)throw a;throw cc(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:cs,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 cb)throw a;throw cc(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:cu,riskLevel:"write",async execute(a){try{var b,d,e;if(a.end_index<=a.start_index)throw new cb("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 cb("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 cb)throw a;throw cc(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:cv,riskLevel:"write",async execute(a){try{if(a.end_index<=a.start_index)throw new cb("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:[cg(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 cb)throw a;throw cc(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:cw,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 cb)throw a;throw cc(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:cn,riskLevel:"destructive",async execute(a){try{var b,d;if(a.end_index<=a.start_index)throw new cb("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 cb)throw a;throw cc(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=>az({accessToken:a}),operations:ay},notion:{credentialType:"api_key",toolFactory:a=>az({accessToken:a}),operations:ay},"airtable-oauth":{credentialType:"airtable-oauth",toolFactory:a=>aN({accessToken:a}),operations:aM},airtable:{credentialType:"api_key",toolFactory:a=>aN({accessToken:a}),operations:aM},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 cx.FirecrawlClient({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:cA,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 cz(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:cD,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 cz(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:cE,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 cz(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:cB,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 cz(a)}}},{name:"firecrawl_search",description:"Search the web via Firecrawl and return a list of web results (URL, title, description).",inputSchema:cC,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 cz(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 cF.ApifyClient({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:cH,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,cG.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:cI,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,cG.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:cJ,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,cG.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:cK,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,cG.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,cL.tavily)({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:cO,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 cN(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:cP,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 cN(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:cQ,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 cN(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 cS=c(75749);function cT(a){return{ok:!0,data:a}}function cU(a,b){return{ok:!1,code:a,message:b}}async function cV(){let a,b=(0,y.Iz)();try{let b=await (0,f.headers)();a=new Request("http://localhost/",{headers:b})}catch{a=new Request("http://localhost/")}let c=await (0,z.oC)(a,b);return(0,y.a1)(c,a)}async function cW(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.O5.id,name:k.O5.name,slug:k.O5.slug,icon:k.O5.icon,role:k.V.role}).from(k.V).innerJoin(k.O5,(0,k.eq)(k.O5.id,k.V.entityId)).where((0,k.eq)(k.V.userId,a.userId)).orderBy(k.O5.createdAt);return cT(c.map(b=>({id:b.id,name:b.name,slug:b.slug,icon:b.icon,role:b.role??"member",active:b.id===a.entityId})))}catch(a){return console.error("[listWorkspacesAction]",a),cU("db_error","Failed to list workspaces")}}async function cX(a){try{let b,c=await cV(),d=g.Ik({name:g.Yj().min(1).max(60),icon:g.Yj().max(8).optional()}).safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),h=crypto.randomUUID();return await f.insert(k.O5).values({id:h,userId:c.userId,name:d.data.name,slug:(b=d.data.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),`${b||"workspace"}-${(0,j.randomBytes)(3).toString("hex")}`),icon:d.data.icon??"\uD83D\uDDC2️"}),await f.insert(k.V).values({entityId:h,userId:c.userId,role:"owner"}),(0,e.revalidatePath)("/","layout"),cT({id:h})}catch(a){return console.error("[createWorkspaceAction]",a),cU("db_error","Failed to create workspace")}}async function cY(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid()}).safeParse(a);if(!c.success)return cU("validation_failed","Invalid workspace id");let d=(0,y.Lf)(),[h]=await d.select({id:k.V.id}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,c.data.id)));if(!h)return cU("not_found","Workspace not found");return(await (0,f.cookies)()).set(y.St,c.data.id,{path:"/",httpOnly:!0,sameSite:"lax",maxAge:31536e3}),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[switchWorkspaceAction]",a),cU("db_error","Failed to switch workspace")}}async function cZ(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid(),name:g.Yj().min(1).max(60),icon:g.Yj().max(8).optional()}).safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({role:k.V.role}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,c.data.id)));if(!f)return cU("not_found","Workspace not found");return await d.update(k.O5).set({name:c.data.name,...c.data.icon?{icon:c.data.icon}:{},updatedAt:new Date}).where((0,k.eq)(k.O5.id,c.data.id)),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[renameWorkspaceAction]",a),cU("db_error","Failed to rename workspace")}}async function c$(a){try{let b=await cV(),c=g.Ik({id:g.Yj().guid()}).safeParse(a);if(!c.success)return cU("validation_failed","Invalid workspace id");if(c.data.id===b.entityId)return cU("validation_failed","Switch to another workspace before deleting this one.");let d=(0,y.Lf)(),f=await d.select({entityId:k.V.entityId,role:k.V.role}).from(k.V).where((0,k.eq)(k.V.userId,b.userId));if(f.length<=1)return cU("validation_failed","Cannot delete your only workspace.");let h=f.find(a=>a.entityId===c.data.id);if(!h)return cU("not_found","Workspace not found");if("owner"!==h.role)return cU("forbidden","Only the owner can delete a workspace.");return await d.delete(k.O5).where((0,k.eq)(k.O5.id,c.data.id)),(0,e.revalidatePath)("/","layout"),cT(void 0)}catch(a){return console.error("[deleteWorkspaceAction]",a),cU("db_error","Failed to delete workspace")}}let c_=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([]),avatarUrl:g.Yj().max(200).optional().nullable().transform(a=>a&&""!==a.trim()?a.trim():null)}).refine(a=>"worker"!==a.role||0===a.subAgentIds.length,{message:"Sub-agents only apply when role is router or planner",path:["subAgentIds"]}),c0=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 c1(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)).orderBy(k.X6.position,k.X6.name,(0,k.i8)(k.X6.createdAt));return cT(c)}catch(a){return console.error("[listAgentsAction]",a),cU("db_error","Failed to load agents")}}async function c2(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)).orderBy(k.X6.position,k.X6.name),d=await b.select({orchestratorId:k.Qj.orchestratorId,subAgentId:k.Qj.subAgentId}).from(k.Qj).where((0,k.eq)(k.Qj.entityId,a.entityId)),e=new Map;for(let a of c)e.set(a.id,a);let f=new Map,g=new Set;for(let a of d){let b=f.get(a.orchestratorId)??new Set;b.add(a.subAgentId),f.set(a.orchestratorId,b),g.add(a.subAgentId)}let h=[];for(let a of c.filter(a=>"orchestrator"===a.role)){let b=f.get(a.id)??new Set,c=Array.from(b).map(a=>e.get(a)).filter(a=>!!a).sort((a,b)=>a.position-b.position||a.name.localeCompare(b.name));h.push({orchestrator:a,workers:c})}let i=c.filter(a=>"orchestrator"!==a.role&&!g.has(a.id)).sort((a,b)=>a.position-b.position||a.name.localeCompare(b.name));return i.length>0&&h.push({orchestrator:null,workers:i}),cT(h)}catch(a){return console.error("[listAgentGroupsAction]",a),cU("db_error","Failed to load agent groups")}}async function c3(a){try{let b=await cV();if(!Array.isArray(a)||0===a.length)return cU("validation_failed","No agent ids provided");for(let b of a)if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed",`Invalid agent id: ${b}`);let c=new Set,d=[];for(let b of a)c.has(b)||(c.add(b),d.push(b));let f=(0,y.Lf)();if((await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.entityId,b.entityId),(0,k.RV)(k.X6.id,d)))).length!==d.length)return cU("not_found","One or more agents not in this workspace");let h=new Date;for(let a=0;a<d.length;a++){let b=d[a];b&&await f.update(k.X6).set({position:10*a,updatedAt:h}).where((0,k.eq)(k.X6.id,b))}return(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[reorderAgentsAction]",a),cU("db_error","Failed to reorder agents")}}async function c4(a){try{let b=await cV(),c=c_.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!H(c.data.avatarUrl))return cU("validation_failed","Unknown avatar — pick one from the gallery");let{dbRole:d,orchestratorMode:f}=c7(c.data.role),g=(0,y.Lf)(),h=await (0,k.S$)(g,b.entityId,{slug:c.data.slug,name:c.data.name,personality:c.data.personality,model:c.data.model,llmKeyId:c.data.llmKeyId??null,role:d,orchestratorMode:f,avatarUrl:c.data.avatarUrl,subAgentIds:c.data.subAgentIds});if("error"in h)return cU("conflict","An agent with this slug already exists");return(0,e.revalidatePath)("/agents"),cT({id:h.id})}catch(a){if(console.error("[createAgentAction]",a),"sub_agents_not_found"===(a instanceof Error?a.message:""))return cU("validation_failed","One or more sub-agents not found in this workspace");return cU("db_error","Failed to create agent")}}async function c5(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return await c.delete(k.X6).where((0,k.eq)(k.X6.id,a)),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[deleteAgentAction]",a),cU("db_error","Failed to delete agent")}}let c6=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(),fallbackChain:g.YO(g.Ik({keyId:g.Yj().guid(),model:g.Yj().max(200)})).default([]),role:g.k5(["worker","router","planner"]),subAgentIds:g.YO(g.Yj().guid()).default([]),avatarUrl:g.Yj().max(200).optional().nullable().transform(a=>a&&""!==a.trim()?a.trim():null)});function c7(a){return"worker"===a?{dbRole:"agent",orchestratorMode:null}:{dbRole:"orchestrator",orchestratorMode:a}}async function c8(a){try{let b=await cV(),c=c6.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!H(c.data.avatarUrl))return cU("validation_failed","Unknown avatar — pick one from the gallery");let{id:d,name:f,personality:g,model:h,llmKeyId:i,fallbackChain:j,role:l,subAgentIds:m,avatarUrl:n}=c.data,o=(0,y.Lf)(),[p]=await o.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d),(0,k.eq)(k.X6.entityId,b.entityId)));if(!p)return cU("not_found","Agent not found");let{dbRole:q,orchestratorMode:r}=c7(l),s={name:f,personality:g,model:h,role:q,orchestratorMode:r,updatedAt:new Date};return void 0!==i&&(s.llmKeyId=i),void 0!==n&&(s.avatarUrl=n),s.fallbackChain=j.filter(a=>a.keyId!==i),await o.update(k.X6).set(s).where((0,k.eq)(k.X6.id,d)),await o.delete(k.Qj).where((0,k.eq)(k.Qj.orchestratorId,d)),"worker"!==l&&m.length>0&&await o.insert(k.Qj).values(m.map(a=>({orchestratorId:d,subAgentId:a,entityId:b.entityId}))),await o.update(k.ME).set({systemPrompt:null,updatedAt:new Date}).where((0,k.Uo)((0,k.eq)(k.ME.agentId,d),(0,k.KL)(k.ME.status,["completed","failed","cancelled"]))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[updateAgentAction]",a),cU("db_error","Failed to update agent")}}async function c9(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select().from(k.Kq).where((0,k.eq)(k.Kq.agentId,a)).orderBy(k.Kq.position,k.Kq.label);return cT(e)}catch(a){return console.error("[listAgentWorkspacesAction]",a),cU("db_error","Failed to load workspaces")}}async function da(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let f=g.Yj().min(1).max(80).safeParse(b);if(!f.success)return cU("validation_failed","Label must be 1-80 characters");let h=f.data.trim(),i=c.trim();if(!i)return cU("validation_failed","Path is required");if(!/^([A-Za-z]:[/\\]|\/|\\\\)/.test(i))return cU("validation_failed","Path must be absolute (e.g. /home/user/notes or C:\\Users\\you\\notes)");let j=(0,y.Lf)(),[l]=await j.select({id:k.X6.id,entityId:k.X6.entityId}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!l)return cU("not_found","Agent not found");let[m]=await j.insert(k.Kq).values({agentId:a,entityId:l.entityId,label:h,path:i,position:0}).returning({id:k.Kq.id});if(!m)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)(`/agents/${a}/edit`),cT({id:m.id})}catch(b){console.error("[addAgentWorkspaceAction]",b);let a=b instanceof Error?b.message:"";if(a.includes("unique")||a.includes("23505"))return cU("conflict","A workspace with this label already exists for this agent");return cU("db_error","Failed to add workspace")}}async function db(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid workspace id");let c=(0,y.Lf)(),[d]=await c.select({agentId:k.Kq.agentId}).from(k.Kq).where((0,k.eq)(k.Kq.id,a));if(!d)return cU("not_found","Workspace not found");let[f]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Workspace not found");return await c.delete(k.Kq).where((0,k.eq)(k.Kq.id,a)),(0,e.revalidatePath)(`/agents/${d.agentId}/edit`),cT(void 0)}catch(a){return console.error("[removeAgentWorkspaceAction]",a),cU("db_error","Failed to remove workspace")}}let dc={"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".docx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":".xlsx","application/vnd.openxmlformats-officedocument.presentationml.presentation":".pptx","application/pdf":".pdf","text/plain":".txt","text/markdown":".md","text/csv":".csv","text/x-markdown":".md","application/octet-stream":""},dd=new Set([".docx",".xlsx",".pptx",".pdf",".txt",".md",".csv"]);async function de(a,b){if(!(0,i.isAbsolute)(a))return{ok:!1,reason:"Workspace root is not an absolute path."};let c=(0,i.basename)(b);if(!c||c.startsWith("."))return{ok:!1,reason:`Invalid filename: "${b}"`};let d=await (0,h.realpath)(a).catch(()=>null);if(!d)return{ok:!1,reason:`Workspace directory does not exist: "${a}"`};let e=(0,i.resolve)(d,c),f=d.endsWith(i.sep)?d:d+i.sep;return e===d||e.startsWith(f)?{ok:!0,resolved:e}:{ok:!1,reason:`Path traversal blocked for filename "${b}".`}}async function df(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().min(1).max(80).safeParse(b).success)return cU("validation_failed","Invalid workspace label");let f=(0,y.Lf)(),[l]=await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!l)return cU("not_found","Agent not found");let[m]=await f.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!m)return cU("not_found",`Workspace "${b}" not found for this agent`);let n=c.get("file");if(!(n instanceof File))return cU("validation_failed",'No file provided in FormData (field "file")');if(n.size>0x1900000)return cU("file_too_large",`File is ${n.size} bytes (max 26214400). Compress or split it first.`);let o=n.name.slice(n.name.lastIndexOf(".")).toLowerCase(),p=n.type in dc,q=dd.has(o);if(!p&&!q)return cU("unsupported_file_type",`File type "${n.type}" / extension "${o}" is not allowed. Allowed: ${[...dd].join(", ")}.`);if("application/octet-stream"===n.type&&!q)return cU("unsupported_file_type",`Extension "${o}" is not allowed. Allowed: ${[...dd].join(", ")}.`);await (0,h.mkdir)(m.path,{recursive:!0});let r=await de(m.path,n.name);if(!r.ok)return cU("path_traversal_blocked",r.reason);let s=(0,i.dirname)(r.resolved),t=(0,i.join)(s,`.${(0,i.basename)(r.resolved)}.${(0,j.randomBytes)(6).toString("hex")}.tmp`),u=await n.arrayBuffer();try{await (0,h.writeFile)(t,Buffer.from(u)),await (0,h.rename)(t,r.resolved)}catch(a){throw await (0,h.unlink)(t).catch(()=>void 0),a}return(0,e.revalidatePath)(`/agents/${a}/edit`),cT({filename:(0,i.basename)(r.resolved),bytes:n.size})}catch(a){return console.error("[uploadToWorkspaceAction]",a),cU("db_error","Upload failed")}}async function dg(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let d=(0,y.Lf)(),[e]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,c.entityId)));if(!e)return cU("not_found","Agent not found");let[f]=await d.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!f)return cU("not_found",`Workspace "${b}" not found for this agent`);if(!await (0,h.stat)(f.path).then(a=>a.isDirectory()).catch(()=>!1))return cT([]);let j=await (0,h.readdir)(f.path,{withFileTypes:!0}),l=[];for(let a of j){if(!a.isFile())continue;let b=(0,i.join)(f.path,a.name),c=await (0,h.stat)(b).catch(()=>null);c&&l.push({name:a.name,size:c.size,modifiedAt:c.mtime.toISOString()})}return l.sort((a,b)=>a.name.localeCompare(b.name)),cT(l)}catch(a){return console.error("[listWorkspaceFilesAction]",a),cU("db_error","Failed to list workspace files")}}async function dh(a,b,c){try{let d=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let f=(0,y.Lf)(),[i]=await f.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,d.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await f.select({path:k.Kq.path}).from(k.Kq).where((0,k.Uo)((0,k.eq)(k.Kq.agentId,a),(0,k.eq)(k.Kq.label,b)));if(!j)return cU("not_found",`Workspace "${b}" not found for this agent`);let l=await de(j.path,c);if(!l.ok)return cU("path_traversal_blocked",l.reason);return await (0,h.unlink)(l.resolved),(0,e.revalidatePath)(`/agents/${a}/edit`),cT(void 0)}catch(a){if("ENOENT"===a.code)return cU("not_found",`File "${c}" not found in workspace`);return console.error("[deleteWorkspaceFileAction]",a),cU("db_error","Failed to delete file")}}async function di(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select().from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({subAgentId:k.Qj.subAgentId}).from(k.Qj).where((0,k.eq)(k.Qj.orchestratorId,a));return cT({...d,orchestratorMode:d.orchestratorMode??null,subAgentIds:e.map(a=>a.subAgentId)})}catch(a){return console.error("[getAgentForEditAction]",a),cU("db_error","Failed to load agent")}}async function dj(a){try{let b=await cV(),c=c0.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.X6.id,slug:k.X6.slug}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Agent not found");let g=null;if(c.data.sendViaTelegram){let[a]=await d.select({chatId:k.X6.lastSeenChatIdTelegram}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId))).limit(1);if(!a?.chatId)return cU("no_telegram_recipient_known","DM the bot first to register a recipient.");g=a.chatId}let[h]=await d.insert(k.ME).values({entityId:b.entityId,agentId:f.id,status:"pending",channel:"api",task:c.data.prompt,...g?{chatId:g}:{}}).returning({id:k.ME.id});if(!h)return cU("db_error","Failed to create job");let i=`${A._.RUNNER_URL}/api/worker`;return A._.WORKER_SECRET?fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({jobId:h.id})}).catch(a=>{console.error("[sendTaskAction] runner ping failed:",a)}):console.error("[sendTaskAction] WORKER_SECRET missing — cannot ping runner"),(0,e.revalidatePath)("/jobs"),cT({jobId:h.id})}catch(a){return console.error("[sendTaskAction]",a),cU("db_error","Failed to send task")}}async function dk(a={}){try{let b=await cV(),c=Math.min(a.limit??50,100),d=(0,y.Lf)(),e=await d.select({id:k.ME.id,entityId:k.ME.entityId,agentId:k.ME.agentId,status:k.ME.status,channel:k.ME.channel,task:k.ME.task,result:k.ME.result,error:k.ME.error,chainCount:k.ME.chainCount,inputTokens:k.ME.inputTokens,outputTokens:k.ME.outputTokens,createdAt:k.ME.createdAt,completedAt:k.ME.completedAt}).from(k.ME).where((0,k.eq)(k.ME.entityId,b.entityId)).orderBy((0,k.i8)(k.ME.createdAt)).limit(c);return cT(e)}catch(a){return console.error("[listJobsAction]",a),cU("db_error","Failed to load jobs")}}async function dl(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({job:k.ME,agentName:k.X6.name,agentSlug:k.X6.slug}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");let e=await c.select({id:k.ME.id,agentName:k.X6.name,agentSlug:k.X6.slug,status:k.ME.status,result:k.ME.result,error:k.ME.error,createdAt:k.ME.createdAt,completedAt:k.ME.completedAt}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.parentJobId,a)).orderBy(k.ME.createdAt);return cT({...d.job,agentName:d.agentName,agentSlug:d.agentSlug,children:e})}catch(a){return console.error("[getJobDetailAction]",a),cU("db_error","Failed to load job")}}async function dm(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status,result:k.ME.result,error:k.ME.error}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");return cT({status:d.status??"pending",result:d.result,error:d.error})}catch(a){return console.error("[getJobStatusAction]",a),cU("db_error","Failed to load job status")}}let dn=new Set(["completed","failed","cancelled"]);async function dp(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId)));if(!d)return cU("not_found","Job not found");let f=d.status??"pending";if(dn.has(f))return cU("already_terminal",`Job is already ${f}`);return await c.execute((0,k.ll)`
1211
1211
  WITH RECURSIVE descendants AS (
1212
1212
  SELECT id FROM agent_jobs WHERE id = ${a}
1213
1213
  UNION ALL
@@ -1220,4 +1220,4 @@ To: ${d.to??""}
1220
1220
  WHERE id IN (SELECT id FROM descendants)
1221
1221
  AND entity_id = ${b.entityId}
1222
1222
  AND status NOT IN ('completed', 'failed', 'cancelled')
1223
- `),(0,e.revalidatePath)("/jobs"),(0,e.revalidatePath)(`/jobs/${a}`),cT({status:"cancelled"})}catch(a){return console.error("[cancelJobAction]",a),cU("db_error","Failed to cancel job")}}let dq=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 dr(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id,slug:k.X6.slug,name:k.X6.name,botToken:k.X6.telegramBotToken,botUsername:k.X6.telegramBotUsername,lastSeenChatIdTelegram:k.X6.lastSeenChatIdTelegram}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return cT({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),cU("db_error","Failed to load Telegram config")}}async function ds(a){try{let b,c=await cV(),d=dq.safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let{agentId:f,botToken:g}=d.data,h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id,slug:k.X6.slug,name:k.X6.name}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,f),(0,k.eq)(k.X6.entityId,c.entityId)));if(!i)return cU("not_found","Agent not found");try{b=await n(g)}catch(a){if(a instanceof l&&"telegram_invalid_token"===a.code)return cU("telegram_invalid_token","Telegram rejected this token. Double-check it from @BotFather.");throw a}let j=0;try{let a=await o({botToken:g,offset:-1,timeout:0,limit:1});a.length>0&&(j=Math.max(...a.map(a=>a.update_id))+1)}catch{}return await h.update(k.X6).set({telegramBotToken:g,telegramBotUsername:b.username,telegramOffset:j,updatedAt:new Date}).where((0,k.eq)(k.X6.id,f)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${f}/telegram`),cT({agentId:i.id,agentSlug:i.slug,agentName:i.name,status:"connected",botUsername:b.username,lastSeenChatIdTelegram:null})}catch(a){return console.error("[configureAgentTelegramAction]",a),cU("db_error","Failed to configure Telegram")}}async function dt(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return await c.update(k.X6).set({telegramBotToken:null,telegramBotUsername:null,telegramOffset:null,updatedAt:new Date}).where((0,k.eq)(k.X6.id,a)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${a}/telegram`),cT(void 0)}catch(a){return console.error("[disconnectAgentTelegramAction]",a),cU("db_error","Failed to disconnect Telegram")}}let du=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 dv(a={}){try{let b=await cV(),c=du.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),e=await v(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:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.RV)(k.X6.id,f))))g.set(a.id,{name:a.name,slug:a.slug});let h=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 cT({items:h,page:e.page,pageSize:e.pageSize,totalCount:e.totalCount,hasMore:e.hasMore})}catch(a){return console.error("[listMemoriesAction]",a),cU("db_error","Failed to load memories")}}async function dw(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await s(c,a,b.entityId,{archived:!0}),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[archiveMemoryAction]",a),cU("db_error","Failed to archive memory")}}async function dx(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await s(c,a,b.entityId,{archived:!1}),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[unarchiveMemoryAction]",a),cU("db_error","Failed to unarchive memory")}}async function dy(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await t(c,a,b.entityId),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[deleteMemoryAction]",a),cU("db_error","Failed to delete memory")}}async function dz(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.tK).where((0,k.eq)(k.tK.entityId,a.entityId)),d=[...new Set(c.map(a=>a.credentialId).filter(a=>null!==a))],e=d.length>0?await b.select().from(k.z3).where((0,k.RV)(k.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,w.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 h=c.map(a=>{let b=a.credentialId?f.get(a.credentialId):void 0,c=a.credentialId?g.get(a.credentialId)??null:null;return{id:a.id,slug:a.slug,name:a.name,authType:a.authType,active:a.active??!0,hasApiKey:!!a.apiKey,credentialId:a.credentialId??null,credentialName:b?.name??null,credentialType:b?b.type:null,credentialAccountName:c?.accountName??null,credentialExpiresAt:c?.expiresAt??null,credentialScopes:c?.scopes??null,createdAt:a.createdAt,updatedAt:a.updatedAt}}),i=F.Y.map(a=>({slug:a.slug,label:a.label,authType:a.authType,docsHint:a.docsHint,credentialType:a.credentialType??null}));return cT({instances:h,catalog:i})}catch(a){return console.error("[listConnectorsAction]",a),cU("db_error","Failed to load connectors")}}let dA=g.Ik({slug:g.Yj().min(1).max(80),name:g.Yj().min(1,"Name is required").max(120),apiKey:g.Yj().min(1,"API key is required")});async function dB(a){try{let b=await cV(),c=dA.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=F.Y.find(a=>a.slug===c.data.slug);if(!d)return cU("validation_failed","Unknown connector slug");if("api_key"!==d.authType)return cU("validation_failed",`Connector ${c.data.slug} uses ${d.authType}, not api_key`);let f=(0,y.Lf)(),g=(0,w.ph)(c.data.apiKey)?c.data.apiKey:(0,w.w)(c.data.apiKey),[h]=await f.insert(k.tK).values({entityId:b.entityId,slug:c.data.slug,name:c.data.name,apiKey:g,authType:"api_key",active:!0}).returning({id:k.tK.id});if(!h)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/connectors"),cT({id:h.id})}catch(a){return console.error("[saveApiKeyConnectorAction]",a),cU("db_error","Failed to save connector")}}async function dC(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let c=(0,y.Lf)(),[d]=await c.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,b.entityId)));if(!d)return cU("not_found","Connector not found");return await c.delete(k.tK).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[deleteConnectorAction]",a),cU("db_error","Failed to delete connector")}}async function dD(){try{let a=await cV(),b=(0,y.Lf)(),c=(await b.select().from(k.h_).where((0,k.eq)(k.h_.entityId,a.entityId))).map(a=>({id:a.id,slug:a.slug,name:a.name,active:a.active??!0,hasApiKey:!!a.apiKey,apiKeyLast4:a.apiKeyLast4??null,toolCount:Array.isArray(a.availableTools)?a.availableTools.length:0,createdAt:a.createdAt})),d=I.map(a=>({slug:a.slug,label:a.label,description:a.description,docsHint:a.docsHint,keyPrefix:a.keyPrefix,serverUrl:a.serverUrl,transport:a.transport,command:a.command,args:a.args,envVarNames:a.envVarNames,status:a.status??"verified"}));return cT({instances:c,catalog:d})}catch(a){return console.error("[listMcpServersAction]",a),cU("db_error","Failed to load MCP connectors")}}let dE=g.Ik({slug:g.Yj().min(1).max(80),name:g.Yj().min(1,"Name is required").max(120),apiKey:g.Yj().max(2e3).optional(),url:g.Yj().url("Invalid URL").optional(),customSlug:g.Yj().min(2).max(30).regex(/^[a-z0-9-]+$/,"Slug must be lowercase letters, digits, dashes").optional(),customAuthScheme:g.k5(["header","query","bearer"]).optional(),customAuthParamName:g.Yj().min(1).max(100).optional(),customCommand:g.Yj().min(1).max(200).optional(),customArgs:g.YO(g.Yj().max(500)).max(20).optional(),customEnv:g.g1(g.Yj(),g.Yj().max(2e3)).optional()});async function dF(a){try{let b=await cV(),c=dE.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=I.find(a=>a.slug===c.data.slug);if(!d)return cU("validation_failed","Unknown MCP connector");let f="custom-http-mcp"===d.slug,g="custom-stdio-mcp"===d.slug,h=d.slug,i=d.transport,j=d.authScheme,l=d.authParamName;if(f){if(!c.data.customSlug)return cU("validation_failed","Server slug is required for custom MCP");if(!c.data.customAuthScheme)return cU("validation_failed","Auth scheme is required for custom MCP");if(h=c.data.customSlug,j=c.data.customAuthScheme,l="bearer"===c.data.customAuthScheme?"Authorization":c.data.customAuthParamName??"","bearer"!==j&&!l)return cU("validation_failed",`Auth param name is required for the "${j}" scheme`)}else if(g){if(!c.data.customSlug)return cU("validation_failed","Server slug is required for custom MCP");if(!c.data.customCommand)return cU("validation_failed","Command is required for stdio MCP");h=c.data.customSlug,i="stdio"}if(f||g){let a=(0,y.Lf)();if((await a.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.entityId,b.entityId),(0,k.eq)(k.h_.slug,h)))).length>0)return cU("slug_taken",`Slug "${h}" is already used by another MCP server. Pick a different one.`)}if("http"===i){let a=(c.data.apiKey??"").trim();if(!a)return cU("validation_failed","API key is required");if(!f&&d.keyPrefix.length>0&&!d.keyPrefix.some(b=>a.startsWith(b))){let a=1===d.keyPrefix.length?`"${d.keyPrefix[0]}"`:`one of: ${d.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}let g=d.serverUrl??c.data.url??null;if(!g)return cU("validation_failed",`${d.label} requires a server URL`);let i=[],m=null;try{if(m=await N({transport:"http",url:g,apiKey:a,authScheme:j,authParamName:l}),d.verifyToolName&&!f){let a=await m.client.callTool({name:d.verifyToolName,arguments:{}});if(!0===a.isError)return cU("mcp_connect_failed",`${d.label} rejected the API key.`)}i=m.tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not connect to ${d.label}: ${a}`)}finally{m&&await m.close().catch(()=>{})}let n=(0,y.Lf)(),o=(0,w.w)(a),[p]=await n.insert(k.h_).values({entityId:b.entityId,name:c.data.name,slug:h,transport:"http",url:g,apiKey:o,apiKeyLast4:(0,w.nK)(a),authScheme:j,authParamName:l,availableTools:i,active:!0}).returning({id:k.h_.id});if(!p)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/mcp"),cT({id:p.id})}let m=g?c.data.customCommand:d.command??c.data.customCommand,n=c.data.customArgs??d.args??[],o=c.data.customEnv??{},p=[],q=null;try{p=(q=await N({transport:"stdio",command:m,args:n,env:o})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not start ${d.label} subprocess (${m}): ${a}`)}finally{q&&await q.close().catch(()=>{})}let r={};for(let[a,b]of Object.entries(o))r[a]=(0,w.w)(b);let s=(0,y.Lf)(),[t]=await s.insert(k.h_).values({entityId:b.entityId,name:c.data.name,slug:h,transport:"stdio",url:null,apiKey:null,apiKeyLast4:null,authScheme:null,authParamName:null,command:m,args:n,envVars:r,availableTools:p,active:!0}).returning({id:k.h_.id});if(!t)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/mcp"),cT({id:t.id})}catch(a){return console.error("[createMcpServerFromCatalogAction]",a),cU("db_error","Failed to save MCP connector")}}async function dG(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=g.Yj().min(1,"Name is required").max(120).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid name");let f=(0,y.Lf)(),[h]=await f.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!h)return cU("not_found","MCP connector not found");return await f.update(k.h_).set({name:d.data,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[renameMcpServerAction]",a),cU("db_error","Failed to rename MCP server")}}async function dH(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=g.Yj().min(1,"API key is required").max(2e3).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid API key");let f=d.data.trim(),h=(0,y.Lf)(),[i]=await h.select({id:k.h_.id,slug:k.h_.slug,url:k.h_.url,authScheme:k.h_.authScheme,authParamName:k.h_.authParamName}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!i)return cU("not_found","MCP connector not found");let j=I.find(a=>a.slug===i.slug);if(j&&j.keyPrefix.length>0&&!j.keyPrefix.some(a=>f.startsWith(a))){let a=1===j.keyPrefix.length?`"${j.keyPrefix[0]}"`:`one of: ${j.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}if(!i.url||!i.authScheme||!i.authParamName)return cU("validation_failed","MCP server has incomplete configuration");let l=[],m=null;try{m=await N({transport:"http",url:i.url,apiKey:f,authScheme:i.authScheme,authParamName:i.authParamName}),l=((await m.client.listTools()).tools??[]).map(a=>({name:a.name,description:a.description??null})),j?.verifyToolName&&await m.client.callTool({name:j.verifyToolName,arguments:{}})}catch(b){let a=b instanceof Error?b.message:"unknown error";return cU("mcp_connect_failed",`Couldn't verify the new key: ${a}`)}finally{m&&await m.close().catch(()=>{})}let n=(0,w.ph)(f)?f:(0,w.w)(f);return await h.update(k.h_).set({apiKey:n,apiKeyLast4:(0,w.nK)(f),availableTools:l,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[updateMcpServerApiKeyAction]",a),cU("db_error","Failed to rotate MCP API key")}}async function dI(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let c=(0,y.Lf)(),[d]=await c.select().from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,b.entityId)));if(!d)return cU("not_found","MCP connector not found");let e=d.envVars??{};return cT({id:d.id,name:d.name,slug:d.slug,transport:d.transport,url:d.url??null,authScheme:d.authScheme??null,authParamName:d.authParamName??null,command:d.command??null,args:Array.isArray(d.args)?d.args:[],envKeys:Object.keys(e),hasApiKey:!!d.apiKey,apiKeyLast4:d.apiKeyLast4??null})}catch(a){return console.error("[getMcpServerConfigAction]",a),cU("db_error","Failed to load MCP server config")}}let dJ=g.Ik({name:g.Yj().min(1,"Name is required").max(120),url:g.Yj().url("Invalid URL").optional(),authScheme:g.k5(["header","query","bearer"]).optional(),authParamName:g.Yj().max(100).optional(),apiKey:g.Yj().max(2e3).optional(),command:g.Yj().min(1).max(200).optional(),args:g.YO(g.Yj().max(500)).max(20).optional(),env:g.g1(g.Yj(),g.Yj().max(2e3)).optional()});async function dK(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=dJ.safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),[h]=await f.select().from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!h)return cU("not_found","MCP connector not found");let i=I.find(a=>a.slug===h.slug);if("http"===h.transport){let b,c=(d.data.url??h.url??"").trim();if(!c)return cU("validation_failed","Server URL is required");let g=d.data.authScheme??h.authScheme??"header",j="bearer"===g?"Authorization":(d.data.authParamName??h.authParamName??"").trim();if("bearer"!==g&&!j)return cU("validation_failed",`Auth param name is required for the "${g}" scheme`);let l=(d.data.apiKey??"").trim(),m=l.length>0;if(m){if(i&&i.keyPrefix.length>0&&!i.keyPrefix.some(a=>l.startsWith(a))){let a=1===i.keyPrefix.length?`"${i.keyPrefix[0]}"`:`one of: ${i.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}b=l}else{if(!h.apiKey)return cU("validation_failed","No stored API key — provide one to connect");try{b=(0,w.Yc)(h.apiKey)}catch{return cU("validation_failed","Stored API key is unreadable — re-enter it")}}let n=[],o=null;try{n=(o=await N({transport:"http",url:c,apiKey:b,authScheme:g,authParamName:j})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not connect with the new config: ${a}`)}finally{o&&await o.close().catch(()=>{})}return await f.update(k.h_).set({name:d.data.name,url:c,authScheme:g,authParamName:j,availableTools:n,...m?{apiKey:(0,w.w)(b),apiKeyLast4:(0,w.nK)(b)}:{},updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}let j=(d.data.command??h.command??"").trim();if(!j)return cU("validation_failed","Command is required");let l=d.data.args??(Array.isArray(h.args)?h.args:[]),m=h.envVars??{},n=d.data.env,o={},p={};for(let[a,b]of n?Object.entries(n):Object.entries(m).map(([a])=>[a,""]))if(b&&b.length>0)o[a]=b,p[a]=(0,w.w)(b);else if(void 0!==m[a]){try{o[a]=(0,w.Yc)(m[a])}catch{return cU("validation_failed",`Stored value for "${a}" is unreadable — re-enter it`)}p[a]=m[a]}let q=[],r=null;try{q=(r=await N({transport:"stdio",command:j,args:l,env:o})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not start the subprocess (${j}): ${a}`)}finally{r&&await r.close().catch(()=>{})}return await f.update(k.h_).set({name:d.data.name,command:j,args:l,envVars:p,availableTools:q,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[updateMcpServerConfigAction]",a),cU("db_error","Failed to update MCP server")}}async function dL(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let c=(0,y.Lf)(),[d]=await c.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,b.entityId)));if(!d)return cU("not_found","MCP connector not found");return await c.delete(k.h_).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[deleteMcpServerAction]",a),cU("db_error","Failed to delete MCP connector")}}async function dM(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({id:k.h_.id,slug:k.h_.slug,name:k.h_.name,availableTools:k.h_.availableTools}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.entityId,b.entityId),(0,k.eq)(k.h_.active,!0)));if(0===e.length)return cT([]);let f=await c.select({mcpServerId:k.oS.mcpServerId,enabledTools:k.oS.enabledTools}).from(k.oS).where((0,k.eq)(k.oS.agentId,a)),h=new Map;for(let a of f)h.set(a.mcpServerId,{enabledTools:a.enabledTools??null});let i=e.map(a=>{let b=h.get(a.id);return{mcpServerId:a.id,slug:a.slug,label:a.name,assigned:void 0!==b,enabledTools:b?.enabledTools??null,availableTools:Array.isArray(a.availableTools)?a.availableTools:[]}});return cT(i)}catch(a){return console.error("[listAgentMcpServersAction]",a),cU("db_error","Failed to load agent MCP connectors")}}async function dN(a,b,c,d){try{let f=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid MCP server id");let h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,f.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await h.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,b),(0,k.eq)(k.h_.entityId,f.entityId)));if(!j)return cU("not_found","MCP connector not found");return c?await h.insert(k.oS).values({agentId:a,mcpServerId:b,entityId:f.entityId,enabledTools:d??null}).onConflictDoUpdate({target:[k.oS.agentId,k.oS.mcpServerId],set:{enabledTools:d??null,updatedAt:new Date}}):await h.delete(k.oS).where((0,k.Uo)((0,k.eq)(k.oS.agentId,a),(0,k.eq)(k.oS.mcpServerId,b))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[setAgentMcpServerAssignmentAction]",a),cU("db_error","Failed to update MCP assignment")}}async function dO(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");if(null!==b&&!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid credential id");let d=(0,y.Lf)(),[f]=await d.select({id:k.tK.id,slug:k.tK.slug,authType:k.tK.authType}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!f)return cU("not_found","Connector not found");if("oauth2"!==f.authType)return cU("invalid_auth_type","Only OAuth2 connectors support credential assignment");if(null!==b){let[a]=await d.select({id:k.z3.id,ownerUserId:k.z3.ownerUserId,type:k.z3.type}).from(k.z3).where((0,k.eq)(k.z3.id,b));if(!a)return cU("not_found","Credential not found");if(a.ownerUserId!==c.userId)return cU("forbidden","Access denied");let e=(0,O.ZH)(f.slug);if(e&&e.credentialType!==a.type)return cU("type_mismatch",`Credential type '${a.type}' is not compatible with connector '${f.slug}' (expects '${e.credentialType}')`)}return await d.update(k.tK).set({credentialId:b,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(b){console.error("[assignCredentialAction]",b);let a=b instanceof Error?b.message:String(b);return cU("db_error",`Failed to assign credential: ${a}`)}}async function dP(a,b,c){try{let d=await cV();if(!g.Yj().min(1).max(80).safeParse(a).success)return cU("validation_failed","Invalid connector slug");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid credential id");if(void 0!==c&&!g.Yj().min(1).max(120).safeParse(c).success)return cU("validation_failed","Invalid connector name");let f=F.Y.find(b=>b.slug===a);if(!f)return cU("validation_failed","Unknown connector slug");if("oauth2"!==f.authType)return cU("invalid_auth_type","Only OAuth2 connectors support credential assignment");let h=(0,y.Lf)(),[i]=await h.select({id:k.z3.id,ownerUserId:k.z3.ownerUserId,type:k.z3.type,name:k.z3.name}).from(k.z3).where((0,k.eq)(k.z3.id,b));if(!i)return cU("not_found","Credential not found");if(i.ownerUserId!==d.userId)return cU("forbidden","Access denied");if(f.credentialType&&f.credentialType!==i.type)return cU("type_mismatch",`Credential type '${i.type}' is not compatible with connector '${a}' (expects '${f.credentialType}')`);let j=c??i.name??f.label,[l]=await h.insert(k.tK).values({entityId:d.entityId,slug:a,name:j,authType:"oauth2",credentialId:b,active:!0}).returning({id:k.tK.id});if(!l)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/connectors"),cT({connectorId:l.id})}catch(b){console.error("[createOrAssignOAuthConnectorAction]",b);let a=b instanceof Error?b.message:String(b);return cU("db_error",`Failed to assign credential: ${a}`)}}async function dQ(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let d=g.Yj().min(1,"Name is required").max(120).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid name");let f=(0,y.Lf)(),[h]=await f.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!h)return cU("not_found","Connector not found");return await f.update(k.tK).set({name:d.data,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[renameConnectorAction]",a),cU("db_error","Failed to rename connector")}}async function dR(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let d=g.Yj().min(1,"API key is required").max(2e3).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid API key");let f=(0,y.Lf)(),[h]=await f.select({id:k.tK.id,authType:k.tK.authType}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!h)return cU("not_found","Connector not found");if("api_key"!==h.authType)return cU("validation_failed",`Connector uses ${h.authType??"unknown"} auth — key rotation only applies to api_key connectors.`);let i=(0,w.ph)(d.data)?d.data:(0,w.w)(d.data);return await f.update(k.tK).set({apiKey:i,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[updateConnectorApiKeyAction]",a),cU("db_error","Failed to rotate API key")}}async function dS(a={}){try{let b=await cV(),c=(0,y.Lf)(),d=a.status??"pending",e=(0,k.eq)(k.MZ.entityId,b.entityId),f="all"===d?e:(0,k.Uo)(e,(0,k.eq)(k.MZ.status,d)),g=await c.select({id:k.MZ.id,jobId:k.MZ.jobId,agentId:k.MZ.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,toolName:k.MZ.toolName,toolInput:k.MZ.toolInput,status:k.MZ.status,requestedAt:k.MZ.requestedAt,resolvedAt:k.MZ.resolvedAt,resolvedBy:k.MZ.resolvedBy,expiresAt:k.MZ.expiresAt,notes:k.MZ.notes,jobTask:k.ME.task}).from(k.MZ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.MZ.agentId)).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.MZ.jobId)).where(f).orderBy((0,k.i8)(k.MZ.requestedAt)).limit(100);return cT(g.map(a=>({...a,status:a.status??"pending"})))}catch(a){return console.error("[listApprovalsAction]",a),cU("db_error","Failed to load approvals")}}let dT=g.Ik({approvalRequestId:g.Yj().guid(),decision:g.k5(["approve","reject"]),notes:g.Yj().max(5e3).optional()});async function dU(a){try{let b;await cV();let c=dT.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!A._.WORKER_SECRET)return console.error("[resolveApprovalAction] WORKER_SECRET missing"),cU("config_error","WORKER_SECRET is not set");let d=`${A._.RUNNER_URL}/api/approve`;try{b=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify(c.data)})}catch(a){return console.error("[resolveApprovalAction] fetch failed",a),cU("runner_unreachable","Runner did not respond")}if(!b.ok){let a=(await b.json().catch(()=>({}))).error??`runner_${b.status}`;return cU(a,`Runner rejected: ${a}`)}let f=await b.json();return(0,e.revalidatePath)("/approvals"),(0,e.revalidatePath)("/jobs"),(0,e.revalidatePath)(`/jobs/${f.jobId}`),cT({jobId:f.jobId,decision:f.decision})}catch(a){return console.error("[resolveApprovalAction]",a),cU("db_error","Failed to resolve approval")}}async function dV(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.eK.id,name:k.eK.name,slug:k.eK.slug,content:k.eK.content,defaultContent:k.eK.defaultContent,contentOverridden:k.eK.contentOverridden,description:k.eK.description,active:k.eK.active,requiredBuiltins:k.eK.requiredBuiltins,createdAt:k.eK.createdAt,updatedAt:k.eK.updatedAt}).from(k.eK).where((0,k.or)((0,k.eq)(k.eK.entityId,a.entityId),(0,k.RV)(k.eK.slug,J))).orderBy((0,k.i8)(k.eK.updatedAt));if(0===c.length)return cT([]);let d=await b.select({skillId:k.$m.skillId,c:(0,k.ll)`count(*)`}).from(k.$m).where((0,k.Uo)((0,k.eq)(k.$m.entityId,a.entityId),(0,k.RV)(k.$m.skillId,c.map(a=>a.id)))).groupBy(k.$m.skillId),e=new Map;for(let a of d)e.set(a.skillId,Number(a.c));let f=await b.select({skillId:k.$m.skillId,agentId:k.X6.id,agentName:k.X6.name,agentSlug:k.X6.slug,avatarUrl:k.X6.avatarUrl}).from(k.$m).innerJoin(k.X6,(0,k.eq)(k.X6.id,k.$m.agentId)).where((0,k.Uo)((0,k.eq)(k.$m.entityId,a.entityId),(0,k.RV)(k.$m.skillId,c.map(a=>a.id)))).orderBy(k.X6.name),g=new Map;for(let a of f){let b=g.get(a.skillId)??[];b.length<8&&(b.push({id:a.agentId,name:a.agentName,slug:a.agentSlug,avatarUrl:a.avatarUrl}),g.set(a.skillId,b))}return cT(c.map(a=>({id:a.id,name:a.name,slug:a.slug,isSystem:J.includes(a.slug),content:a.content,defaultContent:a.defaultContent,contentOverridden:a.contentOverridden??!1,description:a.description,active:a.active??!0,requiredBuiltins:a.requiredBuiltins??[],assignmentCount:e.get(a.id)??0,assignedAgents:g.get(a.id)??[],createdAt:a.createdAt,updatedAt:a.updatedAt})))}catch(a){return console.error("[listSkillsAction]",a),cU("db_error","Failed to load skills")}}let dW=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 dX(a){try{let b=await cV(),c=dW.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),f=await (0,k.qz)(d,b.entityId,{slug:c.data.slug,name:c.data.name,content:c.data.content,description:c.data.description??null});if("error"in f)return cU("conflict","A skill with this slug already exists");return(0,e.revalidatePath)("/skills"),cT({id:f.id})}catch(a){return console.error("[createSkillAction]",a),cU("db_error","Failed to create skill")}}async function dY(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");return await c.delete(k.eK).where((0,k.eq)(k.eK.id,a)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[deleteSkillAction]",a),cU("db_error","Failed to delete skill")}}let dZ=g.Ik({skillId:g.Yj().guid(),agentId:g.Yj().guid()});async function d$(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");let e=await c.select({id:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.eq)(k.X6.entityId,b.entityId)).orderBy(k.X6.name),f=await c.select({agentId:k.$m.agentId}).from(k.$m).where((0,k.eq)(k.$m.skillId,a)),h=new Set(f.map(a=>a.agentId));return cT(e.map(a=>({agentId:a.id,agentName:a.name,agentSlug:a.slug,assigned:h.has(a.id)})))}catch(a){return console.error("[listSkillAssignmentsAction]",a),cU("db_error","Failed to load skill assignments")}}async function d_(a){try{let b=await cV(),c=dZ.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),f=await (0,k.ps)(d,b.entityId,c.data,J);if("error"in f){if("skill_not_found"===f.error)return cU("not_found","Skill not found");if("agent_not_found"===f.error)return cU("not_found","Agent not found")}return(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[assignSkillAction]",a),cU("db_error","Failed to assign skill")}}let d0=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 d1(a){try{let b=await cV(),c=d0.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,name:f,description:g,content:h,active:i}=c.data,j=(0,y.Lf)(),[l]=await j.select({id:k.eK.id,content:k.eK.content}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,d),(0,k.eq)(k.eK.entityId,b.entityId)));if(!l)return cU("not_found","Skill not found");let m={name:f,description:g??null,content:h,...void 0!==i?{active:i}:{},updatedAt:new Date};return h!==l.content&&(m.contentOverridden=!0),await j.update(k.eK).set(m).where((0,k.eq)(k.eK.id,d)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[updateSkillAction]",a),cU("db_error","Failed to update skill")}}async function d2(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id,defaultContent:k.eK.defaultContent}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");if(null===d.defaultContent)return cU("not_applicable","No default available — this is a user-created skill");return await c.update(k.eK).set({content:d.defaultContent,contentOverridden:!1,updatedAt:new Date}).where((0,k.eq)(k.eK.id,a)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[resetSkillToDefaultAction]",a),cU("db_error","Failed to reset skill")}}async function d3(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id,name:k.eK.name,slug:k.eK.slug,content:k.eK.content,defaultContent:k.eK.defaultContent,contentOverridden:k.eK.contentOverridden,description:k.eK.description,active:k.eK.active,requiredBuiltins:k.eK.requiredBuiltins,createdAt:k.eK.createdAt,updatedAt:k.eK.updatedAt}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.or)((0,k.eq)(k.eK.entityId,b.entityId),(0,k.RV)(k.eK.slug,J))));if(!d)return cU("not_found","Skill not found");return cT({id:d.id,name:d.name,slug:d.slug,isSystem:J.includes(d.slug),content:d.content,defaultContent:d.defaultContent,contentOverridden:d.contentOverridden??!1,description:d.description,active:d.active??!0,requiredBuiltins:d.requiredBuiltins??[],assignmentCount:0,assignedAgents:[],createdAt:d.createdAt,updatedAt:d.updatedAt})}catch(a){return console.error("[getSkillByIdAction]",a),cU("db_error","Failed to load skill")}}async function d4(a){try{let b=await cV(),c=dZ.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)();return await d.delete(k.$m).where((0,k.Uo)((0,k.eq)(k.$m.skillId,c.data.skillId),(0,k.eq)(k.$m.agentId,c.data.agentId),(0,k.eq)(k.$m.entityId,b.entityId))),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[unassignSkillAction]",a),cU("db_error","Failed to unassign skill")}}let d5=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 d6(a={}){try{let b=await cV(),c=d5.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),e=[(0,k.eq)(k.Ky.entityId,b.entityId)];c.data.toolName&&e.push((0,k.eq)(k.Ky.toolName,c.data.toolName)),c.data.jobId&&e.push((0,k.eq)(k.Ky.jobId,c.data.jobId));let f=(c.data.page-1)*c.data.pageSize,g=c.data.agentId?await d.select({id:k.Ky.id,jobId:k.Ky.jobId,agentId:k.ME.agentId,toolName:k.Ky.toolName,toolInput:k.Ky.toolInput,toolOutput:k.Ky.toolOutput,durationMs:k.Ky.durationMs,turn:k.Ky.turn,createdAt:k.Ky.createdAt}).from(k.Ky).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.Ky.jobId)).where((0,k.Uo)(...e,(0,k.eq)(k.ME.agentId,c.data.agentId))).orderBy((0,k.i8)(k.Ky.createdAt)).limit(c.data.pageSize).offset(f):await d.select({id:k.Ky.id,jobId:k.Ky.jobId,agentId:k.ME.agentId,toolName:k.Ky.toolName,toolInput:k.Ky.toolInput,toolOutput:k.Ky.toolOutput,durationMs:k.Ky.durationMs,turn:k.Ky.turn,createdAt:k.Ky.createdAt}).from(k.Ky).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.Ky.jobId)).where((0,k.Uo)(...e)).orderBy((0,k.i8)(k.Ky.createdAt)).limit(c.data.pageSize).offset(f),h=Array.from(new Set(g.map(a=>a.agentId).filter(a=>null!==a))),i=new Map;if(h.length>0)for(let a of(await d.select({id:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.RV)(k.X6.id,h))))i.set(a.id,{name:a.name,slug:a.slug});let j=g.map(a=>{let b=a.agentId?i.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 cT({items:j,page:c.data.page,pageSize:c.data.pageSize})}catch(a){return console.error("[listToolCallsAction]",a),cU("db_error","Failed to load tool calls")}}async function d7(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.selectDistinct({toolName:k.Ky.toolName}).from(k.Ky).where((0,k.eq)(k.Ky.entityId,a.entityId)).orderBy(k.Ky.toolName);return cT(c.map(a=>a.toolName))}catch(a){return console.error("[listToolNamesAction]",a),cU("db_error","Failed to load tool names")}}async function d8(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({status:k.ME.status,count:(0,k.ll)`count(*)`,inputTokens:(0,k.ll)`coalesce(sum(${k.ME.inputTokens}), 0)`,outputTokens:(0,k.ll)`coalesce(sum(${k.ME.outputTokens}), 0)`,durationMs:(0,k.ll)`coalesce(sum(${k.ME.totalDurationMs}), 0)`}).from(k.ME).where((0,k.eq)(k.ME.entityId,a.entityId)).groupBy(k.ME.status),d={},e=0,f=0,g=0,h=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),h+=Number(a.durationMs)}let i=d.completed??0,j=i>0?h/i:null,[l]=await b.select({count:(0,k.ll)`count(*)`}).from(k.Ky).where((0,k.eq)(k.Ky.entityId,a.entityId)),m=Number(l?.count??0),n=(await b.select({agentId:k.ME.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,jobCount:(0,k.ll)`count(*)`,inputTokens:(0,k.ll)`coalesce(sum(${k.ME.inputTokens}), 0)`,outputTokens:(0,k.ll)`coalesce(sum(${k.ME.outputTokens}), 0)`}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.entityId,a.entityId)).groupBy(k.ME.agentId,k.X6.name,k.X6.slug).orderBy((0,k.i8)((0,k.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,k.ll)`count(*)`}).from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)),p=Number(o?.count??0);return cT({totalJobs:e,statusCounts:d,totalInputTokens:f,totalOutputTokens:g,totalDurationMs:h,avgDurationMs:j,totalToolCalls:m,agentCount:p,perAgent:n})}catch(a){return console.error("[getEntityStatsAction]",a),cU("db_error","Failed to load stats")}}async function d9(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({week:(0,k.ll)`to_char(date_trunc('week', ${k.ME.createdAt}), 'YYYY-MM-DD')`,status:k.ME.status,count:(0,k.ll)`count(*)`}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.entityId,a.entityId),(0,k.ll)`${k.ME.createdAt} > now() - interval '12 weeks'`)).groupBy((0,k.ll)`date_trunc('week', ${k.ME.createdAt})`,k.ME.status),d=new Map,e=new Date,f=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate())),g=f.getUTCDay();f.setUTCDate(f.getUTCDate()-(g+6)%7);for(let a=11;a>=0;a--){let b=new Date(f);b.setUTCDate(b.getUTCDate()-7*a);let c=b.toISOString().slice(0,10);d.set(c,{week:c,completed:0,failed:0,cancelled:0,awaiting:0,pending:0})}for(let a of c){let b=d.get(a.week);if(!b)continue;let c=Number(a.count),e=a.status??"";"completed"===e?b.completed+=c:"failed"===e?b.failed+=c:"cancelled"===e?b.cancelled+=c:"pending"===e?b.pending+=c:b.awaiting+=c}return cT(Array.from(d.values()))}catch(a){return console.error("[getWeeklyActivityAction]",a),cU("db_error","Failed to load weekly activity")}}async function ea(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({agentId:k.ME.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,avatarUrl:k.X6.avatarUrl,status:k.ME.status,count:(0,k.ll)`count(*)`}).from(k.ME).innerJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.Uo)((0,k.eq)(k.ME.entityId,a.entityId),(0,k.ll)`${k.ME.status} IN ('pending', 'processing', 'awaiting_approval', 'awaiting_delegation')`)).groupBy(k.ME.agentId,k.X6.name,k.X6.slug,k.X6.avatarUrl,k.ME.status),d=new Map;for(let a of c){if(!a.agentId||!a.agentName||!a.agentSlug)continue;let b=d.get(a.agentId)??{agentId:a.agentId,agentName:a.agentName,agentSlug:a.agentSlug,avatarUrl:a.avatarUrl??null,processing:0,awaiting:0,pending:0,total:0},c=Number(a.count),e=a.status??"";"processing"===e?b.processing+=c:"awaiting_approval"===e||"awaiting_delegation"===e?b.awaiting+=c:"pending"===e&&(b.pending+=c),b.total+=c,d.set(a.agentId,b)}let e=Array.from(d.values()).sort((a,b)=>b.total!==a.total?b.total-a.total:a.agentName.localeCompare(b.agentName));return cT(e)}catch(a){return console.error("[getActiveJobsByAgentAction]",a),cU("db_error","Failed to load active jobs")}}async function eb(){try{let a=await cV();return cT({llm:{provider:A._.LLM_PROVIDER??null,model:A._.LLM_MODEL??null,baseURL:A._.LLM_BASE_URL??null},authMode:A._.AUTH_MODE,runnerUrl:A._.RUNNER_URL,appUrl:A._.NEXT_PUBLIC_APP_URL,workerSecretConfigured:!!A._.WORKER_SECRET,user:{userId:a.userId,entityId:a.entityId}})}catch(a){return console.error("[getSettingsAction]",a),cU("db_error","Failed to load settings")}}async function ec(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.uQ.id,agentId:k.uQ.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,name:k.uQ.name,cronExpr:k.uQ.cronExpr,task:k.uQ.task,active:k.uQ.active,lastRun:k.uQ.lastRun,nextRun:k.uQ.nextRun,lastStatus:k.uQ.lastStatus,notifyOnSuccess:k.uQ.notifyOnSuccess,createdAt:k.uQ.createdAt,updatedAt:k.uQ.updatedAt}).from(k.uQ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.uQ.agentId)).where((0,k.eq)(k.uQ.entityId,a.entityId)).orderBy((0,k.i8)(k.uQ.updatedAt));return cT(c.map(a=>({...a,active:a.active??!0,notifyOnSuccess:a.notifyOnSuccess??!1})))}catch(a){return console.error("[listSchedulesAction]",a),cU("db_error","Failed to load schedules")}}let ed=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),notifyOnSuccess:g.zM().optional().default(!1)});async function ee(a){try{let b=await cV(),c=ed.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Agent not found");let g=Q(c.data.cronExpr);if(!g)return cU("validation_failed","Invalid cron expression");let[h]=await d.insert(k.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,notifyOnSuccess:c.data.notifyOnSuccess}).returning({id:k.uQ.id});if(!h)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/automations"),cT({id:h.id})}catch(a){return console.error("[createScheduleAction]",a),cU("db_error","Failed to create schedule")}}let ef=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),notifyOnSuccess:g.zM().optional().default(!1)});async function eg(a){try{let b=await cV(),c=ef.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.uQ.id}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,c.data.id),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!f)return cU("not_found","Schedule not found");let[g]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!g)return cU("not_found","Agent not found");let h=Q(c.data.cronExpr);if(!h)return cU("validation_failed","Invalid cron expression");return await d.update(k.uQ).set({agentId:c.data.agentId,name:c.data.name,cronExpr:c.data.cronExpr,task:c.data.task,nextRun:h,notifyOnSuccess:c.data.notifyOnSuccess,updatedAt:new Date}).where((0,k.eq)(k.uQ.id,c.data.id)),(0,e.revalidatePath)("/automations"),cT(void 0)}catch(a){return console.error("[updateScheduleAction]",a),cU("db_error","Failed to update schedule")}}async function eh(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({id:k.uQ.id,active:k.uQ.active}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!d)return cU("not_found","Schedule not found");let f=!(d.active??!0);return await c.update(k.uQ).set({active:f,updatedAt:new Date}).where((0,k.eq)(k.uQ.id,a)),(0,e.revalidatePath)("/automations"),cT({active:f})}catch(a){return console.error("[toggleScheduleAction]",a),cU("db_error","Failed to toggle schedule")}}async function ei(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({id:k.uQ.id}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!d)return cU("not_found","Schedule not found");return await c.delete(k.uQ).where((0,k.eq)(k.uQ.id,a)),(0,e.revalidatePath)("/automations"),cT(void 0)}catch(a){return console.error("[deleteScheduleAction]",a),cU("db_error","Failed to delete schedule")}}async function ej(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({agentId:k.uQ.agentId,task:k.uQ.task,chatId:k.uQ.chatId,notifyOnSuccess:k.uQ.notifyOnSuccess,agentChatId:k.X6.lastSeenChatIdTelegram}).from(k.uQ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.uQ.agentId)).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Schedule not found");if(!d.task)return cU("validation_failed","This automation has no task to run.");let f=d.notifyOnSuccess?d.chatId??d.agentChatId??null:null,[h]=await c.insert(k.ME).values({entityId:b.entityId,agentId:d.agentId,status:"pending",channel:"cron",task:d.task,messages:[{role:"user",content:d.task}],...f?{chatId:f}:{}}).returning({id:k.ME.id});if(!h)return cU("db_error","Failed to create job");return A._.WORKER_SECRET?fetch(`${A._.RUNNER_URL}/api/worker`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({jobId:h.id})}).catch(a=>{console.error("[runScheduleNowAction] runner ping failed:",a)}):console.error("[runScheduleNowAction] WORKER_SECRET missing — cannot ping runner"),(0,e.revalidatePath)("/automations"),(0,e.revalidatePath)("/jobs"),cT({jobId:h.id})}catch(a){return console.error("[runScheduleNowAction]",a),cU("db_error","Failed to run schedule now")}}async function ek(){try{await cV();let a=function(){let a=D();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 cT({runtimeMode:A._.AUTH_MODE,configuredMode:a.configuredMode,googleConfigured:a.googleConfigured,googleAvailableInRuntime:!!(A._.GOOGLE_CLIENT_ID&&A._.GOOGLE_CLIENT_SECRET),configPathExists:a.configPathExists})}catch(a){return console.error("[getSecuritySettingsAction]",a),cU("db_error","Failed to load security settings")}}let el=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 em(a){try{await cV();let b=el.safeParse(a);if(!b.success)return cU("validation_failed",b.error.issues[0]?.message??"Invalid input");let c=D();if(!c)return cU("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{E({auth:d})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cU("cli_config_missing","Config file disappeared between read and write.");throw b}(0,e.revalidatePath)("/settings");let f=b.data.mode!==A._.AUTH_MODE;return cT({requiresRestart:f})}catch(a){return console.error("[updateAuthSettingsAction]",a),cU("db_error","Failed to update auth settings")}}async function en(){try{let a;await cV();let b=(a=D())?{configuredBind:"lan"===a.bind?"lan":"loopback",configPathExists:!0}:{configuredBind:"loopback",configPathExists:!1},c="0.0.0.0"===A._.BIND?"lan":"loopback";return cT({configuredBind:b.configuredBind,runtimeBind:c,lanAddresses:function(){let a=(0,x.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}}(A._.NEXT_PUBLIC_APP_URL),configPathExists:b.configPathExists})}catch(a){return console.error("[getNetworkSettingsAction]",a),cU("db_error","Failed to load network settings")}}let eo=g.Ik({bind:g.k5(["loopback","lan"])});async function ep(a){try{await cV();let b=eo.safeParse(a);if(!b.success)return cU("validation_failed",b.error.issues[0]?.message??"Invalid input");try{E({bind:b.data.bind})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cU("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"===A._.BIND?"lan":"loopback";return cT({requiresRestart:b.data.bind!==c})}catch(a){return console.error("[updateNetworkSettingsAction]",a),cU("db_error","Failed to update network settings")}}let eq=["anthropic","openai","openai-compatible","ollama","openrouter","google","mistral","groq"],er=g.Yj().optional().transform(a=>a&&a.length>0?a:null).pipe(g.Yj().url().nullable().or(g.ch())),es=g.Ik({provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),nickname:g.Yj().min(1).max(120),defaultModel:g.Yj().min(1).max(200),isActive:g.zM().default(!0)}),et=g.Ik({id:g.Yj().guid(),provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),nickname:g.Yj().min(1).max(120),defaultModel:g.Yj().min(1).max(200),isActive:g.zM()}),eu=g.Ik({provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),model:g.Yj().optional(),keyId:g.Yj().guid().optional()});function ev(a,b){return b&&0!==b.length?a.replaceAll(b,"[REDACTED]"):a}async function ew(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.hG.id,provider:k.hG.provider,baseUrl:k.hG.baseUrl,nickname:k.hG.nickname,defaultModel:k.hG.defaultModel,isActive:k.hG.isActive,hasApiKey:(0,k.ll)`(${k.hG.apiKey} <> '')`,apiKeyLast4:k.hG.apiKeyLast4}).from(k.hG).where((0,k.eq)(k.hG.entityId,a.entityId)).orderBy((0,k.i8)(k.hG.createdAt)),d=await b.select({llmKeyId:k.X6.llmKeyId,n:(0,k.ll)`count(*)`}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.entityId,a.entityId),(0,k.eq)(k.X6.active,!0))).groupBy(k.X6.llmKeyId),e=new Map;for(let a of d)a.llmKeyId&&e.set(a.llmKeyId,Number(a.n));return cT(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,agentCount:e.get(a.id)??0})))}catch(a){return console.error("[listLlmKeysAction]",a),cU("db_error","Failed to load LLM providers")}}async function ex(a){try{let b=await cV(),c=es.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),f=c.data.apiKey??"",[g]=await d.insert(k.hG).values({entityId:b.entityId,provider:c.data.provider,apiKey:(0,w.w)(f),apiKeyLast4:(0,w.nK)(f),baseUrl:c.data.baseUrl,nickname:c.data.nickname,defaultModel:c.data.defaultModel,isActive:c.data.isActive}).returning({id:k.hG.id});if(!g)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/settings"),cT({id:g.id})}catch(a){return console.error("[createLlmKeyAction]",a),cU("db_error","Failed to create LLM provider")}}async function ey(a){try{let b=await cV(),c=et.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,provider:f,baseUrl:g,apiKey:h,nickname:i,defaultModel:j,isActive:l}=c.data,m=(0,y.Lf)(),[n]=await m.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,d),(0,k.eq)(k.hG.entityId,b.entityId)));if(!n)return cU("not_found","LLM provider not found");let o={provider:f,baseUrl:g,nickname:i,defaultModel:j,isActive:l,updatedAt:new Date};return h&&h.length>0&&(o.apiKey=(0,w.w)(h),o.apiKeyLast4=(0,w.nK)(h)),await m.update(k.hG).set(o).where((0,k.eq)(k.hG.id,d)),(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[updateLlmKeyAction]",a),cU("db_error","Failed to update LLM provider")}}async function ez(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid LLM provider id");let c=(0,y.Lf)(),[d]=await c.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,a),(0,k.eq)(k.hG.entityId,b.entityId)));if(!d)return cU("not_found","LLM provider not found");return await c.delete(k.hG).where((0,k.eq)(k.hG.id,a)),(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[deleteLlmKeyAction]",a),cU("db_error","Failed to delete LLM provider")}}async function eA(a){let b;try{let c=await cV(),d=eu.safeParse(a);if(!d.success)return cU("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,y.Lf)(),[e]=await a.select({apiKey:k.hG.apiKey}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,d.data.keyId),(0,k.eq)(k.hG.entityId,c.entityId)));if(!e)return cU("not_found","LLM provider not found");b=e.apiKey?(0,w.Yc)(e.apiKey):void 0}if(d.data.keyId&&(!b||0===b.length))return cU("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],h=(f??"").replace(/\/$/,"")||g.canonicalBase;if(!h)return cU("validation_failed",`baseUrl is required for ${e}`);let i={Accept:"application/json"},j=`${h}${g.path}`;"bearer"===g.auth&&b&&(i.Authorization=`Bearer ${b}`),"x-api-key"===g.auth&&b&&(i["x-api-key"]=b,i["anthropic-version"]="2023-06-01"),"query"===g.auth&&(j=`${j}?key=${encodeURIComponent(b??"")}`);let l=await fetch(j,{method:"GET",headers:i});if(!l.ok){let a=(await l.text().catch(()=>"")).slice(0,200);return cU("connection_failed",ev(`${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 cT({message:null!==m?`Connected, ${m} models available`:"Connected"})}catch(a){return cU("connection_failed",ev(a instanceof Error?a.message:"Unknown error",b))}}async function eB(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({id:k.tK.id,slug:k.tK.slug,name:k.tK.name,credentialId:k.tK.credentialId,active:k.tK.active}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.entityId,b.entityId),(0,k.eq)(k.tK.active,!0)));if(0===e.length)return cT([]);let f=[...new Set(e.map(a=>a.credentialId).filter(a=>null!==a))],h=new Map;if(f.length>0)for(let a of(await c.select({id:k.z3.id,name:k.z3.name}).from(k.z3).where((0,k.RV)(k.z3.id,f))))h.set(a.id,a.name);let i=await c.select({connectorId:k.XT.connectorId,enabledOperations:k.XT.enabledOperations}).from(k.XT).where((0,k.eq)(k.XT.agentId,a)),j=new Map;for(let a of i)j.set(a.connectorId,{enabledOperations:a.enabledOperations??null});let l=[];for(let a of e){let b=cR[a.slug];if(!b)continue;let c=j.get(a.id);l.push({connectorId:a.id,slug:a.slug,label:a.name,credentialName:a.credentialId?h.get(a.credentialId)??null:null,assigned:void 0!==c,enabledOperations:c?.enabledOperations??null,availableOperations:b.operations})}return cT(l)}catch(a){return console.error("[listAgentConnectorsAction]",a),cU("db_error","Failed to load agent connectors")}}async function eC(a,b,c,d){try{let f=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid connector id");let h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,f.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await h.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,b),(0,k.eq)(k.tK.entityId,f.entityId)));if(!j)return cU("not_found","Connector not found");return c?await h.insert(k.XT).values({agentId:a,connectorId:b,entityId:f.entityId,enabledOperations:d??null}).onConflictDoUpdate({target:[k.XT.agentId,k.XT.connectorId],set:{enabledOperations:d??null,updatedAt:new Date}}):await h.delete(k.XT).where((0,k.Uo)((0,k.eq)(k.XT.agentId,a),(0,k.eq)(k.XT.connectorId,b))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[setAgentConnectorAssignmentAction]",a),cU("db_error","Failed to update connector assignment")}}async function eD(){try{let a=await cV(),b=(0,y.Lf)(),[c]=await b.select({rootAgentId:k.O5.rootAgentId,rootGrants:k.O5.rootGrants}).from(k.O5).where((0,k.eq)(k.O5.id,a.entityId));if(!c)return cU("not_found","Workspace not found");return cT({rootAgentId:c.rootAgentId??null,grants:(0,r.DI)(c.rootGrants)})}catch(a){return console.error("[getRootConfigAction]",a),cU("db_error","Failed to load ROOT agent config")}}let eE=g.Ik({grants:g.Ik({createAgent:g.zM(),createSkill:g.zM(),updateSkill:g.zM(),assignSkill:g.zM(),createMcp:g.zM(),createConnector:g.zM(),autonomy:g.k5(["propose_confirm","destructive_gate","fully_autonomous"])})});async function eF(a){try{let b=await cV(),c=eE.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{grants:d}=c.data,f=(0,y.Lf)(),[g]=await f.select({role:k.V.role}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,b.entityId)));if(!g)return cU("not_found","Workspace not found");let[h]=await f.select({rootAgentId:k.O5.rootAgentId}).from(k.O5).where((0,k.eq)(k.O5.id,b.entityId)),i=h?.rootAgentId??null;if(!i)return cU("not_found","No ROOT agent yet — create an orchestrator first");if(await f.update(k.O5).set({rootGrants:d,updatedAt:new Date}).where((0,k.eq)(k.O5.id,b.entityId)),await f.delete(k.bN).where((0,k.Uo)((0,k.eq)(k.bN.entityId,b.entityId),(0,k.RV)(k.bN.toolName,r.yO))),"propose_confirm"===d.autonomy){let a=(0,r.aT)(d);a.length>0&&await f.insert(k.bN).values(a.map(a=>({entityId:b.entityId,agentId:i,toolName:a,action:"require_approval"})))}return(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[setRootAgentAction]",a),cU("db_error","Failed to save ROOT agent config")}}async function eG(a,b){let[c]=await a.select({rootAgentId:k.O5.rootAgentId}).from(k.O5).where((0,k.eq)(k.O5.id,b)).limit(1),d=c?.rootAgentId??null;if(!d)return{rootAgentId:null,rootName:null};let[e]=await a.select({name:k.X6.name}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d),(0,k.eq)(k.X6.entityId,b))).limit(1);return{rootAgentId:d,rootName:e?.name??null}}async function eH(){try{let a=await cV(),b=(0,y.Lf)(),{rootAgentId:c,rootName:d}=await eG(b,a.entityId);if(!c)return cT({rootAgentId:null,rootName:null,conversations:[]});let e=await b.select({id:k.NP.id,title:k.NP.title,updatedAt:k.NP.updatedAt}).from(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.entityId,a.entityId),(0,k.eq)(k.NP.agentId,c))).orderBy((0,k.i8)(k.NP.updatedAt)).limit(200),f=e.map(a=>a.id),g=new Map;if(f.length>0)for(let a of(await b.select({conversationId:k.p$.conversationId,content:k.p$.content}).from(k.p$).where((0,k.RV)(k.p$.conversationId,f)).orderBy((0,k.i8)(k.p$.createdAt)).limit(1e3)))a.conversationId&&!g.has(a.conversationId)&&g.set(a.conversationId,a.content);let h=e.map(a=>({id:a.id,title:a.title,preview:g.get(a.id)??"",updatedAt:a.updatedAt}));return cT({rootAgentId:c,rootName:d,conversations:h})}catch(a){return console.error("[listConversationsAction]",a),cU("db_error","Failed to load conversations")}}async function eI(){try{let a=await cV(),b=(0,y.Lf)(),{rootAgentId:c}=await eG(b,a.entityId);if(!c)return cU("no_root_agent","Designate a ROOT agent in Settings first.");let[d]=await b.insert(k.NP).values({entityId:a.entityId,agentId:c,title:""}).returning({id:k.NP.id});if(!d)return cU("db_error","Failed to create conversation");return(0,e.revalidatePath)("/chat"),cT({id:d.id})}catch(a){return console.error("[createConversationAction]",a),cU("db_error","Failed to create conversation")}}async function eJ(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid conversation id");let c=(0,y.Lf)();return await c.delete(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.id,a),(0,k.eq)(k.NP.entityId,b.entityId))),(0,e.revalidatePath)("/chat"),cT(void 0)}catch(a){return console.error("[deleteConversationAction]",a),cU("db_error","Failed to delete conversation")}}async function eK(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid conversation id");let c=(0,y.Lf)(),[d]=await c.select({id:k.NP.id}).from(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.id,a),(0,k.eq)(k.NP.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Conversation not found");let e=(await c.select({id:k.p$.id,role:k.p$.role,content:k.p$.content,jobId:k.p$.jobId}).from(k.p$).where((0,k.eq)(k.p$.conversationId,a)).orderBy(k.p$.createdAt).limit(500)).map(a=>({id:a.id,role:a.role,content:a.content,jobId:a.jobId}));return cT({messages:e})}catch(a){return console.error("[listChatAction]",a),cU("db_error","Failed to load chat")}}let eL=g.Ik({conversationId:g.Yj().guid(),message:g.Yj().min(1,"Message is empty").max(1e4)});async function eM(a){try{let b,c=await cV(),d=eL.safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),{rootAgentId:g}=await eG(f,c.entityId);if(!g)return cU("no_root_agent","Designate a ROOT agent in Settings first.");if(!A._.WORKER_SECRET)return console.error("[sendChatMessageAction] WORKER_SECRET missing — cannot reach runner"),cU("runner_unreachable","Chat backend not configured");try{b=await fetch(`${A._.RUNNER_URL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({entityId:c.entityId,agentId:g,conversationId:d.data.conversationId,message:d.data.message})})}catch(a){return console.error("[sendChatMessageAction] runner unreachable:",a),cU("runner_unreachable","Could not reach the chat backend")}let h=await b.json().catch(()=>null);if(!b.ok)return cU("chat_failed",h?.error??"The agent did not reply");return(0,e.revalidatePath)("/chat"),cT({reply:h?.reply??""})}catch(a){return console.error("[sendChatMessageAction]",a),cU("db_error","Failed to send message")}}async function eN(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status,result:k.ME.result}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Job not found");let e=(await c.select({agentName:k.X6.name,agentSlug:k.X6.slug,status:k.ME.status}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.parentJobId,a)).orderBy(k.ME.createdAt)).map(a=>({agentName:a.agentName??a.agentSlug??"agent",status:a.status??"pending"}));return cT({status:d.status??"pending",result:d.result,children:e})}catch(a){return console.error("[getChatJobStatusAction]",a),cU("db_error","Failed to load job status")}}(0,cS.D)([cW,cX,cY,cZ,c$,c1,c2,c3,c4,c5,c8,c9,da,db,df,dg,dh,di,dj,dk,dl,dm,dp,dr,ds,dt,dv,dw,dx,dy,dz,dB,dC,dD,dF,dG,dH,dI,dK,dL,dM,dN,dO,dP,dQ,dR,dS,dU,dV,dX,dY,d$,d_,d1,d2,d3,d4,d6,d7,d8,d9,ea,eb,ec,ee,eg,eh,ei,ej,ek,em,en,ep,ew,ex,ey,ez,eA,eB,eC,eD,eF,eH,eI,eJ,eK,eM,eN]),(0,d.A)(cW,"0084f63ef73f435b2007accf0422179acceea48592",null),(0,d.A)(cX,"403bb1ee1ebccfe31796e8dbb09ba2df20a7c75954",null),(0,d.A)(cY,"40d8da31102656fc9b5d58fd2f5ced751df510c2da",null),(0,d.A)(cZ,"408f6fc0ba87c1feb27002160ffd70c73c5b0cc7e8",null),(0,d.A)(c$,"40d65fc19eb775becd6b606cf29b6f0b3a42be75b3",null),(0,d.A)(c1,"00df788bf405e8799c99e537ea1a36e1d49a020ede",null),(0,d.A)(c2,"00a5044de503b527347d64dce87466cae023e3bbe3",null),(0,d.A)(c3,"40488611ba2a96bd35ff9725f67ef3343be8ccfd0a",null),(0,d.A)(c4,"40d50b9f81b76747b3ca6a86de461e195736cd06f3",null),(0,d.A)(c5,"40453bfa7d5bf312e3c4e8d133a4264cb39154c9b5",null),(0,d.A)(c8,"40b91cb5f80f8b354f7aae7cb770ab28355bb195a1",null),(0,d.A)(c9,"401343decc430a309e6c0db2ea3f9a1137d4479ebf",null),(0,d.A)(da,"708302376a2abcc3024968ac93b059a363a0bffcc5",null),(0,d.A)(db,"404ca955ea9c8e10b8bf9819b993fb310f53cd1a22",null),(0,d.A)(df,"70cad440661d25bbe9fb3b0e0825dc58845a5b0563",null),(0,d.A)(dg,"60b0f92b15e2bce30372a5a4fe9186bbb21beeadf9",null),(0,d.A)(dh,"70683c3f2187b3d2d1cc8255c499019bc9ac565083",null),(0,d.A)(di,"408ff15edd6e18c8cc6b1a5b2ec5ace9b5abef833c",null),(0,d.A)(dj,"40fd03681306f3c6c87d80191fbad10873758c2d9c",null),(0,d.A)(dk,"405316fb76464cc483e24ae7879f63fea63497399a",null),(0,d.A)(dl,"40cb820d86a7d3d99b8fa2b9f2c116240092d4dc54",null),(0,d.A)(dm,"40a36d3357edee2849f746572f47aedc925cf9b481",null),(0,d.A)(dp,"40f1ddac9d72aa9228da42f48696c36ebaaf366593",null),(0,d.A)(dr,"4027d5dd910a392a3b49bca21465c94f2b303b0352",null),(0,d.A)(ds,"40e2309cdc91ebd9cc8a80c43206fcb2e5dca79d86",null),(0,d.A)(dt,"406ed17e876a0d07984c87510ba0ceeb673c631d14",null),(0,d.A)(dv,"408a4a5eca1b61352208f88f33624a52de9ad68943",null),(0,d.A)(dw,"40db2e4391256b22c8d2f09545892baefd50583fd1",null),(0,d.A)(dx,"40a2ca1fd8269620d1e1918f7a811c01d60ecd0bb8",null),(0,d.A)(dy,"40ae9b355081cc7f127ff628084007d32ab2b8381d",null),(0,d.A)(dz,"000630c4785cc9b9a9179c59166d9dc56d4050af16",null),(0,d.A)(dB,"406875eb3f00a0ba9f26dabf20e77f451814a1940c",null),(0,d.A)(dC,"4016bd2194de8ad4d285f60a69f4abef89a3dbbd76",null),(0,d.A)(dD,"00ef103273241494a4a12cae5a9abb90b75cfd5ed9",null),(0,d.A)(dF,"40e18bfbff4b875c8d29e079a020a810b38d99cb71",null),(0,d.A)(dG,"607c98f74b75d18aa53a99629edf2e6e576f729324",null),(0,d.A)(dH,"6017395a3968d5058732a648947e2f27f84cfcd8d2",null),(0,d.A)(dI,"402314f68beed470a45dbe5c37a7c2a5f61ee2dc73",null),(0,d.A)(dK,"60eea9ef883dadfeb940ba8ee599bba4925a33ee2a",null),(0,d.A)(dL,"407a7214749c3358de796cb2badad0665d9af32c72",null),(0,d.A)(dM,"40ec30cef6725be1ebac42e67db9eec85c37531cbe",null),(0,d.A)(dN,"78619f4898ba05ed272de74c8fb2cc062a366d3d54",null),(0,d.A)(dO,"60b0c0d47be775d92a11b8a6055b749e2200cda59e",null),(0,d.A)(dP,"7008018bbbf2eabcbe95fbbec45e04b6d5c8904bc7",null),(0,d.A)(dQ,"60fbd31eee127dc2ea2fa6bf08340a640be7bfab17",null),(0,d.A)(dR,"60c247330d99365c4e3509f6237e420a3e72cec0c3",null),(0,d.A)(dS,"40d9ba17dd7c6526e2c8dc43022ffbc92efae613d4",null),(0,d.A)(dU,"40431a9f8a485eb663c4019bd0e804d54a3a80250f",null),(0,d.A)(dV,"0090b1aef5e108e10847d33a828dbdf74b4018ec8f",null),(0,d.A)(dX,"4047e8e76b17226ec601aa99d96b531cba470719d6",null),(0,d.A)(dY,"405207ae2a76e2cb5528629c6ddbdf666901d4b0d1",null),(0,d.A)(d$,"4089841693c0ec31c4a8ca3bc72b92d0feb3b40e81",null),(0,d.A)(d_,"40fa8e6fc8dde21e0d5dae0188c6a7ee18daec2572",null),(0,d.A)(d1,"400c6c9396844cad6ec13b91c9327c89b494dc9706",null),(0,d.A)(d2,"40d4abb6ed01c1de9b714e5d525c729e339bf82328",null),(0,d.A)(d3,"403f0bc71d98bd2e58ba42f9fc41254ea1b9983ff5",null),(0,d.A)(d4,"40ecbe02a0ddc631c351730d96272d610d29b8de73",null),(0,d.A)(d6,"40e75db8b3f836b8bc19d2384d907da0ff8b76db75",null),(0,d.A)(d7,"00f0ddfbba74329da49d815a0cede014c09859727a",null),(0,d.A)(d8,"003754b39863ec6d05efab89ed2b184b64f04a7ec1",null),(0,d.A)(d9,"002ffb2060c79d8686a31016572fba043816c7d1d5",null),(0,d.A)(ea,"00afbd341c4eea987f6f392db2b88b4411562c066f",null),(0,d.A)(eb,"006f66bb2860c0fd38fc8437dd46b190f6199e3819",null),(0,d.A)(ec,"00135baec3caf8b0fd97b05411d93af24eddc96740",null),(0,d.A)(ee,"4039fb20ecb664c70e975c9747cc0331e90aba53fb",null),(0,d.A)(eg,"4060b38c6c5ad5bfbb75f19f465d04596bc9457732",null),(0,d.A)(eh,"40717fe7600a0d142686c303feab2a815606861b11",null),(0,d.A)(ei,"4068885c0c5e52ff24b5fa18894a2a9ffaf8cf3e24",null),(0,d.A)(ej,"4085755af1fc677835d5c52633bb7bc2cc9db08f9e",null),(0,d.A)(ek,"00e9d28f6126fcc46f86252005e25784e8ad63e59a",null),(0,d.A)(em,"40cc2127c29e7db73c43a58f1fc04c698a275f5e99",null),(0,d.A)(en,"00f3d51402e454a41674b6071c71fc3fe19c94e3dd",null),(0,d.A)(ep,"40b2b21ebb9dd4b5fb0560e0bfe60441ed643801fa",null),(0,d.A)(ew,"007540b21e253e98970f6aca169ea464608a196a8b",null),(0,d.A)(ex,"407be2fde214b14b4e6177dee72e078c42b086c5a1",null),(0,d.A)(ey,"40f8f7a1539f3a7c1ca719d613dde2ac2af2b3a4fd",null),(0,d.A)(ez,"40dddaaff0f6076ec9439c1ee384188590b0b30cb6",null),(0,d.A)(eA,"406ed5c486a62b2f3f0fa97b040d753368d49496a5",null),(0,d.A)(eB,"4046922781ce544c372a256dcd2777f74b6179a41b",null),(0,d.A)(eC,"789be0082b853a6fca844b1de5f9251d626c79ffcb",null),(0,d.A)(eD,"0066999f27b17f9f98163f7b3cca0a6ad5c83073af",null),(0,d.A)(eF,"4037166c8d79e5b9e1ad9c7d8c9d729890d3879291",null),(0,d.A)(eH,"0098706c6c04cfd1036f32a6e925af4ea6f19bc716",null),(0,d.A)(eI,"007d099b698d58754437d8d60970cfaf89b6c4780b",null),(0,d.A)(eJ,"4005e49b992467d04a44de54d335143d77a196c679",null),(0,d.A)(eK,"4045e87765f679eee178fed243e52d3a6ce332e2b5",null),(0,d.A)(eM,"400531284d09d57b1cd573b43d9c8f355aadd5e78f",null),(0,d.A)(eN,"40a37916fe9b32e07727d6c495f48e0e21cbe71d44",null)},7316:(a,b,c)=>{Promise.resolve().then(c.bind(c,55053))},17030:(a,b,c)=>{"use strict";c.d(b,{Y:()=>d.YT});var d=c(94621)},19259:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,67448,23)),Promise.resolve().then(c.t.bind(c,2667,23)),Promise.resolve().then(c.t.bind(c,10903,23)),Promise.resolve().then(c.t.bind(c,11162,23)),Promise.resolve().then(c.t.bind(c,23838,23)),Promise.resolve().then(c.t.bind(c,83466,23)),Promise.resolve().then(c.t.bind(c,12127,23)),Promise.resolve().then(c.bind(c,26698))},28659:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(64565),f=c(44625);function g(){let[a,b]=(0,e.useState)(!1);async function c(){b(!0);try{let a=await fetch("/api/auth/sign-out",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}",credentials:"same-origin"});a.ok||console.error("sign-out failed",a.status,await a.text().catch(()=>""))}catch(a){console.error("sign-out network error",a)}window.location.replace("/login")}return(0,d.jsx)("button",{type:"button",onClick:c,disabled:a,"data-testid":"user-menu-sign-out","aria-label":"Sign out",title:"Sign out",className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-ink-3 transition-colors hover:bg-hover hover:text-ink disabled:cursor-not-allowed disabled:opacity-40",children:(0,d.jsx)(f.M,{size:15})})}},36105:()=>{},38680:(a,b,c)=>{"use strict";c.d(b,{O:()=>e});var d=c(47092);let e=(0,d.createServerReference)("403bb1ee1ebccfe31796e8dbb09ba2df20a7c75954",d.callServer,void 0,d.findSourceMapURL,"createWorkspaceAction")},42705:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>D});var d=c(99386),e=c(66402),f=c(95809),g=c(42112),h=c(62952),i=c(81590),j=c(35675),k=c(90454),l=c(95488),m=c(75224),n=c(97173);async function o(){let a=m._.AUTH_MODE;if("local-trust"===a)return(0,d.jsx)(q,{icon:(0,d.jsx)(i.o,{size:13,weight:"fill"}),label:"Local trust",hint:"No auth — single-user install"});if("bearer-token"===a)return(0,d.jsx)(q,{icon:(0,d.jsx)(i.o,{size:13,weight:"fill"}),label:"API token"});let b=await p();return b?(0,d.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-rule-2 bg-paper px-2.5 py-2",children:[(0,d.jsx)("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-hover text-ink-3",children:(0,d.jsx)(j.K,{size:13,weight:"fill"})}),(0,d.jsx)("div",{className:"min-w-0 flex-1","data-testid":"user-menu-email",children:(0,d.jsx)("p",{className:"truncate text-xs font-medium text-ink",title:b,children:b})}),(0,d.jsx)(n.default,{})]}):null}async function p(){try{let a=await (0,e.headers)(),b=new Request("http://localhost/",{headers:a}),c=await (0,l.sj)(b),d=await (0,l.Lf)().select({email:k.VV.email}).from(k.VV).where((0,k.eq)(k.VV.id,c.userId)).limit(1);return d[0]?.email??null}catch{return null}}function q({icon:a,label:b,hint:c}){return(0,d.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-rule-2 bg-paper px-2.5 py-2",children:[(0,d.jsx)("div",{className:"shrink-0 text-ok",children:a}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("p",{className:"text-xs font-medium leading-tight text-ink",children:b}),c&&(0,d.jsx)("p",{className:"mt-0.5 truncate text-[10px] text-ink-3",children:c})]})]})}var r=c(13579),s=c(36937),t=c(92002);function u({children:a,badge:b,size:c="md",className:e="",type:f="button",...g}){return(0,d.jsxs)("button",{type:f,className:`relative flex shrink-0 items-center justify-center border border-rule-2 bg-paper text-ink-2 transition-colors hover:text-ink ${"md"===c?"h-[34px] w-[34px] rounded-md":"h-[30px] w-[30px] rounded-[7px]"} ${e}`,...g,children:[a,b&&(0,d.jsx)("span",{className:"absolute top-[6px] right-[7px] h-1.5 w-1.5 rounded-full bg-skill-vivid"})]})}var v=c(88866),w=c(85598),x=c.n(w);let y={ink:"bg-ink text-canvas hover:brightness-[0.92]",coral:"bg-skill-vivid text-white hover:brightness-[0.94]",blue:"bg-conn-vivid text-white hover:brightness-[0.94]"};function z(a){let{children:b,variant:c="ink",size:e="md",className:f=""}=a,g=`inline-flex items-center justify-center gap-1.5 rounded-md font-medium leading-none border-0 cursor-pointer transition-[filter] ${"md"===e?"h-[34px] px-3.5 text-[13px]":"h-[30px] px-3 text-[12px]"} ${y[c]} ${f}`;if("href"in a&&a.href){let{href:c,variant:e,size:f,className:h,children:i,...j}=a;return(0,d.jsx)(x(),{href:c,className:g,...j,children:b})}let{variant:h,size:i,className:j,children:k,...l}=a;return(0,d.jsx)("button",{type:"button",className:g,...l,children:b})}function A({left:a,primaryHref:b="/agents",primaryLabel:c="New agent",showPrimary:e=!0,showSearch:f=!0}){return(0,d.jsxs)("div",{className:"flex h-[52px] shrink-0 items-center gap-2 px-4 md:gap-2.5 md:px-9",children:[a,(0,d.jsx)("div",{className:"flex-1"}),f&&(0,d.jsx)(t.default,{className:"hidden md:flex"}),(0,d.jsx)(u,{"aria-label":"Notifications",title:"Notifications",badge:!0,children:(0,d.jsx)(r.I,{size:15})}),(0,d.jsx)(v.default,{}),e&&(0,d.jsxs)(z,{variant:"ink",href:b,"aria-label":c,title:c,children:[(0,d.jsx)(s.F,{size:13,weight:"bold"}),(0,d.jsx)("span",{className:"hidden md:inline",children:c})]})]})}var B=c(93690),C=c(5786);async function D({children:a}){try{let a=await (0,e.headers)(),b=new Request("http://localhost/",{headers:a});await (0,l.sj)(b)}catch(a){throw a instanceof g.lR&&(0,f.redirect)("/login"),a instanceof g.vB&&(0,f.redirect)("/onboarding"),a}let b=[],c=await (0,C.zh)();return c.ok&&(b=c.data),(0,d.jsxs)("div",{className:"flex min-h-screen bg-canvas text-ink",children:[(0,d.jsx)(h.default,{workspaces:b,userMenu:(0,d.jsx)(o,{})}),(0,d.jsxs)("main",{className:"flex min-w-0 flex-1 flex-col pt-[58px] lg:ml-[220px] lg:pt-0",children:[(0,d.jsx)(A,{}),(0,d.jsx)("div",{className:"flex-1 overflow-x-hidden",children:(0,d.jsx)("div",{className:"max-w-6xl px-5 pb-10 sm:px-8 lg:px-9",children:a})})]}),(0,d.jsx)(B.default,{})]})}},43136:(a,b,c)=>{"use strict";c.d(b,{default:()=>h});var d=c(10476),e=c(64565),f=c(62515),g=c(2447);function h(){let[a,b]=(0,e.useState)("light"),[c,h]=(0,e.useState)(!1),i="dark"===a?f.b:g.A,j="dark"===a?"Switch to light theme":"Switch to dark theme";return(0,d.jsx)("button",{type:"button",onClick:()=>{let c="dark"===a?"light":"dark";document.documentElement.setAttribute("data-theme",c);try{localStorage.setItem("nodal.theme",c)}catch{}b(c)},"aria-label":j,title:j,className:"flex h-[34px] w-[34px] items-center justify-center rounded-md border border-rule-2 bg-paper text-ink-2 transition-colors hover:text-ink",suppressHydrationWarning:!0,children:c?(0,d.jsx)(i,{size:15}):(0,d.jsx)(g.A,{size:15})})}},43828:(a,b,c)=>{Promise.resolve().then(c.bind(c,86688)),Promise.resolve().then(c.bind(c,28659)),Promise.resolve().then(c.bind(c,3808)),Promise.resolve().then(c.bind(c,57712)),Promise.resolve().then(c.bind(c,43136)),Promise.resolve().then(c.t.bind(c,88831,23))},44100:(a,b,c)=>{"use strict";c.d(b,{A:()=>g});var d=c(10476);let e={ok:"bg-ok",lime:"bg-agent-vivid",coral:"bg-skill-vivid",blue:"bg-conn-vivid"},f={ok:"animate-[blip_1.4s_ease-out_infinite]",lime:"animate-[blip-lime_1.5s_ease-out_infinite]",coral:"animate-[blip-coral_1.4s_ease-out_infinite]",blue:"animate-[blip-blue_1.4s_ease-out_infinite]"};function g({variant:a="ok",size:b="sm",animate:c=!0,className:h=""}){return(0,d.jsx)("span",{className:`inline-block shrink-0 rounded-full ${"sm"===b?"h-[7px] w-[7px]":"h-2 w-2"} ${e[a]} ${c?f[a]:""} ${h}`})}},49269:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(99386),e=c(85598),f=c.n(e);function g(){return(0,d.jsx)("div",{className:"flex min-h-screen w-full items-center justify-center bg-canvas px-4",children:(0,d.jsxs)("div",{className:"text-center space-y-4",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold text-ink",children:"404 — Page not found"}),(0,d.jsx)("p",{className:"text-sm text-ink-3",children:"This page doesn't exist."}),(0,d.jsx)(f(),{href:"/",className:"inline-block rounded-lg bg-agent-vivid text-canvas px-4 py-2 text-sm font-semibold hover:bg-agent-vivid transition-colors",children:"Go to dashboard"})]})})}},54580:(a,b,c)=>{Promise.resolve().then(c.bind(c,84327))},54620:()=>{},54792:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,61186,23)),Promise.resolve().then(c.t.bind(c,6621,23)),Promise.resolve().then(c.t.bind(c,41837,23)),Promise.resolve().then(c.t.bind(c,85060,23)),Promise.resolve().then(c.t.bind(c,43484,23)),Promise.resolve().then(c.t.bind(c,8376,23)),Promise.resolve().then(c.t.bind(c,74625,23)),Promise.resolve().then(c.t.bind(c,51080,23))},55053:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(10476);function e({error:a,reset:b}){return(0,d.jsx)("div",{className:"flex min-h-screen w-full items-center justify-center bg-canvas px-4",children:(0,d.jsxs)("div",{className:"text-center space-y-4",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold text-ink",children:"Something went wrong"}),(0,d.jsx)("p",{className:"text-sm text-ink-3",children:a.message}),(0,d.jsx)("button",{onClick:b,className:"rounded-lg bg-agent-vivid text-canvas px-4 py-2 text-sm font-semibold hover:bg-agent-vivid transition-colors",children:"Try again"})]})})}c(64565)},57712:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(64565),f=c(48082);function g(){let[a,b]=(0,e.useState)("light");return(0,d.jsx)(f.l$,{theme:a,position:"bottom-right",richColors:!0,closeButton:!0})}},57812:(a,b,c)=>{"use strict";c.d(b,{W:()=>e});var d=c(47092);let e=(0,d.createServerReference)("40d8da31102656fc9b5d58fd2f5ced751df510c2da",d.callServer,void 0,d.findSourceMapURL,"switchWorkspaceAction")},59166:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,88831,23))},59234:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,61186,23))},62952:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\Sidebar.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\Sidebar.tsx","default")},63894:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,16385,23))},69679:(a,b,c)=>{"use strict";c.d(b,{A:()=>f,S:()=>e});var d=c(10476);let e=["\uD83D\uDDC2️","\uD83C\uDFE0","\uD83D\uDCBC","\uD83D\uDE80","\uD83E\uDDEA","\uD83C\uDFA8","\uD83D\uDCCA","\uD83D\uDEE0️","\uD83C\uDF10","⚡","\uD83E\uDD16","\uD83D\uDCE6"];function f({value:a,onChange:b,disabled:c}){return(0,d.jsx)("div",{className:"flex flex-wrap gap-1",children:e.map(e=>{let f=a===e;return(0,d.jsx)("button",{type:"button",disabled:c,"aria-pressed":f,onClick:()=>b(e),className:`flex h-8 w-8 items-center justify-center rounded-md border text-[15px] leading-none transition-colors disabled:opacity-50 ${f?"border-ink bg-hover-2":"border-rule-2 hover:bg-hover"}`,children:e},e)})})}},70615:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>j,metadata:()=>i});var d=c(99386),e=c(50277),f=c.n(e),g=c(80356),h=c.n(g);c(54620);let i={title:"Nodal-Agents",description:"Multi-agent platform"};function j({children:a}){return(0,d.jsxs)("html",{lang:"en",className:`${f().variable} ${h().variable}`,suppressHydrationWarning:!0,children:[(0,d.jsx)("head",{children:(0,d.jsx)("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('nodal.theme');if(t!=='dark'&&t!=='light')t='light';document.documentElement.setAttribute('data-theme',t);}catch(e){document.documentElement.setAttribute('data-theme','light');}})();"}})}),(0,d.jsx)("body",{children:a})]})}},70953:()=>{},77386:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,67448,23))},84327:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\app\\\\error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\app\\error.tsx","default")},86688:(a,b,c)=>{"use strict";c.d(b,{default:()=>Q});var d=c(10476),e=c(64565),f=c(12418),g=c(77568),h=c(3521),i=c(82271),j=c(13028),k=c(83588),l=c(92607),m=c(1282),n=c(73836),o=c(11145),p=c(66442),q=c(63473),r=c(84132),s=c(64945),t=c(8161),u=c(55234),v=c(11745),w=c(93720);function x(){return(0,d.jsx)("div",{className:"px-4 pb-3.5",children:(0,d.jsxs)("div",{className:"flex items-center gap-2 text-[16px] font-medium leading-none tracking-[-0.005em] text-ink",children:[(0,d.jsx)("span",{className:"flex h-[22px] w-[22px] items-center justify-center rounded-md bg-ink text-[11px] font-semibold leading-none tracking-[0.04em] text-canvas font-mono",children:"N"}),(0,d.jsx)("span",{children:"Nodal-Agents"})]})})}function y({children:a}){return(0,d.jsx)("div",{className:"px-3.5 pt-3.5 pb-1 font-mono text-[9.5px] uppercase tracking-[0.14em] text-ink-4",children:a})}var z=c(88831),A=c.n(z);let B={agent:"bg-agent-vivid",skill:"bg-skill-vivid",conn:"bg-conn-vivid"};function C({href:a,label:b,icon:c,dot:e,count:g,isActive:h}){let i=(0,f.usePathname)(),j=h??(i===a||i.startsWith(a+"/"));return(0,d.jsxs)(A(),{href:a,className:`group mx-2 flex h-[30px] items-center gap-2.5 rounded-lg px-2.5 text-[12.5px] leading-none transition-colors ${j?"bg-paper text-ink font-medium shadow-[0_1px_2px_rgba(0,0,0,0.04)]":"text-ink-2 hover:bg-hover"}`,children:[e?(0,d.jsx)("span",{className:`h-2 w-2 shrink-0 rounded-full ${B[e]}`}):(0,d.jsx)("span",{className:`flex h-3.5 w-3.5 shrink-0 items-center justify-center ${j?"text-ink":"text-ink-3 group-hover:text-ink-2"}`,children:c}),(0,d.jsx)("span",{className:"flex-1 truncate",children:b}),void 0!==g&&(0,d.jsx)("span",{className:"font-mono text-[10px] tracking-[0.02em] text-ink-4",children:g})]})}var D=c(44100);function E({runningAgents:a,throughput:b,fill:c=.36}){if(void 0===a)return null;let e=100*Math.max(0,Math.min(1,c));return(0,d.jsxs)("div",{className:"mx-3 mt-2.5 rounded-[10px] border border-rule-2 bg-paper px-3 pt-2.5 pb-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5 font-mono text-[9.5px] uppercase leading-none tracking-[0.14em] text-ink-3",children:[(0,d.jsx)(D.A,{variant:"lime"}),"Live"]}),(0,d.jsxs)("div",{className:"mt-1.5 text-[12.5px] leading-[1.35] text-ink-2",children:[(0,d.jsxs)("b",{className:"font-semibold text-ink",children:[a," agents"]}),b?` running \xb7 ${b}`:" running"]}),(0,d.jsx)("div",{className:"mt-2.5 h-[3px] overflow-hidden rounded-[2px] bg-black/[0.06] dark:bg-white/[0.06]",children:(0,d.jsx)("i",{className:"block h-full bg-agent-vivid",style:{width:`${e}%`}})})]})}var F=c(48082),G=c(23586),H=c(42199);function I({fleets:a,activeId:b,disabled:c,onChange:f,onNewWorkspace:g}){let[h,i]=(0,e.useState)(!1),j=(0,e.useRef)(null),k=a.find(a=>a.id===b)??a[0];return k?(0,d.jsxs)("div",{ref:j,className:"relative mx-3.5 mt-3.5 mb-1",children:[(0,d.jsxs)("button",{type:"button",onClick:()=>!c&&i(a=>!a),"aria-haspopup":"listbox","aria-expanded":h,"aria-disabled":c||void 0,className:`flex h-[38px] w-full items-center gap-2.5 rounded-[9px] border border-rule-2 bg-paper px-2.5 text-[13px] leading-none text-ink ${c?"cursor-default":"cursor-pointer hover:bg-hover-2/40"}`,children:[(0,d.jsx)("span",{className:"flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-[5px] font-mono text-[10.5px] font-semibold leading-none tracking-[0.04em] text-[#0a0a0a]",style:{background:k.color},children:k.icon??k.tag.slice(0,2)}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate text-left text-[12.5px] font-medium text-ink",children:k.name}),!c&&(0,d.jsx)(G.a,{size:12,className:"shrink-0 text-ink-3"})]}),h&&!c&&(0,d.jsxs)("div",{role:"listbox",className:"absolute inset-x-0 top-[calc(100%+6px)] z-30 rounded-[9px] border border-rule-2 bg-paper p-1.5 shadow-[0_12px_32px_rgba(0,0,0,0.10)]",children:[a.map(a=>{let c=a.id===b;return(0,d.jsxs)("div",{role:"option","aria-selected":c,onClick:()=>{f?.(a.id),i(!1)},className:`flex cursor-pointer items-center gap-2.5 rounded-md px-2 py-1.5 text-[12.5px] leading-[1.2] text-ink-2 hover:bg-hover ${c?"bg-hover-2":""}`,children:[(0,d.jsx)("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center rounded-[5px] font-mono text-[10px] font-semibold leading-none tracking-[0.04em] text-[#0a0a0a]",style:{background:a.color},children:a.icon??a.tag.slice(0,2)}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate font-medium text-ink",children:a.name}),(0,d.jsx)(H.J,{size:12,weight:"bold",className:`text-ink ${c?"opacity-100":"opacity-0"}`})]},a.id)}),g&&(0,d.jsxs)("button",{type:"button",onClick:()=>{i(!1),g()},className:"mt-1 flex w-full items-center gap-2 rounded-md border-t border-rule px-2 py-1.5 text-[12px] font-medium text-ink-3 hover:bg-hover hover:text-ink-2 transition-colors",children:[(0,d.jsx)("span",{className:"flex h-4 w-4 items-center justify-center rounded text-[12px] leading-none",children:"+"}),"New workspace"]})]})]}):null}var J=c(69679),K=c(57812),L=c(38680);let M=["#d4ff2e","#74b9ff","#a29bfe","#fd79a8","#55efc4","#fdcb6e","#e17055","#6c5ce7"];function N(a){return{id:a.id,name:a.name,tag:a.name.replace(/[^a-zA-Z0-9]/g,"").slice(0,3).toUpperCase()||"WS",color:function(a){let b=0;for(let c=0;c<a.length;c+=1)b=31*b+a.charCodeAt(c)>>>0;return M[b%M.length]??M[0]}(a.slug),icon:a.icon??void 0}}function O({workspaces:a}){let b=(0,f.useRouter)(),[c,g]=(0,e.useTransition)(),[h,i]=(0,e.useTransition)(),[j,k]=(0,e.useState)(!1),[l,m]=(0,e.useState)(""),[n,o]=(0,e.useState)(J.S[0]),p=(0,e.useRef)(null),q=a.map(N),r=a.find(a=>a.active),s=r?.id??q[0]?.id??"";return(0,d.jsxs)("div",{children:[(0,d.jsx)(I,{fleets:q,activeId:s,onChange:function(a){a===s||c||g(async()=>{let c=await (0,K.W)({id:a});c.ok?b.refresh():F.oR.error(c.message)})},disabled:c||0===q.length,onNewWorkspace:function(){k(!0),m(""),o(J.S[0]),requestAnimationFrame(()=>p.current?.focus())}}),j&&(0,d.jsxs)("form",{onSubmit:function(a){a.preventDefault();let c=l.trim();c&&i(async()=>{let a=await (0,L.O)({name:c,icon:n});if(!a.ok)return void F.oR.error(a.message);let d=await (0,K.W)({id:a.data.id});d.ok?(k(!1),m(""),F.oR.success(`Workspace "${c}" created`),b.refresh()):F.oR.error(d.message)})},className:"mx-3.5 mt-1 rounded-[9px] border border-rule-2 bg-paper p-2.5",children:[(0,d.jsx)("p",{className:"mb-1.5 font-mono text-[10px] uppercase tracking-[0.1em] text-ink-4",children:"New workspace"}),(0,d.jsx)("div",{className:"mb-2",children:(0,d.jsx)(J.A,{value:n,onChange:o,disabled:h})}),(0,d.jsxs)("div",{className:"flex gap-1.5",children:[(0,d.jsx)("input",{ref:p,type:"text",value:l,onChange:a=>m(a.target.value),placeholder:"Name…",maxLength:60,disabled:h,className:"min-w-0 flex-1 rounded-md border border-rule bg-canvas px-2.5 py-1.5 text-[12.5px] text-ink placeholder:text-ink-4 focus:border-ink-3 focus:outline-none disabled:opacity-50"}),(0,d.jsx)("button",{type:"submit",disabled:h||!l.trim(),className:"shrink-0 rounded-md bg-ink px-3 py-1.5 text-[12px] font-medium text-canvas hover:brightness-90 disabled:cursor-not-allowed disabled:opacity-50",children:h?"…":"Create"}),(0,d.jsx)("button",{type:"button",onClick:()=>k(!1),disabled:h,className:"shrink-0 rounded-md border border-rule px-2.5 py-1.5 text-[12px] text-ink-3 hover:border-rule-2 hover:text-ink-2 disabled:opacity-50",children:"✕"})]})]})]})}let P=[{section:"Overview",items:[{href:"/",label:"Home",icon:g.t},{href:"/chat",label:"Chat",icon:h.x},{href:"/jobs",label:"Runs",icon:i.T},{href:"/llm-providers",label:"LLM Providers",icon:j.R}]},{section:"Build",items:[{href:"/agents",label:"Agents",icon:k.n,dot:"agent"},{href:"/skills",label:"Skills",icon:l.f,dot:"skill"},{href:"/connectors",label:"API Connectors",icon:m.F,dot:"conn"},{href:"/mcp",label:"MCP Connectors",icon:n.X,dot:"conn"},{href:"/credentials",label:"Credentials",icon:o.U},{href:"/memories",label:"Memory",icon:p.j}]},{section:"Operate",items:[{href:"/automations",label:"Automation",icon:q.E},{href:"/approvals",label:"Approvals",icon:r.o},{href:"/logs",label:"Logs",icon:s.m}]},{section:"Workspace",items:[{href:"/billing",label:"Billing",icon:t.S},{href:"/settings",label:"Settings",icon:u._}]}];function Q({workspaces:a,userMenu:b}){let c=(0,f.usePathname)(),[g,h]=(0,e.useState)(!1);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"fixed top-0 right-0 left-0 z-40 flex items-center justify-between border-b border-rule-2 bg-sidebar px-4 py-3.5 lg:hidden",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-[14px] font-medium tracking-[-0.005em] text-ink",children:[(0,d.jsx)("span",{className:"flex h-[20px] w-[20px] items-center justify-center rounded-md bg-ink font-mono text-[10px] font-semibold text-canvas",children:"N"}),(0,d.jsx)("span",{children:"Nodal-Agents"})]}),(0,d.jsx)("button",{type:"button",onClick:()=>h(a=>!a),className:"text-ink-3 transition-colors hover:text-ink","aria-label":g?"Close menu":"Open menu",children:g?(0,d.jsx)(v.X,{size:20}):(0,d.jsx)(w.B,{size:20})})]}),g&&(0,d.jsx)("div",{className:"fixed inset-0 z-30 bg-black/40 lg:hidden",onClick:()=>h(!1),"aria-hidden":!0}),(0,d.jsxs)("aside",{className:`fixed top-0 left-0 z-40 flex h-full w-[220px] flex-col border-r border-rule-2 bg-sidebar pt-4 pb-3 transition-transform duration-200 lg:translate-x-0 ${g?"translate-x-0":"-translate-x-full"}`,children:[(0,d.jsx)(x,{}),(0,d.jsx)(O,{workspaces:a??[]}),(0,d.jsx)("nav",{className:"flex flex-1 flex-col overflow-y-auto py-1.5",children:P.map((a,b)=>(0,d.jsxs)("div",{children:[a.section&&(0,d.jsx)(y,{children:a.section}),a.items.map(a=>(0,d.jsx)(C,{href:a.href,label:a.label,icon:a.icon?(0,d.jsx)(a.icon,{size:14}):void 0,dot:a.dot,count:a.count,isActive:"/"===a.href?"/"===c:c===a.href||c.startsWith(a.href+"/")},a.href))]},b))}),(0,d.jsx)(E,{runningAgents:void 0}),b&&(0,d.jsx)("div",{className:"mt-2 border-t border-rule-2 px-3 pt-3","data-testid":"user-menu",children:b})]})]})}},88866:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\ThemeToggle.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\ThemeToggle.tsx","default")},91092:(a,b,c)=>{Promise.resolve().then(c.bind(c,62952)),Promise.resolve().then(c.bind(c,97173)),Promise.resolve().then(c.bind(c,92002)),Promise.resolve().then(c.bind(c,93690)),Promise.resolve().then(c.bind(c,88866)),Promise.resolve().then(c.t.bind(c,16385,23))},92002:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\SearchBox.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\SearchBox.tsx","default")},93690:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\ThemedToaster.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\ThemedToaster.tsx","default")},96591:(a,b,c)=>{"use strict";c.d(b,{ZH:()=>d.ZH,ip:()=>d.R3});var d=c(94621)},97173:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\SignOutButton.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\SignOutButton.tsx","default")},99740:(a,b,c)=>{"use strict";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))}}};
1223
+ `),(0,e.revalidatePath)("/jobs"),(0,e.revalidatePath)(`/jobs/${a}`),cT({status:"cancelled"})}catch(a){return console.error("[cancelJobAction]",a),cU("db_error","Failed to cancel job")}}let dq=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 dr(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id,slug:k.X6.slug,name:k.X6.name,botToken:k.X6.telegramBotToken,botUsername:k.X6.telegramBotUsername,lastSeenChatIdTelegram:k.X6.lastSeenChatIdTelegram}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return cT({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),cU("db_error","Failed to load Telegram config")}}async function ds(a){try{let b,c=await cV(),d=dq.safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let{agentId:f,botToken:g}=d.data,h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id,slug:k.X6.slug,name:k.X6.name}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,f),(0,k.eq)(k.X6.entityId,c.entityId)));if(!i)return cU("not_found","Agent not found");try{b=await n(g)}catch(a){if(a instanceof l&&"telegram_invalid_token"===a.code)return cU("telegram_invalid_token","Telegram rejected this token. Double-check it from @BotFather.");throw a}let j=0;try{let a=await o({botToken:g,offset:-1,timeout:0,limit:1});a.length>0&&(j=Math.max(...a.map(a=>a.update_id))+1)}catch{}return await h.update(k.X6).set({telegramBotToken:g,telegramBotUsername:b.username,telegramOffset:j,updatedAt:new Date}).where((0,k.eq)(k.X6.id,f)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${f}/telegram`),cT({agentId:i.id,agentSlug:i.slug,agentName:i.name,status:"connected",botUsername:b.username,lastSeenChatIdTelegram:null})}catch(a){return console.error("[configureAgentTelegramAction]",a),cU("db_error","Failed to configure Telegram")}}async function dt(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");return await c.update(k.X6).set({telegramBotToken:null,telegramBotUsername:null,telegramOffset:null,updatedAt:new Date}).where((0,k.eq)(k.X6.id,a)),(0,e.revalidatePath)("/agents"),(0,e.revalidatePath)(`/agents/${a}/telegram`),cT(void 0)}catch(a){return console.error("[disconnectAgentTelegramAction]",a),cU("db_error","Failed to disconnect Telegram")}}let du=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 dv(a={}){try{let b=await cV(),c=du.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),e=await v(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:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.RV)(k.X6.id,f))))g.set(a.id,{name:a.name,slug:a.slug});let h=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 cT({items:h,page:e.page,pageSize:e.pageSize,totalCount:e.totalCount,hasMore:e.hasMore})}catch(a){return console.error("[listMemoriesAction]",a),cU("db_error","Failed to load memories")}}async function dw(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await s(c,a,b.entityId,{archived:!0}),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[archiveMemoryAction]",a),cU("db_error","Failed to archive memory")}}async function dx(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await s(c,a,b.entityId,{archived:!1}),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[unarchiveMemoryAction]",a),cU("db_error","Failed to unarchive memory")}}async function dy(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid memory id");let c=(0,y.Lf)();return await t(c,a,b.entityId),(0,e.revalidatePath)("/memories"),cT(void 0)}catch(a){if(a instanceof q)return cU("not_found","Memory not found");return console.error("[deleteMemoryAction]",a),cU("db_error","Failed to delete memory")}}async function dz(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select().from(k.tK).where((0,k.eq)(k.tK.entityId,a.entityId)),d=[...new Set(c.map(a=>a.credentialId).filter(a=>null!==a))],e=d.length>0?await b.select().from(k.z3).where((0,k.RV)(k.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,w.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 h=c.map(a=>{let b=a.credentialId?f.get(a.credentialId):void 0,c=a.credentialId?g.get(a.credentialId)??null:null;return{id:a.id,slug:a.slug,name:a.name,authType:a.authType,active:a.active??!0,hasApiKey:!!a.apiKey,credentialId:a.credentialId??null,credentialName:b?.name??null,credentialType:b?b.type:null,credentialAccountName:c?.accountName??null,credentialExpiresAt:c?.expiresAt??null,credentialScopes:c?.scopes??null,createdAt:a.createdAt,updatedAt:a.updatedAt}}),i=F.Y.map(a=>({slug:a.slug,label:a.label,authType:a.authType,docsHint:a.docsHint,credentialType:a.credentialType??null}));return cT({instances:h,catalog:i})}catch(a){return console.error("[listConnectorsAction]",a),cU("db_error","Failed to load connectors")}}let dA=g.Ik({slug:g.Yj().min(1).max(80),name:g.Yj().min(1,"Name is required").max(120),apiKey:g.Yj().min(1,"API key is required")});async function dB(a){try{let b=await cV(),c=dA.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=F.Y.find(a=>a.slug===c.data.slug);if(!d)return cU("validation_failed","Unknown connector slug");if("api_key"!==d.authType)return cU("validation_failed",`Connector ${c.data.slug} uses ${d.authType}, not api_key`);let f=(0,y.Lf)(),g=(0,w.ph)(c.data.apiKey)?c.data.apiKey:(0,w.w)(c.data.apiKey),[h]=await f.insert(k.tK).values({entityId:b.entityId,slug:c.data.slug,name:c.data.name,apiKey:g,authType:"api_key",active:!0}).returning({id:k.tK.id});if(!h)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/connectors"),cT({id:h.id})}catch(a){return console.error("[saveApiKeyConnectorAction]",a),cU("db_error","Failed to save connector")}}async function dC(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let c=(0,y.Lf)(),[d]=await c.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,b.entityId)));if(!d)return cU("not_found","Connector not found");return await c.delete(k.tK).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[deleteConnectorAction]",a),cU("db_error","Failed to delete connector")}}async function dD(){try{let a=await cV(),b=(0,y.Lf)(),c=(await b.select().from(k.h_).where((0,k.eq)(k.h_.entityId,a.entityId))).map(a=>({id:a.id,slug:a.slug,name:a.name,active:a.active??!0,hasApiKey:!!a.apiKey,apiKeyLast4:a.apiKeyLast4??null,toolCount:Array.isArray(a.availableTools)?a.availableTools.length:0,createdAt:a.createdAt})),d=I.map(a=>({slug:a.slug,label:a.label,description:a.description,docsHint:a.docsHint,keyPrefix:a.keyPrefix,serverUrl:a.serverUrl,transport:a.transport,command:a.command,args:a.args,envVarNames:a.envVarNames,status:a.status??"verified"}));return cT({instances:c,catalog:d})}catch(a){return console.error("[listMcpServersAction]",a),cU("db_error","Failed to load MCP connectors")}}let dE=g.Ik({slug:g.Yj().min(1).max(80),name:g.Yj().min(1,"Name is required").max(120),apiKey:g.Yj().max(2e3).optional(),url:g.Yj().url("Invalid URL").optional(),customSlug:g.Yj().min(2).max(30).regex(/^[a-z0-9-]+$/,"Slug must be lowercase letters, digits, dashes").optional(),customAuthScheme:g.k5(["header","query","bearer"]).optional(),customAuthParamName:g.Yj().min(1).max(100).optional(),customCommand:g.Yj().min(1).max(200).optional(),customArgs:g.YO(g.Yj().max(500)).max(20).optional(),customEnv:g.g1(g.Yj(),g.Yj().max(2e3)).optional()});async function dF(a){try{let b=await cV(),c=dE.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=I.find(a=>a.slug===c.data.slug);if(!d)return cU("validation_failed","Unknown MCP connector");let f="custom-http-mcp"===d.slug,g="custom-stdio-mcp"===d.slug,h=d.slug,i=d.transport,j=d.authScheme,l=d.authParamName;if(f){if(!c.data.customSlug)return cU("validation_failed","Server slug is required for custom MCP");if(!c.data.customAuthScheme)return cU("validation_failed","Auth scheme is required for custom MCP");if(h=c.data.customSlug,j=c.data.customAuthScheme,l="bearer"===c.data.customAuthScheme?"Authorization":c.data.customAuthParamName??"","bearer"!==j&&!l)return cU("validation_failed",`Auth param name is required for the "${j}" scheme`)}else if(g){if(!c.data.customSlug)return cU("validation_failed","Server slug is required for custom MCP");if(!c.data.customCommand)return cU("validation_failed","Command is required for stdio MCP");h=c.data.customSlug,i="stdio"}if(f||g){let a=(0,y.Lf)();if((await a.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.entityId,b.entityId),(0,k.eq)(k.h_.slug,h)))).length>0)return cU("slug_taken",`Slug "${h}" is already used by another MCP server. Pick a different one.`)}if("http"===i){let a=(c.data.apiKey??"").trim();if(!a)return cU("validation_failed","API key is required");if(!f&&d.keyPrefix.length>0&&!d.keyPrefix.some(b=>a.startsWith(b))){let a=1===d.keyPrefix.length?`"${d.keyPrefix[0]}"`:`one of: ${d.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}let g=d.serverUrl??c.data.url??null;if(!g)return cU("validation_failed",`${d.label} requires a server URL`);let i=[],m=null;try{if(m=await N({transport:"http",url:g,apiKey:a,authScheme:j,authParamName:l}),d.verifyToolName&&!f){let a=await m.client.callTool({name:d.verifyToolName,arguments:{}});if(!0===a.isError)return cU("mcp_connect_failed",`${d.label} rejected the API key.`)}i=m.tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not connect to ${d.label}: ${a}`)}finally{m&&await m.close().catch(()=>{})}let n=(0,y.Lf)(),o=(0,w.w)(a),[p]=await n.insert(k.h_).values({entityId:b.entityId,name:c.data.name,slug:h,transport:"http",url:g,apiKey:o,apiKeyLast4:(0,w.nK)(a),authScheme:j,authParamName:l,availableTools:i,active:!0}).returning({id:k.h_.id});if(!p)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/mcp"),cT({id:p.id})}let m=g?c.data.customCommand:d.command??c.data.customCommand,n=c.data.customArgs??d.args??[],o=c.data.customEnv??{},p=[],q=null;try{p=(q=await N({transport:"stdio",command:m,args:n,env:o})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not start ${d.label} subprocess (${m}): ${a}`)}finally{q&&await q.close().catch(()=>{})}let r={};for(let[a,b]of Object.entries(o))r[a]=(0,w.w)(b);let s=(0,y.Lf)(),[t]=await s.insert(k.h_).values({entityId:b.entityId,name:c.data.name,slug:h,transport:"stdio",url:null,apiKey:null,apiKeyLast4:null,authScheme:null,authParamName:null,command:m,args:n,envVars:r,availableTools:p,active:!0}).returning({id:k.h_.id});if(!t)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/mcp"),cT({id:t.id})}catch(a){return console.error("[createMcpServerFromCatalogAction]",a),cU("db_error","Failed to save MCP connector")}}async function dG(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=g.Yj().min(1,"Name is required").max(120).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid name");let f=(0,y.Lf)(),[h]=await f.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!h)return cU("not_found","MCP connector not found");return await f.update(k.h_).set({name:d.data,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[renameMcpServerAction]",a),cU("db_error","Failed to rename MCP server")}}async function dH(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=g.Yj().min(1,"API key is required").max(2e3).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid API key");let f=d.data.trim(),h=(0,y.Lf)(),[i]=await h.select({id:k.h_.id,slug:k.h_.slug,url:k.h_.url,authScheme:k.h_.authScheme,authParamName:k.h_.authParamName}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!i)return cU("not_found","MCP connector not found");let j=I.find(a=>a.slug===i.slug);if(j&&j.keyPrefix.length>0&&!j.keyPrefix.some(a=>f.startsWith(a))){let a=1===j.keyPrefix.length?`"${j.keyPrefix[0]}"`:`one of: ${j.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}if(!i.url||!i.authScheme||!i.authParamName)return cU("validation_failed","MCP server has incomplete configuration");let l=[],m=null;try{m=await N({transport:"http",url:i.url,apiKey:f,authScheme:i.authScheme,authParamName:i.authParamName}),l=((await m.client.listTools()).tools??[]).map(a=>({name:a.name,description:a.description??null})),j?.verifyToolName&&await m.client.callTool({name:j.verifyToolName,arguments:{}})}catch(b){let a=b instanceof Error?b.message:"unknown error";return cU("mcp_connect_failed",`Couldn't verify the new key: ${a}`)}finally{m&&await m.close().catch(()=>{})}let n=(0,w.ph)(f)?f:(0,w.w)(f);return await h.update(k.h_).set({apiKey:n,apiKeyLast4:(0,w.nK)(f),availableTools:l,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[updateMcpServerApiKeyAction]",a),cU("db_error","Failed to rotate MCP API key")}}async function dI(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let c=(0,y.Lf)(),[d]=await c.select().from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,b.entityId)));if(!d)return cU("not_found","MCP connector not found");let e=d.envVars??{};return cT({id:d.id,name:d.name,slug:d.slug,transport:d.transport,url:d.url??null,authScheme:d.authScheme??null,authParamName:d.authParamName??null,command:d.command??null,args:Array.isArray(d.args)?d.args:[],envKeys:Object.keys(e),hasApiKey:!!d.apiKey,apiKeyLast4:d.apiKeyLast4??null})}catch(a){return console.error("[getMcpServerConfigAction]",a),cU("db_error","Failed to load MCP server config")}}let dJ=g.Ik({name:g.Yj().min(1,"Name is required").max(120),url:g.Yj().url("Invalid URL").optional(),authScheme:g.k5(["header","query","bearer"]).optional(),authParamName:g.Yj().max(100).optional(),apiKey:g.Yj().max(2e3).optional(),command:g.Yj().min(1).max(200).optional(),args:g.YO(g.Yj().max(500)).max(20).optional(),env:g.g1(g.Yj(),g.Yj().max(2e3)).optional()});async function dK(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let d=dJ.safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),[h]=await f.select().from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,c.entityId)));if(!h)return cU("not_found","MCP connector not found");let i=I.find(a=>a.slug===h.slug);if("http"===h.transport){let b,c=(d.data.url??h.url??"").trim();if(!c)return cU("validation_failed","Server URL is required");let g=d.data.authScheme??h.authScheme??"header",j="bearer"===g?"Authorization":(d.data.authParamName??h.authParamName??"").trim();if("bearer"!==g&&!j)return cU("validation_failed",`Auth param name is required for the "${g}" scheme`);let l=(d.data.apiKey??"").trim(),m=l.length>0;if(m){if(i&&i.keyPrefix.length>0&&!i.keyPrefix.some(a=>l.startsWith(a))){let a=1===i.keyPrefix.length?`"${i.keyPrefix[0]}"`:`one of: ${i.keyPrefix.map(a=>`"${a}"`).join(", ")}`;return cU("validation_failed",`API key must start with ${a}`)}b=l}else{if(!h.apiKey)return cU("validation_failed","No stored API key — provide one to connect");try{b=(0,w.Yc)(h.apiKey)}catch{return cU("validation_failed","Stored API key is unreadable — re-enter it")}}let n=[],o=null;try{n=(o=await N({transport:"http",url:c,apiKey:b,authScheme:g,authParamName:j})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not connect with the new config: ${a}`)}finally{o&&await o.close().catch(()=>{})}return await f.update(k.h_).set({name:d.data.name,url:c,authScheme:g,authParamName:j,availableTools:n,...m?{apiKey:(0,w.w)(b),apiKeyLast4:(0,w.nK)(b)}:{},updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}let j=(d.data.command??h.command??"").trim();if(!j)return cU("validation_failed","Command is required");let l=d.data.args??(Array.isArray(h.args)?h.args:[]),m=h.envVars??{},n=d.data.env,o={},p={};for(let[a,b]of n?Object.entries(n):Object.entries(m).map(([a])=>[a,""]))if(b&&b.length>0)o[a]=b,p[a]=(0,w.w)(b);else if(void 0!==m[a]){try{o[a]=(0,w.Yc)(m[a])}catch{return cU("validation_failed",`Stored value for "${a}" is unreadable — re-enter it`)}p[a]=m[a]}let q=[],r=null;try{q=(r=await N({transport:"stdio",command:j,args:l,env:o})).tools.map(a=>({name:a.name,description:a.description??null}))}catch(b){let a=b instanceof Error?b.message:String(b);return cU("mcp_connect_failed",`Could not start the subprocess (${j}): ${a}`)}finally{r&&await r.close().catch(()=>{})}return await f.update(k.h_).set({name:d.data.name,command:j,args:l,envVars:p,availableTools:q,updatedAt:new Date}).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[updateMcpServerConfigAction]",a),cU("db_error","Failed to update MCP server")}}async function dL(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid MCP server id");let c=(0,y.Lf)(),[d]=await c.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,a),(0,k.eq)(k.h_.entityId,b.entityId)));if(!d)return cU("not_found","MCP connector not found");return await c.delete(k.h_).where((0,k.eq)(k.h_.id,a)),(0,e.revalidatePath)("/mcp"),cT(void 0)}catch(a){return console.error("[deleteMcpServerAction]",a),cU("db_error","Failed to delete MCP connector")}}async function dM(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({id:k.h_.id,slug:k.h_.slug,name:k.h_.name,availableTools:k.h_.availableTools}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.entityId,b.entityId),(0,k.eq)(k.h_.active,!0)));if(0===e.length)return cT([]);let f=await c.select({mcpServerId:k.oS.mcpServerId,enabledTools:k.oS.enabledTools}).from(k.oS).where((0,k.eq)(k.oS.agentId,a)),h=new Map;for(let a of f)h.set(a.mcpServerId,{enabledTools:a.enabledTools??null});let i=e.map(a=>{let b=h.get(a.id);return{mcpServerId:a.id,slug:a.slug,label:a.name,assigned:void 0!==b,enabledTools:b?.enabledTools??null,availableTools:Array.isArray(a.availableTools)?a.availableTools:[]}});return cT(i)}catch(a){return console.error("[listAgentMcpServersAction]",a),cU("db_error","Failed to load agent MCP connectors")}}async function dN(a,b,c,d){try{let f=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid MCP server id");let h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,f.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await h.select({id:k.h_.id}).from(k.h_).where((0,k.Uo)((0,k.eq)(k.h_.id,b),(0,k.eq)(k.h_.entityId,f.entityId)));if(!j)return cU("not_found","MCP connector not found");return c?await h.insert(k.oS).values({agentId:a,mcpServerId:b,entityId:f.entityId,enabledTools:d??null}).onConflictDoUpdate({target:[k.oS.agentId,k.oS.mcpServerId],set:{enabledTools:d??null,updatedAt:new Date}}):await h.delete(k.oS).where((0,k.Uo)((0,k.eq)(k.oS.agentId,a),(0,k.eq)(k.oS.mcpServerId,b))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[setAgentMcpServerAssignmentAction]",a),cU("db_error","Failed to update MCP assignment")}}async function dO(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");if(null!==b&&!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid credential id");let d=(0,y.Lf)(),[f]=await d.select({id:k.tK.id,slug:k.tK.slug,authType:k.tK.authType}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!f)return cU("not_found","Connector not found");if("oauth2"!==f.authType)return cU("invalid_auth_type","Only OAuth2 connectors support credential assignment");if(null!==b){let[a]=await d.select({id:k.z3.id,ownerUserId:k.z3.ownerUserId,type:k.z3.type}).from(k.z3).where((0,k.eq)(k.z3.id,b));if(!a)return cU("not_found","Credential not found");if(a.ownerUserId!==c.userId)return cU("forbidden","Access denied");let e=(0,O.ZH)(f.slug);if(e&&e.credentialType!==a.type)return cU("type_mismatch",`Credential type '${a.type}' is not compatible with connector '${f.slug}' (expects '${e.credentialType}')`)}return await d.update(k.tK).set({credentialId:b,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(b){console.error("[assignCredentialAction]",b);let a=b instanceof Error?b.message:String(b);return cU("db_error",`Failed to assign credential: ${a}`)}}async function dP(a,b,c){try{let d=await cV();if(!g.Yj().min(1).max(80).safeParse(a).success)return cU("validation_failed","Invalid connector slug");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid credential id");if(void 0!==c&&!g.Yj().min(1).max(120).safeParse(c).success)return cU("validation_failed","Invalid connector name");let f=F.Y.find(b=>b.slug===a);if(!f)return cU("validation_failed","Unknown connector slug");if("oauth2"!==f.authType)return cU("invalid_auth_type","Only OAuth2 connectors support credential assignment");let h=(0,y.Lf)(),[i]=await h.select({id:k.z3.id,ownerUserId:k.z3.ownerUserId,type:k.z3.type,name:k.z3.name}).from(k.z3).where((0,k.eq)(k.z3.id,b));if(!i)return cU("not_found","Credential not found");if(i.ownerUserId!==d.userId)return cU("forbidden","Access denied");if(f.credentialType&&f.credentialType!==i.type)return cU("type_mismatch",`Credential type '${i.type}' is not compatible with connector '${a}' (expects '${f.credentialType}')`);let j=c??i.name??f.label,[l]=await h.insert(k.tK).values({entityId:d.entityId,slug:a,name:j,authType:"oauth2",credentialId:b,active:!0}).returning({id:k.tK.id});if(!l)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/connectors"),cT({connectorId:l.id})}catch(b){console.error("[createOrAssignOAuthConnectorAction]",b);let a=b instanceof Error?b.message:String(b);return cU("db_error",`Failed to assign credential: ${a}`)}}async function dQ(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let d=g.Yj().min(1,"Name is required").max(120).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid name");let f=(0,y.Lf)(),[h]=await f.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!h)return cU("not_found","Connector not found");return await f.update(k.tK).set({name:d.data,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[renameConnectorAction]",a),cU("db_error","Failed to rename connector")}}async function dR(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid connector id");let d=g.Yj().min(1,"API key is required").max(2e3).safeParse(b);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid API key");let f=(0,y.Lf)(),[h]=await f.select({id:k.tK.id,authType:k.tK.authType}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,a),(0,k.eq)(k.tK.entityId,c.entityId)));if(!h)return cU("not_found","Connector not found");if("api_key"!==h.authType)return cU("validation_failed",`Connector uses ${h.authType??"unknown"} auth — key rotation only applies to api_key connectors.`);let i=(0,w.ph)(d.data)?d.data:(0,w.w)(d.data);return await f.update(k.tK).set({apiKey:i,updatedAt:new Date}).where((0,k.eq)(k.tK.id,a)),(0,e.revalidatePath)("/connectors"),cT(void 0)}catch(a){return console.error("[updateConnectorApiKeyAction]",a),cU("db_error","Failed to rotate API key")}}async function dS(a={}){try{let b=await cV(),c=(0,y.Lf)(),d=a.status??"pending",e=(0,k.eq)(k.MZ.entityId,b.entityId),f="all"===d?e:(0,k.Uo)(e,(0,k.eq)(k.MZ.status,d)),g=await c.select({id:k.MZ.id,jobId:k.MZ.jobId,agentId:k.MZ.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,toolName:k.MZ.toolName,toolInput:k.MZ.toolInput,status:k.MZ.status,requestedAt:k.MZ.requestedAt,resolvedAt:k.MZ.resolvedAt,resolvedBy:k.MZ.resolvedBy,expiresAt:k.MZ.expiresAt,notes:k.MZ.notes,jobTask:k.ME.task}).from(k.MZ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.MZ.agentId)).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.MZ.jobId)).where(f).orderBy((0,k.i8)(k.MZ.requestedAt)).limit(100);return cT(g.map(a=>({...a,status:a.status??"pending"})))}catch(a){return console.error("[listApprovalsAction]",a),cU("db_error","Failed to load approvals")}}let dT=g.Ik({approvalRequestId:g.Yj().guid(),decision:g.k5(["approve","reject"]),notes:g.Yj().max(5e3).optional()});async function dU(a){try{let b;await cV();let c=dT.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");if(!A._.WORKER_SECRET)return console.error("[resolveApprovalAction] WORKER_SECRET missing"),cU("config_error","WORKER_SECRET is not set");let d=`${A._.RUNNER_URL}/api/approve`;try{b=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify(c.data)})}catch(a){return console.error("[resolveApprovalAction] fetch failed",a),cU("runner_unreachable","Runner did not respond")}if(!b.ok){let a=(await b.json().catch(()=>({}))).error??`runner_${b.status}`;return cU(a,`Runner rejected: ${a}`)}let f=await b.json();return(0,e.revalidatePath)("/approvals"),(0,e.revalidatePath)("/jobs"),(0,e.revalidatePath)(`/jobs/${f.jobId}`),cT({jobId:f.jobId,decision:f.decision})}catch(a){return console.error("[resolveApprovalAction]",a),cU("db_error","Failed to resolve approval")}}async function dV(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.eK.id,name:k.eK.name,slug:k.eK.slug,content:k.eK.content,defaultContent:k.eK.defaultContent,contentOverridden:k.eK.contentOverridden,description:k.eK.description,active:k.eK.active,requiredBuiltins:k.eK.requiredBuiltins,createdAt:k.eK.createdAt,updatedAt:k.eK.updatedAt}).from(k.eK).where((0,k.or)((0,k.eq)(k.eK.entityId,a.entityId),(0,k.RV)(k.eK.slug,J))).orderBy((0,k.i8)(k.eK.updatedAt));if(0===c.length)return cT([]);let d=await b.select({skillId:k.$m.skillId,c:(0,k.ll)`count(*)`}).from(k.$m).where((0,k.Uo)((0,k.eq)(k.$m.entityId,a.entityId),(0,k.RV)(k.$m.skillId,c.map(a=>a.id)))).groupBy(k.$m.skillId),e=new Map;for(let a of d)e.set(a.skillId,Number(a.c));let f=await b.select({skillId:k.$m.skillId,agentId:k.X6.id,agentName:k.X6.name,agentSlug:k.X6.slug,avatarUrl:k.X6.avatarUrl}).from(k.$m).innerJoin(k.X6,(0,k.eq)(k.X6.id,k.$m.agentId)).where((0,k.Uo)((0,k.eq)(k.$m.entityId,a.entityId),(0,k.RV)(k.$m.skillId,c.map(a=>a.id)))).orderBy(k.X6.name),g=new Map;for(let a of f){let b=g.get(a.skillId)??[];b.length<8&&(b.push({id:a.agentId,name:a.agentName,slug:a.agentSlug,avatarUrl:a.avatarUrl}),g.set(a.skillId,b))}return cT(c.map(a=>({id:a.id,name:a.name,slug:a.slug,isSystem:J.includes(a.slug),content:a.content,defaultContent:a.defaultContent,contentOverridden:a.contentOverridden??!1,description:a.description,active:a.active??!0,requiredBuiltins:a.requiredBuiltins??[],assignmentCount:e.get(a.id)??0,assignedAgents:g.get(a.id)??[],createdAt:a.createdAt,updatedAt:a.updatedAt})))}catch(a){return console.error("[listSkillsAction]",a),cU("db_error","Failed to load skills")}}let dW=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 dX(a){try{let b=await cV(),c=dW.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),f=await (0,k.qz)(d,b.entityId,{slug:c.data.slug,name:c.data.name,content:c.data.content,description:c.data.description??null});if("error"in f)return cU("conflict","A skill with this slug already exists");return(0,e.revalidatePath)("/skills"),cT({id:f.id})}catch(a){return console.error("[createSkillAction]",a),cU("db_error","Failed to create skill")}}async function dY(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");return await c.delete(k.eK).where((0,k.eq)(k.eK.id,a)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[deleteSkillAction]",a),cU("db_error","Failed to delete skill")}}let dZ=g.Ik({skillId:g.Yj().guid(),agentId:g.Yj().guid()});async function d$(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");let e=await c.select({id:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.eq)(k.X6.entityId,b.entityId)).orderBy(k.X6.name),f=await c.select({agentId:k.$m.agentId}).from(k.$m).where((0,k.eq)(k.$m.skillId,a)),h=new Set(f.map(a=>a.agentId));return cT(e.map(a=>({agentId:a.id,agentName:a.name,agentSlug:a.slug,assigned:h.has(a.id)})))}catch(a){return console.error("[listSkillAssignmentsAction]",a),cU("db_error","Failed to load skill assignments")}}async function d_(a){try{let b=await cV(),c=dZ.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),f=await (0,k.ps)(d,b.entityId,c.data,J);if("error"in f){if("skill_not_found"===f.error)return cU("not_found","Skill not found");if("agent_not_found"===f.error)return cU("not_found","Agent not found")}return(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[assignSkillAction]",a),cU("db_error","Failed to assign skill")}}let d0=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 d1(a){try{let b=await cV(),c=d0.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,name:f,description:g,content:h,active:i}=c.data,j=(0,y.Lf)(),[l]=await j.select({id:k.eK.id,content:k.eK.content}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,d),(0,k.eq)(k.eK.entityId,b.entityId)));if(!l)return cU("not_found","Skill not found");let m={name:f,description:g??null,content:h,...void 0!==i?{active:i}:{},updatedAt:new Date};return h!==l.content&&(m.contentOverridden=!0),await j.update(k.eK).set(m).where((0,k.eq)(k.eK.id,d)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[updateSkillAction]",a),cU("db_error","Failed to update skill")}}async function d2(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id,defaultContent:k.eK.defaultContent}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.eq)(k.eK.entityId,b.entityId)));if(!d)return cU("not_found","Skill not found");if(null===d.defaultContent)return cU("not_applicable","No default available — this is a user-created skill");return await c.update(k.eK).set({content:d.defaultContent,contentOverridden:!1,updatedAt:new Date}).where((0,k.eq)(k.eK.id,a)),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[resetSkillToDefaultAction]",a),cU("db_error","Failed to reset skill")}}async function d3(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid skill id");let c=(0,y.Lf)(),[d]=await c.select({id:k.eK.id,name:k.eK.name,slug:k.eK.slug,content:k.eK.content,defaultContent:k.eK.defaultContent,contentOverridden:k.eK.contentOverridden,description:k.eK.description,active:k.eK.active,requiredBuiltins:k.eK.requiredBuiltins,createdAt:k.eK.createdAt,updatedAt:k.eK.updatedAt}).from(k.eK).where((0,k.Uo)((0,k.eq)(k.eK.id,a),(0,k.or)((0,k.eq)(k.eK.entityId,b.entityId),(0,k.RV)(k.eK.slug,J))));if(!d)return cU("not_found","Skill not found");return cT({id:d.id,name:d.name,slug:d.slug,isSystem:J.includes(d.slug),content:d.content,defaultContent:d.defaultContent,contentOverridden:d.contentOverridden??!1,description:d.description,active:d.active??!0,requiredBuiltins:d.requiredBuiltins??[],assignmentCount:0,assignedAgents:[],createdAt:d.createdAt,updatedAt:d.updatedAt})}catch(a){return console.error("[getSkillByIdAction]",a),cU("db_error","Failed to load skill")}}async function d4(a){try{let b=await cV(),c=dZ.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)();return await d.delete(k.$m).where((0,k.Uo)((0,k.eq)(k.$m.skillId,c.data.skillId),(0,k.eq)(k.$m.agentId,c.data.agentId),(0,k.eq)(k.$m.entityId,b.entityId))),(0,e.revalidatePath)("/skills"),cT(void 0)}catch(a){return console.error("[unassignSkillAction]",a),cU("db_error","Failed to unassign skill")}}let d5=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 d6(a={}){try{let b=await cV(),c=d5.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),e=[(0,k.eq)(k.Ky.entityId,b.entityId)];c.data.toolName&&e.push((0,k.eq)(k.Ky.toolName,c.data.toolName)),c.data.jobId&&e.push((0,k.eq)(k.Ky.jobId,c.data.jobId));let f=(c.data.page-1)*c.data.pageSize,g=c.data.agentId?await d.select({id:k.Ky.id,jobId:k.Ky.jobId,agentId:k.ME.agentId,toolName:k.Ky.toolName,toolInput:k.Ky.toolInput,toolOutput:k.Ky.toolOutput,durationMs:k.Ky.durationMs,turn:k.Ky.turn,createdAt:k.Ky.createdAt}).from(k.Ky).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.Ky.jobId)).where((0,k.Uo)(...e,(0,k.eq)(k.ME.agentId,c.data.agentId))).orderBy((0,k.i8)(k.Ky.createdAt)).limit(c.data.pageSize).offset(f):await d.select({id:k.Ky.id,jobId:k.Ky.jobId,agentId:k.ME.agentId,toolName:k.Ky.toolName,toolInput:k.Ky.toolInput,toolOutput:k.Ky.toolOutput,durationMs:k.Ky.durationMs,turn:k.Ky.turn,createdAt:k.Ky.createdAt}).from(k.Ky).leftJoin(k.ME,(0,k.eq)(k.ME.id,k.Ky.jobId)).where((0,k.Uo)(...e)).orderBy((0,k.i8)(k.Ky.createdAt)).limit(c.data.pageSize).offset(f),h=Array.from(new Set(g.map(a=>a.agentId).filter(a=>null!==a))),i=new Map;if(h.length>0)for(let a of(await d.select({id:k.X6.id,name:k.X6.name,slug:k.X6.slug}).from(k.X6).where((0,k.RV)(k.X6.id,h))))i.set(a.id,{name:a.name,slug:a.slug});let j=g.map(a=>{let b=a.agentId?i.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 cT({items:j,page:c.data.page,pageSize:c.data.pageSize})}catch(a){return console.error("[listToolCallsAction]",a),cU("db_error","Failed to load tool calls")}}async function d7(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.selectDistinct({toolName:k.Ky.toolName}).from(k.Ky).where((0,k.eq)(k.Ky.entityId,a.entityId)).orderBy(k.Ky.toolName);return cT(c.map(a=>a.toolName))}catch(a){return console.error("[listToolNamesAction]",a),cU("db_error","Failed to load tool names")}}async function d8(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({status:k.ME.status,count:(0,k.ll)`count(*)`,inputTokens:(0,k.ll)`coalesce(sum(${k.ME.inputTokens}), 0)`,outputTokens:(0,k.ll)`coalesce(sum(${k.ME.outputTokens}), 0)`,durationMs:(0,k.ll)`coalesce(sum(${k.ME.totalDurationMs}), 0)`}).from(k.ME).where((0,k.eq)(k.ME.entityId,a.entityId)).groupBy(k.ME.status),d={},e=0,f=0,g=0,h=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),h+=Number(a.durationMs)}let i=d.completed??0,j=i>0?h/i:null,[l]=await b.select({count:(0,k.ll)`count(*)`}).from(k.Ky).where((0,k.eq)(k.Ky.entityId,a.entityId)),m=Number(l?.count??0),n=(await b.select({agentId:k.ME.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,jobCount:(0,k.ll)`count(*)`,inputTokens:(0,k.ll)`coalesce(sum(${k.ME.inputTokens}), 0)`,outputTokens:(0,k.ll)`coalesce(sum(${k.ME.outputTokens}), 0)`}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.entityId,a.entityId)).groupBy(k.ME.agentId,k.X6.name,k.X6.slug).orderBy((0,k.i8)((0,k.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,k.ll)`count(*)`}).from(k.X6).where((0,k.eq)(k.X6.entityId,a.entityId)),p=Number(o?.count??0);return cT({totalJobs:e,statusCounts:d,totalInputTokens:f,totalOutputTokens:g,totalDurationMs:h,avgDurationMs:j,totalToolCalls:m,agentCount:p,perAgent:n})}catch(a){return console.error("[getEntityStatsAction]",a),cU("db_error","Failed to load stats")}}async function d9(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({week:(0,k.ll)`to_char(date_trunc('week', ${k.ME.createdAt}), 'YYYY-MM-DD')`,status:k.ME.status,count:(0,k.ll)`count(*)`}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.entityId,a.entityId),(0,k.ll)`${k.ME.createdAt} > now() - interval '12 weeks'`)).groupBy((0,k.ll)`date_trunc('week', ${k.ME.createdAt})`,k.ME.status),d=new Map,e=new Date,f=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate())),g=f.getUTCDay();f.setUTCDate(f.getUTCDate()-(g+6)%7);for(let a=11;a>=0;a--){let b=new Date(f);b.setUTCDate(b.getUTCDate()-7*a);let c=b.toISOString().slice(0,10);d.set(c,{week:c,completed:0,failed:0,cancelled:0,awaiting:0,pending:0})}for(let a of c){let b=d.get(a.week);if(!b)continue;let c=Number(a.count),e=a.status??"";"completed"===e?b.completed+=c:"failed"===e?b.failed+=c:"cancelled"===e?b.cancelled+=c:"pending"===e?b.pending+=c:b.awaiting+=c}return cT(Array.from(d.values()))}catch(a){return console.error("[getWeeklyActivityAction]",a),cU("db_error","Failed to load weekly activity")}}async function ea(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({agentId:k.ME.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,avatarUrl:k.X6.avatarUrl,status:k.ME.status,count:(0,k.ll)`count(*)`}).from(k.ME).innerJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.Uo)((0,k.eq)(k.ME.entityId,a.entityId),(0,k.ll)`${k.ME.status} IN ('pending', 'processing', 'awaiting_approval', 'awaiting_delegation')`)).groupBy(k.ME.agentId,k.X6.name,k.X6.slug,k.X6.avatarUrl,k.ME.status),d=new Map;for(let a of c){if(!a.agentId||!a.agentName||!a.agentSlug)continue;let b=d.get(a.agentId)??{agentId:a.agentId,agentName:a.agentName,agentSlug:a.agentSlug,avatarUrl:a.avatarUrl??null,processing:0,awaiting:0,pending:0,total:0},c=Number(a.count),e=a.status??"";"processing"===e?b.processing+=c:"awaiting_approval"===e||"awaiting_delegation"===e?b.awaiting+=c:"pending"===e&&(b.pending+=c),b.total+=c,d.set(a.agentId,b)}let e=Array.from(d.values()).sort((a,b)=>b.total!==a.total?b.total-a.total:a.agentName.localeCompare(b.agentName));return cT(e)}catch(a){return console.error("[getActiveJobsByAgentAction]",a),cU("db_error","Failed to load active jobs")}}async function eb(){try{let a=await cV();return cT({llm:{provider:A._.LLM_PROVIDER??null,model:A._.LLM_MODEL??null,baseURL:A._.LLM_BASE_URL??null},authMode:A._.AUTH_MODE,runnerUrl:A._.RUNNER_URL,appUrl:A._.NEXT_PUBLIC_APP_URL,workerSecretConfigured:!!A._.WORKER_SECRET,user:{userId:a.userId,entityId:a.entityId}})}catch(a){return console.error("[getSettingsAction]",a),cU("db_error","Failed to load settings")}}async function ec(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.uQ.id,agentId:k.uQ.agentId,agentName:k.X6.name,agentSlug:k.X6.slug,name:k.uQ.name,cronExpr:k.uQ.cronExpr,task:k.uQ.task,active:k.uQ.active,lastRun:k.uQ.lastRun,nextRun:k.uQ.nextRun,lastStatus:k.uQ.lastStatus,notifyOnSuccess:k.uQ.notifyOnSuccess,createdAt:k.uQ.createdAt,updatedAt:k.uQ.updatedAt}).from(k.uQ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.uQ.agentId)).where((0,k.eq)(k.uQ.entityId,a.entityId)).orderBy((0,k.i8)(k.uQ.updatedAt));return cT(c.map(a=>({...a,active:a.active??!0,notifyOnSuccess:a.notifyOnSuccess??!1})))}catch(a){return console.error("[listSchedulesAction]",a),cU("db_error","Failed to load schedules")}}let ed=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),notifyOnSuccess:g.zM().optional().default(!1)});async function ee(a){try{let b=await cV(),c=ed.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!f)return cU("not_found","Agent not found");let g=Q(c.data.cronExpr);if(!g)return cU("validation_failed","Invalid cron expression");let[h]=await d.insert(k.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,notifyOnSuccess:c.data.notifyOnSuccess}).returning({id:k.uQ.id});if(!h)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/automations"),cT({id:h.id})}catch(a){return console.error("[createScheduleAction]",a),cU("db_error","Failed to create schedule")}}let ef=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),notifyOnSuccess:g.zM().optional().default(!1)});async function eg(a){try{let b=await cV(),c=ef.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.uQ.id}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,c.data.id),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!f)return cU("not_found","Schedule not found");let[g]=await d.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,c.data.agentId),(0,k.eq)(k.X6.entityId,b.entityId)));if(!g)return cU("not_found","Agent not found");let h=Q(c.data.cronExpr);if(!h)return cU("validation_failed","Invalid cron expression");return await d.update(k.uQ).set({agentId:c.data.agentId,name:c.data.name,cronExpr:c.data.cronExpr,task:c.data.task,nextRun:h,notifyOnSuccess:c.data.notifyOnSuccess,updatedAt:new Date}).where((0,k.eq)(k.uQ.id,c.data.id)),(0,e.revalidatePath)("/automations"),cT(void 0)}catch(a){return console.error("[updateScheduleAction]",a),cU("db_error","Failed to update schedule")}}async function eh(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({id:k.uQ.id,active:k.uQ.active}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!d)return cU("not_found","Schedule not found");let f=!(d.active??!0);return await c.update(k.uQ).set({active:f,updatedAt:new Date}).where((0,k.eq)(k.uQ.id,a)),(0,e.revalidatePath)("/automations"),cT({active:f})}catch(a){return console.error("[toggleScheduleAction]",a),cU("db_error","Failed to toggle schedule")}}async function ei(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({id:k.uQ.id}).from(k.uQ).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId)));if(!d)return cU("not_found","Schedule not found");return await c.delete(k.uQ).where((0,k.eq)(k.uQ.id,a)),(0,e.revalidatePath)("/automations"),cT(void 0)}catch(a){return console.error("[deleteScheduleAction]",a),cU("db_error","Failed to delete schedule")}}async function ej(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid schedule id");let c=(0,y.Lf)(),[d]=await c.select({agentId:k.uQ.agentId,task:k.uQ.task,chatId:k.uQ.chatId,notifyOnSuccess:k.uQ.notifyOnSuccess,agentChatId:k.X6.lastSeenChatIdTelegram}).from(k.uQ).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.uQ.agentId)).where((0,k.Uo)((0,k.eq)(k.uQ.id,a),(0,k.eq)(k.uQ.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Schedule not found");if(!d.task)return cU("validation_failed","This automation has no task to run.");let f=d.notifyOnSuccess?d.chatId??d.agentChatId??null:null,[h]=await c.insert(k.ME).values({entityId:b.entityId,agentId:d.agentId,status:"pending",channel:"cron",task:d.task,messages:[{role:"user",content:d.task}],...f?{chatId:f}:{}}).returning({id:k.ME.id});if(!h)return cU("db_error","Failed to create job");return A._.WORKER_SECRET?fetch(`${A._.RUNNER_URL}/api/worker`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({jobId:h.id})}).catch(a=>{console.error("[runScheduleNowAction] runner ping failed:",a)}):console.error("[runScheduleNowAction] WORKER_SECRET missing — cannot ping runner"),(0,e.revalidatePath)("/automations"),(0,e.revalidatePath)("/jobs"),cT({jobId:h.id})}catch(a){return console.error("[runScheduleNowAction]",a),cU("db_error","Failed to run schedule now")}}async function ek(){try{await cV();let a=function(){let a=D();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 cT({runtimeMode:A._.AUTH_MODE,configuredMode:a.configuredMode,googleConfigured:a.googleConfigured,googleAvailableInRuntime:!!(A._.GOOGLE_CLIENT_ID&&A._.GOOGLE_CLIENT_SECRET),configPathExists:a.configPathExists})}catch(a){return console.error("[getSecuritySettingsAction]",a),cU("db_error","Failed to load security settings")}}let el=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 em(a){try{await cV();let b=el.safeParse(a);if(!b.success)return cU("validation_failed",b.error.issues[0]?.message??"Invalid input");let c=D();if(!c)return cU("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{E({auth:d})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cU("cli_config_missing","Config file disappeared between read and write.");throw b}(0,e.revalidatePath)("/settings");let f=b.data.mode!==A._.AUTH_MODE;return cT({requiresRestart:f})}catch(a){return console.error("[updateAuthSettingsAction]",a),cU("db_error","Failed to update auth settings")}}async function en(){try{let a;await cV();let b=(a=D())?{configuredBind:"lan"===a.bind?"lan":"loopback",configPathExists:!0}:{configuredBind:"loopback",configPathExists:!1},c="0.0.0.0"===A._.BIND?"lan":"loopback";return cT({configuredBind:b.configuredBind,runtimeBind:c,lanAddresses:function(){let a=(0,x.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}}(A._.NEXT_PUBLIC_APP_URL),configPathExists:b.configPathExists})}catch(a){return console.error("[getNetworkSettingsAction]",a),cU("db_error","Failed to load network settings")}}let eo=g.Ik({bind:g.k5(["loopback","lan"])});async function ep(a){try{await cV();let b=eo.safeParse(a);if(!b.success)return cU("validation_failed",b.error.issues[0]?.message??"Invalid input");try{E({bind:b.data.bind})}catch(b){let a=b instanceof Error?b.message:"";if("cli_config_missing"===a)return cU("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"===A._.BIND?"lan":"loopback";return cT({requiresRestart:b.data.bind!==c})}catch(a){return console.error("[updateNetworkSettingsAction]",a),cU("db_error","Failed to update network settings")}}let eq=["anthropic","openai","openai-compatible","ollama","openrouter","google","mistral","groq"],er=g.Yj().optional().transform(a=>a&&a.length>0?a:null).pipe(g.Yj().url().nullable().or(g.ch())),es=g.Ik({provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),nickname:g.Yj().max(120).nullish(),isActive:g.zM().default(!0)}),et=g.Ik({id:g.Yj().guid(),provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),nickname:g.Yj().max(120).nullish(),isActive:g.zM()}),eu=g.Ik({provider:g.k5(eq),baseUrl:er,apiKey:g.Yj().optional(),model:g.Yj().optional(),keyId:g.Yj().guid().optional()});function ev(a,b){return b&&0!==b.length?a.replaceAll(b,"[REDACTED]"):a}async function ew(){try{let a=await cV(),b=(0,y.Lf)(),c=await b.select({id:k.hG.id,provider:k.hG.provider,baseUrl:k.hG.baseUrl,nickname:k.hG.nickname,isActive:k.hG.isActive,hasApiKey:(0,k.ll)`(${k.hG.apiKey} <> '')`,apiKeyLast4:k.hG.apiKeyLast4}).from(k.hG).where((0,k.eq)(k.hG.entityId,a.entityId)).orderBy((0,k.i8)(k.hG.createdAt)),d=await b.select({llmKeyId:k.X6.llmKeyId,n:(0,k.ll)`count(*)`}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.entityId,a.entityId),(0,k.eq)(k.X6.active,!0))).groupBy(k.X6.llmKeyId),e=new Map;for(let a of d)a.llmKeyId&&e.set(a.llmKeyId,Number(a.n));return cT(c.map(a=>({id:a.id,provider:a.provider,baseUrl:a.baseUrl,nickname:a.nickname,isActive:a.isActive,hasApiKey:!!a.hasApiKey,apiKeyLast4:a.apiKeyLast4?a.apiKeyLast4:null,agentCount:e.get(a.id)??0})))}catch(a){return console.error("[listLlmKeysAction]",a),cU("db_error","Failed to load LLM providers")}}async function ex(a){try{let b=await cV(),c=es.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let d=(0,y.Lf)(),[f]=await d.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.entityId,b.entityId),(0,k.eq)(k.hG.provider,c.data.provider))).limit(1);if(f)return cU("provider_exists","This provider is already configured — edit the existing one.");let g=c.data.apiKey??"",[h]=await d.insert(k.hG).values({entityId:b.entityId,provider:c.data.provider,apiKey:(0,w.w)(g),apiKeyLast4:(0,w.nK)(g),baseUrl:c.data.baseUrl,nickname:c.data.nickname??null,isActive:c.data.isActive}).returning({id:k.hG.id});if(!h)return cU("db_error","Insert returned no row");return(0,e.revalidatePath)("/settings"),cT({id:h.id})}catch(a){return console.error("[createLlmKeyAction]",a),cU("db_error","Failed to create LLM provider")}}async function ey(a){try{let b=await cV(),c=et.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{id:d,provider:f,baseUrl:g,apiKey:h,nickname:i,isActive:j}=c.data,l=(0,y.Lf)(),[m]=await l.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,d),(0,k.eq)(k.hG.entityId,b.entityId)));if(!m)return cU("not_found","LLM provider not found");let n={provider:f,baseUrl:g,nickname:i??null,isActive:j,updatedAt:new Date};return h&&h.length>0&&(n.apiKey=(0,w.w)(h),n.apiKeyLast4=(0,w.nK)(h)),await l.update(k.hG).set(n).where((0,k.eq)(k.hG.id,d)),(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[updateLlmKeyAction]",a),cU("db_error","Failed to update LLM provider")}}async function ez(a,b){try{let c=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid LLM provider id");let d=(0,y.Lf)(),[f]=await d.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,a),(0,k.eq)(k.hG.entityId,c.entityId)));if(!f)return cU("not_found","LLM provider not found");return await d.update(k.hG).set({isActive:b,updatedAt:new Date}).where((0,k.eq)(k.hG.id,a)),(0,e.revalidatePath)("/llm-providers"),cT(void 0)}catch(a){return console.error("[setLlmKeyActiveAction]",a),cU("db_error","Failed to update LLM provider")}}async function eA(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid LLM provider id");let c=(0,y.Lf)(),[d]=await c.select({id:k.hG.id}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,a),(0,k.eq)(k.hG.entityId,b.entityId)));if(!d)return cU("not_found","LLM provider not found");return await c.delete(k.hG).where((0,k.eq)(k.hG.id,a)),(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[deleteLlmKeyAction]",a),cU("db_error","Failed to delete LLM provider")}}async function eB(a){let b;try{let c=await cV(),d=eu.safeParse(a);if(!d.success)return cU("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,y.Lf)(),[e]=await a.select({apiKey:k.hG.apiKey}).from(k.hG).where((0,k.Uo)((0,k.eq)(k.hG.id,d.data.keyId),(0,k.eq)(k.hG.entityId,c.entityId)));if(!e)return cU("not_found","LLM provider not found");b=e.apiKey?(0,w.Yc)(e.apiKey):void 0}if(d.data.keyId&&(!b||0===b.length))return cU("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],h=(f??"").replace(/\/$/,"")||g.canonicalBase;if(!h)return cU("validation_failed",`baseUrl is required for ${e}`);let i={Accept:"application/json"},j=`${h}${g.path}`;"bearer"===g.auth&&b&&(i.Authorization=`Bearer ${b}`),"x-api-key"===g.auth&&b&&(i["x-api-key"]=b,i["anthropic-version"]="2023-06-01"),"query"===g.auth&&(j=`${j}?key=${encodeURIComponent(b??"")}`);let l=await fetch(j,{method:"GET",headers:i});if(!l.ok){let a=(await l.text().catch(()=>"")).slice(0,200);return cU("connection_failed",ev(`${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 cT({message:null!==m?`Connected, ${m} models available`:"Connected"})}catch(a){return cU("connection_failed",ev(a instanceof Error?a.message:"Unknown error",b))}}async function eC(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");let c=(0,y.Lf)(),[d]=await c.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,b.entityId)));if(!d)return cU("not_found","Agent not found");let e=await c.select({id:k.tK.id,slug:k.tK.slug,name:k.tK.name,credentialId:k.tK.credentialId,active:k.tK.active}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.entityId,b.entityId),(0,k.eq)(k.tK.active,!0)));if(0===e.length)return cT([]);let f=[...new Set(e.map(a=>a.credentialId).filter(a=>null!==a))],h=new Map;if(f.length>0)for(let a of(await c.select({id:k.z3.id,name:k.z3.name}).from(k.z3).where((0,k.RV)(k.z3.id,f))))h.set(a.id,a.name);let i=await c.select({connectorId:k.XT.connectorId,enabledOperations:k.XT.enabledOperations}).from(k.XT).where((0,k.eq)(k.XT.agentId,a)),j=new Map;for(let a of i)j.set(a.connectorId,{enabledOperations:a.enabledOperations??null});let l=[];for(let a of e){let b=cR[a.slug];if(!b)continue;let c=j.get(a.id);l.push({connectorId:a.id,slug:a.slug,label:a.name,credentialName:a.credentialId?h.get(a.credentialId)??null:null,assigned:void 0!==c,enabledOperations:c?.enabledOperations??null,availableOperations:b.operations})}return cT(l)}catch(a){return console.error("[listAgentConnectorsAction]",a),cU("db_error","Failed to load agent connectors")}}async function eD(a,b,c,d){try{let f=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid agent id");if(!g.Yj().guid().safeParse(b).success)return cU("validation_failed","Invalid connector id");let h=(0,y.Lf)(),[i]=await h.select({id:k.X6.id}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,a),(0,k.eq)(k.X6.entityId,f.entityId)));if(!i)return cU("not_found","Agent not found");let[j]=await h.select({id:k.tK.id}).from(k.tK).where((0,k.Uo)((0,k.eq)(k.tK.id,b),(0,k.eq)(k.tK.entityId,f.entityId)));if(!j)return cU("not_found","Connector not found");return c?await h.insert(k.XT).values({agentId:a,connectorId:b,entityId:f.entityId,enabledOperations:d??null}).onConflictDoUpdate({target:[k.XT.agentId,k.XT.connectorId],set:{enabledOperations:d??null,updatedAt:new Date}}):await h.delete(k.XT).where((0,k.Uo)((0,k.eq)(k.XT.agentId,a),(0,k.eq)(k.XT.connectorId,b))),(0,e.revalidatePath)("/agents"),cT(void 0)}catch(a){return console.error("[setAgentConnectorAssignmentAction]",a),cU("db_error","Failed to update connector assignment")}}async function eE(){try{let a=await cV(),b=(0,y.Lf)(),[c]=await b.select({rootAgentId:k.O5.rootAgentId,rootGrants:k.O5.rootGrants}).from(k.O5).where((0,k.eq)(k.O5.id,a.entityId));if(!c)return cU("not_found","Workspace not found");return cT({rootAgentId:c.rootAgentId??null,grants:(0,r.DI)(c.rootGrants)})}catch(a){return console.error("[getRootConfigAction]",a),cU("db_error","Failed to load ROOT agent config")}}let eF=g.Ik({grants:g.Ik({createAgent:g.zM(),createSkill:g.zM(),updateSkill:g.zM(),assignSkill:g.zM(),createMcp:g.zM(),createConnector:g.zM(),autonomy:g.k5(["propose_confirm","destructive_gate","fully_autonomous"])})});async function eG(a){try{let b=await cV(),c=eF.safeParse(a);if(!c.success)return cU("validation_failed",c.error.issues[0]?.message??"Invalid input");let{grants:d}=c.data,f=(0,y.Lf)(),[g]=await f.select({role:k.V.role}).from(k.V).where((0,k.Uo)((0,k.eq)(k.V.userId,b.userId),(0,k.eq)(k.V.entityId,b.entityId)));if(!g)return cU("not_found","Workspace not found");let[h]=await f.select({rootAgentId:k.O5.rootAgentId}).from(k.O5).where((0,k.eq)(k.O5.id,b.entityId)),i=h?.rootAgentId??null;if(!i)return cU("not_found","No ROOT agent yet — create an orchestrator first");if(await f.update(k.O5).set({rootGrants:d,updatedAt:new Date}).where((0,k.eq)(k.O5.id,b.entityId)),await f.delete(k.bN).where((0,k.Uo)((0,k.eq)(k.bN.entityId,b.entityId),(0,k.RV)(k.bN.toolName,r.yO))),"propose_confirm"===d.autonomy){let a=(0,r.aT)(d);a.length>0&&await f.insert(k.bN).values(a.map(a=>({entityId:b.entityId,agentId:i,toolName:a,action:"require_approval"})))}return(0,e.revalidatePath)("/settings"),cT(void 0)}catch(a){return console.error("[setRootAgentAction]",a),cU("db_error","Failed to save ROOT agent config")}}async function eH(a,b){let[c]=await a.select({rootAgentId:k.O5.rootAgentId}).from(k.O5).where((0,k.eq)(k.O5.id,b)).limit(1),d=c?.rootAgentId??null;if(!d)return{rootAgentId:null,rootName:null};let[e]=await a.select({name:k.X6.name}).from(k.X6).where((0,k.Uo)((0,k.eq)(k.X6.id,d),(0,k.eq)(k.X6.entityId,b))).limit(1);return{rootAgentId:d,rootName:e?.name??null}}async function eI(){try{let a=await cV(),b=(0,y.Lf)(),{rootAgentId:c,rootName:d}=await eH(b,a.entityId);if(!c)return cT({rootAgentId:null,rootName:null,conversations:[]});let e=await b.select({id:k.NP.id,title:k.NP.title,updatedAt:k.NP.updatedAt}).from(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.entityId,a.entityId),(0,k.eq)(k.NP.agentId,c))).orderBy((0,k.i8)(k.NP.updatedAt)).limit(200),f=e.map(a=>a.id),g=new Map;if(f.length>0)for(let a of(await b.select({conversationId:k.p$.conversationId,content:k.p$.content}).from(k.p$).where((0,k.RV)(k.p$.conversationId,f)).orderBy((0,k.i8)(k.p$.createdAt)).limit(1e3)))a.conversationId&&!g.has(a.conversationId)&&g.set(a.conversationId,a.content);let h=e.map(a=>({id:a.id,title:a.title,preview:g.get(a.id)??"",updatedAt:a.updatedAt}));return cT({rootAgentId:c,rootName:d,conversations:h})}catch(a){return console.error("[listConversationsAction]",a),cU("db_error","Failed to load conversations")}}async function eJ(){try{let a=await cV(),b=(0,y.Lf)(),{rootAgentId:c}=await eH(b,a.entityId);if(!c)return cU("no_root_agent","Designate a ROOT agent in Settings first.");let[d]=await b.insert(k.NP).values({entityId:a.entityId,agentId:c,title:""}).returning({id:k.NP.id});if(!d)return cU("db_error","Failed to create conversation");return(0,e.revalidatePath)("/chat"),cT({id:d.id})}catch(a){return console.error("[createConversationAction]",a),cU("db_error","Failed to create conversation")}}async function eK(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid conversation id");let c=(0,y.Lf)();return await c.delete(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.id,a),(0,k.eq)(k.NP.entityId,b.entityId))),(0,e.revalidatePath)("/chat"),cT(void 0)}catch(a){return console.error("[deleteConversationAction]",a),cU("db_error","Failed to delete conversation")}}async function eL(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid conversation id");let c=(0,y.Lf)(),[d]=await c.select({id:k.NP.id}).from(k.NP).where((0,k.Uo)((0,k.eq)(k.NP.id,a),(0,k.eq)(k.NP.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Conversation not found");let e=(await c.select({id:k.p$.id,role:k.p$.role,content:k.p$.content,jobId:k.p$.jobId}).from(k.p$).where((0,k.eq)(k.p$.conversationId,a)).orderBy(k.p$.createdAt).limit(500)).map(a=>({id:a.id,role:a.role,content:a.content,jobId:a.jobId}));return cT({messages:e})}catch(a){return console.error("[listChatAction]",a),cU("db_error","Failed to load chat")}}let eM=g.Ik({conversationId:g.Yj().guid(),message:g.Yj().min(1,"Message is empty").max(1e4)});async function eN(a){try{let b,c=await cV(),d=eM.safeParse(a);if(!d.success)return cU("validation_failed",d.error.issues[0]?.message??"Invalid input");let f=(0,y.Lf)(),{rootAgentId:g}=await eH(f,c.entityId);if(!g)return cU("no_root_agent","Designate a ROOT agent in Settings first.");if(!A._.WORKER_SECRET)return console.error("[sendChatMessageAction] WORKER_SECRET missing — cannot reach runner"),cU("runner_unreachable","Chat backend not configured");try{b=await fetch(`${A._.RUNNER_URL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A._.WORKER_SECRET}`},body:JSON.stringify({entityId:c.entityId,agentId:g,conversationId:d.data.conversationId,message:d.data.message})})}catch(a){return console.error("[sendChatMessageAction] runner unreachable:",a),cU("runner_unreachable","Could not reach the chat backend")}let h=await b.json().catch(()=>null);if(!b.ok)return cU("chat_failed",h?.error??"The agent did not reply");return(0,e.revalidatePath)("/chat"),cT({reply:h?.reply??""})}catch(a){return console.error("[sendChatMessageAction]",a),cU("db_error","Failed to send message")}}async function eO(a){try{let b=await cV();if(!g.Yj().guid().safeParse(a).success)return cU("validation_failed","Invalid job id");let c=(0,y.Lf)(),[d]=await c.select({status:k.ME.status,result:k.ME.result}).from(k.ME).where((0,k.Uo)((0,k.eq)(k.ME.id,a),(0,k.eq)(k.ME.entityId,b.entityId))).limit(1);if(!d)return cU("not_found","Job not found");let e=(await c.select({agentName:k.X6.name,agentSlug:k.X6.slug,status:k.ME.status}).from(k.ME).leftJoin(k.X6,(0,k.eq)(k.X6.id,k.ME.agentId)).where((0,k.eq)(k.ME.parentJobId,a)).orderBy(k.ME.createdAt)).map(a=>({agentName:a.agentName??a.agentSlug??"agent",status:a.status??"pending"}));return cT({status:d.status??"pending",result:d.result,children:e})}catch(a){return console.error("[getChatJobStatusAction]",a),cU("db_error","Failed to load job status")}}(0,cS.D)([cW,cX,cY,cZ,c$,c1,c2,c3,c4,c5,c8,c9,da,db,df,dg,dh,di,dj,dk,dl,dm,dp,dr,ds,dt,dv,dw,dx,dy,dz,dB,dC,dD,dF,dG,dH,dI,dK,dL,dM,dN,dO,dP,dQ,dR,dS,dU,dV,dX,dY,d$,d_,d1,d2,d3,d4,d6,d7,d8,d9,ea,eb,ec,ee,eg,eh,ei,ej,ek,em,en,ep,ew,ex,ey,ez,eA,eB,eC,eD,eE,eG,eI,eJ,eK,eL,eN,eO]),(0,d.A)(cW,"00f347a602753f7d10260f90aab34af24d59ebbd3e",null),(0,d.A)(cX,"40a2f99fceaa61fd4a74b0c6f3b01f599d36e2ea48",null),(0,d.A)(cY,"4052967950b494e22cd435b66a556d540a965df63a",null),(0,d.A)(cZ,"406439137cb7d4544c2b414e89282a6e3c5c373da2",null),(0,d.A)(c$,"4015389522a581e79a290ddf4ccda681da7e3e602f",null),(0,d.A)(c1,"0001a2098a01631f448f8e2e7256c342a70a4f8fce",null),(0,d.A)(c2,"003e18e0fad52d29deb751c8f661f19b7717fcff5c",null),(0,d.A)(c3,"4065c4f7485462878810b4367bb2071b5e7de6a367",null),(0,d.A)(c4,"401f4fb51c8eb3ebbb19cb59c5e23502c68a42d62a",null),(0,d.A)(c5,"4043fd062e51d792226e9aaa93a0578d2066285682",null),(0,d.A)(c8,"403841485f398c760228bf932338d55e8493d0332e",null),(0,d.A)(c9,"40d1bd442c90bc9723cf4f2cb23e3314c55dbe2835",null),(0,d.A)(da,"70d398e886e045c6741c5251cd841a4fb1b585f282",null),(0,d.A)(db,"403928f9cfca7ec3986ffae44cead3466612ae83fa",null),(0,d.A)(df,"70f2a9ff93ddc1531a5571077d2b2726ac5272e9d0",null),(0,d.A)(dg,"60fa3e1656cac7acb3b16deddc01305765d41851ec",null),(0,d.A)(dh,"7041fb86f0b54be1543e88faa8ae18ffff53082138",null),(0,d.A)(di,"40ae45fa762350801d0bbb6a81fbb26079b8b6cc00",null),(0,d.A)(dj,"403601917fce9df1a8214098418b6c880126a33bda",null),(0,d.A)(dk,"408b3de093f9bcf31d51e2be76356609e27b9322d5",null),(0,d.A)(dl,"405fccf8c384bb49d592d555a9d19562d33294a37e",null),(0,d.A)(dm,"400f1516aea326fe8ab6e2c07202680b0da997a3bf",null),(0,d.A)(dp,"402d1dae72e7231c36679c809c8d55365674695323",null),(0,d.A)(dr,"40a775f04cb3ac41b01717bea17e5125c7c323ca14",null),(0,d.A)(ds,"4047290d2ad6a981481bd95c915a26b2dd8b434896",null),(0,d.A)(dt,"40871f9e81ec4546f4f88b8550094fef7bfcd7a418",null),(0,d.A)(dv,"400a618371c75d32e73dfab28acb51b7db500aab1c",null),(0,d.A)(dw,"4052b64a6183fe248882f2c27441addf9e9e07bb4a",null),(0,d.A)(dx,"40d69a1ce58eda67b96c81a500c437e9107611b2d7",null),(0,d.A)(dy,"406bc57145dd20a43bf9eb44ad644423cd40feacc5",null),(0,d.A)(dz,"00724d8c4d22104172f7e88beedeaed018ddaa1b9a",null),(0,d.A)(dB,"4076fe837a437fc16fbfdf9ae42b8d01330ffd1cde",null),(0,d.A)(dC,"40edfa610d9f4f1799cc65a92742ab593c2dafa41b",null),(0,d.A)(dD,"007a4f71348b1fb8b20a43debd7f0814e67c62a266",null),(0,d.A)(dF,"40c2a1a8bbe7ffe80d3ff0c990a6c8654ded77d9a1",null),(0,d.A)(dG,"60e1dae0f6fcb459194ac6847f177cd7ea5167958d",null),(0,d.A)(dH,"60a525fb1a7d0371de2f00a8eb7c3bda7a31685ea6",null),(0,d.A)(dI,"4067a8d48830fe5172f84c37187e6a2383152974dc",null),(0,d.A)(dK,"60b2ec0fde8727e97be37bfe26f8a86ad2dcb409be",null),(0,d.A)(dL,"409c323309b6e0c70c7e5fa891476c4f8a5724ed85",null),(0,d.A)(dM,"4001dcf648a52984ff32bcc647ffa470fb68b09cec",null),(0,d.A)(dN,"788d516a7a7d59ef016aee06fe39b3a2fc32f50e6e",null),(0,d.A)(dO,"60943f6e65ce8746f79a517f650bb15ea55702262c",null),(0,d.A)(dP,"701da93c8522b797df48348b38d4619e704c151a4e",null),(0,d.A)(dQ,"60ec0d7acf6ae077de5c2f5dc3df9068481eac1087",null),(0,d.A)(dR,"60dd24aaaa22c1da2093cefa4bcd38555c7dbda203",null),(0,d.A)(dS,"407e027cfc6438bdd6aa0a116dd96d8b9f1aa95fdd",null),(0,d.A)(dU,"400cfdc41e4bf4ffb900586307c0e1b774f8b5393a",null),(0,d.A)(dV,"00cd03744442b23685f3832db6fb9ae765bd63dfcd",null),(0,d.A)(dX,"409ec0cda17508fdfbb081f36bb78f64a0cedcc1de",null),(0,d.A)(dY,"40cf6a26aa9acd16be3a0c9b353c8102210c884458",null),(0,d.A)(d$,"40633131ff7c417ddc94a2d111d4b7242174d7d3d5",null),(0,d.A)(d_,"40dc8a6b4278d8a81c973ba871e34e76afa12c60fb",null),(0,d.A)(d1,"40314db96cdaf34762dd2363662db4bee58982baf4",null),(0,d.A)(d2,"4092dc652d59fc1cd56ed109ecf08033028030b03b",null),(0,d.A)(d3,"40facb78698674673e654bfa0ef67e6b589d0ea3cc",null),(0,d.A)(d4,"40044cbfd30d3a380dfa65d1f1bac57af888684dfa",null),(0,d.A)(d6,"40d4438800367db8da074265f2947c1bf13285e37a",null),(0,d.A)(d7,"009b2aebb53c355ea693b72eb51ed2b79a06fe0fcb",null),(0,d.A)(d8,"003f32faa2479a4dce73325e1f0b3db3d1f544e270",null),(0,d.A)(d9,"00c5a58fca98e0b66a21c226cc3a16e7cc9ef9e046",null),(0,d.A)(ea,"00e93f5a30fbb4748e0f30addc55e311d26b3a1e21",null),(0,d.A)(eb,"0001eea186e7cab43bced1965c5bda7632b511f398",null),(0,d.A)(ec,"00c88254b0ab7e6527a14ab353f0354a93c22a8e66",null),(0,d.A)(ee,"404ae92a4884f24a9d0d96b484c9a0eb05289bdc1c",null),(0,d.A)(eg,"405441c5447e7f0cc99b8c935b54e903aa38a592ca",null),(0,d.A)(eh,"400ca4c91c055218dcdc663b53bc21d219783e16f2",null),(0,d.A)(ei,"4069f5841b60ff6b623370147903caf7970d85fc29",null),(0,d.A)(ej,"404912c6c805f1cee60f4f4fc38f2528b768406fb6",null),(0,d.A)(ek,"000357a4b97c621c792fba8213ef7ae7505018fcd3",null),(0,d.A)(em,"40de7de0d0c60c355737be884a0f4a3fb4344e7b12",null),(0,d.A)(en,"00728028b2eb4e67b0e2b874b03d370fe1d91bb338",null),(0,d.A)(ep,"4074fba9a9b77f695cae5c335f58c9cb06018ef143",null),(0,d.A)(ew,"0033cc88f3b3477b989e9df2edac4a6ce3e3f58250",null),(0,d.A)(ex,"405e6ab4f6b3f7d0ca79943dd7c850fefad7099fbe",null),(0,d.A)(ey,"4037207befca10bb542d700e5232bd286c98781d5e",null),(0,d.A)(ez,"6027df2597319ed4f15048c44cfae75dec92fd42fc",null),(0,d.A)(eA,"40de046de0bddf3387f259087a088306728aef5546",null),(0,d.A)(eB,"40162d8df2e52a907c99cd0a9d8d4bc05202f4d5e5",null),(0,d.A)(eC,"406e77ecff957cc585bcb26dd261255f9f2898d578",null),(0,d.A)(eD,"78098002e441d38ebd5b6eec9b95f9890febb3b6dd",null),(0,d.A)(eE,"0055a5e407a06696d0cd78161c2024a7dc0f865735",null),(0,d.A)(eG,"40ebde0ab3fe9c43462ac8e177421049003d8f251a",null),(0,d.A)(eI,"00471a08cbfe30783ae558daa3926bdd257abcca26",null),(0,d.A)(eJ,"00e380381f0bf9caafc2c162493236800179ff748d",null),(0,d.A)(eK,"402dd9b41913f4df0dc409b17a7f342badb27eda92",null),(0,d.A)(eL,"40bb25b856f502b069916be582ba5ba4b59f0fd377",null),(0,d.A)(eN,"40ae142f3021cbdd06d5717bdffcc1ad58e6031d04",null),(0,d.A)(eO,"40e7f8235ea05603b604a187b6856b07f20c86ca28",null)},7316:(a,b,c)=>{Promise.resolve().then(c.bind(c,55053))},17030:(a,b,c)=>{"use strict";c.d(b,{Y:()=>d.YT});var d=c(36535)},19259:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,67448,23)),Promise.resolve().then(c.t.bind(c,2667,23)),Promise.resolve().then(c.t.bind(c,10903,23)),Promise.resolve().then(c.t.bind(c,11162,23)),Promise.resolve().then(c.t.bind(c,23838,23)),Promise.resolve().then(c.t.bind(c,83466,23)),Promise.resolve().then(c.t.bind(c,12127,23)),Promise.resolve().then(c.bind(c,26698))},28659:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(64565),f=c(44625);function g(){let[a,b]=(0,e.useState)(!1);async function c(){b(!0);try{let a=await fetch("/api/auth/sign-out",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}",credentials:"same-origin"});a.ok||console.error("sign-out failed",a.status,await a.text().catch(()=>""))}catch(a){console.error("sign-out network error",a)}window.location.replace("/login")}return(0,d.jsx)("button",{type:"button",onClick:c,disabled:a,"data-testid":"user-menu-sign-out","aria-label":"Sign out",title:"Sign out",className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-ink-3 transition-colors hover:bg-hover hover:text-ink disabled:cursor-not-allowed disabled:opacity-40",children:(0,d.jsx)(f.M,{size:15})})}},36105:()=>{},42705:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>D});var d=c(99386),e=c(66402),f=c(95809),g=c(42112),h=c(62952),i=c(81590),j=c(35675),k=c(90454),l=c(95488),m=c(75224),n=c(97173);async function o(){let a=m._.AUTH_MODE;if("local-trust"===a)return(0,d.jsx)(q,{icon:(0,d.jsx)(i.o,{size:13,weight:"fill"}),label:"Local trust",hint:"No auth — single-user install"});if("bearer-token"===a)return(0,d.jsx)(q,{icon:(0,d.jsx)(i.o,{size:13,weight:"fill"}),label:"API token"});let b=await p();return b?(0,d.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-rule-2 bg-paper px-2.5 py-2",children:[(0,d.jsx)("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-hover text-ink-3",children:(0,d.jsx)(j.K,{size:13,weight:"fill"})}),(0,d.jsx)("div",{className:"min-w-0 flex-1","data-testid":"user-menu-email",children:(0,d.jsx)("p",{className:"truncate text-xs font-medium text-ink",title:b,children:b})}),(0,d.jsx)(n.default,{})]}):null}async function p(){try{let a=await (0,e.headers)(),b=new Request("http://localhost/",{headers:a}),c=await (0,l.sj)(b),d=await (0,l.Lf)().select({email:k.VV.email}).from(k.VV).where((0,k.eq)(k.VV.id,c.userId)).limit(1);return d[0]?.email??null}catch{return null}}function q({icon:a,label:b,hint:c}){return(0,d.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-rule-2 bg-paper px-2.5 py-2",children:[(0,d.jsx)("div",{className:"shrink-0 text-ok",children:a}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("p",{className:"text-xs font-medium leading-tight text-ink",children:b}),c&&(0,d.jsx)("p",{className:"mt-0.5 truncate text-[10px] text-ink-3",children:c})]})]})}var r=c(13579),s=c(36937),t=c(92002);function u({children:a,badge:b,size:c="md",className:e="",type:f="button",...g}){return(0,d.jsxs)("button",{type:f,className:`relative flex shrink-0 items-center justify-center border border-rule-2 bg-paper text-ink-2 transition-colors hover:text-ink ${"md"===c?"h-[34px] w-[34px] rounded-md":"h-[30px] w-[30px] rounded-[7px]"} ${e}`,...g,children:[a,b&&(0,d.jsx)("span",{className:"absolute top-[6px] right-[7px] h-1.5 w-1.5 rounded-full bg-skill-vivid"})]})}var v=c(88866),w=c(85598),x=c.n(w);let y={ink:"bg-ink text-canvas hover:brightness-[0.92]",coral:"bg-skill-vivid text-white hover:brightness-[0.94]",blue:"bg-conn-vivid text-white hover:brightness-[0.94]"};function z(a){let{children:b,variant:c="ink",size:e="md",className:f=""}=a,g=`inline-flex items-center justify-center gap-1.5 rounded-md font-medium leading-none border-0 cursor-pointer transition-[filter] ${"md"===e?"h-[34px] px-3.5 text-[13px]":"h-[30px] px-3 text-[12px]"} ${y[c]} ${f}`;if("href"in a&&a.href){let{href:c,variant:e,size:f,className:h,children:i,...j}=a;return(0,d.jsx)(x(),{href:c,className:g,...j,children:b})}let{variant:h,size:i,className:j,children:k,...l}=a;return(0,d.jsx)("button",{type:"button",className:g,...l,children:b})}function A({left:a,primaryHref:b="/agents",primaryLabel:c="New agent",showPrimary:e=!0,showSearch:f=!0}){return(0,d.jsxs)("div",{className:"flex h-[52px] shrink-0 items-center gap-2 px-4 md:gap-2.5 md:px-9",children:[a,(0,d.jsx)("div",{className:"flex-1"}),f&&(0,d.jsx)(t.default,{className:"hidden md:flex"}),(0,d.jsx)(u,{"aria-label":"Notifications",title:"Notifications",badge:!0,children:(0,d.jsx)(r.I,{size:15})}),(0,d.jsx)(v.default,{}),e&&(0,d.jsxs)(z,{variant:"ink",href:b,"aria-label":c,title:c,children:[(0,d.jsx)(s.F,{size:13,weight:"bold"}),(0,d.jsx)("span",{className:"hidden md:inline",children:c})]})]})}var B=c(93690),C=c(5786);async function D({children:a}){try{let a=await (0,e.headers)(),b=new Request("http://localhost/",{headers:a});await (0,l.sj)(b)}catch(a){throw a instanceof g.lR&&(0,f.redirect)("/login"),a instanceof g.vB&&(0,f.redirect)("/onboarding"),a}let b=[],c=await (0,C.zh)();return c.ok&&(b=c.data),(0,d.jsxs)("div",{className:"flex min-h-screen bg-canvas text-ink",children:[(0,d.jsx)(h.default,{workspaces:b,userMenu:(0,d.jsx)(o,{})}),(0,d.jsxs)("main",{className:"flex min-w-0 flex-1 flex-col pt-[58px] lg:ml-[220px] lg:pt-0",children:[(0,d.jsx)(A,{}),(0,d.jsx)("div",{className:"flex-1 overflow-x-hidden",children:(0,d.jsx)("div",{className:"max-w-6xl px-5 pb-10 sm:px-8 lg:px-9",children:a})})]}),(0,d.jsx)(B.default,{})]})}},43136:(a,b,c)=>{"use strict";c.d(b,{default:()=>h});var d=c(10476),e=c(64565),f=c(62515),g=c(2447);function h(){let[a,b]=(0,e.useState)("light"),[c,h]=(0,e.useState)(!1),i="dark"===a?f.b:g.A,j="dark"===a?"Switch to light theme":"Switch to dark theme";return(0,d.jsx)("button",{type:"button",onClick:()=>{let c="dark"===a?"light":"dark";document.documentElement.setAttribute("data-theme",c);try{localStorage.setItem("nodal.theme",c)}catch{}b(c)},"aria-label":j,title:j,className:"flex h-[34px] w-[34px] items-center justify-center rounded-md border border-rule-2 bg-paper text-ink-2 transition-colors hover:text-ink",suppressHydrationWarning:!0,children:c?(0,d.jsx)(i,{size:15}):(0,d.jsx)(g.A,{size:15})})}},43828:(a,b,c)=>{Promise.resolve().then(c.bind(c,86688)),Promise.resolve().then(c.bind(c,28659)),Promise.resolve().then(c.bind(c,3808)),Promise.resolve().then(c.bind(c,57712)),Promise.resolve().then(c.bind(c,43136)),Promise.resolve().then(c.t.bind(c,88831,23))},44100:(a,b,c)=>{"use strict";c.d(b,{A:()=>g});var d=c(10476);let e={ok:"bg-ok",lime:"bg-agent-vivid",coral:"bg-skill-vivid",blue:"bg-conn-vivid"},f={ok:"animate-[blip_1.4s_ease-out_infinite]",lime:"animate-[blip-lime_1.5s_ease-out_infinite]",coral:"animate-[blip-coral_1.4s_ease-out_infinite]",blue:"animate-[blip-blue_1.4s_ease-out_infinite]"};function g({variant:a="ok",size:b="sm",animate:c=!0,className:h=""}){return(0,d.jsx)("span",{className:`inline-block shrink-0 rounded-full ${"sm"===b?"h-[7px] w-[7px]":"h-2 w-2"} ${e[a]} ${c?f[a]:""} ${h}`})}},47101:(a,b,c)=>{"use strict";c.d(b,{O:()=>e});var d=c(47092);let e=(0,d.createServerReference)("40a2f99fceaa61fd4a74b0c6f3b01f599d36e2ea48",d.callServer,void 0,d.findSourceMapURL,"createWorkspaceAction")},49269:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(99386),e=c(85598),f=c.n(e);function g(){return(0,d.jsx)("div",{className:"flex min-h-screen w-full items-center justify-center bg-canvas px-4",children:(0,d.jsxs)("div",{className:"text-center space-y-4",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold text-ink",children:"404 — Page not found"}),(0,d.jsx)("p",{className:"text-sm text-ink-3",children:"This page doesn't exist."}),(0,d.jsx)(f(),{href:"/",className:"inline-block rounded-lg bg-agent-vivid text-canvas px-4 py-2 text-sm font-semibold hover:bg-agent-vivid transition-colors",children:"Go to dashboard"})]})})}},53626:(a,b,c)=>{"use strict";c.d(b,{W:()=>e});var d=c(47092);let e=(0,d.createServerReference)("4052967950b494e22cd435b66a556d540a965df63a",d.callServer,void 0,d.findSourceMapURL,"switchWorkspaceAction")},54580:(a,b,c)=>{Promise.resolve().then(c.bind(c,84327))},54620:()=>{},54792:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,61186,23)),Promise.resolve().then(c.t.bind(c,6621,23)),Promise.resolve().then(c.t.bind(c,41837,23)),Promise.resolve().then(c.t.bind(c,85060,23)),Promise.resolve().then(c.t.bind(c,43484,23)),Promise.resolve().then(c.t.bind(c,8376,23)),Promise.resolve().then(c.t.bind(c,74625,23)),Promise.resolve().then(c.t.bind(c,51080,23))},55053:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(10476);function e({error:a,reset:b}){return(0,d.jsx)("div",{className:"flex min-h-screen w-full items-center justify-center bg-canvas px-4",children:(0,d.jsxs)("div",{className:"text-center space-y-4",children:[(0,d.jsx)("h1",{className:"text-2xl font-bold text-ink",children:"Something went wrong"}),(0,d.jsx)("p",{className:"text-sm text-ink-3",children:a.message}),(0,d.jsx)("button",{onClick:b,className:"rounded-lg bg-agent-vivid text-canvas px-4 py-2 text-sm font-semibold hover:bg-agent-vivid transition-colors",children:"Try again"})]})})}c(64565)},57712:(a,b,c)=>{"use strict";c.d(b,{default:()=>g});var d=c(10476),e=c(64565),f=c(48082);function g(){let[a,b]=(0,e.useState)("light");return(0,d.jsx)(f.l$,{theme:a,position:"bottom-right",richColors:!0,closeButton:!0})}},59166:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,88831,23))},59234:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,61186,23))},62952:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\Sidebar.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\Sidebar.tsx","default")},63894:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,16385,23))},69679:(a,b,c)=>{"use strict";c.d(b,{A:()=>f,S:()=>e});var d=c(10476);let e=["\uD83D\uDDC2️","\uD83C\uDFE0","\uD83D\uDCBC","\uD83D\uDE80","\uD83E\uDDEA","\uD83C\uDFA8","\uD83D\uDCCA","\uD83D\uDEE0️","\uD83C\uDF10","⚡","\uD83E\uDD16","\uD83D\uDCE6"];function f({value:a,onChange:b,disabled:c}){return(0,d.jsx)("div",{className:"flex flex-wrap gap-1",children:e.map(e=>{let f=a===e;return(0,d.jsx)("button",{type:"button",disabled:c,"aria-pressed":f,onClick:()=>b(e),className:`flex h-8 w-8 items-center justify-center rounded-md border text-[15px] leading-none transition-colors disabled:opacity-50 ${f?"border-ink bg-hover-2":"border-rule-2 hover:bg-hover"}`,children:e},e)})})}},70615:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>j,metadata:()=>i});var d=c(99386),e=c(50277),f=c.n(e),g=c(80356),h=c.n(g);c(54620);let i={title:"Nodal-Agents",description:"Multi-agent platform"};function j({children:a}){return(0,d.jsxs)("html",{lang:"en",className:`${f().variable} ${h().variable}`,suppressHydrationWarning:!0,children:[(0,d.jsx)("head",{children:(0,d.jsx)("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('nodal.theme');if(t!=='dark'&&t!=='light')t='light';document.documentElement.setAttribute('data-theme',t);}catch(e){document.documentElement.setAttribute('data-theme','light');}})();"}})}),(0,d.jsx)("body",{children:a})]})}},70953:()=>{},77386:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,67448,23))},84327:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\app\\\\error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\app\\error.tsx","default")},86688:(a,b,c)=>{"use strict";c.d(b,{default:()=>R});var d=c(10476),e=c(64565),f=c(12418),g=c(77568),h=c(3521),i=c(82271),j=c(13028),k=c(83588),l=c(92607),m=c(1282),n=c(73836),o=c(11145),p=c(66442),q=c(63473),r=c(84132),s=c(64945),t=c(8161),u=c(55234),v=c(11745),w=c(93720),x=c(4870);function y(){return(0,d.jsx)("div",{className:"px-4 pb-3.5",children:(0,d.jsxs)("div",{className:"flex items-center gap-2 text-[16px] font-medium leading-none tracking-[-0.005em] text-ink",children:[(0,d.jsx)("span",{className:"flex h-[22px] w-[22px] items-center justify-center rounded-md bg-ink text-[11px] font-semibold leading-none tracking-[0.04em] text-canvas font-mono",children:"N"}),(0,d.jsx)("span",{children:"Nodal-Agents"})]})})}function z({children:a}){return(0,d.jsx)("div",{className:"px-3.5 pt-3.5 pb-1 font-mono text-[9.5px] uppercase tracking-[0.14em] text-ink-4",children:a})}var A=c(88831),B=c.n(A);let C={agent:"bg-agent-vivid",skill:"bg-skill-vivid",conn:"bg-conn-vivid"};function D({href:a,label:b,icon:c,dot:e,count:g,isActive:h}){let i=(0,f.usePathname)(),j=h??(i===a||i.startsWith(a+"/"));return(0,d.jsxs)(B(),{href:a,className:`group mx-2 flex h-[30px] items-center gap-2.5 rounded-lg px-2.5 text-[12.5px] leading-none transition-colors ${j?"bg-paper text-ink font-medium shadow-[0_1px_2px_rgba(0,0,0,0.04)]":"text-ink-2 hover:bg-hover"}`,children:[e?(0,d.jsx)("span",{className:`h-2 w-2 shrink-0 rounded-full ${C[e]}`}):(0,d.jsx)("span",{className:`flex h-3.5 w-3.5 shrink-0 items-center justify-center ${j?"text-ink":"text-ink-3 group-hover:text-ink-2"}`,children:c}),(0,d.jsx)("span",{className:"flex-1 truncate",children:b}),void 0!==g&&(0,d.jsx)("span",{className:"font-mono text-[10px] tracking-[0.02em] text-ink-4",children:g})]})}var E=c(44100);function F({runningAgents:a,throughput:b,fill:c=.36}){if(void 0===a)return null;let e=100*Math.max(0,Math.min(1,c));return(0,d.jsxs)("div",{className:"mx-3 mt-2.5 rounded-[10px] border border-rule-2 bg-paper px-3 pt-2.5 pb-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5 font-mono text-[9.5px] uppercase leading-none tracking-[0.14em] text-ink-3",children:[(0,d.jsx)(E.A,{variant:"lime"}),"Live"]}),(0,d.jsxs)("div",{className:"mt-1.5 text-[12.5px] leading-[1.35] text-ink-2",children:[(0,d.jsxs)("b",{className:"font-semibold text-ink",children:[a," agents"]}),b?` running \xb7 ${b}`:" running"]}),(0,d.jsx)("div",{className:"mt-2.5 h-[3px] overflow-hidden rounded-[2px] bg-black/[0.06] dark:bg-white/[0.06]",children:(0,d.jsx)("i",{className:"block h-full bg-agent-vivid",style:{width:`${e}%`}})})]})}var G=c(48082),H=c(23586),I=c(42199);function J({fleets:a,activeId:b,disabled:c,onChange:f,onNewWorkspace:g}){let[h,i]=(0,e.useState)(!1),j=(0,e.useRef)(null),k=a.find(a=>a.id===b)??a[0];return k?(0,d.jsxs)("div",{ref:j,className:"relative mx-3.5 mt-3.5 mb-1",children:[(0,d.jsxs)("button",{type:"button",onClick:()=>!c&&i(a=>!a),"aria-haspopup":"listbox","aria-expanded":h,"aria-disabled":c||void 0,className:`flex h-[38px] w-full items-center gap-2.5 rounded-[9px] border border-rule-2 bg-paper px-2.5 text-[13px] leading-none text-ink ${c?"cursor-default":"cursor-pointer hover:bg-hover-2/40"}`,children:[(0,d.jsx)("span",{className:"flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-[5px] font-mono text-[10.5px] font-semibold leading-none tracking-[0.04em] text-[#0a0a0a]",style:{background:k.color},children:k.icon??k.tag.slice(0,2)}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate text-left text-[12.5px] font-medium text-ink",children:k.name}),!c&&(0,d.jsx)(H.a,{size:12,className:"shrink-0 text-ink-3"})]}),h&&!c&&(0,d.jsxs)("div",{role:"listbox",className:"absolute inset-x-0 top-[calc(100%+6px)] z-30 rounded-[9px] border border-rule-2 bg-paper p-1.5 shadow-[0_12px_32px_rgba(0,0,0,0.10)]",children:[a.map(a=>{let c=a.id===b;return(0,d.jsxs)("div",{role:"option","aria-selected":c,onClick:()=>{f?.(a.id),i(!1)},className:`flex cursor-pointer items-center gap-2.5 rounded-md px-2 py-1.5 text-[12.5px] leading-[1.2] text-ink-2 hover:bg-hover ${c?"bg-hover-2":""}`,children:[(0,d.jsx)("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center rounded-[5px] font-mono text-[10px] font-semibold leading-none tracking-[0.04em] text-[#0a0a0a]",style:{background:a.color},children:a.icon??a.tag.slice(0,2)}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate font-medium text-ink",children:a.name}),(0,d.jsx)(I.J,{size:12,weight:"bold",className:`text-ink ${c?"opacity-100":"opacity-0"}`})]},a.id)}),g&&(0,d.jsxs)("button",{type:"button",onClick:()=>{i(!1),g()},className:"mt-1 flex w-full items-center gap-2 rounded-md border-t border-rule px-2 py-1.5 text-[12px] font-medium text-ink-3 hover:bg-hover hover:text-ink-2 transition-colors",children:[(0,d.jsx)("span",{className:"flex h-4 w-4 items-center justify-center rounded text-[12px] leading-none",children:"+"}),"New workspace"]})]})]}):null}var K=c(69679),L=c(53626),M=c(47101);let N=["#d4ff2e","#74b9ff","#a29bfe","#fd79a8","#55efc4","#fdcb6e","#e17055","#6c5ce7"];function O(a){return{id:a.id,name:a.name,tag:a.name.replace(/[^a-zA-Z0-9]/g,"").slice(0,3).toUpperCase()||"WS",color:function(a){let b=0;for(let c=0;c<a.length;c+=1)b=31*b+a.charCodeAt(c)>>>0;return N[b%N.length]??N[0]}(a.slug),icon:a.icon??void 0}}function P({workspaces:a}){let b=(0,f.useRouter)(),[c,g]=(0,e.useTransition)(),[h,i]=(0,e.useTransition)(),[j,k]=(0,e.useState)(!1),[l,m]=(0,e.useState)(""),[n,o]=(0,e.useState)(K.S[0]),p=(0,e.useRef)(null),q=a.map(O),r=a.find(a=>a.active),s=r?.id??q[0]?.id??"";return(0,d.jsxs)("div",{children:[(0,d.jsx)(J,{fleets:q,activeId:s,onChange:function(a){a===s||c||g(async()=>{let c=await (0,L.W)({id:a});c.ok?b.refresh():G.oR.error(c.message)})},disabled:c||0===q.length,onNewWorkspace:function(){k(!0),m(""),o(K.S[0]),requestAnimationFrame(()=>p.current?.focus())}}),j&&(0,d.jsxs)("form",{onSubmit:function(a){a.preventDefault();let c=l.trim();c&&i(async()=>{let a=await (0,M.O)({name:c,icon:n});if(!a.ok)return void G.oR.error(a.message);let d=await (0,L.W)({id:a.data.id});d.ok?(k(!1),m(""),G.oR.success(`Workspace "${c}" created`),b.refresh()):G.oR.error(d.message)})},className:"mx-3.5 mt-1 rounded-[9px] border border-rule-2 bg-paper p-2.5",children:[(0,d.jsx)("p",{className:"mb-1.5 font-mono text-[10px] uppercase tracking-[0.1em] text-ink-4",children:"New workspace"}),(0,d.jsx)("div",{className:"mb-2",children:(0,d.jsx)(K.A,{value:n,onChange:o,disabled:h})}),(0,d.jsxs)("div",{className:"flex gap-1.5",children:[(0,d.jsx)("input",{ref:p,type:"text",value:l,onChange:a=>m(a.target.value),placeholder:"Name…",maxLength:60,disabled:h,className:"min-w-0 flex-1 rounded-md border border-rule bg-canvas px-2.5 py-1.5 text-[12.5px] text-ink placeholder:text-ink-4 focus:border-ink-3 focus:outline-none disabled:opacity-50"}),(0,d.jsx)("button",{type:"submit",disabled:h||!l.trim(),className:"shrink-0 rounded-md bg-ink px-3 py-1.5 text-[12px] font-medium text-canvas hover:brightness-90 disabled:cursor-not-allowed disabled:opacity-50",children:h?"…":"Create"}),(0,d.jsx)("button",{type:"button",onClick:()=>k(!1),disabled:h,className:"shrink-0 rounded-md border border-rule px-2.5 py-1.5 text-[12px] text-ink-3 hover:border-rule-2 hover:text-ink-2 disabled:opacity-50",children:"✕"})]})]})]})}let Q=[{section:"Overview",items:[{href:"/",label:"Home",icon:g.t},{href:"/chat",label:"Chat",icon:h.x},{href:"/jobs",label:"Runs",icon:i.T},{href:"/llm-providers",label:"LLM Providers",icon:j.R}]},{section:"Build",items:[{href:"/agents",label:"Agents",icon:k.n,dot:"agent"},{href:"/skills",label:"Skills",icon:l.f,dot:"skill"},{href:"/connectors",label:"API Connectors",icon:m.F,dot:"conn"},{href:"/mcp",label:"MCP Connectors",icon:n.X,dot:"conn"},{href:"/credentials",label:"Credentials",icon:o.U},{href:"/memories",label:"Memory",icon:p.j}]},{section:"Operate",items:[{href:"/automations",label:"Automation",icon:q.E},{href:"/approvals",label:"Approvals",icon:r.o},{href:"/logs",label:"Logs",icon:s.m}]},{section:"Workspace",items:[{href:"https://discord.gg/7UZsvZPgU",label:"Join Discord",external:!0},{href:"/billing",label:"Billing",icon:t.S},{href:"/settings",label:"Settings",icon:u._}]}];function R({workspaces:a,userMenu:b}){let c=(0,f.usePathname)(),[g,h]=(0,e.useState)(!1);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"fixed top-0 right-0 left-0 z-40 flex items-center justify-between border-b border-rule-2 bg-sidebar px-4 py-3.5 lg:hidden",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-[14px] font-medium tracking-[-0.005em] text-ink",children:[(0,d.jsx)("span",{className:"flex h-[20px] w-[20px] items-center justify-center rounded-md bg-ink font-mono text-[10px] font-semibold text-canvas",children:"N"}),(0,d.jsx)("span",{children:"Nodal-Agents"})]}),(0,d.jsx)("button",{type:"button",onClick:()=>h(a=>!a),className:"text-ink-3 transition-colors hover:text-ink","aria-label":g?"Close menu":"Open menu",children:g?(0,d.jsx)(v.X,{size:20}):(0,d.jsx)(w.B,{size:20})})]}),g&&(0,d.jsx)("div",{className:"fixed inset-0 z-30 bg-black/40 lg:hidden",onClick:()=>h(!1),"aria-hidden":!0}),(0,d.jsxs)("aside",{className:`fixed top-0 left-0 z-40 flex h-full w-[220px] flex-col border-r border-rule-2 bg-sidebar pt-4 pb-3 transition-transform duration-200 lg:translate-x-0 ${g?"translate-x-0":"-translate-x-full"}`,children:[(0,d.jsx)(y,{}),(0,d.jsx)(P,{workspaces:a??[]}),(0,d.jsx)("nav",{className:"flex flex-1 flex-col overflow-y-auto py-1.5",children:Q.map((a,b)=>(0,d.jsxs)("div",{children:[a.section&&(0,d.jsx)(z,{children:a.section}),a.items.map(a=>a.external?(0,d.jsxs)("a",{href:a.href,target:"_blank",rel:"noopener noreferrer",className:"group mx-2 flex h-[30px] items-center gap-2.5 rounded-lg bg-[#5865F2] px-2.5 text-[12.5px] font-medium leading-none text-white transition-[filter] hover:brightness-110",children:[(0,d.jsx)("span",{className:"flex h-3.5 w-3.5 shrink-0 items-center justify-center",children:(0,d.jsx)(x.B,{size:14,weight:"bold"})}),(0,d.jsx)("span",{className:"flex-1 truncate",children:a.label})]},a.href):(0,d.jsx)(D,{href:a.href,label:a.label,icon:a.icon?(0,d.jsx)(a.icon,{size:14}):void 0,dot:a.dot,count:a.count,isActive:"/"===a.href?"/"===c:c===a.href||c.startsWith(a.href+"/")},a.href))]},b))}),(0,d.jsx)(F,{runningAgents:void 0}),b&&(0,d.jsx)("div",{className:"mt-2 border-t border-rule-2 px-3 pt-3","data-testid":"user-menu",children:b})]})]})}},88866:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\ThemeToggle.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\ThemeToggle.tsx","default")},91092:(a,b,c)=>{Promise.resolve().then(c.bind(c,62952)),Promise.resolve().then(c.bind(c,97173)),Promise.resolve().then(c.bind(c,92002)),Promise.resolve().then(c.bind(c,93690)),Promise.resolve().then(c.bind(c,88866)),Promise.resolve().then(c.t.bind(c,16385,23))},92002:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\SearchBox.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\SearchBox.tsx","default")},93690:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\ui\\\\ThemedToaster.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\ui\\ThemedToaster.tsx","default")},96591:(a,b,c)=>{"use strict";c.d(b,{ZH:()=>d.ZH,ip:()=>d.R3});var d=c(36535)},97173:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(49554).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\APPS\\\\NodalAI\\\\apps\\\\web\\\\src\\\\components\\\\SignOutButton.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\APPS\\NodalAI\\apps\\web\\src\\components\\SignOutButton.tsx","default")},99740:(a,b,c)=>{"use strict";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))}}};