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
agentui/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "agentui",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "svelte-kit sync && vite dev",
8
+ "build": "svelte-kit sync && vite build",
9
+ "preview": "svelte-kit sync && 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
+ "axios": "^1.7.9",
30
+ "daisyui": "^5.0.0",
31
+ "isomorphic-dompurify": "^2.15.0",
32
+ "marked": "^15.0.4"
33
+ }
34
+ }
@@ -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();
agentui/src/app.css ADDED
@@ -0,0 +1,61 @@
1
+ @import "tailwindcss";
2
+ @plugin "daisyui";
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+ @theme {
8
+ /* Custom theme extensions */
9
+ }
10
+
11
+ :root {
12
+ color-scheme: light dark;
13
+ }
14
+
15
+ body {
16
+ min-height: 100vh;
17
+ }
18
+
19
+ .chat-markdown {
20
+ @apply space-y-3 text-sm leading-relaxed;
21
+ }
22
+
23
+ .chat-markdown p {
24
+ margin: 0;
25
+ }
26
+
27
+ .chat-markdown pre {
28
+ background: rgba(0, 0, 0, 0.08);
29
+ padding: 0.75rem;
30
+ border-radius: 0.75rem;
31
+ overflow-x: auto;
32
+ }
33
+
34
+ .chat-markdown code {
35
+ font-family: "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
36
+ monospace;
37
+ font-size: 0.85rem;
38
+ }
39
+
40
+ .chat-markdown table {
41
+ width: 100%;
42
+ border-collapse: collapse;
43
+ font-size: 0.9rem;
44
+ }
45
+
46
+ .chat-markdown th,
47
+ .chat-markdown td {
48
+ border: 1px solid rgba(0, 0, 0, 0.1);
49
+ padding: 0.5rem;
50
+ text-align: left;
51
+ }
52
+
53
+ .chat-markdown ul,
54
+ .chat-markdown ol {
55
+ padding-left: 1.25rem;
56
+ }
57
+
58
+ .chat-markdown a {
59
+ color: hsl(var(--p));
60
+ text-decoration: underline;
61
+ }
agentui/src/app.d.ts ADDED
@@ -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 {};
agentui/src/app.html ADDED
@@ -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,159 @@
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
+ let currentTheme = $state('light');
17
+
18
+ function selectTheme(theme) {
19
+ themeStore.setTheme(theme);
20
+ showDropdown = false;
21
+ searchQuery = '';
22
+ }
23
+
24
+ function toggleDropdown() {
25
+ showDropdown = !showDropdown;
26
+ }
27
+
28
+ // Close dropdown when clicking outside
29
+ function handleClickOutside(event) {
30
+ if (!event.target.closest('.theme-dropdown-container')) {
31
+ showDropdown = false;
32
+ }
33
+ }
34
+
35
+ $effect(() => {
36
+ if (typeof document === 'undefined') {
37
+ return () => {};
38
+ }
39
+
40
+ if (showDropdown) {
41
+ document.addEventListener('click', handleClickOutside);
42
+ } else {
43
+ document.removeEventListener('click', handleClickOutside);
44
+ }
45
+
46
+ return () => {
47
+ document.removeEventListener('click', handleClickOutside);
48
+ };
49
+ });
50
+
51
+ $effect(() => {
52
+ const unsubscribe = themeStore.subscribe((value) => {
53
+ currentTheme = value.currentTheme;
54
+ });
55
+
56
+ return () => unsubscribe();
57
+ });
58
+ </script>
59
+
60
+ <div class="theme-dropdown-container relative">
61
+ <button
62
+ type="button"
63
+ class="btn {buttonClass} gap-2"
64
+ onclick={toggleDropdown}
65
+ aria-label="Theme Selector"
66
+ >
67
+ <svg
68
+ xmlns="http://www.w3.org/2000/svg"
69
+ class="h-5 w-5"
70
+ fill="none"
71
+ viewBox="0 0 24 24"
72
+ stroke="currentColor"
73
+ >
74
+ <path
75
+ stroke-linecap="round"
76
+ stroke-linejoin="round"
77
+ stroke-width="2"
78
+ 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"
79
+ />
80
+ </svg>
81
+ {#if showLabel}
82
+ <span class="hidden sm:inline capitalize">{currentTheme}</span>
83
+ {/if}
84
+ <svg
85
+ class="h-4 w-4 fill-current"
86
+ xmlns="http://www.w3.org/2000/svg"
87
+ viewBox="0 0 20 20"
88
+ >
89
+ <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" />
90
+ </svg>
91
+ </button>
92
+
93
+ {#if showDropdown}
94
+ <div class="absolute right-0 z-[100] mt-2 w-64 rounded-box bg-base-100 shadow-2xl">
95
+ <div class="p-3">
96
+ <!-- Search Input -->
97
+ <input
98
+ type="text"
99
+ placeholder="Search themes..."
100
+ class="input input-bordered input-sm w-full"
101
+ bind:value={searchQuery}
102
+ />
103
+ </div>
104
+
105
+ <!-- Themes List -->
106
+ <ul class="menu menu-sm max-h-96 overflow-y-auto p-2">
107
+ {#if filteredThemes.length === 0}
108
+ <li class="disabled">
109
+ <span class="text-base-content/50">No themes found</span>
110
+ </li>
111
+ {:else}
112
+ {#each filteredThemes as theme}
113
+ <li>
114
+ <button
115
+ class:active={currentTheme === theme}
116
+ onclick={() => selectTheme(theme)}
117
+ data-theme={theme}
118
+ >
119
+ <div class="flex w-full items-center justify-between">
120
+ <span class="capitalize">{theme}</span>
121
+ <div class="flex gap-1">
122
+ <div
123
+ class="h-3 w-3 rounded bg-primary"
124
+ data-theme={theme}
125
+ ></div>
126
+ <div
127
+ class="h-3 w-3 rounded bg-secondary"
128
+ data-theme={theme}
129
+ ></div>
130
+ <div
131
+ class="h-3 w-3 rounded bg-accent"
132
+ data-theme={theme}
133
+ ></div>
134
+ </div>
135
+ </div>
136
+ </button>
137
+ </li>
138
+ {/each}
139
+ {/if}
140
+ </ul>
141
+
142
+ <!-- Quick Actions -->
143
+ <div class="border-t border-base-300 p-2">
144
+ <button
145
+ class="btn btn-sm btn-block"
146
+ onclick={() => themeStore.toggleDarkMode()}
147
+ >
148
+ Toggle Dark Mode
149
+ </button>
150
+ </div>
151
+ </div>
152
+ {/if}
153
+ </div>
154
+
155
+ <style>
156
+ .theme-dropdown-container {
157
+ position: relative;
158
+ }
159
+ </style>
@@ -0,0 +1,4 @@
1
+ export { default as LoadingSpinner } from './LoadingSpinner.svelte';
2
+ export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
3
+ export { default as BotCard } from '$lib/components/BotCard.svelte';
4
+ export { default as ChatBubble } from '$lib/components/ChatBubble.svelte';
@@ -0,0 +1,60 @@
1
+ import apiClient from './http';
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
+ };
@@ -0,0 +1,22 @@
1
+ import apiClient from './http';
2
+
3
+ export type ChatRequest = {
4
+ query: string;
5
+ };
6
+
7
+ export type ChatResponse = {
8
+ turn_id: string;
9
+ input: string;
10
+ output: string;
11
+ response: string;
12
+ [key: string]: any;
13
+ };
14
+
15
+ async function sendChat(agentId: string, payload: ChatRequest): Promise<ChatResponse> {
16
+ const { data } = await apiClient.post(`/api/v1/agents/chat/${agentId}`, payload);
17
+ return data;
18
+ }
19
+
20
+ export const chatApi = {
21
+ sendChat
22
+ };