@trismegisto/spine 2.1.1 → 3.0.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.
Files changed (78) hide show
  1. package/README.md +105 -19
  2. package/fesm2022/trismegisto-spine-audit.mjs +264 -10
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
  5. package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
  6. package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
  7. package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
  8. package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
  9. package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
  10. package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
  11. package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
  12. package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs} +4 -4
  13. package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map} +1 -1
  14. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs} +3 -3
  15. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map} +1 -1
  16. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs → trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs} +123 -27
  17. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
  18. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
  19. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
  20. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
  21. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
  22. package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
  23. package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
  24. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
  25. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
  26. package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
  27. package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
  28. package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
  29. package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
  30. package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
  31. package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
  32. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
  33. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
  34. package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
  35. package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
  36. package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
  37. package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
  38. package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
  39. package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
  40. package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
  41. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  42. package/fesm2022/trismegisto-spine-layout.mjs +1850 -217
  43. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  44. package/fesm2022/trismegisto-spine-shell.mjs +28 -8
  45. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  46. package/fesm2022/trismegisto-spine.mjs +1163 -87
  47. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  48. package/package.json +6 -6
  49. package/types/trismegisto-spine-audit.d.ts +180 -5
  50. package/types/trismegisto-spine-audit.d.ts.map +1 -1
  51. package/types/trismegisto-spine-auto-service.d.ts +100 -7
  52. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  53. package/types/trismegisto-spine-layout.d.ts +885 -22
  54. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  55. package/types/trismegisto-spine-shell.d.ts +11 -2
  56. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  57. package/types/trismegisto-spine.d.ts +496 -34
  58. package/types/trismegisto-spine.d.ts.map +1 -1
  59. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
  60. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
  61. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
  62. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
  63. package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
  64. package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
  65. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
  66. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
  67. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
  68. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
  69. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
  70. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
  71. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
  72. package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
  73. package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
  74. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
  75. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
  76. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
  77. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
  78. package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
