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
parrot/tools/file/tmp.py
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import tempfile
|
|
3
|
+
import shutil
|
|
4
|
+
import mimetypes
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import BinaryIO, Optional, List, Union
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from io import BytesIO, StringIO
|
|
9
|
+
import fnmatch
|
|
10
|
+
import asyncio
|
|
11
|
+
import atexit
|
|
12
|
+
from .abstract import FileManagerInterface, FileMetadata
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TempFileManager(FileManagerInterface):
|
|
16
|
+
"""File manager for temporary file storage"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
prefix: str = "ai_parrot_",
|
|
21
|
+
cleanup_on_exit: bool = True,
|
|
22
|
+
cleanup_on_delete: bool = True
|
|
23
|
+
):
|
|
24
|
+
"""
|
|
25
|
+
Initialize temporary file manager.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
prefix: Prefix for temp directory name
|
|
29
|
+
cleanup_on_exit: Auto-cleanup temp directory on program exit
|
|
30
|
+
cleanup_on_delete: Auto-cleanup when instance is deleted
|
|
31
|
+
"""
|
|
32
|
+
self.temp_dir = tempfile.TemporaryDirectory(prefix=prefix)
|
|
33
|
+
self.base_path = Path(self.temp_dir.name)
|
|
34
|
+
self.cleanup_on_exit = cleanup_on_exit
|
|
35
|
+
self.cleanup_on_delete = cleanup_on_delete
|
|
36
|
+
|
|
37
|
+
if cleanup_on_exit:
|
|
38
|
+
atexit.register(self.cleanup)
|
|
39
|
+
|
|
40
|
+
def __del__(self):
|
|
41
|
+
"""Cleanup on deletion if configured"""
|
|
42
|
+
if self.cleanup_on_delete:
|
|
43
|
+
self.cleanup()
|
|
44
|
+
|
|
45
|
+
def cleanup(self):
|
|
46
|
+
"""Manually cleanup temporary directory"""
|
|
47
|
+
with contextlib.suppress(AttributeError, FileNotFoundError):
|
|
48
|
+
if hasattr(self, 'temp_dir'):
|
|
49
|
+
self.temp_dir.cleanup()
|
|
50
|
+
|
|
51
|
+
async def __aenter__(self):
|
|
52
|
+
"""Context manager entry"""
|
|
53
|
+
return self
|
|
54
|
+
|
|
55
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
56
|
+
"""Context manager exit with cleanup"""
|
|
57
|
+
self.cleanup()
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
def _resolve_path(self, path: str) -> Path:
|
|
61
|
+
"""Resolve path within temp directory"""
|
|
62
|
+
target = Path(path)
|
|
63
|
+
|
|
64
|
+
if not target.is_absolute():
|
|
65
|
+
target = self.base_path / target
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
resolved = target.resolve(strict=False)
|
|
69
|
+
except (OSError, RuntimeError) as e:
|
|
70
|
+
raise ValueError(f"Cannot resolve path: {path}") from e
|
|
71
|
+
|
|
72
|
+
# Ensure path is within temp directory
|
|
73
|
+
try:
|
|
74
|
+
resolved.relative_to(self.base_path.resolve())
|
|
75
|
+
except ValueError as e:
|
|
76
|
+
raise ValueError(
|
|
77
|
+
f"Path '{path}' escapes temp directory '{self.base_path}'"
|
|
78
|
+
) from e
|
|
79
|
+
|
|
80
|
+
return resolved
|
|
81
|
+
|
|
82
|
+
def _get_file_metadata(self, path: Path) -> FileMetadata:
|
|
83
|
+
"""Extract metadata from a file path"""
|
|
84
|
+
stat = path.stat()
|
|
85
|
+
content_type, _ = mimetypes.guess_type(str(path))
|
|
86
|
+
|
|
87
|
+
return FileMetadata(
|
|
88
|
+
name=path.name,
|
|
89
|
+
path=str(path.relative_to(self.base_path)),
|
|
90
|
+
size=stat.st_size,
|
|
91
|
+
content_type=content_type,
|
|
92
|
+
modified_at=datetime.fromtimestamp(stat.st_mtime),
|
|
93
|
+
url=path.as_uri()
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
async def list_files(
|
|
97
|
+
self,
|
|
98
|
+
path: str = "",
|
|
99
|
+
pattern: str = "*"
|
|
100
|
+
) -> List[FileMetadata]:
|
|
101
|
+
"""List files matching pattern in temp directory"""
|
|
102
|
+
target_dir = self._resolve_path(path) if path else self.base_path
|
|
103
|
+
|
|
104
|
+
if not target_dir.exists():
|
|
105
|
+
raise FileNotFoundError(f"Directory not found: {path}")
|
|
106
|
+
|
|
107
|
+
if not target_dir.is_dir():
|
|
108
|
+
raise ValueError(f"Path is not a directory: {path}")
|
|
109
|
+
|
|
110
|
+
def _list():
|
|
111
|
+
files = []
|
|
112
|
+
for item in target_dir.iterdir():
|
|
113
|
+
if fnmatch.fnmatch(item.name, pattern) and item.is_file():
|
|
114
|
+
files.append(self._get_file_metadata(item))
|
|
115
|
+
|
|
116
|
+
return sorted(files, key=lambda x: x.name)
|
|
117
|
+
|
|
118
|
+
return await asyncio.to_thread(_list)
|
|
119
|
+
|
|
120
|
+
async def get_file_url(self, path: str, expiry: int = 3600) -> str:
|
|
121
|
+
"""Get file:// URL for temp file"""
|
|
122
|
+
target = self._resolve_path(path)
|
|
123
|
+
|
|
124
|
+
if not target.exists():
|
|
125
|
+
raise FileNotFoundError(f"File not found: {path}")
|
|
126
|
+
|
|
127
|
+
return target.as_uri()
|
|
128
|
+
|
|
129
|
+
async def upload_file(
|
|
130
|
+
self,
|
|
131
|
+
source: BinaryIO | Path,
|
|
132
|
+
destination: str
|
|
133
|
+
) -> FileMetadata:
|
|
134
|
+
"""Upload/copy a file to temp storage"""
|
|
135
|
+
dest_path = self._resolve_path(destination)
|
|
136
|
+
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
137
|
+
|
|
138
|
+
def _upload():
|
|
139
|
+
if isinstance(source, Path):
|
|
140
|
+
shutil.copy2(str(source), str(dest_path))
|
|
141
|
+
else:
|
|
142
|
+
with open(dest_path, 'wb') as f:
|
|
143
|
+
shutil.copyfileobj(source, f)
|
|
144
|
+
|
|
145
|
+
return self._get_file_metadata(dest_path)
|
|
146
|
+
|
|
147
|
+
return await asyncio.to_thread(_upload)
|
|
148
|
+
|
|
149
|
+
async def download_file(
|
|
150
|
+
self,
|
|
151
|
+
source: str,
|
|
152
|
+
destination: Path | BinaryIO
|
|
153
|
+
) -> Path:
|
|
154
|
+
"""
|
|
155
|
+
Download/move file from temp to permanent storage.
|
|
156
|
+
This MOVES the file out of temp storage.
|
|
157
|
+
"""
|
|
158
|
+
source_path = self._resolve_path(source)
|
|
159
|
+
|
|
160
|
+
if not source_path.exists():
|
|
161
|
+
raise FileNotFoundError(f"Source file not found: {source}")
|
|
162
|
+
|
|
163
|
+
if not source_path.is_file():
|
|
164
|
+
raise ValueError(f"Source is not a file: {source}")
|
|
165
|
+
|
|
166
|
+
def _download():
|
|
167
|
+
if isinstance(destination, Path):
|
|
168
|
+
destination.parent.mkdir(parents=True, exist_ok=True)
|
|
169
|
+
# Move instead of copy (temp files are ephemeral)
|
|
170
|
+
shutil.move(str(source_path), str(destination))
|
|
171
|
+
return destination
|
|
172
|
+
else:
|
|
173
|
+
# For file objects, we have to copy then delete
|
|
174
|
+
with open(source_path, 'rb') as src:
|
|
175
|
+
shutil.copyfileobj(src, destination)
|
|
176
|
+
source_path.unlink()
|
|
177
|
+
return source_path
|
|
178
|
+
|
|
179
|
+
return await asyncio.to_thread(_download)
|
|
180
|
+
|
|
181
|
+
async def copy_file(self, source: str, destination: str) -> FileMetadata:
|
|
182
|
+
"""
|
|
183
|
+
Copy/move file from temp to permanent storage or within temp.
|
|
184
|
+
|
|
185
|
+
If destination is outside temp directory, this MOVES the file.
|
|
186
|
+
If destination is inside temp directory, this COPIES the file.
|
|
187
|
+
"""
|
|
188
|
+
source_path = self._resolve_path(source)
|
|
189
|
+
|
|
190
|
+
if not source_path.exists():
|
|
191
|
+
raise FileNotFoundError(f"Source file not found: {source}")
|
|
192
|
+
|
|
193
|
+
if not source_path.is_file():
|
|
194
|
+
raise ValueError(f"Source is not a file: {source}")
|
|
195
|
+
|
|
196
|
+
# Check if destination is outside temp directory
|
|
197
|
+
dest_path = Path(destination)
|
|
198
|
+
if not dest_path.is_absolute():
|
|
199
|
+
# Relative path means within temp
|
|
200
|
+
dest_path = self._resolve_path(destination)
|
|
201
|
+
is_external = False
|
|
202
|
+
else:
|
|
203
|
+
# Absolute path - check if it's outside temp
|
|
204
|
+
try:
|
|
205
|
+
dest_path.relative_to(self.base_path.resolve())
|
|
206
|
+
is_external = False
|
|
207
|
+
except ValueError:
|
|
208
|
+
is_external = True
|
|
209
|
+
|
|
210
|
+
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
211
|
+
|
|
212
|
+
def _copy():
|
|
213
|
+
if is_external:
|
|
214
|
+
# Moving to permanent storage
|
|
215
|
+
shutil.move(str(source_path), str(dest_path))
|
|
216
|
+
else:
|
|
217
|
+
# Copying within temp
|
|
218
|
+
shutil.copy2(str(source_path), str(dest_path))
|
|
219
|
+
|
|
220
|
+
return FileMetadata(
|
|
221
|
+
name=dest_path.name,
|
|
222
|
+
path=str(dest_path),
|
|
223
|
+
size=dest_path.stat().st_size,
|
|
224
|
+
content_type=mimetypes.guess_type(str(dest_path))[0],
|
|
225
|
+
modified_at=datetime.fromtimestamp(dest_path.stat().st_mtime),
|
|
226
|
+
url=dest_path.as_uri()
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return await asyncio.to_thread(_copy)
|
|
230
|
+
|
|
231
|
+
async def delete_file(self, path: str) -> bool:
|
|
232
|
+
"""Delete a temp file"""
|
|
233
|
+
target = self._resolve_path(path)
|
|
234
|
+
|
|
235
|
+
if not target.exists():
|
|
236
|
+
return False
|
|
237
|
+
|
|
238
|
+
if not target.is_file():
|
|
239
|
+
raise ValueError(f"Path is not a file: {path}")
|
|
240
|
+
|
|
241
|
+
def _delete():
|
|
242
|
+
target.unlink()
|
|
243
|
+
return True
|
|
244
|
+
|
|
245
|
+
return await asyncio.to_thread(_delete)
|
|
246
|
+
|
|
247
|
+
async def exists(self, path: str) -> bool:
|
|
248
|
+
"""Check if temp file exists"""
|
|
249
|
+
try:
|
|
250
|
+
target = self._resolve_path(path)
|
|
251
|
+
return await asyncio.to_thread(lambda: target.is_file())
|
|
252
|
+
except (ValueError, OSError):
|
|
253
|
+
return False
|
|
254
|
+
|
|
255
|
+
async def get_file_metadata(self, path: str) -> FileMetadata:
|
|
256
|
+
"""Get metadata of a temp file"""
|
|
257
|
+
target = self._resolve_path(path)
|
|
258
|
+
|
|
259
|
+
if not target.exists():
|
|
260
|
+
raise FileNotFoundError(f"File not found: {path}")
|
|
261
|
+
|
|
262
|
+
if not target.is_file():
|
|
263
|
+
raise ValueError(f"Path is not a file: {path}")
|
|
264
|
+
|
|
265
|
+
return await asyncio.to_thread(lambda: self._get_file_metadata(target))
|
|
266
|
+
|
|
267
|
+
async def create_file(self, path: str, content: bytes) -> bool:
|
|
268
|
+
"""Create a temp file with content"""
|
|
269
|
+
target = self._resolve_path(path)
|
|
270
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
271
|
+
|
|
272
|
+
def _create():
|
|
273
|
+
with open(target, 'wb') as f:
|
|
274
|
+
f.write(content)
|
|
275
|
+
return True
|
|
276
|
+
|
|
277
|
+
return await asyncio.to_thread(_create)
|
|
278
|
+
|
|
279
|
+
async def create_from_bytes(
|
|
280
|
+
self,
|
|
281
|
+
path: str,
|
|
282
|
+
source: Union[bytes, BytesIO, StringIO],
|
|
283
|
+
encoding: str = 'utf-8'
|
|
284
|
+
) -> FileMetadata:
|
|
285
|
+
"""Create a temp file from bytes, BytesIO, or StringIO object"""
|
|
286
|
+
target = self._resolve_path(path)
|
|
287
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
288
|
+
|
|
289
|
+
def _create():
|
|
290
|
+
if isinstance(source, bytes):
|
|
291
|
+
with open(target, 'wb') as f:
|
|
292
|
+
f.write(source)
|
|
293
|
+
elif isinstance(source, BytesIO):
|
|
294
|
+
source.seek(0)
|
|
295
|
+
with open(target, 'wb') as f:
|
|
296
|
+
f.write(source.read())
|
|
297
|
+
elif isinstance(source, StringIO):
|
|
298
|
+
source.seek(0)
|
|
299
|
+
content = source.read()
|
|
300
|
+
with open(target, 'w', encoding=encoding) as f:
|
|
301
|
+
f.write(content)
|
|
302
|
+
else:
|
|
303
|
+
raise TypeError(
|
|
304
|
+
f"source must be bytes, BytesIO, or StringIO, got {type(source)}"
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
return self._get_file_metadata(target)
|
|
308
|
+
|
|
309
|
+
return await asyncio.to_thread(_create)
|