@trismegisto/spine 2.1.2 → 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.
- package/README.md +74 -17
- package/fesm2022/trismegisto-spine-audit.mjs +264 -10
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
- package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +1698 -156
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +17 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +1157 -85
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +180 -5
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts +100 -7
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +833 -13
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +8 -0
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +491 -32
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ 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"
|
|
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
|
|
@@ -110,7 +110,7 @@ const saiu = await inject(SpineLogoutService).logout(); // false: o aviso já ap
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
O `spine-layout` também monta os avisos: o `spine-notification` (`NotificationService`) e um `hm-toast-stack`
|
|
113
|
-
(`HermesToastService`, usado nas configurações, em
|
|
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
114
|
montar, os avisos não aparecem em dobro (só uma pilha desenha).
|
|
115
115
|
|
|
116
116
|
## Logo e favicon
|
|
@@ -146,14 +146,71 @@ provideUi({
|
|
|
146
146
|
- **Marca em componente:** `{ provide: SPINE_BRAND, useValue: MarcaComponent }` (`@trismegisto/spine/layout`) tem
|
|
147
147
|
prioridade sobre a imagem (ex.: SVG inline com `currentColor`). Ele fica dentro do link — sem link/botão dentro.
|
|
148
148
|
|
|
149
|
-
##
|
|
149
|
+
## Painel de configurações: seções
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
+
```
|
|
191
|
+
|
|
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.
|
|
157
214
|
|
|
158
215
|
- **API**: a área da conta do Argos com Bearer, `{authority}/api/realms/{realmId}/account/*` (`security`, `reauth`,
|
|
159
216
|
`mfa/*`, `recovery-codes`, `sessions`), com o access token da sessão do `@orfeu/angular` no `Authorization` — o
|
|
@@ -161,9 +218,9 @@ Argos guarda essa prova por 5 minutos.
|
|
|
161
218
|
a sessão pelo `sid` do token. Token vencido renova uma vez e repete.
|
|
162
219
|
- **Configuração**: nenhuma além do `provideAuth`. A origem do app precisa estar nas `redirect_uris` do client no
|
|
163
220
|
Argos (é o que o CORS do Argos libera — o login já exige isso). Sem `authority`/`realmId` (ou com `CHANGE_ME`) a
|
|
164
|
-
seção não
|
|
221
|
+
seção MFA e a linha "Sessões e dispositivos" não aparecem.
|
|
165
222
|
- **Versão do Argos**: precisa da área da conta por Bearer (`/realms/{realm}/account`). Num Argos anterior a seção
|
|
166
|
-
|
|
223
|
+
MFA e a linha de sessões mostram o erro de carregamento.
|
|
167
224
|
- A mesma API sai de `SpineAccountSecurityService` / `argosAccountApi(authority, realm)` (`@trismegisto/spine/layout`),
|
|
168
225
|
para outra tela do app.
|
|
169
226
|
|
|
@@ -178,8 +235,8 @@ Argos guarda essa prova por 5 minutos.
|
|
|
178
235
|
| `@trismegisto/spine/modal` | `ModalService` (`open(config)` devolve um `Observable` com o resultado), `ModalContent` |
|
|
179
236
|
| `@trismegisto/spine/side-panel` | `SidePanelService`, `SidePanelContent` |
|
|
180
237
|
| `@trismegisto/spine/notification` | `NotificationService` (`addNotification`) |
|
|
181
|
-
| `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente,
|
|
182
|
-
| `@trismegisto/spine/audit` |
|
|
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** |
|
|
183
240
|
| `@trismegisto/spine/graphql` | `provideGraphql({ endpoints })`: um cliente Apollo nomeado por backend |
|
|
184
241
|
|
|
185
242
|
## Auditoria (`@trismegisto/spine/audit`)
|
|
@@ -200,10 +257,10 @@ component: async () => (await import('./admin-audit-page.component')).AdminAudit
|
|
|
200
257
|
// …e no template da página: <spine-audit scope="admin" [adminApi]="environment.adminApi" />
|
|
201
258
|
```
|
|
202
259
|
|
|
203
|
-
- **No auto-serviço:**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
`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`.
|
|
207
264
|
- **Conteúdo:** período rápido (1h/6h/24h/7d/30d; as datas da faixa de filtros vencem), "Atualizar" + atualização
|
|
208
265
|
automática opcional (30 s), filtros (datas, aplicação — multisseleção —, usuário, operação, método, resultado, só
|
|
209
266
|
ações do usuário, nível, permissão, tipo de ator, status HTTP, trace, ID do usuário; filtros salvos por escopo),
|