@baruk/core 0.4.2 → 0.6.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 (576) 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 +117 -0
  34. package/dist/cjs/clients/ibge.js.map +1 -0
  35. package/dist/cjs/clients/registry/http.js +157 -0
  36. package/dist/cjs/clients/registry/http.js.map +1 -0
  37. package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
  38. package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
  39. package/dist/cjs/clients/registry/ibge.js +63 -0
  40. package/dist/cjs/clients/registry/ibge.js.map +1 -0
  41. package/dist/cjs/clients/registry/lookup.js +191 -0
  42. package/dist/cjs/clients/registry/lookup.js.map +1 -0
  43. package/dist/cjs/clients/registry/provider.js +34 -0
  44. package/dist/cjs/clients/registry/provider.js.map +1 -0
  45. package/dist/cjs/clients/registry/resolve.js +47 -0
  46. package/dist/cjs/clients/registry/resolve.js.map +1 -0
  47. package/dist/cjs/clients/registry/serpro.js +149 -0
  48. package/dist/cjs/clients/registry/serpro.js.map +1 -0
  49. package/dist/cjs/clients/registry/service.js +230 -0
  50. package/dist/cjs/clients/registry/service.js.map +1 -0
  51. package/dist/cjs/clients/registry/synthetic.js +165 -0
  52. package/dist/cjs/clients/registry/synthetic.js.map +1 -0
  53. package/dist/cjs/clients/repository.js +190 -9
  54. package/dist/cjs/clients/repository.js.map +1 -1
  55. package/dist/cjs/collection/branding.js +190 -0
  56. package/dist/cjs/collection/branding.js.map +1 -1
  57. package/dist/cjs/collection/clearance-store.js +74 -0
  58. package/dist/cjs/collection/clearance-store.js.map +1 -0
  59. package/dist/cjs/collection/communication-runtime.js +65 -2
  60. package/dist/cjs/collection/communication-runtime.js.map +1 -1
  61. package/dist/cjs/collection/engine.js +20 -0
  62. package/dist/cjs/collection/engine.js.map +1 -1
  63. package/dist/cjs/collection/policy.js +29 -1
  64. package/dist/cjs/collection/policy.js.map +1 -1
  65. package/dist/cjs/communication/clearance.js +18 -0
  66. package/dist/cjs/communication/clearance.js.map +1 -0
  67. package/dist/cjs/communication/dry-run-scenario.js +5 -0
  68. package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
  69. package/dist/cjs/communication/engine.js +12 -0
  70. package/dist/cjs/communication/engine.js.map +1 -1
  71. package/dist/cjs/communication/policy.js.map +1 -1
  72. package/dist/cjs/competence/business-days.js +155 -0
  73. package/dist/cjs/competence/business-days.js.map +1 -0
  74. package/dist/cjs/competence/catalog-validation.js +174 -0
  75. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  76. package/dist/cjs/competence/obligation-preview.js +190 -0
  77. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  78. package/dist/cjs/competence/repository.js +330 -17
  79. package/dist/cjs/competence/repository.js.map +1 -1
  80. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  81. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  82. package/dist/cjs/dashboard/repository.js +11 -1
  83. package/dist/cjs/dashboard/repository.js.map +1 -1
  84. package/dist/cjs/db/client.js +17 -11
  85. package/dist/cjs/db/client.js.map +1 -1
  86. package/dist/cjs/db/provision-e2e-identity.js +116 -0
  87. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  88. package/dist/cjs/fiscal/applicability.js +164 -0
  89. package/dist/cjs/fiscal/applicability.js.map +1 -0
  90. package/dist/cjs/fiscal/collection/authorization.js +186 -0
  91. package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
  92. package/dist/cjs/fiscal/collection/competence.js +97 -0
  93. package/dist/cjs/fiscal/collection/competence.js.map +1 -0
  94. package/dist/cjs/fiscal/collection/first-contact.js +204 -0
  95. package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
  96. package/dist/cjs/fiscal/collection/plan.js +122 -0
  97. package/dist/cjs/fiscal/collection/plan.js.map +1 -0
  98. package/dist/cjs/fiscal/conditions.js +198 -0
  99. package/dist/cjs/fiscal/conditions.js.map +1 -0
  100. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  101. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  102. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  103. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  104. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  105. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  106. package/dist/cjs/fiscal/coverage/model.js +137 -0
  107. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  108. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  109. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  110. package/dist/cjs/fiscal/credentials/inspect.js +182 -0
  111. package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
  112. package/dist/cjs/fiscal/credentials/material.js +168 -0
  113. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  114. package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
  115. package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
  116. package/dist/cjs/fiscal/credentials/readiness.js +190 -0
  117. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  118. package/dist/cjs/fiscal/eligibility.js +199 -0
  119. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  120. package/dist/cjs/fiscal/enrollment.js +134 -0
  121. package/dist/cjs/fiscal/enrollment.js.map +1 -0
  122. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  123. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  124. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  125. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  126. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  127. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  128. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  129. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  130. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  131. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  132. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  133. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  134. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  135. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  136. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  137. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  138. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  139. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  140. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  141. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  142. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  143. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  144. package/dist/cjs/fiscal/repository.js +470 -0
  145. package/dist/cjs/fiscal/repository.js.map +1 -0
  146. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  147. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  148. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  149. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  150. package/dist/cjs/fiscal/sync/lease.js +146 -0
  151. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  152. package/dist/cjs/fiscal/sync/observability.js +244 -0
  153. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  154. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  155. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  156. package/dist/cjs/fiscal/sync/policy.js +143 -0
  157. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  158. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  159. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  160. package/dist/cjs/fiscal/sync/retry.js +183 -0
  161. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  162. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  163. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  164. package/dist/cjs/fiscal/transport/https.js +309 -0
  165. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  166. package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
  167. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  168. package/dist/cjs/fiscal/transport/types.js +93 -0
  169. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  170. package/dist/cjs/import/br-documents.js +85 -0
  171. package/dist/cjs/import/br-documents.js.map +1 -0
  172. package/dist/cjs/import/clients-import.js +347 -40
  173. package/dist/cjs/import/clients-import.js.map +1 -1
  174. package/dist/cjs/index.js +461 -73
  175. package/dist/cjs/index.js.map +1 -1
  176. package/dist/cjs/legal/documents.js +164 -19
  177. package/dist/cjs/legal/documents.js.map +1 -1
  178. package/dist/cjs/legal/index.js +3 -1
  179. package/dist/cjs/legal/index.js.map +1 -1
  180. package/dist/cjs/legal/types.js.map +1 -1
  181. package/dist/cjs/onboarding/persistence.js +4 -4
  182. package/dist/cjs/onboarding/persistence.js.map +1 -1
  183. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  184. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  185. package/dist/cjs/pilot/milestone.js +79 -0
  186. package/dist/cjs/pilot/milestone.js.map +1 -0
  187. package/dist/cjs/platform/capabilities.js +173 -0
  188. package/dist/cjs/platform/capabilities.js.map +1 -0
  189. package/dist/cjs/platform/job-contract.js +411 -0
  190. package/dist/cjs/platform/job-contract.js.map +1 -0
  191. package/dist/cjs/rbac/catalog.js +110 -0
  192. package/dist/cjs/rbac/catalog.js.map +1 -1
  193. package/dist/cjs/subscription-billing/index.js +9 -1
  194. package/dist/cjs/subscription-billing/index.js.map +1 -1
  195. package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
  196. package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
  197. package/dist/cjs/subscription-billing/service.js +246 -78
  198. package/dist/cjs/subscription-billing/service.js.map +1 -1
  199. package/dist/cjs/tenancy/features.js +131 -0
  200. package/dist/cjs/tenancy/features.js.map +1 -0
  201. package/dist/cjs/tenancy/settings.js +224 -0
  202. package/dist/cjs/tenancy/settings.js.map +1 -0
  203. package/dist/cjs/users/repository.js +24 -1
  204. package/dist/cjs/users/repository.js.map +1 -1
  205. package/dist/cjs/vault/repository.js +92 -5
  206. package/dist/cjs/vault/repository.js.map +1 -1
  207. package/dist/clients/ibge.d.ts +17 -0
  208. package/dist/clients/ibge.d.ts.map +1 -0
  209. package/dist/clients/ibge.js +112 -0
  210. package/dist/clients/ibge.js.map +1 -0
  211. package/dist/clients/registry/http.d.ts +61 -0
  212. package/dist/clients/registry/http.d.ts.map +1 -0
  213. package/dist/clients/registry/http.js +151 -0
  214. package/dist/clients/registry/http.js.map +1 -0
  215. package/dist/clients/registry/ibge-municipios.d.ts +25 -0
  216. package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
  217. package/dist/clients/registry/ibge-municipios.js +25 -0
  218. package/dist/clients/registry/ibge-municipios.js.map +1 -0
  219. package/dist/clients/registry/ibge.d.ts +62 -0
  220. package/dist/clients/registry/ibge.d.ts.map +1 -0
  221. package/dist/clients/registry/ibge.js +57 -0
  222. package/dist/clients/registry/ibge.js.map +1 -0
  223. package/dist/clients/registry/lookup.d.ts +94 -0
  224. package/dist/clients/registry/lookup.d.ts.map +1 -0
  225. package/dist/clients/registry/lookup.js +184 -0
  226. package/dist/clients/registry/lookup.js.map +1 -0
  227. package/dist/clients/registry/provider.d.ts +124 -0
  228. package/dist/clients/registry/provider.d.ts.map +1 -0
  229. package/dist/clients/registry/provider.js +39 -0
  230. package/dist/clients/registry/provider.js.map +1 -0
  231. package/dist/clients/registry/resolve.d.ts +36 -0
  232. package/dist/clients/registry/resolve.d.ts.map +1 -0
  233. package/dist/clients/registry/resolve.js +44 -0
  234. package/dist/clients/registry/resolve.js.map +1 -0
  235. package/dist/clients/registry/serpro.d.ts +57 -0
  236. package/dist/clients/registry/serpro.d.ts.map +1 -0
  237. package/dist/clients/registry/serpro.js +143 -0
  238. package/dist/clients/registry/serpro.js.map +1 -0
  239. package/dist/clients/registry/service.d.ts +59 -0
  240. package/dist/clients/registry/service.d.ts.map +1 -0
  241. package/dist/clients/registry/service.js +225 -0
  242. package/dist/clients/registry/service.js.map +1 -0
  243. package/dist/clients/registry/synthetic.d.ts +30 -0
  244. package/dist/clients/registry/synthetic.d.ts.map +1 -0
  245. package/dist/clients/registry/synthetic.js +161 -0
  246. package/dist/clients/registry/synthetic.js.map +1 -0
  247. package/dist/clients/repository.d.ts +158 -0
  248. package/dist/clients/repository.d.ts.map +1 -1
  249. package/dist/clients/repository.js +186 -9
  250. package/dist/clients/repository.js.map +1 -1
  251. package/dist/collection/branding.d.ts +65 -0
  252. package/dist/collection/branding.d.ts.map +1 -1
  253. package/dist/collection/branding.js +186 -0
  254. package/dist/collection/branding.js.map +1 -1
  255. package/dist/collection/clearance-store.d.ts +39 -0
  256. package/dist/collection/clearance-store.d.ts.map +1 -0
  257. package/dist/collection/clearance-store.js +69 -0
  258. package/dist/collection/clearance-store.js.map +1 -0
  259. package/dist/collection/communication-runtime.d.ts +37 -0
  260. package/dist/collection/communication-runtime.d.ts.map +1 -1
  261. package/dist/collection/communication-runtime.js +63 -1
  262. package/dist/collection/communication-runtime.js.map +1 -1
  263. package/dist/collection/engine.d.ts +23 -0
  264. package/dist/collection/engine.d.ts.map +1 -1
  265. package/dist/collection/engine.js +20 -0
  266. package/dist/collection/engine.js.map +1 -1
  267. package/dist/collection/policy.d.ts +25 -0
  268. package/dist/collection/policy.d.ts.map +1 -1
  269. package/dist/collection/policy.js +27 -0
  270. package/dist/collection/policy.js.map +1 -1
  271. package/dist/communication/clearance.d.ts +53 -0
  272. package/dist/communication/clearance.d.ts.map +1 -0
  273. package/dist/communication/clearance.js +15 -0
  274. package/dist/communication/clearance.js.map +1 -0
  275. package/dist/communication/dry-run-scenario.d.ts.map +1 -1
  276. package/dist/communication/dry-run-scenario.js +5 -0
  277. package/dist/communication/dry-run-scenario.js.map +1 -1
  278. package/dist/communication/engine.d.ts +10 -0
  279. package/dist/communication/engine.d.ts.map +1 -1
  280. package/dist/communication/engine.js +12 -0
  281. package/dist/communication/engine.js.map +1 -1
  282. package/dist/communication/policy.d.ts +16 -0
  283. package/dist/communication/policy.d.ts.map +1 -1
  284. package/dist/communication/policy.js.map +1 -1
  285. package/dist/competence/business-days.d.ts +51 -0
  286. package/dist/competence/business-days.d.ts.map +1 -0
  287. package/dist/competence/business-days.js +145 -0
  288. package/dist/competence/business-days.js.map +1 -0
  289. package/dist/competence/catalog-validation.d.ts +86 -0
  290. package/dist/competence/catalog-validation.d.ts.map +1 -0
  291. package/dist/competence/catalog-validation.js +168 -0
  292. package/dist/competence/catalog-validation.js.map +1 -0
  293. package/dist/competence/obligation-preview.d.ts +103 -0
  294. package/dist/competence/obligation-preview.d.ts.map +1 -0
  295. package/dist/competence/obligation-preview.js +184 -0
  296. package/dist/competence/obligation-preview.js.map +1 -0
  297. package/dist/competence/repository.d.ts +139 -1
  298. package/dist/competence/repository.d.ts.map +1 -1
  299. package/dist/competence/repository.js +325 -17
  300. package/dist/competence/repository.js.map +1 -1
  301. package/dist/dashboard/pilot-panel.d.ts +100 -0
  302. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  303. package/dist/dashboard/pilot-panel.js +87 -0
  304. package/dist/dashboard/pilot-panel.js.map +1 -0
  305. package/dist/dashboard/repository.d.ts.map +1 -1
  306. package/dist/dashboard/repository.js +11 -1
  307. package/dist/dashboard/repository.js.map +1 -1
  308. package/dist/db/client.d.ts +45 -0
  309. package/dist/db/client.d.ts.map +1 -1
  310. package/dist/db/client.js +16 -11
  311. package/dist/db/client.js.map +1 -1
  312. package/dist/db/migrate.d.ts +36 -1
  313. package/dist/db/migrate.d.ts.map +1 -1
  314. package/dist/db/migrate.js +199 -32
  315. package/dist/db/migrate.js.map +1 -1
  316. package/dist/db/provision-e2e-identity.d.ts +2 -0
  317. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  318. package/dist/db/provision-e2e-identity.js +114 -0
  319. package/dist/db/provision-e2e-identity.js.map +1 -0
  320. package/dist/fiscal/applicability.d.ts +73 -0
  321. package/dist/fiscal/applicability.d.ts.map +1 -0
  322. package/dist/fiscal/applicability.js +160 -0
  323. package/dist/fiscal/applicability.js.map +1 -0
  324. package/dist/fiscal/collection/authorization.d.ts +152 -0
  325. package/dist/fiscal/collection/authorization.d.ts.map +1 -0
  326. package/dist/fiscal/collection/authorization.js +178 -0
  327. package/dist/fiscal/collection/authorization.js.map +1 -0
  328. package/dist/fiscal/collection/competence.d.ts +66 -0
  329. package/dist/fiscal/collection/competence.d.ts.map +1 -0
  330. package/dist/fiscal/collection/competence.js +90 -0
  331. package/dist/fiscal/collection/competence.js.map +1 -0
  332. package/dist/fiscal/collection/first-contact.d.ts +103 -0
  333. package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
  334. package/dist/fiscal/collection/first-contact.js +201 -0
  335. package/dist/fiscal/collection/first-contact.js.map +1 -0
  336. package/dist/fiscal/collection/plan.d.ts +74 -0
  337. package/dist/fiscal/collection/plan.d.ts.map +1 -0
  338. package/dist/fiscal/collection/plan.js +119 -0
  339. package/dist/fiscal/collection/plan.js.map +1 -0
  340. package/dist/fiscal/conditions.d.ts +99 -0
  341. package/dist/fiscal/conditions.d.ts.map +1 -0
  342. package/dist/fiscal/conditions.js +190 -0
  343. package/dist/fiscal/conditions.js.map +1 -0
  344. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  345. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  346. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  347. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  348. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  349. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  350. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  351. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  352. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  353. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  354. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  355. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  356. package/dist/fiscal/coverage/model.d.ts +114 -0
  357. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  358. package/dist/fiscal/coverage/model.js +130 -0
  359. package/dist/fiscal/coverage/model.js.map +1 -0
  360. package/dist/fiscal/coverage/requests.d.ts +70 -0
  361. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  362. package/dist/fiscal/coverage/requests.js +95 -0
  363. package/dist/fiscal/coverage/requests.js.map +1 -0
  364. package/dist/fiscal/credentials/inspect.d.ts +114 -0
  365. package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
  366. package/dist/fiscal/credentials/inspect.js +178 -0
  367. package/dist/fiscal/credentials/inspect.js.map +1 -0
  368. package/dist/fiscal/credentials/material.d.ts +81 -0
  369. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  370. package/dist/fiscal/credentials/material.js +164 -0
  371. package/dist/fiscal/credentials/material.js.map +1 -0
  372. package/dist/fiscal/credentials/onboarding.d.ts +119 -0
  373. package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
  374. package/dist/fiscal/credentials/onboarding.js +259 -0
  375. package/dist/fiscal/credentials/onboarding.js.map +1 -0
  376. package/dist/fiscal/credentials/readiness.d.ts +119 -0
  377. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  378. package/dist/fiscal/credentials/readiness.js +186 -0
  379. package/dist/fiscal/credentials/readiness.js.map +1 -0
  380. package/dist/fiscal/eligibility.d.ts +106 -0
  381. package/dist/fiscal/eligibility.d.ts.map +1 -0
  382. package/dist/fiscal/eligibility.js +194 -0
  383. package/dist/fiscal/eligibility.js.map +1 -0
  384. package/dist/fiscal/enrollment.d.ts +91 -0
  385. package/dist/fiscal/enrollment.d.ts.map +1 -0
  386. package/dist/fiscal/enrollment.js +126 -0
  387. package/dist/fiscal/enrollment.js.map +1 -0
  388. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  389. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  390. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  391. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  392. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  393. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  394. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  395. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  396. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  397. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  398. package/dist/fiscal/ingestion/direction.js +32 -0
  399. package/dist/fiscal/ingestion/direction.js.map +1 -0
  400. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  401. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  402. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  403. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  404. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  405. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  406. package/dist/fiscal/ingestion/pipeline.js +699 -0
  407. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  408. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  409. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  410. package/dist/fiscal/ingestion/provider.js +47 -0
  411. package/dist/fiscal/ingestion/provider.js.map +1 -0
  412. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  413. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  414. package/dist/fiscal/ingestion/repository.js +127 -0
  415. package/dist/fiscal/ingestion/repository.js.map +1 -0
  416. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  417. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  418. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  419. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  420. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  421. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  422. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  423. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  424. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  425. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  426. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  427. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  428. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  429. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  430. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  431. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  432. package/dist/fiscal/repository.d.ts +220 -0
  433. package/dist/fiscal/repository.d.ts.map +1 -0
  434. package/dist/fiscal/repository.js +449 -0
  435. package/dist/fiscal/repository.js.map +1 -0
  436. package/dist/fiscal/sync/circuit.d.ts +86 -0
  437. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  438. package/dist/fiscal/sync/circuit.js +118 -0
  439. package/dist/fiscal/sync/circuit.js.map +1 -0
  440. package/dist/fiscal/sync/intervention.d.ts +81 -0
  441. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  442. package/dist/fiscal/sync/intervention.js +135 -0
  443. package/dist/fiscal/sync/intervention.js.map +1 -0
  444. package/dist/fiscal/sync/lease.d.ts +118 -0
  445. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  446. package/dist/fiscal/sync/lease.js +139 -0
  447. package/dist/fiscal/sync/lease.js.map +1 -0
  448. package/dist/fiscal/sync/observability.d.ts +148 -0
  449. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  450. package/dist/fiscal/sync/observability.js +239 -0
  451. package/dist/fiscal/sync/observability.js.map +1 -0
  452. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  453. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  454. package/dist/fiscal/sync/orchestrator.js +487 -0
  455. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  456. package/dist/fiscal/sync/policy.d.ts +87 -0
  457. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  458. package/dist/fiscal/sync/policy.js +136 -0
  459. package/dist/fiscal/sync/policy.js.map +1 -0
  460. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  461. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  462. package/dist/fiscal/sync/reprocess.js +237 -0
  463. package/dist/fiscal/sync/reprocess.js.map +1 -0
  464. package/dist/fiscal/sync/retry.d.ts +82 -0
  465. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  466. package/dist/fiscal/sync/retry.js +176 -0
  467. package/dist/fiscal/sync/retry.js.map +1 -0
  468. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  469. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  470. package/dist/fiscal/sync/secret-boundary.js +116 -0
  471. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  472. package/dist/fiscal/transport/https.d.ts +86 -0
  473. package/dist/fiscal/transport/https.d.ts.map +1 -0
  474. package/dist/fiscal/transport/https.js +303 -0
  475. package/dist/fiscal/transport/https.js.map +1 -0
  476. package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
  477. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  478. package/dist/fiscal/transport/synthetic-tls.js +374 -0
  479. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  480. package/dist/fiscal/transport/types.d.ts +134 -0
  481. package/dist/fiscal/transport/types.d.ts.map +1 -0
  482. package/dist/fiscal/transport/types.js +88 -0
  483. package/dist/fiscal/transport/types.js.map +1 -0
  484. package/dist/import/br-documents.d.ts +26 -0
  485. package/dist/import/br-documents.d.ts.map +1 -0
  486. package/dist/import/br-documents.js +78 -0
  487. package/dist/import/br-documents.js.map +1 -0
  488. package/dist/import/clients-import.d.ts +122 -4
  489. package/dist/import/clients-import.d.ts.map +1 -1
  490. package/dist/import/clients-import.js +341 -41
  491. package/dist/import/clients-import.js.map +1 -1
  492. package/dist/index.d.ts +145 -13
  493. package/dist/index.d.ts.map +1 -1
  494. package/dist/index.js +120 -7
  495. package/dist/index.js.map +1 -1
  496. package/dist/legal/documents.d.ts +12 -1
  497. package/dist/legal/documents.d.ts.map +1 -1
  498. package/dist/legal/documents.js +162 -18
  499. package/dist/legal/documents.js.map +1 -1
  500. package/dist/legal/index.d.ts +2 -2
  501. package/dist/legal/index.d.ts.map +1 -1
  502. package/dist/legal/index.js +1 -1
  503. package/dist/legal/index.js.map +1 -1
  504. package/dist/legal/types.d.ts +114 -2
  505. package/dist/legal/types.d.ts.map +1 -1
  506. package/dist/legal/types.js.map +1 -1
  507. package/dist/onboarding/persistence.d.ts +10 -1
  508. package/dist/onboarding/persistence.d.ts.map +1 -1
  509. package/dist/onboarding/persistence.js +4 -4
  510. package/dist/onboarding/persistence.js.map +1 -1
  511. package/dist/pilot/go-live-checklist.d.ts +41 -0
  512. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  513. package/dist/pilot/go-live-checklist.js +209 -0
  514. package/dist/pilot/go-live-checklist.js.map +1 -0
  515. package/dist/pilot/milestone.d.ts +56 -0
  516. package/dist/pilot/milestone.d.ts.map +1 -0
  517. package/dist/pilot/milestone.js +74 -0
  518. package/dist/pilot/milestone.js.map +1 -0
  519. package/dist/platform/capabilities.d.ts +88 -0
  520. package/dist/platform/capabilities.d.ts.map +1 -0
  521. package/dist/platform/capabilities.js +169 -0
  522. package/dist/platform/capabilities.js.map +1 -0
  523. package/dist/platform/job-contract.d.ts +232 -0
  524. package/dist/platform/job-contract.d.ts.map +1 -0
  525. package/dist/platform/job-contract.js +403 -0
  526. package/dist/platform/job-contract.js.map +1 -0
  527. package/dist/rbac/catalog.d.ts.map +1 -1
  528. package/dist/rbac/catalog.js +110 -0
  529. package/dist/rbac/catalog.js.map +1 -1
  530. package/dist/subscription-billing/index.d.ts +8 -5
  531. package/dist/subscription-billing/index.d.ts.map +1 -1
  532. package/dist/subscription-billing/index.js +4 -3
  533. package/dist/subscription-billing/index.js.map +1 -1
  534. package/dist/subscription-billing/platform-exemption.d.ts +89 -0
  535. package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
  536. package/dist/subscription-billing/platform-exemption.js +113 -0
  537. package/dist/subscription-billing/platform-exemption.js.map +1 -0
  538. package/dist/subscription-billing/service.d.ts +74 -0
  539. package/dist/subscription-billing/service.d.ts.map +1 -1
  540. package/dist/subscription-billing/service.js +182 -16
  541. package/dist/subscription-billing/service.js.map +1 -1
  542. package/dist/tenancy/features.d.ts +69 -0
  543. package/dist/tenancy/features.d.ts.map +1 -0
  544. package/dist/tenancy/features.js +123 -0
  545. package/dist/tenancy/features.js.map +1 -0
  546. package/dist/tenancy/settings.d.ts +63 -0
  547. package/dist/tenancy/settings.d.ts.map +1 -0
  548. package/dist/tenancy/settings.js +218 -0
  549. package/dist/tenancy/settings.js.map +1 -0
  550. package/dist/users/repository.d.ts +16 -1
  551. package/dist/users/repository.d.ts.map +1 -1
  552. package/dist/users/repository.js +24 -1
  553. package/dist/users/repository.js.map +1 -1
  554. package/dist/vault/repository.d.ts +69 -1
  555. package/dist/vault/repository.d.ts.map +1 -1
  556. package/dist/vault/repository.js +88 -5
  557. package/dist/vault/repository.js.map +1 -1
  558. package/package.json +10 -2
  559. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  560. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  561. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  562. package/src/db/migrations/0048_item_type_note.sql +16 -0
  563. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  564. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  565. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  566. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  567. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  568. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  569. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  570. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  571. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  572. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  573. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
  574. package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
  575. package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
  576. package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/fiscal/coverage/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * O que dá para saber sobre um certificado SEM falar com ninguém.
