cosmemilton-acbr-node 0.1.2 → 0.2.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 (52) hide show
  1. package/LICENSE +502 -502
  2. package/NOTICE +8 -8
  3. package/README.md +40 -11
  4. package/acbr.config.json +16 -16
  5. package/acbr.lock.json +0 -0
  6. package/dist/cli.js +39 -13
  7. package/dist/cli.js.map +2 -2
  8. package/dist/contract.json +0 -0
  9. package/dist/index.cjs +36 -11
  10. package/dist/index.cjs.map +2 -2
  11. package/dist/index.js +36 -11
  12. package/dist/index.js.map +2 -2
  13. package/dist/runtime.cjs +36 -11
  14. package/dist/runtime.cjs.map +2 -2
  15. package/dist/runtime.js +36 -11
  16. package/dist/runtime.js.map +2 -2
  17. package/dist/types/generated/acbr/index.d.ts +1 -0
  18. package/dist/types/generated/acbr/models.d.ts +0 -0
  19. package/dist/types/src/cli.d.ts +0 -0
  20. package/dist/types/src/config.d.ts +0 -0
  21. package/dist/types/src/contract-help.d.ts +0 -0
  22. package/dist/types/src/diagnostics.d.ts +2 -0
  23. package/dist/types/src/generator.d.ts +0 -0
  24. package/dist/types/src/index.d.ts +1 -0
  25. package/dist/types/src/native-build.d.ts +1 -0
  26. package/dist/types/src/offline-check.d.ts +0 -0
  27. package/dist/types/src/offline-fixture.d.ts +0 -0
  28. package/dist/types/src/runtime.d.ts +1 -0
  29. package/dist/types/src/source.d.ts +0 -0
  30. package/dist/types/src/types.d.ts +4 -2
  31. package/docs/API.md +116 -90
  32. package/docs/ARQUITETURA.md +19 -15
  33. package/docs/CI.md +60 -60
  34. package/docs/CLI.md +1 -1
  35. package/docs/DEPENDENCIAS-NATIVAS.md +93 -93
  36. package/docs/VALIDACAO.md +67 -67
  37. package/docs/examples/recuperar-xml.mjs +54 -0
  38. package/docs/licenses/fpc/COPYING.FPC +25 -25
  39. package/docs/licenses/fpc/COPYING.GPL.txt +340 -340
  40. package/docs/licenses/fpc/COPYING.LGPL.txt +504 -504
  41. package/docs/licenses/fpc/ORIGIN.json +21 -21
  42. package/docs/licenses/lazarus/COPYING.LGPL.txt +481 -481
  43. package/docs/licenses/lazarus/COPYING.modifiedLGPL.txt +26 -26
  44. package/docs/licenses/lazarus/COPYING.txt +46 -46
  45. package/docs/licenses/lazarus/ORIGIN.json +1 -1
  46. package/native/NativeMotor.pas +55 -3
  47. package/native/NativeProtocol.pas +3 -2
  48. package/native/NativeRecovery.pas +274 -0
  49. package/native/generated/AcbrModels.pas +0 -0
  50. package/package.json +76 -76
  51. package/scripts/build-native-deps.mjs +237 -237
  52. package/tools/extract-model.lpr +119 -119
@@ -1,7 +1,7 @@
1
1
  export declare const PROTOCOL_VERSION: 1;
2
2
  export type Modelo = 55 | 65;
3
3
  export type Ambiente = 1 | 2;
4
- export type Comando = 'gerarXml' | 'validar' | 'assinar' | 'transmitir' | 'consultar' | 'cancelar' | 'cartaCorrecao' | 'inutilizar';
4
+ export type Comando = 'gerarXml' | 'validar' | 'assinar' | 'transmitir' | 'consultar' | 'recuperarXml' | 'cancelar' | 'cartaCorrecao' | 'inutilizar';
5
5
  export interface Contrato {
6
6
  sourceRevision: number;
7
7
  contractHash: string;
@@ -48,7 +48,7 @@ export interface RequisicaoMotor extends Contrato {
48
48
  numeroFinal: number;
49
49
  };
50
50
  }
