@seedgrid/ai-toolkit 0.0.0-stage → 0.3.1

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.
Files changed (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -2
  3. package/dist/adapters/claude.js +114 -0
  4. package/dist/adapters/codex.js +108 -0
  5. package/dist/adapters/index.js +17 -0
  6. package/dist/adapters/shared.js +142 -0
  7. package/dist/adapters/types.js +1 -0
  8. package/dist/cli.js +209 -0
  9. package/dist/commands/common.js +98 -0
  10. package/dist/commands/doctor.js +290 -0
  11. package/dist/commands/init.js +9 -0
  12. package/dist/commands/install.js +107 -0
  13. package/dist/commands/remove.js +54 -0
  14. package/dist/commands/review.js +127 -0
  15. package/dist/commands/selfinstall.js +63 -0
  16. package/dist/commands/status.js +73 -0
  17. package/dist/commands/update.js +8 -0
  18. package/dist/commands/validate.js +27 -0
  19. package/dist/core/apply.js +181 -0
  20. package/dist/core/blocks.js +64 -0
  21. package/dist/core/content.js +528 -0
  22. package/dist/core/env.js +40 -0
  23. package/dist/core/frontmatter.js +29 -0
  24. package/dist/core/hash.js +14 -0
  25. package/dist/core/inspect.js +51 -0
  26. package/dist/core/lock.js +124 -0
  27. package/dist/core/paths.js +65 -0
  28. package/dist/core/plan.js +242 -0
  29. package/dist/core/tools.js +62 -0
  30. package/dist/core/types.js +11 -0
  31. package/dist/core/updates.js +121 -0
  32. package/docs/arquitetura.md +80 -0
  33. package/docs/compatibilidade.md +50 -0
  34. package/docs/formato.md +155 -0
  35. package/docs/instalacao.md +105 -0
  36. package/docs/manutencao.md +115 -0
  37. package/package.json +43 -4
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  39. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  40. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  44. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  50. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  56. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  62. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  68. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  70. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  76. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  80. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  84. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  89. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  95. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  99. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  105. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  110. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  116. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  118. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  124. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  130. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  136. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  137. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  190. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  196. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  199. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  204. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  220. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  223. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  224. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  225. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  226. 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.