@baruk/core 0.4.2 → 0.5.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 (465) hide show
  1. package/.baruk-provenance.json +4 -4
  2. package/CHANGELOG.md +42 -0
  3. package/dist/audit/repository.d.ts +33 -1
  4. package/dist/audit/repository.d.ts.map +1 -1
  5. package/dist/audit/repository.js +41 -7
  6. package/dist/audit/repository.js.map +1 -1
  7. package/dist/auth/service.d.ts +21 -0
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +46 -1
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +41 -1
  12. package/dist/billing/ar-repository.d.ts.map +1 -1
  13. package/dist/billing/ar-repository.js +82 -6
  14. package/dist/billing/ar-repository.js.map +1 -1
  15. package/dist/billing/provider-account.d.ts +38 -0
  16. package/dist/billing/provider-account.d.ts.map +1 -1
  17. package/dist/billing/provider-account.js +58 -2
  18. package/dist/billing/provider-account.js.map +1 -1
  19. package/dist/billing/repository.d.ts +44 -0
  20. package/dist/billing/repository.d.ts.map +1 -1
  21. package/dist/billing/repository.js +49 -5
  22. package/dist/billing/repository.js.map +1 -1
  23. package/dist/cjs/audit/repository.js +41 -7
  24. package/dist/cjs/audit/repository.js.map +1 -1
  25. package/dist/cjs/auth/service.js +46 -1
  26. package/dist/cjs/auth/service.js.map +1 -1
  27. package/dist/cjs/billing/ar-repository.js +82 -6
  28. package/dist/cjs/billing/ar-repository.js.map +1 -1
  29. package/dist/cjs/billing/provider-account.js +60 -1
  30. package/dist/cjs/billing/provider-account.js.map +1 -1
  31. package/dist/cjs/billing/repository.js +51 -5
  32. package/dist/cjs/billing/repository.js.map +1 -1
  33. package/dist/cjs/clients/ibge.js +103 -0
  34. package/dist/cjs/clients/ibge.js.map +1 -0
  35. package/dist/cjs/clients/repository.js +186 -9
  36. package/dist/cjs/clients/repository.js.map +1 -1
  37. package/dist/cjs/collection/branding.js +190 -0
  38. package/dist/cjs/collection/branding.js.map +1 -1
  39. package/dist/cjs/collection/clearance-store.js +74 -0
  40. package/dist/cjs/collection/clearance-store.js.map +1 -0
  41. package/dist/cjs/collection/communication-runtime.js +65 -2
  42. package/dist/cjs/collection/communication-runtime.js.map +1 -1
  43. package/dist/cjs/collection/engine.js +20 -0
  44. package/dist/cjs/collection/engine.js.map +1 -1
  45. package/dist/cjs/collection/policy.js +29 -1
  46. package/dist/cjs/collection/policy.js.map +1 -1
  47. package/dist/cjs/communication/clearance.js +18 -0
  48. package/dist/cjs/communication/clearance.js.map +1 -0
  49. package/dist/cjs/communication/dry-run-scenario.js +5 -0
  50. package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
  51. package/dist/cjs/communication/engine.js +12 -0
  52. package/dist/cjs/communication/engine.js.map +1 -1
  53. package/dist/cjs/communication/policy.js.map +1 -1
  54. package/dist/cjs/competence/business-days.js +155 -0
  55. package/dist/cjs/competence/business-days.js.map +1 -0
  56. package/dist/cjs/competence/catalog-validation.js +174 -0
  57. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  58. package/dist/cjs/competence/obligation-preview.js +190 -0
  59. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  60. package/dist/cjs/competence/repository.js +330 -17
  61. package/dist/cjs/competence/repository.js.map +1 -1
  62. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  63. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  64. package/dist/cjs/dashboard/repository.js +11 -1
  65. package/dist/cjs/dashboard/repository.js.map +1 -1
  66. package/dist/cjs/db/client.js +17 -11
  67. package/dist/cjs/db/client.js.map +1 -1
  68. package/dist/cjs/db/provision-e2e-identity.js +111 -0
  69. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  70. package/dist/cjs/fiscal/applicability.js +164 -0
  71. package/dist/cjs/fiscal/applicability.js.map +1 -0
  72. package/dist/cjs/fiscal/conditions.js +198 -0
  73. package/dist/cjs/fiscal/conditions.js.map +1 -0
  74. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  75. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  76. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  77. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  78. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  79. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  80. package/dist/cjs/fiscal/coverage/model.js +127 -0
  81. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  82. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  83. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  84. package/dist/cjs/fiscal/credentials/material.js +168 -0
  85. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  86. package/dist/cjs/fiscal/credentials/readiness.js +163 -0
  87. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  88. package/dist/cjs/fiscal/eligibility.js +199 -0
  89. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  90. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  91. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  92. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  93. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  94. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  95. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  96. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  97. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  98. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  99. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  100. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  101. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  102. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  103. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  104. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  105. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  106. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  107. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  108. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  109. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  110. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  111. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  112. package/dist/cjs/fiscal/repository.js +470 -0
  113. package/dist/cjs/fiscal/repository.js.map +1 -0
  114. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  115. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  116. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  117. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  118. package/dist/cjs/fiscal/sync/lease.js +146 -0
  119. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  120. package/dist/cjs/fiscal/sync/observability.js +244 -0
  121. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  122. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  123. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  124. package/dist/cjs/fiscal/sync/policy.js +143 -0
  125. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  126. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  127. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  128. package/dist/cjs/fiscal/sync/retry.js +183 -0
  129. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  130. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  131. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  132. package/dist/cjs/fiscal/transport/https.js +309 -0
  133. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  134. package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
  135. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  136. package/dist/cjs/fiscal/transport/types.js +93 -0
  137. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  138. package/dist/cjs/import/br-documents.js +85 -0
  139. package/dist/cjs/import/br-documents.js.map +1 -0
  140. package/dist/cjs/import/clients-import.js +347 -40
  141. package/dist/cjs/import/clients-import.js.map +1 -1
  142. package/dist/cjs/index.js +316 -11
  143. package/dist/cjs/index.js.map +1 -1
  144. package/dist/cjs/legal/documents.js +100 -15
  145. package/dist/cjs/legal/documents.js.map +1 -1
  146. package/dist/cjs/legal/index.js +3 -1
  147. package/dist/cjs/legal/index.js.map +1 -1
  148. package/dist/cjs/legal/types.js.map +1 -1
  149. package/dist/cjs/onboarding/persistence.js +4 -4
  150. package/dist/cjs/onboarding/persistence.js.map +1 -1
  151. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  152. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  153. package/dist/cjs/pilot/milestone.js +79 -0
  154. package/dist/cjs/pilot/milestone.js.map +1 -0
  155. package/dist/cjs/platform/capabilities.js +144 -0
  156. package/dist/cjs/platform/capabilities.js.map +1 -0
  157. package/dist/cjs/platform/job-contract.js +411 -0
  158. package/dist/cjs/platform/job-contract.js.map +1 -0
  159. package/dist/cjs/rbac/catalog.js +34 -0
  160. package/dist/cjs/rbac/catalog.js.map +1 -1
  161. package/dist/cjs/subscription-billing/index.js +2 -1
  162. package/dist/cjs/subscription-billing/index.js.map +1 -1
  163. package/dist/cjs/subscription-billing/service.js +153 -77
  164. package/dist/cjs/subscription-billing/service.js.map +1 -1
  165. package/dist/cjs/tenancy/features.js +131 -0
  166. package/dist/cjs/tenancy/features.js.map +1 -0
  167. package/dist/cjs/tenancy/settings.js +224 -0
  168. package/dist/cjs/tenancy/settings.js.map +1 -0
  169. package/dist/cjs/users/repository.js +24 -1
  170. package/dist/cjs/users/repository.js.map +1 -1
  171. package/dist/clients/ibge.d.ts +17 -0
  172. package/dist/clients/ibge.d.ts.map +1 -0
  173. package/dist/clients/ibge.js +98 -0
  174. package/dist/clients/ibge.js.map +1 -0
  175. package/dist/clients/repository.d.ts +154 -0
  176. package/dist/clients/repository.d.ts.map +1 -1
  177. package/dist/clients/repository.js +182 -9
  178. package/dist/clients/repository.js.map +1 -1
  179. package/dist/collection/branding.d.ts +65 -0
  180. package/dist/collection/branding.d.ts.map +1 -1
  181. package/dist/collection/branding.js +186 -0
  182. package/dist/collection/branding.js.map +1 -1
  183. package/dist/collection/clearance-store.d.ts +39 -0
  184. package/dist/collection/clearance-store.d.ts.map +1 -0
  185. package/dist/collection/clearance-store.js +69 -0
  186. package/dist/collection/clearance-store.js.map +1 -0
  187. package/dist/collection/communication-runtime.d.ts +37 -0
  188. package/dist/collection/communication-runtime.d.ts.map +1 -1
  189. package/dist/collection/communication-runtime.js +63 -1
  190. package/dist/collection/communication-runtime.js.map +1 -1
  191. package/dist/collection/engine.d.ts +23 -0
  192. package/dist/collection/engine.d.ts.map +1 -1
  193. package/dist/collection/engine.js +20 -0
  194. package/dist/collection/engine.js.map +1 -1
  195. package/dist/collection/policy.d.ts +25 -0
  196. package/dist/collection/policy.d.ts.map +1 -1
  197. package/dist/collection/policy.js +27 -0
  198. package/dist/collection/policy.js.map +1 -1
  199. package/dist/communication/clearance.d.ts +53 -0
  200. package/dist/communication/clearance.d.ts.map +1 -0
  201. package/dist/communication/clearance.js +15 -0
  202. package/dist/communication/clearance.js.map +1 -0
  203. package/dist/communication/dry-run-scenario.d.ts.map +1 -1
  204. package/dist/communication/dry-run-scenario.js +5 -0
  205. package/dist/communication/dry-run-scenario.js.map +1 -1
  206. package/dist/communication/engine.d.ts +10 -0
  207. package/dist/communication/engine.d.ts.map +1 -1
  208. package/dist/communication/engine.js +12 -0
  209. package/dist/communication/engine.js.map +1 -1
  210. package/dist/communication/policy.d.ts +16 -0
  211. package/dist/communication/policy.d.ts.map +1 -1
  212. package/dist/communication/policy.js.map +1 -1
  213. package/dist/competence/business-days.d.ts +51 -0
  214. package/dist/competence/business-days.d.ts.map +1 -0
  215. package/dist/competence/business-days.js +145 -0
  216. package/dist/competence/business-days.js.map +1 -0
  217. package/dist/competence/catalog-validation.d.ts +86 -0
  218. package/dist/competence/catalog-validation.d.ts.map +1 -0
  219. package/dist/competence/catalog-validation.js +168 -0
  220. package/dist/competence/catalog-validation.js.map +1 -0
  221. package/dist/competence/obligation-preview.d.ts +103 -0
  222. package/dist/competence/obligation-preview.d.ts.map +1 -0
  223. package/dist/competence/obligation-preview.js +184 -0
  224. package/dist/competence/obligation-preview.js.map +1 -0
  225. package/dist/competence/repository.d.ts +139 -1
  226. package/dist/competence/repository.d.ts.map +1 -1
  227. package/dist/competence/repository.js +325 -17
  228. package/dist/competence/repository.js.map +1 -1
  229. package/dist/dashboard/pilot-panel.d.ts +100 -0
  230. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  231. package/dist/dashboard/pilot-panel.js +87 -0
  232. package/dist/dashboard/pilot-panel.js.map +1 -0
  233. package/dist/dashboard/repository.d.ts.map +1 -1
  234. package/dist/dashboard/repository.js +11 -1
  235. package/dist/dashboard/repository.js.map +1 -1
  236. package/dist/db/client.d.ts +45 -0
  237. package/dist/db/client.d.ts.map +1 -1
  238. package/dist/db/client.js +16 -11
  239. package/dist/db/client.js.map +1 -1
  240. package/dist/db/migrate.d.ts +36 -1
  241. package/dist/db/migrate.d.ts.map +1 -1
  242. package/dist/db/migrate.js +199 -32
  243. package/dist/db/migrate.js.map +1 -1
  244. package/dist/db/provision-e2e-identity.d.ts +2 -0
  245. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  246. package/dist/db/provision-e2e-identity.js +109 -0
  247. package/dist/db/provision-e2e-identity.js.map +1 -0
  248. package/dist/fiscal/applicability.d.ts +73 -0
  249. package/dist/fiscal/applicability.d.ts.map +1 -0
  250. package/dist/fiscal/applicability.js +160 -0
  251. package/dist/fiscal/applicability.js.map +1 -0
  252. package/dist/fiscal/conditions.d.ts +99 -0
  253. package/dist/fiscal/conditions.d.ts.map +1 -0
  254. package/dist/fiscal/conditions.js +190 -0
  255. package/dist/fiscal/conditions.js.map +1 -0
  256. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  257. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  258. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  259. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  260. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  261. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  262. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  263. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  264. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  265. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  266. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  267. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  268. package/dist/fiscal/coverage/model.d.ts +86 -0
  269. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  270. package/dist/fiscal/coverage/model.js +120 -0
  271. package/dist/fiscal/coverage/model.js.map +1 -0
  272. package/dist/fiscal/coverage/requests.d.ts +70 -0
  273. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  274. package/dist/fiscal/coverage/requests.js +95 -0
  275. package/dist/fiscal/coverage/requests.js.map +1 -0
  276. package/dist/fiscal/credentials/material.d.ts +81 -0
  277. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  278. package/dist/fiscal/credentials/material.js +164 -0
  279. package/dist/fiscal/credentials/material.js.map +1 -0
  280. package/dist/fiscal/credentials/readiness.d.ts +92 -0
  281. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  282. package/dist/fiscal/credentials/readiness.js +159 -0
  283. package/dist/fiscal/credentials/readiness.js.map +1 -0
  284. package/dist/fiscal/eligibility.d.ts +106 -0
  285. package/dist/fiscal/eligibility.d.ts.map +1 -0
  286. package/dist/fiscal/eligibility.js +194 -0
  287. package/dist/fiscal/eligibility.js.map +1 -0
  288. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  289. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  290. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  291. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  292. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  293. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  294. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  295. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  296. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  297. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  298. package/dist/fiscal/ingestion/direction.js +32 -0
  299. package/dist/fiscal/ingestion/direction.js.map +1 -0
  300. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  301. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  302. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  303. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  304. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  305. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  306. package/dist/fiscal/ingestion/pipeline.js +699 -0
  307. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  308. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  309. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  310. package/dist/fiscal/ingestion/provider.js +47 -0
  311. package/dist/fiscal/ingestion/provider.js.map +1 -0
  312. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  313. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  314. package/dist/fiscal/ingestion/repository.js +127 -0
  315. package/dist/fiscal/ingestion/repository.js.map +1 -0
  316. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  317. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  318. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  319. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  320. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  321. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  322. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  323. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  324. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  325. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  326. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  327. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  328. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  329. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  330. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  331. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  332. package/dist/fiscal/repository.d.ts +220 -0
  333. package/dist/fiscal/repository.d.ts.map +1 -0
  334. package/dist/fiscal/repository.js +449 -0
  335. package/dist/fiscal/repository.js.map +1 -0
  336. package/dist/fiscal/sync/circuit.d.ts +86 -0
  337. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  338. package/dist/fiscal/sync/circuit.js +118 -0
  339. package/dist/fiscal/sync/circuit.js.map +1 -0
  340. package/dist/fiscal/sync/intervention.d.ts +81 -0
  341. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  342. package/dist/fiscal/sync/intervention.js +135 -0
  343. package/dist/fiscal/sync/intervention.js.map +1 -0
  344. package/dist/fiscal/sync/lease.d.ts +118 -0
  345. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  346. package/dist/fiscal/sync/lease.js +139 -0
  347. package/dist/fiscal/sync/lease.js.map +1 -0
  348. package/dist/fiscal/sync/observability.d.ts +148 -0
  349. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  350. package/dist/fiscal/sync/observability.js +239 -0
  351. package/dist/fiscal/sync/observability.js.map +1 -0
  352. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  353. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  354. package/dist/fiscal/sync/orchestrator.js +487 -0
  355. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  356. package/dist/fiscal/sync/policy.d.ts +87 -0
  357. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  358. package/dist/fiscal/sync/policy.js +136 -0
  359. package/dist/fiscal/sync/policy.js.map +1 -0
  360. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  361. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  362. package/dist/fiscal/sync/reprocess.js +237 -0
  363. package/dist/fiscal/sync/reprocess.js.map +1 -0
  364. package/dist/fiscal/sync/retry.d.ts +82 -0
  365. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  366. package/dist/fiscal/sync/retry.js +176 -0
  367. package/dist/fiscal/sync/retry.js.map +1 -0
  368. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  369. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  370. package/dist/fiscal/sync/secret-boundary.js +116 -0
  371. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  372. package/dist/fiscal/transport/https.d.ts +86 -0
  373. package/dist/fiscal/transport/https.d.ts.map +1 -0
  374. package/dist/fiscal/transport/https.js +303 -0
  375. package/dist/fiscal/transport/https.js.map +1 -0
  376. package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
  377. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  378. package/dist/fiscal/transport/synthetic-tls.js +323 -0
  379. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  380. package/dist/fiscal/transport/types.d.ts +134 -0
  381. package/dist/fiscal/transport/types.d.ts.map +1 -0
  382. package/dist/fiscal/transport/types.js +88 -0
  383. package/dist/fiscal/transport/types.js.map +1 -0
  384. package/dist/import/br-documents.d.ts +26 -0
  385. package/dist/import/br-documents.d.ts.map +1 -0
  386. package/dist/import/br-documents.js +78 -0
  387. package/dist/import/br-documents.js.map +1 -0
  388. package/dist/import/clients-import.d.ts +122 -4
  389. package/dist/import/clients-import.d.ts.map +1 -1
  390. package/dist/import/clients-import.js +341 -41
  391. package/dist/import/clients-import.js.map +1 -1
  392. package/dist/index.d.ts +115 -11
  393. package/dist/index.d.ts.map +1 -1
  394. package/dist/index.js +100 -7
  395. package/dist/index.js.map +1 -1
  396. package/dist/legal/documents.d.ts +12 -1
  397. package/dist/legal/documents.d.ts.map +1 -1
  398. package/dist/legal/documents.js +98 -14
  399. package/dist/legal/documents.js.map +1 -1
  400. package/dist/legal/index.d.ts +1 -1
  401. package/dist/legal/index.d.ts.map +1 -1
  402. package/dist/legal/index.js +1 -1
  403. package/dist/legal/index.js.map +1 -1
  404. package/dist/legal/types.d.ts +37 -2
  405. package/dist/legal/types.d.ts.map +1 -1
  406. package/dist/legal/types.js.map +1 -1
  407. package/dist/onboarding/persistence.d.ts +10 -1
  408. package/dist/onboarding/persistence.d.ts.map +1 -1
  409. package/dist/onboarding/persistence.js +4 -4
  410. package/dist/onboarding/persistence.js.map +1 -1
  411. package/dist/pilot/go-live-checklist.d.ts +41 -0
  412. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  413. package/dist/pilot/go-live-checklist.js +209 -0
  414. package/dist/pilot/go-live-checklist.js.map +1 -0
  415. package/dist/pilot/milestone.d.ts +56 -0
  416. package/dist/pilot/milestone.d.ts.map +1 -0
  417. package/dist/pilot/milestone.js +74 -0
  418. package/dist/pilot/milestone.js.map +1 -0
  419. package/dist/platform/capabilities.d.ts +88 -0
  420. package/dist/platform/capabilities.d.ts.map +1 -0
  421. package/dist/platform/capabilities.js +140 -0
  422. package/dist/platform/capabilities.js.map +1 -0
  423. package/dist/platform/job-contract.d.ts +232 -0
  424. package/dist/platform/job-contract.d.ts.map +1 -0
  425. package/dist/platform/job-contract.js +403 -0
  426. package/dist/platform/job-contract.js.map +1 -0
  427. package/dist/rbac/catalog.d.ts.map +1 -1
  428. package/dist/rbac/catalog.js +34 -0
  429. package/dist/rbac/catalog.js.map +1 -1
  430. package/dist/subscription-billing/index.d.ts +6 -5
  431. package/dist/subscription-billing/index.d.ts.map +1 -1
  432. package/dist/subscription-billing/index.js +3 -3
  433. package/dist/subscription-billing/index.js.map +1 -1
  434. package/dist/subscription-billing/service.d.ts +21 -0
  435. package/dist/subscription-billing/service.d.ts.map +1 -1
  436. package/dist/subscription-billing/service.js +90 -15
  437. package/dist/subscription-billing/service.js.map +1 -1
  438. package/dist/tenancy/features.d.ts +69 -0
  439. package/dist/tenancy/features.d.ts.map +1 -0
  440. package/dist/tenancy/features.js +123 -0
  441. package/dist/tenancy/features.js.map +1 -0
  442. package/dist/tenancy/settings.d.ts +63 -0
  443. package/dist/tenancy/settings.d.ts.map +1 -0
  444. package/dist/tenancy/settings.js +218 -0
  445. package/dist/tenancy/settings.js.map +1 -0
  446. package/dist/users/repository.d.ts +16 -1
  447. package/dist/users/repository.d.ts.map +1 -1
  448. package/dist/users/repository.js +24 -1
  449. package/dist/users/repository.js.map +1 -1
  450. package/package.json +9 -2
  451. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  452. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  453. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  454. package/src/db/migrations/0048_item_type_note.sql +16 -0
  455. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  456. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  457. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  458. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  459. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  460. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  461. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  462. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  463. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  464. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  465. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ /**
3
+ * O contrato oficial da NFS-e Nacional — ADN — como artefato versionado.
4
+ *
5
+ * ## Por que um módulo, e não comentários espalhados
6
+ *
7
+ * Até a Fase 2 o que sabíamos do ADN estava disperso em comentários de
8
+ * `nfse-adn.ts` e `adn-transport.ts`, misturado com o que apenas SUPÚNHAMOS. Um
9
+ * leitor não tinha como separar "o manual diz" de "assumimos por simetria com a
10
+ * NF-e" — e a segunda categoria é exatamente a que produz um parser que devolve
11
+ * lote vazio com sucesso aparente.
12
+ *
13
+ * Aqui cada afirmação carrega a fonte que a sustenta e, quando não há fonte, diz
14
+ * que não há. `evidence: 'official'` significa que existe um documento oficial
15
+ * publicado, com versão, data e sha256 registrados abaixo; `evidence:
16
+ * 'unverified'` significa que a afirmação é a melhor leitura disponível e NÃO
17
+ * foi conferida contra o serviço.
18
+ *
19
+ * A distinção não é documental: ela é executável. Um perfil de envelope com
20
+ * `verified: false` fecha o transporte real (`adn-transport.ts`), e é por isso
21
+ * que a Fase 3 termina com o motor pronto e parado em vez de pronto e chutando.
22
+ *
23
+ * ## O que foi medido nesta onda, e como
24
+ *
25
+ * Todo host do ADN — `adn.nfse.gov.br` e `adn.producaorestrita.nfse.gov.br` —
26
+ * exige TLS mútuo com certificado ICP-Brasil para TODOS os seus módulos,
27
+ * documentação inclusive. Medido em 2026-09-08 percorrendo as dezesseis URLs de
28
+ * Swagger publicadas em gov.br (oito módulos × dois ambientes): o handshake
29
+ * completa, o servidor envia `CertificateRequest` — 170 CAs aceitas em produção
30
+ * restrita, 5 em produção — e então encerra a conexão sem UM byte de HTTP.
31
+ * Não há caminho público para ler o envelope de resposta.
32
+ *
33
+ * Por isso o envelope permanece `unverified`, e por isso a Fase 3 não é a
34
+ * primeira conexão real: é a transformação do que ESTÁ publicado num contrato
35
+ * executável que se recusa a adivinhar o que não está.
36
+ */
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.ADN_REAL_TRANSPORT_ENABLED = exports.ADN_SYNTHETIC_ENVELOPE_PROFILE = exports.ADN_OFFICIAL_ENVELOPE_PROFILE = exports.NFSE_ADN_OFFICIAL_CODES = exports.NFSE_ADN_OPERATIONS = exports.NFSE_ADN_NSU_SERIES_IN_USE = exports.NFSE_ADN_NSU_SERIES = exports.NFSE_ADN_LIMITS = exports.NFSE_ADN_HOSTS = exports.NFSE_ADN_A1_RATIONALE = exports.NFSE_ADN_A1_REQUIREMENT = exports.NFSE_ADN_MTLS_REQUIREMENT = exports.NFSE_ADN_ENVELOPE_SHAPE_VERIFIED = exports.NFSE_ADN_PAYLOAD_SHAPE_VERIFIED = exports.NFSE_ADN_OFFICIAL_SOURCES = exports.NFSE_ADN_CONTRACT_VERSION = void 0;
39
+ exports.adnRealTransportBlockers = adnRealTransportBlockers;
40
+ /**
41
+ * A versão do contrato que este código implementa.
42
+ *
43
+ * Vai gravada em `fiscal_sync_run.contract_version`. O motivo é operacional e
44
+ * concreto: quando o governo alterar o leiaute — e ele já alterou duas vezes
45
+ * entre dez/2025 e fev/2026 —, a pergunta "qual parser processou este lote?"
46
+ * precisa ter resposta no dado, não na arqueologia do `git log`.
47
+ */
48
+ exports.NFSE_ADN_CONTRACT_VERSION = 'nfse-adn:v1';
49
+ /**
50
+ * As fontes primárias. Somente gov.br / Portal Nacional NFS-e.
51
+ *
52
+ * Blog, fórum, artigo de fornecedor e repositório de terceiro ficaram de fora
53
+ * por decisão de fase, e não por desdém: nenhum deles é responsável pelo
54
+ * protocolo, e um deles CONTRADIZ o manual quanto ao papel do certificado.
55
+ * Pista serve para saber onde procurar; certificação, não.
56
+ */
57
+ exports.NFSE_ADN_OFFICIAL_SOURCES = Object.freeze([
58
+ Object.freeze({
59
+ id: 'manual-contribuintes-adn',
60
+ title: 'Manual dos Contribuintes — Sistema Nacional NFS-e — Guia para utilização das API´s do ADN',
61
+ url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-apis-adn-sistema-nacional-nfse.pdf',
62
+ version: '1.0',
63
+ publishedAt: '2026-02-12',
64
+ sha256: '9ffc97d8b1be4c80a440b3569b0027df61265b9e75ef69437f21f9481a9a1d6d',
65
+ retrievedAt: '2026-09-08',
66
+ scope: 'Métodos do ADN para o contribuinte: GET /DFe/{NSU} e GET /NFSe/{ChaveAcesso}/Eventos; escopo por CNPJ Raiz do certificado.',
67
+ }),
68
+ Object.freeze({
69
+ id: 'manual-municipios-adn',
70
+ title: 'Manual dos Municípios Conveniados ao Sistema Nacional NFS-e — Guia para utilização das API´s do ADN',
71
+ url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-municipios-apis-adn-sistema-nacional-nfs-e-v1-2-out21025.pdf',
72
+ version: '1.0',
73
+ publishedAt: '2025-03-17',
74
+ sha256: '1e1463e68aa56dbd94e77c3597059b173b8c0a60b1234b3e8424cdcba033b067',
75
+ retrievedAt: '2026-09-08',
76
+ scope: 'Semântica dos quatro NSU, ordem crescente, teto de 50 por lote, ultNSU/maxNSU, espera de uma hora, e os três desfechos possíveis da distribuição.',
77
+ }),
78
+ Object.freeze({
79
+ id: 'anexo-iv-adn',
80
+ title: 'ANEXO_IV — ADN — SNNFSe (regras de negócio e códigos de erro do ADN)',
81
+ url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/anexo_iv-adn-snnfse-v1-00-20251216.xlsx',
82
+ version: '1.00',
83
+ publishedAt: '2025-12-16',
84
+ sha256: 'fa778d0b6e58d62d90d72225b0495805108a4f4983ac77076044a21d8036302f',
85
+ retrievedAt: '2026-09-08',
86
+ scope: 'Códigos E1xxx (certificado, mensagem, área de dados) e E2xxx (distribuição), incluindo os do contribuinte: E2215, E2230, E2240, E2241.',
87
+ }),
88
+ Object.freeze({
89
+ id: 'esquemas-xsd-v1-01',
90
+ title: 'NFSe-ESQUEMAS_XSD-v1.01-20260209',
91
+ url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/nfse-esquemas_xsd-v1-01-20260209.zip',
92
+ version: '1.01',
93
+ publishedAt: '2026-02-09',
94
+ sha256: 'e7935cbd9470527c6cc32984c1b2263e614183bf0139ce2733eaaed2de9a8072',
95
+ retrievedAt: '2026-09-08',
96
+ scope: 'Leiaute do CONTEÚDO: NFSe_v1.01, evento_v1.01, tiposComplexos, tiposEventos, tiposSimples. É a fonte do parser de documento e do mapa de eventos.',
97
+ }),
98
+ ]);
99
+ /**
100
+ * ═══ A distinção que a Fase 3 existe para tornar precisa ═══════════════════
101
+ *
102
+ * `payloadShapeVerified` — o CONTEÚDO (o XML da NFS-e e do evento). Conferido
103
+ * contra o XSD oficial v1.01, cujo hash está acima. É `true`.
104
+ *
105
+ * `envelopeShapeVerified` — o ENVELOPE de transporte que embrulha esse conteúdo
106
+ * na resposta HTTP do ADN. NÃO existe em nenhum artefato alcançável sem
107
+ * certificado ICP-Brasil: o Swagger é servido pelo próprio host que exige TLS
108
+ * mútuo. É `false`.
109
+ *
110
+ * Uma constante só para os dois esconderia justamente a diferença que importa.
111
+ * O antigo `ADN_RESPONSE_SHAPE_VERIFIED` era essa constante única, e ela dizia
112
+ * `false` por causa do envelope — deixando o leitor concluir que também não
113
+ * sabíamos ler o documento, o que era falso e desnecessariamente pessimista.
114
+ */
115
+ exports.NFSE_ADN_PAYLOAD_SHAPE_VERIFIED = true;
116
+ exports.NFSE_ADN_ENVELOPE_SHAPE_VERIFIED = false;
117
+ /**
118
+ * mTLS é exigência do PROTOCOLO neste endpoint — medido e documentado.
119
+ *
120
+ * Duas evidências independentes, e nenhuma delas é dedução:
121
+ *
122
+ * 1. O manual do contribuinte (v1.0, §1.1) fala do "CNPJ do certificado
123
+ * utilizado para ESTABELECER A CONEXÃO" e valida o CNPJ Raiz entre o
124
+ * parâmetro informado e esse certificado. Certificado que estabelece a
125
+ * conexão é certificado de cliente em TLS.
126
+ * 2. As dezesseis URLs oficiais de Swagger do ADN, nos dois ambientes, não
127
+ * devolvem um byte de HTTP sem certificado de cliente (medido 2026-09-08).
128
+ *
129
+ * O escopo desta afirmação é o HOST do ADN, e para nada além dele. A NFS-e
130
+ * nacional tem outros serviços — emissão pela Sefin, sistemas municipais
131
+ * próprios, Emissor Público Web com login gov.br — e generalizar um endpoint
132
+ * para todo o ecossistema seria o mesmo erro de método que a Fase 1 cometeu ao
133
+ * adivinhar código de evento por prefixo.
134
+ */
135
+ exports.NFSE_ADN_MTLS_REQUIREMENT = 'required';
136
+ /**
137
+ * A1 continua REFUTADO como exigência de protocolo.
138
+ *
139
+ * O que as fontes oficiais exigem do certificado é: raiz ICP-Brasil (E1208),
140
+ * `KeyUsage` com Autenticação Cliente (E1200), extensão de CNPJ no `OtherName`
141
+ * OID 2.16.76.1.3.3 (E1209), cadeia e LCR válidas (E1205/E1206/E1207). Nada
142
+ * disso distingue A1 de A3 — um A3 em token satisfaz os cinco.
143
+ *
144
+ * A1 é PREFERÊNCIA DE AUTOMAÇÃO nossa: um worker sem pessoa presente não digita
145
+ * PIN de token. Registrar isso como preferência, e não como obrigação legal, é o
146
+ * que impede o produto de exigir do cliente um certificado que a norma não pede.
147
+ */
148
+ exports.NFSE_ADN_A1_REQUIREMENT = 'refuted';
149
+ exports.NFSE_ADN_A1_RATIONALE = 'server_side_automation_preference';
150
+ /** Hosts oficiais, por ambiente. Nunca substituíveis um pelo outro. */
151
+ exports.NFSE_ADN_HOSTS = Object.freeze({
152
+ /** Produção RESTRITA: responde como o real sobre documento SEM valor fiscal. */
153
+ homologation: 'adn.producaorestrita.nfse.gov.br',
154
+ production: 'adn.nfse.gov.br',
155
+ });
156
+ /**
157
+ * Limites. Os oficiais vêm da norma; os defensivos são nossos e dizem que são.
158
+ *
159
+ * A separação existe porque um limite oficial ultrapassado é violação de norma —
160
+ * e o CNPJ bloqueado é o do CLIENTE —, enquanto um limite defensivo ultrapassado
161
+ * é só a nossa proteção agindo. Confundi-los faria alguém "afrouxar o limite"
162
+ * numa madrugada sem saber qual dos dois estava afrouxando.
163
+ */
164
+ exports.NFSE_ADN_LIMITS = Object.freeze({
165
+ /** Manual dos Municípios §1.4.2.b: "Quantidade máxima de documentos no lote: 50". */
166
+ maxDocumentsPerBatch: { value: 50, evidence: 'official' },
167
+ /**
168
+ * Manual dos Municípios §1.4.2.b: espera mínima de UMA HORA depois de receber
169
+ * a indicação de que não há mais documentos.
170
+ *
171
+ * Isto corrige o comentário da Fase 1, que dizia que a NFS-e "não publica a
172
+ * regra de uma hora que a NF-e publica" e que adotávamos 3600s por simetria.
173
+ * Ela publica. A regra é dela, não emprestada.
174
+ */
175
+ exhaustedWaitSeconds: { value: 3600, evidence: 'official' },
176
+ /**
177
+ * Teto de bytes da resposta HTTP. DEFENSIVO — a norma não fixa um.
178
+ *
179
+ * 16 MiB acomoda com folga 50 documentos comprimidos (uma NFS-e tem alguns KB)
180
+ * e impede que um servidor comprometido, um proxy hostil ou um defeito do lado
181
+ * de lá transformem uma sincronização em consumo ilimitado de memória.
182
+ */
183
+ maxResponseBytes: { value: 16 * 1024 * 1024, evidence: 'unverified' },
184
+ /**
185
+ * Teto de bytes DESCOMPACTADOS por documento. DEFENSIVO.
186
+ *
187
+ * É o mesmo 8 MiB que `decodeFiscalXml` já impõe ao XML. Repeti-lo aqui não é
188
+ * duplicação: sem ele, uma bomba de descompressão estoura a memória ANTES de
189
+ * o leitor de XML ter a chance de recusar o tamanho.
190
+ */
191
+ maxDecompressedBytesPerDocument: {
192
+ value: 8 * 1024 * 1024,
193
+ evidence: 'unverified',
194
+ },
195
+ /**
196
+ * Teto de bytes descompactados do lote inteiro. DEFENSIVO.
197
+ *
198
+ * 50 × 8 MiB seriam 400 MiB — o produto dos dois tetos anteriores não é um
199
+ * teto útil. 64 MiB é generoso para o caso real e finito para o hostil.
200
+ */
201
+ maxDecompressedBytesPerBatch: {
202
+ value: 64 * 1024 * 1024,
203
+ evidence: 'unverified',
204
+ },
205
+ /** Teto de espera de uma requisição. DEFENSIVO — ver `FiscalTransportRequest`. */
206
+ requestTimeoutMs: { value: 30_000, evidence: 'unverified' },
207
+ });
208
+ /**
209
+ * As quatro séries de NSU do ADN — Manual dos Municípios §1.3.4.
210
+ *
211
+ * Confundi-las é o erro caro: cada uma numera um conjunto diferente de fatos, e
212
+ * usar o cursor de uma para consultar outra pularia documentos em silêncio.
213
+ * A nossa é a QUARTA, e apenas ela.
214
+ */
215
+ exports.NFSE_ADN_NSU_SERIES = Object.freeze({
216
+ general: 'NSU Geral do ADN (por DF-e) — controle interno do ADN; NÃO é distribuição.',
217
+ municipalReception: 'NSU de Recepção/Backup (por Código de Município) — do município emissor.',
218
+ municipalDistribution: 'NSU de Distribuição (por Código de Município) — do município interessado.',
219
+ actorDistribution: 'NSU de Distribuição para os atores da NFS-e (por CPF/CNPJ) — Prestador, Tomador e Intermediário. É ESTA que o Office consome.',
220
+ });
221
+ /** A série que este adapter consome. Explícito para que nunca seja "a outra". */
222
+ exports.NFSE_ADN_NSU_SERIES_IN_USE = 'actorDistribution';
223
+ /**
224
+ * A matriz de contrato. Nada aqui é inferido em silêncio.
225
+ *
226
+ * Onde a fonte oficial não diz, o campo diz "não publicado" e o item entra em
227
+ * `unverified`. Um campo preenchido com a melhor suposição e sem marca seria
228
+ * indistinguível de um campo conferido — e essa indistinção é precisamente o
229
+ * defeito que a Fase 3 fecha.
230
+ */
231
+ exports.NFSE_ADN_OPERATIONS = Object.freeze([
232
+ Object.freeze({
233
+ id: 'dfe-distribution',
234
+ method: 'GET',
235
+ path: '/DFe/{NSU}',
236
+ environments: ['homologation', 'production'],
237
+ authentication: 'TLS mútuo com certificado ICP-Brasil de pessoa jurídica; o certificado estabelece a conexão e identifica o solicitante.',
238
+ identityScope: 'CNPJ Raiz do certificado. O manual v1.0 acrescentou um parâmetro para consultar CNPJ diferente do certificado, validando a RAIZ entre os dois — o que autoriza filial da MESMA raiz, e nada além dela.',
239
+ requestFormat: 'Sem corpo. O NSU de continuação vai no caminho; `0` é o começo disponível.',
240
+ responseFormat: 'JSON (Manual dos Municípios §1.3.2: "As mensagens de comunicação com a API utilizarão o padrão JSON"), transportando DF-e cujo leiaute é XML assinado.',
241
+ cursorSemantics: 'Até 50 DF-e a partir do último NSU informado, em ordem CRESCENTE de NSU. O NSU é gerado por ordem cronológica de RECEPÇÃO pelo ADN, não de emissão. Documentos compartilhados pelo próprio solicitante não são distribuídos a ele.',
242
+ emptySemantics: 'Três desfechos publicados: rejeição com motivo; "nenhum documento localizado"; documento localizado. Para o contribuinte, "nenhum documento" é o código E2215 (a partir do NSU) ou E2230 (NSU pontual). Esgotamento é ultNSU === maxNSU, e obriga espera de 1h.',
243
+ errorShape: 'Códigos E1xxx/E2xxx do ANEXO_IV. O envelope JSON que os carrega NÃO está publicado fora do Swagger protegido por mTLS.',
244
+ rateLimitSemantics: 'Espera mínima de 1 hora após a indicação de esgotamento. A norma não publica cabeçalho de limite nem código HTTP de excesso para este endpoint.',
245
+ sourceId: 'manual-contribuintes-adn',
246
+ implemented: true,
247
+ unverified: Object.freeze([
248
+ 'nomes e capitalização dos campos do envelope JSON',
249
+ 'status HTTP associado a cada um dos três desfechos',
250
+ 'codificação do conteúdo do documento (gzip+base64 é a forma usada pelo docZip da NF-e, não confirmada aqui)',
251
+ 'nome do parâmetro de CNPJ de consulta acrescentado na v1.0',
252
+ ]),
253
+ }),
254
+ Object.freeze({
255
+ id: 'nfse-events-by-key',
256
+ method: 'GET',
257
+ path: '/NFSe/{ChaveAcesso}/Eventos',
258
+ environments: ['homologation', 'production'],
259
+ authentication: 'TLS mútuo com certificado ICP-Brasil, idem.',
260
+ identityScope: 'A chave precisa referenciar o contribuinte solicitante; caso contrário E2241.',
261
+ requestFormat: 'Sem corpo. Chave de acesso de 53 posições no caminho.',
262
+ responseFormat: 'JSON com os eventos vinculados à chave; conteúdo XML por evento.',
263
+ cursorSemantics: 'Não tem cursor: é consulta pontual por chave.',
264
+ emptySemantics: 'E2240 — chave não localizada. E2241 — chave não referencia o solicitante.',
265
+ errorShape: 'Idem, códigos E2xxx do ANEXO_IV.',
266
+ rateLimitSemantics: 'Não publicada para esta operação.',
267
+ sourceId: 'manual-contribuintes-adn',
268
+ // Deliberadamente NÃO implementada nesta fase. O motor recebe os eventos
269
+ // pela própria distribuição por NSU — a série de atores distribui os eventos
270
+ // junto com os documentos (ANEXO_IV, aba de geração de NSU). Uma segunda
271
+ // porta para o mesmo fato só acrescentaria consumo contra o ambiente
272
+ // nacional sem trazer informação nova.
273
+ implemented: false,
274
+ unverified: Object.freeze(['envelope JSON', 'status HTTP por desfecho']),
275
+ }),
276
+ ]);
277
+ exports.NFSE_ADN_OFFICIAL_CODES = Object.freeze(Object.fromEntries([
278
+ // ── Distribuição para os ATORES (o nosso caminho) ────────────────────
279
+ [
280
+ 'E2215',
281
+ 'Não existem DF-e para o contribuinte a partir do NSU informado',
282
+ 'no_documents',
283
+ null,
284
+ ],
285
+ ['E2230', 'Não existe DF-e para o contribuinte com o NSU informado', 'no_documents', null],
286
+ ['E2240', 'Chave de acesso não localizada', 'no_documents', null],
287
+ [
288
+ 'E2241',
289
+ 'Chave de acesso não referencia o contribuinte solicitante',
290
+ 'error',
291
+ 'not_allowed',
292
+ ],
293
+ // ── Certificado de transmissão ───────────────────────────────────────
294
+ ['E1200', 'Certificado de transmissão inválido', 'error', 'auth'],
295
+ ['E1203', 'Certificado de transmissão expirado', 'error', 'auth'],
296
+ ['E1205', 'Erro na cadeia de certificação', 'error', 'auth'],
297
+ ['E1206', 'Erro de acesso à LCR', 'error', 'auth'],
298
+ ['E1207', 'Certificado de transmissão revogado', 'error', 'auth'],
299
+ ['E1208', 'Certificado não tem raiz ICP-Brasil', 'error', 'auth'],
300
+ ['E1209', 'Certificado de transmissão sem CNPJ', 'error', 'auth'],
301
+ ['E2000', 'Erro no certificado de transmissão', 'error', 'auth'],
302
+ // ── Autorização e cadastro ───────────────────────────────────────────
303
+ [
304
+ 'E1262',
305
+ 'CNPJ não autorizado a compartilhar DF-e pelo município conveniado',
306
+ 'error',
307
+ 'not_allowed',
308
+ ],
309
+ ['E2001', 'CNPJ não cadastrado para nenhum município conveniado', 'error', 'not_allowed'],
310
+ ['E2301', 'CNPJ não cadastrado', 'error', 'not_allowed'],
311
+ // ── Serviço ──────────────────────────────────────────────────────────
312
+ ['E1217', 'Serviço paralisado para manutenção', 'error', 'transient'],
313
+ // ── Mensagem e área de dados ─────────────────────────────────────────
314
+ ['E1219', 'Número de documentos maior que o limite', 'error', 'invalid'],
315
+ ['E1225', 'Falha na decodificação da base64 da área de dados', 'error', 'invalid'],
316
+ ['E1226', 'Estrutura descompactada mal formada', 'error', 'invalid'],
317
+ ['E1228', 'Prefixo de namespace não permitido', 'error', 'invalid'],
318
+ ['E1229', 'XML fora de UTF-8', 'error', 'invalid'],
319
+ ['E1235', 'Falha no esquema XML do DF-e', 'error', 'invalid'],
320
+ ['E1242', 'Tipo de DF-e não tratado pelo Sistema Nacional NFS-e', 'error', 'invalid'],
321
+ ['E1245', 'Certificado da assinatura do lote sem CNPJ', 'error', 'invalid'],
322
+ ['E1246', 'Certificado da assinatura do lote — erro na cadeia', 'error', 'invalid'],
323
+ ['E1250', 'Assinatura difere do calculado', 'error', 'invalid'],
324
+ ].map(([code, meaning, outcome, errorClass]) => [
325
+ code,
326
+ Object.freeze({ code, meaning, outcome, errorClass }),
327
+ ])));
328
+ /**
329
+ * O perfil OFICIAL — a melhor leitura disponível, e declaradamente não conferida.
330
+ *
331
+ * Os nomes vêm da descrição pública da API e da simetria com o `docZip` da
332
+ * NF-e. Estão aqui para que exista UM lugar onde corrigi-los no dia em que
333
+ * alguém vir a resposta — e para que o `verified: false` mantenha o transporte
334
+ * real fechado até esse dia.
335
+ */
336
+ exports.ADN_OFFICIAL_ENVELOPE_PROFILE = Object.freeze({
337
+ id: 'nfse-adn:v1/official',
338
+ contractVersion: exports.NFSE_ADN_CONTRACT_VERSION,
339
+ verified: exports.NFSE_ADN_ENVELOPE_SHAPE_VERIFIED,
340
+ environments: Object.freeze(['homologation', 'production']),
341
+ batchField: 'LoteDFe',
342
+ itemNsuField: 'NSU',
343
+ itemContentField: 'ArquivoXml',
344
+ lastNsuField: 'UltimoNSU',
345
+ maxNsuField: 'MaximoNSU',
346
+ codeField: 'Codigo',
347
+ contentEncoding: 'gzip+base64',
348
+ });
349
+ /**
350
+ * O perfil SINTÉTICO — conferido, porque somos nós quem o define.
351
+ *
352
+ * Não há circularidade: ele não afirma nada sobre o ADN. Ele descreve o servidor
353
+ * de mentira que a suíte levanta, e `verified: true` aqui significa apenas "o
354
+ * parser e o servidor sintético concordam", que é uma afirmação verificável e
355
+ * verificada. `environments: ['synthetic']` impede que ele seja usado como
356
+ * atalho para abrir o transporte real.
357
+ */
358
+ exports.ADN_SYNTHETIC_ENVELOPE_PROFILE = Object.freeze({
359
+ id: 'nfse-adn:v1/synthetic',
360
+ contractVersion: exports.NFSE_ADN_CONTRACT_VERSION,
361
+ verified: true,
362
+ environments: Object.freeze(['synthetic']),
363
+ batchField: 'LoteDFe',
364
+ itemNsuField: 'NSU',
365
+ itemContentField: 'ArquivoXml',
366
+ lastNsuField: 'UltimoNSU',
367
+ maxNsuField: 'MaximoNSU',
368
+ codeField: 'Codigo',
369
+ contentEncoding: 'gzip+base64',
370
+ });
371
+ /**
372
+ * O transporte real está ligado?
373
+ *
374
+ * Constante, e não variável de ambiente, por decisão de fase: uma variável de
375
+ * ambiente é ligável sem revisão, e a primeira conexão fiscal real do produto
376
+ * não deve poder acontecer por causa de uma linha num painel. Quando o portão
377
+ * humano da Fase 4 for aberto, isto vira um commit — revisável, revertível, e
378
+ * com o nome de quem o abriu.
379
+ */
380
+ exports.ADN_REAL_TRANSPORT_ENABLED = false;
381
+ /** Motivos pelos quais o transporte real está fechado, para tela e trilha. */
382
+ function adnRealTransportBlockers(profile = exports.ADN_OFFICIAL_ENVELOPE_PROFILE) {
383
+ const razoes = [];
384
+ if (!exports.ADN_REAL_TRANSPORT_ENABLED)
385
+ razoes.push('ADN_REAL_TRANSPORT_DISABLED');
386
+ if (!profile.verified)
387
+ razoes.push('ADN_ENVELOPE_UNVERIFIED');
388
+ return Object.freeze(razoes);
389
+ }
390
+ //# sourceMappingURL=nfse-adn-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nfse-adn-contract.js","sourceRoot":"","sources":["../../../../src/fiscal/contracts/nfse-adn-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdnEndpointNotAllowedError = void 0;
4
+ exports.resolveAdnBaseUrl = resolveAdnBaseUrl;
5
+ const node_url_1 = require("node:url");
6
+ const provider_js_1 = require("../ingestion/provider.js");
7
+ const nfse_adn_contract_js_1 = require("./nfse-adn-contract.js");
8
+ /**
9
+ * Para onde o worker fiscal PODE abrir socket — e a resposta é uma lista curta.
10
+ *
11
+ * ## O risco concreto, e não teórico
12
+ *
13
+ * O transporte do ADN aceitava `baseUrl` livre. Ela existe por um motivo
14
+ * legítimo: o servidor sintético da suíte precisa entrar no lugar do host
15
+ * oficial. Mas nada impedia que esse mesmo campo chegasse de configuração de
16
+ * tenant, de uma coluna de cadastro de provedor ou de um parâmetro de rota — e
17
+ * então o worker fiscal, que roda dentro da rede com o certificado do cliente
18
+ * carregado, vira um proxy HTTP de destino escolhido por terceiro.
19
+ *
20
+ * O dano não é abstrato: o alvo natural de um SSRF em nuvem é o metadata do
21
+ * provedor, e o corpo da resposta seria devolvido ao chamador pelo caminho de
22
+ * ingestão. Pior: o certificado ICP-Brasil do CONTRIBUINTE seria apresentado ao
23
+ * destino escolhido pelo atacante.
24
+ *
25
+ * ## Por que allowlist, e por que tão estreita
26
+ *
27
+ * Uma denylist ("não pode ser IP interno") erra por construção: DNS rebinding,
28
+ * redirecionamento, IPv6 mapeado, notação decimal de IP. A allowlist responde à
29
+ * pergunta certa — "quais são os destinos legítimos?" — e a resposta oficial tem
30
+ * exatamente dois nomes.
31
+ *
32
+ * Para o ambiente sintético o destino permitido é o loopback, e só ele. Um
33
+ * servidor de teste que precise sair da máquina é um teste que precisa de outro
34
+ * desenho, não de um portão mais frouxo.
35
+ */
36
+ /** Onde o ambiente sintético pode falar. Nada além da própria máquina. */
37
+ const LOOPBACK = new Set(['127.0.0.1', 'localhost', '::1', '[::1]']);
38
+ class AdnEndpointNotAllowedError extends provider_js_1.FiscalProviderError {
39
+ detail;
40
+ constructor(detail) {
41
+ super('not_allowed', `destino recusado pela allowlist do ADN: ${detail}`, 'ENDPOINT_NOT_ALLOWED');
42
+ this.detail = detail;
43
+ this.name = 'AdnEndpointNotAllowedError';
44
+ }
45
+ }
46
+ exports.AdnEndpointNotAllowedError = AdnEndpointNotAllowedError;
47
+ /**
48
+ * Resolve e AUTORIZA a base do ADN para um ambiente.
49
+ *
50
+ * Devolve sempre uma URL sem barra final, para que a composição de caminho em
51
+ * `adnDfeUrl` seja uma concatenação e não uma decisão.
52
+ */
53
+ function resolveAdnBaseUrl(environment, baseUrl) {
54
+ if (environment === 'synthetic') {
55
+ if (!baseUrl) {
56
+ // Sem base explícita, o default apontaria para o host oficial — e um teste
57
+ // que "esqueceu" de configurar o servidor de mentira falaria com o governo.
58
+ throw new provider_js_1.FiscalProviderError('invalid', 'ambiente sintético exige baseUrl explícita', 'SYNTHETIC_BASE_URL_REQUIRED');
59
+ }
60
+ const u = parseOrRefuse(baseUrl);
61
+ if (!LOOPBACK.has(u.hostname)) {
62
+ throw new AdnEndpointNotAllowedError('sintético só fala com loopback');
63
+ }
64
+ return semBarraFinal(u);
65
+ }
66
+ const oficial = nfse_adn_contract_js_1.NFSE_ADN_HOSTS[environment === 'production' ? 'production' : 'homologation'];
67
+ if (!baseUrl)
68
+ return `https://${oficial}`;
69
+ const u = parseOrRefuse(baseUrl);
70
+ // Comparação por igualdade do hostname, e nunca `includes`/`endsWith`: um
71
+ // `endsWith('nfse.gov.br')` aceitaria `adn.nfse.gov.br.exemplo.com`, que é o
72
+ // truque mais antigo do gênero.
73
+ if (u.hostname !== oficial) {
74
+ throw new AdnEndpointNotAllowedError('host fora da lista oficial do ambiente');
75
+ }
76
+ // Porta não padrão contra o host oficial não é um cenário legítimo: seria um
77
+ // desvio para um serviço diferente no mesmo nome.
78
+ if (u.port !== '' && u.port !== '443') {
79
+ throw new AdnEndpointNotAllowedError('porta não padrão contra host oficial');
80
+ }
81
+ return semBarraFinal(u);
82
+ }
83
+ function parseOrRefuse(raw) {
84
+ let u;
85
+ try {
86
+ u = new node_url_1.URL(raw);
87
+ }
88
+ catch {
89
+ throw new AdnEndpointNotAllowedError('URL ilegível');
90
+ }
91
+ // `http:` aqui não é degradação de conforto: é o certificado do CLIENTE
92
+ // viajando em claro contra a Receita.
93
+ if (u.protocol !== 'https:')
94
+ throw new AdnEndpointNotAllowedError('esquema não é https');
95
+ // Credencial embutida na URL vaza em log, em `err.stack` e em trilha. O
96
+ // caminho legítimo para credencial neste motor é o material de TLS.
97
+ if (u.username !== '' || u.password !== '') {
98
+ throw new AdnEndpointNotAllowedError('URL com credencial embutida');
99
+ }
100
+ if (u.search !== '' || u.hash !== '') {
101
+ throw new AdnEndpointNotAllowedError('base com query ou fragmento');
102
+ }
103
+ return u;
104
+ }
105
+ function semBarraFinal(u) {
106
+ return `${u.origin}${u.pathname}`.replace(/\/+$/, '');
107
+ }
108
+ //# sourceMappingURL=nfse-adn-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nfse-adn-endpoint.js","sourceRoot":"","sources":["../../../../src/fiscal/contracts/nfse-adn-endpoint.ts"],"names":[],"mappings":"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"}