3
+ *
4
+ * ## Por que a validação local existe, e o que ela não é
5
+ *
6
+ * Um A1 recém-cadastrado tem duas perguntas em aberto, e elas têm custos
7
+ * opostos. "A senha abre o arquivo?" custa milissegundos e nenhuma consequência
8
+ * externa. "A Receita aceita este titular?" custa uma requisição autenticada em
9
+ * nome de um terceiro — e, se ela for feita fora de hora, custa ao CLIENTE um
10
+ * CNPJ bloqueado.
11
+ *
12
+ * Este módulo responde só a primeira família de perguntas. O produto inteiro
13
+ * depende de nunca confundir as duas: `verified_at` (1004) continua significando
14
+ * "o ambiente oficial já aceitou", e nada aqui o preenche.
15
+ *
16
+ * ## Por que o SecureContext, e não uma biblioteca de PKCS#12
17
+ *
18
+ * O Node não expõe leitor de PKCS#12 na API pública — `X509Certificate` lê PEM e
19
+ * DER, não `.pfx`. As saídas óbvias seriam uma dependência nova (superfície
20
+ * grande para uma tela de upload) ou chamar o binário `openssl` (que exige o
21
+ * binário na imagem, e cuja saída de erro cita caminho de arquivo e sujeito do
22
+ * certificado).
23
+ *
24
+ * A saída usada aqui é o leitor de PKCS#12 que já está no processo: o do OpenSSL
25
+ * que o próprio Node embute. `tls.createSecureContext({ pfx, passphrase })` o
26
+ * invoca e LANÇA na hora se a senha não abrir — esse é o teste de senha, e ele
27
+ * não custa nem um socket. O contexto resultante guarda o certificado carregado,
28
+ * e o handle nativo o devolve em DER.
29
+ *
30
+ * A propriedade que isso compra é um ORÁCULO CORRETO: "abre aqui" passa a
31
+ * significar exatamente "abre no handshake real", porque é o mesmo código de
32
+ * OpenSSL, com os mesmos parâmetros, que o transporte de mTLS usaria. Um parser
33
+ * de terceiro poderia aceitar um arquivo que o handshake recusa — e a diferença
34
+ * apareceria só contra o servidor da Receita.
35
+ *
36
+ * ## A primeira escrita usava um servidor TLS em loopback, e estava errada
37
+ *
38
+ * Ela subia um servidor com o `pfx` em `127.0.0.1`, conectava um cliente do
39
+ * mesmo processo e lia o certificado apresentado. Funcionava — e exigia
40
+ * `rejectUnauthorized: false` no cliente, porque um A1 é assinado por uma AC da
41
+ * ICP-Brasil que não está no truststore e o nome nunca seria `localhost`.
42
+ *
43
+ * O guarda `tls-no-bypass` reprovou, e com razão. A resposta certa não era
44
+ * abrir uma exceção nominal para este arquivo: um controle com uma exceção tem
45
+ * duas na semana seguinte. Era não precisar da exceção — o que este caminho
46
+ * consegue, com menos código e sem socket nenhum.
47
+ *
48
+ * Nada toca o disco e nada toca a rede: `pfx` é um `Buffer`, e tudo acontece
49
+ * dentro do processo.
50
+ */
51
+ /** Classe da falha. CLASSE — a mensagem do OpenSSL cita sujeito e caminho. */
52
+ export type CertificateInspectionFailure = 'wrong_password' | 'malformed_material' | 'unsupported_material' | 'inspection_failed';
53
+ export interface CertificateFacts {
54
+ /** sha256 do DER do certificado apresentado, minúsculo e sem dois-pontos. */
55
+ fingerprintSha256: string;
56
+ subjectCommonName: string | null;
57
+ issuerCommonName: string | null;
58
+ /** Últimos 8 caracteres do serial. O serial inteiro identifica sem acrescentar. */
59
+ serialTail: string | null;
60
+ validFrom: string;
61
+ validTo: string;
62
+ /** Já venceu, medido contra o relógio de quem inspeciona. */
63
+ expired: boolean;
64
+ /**
65
+ * CNPJ/CPF lido DO MATERIAL — nunca o digitado no cadastro.
66
+ * `null` quando o certificado não o carrega em forma reconhecível.
67
+ */
68
+ document: string | null;
69
+ }
70
+ export type CertificateInspection = {
71
+ status: 'ok';
72
+ facts: CertificateFacts;
73
+ } | {
74
+ status: 'failed';
75
+ reason: CertificateInspectionFailure;
76
+ };
77
+ /**
78
+ * Inspeciona o material, sem rede e sem disco.
79
+ *
80
+ * NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
81
+ * uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
82
+ * o sujeito de um certificado acaba num log.
83
+ */
84
+ /**
85
+ * Inspeciona o material, sem rede e sem disco.
86
+ *
87
+ * NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
88
+ * uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
89
+ * o sujeito de um certificado acaba num log.
90
+ *
91
+ * `async` sem `await` é deliberado: o contrato é assíncrono porque a primeira
92
+ * implementação precisava de um handshake, e porque uma leitura de material
93
+ * criptográfico é o tipo de operação que pode voltar a precisar. Mudar a
94
+ * assinatura para síncrona obrigaria todo chamador a mudar junto, por nenhum
95
+ * ganho.
96
+ */
97
+ export declare function inspectPkcs12(pfx: Buffer, passphrase: string | undefined): Promise<CertificateInspection>;
98
+ /**
99
+ * O certificado é DESTE cliente?
100
+ *
101
+ * Três respostas, e a do meio é a que impede o vínculo silencioso:
102
+ *
103
+ * `match` os dois documentos existem e são o mesmo.
104
+ * `mismatch` os dois existem e são diferentes. Exige assinatura humana
105
+ * (a restrição está na 0060, não aqui).
106
+ * `indeterminate` falta um dos dois. Não é aprovação.
107
+ *
108
+ * A comparação é por DÍGITOS: o cadastro do produto guarda o documento sem
109
+ * máscara, o certificado o traz sem máscara, e uma comparação textual passaria a
110
+ * reprovar no dia em que alguém colasse um CNPJ pontuado num dos dois lados.
111
+ */
112
+ export type IdentityMatch = 'match' | 'mismatch' | 'indeterminate';
113
+ export declare function matchIdentity(certificateDocument: string | null, clientDocument: string | null | undefined): IdentityMatch;
114
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/inspect.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,4BAA4B,GACtC,gBAAgB,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAe/D;;;;;;GAMG;AACH;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAyBhC;AA+GD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;AAEnE,wBAAgB,aAAa,CAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACxC,aAAa,CAKf"}
@@ -0,0 +1,178 @@
1
+ import { createSecureContext } from 'node:tls';
2
+ import { X509Certificate } from 'node:crypto';
3
+ /**
4
+ * OID 2.16.76.1.3.3 — o CNPJ da pessoa jurídica no `otherName` do
5
+ * `subjectAltName`, na forma que a ICP-Brasil padronizou (DOC-ICP-04).
6
+ *
7
+ * Em DER: tag `06`, comprimento `05`, e os componentes `2.16` colapsados em
8
+ * `0x60`. Procurar a sequência de bytes é mais confiável que ler
9
+ * `x509.subjectAltName`, que em várias versões do Node devolve `undefined` ou
10
+ * `othername:<unsupported>` justamente para os `otherName` do ICP-Brasil.
11
+ */
12
+ const OID_CNPJ_ICP_BRASIL = Buffer.from([0x06, 0x05, 0x60, 0x4c, 0x01, 0x03, 0x03]);
13
+ /** Janela de busca depois do OID: o valor vem logo em seguida, dentro do mesmo `otherName`. */
14
+ const OID_VALUE_WINDOW = 48;
15
+ /**
16
+ * Inspeciona o material, sem rede e sem disco.
17
+ *
18
+ * NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
19
+ * uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
20
+ * o sujeito de um certificado acaba num log.
21
+ */
22
+ /**
23
+ * Inspeciona o material, sem rede e sem disco.
24
+ *
25
+ * NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
26
+ * uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
27
+ * o sujeito de um certificado acaba num log.
28
+ *
29
+ * `async` sem `await` é deliberado: o contrato é assíncrono porque a primeira
30
+ * implementação precisava de um handshake, e porque uma leitura de material
31
+ * criptográfico é o tipo de operação que pode voltar a precisar. Mudar a
32
+ * assinatura para síncrona obrigaria todo chamador a mudar junto, por nenhum
33
+ * ganho.
34
+ */
35
+ export async function inspectPkcs12(pfx, passphrase) {
36
+ if (pfx.byteLength === 0)
37
+ return { status: 'failed', reason: 'malformed_material' };
38
+ // Primeiro portão: o contexto abre? Isto é a checagem de senha, e ela lança
39
+ // aqui — antes de existir qualquer outra coisa.
40
+ let context;
41
+ try {
42
+ context = createSecureContext({ pfx, passphrase, minVersion: 'TLSv1.2' });
43
+ }
44
+ catch (err) {
45
+ return { status: 'failed', reason: classify(err) };
46
+ }
47
+ let der;
48
+ try {
49
+ der = certificateDerFrom(context);
50
+ }
51
+ catch (err) {
52
+ return { status: 'failed', reason: classify(err) };
53
+ }
54
+ if (!der || der.byteLength === 0)
55
+ return { status: 'failed', reason: 'inspection_failed' };
56
+ try {
57
+ return { status: 'ok', facts: factsFrom(new X509Certificate(der)) };
58
+ }
59
+ catch (err) {
60
+ return { status: 'failed', reason: classify(err) };
61
+ }
62
+ }
63
+ /**
64
+ * O DER do certificado carregado no contexto.
65
+ *
66
+ * `context.getCertificate()` é o handle NATIVO do `SecureContext`, não a API
67
+ * pública documentada do Node. Por isso o acesso é defensivo em vez de direto: o
68
+ * dia em que uma versão do Node o renomear, o produto deve responder
69
+ * `inspection_failed` — e a suíte, que lê um PKCS#12 sintético de verdade, vai
70
+ * ficar vermelha na atualização, que é quando alguém pode agir.
71
+ *
72
+ * A alternativa — depender do binário `openssl` na imagem — troca este risco por
73
+ * um pior: uma falha que só aparece em produção, num contêiner onde ninguém
74
+ * conferiu o que está instalado.
75
+ */
76
+ function certificateDerFrom(context) {
77
+ const handle = context.context;
78
+ const der = handle?.getCertificate?.();
79
+ return Buffer.isBuffer(der) ? der : null;
80
+ }
81
+ function factsFrom(cert) {
82
+ const validTo = new Date(cert.validTo);
83
+ return {
84
+ fingerprintSha256: cert.fingerprint256.replace(/:/g, '').toLowerCase(),
85
+ subjectCommonName: commonName(cert.subject),
86
+ issuerCommonName: commonName(cert.issuer),
87
+ serialTail: cert.serialNumber ? cert.serialNumber.slice(-8) : null,
88
+ validFrom: new Date(cert.validFrom).toISOString(),
89
+ validTo: validTo.toISOString(),
90
+ expired: validTo.getTime() <= Date.now(),
91
+ document: documentFrom(cert),
92
+ };
93
+ }
94
+ /** `CN=` do DN multilinha que o Node devolve. `null` quando não há. */
95
+ function commonName(dn) {
96
+ if (!dn)
97
+ return null;
98
+ for (const line of dn.split('\n')) {
99
+ const m = /^\s*CN\s*=\s*(.+?)\s*$/.exec(line);
100
+ if (m?.[1])
101
+ return m[1];
102
+ }
103
+ return null;
104
+ }
105
+ /**
106
+ * O documento do titular, do material.
107
+ *
108
+ * Duas fontes, nesta ordem — e a ordem importa:
109
+ *
110
+ * 1. O `otherName` do OID da ICP-Brasil, varrido no DER. É onde a norma manda
111
+ * escrever, é o que a Receita valida, e é o único lugar que não depende de
112
+ * convenção de quem emitiu.
113
+ * 2. O sufixo `:<14 dígitos>` do `CN`, convenção quase universal dos e-CNPJ.
114
+ *
115
+ * Não há terceira fonte. Procurar "14 dígitos em qualquer lugar do sujeito"
116
+ * casaria com um CEP colado a um telefone e devolveria um CNPJ inventado — que
117
+ * é pior que `null`, porque `null` deixa a comparação `indeterminate` e essa é
118
+ * a resposta honesta.
119
+ */
120
+ function documentFrom(cert) {
121
+ const fromOid = documentFromDer(cert.raw);
122
+ if (fromOid)
123
+ return fromOid;
124
+ const cn = commonName(cert.subject);
125
+ const m = cn ? /:(\d{11}|\d{14})\s*$/.exec(cn) : null;
126
+ return m?.[1] ?? null;
127
+ }
128
+ function documentFromDer(der) {
129
+ let from = 0;
130
+ for (;;) {
131
+ const at = der.indexOf(OID_CNPJ_ICP_BRASIL, from);
132
+ if (at < 0)
133
+ return null;
134
+ const window = der
135
+ .subarray(at + OID_CNPJ_ICP_BRASIL.length, at + OID_CNPJ_ICP_BRASIL.length + OID_VALUE_WINDOW)
136
+ .toString('latin1');
137
+ const digits = /(\d{14})/.exec(window);
138
+ if (digits?.[1])
139
+ return digits[1];
140
+ from = at + 1;
141
+ }
142
+ }
143
+ /**
144
+ * Traduz a falha do OpenSSL em classe, olhando SÓ os fragmentos conhecidos.
145
+ *
146
+ * A mensagem inteira nunca é propagada nem registrada. `mac verify failure` é a
147
+ * resposta do PKCS#12 a uma senha que não abre o MAC — é o único caso em que se
148
+ * pode dizer ao operador "a senha está errada" com alguma confiança.
149
+ */
150
+ function classify(err) {
151
+ const raw = err instanceof Error ? err.message : '';
152
+ const message = raw.toLowerCase();
153
+ if (message.includes('mac verify failure') || message.includes('invalid password')) {
154
+ return 'wrong_password';
155
+ }
156
+ if (message.includes('not enough data') ||
157
+ message.includes('wrong tag') ||
158
+ message.includes('header too long') ||
159
+ message.includes('nested asn1') ||
160
+ message.includes('asn1')) {
161
+ return 'malformed_material';
162
+ }
163
+ if (message.includes('unsupported') || message.includes('unknown cipher')) {
164
+ return 'unsupported_material';
165
+ }
166
+ return 'inspection_failed';
167
+ }
168
+ export function matchIdentity(certificateDocument, clientDocument) {
169
+ const a = digitsOnly(certificateDocument);
170
+ const b = digitsOnly(clientDocument);
171
+ if (!a || !b)
172
+ return 'indeterminate';
173
+ return a === b ? 'match' : 'mismatch';
174
+ }
175
+ function digitsOnly(v) {
176
+ return (v ?? '').replace(/\D/g, '');
177
+ }
178
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { Tx } from '../../db/client.js';
2
+ import type { Keyring } from '../../vault/crypto.js';
3
+ import type { ClientTlsMaterial } from '../transport/types.js';
4
+ import type { FiscalCredentialKind } from '../eligibility.js';
5
+ import { type FiscalSecretAuthorization } from '../sync/secret-boundary.js';
6
+ /**
7
+ * O material de TLS mútuo, do cofre para a memória — e para lugar nenhum mais.
8
+ *
9
+ * ## As três coisas que este módulo recusa a fazer
10
+ *
11
+ * **Não escreve no disco.** Um PKCS#12 em `/tmp` precisa de permissão restrita,
12
+ * de limpeza garantida em todo caminho de saída (inclusive `SIGKILL`) e de
13
+ * alguém que lembre das duas coisas no dia do incidente. O `https.Agent` do Node
14
+ * aceita `Buffer`, então o arquivo temporário nunca é necessário — e "nunca
15
+ * necessário" é a única forma segura de "nunca esquecido".
16
+ *
17
+ * **Não passa por variável de ambiente.** Env var vaza em `env`, em dump de
18
+ * processo, em painel de provedor e em log de boot. Este ecossistema já perdeu
19
+ * `DATABASE_URL` inteiro por um `env | grep` bem-intencionado.
20
+ *
21
+ * **Não aparece em log, erro ou trilha.** O único campo desta estrutura que
22
+ * pode ser impresso é `fingerprintSha256`, e é por isso que ele existe: ele
23
+ * responde "qual certificado foi apresentado?" sem revelar nada dele.
24
+ *
25
+ * ## O envelope
26
+ *
27
+ * `vault_credential` guarda UM texto cifrado. Para certificado, esse texto é um
28
+ * JSON com formato declarado — e não o base64 solto, que obrigaria quem lê a
29
+ * adivinhar se recebeu PKCS#12 ou PEM:
30
+ *
31
+ * {"format":"pkcs12","material":"<base64 do .pfx>","passphrase":"..."}
32
+ * {"format":"pem","cert":"<base64 do PEM>","key":"<base64 do PEM>"}
33
+ *
34
+ * O `format` é obrigatório. Um envelope sem ele é recusado em vez de tentado
35
+ * como PKCS#12: adivinhar formato de material criptográfico produz um erro de
36
+ * OpenSSL seis camadas adiante, indistinguível de senha errada.
37
+ */
38
+ /** O que deu errado ao buscar o material. Classe, nunca o texto do sistema. */
39
+ export type TlsMaterialFailure = 'no_credential' | 'vault_unavailable' | 'envelope_unreadable' | 'unsupported_format';
40
+ export type TlsMaterialResult = {
41
+ status: 'ok';
42
+ material: ClientTlsMaterial;
43
+ } | {
44
+ status: 'unavailable';
45
+ reason: TlsMaterialFailure;
46
+ };
47
+ /**
48
+ * Constrói o material a partir do envelope decifrado.
49
+ *
50
+ * Separado da leitura do banco de propósito: é esta função que o teste
51
+ * exercita com um PKCS#12 sintético, sem precisar de cofre nem de tenant.
52
+ */
53
+ export declare function buildTlsMaterial(raw: string): TlsMaterialResult;
54
+ /**
55
+ * Busca o material do certificado de um cliente.
56
+ *
57
+ * O ponteiro vem de `digital_certificate.vault_credential_id` — o MESMO domínio
58
+ * que a prontidão lê, e não uma segunda tabela de credencial fiscal. Duas
59
+ * origens para o mesmo fato divergiriam na primeira atualização de uma só.
60
+ *
61
+ * NUNCA lança por ausência: um cliente sem certificado é estado normal, e uma
62
+ * exceção aqui derrubaria o worker no meio da carteira por causa do primeiro
63
+ * cliente não configurado.
64
+ *
65
+ * ## O `authorization` não é decoração
66
+ *
67
+ * Esta é a única porta do produto para material de certificado, e ela agora
68
+ * EXIGE o passe que o orquestrador emite depois do último portão. Um chamador
69
+ * que tente abrir o cofre antes disso — para "só conferir se o certificado
70
+ * abre", que é sempre como começa — recebe `FiscalSecretBoundaryError` em vez de
71
+ * uma chave privada. Ver `sync/secret-boundary.ts`.
72
+ *
73
+ * A checagem lança ANTES do primeiro `SELECT`: nem a existência do ponteiro é
74
+ * revelada a quem não passou pelos portões.
75
+ */
76
+ export declare function loadFiscalTlsMaterial(tx: Tx, keyring: Keyring, tenantId: string, input: {
77
+ clientId: string;
78
+ kind?: FiscalCredentialKind;
79
+ authorization: FiscalSecretAuthorization;
80
+ }): Promise<TlsMaterialResult>;
81
+ //# sourceMappingURL=material.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/material.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAC5B,eAAe,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAEvF,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAe1D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAsC/D;AAwCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,aAAa,EAAE,yBAAyB,CAAC;CAC1C,GACA,OAAO,CAAC,iBAAiB,CAAC,CA6D5B"}
@@ -0,0 +1,164 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { revealWriteOnlySecretForProcess } from '../../vault/repository.js';
3
+ import { FiscalSecretBoundaryError, assertFiscalSecretAccess, } from '../sync/secret-boundary.js';
4
+ /**
5
+ * Constrói o material a partir do envelope decifrado.
6
+ *
7
+ * Separado da leitura do banco de propósito: é esta função que o teste
8
+ * exercita com um PKCS#12 sintético, sem precisar de cofre nem de tenant.
9
+ */
10
+ export function buildTlsMaterial(raw) {
11
+ let envelope;
12
+ try {
13
+ envelope = JSON.parse(raw);
14
+ }
15
+ catch {
16
+ // Sem `err.message`: um JSON malformado costuma vir citado inteiro na
17
+ // exceção, e o "JSON malformado" aqui é um certificado.
18
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
19
+ }
20
+ if (!envelope || typeof envelope !== 'object' || !('format' in envelope)) {
21
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
22
+ }
23
+ try {
24
+ if (envelope.format === 'pkcs12') {
25
+ if (typeof envelope.material !== 'string' || envelope.material === '') {
26
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
27
+ }
28
+ const pfx = Buffer.from(envelope.material, 'base64');
29
+ if (pfx.byteLength === 0)
30
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
31
+ return { status: 'ok', material: sealed({ pfx, passphrase: envelope.passphrase }) };
32
+ }
33
+ if (envelope.format === 'pem') {
34
+ if (typeof envelope.cert !== 'string' || typeof envelope.key !== 'string') {
35
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
36
+ }
37
+ const cert = Buffer.from(envelope.cert, 'base64');
38
+ const key = Buffer.from(envelope.key, 'base64');
39
+ const ca = (envelope.ca ?? []).map((c) => Buffer.from(c, 'base64'));
40
+ if (cert.byteLength === 0 || key.byteLength === 0) {
41
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
42
+ }
43
+ return { status: 'ok', material: sealed({ cert, key, ca }) };
44
+ }
45
+ }
46
+ catch {
47
+ return { status: 'unavailable', reason: 'envelope_unreadable' };
48
+ }
49
+ return { status: 'unavailable', reason: 'unsupported_format' };
50
+ }
51
+ /**
52
+ * Embrulha os buffers com a impressão digital e com o descarte.
53
+ *
54
+ * A impressão é do material APRESENTADO (o `.pfx` ou o `cert`), nunca da chave
55
+ * privada: identificar qual certificado foi usado não deve exigir tocar no
56
+ * segredo, nem sequer para calcular um hash.
57
+ */
58
+ function sealed(parts) {
59
+ const identity = parts.pfx ?? parts.cert ?? Buffer.alloc(0);
60
+ const fingerprintSha256 = createHash('sha256').update(identity).digest('hex');
61
+ let disposed = false;
62
+ return {
63
+ ...(parts.pfx ? { pfx: parts.pfx } : {}),
64
+ ...(parts.passphrase ? { passphrase: parts.passphrase } : {}),
65
+ ...(parts.cert ? { cert: parts.cert } : {}),
66
+ ...(parts.key ? { key: parts.key } : {}),
67
+ ...(parts.ca && parts.ca.length > 0 ? { ca: parts.ca } : {}),
68
+ fingerprintSha256,
69
+ dispose() {
70
+ if (disposed)
71
+ return;
72
+ disposed = true;
73
+ // Zerar não é cerimônia: o Buffer sobrevive no heap até o GC passar, e um
74
+ // heap dump de produção é um arquivo que alguém abre e guarda.
75
+ parts.pfx?.fill(0);
76
+ parts.cert?.fill(0);
77
+ parts.key?.fill(0);
78
+ for (const c of parts.ca ?? [])
79
+ c.fill(0);
80
+ },
81
+ };
82
+ }
83
+ /**
84
+ * Busca o material do certificado de um cliente.
85
+ *
86
+ * O ponteiro vem de `digital_certificate.vault_credential_id` — o MESMO domínio
87
+ * que a prontidão lê, e não uma segunda tabela de credencial fiscal. Duas
88
+ * origens para o mesmo fato divergiriam na primeira atualização de uma só.
89
+ *
90
+ * NUNCA lança por ausência: um cliente sem certificado é estado normal, e uma
91
+ * exceção aqui derrubaria o worker no meio da carteira por causa do primeiro
92
+ * cliente não configurado.
93
+ *
94
+ * ## O `authorization` não é decoração
95
+ *
96
+ * Esta é a única porta do produto para material de certificado, e ela agora
97
+ * EXIGE o passe que o orquestrador emite depois do último portão. Um chamador
98
+ * que tente abrir o cofre antes disso — para "só conferir se o certificado
99
+ * abre", que é sempre como começa — recebe `FiscalSecretBoundaryError` em vez de
100
+ * uma chave privada. Ver `sync/secret-boundary.ts`.
101
+ *
102
+ * A checagem lança ANTES do primeiro `SELECT`: nem a existência do ponteiro é
103
+ * revelada a quem não passou pelos portões.
104
+ */
105
+ export async function loadFiscalTlsMaterial(tx, keyring, tenantId, input) {
106
+ assertFiscalSecretAccess(input.authorization, 'loadFiscalTlsMaterial');
107
+ /*
108
+ * O passe é AUTÊNTICO — mas para quem?
109
+ *
110
+ * `assertFiscalSecretAccess` responde "esta autorização saiu dos portões", e
111
+ * não "esta autorização é DESTE cliente". A diferença abre um caso que a RLS
112
+ * não fecha: dentro do MESMO escritório, um passe emitido para o cliente X
113
+ * abriria o certificado do cliente Y, porque a política de tenant considera as
114
+ * duas linhas visíveis. É o `WHERE client_id = ...` abaixo que escolhe a
115
+ * linha, e ele obedece ao parâmetro, não ao passe.
116
+ *
117
+ * Hoje o orquestrador emite e usa o passe no mesmo par (tenant, cliente), de
118
+ * modo que o caso não ocorre. Mas é exatamente esse tipo de invariante — "quem
119
+ * chama sempre passa os mesmos valores" — que um refactor quebra em silêncio,
120
+ * e o módulo inteiro da fronteira existe porque convenção não é portão.
121
+ *
122
+ * A checagem é de ESCOPO, e vem antes de qualquer consulta: um passe fora do
123
+ * seu escopo não chega nem a saber se existe certificado do outro lado.
124
+ */
125
+ if (input.authorization.tenantId !== tenantId ||
126
+ input.authorization.clientId !== input.clientId) {
127
+ throw new FiscalSecretBoundaryError('loadFiscalTlsMaterial:scope');
128
+ }
129
+ const certType = input.kind === 'certificate_a3' ? 'A3' : 'A1';
130
+ let rows;
131
+ try {
132
+ rows = await tx `
133
+ SELECT vault_credential_id
134
+ FROM digital_certificate
135
+ WHERE client_id = ${input.clientId}
136
+ AND cert_type = ${certType}
137
+ AND deleted_at IS NULL
138
+ ORDER BY expires_at DESC
139
+ LIMIT 1
140
+ `;
141
+ }
142
+ catch (err) {
143
+ const code = err?.code;
144
+ if (code === '42P01' || code === '42703') {
145
+ return { status: 'unavailable', reason: 'no_credential' };
146
+ }
147
+ throw err;
148
+ }
149
+ const pointer = rows[0]?.vault_credential_id;
150
+ if (!pointer)
151
+ return { status: 'unavailable', reason: 'no_credential' };
152
+ let secret;
153
+ try {
154
+ ({ secret } = await revealWriteOnlySecretForProcess(tx, keyring, tenantId, pointer));
155
+ }
156
+ catch {
157
+ // Ponteiro pendurado, chave de cifra ausente, linha invisível sob RLS: os
158
+ // três colapsam em "não deu para abrir", e diferenciá-los aqui vazaria a
159
+ // existência de um registro que a RLS já respondeu como ausente.
160
+ return { status: 'unavailable', reason: 'vault_unavailable' };
161
+ }
162
+ return buildTlsMaterial(secret);
163
+ }
164
+ //# sourceMappingURL=material.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/material.ts"],"names":[],"mappings":"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"}