51
- export type Estado = 'DENEGADO' | 'XML_GERADO' | 'VALIDADO' | 'ASSINADO' | 'AUTORIZADO' | 'REJEITADO' | 'PENDENTE' | 'INDETERMINADO' | 'CONSULTADO' | 'CANCELADO' | 'EVENTO_REGISTRADO' | 'INUTILIZADO' | 'ERRO';
51
+ export type Estado = 'DENEGADO' | 'XML_GERADO' | 'VALIDADO' | 'ASSINADO' | 'XML_RECUPERADO' | 'AUTORIZADO' | 'REJEITADO' | 'PENDENTE' | 'INDETERMINADO' | 'CONSULTADO' | 'CANCELADO' | 'EVENTO_REGISTRADO' | 'INUTILIZADO' | 'ERRO';
52
52
  export interface ResultadoFiscal extends Contrato {
53
53
  versao: 1;
54
54
  id: string;
@@ -71,6 +71,8 @@ export interface RuntimeManifest extends Contrato {
71
71
  arch: string;
72
72
  executable: string;
73
73
  files: Record<string, string>;
74
+ /** Operações adicionais anunciadas pelo motor, sem alterar o protocolo-base. */
75
+ capabilities?: readonly string[];
74
76
  }
75
77
  export interface OpcoesOperacao {
76
78
  signal?: AbortSignal;
package/docs/API.md CHANGED
@@ -1,90 +1,116 @@
1
- # API e protocolo
2
-
3
- `criarEmissor` retorna operações assíncronas; cada chamada inicia um processo fiscal isolado. Uma instância processa uma operação por vez, com fila limitada. Emitentes diferentes não compartilham o componente Pascal.
4
-
5
- ## Configuração
6
-
7
- Campos obrigatórios: `cnpj` (14 dígitos), `uf`, `modelo` (55/65), `ambiente` (1 produção, 2 homologação). Certificado A1: `certificado: { pfx: Uint8Array, senha: string }` ou `{ arquivo: string, senha: string }`. NFC-e requer `csc: { id: string, valor: string }` para os recursos que dependem do CSC.
8
-
9
- `timeoutMs` tem padrão/máximo de 120.000 ms; `limiteFila` tem padrão 32. `runtimeDirectory` seleciona um runtime próprio cujo contrato deve coincidir com o cliente. Cada operação aceita `{ signal: AbortSignal }` como último argumento. `fechar()` cancela a fila, encerra e aguarda o processo em execução.
10
-
11
- Com `limiteFila: 0`, uma operação pode executar e chamadas concorrentes recebem
12
- `FILA_CHEIA`. Após o `await` dessa operação, a fila já está disponível para a
13
- próxima chamada; isso também vale quando a operação termina com erro, salvo
14
- quando o emissor foi fechado ou o encerramento do motor não foi confirmado.
15
-
16
- ## Operações
17
-
18
- | Método | Entrada |
19
- | --- | --- |
20
- | `gerarXml` | Objeto TNFe/TNFeInput com nomes ACBr |
21
- | `assinar`, `validar`, `transmitir` | XML UTF-8 como string |
22
- | `consultar` | `{ chave, recibo? }` |
23
- | `cancelar` | `{ chave, protocolo, justificativa }` |
24
- | `cartaCorrecao` | `{ chave, correcao, sequenciaEvento? }`; modelo 55 |
25
- | `inutilizar` | `{ ano, serie, numeroInicial, numeroFinal, justificativa }`; ano com 2 dígitos |
26
-
27
- A resposta `ResultadoFiscal` contém `sucesso`, `estado`, revisão/hash do contrato e, quando disponíveis, `cStat`, `xMotivo`, `chave`, `protocolo`, `recibo` e `xmlBase64`. `sucesso` deve ser conferido antes de usar o resultado. XML é devolvido em base64 para preservar os bytes UTF-8.
28
-
29
- Rejeições fiscais e recibos pendentes são resultados, sem retry automático. Falhas no supervisor lançam `ErroAcbrNode` com `codigo` e `resultadoDesconhecido`. Em falha/timeout de uma operação que pode ter iniciado envio, consulte a situação fiscal antes de decidir uma nova transmissão. O erro de transmissão conserva `xmlBase64` para recuperação.
30
-
31
- ## Feedback seguro para o usuário
32
-
33
- Os resultados incluem `diagnostico`, com `codigo`, `etapa`, `mensagem`, `acao`,
34
- `statusEnvio` e, quando disponíveis, `campo` e `cStat`. Também estão disponíveis
35
- os helpers `diagnosticarErro(erro)` e `diagnosticarResultado(resultado, comando)`.
36
- Use esse resumo nas interfaces e nos logs. Ele não copia XML, identidade fiscal,
37
- caminhos, senha, `xMotivo`, stderr, stack ou causa bruta.
38
-
39
- ```ts
40
- import { TNFe, diagnosticarErro, diagnosticarResultado } from 'cosmemilton-acbr-node';
41
-
42
- try {
43
- const resultado = await emissor.gerarXml(new TNFe(dados));
44
- const d = resultado.diagnostico ?? diagnosticarResultado(resultado, 'gerarXml');
45
- mostrarAoUsuario(d); // Apresente mensagem, campo, ação e statusEnvio.
46
- } catch (erro) {
47
- mostrarAoUsuario(diagnosticarErro(erro)); // Não registre o erro bruto.
48
- }
49
- ```
50
-
51
- As validações dos modelos continuam lançando uma subclasse de `TypeError`
52
- (`ErroValidacaoModelo`). Por exemplo, uma data com fuso em `TNFe.Ide.dEmi`
53
- informa `DATA_HORA_INVALIDA`, o campo e a orientação de usar a data/hora civil
54
- da UF em `AAAA-MM-DDTHH:mm:ss`, sem `Z` ou offset. Nenhum valor informado é
55
- incluído no diagnóstico. Uma chave desconhecida aponta o grupo conhecido,
56
- evitando registrar chaves que possam conter dados privados.
57
-
58
- `statusEnvio` refere-se à operação atual:
59
-
60
- | Status | Significado |
61
- | --- | --- |
62
- | `nao_enviado` | Etapa local confirmada ou falha comprovadamente anterior ao envio desta operação. Não prova ausência de envios anteriores. |
63
- | `rejeitado` | Resultado fiscal de rejeição ou denegação; confira `cStat` e a orientação. |
64
- | `autorizado` | Autorização confirmada com identidade/protocolo; em eventos, a mensagem identifica cancelamento, registro ou inutilização. |
65
- | `resultado_incerto` | Resultado pendente, evidência incompleta/contraditória ou interrupção após possível envio. Consulte antes de repetir. |
66
-
67
- Os campos e os estados anteriores da API permanecem disponíveis. O XML de
68
- recuperação de `ErroAcbrNode` ainda pode ser lido explicitamente em `xmlBase64`,
69
- mas não é enumerável; `JSON.stringify(erro)` devolve apenas o diagnóstico
70
- sanitizado. `cause` contém somente código, etapa e campo conhecidos. Nenhum
71
- helper retransmite ou altera o resultado fiscal.
72
-
73
- O encerramento de um filho fiscal iniciado aguarda `close` por até 1000 ms após
74
- o pedido de parada. Se `kill` falha ou o filho não confirma o encerramento, a
75
- operação termina com seu erro original e um aviso adicional em
76
- `diagnostico.limpeza`, com código `ENCERRAMENTO_MOTOR_NAO_CONFIRMADO` e etapa
77
- `limpeza`. O supervisor libera somente os pipes e handles desse filho,
78
- bloqueia a fila e novas operações do emissor e não afirma que o processo
79
- terminou. Encerre a aplicação antes de iniciar outro motor; se havia envio
80
- possível, consulte a situação fiscal antes de repetir. Chamadas concorrentes
81
- de `fechar()` aguardam o mesmo encerramento limitado. O watcher nativo
82
- acompanha o processo pai e encerra o filho quando o pai termina.
83
-
84
- ## Processo auxiliar
85
-
86
- Protocolo JSONL versão 1 em stdin/stdout. Certificado e senha são enviados pelas pipes, nunca como argumentos. O ambiente herdado é restrito a variáveis de sistema; stderr bruto não é apresentado como erro público. Limites de mensagem, timeout, checks de hash e validações de identidade protegem a comunicação. O processo acompanha o PID do pai e termina quando o pai encerra.
87
-
88
- Cada pedido tem `id`, `versao`, `sourceRevision`, `contractHash`, `comando`, `config` e parâmetros da operação. Antes de enviar uma operação com efeitos fiscais, o motor escreve `{ tipo: "envioIniciado", id }`. A resposta final precisa repetir identidade e contrato. O supervisor aguarda o fechamento do processo antes de liberar a próxima operação.
89
-
90
- TLS usa OpenSSL com verificação de cadeia, validade, finalidade e hostname antes de enviar bytes de aplicação. No Linux usa as CAs do sistema; no Windows exporta raízes públicas confiáveis para um bundle temporário. Esta versão não implementa consulta de revogação CRL/OCSP.
1
+ # API e protocolo
2
+
3
+ `criarEmissor` retorna operações assíncronas; cada chamada inicia um processo fiscal isolado. Uma instância processa uma operação por vez, com fila limitada. Emitentes diferentes não compartilham o componente Pascal.
4
+
5
+ ## Configuração
6
+
7
+ Campos obrigatórios: `cnpj` (14 dígitos), `uf`, `modelo` (55/65), `ambiente` (1 produção, 2 homologação). Certificado A1: `certificado: { pfx: Uint8Array, senha: string }` ou `{ arquivo: string, senha: string }`. NFC-e requer `csc: { id: string, valor: string }` para os recursos que dependem do CSC.
8
+
9
+ `timeoutMs` tem padrão/máximo de 120.000 ms; `limiteFila` tem padrão 32. `runtimeDirectory` seleciona um runtime próprio cujo contrato deve coincidir com o cliente. Cada operação aceita `{ signal: AbortSignal }` como último argumento. `fechar()` cancela a fila, encerra e aguarda o processo em execução.
10
+
11
+ Com `limiteFila: 0`, uma operação pode executar e chamadas concorrentes recebem
12
+ `FILA_CHEIA`. Após o `await` dessa operação, a fila já está disponível para a
13
+ próxima chamada; isso também vale quando a operação termina com erro, salvo
14
+ quando o emissor foi fechado ou o encerramento do motor não foi confirmado.
15
+
16
+ ## Operações
17
+
18
+ | Método | Entrada |
19
+ | --- | --- |
20
+ | `gerarXml` | Objeto TNFe/TNFeInput com nomes ACBr |
21
+ | `assinar`, `validar`, `transmitir` | XML UTF-8 como string |
22
+ | `consultar` | `{ chave, recibo? }` |
23
+ | `recuperarXml` | XML UTF-8 de uma única NFe 4.00 já assinada; faz uma consulta externa pela chave do XML |
24
+ | `cancelar` | `{ chave, protocolo, justificativa }` |
25
+ | `cartaCorrecao` | `{ chave, correcao, sequenciaEvento? }`; modelo 55 |
26
+ | `inutilizar` | `{ ano, serie, numeroInicial, numeroFinal, justificativa }`; ano com 2 dígitos |
27
+
28
+ A resposta `ResultadoFiscal` contém `sucesso`, `estado`, revisão/hash do contrato e, quando disponíveis, `cStat`, `xMotivo`, `chave`, `protocolo`, `recibo` e `xmlBase64`. `sucesso` deve ser conferido antes de usar o resultado. XML é devolvido em base64 para preservar os bytes UTF-8.
29
+
30
+ Rejeições fiscais e recibos pendentes são resultados, sem retry automático. Falhas no supervisor lançam `ErroAcbrNode` com `codigo` e `resultadoDesconhecido`. Em falha/timeout de uma operação que pode ter iniciado envio, consulte a situação fiscal antes de decidir uma nova transmissão. O erro de transmissão conserva `xmlBase64` para recuperação.
31
+
32
+ ## Consulta e recuperação do XML
33
+
34
+ As duas operações têm contratos distintos e não compartilham uma coleção nativa de notas entre chamadas:
35
+
36
+ | Operação | Entrada e saída |
37
+ | --- | --- |
38
+ | `consultar({ chave })` | Consulta a situação. `xmlBase64`, quando presente, contém o retorno do serviço (`retConsSitNFe`), não o arquivo original da NFe. O comportamento anterior permanece disponível. |
39
+ | `recuperarXml(xmlAssinado, opcoes?)` | Recebe o original assinado e retorna `Promise<ResultadoFiscal>`. Usa uma nova consulta para obter o protocolo e devolver o `nfeProc` completo, somente quando a recuperação foi comprovada. |
40
+
41
+ O segundo argumento, `opcoes?: OpcoesOperacao`, é opcional: pode ser omitido, como em `emissor.recuperarXml(xmlAssinado)`. `OpcoesOperacao` aceita somente `signal?: AbortSignal`. Para permitir um pedido de cancelamento, passe `{ signal: controlador.signal }`, obtido de um `AbortController`, e chame `controlador.abort()` quando necessário. O sinal solicita o cancelamento da operação do SDK; não cancela a autorização fiscal. A consulta pode já ter sido enviada quando o sinal é acionado.
42
+
43
+ A operação exige A1 para a consulta e XML de uma única NFe 4.00, sem envelope, DTD ou entidades externas. A chave é derivada do documento, não de um parâmetro separado. O motor valida o schema e a assinatura da NFe de entrada antes da consulta e confere emitente, UF, modelo e ambiente contra a configuração do emissor.
44
+
45
+ O sucesso exige cumulativamente `sucesso=true`, `estado='XML_RECUPERADO'`, `cStat=100` e `xmlBase64` contendo o processo completo. O protocolo deve ter 15 dígitos, pertencer à mesma chave e ambiente e vir da resposta desta consulta. O `digVal` do protocolo é obrigatório e precisa ser exatamente igual ao `DigestValue` da referência assinada da NFe verificada; a comparação de base64 diferencia maiúsculas de minúsculas. O motor preserva o corpo da NFe e sua assinatura original, compõe com o protocolo recebido, valida o schema do processo resultante e verifica novamente a assinatura da NFe. Não reconstrói um protocolo a partir apenas dos campos escalares.
46
+
47
+ Na versão 0.2.0, um `protNFe` com assinatura XMLDSig (`ds:Signature`) é recusado com `RECUPERACAO_NAO_COMPROVADA`, sem `xmlBase64` ou `protocolo`, independentemente da validade dessa assinatura e mesmo quando o status é `100`. O verificador disponível nesta versão não comprova de forma independente essa assinatura adicional da SEFAZ; mudanças no contexto de namespaces do envelope também podem afetar a canonicalização. A operação não oferece preservação ou verificação de uma assinatura do protocolo. A assinatura original da NFe é preservada e verificada antes e depois da composição. Os protocolos aceitos mantêm os dados da resposta real e exigem a correlação por `digVal` descrita acima.
48
+
49
+ Para status diferente de `100`, inclusive `150` e `217`, a nova operação devolve `sucesso=false`, estado `CONSULTADO`, código `RECUPERACAO_NAO_COMPROVADA` e o `cStat`/motivo recebido, sem `protocolo` ou `xmlBase64` de recuperação. Uma resposta `100` incompleta ou divergente também falha, sem XML ou protocolo, com o diagnóstico correspondente: divergências de chave, ambiente ou digest usam `IDENTIDADE_DIVERGENTE`; falhas de schema usam `XML_SCHEMA_INVALIDO`. Isso não altera os estados e resultados de `consultar`, inclusive seu tratamento anterior de `150`. O diagnóstico sanitizado de uma recuperação concluída usa `XML_RECUPERADO` e explica que a autorização foi consultada, sem nova transmissão.
50
+
51
+ Essa consulta é uma operação de rede. `envioIniciado=false` informa que não se iniciou transmissão de nota ou evento; não informa que a operação foi offline. A recuperação não chama `assinar`, `transmitir`, eventos ou inutilização, não tenta emitir novamente e não persiste nem substitui arquivos fiscais. A aplicação decide onde salvar os bytes devolvidos e deve preservar o arquivo assinado original. O exemplo em [examples/recuperar-xml.mjs](examples/recuperar-xml.mjs) deixa essa gravação para o chamador e não inicia consulta ao ser importado.
52
+
53
+ Atualize SDK e runtime da plataforma em conjunto. Para essa operação, o manifesto precisa incluir `capabilities: ['recuperarXml']`, além dos demais campos e hashes. Um motor sem essa capacidade é recusado com `RUNTIME_SEM_CAPACIDADE` antes de iniciar o processo; não basta reaproveitar um binário antigo com o mesmo contrato dos modelos. A adição mantém a versão 1 do protocolo JSONL e não muda `consultar`.
54
+
55
+ `validar(xml)` continua recebendo uma NFe sem envelope. Para verificar um `nfeProc` recebido ou salvo pela aplicação, use seu schema de processo (`procNFe_v4.00.xsd`), não `validar(nfeProc)`. Na recuperação, a validação do processo e a conferência da assinatura original da NFe já são responsabilidade do motor, com a limitação sobre assinatura adicional do protocolo descrita acima.
56
+
57
+ ## Feedback seguro para o usuário
58
+
59
+ Os resultados incluem `diagnostico`, com `codigo`, `etapa`, `mensagem`, `acao`,
60
+ `statusEnvio` e, quando disponíveis, `campo` e `cStat`. Também estão disponíveis
61
+ os helpers `diagnosticarErro(erro)` e `diagnosticarResultado(resultado, comando)`.
62
+ Use esse resumo nas interfaces e nos logs. Ele não copia XML, identidade fiscal,
63
+ caminhos, senha, `xMotivo`, stderr, stack ou causa bruta.
64
+
65
+ ```ts
66
+ import { TNFe, diagnosticarErro, diagnosticarResultado } from 'cosmemilton-acbr-node';
67
+
68
+ try {
69
+ const resultado = await emissor.gerarXml(new TNFe(dados));
70
+ const d = resultado.diagnostico ?? diagnosticarResultado(resultado, 'gerarXml');
71
+ mostrarAoUsuario(d); // Apresente mensagem, campo, ação e statusEnvio.
72
+ } catch (erro) {
73
+ mostrarAoUsuario(diagnosticarErro(erro)); // Não registre o erro bruto.
74
+ }
75
+ ```
76
+
77
+ As validações dos modelos continuam lançando uma subclasse de `TypeError`
78
+ (`ErroValidacaoModelo`). Por exemplo, uma data com fuso em `TNFe.Ide.dEmi`
79
+ informa `DATA_HORA_INVALIDA`, o campo e a orientação de usar a data/hora civil
80
+ da UF em `AAAA-MM-DDTHH:mm:ss`, sem `Z` ou offset. Nenhum valor informado é
81
+ incluído no diagnóstico. Uma chave desconhecida aponta o grupo conhecido,
82
+ evitando registrar chaves que possam conter dados privados.
83
+
84
+ `statusEnvio` refere-se à operação atual:
85
+
86
+ | Status | Significado |
87
+ | --- | --- |
88
+ | `nao_enviado` | Etapa local confirmada ou falha comprovadamente anterior ao envio desta operação. Não prova ausência de envios anteriores. |
89
+ | `rejeitado` | Resultado fiscal de rejeição ou denegação; confira `cStat` e a orientação. |
90
+ | `autorizado` | Autorização confirmada com identidade/protocolo; em eventos, a mensagem identifica cancelamento, registro ou inutilização. |
91
+ | `resultado_incerto` | Resultado pendente, evidência incompleta/contraditória ou interrupção após possível envio. Consulte antes de repetir. |
92
+
93
+ Os campos e os estados anteriores da API permanecem disponíveis. O XML de
94
+ recuperação de `ErroAcbrNode` ainda pode ser lido explicitamente em `xmlBase64`,
95
+ mas não é enumerável; `JSON.stringify(erro)` devolve apenas o diagnóstico
96
+ sanitizado. `cause` contém somente código, etapa e campo conhecidos. Nenhum
97
+ helper retransmite ou altera o resultado fiscal.
98
+
99
+ O encerramento de um filho fiscal iniciado aguarda `close` por até 1000 ms após
100
+ o pedido de parada. Se `kill` falha ou o filho não confirma o encerramento, a
101
+ operação termina com seu erro original e um aviso adicional em
102
+ `diagnostico.limpeza`, com código `ENCERRAMENTO_MOTOR_NAO_CONFIRMADO` e etapa
103
+ `limpeza`. O supervisor libera somente os pipes e handles desse filho,
104
+ bloqueia a fila e novas operações do emissor e não afirma que o processo
105
+ terminou. Encerre a aplicação antes de iniciar outro motor; se havia envio
106
+ possível, consulte a situação fiscal antes de repetir. Chamadas concorrentes
107
+ de `fechar()` aguardam o mesmo encerramento limitado. O watcher nativo
108
+ acompanha o processo pai e encerra o filho quando o pai termina.
109
+
110
+ ## Processo auxiliar
111
+
112
+ Protocolo JSONL versão 1 em stdin/stdout. Certificado e senha são enviados pelas pipes, nunca como argumentos. O ambiente herdado é restrito a variáveis de sistema; stderr bruto não é apresentado como erro público. Limites de mensagem, timeout, checks de hash e validações de identidade protegem a comunicação. O processo acompanha o PID do pai e termina quando o pai encerra.
113
+
114
+ Cada pedido tem `id`, `versao`, `sourceRevision`, `contractHash`, `comando`, `config` e parâmetros da operação. Antes de enviar uma operação com efeitos fiscais, o motor escreve `{ tipo: "envioIniciado", id }`. A resposta final precisa repetir identidade e contrato. O supervisor aguarda o fechamento do processo antes de liberar a próxima operação.
115
+
116
+ TLS usa OpenSSL com verificação de cadeia, validade, finalidade e hostname antes de enviar bytes de aplicação. No Linux usa as CAs do sistema; no Windows exporta raízes públicas confiáveis para um bundle temporário. Esta versão não implementa consulta de revogação CRL/OCSP.
@@ -1,15 +1,19 @@
1
- # Arquitetura
2
-
3
- O projeto contém quatro partes: cliente TypeScript (`src/runtime.ts`), CLI (`src/cli.ts`), extractor FCL-passrc (`tools/extract-model.lpr`) e motor `TACBrNFe` (`native/acbr-worker.lpr`).
4
-
5
- 1. SVN resolve uma revisão explícita ou HEAD e exporta os componentes públicos necessários. A revisão exata e hashes de todos os arquivos ficam no lock.
6
- 2. FCL-passrc analisa unidades Pascal com includes e condicionais. A resolução alcança herança, aliases, propriedades, campos públicos e coleções do modelo TNFe.
7
- 3. A representação intermediária única gera classes/inputs/enums/validadores TypeScript e loaders Pascal. O relatório de compatibilidade compara contratos anteriores.
8
- 4. FPC compila os loaders junto do motor fiscal. Schemas, serviços e dependências seguem a revisão travada; o runtime recebe manifesto com hashes.
9
- 5. Node verifica arquivos, revisão e contrato, envia uma operação JSONL por processo e entrega o resultado assíncrono.
10
-
11
- Não há FFI nem addon vinculado a uma versão específica do ABI do Node. As duas plataformas usam o mesmo protocolo e modelos. Recursos que antes exigiam APIs Windows, como confiança TLS e lifecycle do processo, possuem implementação específica por plataforma.
12
-
13
- O código do Integrador existente não foi alterado ou incorporado como dependência. Regras comerciais, persistência, impostos e orquestração do documento continuam no aplicativo consumidor.
14
-
15
- Uma release principal contém ESM, CommonJS, declarações, fontes do extractor/motor, lock e documentos. Os pacotes `cosmemilton-acbr-node-linux-x64` e `cosmemilton-acbr-node-win32-x64` incluem runtime, fontes fiscais correspondentes, licenças e instruções de reconstrução. Gerar uma revisão própria exige SVN, Free Pascal e Lazarus gratuitos; consumir a release pronta exige apenas Node e a plataforma suportada.
1
+ # Arquitetura
2
+
3
+ O projeto contém quatro partes: cliente TypeScript (`src/runtime.ts`), CLI (`src/cli.ts`), extractor FCL-passrc (`tools/extract-model.lpr`) e motor `TACBrNFe` (`native/acbr-worker.lpr`).
4
+
5
+ 1. SVN resolve uma revisão explícita ou HEAD e exporta os componentes públicos necessários. A revisão exata e hashes de todos os arquivos ficam no lock.
6
+ 2. FCL-passrc analisa unidades Pascal com includes e condicionais. A resolução alcança herança, aliases, propriedades, campos públicos e coleções do modelo TNFe.
7
+ 3. A representação intermediária única gera classes/inputs/enums/validadores TypeScript e loaders Pascal. O relatório de compatibilidade compara contratos anteriores.
8
+ 4. FPC compila os loaders junto do motor fiscal. Schemas, serviços e dependências seguem a revisão travada; o runtime recebe manifesto com hashes.
9
+ 5. Node verifica arquivos, revisão e contrato, envia uma operação JSONL por processo e entrega o resultado assíncrono.
10
+
11
+ Não há FFI nem addon vinculado a uma versão específica do ABI do Node. As duas plataformas usam o mesmo protocolo e modelos. Recursos que antes exigiam APIs Windows, como confiança TLS e lifecycle do processo, possuem implementação específica por plataforma.
12
+
13
+ O código do Integrador existente não foi alterado ou incorporado como dependência. Regras comerciais, persistência, impostos e orquestração do documento continuam no aplicativo consumidor.
14
+
15
+ `consultar` entrega o retorno do serviço. `recuperarXml` é um comando adicional: carrega uma NFe assinada, valida documento, assinatura e identidade da NFe original, consulta a chave e correlaciona o protocolo recebido, incluindo o digest obrigatório. Somente a recuperação que atende aos critérios documentados com `cStat=100` produz `XML_RECUPERADO` e o `nfeProc`, preservando o conteúdo assinado; não há nova emissão, assinatura ou persistência fiscal automática. O supervisor exige a capacidade `recuperarXml` no manifesto antes de iniciar esse comando, para não encaminhá-lo a motores antigos. Uma chamada anterior a `validar` não carrega notas para uma chamada seguinte: cada operação usa seu próprio processo fiscal.
16
+
17
+ Na versão 0.2.0, `protNFe` com assinatura XMLDSig (`ds:Signature`) é recusado com `RECUPERACAO_NAO_COMPROVADA`, sem XML ou protocolo no resultado. O verificador do ACBr fixado nesta versão resolve `SignedInfo` globalmente e não comprova de forma independente as duas assinaturas em um mesmo processo. O contexto de namespaces do envelope também pode alterar a canonicalização (C14N). A recuperação, portanto, não oferece preservação ou verificação da assinatura adicional da SEFAZ no protocolo. Para os protocolos aceitos, usa os dados da resposta real e exige `digVal` exatamente igual ao digest assinado. A assinatura original da NFe é preservada e verificada antes da consulta e depois da composição do `nfeProc`.
18
+
19
+ Uma release principal contém ESM, CommonJS, declarações, fontes do extractor/motor, lock e documentos. Os pacotes `cosmemilton-acbr-node-linux-x64` e `cosmemilton-acbr-node-win32-x64` incluem runtime, fontes fiscais correspondentes, licenças e instruções de reconstrução. Gerar uma revisão própria exige SVN, Free Pascal e Lazarus gratuitos; consumir a release pronta exige apenas Node e a plataforma suportada.
package/docs/CI.md CHANGED
@@ -1,60 +1,60 @@
1
- # Validação e preparação npm
2
-
3
- Os workflows de validação são acionados manualmente e não publicam no npm. O workflow `publish.yml` publica os tarballs revisados quando há um push na branch `release`; o acionamento manual também exige essa branch. Nenhum workflow transmite à SEFAZ. A revisão ACBr é entrada explícita, registrada no lock e nos manifestos. Os testes fiscais usam respostas locais simuladas e certificados sintéticos; a homologação fiscal continua separada.
4
-
5
- ## Linux
6
-
7
- `validate-linux.yml` usa Ubuntu24.04, Node24 e pacotes livres FPC3.2.2/Lazarus3.0. Gera e compila o cliente/motor, verifica hashes, executa testes e instala tarballs em consumidor externo ao repositório. A revisão própria desse consumidor é outra entrada. O diretório padrão fica em `~/.acbr-node-validation/consumer-REV`; uma pasta já existente precisa ser preservada e outro `--directory` selecionado.
8
-
9
- ## Windows
10
-
11
- `validate-windows.yml` primeiro compila OpenSSL/libxml2 no Ubuntu com MinGW, usando arquivos oficiais fixados por SHA256 em `build-native-deps.mjs`. Transfere DLLs, notices e proveniência como artifact. O segundo job usa um runner próprio Windows x64 com label `acbr-toolchain`; a preparação do runner é manual e ainda precisa ser validada ao instalar esse workflow no repositório remoto.
12
-
13
- Instale Free Pascal3.2.2 x64 e Lazarus com LCL/LazUtils compilados pelo [download oficial Free Pascal](https://www.freepascal.org/download.html) e pelos [downloads oficiais Lazarus](https://www.lazarus-ide.org/index.php?page=downloads). Instale SVN e tar no PATH do runner. O Windows moderno oferece `tar.exe`; confira antes do job. As ferramentas e o compilador são gratuitos. Nenhum instalador é baixado por URL não verificada e nenhuma action de terceiros configura Pascal.
14
-
15
- Configure as variáveis do repositório `FPC_ROOT` (raiz da instalação3.2.2, contendo `bin/x86_64-win64/ppcx64.exe` e `fpcmkcfg.exe`) e `LAZARUS_ROOT` (raiz contendo `components/lazutils`, `lcl/units` e as unidades x64). A instalação deve conter RTL/FCL, unidades de rede e fontes/licenças. A receita Windows local foi validada com FPC3.2.2/Lazarus4.8; Linux com Lazarus3.0.
16
-
17
- `prepare-windows-build.ps1` cria um `fpc.cfg` exclusivo em `.acbr/fpc/windows`, define `PPC_CONFIG_PATH` e escreve `acbr.ci.windows.config.json`. A configuração original e a instalação do compilador são preservadas. Para executar a mesma preparação localmente, com as dependências já compiladas:
18
-
19
- ```powershell
20
- $env:FPC_ROOT = 'C:\Ferramentas\lazarus\fpc\3.2.2'
21
- $env:LAZARUS_ROOT = 'C:\Ferramentas\lazarus'
22
- ./scripts/prepare-windows-build.ps1 -Revision 48590
23
- npm ci --omit=optional
24
- npm run build:cli
25
- node dist/cli.js --config acbr.ci.windows.config.json source update --revision 48590
26
- node dist/cli.js --config acbr.ci.windows.config.json generate
27
- npm run build
28
- node dist/cli.js --config acbr.ci.windows.config.json build
29
- node dist/cli.js --config acbr.ci.windows.config.json check
30
- ```
31
-
32
- ## Gate de publicação
33
-
34
- Depois de validar os dois sistemas, use `npm run build`, `node scripts/pack-runtimes.mjs --all` e `node scripts/publish-artifacts.mjs`. O último comando prepara os três tarballs e executa somente `npm publish --dry-run`. Confere hashes dos três arquivos gerados e de cada arquivo runtime, revisão/contrato, fontes do motor correspondentes ao pacote principal, licenças, schemas, proveniência das DLLs e ausência de arquivos pessoais no pacote principal. Recusa binários de teste e arquivos fora do manifesto. Todos os pacotes são auditados e empacotados antes da primeira operação de publicação.
35
-
36
- A publicação exige autenticação npm válida e a opção explícita `--publish`. A autenticação é conferida antes do primeiro pacote. Publique primeiro os dois runtimes e depois o pacote principal; o script mantém essa ordem. Nunca coloque token npm no repositório, configuração de build ou tarballs. Os artifacts de Linux e Windows continuam sujeitos à mesma auditoria local antes de publicar uma versão conjunta.
37
-
38
- ## Publicação automática de artefatos revisados
39
-
40
- A publicação npm foi autorizada pelo usuário em **09/10/2026**. O workflow `.github/workflows/publish.yml` usa o secret GitHub `NPM_TOKEN` somente no passo de publicação. O token precisa permitir publicação pública dos três pacotes. Seu valor não pertence ao repositório, aos manifests ou aos tarballs.
41
-
42
- A automação publica os artefatos prontos; a compilação dos motores e a revisão dos testes acontecem antes de preparar uma nova versão. Depois das validações Linux/Windows e da autorização para publicar, prepare e fixe os hashes:
43
-
44
- ```bash
45
- npm run release:prepare
46
- node scripts/prepare-npm-release.mjs --authorized-on AAAA-MM-DD
47
- node scripts/npm-release-bundle.mjs --dry-run .acbr/release-artifacts
48
- ```
49
-
50
- Envie os três `.tgz`, `SHA256SUMS` e `VALIDATION.json` de `.acbr/release-artifacts` para `https://miltonjunior.dev.br/acbr-node/releases/<versão>/`. Preserve esses assets por versão. Versione somente `.github/npm-release.json` e os documentos em `release/<versão>/`; os binários não vão para o git. Depois envie a alteração revisada à branch `release`.
51
-
52
- O runner usa HTTPS com verificação de certificado/hostname e recusa redirecionamentos. Confere os downloads contra hashes fixados no git, lê os metadados npm dos tarballs, audita inventários/fontes/licenças e executa um dry run antes de disponibilizar o token ao passo de publicação npm. Não recompila os motores nesse processo.
53
-
54
- A ordem é Linux, Windows e SDK. Antes de publicar qualquer pacote ausente, o script compara os hashes npm de todas as versões que já existem. Uma reexecução pula somente tarballs idênticos e continua uma publicação parcial. Qualquer versão existente com conteúdo diferente interrompe a operação; publique uma nova versão depois de revisar a diferença. A fila de workflows impede duas publicações simultâneas.
55
-
56
- O dry run também confere primeiro os hashes das versões públicas e pula somente as idênticas, porque o npm recusa repetir uma versão mesmo com `--dry-run`. Quando um envio retorna sucesso, a confirmação consulta o registro ou staging por cerca de nove minutos, além do tempo das consultas, sem repetir o envio. Essa janela cobre o atraso observado nas primeiras publicações Linux/Windows da versão 0.1.0. O workflow permite até 45 minutos para confirmar os três pacotes.
57
-
58
- O npm também pode manter uma versão em staging, aguardando aprovação com 2FA. Antes de enviar qualquer pacote, a automação consulta os estágios dos três nomes, verifica identidade, versão, tag `latest` e SHA-1 e baixa os tarballs pendentes em diretórios temporários para conferir os bytes contra os aprovados. Uma versão pendente idêntica é preservada e não é enviada novamente. Um conflito interrompe a execução antes de novas publicações. Quando o npm recusa publicação direta com `E_STAGE_REQUIRED`, a automação envia somente o mesmo tarball aprovado para staging. Se algum runtime estiver pendente, o SDK também é enviado a staging, evitando disponibilizar o cliente antes dos motores.
59
-
60
- O resultado `awaiting-2fa` indica que a versão ainda não está disponível para instalação. O resumo do workflow e o artifact `npm-publication-result` registram os identificadores e os hashes conferidos. O mantenedor deve aprovar os estágios em `npmjs.com`, na aba **Staged Packages**, ou executar `npm stage approve <identificador>` em uma sessão npm local autenticada. Essa confirmação com 2FA é exigida pelo npm; o workflow não altera a política de publicação ou autenticação. Aprove primeiro os runtimes Linux/Windows e depois o SDK, e reexecute o workflow para confirmar os hashes públicos dos três pacotes. [Fluxo oficial de staging npm](https://docs.npmjs.com/staged-publishing/).
1
+ # Validação e preparação npm
2
+
3
+ Os workflows de validação são acionados manualmente e não publicam no npm. O workflow `publish.yml` publica os tarballs revisados quando há um push na branch `release`; o acionamento manual também exige essa branch. Nenhum workflow transmite à SEFAZ. A revisão ACBr é entrada explícita, registrada no lock e nos manifestos. Os testes fiscais usam respostas locais simuladas e certificados sintéticos; a homologação fiscal continua separada.
4
+
5
+ ## Linux
6
+
7
+ `validate-linux.yml` usa Ubuntu24.04, Node24 e pacotes livres FPC3.2.2/Lazarus3.0. Gera e compila o cliente/motor, verifica hashes, executa testes e instala tarballs em consumidor externo ao repositório. A revisão própria desse consumidor é outra entrada. O diretório padrão fica em `~/.acbr-node-validation/consumer-REV`; uma pasta já existente precisa ser preservada e outro `--directory` selecionado.
8
+
9
+ ## Windows
10
+
11
+ `validate-windows.yml` primeiro compila OpenSSL/libxml2 no Ubuntu com MinGW, usando arquivos oficiais fixados por SHA256 em `build-native-deps.mjs`. Transfere DLLs, notices e proveniência como artifact. O segundo job usa um runner próprio Windows x64 com label `acbr-toolchain`; a preparação do runner é manual e ainda precisa ser validada ao instalar esse workflow no repositório remoto.
12
+
13
+ Instale Free Pascal3.2.2 x64 e Lazarus com LCL/LazUtils compilados pelo [download oficial Free Pascal](https://www.freepascal.org/download.html) e pelos [downloads oficiais Lazarus](https://www.lazarus-ide.org/index.php?page=downloads). Instale SVN e tar no PATH do runner. O Windows moderno oferece `tar.exe`; confira antes do job. As ferramentas e o compilador são gratuitos. Nenhum instalador é baixado por URL não verificada e nenhuma action de terceiros configura Pascal.
14
+
15
+ Configure as variáveis do repositório `FPC_ROOT` (raiz da instalação3.2.2, contendo `bin/x86_64-win64/ppcx64.exe` e `fpcmkcfg.exe`) e `LAZARUS_ROOT` (raiz contendo `components/lazutils`, `lcl/units` e as unidades x64). A instalação deve conter RTL/FCL, unidades de rede e fontes/licenças. A receita Windows local foi validada com FPC3.2.2/Lazarus4.8; Linux com Lazarus3.0.
16
+
17
+ `prepare-windows-build.ps1` cria um `fpc.cfg` exclusivo em `.acbr/fpc/windows`, define `PPC_CONFIG_PATH` e escreve `acbr.ci.windows.config.json`. A configuração original e a instalação do compilador são preservadas. Para executar a mesma preparação localmente, com as dependências já compiladas:
18
+
19
+ ```powershell
20
+ $env:FPC_ROOT = 'C:\Ferramentas\lazarus\fpc\3.2.2'
21
+ $env:LAZARUS_ROOT = 'C:\Ferramentas\lazarus'
22
+ ./scripts/prepare-windows-build.ps1 -Revision 48590
23
+ npm ci --omit=optional
24
+ npm run build:cli
25
+ node dist/cli.js --config acbr.ci.windows.config.json source update --revision 48590
26
+ node dist/cli.js --config acbr.ci.windows.config.json generate
27
+ npm run build
28
+ node dist/cli.js --config acbr.ci.windows.config.json build
29
+ node dist/cli.js --config acbr.ci.windows.config.json check
30
+ ```
31
+
32
+ ## Gate de publicação
33
+
34
+ Depois de validar os dois sistemas, use `npm run build`, `node scripts/pack-runtimes.mjs --all` e `node scripts/publish-artifacts.mjs`. O último comando prepara os três tarballs e executa somente `npm publish --dry-run`. Confere hashes dos três arquivos gerados e de cada arquivo runtime, revisão/contrato, fontes do motor correspondentes ao pacote principal, licenças, schemas, proveniência das DLLs e ausência de arquivos pessoais no pacote principal. Recusa binários de teste e arquivos fora do manifesto. Todos os pacotes são auditados e empacotados antes da primeira operação de publicação.
35
+
36
+ A publicação exige autenticação npm válida e a opção explícita `--publish`. A autenticação é conferida antes do primeiro pacote. Publique primeiro os dois runtimes e depois o pacote principal; o script mantém essa ordem. Nunca coloque token npm no repositório, configuração de build ou tarballs. Os artifacts de Linux e Windows continuam sujeitos à mesma auditoria local antes de publicar uma versão conjunta.
37
+
38
+ ## Publicação automática de artefatos revisados
39
+
40
+ A publicação npm foi autorizada pelo usuário em **09/10/2026**. O workflow `.github/workflows/publish.yml` usa o secret GitHub `NPM_TOKEN` somente no passo de publicação. O token precisa permitir publicação pública dos três pacotes. Seu valor não pertence ao repositório, aos manifests ou aos tarballs.
41
+
42
+ A automação publica os artefatos prontos; a compilação dos motores e a revisão dos testes acontecem antes de preparar uma nova versão. Depois das validações Linux/Windows e da autorização para publicar, prepare e fixe os hashes:
43
+
44
+ ```bash
45
+ npm run release:prepare
46
+ node scripts/prepare-npm-release.mjs --authorized-on AAAA-MM-DD
47
+ node scripts/npm-release-bundle.mjs --dry-run .acbr/release-artifacts
48
+ ```
49
+
50
+ Envie os três `.tgz`, `SHA256SUMS` e `VALIDATION.json` de `.acbr/release-artifacts` para `https://miltonjunior.dev.br/acbr-node/releases/<versão>/`. Preserve esses assets por versão. Versione somente `.github/npm-release.json` e os documentos em `release/<versão>/`; os binários não vão para o git. Depois envie a alteração revisada à branch `release`.
51
+
52
+ O runner usa HTTPS com verificação de certificado/hostname e recusa redirecionamentos. Confere os downloads contra hashes fixados no git, lê os metadados npm dos tarballs, audita inventários/fontes/licenças e executa um dry run antes de disponibilizar o token ao passo de publicação npm. Não recompila os motores nesse processo.
53
+
54
+ A ordem é Linux, Windows e SDK. Antes de publicar qualquer pacote ausente, o script compara os hashes npm de todas as versões que já existem. Uma reexecução pula somente tarballs idênticos e continua uma publicação parcial. Qualquer versão existente com conteúdo diferente interrompe a operação; publique uma nova versão depois de revisar a diferença. A fila de workflows impede duas publicações simultâneas.
55
+
56
+ O dry run também confere primeiro os hashes das versões públicas e pula somente as idênticas, porque o npm recusa repetir uma versão mesmo com `--dry-run`. Quando um envio retorna sucesso, a confirmação consulta o registro ou staging por cerca de nove minutos, além do tempo das consultas, sem repetir o envio. Essa janela cobre o atraso observado nas primeiras publicações Linux/Windows da versão 0.1.0. O workflow permite até 45 minutos para confirmar os três pacotes.
57
+
58
+ O npm também pode manter uma versão em staging, aguardando aprovação com 2FA. Antes de enviar qualquer pacote, a automação consulta os estágios dos três nomes, verifica identidade, versão, tag `latest` e SHA-1 e baixa os tarballs pendentes em diretórios temporários para conferir os bytes contra os aprovados. Uma versão pendente idêntica é preservada e não é enviada novamente. Um conflito interrompe a execução antes de novas publicações. Quando o npm recusa publicação direta com `E_STAGE_REQUIRED`, a automação envia somente o mesmo tarball aprovado para staging. Se algum runtime estiver pendente, o SDK também é enviado a staging, evitando disponibilizar o cliente antes dos motores.
59
+
60
+ O resultado `awaiting-2fa` indica que a versão ainda não está disponível para instalação. O resumo do workflow e o artifact `npm-publication-result` registram os identificadores e os hashes conferidos. O mantenedor deve aprovar os estágios em `npmjs.com`, na aba **Staged Packages**, ou executar `npm stage approve <identificador>` em uma sessão npm local autenticada. Essa confirmação com 2FA é exigida pelo npm; o workflow não altera a política de publicação ou autenticação. Aprove primeiro os runtimes Linux/Windows e depois o SDK, e reexecute o workflow para confirmar os hashes públicos dos três pacotes. [Fluxo oficial de staging npm](https://docs.npmjs.com/staged-publishing/).
package/docs/CLI.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Help de tipos e campos — implementação de desenvolvimento
4
4
 
5
- O help TAG faz parte da release 0.1.2. A documentação pública só anuncia disponibilidade após a confirmação dessa versão no registry npm.
5
+ O help TAG foi introduzido na release 0.1.2 e permanece na 0.2.0 descrita nesta documentação. A disponibilidade da 0.2.0 no npm só é anunciada após a confirmação dessa versão no registry.
6
6
 
7
7
  ```sh
8
8
  node dist/cli.js help TAG Ide.tpNF