ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

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 (535) hide show
  1. agentui/.prettierrc +15 -0
  2. agentui/QUICKSTART.md +272 -0
  3. agentui/README.md +59 -0
  4. agentui/env.example +16 -0
  5. agentui/jsconfig.json +14 -0
  6. agentui/package-lock.json +4242 -0
  7. agentui/package.json +34 -0
  8. agentui/scripts/postinstall/apply-patches.mjs +260 -0
  9. agentui/src/app.css +61 -0
  10. agentui/src/app.d.ts +13 -0
  11. agentui/src/app.html +12 -0
  12. agentui/src/components/LoadingSpinner.svelte +64 -0
  13. agentui/src/components/ThemeSwitcher.svelte +159 -0
  14. agentui/src/components/index.js +4 -0
  15. agentui/src/lib/api/bots.ts +60 -0
  16. agentui/src/lib/api/chat.ts +22 -0
  17. agentui/src/lib/api/http.ts +25 -0
  18. agentui/src/lib/components/BotCard.svelte +33 -0
  19. agentui/src/lib/components/ChatBubble.svelte +63 -0
  20. agentui/src/lib/components/Toast.svelte +21 -0
  21. agentui/src/lib/config.ts +20 -0
  22. agentui/src/lib/stores/auth.svelte.ts +73 -0
  23. agentui/src/lib/stores/theme.svelte.js +64 -0
  24. agentui/src/lib/stores/toast.svelte.ts +31 -0
  25. agentui/src/lib/utils/conversation.ts +39 -0
  26. agentui/src/routes/+layout.svelte +20 -0
  27. agentui/src/routes/+page.svelte +232 -0
  28. agentui/src/routes/login/+page.svelte +200 -0
  29. agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
  30. agentui/src/routes/talk/[agentId]/+page.ts +7 -0
  31. agentui/static/README.md +1 -0
  32. agentui/svelte.config.js +11 -0
  33. agentui/tailwind.config.ts +53 -0
  34. agentui/tsconfig.json +3 -0
  35. agentui/vite.config.ts +10 -0
  36. ai_parrot-0.17.2.dist-info/METADATA +472 -0
  37. ai_parrot-0.17.2.dist-info/RECORD +535 -0
  38. ai_parrot-0.17.2.dist-info/WHEEL +6 -0
  39. ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
  40. ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
  41. ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
  42. crew-builder/.prettierrc +15 -0
  43. crew-builder/QUICKSTART.md +259 -0
  44. crew-builder/README.md +113 -0
  45. crew-builder/env.example +17 -0
  46. crew-builder/jsconfig.json +14 -0
  47. crew-builder/package-lock.json +4182 -0
  48. crew-builder/package.json +37 -0
  49. crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
  50. crew-builder/src/app.css +62 -0
  51. crew-builder/src/app.d.ts +13 -0
  52. crew-builder/src/app.html +12 -0
  53. crew-builder/src/components/LoadingSpinner.svelte +64 -0
  54. crew-builder/src/components/ThemeSwitcher.svelte +149 -0
  55. crew-builder/src/components/index.js +9 -0
  56. crew-builder/src/lib/api/bots.ts +60 -0
  57. crew-builder/src/lib/api/chat.ts +80 -0
  58. crew-builder/src/lib/api/client.ts +56 -0
  59. crew-builder/src/lib/api/crew/crew.ts +136 -0
  60. crew-builder/src/lib/api/index.ts +5 -0
  61. crew-builder/src/lib/api/o365/auth.ts +65 -0
  62. crew-builder/src/lib/auth/auth.ts +54 -0
  63. crew-builder/src/lib/components/AgentNode.svelte +43 -0
  64. crew-builder/src/lib/components/BotCard.svelte +33 -0
  65. crew-builder/src/lib/components/ChatBubble.svelte +67 -0
  66. crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
  67. crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
  68. crew-builder/src/lib/components/JsonViewer.svelte +24 -0
  69. crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
  70. crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
  71. crew-builder/src/lib/components/Toast.svelte +67 -0
  72. crew-builder/src/lib/components/Toolbar.svelte +157 -0
  73. crew-builder/src/lib/components/index.ts +10 -0
  74. crew-builder/src/lib/config.ts +8 -0
  75. crew-builder/src/lib/stores/auth.svelte.ts +228 -0
  76. crew-builder/src/lib/stores/crewStore.ts +369 -0
  77. crew-builder/src/lib/stores/theme.svelte.js +145 -0
  78. crew-builder/src/lib/stores/toast.svelte.ts +69 -0
  79. crew-builder/src/lib/utils/conversation.ts +39 -0
  80. crew-builder/src/lib/utils/markdown.ts +122 -0
  81. crew-builder/src/lib/utils/talkHistory.ts +47 -0
  82. crew-builder/src/routes/+layout.svelte +20 -0
  83. crew-builder/src/routes/+page.svelte +539 -0
  84. crew-builder/src/routes/agents/+page.svelte +247 -0
  85. crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
  86. crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
  87. crew-builder/src/routes/builder/+page.svelte +204 -0
  88. crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
  89. crew-builder/src/routes/crew/ask/+page.ts +1 -0
  90. crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
  91. crew-builder/src/routes/login/+page.svelte +197 -0
  92. crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
  93. crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
  94. crew-builder/static/README.md +1 -0
  95. crew-builder/svelte.config.js +11 -0
  96. crew-builder/tailwind.config.ts +53 -0
  97. crew-builder/tsconfig.json +3 -0
  98. crew-builder/vite.config.ts +10 -0
  99. mcp_servers/calculator_server.py +309 -0
  100. parrot/__init__.py +27 -0
  101. parrot/__pycache__/__init__.cpython-310.pyc +0 -0
  102. parrot/__pycache__/version.cpython-310.pyc +0 -0
  103. parrot/_version.py +34 -0
  104. parrot/a2a/__init__.py +48 -0
  105. parrot/a2a/client.py +658 -0
  106. parrot/a2a/discovery.py +89 -0
  107. parrot/a2a/mixin.py +257 -0
  108. parrot/a2a/models.py +376 -0
  109. parrot/a2a/server.py +770 -0
  110. parrot/agents/__init__.py +29 -0
  111. parrot/bots/__init__.py +12 -0
  112. parrot/bots/a2a_agent.py +19 -0
  113. parrot/bots/abstract.py +3139 -0
  114. parrot/bots/agent.py +1129 -0
  115. parrot/bots/basic.py +9 -0
  116. parrot/bots/chatbot.py +669 -0
  117. parrot/bots/data.py +1618 -0
  118. parrot/bots/database/__init__.py +5 -0
  119. parrot/bots/database/abstract.py +3071 -0
  120. parrot/bots/database/cache.py +286 -0
  121. parrot/bots/database/models.py +468 -0
  122. parrot/bots/database/prompts.py +154 -0
  123. parrot/bots/database/retries.py +98 -0
  124. parrot/bots/database/router.py +269 -0
  125. parrot/bots/database/sql.py +41 -0
  126. parrot/bots/db/__init__.py +6 -0
  127. parrot/bots/db/abstract.py +556 -0
  128. parrot/bots/db/bigquery.py +602 -0
  129. parrot/bots/db/cache.py +85 -0
  130. parrot/bots/db/documentdb.py +668 -0
  131. parrot/bots/db/elastic.py +1014 -0
  132. parrot/bots/db/influx.py +898 -0
  133. parrot/bots/db/mock.py +96 -0
  134. parrot/bots/db/multi.py +783 -0
  135. parrot/bots/db/prompts.py +185 -0
  136. parrot/bots/db/sql.py +1255 -0
  137. parrot/bots/db/tools.py +212 -0
  138. parrot/bots/document.py +680 -0
  139. parrot/bots/hrbot.py +15 -0
  140. parrot/bots/kb.py +170 -0
  141. parrot/bots/mcp.py +36 -0
  142. parrot/bots/orchestration/README.md +463 -0
  143. parrot/bots/orchestration/__init__.py +1 -0
  144. parrot/bots/orchestration/agent.py +155 -0
  145. parrot/bots/orchestration/crew.py +3330 -0
  146. parrot/bots/orchestration/fsm.py +1179 -0
  147. parrot/bots/orchestration/hr.py +434 -0
  148. parrot/bots/orchestration/storage/__init__.py +4 -0
  149. parrot/bots/orchestration/storage/memory.py +100 -0
  150. parrot/bots/orchestration/storage/mixin.py +119 -0
  151. parrot/bots/orchestration/verify.py +202 -0
  152. parrot/bots/product.py +204 -0
  153. parrot/bots/prompts/__init__.py +96 -0
  154. parrot/bots/prompts/agents.py +155 -0
  155. parrot/bots/prompts/data.py +216 -0
  156. parrot/bots/prompts/output_generation.py +8 -0
  157. parrot/bots/scraper/__init__.py +3 -0
  158. parrot/bots/scraper/models.py +122 -0
  159. parrot/bots/scraper/scraper.py +1173 -0
  160. parrot/bots/scraper/templates.py +115 -0
  161. parrot/bots/stores/__init__.py +5 -0
  162. parrot/bots/stores/local.py +172 -0
  163. parrot/bots/webdev.py +81 -0
  164. parrot/cli.py +17 -0
  165. parrot/clients/__init__.py +16 -0
  166. parrot/clients/base.py +1491 -0
  167. parrot/clients/claude.py +1191 -0
  168. parrot/clients/factory.py +129 -0
  169. parrot/clients/google.py +4567 -0
  170. parrot/clients/gpt.py +1975 -0
  171. parrot/clients/grok.py +432 -0
  172. parrot/clients/groq.py +986 -0
  173. parrot/clients/hf.py +582 -0
  174. parrot/clients/models.py +18 -0
  175. parrot/conf.py +395 -0
  176. parrot/embeddings/__init__.py +9 -0
  177. parrot/embeddings/base.py +157 -0
  178. parrot/embeddings/google.py +98 -0
  179. parrot/embeddings/huggingface.py +74 -0
  180. parrot/embeddings/openai.py +84 -0
  181. parrot/embeddings/processor.py +88 -0
  182. parrot/exceptions.c +13868 -0
  183. parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
  184. parrot/exceptions.pxd +22 -0
  185. parrot/exceptions.pxi +15 -0
  186. parrot/exceptions.pyx +44 -0
  187. parrot/generators/__init__.py +29 -0
  188. parrot/generators/base.py +200 -0
  189. parrot/generators/html.py +293 -0
  190. parrot/generators/react.py +205 -0
  191. parrot/generators/streamlit.py +203 -0
  192. parrot/generators/template.py +105 -0
  193. parrot/handlers/__init__.py +4 -0
  194. parrot/handlers/agent.py +861 -0
  195. parrot/handlers/agents/__init__.py +1 -0
  196. parrot/handlers/agents/abstract.py +900 -0
  197. parrot/handlers/bots.py +338 -0
  198. parrot/handlers/chat.py +915 -0
  199. parrot/handlers/creation.sql +192 -0
  200. parrot/handlers/crew/ARCHITECTURE.md +362 -0
  201. parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
  202. parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
  203. parrot/handlers/crew/__init__.py +0 -0
  204. parrot/handlers/crew/handler.py +801 -0
  205. parrot/handlers/crew/models.py +229 -0
  206. parrot/handlers/crew/redis_persistence.py +523 -0
  207. parrot/handlers/jobs/__init__.py +10 -0
  208. parrot/handlers/jobs/job.py +384 -0
  209. parrot/handlers/jobs/mixin.py +627 -0
  210. parrot/handlers/jobs/models.py +115 -0
  211. parrot/handlers/jobs/worker.py +31 -0
  212. parrot/handlers/models.py +596 -0
  213. parrot/handlers/o365_auth.py +105 -0
  214. parrot/handlers/stream.py +337 -0
  215. parrot/interfaces/__init__.py +6 -0
  216. parrot/interfaces/aws.py +143 -0
  217. parrot/interfaces/credentials.py +113 -0
  218. parrot/interfaces/database.py +27 -0
  219. parrot/interfaces/google.py +1123 -0
  220. parrot/interfaces/hierarchy.py +1227 -0
  221. parrot/interfaces/http.py +651 -0
  222. parrot/interfaces/images/__init__.py +0 -0
  223. parrot/interfaces/images/plugins/__init__.py +24 -0
  224. parrot/interfaces/images/plugins/abstract.py +58 -0
  225. parrot/interfaces/images/plugins/analisys.py +148 -0
  226. parrot/interfaces/images/plugins/classify.py +150 -0
  227. parrot/interfaces/images/plugins/classifybase.py +182 -0
  228. parrot/interfaces/images/plugins/detect.py +150 -0
  229. parrot/interfaces/images/plugins/exif.py +1103 -0
  230. parrot/interfaces/images/plugins/hash.py +52 -0
  231. parrot/interfaces/images/plugins/vision.py +104 -0
  232. parrot/interfaces/images/plugins/yolo.py +66 -0
  233. parrot/interfaces/images/plugins/zerodetect.py +197 -0
  234. parrot/interfaces/o365.py +978 -0
  235. parrot/interfaces/onedrive.py +822 -0
  236. parrot/interfaces/sharepoint.py +1435 -0
  237. parrot/interfaces/soap.py +257 -0
  238. parrot/loaders/__init__.py +8 -0
  239. parrot/loaders/abstract.py +1131 -0
  240. parrot/loaders/audio.py +199 -0
  241. parrot/loaders/basepdf.py +53 -0
  242. parrot/loaders/basevideo.py +1568 -0
  243. parrot/loaders/csv.py +409 -0
  244. parrot/loaders/docx.py +116 -0
  245. parrot/loaders/epubloader.py +316 -0
  246. parrot/loaders/excel.py +199 -0
  247. parrot/loaders/factory.py +55 -0
  248. parrot/loaders/files/__init__.py +0 -0
  249. parrot/loaders/files/abstract.py +39 -0
  250. parrot/loaders/files/html.py +26 -0
  251. parrot/loaders/files/text.py +63 -0
  252. parrot/loaders/html.py +152 -0
  253. parrot/loaders/markdown.py +442 -0
  254. parrot/loaders/pdf.py +373 -0
  255. parrot/loaders/pdfmark.py +320 -0
  256. parrot/loaders/pdftables.py +506 -0
  257. parrot/loaders/ppt.py +476 -0
  258. parrot/loaders/qa.py +63 -0
  259. parrot/loaders/splitters/__init__.py +10 -0
  260. parrot/loaders/splitters/base.py +138 -0
  261. parrot/loaders/splitters/md.py +228 -0
  262. parrot/loaders/splitters/token.py +143 -0
  263. parrot/loaders/txt.py +26 -0
  264. parrot/loaders/video.py +89 -0
  265. parrot/loaders/videolocal.py +218 -0
  266. parrot/loaders/videounderstanding.py +377 -0
  267. parrot/loaders/vimeo.py +167 -0
  268. parrot/loaders/web.py +599 -0
  269. parrot/loaders/youtube.py +504 -0
  270. parrot/manager/__init__.py +5 -0
  271. parrot/manager/manager.py +1030 -0
  272. parrot/mcp/__init__.py +28 -0
  273. parrot/mcp/adapter.py +105 -0
  274. parrot/mcp/cli.py +174 -0
  275. parrot/mcp/client.py +119 -0
  276. parrot/mcp/config.py +75 -0
  277. parrot/mcp/integration.py +842 -0
  278. parrot/mcp/oauth.py +933 -0
  279. parrot/mcp/server.py +225 -0
  280. parrot/mcp/transports/__init__.py +3 -0
  281. parrot/mcp/transports/base.py +279 -0
  282. parrot/mcp/transports/grpc_session.py +163 -0
  283. parrot/mcp/transports/http.py +312 -0
  284. parrot/mcp/transports/mcp.proto +108 -0
  285. parrot/mcp/transports/quic.py +1082 -0
  286. parrot/mcp/transports/sse.py +330 -0
  287. parrot/mcp/transports/stdio.py +309 -0
  288. parrot/mcp/transports/unix.py +395 -0
  289. parrot/mcp/transports/websocket.py +547 -0
  290. parrot/memory/__init__.py +16 -0
  291. parrot/memory/abstract.py +209 -0
  292. parrot/memory/agent.py +32 -0
  293. parrot/memory/cache.py +175 -0
  294. parrot/memory/core.py +555 -0
  295. parrot/memory/file.py +153 -0
  296. parrot/memory/mem.py +131 -0
  297. parrot/memory/redis.py +613 -0
  298. parrot/models/__init__.py +46 -0
  299. parrot/models/basic.py +118 -0
  300. parrot/models/compliance.py +208 -0
  301. parrot/models/crew.py +395 -0
  302. parrot/models/detections.py +654 -0
  303. parrot/models/generation.py +85 -0
  304. parrot/models/google.py +223 -0
  305. parrot/models/groq.py +23 -0
  306. parrot/models/openai.py +30 -0
  307. parrot/models/outputs.py +285 -0
  308. parrot/models/responses.py +938 -0
  309. parrot/notifications/__init__.py +743 -0
  310. parrot/openapi/__init__.py +3 -0
  311. parrot/openapi/components.yaml +641 -0
  312. parrot/openapi/config.py +322 -0
  313. parrot/outputs/__init__.py +32 -0
  314. parrot/outputs/formats/__init__.py +108 -0
  315. parrot/outputs/formats/altair.py +359 -0
  316. parrot/outputs/formats/application.py +122 -0
  317. parrot/outputs/formats/base.py +351 -0
  318. parrot/outputs/formats/bokeh.py +356 -0
  319. parrot/outputs/formats/card.py +424 -0
  320. parrot/outputs/formats/chart.py +436 -0
  321. parrot/outputs/formats/d3.py +255 -0
  322. parrot/outputs/formats/echarts.py +310 -0
  323. parrot/outputs/formats/generators/__init__.py +0 -0
  324. parrot/outputs/formats/generators/abstract.py +61 -0
  325. parrot/outputs/formats/generators/panel.py +145 -0
  326. parrot/outputs/formats/generators/streamlit.py +86 -0
  327. parrot/outputs/formats/generators/terminal.py +63 -0
  328. parrot/outputs/formats/holoviews.py +310 -0
  329. parrot/outputs/formats/html.py +147 -0
  330. parrot/outputs/formats/jinja2.py +46 -0
  331. parrot/outputs/formats/json.py +87 -0
  332. parrot/outputs/formats/map.py +933 -0
  333. parrot/outputs/formats/markdown.py +172 -0
  334. parrot/outputs/formats/matplotlib.py +237 -0
  335. parrot/outputs/formats/mixins/__init__.py +0 -0
  336. parrot/outputs/formats/mixins/emaps.py +855 -0
  337. parrot/outputs/formats/plotly.py +341 -0
  338. parrot/outputs/formats/seaborn.py +310 -0
  339. parrot/outputs/formats/table.py +397 -0
  340. parrot/outputs/formats/template_report.py +138 -0
  341. parrot/outputs/formats/yaml.py +125 -0
  342. parrot/outputs/formatter.py +152 -0
  343. parrot/outputs/templates/__init__.py +95 -0
  344. parrot/pipelines/__init__.py +0 -0
  345. parrot/pipelines/abstract.py +210 -0
  346. parrot/pipelines/detector.py +124 -0
  347. parrot/pipelines/models.py +90 -0
  348. parrot/pipelines/planogram.py +3002 -0
  349. parrot/pipelines/table.sql +97 -0
  350. parrot/plugins/__init__.py +106 -0
  351. parrot/plugins/importer.py +80 -0
  352. parrot/py.typed +0 -0
  353. parrot/registry/__init__.py +18 -0
  354. parrot/registry/registry.py +594 -0
  355. parrot/scheduler/__init__.py +1189 -0
  356. parrot/scheduler/models.py +60 -0
  357. parrot/security/__init__.py +16 -0
  358. parrot/security/prompt_injection.py +268 -0
  359. parrot/security/security_events.sql +25 -0
  360. parrot/services/__init__.py +1 -0
  361. parrot/services/mcp/__init__.py +8 -0
  362. parrot/services/mcp/config.py +13 -0
  363. parrot/services/mcp/server.py +295 -0
  364. parrot/services/o365_remote_auth.py +235 -0
  365. parrot/stores/__init__.py +7 -0
  366. parrot/stores/abstract.py +352 -0
  367. parrot/stores/arango.py +1090 -0
  368. parrot/stores/bigquery.py +1377 -0
  369. parrot/stores/cache.py +106 -0
  370. parrot/stores/empty.py +10 -0
  371. parrot/stores/faiss_store.py +1157 -0
  372. parrot/stores/kb/__init__.py +9 -0
  373. parrot/stores/kb/abstract.py +68 -0
  374. parrot/stores/kb/cache.py +165 -0
  375. parrot/stores/kb/doc.py +325 -0
  376. parrot/stores/kb/hierarchy.py +346 -0
  377. parrot/stores/kb/local.py +457 -0
  378. parrot/stores/kb/prompt.py +28 -0
  379. parrot/stores/kb/redis.py +659 -0
  380. parrot/stores/kb/store.py +115 -0
  381. parrot/stores/kb/user.py +374 -0
  382. parrot/stores/models.py +59 -0
  383. parrot/stores/pgvector.py +3 -0
  384. parrot/stores/postgres.py +2853 -0
  385. parrot/stores/utils/__init__.py +0 -0
  386. parrot/stores/utils/chunking.py +197 -0
  387. parrot/telemetry/__init__.py +3 -0
  388. parrot/telemetry/mixin.py +111 -0
  389. parrot/template/__init__.py +3 -0
  390. parrot/template/engine.py +259 -0
  391. parrot/tools/__init__.py +23 -0
  392. parrot/tools/abstract.py +644 -0
  393. parrot/tools/agent.py +363 -0
  394. parrot/tools/arangodbsearch.py +537 -0
  395. parrot/tools/arxiv_tool.py +188 -0
  396. parrot/tools/calculator/__init__.py +3 -0
  397. parrot/tools/calculator/operations/__init__.py +38 -0
  398. parrot/tools/calculator/operations/calculus.py +80 -0
  399. parrot/tools/calculator/operations/statistics.py +76 -0
  400. parrot/tools/calculator/tool.py +150 -0
  401. parrot/tools/cloudwatch.py +988 -0
  402. parrot/tools/codeinterpreter/__init__.py +127 -0
  403. parrot/tools/codeinterpreter/executor.py +371 -0
  404. parrot/tools/codeinterpreter/internals.py +473 -0
  405. parrot/tools/codeinterpreter/models.py +643 -0
  406. parrot/tools/codeinterpreter/prompts.py +224 -0
  407. parrot/tools/codeinterpreter/tool.py +664 -0
  408. parrot/tools/company_info/__init__.py +6 -0
  409. parrot/tools/company_info/tool.py +1138 -0
  410. parrot/tools/correlationanalysis.py +437 -0
  411. parrot/tools/database/abstract.py +286 -0
  412. parrot/tools/database/bq.py +115 -0
  413. parrot/tools/database/cache.py +284 -0
  414. parrot/tools/database/models.py +95 -0
  415. parrot/tools/database/pg.py +343 -0
  416. parrot/tools/databasequery.py +1159 -0
  417. parrot/tools/db.py +1800 -0
  418. parrot/tools/ddgo.py +370 -0
  419. parrot/tools/decorators.py +271 -0
  420. parrot/tools/dftohtml.py +282 -0
  421. parrot/tools/document.py +549 -0
  422. parrot/tools/ecs.py +819 -0
  423. parrot/tools/edareport.py +368 -0
  424. parrot/tools/elasticsearch.py +1049 -0
  425. parrot/tools/employees.py +462 -0
  426. parrot/tools/epson/__init__.py +96 -0
  427. parrot/tools/excel.py +683 -0
  428. parrot/tools/file/__init__.py +13 -0
  429. parrot/tools/file/abstract.py +76 -0
  430. parrot/tools/file/gcs.py +378 -0
  431. parrot/tools/file/local.py +284 -0
  432. parrot/tools/file/s3.py +511 -0
  433. parrot/tools/file/tmp.py +309 -0
  434. parrot/tools/file/tool.py +501 -0
  435. parrot/tools/file_reader.py +129 -0
  436. parrot/tools/flowtask/__init__.py +19 -0
  437. parrot/tools/flowtask/tool.py +761 -0
  438. parrot/tools/gittoolkit.py +508 -0
  439. parrot/tools/google/__init__.py +18 -0
  440. parrot/tools/google/base.py +169 -0
  441. parrot/tools/google/tools.py +1251 -0
  442. parrot/tools/googlelocation.py +5 -0
  443. parrot/tools/googleroutes.py +5 -0
  444. parrot/tools/googlesearch.py +5 -0
  445. parrot/tools/googlesitesearch.py +5 -0
  446. parrot/tools/googlevoice.py +2 -0
  447. parrot/tools/gvoice.py +695 -0
  448. parrot/tools/ibisworld/README.md +225 -0
  449. parrot/tools/ibisworld/__init__.py +11 -0
  450. parrot/tools/ibisworld/tool.py +366 -0
  451. parrot/tools/jiratoolkit.py +1718 -0
  452. parrot/tools/manager.py +1098 -0
  453. parrot/tools/math.py +152 -0
  454. parrot/tools/metadata.py +476 -0
  455. parrot/tools/msteams.py +1621 -0
  456. parrot/tools/msword.py +635 -0
  457. parrot/tools/multidb.py +580 -0
  458. parrot/tools/multistoresearch.py +369 -0
  459. parrot/tools/networkninja.py +167 -0
  460. parrot/tools/nextstop/__init__.py +4 -0
  461. parrot/tools/nextstop/base.py +286 -0
  462. parrot/tools/nextstop/employee.py +733 -0
  463. parrot/tools/nextstop/store.py +462 -0
  464. parrot/tools/notification.py +435 -0
  465. parrot/tools/o365/__init__.py +42 -0
  466. parrot/tools/o365/base.py +295 -0
  467. parrot/tools/o365/bundle.py +522 -0
  468. parrot/tools/o365/events.py +554 -0
  469. parrot/tools/o365/mail.py +992 -0
  470. parrot/tools/o365/onedrive.py +497 -0
  471. parrot/tools/o365/sharepoint.py +641 -0
  472. parrot/tools/openapi_toolkit.py +904 -0
  473. parrot/tools/openweather.py +527 -0
  474. parrot/tools/pdfprint.py +1001 -0
  475. parrot/tools/powerbi.py +518 -0
  476. parrot/tools/powerpoint.py +1113 -0
  477. parrot/tools/pricestool.py +146 -0
  478. parrot/tools/products/__init__.py +246 -0
  479. parrot/tools/prophet_tool.py +171 -0
  480. parrot/tools/pythonpandas.py +630 -0
  481. parrot/tools/pythonrepl.py +910 -0
  482. parrot/tools/qsource.py +436 -0
  483. parrot/tools/querytoolkit.py +395 -0
  484. parrot/tools/quickeda.py +827 -0
  485. parrot/tools/resttool.py +553 -0
  486. parrot/tools/retail/__init__.py +0 -0
  487. parrot/tools/retail/bby.py +528 -0
  488. parrot/tools/sandboxtool.py +703 -0
  489. parrot/tools/sassie/__init__.py +352 -0
  490. parrot/tools/scraping/__init__.py +7 -0
  491. parrot/tools/scraping/docs/select.md +466 -0
  492. parrot/tools/scraping/documentation.md +1278 -0
  493. parrot/tools/scraping/driver.py +436 -0
  494. parrot/tools/scraping/models.py +576 -0
  495. parrot/tools/scraping/options.py +85 -0
  496. parrot/tools/scraping/orchestrator.py +517 -0
  497. parrot/tools/scraping/readme.md +740 -0
  498. parrot/tools/scraping/tool.py +3115 -0
  499. parrot/tools/seasonaldetection.py +642 -0
  500. parrot/tools/shell_tool/__init__.py +5 -0
  501. parrot/tools/shell_tool/actions.py +408 -0
  502. parrot/tools/shell_tool/engine.py +155 -0
  503. parrot/tools/shell_tool/models.py +322 -0
  504. parrot/tools/shell_tool/tool.py +442 -0
  505. parrot/tools/site_search.py +214 -0
  506. parrot/tools/textfile.py +418 -0
  507. parrot/tools/think.py +378 -0
  508. parrot/tools/toolkit.py +298 -0
  509. parrot/tools/webapp_tool.py +187 -0
  510. parrot/tools/whatif.py +1279 -0
  511. parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
  512. parrot/tools/workday/__init__.py +6 -0
  513. parrot/tools/workday/models.py +1389 -0
  514. parrot/tools/workday/tool.py +1293 -0
  515. parrot/tools/yfinance_tool.py +306 -0
  516. parrot/tools/zipcode.py +217 -0
  517. parrot/utils/__init__.py +2 -0
  518. parrot/utils/helpers.py +73 -0
  519. parrot/utils/parsers/__init__.py +5 -0
  520. parrot/utils/parsers/toml.c +12078 -0
  521. parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
  522. parrot/utils/parsers/toml.pyx +21 -0
  523. parrot/utils/toml.py +11 -0
  524. parrot/utils/types.cpp +20936 -0
  525. parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
  526. parrot/utils/types.pyx +213 -0
  527. parrot/utils/uv.py +11 -0
  528. parrot/version.py +10 -0
  529. parrot/yaml-rs/Cargo.lock +350 -0
  530. parrot/yaml-rs/Cargo.toml +19 -0
  531. parrot/yaml-rs/pyproject.toml +19 -0
  532. parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
  533. parrot/yaml-rs/src/lib.rs +222 -0
  534. requirements/docker-compose.yml +24 -0
  535. requirements/requirements-dev.txt +21 -0
