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.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { browser } from '$app/environment';
|
|
3
|
+
import { goto } from '$app/navigation';
|
|
4
|
+
import { onMount } from 'svelte';
|
|
5
|
+
import { authStore } from '$lib/stores/auth.svelte.ts';
|
|
6
|
+
import { botsApi, type BotSummary } from '$lib/api/bots';
|
|
7
|
+
import { BotCard, LoadingSpinner, ThemeSwitcher } from '../../components';
|
|
8
|
+
import { config } from '$lib/config';
|
|
9
|
+
|
|
10
|
+
let bots = $state<BotSummary[]>([]);
|
|
11
|
+
let loading = $state(true);
|
|
12
|
+
let error = $state('');
|
|
13
|
+
let searchTerm = $state('');
|
|
14
|
+
let selectedCategory = $state('All');
|
|
15
|
+
let categories = $state<string[]>(['All']);
|
|
16
|
+
|
|
17
|
+
$effect(() => {
|
|
18
|
+
const uniqueCategories = Array.from(
|
|
19
|
+
new Set(bots.map((bot) => bot.category?.trim() || 'Lifestyle & Wellness'))
|
|
20
|
+
);
|
|
21
|
+
categories = ['All', ...uniqueCategories];
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
$effect(() => {
|
|
25
|
+
if (!categories.includes(selectedCategory)) {
|
|
26
|
+
selectedCategory = 'All';
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
async function fetchBots() {
|
|
31
|
+
if (!browser) return;
|
|
32
|
+
|
|
33
|
+
loading = true;
|
|
34
|
+
error = '';
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const response = await botsApi.listBots();
|
|
38
|
+
bots = response.bots || [];
|
|
39
|
+
} catch (err: any) {
|
|
40
|
+
console.error('Failed to load bots', err);
|
|
41
|
+
error =
|
|
42
|
+
err?.response?.data?.message || err?.message || 'Unable to load your agents right now.';
|
|
43
|
+
bots = [];
|
|
44
|
+
} finally {
|
|
45
|
+
loading = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let hasFetchedBots = false;
|
|
50
|
+
|
|
51
|
+
const filteredBots = $derived(() => {
|
|
52
|
+
let list = bots;
|
|
53
|
+
|
|
54
|
+
if (selectedCategory !== 'All') {
|
|
55
|
+
list = list.filter(
|
|
56
|
+
(bot) => (bot.category || 'Lifestyle & Wellness') === selectedCategory
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (searchTerm.trim()) {
|
|
61
|
+
const search = searchTerm.trim().toLowerCase();
|
|
62
|
+
list = list.filter(
|
|
63
|
+
(bot) =>
|
|
64
|
+
bot.name.toLowerCase().includes(search) ||
|
|
65
|
+
bot.description?.toLowerCase().includes(search)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return list;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
function selectCategory(category: string) {
|
|
73
|
+
selectedCategory = category;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function handleLogout() {
|
|
77
|
+
authStore.logout();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const environmentLabel = config.environmentLabel;
|
|
81
|
+
|
|
82
|
+
onMount(() => {
|
|
83
|
+
if (!browser) return;
|
|
84
|
+
|
|
85
|
+
const unsubscribe = authStore.subscribe((state) => {
|
|
86
|
+
if (state.loading) return;
|
|
87
|
+
|
|
88
|
+
if (!state.isAuthenticated) {
|
|
89
|
+
hasFetchedBots = false;
|
|
90
|
+
if (window.location.pathname !== '/login') {
|
|
91
|
+
goto('/login');
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!hasFetchedBots) {
|
|
97
|
+
hasFetchedBots = true;
|
|
98
|
+
fetchBots();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return () => {
|
|
103
|
+
hasFetchedBots = false;
|
|
104
|
+
unsubscribe();
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
</script>
|
|
108
|
+
|
|
109
|
+
<svelte:head>
|
|
110
|
+
<title>Agents - Crew Builder</title>
|
|
111
|
+
</svelte:head>
|
|
112
|
+
|
|
113
|
+
{#if $authStore.loading}
|
|
114
|
+
<div class="flex min-h-screen items-center justify-center">
|
|
115
|
+
<LoadingSpinner text="Loading your workspace..." />
|
|
116
|
+
</div>
|
|
117
|
+
{:else}
|
|
118
|
+
<div class="min-h-screen bg-[radial-gradient(circle_at_top,_rgba(79,70,229,0.08),_transparent)]">
|
|
119
|
+
<div class="flex min-h-screen">
|
|
120
|
+
<!-- Sidebar -->
|
|
121
|
+
<aside class="hidden w-64 flex-shrink-0 flex-col border-r border-base-200 bg-base-100/80 p-6 lg:flex">
|
|
122
|
+
<div class="mb-8 flex items-center gap-3">
|
|
123
|
+
<div class="flex h-10 w-10 items-center justify-center rounded-2xl bg-primary/10 text-lg font-semibold text-primary">
|
|
124
|
+
🦜
|
|
125
|
+
</div>
|
|
126
|
+
<div>
|
|
127
|
+
<p class="text-xs uppercase tracking-[0.2em] text-base-content/60">AI Parrot</p>
|
|
128
|
+
<h1 class="text-xl font-semibold">Agents</h1>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<nav class="space-y-2">
|
|
133
|
+
<p class="text-xs font-semibold uppercase tracking-wide text-base-content/60">Workspace</p>
|
|
134
|
+
<a class="btn btn-ghost btn-sm justify-start gap-3 text-base-content" href="/builder">
|
|
135
|
+
<span class="rounded-full bg-primary/10 px-2 py-1 text-xs font-semibold text-primary">New</span>
|
|
136
|
+
Create agent
|
|
137
|
+
</a>
|
|
138
|
+
<a class="btn btn-ghost btn-sm justify-start gap-3 text-base-content" href="/agents">Browse agents</a>
|
|
139
|
+
</nav>
|
|
140
|
+
|
|
141
|
+
<div class="mt-8 space-y-3">
|
|
142
|
+
<p class="text-xs font-semibold uppercase tracking-wide text-base-content/60">Categories</p>
|
|
143
|
+
{#each categories as category}
|
|
144
|
+
<button
|
|
145
|
+
class={`btn btn-ghost btn-sm w-full justify-between ${
|
|
146
|
+
selectedCategory === category ? 'bg-primary/10 text-primary' : 'text-base-content/80'
|
|
147
|
+
}`}
|
|
148
|
+
type="button"
|
|
149
|
+
onclick={() => selectCategory(category)}
|
|
150
|
+
>
|
|
151
|
+
<span>{category}</span>
|
|
152
|
+
{#if selectedCategory === category}
|
|
153
|
+
<span class="text-xs font-semibold">●</span>
|
|
154
|
+
{/if}
|
|
155
|
+
</button>
|
|
156
|
+
{/each}
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="mt-auto rounded-2xl bg-gradient-to-br from-primary to-indigo-600 p-5 text-primary-content">
|
|
160
|
+
<p class="text-sm font-semibold">Need help?</p>
|
|
161
|
+
<p class="text-sm opacity-80">Our team is one click away.</p>
|
|
162
|
+
<button class="btn btn-sm mt-4 border-none bg-white/20 text-white">Contact us</button>
|
|
163
|
+
</div>
|
|
164
|
+
</aside>
|
|
165
|
+
|
|
166
|
+
<!-- Main content -->
|
|
167
|
+
<main class="flex-1 p-6 lg:p-10">
|
|
168
|
+
<div class="mb-8 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
|
|
169
|
+
<div>
|
|
170
|
+
<p class="text-sm text-base-content/70">All assistants for specific tasks</p>
|
|
171
|
+
<h2 class="text-3xl font-bold">Agents</h2>
|
|
172
|
+
{#if environmentLabel}
|
|
173
|
+
<div class="badge badge-outline badge-sm mt-2 uppercase tracking-wide">
|
|
174
|
+
{environmentLabel}
|
|
175
|
+
</div>
|
|
176
|
+
{/if}
|
|
177
|
+
</div>
|
|
178
|
+
<div class="flex items-center gap-3">
|
|
179
|
+
<ThemeSwitcher showLabel={false} buttonClass="btn btn-sm btn-ghost" />
|
|
180
|
+
<button class="btn btn-outline btn-sm" type="button" onclick={handleLogout}>Logout</button>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<div class="mb-8 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
|
|
185
|
+
<div class="flex items-center gap-3 rounded-2xl border border-base-200 bg-base-100 px-4 py-3 shadow-sm">
|
|
186
|
+
<svg
|
|
187
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
188
|
+
class="h-5 w-5 text-base-content/60"
|
|
189
|
+
fill="none"
|
|
190
|
+
viewBox="0 0 24 24"
|
|
191
|
+
stroke="currentColor"
|
|
192
|
+
>
|
|
193
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
194
|
+
</svg>
|
|
195
|
+
<input
|
|
196
|
+
class="flex-1 bg-transparent text-sm outline-none"
|
|
197
|
+
placeholder="Search agents"
|
|
198
|
+
bind:value={searchTerm}
|
|
199
|
+
/>
|
|
200
|
+
</div>
|
|
201
|
+
<div class="flex gap-3">
|
|
202
|
+
<button class="btn btn-primary" type="button" onclick={() => goto('/builder')}>
|
|
203
|
+
Create AI agent
|
|
204
|
+
</button>
|
|
205
|
+
<div class="join">
|
|
206
|
+
{#each categories.slice(0, 3) as quickCategory}
|
|
207
|
+
<button
|
|
208
|
+
class={`btn btn-ghost btn-sm ${
|
|
209
|
+
selectedCategory === quickCategory ? 'btn-active text-primary' : 'text-base-content/70'
|
|
210
|
+
}`}
|
|
211
|
+
type="button"
|
|
212
|
+
onclick={() => selectCategory(quickCategory)}
|
|
213
|
+
>
|
|
214
|
+
{quickCategory}
|
|
215
|
+
</button>
|
|
216
|
+
{/each}
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
{#if loading}
|
|
222
|
+
<div class="grid grid-cols-1 gap-6 md:grid-cols-2 xl:grid-cols-3">
|
|
223
|
+
{#each Array(6) as _, index}
|
|
224
|
+
<div class="h-48 animate-pulse rounded-3xl bg-base-200/80" aria-hidden="true"></div>
|
|
225
|
+
{/each}
|
|
226
|
+
</div>
|
|
227
|
+
{:else if error}
|
|
228
|
+
<div class="rounded-3xl border border-error/30 bg-error/10 p-8 text-center text-error">
|
|
229
|
+
<p class="text-lg font-semibold">{error}</p>
|
|
230
|
+
<button class="btn btn-error mt-4" onclick={fetchBots}>Retry</button>
|
|
231
|
+
</div>
|
|
232
|
+
{:else if filteredBots.length === 0}
|
|
233
|
+
<div class="rounded-3xl border border-base-200 bg-base-100 p-10 text-center text-base-content/70">
|
|
234
|
+
<p class="text-lg font-semibold">No agents match your filters.</p>
|
|
235
|
+
<p class="mt-2">Try adjusting your search or categories.</p>
|
|
236
|
+
</div>
|
|
237
|
+
{:else}
|
|
238
|
+
<div class="grid grid-cols-1 gap-6 md:grid-cols-2 xl:grid-cols-3">
|
|
239
|
+
{#each filteredBots as bot (bot.chatbot_id)}
|
|
240
|
+
<BotCard {bot} />
|
|
241
|
+
{/each}
|
|
242
|
+
</div>
|
|
243
|
+
{/if}
|
|
244
|
+
</main>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
{/if}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { browser } from '$app/environment';
|
|
3
|
+
import { goto } from '$app/navigation';
|
|
4
|
+
import { onMount } from 'svelte';
|
|
5
|
+
import { authStore } from '$lib/stores/auth.svelte.ts';
|
|
6
|
+
import { botsApi, type BotSummary } from '$lib/api/bots';
|
|
7
|
+
import { chatApi, type ChatResponse } from '$lib/api/chat';
|
|
8
|
+
import { getTurn, saveTurn, loadConversation } from '$lib/utils/conversation';
|
|
9
|
+
import { ChatBubble, LoadingSpinner } from '../../../components';
|
|
10
|
+
|
|
11
|
+
const { data } = $props<{ data: { agentId: string } }>();
|
|
12
|
+
|
|
13
|
+
let agent: BotSummary | null = $state(null);
|
|
14
|
+
type ChatMessage = {
|
|
15
|
+
id: string;
|
|
16
|
+
role: 'user' | 'assistant';
|
|
17
|
+
content: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
turnId?: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let messages = $state<ChatMessage[]>([]);
|
|
23
|
+
let input = $state('');
|
|
24
|
+
let sending = $state(false);
|
|
25
|
+
let loading = $state(true);
|
|
26
|
+
let error = $state('');
|
|
27
|
+
let leftMenu = ['Chat', 'Content', 'Prompts', 'Playbooks'];
|
|
28
|
+
let selectedMenu = $state('Chat');
|
|
29
|
+
let selectedTurnId = $state<string | null>(null);
|
|
30
|
+
let selectedTurn = $state<ChatResponse | null>(null);
|
|
31
|
+
let storedTurnOrder = $state<string[]>([]);
|
|
32
|
+
|
|
33
|
+
const agentId = $derived(data.agentId);
|
|
34
|
+
|
|
35
|
+
async function loadAgent() {
|
|
36
|
+
if (!browser) return;
|
|
37
|
+
loading = true;
|
|
38
|
+
error = '';
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
agent = await botsApi.getBot(agentId);
|
|
42
|
+
} catch (err: any) {
|
|
43
|
+
console.error('Failed to load agent', err);
|
|
44
|
+
error = err?.response?.data?.message || 'Unable to load the agent right now.';
|
|
45
|
+
agent = null;
|
|
46
|
+
} finally {
|
|
47
|
+
loading = false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function loadStoredTurns() {
|
|
52
|
+
if (!browser) return;
|
|
53
|
+
const conversation = loadConversation(agentId);
|
|
54
|
+
storedTurnOrder = conversation.order;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function sendMessage() {
|
|
58
|
+
if (!input.trim() || sending) return;
|
|
59
|
+
|
|
60
|
+
const text = input.trim();
|
|
61
|
+
input = '';
|
|
62
|
+
|
|
63
|
+
const userMessage = {
|
|
64
|
+
id: crypto.randomUUID(),
|
|
65
|
+
role: 'user' as const,
|
|
66
|
+
content: text,
|
|
67
|
+
timestamp: new Date().toISOString()
|
|
68
|
+
};
|
|
69
|
+
messages = [...messages, userMessage];
|
|
70
|
+
sending = true;
|
|
71
|
+
error = '';
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
const response = await chatApi.sendChat(agentId, { query: text });
|
|
75
|
+
const reply = response?.response || response?.message || 'The agent did not return a response.';
|
|
76
|
+
|
|
77
|
+
const assistantMessage = {
|
|
78
|
+
id: crypto.randomUUID(),
|
|
79
|
+
role: 'assistant' as const,
|
|
80
|
+
content: reply,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
turnId: response?.turn_id
|
|
83
|
+
};
|
|
84
|
+
messages = [...messages, assistantMessage];
|
|
85
|
+
if (response?.turn_id) {
|
|
86
|
+
saveTurn(agentId, response);
|
|
87
|
+
loadStoredTurns();
|
|
88
|
+
selectedTurnId = response.turn_id;
|
|
89
|
+
selectedTurn = response;
|
|
90
|
+
}
|
|
91
|
+
} catch (err: any) {
|
|
92
|
+
console.error('Chat failed', err);
|
|
93
|
+
error = err?.response?.data?.message || err?.message || 'Chat failed. Please try again.';
|
|
94
|
+
messages = messages.filter((message) => message.id !== userMessage.id);
|
|
95
|
+
} finally {
|
|
96
|
+
sending = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
101
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
sendMessage();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
onMount(() => {
|
|
108
|
+
if (!browser) return;
|
|
109
|
+
if (!$authStore.isAuthenticated && !$authStore.loading) {
|
|
110
|
+
goto('/login');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
loadAgent();
|
|
114
|
+
loadStoredTurns();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
function selectTurn(turnId: string | null | undefined) {
|
|
118
|
+
if (!turnId) return;
|
|
119
|
+
selectedTurnId = turnId;
|
|
120
|
+
selectedTurn = getTurn(agentId, turnId);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function handleBubbleSelect(event: CustomEvent<{ turnId: string }>) {
|
|
124
|
+
selectTurn(event.detail.turnId);
|
|
125
|
+
}
|
|
126
|
+
</script>
|
|
127
|
+
|
|
128
|
+
<svelte:head>
|
|
129
|
+
<title>Chat - {agent?.name || 'Agent'}</title>
|
|
130
|
+
</svelte:head>
|
|
131
|
+
|
|
132
|
+
{#if loading}
|
|
133
|
+
<div class="flex min-h-screen items-center justify-center">
|
|
134
|
+
<LoadingSpinner text="Loading agent..." />
|
|
135
|
+
</div>
|
|
136
|
+
{:else if !agent}
|
|
137
|
+
<div class="flex min-h-screen flex-col items-center justify-center gap-4">
|
|
138
|
+
<p class="text-lg font-semibold text-base-content/80">{error || 'Agent not found.'}</p>
|
|
139
|
+
<button class="btn btn-primary" onclick={() => goto('/agents')}>Back to agents</button>
|
|
140
|
+
</div>
|
|
141
|
+
{:else}
|
|
142
|
+
<div class="min-h-screen bg-base-200/40">
|
|
143
|
+
<div class="mx-auto flex min-h-screen max-w-[1400px] gap-6 p-4 lg:p-8">
|
|
144
|
+
<!-- Left rail -->
|
|
145
|
+
<aside class="hidden w-56 flex-col rounded-3xl bg-base-100 p-6 shadow-xl lg:flex">
|
|
146
|
+
<div class="mb-6">
|
|
147
|
+
<p class="text-sm font-semibold text-base-content/60">{agent.category || 'Agent'}</p>
|
|
148
|
+
<h2 class="text-2xl font-bold">{agent.name}</h2>
|
|
149
|
+
<p class="text-sm text-base-content/70">{agent.description}</p>
|
|
150
|
+
</div>
|
|
151
|
+
<nav class="space-y-2">
|
|
152
|
+
{#each leftMenu as item}
|
|
153
|
+
<button
|
|
154
|
+
class={`btn btn-ghost w-full justify-start ${
|
|
155
|
+
selectedMenu === item ? 'bg-primary/10 text-primary' : 'text-base-content/80'
|
|
156
|
+
}`}
|
|
157
|
+
type="button"
|
|
158
|
+
onclick={() => (selectedMenu = item)}
|
|
159
|
+
>
|
|
160
|
+
{item}
|
|
161
|
+
</button>
|
|
162
|
+
{/each}
|
|
163
|
+
</nav>
|
|
164
|
+
<div class="mt-auto rounded-2xl bg-gradient-to-br from-primary to-indigo-600 p-4 text-sm text-primary-content">
|
|
165
|
+
<p class="font-semibold">Coming soon</p>
|
|
166
|
+
<p class="opacity-80">Quick access to prompts, automations, and knowledge.</p>
|
|
167
|
+
</div>
|
|
168
|
+
</aside>
|
|
169
|
+
|
|
170
|
+
<!-- Chat area -->
|
|
171
|
+
<section class="flex flex-1 flex-col gap-4">
|
|
172
|
+
<div class="rounded-3xl border border-base-200 bg-base-100 p-4 shadow-sm">
|
|
173
|
+
<div class="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
|
|
174
|
+
<div>
|
|
175
|
+
<p class="text-sm text-base-content/60">Chat with</p>
|
|
176
|
+
<h1 class="text-2xl font-bold">{agent.name}</h1>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="flex items-center gap-2 text-sm text-success">
|
|
179
|
+
<span class="h-2 w-2 rounded-full bg-success"></span>
|
|
180
|
+
Available
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
|
|
185
|
+
<div class="flex flex-1 flex-col gap-4 rounded-3xl border border-base-200 bg-base-100 p-6 shadow-lg">
|
|
186
|
+
<div class="flex-1 space-y-4 overflow-y-auto pr-2">
|
|
187
|
+
{#if messages.length === 0}
|
|
188
|
+
<div class="rounded-2xl bg-base-200/60 p-6 text-center text-base-content/70">
|
|
189
|
+
Say hello to start the conversation.
|
|
190
|
+
</div>
|
|
191
|
+
{:else}
|
|
192
|
+
{#each messages as message (message.id)}
|
|
193
|
+
<ChatBubble
|
|
194
|
+
role={message.role}
|
|
195
|
+
content={message.content}
|
|
196
|
+
timestamp={message.timestamp}
|
|
197
|
+
turnId={message.turnId}
|
|
198
|
+
selectable={message.role === 'assistant'}
|
|
199
|
+
selected={message.turnId ? message.turnId === selectedTurnId : false}
|
|
200
|
+
on:select={handleBubbleSelect}
|
|
201
|
+
/>
|
|
202
|
+
{/each}
|
|
203
|
+
{/if}
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
{#if error}
|
|
207
|
+
<div class="rounded-2xl border border-error/40 bg-error/10 p-3 text-sm text-error">
|
|
208
|
+
{error}
|
|
209
|
+
</div>
|
|
210
|
+
{/if}
|
|
211
|
+
|
|
212
|
+
<div class="rounded-2xl border border-base-200 bg-base-100/80 p-4">
|
|
213
|
+
<div class="rounded-2xl border border-base-300 bg-base-200/50">
|
|
214
|
+
<textarea
|
|
215
|
+
class="textarea textarea-ghost h-32 w-full resize-none border-none bg-transparent text-base focus:outline-none"
|
|
216
|
+
placeholder={`Message ${agent.name}`}
|
|
217
|
+
bind:value={input}
|
|
218
|
+
onkeydown={handleKeydown}
|
|
219
|
+
></textarea>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="mt-3 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
|
222
|
+
<div class="flex gap-2 text-sm text-base-content/70">
|
|
223
|
+
<button class="btn btn-ghost btn-sm" type="button" disabled>
|
|
224
|
+
<span>✨</span>
|
|
225
|
+
Templates
|
|
226
|
+
</button>
|
|
227
|
+
<button class="btn btn-ghost btn-sm" type="button" disabled>
|
|
228
|
+
<span>📎</span>
|
|
229
|
+
Attach
|
|
230
|
+
</button>
|
|
231
|
+
</div>
|
|
232
|
+
<button class={`btn btn-primary ${sending ? 'loading' : ''}`} onclick={sendMessage} disabled={sending}>
|
|
233
|
+
{sending ? 'Sending' : 'Send message'}
|
|
234
|
+
</button>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</section>
|
|
239
|
+
|
|
240
|
+
<!-- Insights rail -->
|
|
241
|
+
<aside class="hidden w-72 flex-col gap-4 lg:flex">
|
|
242
|
+
<div class="rounded-3xl border border-base-200 bg-base-100 p-5">
|
|
243
|
+
<h3 class="text-lg font-semibold">Recent Turns</h3>
|
|
244
|
+
<div class="mt-4 space-y-2">
|
|
245
|
+
{#if storedTurnOrder.length === 0}
|
|
246
|
+
<p class="text-sm text-base-content/60">Send a message to start tracking turns.</p>
|
|
247
|
+
{:else}
|
|
248
|
+
{#each storedTurnOrder.slice().reverse() as turnId}
|
|
249
|
+
<button
|
|
250
|
+
class={`btn btn-ghost btn-sm w-full justify-between ${
|
|
251
|
+
selectedTurnId === turnId ? 'bg-primary/10 text-primary' : 'text-base-content/80'
|
|
252
|
+
}`}
|
|
253
|
+
type="button"
|
|
254
|
+
onclick={() => selectTurn(turnId)}
|
|
255
|
+
>
|
|
256
|
+
<span class="truncate">Turn {turnId.slice(0, 6)}</span>
|
|
257
|
+
<span>→</span>
|
|
258
|
+
</button>
|
|
259
|
+
{/each}
|
|
260
|
+
{/if}
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<div class="rounded-3xl border border-base-200 bg-base-100 p-5">
|
|
265
|
+
<h3 class="text-lg font-semibold">Turn details</h3>
|
|
266
|
+
{#if !selectedTurn}
|
|
267
|
+
<p class="mt-2 text-sm text-base-content/60">Select a turn to inspect inputs and outputs.</p>
|
|
268
|
+
{:else}
|
|
269
|
+
<div class="mt-4 space-y-3 text-sm">
|
|
270
|
+
<div>
|
|
271
|
+
<p class="font-semibold text-base-content/70">Prompt</p>
|
|
272
|
+
<p class="text-base-content">{selectedTurn.input}</p>
|
|
273
|
+
</div>
|
|
274
|
+
<div>
|
|
275
|
+
<p class="font-semibold text-base-content/70">Response</p>
|
|
276
|
+
<p class="text-base-content">{selectedTurn.output || selectedTurn.response}</p>
|
|
277
|
+
</div>
|
|
278
|
+
<div>
|
|
279
|
+
<p class="font-semibold text-base-content/70">Turn ID</p>
|
|
280
|
+
<p class="font-mono text-xs text-base-content/80">{selectedTurn.turn_id}</p>
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
{/if}
|
|
284
|
+
</div>
|
|
285
|
+
</aside>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
{/if}
|