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,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}
|