corisco 1.3.12-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 CHANGED
@@ -1,428 +1,344 @@
1
- # ChatJT - Extensão para Captura de Documentos PJe
1
+ # Corisco - Módulo de Extração e Integração de Dados
2
2
 
3
- Esta extensão do Chrome integra com o sistema PJe (Processo Judicial Eletrônico) para capturar documentos automaticamente e enviá-los para o ChatJT.
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
- ### Visão Geral
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
- A extensão é composta por múltiplos módulos que trabalham em conjunto para detectar, capturar e processar documentos do PJe:
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 Content Script
14
- A[content.js] --> B[UI Panel]
15
- B --> C[ChatJT Iframe]
18
+ subgraph "Extensão de Navegador"
19
+ A[Content Script]
16
20
  end
17
21
 
18
- subgraph PJe Tool
19
- D[main.js] --> E[PJeCurrentDocumentCapture]
20
- D --> F[PJeSelectedDocuments]
21
- D --> G[PJeTimeline]
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
- E --> H[Captura Doc. Atual]
25
- F --> I[Captura Docs. Selecionados]
26
- G --> J[Captura Timeline]
27
-
28
- subgraph Comunicação
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
- ### Fluxo de Funcionamento
35
+ ## Utilização e Build
37
36
 
38
- ```mermaid
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
- ## Estrutura de Arquivos
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
- #### Parâmetros Configuráveis
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
- #### Principais Alterações no Manifest
44
+ ### Build
203
45
 
204
- 1. **Adicionar novos hosts**:
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
- ```json
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
- ## Sistema de Logs
50
+ ```bash
51
+ npm run build:dev
52
+ ```
215
53
 
216
- A extensão possui um sistema de logging centralizado com 3 níveis:
54
+ - **Build de Homologação**:
217
55
 
218
- - **Nível 1 (info)**: Informações básicas
219
- - **Nível 2 (detail)**: Informações detalhadas
220
- - **Nível 3 (verbose)**: Informações muito detalhadas
56
+ ```bash
57
+ npm run build:hml
58
+ ```
221
59
 
222
- ```javascript
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
- ## Comunicação Entre Módulos
62
+ ```bash
63
+ npm run build:prd
64
+ ```
231
65
 
232
- A comunicação acontece através de `postMessage` entre os módulos e o iframe:
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
- ```javascript
235
- // Envio de documento capturado
236
- this.pjeDocument.sendToIframe({
237
- type: 'DOCUMENT_EXTRACTED',
238
- document: documentData,
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
- Esse comando atualizará o `package.json`, `manifest.json` e outros arquivos de configuração em `src/config/` com a nova versão.
95
+ ## Ferramentas Disponíveis
284
96
 
285
- ## Publicação do Módulo NPM
97
+ Atualmente, o Corisco possui as seguintes ferramentas implementadas:
286
98
 
287
- ### Configuração do Repositório Nexus
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
- A extensão utiliza o repositório npm interno do TRT19 para publicação de pacotes.
102
+ ## Como Adicionar uma Nova Ferramenta de Extração
290
103
 
291
- **Repositório Local**: `https://nexus.trt19.jus.br/repository/npm/`
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
- **Repositório Público**: `https://registry.npmjs.org/`
106
+ ### Passo 1: Criar o Gerenciador da Ferramenta (`ExemploManager`)
294
107
 
295
- ### Configuração de Autenticação
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
- 1. **Gere as credenciais em base64**:
110
+ ```typescript
111
+ // src/tools/exemplo/manager.ts
298
112
 
299
- - Utilize o comando abaixo, substituindo `user` e `password` pelas suas credenciais do Nexus (senha de rede):
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
- ```bash
302
- echo -n 'user:password' | openssl base64
303
- ```
119
+ export class ExemploManager extends MessageHandler{
120
+ private static instance: ExemploManager;
121
+ actions!: IAction[];
304
122
 
305
- 2. **Configure o arquivo `~/.npmrc`**:
306
-
307
- - Crie se não existir e adicione a linha abaixo, substituindo `<valor_base64_gerado>` pelo valor obtido no passo anterior:
123
+ private constructor(version?: string, actions?: IAction[]) {
124
+ if (ExemploManager.instance) {
125
+ logger.warn('ExemploManager foi inicializado, retornando instância existente');
126
+ return ExemploManager.instance;
127
+ }
308
128
 
309
- ```bash
310
- //nexus.trt19.jus.br/repository/npm/:_auth=<valor_base64_gerado>
311
- ```
129
+ super(MESSAGE_SOURCES.EXTENSION);
130
+ super.set_version(version || '0.0.0');
312
131
 
313
- 3. **Verifique a autenticação**:
132
+ logger.info(`ExemploManager iniciado - Versão: ${this.get_version()}`);
314
133
 
315
- ```bash
316
- npm whoami --registry=https://nexus.trt19.jus.br/repository/npm/
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
- - Deve retornar o nome do usuário se a autenticação estiver correta.
140
+ return minOk && maxOk;
141
+ }) || [];
320
142
 
