@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, indice]
|
|
3
|
+
analisado-em: 2026-10-14
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Índice das extensions
|
|
7
|
+
|
|
8
|
+
Extensions Quarkus, libraries Java e crates Rust equivalentes. Commits analisados: [[SeedGrid/Mapa-dos-repositorios|Mapa dos repositórios]]. Todas as propriedades em uma tabela: [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]].
|
|
9
|
+
|
|
10
|
+
Contagens de propriedades por extension e plataforma: [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]]. Enums: [[SeedGrid/Extensions/Catalogo-de-enums|Catálogo de enums]].
|
|
11
|
+
|
|
12
|
+
## Auth, identidade e tenancy
|
|
13
|
+
|
|
14
|
+
| Extension | Para que serve | Java | Rust |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| security | JWT RS256, RBAC aditivo, token escopado por empresa, 2FA (TOTP/e-mail/WhatsApp), self-enter, gestão de usuários/roles/empresas. Base das demais. | [[SeedGrid/Extensions/security/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/security/Configuracao\|Config]] · [[SeedGrid/Extensions/security/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/security/Enums|Enums]] | [[SeedGrid/Extensions/security/Rust\|Rust]] · [[SeedGrid/Extensions/security/Configuracao-Rust\|Config]] |
|
|
17
|
+
| apikeys | API keys `sgkey_` com permissões derivadas da role (máquina-a-máquina). | [[SeedGrid/Extensions/apikeys/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/apikeys/Configuracao\|Config]] · [[SeedGrid/Extensions/apikeys/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/apikeys/Enums|Enums]] | [[SeedGrid/Extensions/apikeys/Rust\|Rust]] · [[SeedGrid/Extensions/apikeys/Configuracao-Rust\|Config]] |
|
|
18
|
+
| login-tenancy | Fundação single-database multi-empresa (POOLED): orquestra módulos, signup institucional, isolamento por company. | [[SeedGrid/Extensions/login-tenancy/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/login-tenancy/Configuracao\|Config]] · [[SeedGrid/Extensions/login-tenancy/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/login-tenancy/Enums|Enums]] | [[SeedGrid/Extensions/login-tenancy/Rust\|Rust]] · [[SeedGrid/Extensions/login-tenancy/Configuracao-Rust\|Config]] |
|
|
19
|
+
| subdomain-tenancy | Multitenancy por subdomínio com banco por tenant: resolução por host, provisionamento, migrations por tenant. | [[SeedGrid/Extensions/subdomain-tenancy/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/subdomain-tenancy/Configuracao\|Config]] · [[SeedGrid/Extensions/subdomain-tenancy/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/subdomain-tenancy/Enums|Enums]] | [[SeedGrid/Extensions/subdomain-tenancy/Rust\|Rust]] · [[SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust\|Config]] |
|
|
20
|
+
|
|
21
|
+
## Billing e preços
|
|
22
|
+
|
|
23
|
+
| Extension | Para que serve | Java | Rust |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| billing | Assinaturas: planos, uso, checkout, portal, webhooks; provider Stripe. | [[SeedGrid/Extensions/billing/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/billing/Configuracao\|Config]] · [[SeedGrid/Extensions/billing/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/billing/Enums|Enums]] | [[SeedGrid/Extensions/billing/Rust\|Rust]] · [[SeedGrid/Extensions/billing/Configuracao-Rust\|Config]] |
|
|
26
|
+
| ai-pricing | Catálogo de modelos LLM e histórico de preços por 1M tokens; robô agendado propõe mudanças com aprovação humana (só Java). | [[SeedGrid/Extensions/ai-pricing/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/ai-pricing/Configuracao\|Config]] · [[SeedGrid/Extensions/ai-pricing/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/ai-pricing/Enums|Enums]] | — |
|
|
27
|
+
| exchange | Moedas e cotações diárias com histórico; fontes configuráveis por cadastro, retry; seed USD-BRL PTAX (só Java). | [[SeedGrid/Extensions/exchange/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/exchange/Configuracao\|Config]] · [[SeedGrid/Extensions/exchange/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/exchange/Enums|Enums]] | — |
|
|
28
|
+
|
|
29
|
+
## Dados, auditoria e compliance
|
|
30
|
+
|
|
31
|
+
| Extension | Para que serve | Java | Rust |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| audit | Trilha de auditoria before/after com `@Audit`; stores PostgreSQL e MongoDB. | [[SeedGrid/Extensions/audit/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/audit/Configuracao\|Config]] · [[SeedGrid/Extensions/audit/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/audit/Enums|Enums]] | [[SeedGrid/Extensions/audit/Rust\|Rust]] · [[SeedGrid/Extensions/audit/Configuracao-Rust\|Config]] |
|
|
34
|
+
| backup | Export de dados por tenant/usuário (ZIP), jobs assíncronos, storage plugável, notificação por e-mail. | [[SeedGrid/Extensions/backup/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/backup/Configuracao\|Config]] · [[SeedGrid/Extensions/backup/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/backup/Enums|Enums]] | [[SeedGrid/Extensions/backup/Rust\|Rust]] · [[SeedGrid/Extensions/backup/Configuracao-Rust\|Config]] |
|
|
35
|
+
| privacy *(library)* | Criptografia de campo AES-256-GCM + hash de busca HMAC-SHA256 (LGPD). | [[SeedGrid/Extensions/privacy/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/privacy/Configuracao\|Config]] · [[SeedGrid/Extensions/privacy/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/privacy/Enums|Enums]] | [[SeedGrid/Extensions/privacy/Rust\|Rust]] · [[SeedGrid/Extensions/privacy/Configuracao-Rust\|Config]] |
|
|
36
|
+
|
|
37
|
+
## Comunicação e tempo real
|
|
38
|
+
|
|
39
|
+
| Extension | Para que serve | Java | Rust |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| notification | Notificações administrativas por e-mail/WhatsApp com catálogo de eventos, outbox transacional e worker com retry; módulo `api` separado (só Java). | [[SeedGrid/Extensions/notification/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/notification/Configuracao\|Config]] · [[SeedGrid/Extensions/notification/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/notification/Enums|Enums]] | — |
|
|
42
|
+
| whatsapp | Envio de WhatsApp via Evolution API e Meta Cloud API; provider trocável. | [[SeedGrid/Extensions/whatsapp/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/whatsapp/Configuracao\|Config]] · [[SeedGrid/Extensions/whatsapp/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/whatsapp/Enums|Enums]] | [[SeedGrid/Extensions/whatsapp/Rust\|Rust]] · [[SeedGrid/Extensions/whatsapp/Configuracao-Rust\|Config]] |
|
|
43
|
+
| realtime | Avisos em tempo real ao usuário logado via SeedGrid Pulse (token de conexão + repasse de `SgUserEvent`). | [[SeedGrid/Extensions/realtime/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/realtime/Configuracao\|Config]] · [[SeedGrid/Extensions/realtime/Exemplos\|Exemplos]] | [[SeedGrid/Extensions/realtime/Rust\|Rust]] · [[SeedGrid/Extensions/realtime/Configuracao-Rust\|Config]] |
|
|
44
|
+
| broker | Mensageria com SPI e backends memory/redis/nats/rabbitmq (só Rust). | — | [[SeedGrid/Extensions/broker/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/broker/Configuracao-Rust\|Config]] |
|
|
45
|
+
|
|
46
|
+
## Infraestrutura
|
|
47
|
+
|
|
48
|
+
| Extension | Para que serve | Java | Rust |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| resilience | Rate limiting e circuit breaker declarativos (`@SeedGridRateLimit`, `@SeedGridCircuitBreaker`), cache-backed. | [[SeedGrid/Extensions/resilience/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/resilience/Configuracao\|Config]] · [[SeedGrid/Extensions/resilience/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/resilience/Enums|Enums]] | [[SeedGrid/Extensions/resilience/Rust\|Rust]] · [[SeedGrid/Extensions/resilience/Configuracao-Rust\|Config]] |
|
|
51
|
+
| cache *(library)* | API única sobre Redis/Valkey/Dragonfly. | [[SeedGrid/Extensions/cache/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/cache/Configuracao\|Config]] · [[SeedGrid/Extensions/cache/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/cache/Enums|Enums]] | [[SeedGrid/Extensions/cache/Rust\|Rust]] · [[SeedGrid/Extensions/cache/Configuracao-Rust\|Config]] |
|
|
52
|
+
| filemanagement *(library)* | Storage de arquivos: filesystem, S3, MinIO, Azure Blob, GCS, Google Drive, OneDrive (config por mapa passado pelo chamador). | [[SeedGrid/Extensions/filemanagement/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/filemanagement/Configuracao\|Config]] · [[SeedGrid/Extensions/filemanagement/Exemplos\|Exemplos]] | [[SeedGrid/Extensions/filemanagement/Rust\|Rust]] · [[SeedGrid/Extensions/filemanagement/Configuracao-Rust\|Config]] |
|
|
53
|
+
| commons *(library)* | Utilitários, validadores, entidades base, CORS, timezone de negócio. | [[SeedGrid/Extensions/commons/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/commons/Configuracao\|Config]] · [[SeedGrid/Extensions/commons/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/commons/Enums|Enums]] | — |
|
|
54
|
+
| runtime | `seedgrid-runtime` + `seedgrid-macros`: auto-wiring `#[startup]`/`#[scheduled]` (só Rust). | — | [[SeedGrid/Extensions/runtime/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/runtime/Configuracao-Rust\|Config]] |
|
|
55
|
+
|
|
56
|
+
## Totais
|
|
57
|
+
|
|
58
|
+
- 17 módulos Java documentados (13 extensions + 4 libraries) e 15 unidades Rust (13 crates de porte + broker + runtime/macros).
|
|
59
|
+
- Contagens de propriedades e enums: ver [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]] e [[SeedGrid/Extensions/Catalogo-de-enums|Catálogo de enums]].
|
|
60
|
+
|
|
61
|
+
## Não documentados como extension
|
|
62
|
+
|
|
63
|
+
`seedgrid-parent` (POM pai), `seedgrid-cli`, `seedgrid-components-mcp`, `seedgrid-test-multitenancy` e `java/examples/*`: ver [[SeedGrid/Mapa-dos-repositorios|Mapa dos repositórios]].
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, ai-pricing, quarkus, configuracao]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-ai-pricing
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 0608ca66b5
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# AI Pricing (Quarkus): configuração
|
|
10
|
+
|
|
11
|
+
Voltar para [[SeedGrid/Extensions/ai-pricing/Visao-geral|Visão geral do ai-pricing]] · [[SeedGrid/Extensions/ai-pricing/Exemplos|Exemplos]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Prefixos | `seedgrid.ai-pricing.*` e `seedgrid.app.ai-pricing.*` (**dois prefixos**, por herança do produto de origem) |
|
|
18
|
+
| Mecanismo | só `@ConfigProperty`. Não há `@ConfigMapping`, `@ConfigRoot` nem `microprofile-config.properties` no runtime. |
|
|
19
|
+
| Classes | `AiPricingEntityManager`, `AiPricingScheduler`, `AiPricingCheckService` |
|
|
20
|
+
| Fase | runtime (todas) |
|
|
21
|
+
| Configuração em banco | `ai_pricing_config` (`enabled`, `cron`, `source_url`), editável em `PUT /admin/ai/price-approvals/config`. **Não são propriedades**: ver a seção 2.2. |
|
|
22
|
+
|
|
23
|
+
Abreviação usada na coluna Origem: `rt/` = `java/seedgrid-quarkus-ext-ai-pricing/runtime/src/main/java/br/com/seedgrid/aipricing/`.
|
|
24
|
+
|
|
25
|
+
Variáveis de ambiente pela regra MP, sem ambiguidade:
|
|
26
|
+
- `seedgrid.ai-pricing.persistence-unit` → `SEEDGRID_AI_PRICING_PERSISTENCE_UNIT`
|
|
27
|
+
- `seedgrid.app.ai-pricing.timezone` → `SEEDGRID_APP_AI_PRICING_TIMEZONE`
|
|
28
|
+
- `seedgrid.app.ai-pricing.source-url` → `SEEDGRID_APP_AI_PRICING_SOURCE_URL`
|
|
29
|
+
|
|
30
|
+
## 2. Propriedades próprias
|
|
31
|
+
|
|
32
|
+
### 2.1 Propriedades
|
|
33
|
+
|
|
34
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
35
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
36
|
+
| `seedgrid.ai-pricing.persistence-unit` | Optional\<String\> | nome de PU; vazio ou `<default>` = PU default | — (PU default) | Não | Escolhe o `EntityManager` de todas as tabelas do ai-pricing (repositories). | `AiPricingEntityManager` → `Ai*Repository` | O subdomain-tenancy define `master` no microprofile-config dele (**Confirmado**). As entidades `br.com.seedgrid.aipricing.entities` devem estar mapeadas na mesma PU. | runtime | `rt/repositories/AiPricingEntityManager.java` (construtor) |
|
|
37
|
+
| `seedgrid.app.ai-pricing.timezone` | String (ZoneId) | `ZoneId` válido | `America/Sao_Paulo` | Não | Fuso em que o cron do robô (vindo do banco) é interpretado. **Inferência:** um fuso inválido faz o `schedule()` lançar exceção. No startup isso vira WARN; no `PUT config`, vira erro ao admin ("Expressão de cron inválida", mensagem enganosa). | `AiPricingScheduler#applySchedule` | Trabalha com `ai_pricing_config.cron`. | runtime | `rt/schedulers/AiPricingScheduler.java` (campo `timeZone`) |
|
|
38
|
+
| `seedgrid.app.ai-pricing.source-url` | String (URL) | URL HTTP(S) da página de preços | `https://developers.openai.com/api/docs/pricing` | Não | URL usada **só** quando `ai_pricing_config.source_url` está nula ou vazia. O banco é a fonte de verdade. | `AiPricingCheckService#resolveSourceUrl` | Sobreposta por `ai_pricing_config.source_url`. | runtime | `rt/services/AiPricingCheckService.java` (campo `defaultSourceUrl`) |
|
|
39
|
+
|
|
40
|
+
### 2.2 Configuração em banco (`ai_pricing_config`, linha única)
|
|
41
|
+
|
|
42
|
+
| Campo | Default na entidade | Seed V902 | Edição | Efeito |
|
|
43
|
+
|---|---|---|---|---|
|
|
44
|
+
| `enabled` | `false` (boolean Java) | `true` | `PUT /admin/ai/price-approvals/config` `{enabled}` | Com `false` (ou cron vazio), o job não é agendado. |
|
|
45
|
+
| `cron` | `0 0 6 * * ?` | `0 0 6 * * ?` | `{cron}` | Cron Quartz do robô. Se for inválido, faz rollback e retorna erro ao admin. |
|
|
46
|
+
| `source_url` | `https://openai.com/api/pricing` | `https://developers.openai.com/api/docs/pricing` | `{sourceUrl}` | Página lida pelo robô. |
|
|
47
|
+
|
|
48
|
+
Origem: `rt/entities/AiPricingConfigEntity.java`, `runtime/src/main/resources/db/migration/ai-pricing/V902__seed_ai_models_and_pricing_config.sql`, `rt/controllers/AdminAiPriceApprovalResource#saveConfig`.
|
|
49
|
+
|
|
50
|
+
### 2.3 Propriedades de outras extensions que governam o ai-pricing
|
|
51
|
+
|
|
52
|
+
| Propriedade | Dona | Padrão | Efeito |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `seedgrid.ai-pricing.migration.enabled` | login-tenancy (`LoginTenancyMigrationService`) e subdomain-tenancy (`flyway/MigrationService`) | `false` | Roda `classpath:db/migration/ai-pricing` com a tabela `flyway_schema_history_ai_pricing`. **Não** é lida por esta extension. |
|
|
55
|
+
|
|
56
|
+
## 3. Propriedades de frameworks
|
|
57
|
+
|
|
58
|
+
A extension não define nenhuma propriedade de framework: não há `microprofile-config.properties` no runtime. As recomendações abaixo saem do `integration-tests` e do README.
|
|
59
|
+
|
|
60
|
+
| Propriedade | Recomendação |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `quarkus.flyway.locations` | Incluir `db/migration/ai-pricing` no Flyway nativo, ou ligar `seedgrid.ai-pricing.migration.enabled` nos tenancies. |
|
|
63
|
+
| `quarkus.flyway.table` | Os testes usam `flyway_schema_history_ai_pricing` (o mesmo nome do runner dos tenancies). |
|
|
64
|
+
| `quarkus.hibernate-orm.physical-naming-strategy` | `org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy` (as entidades são camelCase e as colunas snake_case). |
|
|
65
|
+
| `quarkus.hibernate-orm.<pu>.packages` | Mapear `br.com.seedgrid.aipricing.entities` na PU configurada. No subdomain-tenancy, só em master (README). |
|
|
66
|
+
|
|
67
|
+
## 4. Propriedades usadas só em testes
|
|
68
|
+
|
|
69
|
+
Arquivo `integration-tests/src/test/resources/application.properties`:
|
|
70
|
+
- `quarkus.devservices.enabled=false`
|
|
71
|
+
- `quarkus.flyway.migrate-at-start=true`
|
|
72
|
+
- `quarkus.flyway.locations=db/migration/ai-pricing`
|
|
73
|
+
- `quarkus.flyway.table=flyway_schema_history_ai_pricing`
|
|
74
|
+
- `quarkus.flyway.baseline-on-migrate=true`
|
|
75
|
+
- naming strategy
|
|
76
|
+
- `quarkus.hibernate-orm.schema-management.strategy=none`
|
|
77
|
+
- `quarkus.scheduler.enabled=false`
|
|
78
|
+
- `quarkus.http.test-port=0`
|
|
79
|
+
|
|
80
|
+
O `ModuloDesligadoTest` sobrescreve `quarkus.flyway.migrate-at-start=false` via `QuarkusTestProfile`.
|
|
81
|
+
|
|
82
|
+
## 5. Aliases, obsoletas e renomeações
|
|
83
|
+
Não encontradas. O prefixo duplo (`seedgrid.ai-pricing` contra `seedgrid.app.ai-pricing`) é uma inconsistência, não um alias.
|
|
84
|
+
|
|
85
|
+
## 6. Configuração mínima
|
|
86
|
+
Nenhuma propriedade é obrigatória. No login-tenancy:
|
|
87
|
+
|
|
88
|
+
```properties
|
|
89
|
+
seedgrid.ai-pricing.migration.enabled=true
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
O robô só funciona com um bean `AiPriceExtractor` do host (ver [[SeedGrid/Extensions/ai-pricing/Exemplos|Exemplos]]).
|
|
93
|
+
|
|
94
|
+
## 7. Configuração completa comentada
|
|
95
|
+
|
|
96
|
+
```properties
|
|
97
|
+
# PU das tabelas do ai-pricing. Sem valor ou <default> = PU default. subdomain-tenancy: master.
|
|
98
|
+
#seedgrid.ai-pricing.persistence-unit=master
|
|
99
|
+
|
|
100
|
+
# Fuso do cron do robô (o cron vem de ai_pricing_config). Default America/Sao_Paulo.
|
|
101
|
+
seedgrid.app.ai-pricing.timezone=America/Sao_Paulo
|
|
102
|
+
|
|
103
|
+
# URL usada apenas se ai_pricing_config.source_url estiver vazia.
|
|
104
|
+
# Default https://developers.openai.com/api/docs/pricing
|
|
105
|
+
#seedgrid.app.ai-pricing.source-url=https://<pagina-de-precos>
|
|
106
|
+
|
|
107
|
+
# (tenancies) aplicar as migrations V900-V903. Default false.
|
|
108
|
+
seedgrid.ai-pricing.migration.enabled=true
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 8. Receitas
|
|
112
|
+
|
|
113
|
+
| Caso | Como |
|
|
114
|
+
|---|---|
|
|
115
|
+
| Produto sem IA (padrão) | Nada a configurar. Sem migration, a app sobe com WARN, e o robô retorna `SKIPPED`. |
|
|
116
|
+
| Ligar o robô | Aplicar as migrations, implementar `AiPriceExtractor` e deixar `enabled=true` em `ai_pricing_config` (o seed já liga). |
|
|
117
|
+
| Mudar horário ou fonte | `PUT /admin/ai/price-approvals/config` com `{ "cron": "0 0 5 * * ?", "sourceUrl": "https://..." }`. Reagenda na hora. |
|
|
118
|
+
| Fuso diferente | `seedgrid.app.ai-pricing.timezone=UTC` |
|
|
119
|
+
| subdomain-tenancy | `seedgrid.ai-pricing.persistence-unit=master` (já default da extension de tenancy) |
|
|
120
|
+
|
|
121
|
+
## 9. Dúvidas e lacunas
|
|
122
|
+
- O default da URL de origem diverge: a entidade usa `https://openai.com/api/pricing`, enquanto a propriedade e o seed V902 usam `https://developers.openai.com/api/docs/pricing`. Uma linha criada via `PUT config` sem linha prévia herda o valor da entidade.
|
|
123
|
+
- O default `enabled=false` da entidade, somado ao seed `true`, significa que, se a linha for criada pelo `PUT` antes do seed, o robô nasce desligado.
|
|
124
|
+
- O fuso inválido gera uma mensagem de "cron inválido" (**Inferência**).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, ai-pricing, quarkus, enum]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-ai-pricing
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 0608ca66b5
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# AI Pricing (Quarkus): enums
|
|
10
|
+
|
|
11
|
+
Voltar para [[SeedGrid/Extensions/ai-pricing/Visao-geral|Visão geral]] · [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração]].
|
|
12
|
+
|
|
13
|
+
A extension **não define nenhum `enum` Java**. Há dois conjuntos de valores fixos, ambos como `String`, documentados aqui porque fazem parte do contrato observável. Nenhum é tipo de propriedade de configuração.
|
|
14
|
+
|
|
15
|
+
| Conjunto | Onde | Usado em |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| status da proposta | constantes `STATUS_*` em `runtime/src/main/java/br/com/seedgrid/aipricing/entities/AiModelPriceToApproveEntity.java` | coluna `ai_model_prices_to_approve.status varchar(16) default 'PENDING'` (V900), sem CHECK |
|
|
18
|
+
| status do resultado da checagem | literais em `services/AiPricingCheckService.java` (`CheckOutcome`) | resposta de `POST /admin/ai/price-approvals/check` |
|
|
19
|
+
|
|
20
|
+
## Status da proposta (`AiModelPriceToApproveEntity.STATUS_*`)
|
|
21
|
+
Campo `String status`; nem a entidade nem o banco validam os valores.
|
|
22
|
+
|
|
23
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| `PENDING` | Proposta (ou erro) aguardando decisão. | Default da coluna e da entidade; criada por `AiPricingCheckService`. Enquanto existir uma `PENDING`, `runCheck` retorna `SKIPPED`. `AiPriceApprovalService` só aprova ou rejeita linhas `PENDING`. | Confirmado. |
|
|
26
|
+
| `APPROVED` | Aprovada. | `AiPriceApprovalService#approve` aplica os preços e marca. | Confirmado. |
|
|
27
|
+
| `REJECTED` | Recusada ou dispensada. | `AiPriceApprovalService#reject`. | Confirmado. |
|
|
28
|
+
|
|
29
|
+
## Status do resultado da checagem (`CheckOutcome.status`)
|
|
30
|
+
Não persistido; devolvido no campo `status` da resposta de `POST /admin/ai/price-approvals/check`.
|
|
31
|
+
|
|
32
|
+
| Valor | Significado | Quando |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `SKIPPED` | Nada foi feito. | Sem `AiPriceExtractor` configurado, ou já existe proposta/erro pendente. |
|
|
35
|
+
| `ERROR` | Falhou. | Página inacessível, extração falhou ou nenhuma tabela reconhecível. Registra uma linha pendente e publica `ai-pricing.check-failed`. |
|
|
36
|
+
| `NO_CHANGE` | Preços lidos, sem diferença com o catálogo. | Nenhuma proposta criada. |
|
|
37
|
+
| `CHANGES` | Há mudanças de preço. | Cria a proposta `PENDING` e publica `ai-pricing.approval-pending`. |
|
|
38
|
+
|
|
39
|
+
## Internos
|
|
40
|
+
Nenhum.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, ai-pricing, quarkus, exemplos]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-ai-pricing
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 0608ca66b5
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# AI Pricing (Quarkus): exemplos
|
|
10
|
+
|
|
11
|
+
Ver [[SeedGrid/Extensions/ai-pricing/Visao-geral|Visão geral]] e [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração]].
|
|
12
|
+
|
|
13
|
+
## 1. Dependência
|
|
14
|
+
|
|
15
|
+
Fonte: README.
|
|
16
|
+
|
|
17
|
+
```xml
|
|
18
|
+
<dependency>
|
|
19
|
+
<groupId>br.com.seedgrid</groupId>
|
|
20
|
+
<artifactId>seedgrid-ai-pricing</artifactId>
|
|
21
|
+
<version>2026.10.14</version>
|
|
22
|
+
</dependency>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Security e audit-core vêm do host.
|
|
26
|
+
|
|
27
|
+
## 2. Ligar o robô: implementar `AiPriceExtractor`
|
|
28
|
+
|
|
29
|
+
O contrato vem do javadoc de `runtime/.../spi/AiPriceExtractor.java`, e a forma da implementação segue o `ExtratorFalso` de `AiPricingRobotTest`. O cliente de LLM (`MeuClienteLlm`) é do host e meramente ilustrativo: a extension não fornece cliente.
|
|
30
|
+
|
|
31
|
+
```java
|
|
32
|
+
@ApplicationScoped
|
|
33
|
+
public class LlmAiPriceExtractor implements AiPriceExtractor {
|
|
34
|
+
|
|
35
|
+
@Inject
|
|
36
|
+
MeuClienteLlm llm; // do host
|
|
37
|
+
|
|
38
|
+
@Override
|
|
39
|
+
public String extract(String pricingPageContent) throws Exception {
|
|
40
|
+
String prompt;
|
|
41
|
+
try (InputStream in = getClass().getResourceAsStream("/ai-pricing/prompts/pricing-extract.md")) {
|
|
42
|
+
prompt = new String(in.readAllBytes(), StandardCharsets.UTF_8);
|
|
43
|
+
}
|
|
44
|
+
// Deve devolver um array JSON: [{"model":..., "inputPricePerMillion":...,
|
|
45
|
+
// "cachedInputPricePerMillion":..., "outputPricePerMillion":...}] ou "[]".
|
|
46
|
+
// Não engula exceções de rede/timeout: o robô faz retry com backoff.
|
|
47
|
+
return llm.complete(prompt, pricingPageContent);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Override
|
|
51
|
+
public boolean isConfigured() {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
O bean do host vence o `NoOpAiPriceExtractor` (`@DefaultBean`) sem configuração extra.
|
|
58
|
+
|
|
59
|
+
## 3. Configurar o robô pelo admin (REST)
|
|
60
|
+
|
|
61
|
+
Fonte: `AdminAiPriceApprovalResource`. Requer `AI_PRICE_APPROVE`.
|
|
62
|
+
|
|
63
|
+
```http
|
|
64
|
+
PUT /admin/ai/price-approvals/config
|
|
65
|
+
Content-Type: application/json
|
|
66
|
+
|
|
67
|
+
{ "enabled": true, "cron": "0 0 6 * * ?", "sourceUrl": "https://developers.openai.com/api/docs/pricing" }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```http
|
|
71
|
+
POST /admin/ai/price-approvals/check # roda agora; devolve status/extractedCount/changedCount/message
|
|
72
|
+
POST /admin/ai/price-approvals/{id}/approve
|
|
73
|
+
POST /admin/ai/price-approvals/{id}/reject
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 4. Lançar preço manual de um modelo
|
|
77
|
+
|
|
78
|
+
Fonte: `AdminModelResource.LaunchPriceRequest`. Requer `AI_MODEL_PRICE_CREATE`. Valores por 1M de tokens.
|
|
79
|
+
|
|
80
|
+
```http
|
|
81
|
+
POST /admin/ai/models/{publicId}/prices
|
|
82
|
+
Content-Type: application/json
|
|
83
|
+
|
|
84
|
+
{ "inputPricePerMillion": 0.25, "cachedInputPricePerMillion": 0.03,
|
|
85
|
+
"outputPricePerMillion": 2.00, "sourceUrl": "https://developers.openai.com/api/docs/pricing" }
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Para cadastrar um modelo, `POST /admin/ai/models` recebe `{ "provider": "openai", "model": "gpt-5.1", "label": "GPT-5.1", "currency": "USD", "active": true }` (`ModelRequest`). Esse corpo não leva preço.
|
|
89
|
+
|
|
90
|
+
## 5. Configuração por tenancy
|
|
91
|
+
|
|
92
|
+
```properties
|
|
93
|
+
# login-tenancy / subdomain-tenancy: aplicar V900–V903
|
|
94
|
+
seedgrid.ai-pricing.migration.enabled=true
|
|
95
|
+
# subdomain-tenancy já define:
|
|
96
|
+
# seedgrid.ai-pricing.persistence-unit=master
|
|
97
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, ai-pricing, quarkus]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-ai-pricing
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 0608ca66b5
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# AI Pricing (Quarkus): visão geral
|
|
10
|
+
|
|
11
|
+
Mantém o catálogo de modelos de LLM e o histórico de preços por 1M de tokens (input, cached input e output). Um robô agendado lê a página de preços do provedor e propõe mudanças. As mudanças só entram em vigor depois de **aprovação humana**. Não há crate Rust equivalente.
|
|
12
|
+
|
|
13
|
+
- Configuração: [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração do ai-pricing]]
|
|
14
|
+
- Exemplos: [[SeedGrid/Extensions/ai-pricing/Exemplos|Exemplos do ai-pricing]]
|
|
15
|
+
- Enums: [[SeedGrid/Extensions/ai-pricing/Enums|Enums do ai-pricing]]
|
|
16
|
+
|
|
17
|
+
## Módulos e coordenadas
|
|
18
|
+
|
|
19
|
+
| Módulo | Artefato |
|
|
20
|
+
|---|---|
|
|
21
|
+
| parent | `br.com.seedgrid:seedgrid-ai-pricing-parent:2026.10.14` (parent `seedgrid-parent:2026.07.02`) |
|
|
22
|
+
| runtime | `br.com.seedgrid:seedgrid-ai-pricing` |
|
|
23
|
+
| deployment | `br.com.seedgrid:seedgrid-ai-pricing-deployment` |
|
|
24
|
+
| integration-tests | não publicado |
|
|
25
|
+
|
|
26
|
+
A feature Quarkus é `seedgrid-ai-pricing` (`SeedgridAiPricingProcessor`). O processor registra como *unremovable* os services, o scheduler, os resources e os SPIs default.
|
|
27
|
+
|
|
28
|
+
> Usa Java 21 e Quarkus **3.30.6**: o `pom.xml` do módulo sobrescreve `quarkus.platform.version` (o `seedgrid-parent` usa 3.30.8). O `runtime/src/main/resources/META-INF/quarkus-extension.properties` declara `deployment-artifact=...:1.0.0-SNAPSHOT`, valor fixo e não `${project.version}`. **Confirmado** nos arquivos; o impacto do valor fixo não foi verificado.
|
|
29
|
+
|
|
30
|
+
### Dependências
|
|
31
|
+
- SeedGrid: `seedgrid-commons` 2026.10.08 (`BaseEntity`, `BusinessException`), `seedgrid-security` 2026.10.08 (`@PermissionsAllowed`, `@MonoCompany`), `seedgrid-audit-core` 2026.09.25 (`@Audit`) e `seedgrid-notification-api`.
|
|
32
|
+
- Quarkus: `arc`, `rest-jackson`, `hibernate-orm` (JPA puro, sem Panache), `scheduler`, `security` e `hibernate-validator`.
|
|
33
|
+
- O motor `seedgrid-notification` é opcional no runtime e só entra como dependência de teste.
|
|
34
|
+
|
|
35
|
+
## Arquitetura
|
|
36
|
+
|
|
37
|
+
```mermaid
|
|
38
|
+
flowchart LR
|
|
39
|
+
SCH[AiPricingScheduler<br/>cron vindo do banco] --> CHK[AiPricingCheckService.runCheck]
|
|
40
|
+
ADM[POST /admin/ai/price-approvals/check] --> CHK
|
|
41
|
+
CHK -->|HttpClient GET| PAGE((página de preços))
|
|
42
|
+
CHK -->|regex determinística, senão| EXT{{AiPriceExtractor SPI}}
|
|
43
|
+
CHK --> PEND[(ai_model_prices_to_approve)]
|
|
44
|
+
CHK -. ai-pricing.approval-pending / check-failed .-> NOTIF[notification-api]
|
|
45
|
+
APR[approve/reject] --> PRICES[(ai_model_prices)]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- `AiPricingScheduler` agenda o job `ai-pricing-daily-check` pela API programática do `Scheduler`. Usa `enabled` e `cron` da tabela `ai_pricing_config` e o fuso de `seedgrid.app.ai-pricing.timezone`. Reagenda ao salvar a config, sem restart. Se a tabela não existir no startup, registra um WARN e não derruba o boot (`ModuloDesligadoTest`).
|
|
49
|
+
- `AiPricingCheckService#runCheck`:
|
|
50
|
+
- Sem extrator configurado, retorna `SKIPPED`.
|
|
51
|
+
- Com proposta pendente, também retorna `SKIPPED`.
|
|
52
|
+
- Caso contrário, baixa a página (connect timeout de 20s, request de 30s) e tenta uma extração determinística por regex. Para página não estruturada, delega ao `AiPriceExtractor` com retry (backoff de 1,5s e 3s).
|
|
53
|
+
- Compara só os modelos **ativos** do catálogo e cria a proposta pendente.
|
|
54
|
+
- Erros também viram uma linha pendente, e o evento é publicado.
|
|
55
|
+
- O prompt do extrator está no classpath em `/ai-pricing/prompts/pricing-extract.md`.
|
|
56
|
+
|
|
57
|
+
## APIs públicas
|
|
58
|
+
|
|
59
|
+
### SPIs
|
|
60
|
+
| SPI | Default | Assinatura |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `AiPriceExtractor` | `NoOpAiPriceExtractor` (`@DefaultBean`, `isConfigured()=false`) | `String extract(String pricingPageContent) throws Exception`; `boolean isConfigured()` |
|
|
63
|
+
| `AiPricingAuditSink` | `NoOpAiPricingAuditSink` | `record(String actionType, String targetType, String targetId, String summary, Map<String,Object> details)`. O README o chama de legado: a auditoria é feita via `@Audit`. |
|
|
64
|
+
|
|
65
|
+
### Endpoints REST (`RestControllerPath`)
|
|
66
|
+
Todos os resources são `@MonoCompany`.
|
|
67
|
+
|
|
68
|
+
| Método | Caminho | Permissão |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| GET | `/admin/ai/models` | `AI_MODEL_READ` |
|
|
71
|
+
| POST | `/admin/ai/models` | `AI_MODEL_CREATE` |
|
|
72
|
+
| PUT/DELETE | `/admin/ai/models/{publicId}` | `AI_MODEL_UPDATE` / `AI_MODEL_DELETE` |
|
|
73
|
+
| GET | `/admin/ai/models/{publicId}/prices` | `AI_MODEL_READ` |
|
|
74
|
+
| POST | `/admin/ai/models/{publicId}/prices` | `AI_MODEL_PRICE_CREATE` |
|
|
75
|
+
| GET | `/admin/ai/price-approvals` | `AI_PRICE_APPROVE` |
|
|
76
|
+
| GET/PUT | `/admin/ai/price-approvals/config` | `AI_PRICE_APPROVE` |
|
|
77
|
+
| POST | `/admin/ai/price-approvals/{id}/approve`, `/{id}/reject` | `AI_PRICE_APPROVE` |
|
|
78
|
+
| POST | `/admin/ai/price-approvals/check` | `AI_PRICE_APPROVE` |
|
|
79
|
+
|
|
80
|
+
**Confirmado** (`AdminModelResource`, `AdminAiPriceApprovalResource`). As respostas de `/admin/ai/models` incluem `currentPriceValidFrom` (README).
|
|
81
|
+
|
|
82
|
+
### Eventos de notificação
|
|
83
|
+
Declarados em `AiPricingNotificationCatalog`:
|
|
84
|
+
- `ai-pricing.approval-pending`, com variáveis `proposalId` e `quantity`.
|
|
85
|
+
- `ai-pricing.check-failed`, com variáveis `proposalId` e `failureKind`.
|
|
86
|
+
|
|
87
|
+
## Migrations
|
|
88
|
+
`db/migration/ai-pricing`, de **V900 a V903**. Histórico em `flyway_schema_history_ai_pricing`.
|
|
89
|
+
|
|
90
|
+
| Versão | Conteúdo |
|
|
91
|
+
|---|---|
|
|
92
|
+
| V900 | tabelas `ai_models`, `ai_model_prices`, `ai_model_prices_to_approve`, `ai_pricing_config` |
|
|
93
|
+
| V901 | permissões `AI_MODEL_READ/CREATE/UPDATE/DELETE`, `AI_MODEL_PRICE_CREATE` e `AI_PRICE_APPROVE` (audience `platform`, vinculadas a `ADMIN`) |
|
|
94
|
+
| V902 | seed de modelos OpenAI (`gpt-4.1-nano`, `gpt-4.1-mini`, `gpt-5.1`) e da config do robô (ligado, cron `0 0 6 * * ?`, `source_url` = página de preços da OpenAI) |
|
|
95
|
+
| V903 | coluna `active` |
|
|
96
|
+
|
|
97
|
+
Nos tenancies, o runner aplica essa location só quando `seedgrid.ai-pricing.migration.enabled=true` (default `false`, declarado em login-tenancy e subdomain-tenancy). Ver [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração]].
|
|
98
|
+
|
|
99
|
+
## Testes (não executados)
|
|
100
|
+
- `runtime/src/test`:
|
|
101
|
+
- `AiPricingRobotTest`: robô com extrator falso.
|
|
102
|
+
- `AiPricingRulesTest`.
|
|
103
|
+
- `AiPricingAuditContractTest`.
|
|
104
|
+
- `AiPricingNotificationCatalogTest`.
|
|
105
|
+
- `integration-tests` (PostgreSQL via Testcontainers):
|
|
106
|
+
- `AiPricingNotificationTest`.
|
|
107
|
+
- `AiPricingPermissionMigrationTest`.
|
|
108
|
+
- `ModuloDesligadoTest`: app sobe sem as tabelas.
|
|
109
|
+
- `PersistedChangesTest`.
|
|
110
|
+
- `PriceApprovalGateTest`.
|
|
111
|
+
|
|
112
|
+
## Limitações
|
|
113
|
+
- Sem um bean `AiPriceExtractor`, o robô fica inerte e só retorna `SKIPPED`. Esse é o estado normal de um produto sem IA.
|
|
114
|
+
- Com proposta ou erro pendente, novas checagens são puladas até o admin agir.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, apikeys, rust, configuracao]
|
|
3
|
+
fonte: rust/seedgrid-rust-crate-apikeys
|
|
4
|
+
branch: main
|
|
5
|
+
commit: be738a2d1e
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Configuração Rust — `seedgrid-rust-crate-apikeys`
|
|
10
|
+
|
|
11
|
+
Volta para: [[SeedGrid/Extensions/apikeys/Rust|Porte Rust do apikeys]] · Java: [[SeedGrid/Extensions/apikeys/Configuracao|Configuração do apikeys (Quarkus)]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Struct | `ApiKeysConfig` (`src/config.rs`), com `impl Default` |
|
|
18
|
+
| Prefixo lógico | `seedgrid.apikeys` (porte do `@ConfigMapping(prefix = "seedgrid.apikeys")` de `ApiKeysConfig.java`) |
|
|
19
|
+
| Mecanismo | `ApiKeysConfig::from_env()` lê 2 env vars com `std::env::var` (helper `env_usize`); valor ausente ou não-numérico → default |
|
|
20
|
+
| Leitura | no boot, quando o host chama `from_env()` e passa o resultado a `ApiKeyState::builder(pool, config)` |
|
|
21
|
+
| Features Cargo | nenhuma |
|
|
22
|
+
| Outras fontes | nenhuma leitura de env fora de `src/config.rs` (Confirmado por grep em `src/` e `tests/`) |
|
|
23
|
+
|
|
24
|
+
## 2. Propriedades do crate
|
|
25
|
+
|
|
26
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
27
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
28
|
+
| `SEEDGRID_APIKEYS_PREFIX_LENGTH` → `prefix_length` | `usize` | inteiro ≥ 0 (aparado) | `8` | Não | nº de caracteres da parte aleatória persistidos como prefixo (sem `sgkey_`); `extract_prefix` exige ao menos esse tamanho | `src/generator.rs` (`ApiKeyGenerator::generate`, `extract_prefix`) | Java: `seedgrid.apikeys.prefix-length` (`ApiKeysConfig#prefixLength`), mesma env e default (Confirmado no código) | boot (`from_env`) ou struct | `src/config.rs` → `ApiKeysConfig::from_env` / `env_usize`; consumo `src/generator.rs` |
|
|
29
|
+
| `SEEDGRID_APIKEYS_KEY_BYTES` → `key_bytes` | `usize` | inteiro ≥ 0 | `32` | Não | nº de bytes aleatórios (OsRng) codificados em Base64 URL-safe sem padding | `src/generator.rs:67` | Java: `seedgrid.apikeys.key-bytes` (`ApiKeysConfig#keyBytes`) | boot ou struct | idem |
|
|
30
|
+
|
|
31
|
+
Policy de ativação (não é config, é SPI): `ApiKeyActivationPolicy` (`src/spi.rs`) com `is_api_key_auth_enabled()` e `is_api_key_management_enabled()`; default `DefaultApiKeyActivationPolicy` = ambos `true`. Troca via `ApiKeyState::builder(...).policy(Arc<dyn ApiKeyActivationPolicy>)`.
|
|
32
|
+
|
|
33
|
+
Constantes fixas (não configuráveis, `src/constants.rs`): header `x-api-key`, prefixo literal `sgkey_`.
|
|
34
|
+
|
|
35
|
+
## 3. Propriedades de frameworks/bibliotecas
|
|
36
|
+
|
|
37
|
+
Nenhuma lida pelo crate. Depende do `seedgrid-security` (bcrypt e schema `users`/`roles`/`permissions`); a config do security é independente — ver [[SeedGrid/Extensions/security/Configuracao-Rust|Configuração Rust do security]].
|
|
38
|
+
|
|
39
|
+
## 4. Propriedades usadas só em testes e exemplos
|
|
40
|
+
|
|
41
|
+
- `rust/examples/seedgrid-security-apikeys-example/.env.example` lista `SEEDGRID_APIKEYS_PREFIX_LENGTH` e `SEEDGRID_APIKEYS_KEY_BYTES` comentadas, além de `DATABASE_URL`/`BIND_ADDR` (lidas pelo `main.rs` do exemplo) e envs do security.
|
|
42
|
+
- README: `DOCKER_HOST` para os testes `#[ignore]` com Testcontainers/Podman.
|
|
43
|
+
|
|
44
|
+
## 5. Aliases, obsoletas, renomeações
|
|
45
|
+
|
|
46
|
+
Nenhum alias. Nomes de env idênticos ao Java.
|
|
47
|
+
|
|
48
|
+
## 6. Configuração mínima
|
|
49
|
+
|
|
50
|
+
Nenhuma variável é obrigatória (defaults 8/32).
|
|
51
|
+
|
|
52
|
+
## 7. Configuração completa comentada
|
|
53
|
+
|
|
54
|
+
```dotenv
|
|
55
|
+
# Tamanho do prefixo persistido (sem "sgkey_"). Default 8.
|
|
56
|
+
SEEDGRID_APIKEYS_PREFIX_LENGTH=8
|
|
57
|
+
# Bytes aleatórios da chave (Base64 URL-safe sem padding). Default 32.
|
|
58
|
+
SEEDGRID_APIKEYS_KEY_BYTES=32
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 8. Receitas
|
|
62
|
+
|
|
63
|
+
- **Chave mais longa:** `SEEDGRID_APIKEYS_KEY_BYTES=48`. Chaves já emitidas continuam válidas (o hash cobre a chave crua completa).
|
|
64
|
+
- **Desligar gestão REST mantendo autenticação:** implementar `ApiKeyActivationPolicy` com `is_api_key_management_enabled() = false` (endpoints de gestão → 404 `Api key management is disabled`; `GET /apikeys/me` continua).
|
|
65
|
+
|
|
66
|
+
## 9. Dúvidas e lacunas
|
|
67
|
+
|
|
68
|
+
- Mudar `prefix_length` depois de emitir chaves altera o prefixo extraído na autenticação; chaves antigas com prefixo de outro tamanho deixariam de ser encontradas — **Inferência** (o lookup é por prefixo de `prefix_length` chars, `src/generator.rs` + `services/auth.rs`).
|
|
69
|
+
- Valores `0` não são validados (ex.: `KEY_BYTES=0` gera parte aleatória vazia) — **Inferência** pela ausência de validação em `from_env`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, apikeys, configuracao]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-apikeys
|
|
4
|
+
branch: main
|
|
5
|
+
commit: bfc9c25877
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# API Keys (Quarkus) — configuração
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/apikeys/Visao-geral|Visão geral do apikeys]] · [[SeedGrid/Extensions/apikeys/Exemplos|Exemplos]] · [[SeedGrid/Extensions/apikeys/Rust|Porte Rust]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Prefixo | `seedgrid.apikeys` |
|
|
18
|
+
| Classe de config | `java/seedgrid-quarkus-ext-apikeys/runtime/src/main/java/br/com/seedgrid/apikeys/configs/ApiKeysConfig.java` → `ApiKeysConfig` |
|
|
19
|
+
| Mecanismo | SmallRye `@ConfigMapping(prefix = "seedgrid.apikeys")` + `@StaticInitSafe`; registrado em `SeedgridApikeysProcessor#config()` (`ConfigMappingBuildItem`) |
|
|
20
|
+
| Fase | Runtime |
|
|
21
|
+
| Outras fontes | Nenhum `@ConfigProperty`, `ConfigProvider` ou `microprofile-config.properties` no runtime (verificado por busca). |
|
|
22
|
+
|
|
23
|
+
Ligar/desligar autenticação e gestão **não** é por propriedade: é pelo bean SPI `ApiKeyActivationPolicy` (ver [[SeedGrid/Extensions/apikeys/Visao-geral|Visão geral]]).
|
|
24
|
+
|
|
25
|
+
## 2. Propriedades da extension
|
|
26
|
+
|
|
27
|
+
### Geração da chave
|
|
28
|
+
|
|
29
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
30
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
31
|
+
| `seedgrid.apikeys.prefix-length` (env `SEEDGRID_APIKEYS_PREFIX_LENGTH`) | `int` | inteiro positivo (sem validação explícita) | `8` | Não | Nº de caracteres da parte aleatória guardados como `prefix` (busca no banco e máscara `prefix...`). Na autenticação, a chave cuja parte após `sgkey_` for menor que isso é rejeitada. | Localizar a chave pelo prefixo antes de comparar o hash | **Mudar com chaves já emitidas quebra a autenticação delas**: o prefixo extraído na autenticação usa o valor atual, e as chaves antigas foram gravadas com o anterior (Inferência a partir de `ApiKeyGeneratorService#extractPrefix` + `ApiKeyRepository#findByPrefix`). Deve ser ≤ comprimento da parte aleatória (gerado a partir de `key-bytes`). | Runtime | Decl.: `ApiKeysConfig#prefixLength()`. Consumo: `ApiKeyGeneratorService#extractPrefix`, `#extractPrefixFromRandomPart` |
|
|
32
|
+
| `seedgrid.apikeys.key-bytes` (env `SEEDGRID_APIKEYS_KEY_BYTES`) | `int` | inteiro positivo (sem validação explícita) | `32` | Não | Bytes aleatórios (`SecureRandom`) codificados em Base64 URL-safe sem padding para formar a chave `sgkey_<...>`. | Entropia da chave | Com 32 bytes a parte aleatória tem 43 caracteres; se ficar menor que `prefix-length`, o prefixo vira a parte inteira (Confirmado em `extractPrefixFromRandomPart`). Afeta só chaves novas. | Runtime | Decl.: `ApiKeysConfig#keyBytes()`. Consumo: `ApiKeyGeneratorService#generateRandomPart` |
|
|
33
|
+
|
|
34
|
+
Total: **2 propriedades públicas**.
|
|
35
|
+
|
|
36
|
+
## 3. Propriedades de frameworks/bibliotecas
|
|
37
|
+
|
|
38
|
+
A extension não registra defaults de `quarkus.*`. Ela depende, na prática, da configuração do `seedgrid-security` e do Quarkus (datasource, JWT) no host. O comentário do `integration-tests/src/main/resources/application.properties` registra que o security fixa `quarkus.http.auth.proactive=true` e que, por isso, o smallrye-jwt precisa de chave pública configurada mesmo em requests por API key (senão 500 `SRJWT02002`). (Confirmado como comentário; comportamento do security não verificado aqui.)
|
|
39
|
+
|
|
40
|
+
## 4. Propriedades usadas só em testes
|
|
41
|
+
|
|
42
|
+
`integration-tests/src/main/resources/application.properties` (fica em `src/main` porque o `@QuarkusIntegrationTest` roda o JAR empacotado):
|
|
43
|
+
|
|
44
|
+
| Propriedade | Observação |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `quarkus.http.test-port`, `quarkus.http.test-ssl-port` | `0` |
|
|
47
|
+
| `quarkus.hibernate-orm.database.generation` | `drop-and-create` (schema pelo Hibernate nos testes) |
|
|
48
|
+
| `quarkus.flyway.migrate-at-start` | `false` |
|
|
49
|
+
| `quarkus.datasource.devservices.image-name` | `postgres:16-alpine` |
|
|
50
|
+
| `seedgrid.audit.persistence.strategy` | `JPA` (exigido pelo security transitivo) |
|
|
51
|
+
| `seedgrid.security.default-company.cnpj` / `.corporate-name` / `.trade-name` | dados fictícios |
|
|
52
|
+
| 🔒 `seedgrid.security.encryption.key` | `<SEGREDO:security-encryption-key>` (valor de teste não copiado) |
|
|
53
|
+
| `quarkus.arc.exclude-types` | exclui `FirstAdminBootstrapService` |
|
|
54
|
+
|
|
55
|
+
Nenhuma propriedade `seedgrid.apikeys.*` é definida nos testes (usam os padrões).
|
|
56
|
+
|
|
57
|
+
## 5. Aliases, obsoletas, renomeações
|
|
58
|
+
|
|
59
|
+
- Nenhum alias. O header (`x-api-key`) e o prefixo das chaves (`sgkey_`) são constantes em `ApiKeyConstants`, não propriedades.
|
|
60
|
+
|
|
61
|
+
## 6. Configuração mínima
|
|
62
|
+
|
|
63
|
+
Nenhuma propriedade própria é obrigatória. O host precisa da configuração do [[SeedGrid/Extensions/security/Configuracao|security]] (JWT, datasource etc.) e de executar as migrations `classpath:db/migration/apikeys`.
|
|
64
|
+
|
|
65
|
+
```properties
|
|
66
|
+
# nada obrigatório em seedgrid.apikeys.*
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 7. Configuração completa comentada
|
|
70
|
+
|
|
71
|
+
```properties
|
|
72
|
+
# Caracteres da parte aleatória usados como prefixo de busca (padrão 8).
|
|
73
|
+
# Não altere com chaves já emitidas.
|
|
74
|
+
seedgrid.apikeys.prefix-length=8
|
|
75
|
+
# Bytes aleatórios do corpo da chave (padrão 32 → 43 caracteres Base64 URL-safe).
|
|
76
|
+
seedgrid.apikeys.key-bytes=32
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 8. Receitas
|
|
80
|
+
|
|
81
|
+
- **Chaves mais longas**: aumente `seedgrid.apikeys.key-bytes` (afeta só chaves novas; o prefixo continua com `prefix-length` caracteres).
|
|
82
|
+
- **Desligar a gestão de chaves mas manter a autenticação**: forneça um bean `ApiKeyActivationPolicy` com `isApiKeyManagementEnabled()=false` (não há propriedade). Ver [[SeedGrid/Extensions/apikeys/Exemplos|Exemplos]].
|
|
83
|
+
- **Desligar a autenticação por API key**: o mesmo bean com `isApiKeyAuthEnabled()=false`.
|
|
84
|
+
|
|
85
|
+
## 9. Dúvidas e lacunas
|
|
86
|
+
|
|
87
|
+
- Não há validação de faixa para `prefix-length`/`key-bytes` (valores ≤ 0 não tratados) — Não confirmado o comportamento.
|
|
88
|
+
- Mudança de `prefix-length` com chaves existentes: Inferência de quebra (ver tabela), não testado.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, apikeys, enum]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-apikeys
|
|
4
|
+
branch: main
|
|
5
|
+
commit: bfc9c25877
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# API Keys (Quarkus) — enums
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/apikeys/Visao-geral|Visão geral do apikeys]] · [[SeedGrid/Extensions/apikeys/Configuracao|Configuração]]
|
|
12
|
+
|
|
13
|
+
## Índice
|
|
14
|
+
|
|
15
|
+
| Enum | Pacote/arquivo | Usado em | Público? |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| [[#ApiKeyAuthType]] | `br.com.seedgrid.apikeys.utils` — `runtime/src/main/java/br/com/seedgrid/apikeys/utils/ApiKeyAuthType.java` | `ApiKeyPrincipal#getAuthType()`, atributo `apikey.authType` da `SecurityIdentity` | Sim (tipo de retorno público) |
|
|
18
|
+
|
|
19
|
+
## ApiKeyAuthType
|
|
20
|
+
|
|
21
|
+
FQN: `br.com.seedgrid.apikeys.utils.ApiKeyAuthType`.
|
|
22
|
+
|
|
23
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| `API_KEY` | Identidade autenticada por API key (única constante) | Atribuída fixamente no construtor de `ApiKeyPrincipal`; gravada pelo `ApiKeyIdentityProvider` como atributo `apikey.authType` = `"API_KEY"`; o `RbacSecurityIdentityAugmentor` do security compara esse atributo com a string `"API_KEY"` para **pular** a resolução RBAC (as permissões já vêm como `StringPermission`) | Confirmado |
|
|
26
|
+
|
|
27
|
+
- Não tem campos nem métodos. O enum tem um único valor e é sempre o mesmo: serve de marcador de tipo de credencial.
|
|
28
|
+
- **Serialização**: o atributo da identidade guarda `name()` (string `API_KEY`); não aparece em JSON de endpoint nem é persistido. O contrato com o security é a **string** `"API_KEY"` (sem dependência de classe): renomear a constante quebraria a detecção.
|
|
29
|
+
- Usado em: `ApiKeyPrincipal`, `ApiKeyIdentityProvider`; sem relação com propriedades de [[SeedGrid/Extensions/apikeys/Configuracao|Configuração]].
|
|
30
|
+
|
|
31
|
+
## Internos
|
|
32
|
+
|
|
33
|
+
Nenhum.
|