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,487 @@
1
+ <script lang="ts">
2
+ import { browser } from '$app/environment';
3
+ import { goto } from '$app/navigation';
4
+ import { onMount } from 'svelte';
5
+ import { botsApi, type BotSummary } from '$lib/api/bots';
6
+ import { chatApi, type AgentMessageRequest, type ChatResponse } from '$lib/api/chat';
7
+ import { authStore } from '$lib/stores/auth.svelte.ts';
8
+ import { saveTurn } from '$lib/utils/conversation';
9
+ import {
10
+ loadQuestionHistory,
11
+ saveQuestionHistory,
12
+ type QuestionHistoryEntry
13
+ } from '$lib/utils/talkHistory';
14
+ import { LoadingSpinner } from '$lib/components';
15
+
16
+ const { data } = $props<{ data: { agentId: string } }>();
17
+ const agentId = $derived(data.agentId);
18
+
19
+ type ConversationItem = {
20
+ id: string;
21
+ role: 'user' | 'assistant';
22
+ content: string;
23
+ timestamp: string;
24
+ turnId?: string;
25
+ raw?: ChatResponse;
26
+ mode: 'talk' | 'method';
27
+ methodName?: string;
28
+ outputMode?: string;
29
+ background?: boolean;
30
+ };
31
+
32
+ const outputModes = ['default', 'html', 'json', 'markdown', 'yaml', 'terminal'];
33
+
34
+ let agent: BotSummary | null = $state(null);
35
+ let loading = $state(true);
36
+ let sending = $state(false);
37
+ let error = $state('');
38
+ let messages = $state<ConversationItem[]>([]);
39
+ let history = $state<QuestionHistoryEntry[]>([]);
40
+ let input = $state('');
41
+ let mode = $state<'talk' | 'method'>('talk');
42
+ let background = $state(false);
43
+ let outputMode = $state('');
44
+ let followUpTurnId = $state<string | null>(null);
45
+ let methodName = $state('');
46
+ let methodParams = $state<Array<{ id: string; key: string; value: string }>>([
47
+ { id: crypto.randomUUID(), key: '', value: '' }
48
+ ]);
49
+ let attachments = $state<File[]>([]);
50
+
51
+ const markdownToHtml = (text: string) => {
52
+ if (!text) return '';
53
+
54
+ const escapeHtml = (value: string) =>
55
+ value
56
+ .replace(/&/g, '&amp;')
57
+ .replace(/</g, '&lt;')
58
+ .replace(/>/g, '&gt;')
59
+ .replace(/\"/g, '&quot;')
60
+ .replace(/'/g, '&#39;');
61
+
62
+ let html = escapeHtml(text);
63
+
64
+ html = html.replace(/```([\s\S]*?)```/g, (_match, code) => `<pre><code>${code}</code></pre>`);
65
+ html = html.replace(/`([^`]+)`/g, (_match, code) => `<code>${code}</code>`);
66
+ html = html.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
67
+ html = html.replace(/__([^_]+)__/g, '<strong>$1</strong>');
68
+ html = html.replace(/\*([^*]+)\*/g, '<em>$1</em>');
69
+ html = html.replace(/_([^_]+)_/g, '<em>$1</em>');
70
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noreferrer">$1</a>');
71
+ html = html.replace(/^### (.*)$/gim, '<h3>$1</h3>');
72
+ html = html.replace(/^## (.*)$/gim, '<h2>$1</h2>');
73
+ html = html.replace(/^# (.*)$/gim, '<h1>$1</h1>');
74
+ html = html.replace(/^\s*[-*] (.*)$/gim, '<li>$1</li>');
75
+ html = html.replace(/(?:\n)(<li>.*<\/li>(?:\n<li>.*<\/li>)*)/g, '<ul>$1</ul>');
76
+
77
+ const paragraphs = html
78
+ .split(/\n{2,}/)
79
+ .map((section) => `<p>${section.replace(/\n/g, '<br />')}</p>`)
80
+ .join('');
81
+
82
+ return paragraphs || html;
83
+ };
84
+
85
+ async function loadAgent() {
86
+ loading = true;
87
+ error = '';
88
+ try {
89
+ agent = await botsApi.getBot(agentId);
90
+ } catch (err: any) {
91
+ console.error('Failed to load agent', err);
92
+ error = err?.response?.data?.message || 'Unable to load the agent right now.';
93
+ } finally {
94
+ loading = false;
95
+ }
96
+ }
97
+
98
+ function refreshHistory() {
99
+ history = loadQuestionHistory(agentId).sort(
100
+ (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
101
+ );
102
+ }
103
+
104
+ function handleParamChange(id: string, field: 'key' | 'value', value: string) {
105
+ methodParams = methodParams.map((param) =>
106
+ param.id === id
107
+ ? {
108
+ ...param,
109
+ [field]: value
110
+ }
111
+ : param
112
+ );
113
+ }
114
+
115
+ function addParamRow() {
116
+ methodParams = [...methodParams, { id: crypto.randomUUID(), key: '', value: '' }];
117
+ }
118
+
119
+ function removeParamRow(id: string) {
120
+ methodParams = methodParams.filter((param) => param.id !== id);
121
+ if (methodParams.length === 0) {
122
+ addParamRow();
123
+ }
124
+ }
125
+
126
+ function handleFileChange(event: Event) {
127
+ const target = event.target as HTMLInputElement;
128
+ const files = target.files ? Array.from(target.files) : [];
129
+ attachments = files;
130
+ }
131
+
132
+ function selectFollowUp(turnId: string) {
133
+ followUpTurnId = turnId;
134
+ }
135
+
136
+ async function sendMessage() {
137
+ if (!input.trim() || sending) return;
138
+ if (mode === 'method' && !methodName.trim()) {
139
+ error = 'Method name is required when calling a method.';
140
+ return;
141
+ }
142
+
143
+ const text = input.trim();
144
+ const userMessage: ConversationItem = {
145
+ id: crypto.randomUUID(),
146
+ role: 'user',
147
+ content: text,
148
+ timestamp: new Date().toISOString(),
149
+ mode,
150
+ methodName: mode === 'method' ? methodName.trim() : undefined,
151
+ outputMode: outputMode || undefined,
152
+ background
153
+ };
154
+ messages = [...messages, userMessage];
155
+ input = '';
156
+ sending = true;
157
+ error = '';
158
+
159
+ const params = methodParams.reduce<Record<string, string>>((acc, item) => {
160
+ if (item.key.trim()) acc[item.key.trim()] = item.value;
161
+ return acc;
162
+ }, {});
163
+
164
+ const payload: AgentMessageRequest = {
165
+ query: text,
166
+ background,
167
+ turn_id: followUpTurnId || undefined,
168
+ output_mode: outputMode || undefined,
169
+ method_name: mode === 'method' ? methodName.trim() : undefined,
170
+ params,
171
+ attachments: mode === 'method' ? attachments : []
172
+ };
173
+
174
+ try {
175
+ const response = await chatApi.sendAgentMessage(agentId, payload);
176
+ const reply = response?.response || response?.output || 'The agent did not return a response.';
177
+ const assistantMessage: ConversationItem = {
178
+ id: crypto.randomUUID(),
179
+ role: 'assistant',
180
+ content: reply,
181
+ timestamp: new Date().toISOString(),
182
+ turnId: response?.turn_id,
183
+ raw: response,
184
+ mode,
185
+ methodName: payload.method_name,
186
+ outputMode: outputMode || undefined,
187
+ background
188
+ };
189
+ messages = [...messages, assistantMessage];
190
+ if (response?.turn_id) {
191
+ saveTurn(agentId, response);
192
+ const historyEntry: QuestionHistoryEntry = {
193
+ turnId: response.turn_id,
194
+ question: text,
195
+ timestamp: new Date().toISOString(),
196
+ mode,
197
+ methodName: payload.method_name,
198
+ outputMode: outputMode || undefined,
199
+ background
200
+ };
201
+ saveQuestionHistory(agentId, historyEntry);
202
+ refreshHistory();
203
+ followUpTurnId = response.turn_id;
204
+ }
205
+ attachments = [];
206
+ } catch (err: any) {
207
+ console.error('Chat failed', err);
208
+ error = err?.response?.data?.message || err?.message || 'Chat failed. Please try again.';
209
+ messages = messages.filter((message) => message.id !== userMessage.id);
210
+ } finally {
211
+ sending = false;
212
+ }
213
+ }
214
+
215
+ function handleKeydown(event: KeyboardEvent) {
216
+ if (event.key === 'Enter' && !event.shiftKey) {
217
+ event.preventDefault();
218
+ sendMessage();
219
+ }
220
+ }
221
+
222
+ onMount(() => {
223
+ if (!browser) return;
224
+ if (!$authStore.isAuthenticated && !$authStore.loading) {
225
+ goto('/login');
226
+ return;
227
+ }
228
+ loadAgent();
229
+ refreshHistory();
230
+ });
231
+ </script>
232
+
233
+ <svelte:head>
234
+ <title>Talk to Agent</title>
235
+ </svelte:head>
236
+
237
+ {#if loading}
238
+ <div class="flex min-h-screen items-center justify-center">
239
+ <LoadingSpinner text="Loading agent..." />
240
+ </div>
241
+ {:else if !agent}
242
+ <div class="flex min-h-screen flex-col items-center justify-center gap-4">
243
+ <p class="text-lg font-semibold text-base-content/80">{error || 'Agent not found.'}</p>
244
+ <button class="btn btn-primary" type="button" on:click={() => goto('/agents')}>Back to agents</button>
245
+ </div>
246
+ {:else}
247
+ <div class="min-h-screen bg-base-200/40">
248
+ <div class="mx-auto flex max-w-7xl gap-4 p-4 lg:gap-6 lg:p-8">
249
+ <aside class="hidden w-72 flex-shrink-0 flex-col gap-4 rounded-3xl bg-base-100 p-5 shadow-xl lg:flex">
250
+ <div class="space-y-1">
251
+ <p class="text-sm text-base-content/60">Talking to</p>
252
+ <h2 class="text-2xl font-bold text-base-content">{agent.name}</h2>
253
+ <p class="text-sm text-base-content/70">{agent.description}</p>
254
+ </div>
255
+ <div class="divider my-2"></div>
256
+ <div class="flex items-center justify-between text-sm font-semibold text-base-content/80">
257
+ <span>Previous questions</span>
258
+ <span class="badge badge-ghost">{history.length}</span>
259
+ </div>
260
+ <div class="flex-1 space-y-2 overflow-y-auto pr-1">
261
+ {#if history.length === 0}
262
+ <p class="rounded-xl bg-base-200/70 p-3 text-sm text-base-content/70">No questions yet.</p>
263
+ {:else}
264
+ {#each history as entry (entry.turnId)}
265
+ <button
266
+ type="button"
267
+ class={`w-full rounded-xl border p-3 text-left text-sm transition hover:border-primary/60 hover:bg-primary/5 ${
268
+ followUpTurnId === entry.turnId ? 'border-primary bg-primary/10' : 'border-base-200'
269
+ }`}
270
+ on:click={() => selectFollowUp(entry.turnId)}
271
+ >
272
+ <div class="flex items-center justify-between text-xs uppercase text-base-content/70">
273
+ <span>{entry.mode === 'method' ? 'Method' : 'Talk'}</span>
274
+ {#if entry.methodName}
275
+ <span class="font-semibold text-primary">{entry.methodName}</span>
276
+ {/if}
277
+ </div>
278
+ <p
279
+ class="mt-1 overflow-hidden text-base-content"
280
+ style="display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;"
281
+ >
282
+ {entry.question}
283
+ </p>
284
+ <p class="mt-1 text-[11px] font-mono text-base-content/60">{entry.turnId}</p>
285
+ </button>
286
+ {/each}
287
+ {/if}
288
+ </div>
289
+ </aside>
290
+
291
+ <section class="flex flex-1 flex-col gap-4">
292
+ <div class="rounded-3xl border border-base-200 bg-base-100 p-4 shadow-sm">
293
+ <div class="flex flex-col gap-2 md:flex-row md:items-center md:justify-between">
294
+ <div>
295
+ <p class="text-sm text-base-content/60">Agent</p>
296
+ <h1 class="text-2xl font-bold">{agent.name}</h1>
297
+ </div>
298
+ <div class="flex items-center gap-3">
299
+ <span class="text-sm text-base-content/70">Talk</span>
300
+ <label class="swap">
301
+ <input
302
+ type="checkbox"
303
+ checked={mode === 'method'}
304
+ on:change={(event) => (mode = (event.target as HTMLInputElement).checked ? 'method' : 'talk')}
305
+ />
306
+ <div class="swap-on badge badge-primary">Method</div>
307
+ <div class="swap-off badge badge-neutral">Chat</div>
308
+ </label>
309
+ <span class="text-sm text-base-content/70">Method</span>
310
+ </div>
311
+ </div>
312
+ </div>
313
+
314
+ <div class="grid grid-cols-1 gap-4 lg:grid-cols-[2fr_1fr]">
315
+ <div class="flex flex-col gap-4 rounded-3xl border border-base-200 bg-base-100 p-5 shadow-lg">
316
+ <div class="flex flex-wrap items-center gap-3">
317
+ <label class="flex items-center gap-2 text-sm">
318
+ <input
319
+ type="checkbox"
320
+ class="toggle toggle-primary"
321
+ checked={background}
322
+ on:change={(event) => (background = (event.target as HTMLInputElement).checked)}
323
+ />
324
+ <span>Background</span>
325
+ </label>
326
+ <div class="flex items-center gap-2 text-sm">
327
+ <span>Output mode:</span>
328
+ <select
329
+ class="select select-bordered select-sm"
330
+ value={outputMode}
331
+ on:change={(event) => (outputMode = (event.target as HTMLSelectElement).value)}
332
+ >
333
+ <option value="">default</option>
334
+ {#each outputModes as modeOption}
335
+ <option value={modeOption} selected={outputMode === modeOption}>{modeOption}</option>
336
+ {/each}
337
+ </select>
338
+ </div>
339
+ {#if followUpTurnId}
340
+ <div class="badge badge-outline badge-primary flex items-center gap-2 text-xs">
341
+ <span>Follow-up: {followUpTurnId}</span>
342
+ <button
343
+ type="button"
344
+ class="ml-1 text-primary"
345
+ aria-label="Clear follow up"
346
+ on:click={() => (followUpTurnId = null)}
347
+ >
348
+
349
+ </button>
350
+ </div>
351
+ {/if}
352
+ </div>
353
+
354
+ {#if mode === 'method'}
355
+ <div class="space-y-3 rounded-2xl bg-base-200/60 p-4">
356
+ <div class="flex flex-col gap-2 md:flex-row md:items-center">
357
+ <label class="text-sm font-semibold md:w-40">Method name</label>
358
+ <input
359
+ type="text"
360
+ class="input input-bordered w-full"
361
+ placeholder="e.g. summarize_document"
362
+ value={methodName}
363
+ on:input={(event) => (methodName = (event.target as HTMLInputElement).value)}
364
+ />
365
+ </div>
366
+ <div class="flex flex-col gap-2 md:flex-row md:items-start">
367
+ <label class="text-sm font-semibold md:w-40">Parameters</label>
368
+ <div class="flex-1 space-y-2">
369
+ {#each methodParams as param (param.id)}
370
+ <div class="flex flex-col gap-2 rounded-xl border border-base-300/70 p-3 md:flex-row md:items-center">
371
+ <input
372
+ type="text"
373
+ class="input input-bordered flex-1"
374
+ placeholder="key"
375
+ value={param.key}
376
+ on:input={(event) => handleParamChange(param.id, 'key', (event.target as HTMLInputElement).value)}
377
+ />
378
+ <input
379
+ type="text"
380
+ class="input input-bordered flex-[2]"
381
+ placeholder="value"
382
+ value={param.value}
383
+ on:input={(event) => handleParamChange(param.id, 'value', (event.target as HTMLInputElement).value)}
384
+ />
385
+ <button
386
+ type="button"
387
+ class="btn btn-ghost btn-sm"
388
+ on:click={() => removeParamRow(param.id)}
389
+ aria-label="Remove parameter"
390
+ >
391
+
392
+ </button>
393
+ </div>
394
+ {/each}
395
+ <button type="button" class="btn btn-outline btn-sm" on:click={addParamRow}>Add parameter</button>
396
+ </div>
397
+ </div>
398
+ <div class="flex flex-col gap-2 md:flex-row md:items-center">
399
+ <label class="text-sm font-semibold md:w-40">Attachments</label>
400
+ <input
401
+ type="file"
402
+ multiple
403
+ class="file-input file-input-bordered w-full"
404
+ on:change={handleFileChange}
405
+ />
406
+ </div>
407
+ </div>
408
+ {/if}
409
+
410
+ <div class="space-y-2">
411
+ <label class="text-sm font-semibold text-base-content/80">Message</label>
412
+ <textarea
413
+ class="textarea textarea-bordered min-h-[140px] w-full font-mono"
414
+ placeholder="Write your prompt here... (supports markdown)"
415
+ value={input}
416
+ on:input={(event) => (input = (event.target as HTMLTextAreaElement).value)}
417
+ on:keydown={handleKeydown}
418
+ ></textarea>
419
+ <div class="flex items-center justify-between text-sm text-base-content/70">
420
+ <span>Use Shift+Enter for a new line.</span>
421
+ <button
422
+ class="btn btn-primary"
423
+ type="button"
424
+ disabled={sending}
425
+ on:click={sendMessage}
426
+ >
427
+ {sending ? 'Sending...' : mode === 'method' ? 'Call method' : 'Send message'}
428
+ </button>
429
+ </div>
430
+ {#if error}
431
+ <p class="text-sm text-error">{error}</p>
432
+ {/if}
433
+ </div>
434
+ </div>
435
+
436
+ <div class="flex flex-col gap-3 rounded-3xl border border-base-200 bg-base-100 p-5 shadow-lg">
437
+ <h3 class="text-lg font-semibold text-base-content">Responses</h3>
438
+ <div class="flex-1 space-y-3 overflow-y-auto pr-1">
439
+ {#if messages.length === 0}
440
+ <p class="rounded-xl bg-base-200/70 p-3 text-sm text-base-content/70">No messages yet.</p>
441
+ {:else}
442
+ {#each messages as message (message.id)}
443
+ <div
444
+ class={`rounded-2xl border p-4 shadow-sm ${
445
+ message.role === 'user'
446
+ ? 'border-primary/40 bg-primary/5'
447
+ : 'border-base-200 bg-base-50'
448
+ }`}
449
+ >
450
+ <div class="flex flex-wrap items-center justify-between gap-2 text-xs text-base-content/60">
451
+ <div class="flex items-center gap-2">
452
+ <span class="font-semibold uppercase">{message.role}</span>
453
+ <span>•</span>
454
+ <span>{new Date(message.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
455
+ </div>
456
+ <div class="flex items-center gap-2">
457
+ {#if message.turnId}
458
+ <span class="badge badge-outline">Turn: {message.turnId}</span>
459
+ {/if}
460
+ {#if message.mode === 'method' && message.methodName}
461
+ <span class="badge badge-info badge-outline">{message.methodName}</span>
462
+ {/if}
463
+ {#if message.background}
464
+ <span class="badge badge-warning badge-outline">Background</span>
465
+ {/if}
466
+ {#if message.outputMode}
467
+ <span class="badge badge-outline">{message.outputMode}</span>
468
+ {/if}
469
+ </div>
470
+ </div>
471
+ {#if message.role === 'assistant'}
472
+ <div class="prose prose-sm max-w-none pt-3" on:click|stopPropagation>
473
+ {@html markdownToHtml(message.content)}
474
+ </div>
475
+ {:else}
476
+ <p class="pt-3 font-mono text-sm text-base-content">{message.content}</p>
477
+ {/if}
478
+ </div>
479
+ {/each}
480
+ {/if}
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </section>
485
+ </div>
486
+ </div>
487
+ {/if}
@@ -0,0 +1,7 @@
1
+ export const ssr = false;
2
+
3
+ export function load({ params }) {
4
+ return {
5
+ agentId: params.agentId
6
+ };
7
+ }
@@ -0,0 +1 @@
1
+ ## Static files
@@ -0,0 +1,11 @@
1
+ import adapter from '@sveltejs/adapter-auto';
2
+ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
3
+
4
+ const config = {
5
+ preprocess: vitePreprocess(),
6
+ kit: {
7
+ adapter: adapter()
8
+ }
9
+ };
10
+
11
+ export default config;
@@ -0,0 +1,53 @@
1
+ import type { Config } from 'tailwindcss';
2
+ import daisyui from 'daisyui';
3
+
4
+ export default {
5
+ content: ['./src/**/*.{html,js,svelte,ts}'],
6
+ theme: {
7
+ extend: {}
8
+ },
9
+ plugins: [daisyui],
10
+ daisyui: {
11
+ themes: [
12
+ 'light',
13
+ 'dark',
14
+ 'cupcake',
15
+ 'bumblebee',
16
+ 'emerald',
17
+ 'corporate',
18
+ 'synthwave',
19
+ 'retro',
20
+ 'cyberpunk',
21
+ 'valentine',
22
+ 'halloween',
23
+ 'garden',
24
+ 'forest',
25
+ 'aqua',
26
+ 'lofi',
27
+ 'pastel',
28
+ 'fantasy',
29
+ 'wireframe',
30
+ 'black',
31
+ 'luxury',
32
+ 'dracula',
33
+ 'cmyk',
34
+ 'autumn',
35
+ 'business',
36
+ 'acid',
37
+ 'lemonade',
38
+ 'night',
39
+ 'coffee',
40
+ 'winter',
41
+ 'dim',
42
+ 'nord',
43
+ 'sunset'
44
+ ],
45
+ darkTheme: 'dark',
46
+ base: true,
47
+ styled: true,
48
+ utils: true,
49
+ prefix: '',
50
+ logs: true,
51
+ themeRoot: ':root'
52
+ }
53
+ } satisfies Config;
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./.svelte-kit/tsconfig.json"
3
+ }
@@ -0,0 +1,10 @@
1
+ import { sveltekit } from '@sveltejs/kit/vite';
2
+ import tailwindcss from '@tailwindcss/vite';
3
+ import { defineConfig } from 'vite';
4
+
5
+ export default defineConfig({
6
+ plugins: [
7
+ tailwindcss(),
8
+ sveltekit()
9
+ ]
10
+ });