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,395 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import signal
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import json
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Dict, Any, Optional, Callable
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from parrot.mcp.config import MCPServerConfig
|
|
11
|
+
from parrot.mcp.transports.base import MCPServerBase
|
|
12
|
+
from parrot.mcp.client import MCPClientConfig, MCPConnectionError
|
|
13
|
+
|
|
14
|
+
class UnixMCPServer(MCPServerBase):
|
|
15
|
+
"""MCP server using Unix socket transport."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, config: MCPServerConfig):
|
|
18
|
+
super().__init__(config)
|
|
19
|
+
self.socket_path = config.socket_path
|
|
20
|
+
if not self.socket_path:
|
|
21
|
+
# Fallback to PID-based naming
|
|
22
|
+
toolkit_name = config.name.replace(" ", "-").lower()
|
|
23
|
+
self.socket_path = f"/tmp/parrot-mcp-{toolkit_name}-{os.getpid()}.sock"
|
|
24
|
+
|
|
25
|
+
self.server = None
|
|
26
|
+
self._shutdown_handlers: list[Callable] = []
|
|
27
|
+
self._serve_task: Optional[asyncio.Task] = None
|
|
28
|
+
self._setup_signal_handlers()
|
|
29
|
+
|
|
30
|
+
def _setup_signal_handlers(self):
|
|
31
|
+
"""Setup graceful shutdown on SIGTERM/SIGINT."""
|
|
32
|
+
def signal_handler(signum, frame):
|
|
33
|
+
self.logger.info(f"Received signal {signum}, initiating shutdown...")
|
|
34
|
+
asyncio.create_task(self.stop())
|
|
35
|
+
|
|
36
|
+
signal.signal(signal.SIGTERM, signal_handler)
|
|
37
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
38
|
+
|
|
39
|
+
def add_shutdown_handler(self, handler: Callable):
|
|
40
|
+
"""Register user-defined shutdown handler."""
|
|
41
|
+
self._shutdown_handlers.append(handler)
|
|
42
|
+
|
|
43
|
+
async def start(self):
|
|
44
|
+
"""Start Unix socket server."""
|
|
45
|
+
# Cleanup old socket if exists
|
|
46
|
+
if os.path.exists(self.socket_path):
|
|
47
|
+
self.logger.warning(f"Removing existing socket: {self.socket_path}")
|
|
48
|
+
os.unlink(self.socket_path)
|
|
49
|
+
|
|
50
|
+
# Ensure parent directory exists
|
|
51
|
+
socket_dir = Path(self.socket_path).parent
|
|
52
|
+
socket_dir.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
|
|
54
|
+
self.logger.info(f"Starting Unix socket MCP server at {self.socket_path}")
|
|
55
|
+
|
|
56
|
+
# Use asyncio.start_unix_server (menos conflicto con aiohttp)
|
|
57
|
+
self.server = await asyncio.start_unix_server(
|
|
58
|
+
self._handle_connection,
|
|
59
|
+
path=self.socket_path
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Set socket permissions (readable/writable by owner and group)
|
|
63
|
+
os.chmod(self.socket_path, 0o660)
|
|
64
|
+
|
|
65
|
+
self.logger.info(f"Unix MCP server listening on {self.socket_path}")
|
|
66
|
+
self.logger.info(f"Registered {len(self.tools)} tools")
|
|
67
|
+
|
|
68
|
+
# Keep server running until stop() cancels the task
|
|
69
|
+
self._serve_task = asyncio.create_task(self.server.serve_forever())
|
|
70
|
+
try:
|
|
71
|
+
await self._serve_task
|
|
72
|
+
except asyncio.CancelledError:
|
|
73
|
+
self.logger.debug("Unix MCP server serve loop cancelled")
|
|
74
|
+
|
|
75
|
+
async def _handle_connection(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
|
|
76
|
+
"""Handle a client connection."""
|
|
77
|
+
addr = writer.get_extra_info('peername', 'unknown')
|
|
78
|
+
self.logger.info(f"New connection from {addr}")
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
while True:
|
|
82
|
+
# Read JSON-RPC message (newline-delimited)
|
|
83
|
+
line = await reader.readline()
|
|
84
|
+
if not line:
|
|
85
|
+
break
|
|
86
|
+
|
|
87
|
+
line = line.decode('utf-8').strip()
|
|
88
|
+
if not line:
|
|
89
|
+
continue
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
request = json.loads(line)
|
|
93
|
+
response = await self._handle_request(request)
|
|
94
|
+
|
|
95
|
+
if response:
|
|
96
|
+
response_line = json.dumps(response) + "\n"
|
|
97
|
+
writer.write(response_line.encode('utf-8'))
|
|
98
|
+
await writer.drain()
|
|
99
|
+
|
|
100
|
+
except json.JSONDecodeError as e:
|
|
101
|
+
self.logger.warning(f"Invalid JSON: {e}")
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
except asyncio.CancelledError:
|
|
105
|
+
self.logger.info("Connection cancelled")
|
|
106
|
+
except Exception as e:
|
|
107
|
+
self.logger.error(f"Connection error: {e}")
|
|
108
|
+
finally:
|
|
109
|
+
writer.close()
|
|
110
|
+
await writer.wait_closed()
|
|
111
|
+
self.logger.info(f"Connection closed: {addr}")
|
|
112
|
+
|
|
113
|
+
async def _handle_request(self, request: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
114
|
+
"""Handle JSON-RPC request (same as stdio)."""
|
|
115
|
+
method = request.get("method")
|
|
116
|
+
params = request.get("params", {})
|
|
117
|
+
request_id = request.get("id")
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
if method == "initialize":
|
|
121
|
+
result = await self.handle_initialize(params)
|
|
122
|
+
elif method == "tools/list":
|
|
123
|
+
result = await self.handle_tools_list(params)
|
|
124
|
+
elif method == "tools/call":
|
|
125
|
+
result = await self.handle_tools_call(params)
|
|
126
|
+
elif method == "notifications/initialized":
|
|
127
|
+
self.logger.info("Client initialization complete")
|
|
128
|
+
return None
|
|
129
|
+
else:
|
|
130
|
+
raise RuntimeError(f"Unknown method: {method}")
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
"jsonrpc": "2.0",
|
|
134
|
+
"id": request_id,
|
|
135
|
+
"result": result
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
except Exception as e:
|
|
139
|
+
self.logger.error(f"Error handling {method}: {e}")
|
|
140
|
+
return {
|
|
141
|
+
"jsonrpc": "2.0",
|
|
142
|
+
"id": request_id,
|
|
143
|
+
"error": {
|
|
144
|
+
"code": -32603,
|
|
145
|
+
"message": str(e)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async def stop(self):
|
|
150
|
+
"""Stop the server and cleanup."""
|
|
151
|
+
self.logger.info("Shutting down Unix MCP server...")
|
|
152
|
+
|
|
153
|
+
# Call user shutdown handlers
|
|
154
|
+
for handler in self._shutdown_handlers:
|
|
155
|
+
try:
|
|
156
|
+
result = handler()
|
|
157
|
+
if asyncio.iscoroutine(result):
|
|
158
|
+
await result
|
|
159
|
+
except Exception as e:
|
|
160
|
+
self.logger.error(f"Error in shutdown handler: {e}")
|
|
161
|
+
|
|
162
|
+
# Cancel serve loop first
|
|
163
|
+
if self._serve_task and not self._serve_task.done():
|
|
164
|
+
self._serve_task.cancel()
|
|
165
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
166
|
+
await self._serve_task
|
|
167
|
+
|
|
168
|
+
# Close server
|
|
169
|
+
if self.server:
|
|
170
|
+
self.server.close()
|
|
171
|
+
await self.server.wait_closed()
|
|
172
|
+
self.server = None
|
|
173
|
+
|
|
174
|
+
# Remove socket file
|
|
175
|
+
if os.path.exists(self.socket_path):
|
|
176
|
+
self.logger.info(f"Removing socket: {self.socket_path}")
|
|
177
|
+
os.unlink(self.socket_path)
|
|
178
|
+
|
|
179
|
+
self.logger.info("Shutdown complete")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class UnixMCPSession:
|
|
183
|
+
"""MCP session for Unix socket transport."""
|
|
184
|
+
|
|
185
|
+
def __init__(self, config: MCPClientConfig, logger):
|
|
186
|
+
self.config = config
|
|
187
|
+
self.logger = logger
|
|
188
|
+
self._request_id = 0
|
|
189
|
+
self._reader: Optional[asyncio.StreamReader] = None
|
|
190
|
+
self._writer: Optional[asyncio.StreamWriter] = None
|
|
191
|
+
self._initialized = False
|
|
192
|
+
self._response_futures: Dict[int, asyncio.Future] = {}
|
|
193
|
+
self._read_task: Optional[asyncio.Task] = None
|
|
194
|
+
|
|
195
|
+
async def connect(self):
|
|
196
|
+
"""Connect to MCP server via Unix socket."""
|
|
197
|
+
try:
|
|
198
|
+
self.logger.info(f"Connecting to Unix socket: {self.config.socket_path}")
|
|
199
|
+
|
|
200
|
+
if not self.config.socket_path:
|
|
201
|
+
raise ValueError("socket_path is required for unix transport")
|
|
202
|
+
|
|
203
|
+
if not os.path.exists(self.config.socket_path):
|
|
204
|
+
raise MCPConnectionError(
|
|
205
|
+
f"Unix socket does not exist: {self.config.socket_path}"
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Connect to Unix socket
|
|
209
|
+
self._reader, self._writer = await asyncio.open_unix_connection(
|
|
210
|
+
path=self.config.socket_path
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Start background task to read responses
|
|
214
|
+
self._read_task = asyncio.create_task(self._read_responses())
|
|
215
|
+
|
|
216
|
+
# Initialize MCP session
|
|
217
|
+
await self._initialize_session()
|
|
218
|
+
self._initialized = True
|
|
219
|
+
|
|
220
|
+
self.logger.info(f"Unix socket connection established to {self.config.name}")
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
await self.disconnect()
|
|
224
|
+
raise MCPConnectionError(f"Unix socket connection failed: {e}") from e
|
|
225
|
+
|
|
226
|
+
async def _read_responses(self):
|
|
227
|
+
"""Background task to read responses from server."""
|
|
228
|
+
try:
|
|
229
|
+
while True:
|
|
230
|
+
if not self._reader:
|
|
231
|
+
break
|
|
232
|
+
|
|
233
|
+
line = await self._reader.readline()
|
|
234
|
+
if not line:
|
|
235
|
+
self.logger.warning("Server closed connection")
|
|
236
|
+
break
|
|
237
|
+
|
|
238
|
+
try:
|
|
239
|
+
response = json.loads(line.decode('utf-8').strip())
|
|
240
|
+
request_id = response.get('id')
|
|
241
|
+
|
|
242
|
+
if request_id and request_id in self._response_futures:
|
|
243
|
+
future = self._response_futures.pop(request_id)
|
|
244
|
+
if 'error' in response:
|
|
245
|
+
future.set_exception(
|
|
246
|
+
MCPConnectionError(f"MCP Error: {response['error']}")
|
|
247
|
+
)
|
|
248
|
+
else:
|
|
249
|
+
future.set_result(response.get('result'))
|
|
250
|
+
else:
|
|
251
|
+
# Notification or unsolicited message
|
|
252
|
+
self.logger.debug(f"Received message without pending request: {response}")
|
|
253
|
+
|
|
254
|
+
except json.JSONDecodeError as e:
|
|
255
|
+
self.logger.warning(f"Invalid JSON from server: {e}")
|
|
256
|
+
except Exception as e:
|
|
257
|
+
self.logger.error(f"Error processing response: {e}")
|
|
258
|
+
|
|
259
|
+
except asyncio.CancelledError:
|
|
260
|
+
self.logger.debug("Read task cancelled")
|
|
261
|
+
except Exception as e:
|
|
262
|
+
self.logger.error(f"Error in read loop: {e}")
|
|
263
|
+
|
|
264
|
+
async def _initialize_session(self):
|
|
265
|
+
"""Initialize MCP session over Unix socket."""
|
|
266
|
+
try:
|
|
267
|
+
init_result = await self._send_request("initialize", {
|
|
268
|
+
"protocolVersion": "2024-11-05",
|
|
269
|
+
"capabilities": {"tools": {}},
|
|
270
|
+
"clientInfo": {"name": "ai-parrot-mcp-client", "version": "1.0.0"}
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
# Send initialized notification
|
|
274
|
+
await self._send_notification("notifications/initialized")
|
|
275
|
+
|
|
276
|
+
except Exception as e:
|
|
277
|
+
raise MCPConnectionError(f"Unix socket session initialization failed: {e}") from e
|
|
278
|
+
|
|
279
|
+
async def _send_request(self, method: str, params: dict = None) -> dict:
|
|
280
|
+
"""Send JSON-RPC request via Unix socket."""
|
|
281
|
+
if not self._writer:
|
|
282
|
+
raise MCPConnectionError("Not connected")
|
|
283
|
+
|
|
284
|
+
self._request_id += 1
|
|
285
|
+
request_id = self._request_id
|
|
286
|
+
|
|
287
|
+
request = {
|
|
288
|
+
"jsonrpc": "2.0",
|
|
289
|
+
"id": request_id,
|
|
290
|
+
"method": method,
|
|
291
|
+
}
|
|
292
|
+
if params is not None:
|
|
293
|
+
request["params"] = params
|
|
294
|
+
|
|
295
|
+
# Create future for response
|
|
296
|
+
future = asyncio.Future()
|
|
297
|
+
self._response_futures[request_id] = future
|
|
298
|
+
|
|
299
|
+
# Send request
|
|
300
|
+
request_line = json.dumps(request) + "\n"
|
|
301
|
+
self._writer.write(request_line.encode('utf-8'))
|
|
302
|
+
await self._writer.drain()
|
|
303
|
+
|
|
304
|
+
self.logger.debug(f"Sent request: {method} (id={request_id})")
|
|
305
|
+
|
|
306
|
+
# Wait for response with timeout
|
|
307
|
+
try:
|
|
308
|
+
return await asyncio.wait_for(
|
|
309
|
+
future,
|
|
310
|
+
timeout=self.config.timeout
|
|
311
|
+
)
|
|
312
|
+
except asyncio.TimeoutError:
|
|
313
|
+
self._response_futures.pop(request_id, None)
|
|
314
|
+
raise MCPConnectionError(f"Request timeout: {method}")
|
|
315
|
+
|
|
316
|
+
async def _send_notification(self, method: str, params: dict = None):
|
|
317
|
+
"""Send JSON-RPC notification (no response expected)."""
|
|
318
|
+
if not self._writer:
|
|
319
|
+
raise MCPConnectionError("Not connected")
|
|
320
|
+
|
|
321
|
+
notification = {
|
|
322
|
+
"jsonrpc": "2.0",
|
|
323
|
+
"method": method,
|
|
324
|
+
}
|
|
325
|
+
if params is not None:
|
|
326
|
+
notification["params"] = params
|
|
327
|
+
|
|
328
|
+
notification_line = json.dumps(notification) + "\n"
|
|
329
|
+
self._writer.write(notification_line.encode('utf-8'))
|
|
330
|
+
await self._writer.drain()
|
|
331
|
+
|
|
332
|
+
self.logger.debug(f"Sent notification: {method}")
|
|
333
|
+
|
|
334
|
+
async def list_tools(self):
|
|
335
|
+
"""List available tools."""
|
|
336
|
+
if not self._initialized:
|
|
337
|
+
raise MCPConnectionError("Session not initialized")
|
|
338
|
+
|
|
339
|
+
result = await self._send_request("tools/list")
|
|
340
|
+
tools = result.get("tools", [])
|
|
341
|
+
|
|
342
|
+
tool_objects = []
|
|
343
|
+
for tool_dict in tools:
|
|
344
|
+
tool_obj = type('MCPTool', (), tool_dict)()
|
|
345
|
+
tool_objects.append(tool_obj)
|
|
346
|
+
|
|
347
|
+
return tool_objects
|
|
348
|
+
|
|
349
|
+
async def call_tool(self, tool_name: str, arguments: dict):
|
|
350
|
+
"""Call a tool."""
|
|
351
|
+
if not self._initialized:
|
|
352
|
+
raise MCPConnectionError("Session not initialized")
|
|
353
|
+
|
|
354
|
+
result = await self._send_request("tools/call", {
|
|
355
|
+
"name": tool_name,
|
|
356
|
+
"arguments": arguments
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
content_items = []
|
|
360
|
+
if "content" in result:
|
|
361
|
+
for item in result["content"]:
|
|
362
|
+
content_obj = type('ContentItem', (), item)()
|
|
363
|
+
content_items.append(content_obj)
|
|
364
|
+
|
|
365
|
+
return type('ToolCallResult', (), {"content": content_items})()
|
|
366
|
+
|
|
367
|
+
async def disconnect(self):
|
|
368
|
+
"""Disconnect Unix socket session."""
|
|
369
|
+
self._initialized = False
|
|
370
|
+
|
|
371
|
+
# Cancel read task
|
|
372
|
+
if self._read_task and not self._read_task.done():
|
|
373
|
+
self._read_task.cancel()
|
|
374
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
375
|
+
await self._read_task
|
|
376
|
+
self._read_task = None
|
|
377
|
+
|
|
378
|
+
# Cancel pending requests
|
|
379
|
+
for future in self._response_futures.values():
|
|
380
|
+
if not future.done():
|
|
381
|
+
future.cancel()
|
|
382
|
+
self._response_futures.clear()
|
|
383
|
+
|
|
384
|
+
# Close connection
|
|
385
|
+
if self._writer:
|
|
386
|
+
try:
|
|
387
|
+
self._writer.close()
|
|
388
|
+
await self._writer.wait_closed()
|
|
389
|
+
except Exception as e:
|
|
390
|
+
self.logger.debug(f"Error closing writer: {e}")
|
|
391
|
+
finally:
|
|
392
|
+
self._writer = None
|
|
393
|
+
self._reader = None
|
|
394
|
+
|
|
395
|
+
self.logger.info("Unix socket disconnected")
|