clearotron 0.2.0 → 0.2.2

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 (629) hide show
  1. package/.env.example +105 -0
  2. package/CONTRIBUTING.md +3 -3
  3. package/INSTALL.md +57 -52
  4. package/README.md +2 -1
  5. package/bin/brandowner.mjs +1 -1
  6. package/bin/clearotron.mjs +4 -4
  7. package/bin/connect.mjs +2 -2
  8. package/bin/example.mjs +114 -37
  9. package/bin/grant.mjs +3 -3
  10. package/bin/key.mjs +1 -1
  11. package/bin/onboard.mjs +97 -119
  12. package/bin/start.mjs +29 -25
  13. package/bin/stop.mjs +65 -3
  14. package/bin/update.mjs +7 -7
  15. package/bin/uspto-sync.mjs +1 -1
  16. package/build-info.json +2 -2
  17. package/docs/DELIVERY.md +6 -2
  18. package/docs/RELEASES.md +6 -4
  19. package/docs/architecture/01-product-overview.md +2 -2
  20. package/docs/architecture/02-architecture.md +2 -2
  21. package/docs/architecture/04-configuration-reference.md +7 -4
  22. package/docs/architecture/05-config-governance.md +38 -5
  23. package/docs/architecture/06-operations-runbook.md +13 -1
  24. package/docs/architecture/09-security-and-data.md +1 -1
  25. package/docs/decisions/0004-documentation-structure.md +1 -1
  26. package/driver/CHANGELOG.md +95 -1
  27. package/driver/README.md +2 -2
  28. package/driver/ask-ledger.mjs +72 -4
  29. package/driver/authority-trees.mjs +1 -1
  30. package/driver/call-capture.mjs +1 -1
  31. package/driver/card-frame.mjs +1 -1
  32. package/driver/case-law-ledger.mjs +1 -1
  33. package/driver/claim-liveness.mjs +1 -1
  34. package/driver/common-law-receipts.mjs +1 -1
  35. package/driver/commonlaw-carry.mjs +1 -1
  36. package/driver/config-inventory.mjs +1 -1
  37. package/driver/connotation-search.mjs +12 -12
  38. package/driver/contract-audit.mjs +5 -5
  39. package/driver/contract-dictation-registry.mjs +4 -4
  40. package/driver/contract-dictation.mjs +2 -2
  41. package/driver/contract-e3-backlog.mjs +6 -6
  42. package/driver/contract-vocabulary.mjs +3 -3
  43. package/driver/corrections-feedforward.mjs +1 -1
  44. package/driver/coverage-form-io.mjs +2 -2
  45. package/driver/coverage-form.mjs +4 -4
  46. package/driver/coverage-ledger.mjs +3 -3
  47. package/driver/coverage-union.mjs +1 -1
  48. package/driver/declination-call.mjs +35 -3
  49. package/driver/declination-duty.mjs +1 -1
  50. package/driver/deliver-trigger.sh +3 -3
  51. package/driver/deploy-live-run-guard.mjs +6 -2
  52. package/driver/dev-portal.mjs +1 -1
  53. package/driver/disposition-call.mjs +4 -4
  54. package/driver/disposition-tool.mjs +4 -4
  55. package/driver/disposition-union.mjs +2 -2
  56. package/driver/doc-constants.mjs +1 -1
  57. package/driver/door-gates.mjs +2 -2
  58. package/driver/doubt-selection.mjs +2 -2
  59. package/driver/drainer-identity.mjs +1 -1
  60. package/driver/driver.config.mjs +63 -11
  61. package/driver/e2e-rounds.mjs +2 -2
  62. package/driver/effort-model.mjs +2 -2
  63. package/driver/engine/anthropic-agent.mjs +24 -24
  64. package/driver/engine/auth.mjs +1 -1
  65. package/driver/engine/common.mjs +1 -1
  66. package/driver/engine/deny-authority-write.mjs +1 -1
  67. package/driver/engine/jx-turn.mjs +1 -1
  68. package/driver/engine/mcp/clarivate-server.mjs +1 -1
  69. package/driver/engine/mcp/corsearch-server.mjs +1 -1
  70. package/driver/engine/mcp/declination-server.mjs +1 -1
  71. package/driver/engine/mcp/dispositions-server.mjs +1 -1
  72. package/driver/engine/mcp/euipo-server.mjs +1 -1
  73. package/driver/engine/mcp/fetch-server.mjs +1 -1
  74. package/driver/engine/mcp/free-tier-server.mjs +2 -2
  75. package/driver/engine/mcp/gather-config.mjs +11 -11
  76. package/driver/engine/mcp/perplexity-server.mjs +1 -1
  77. package/driver/engine/mcp/recording-server.mjs +8 -4
  78. package/driver/engine/mcp/signa-server.mjs +1 -1
  79. package/driver/engine/mcp/uspto-local-server.mjs +1 -1
  80. package/driver/engine/openai-agent.mjs +2 -2
  81. package/driver/engine-build.mjs +2 -2
  82. package/driver/enqueue-schema.mjs +2 -2
  83. package/driver/enqueue.mjs +1 -1
  84. package/driver/envelope-settle.mjs +1 -1
  85. package/driver/evidence-claim-invariant.mjs +2 -2
  86. package/driver/findings-model.mjs +8 -8
  87. package/driver/floor-duty.mjs +1 -1
  88. package/driver/form-neighbourhood.mjs +1 -1
  89. package/driver/framework.mjs +1 -1
  90. package/driver/gateway.mjs +28 -23
  91. package/driver/grounds-grammar.mjs +1 -1
  92. package/driver/hit-list.mjs +1 -1
  93. package/driver/jurisdiction-systems.mjs +1 -1
  94. package/driver/jx-lanes.mjs +1 -1
  95. package/driver/jx-units.mjs +1 -1
  96. package/driver/jx.mjs +3 -3
  97. package/driver/knockout-assess-record.mjs +5 -1
  98. package/driver/narrative-refutation-record.mjs +3 -3
  99. package/driver/numeric-setting.mjs +1 -1
  100. package/driver/owner-use-check.mjs +184 -0
  101. package/driver/package.json +2 -2
  102. package/driver/phase0.mjs +1 -1
  103. package/driver/pipeline-knockout.mjs +52 -4
  104. package/driver/pipeline.mjs +215 -63
  105. package/driver/placement-diff.mjs +2 -2
  106. package/driver/placement-form.mjs +4 -4
  107. package/driver/placement-union.mjs +1 -1
  108. package/driver/portal-acks.mjs +1 -1
  109. package/driver/portal-config-view.mjs +2 -2
  110. package/driver/portal-local-auth.mjs +1 -1
  111. package/driver/portal-report.mjs +6 -6
  112. package/driver/portal-service.mjs +15 -15
  113. package/driver/predelivery-lint.mjs +29 -11
  114. package/driver/prelim-variants-record.mjs +2 -2
  115. package/driver/profile-page.html +1 -1
  116. package/driver/profile-selection.mjs +1 -1
  117. package/driver/profile-service.mjs +2 -2
  118. package/driver/profiles.mjs +1 -1
  119. package/driver/progress.mjs +6 -6
  120. package/driver/provider-usage.mjs +1 -1
  121. package/driver/publish/demo-marking.mjs +1 -1
  122. package/driver/publish/index.mjs +47 -6
  123. package/driver/publish/knockout.mjs +36 -14
  124. package/driver/publish/parse.mjs +4 -4
  125. package/driver/publish/publish-inputs.mjs +2 -2
  126. package/driver/publish/register-presence.mjs +1 -1
  127. package/driver/publish/render-knockout.mjs +198 -31
  128. package/driver/publish/report-data.mjs +13 -3
  129. package/driver/publish/seed-pool.mjs +24 -9
  130. package/driver/queue-watch-probe.mjs +1 -1
  131. package/driver/queue-watch-verdict.mjs +1 -1
  132. package/driver/recall-reconciliation.mjs +1 -1
  133. package/driver/recipe-service.mjs +1 -1
  134. package/driver/record-carry.mjs +141 -2
  135. package/driver/recording-agreement.mjs +3 -3
  136. package/driver/reference-score.mjs +59 -9
  137. package/driver/reference-strip-signatures.mjs +68 -0
  138. package/driver/refusal-bound.mjs +3 -3
  139. package/driver/register-availability.mjs +2 -2
  140. package/driver/register-count.mjs +1 -1
  141. package/driver/register-digest-record.mjs +31 -1
  142. package/driver/register-grant-vocabulary.mjs +2 -2
  143. package/driver/register-plan.mjs +8 -8
  144. package/driver/register-records.mjs +2 -2
  145. package/driver/registry-fidelity.mjs +3 -3
  146. package/driver/remedy-accounting.mjs +1 -1
  147. package/driver/repair-composers.mjs +2 -2
  148. package/driver/repair-digest.mjs +3 -3
  149. package/driver/repairs.mjs +7 -7
  150. package/driver/replay-archive.mjs +2 -0
  151. package/driver/report-card-record.mjs +2 -2
  152. package/driver/result-noun-fields.mjs +10 -3
  153. package/driver/run-economics.mjs +2 -2
  154. package/driver/run-integrity.mjs +1 -1
  155. package/driver/runner.mjs +22 -22
  156. package/driver/scope-rules.mjs +1 -1
  157. package/driver/search-policy.mjs +3 -3
  158. package/driver/skeptic-search.mjs +1 -1
  159. package/driver/skills/blind-frame/SKILL.md +1 -1
  160. package/driver/skills/case-law-citation/SKILL.md +2 -2
  161. package/driver/skills/knockout-assess/SKILL.md +10 -4
  162. package/driver/skills/prelim-search/SKILL.md +2 -2
  163. package/driver/skills/prelim-search/template-formatting.md +1 -1
  164. package/driver/skills/prelim-search/templates/email/generic.md +1 -1
  165. package/driver/skills/prelim-search/worked-examples.md +1 -1
  166. package/driver/skills/prelim-variants/SKILL.md +2 -2
  167. package/driver/stage-context.mjs +1 -1
  168. package/driver/stages-knockout.mjs +55 -4
  169. package/driver/stages.mjs +97 -40
  170. package/driver/stray-artifacts.mjs +2 -2
  171. package/driver/suite-census.json +188 -44
  172. package/driver/synthesis-record.mjs +1 -1
  173. package/driver/systemd/clearotron-client-mcp.service +1 -1
  174. package/driver/systemd/clearotron-portal.service +1 -1
  175. package/driver/systemd/render-units.mjs +1 -1
  176. package/driver/tokens.mjs +1 -1
  177. package/driver/tool-calls.mjs +1 -1
  178. package/driver/turnaround-bands.mjs +1 -1
  179. package/driver/unit-file-drift.mjs +1 -1
  180. package/driver/unit-inventory.mjs +121 -61
  181. package/driver/unit-state-verdict.mjs +20 -12
  182. package/driver/verify-knockout.mjs +10 -2
  183. package/driver/verify.mjs +14 -14
  184. package/driver/whatif-memo-run.mjs +46 -5
  185. package/driver/whatif-queue.mjs +1 -1
  186. package/driver/whatif-worker.mjs +1 -1
  187. package/mcp-server/CHANGELOG.md +12 -0
  188. package/mcp-server/README.md +3 -3
  189. package/mcp-server/http-server.mjs +44 -1
  190. package/mcp-server/key-socket.mjs +184 -0
  191. package/mcp-server/lib/audit-view.mjs +69 -2
  192. package/mcp-server/lib/brief.mjs +15 -0
  193. package/mcp-server/lib/driver.mjs +7 -1
  194. package/mcp-server/lib/events.mjs +1 -1
  195. package/mcp-server/lib/http-handler.mjs +1 -1
  196. package/mcp-server/lib/knockout.mjs +435 -0
  197. package/mcp-server/lib/ops.mjs +4 -4
  198. package/mcp-server/lib/options.mjs +1 -1
  199. package/mcp-server/lib/plan.mjs +1 -1
  200. package/mcp-server/lib/runs.mjs +1 -1
  201. package/mcp-server/lib/scrub.mjs +1 -1
  202. package/mcp-server/lib/whatif.mjs +12 -3
  203. package/mcp-server/mint-token.mjs +1 -1
  204. package/mcp-server/package.json +2 -2
  205. package/mcp-server/server.mjs +76 -11
  206. package/package.json +3 -3
  207. package/portal-ui/package.json +1 -1
  208. package/providers/_shared/enumerate.mjs +1 -1
  209. package/providers/_shared/ledger-path.mjs +3 -3
  210. package/providers/_shared/ledger.mjs +1 -1
  211. package/providers/_shared/result-shape.mjs +3 -3
  212. package/providers/_shared/term-shape.mjs +1 -1
  213. package/providers/corsearch/src/core.js +1 -1
  214. package/providers/jx-subclass/BUILDING.md +1 -1
  215. package/providers/oauth-mcp-bridge/CHANGELOG.md +12 -0
  216. package/providers/oauth-mcp-bridge/package.json +1 -1
  217. package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
  218. package/scripts/README.md +1 -1
  219. package/scripts/added-reference-check.mjs +29 -1
  220. package/scripts/ai-page-render-check.mjs +2 -1
  221. package/scripts/authority-boundary-probe.mjs +1 -1
  222. package/scripts/backfill-started-at.mjs +1 -1
  223. package/scripts/citation-line-check.mjs +3 -3
  224. package/scripts/clearances-render-check.mjs +4 -3
  225. package/scripts/compare.mjs +2 -2
  226. package/scripts/composer-render-check.mjs +6 -6
  227. package/scripts/contract-dictation-scan.mjs +2 -2
  228. package/scripts/dead-names.mjs +1 -1
  229. package/scripts/drain-preflight.mjs +5 -5
  230. package/scripts/e2e-unread-terminals.mjs +1 -1
  231. package/scripts/e2e.mjs +8 -8
  232. package/scripts/env-audit.mjs +27 -7
  233. package/scripts/env-classify.mjs +139 -15
  234. package/scripts/freeze-example-run.mjs +3 -3
  235. package/scripts/head-arrived-gated.mjs +1 -1
  236. package/scripts/headless-page.mjs +274 -0
  237. package/scripts/home-render-check.mjs +3 -2
  238. package/scripts/live-surface-check.mjs +92 -19
  239. package/scripts/main-health.mjs +1 -1
  240. package/scripts/merge-presence-check.mjs +3 -3
  241. package/scripts/mint-reference-strip-backlog.mjs +41 -0
  242. package/scripts/mint-suite-census.mjs +6 -6
  243. package/scripts/nightly-notice.mjs +1 -1
  244. package/scripts/portal-lifecycle-check.mjs +3 -3
  245. package/scripts/reconcile-runs.mjs +1 -1
  246. package/scripts/release-await-cut.mjs +101 -11
  247. package/scripts/release-version-pr-checks.mjs +26 -2
  248. package/scripts/release-version.mjs +2 -2
  249. package/scripts/render-check.mjs +66 -7
  250. package/scripts/report-frame-check.mjs +12 -0
  251. package/scripts/report-screenshot.mjs +62 -2
  252. package/scripts/revisit-render-check.mjs +3 -2
  253. package/scripts/score.mjs +18 -4
  254. package/scripts/strip-tracker-citations.mjs +116 -0
  255. package/scripts/test-run.mjs +3 -3
  256. package/scripts/third-party-notices.mjs +3 -3
  257. package/scripts/travelling-predicates.mjs +3 -3
  258. package/scripts/unexecuted-asserts.mjs +2 -2
  259. package/scripts/verify-publishable.mjs +2 -2
  260. package/scripts/write-up-form-census.mjs +1 -1
  261. package/shared/access-audience.mjs +215 -0
  262. package/shared/brand.mjs +13 -13
  263. package/shared/citation-scan.mjs +1 -1
  264. package/shared/client-door.mjs +7 -7
  265. package/shared/driver-dir.mjs +1 -1
  266. package/shared/env-aliases.mjs +0 -48
  267. package/shared/env-local.mjs +1 -1
  268. package/shared/identifier-scan.mjs +3 -3
  269. package/shared/invocation.mjs +1 -1
  270. package/shared/names-in-force.mjs +2 -0
  271. package/shared/product-owned-names.mjs +1 -1
  272. package/shared/register-selection.mjs +1 -1
  273. package/shared/scope.mjs +5 -5
  274. package/shared/server-units.mjs +4 -4
  275. package/shared/store-in-repo.mjs +2 -2
  276. package/shared/suite-census.mjs +4 -4
  277. package/shared/tracked-files.mjs +31 -0
  278. package/shared/tty-style.mjs +1 -1
  279. package/shared/uspto-index-size.mjs +1 -1
  280. package/shared/vacuous-pass.mjs +1 -1
  281. package/skills/clearotron-account/SKILL.md +42 -13
  282. package/driver/systemd/prelim-driver.path +0 -69
  283. package/driver/systemd/prelim-driver.service +0 -86
  284. package/driver/systemd/prelim-driver.timer +0 -14
  285. package/driver/systemd/prelim-outbox.path +0 -27
  286. package/driver/systemd/prelim-outbox.service +0 -37
  287. package/driver/systemd/prelim-outbox.timer +0 -21
  288. package/node_modules/exceljs/README_zh.md +0 -2878
  289. package/node_modules/exceljs/dist/LICENSE +0 -22
  290. package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
  291. package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
  292. package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
  293. package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
  294. package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
  295. package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
  296. package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
  297. package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
  298. package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
  299. package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
  300. package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
  301. package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
  302. package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
  303. package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
  304. package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
  305. package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
  306. package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
  307. package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
  308. package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
  309. package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
  310. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
  311. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
  312. package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
  313. package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
  314. package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
  315. package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
  316. package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
  317. package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
  318. package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
  319. package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
  320. package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
  321. package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
  322. package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
  323. package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
  324. package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
  325. package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
  326. package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
  327. package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
  328. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
  329. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
  330. package/node_modules/exceljs/dist/es5/index.js +0 -15
  331. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
  332. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
  333. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
  334. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
  335. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
  336. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
  337. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
  338. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
  339. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
  340. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
  341. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
  342. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
  343. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
  344. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
  345. package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
  346. package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
  347. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
  348. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
  349. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
  350. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
  351. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
  352. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
  353. package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
  354. package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
  355. package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
  356. package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
  357. package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
  358. package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
  359. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
  360. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
  361. package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
  362. package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
  363. package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
  364. package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
  365. package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
  366. package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
  367. package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
  368. package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
  369. package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
  370. package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
  371. package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
  372. package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
  373. package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
  374. package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
  375. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
  376. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
  377. package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
  378. package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
  379. package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
  380. package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
  381. package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
  382. package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
  383. package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
  384. package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
  385. package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
  386. package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
  387. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
  388. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
  389. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
  390. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
  391. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
  392. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
  393. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
  394. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
  395. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
  396. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
  397. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
  398. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
  399. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
  400. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
  401. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
  402. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
  403. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
  404. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
  405. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
  406. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
  407. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
  408. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
  409. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
  410. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
  411. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
  412. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
  413. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
  414. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
  415. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
  416. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
  417. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
  418. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
  419. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
  420. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
  421. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
  422. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
  423. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
  424. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
  425. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
  426. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
  427. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
  428. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
  429. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
  430. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
  431. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
  432. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
  433. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
  434. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
  435. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
  436. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
  437. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
  438. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
  439. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
  440. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
  441. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
  442. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
  443. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
  444. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
  445. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
  446. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
  447. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
  448. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
  449. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
  450. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
  451. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
  452. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
  453. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
  454. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
  455. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
  456. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
  457. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
  458. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
  459. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
  460. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
  461. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
  462. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
  463. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
  464. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
  465. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
  466. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
  467. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
  468. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
  469. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
  470. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
  471. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
  472. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
  473. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
  474. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
  475. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
  476. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
  477. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
  478. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
  479. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
  480. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
  481. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
  482. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
  483. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
  484. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
  485. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
  486. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
  487. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
  488. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
  489. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
  490. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
  491. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
  492. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
  493. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
  494. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
  495. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
  496. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
  497. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
  498. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
  499. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
  500. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
  501. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
  502. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
  503. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
  504. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
  505. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
  506. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
  507. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
  508. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
  509. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
  510. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
  511. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
  512. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
  513. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
  514. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
  515. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
  516. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
  517. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
  518. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
  519. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
  520. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
  521. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
  522. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
  523. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
  524. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
  525. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
  526. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
  527. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
  528. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
  529. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
  530. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
  531. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
  532. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
  533. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
  534. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
  535. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
  536. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
  537. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
  538. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
  539. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
  540. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
  541. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
  542. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
  543. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
  544. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
  545. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
  546. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
  547. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
  548. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
  549. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
  550. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
  551. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
  552. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
  553. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
  554. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
  555. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
  556. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
  557. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
  558. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
  559. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
  560. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
  561. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
  562. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
  563. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
  564. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
  565. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
  566. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
  567. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
  568. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
  569. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
  570. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
  571. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
  572. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
  573. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
  574. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
  575. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
  576. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
  577. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
  578. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
  579. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
  580. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
  581. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
  582. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
  583. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
  584. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
  585. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
  586. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
  587. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
  588. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
  589. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
  590. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
  591. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
  592. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
  593. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
  594. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
  595. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
  596. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
  597. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
  598. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
  599. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
  600. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
  601. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
  602. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
  603. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
  604. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
  605. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
  606. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
  607. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
  608. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
  609. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
  610. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
  611. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
  612. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
  613. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
  614. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
  615. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
  616. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
  617. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
  618. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
  619. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
  620. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
  621. package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
  622. package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
  623. package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
  624. package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
  625. package/node_modules/exceljs/dist/exceljs.js +0 -59900
  626. package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
  627. package/node_modules/exceljs/dist/exceljs.min.js +0 -45
  628. package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
  629. package/scripts/deploy-test.sh +0 -309
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
4
+ //
5
+ // Removes the internal citation OPENER from comments and prose in the tree (tracker issue 309).
6
+ //
7
+ // The form is `tracker issue NNN — ` standing at the head of a sentence, where the citation is not part
8
+ // of what the sentence says but a label in front of it. Stripping the opener leaves the sentence intact:
9
+ //
10
+ // // tracker issue 1149 — the walk must start at the repository root
11
+ // // the walk must start at the repository root
12
+ //
13
+ // assert.ok(x, "Refs tracker issue 2075 — an absent file is a finding")
14
+ // assert.ok(x, "an absent file is a finding")
15
+ //
16
+ // WHY THE PATTERN LOOKS OVER-SPECIFIED. Three parts of it are load-bearing and each was measured, not
17
+ // reasoned:
18
+ //
19
+ // · THE CAPTURE GROUP. The match begins at the line opener — a comment leader, a quote, a bracket —
20
+ // and the replacement is `$1`, which puts that opener back. Without the group the sweep deletes the
21
+ // opening quote of every test name it touches, and a broken string literal is a syntax error in the
22
+ // lucky cases and a changed assertion in the unlucky ones.
23
+ // · `\s+` AFTER THE SEPARATOR, never `\s*`. `tracker issue 1149-12` is an ITEM suffix, not a citation
24
+ // followed by prose: there is no space after its hyphen. `\s*` eats the item number.
25
+ // · THE `i` FLAG. `Refs tracker issue NNN` is capitalised at the head of a commit-style line and is a
26
+ // fifth of the corpus.
27
+ //
28
+ // WHAT IT WILL NOT TOUCH, and both exclusions are BY NAME rather than by pattern, because a pattern that
29
+ // could recognise them could also stop recognising them:
30
+ //
31
+ // · THE FILES THAT USE A CITATION AS TEST DATA. Three tests feed a citation to the guard that refuses
32
+ // citations and assert what comes back. A sweep that rewrites their fixtures edits the corpus the
33
+ // guard is checked against, and the guard then passes on something it has stopped checking. That is
34
+ // a green tick bought by deleting the question.
35
+ // · THE FROZEN RENDERER. `driver/publish/render.mjs` is pinned at a content hash. Changing it reds its
36
+ // freeze check, and the repair of a sentence is not worth spending a freeze on; touching it needs an
37
+ // entry in the break ledger, which is a decision and not a sweep.
38
+ //
39
+ // USAGE
40
+ //
41
+ // node scripts/strip-tracker-citations.mjs # report only: per-class counts + hand-off list
42
+ // node scripts/strip-tracker-citations.mjs --apply # rewrite the mechanical cases
43
+ //
44
+ // The report is the default because the hand-off list is the point: the lines this cannot do are the
45
+ // ones a person has to read, and a sweep that rewrote first would bury them.
46
+ //
47
+ // THIS COUNTS EVERY LINE CARRYING THE FORM, including lines another stripper would also catch. That is
48
+ // deliberate and it is why this number will not match the reference-strip backlog's. A sweep STRIPS; a
49
+ // backlog SELECTS. Overlapping strippers cost nothing and a missed line ships a citation into a public
50
+ // tree, so the population here is the whole corpus rather than the residue left after other rules have
51
+ // taken their share. Reconciling the two numbers is a category error: they answer different questions.
52
+ //
53
+ // A NOTE ON THE OTHER RESIDUE, because the names invite the confusion. `driver/reference-strip-
54
+ // signatures.mjs` counts a DIFFERENT thing — sentences the earlier strip left unfinished, `'s` with
55
+ // nothing to possess and a dangling `pre- `. That is damage: a defect whether or not anyone rules on
56
+ // citations, with a floor that should fall to zero as sentences are repaired. This file's subject is
57
+ // intact text that a ruling removes, whose population goes to zero the day the sweep runs and then
58
+ // wants a guard against reintroduction rather than a backlog. Different residue, different repair.
59
+ import { readFileSync, writeFileSync } from "node:fs";
60
+ import { execFileSync } from "node:child_process";
61
+ import { join, dirname } from "node:path";
62
+ import { fileURLToPath } from "node:url";
63
+
64
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
65
+ const APPLY = process.argv.includes("--apply");
66
+
67
+ // The mechanical case: a citation standing in front of a sentence, with the opener captured so it
68
+ // survives the replacement.
69
+ export const OPENER = /((?:^|["'`(\[]|\/\/|\/\*|#|\*|·|──)\s*)(?:refs\s+)?tracker issues?\s+\d+\s*[—:–-]\s+/i;
70
+
71
+ // Any remaining citation, mechanical or not. The difference between this count and the opener count is
72
+ // the hand-off: a citation inside a sentence cannot be removed without rewriting the sentence around it.
73
+ export const ANY_CITATION = /\btracker issues?\s+\d+/i;
74
+
75
+ export const EXCLUDED = [
76
+ // Citations used as literal test DATA — the corpus the citation guard is checked against.
77
+ "driver/test/a-bare-reference-added-in-a-diff-is-refused.test.mjs",
78
+ "driver/test/prompt-payload-names-no-tracker-issue.test.mjs",
79
+ "driver/test/euipo-environment-doctrine.test.mjs",
80
+ // Pinned at a content hash; a prose repair is not worth spending a freeze on.
81
+ "driver/publish/render.mjs",
82
+ ];
83
+
84
+ export const isScannable = (f) =>
85
+ /\.(mjs|md|yml|ts|js|json)$/.test(f) && !f.startsWith("portal-ui/dist/") && !EXCLUDED.includes(f);
86
+
87
+ /** Per-file classification. PURE, and `read` is injected so an arm can drive it over a synthetic tree. */
88
+ export function surveyOf(files, read) {
89
+ const stripped = {}, handoff = [];
90
+ let strippedTotal = 0, remainingTotal = 0;
91
+ for (const f of files.filter(isScannable)) {
92
+ let text;
93
+ try { text = read(f); } catch { continue; }
94
+ let n = 0;
95
+ const out = text.split("\n").map((line, i) => {
96
+ if (OPENER.test(line)) { n++; return line.replace(OPENER, "$1"); }
97
+ if (ANY_CITATION.test(line)) handoff.push({ file: f, line: i + 1, text: line.trim() });
98
+ return line;
99
+ });
100
+ if (n) { stripped[f] = n; strippedTotal += n; }
101
+ remainingTotal += out.filter((l) => ANY_CITATION.test(l)).length;
102
+ if (APPLY && n) writeFileSync(join(ROOT, f), out.join("\n"));
103
+ }
104
+ return { strippedTotal, remainingTotal, stripped, handoff };
105
+ }
106
+
107
+ if (import.meta.url === `file://${process.argv[1]}`) {
108
+ const tracked = execFileSync("git", ["-C", ROOT, "ls-files"], { encoding: "utf8", maxBuffer: 1 << 28 })
109
+ .split("\n").filter(Boolean);
110
+ const s = surveyOf(tracked, (f) => readFileSync(join(ROOT, f), "utf8"));
111
+ console.log(`${APPLY ? "stripped" : "would strip"} ${s.strippedTotal} opener(s) across ${Object.keys(s.stripped).length} file(s)`);
112
+ console.log(`${s.handoff.length} citation(s) are NOT openers and need a reader — the hand-off list:`);
113
+ for (const h of s.handoff) console.log(` ${h.file}:${h.line} ${h.text.slice(0, 110)}`);
114
+ console.log(`\n${s.remainingTotal} citation(s) would remain after this sweep.`);
115
+ console.log(`excluded by name: ${EXCLUDED.join(", ")}`);
116
+ }
@@ -25,7 +25,7 @@
25
25
  //
26
26
  // The second obvious fix is a posttest sweeper matching fixture prefixes with an mtime floor. But agents
27
27
  // run these suites CONCURRENTLY — that is how the box filled in the first place — so "delete everything
28
- // matching prelim-mock-* older than N" can delete another run's live fixtures. Prefix matching cannot
28
+ // matching clearotron-mock-* older than N" can delete another run's live fixtures. Prefix matching cannot
29
29
  // distinguish my fixtures from yours.
30
30
  //
31
31
  // A third option needs neither. os.tmpdir() honours TMPDIR, and every leaking call site is already
@@ -65,7 +65,7 @@ import { snapshotRepo, repoWrites, explainRepoWrites } from "./repo-writes.mjs";
65
65
  // CLEAROTRON_DATABASE=clarivate node scripts/test-run.mjs node -e '<print>'
66
66
  // -> CLEAROTRON_DATABASE = "corsearch"
67
67
  //
68
- // The operator named a vendor and the suite ran as a different one, in silence. That is 's own
68
+ // The operator named a vendor and the suite ran as a different one, in silence. That is its own
69
69
  // sentence — "a default is the one wrong value that never announces itself" — reached through the
70
70
  // compatibility window rather than through a code default.
71
71
  //
@@ -286,7 +286,7 @@ if (missingDeps.length) {
286
286
  process.exit(1);
287
287
  }
288
288
 
289
- // ── THE SUITE CANNOT READ THE OPERATOR'S CONFIGURATION, IN OR OUT (,) ──────────────────
289
+ // ── THE SUITE CANNOT READ THE OPERATOR'S CONFIGURATION, IN OR OUT () ──────────────────
290
290
  //
291
291
  // TWO DIRECTIONS, ONE SEAT. The guard below refuses when a data-plane ROOT escapes; these two stop the
292
292
  // suite reading the operator's configuration and stop it writing into their data plane. Same wrapper,
@@ -171,7 +171,7 @@ function resolveInstalled(root, name, path) {
171
171
  }
172
172
 
173
173
  /**
174
- * tracker issue 146 — WHY `npm ls` IS COMPLAINING, WHEN THE ANSWER IS NOT IN THE CODE AT ALL.
174
+ * WHY `npm ls` IS COMPLAINING, WHEN THE ANSWER IS NOT IN THE CODE AT ALL.
175
175
  *
176
176
  * Adding a `git worktree` and symlinking `node_modules` from another one — the obvious way to skip a
177
177
  * five-minute install — makes six licence arms fail in a way that reads exactly like a code defect, on
@@ -257,7 +257,7 @@ export function collect(root = ROOT, tree = npmTree(root), { linkTarget = defaul
257
257
  + "this file has not been looked at:\n " + undeclared.slice(0, 12).join("\n ")
258
258
  + (undeclared.length > 12 ? `\n …and ${undeclared.length - 12} more` : "")
259
259
  + "\n\nFix the tree, or declare it in DECLARED_LS_PROBLEMS with the reason it is allowed."
260
- // tracker issue 146 — appended, never substituted: a real problem keeps the sentence above.
260
+ // appended, never substituted: a real problem keeps the sentence above.
261
261
  + (foreignTreeNote(root, undeclared, { linkTarget }) ?? ""));
262
262
  }
263
263
  // ── ONE PACKAGE, SEVERAL NODES, AND ONLY ONE OF THEM CARRIES THE CHILDREN ──────────────────────
@@ -382,7 +382,7 @@ if (isEntrypoint(import.meta.url)) {
382
382
  if (!check) { writeFileSync(OUTPUT, next); console.log(`third-party-notices: wrote ${OUTPUT}`); process.exit(0); }
383
383
  const now = existsSync(OUTPUT) ? readFileSync(OUTPUT, "utf8") : null;
384
384
  if (now === next) { console.log("third-party-notices: THIRD-PARTY-NOTICES.md matches the installed production tree."); process.exit(0); }
385
- // ── Refs tracker issue 2073 — THE REFUSAL SAYS HOW TO FIX IT, INCLUDING THE HALF THAT IS FORGOTTEN ──
385
+ // ── THE REFUSAL SAYS HOW TO FIX IT, INCLUDING THE HALF THAT IS FORGOTTEN ──
386
386
  //
387
387
  // "regenerate with: <script>" was true and insufficient. What reds CI is a PRODUCTION-DEPENDENCY BUMP
388
388
  // whose regenerated notices file was not COMMITTED WITH IT, and the committing half is the half that
@@ -1,7 +1,7 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
3
  //
4
- // travelling-predicates.mjs — 's candidate population, DISCOVERED rather than recalled.
4
+ // travelling-predicates.mjs — the candidate population, DISCOVERED rather than recalled.
5
5
  //
6
6
  // hunts a class: a contract whose two ends measure different things — a demand computed against
7
7
  // one unit or snapshot, satisfaction enforced against another, with no guard asserting the two agree.
@@ -42,7 +42,7 @@
42
42
  // looked like an assignment, and filed `const push = (row) => { if (!asks.some(…)) … }` as "stored"
43
43
  // because the line starts with `const`. That is a proxy validating a proxy. This parses.
44
44
  //
45
- // ── THE SECOND QUESTION: WHERE DOES IT COME TO REST? ('s adjudication set) ──────────────────────
45
+ // ── THE SECOND QUESTION: WHERE DOES IT COME TO REST? (the adjudication set) ──────────────────────
46
46
  //
47
47
  // "Travelling" is a candidate ceiling and this file has said so since it was written. Ninety-nine
48
48
  // candidates is not a population anybody adjudicates one essay at a time, and reading them as ninety-nine
@@ -59,7 +59,7 @@
59
59
  //
60
60
  // structure written into something that OUTLIVES the expression that computed it — an object field,
61
61
  // an assignment, or a local that lands in a returned object. THIS is the class's shape:
62
- // 's `quote_required` was a flag on a form, judged later against candidates that had
62
+ // That `quote_required` was a flag on a form, judged later against candidates that had
63
63
  // been rebuilt. A boolean at rest can be met by data that has moved.
64
64
  //
65
65
  // The three are exhaustive and mechanical, so the sweep's own numbers say how much reading is owed and
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
4
- // unexecuted-asserts.mjs — 's fifth member: an arm that RAN and asserted nothing.
4
+ // unexecuted-asserts.mjs — the fifth member: an arm that RAN and asserted nothing.
5
5
  //
6
6
  // node scripts/unexecuted-asserts.mjs <lcov> # DRY RUN — prints what would change
7
7
  // node scripts/unexecuted-asserts.mjs <lcov> --apply # writes it
@@ -199,7 +199,7 @@ if (isEntrypoint(import.meta.url)) {
199
199
  // THE REMEDY IS THE WHOLE COMMAND, not a placeholder. Whoever this fires on has probably never heard
200
200
  // of CT_COVERAGE_DIR — it is set in ci.yml and nowhere a contributor reads — so `<lcov>` sends them to
201
201
  // the workflow file to find out what to substitute. A guard whose remedy has to be looked up is a
202
- // guard people delete ('s own rule, applied to its own error message).
202
+ // guard people delete (its own rule, applied to its own error message).
203
203
  console.error(`\nCHECK FAILED — ${grew.length} file(s) grew an assert site that never ran.\n\n`
204
204
  + "READ EACH ONE FIRST. An arm that stopped asserting is the defect this exists to find (#1010);\n"
205
205
  + "a new honest branch — a platform check, an else nobody takes here — is re-stamped deliberately:\n\n"
@@ -49,7 +49,7 @@ const staging = mkdtempSync(join(tmpdir(), "clearotron-verify-"));
49
49
  // ── CAN THIS RUN ON THE TREE IT IS POINTED AT — tracker issue 196 ───────────────────────────────────
50
50
  //
51
51
  // THIS SCRIPT WAS INVOKED BY NOTHING for as long as it has existed on the public tree: no workflow, no
52
- // npm script, every other mention of its name a comment. That is tracker issue 189's shape — an
52
+ // npm script, every other mention of its name a comment. That is the shape — an
53
53
  // instrument that exists, has stopped being reachable, and whose silence is indistinguishable from a
54
54
  // pass. Five uninstallable releases shipped past it.
55
55
  //
@@ -82,7 +82,7 @@ if (!existsSync(CUT_TABLE)) {
82
82
  console.error(" dependency, in CI and again at publish. That covers the manifest. It does not type the verbs");
83
83
  console.error(" and it does not check the substitution.\n");
84
84
  console.error(" To make this runnable, the pack's reconcile step needs either the cut table or a decision that");
85
- console.error(" it does not need it. That decision is tracker issue 196's stated out-of-scope and is nobody's yet.");
85
+ console.error(" it does not need it. That decision is stated out of scope and is nobody's yet.");
86
86
  process.exit(2);
87
87
  }
88
88
 
@@ -34,7 +34,7 @@
34
34
  // 1. UNRESOLVED DEPTH. `depthFor` falls back to full-country depth stamped `default-ungraded` when it
35
35
  // cannot resolve a policy, and `writeUpForm` maps every ungraded rung to `full`. A census built on a
36
36
  // policy object that does not resolve therefore reports "every product authors every card, the ladder
37
- // saves nothing" — quotable, and false. 's own ladder shipped dead for exactly this reason. So
37
+ // saves nothing" — quotable, and false. its own ladder shipped dead for exactly this reason. So
38
38
  // the depth row is asserted resolved before a single finding is counted.
39
39
  // 2. NO BAND SHAPE. The floor tier joins from `band-shape.json`; absent, every finding reads as holding
40
40
  // no floor and the graded products UNDER-count their full cards — erasing the one class the owner
@@ -71,3 +71,218 @@ export function audienceLabel(aud) {
71
71
  if (!list.length) return "(none)";
72
72
  return list.map((a) => `${String(a).slice(0, 8)}…`).join(",");
73
73
  }
74
+
75
+ // ── THE AUDIENCE THE EDGE ISSUES, AS OPPOSED TO THE ONE THIS INSTALL EXPECTS (tracker issue 241) ───
76
+ //
77
+ // Everything above reads LOCAL configuration. What follows reads the EDGE, so `doctor` can compare the
78
+ // two — the half of the recreation trap with no symptom of its own. Deleting and recreating a
79
+ // Cloudflare Access application changes the audience; the existing warning fires on the CHALLENGE being
80
+ // wrong, so on a box where somebody recreated the application and then fixed the sign-in, every layer
81
+ // reads healthy and the stale audience stays invisible until a real request is rejected.
82
+ //
83
+ // ── WHERE THE AUDIENCE IS, AND WHERE IT IS NOT ───────────────────────────────────────────────────
84
+ //
85
+ // Access does not publish it in RFC 8414 discovery metadata. Two investigations looked there, correctly
86
+ // found nothing, and one concluded the route did not exist. It is in the REDIRECT handed to an
87
+ // unauthenticated caller: the login URL carries a `kid` parameter and a `meta` JWT naming the same value.
88
+ //
89
+ // ── THIS DECODES; IT DOES NOT VERIFY, AND THAT IS DELIBERATE ─────────────────────────────────────
90
+ //
91
+ // The meta token is public routing information served to a caller with no credential — its own
92
+ // `auth_status` reads `NONE`. It is not a bearer token and nothing here trusts it: the only thing taken
93
+ // from it is a string, which is then compared against local configuration. Verifying it would mean
94
+ // dragging in the credential path and `jose` with it — which this file's header explains at length that
95
+ // it must not do — to authenticate a document that authenticates nobody, and would invite a later
96
+ // reader to believe a valid signature here meant a request was authorised. It does not.
97
+ //
98
+ // ── AND THE READ IS CROSS-CHECKED AGAINST ITSELF ─────────────────────────────────────────────────
99
+ //
100
+ // The same value arrives two independent ways in one response: the `kid` parameter and the token's own
101
+ // `aud`. Using one when two are there throws away the only free integrity check on the read, and it is
102
+ // the check that would catch this code keying on a field Cloudflare later moves. When they disagree
103
+ // this reports the disagreement rather than picking a winner.
104
+ /** The path that says a hostname is Access-fronted. */
105
+ export const ACCESS_LOGIN_PATH = "/cdn-cgi/access/login/";
106
+
107
+ /** Base64url → utf8, with no exception escaping to the caller as a silent empty string. */
108
+ function decodeSegment(seg) {
109
+ const raw = Buffer.from(String(seg), "base64url").toString("utf8");
110
+ if (!raw) throw new Error("the segment decoded to nothing");
111
+ return raw;
112
+ }
113
+
114
+ /**
115
+ * The audience, read out of the location an unauthenticated request was redirected to.
116
+ *
117
+ * `kind` is the whole answer and every branch has one, because the failures here are NOT
118
+ * interchangeable and the caller must be able to tell them apart:
119
+ *
120
+ * unreachable the edge could not be asked. A could-not-look, never agreement.
121
+ * not-fronted the hostname answered without an Access challenge. Its own verdict, and the
122
+ * single most important one: this check must not be able to SUCCEED by failing to
123
+ * find an edge, which is the exact shape of the defect it exists to catch.
124
+ * unreadable there is a challenge, and the audience could not be read out of it. Also a
125
+ * could-not-look — the shape may have moved, and a moved shape is not agreement.
126
+ * disagree `kid` and the token's `aud` name different audiences.
127
+ * read one audience, agreed by both sources.
128
+ */
129
+ // The marker an Access-fronted API path puts in `WWW-Authenticate`. Keyed on the RESOURCE-METADATA path
130
+ // rather than on "Bearer", which any OAuth resource anywhere would send — this names Cloudflare Access
131
+ // specifically, and it is the string the real door returns.
132
+ const ACCESS_RESOURCE_RE = /cloudflare-access-protected-resource/i;
133
+
134
+ export function readAudience({ location = "", status = null, error = null, wwwAuthenticate = "", viaEdge = false } = {}) {
135
+ if (error) return { kind: "unreachable", why: String(error?.message ?? error).slice(0, 200) };
136
+ // ── THREE DOORS, NOT ONE (tracker issue 251) ────────────────────────────────────────────────────
137
+ //
138
+ // This returned `not-fronted` for every response with no redirect, and measured against production's
139
+ // four configured hostnames that one label covered three materially different states:
140
+ //
141
+ // trademark.cordillera.ch 302 redirect present → audience read, kid agrees
142
+ // mcp.cordillera.ch/mcp 401 no redirect → not-fronted ← FALSE, it IS fronted
143
+ // clients-mcp.cordillera.ch/mcp 401 no redirect → not-fronted ← FALSE, it IS fronted
144
+ // agent-mcp.cordillera.ch/mcp 502 no redirect → not-fronted ← an origin fault
145
+ //
146
+ // None of these was a false pass — every one returned ok:false, which is the property that matters
147
+ // most and is untouched. It was a WRONG DIAGNOSIS on a safe failure, and the cost is a reader's hour
148
+ // spent hunting an Access application that exists and is working.
149
+ if (!location) {
150
+ // FRONTED, API PATH. Managed OAuth on an MCP path answers RFC 9728 style instead of redirecting a
151
+ // browser: a 401 whose `WWW-Authenticate` names a Cloudflare Access protected-resource document.
152
+ // Measured on the real door — that document resolves 200, says `protected: true`, and carries NO
153
+ // audience. So this is a stated could-not-look about the audience ON A DOOR THAT IS CONFIRMED
154
+ // PRESENT, which is neither a pass nor "no door".
155
+ if (ACCESS_RESOURCE_RE.test(String(wwwAuthenticate ?? ""))) {
156
+ return { kind: "fronted-api",
157
+ why: `the hostname answered ${status ?? "401"} as an OAuth-protected resource, naming a Cloudflare `
158
+ + "Access protected-resource document — it is fronted, and this route carries no audience to read" };
159
+ }
160
+ // THE EDGE ANSWERED AND THE ORIGIN DID NOT. A 5xx carrying `cf-ray` is Cloudflare reporting that it
161
+ // reached the door and the thing behind it did not answer. Calling that "nothing is fronting this
162
+ // hostname" is exactly backwards.
163
+ if (viaEdge && Number(status) >= 500) {
164
+ return { kind: "origin-failed",
165
+ why: `the edge answered ${status} for this hostname — Cloudflare reached the door and the origin `
166
+ + "behind it did not answer, so the audience could not be asked for" };
167
+ }
168
+ return { kind: "not-fronted", why: `the hostname answered ${status ?? "with no redirect"} and sent no Access challenge` };
169
+ }
170
+ let url;
171
+ try { url = new URL(location); } catch {
172
+ return { kind: "unreadable", why: `the redirect target is not a URL: ${String(location).slice(0, 120)}` };
173
+ }
174
+ if (!url.pathname.includes(ACCESS_LOGIN_PATH)) {
175
+ return { kind: "not-fronted", why: `the redirect goes to ${url.origin}${url.pathname}, which is not an Access login` };
176
+ }
177
+ const kid = url.searchParams.get("kid") || "";
178
+ const token = url.searchParams.get("meta") || "";
179
+ if (!token) return { kind: "unreadable", why: "the Access login carries no `meta` token", kid };
180
+ const parts = token.split(".");
181
+ if (parts.length < 2) return { kind: "unreadable", why: "the `meta` token is not a JWT", kid };
182
+ let payload;
183
+ try { payload = JSON.parse(decodeSegment(parts[1])); } catch (e) {
184
+ return { kind: "unreadable", why: `the \`meta\` token's payload could not be read (${String(e?.message ?? e).slice(0, 80)})`, kid };
185
+ }
186
+ const aud = typeof payload?.aud === "string" ? payload.aud : "";
187
+ if (!aud) return { kind: "unreadable", why: "the `meta` token's payload names no `aud`", kid };
188
+ // BOTH SOURCES, OR NEITHER IS TRUSTED. A `kid` that is absent is itself a change in the shape.
189
+ if (!kid) return { kind: "unreadable", why: "the Access login carries no `kid` to cross-check the token against", aud };
190
+ if (kid !== aud) {
191
+ return { kind: "disagree", aud, kid, hostname: payload?.hostname ?? "", why: "the two sources name different audiences" };
192
+ }
193
+ return { kind: "read", aud, kid, hostname: payload?.hostname ?? "" };
194
+ }
195
+
196
+ /**
197
+ * What to tell the reader, given what was configured and what the edge said.
198
+ *
199
+ * NOTHING HERE RETURNS "fine" FOR A QUESTION IT COULD NOT ASK. Each unhappy kind carries its own
200
+ * sentence naming what was not established, because "no problem reported" and "no problem" are the two
201
+ * things this whole check exists to keep apart.
202
+ */
203
+ export function audienceVerdict({ configured = "", read = {} } = {}) {
204
+ // MEMBERSHIP, NOT EQUALITY, and this file already learned that once. A deployment runs one Access
205
+ // application PER AUDIENCE and `CLEAROTRON_OIDC_AUDIENCE` may name several; the edge issues ONE for
206
+ // the hostname being asked. `===` against a configured list reports every correct multi-application
207
+ // deployment as a mismatch — the same mistake `audienceIncludes` above exists to have stopped making.
208
+ const cfg = accessAudience(configured);
209
+ const cfgList = Array.isArray(cfg) ? cfg : (cfg ? [cfg] : []);
210
+ switch (read.kind) {
211
+ case "unreachable":
212
+ return { kind: "could-not-look", ok: false,
213
+ message: `the edge could not be reached, so the audience it issues is unknown (${read.why}). `
214
+ + "This is a failure to look, not agreement." };
215
+ case "not-fronted":
216
+ return { kind: "not-fronted", ok: false,
217
+ message: `nothing is fronting this hostname with Access — ${read.why}. A door that is not there `
218
+ + "cannot be the one this install is configured for, so this is a finding rather than a pass." };
219
+ // NEITHER A PASS NOR "NO DOOR". The door is confirmed present and the audience is not readable by
220
+ // this route — that is a stated could-not-look, and it must not read as either of the two things it
221
+ // is not. Whether an API path's audience is reachable at all is open; nothing in the
222
+ // protected-resource document carries it.
223
+ case "fronted-api":
224
+ return { kind: "fronted-api", ok: false,
225
+ message: `this hostname IS fronted by Access — ${read.why}. The audience could not be compared, `
226
+ + "which is a could-not-look about the audience and not a finding about the door." };
227
+ case "origin-failed":
228
+ return { kind: "could-not-look", ok: false,
229
+ message: `the edge is up and the origin behind it is not — ${read.why}. Nothing here says anything `
230
+ + "about the audience; it says the service is down." };
231
+ case "unreadable":
232
+ return { kind: "could-not-look", ok: false,
233
+ message: `the Access challenge is there but its audience could not be read (${read.why}). `
234
+ + "The shape may have moved; a shape that moved is not agreement." };
235
+ case "disagree":
236
+ return { kind: "sources-disagree", ok: false,
237
+ message: `the edge's own two answers disagree: the login's \`kid\` says ${read.kid} and the `
238
+ + `\`meta\` token says ${read.aud}. Neither is trustworthy on its own, so nothing is compared.` };
239
+ case "read": {
240
+ if (!cfgList.length) {
241
+ return { kind: "not-configured", ok: false,
242
+ message: `the edge issues ${read.aud} for this hostname, and CLEAROTRON_OIDC_AUDIENCE is unset, `
243
+ + "so every request it fronts is checked against nothing." };
244
+ }
245
+ if (!audienceIncludes(cfg, read.aud)) {
246
+ // BOTH VALUES, NEVER "audience mismatch". A reader who is told only that two things differ has
247
+ // to go and find both of them, and the whole point of asking the edge was to hand them over.
248
+ return { kind: "mismatch", ok: false,
249
+ message: `the audience does not match. This install is configured with ${cfgList.join(", ")}, and the edge `
250
+ + `issues ${read.aud} for ${read.hostname || "this hostname"}. Requests will be rejected `
251
+ + "until they agree — recreating an Access application changes the audience." };
252
+ }
253
+ return { kind: "agree", ok: true,
254
+ message: `the audience matches the one the edge issues for ${read.hostname || "this hostname"} (${read.aud})` };
255
+ }
256
+ default:
257
+ return { kind: "could-not-look", ok: false,
258
+ message: `the audience check returned no verdict it knows (${JSON.stringify(read.kind)}), which is `
259
+ + "a fault in this check rather than a finding about the door." };
260
+ }
261
+ }
262
+
263
+ /**
264
+ * One unauthenticated request, with a bound on how long it may take.
265
+ *
266
+ * `redirect: "manual"` because the REDIRECT is the answer — following it fetches Cloudflare's login page
267
+ * and throws away the only thing being read. Failure is returned rather than thrown: the caller's job is
268
+ * to say "could not look", and an exception here would reach `doctor` as a crash instead.
269
+ */
270
+ export async function probeAudience({ url, fetchImpl = fetch, timeoutMs = 5000, signalFor = null } = {}) {
271
+ if (!url) return { error: new Error("no hostname is configured to ask") };
272
+ const ac = signalFor ? null : new AbortController();
273
+ const t = ac ? setTimeout(() => ac.abort(new Error(`no answer within ${timeoutMs}ms`)), timeoutMs) : null;
274
+ try {
275
+ const res = await fetchImpl(url, { redirect: "manual", signal: signalFor ?? ac.signal });
276
+ // TWO MORE HEADERS, AND THEY ARE THE WHOLE OF THIS CHECK. Without them every non-redirecting
277
+ // answer collapses to "no redirect", and three different doors read as one. `www-authenticate` is
278
+ // how an Access-fronted API path announces itself; `cf-ray` is how a 5xx says the EDGE answered and
279
+ // the origin behind it did not. Both are on the response already — nothing extra is fetched.
280
+ return { status: res.status, location: res.headers?.get?.("location") ?? "",
281
+ wwwAuthenticate: res.headers?.get?.("www-authenticate") ?? "",
282
+ viaEdge: Boolean(res.headers?.get?.("cf-ray")) };
283
+ } catch (e) {
284
+ return { error: e };
285
+ } finally {
286
+ if (t) clearTimeout(t);
287
+ }
288
+ }
package/shared/brand.mjs CHANGED
@@ -26,7 +26,7 @@ const HERE = dirname(fileURLToPath(import.meta.url));
26
26
  // index header, nav brand, Excel metadata, connector instructions). Env-overridable per deployment —
27
27
  // branding is tenant config, not code. Read once at import (deployment-static, like the systemd env).
28
28
  //
29
- // CASING: THE VALUE IS PROSE, SO IT IS CAPITALISED (, superseding ruling 2026-08-20). The rule is
29
+ // CASING: THE VALUE IS PROSE, SO IT IS CAPITALISED (superseding ruling 2026-08-20). The rule is
30
30
  // Clearotron in prose and UI, `clearotron` in config values, commands, binary names and identifiers.
31
31
  // This DEFAULT is prose in every place it lands — report and portal <title>, the pool index header,
32
32
  // Excel `creator`, the connector steps, "You reached X" — so it takes the capital. The VARIABLE that
@@ -95,7 +95,7 @@ export const BRAND = {
95
95
  *
96
96
  * ABSENT IS NOT FALSE. The plain confidentiality line claims nothing and is what any legal deliverable
97
97
  * carries; collapsing absent into false is precisely the coercion that shipped House-default clearances
98
- * with no marking at all. That is 's property and it is untouched.
98
+ * with no marking at all. That is the property and it is untouched.
99
99
  *
100
100
  * `true` USED TO SELECT A LONGER LINE — the plain marking plus a legal characterisation of the document
101
101
  * — and the owner dropped that wording on 2026-08-20. It renders as the default here rather than being
@@ -154,7 +154,7 @@ export const PALETTE = {
154
154
 
155
155
  // — THE DARK COUNTERPART. Until this landed, every dark value in the product was a literal typed
156
156
  // into whichever block needed it, and the two server-rendered door pages (sign-in, refusal) had guessed
157
- // their own set — a THIRD ground, tracker issue 17150f, against the brand pack's #0f0e0c.
157
+ // their own set — a THIRD ground, #17150f, against the brand pack's #0f0e0c.
158
158
  //
159
159
  // The two entries the brand pack fixes are marked; the rest have no pack entry and are the values the
160
160
  // warm surfaces already shipped, kept as-is. `cream` has no dark twin by name because a dark ground is
@@ -164,7 +164,7 @@ export const PALETTE_DARK = {
164
164
  ground: '#0f0e0c', // brand pack §01 "Dark BG" — near-black. Supersedes the doors' #17150f
165
165
  ink: '#f0e8d8', // brand pack §01 "Parchment" — dark text / mark. Supersedes #ece5d8
166
166
  // The three locked crimsons, lifted for the dark ground. `crimson` itself is NOT here: it is a FILL
167
- // (badges, the accent) and keeps tracker issue 860F09 in both schemes. Crimson as TEXT is what needs lifting, and
167
+ // (badges, the accent) and keeps #860F09 in both schemes. Crimson as TEXT is what needs lifting, and
168
168
  // that is `crimsonText` — the value the warm and report dark blocks already applied to links.
169
169
  crimsonDeep: '#6a0a13',
170
170
  crimsonMid: '#c47f7a',
@@ -350,7 +350,7 @@ export const REPORT_ROOT =
350
350
 
351
351
  // Risk ramp — the designer's ramp from the portal redesign. It is a BAND family
352
352
  // of its own: --high is deliberately NOT --accent any more (the shipped --high was byte-identical to
353
- // tracker issue 860F09, so a High risk dot read as a Start button and needed a ring workaround). --accent /
353
+ // #860F09, so a High risk dot read as a Start button and needed a ring workaround). --accent /
354
354
  // --crimson / --maroon above are untouched. The gauge's stop order is clear→low→med→high→severe.
355
355
  `--clear:#5F8A64; --low:#8A9440; --med:#C8871B; --high:#B23A2E; --severe:#7C1E15;` +
356
356
  // Soft/text pairs: re-derived from the five bases by the rule in shared/tools/derive-band-pairs.mjs (same
@@ -374,12 +374,12 @@ export const REPORT_ROOT =
374
374
  // • *_EXPLICIT variants — the `[data-theme="dark"]` block ONLY, no `@media` —
375
375
  // CUSTOMER-facing surfaces (the per-customer index): first view is ALWAYS light; dark only by
376
376
  // the visitor's explicit toggle. The @media string must never appear in client output (tests pin this).
377
- // Crimson discipline: `--crimson`/`--h-red` KEEP tracker issue 860F09 in dark — they are FILLS (badges, the accent)
378
- // where white-on-crimson stays high-contrast. `--high` used to be in that list because it WAS tracker issue 860F09;
377
+ // Crimson discipline: `--crimson`/`--h-red` KEEP #860F09 in dark — they are FILLS (badges, the accent)
378
+ // where white-on-crimson stays high-contrast. `--high` used to be in that list because it WAS #860F09;
379
379
  // since the 2026-07-19 ramp recolor it is a band token (#B23A2E) and lightens with the rest of the band
380
380
  // family. Crimson TEXT uses (links, summaries, the wordmark)
381
381
  // are recolored to a lightened #e0736b by SCOPED rules inside the dark block only — zero light-side edits.
382
- // Every dark hex avoids the BLUE_SKIN regex /#3b4fd6|tracker issue 11132a|#f5f6f9|#1a1a2e/i (note #1b1714 ≠ #1a1a2e).
382
+ // Every dark hex avoids the BLUE_SKIN regex /#3b4fd6|#11132a|#f5f6f9|#1a1a2e/i (note #1b1714 ≠ #1a1a2e).
383
383
  //
384
384
  // Inside the @media branch, override RULES are prefixed `html:not([data-theme="light"])` (not `:root:not`)
385
385
  // on purpose: `:root` would add a full class-level of specificity and out-rank sibling base rules like
@@ -427,7 +427,7 @@ const WARM_DARK_RULES = [
427
427
  ];
428
428
 
429
429
  // Report dark tokens (token-for-token against REPORT_ROOT; --font/--mono unchanged). --crimson keeps
430
- // tracker issue 860F09 (it is the accent FILL). The risk BANDS are their own family since the 2026-07-19 recolor and
430
+ // #860F09 (it is the accent FILL). The risk BANDS are their own family since the 2026-07-19 recolor and
431
431
  // are free to lighten: each is its light base at +11 lightness (severe +10), saturation ×.92 — the same
432
432
  // relationship the previous dark ramp used. That relationship is what makes the last stop visible on the
433
433
  // dark ramp, and it does so better than before: dark --severe reads 2.70:1 on the page (was 1.74) and
@@ -478,10 +478,10 @@ export const REPORT_ROOT_DARK_EXPLICIT = darkBlock(REPORT_DARK_TOKENS, REPORT_DA
478
478
  //
479
479
  // WHY IT IS A FAMILY AND NOT A PAGE'S BUSINESS. Both doors are server-rendered by driver/portal-service
480
480
  // and each carried its own copy of this block — including a hand-picked dark set that had drifted from
481
- // the pack (tracker issue 17150f ground, #ece5d8 text) and error colours with no home at all. Two copies of a palette
481
+ // the pack (#17150f ground, #ece5d8 text) and error colours with no home at all. Two copies of a palette
482
482
  // is how the light palettes drifted before PALETTE existed.
483
483
  //
484
- // THE GATING IS `[data-theme]` ONLY (, correcting what shipped). The portal's doctrine is
484
+ // THE GATING IS `[data-theme]` ONLY (correcting what shipped). The portal's doctrine is
485
485
  // that a CLIENT surface never follows the OS colour preference: first view is always light, and dark
486
486
  // arrives only from a choice the visitor made themselves. kept the media query on the argument
487
487
  // that these pages have no toggle, so removing it would leave a first-time visitor no route to dark —
@@ -574,7 +574,7 @@ header.rep .theme-toggle{float:right;margin-left:12px}
574
574
  // emitted page — including reports published by deployments with no connection to that firm (
575
575
  // measured it on the demo pool index, twice on one page). Stripping the label was the fix then;
576
576
  // removing the watermark removes the surface.
577
- // THE SWISS FLAG IS GONE, and it is 's ruling rather than a new one. The portal's lockup
577
+ // THE SWISS FLAG IS GONE, and it is the ruling rather than a new one. The portal's lockup
578
578
  // dropped it when the product was renamed — portal-ui/src/components/Logo.tsx states the reason and
579
579
  // portal-ui/test/lockup.test.ts pins its ABSENCE so a well-meaning restore fails there:
580
580
  //
@@ -639,7 +639,7 @@ export const CHROME_CSS = `
639
639
  .lockup .lk-tag{margin-top:5px;font-size:7.5px;font-weight:500;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
640
640
  .has-glow{position:relative;isolation:isolate}
641
641
  .has-glow::before{content:"";position:absolute;top:0;left:0;width:min(92vw,1100px);aspect-ratio:1.5;background:radial-gradient(farthest-side at 0% 0%,var(--web-glow),transparent 72%);pointer-events:none;z-index:-1}
642
- /* tracker issue 1431 — the .watermark rule and its ::after are GONE. They masked the parent company's ridge behind
642
+ /* the .watermark rule and its ::after are GONE. They masked the parent company's ridge behind
643
643
  every report and the pool index; the owner's call is removal, not a bracket version of the same
644
644
  thing. The three body elements that carried the class drop it too, and --wm-alpha goes with them:
645
645
  a token nothing reads is a knob somebody re-wires.
@@ -47,7 +47,7 @@ export function scanCitations(files, readFn, { paths, excluded, declaredFor, sou
47
47
  // Measured at the bound written here: 6 hits, all real. Widen it further only with the same
48
48
  // measurement in hand.
49
49
  const base = path.endsWith("/") ? null : path.slice(path.lastIndexOf("/") + 1);
50
- // AND A DIRECTORY IS CITED BY ITS OWN NAME TOO (, measured 2026-08-24). Three shipping
50
+ // AND A DIRECTORY IS CITED BY ITS OWN NAME TOO (measured 2026-08-24). Three shipping
51
51
  // files named `fixtures/owner-screen-2026-07-29` — a path relative to the file, not to the repo
52
52
  // root — so `includes(path)` walked straight past every one of them and the reader got a
53
53
  // directory that is not there. The FILES-ONLY bound above was measured against basenames like