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,278 @@
1
+ <script lang="ts">
2
+ import type { AgentNodeData } from '$lib/stores/crewStore';
3
+
4
+ // Svelte 5: Use callback props instead of createEventDispatcher
5
+ interface Props {
6
+ agent: AgentNodeData;
7
+ onClose?: () => void;
8
+ onUpdate?: (data: Partial<AgentNodeData>) => void;
9
+ onDelete?: () => void;
10
+ }
11
+
12
+ let { agent, onClose, onUpdate, onDelete }: Props = $props();
13
+
14
+ let editMode = $state<'form' | 'json'>('form');
15
+ let jsonError = $state<string | null>(null);
16
+
17
+ const models = [
18
+ 'gemini-2.5-pro',
19
+ 'gpt-4',
20
+ 'gpt-3.5-turbo',
21
+ 'claude-3-opus',
22
+ 'claude-3-sonnet',
23
+ 'claude-sonnet-4-5-20250929'
24
+ ];
25
+
26
+ const availableTools = [
27
+ 'GoogleSearchTool',
28
+ 'WebScraperTool',
29
+ 'FileReaderTool',
30
+ 'CalculatorTool',
31
+ 'CodeInterpreterTool'
32
+ ];
33
+
34
+ const buildFormState = (source: AgentNodeData) => ({
35
+ agent_id: source.agent_id ?? '',
36
+ name: source.name ?? '',
37
+ agent_class: source.agent_class ?? 'Agent',
38
+ config: {
39
+ model: source.config?.model ?? 'gemini-2.5-pro',
40
+ temperature: source.config?.temperature ?? 0.7
41
+ },
42
+ tools: source.tools ? [...source.tools] : [],
43
+ system_prompt: source.system_prompt ?? ''
44
+ });
45
+
46
+ let formData = $state(buildFormState(agent));
47
+ let jsonText = $state(JSON.stringify(agent, null, 2));
48
+
49
+ $effect(() => {
50
+ if (agent && agent.agent_id !== formData.agent_id) {
51
+ formData = buildFormState(agent);
52
+ jsonText = JSON.stringify(agent, null, 2);
53
+ jsonError = null;
54
+ }
55
+ });
56
+
57
+ function toggleTool(tool: string) {
58
+ if (formData.tools.includes(tool)) {
59
+ formData = { ...formData, tools: formData.tools.filter((item) => item !== tool) };
60
+ } else {
61
+ formData = { ...formData, tools: [...formData.tools, tool] };
62
+ }
63
+ }
64
+
65
+ function handleSave() {
66
+ if (editMode === 'form') {
67
+ onUpdate?.(formData);
68
+ onClose?.();
69
+ return;
70
+ }
71
+
72
+ try {
73
+ const parsed = JSON.parse(jsonText);
74
+ jsonError = null;
75
+ onUpdate?.(parsed);
76
+ onClose?.();
77
+ } catch (error) {
78
+ jsonError = error instanceof Error ? error.message : 'Invalid JSON';
79
+ }
80
+ }
81
+
82
+ function handleFormSubmit(event: SubmitEvent) {
83
+ event.preventDefault();
84
+ handleSave();
85
+ }
86
+
87
+ function switchMode(mode: 'form' | 'json') {
88
+ if (mode === editMode) return;
89
+ if (mode === 'json') {
90
+ jsonText = JSON.stringify(formData, null, 2);
91
+ jsonError = null;
92
+ } else {
93
+ try {
94
+ formData = buildFormState(JSON.parse(jsonText) as AgentNodeData);
95
+ jsonError = null;
96
+ } catch (error) {
97
+ jsonError = error instanceof Error ? error.message : 'Invalid JSON';
98
+ return;
99
+ }
100
+ }
101
+ editMode = mode;
102
+ }
103
+
104
+ function handleDeleteClick() {
105
+ if (confirm('Are you sure you want to delete this agent?')) {
106
+ onDelete?.();
107
+ }
108
+ }
109
+ </script>
110
+
111
+ <div class="fixed inset-0 z-40 flex justify-end">
112
+ <div
113
+ class="absolute inset-0 bg-base-content/40"
114
+ role="button"
115
+ tabindex="0"
116
+ onclick={() => onClose?.()}
117
+ onkeydown={(event) => {
118
+ if (event.key === 'Enter' || event.key === ' ') {
119
+ event.preventDefault();
120
+ onClose?.();
121
+ }
122
+ }}
123
+ ></div>
124
+ <aside class="relative z-10 flex h-full w-full max-w-md flex-col bg-base-100 shadow-2xl">
125
+ <header class="flex items-center justify-between border-b border-base-200 px-6 py-4">
126
+ <h2 class="text-lg font-semibold">Configure Agent</h2>
127
+ <button class="btn btn-circle btn-ghost btn-sm" onclick={() => onClose?.()} aria-label="Close">
128
+
129
+ </button>
130
+ </header>
131
+
132
+ <div class="flex items-center gap-2 border-b border-base-200 px-6 py-3">
133
+ <button
134
+ class={`btn btn-sm flex-1 ${editMode === 'form' ? 'btn-primary' : 'btn-outline'}`}
135
+ type="button"
136
+ onclick={() => switchMode('form')}
137
+ >
138
+ Form
139
+ </button>
140
+ <button
141
+ class={`btn btn-sm flex-1 ${editMode === 'json' ? 'btn-primary' : 'btn-outline'}`}
142
+ type="button"
143
+ onclick={() => switchMode('json')}
144
+ >
145
+ JSON
146
+ </button>
147
+ </div>
148
+
149
+ <div class="flex-1 overflow-y-auto p-6">
150
+ {#if editMode === 'form'}
151
+ <form class="space-y-4" onsubmit={handleFormSubmit}>
152
+ <div class="form-control">
153
+ <label class="label" for="agent-id">
154
+ <span class="label-text">Agent ID</span>
155
+ </label>
156
+ <input
157
+ id="agent-id"
158
+ class="input input-bordered input-sm"
159
+ type="text"
160
+ bind:value={formData.agent_id}
161
+ placeholder="agent_1"
162
+ />
163
+ </div>
164
+
165
+ <div class="form-control">
166
+ <label class="label" for="agent-name">
167
+ <span class="label-text">Name</span>
168
+ </label>
169
+ <input
170
+ id="agent-name"
171
+ class="input input-bordered input-sm"
172
+ type="text"
173
+ bind:value={formData.name}
174
+ placeholder="Agent 1"
175
+ />
176
+ </div>
177
+
178
+ <div class="form-control">
179
+ <label class="label" for="agent-class">
180
+ <span class="label-text">Agent Class</span>
181
+ </label>
182
+ <input
183
+ id="agent-class"
184
+ class="input input-bordered input-sm"
185
+ type="text"
186
+ bind:value={formData.agent_class}
187
+ placeholder="Agent"
188
+ />
189
+ </div>
190
+
191
+ <div class="form-control">
192
+ <label class="label" for="agent-model">
193
+ <span class="label-text">Model</span>
194
+ </label>
195
+ <select id="agent-model" class="select select-bordered select-sm" bind:value={formData.config.model}>
196
+ {#each models as model}
197
+ <option value={model}>{model}</option>
198
+ {/each}
199
+ </select>
200
+ </div>
201
+
202
+ <div class="form-control">
203
+ <label class="label" for="agent-temperature">
204
+ <span class="label-text">Temperature: {formData.config.temperature}</span>
205
+ </label>
206
+ <input
207
+ id="agent-temperature"
208
+ class="range range-primary range-sm"
209
+ type="range"
210
+ min="0"
211
+ max="1"
212
+ step="0.1"
213
+ bind:value={formData.config.temperature}
214
+ />
215
+ </div>
216
+
217
+ <div class="form-control">
218
+ <label class="label">
219
+ <span class="label-text">Tools</span>
220
+ </label>
221
+ <div class="space-y-2">
222
+ {#each availableTools as tool}
223
+ <label class="flex cursor-pointer items-center gap-2">
224
+ <input
225
+ type="checkbox"
226
+ class="checkbox checkbox-sm"
227
+ checked={formData.tools.includes(tool)}
228
+ onchange={() => toggleTool(tool)}
229
+ />
230
+ <span class="text-sm">{tool}</span>
231
+ </label>
232
+ {/each}
233
+ </div>
234
+ </div>
235
+
236
+ <div class="form-control">
237
+ <label class="label" for="agent-prompt">
238
+ <span class="label-text">System Prompt</span>
239
+ </label>
240
+ <textarea
241
+ id="agent-prompt"
242
+ class="textarea textarea-bordered h-32"
243
+ bind:value={formData.system_prompt}
244
+ placeholder="You are an expert AI agent."
245
+ ></textarea>
246
+ </div>
247
+ </form>
248
+ {:else}
249
+ <div class="space-y-4">
250
+ <textarea
251
+ class="textarea textarea-bordered h-96 w-full font-mono text-xs"
252
+ bind:value={jsonText}
253
+ placeholder="Edit JSON..."
254
+ ></textarea>
255
+ {#if jsonError}
256
+ <div class="alert alert-error">
257
+ <span>{jsonError}</span>
258
+ </div>
259
+ {/if}
260
+ </div>
261
+ {/if}
262
+ </div>
263
+
264
+ <footer class="flex items-center justify-between border-t border-base-200 p-6">
265
+ <button class="btn btn-error btn-sm" type="button" onclick={handleDeleteClick}>
266
+ Delete Agent
267
+ </button>
268
+ <div class="flex gap-2">
269
+ <button class="btn btn-ghost btn-sm" type="button" onclick={() => onClose?.()}>
270
+ Cancel
271
+ </button>
272
+ <button class="btn btn-primary btn-sm" type="button" onclick={handleSave}>
273
+ Save Changes
274
+ </button>
275
+ </div>
276
+ </footer>
277
+ </aside>
278
+ </div>
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ export let label: string | null = null;
3
+ export let value: unknown;
4
+ export let depth = 0;
5
+
6
+ const isArray = Array.isArray(value);
7
+ const isObject = value !== null && typeof value === 'object' && !isArray;
8
+ const isExpandable = isArray || isObject;
9
+
10
+ $: entries = (() => {
11
+ if (isArray) {
12
+ return (value as unknown[]).map((item, index) => ({ key: `[${index}]`, value: item }));
13
+ }
14
+ if (isObject) {
15
+ return Object.entries(value as Record<string, unknown>).map(([key, entry]) => ({
16
+ key,
17
+ value: entry
18
+ }));
19
+ }
20
+ return [];
21
+ })();
22
+
23
+ function describeValue(): string {
24
+ if (isArray) {
25
+ return `Array(${entries.length})`;
26
+ }
27
+ if (isObject) {
28
+ return `Object(${entries.length})`;
29
+ }
30
+ if (value === null) {
31
+ return 'null';
32
+ }
33
+ return typeof value;
34
+ }
35
+
36
+ function formatPrimitive(data: unknown): string {
37
+ if (typeof data === 'string') {
38
+ return `"${data}"`;
39
+ }
40
+ if (typeof data === 'number' || typeof data === 'boolean') {
41
+ return String(data);
42
+ }
43
+ if (data === null) {
44
+ return 'null';
45
+ }
46
+ if (typeof data === 'undefined') {
47
+ return 'undefined';
48
+ }
49
+ return JSON.stringify(data);
50
+ }
51
+
52
+ const displayLabel = label ?? 'value';
53
+ </script>
54
+
55
+ <div class={`space-y-1 ${depth === 0 ? '' : 'border-l border-base-300 pl-3'}`}>
56
+ {#if isExpandable}
57
+ <details class="group space-y-1" open={depth < 1}>
58
+ <summary class="cursor-pointer select-none text-sm font-semibold text-base-content">
59
+ <span>{displayLabel}</span>
60
+ <span class="ml-2 text-xs font-normal text-base-content/60">{describeValue()}</span>
61
+ </summary>
62
+ <div class="ml-3 space-y-1">
63
+ {#each entries as entry (entry.key)}
64
+ <svelte:self label={entry.key} value={entry.value} depth={depth + 1} />
65
+ {/each}
66
+ </div>
67
+ </details>
68
+ {:else}
69
+ <div class="flex items-start gap-2 text-sm text-base-content">
70
+ <span class="font-semibold text-base-content/70">{displayLabel}:</span>
71
+ <code class="rounded bg-base-200 px-1 py-0.5 text-xs text-base-content">
72
+ {formatPrimitive(value)}
73
+ </code>
74
+ </div>
75
+ {/if}
76
+ </div>
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import JsonTreeNode from './JsonTreeNode.svelte';
3
+
4
+ export let data: unknown;
5
+ export let title = 'Advanced results';
6
+ </script>
7
+
8
+ <div class="space-y-3">
9
+ <div class="collapse collapse-arrow rounded-lg border border-base-300 bg-base-200">
10
+ <input type="checkbox" />
11
+ <div class="collapse-title text-sm font-semibold uppercase tracking-wide text-base-content/70">
12
+ {title}
13
+ </div>
14
+ <div class="collapse-content">
15
+ {#if data !== undefined}
16
+ <div class="overflow-x-auto">
17
+ <JsonTreeNode value={data} label="root" />
18
+ </div>
19
+ {:else}
20
+ <p class="text-sm text-base-content/60">No data available.</p>
21
+ {/if}
22
+ </div>
23
+ </div>
24
+ </div>
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { markdownToHtml } from '$lib/utils/markdown';
3
+
4
+ export let label = 'Question';
5
+ export let id: string | undefined;
6
+ export let value = '';
7
+ export let placeholder = 'Write your prompt using Markdown...';
8
+ export let helperText = '';
9
+ export let disabled = false;
10
+
11
+ const fallbackId = `markdown-editor-${Math.random().toString(36).slice(2, 10)}`;
12
+ $: textareaId = id && id.trim() ? id : fallbackId;
13
+ $: previewHtml = markdownToHtml(value ?? '');
14
+ </script>
15
+
16
+ <div class="space-y-2">
17
+ {#if label}
18
+ <label class="block text-sm font-semibold text-base-content/80" for={textareaId}>{label}</label>
19
+ {/if}
20
+
21
+ <div class="grid gap-4 md:grid-cols-2">
22
+ <textarea
23
+ bind:value
24
+ {disabled}
25
+ rows="12"
26
+ class="textarea textarea-bordered w-full resize-y"
27
+ placeholder={placeholder}
28
+ id={textareaId}
29
+ ></textarea>
30
+
31
+ <div class="rounded-lg border border-base-300 bg-base-200 p-4">
32
+ <div class="mb-2 text-xs font-semibold uppercase tracking-wide text-base-content/60">
33
+ Preview
34
+ </div>
35
+ {#if previewHtml}
36
+ <div class="space-y-2 text-sm leading-relaxed text-base-content" aria-live="polite">
37
+ {@html previewHtml}
38
+ </div>
39
+ {:else}
40
+ <p class="text-sm text-base-content/60">The rendered Markdown will appear here.</p>
41
+ {/if}
42
+ </div>
43
+ </div>
44
+
45
+ {#if helperText}
46
+ <p class="text-xs text-base-content/60">{helperText}</p>
47
+ {/if}
48
+ </div>
@@ -0,0 +1,36 @@
1
+ <script>
2
+ import { themeStore, THEMES } from '$lib/stores/theme.svelte.js';
3
+
4
+ const themeOptions = THEMES;
5
+ let selectedTheme = $state(themeStore.currentTheme);
6
+
7
+ $effect(() => {
8
+ selectedTheme = themeStore.currentTheme;
9
+ });
10
+
11
+ function handleChange(event) {
12
+ const target = event.target;
13
+ themeStore.setTheme(target.value);
14
+ }
15
+
16
+ function handleToggle() {
17
+ themeStore.toggleDarkMode();
18
+ }
19
+ </script>
20
+
21
+ <div class="flex items-center gap-2">
22
+ <button class="btn btn-sm btn-ghost" type="button" onclick={handleToggle} aria-label="Toggle theme">
23
+ <span class="hidden sm:inline">Toggle</span>
24
+ <span class="sm:hidden">🌓</span>
25
+ </button>
26
+ <select
27
+ class="select select-bordered select-sm"
28
+ bind:value={selectedTheme}
29
+ onchange={handleChange}
30
+ aria-label="Select theme"
31
+ >
32
+ {#each themeOptions as option}
33
+ <option value={option}>{option}</option>
34
+ {/each}
35
+ </select>
36
+ </div>
@@ -0,0 +1,67 @@
1
+ <script>
2
+ import { toastStore } from '$lib/stores/toast.svelte';
3
+
4
+ function getAlertClass(type) {
5
+ switch (type) {
6
+ case 'success':
7
+ return 'alert-success';
8
+ case 'error':
9
+ return 'alert-error';
10
+ case 'warning':
11
+ return 'alert-warning';
12
+ case 'info':
13
+ default:
14
+ return 'alert-info';
15
+ }
16
+ }
17
+
18
+ function getIcon(type) {
19
+ switch (type) {
20
+ case 'success':
21
+ return `
22
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
23
+ d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
24
+ `;
25
+ case 'error':
26
+ return `
27
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
28
+ d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" />
29
+ `;
30
+ case 'warning':
31
+ return `
32
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
33
+ d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
34
+ `;
35
+ case 'info':
36
+ default:
37
+ return `
38
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
39
+ d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
40
+ `;
41
+ }
42
+ }
43
+ </script>
44
+
45
+ <div class="toast toast-top toast-end z-50">
46
+ {#each toastStore.toasts as toast (toast.id)}
47
+ <div class="alert {getAlertClass(toast.type)} shadow-lg">
48
+ <svg
49
+ xmlns="http://www.w3.org/2000/svg"
50
+ class="h-6 w-6 shrink-0 stroke-current"
51
+ fill="none"
52
+ viewBox="0 0 24 24"
53
+ >
54
+ {@html getIcon(toast.type)}
55
+ </svg>
56
+ <span>{toast.message}</span>
57
+ {#if toast.dismissible}
58
+ <button
59
+ class="btn btn-ghost btn-sm btn-circle"
60
+ onclick={() => toastStore.remove(toast.id)}
61
+ >
62
+
63
+ </button>
64
+ {/if}
65
+ </div>
66
+ {/each}
67
+ </div>
@@ -0,0 +1,157 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte';
3
+ import { goto } from '$app/navigation';
4
+ import { crew as crewApi } from '$lib/api';
5
+ import ThemeToggle from '$lib/components/ThemeToggle.svelte';
6
+ import { crewStore } from '$lib/stores/crewStore';
7
+ import { toastStore } from '$lib/stores/toast.svelte';
8
+
9
+ // Svelte 5: Use callback props instead of createEventDispatcher
10
+ interface Props {
11
+ onAddAgent?: () => void;
12
+ onExport?: () => void;
13
+ }
14
+
15
+ let { onAddAgent, onExport }: Props = $props();
16
+
17
+ let crewName = $state('');
18
+ let crewDescription = $state('');
19
+ let executionMode = $state<'sequential' | 'parallel' | 'hierarchical'>('sequential');
20
+ let uploading = $state(false);
21
+ let uploadStatus = $state<{ type: 'success' | 'error'; message: string } | null>(null);
22
+
23
+ const unsubscribe = crewStore.subscribe((value) => {
24
+ crewName = value.metadata.name;
25
+ crewDescription = value.metadata.description;
26
+ executionMode = value.metadata.execution_mode;
27
+ });
28
+
29
+ onDestroy(() => {
30
+ unsubscribe();
31
+ });
32
+
33
+ function updateMetadata() {
34
+ crewStore.updateMetadata({
35
+ name: crewName,
36
+ description: crewDescription,
37
+ execution_mode: executionMode
38
+ });
39
+ }
40
+
41
+ function goHome() {
42
+ crewStore.reset();
43
+ goto('/');
44
+ }
45
+
46
+ async function uploadToAPI() {
47
+ try {
48
+ uploading = true;
49
+ const crewJSON = crewStore.exportToJSON();
50
+ const response = await crewApi.createCrew(crewJSON);
51
+ toastStore.success(`Crew "${response.name ?? crewJSON.name}" created successfully!`);
52
+ } catch (error) {
53
+ const responseMessage =
54
+ typeof error === 'object' &&
55
+ error !== null &&
56
+ 'response' in error &&
57
+ typeof (error as { response?: { data?: { message?: string } } }).response?.data?.message === 'string'
58
+ ? (error as { response?: { data?: { message?: string } } }).response?.data?.message
59
+ : undefined;
60
+ const fallbackMessage =
61
+ error instanceof Error && typeof error.message === 'string'
62
+ ? error.message
63
+ : 'Failed to upload crew';
64
+ const message = responseMessage ?? fallbackMessage;
65
+ uploadStatus = {
66
+ type: 'error',
67
+ message
68
+ };
69
+ } finally {
70
+ uploading = false;
71
+ }
72
+ }
73
+ </script>
74
+
75
+ <div class="navbar border-b border-base-300 bg-base-100 px-4 shadow-sm">
76
+ <div class="flex flex-1 items-center gap-4">
77
+ <!-- Home Button -->
78
+ <button
79
+ class="btn btn-ghost btn-sm gap-2"
80
+ onclick={goHome}
81
+ aria-label="Go to home"
82
+ type="button"
83
+ >
84
+ <svg
85
+ xmlns="http://www.w3.org/2000/svg"
86
+ class="h-5 w-5"
87
+ fill="none"
88
+ viewBox="0 0 24 24"
89
+ stroke="currentColor"
90
+ >
91
+ <path
92
+ stroke-linecap="round"
93
+ stroke-linejoin="round"
94
+ stroke-width="2"
95
+ d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
96
+ />
97
+ </svg>
98
+ <span class="hidden sm:inline">Home</span>
99
+ </button>
100
+
101
+ <div class="flex items-center gap-2 text-xl font-semibold">
102
+ <span class="text-2xl">🦜</span>
103
+ <span class="hidden sm:inline">AgentCrew Builder</span>
104
+ <span class="sm:hidden">Builder</span>
105
+ </div>
106
+
107
+ <div class="flex flex-1 flex-wrap items-center gap-3">
108
+ <label class="form-control w-full max-w-xs">
109
+ <span class="label-text">Crew name</span>
110
+ <input
111
+ class="input input-bordered input-sm"
112
+ type="text"
113
+ bind:value={crewName}
114
+ onchange={updateMetadata}
115
+ placeholder="Crew name..."
116
+ />
117
+ </label>
118
+ <label class="form-control w-full max-w-sm">
119
+ <span class="label-text">Description</span>
120
+ <input
121
+ class="input input-bordered input-sm"
122
+ type="text"
123
+ bind:value={crewDescription}
124
+ onchange={updateMetadata}
125
+ placeholder="Description..."
126
+ />
127
+ </label>
128
+ <label class="form-control w-full max-w-[160px]">
129
+ <span class="label-text">Execution mode</span>
130
+ <select class="select select-bordered select-sm" bind:value={executionMode} onchange={updateMetadata}>
131
+ <option value="sequential">Sequential</option>
132
+ <option value="parallel">Parallel (Coming Soon)</option>
133
+ <option value="hierarchical">Hierarchical (Coming Soon)</option>
134
+ </select>
135
+ </label>
136
+ </div>
137
+ </div>
138
+
139
+ <div class="flex items-center gap-2">
140
+ <ThemeToggle />
141
+ <button class="btn btn-primary btn-sm" type="button" onclick={() => onAddAgent?.()}>
142
+ + Agent
143
+ </button>
144
+ <button class="btn btn-success btn-sm" type="button" onclick={uploadToAPI} disabled={uploading}>
145
+ {uploading ? 'Uploading…' : 'Upload'}
146
+ </button>
147
+ <button class="btn btn-info btn-sm" type="button" onclick={() => onExport?.()}>
148
+ Export JSON
149
+ </button>
150
+ </div>
151
+ </div>
152
+
153
+ {#if uploadStatus}
154
+ <div class={`alert fixed right-4 top-24 z-50 max-w-sm shadow-lg ${uploadStatus.type === 'success' ? 'alert-success' : 'alert-error'}`}>
155
+ <span>{uploadStatus.message}</span>
156
+ </div>
157
+ {/if}