321
- ### Publicação
143
+ logger.info(`Actions disponíveis após filtro de versão: ${this.actions.map(a => a.job).join(', ')}`);
322
144
 
323
- Para publicar uma nova versão do pacote:
145
+ // Define esta instância como a instância singleton
146
+ ExemploManager.instance = this;
324
147
 
325
- ```bash
326
- # 1. Atualize a versão (se necessário)
327
- npm run bump:patch # ou minor/major
148
+ this.initialize();
149
+ }
328
150
 
329
- # 2. Faça o build do projeto
330
- npm run build:prd
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
- # 3. Publique no repositório interno
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
- # 4. (Opcional) Publique no repositório público
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
- ### Instalação de Pacotes Publicados
201
+ ```typescript
202
+ // src/types/messages.types.ts
341
203
 
342
- Para instalar pacotes do repositório interno em outros projetos:
204
+ export const MESSAGE_TYPES = {
205
+ // ... outros tipos
206
+ EXTRACT_FULL_PROCESS: 'EXTRACT_FULL_PROCESS',
343
207
 
344
- ```bash
345
- # Instalar usando o registry específico
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
- # Ou configurar o registry globalmente
349
- npm config set registry https://nexus.trt19.jus.br/repository/npm/
350
- npm install nome-do-pacote
211
+ // === ERRORS ===
212
+ // ... outros tipos
213
+ } as const;
351
214
  ```
352
215
 
353
- Também é possível acessar via tag \<script> usando JSDelivr (com o repositório público):
354
-
355
- ```html
356
- <script src="https://cdn.jsdelivr.net/npm/corisco@1.3.0-dev/dist/corisco.umd.js"></script>
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
- ### Uso via CDN
360
-
361
- Para usar o Corisco via CDN em uma página web:
362
-
363
- ```html
364
- <!DOCTYPE html>
365
- <html>
366
- <head>
367
- <title>Página com Corisco</title>
368
- </head>
369
- <body>
370
-
371
- <!-- Carrega Corisco via CDN -->
372
- <script src="https://cdn.jsdelivr.net/npm/corisco@1.3.0-dev/dist/corisco.umd.js"></script>
373
-
374
- <!-- Inicializa Corisco -->
375
- <script>
376
- document.addEventListener('DOMContentLoaded', async function() {
377
- try {
378
- // Aguarda Corisco estar disponível
379
- if (window.Corisco) {
380
- console.log('Iniciando Corisco...');
381
- await window.Corisco.start();
382
- console.log('Corisco iniciado com sucesso na versão ' + window.Corisco.getVersion());
383
- } else {
384
- console.error('Corisco não foi carregado!');
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
- </script>
391
-
392
- </body>
393
- </html>
394
- ```
395
-
396
- #### Verificar se está funcionando
397
-
398
- Após o carregamento, você pode verificar no console do navegador:
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
- ## Troubleshooting
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
- ### Problemas com Publicação NPM
332
+ ### Como funciona o fluxo de mensagens
414
333
 
415
- **Erro de autenticação**:
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
- - Verifique se as credenciais base64 estão corretas no `~/.npmrc`
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
- **Erro de permissão**:
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
- - Verifique se o usuário tem permissão de publicação no repositório Nexus
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
- **Versão existe**:
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
- - Atualize a versão: `npm run bump:patch` ou `minor` ou `major`
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.