@@ -0,0 +1,25 @@
1
+ import axios from 'axios';
2
+ import { config } from '$lib/config';
3
+
4
+ const apiClient = axios.create({
5
+ baseURL: config.apiBaseUrl,
6
+ withCredentials: true,
7
+ headers: {
8
+ 'Content-Type': 'application/json'
9
+ }
10
+ });
11
+
12
+ apiClient.interceptors.request.use((config) => {
13
+ if (typeof window === 'undefined') {
14
+ return config;
15
+ }
16
+
17
+ const token = localStorage.getItem(config.tokenStorageKey);
18
+ if (token) {
19
+ config.headers = config.headers || {};
20
+ config.headers.Authorization = `Bearer ${token}`;
21
+ }
22
+ return config;
23
+ });
24
+
25
+ export default apiClient;
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import type { BotSummary } from '$lib/api/bots';
4
+
5
+ export let bot: BotSummary;
6
+
7
+ function handleClick() {
8
+ goto(`/talk/${bot.chatbot_id}`);
9
+ }
10
+ </script>
11
+
12
+ <button
13
+ class="card group cursor-pointer border border-base-200 bg-base-100/80 text-left transition hover:-translate-y-1 hover:border-primary/50 hover:shadow-xl"
14
+ type="button"
15
+ on:click={handleClick}
16
+ >
17
+ <div class="card-body gap-4">
18
+ <div class="flex items-center gap-3">
19
+ <div class="rounded-2xl bg-primary/10 p-3 text-primary">🤖</div>
20
+ <div>
21
+ <h3 class="text-xl font-semibold text-base-content">{bot.name}</h3>
22
+ <p class="text-xs uppercase tracking-wide text-base-content/50">{bot.category}</p>
23
+ </div>
24
+ </div>
25
+ <p class="text-sm text-base-content/70">
26
+ {bot.description}
27
+ </p>
28
+ <div class="flex items-center justify-between text-xs text-base-content/60">
29
+ <span>Owner: {bot.owner}</span>
30
+ <span class="font-semibold text-primary group-hover:text-secondary">Start chat →</span>
31
+ </div>
32
+ </div>
33
+ </button>
@@ -0,0 +1,63 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte';
3
+ import { marked } from 'marked';
4
+ import DOMPurify from 'isomorphic-dompurify';
5
+
6
+ const props = $props<{
7
+ role?: 'user' | 'assistant';
8
+ content?: string;
9
+ timestamp?: string;
10
+ turnId?: string;
11
+ selectable?: boolean;
12
+ selected?: boolean;
13
+ }>();
14
+
15
+ const role = $derived(props.role ?? 'user');
16
+ const content = $derived(props.content ?? '');
17
+ const timestamp = $derived(props.timestamp ?? '');
18
+ const turnId = $derived(props.turnId);
19
+ const selectable = $derived(props.selectable ?? false);
20
+ const selected = $derived(props.selected ?? false);
21
+
22
+ const dispatch = createEventDispatcher<{ select: { turnId: string } }>();
23
+
24
+ const sanitizedHtml = $derived(() => {
25
+ const raw = marked.parse(content || '');
26
+ return DOMPurify.sanitize(raw);
27
+ });
28
+
29
+ function handleClick() {
30
+ if (selectable && turnId) {
31
+ dispatch('select', { turnId });
32
+ }
33
+ }
34
+ </script>
35
+
36
+ <div
37
+ class={`flex ${role === 'user' ? 'justify-end' : 'justify-start'}`}
38
+ on:click={handleClick}
39
+ >
40
+ <div
41
+ class={`max-w-3xl rounded-3xl border ${
42
+ role === 'user'
43
+ ? 'bg-primary text-primary-content border-primary/20'
44
+ : 'bg-base-200/70 text-base-content border-base-300'
45
+ } p-4 text-sm shadow-sm transition ${selectable ? 'cursor-pointer hover:ring-2 hover:ring-primary/40' : ''} ${
46
+ selected ? 'ring-2 ring-primary' : ''
47
+ }`}
48
+ >
49
+ <div class="mb-2 flex items-center gap-2 text-xs opacity-70">
50
+ <span class="font-semibold capitalize">{role}</span>
51
+ <span>•</span>
52
+ <span>{new Date(timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
53
+ </div>
54
+
55
+ {#if role === 'assistant'}
56
+ <div class="chat-markdown" on:click|stopPropagation>
57
+ {@html sanitizedHtml}
58
+ </div>
59
+ {:else}
60
+ <p class="whitespace-pre-wrap">{content}</p>
61
+ {/if}
62
+ </div>
63
+ </div>
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import { toastStore, type ToastMessage } from '$lib/stores/toast.svelte.ts';
3
+
4
+ let toasts = $state<ToastMessage[]>([]);
5
+
6
+ $effect(() => {
7
+ const unsubscribe = toastStore.subscribe((items) => {
8
+ toasts = items;
9
+ });
10
+
11
+ return () => unsubscribe();
12
+ });
13
+ </script>
14
+
15
+ <div class="toast toast-end z-[1000]">
16
+ {#each toasts as toast (toast.id)}
17
+ <div class={`alert alert-${toast.type}`}>
18
+ <span>{toast.message}</span>
19
+ </div>
20
+ {/each}
21
+ </div>
@@ -0,0 +1,20 @@
1
+ const DEFAULT_API = 'http://localhost:5000';
2
+ const rawBaseUrl = import.meta.env?.VITE_API_URL ?? DEFAULT_API;
3
+ const apiBaseUrl = rawBaseUrl.replace(/\/$/, '');
4
+ const authUrlFromEnv = import.meta.env?.VITE_AUTH_URL;
5
+ const authUrl = (authUrlFromEnv ? authUrlFromEnv : `${apiBaseUrl}/api/v1/login`).replace(/\/$/, '');
6
+ const environmentLabel = import.meta.env?.VITE_AGENTUI_ENV || 'local';
7
+ const defaultUsername = import.meta.env?.VITE_AGENTUI_USERNAME || '';
8
+ const defaultPassword = import.meta.env?.VITE_AGENTUI_PASSWORD || '';
9
+ const storageNamespace = `agentui.${environmentLabel}`;
10
+
11
+ export const config = {
12
+ apiBaseUrl,
13
+ authUrl,
14
+ environmentLabel,
15
+ defaultUsername,
16
+ defaultPassword,
17
+ storageNamespace,
18
+ tokenStorageKey: `${storageNamespace}.token`,
19
+ conversationStoragePrefix: `${storageNamespace}.conversation`
20
+ };
@@ -0,0 +1,73 @@
1
+ import apiClient from '$lib/api/http';
2
+ import { writable, get } from 'svelte/store';
3
+ import { config } from '$lib/config';
4
+
5
+ type AuthState = {
6
+ loading: boolean;
7
+ isAuthenticated: boolean;
8
+ token: string | null;
9
+ user: { username: string } | null;
10
+ };
11
+
12
+ const STORAGE_KEY = config.tokenStorageKey;
13
+
14
+ function createAuthStore() {
15
+ const internal = writable<AuthState>({
16
+ loading: true,
17
+ isAuthenticated: false,
18
+ token: null,
19
+ user: null
20
+ });
21
+
22
+ const { subscribe, update, set } = internal;
23
+
24
+ async function init() {
25
+ if (typeof window === 'undefined') return;
26
+ const token = localStorage.getItem(STORAGE_KEY);
27
+ if (token) {
28
+ set({ loading: false, isAuthenticated: true, token, user: null });
29
+ } else {
30
+ set({ loading: false, isAuthenticated: false, token: null, user: null });
31
+ }
32
+ }
33
+
34
+ async function login(username: string, password: string) {
35
+ update((state) => ({ ...state, loading: true }));
36
+ try {
37
+ const { data } = await apiClient.post(config.authUrl, { username, password });
38
+ const token = data?.access_token || data?.token;
39
+ if (typeof window !== 'undefined' && token) {
40
+ localStorage.setItem(STORAGE_KEY, token);
41
+ }
42
+ set({ loading: false, isAuthenticated: true, token: token || null, user: { username } });
43
+ return { success: true };
44
+ } catch (error: any) {
45
+ set({ loading: false, isAuthenticated: false, token: null, user: null });
46
+ return {
47
+ success: false,
48
+ error: error?.response?.data?.message || error?.message || 'Login failed'
49
+ };
50
+ }
51
+ }
52
+
53
+ function logout() {
54
+ if (typeof window !== 'undefined') {
55
+ localStorage.removeItem(STORAGE_KEY);
56
+ }
57
+ set({ loading: false, isAuthenticated: false, token: null, user: null });
58
+ }
59
+
60
+ function getToken() {
61
+ return get(internal).token;
62
+ }
63
+
64
+ return {
65
+ subscribe,
66
+ init,
67
+ login,
68
+ logout,
69
+ getToken
70
+ };
71
+ }
72
+
73
+ export const authStore = createAuthStore();
@@ -0,0 +1,64 @@
1
+ import { writable } from 'svelte/store';
2
+
3
+ export const THEMES = [
4
+ 'light',
5
+ 'dark',
6
+ 'cupcake',
7
+ 'bumblebee',
8
+ 'emerald',
9
+ 'corporate',
10
+ 'synthwave',
11
+ 'retro',
12
+ 'cyberpunk',
13
+ 'valentine',
14
+ 'garden',
15
+ 'aqua',
16
+ 'lofi',
17
+ 'pastel',
18
+ 'fantasy',
19
+ 'wireframe',
20
+ 'black',
21
+ 'luxury',
22
+ 'dracula'
23
+ ];
24
+
25
+ const defaultTheme = 'light';
26
+
27
+ function createThemeStore() {
28
+ const { subscribe, update, set } = writable({ currentTheme: defaultTheme });
29
+
30
+ function applyTheme(theme) {
31
+ if (typeof document === 'undefined') return;
32
+ document.documentElement.setAttribute('data-theme', theme);
33
+ }
34
+
35
+ return {
36
+ subscribe,
37
+ init: () => {
38
+ if (typeof window === 'undefined') return;
39
+ const stored = localStorage.getItem('agentui.theme') || defaultTheme;
40
+ set({ currentTheme: stored });
41
+ applyTheme(stored);
42
+ },
43
+ setTheme: (theme) => {
44
+ update(() => ({ currentTheme: theme }));
45
+ if (typeof window !== 'undefined') {
46
+ localStorage.setItem('agentui.theme', theme);
47
+ }
48
+ applyTheme(theme);
49
+ },
50
+ toggleDarkMode: () => {
51
+ let next = 'dark';
52
+ update((state) => {
53
+ next = state.currentTheme === 'dark' ? defaultTheme : 'dark';
54
+ return { currentTheme: next };
55
+ });
56
+ if (typeof window !== 'undefined') {
57
+ localStorage.setItem('agentui.theme', next);
58
+ }
59
+ applyTheme(next);
60
+ }
61
+ };
62
+ }
63
+
64
+ export const themeStore = createThemeStore();
@@ -0,0 +1,31 @@
1
+ import { writable } from 'svelte/store';
2
+
3
+ type ToastType = 'success' | 'error' | 'info';
4
+
5
+ export type ToastMessage = {
6
+ id: string;
7
+ type: ToastType;
8
+ message: string;
9
+ duration: number;
10
+ };
11
+
12
+ function createToastStore() {
13
+ const { subscribe, update } = writable<ToastMessage[]>([]);
14
+
15
+ function push(type: ToastType, message: string, duration = 3000) {
16
+ const id = crypto.randomUUID();
17
+ update((toasts) => [...toasts, { id, type, message, duration }]);
18
+ setTimeout(() => {
19
+ update((toasts) => toasts.filter((toast) => toast.id !== id));
20
+ }, duration);
21
+ }
22
+
23
+ return {
24
+ subscribe,
25
+ success: (message: string, duration?: number) => push('success', message, duration),
26
+ error: (message: string, duration?: number) => push('error', message, duration),
27
+ info: (message: string, duration?: number) => push('info', message, duration)
28
+ };
29
+ }
30
+
31
+ export const toastStore = createToastStore();
@@ -0,0 +1,39 @@
1
+ import type { ChatResponse } from '$lib/api/chat';
2
+ import { config } from '$lib/config';
3
+
4
+ const STORAGE_PREFIX = config.conversationStoragePrefix;
5
+
6
+ type ConversationPayload = {
7
+ turns: Record<string, ChatResponse>;
8
+ order: string[];
9
+ };
10
+
11
+ function getKey(agentId: string) {
12
+ return `${STORAGE_PREFIX}.${agentId}`;
13
+ }
14
+
15
+ export function saveTurn(agentId: string, turn: ChatResponse) {
16
+ if (typeof window === 'undefined') return;
17
+ const raw = localStorage.getItem(getKey(agentId));
18
+ const payload: ConversationPayload = raw ? JSON.parse(raw) : { turns: {}, order: [] };
19
+ payload.turns[turn.turn_id] = turn;
20
+ if (!payload.order.includes(turn.turn_id)) {
21
+ payload.order.push(turn.turn_id);
22
+ }
23
+ localStorage.setItem(getKey(agentId), JSON.stringify(payload));
24
+ }
25
+
26
+ export function getTurn(agentId: string, turnId: string) {
27
+ if (typeof window === 'undefined') return null;
28
+ const raw = localStorage.getItem(getKey(agentId));
29
+ if (!raw) return null;
30
+ const payload: ConversationPayload = JSON.parse(raw);
31
+ return payload.turns[turnId] || null;
32
+ }
33
+
34
+ export function loadConversation(agentId: string) {
35
+ if (typeof window === 'undefined') return { turns: {}, order: [] };
36
+ const raw = localStorage.getItem(getKey(agentId));
37
+ if (!raw) return { turns: {}, order: [] };
38
+ return JSON.parse(raw) as ConversationPayload;
39
+ }
@@ -0,0 +1,20 @@
1
+ <script>
2
+ import { onMount } from 'svelte';
3
+ import { authStore } from '$lib/stores/auth.svelte.ts';
4
+ import { themeStore } from '$lib/stores/theme.svelte.js';
5
+ import Toast from '$lib/components/Toast.svelte';
6
+ import '../app.css';
7
+
8
+ // Initialize stores on mount
9
+ onMount(() => {
10
+ authStore.init();
11
+ themeStore.init(); // Initialize theme store
12
+ });
13
+ </script>
14
+
15
+ <div class="min-h-screen">
16
+ <slot />
17
+ </div>
18
+
19
+ <!-- Global toast notifications -->
20
+ <Toast />
@@ -0,0 +1,232 @@
1
+ <script lang="ts">
2
+ import { browser } from '$app/environment';
3
+ import { goto } from '$app/navigation';
4
+ import { onMount } from 'svelte';
5
+ import { authStore } from '$lib/stores/auth.svelte.ts';
6
+ import { botsApi, type BotSummary } from '$lib/api/bots';
7
+ import { BotCard, LoadingSpinner, ThemeSwitcher } from '../components';
8
+ import { config } from '$lib/config';
9
+
10
+ let bots = $state<BotSummary[]>([]);
11
+ let loading = $state(true);
12
+ let error = $state('');
13
+ let searchTerm = $state('');
14
+ let selectedCategory = $state('All');
15
+ const categories = $derived(() => {
16
+ const uniqueCategories = Array.from(
17
+ new Set(bots.map((bot) => bot.category?.trim() || 'Lifestyle & Wellness'))
18
+ );
19
+ return ['All', ...uniqueCategories];
20
+ });
21
+
22
+ $effect(() => {
23
+ if (!categories.includes(selectedCategory)) {
24
+ selectedCategory = 'All';
25
+ }
26
+ });
27
+
28
+ async function fetchBots() {
29
+ if (!browser) return;
30
+
31
+ loading = true;
32
+ error = '';
33
+
34
+ try {
35
+ const response = await botsApi.listBots();
36
+ bots = response.bots || [];
37
+ } catch (err: any) {
38
+ console.error('Failed to load bots', err);
39
+ error =
40
+ err?.response?.data?.message || err?.message || 'Unable to load your agents right now.';
41
+ bots = [];
42
+ } finally {
43
+ loading = false;
44
+ }
45
+ }
46
+
47
+ let hasFetchedBots = false;
48
+
49
+ const filteredBots = $derived(() => {
50
+ let list = bots;
51
+
52
+ if (selectedCategory !== 'All') {
53
+ list = list.filter(
54
+ (bot) => (bot.category || 'Lifestyle & Wellness') === selectedCategory
55
+ );
56
+ }
57
+
58
+ if (searchTerm.trim()) {
59
+ const search = searchTerm.trim().toLowerCase();
60
+ list = list.filter(
61
+ (bot) =>
62
+ bot.name.toLowerCase().includes(search) ||
63
+ bot.description?.toLowerCase().includes(search)
64
+ );
65
+ }
66
+
67
+ return list;
68
+ });
69
+
70
+ function selectCategory(category: string) {
71
+ selectedCategory = category;
72
+ }
73
+
74
+ function handleLogout() {
75
+ authStore.logout();
76
+ }
77
+
78
+ const environmentLabel = config.environmentLabel;
79
+
80
+ onMount(() => {
81
+ if (!browser) return;
82
+
83
+ const unsubscribe = authStore.subscribe((state) => {
84
+ if (state.loading) return;
85
+
86
+ if (!state.isAuthenticated) {
87
+ hasFetchedBots = false;
88
+ if (window.location.pathname !== '/login') {
89
+ goto('/login');
90
+ }
91
+ return;
92
+ }
93
+
94
+ if (!hasFetchedBots) {
95
+ hasFetchedBots = true;
96
+ fetchBots();
97
+ }
98
+ });
99
+
100
+ return () => {
101
+ hasFetchedBots = false;
102
+ unsubscribe();
103
+ };
104
+ });
105
+ </script>
106
+
107
+ <svelte:head>
108
+ <title>Agents - AgentUI</title>
109
+ </svelte:head>
110
+
111
+ {#if $authStore.loading}
112
+ <div class="flex min-h-screen items-center justify-center">
113
+ <LoadingSpinner text="Loading your workspace..." />
114
+ </div>
115
+ {:else}
116
+ <div class="min-h-screen bg-[radial-gradient(circle_at_top,_rgba(79,70,229,0.1),_transparent)]">
117
+ <div class="flex min-h-screen">
118
+ <!-- Sidebar -->
119
+ <aside class="hidden w-64 flex-shrink-0 flex-col border-r border-base-200 bg-base-100/80 p-6 lg:flex">
120
+ <div class="mb-8 flex items-center gap-3">
121
+ <div class="flex h-10 w-10 items-center justify-center rounded-2xl bg-primary/10 text-lg font-semibold text-primary">
122
+ 🦜
123
+ </div>
124
+ <div>
125
+ <p class="text-xs uppercase tracking-[0.2em] text-base-content/60">AI Parrot</p>
126
+ <h1 class="text-xl font-semibold">AgentUI</h1>
127
+ </div>
128
+ </div>
129
+
130
+ <nav class="space-y-2">
131
+ <p class="text-xs font-semibold uppercase tracking-wide text-base-content/60">Workspace</p>
132
+ <a class="btn btn-ghost btn-sm justify-start gap-3 text-base-content">
133
+ <span class="rounded-full bg-primary/10 px-2 py-1 text-xs font-semibold text-primary">New</span>
134
+ Create agent
135
+ </a>
136
+ <a class="btn btn-ghost btn-sm justify-start gap-3 text-base-content">Browse agents</a>
137
+ </nav>
138
+
139
+ <div class="mt-8 space-y-3">
140
+ <p class="text-xs font-semibold uppercase tracking-wide text-base-content/60">Categories</p>
141
+ {#each categories as category}
142
+ <button
143
+ class={`btn btn-ghost btn-sm w-full justify-between ${
144
+ selectedCategory === category ? 'bg-primary/10 text-primary' : 'text-base-content/80'
145
+ }`}
146
+ type="button"
147
+ on:click={() => selectCategory(category)}
148
+ >
149
+ <span>{category}</span>
150
+ {#if selectedCategory === category}
151
+ <span class="text-xs font-semibold">●</span>
152
+ {/if}
153
+ </button>
154
+ {/each}
155
+ </div>
156
+
157
+ <div class="mt-auto rounded-2xl bg-gradient-to-br from-primary to-indigo-600 p-5 text-primary-content">
158
+ <p class="text-sm font-semibold">Need help?</p>
159
+ <p class="text-sm opacity-80">Our team is one click away.</p>
160
+ <button class="btn btn-sm mt-4 border-none bg-white/20 text-white">Contact us</button>
161
+ </div>
162
+ </aside>
163
+
164
+ <!-- Main content -->
165
+ <main class="flex-1 p-6 lg:p-10">
166
+ <div class="mb-8 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
167
+ <div>
168
+ <p class="text-sm text-base-content/70">All assistants for specific tasks</p>
169
+ <h2 class="text-3xl font-bold">Agents</h2>
170
+ {#if environmentLabel}
171
+ <div class="badge badge-outline badge-sm mt-2 uppercase tracking-wide">
172
+ {environmentLabel}
173
+ </div>
174
+ {/if}
175
+ </div>
176
+ <div class="flex items-center gap-3">
177
+ <ThemeSwitcher showLabel={false} buttonClass="btn btn-sm btn-ghost" />
178
+ <button class="btn btn-outline btn-sm" type="button" on:click={handleLogout}>Logout</button>
179
+ </div>
180
+ </div>
181
+
182
+ <div class="mb-8 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
183
+ <div class="flex items-center gap-3 rounded-2xl border border-base-200 bg-base-100 px-4 py-3 shadow-sm">
184
+ <svg
185
+ xmlns="http://www.w3.org/2000/svg"
186
+ class="h-5 w-5 text-base-content/60"
187
+ fill="none"
188
+ viewBox="0 0 24 24"
189
+ stroke="currentColor"
190
+ >
191
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
192
+ </svg>
193
+ <input
194
+ class="flex-1 bg-transparent text-sm outline-none"
195
+ placeholder="Search agents"
196
+ bind:value={searchTerm}
197
+ />
198
+ </div>
199
+ <div class="flex gap-3">
200
+ <button class="btn btn-primary">Create AI agent</button>
201
+ <button class="btn btn-outline">Browse agents</button>
202
+ </div>
203
+ </div>
204
+
205
+ {#if error}
206
+ <div class="alert alert-error mb-6">
207
+ <span>{error}</span>
208
+ </div>
209
+ {/if}
210
+
211
+ {#if loading}
212
+ <div class="flex min-h-[40vh] items-center justify-center">
213
+ <LoadingSpinner text="Loading agents..." />
214
+ </div>
215
+ {:else}
216
+ {#if filteredBots.length === 0}
217
+ <div class="rounded-3xl border border-dashed border-base-300 bg-base-100/80 p-10 text-center">
218
+ <p class="text-lg font-semibold">No agents match your filters.</p>
219
+ <p class="text-sm text-base-content/70">Try another category or clear the search box.</p>
220
+ </div>
221
+ {:else}
222
+ <div class="grid gap-6 md:grid-cols-2 xl:grid-cols-3">
223
+ {#each filteredBots as bot (bot.id)}
224
+ <BotCard {bot} />
225
+ {/each}
226
+ </div>
227
+ {/if}
228
+ {/if}
229
+ </main>
230
+ </div>
231
+ </div>
232
+ {/if}