package/README.md CHANGED
@@ -51,12 +51,12 @@ export const appConfig: ApplicationConfig = {
51
51
  o tema no `<body>` e usa `clientId` como prefixo de **todas** as chaves salvas (tema, menu lateral, abas):
52
52
  apps diferentes na mesma origem não misturam preferências. Opções: `clientId`, `appName` (nome ao lado do
53
53
  logo no cabeçalho), `logo`, `showAppName` e `favicon` (ver "Logo e favicon" abaixo), `technicalDocs` (mostra a
54
- especificação técnica das telas e o botão "Copiar token de acesso" do painel de configurações; padrão
54
+ especificação técnica das telas e o botão "Copiar token de acesso" da seção Sessões das configurações; padrão
55
55
  `isDevMode()`).
56
56
  - **Recentes, buscas recentes e favoritos** ficam no `localStorage` por usuário (`SpineUserStorage`: chave
57
57
  `<clientId>_<lista>_<sub>`, com o `sub` do token). No logout (pelo spine ou vindo de outra aba, via `isAuth$`) os
58
- históricos são apagados; os favoritos ficam. Logout próprio do app: chame `SpineUserStorage.clearHistory()` antes
59
- de `AuthorizationService.logout()`.
58
+ históricos são apagados; os favoritos ficam. Logout próprio do app: use `SpineLogoutService.logout()` (veja
59
+ "Sair (logout)" abaixo).
60
60
  - **`APP_ROUTES`** traz login, callback, saída e as rotas privadas sob o `spine-layout`
61
61
  (`LayoutComponent`). O `/callback` usa o `handleCallback()` do `@orfeu/angular`: confere state/verifier, volta
62
62
  para a URL pedida antes do login e, no `login_required` da reautorização silenciosa, segue sozinho para o login
@@ -84,6 +84,35 @@ export const components: ComponentRoute[] = [
84
84
  ];
85
85
  ```
86
86
 
87
+ ### Sair (logout)
88
+
89
+ Todas as saídas do spine (item "Sair" do menu do perfil, botão "Sair" do painel de configurações, atalho
90
+ `Mod+Shift+L` e a ação da tela `/blocked`) passam pelo **`SpineLogoutService`** (`@trismegisto/spine/layout`). O app não
91
+ precisa de código próprio:
92
+
93
+ - **Falha no Argos** (`@orfeu/angular` 1.3.x: o `logout()` repete uma vez e, falhando de novo, mantém a sessão e emite
94
+ `logoutFailed$`): o serviço assina `logoutFailed$` uma vez e mostra um aviso de erro (`hm-alert` de erro,
95
+ `role="alert"`, pelo `NotificationService`) com `SpineMessages.session.logoutFailed` — "Não foi possível sair agora.
96
+ Verifique a conexão e tente de novo." A pessoa fica na tela, a sessão continua e os botões voltam ao normal para
97
+ tentar de novo. Vale também para um `AuthorizationService.logout()` chamado direto pelo app.
98
+ - **Sucesso**: só então os históricos (recentes e buscas recentes) são apagados; o `@orfeu/angular` navega para o
99
+ `/logoff`. Com falha, nada é apagado.
100
+ - `logout()` devolve `Promise<boolean>` (`true` = saiu; nunca rejeita) e `pending` (signal) fica `true` durante a
101
+ saída: o painel de configurações mostra o botão carregando, o item do menu fica desabilitado e o painel só fecha
102
+ quando a saída deu certo. Cliques repetidos reaproveitam a mesma tentativa.
103
+ - **`@orfeu/angular` 1.0.x** (sem `logoutFailed$`, `logout()` sem retorno): funciona como antes — a saída conta como
104
+ concluída e os históricos saem.
105
+
106
+ Logout num botão do próprio app:
107
+
108
+ ```ts
109
+ const saiu = await inject(SpineLogoutService).logout(); // false: o aviso já apareceu; a pessoa continua aqui
110
+ ```
111
+
112
+ O `spine-layout` também monta os avisos: o `spine-notification` (`NotificationService`) e um `hm-toast-stack`
113
+ (`HermesToastService`, usado nas configurações, inclusive em MFA e Sessões, e no auto-serviço). O app não monta outro; se
114
+ montar, os avisos não aparecem em dobro (só uma pilha desenha).
115
+
87
116
  ## Logo e favicon
88
117
 
89
118
  O spine não traz marca nenhuma: o logo do cabeçalho e o favicon são arquivos do app.
@@ -117,14 +146,71 @@ provideUi({
117
146
  - **Marca em componente:** `{ provide: SPINE_BRAND, useValue: MarcaComponent }` (`@trismegisto/spine/layout`) tem
118
147
  prioridade sobre a imagem (ex.: SVG inline com `currentColor`). Ele fica dentro do link — sem link/botão dentro.
119
148
 
120
- ## Conta e segurança (painel de configurações)
149
+ ## Painel de configurações: seções
150
+
151
+ Aberto pelo menu do perfil, por `Ctrl+,`, por `SpineSettingsService.open(chave)` ou por link com `?settings=<chave>`
152
+ (chaves em `SPINE_SETTINGS_KEYS`, de `@trismegisto/spine/layout`). As seções do app (`provideSettingsSection`) entram
153
+ antes de "Sobre".
154
+
155
+ | Seção | Chave (`?settings=`) | Conteúdo | Quando aparece |
156
+ | --- | --- | --- | --- |
157
+ | Conta | `conta` | Perfil, nível de acesso, Sair | Sempre |
158
+ | MFA | `mfa` | Conta no Argos, verificação em duas etapas, códigos de recuperação | Com `authority` e `realmId` do `AUTH_CONFIG` preenchidos |
159
+ | Sessões | `sessoes` | Token de acesso, Tokens de aplicação, Conectar um agente de IA, Sessões e dispositivos | Sempre (cada linha com a própria condição, abaixo) |
160
+ | Notificações | `notificacoes` | Tipos de aviso do app, aviso do navegador | Com `SpineConfig.features.notices` |
161
+ | Aparência | `aparencia` | Tema, cor, densidade, fonte, menu lateral | Sempre |
162
+ | Região | `regiao` | Idioma, fuso horário | Sempre |
163
+ | Atalhos | `atalhos` | Lista de atalhos, tour guiado | Sempre |
164
+ | Sobre | `sobre` | Aplicação, versão, build, ambiente, links, dependências, informações de suporte | Sempre |
165
+
166
+ Linhas da seção **Sessões**: "Sessão" sempre; "Token de acesso" só com `SpineConfig.technicalDocs` (sem configuração,
167
+ só em `isDevMode()`); "Tokens de aplicação" sempre (sem `SPINE_ADMIN_API` a linha explica que não está disponível);
168
+ "Sessões e dispositivos" só com a API da conta (a mesma condição da seção MFA). Sem nenhuma linha visível, a seção
169
+ não aparece.
170
+
171
+ **Chave antiga**: até a versão 2.1.2 a seção "Conta e segurança" (`seguranca`) reunia MFA e sessões, e "Sessão" e os
172
+ tokens ficavam em "Conta". `?settings=seguranca` (e `SPINE_SETTINGS_KEYS.security`, agora `@deprecated`) abre a seção
173
+ **MFA** (`SPINE_SETTINGS_ALIASES`, `resolveSettingsSection`); sem a API da conta, como qualquer chave sem seção, abre
174
+ a primeira. `?settings=conta` continua abrindo Conta.
175
+
176
+ ## Recursos opcionais do painel (`SpineConfig.features`)
177
+
178
+ Desligados sem configuração; o app liga cada um em `provideUi({ ..., features })`:
179
+
180
+ ```ts
181
+ features: {
182
+ aiAgent: { servers: [{ name: 'hefesto', url: '/hefesto/mcp', label: 'Hefesto', readScopes: 'deploy.*.read', writeScopes: 'deploy.*' }] },
183
+ accountActivity: true,
184
+ idleTimeout: { max: 60 }, // ou true; { min, max } em minutos
185
+ startPage: true,
186
+ defaultBadge: true,
187
+ notices: { types: [{ id: 'deploy-concluido', label: 'Deploy concluído' }] },
188
+ accountPreferences: true,
189
+ }
190
+ ```
121
191
 
122
- A seção **Conta e segurança** do painel (`?settings=seguranca`) gerencia a conta da pessoa no Argos sem sair do app:
123
- **Verificação em duas etapas** (adicionar o aplicativo autenticador com QR Code, adicionar o e-mail, trocar o aparelho,
124
- remover), **Códigos de recuperação** (gerar um lote novo, mostrado uma vez, com copiar e baixar) e **Sessões e
125
- dispositivos** (encerrar uma sessão ou todas as outras; a deste login vem marcada). Antes de qualquer alteração a
126
- pessoa confirma a identidade (senha, código do autenticador, código no e-mail cadastrado ou código de recuperação); o
127
- Argos guarda essa prova por 5 minutos.
192
+ | Recurso | Onde | O que faz | Depende de |
193
+ | --- | --- | --- | --- |
194
+ | `aiAgent` | Sessões › Conectar um agente de IA | Cria um token de aplicação pessoal (`x-app-token`) e mostra, uma única vez, o `.mcp.json` pronto para o Claude Code com os servidores do app; "Leitura e escrita" põe `writeScopes` em `x-mcp-scopes` (sem isso, `readScopes` ou nenhum header: o MCP já é só leitura). URL relativa vira absoluta pela origem da página. O token nunca vai para o console nem para o storage | `SPINE_ADMIN_API` |
195
+ | `accountActivity` | MFA › Atividade da conta | Entradas e tentativas que falharam desta conta, 90 dias, com IP, navegador, aplicativo, método e motivo; filtro "Só falhas" e "Carregar mais" | API da conta (`GET /activity`) |
196
+ | `idleTimeout` | Conta › Encerrar por inatividade | Nunca/5/15/30/60 min; aviso com contagem 60 s antes e saída pelo `SpineLogoutService`. Conta a atividade de todas as abas. `{ min, max }` limitam a escolha (com `max`, "Nunca" some) | — |
197
+ | `startPage` | Conta › Tela inicial | Início, última tela visitada ou um favorito, aplicada no `/callback` quando o login não pediu outra URL | — |
198
+ | `defaultBadge` | Conta › Crachá padrão | Crachá com que o login entra nesta aplicação, guardado no Argos (vale em qualquer navegador); aparece com mais de um crachá | API da conta (`GET/PUT /badges`) |
199
+ | `notices` | Notificações (`?settings=notificacoes`) | Liga/desliga cada tipo de aviso que o app declara e o aviso do navegador (Notification API, pede a permissão) quando a aba está em segundo plano. O app emite com `SpineNoticesService.notify(tipo, { title, body?, url?, intent? })` | — |
200
+ | `accountPreferences` | Dados do navegador › Preferências na conta | Espelha no Argos (`GET/PUT /preferences`, por usuário e aplicação, até 16 KB) tema, cor, densidade, fonte, menu lateral, idioma, fuso, relógio, semana, texto, animações, atalhos, inatividade, tela inicial, avisos e favoritos: lê e aplica no login, soma os favoritos, grava agrupado. As telas Aparência, Região etc. continuam iguais; sem a API (ou com Argos sem o endpoint) fica só no navegador | API da conta |
201
+
202
+ Serviços (todos de `@trismegisto/spine/layout`): `SpineIdleService`, `SpineStartPageService`, `SpineNoticesService`,
203
+ `SpineAccountPreferencesService`; preferências novas no `SpinePreferencesService` (`idleMinutes`, `startPage`,
204
+ `noticeTypes`, `browserNotices`).
205
+
206
+ ## MFA e Sessões (API da conta do Argos)
207
+
208
+ A seção **MFA** (`?settings=mfa`) gerencia a conta da pessoa no Argos sem sair do app: **Verificação em duas etapas**
209
+ (adicionar o aplicativo autenticador com QR Code, adicionar o e-mail, trocar o aparelho, remover) e **Códigos de
210
+ recuperação** (gerar um lote novo, mostrado uma vez, com copiar e baixar). Na seção **Sessões** (`?settings=sessoes`),
211
+ a linha **Sessões e dispositivos** encerra uma sessão ou todas as outras (a deste login vem marcada). Antes de
212
+ qualquer alteração de MFA a pessoa confirma a identidade (senha, código do autenticador, código no e-mail cadastrado
213
+ ou código de recuperação); o Argos guarda essa prova por 5 minutos.
128
214
 
129
215
  - **API**: a área da conta do Argos com Bearer, `{authority}/api/realms/{realmId}/account/*` (`security`, `reauth`,
130
216
  `mfa/*`, `recovery-codes`, `sessions`), com o access token da sessão do `@orfeu/angular` no `Authorization` — o
@@ -132,9 +218,9 @@ Argos guarda essa prova por 5 minutos.
132
218
  a sessão pelo `sid` do token. Token vencido renova uma vez e repete.
133
219
  - **Configuração**: nenhuma além do `provideAuth`. A origem do app precisa estar nas `redirect_uris` do client no
134
220
  Argos (é o que o CORS do Argos libera — o login já exige isso). Sem `authority`/`realmId` (ou com `CHANGE_ME`) a
135
- seção não aparece.
221
+ seção MFA e a linha "Sessões e dispositivos" não aparecem.
136
222
  - **Versão do Argos**: precisa da área da conta por Bearer (`/realms/{realm}/account`). Num Argos anterior a seção
137
- mostra o erro de carregamento.
223
+ MFA e a linha de sessões mostram o erro de carregamento.
138
224
  - A mesma API sai de `SpineAccountSecurityService` / `argosAccountApi(authority, realm)` (`@trismegisto/spine/layout`),
139
225
  para outra tela do app.
140
226
 
@@ -145,12 +231,12 @@ Argos guarda essa prova por 5 minutos.
145
231
  | `@trismegisto/spine` | `provideUi`, `SpineConfig`, `ThemeService`, `DensityService`, `SpinePreferencesService`, `provideSpineNews`, textos (`SPINE_MESSAGES`, `provideSpineMessages`) |
146
232
  | `@trismegisto/spine/shell` | `APP_ROUTES`, `PUBLIC_ROUTES`, `PRIVATE_ROUTES`, `provideShell`, telas de login e de estado |
147
233
  | `@trismegisto/spine/routing` | `ComponentRoute`, `COMPONENT_ROUTES`, `ViewGuard`, `RouteIdInterceptor`, resolução de rota |
148
- | `@trismegisto/spine/layout` | `LayoutComponent` (`spine-layout`), cabeçalho, menu lateral, onboarding, atalhos, configurações, novidades, documentação |
234
+ | `@trismegisto/spine/layout` | `LayoutComponent` (`spine-layout`), cabeçalho, menu lateral, onboarding, atalhos, configurações, novidades, documentação, `SpineLogoutService` |
149
235
  | `@trismegisto/spine/modal` | `ModalService` (`open(config)` devolve um `Observable` com o resultado), `ModalContent` |
150
236
  | `@trismegisto/spine/side-panel` | `SidePanelService`, `SidePanelContent` |
151
237
  | `@trismegisto/spine/notification` | `NotificationService` (`addNotification`) |
152
- | `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente, auditoria), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. Cada tela já vem com a documentação (manual de uso e especificação técnica, em `AUTO_SERVICE_DOCUMENTS`, também sob demanda) no botão de documentação da página. `AutoServiceService` e o tipo `AutoServiceClient` são exportados |
153
- | `@trismegisto/spine/audit` | A tela de Auditoria (`SpineAuditComponent`, `spine-audit`), a mesma para o painel central (`scope="admin"`) e o auto-serviço (`scope="client"`), + `SpineAuditService` e os tipos/funções puras (`AuditEvent`, `AuditQuery`, `buildAuditQuery`, `auditApiBase`…). **Exporta o componente: importe só de código lazy** |
238
+ | `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente e, no menu Auditoria, ações e tentativas de login), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. Cada tela já vem com a documentação (manual de uso e especificação técnica, em `AUTO_SERVICE_DOCUMENTS`, também sob demanda) no botão de documentação da página. `AutoServiceService` (com os tipos de grupo `AutoServiceGroup`, `AutoServiceGroupType`, `AutoServiceGroupCreate`, `AutoServiceGroupUpdate`) e o tipo `AutoServiceClient` são exportados |
239
+ | `@trismegisto/spine/audit` | As telas de auditoria — Ações (`SpineAuditComponent`, `spine-audit`) e Tentativas de login (`SpineLoginAttemptsComponent`, `spine-login-attempts`) —, as mesmas para o painel central (`scope="admin"`) e o auto-serviço (`scope="client"`), + `SpineAuditService` e os tipos/funções puras (`AuditEvent`, `AuditQuery`, `buildAuditQuery`, `auditApiBase`…). **Exporta o componente: importe só de código lazy** |
154
240
  | `@trismegisto/spine/graphql` | `provideGraphql({ endpoints })`: um cliente Apollo nomeado por backend |
155
241
 
156
242
  ## Auditoria (`@trismegisto/spine/audit`)
@@ -171,10 +257,10 @@ component: async () => (await import('./admin-audit-page.component')).AdminAudit
171
257
  // …e no template da página: <spine-audit scope="admin" [adminApi]="environment.adminApi" />
172
258
  ```
173
259
 
174
- - **No auto-serviço:** aba **Auditoria** na página de Aplicações (`import('@trismegisto/spine/audit')` só ao abrir
175
- a aba) e página própria ligada a `AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID` (`ad100004-…`), que aparece no menu
176
- "Administração" quando o template `auto-service` do banco tiver esse router. O app não configura nada além do
177
- `provideAutoService`.
260
+ - **No auto-serviço:** menu **Auditoria** (dentro de "Administração", no template `auto-service` do argos) com duas
261
+ páginas: **Ações** (`AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID`, `ad100004-…`, esta tela) e **Tentativas de login**
262
+ (`AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID`, `ad100005-…`, `SpineLoginAttemptsComponent` com
263
+ `scope="client"`, `GET /auto-service/:clientId/attempts`). O app não configura nada além do `provideAutoService`.
178
264
  - **Conteúdo:** período rápido (1h/6h/24h/7d/30d; as datas da faixa de filtros vencem), "Atualizar" + atualização
179
265
  automática opcional (30 s), filtros (datas, aplicação — multisseleção —, usuário, operação, método, resultado, só
180
266
  ações do usuário, nível, permissão, tipo de ator, status HTTP, trace, ID do usuário; filtros salvos por escopo),