corisco 1.3.11-hml → 1.7.0-hml
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 +275 -359
- package/dist/corisco.es.js +77603 -22912
- package/dist/corisco.umd.js +58290 -144
- package/dist/pdf.worker.js +58159 -0
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -1,428 +1,344 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Corisco - Módulo de Extração e Integração de Dados
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
O Corisco é uma biblioteca JavaScript desacoplada, projetada para ser injetada em páginas web e atuar como um *content script* inteligente. Sua principal responsabilidade é identificar o contexto da página, carregar ferramentas de extração específicas e fornecer uma interface para a captura de dados, que são então enviados para sistemas externos, como o ChatJT.
|
|
4
4
|
|
|
5
|
-
## Arquitetura
|
|
5
|
+
## Arquitetura Desacoplada
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
A arquitetura do Corisco foi desenhada para ser modular e flexível, separando a lógica de extração da extensão de navegador.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- **Extensão de Navegador**: Atua como um carregador. Sua única função é injetar o script `corisco.umd.js` nas páginas permitidas.
|
|
10
|
+
- **Corisco (`corisco.umd.js`)**: É o cérebro da operação. Uma vez injetado, ele:
|
|
11
|
+
1. Analisa a URL atual.
|
|
12
|
+
2. Consulta o arquivo de configuração (`config.ts`) para determinar qual ferramenta (ex: `pje`) é apropriada para o host.
|
|
13
|
+
3. Carrega o gerenciador da ferramenta (ex: `PJeManager`).
|
|
14
|
+
4. O gerenciador inicializa a UI e as ações de extração disponíveis para aquela página.
|
|
10
15
|
|
|
11
16
|
```mermaid
|
|
12
17
|
graph TD
|
|
13
|
-
subgraph
|
|
14
|
-
A[
|
|
15
|
-
B --> C[ChatJT Iframe]
|
|
18
|
+
subgraph "Extensão de Navegador"
|
|
19
|
+
A[Content Script]
|
|
16
20
|
end
|
|
17
21
|
|
|
18
|
-
subgraph PJe
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
D
|
|
22
|
+
subgraph "Página Web (ex: PJe)"
|
|
23
|
+
B(corisco.umd.js)
|
|
24
|
+
C{"Ferramenta <br/> (ex: PJeManager)"}
|
|
25
|
+
D[UI e Iframe]
|
|
22
26
|
end
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
H --> C
|
|
30
|
-
I --> C
|
|
31
|
-
J --> C
|
|
32
|
-
end
|
|
33
|
-
|
|
27
|
+
|
|
28
|
+
A -- Injeta --> B
|
|
29
|
+
B -- Analisa URL e carrega --> C
|
|
30
|
+
C -- Controla --> D
|
|
31
|
+
C -- Extrai dados de --> E[DOM da Página]
|
|
32
|
+
D -- Envia dados para --> F["Serviço Externo (ChatJT)"]
|
|
34
33
|
```
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
## Utilização e Build
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
sequenceDiagram
|
|
40
|
-
participant User as Usuário
|
|
41
|
-
participant Page as Página PJe
|
|
42
|
-
participant CS as Content Script
|
|
43
|
-
participant PJeTool as Módulos PJe
|
|
44
|
-
participant Iframe as ChatJT Iframe
|
|
45
|
-
|
|
46
|
-
Page->>CS: Carrega página
|
|
47
|
-
CS->>PJeTool: Scripts são injetados (manifest.json)
|
|
48
|
-
PJeTool->>PJeTool: pje-document.js inicializa módulos
|
|
49
|
-
PJeTool->>Page: Observa mudanças no DOM
|
|
50
|
-
|
|
51
|
-
User->>Page: Navega para um documento
|
|
52
|
-
PJeTool->>PJeTool: Detecta e captura documento
|
|
53
|
-
PJeTool->>Iframe: Envia dados via postMessage
|
|
54
|
-
|
|
55
|
-
User->>Page: Seleciona documentos na timeline
|
|
56
|
-
User->>Iframe: Clica em "Anexar Selecionados"
|
|
57
|
-
Iframe->>PJeTool: Solicita extração
|
|
58
|
-
PJeTool->>Iframe: Envia documentos capturados
|
|
59
|
-
```
|
|
37
|
+
O Corisco é construído como um bundle UMD (Universal Module Definition), o que permite que ele seja facilmente injetado e executado em qualquer ambiente de navegador.
|
|
60
38
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
```text
|
|
64
|
-
chat-jt-extensao/
|
|
65
|
-
├── manifest.json # Configuração da extensão
|
|
66
|
-
├── config.js # Configurações centralizadas
|
|
67
|
-
├── content.js # Script principal injetado
|
|
68
|
-
├── popup/ # Interface do popup
|
|
69
|
-
├── tools/ # Módulos de captura PJe
|
|
70
|
-
│ └── pje
|
|
71
|
-
│ ├── main.js # Gerenciador principal
|
|
72
|
-
│ ├── pje-current-document.js # Captura documento atual
|
|
73
|
-
│ ├── pje-selected-documents.js # Captura documentos selecionados
|
|
74
|
-
│ └── pje-timeline.js # Extração da timeline
|
|
75
|
-
├── public/ # Assets (ícones, etc.)
|
|
76
|
-
└── styles/ # Estilos CSS
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Módulos Principais
|
|
80
|
-
|
|
81
|
-
### 1. Main (Gerenciador Principal)
|
|
82
|
-
|
|
83
|
-
- **Responsabilidade**: Coordena todos os módulos e gerencia comunicação
|
|
84
|
-
- **Funcionalidades**:
|
|
85
|
-
- Inicialização dos módulos especializados
|
|
86
|
-
- Distribuição de mensagens entre módulos
|
|
87
|
-
- Métodos comuns (extração de IDs, download de PDFs, etc.)
|
|
88
|
-
|
|
89
|
-
### 2. PJeCurrentDocumentCapture
|
|
90
|
-
|
|
91
|
-
- **Responsabilidade**: Captura do documento atualmente visualizado
|
|
92
|
-
- **Funcionalidades**:
|
|
93
|
-
- Detecção automática de documentos
|
|
94
|
-
- Captura de PDFs via API
|
|
95
|
-
- Fallback para captura como TXT
|
|
96
|
-
- Observação de mudanças no DOM
|
|
97
|
-
|
|
98
|
-
### 3. PJeSelectedDocuments
|
|
99
|
-
|
|
100
|
-
- **Responsabilidade**: Captura de múltiplos documentos selecionados
|
|
101
|
-
- **Funcionalidades**:
|
|
102
|
-
- Detecção de documentos marcados/selecionados
|
|
103
|
-
- Captura em lote
|
|
104
|
-
- Identificação por cor de fundo e classes CSS
|
|
105
|
-
|
|
106
|
-
### 4. PJeTimeline
|
|
107
|
-
|
|
108
|
-
- **Responsabilidade**: Extração da timeline do processo
|
|
109
|
-
- **Funcionalidades**:
|
|
110
|
-
- Mapeamento de documentos na timeline
|
|
111
|
-
- Correlação entre IDs alfanuméricos e numéricos
|
|
112
|
-
- Extração de metadados dos documentos
|
|
113
|
-
|
|
114
|
-
## Configuração
|
|
115
|
-
|
|
116
|
-
### config.js
|
|
117
|
-
|
|
118
|
-
Este arquivo centraliza todas as configurações da extensão:
|
|
119
|
-
|
|
120
|
-
```javascript
|
|
121
|
-
window.EXTENSION_CONFIG = {
|
|
122
|
-
// Configurações da aplicação
|
|
123
|
-
app: {
|
|
124
|
-
name: 'ChatJT', // Nome da extensão
|
|
125
|
-
version: '1.0', // Versão
|
|
126
|
-
iframe_url: 'http://localhost:3000/chat', // URL do ChatJT
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
// Configurações da interface
|
|
130
|
-
ui: {
|
|
131
|
-
panel: {
|
|
132
|
-
min_width: 520, // Largura mínima do painel
|
|
133
|
-
max_width_ratio: 0.5, // Máximo 50% da tela
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
|
|
137
|
-
// Assets da extensão
|
|
138
|
-
assets: {
|
|
139
|
-
icon: 'public/logo-white-128.png', // Ícone principal
|
|
140
|
-
chevron: 'public/chevron-right.svg', // Ícone de seta
|
|
141
|
-
},
|
|
142
|
-
|
|
143
|
-
// Configurações de desenvolvimento
|
|
144
|
-
development: {
|
|
145
|
-
debug: true, // Habilita logs
|
|
146
|
-
log_level: 1, // Nível de detalhamento (1-3)
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
```
|
|
39
|
+
### Instalação
|
|
150
40
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
- **`app.iframe_url`**: URL do ChatJT (altere para produção)
|
|
154
|
-
- **`ui.panel.min_width`**: Largura mínima do painel lateral
|
|
155
|
-
- **`ui.panel.max_width_ratio`**: Proporção máxima da tela
|
|
156
|
-
- **`development.debug`**: Habilita/desabilita logs no console
|
|
157
|
-
- **`development.log_level`**: Controla verbosidade dos logs (1=básico, 2=detalhado, 3=verbose)
|
|
158
|
-
|
|
159
|
-
### manifest.json
|
|
160
|
-
|
|
161
|
-
Arquivo de configuração principal da extensão Chrome:
|
|
162
|
-
|
|
163
|
-
```json
|
|
164
|
-
{
|
|
165
|
-
"manifest_version": 3,
|
|
166
|
-
"name": "ChatJT",
|
|
167
|
-
"version": "1.0",
|
|
168
|
-
"description": "Extensão ChatJT para captura de documentos PJe",
|
|
169
|
-
|
|
170
|
-
"permissions": ["storage", "tabs", "activeTab"],
|
|
171
|
-
|
|
172
|
-
"host_permissions": [
|
|
173
|
-
"https://pje-hml.trt19.jus.br/*", // Hosts permitidos
|
|
174
|
-
"https://pje.trt19.jus.br/*"
|
|
175
|
-
],
|
|
176
|
-
|
|
177
|
-
"content_scripts": [
|
|
178
|
-
{
|
|
179
|
-
"matches": ["https://*.jus.br/*"],
|
|
180
|
-
"css": ["style.css"],
|
|
181
|
-
"js": [
|
|
182
|
-
"config.js",
|
|
183
|
-
"utils.js",
|
|
184
|
-
"tools/pje/main.js",
|
|
185
|
-
"tools/pje/pje-current-document.js",
|
|
186
|
-
"tools/pje/pje-selected-documents.js",
|
|
187
|
-
"tools/pje/pje-timeline.js",
|
|
188
|
-
"content.js"
|
|
189
|
-
]
|
|
190
|
-
}
|
|
191
|
-
],
|
|
192
|
-
|
|
193
|
-
"web_accessible_resources": [
|
|
194
|
-
{
|
|
195
|
-
"resources": ["public/*"],
|
|
196
|
-
"matches": ["https://*.jus.br/*"]
|
|
197
|
-
}
|
|
198
|
-
]
|
|
199
|
-
}
|
|
200
|
-
```
|
|
41
|
+
1. **Clone o repositório**: `git clone <url-do-repositorio>`
|
|
42
|
+
2. **Instale as dependências**: `npm install`
|
|
201
43
|
|
|
202
|
-
|
|
44
|
+
### Build
|
|
203
45
|
|
|
204
|
-
|
|
46
|
+
Para compilar o projeto, utilize os comandos de build do Vite. O resultado será um arquivo `corisco.umd.js` na pasta `dist`.
|
|
205
47
|
|
|
206
|
-
|
|
207
|
-
"host_permissions": [
|
|
208
|
-
"https://pje-hml.trt19.jus.br/*",
|
|
209
|
-
"https://pje.trt19.jus.br/*",
|
|
210
|
-
"https://pje.trt1.jus.br/*" // Novo host
|
|
211
|
-
]
|
|
212
|
-
```
|
|
48
|
+
- **Build de Desenvolvimento**:
|
|
213
49
|
|
|
214
|
-
|
|
50
|
+
```bash
|
|
51
|
+
npm run build:dev
|
|
52
|
+
```
|
|
215
53
|
|
|
216
|
-
|
|
54
|
+
- **Build de Homologação**:
|
|
217
55
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
56
|
+
```bash
|
|
57
|
+
npm run build:hml
|
|
58
|
+
```
|
|
221
59
|
|
|
222
|
-
|
|
223
|
-
ChatJTLog.info('Mensagem básica');
|
|
224
|
-
ChatJTLog.detail('Informação detalhada');
|
|
225
|
-
ChatJTLog.verbose('Informação muito detalhada');
|
|
226
|
-
ChatJTLog.warn('Aviso');
|
|
227
|
-
ChatJTLog.error('Erro');
|
|
228
|
-
```
|
|
60
|
+
- **Build de Produção**:
|
|
229
61
|
|
|
230
|
-
|
|
62
|
+
```bash
|
|
63
|
+
npm run build:prd
|
|
64
|
+
```
|
|
231
65
|
|
|
232
|
-
|
|
66
|
+
O arquivo gerado pode ser injetado pela extensão do navegador ou diretamente em uma página HTML, utilizando a tag `<script>`.
|
|
233
67
|
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
68
|
+
```html
|
|
69
|
+
<!-- Inclui o Corisco -->
|
|
70
|
+
<script src="caminho/para/corisco.umd.js"></script>
|
|
71
|
+
|
|
72
|
+
<!-- Inicializa Corisco -->
|
|
73
|
+
<script>
|
|
74
|
+
document.addEventListener('DOMContentLoaded', async function() {
|
|
75
|
+
try {
|
|
76
|
+
// Aguarda Corisco estar disponível
|
|
77
|
+
if (window.Corisco) {
|
|
78
|
+
console.log('Iniciando Corisco...');
|
|
79
|
+
await window.Corisco.start();
|
|
80
|
+
console.log('Corisco iniciado com sucesso na versão ' + window.Corisco.getVersion());
|
|
81
|
+
|
|
82
|
+
window.Corisco.toggleShowUi('unmapped', true); // Habilita UI para ações não mapeadas
|
|
83
|
+
window.Corisco.toggleShowUi('mapped', true); // Habilita UI para ações mapeadas
|
|
84
|
+
} else {
|
|
85
|
+
console.error('Corisco não foi carregado!');
|
|
86
|
+
}
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error('Erro ao iniciar Corisco:', error);
|
|
89
|
+
}
|
|
239
90
|
});
|
|
91
|
+
</script>
|
|
240
92
|
|
|
241
|
-
// Tipos de mensagens suportadas
|
|
242
|
-
DOCUMENT_EXTRACTED; // Documento capturado
|
|
243
|
-
DOCUMENT_DETECTED; // Documento detectado
|
|
244
|
-
DOCUMENT_REMOVED; // Documento removido
|
|
245
|
-
SELECTED_DOCUMENTS_EXTRACTED; // Documentos selecionados
|
|
246
|
-
TIMELINE_DATA_EXTRACTED; // Timeline extraída
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
## Instalação e Desenvolvimento
|
|
250
|
-
|
|
251
|
-
1. **Clone o repositório**
|
|
252
|
-
2. **Configure o ambiente**:
|
|
253
|
-
- Altere os config.[env].ts dentro de `src/config/` conforme necessário
|
|
254
|
-
- Ajuste manifest.json para os hosts desejados
|
|
255
|
-
3. **Instale as dependências**
|
|
256
|
-
- Execute `npm install` (é necessário ter o Node.js instalado)
|
|
257
|
-
4. **Faça o build da extensão em Desenvolvimento**
|
|
258
|
-
- Execute `npm run build:dev` para gerar os arquivos necessários em `dist/`
|
|
259
|
-
5. **Carregue no Chrome**:
|
|
260
|
-
- Abra `chrome://extensions/`
|
|
261
|
-
- Ative "Modo desenvolvedor"
|
|
262
|
-
- Clique em "Carregar extensão sem compactação"
|
|
263
|
-
- Selecione a pasta `dist/`
|
|
264
|
-
|
|
265
|
-
### Versionamento automático
|
|
266
|
-
|
|
267
|
-
Para atualizar a versão automaticamente, utilize o comando `npm run bump` com os parâmetros desejados:
|
|
268
|
-
|
|
269
|
-
```bash
|
|
270
|
-
# Para aumentar a versão patch 0.0.+1
|
|
271
|
-
npm run bump:patch
|
|
272
|
-
|
|
273
|
-
# Para aumentar a versão minor 0.+1.0
|
|
274
|
-
npm run bump:minor
|
|
275
|
-
|
|
276
|
-
# Para aumentar a versão major +1.0.0
|
|
277
|
-
npm run bump:major
|
|
278
|
-
|
|
279
|
-
# Para designar uma versão específica
|
|
280
|
-
npm run bump -- 1.2.3
|
|
281
93
|
```
|
|
282
94
|
|
|
283
|
-
|
|
95
|
+
## Ferramentas Disponíveis
|
|
284
96
|
|
|
285
|
-
|
|
97
|
+
Atualmente, o Corisco possui as seguintes ferramentas implementadas:
|
|
286
98
|
|
|
287
|
-
|
|
99
|
+
- **[PJe](./src/tools/pje/README.md)**: Ferramenta para extração de dados do sistema PJe.
|
|
100
|
+
- **Exemplo**: Ferramenta de demonstração.
|
|
288
101
|
|
|
289
|
-
|
|
102
|
+
## Como Adicionar uma Nova Ferramenta de Extração
|
|
290
103
|
|
|
291
|
-
|
|
104
|
+
Adicionar suporte a um novo site ou sistema (uma "ferramenta") envolve 4 passos principais. Vamos usar como exemplo a criação de uma ferramenta chamada `exemplo`.
|
|
292
105
|
|
|
293
|
-
|
|
106
|
+
### Passo 1: Criar o Gerenciador da Ferramenta (`ExemploManager`)
|
|
294
107
|
|
|
295
|
-
|
|
108
|
+
Crie uma nova pasta em `src/tools/`, como `src/tools/exemplo/`, e dentro dela, o arquivo `manager.ts`. Este arquivo conterá a classe principal da sua ferramenta.
|
|
296
109
|
|
|
297
|
-
|
|
110
|
+
```typescript
|
|
111
|
+
// src/tools/exemplo/manager.ts
|
|
298
112
|
|
|
299
|
-
|
|
113
|
+
import logger from '../../lib/logger';
|
|
114
|
+
import type { IAction, IMessagePayload } from '../../types/messages.types';
|
|
115
|
+
import { MessageHandler } from '../../lib/messages';
|
|
116
|
+
import { MESSAGE_SOURCES } from '../../types/messages.types';
|
|
117
|
+
import { compareVersions } from '../../lib/helpers';
|
|
300
118
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
119
|
+
export class ExemploManager extends MessageHandler{
|
|
120
|
+
private static instance: ExemploManager;
|
|
121
|
+
actions!: IAction[];
|
|
304
122
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
123
|
+
private constructor(version?: string, actions?: IAction[]) {
|
|
124
|
+
if (ExemploManager.instance) {
|
|
125
|
+
logger.warn('ExemploManager já foi inicializado, retornando instância existente');
|
|
126
|
+
return ExemploManager.instance;
|
|
127
|
+
}
|
|
308
128
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
```
|
|
129
|
+
super(MESSAGE_SOURCES.EXTENSION);
|
|
130
|
+
super.set_version(version || '0.0.0');
|
|
312
131
|
|
|
313
|
-
|
|
132
|
+
logger.info(`ExemploManager iniciado - Versão: ${this.get_version()}`);
|
|
314
133
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
134
|
+
this.actions =
|
|
135
|
+
actions?.filter((action) => {
|
|
136
|
+
if (!action.versao_min || !action.versao_max) return false;
|
|
137
|
+
const minOk = compareVersions(this.get_version(), action.versao_min) >= 0;
|
|
138
|
+
const maxOk = compareVersions(this.get_version(), action.versao_max) <= 0;
|
|
318
139
|
|
|
319
|
-
|
|
140
|
+
return minOk && maxOk;
|
|
141
|
+
}) || [];
|
|
320
142
|
|
|
321
|
-
|
|
143
|
+
logger.info(`Actions disponíveis após filtro de versão: ${this.actions.map(a => a.job).join(', ')}`);
|
|
322
144
|
|
|
323
|
-
|
|
145
|
+
// Define esta instância como a instância singleton
|
|
146
|
+
ExemploManager.instance = this;
|
|
324
147
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
npm run bump:patch # ou minor/major
|
|
148
|
+
this.initialize();
|
|
149
|
+
}
|
|
328
150
|
|
|
329
|
-
|
|
330
|
-
|
|
151
|
+
public static getInstance(version: string, actions: IAction[]): ExemploManager {
|
|
152
|
+
if (!ExemploManager.instance) {
|
|
153
|
+
ExemploManager.instance = new ExemploManager(version, actions);
|
|
154
|
+
}
|
|
155
|
+
return ExemploManager.instance;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private initialize() {
|
|
159
|
+
logger.info('Gerenciador de Exemplo inicializado');
|
|
160
|
+
// Lógica de inicialização: adicionar listeners, etc.
|
|
161
|
+
// this.setupMessageListener();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public handlePayload(message: IMessagePayload) {
|
|
165
|
+
// Processa uma mensagem e executa a extração
|
|
166
|
+
if (message.type === 'EXTRACT_EXEMPLO_DATA') {
|
|
167
|
+
this.extractData();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private extractData() {
|
|
172
|
+
// Lógica principal de extração de dados da página
|
|
173
|
+
const data = document.querySelector('h1')?.textContent;
|
|
174
|
+
logger.info('Dados extraídos:', data);
|
|
175
|
+
// Envia os dados extraídos...
|
|
176
|
+
this.sendSuccessMessage('SINGLE_DOCUMENT_EXTRACTED', { document: data });
|
|
177
|
+
// Se houver erro, use:
|
|
178
|
+
// this.sendErrorMessage('EXTRACTION_ERROR', { error: 'Descrição do erro' });
|
|
179
|
+
// Consulte o arquivo lib/messages.ts para mais detalhes sobre envio de mensagens
|
|
180
|
+
// Os tipos de mensagem disponíveis estão em src/types/messages.types.ts
|
|
181
|
+
// SINGLE_DOCUMENT_EXTRACTED ==> envio de documento único extraído
|
|
182
|
+
// MULTIPLE_DOCUMENTS_EXTRACTED ==> envio de múltiplos documentos extraídos
|
|
183
|
+
// METADATA_EXTRACTED ==> envio de metadados extraídos
|
|
184
|
+
// ...
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public destroy() {
|
|
189
|
+
logger.info('Gerenciador de Exemplo destruído');
|
|
190
|
+
// Limpa listeners e remove elementos da UI
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
331
194
|
|
|
332
|
-
|
|
333
|
-
npm publish --registry=https://nexus.trt19.jus.br/repository/npm/
|
|
195
|
+
### Passo 2: Definir os Tipos de Mensagem (`messages.types.ts`)
|
|
334
196
|
|
|
335
|
-
|
|
336
|
-
npm publish --registry=https://registry.npmjs.org/
|
|
197
|
+
Para que o `Iframe` possa solicitar uma extração, você precisa definir um novo tipo de mensagem em `src/types/messages.types.ts`.
|
|
337
198
|
|
|
338
|
-
|
|
199
|
+
Esta mensagem será o gatilho para a ação de extração da sua ferramenta.
|
|
339
200
|
|
|
340
|
-
|
|
201
|
+
```typescript
|
|
202
|
+
// src/types/messages.types.ts
|
|
341
203
|
|
|
342
|
-
|
|
204
|
+
export const MESSAGE_TYPES = {
|
|
205
|
+
// ... outros tipos
|
|
206
|
+
EXTRACT_FULL_PROCESS: 'EXTRACT_FULL_PROCESS',
|
|
343
207
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
npm install --registry=https://nexus.trt19.jus.br/repository/npm/ nome-do-pacote
|
|
208
|
+
// === Ferramenta Exemplo ===
|
|
209
|
+
EXTRACT_EXEMPLO_DATA: 'EXTRACT_EXEMPLO_DATA',
|
|
347
210
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
211
|
+
// === ERRORS ===
|
|
212
|
+
// ... outros tipos
|
|
213
|
+
} as const;
|
|
351
214
|
```
|
|
352
215
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
216
|
+
### Passo 3: Configurar a Ferramenta (`config.ts`)
|
|
217
|
+
|
|
218
|
+
Agora, registre a nova ferramenta em `src/config.ts`. É aqui que você define em quais sites (`allowed_hosts`) a ferramenta deve ser ativada e quais ações (`actions`) ela oferece, utilizando **regex** para correspondência de URLs.
|
|
219
|
+
|
|
220
|
+
No campo mapping, você pode definir padrões de URL para mapear ações específicas.
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
// src/config.ts
|
|
224
|
+
|
|
225
|
+
const EXTENSION_CONFIG = {
|
|
226
|
+
// ...
|
|
227
|
+
action_map: [
|
|
228
|
+
{
|
|
229
|
+
"tool": "pje",
|
|
230
|
+
// ... config do pje
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"tool": "exemplo",
|
|
234
|
+
"allowed_hosts": [
|
|
235
|
+
"/^https?:\\/\\/www\\.exemplo\\.com\\/.*$/"
|
|
236
|
+
],
|
|
237
|
+
"actions": [
|
|
238
|
+
{
|
|
239
|
+
"name": "Extrair Título",
|
|
240
|
+
"description": "Extrai o título principal da página de exemplo.",
|
|
241
|
+
"job": "exemplo-titulo",
|
|
242
|
+
"loading_message": "Extraindo título...",
|
|
243
|
+
"icon_menu": "HEADING_1",
|
|
244
|
+
"message": "EXTRACT_EXEMPLO_DATA", // Mensagem definida no Passo 2
|
|
245
|
+
"auto_capture": false,
|
|
246
|
+
"metadata_capture": false,
|
|
247
|
+
"versao_min": "0.0.0",
|
|
248
|
+
"versao_max": "999.9.9"
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"mapping": {
|
|
252
|
+
"/\\/posts\\/\\d+/": ["exemplo-titulo"]
|
|
253
|
+
},
|
|
254
|
+
"extra_config": {}
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
};
|
|
357
258
|
```
|
|
358
259
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
260
|
+
#### Explicação dos Campos
|
|
261
|
+
|
|
262
|
+
- `tool`: Nome identificador da ferramenta.
|
|
263
|
+
- `allowed_hosts`: Array de expressões regulares que definem os domínios onde a ferramenta será ativada.
|
|
264
|
+
- `actions`: Lista de ações que a ferramenta pode executar, cada uma com suas propriedades.
|
|
265
|
+
- `name`: Nome da ação exibida na UI.
|
|
266
|
+
- `description`: Descrição da ação.
|
|
267
|
+
- `job`: Nome do job associado à ação.
|
|
268
|
+
- `loading_message`: Mensagem exibida durante o carregamento no Chat-JT.
|
|
269
|
+
- `icon_menu`: Ícone associado à ação no menu do Chat-JT.
|
|
270
|
+
- `message`: Mensagem enviada para o iframe.
|
|
271
|
+
- `auto_capture`: Indica se a captura é automática (sem interação do usuário).
|
|
272
|
+
- `metadata_capture`: Indica se é captura de metadados.
|
|
273
|
+
- `versao_min`: Versão mínima da aplicação host necessária para a ação (será confrontada com a versão passada em `Corisco.start('x.y.z')`, se houver).
|
|
274
|
+
- `versao_max`: Versão máxima da aplicação host suportada para a ação.
|
|
275
|
+
|
|
276
|
+
- `mapping`: Define padrões de URL para mapear ações específicas.
|
|
277
|
+
- `extra_config`: Campo para configurações adicionais específicas da ferramenta.
|
|
278
|
+
|
|
279
|
+
‼️ A lista de ícones de menu disponíveis é formada por todos os ícones presentes em `src/lib/components/icons/` do repositório do Chat-JT. Use o nome do arquivo (sem extensão) para definir o `icon_menu`, em caixa alta e separado por "_". Exemplo: `BOOK_TEXT` para o arquivo `BookText.svelte`.
|
|
280
|
+
|
|
281
|
+
### Passo 4: Integrar o Gerenciador no Core (`index.ts`)
|
|
282
|
+
|
|
283
|
+
Finalmente, ensine o Corisco a carregar seu novo `ExemploManager`. No arquivo `src/index.ts`, importe o gerenciador e adicione um `case` no `switch` dentro de `initializeComponents`.
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// src/index.ts
|
|
287
|
+
|
|
288
|
+
// 1. Importe o novo manager
|
|
289
|
+
import { PJeManager } from './tools/pje/manager';
|
|
290
|
+
import { ExemploManager } from './tools/exemplo/manager'; // <-- Adicione aqui
|
|
291
|
+
|
|
292
|
+
class CoriscoContentScript {
|
|
293
|
+
// ...
|
|
294
|
+
private manager: PJeManager | ExemploManager | null = null; // <-- Atualize o tipo
|
|
295
|
+
|
|
296
|
+
// ...
|
|
297
|
+
|
|
298
|
+
async initializeComponents(url: string) {
|
|
299
|
+
// ...
|
|
300
|
+
for (const toolConfig of this.config.action_map) {
|
|
301
|
+
// ...
|
|
302
|
+
if (isHostMatch) {
|
|
303
|
+
// ...
|
|
304
|
+
switch (toolConfig.tool) {
|
|
305
|
+
case 'pje':
|
|
306
|
+
this.manager = PJeManager.getInstance(version, toolConfig.actions);
|
|
307
|
+
break;
|
|
308
|
+
case 'exemplo': // <-- Adicione o case para sua ferramenta
|
|
309
|
+
this.manager = ExemploManager.getInstance(version, toolConfig.actions);
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
logger.warn(`Nenhum gerenciador encontrado para a ferramenta: ${toolConfig.tool}`);
|
|
313
|
+
}
|
|
314
|
+
break;
|
|
385
315
|
}
|
|
386
|
-
} catch (error) {
|
|
387
|
-
console.error('Erro ao iniciar Corisco:', error);
|
|
388
316
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
```javascript
|
|
401
|
-
// Verifica se Corisco está carregado
|
|
402
|
-
console.log('Corisco disponível:', !!window.Corisco);
|
|
403
|
-
|
|
404
|
-
// Verifica se está inicializado
|
|
405
|
-
console.log('Corisco inicializado:', window.Corisco?.isInitialized());
|
|
406
|
-
|
|
407
|
-
// Verifica versão
|
|
408
|
-
console.log('Versão:', window.Corisco?.getVersion());
|
|
317
|
+
// ...
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
public destroy() {
|
|
321
|
+
if (!this.initialized) return;
|
|
322
|
+
this.ui?.destroy();
|
|
323
|
+
this.manager?.destroy(); // O método destroy será chamado polimorficamente
|
|
324
|
+
this.initialized = false;
|
|
325
|
+
}
|
|
326
|
+
// ...
|
|
327
|
+
}
|
|
409
328
|
```
|
|
410
329
|
|
|
411
|
-
|
|
330
|
+
Após seguir esses passos e fazer o build, o Corisco carregará automaticamente a ferramenta `exemplo` quando você navegar para `www.exemplo.com`, e a ação "Extrair Título" aparecerá no menu de anexos do Chat-JT.
|
|
412
331
|
|
|
413
|
-
###
|
|
332
|
+
### Como funciona o fluxo de mensagens
|
|
414
333
|
|
|
415
|
-
|
|
334
|
+
No exemplo acima, ao criar a ação `Extrair Título`, você definiu a mensagem `EXTRACT_EXEMPLO_DATA`. Veja como o fluxo de mensagens funciona:
|
|
416
335
|
|
|
417
|
-
|
|
418
|
-
- Teste a autenticação: `npm whoami --registry=https://nexus.trt19.jus.br/repository/npm/`
|
|
336
|
+
1. **Gatilho da Ação**: Quando o usuário seleciona a ação "Extrair Título" (que será mostrada no menu de anexos do Chat-JT), o iframe envia uma mensagem para o Corisco do tipo `EXTRACT_EXEMPLO_DATA`.
|
|
419
337
|
|
|
420
|
-
**
|
|
338
|
+
2. **Processamento da Mensagem**: O `ExemploManager` escuta por mensagens desse tipo e, ao recebê-las, inicia o processo de extração de dados da página.
|
|
421
339
|
|
|
422
|
-
|
|
423
|
-
- Contate o administrador do Nexus para liberação de acesso
|
|
340
|
+
3. **Envio dos Resultados**: Após a extração, o `ExemploManager` envia uma mensagem de volta para o Corisco com os dados extraídos, utilizando um dos tipos de mensagem definidos (por exemplo, `SINGLE_DOCUMENT_EXTRACTED`).
|
|
424
341
|
|
|
425
|
-
**
|
|
342
|
+
4. **Atualização da UI**: O iframe recebe a mensagem com os dados ou documentos extraídos e atualiza a interface do usuário conforme necessário, exibindo os resultados da ação (no exemplo, será enviado e anexado ao contexto um documento extraído contendo o título da página).
|
|
426
343
|
|
|
427
|
-
|
|
428
|
-
- Ou force a republicação: `npm publish --force --registry=...`
|
|
344
|
+
⚠️ Ações que são marcadas como `auto_capture: true` serão executadas automaticamente pelo Corisco ao carregar a página, sem necessidade de interação do usuário. Nesse caso, o fluxo de mensagens é o mesmo, mas o gatilho inicial é o envio da mensagem `AUTO_CAPTURE_DETECTION` sempre que a página for carregada ou atualizada, não a seleção manual da ação.
|