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,37 @@
1
+ {
2
+ "name": "agent-crew-builder",
3
+ "version": "0.2.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite dev",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
11
+ "postinstall": "node ./scripts/postinstall/apply-patches.mjs"
12
+ },
13
+ "devDependencies": {
14
+ "@sveltejs/adapter-auto": "^3.2.1",
15
+ "@sveltejs/kit": "next",
16
+ "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0",
17
+ "@tailwindcss/vite": "^4.0.0",
18
+ "prettier": "^3.4.2",
19
+ "prettier-plugin-svelte": "^3.3.3",
20
+ "prettier-plugin-tailwindcss": "^0.6.11",
21
+ "svelte": "^5.0.0-next.1",
22
+ "svelte-check": "^3.8.4",
23
+ "tslib": "^2.8.1",
24
+ "typescript": "^5.6.3",
25
+ "tailwindcss": "^4.0.0",
26
+ "vite": "^5.4.10"
27
+ },
28
+ "dependencies": {
29
+ "@xyflow/svelte": "^0.1.0",
30
+ "axios": "^1.7.9",
31
+ "daisyui": "^5.0.0",
32
+ "echarts": "^6.0.0",
33
+ "gridstack": "^12.3.3",
34
+ "lodash-es": "^4.17.21",
35
+ "svelte-vega": "^4.0.1"
36
+ }
37
+ }
@@ -0,0 +1,260 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const projectRoot = path.resolve(__dirname, '..', '..');
8
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
9
+ let lockfileCache = null;
10
+ let lockfileDirty = false;
11
+ const lockfilePath = path.join(projectRoot, 'package-lock.json');
12
+
13
+ function loadLockfile() {
14
+ if (lockfileCache) return lockfileCache;
15
+ if (!existsSync(lockfilePath)) return null;
16
+ lockfileCache = JSON.parse(readFileSync(lockfilePath, 'utf8'));
17
+ return lockfileCache;
18
+ }
19
+
20
+ function saveLockfile() {
21
+ if (!lockfileDirty || !lockfileCache) return;
22
+ writeFileSync(lockfilePath, JSON.stringify(lockfileCache, null, 2) + '\n', 'utf8');
23
+ lockfileDirty = false;
24
+ }
25
+
26
+ function updateLockDependency(name, version) {
27
+ const lock = loadLockfile();
28
+ if (!lock) return false;
29
+ let changed = false;
30
+ const packageKey = `node_modules/${name}`;
31
+ if (lock.packages && lock.packages[packageKey]) {
32
+ const pkg = lock.packages[packageKey];
33
+ if (pkg.version !== version) {
34
+ pkg.version = version;
35
+ changed = true;
36
+ }
37
+ if ('resolved' in pkg) {
38
+ delete pkg.resolved;
39
+ changed = true;
40
+ }
41
+ if ('integrity' in pkg) {
42
+ delete pkg.integrity;
43
+ changed = true;
44
+ }
45
+ }
46
+ if (lock.dependencies && lock.dependencies[name]) {
47
+ const dep = lock.dependencies[name];
48
+ if (dep.version !== version) {
49
+ dep.version = version;
50
+ changed = true;
51
+ }
52
+ if ('resolved' in dep) {
53
+ delete dep.resolved;
54
+ changed = true;
55
+ }
56
+ if ('integrity' in dep) {
57
+ delete dep.integrity;
58
+ changed = true;
59
+ }
60
+ }
61
+ if (changed) lockfileDirty = true;
62
+ return changed;
63
+ }
64
+
65
+ function ensureDirectory(dirPath) {
66
+ if (!existsSync(dirPath)) {
67
+ mkdirSync(dirPath, { recursive: true });
68
+ }
69
+ }
70
+
71
+ function patchCookie() {
72
+ const targetDir = path.join(nodeModulesDir, 'cookie');
73
+ const targetFile = path.join(targetDir, 'index.js');
74
+ const pkgFile = path.join(targetDir, 'package.json');
75
+ const patchedVersion = '0.6.0-patched';
76
+ if (!existsSync(targetFile)) {
77
+ return false;
78
+ }
79
+
80
+ const sourceLines = [
81
+ "'use strict';",
82
+ "const TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;",
83
+ "const VALUE = /^[\\u0020-\\u007E]*$/;",
84
+ "const DEFAULT_DECODE = (value) => value.replace(/%([0-9A-Fa-f]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)));",
85
+ "const DEFAULT_ENCODE = (value) => encodeURIComponent(value);",
86
+ '',
87
+ 'function tryDecode(value, decode) {',
88
+ ' try {',
89
+ ' return decode(value);',
90
+ ' } catch {',
91
+ ' return value;',
92
+ ' }',
93
+ '}',
94
+ '',
95
+ 'export function parse(str, options = {}) {',
96
+ " if (typeof str !== 'string') {",
97
+ " throw new TypeError('Argument str must be a string');",
98
+ ' }',
99
+ '',
100
+ ' const decode = options.decode || DEFAULT_DECODE;',
101
+ ' const result = {};',
102
+ '',
103
+ ' const pairs = str.split(/; */);',
104
+ ' for (const pair of pairs) {',
105
+ ' if (!pair) continue;',
106
+ ' const eqIdx = pair.indexOf(' + "'='" + ');',
107
+ ' if (eqIdx < 0) continue;',
108
+ '',
109
+ ' const key = pair.slice(0, eqIdx).trim();',
110
+ ' let val = pair.slice(eqIdx + 1).trim();',
111
+ '',
112
+ ' if (!TOKEN.test(key)) continue;',
113
+ " if (val.startsWith('\\\"') && val.endsWith('\\\"')) {",
114
+ ' val = val.slice(1, -1);',
115
+ ' }',
116
+ '',
117
+ ' const decoded = tryDecode(val, decode);',
118
+ ' result[key] = decoded;',
119
+ ' }',
120
+ '',
121
+ ' return result;',
122
+ '}',
123
+ '',
124
+ 'function formatOptions(opts = {}) {',
125
+ ' const segments = [];',
126
+ ' if (opts.maxAge != null) {',
127
+ ' if (!Number.isFinite(opts.maxAge)) {',
128
+ " throw new TypeError('maxAge must be a finite number');",
129
+ ' }',
130
+ ' segments.push(`Max-Age=${Math.floor(opts.maxAge)}`);',
131
+ ' }',
132
+ ' if (opts.domain) {',
133
+ " if (!TOKEN.test(opts.domain)) {",
134
+ " throw new TypeError('Invalid domain attribute');",
135
+ ' }',
136
+ ' segments.push(`Domain=${opts.domain}`);',
137
+ ' }',
138
+ ' if (opts.path) {',
139
+ " if (!TOKEN.test(opts.path.replace(/\\\\/g, ''))) {",
140
+ " throw new TypeError('Invalid path attribute');",
141
+ ' }',
142
+ ' segments.push(`Path=${opts.path}`);',
143
+ ' }',
144
+ ' if (opts.expires) {',
145
+ ' const exp = opts.expires;',
146
+ ' if (!(exp instanceof Date) || isNaN(exp.valueOf())) {',
147
+ " throw new TypeError('expires must be a valid Date');",
148
+ ' }',
149
+ ' segments.push(`Expires=${exp.toUTCString()}`);',
150
+ ' }',
151
+ " if (opts.httpOnly) segments.push('HttpOnly');",
152
+ " if (opts.secure) segments.push('Secure');",
153
+ " if (opts.partitioned) segments.push('Partitioned');",
154
+ ' if (opts.priority) {',
155
+ ' const priority = String(opts.priority).toLowerCase();',
156
+ " if (!['low', 'medium', 'high'].includes(priority)) {",
157
+ " throw new TypeError('priority must be Low, Medium, or High');",
158
+ ' }',
159
+ ' segments.push(`Priority=${priority.charAt(0).toUpperCase()}${priority.slice(1)}`);',
160
+ ' }',
161
+ ' if (opts.sameSite) {',
162
+ " const sameSite = typeof opts.sameSite === 'string' ? opts.sameSite.toLowerCase() : opts.sameSite;",
163
+ ' switch (sameSite) {',
164
+ ' case true:',
165
+ " case 'strict':",
166
+ " segments.push('SameSite=Strict');",
167
+ ' break;',
168
+ " case 'lax':",
169
+ " segments.push('SameSite=Lax');",
170
+ ' break;',
171
+ " case 'none':",
172
+ " segments.push('SameSite=None');",
173
+ ' break;',
174
+ ' default:',
175
+ " throw new TypeError('sameSite must be Strict, Lax, or None');",
176
+ ' }',
177
+ ' }',
178
+ ' return segments;',
179
+ '}',
180
+ '',
181
+ 'export function serialize(name, value, options = {}) {',
182
+ ' if (!TOKEN.test(name)) {',
183
+ " throw new TypeError('Cookie name is invalid');",
184
+ ' }',
185
+ " const stringValue = value === undefined ? '' : String(value);",
186
+ ' if (!VALUE.test(stringValue)) {',
187
+ " throw new TypeError('Cookie value is invalid');",
188
+ ' }',
189
+ '',
190
+ ' const encode = options.encode || DEFAULT_ENCODE;',
191
+ ' const encoded = encode(stringValue);',
192
+ ' if (!VALUE.test(encoded)) {',
193
+ " throw new TypeError('Cookie value contains invalid characters after encoding');",
194
+ ' }',
195
+ '',
196
+ ' const segments = [`${name}=${encoded}`];',
197
+ ' segments.push(...formatOptions(options));',
198
+ " return segments.join('; ');",
199
+ '}',
200
+ '',
201
+ 'export default { parse, serialize };',
202
+ 'if (typeof module !== ' + "'undefined'" + ') {',
203
+ ' module.exports = { parse, serialize };',
204
+ '}',
205
+ ];
206
+ const source = sourceLines.join('\n');
207
+
208
+ writeFileSync(targetFile, source, 'utf8');
209
+ if (existsSync(pkgFile)) {
210
+ const pkg = JSON.parse(readFileSync(pkgFile, 'utf8'));
211
+ pkg.version = patchedVersion;
212
+ pkg.description = (pkg.description || 'Cookie utilities') + ' (security patch applied)';
213
+ writeFileSync(pkgFile, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
214
+ }
215
+ updateLockDependency('cookie', patchedVersion);
216
+ return true;
217
+ }
218
+
219
+ function patchEsbuild() {
220
+ const targetFile = path.join(nodeModulesDir, 'esbuild', 'lib', 'main.js');
221
+ const patchedVersion = '0.21.5-patched';
222
+ if (!existsSync(targetFile)) {
223
+ return false;
224
+ }
225
+ const content = readFileSync(targetFile, 'utf8');
226
+ if (!content.includes('ESBUILD_SERVE_PATCH_APPLIED')) {
227
+ const patch = `\n// ESBUILD_SERVE_PATCH_APPLIED\nif (module.exports && typeof module.exports.serve === 'function') {\n module.exports.serve = function patchedEsbuildServe() {\n throw new Error('esbuild serve API disabled by project security patch.');\n };\n}\n`;
228
+ writeFileSync(targetFile, content + patch, 'utf8');
229
+ }
230
+ updateLockDependency('esbuild', patchedVersion);
231
+ const pkgFile = path.join(nodeModulesDir, 'esbuild', 'package.json');
232
+ if (existsSync(pkgFile)) {
233
+ const pkg = JSON.parse(readFileSync(pkgFile, 'utf8'));
234
+ pkg.version = patchedVersion;
235
+ pkg.description = (pkg.description || 'esbuild') + ' (serve API disabled by security patch)';
236
+ writeFileSync(pkgFile, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
237
+ }
238
+ return true;
239
+ }
240
+
241
+ function main() {
242
+ ensureDirectory(nodeModulesDir);
243
+ const patched = [];
244
+ try {
245
+ if (patchCookie()) patched.push('cookie');
246
+ } catch (error) {
247
+ console.warn('[patch] Failed to patch cookie package:', error);
248
+ }
249
+ try {
250
+ if (patchEsbuild()) patched.push('esbuild');
251
+ } catch (error) {
252
+ console.warn('[patch] Failed to patch esbuild package:', error);
253
+ }
254
+ saveLockfile();
255
+ if (patched.length) {
256
+ console.log(`[patch] Applied security hardening for ${patched.join(', ')}`);
257
+ }
258
+ }
259
+
260
+ main();
@@ -0,0 +1,62 @@
1
+ @import "tailwindcss";
2
+ @plugin "daisyui";
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+
8
+ @theme {
9
+ /* Your custom theme extensions can go here */
10
+ }
11
+
12
+ :root {
13
+ color-scheme: light dark;
14
+ }
15
+
16
+ body {
17
+ min-height: 100vh;
18
+ }
19
+
20
+ .chat-markdown {
21
+ @apply space-y-3 text-sm leading-relaxed;
22
+ }
23
+
24
+ .chat-markdown p {
25
+ margin: 0;
26
+ }
27
+
28
+ .chat-markdown pre {
29
+ background: rgba(0, 0, 0, 0.08);
30
+ padding: 0.75rem;
31
+ border-radius: 0.75rem;
32
+ overflow-x: auto;
33
+ }
34
+
35
+ .chat-markdown code {
36
+ font-family: 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
37
+ monospace;
38
+ font-size: 0.85rem;
39
+ }
40
+
41
+ .chat-markdown table {
42
+ width: 100%;
43
+ border-collapse: collapse;
44
+ font-size: 0.9rem;
45
+ }
46
+
47
+ .chat-markdown th,
48
+ .chat-markdown td {
49
+ border: 1px solid rgba(0, 0, 0, 0.1);
50
+ padding: 0.5rem;
51
+ text-align: left;
52
+ }
53
+
54
+ .chat-markdown ul,
55
+ .chat-markdown ol {
56
+ padding-left: 1.25rem;
57
+ }
58
+
59
+ .chat-markdown a {
60
+ color: hsl(var(--p));
61
+ text-decoration: underline;
62
+ }
@@ -0,0 +1,13 @@
1
+ // See https://kit.svelte.dev/docs/types#app
2
+ // for information about these interfaces
3
+ declare global {
4
+ namespace App {
5
+ // interface Error {}
6
+ // interface Locals {}
7
+ // interface PageData {}
8
+ // interface PageState {}
9
+ // interface Platform {}
10
+ }
11
+ }
12
+
13
+ export {};
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="icon" href="%sveltekit.assets%/favicon.png" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ %sveltekit.head%
8
+ </head>
9
+ <body data-sveltekit-preload-data="hover">
10
+ <div style="display: contents">%sveltekit.body%</div>
11
+ </body>
12
+ </html>
@@ -0,0 +1,64 @@
1
+ <script>
2
+ /**
3
+ * LoadingSpinner Component
4
+ *
5
+ * A reusable loading spinner with various sizes and customization options.
6
+ * Uses daisyUI's loading component.
7
+ */
8
+
9
+ let {
10
+ size = 'md',
11
+ type = 'spinner',
12
+ color = '',
13
+ text = '',
14
+ center = true,
15
+ className = ''
16
+ } = $props();
17
+
18
+ // Size mapping
19
+ const sizeClasses = {
20
+ xs: 'loading-xs',
21
+ sm: 'loading-sm',
22
+ md: 'loading-md',
23
+ lg: 'loading-lg'
24
+ };
25
+
26
+ // Type mapping
27
+ const typeClasses = {
28
+ spinner: 'loading-spinner',
29
+ dots: 'loading-dots',
30
+ ring: 'loading-ring',
31
+ ball: 'loading-ball',
32
+ bars: 'loading-bars',
33
+ infinity: 'loading-infinity'
34
+ };
35
+
36
+ // Color mapping
37
+ const colorClasses = {
38
+ primary: 'text-primary',
39
+ secondary: 'text-secondary',
40
+ accent: 'text-accent',
41
+ neutral: 'text-neutral',
42
+ info: 'text-info',
43
+ success: 'text-success',
44
+ warning: 'text-warning',
45
+ error: 'text-error'
46
+ };
47
+
48
+ const loadingClasses = $derived(
49
+ `loading ${typeClasses[type] || typeClasses.spinner} ${sizeClasses[size] || sizeClasses.md} ${
50
+ color ? colorClasses[color] : ''
51
+ } ${className}`
52
+ );
53
+
54
+ const wrapperClasses = $derived(
55
+ center ? 'flex flex-col items-center justify-center gap-2' : 'flex items-center gap-2'
56
+ );
57
+ </script>
58
+
59
+ <div class={wrapperClasses}>
60
+ <span class={loadingClasses}></span>
61
+ {#if text}
62
+ <span class="text-sm text-base-content/70">{text}</span>
63
+ {/if}
64
+ </div>
@@ -0,0 +1,149 @@
1
+ <script>
2
+ import { themeStore, THEMES } from '$lib/stores/theme.svelte.js';
3
+
4
+ let { showLabel = true, buttonClass = 'btn-ghost' } = $props();
5
+
6
+ let showDropdown = $state(false);
7
+ let searchQuery = $state('');
8
+
9
+ // Derived filtered themes
10
+ let filteredThemes = $derived(
11
+ searchQuery
12
+ ? THEMES.filter((theme) => theme.toLowerCase().includes(searchQuery.toLowerCase()))
13
+ : THEMES
14
+ );
15
+
16
+ function selectTheme(theme) {
17
+ themeStore.setTheme(theme);
18
+ showDropdown = false;
19
+ searchQuery = '';
20
+ }
21
+
22
+ function toggleDropdown() {
23
+ showDropdown = !showDropdown;
24
+ }
25
+
26
+ // Close dropdown when clicking outside
27
+ function handleClickOutside(event) {
28
+ if (!event.target.closest('.theme-dropdown-container')) {
29
+ showDropdown = false;
30
+ }
31
+ }
32
+
33
+ $effect(() => {
34
+ if (typeof document === 'undefined') {
35
+ return () => {};
36
+ }
37
+
38
+ if (showDropdown) {
39
+ document.addEventListener('click', handleClickOutside);
40
+ } else {
41
+ document.removeEventListener('click', handleClickOutside);
42
+ }
43
+
44
+ return () => {
45
+ document.removeEventListener('click', handleClickOutside);
46
+ };
47
+ });
48
+ </script>
49
+
50
+ <div class="theme-dropdown-container relative">
51
+ <button
52
+ type="button"
53
+ class="btn {buttonClass} gap-2"
54
+ onclick={toggleDropdown}
55
+ aria-label="Theme Selector"
56
+ >
57
+ <svg
58
+ xmlns="http://www.w3.org/2000/svg"
59
+ class="h-5 w-5"
60
+ fill="none"
61
+ viewBox="0 0 24 24"
62
+ stroke="currentColor"
63
+ >
64
+ <path
65
+ stroke-linecap="round"
66
+ stroke-linejoin="round"
67
+ stroke-width="2"
68
+ d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"
69
+ />
70
+ </svg>
71
+ {#if showLabel}
72
+ <span class="hidden sm:inline capitalize">{themeStore.currentTheme}</span>
73
+ {/if}
74
+ <svg
75
+ class="h-4 w-4 fill-current"
76
+ xmlns="http://www.w3.org/2000/svg"
77
+ viewBox="0 0 20 20"
78
+ >
79
+ <path d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" />
80
+ </svg>
81
+ </button>
82
+
83
+ {#if showDropdown}
84
+ <div class="absolute right-0 z-[100] mt-2 w-64 rounded-box bg-base-100 shadow-2xl">
85
+ <div class="p-3">
86
+ <!-- Search Input -->
87
+ <input
88
+ type="text"
89
+ placeholder="Search themes..."
90
+ class="input input-bordered input-sm w-full"
91
+ bind:value={searchQuery}
92
+ />
93
+ </div>
94
+
95
+ <!-- Themes List -->
96
+ <ul class="menu menu-sm max-h-96 overflow-y-auto p-2">
97
+ {#if filteredThemes.length === 0}
98
+ <li class="disabled">
99
+ <span class="text-base-content/50">No themes found</span>
100
+ </li>
101
+ {:else}
102
+ {#each filteredThemes as theme}
103
+ <li>
104
+ <button
105
+ class:active={themeStore.currentTheme === theme}
106
+ onclick={() => selectTheme(theme)}
107
+ data-theme={theme}
108
+ >
109
+ <div class="flex w-full items-center justify-between">
110
+ <span class="capitalize">{theme}</span>
111
+ <div class="flex gap-1">
112
+ <div
113
+ class="h-3 w-3 rounded bg-primary"
114
+ data-theme={theme}
115
+ ></div>
116
+ <div
117
+ class="h-3 w-3 rounded bg-secondary"
118
+ data-theme={theme}
119
+ ></div>
120
+ <div
121
+ class="h-3 w-3 rounded bg-accent"
122
+ data-theme={theme}
123
+ ></div>
124
+ </div>
125
+ </div>
126
+ </button>
127
+ </li>
128
+ {/each}
129
+ {/if}
130
+ </ul>
131
+
132
+ <!-- Quick Actions -->
133
+ <div class="border-t border-base-300 p-2">
134
+ <button
135
+ class="btn btn-sm btn-block"
136
+ onclick={() => themeStore.toggleDarkMode()}
137
+ >
138
+ Toggle Dark Mode
139
+ </button>
140
+ </div>
141
+ </div>
142
+ {/if}
143
+ </div>
144
+
145
+ <style>
146
+ .theme-dropdown-container {
147
+ position: relative;
148
+ }
149
+ </style>
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Components Index
3
+ *
4
+ * Central export point for all reusable components
5
+ */
6
+ export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
7
+ export { default as LoadingSpinner } from './LoadingSpinner.svelte';
8
+ export { default as BotCard } from '$lib/components/BotCard.svelte';
9
+ export { default as ChatBubble } from '$lib/components/ChatBubble.svelte';
@@ -0,0 +1,60 @@
1
+ import { apiClient } from './client';
2
+
3
+ export type BotSummary = {
4
+ id: string;
5
+ chatbot_id: string;
6
+ name: string;
7
+ description?: string;
8
+ category?: string;
9
+ owner?: string;
10
+ };
11
+
12
+ type BotApiResponse = {
13
+ chatbot_id?: string;
14
+ id?: string;
15
+ name: string;
16
+ description?: string;
17
+ category?: string;
18
+ owner?: string;
19
+ created_by?: string;
20
+ };
21
+
22
+ const mapBot = (bot: BotApiResponse): BotSummary => ({
23
+ id: bot.chatbot_id || bot.id || bot.name,
24
+ chatbot_id: bot.chatbot_id || bot.id || bot.name,
25
+ name: bot.name,
26
+ description: bot.description || 'No description provided.',
27
+ category: bot.category || 'General',
28
+ owner: bot.owner || bot.created_by || 'Unknown'
29
+ });
30
+
31
+ async function listBots() {
32
+ const { data } = await apiClient.get('/api/v1/bots');
33
+ const bots = Array.isArray(data) ? data : data?.bots || [];
34
+ return {
35
+ bots: bots.map(mapBot)
36
+ };
37
+ }
38
+
39
+ async function getBot(agentId: string) {
40
+ try {
41
+ const { data } = await apiClient.get(`/api/v1/bots/${agentId}`);
42
+ return mapBot(data);
43
+ } catch (error: any) {
44
+ if (error?.response?.status === 404) {
45
+ const { bots } = await listBots();
46
+ const found = bots.find(
47
+ (bot) => bot.chatbot_id === agentId || bot.id === agentId || bot.name === agentId
48
+ );
49
+ if (found) {
50
+ return found;
51
+ }
52
+ }
53
+ throw error;
54
+ }
55
+ }
56
+
57
+ export const botsApi = {
58
+ listBots,
59
+ getBot
60
+ };