clearotron 0.2.1 → 0.2.3

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 (676) hide show
  1. package/.env.example +82 -1
  2. package/.nvmrc +1 -1
  3. package/CONTRIBUTING.md +3 -3
  4. package/INSTALL.md +64 -58
  5. package/README.md +11 -16
  6. package/THIRD-PARTY-NOTICES.md +1 -1
  7. package/bin/brandowner.mjs +1 -1
  8. package/bin/clearotron.mjs +26 -4
  9. package/bin/connect.mjs +2 -2
  10. package/bin/example.mjs +31 -11
  11. package/bin/grant.mjs +3 -3
  12. package/bin/key.mjs +1 -1
  13. package/bin/onboard.mjs +252 -136
  14. package/bin/start.mjs +176 -33
  15. package/bin/stop.mjs +65 -3
  16. package/bin/update.mjs +7 -7
  17. package/bin/uspto-sync.mjs +1 -1
  18. package/build-info.json +2 -2
  19. package/demo/full-country-search/run/_driver/framework.json +1 -1
  20. package/demo/global-preliminary-search/run/_driver/framework.json +1 -1
  21. package/demo/knockout-search/run/_driver/framework.json +1 -1
  22. package/demo/multi-country-focus-search/run/_driver/framework.json +1 -1
  23. package/docs/DELIVERY.md +6 -2
  24. package/docs/E2E.md +5 -5
  25. package/docs/PORTAL.md +2 -2
  26. package/docs/README.md +5 -4
  27. package/docs/SECURITY.md +17 -0
  28. package/docs/architecture/01-product-overview.md +2 -2
  29. package/docs/architecture/02-architecture.md +2 -2
  30. package/docs/architecture/04-configuration-reference.md +8 -3
  31. package/docs/architecture/05-config-governance.md +52 -5
  32. package/docs/architecture/05-customer-profiles.md +2 -2
  33. package/docs/architecture/06-operations-runbook.md +13 -1
  34. package/docs/architecture/09-security-and-data.md +1 -1
  35. package/docs/configuration.md +4 -3
  36. package/docs/decisions/0004-documentation-structure.md +1 -1
  37. package/driver/CHANGELOG.md +121 -1
  38. package/driver/README.md +2 -2
  39. package/driver/ask-ledger.mjs +3 -3
  40. package/driver/authority-trees.mjs +1 -1
  41. package/driver/call-capture.mjs +1 -1
  42. package/driver/card-frame.mjs +1 -1
  43. package/driver/case-law-ledger.mjs +1 -1
  44. package/driver/claim-liveness.mjs +1 -1
  45. package/driver/common-law-receipts.mjs +2 -2
  46. package/driver/commonlaw-carry.mjs +1 -1
  47. package/driver/config-inventory.mjs +1 -1
  48. package/driver/config-staleness.mjs +1 -1
  49. package/driver/connotation-search.mjs +12 -12
  50. package/driver/contract-audit.mjs +5 -5
  51. package/driver/contract-dictation-registry.mjs +4 -4
  52. package/driver/contract-dictation.mjs +2 -2
  53. package/driver/contract-e3-backlog.mjs +6 -6
  54. package/driver/contract-vocabulary.mjs +3 -3
  55. package/driver/corrections-feedforward.mjs +1 -1
  56. package/driver/coverage-form-io.mjs +2 -2
  57. package/driver/coverage-form.mjs +4 -4
  58. package/driver/coverage-ledger.mjs +3 -3
  59. package/driver/coverage-union.mjs +1 -1
  60. package/driver/declination-call.mjs +35 -3
  61. package/driver/declination-duty.mjs +1 -1
  62. package/driver/deliver-trigger.sh +3 -3
  63. package/driver/deploy-live-run-guard.mjs +6 -2
  64. package/driver/dev-portal.mjs +3 -3
  65. package/driver/disposition-call.mjs +4 -4
  66. package/driver/disposition-tool.mjs +4 -4
  67. package/driver/disposition-union.mjs +2 -2
  68. package/driver/doc-constants.mjs +1 -1
  69. package/driver/door-gates.mjs +2 -2
  70. package/driver/doubt-selection.mjs +2 -2
  71. package/driver/drainer-identity.mjs +1 -1
  72. package/driver/driver.config.mjs +64 -12
  73. package/driver/e2e-rounds.mjs +2 -2
  74. package/driver/effort-model.mjs +2 -2
  75. package/driver/engine/anthropic-agent.mjs +24 -24
  76. package/driver/engine/auth.mjs +1 -1
  77. package/driver/engine/cli-version.mjs +103 -0
  78. package/driver/engine/common.mjs +1 -1
  79. package/driver/engine/deny-authority-write.mjs +1 -1
  80. package/driver/engine/jx-turn.mjs +1 -1
  81. package/driver/engine/mcp/clarivate-server.mjs +1 -1
  82. package/driver/engine/mcp/corsearch-server.mjs +1 -1
  83. package/driver/engine/mcp/declination-server.mjs +1 -1
  84. package/driver/engine/mcp/dispositions-server.mjs +1 -1
  85. package/driver/engine/mcp/euipo-server.mjs +1 -1
  86. package/driver/engine/mcp/fetch-server.mjs +1 -1
  87. package/driver/engine/mcp/free-tier-server.mjs +2 -2
  88. package/driver/engine/mcp/gather-config.mjs +11 -11
  89. package/driver/engine/mcp/perplexity-server.mjs +1 -1
  90. package/driver/engine/mcp/recording-server.mjs +8 -4
  91. package/driver/engine/mcp/signa-server.mjs +1 -1
  92. package/driver/engine/mcp/uspto-local-server.mjs +1 -1
  93. package/driver/engine/openai-agent.mjs +2 -2
  94. package/driver/engine-build.mjs +2 -2
  95. package/driver/enqueue-schema.mjs +10 -10
  96. package/driver/enqueue.mjs +1 -1
  97. package/driver/envelope-settle.mjs +1 -1
  98. package/driver/evidence-claim-invariant.mjs +2 -2
  99. package/driver/feedback-store.mjs +1 -1
  100. package/driver/findings-model.mjs +60 -10
  101. package/driver/flag-snapshot.mjs +20 -0
  102. package/driver/floor-duty.mjs +1 -1
  103. package/driver/form-neighbourhood.mjs +1 -1
  104. package/driver/framework.mjs +2 -2
  105. package/driver/gateway.mjs +45 -23
  106. package/driver/grounds-grammar.mjs +1 -1
  107. package/driver/hit-list.mjs +1 -1
  108. package/driver/jurisdiction-systems.mjs +1 -1
  109. package/driver/jx-lanes.mjs +1 -1
  110. package/driver/jx-units.mjs +1 -1
  111. package/driver/jx.mjs +3 -3
  112. package/driver/knockout-assess-record.mjs +5 -1
  113. package/driver/narrative-refutation-record.mjs +3 -3
  114. package/driver/numeric-setting.mjs +1 -1
  115. package/driver/owner-use-check.mjs +184 -0
  116. package/driver/package.json +4 -4
  117. package/driver/party-facts.mjs +2 -2
  118. package/driver/phase0.mjs +2 -2
  119. package/driver/pipeline-knockout.mjs +52 -4
  120. package/driver/pipeline.mjs +180 -67
  121. package/driver/placement-diff.mjs +2 -2
  122. package/driver/placement-form.mjs +4 -4
  123. package/driver/placement-union.mjs +1 -1
  124. package/driver/plain-register.mjs +120 -0
  125. package/driver/portal-access.mjs +1 -1
  126. package/driver/portal-acks.mjs +1 -1
  127. package/driver/portal-config-view.mjs +42 -3
  128. package/driver/portal-families.mjs +1 -1
  129. package/driver/portal-local-auth.mjs +1 -1
  130. package/driver/portal-report.mjs +7 -7
  131. package/driver/portal-service.mjs +41 -22
  132. package/driver/portal-upstream.mjs +2 -2
  133. package/driver/predelivery-lint.mjs +149 -11
  134. package/driver/prelim-variants-record.mjs +2 -2
  135. package/driver/profile-page.html +11 -3
  136. package/driver/profile-selection.mjs +1 -1
  137. package/driver/profile-service.mjs +6 -6
  138. package/driver/profiles/README.md +3 -3
  139. package/driver/profiles.mjs +145 -13
  140. package/driver/progress.mjs +6 -6
  141. package/driver/provider-usage.mjs +1 -1
  142. package/driver/publish/demo-marking.mjs +1 -1
  143. package/driver/publish/index.mjs +49 -8
  144. package/driver/publish/knockout.mjs +42 -14
  145. package/driver/publish/parse.mjs +4 -4
  146. package/driver/publish/publish-inputs.mjs +2 -2
  147. package/driver/publish/register-presence.mjs +1 -1
  148. package/driver/publish/render-knockout.mjs +646 -144
  149. package/driver/publish/render.mjs +2 -2
  150. package/driver/publish/report-data.mjs +13 -3
  151. package/driver/queue-watch-probe.mjs +1 -1
  152. package/driver/queue-watch-verdict.mjs +1 -1
  153. package/driver/recall-reconciliation.mjs +1 -1
  154. package/driver/recipe-service.mjs +1 -1
  155. package/driver/record-carry.mjs +5 -5
  156. package/driver/recording-agreement.mjs +3 -3
  157. package/driver/reference-score.mjs +7 -7
  158. package/driver/reference-strip-signatures.mjs +20 -0
  159. package/driver/refusal-bound.mjs +3 -3
  160. package/driver/register-availability.mjs +2 -2
  161. package/driver/register-count.mjs +1 -1
  162. package/driver/register-grant-vocabulary.mjs +2 -2
  163. package/driver/register-plan.mjs +8 -8
  164. package/driver/register-records.mjs +2 -2
  165. package/driver/registry-fidelity.mjs +3 -3
  166. package/driver/remedy-accounting.mjs +1 -1
  167. package/driver/repair-composers.mjs +2 -2
  168. package/driver/repair-digest.mjs +3 -3
  169. package/driver/repairs.mjs +6 -6
  170. package/driver/replay-archive.mjs +2 -0
  171. package/driver/report-card-record.mjs +2 -2
  172. package/driver/result-noun-fields.mjs +10 -3
  173. package/driver/run-economics.mjs +2 -2
  174. package/driver/run-integrity.mjs +1 -1
  175. package/driver/runner.mjs +22 -22
  176. package/driver/scope-rules.mjs +1 -1
  177. package/driver/search-policy.mjs +5 -5
  178. package/driver/skeptic-search.mjs +1 -1
  179. package/driver/skills/blind-frame/SKILL.md +2 -2
  180. package/driver/skills/case-law-citation/SKILL.md +2 -2
  181. package/driver/skills/knockout-assess/SKILL.md +94 -4
  182. package/driver/skills/matter-frame/SKILL.md +6 -6
  183. package/driver/skills/matter-frame/watchlist-reference.md +2 -2
  184. package/driver/skills/prelim-common-law/SKILL.md +1 -1
  185. package/driver/skills/prelim-search/SKILL.md +3 -3
  186. package/driver/skills/prelim-search/report-prose.md +82 -0
  187. package/driver/skills/prelim-search/risk-framework-demo.manifest.json +1 -1
  188. package/driver/skills/prelim-search/risk-framework-triage.manifest.json +1 -1
  189. package/driver/skills/prelim-search/risk-framework.manifest.json +1 -1
  190. package/driver/skills/prelim-search/synthesis-rules.md +1 -1
  191. package/driver/skills/prelim-search/template-formatting.md +1 -1
  192. package/driver/skills/prelim-search/templates/email/generic.md +1 -1
  193. package/driver/skills/prelim-search/worked-examples.md +1 -1
  194. package/driver/skills/prelim-variants/SKILL.md +5 -5
  195. package/driver/stage-context.mjs +1 -1
  196. package/driver/stages-knockout.mjs +55 -4
  197. package/driver/stages.mjs +101 -44
  198. package/driver/stray-artifacts.mjs +2 -2
  199. package/driver/suite-census.json +275 -65
  200. package/driver/synthesis-record.mjs +1 -1
  201. package/driver/systemd/clearotron-client-mcp.service +1 -1
  202. package/driver/systemd/clearotron-portal.service +1 -1
  203. package/driver/systemd/render-units.mjs +1 -1
  204. package/driver/tokens.mjs +1 -1
  205. package/driver/tool-calls.mjs +1 -1
  206. package/driver/turnaround-bands.mjs +1 -1
  207. package/driver/unit-file-drift.mjs +1 -1
  208. package/driver/unit-inventory.mjs +297 -80
  209. package/driver/unit-state-verdict.mjs +20 -12
  210. package/driver/verify-knockout.mjs +10 -2
  211. package/driver/verify.mjs +13 -13
  212. package/driver/whatif-memo-run.mjs +72 -9
  213. package/driver/whatif-memo.mjs +19 -1
  214. package/driver/whatif-queue.mjs +1 -1
  215. package/driver/whatif-worker.mjs +1 -1
  216. package/examples/README.md +2 -2
  217. package/examples/grants.example.json +6 -7
  218. package/mcp-server/CHANGELOG.md +6 -0
  219. package/mcp-server/README.md +3 -3
  220. package/mcp-server/http-server.mjs +44 -1
  221. package/mcp-server/key-socket.mjs +184 -0
  222. package/mcp-server/lib/audit-view.mjs +69 -2
  223. package/mcp-server/lib/brief.mjs +15 -0
  224. package/mcp-server/lib/driver.mjs +7 -1
  225. package/mcp-server/lib/events.mjs +1 -1
  226. package/mcp-server/lib/http-handler.mjs +1 -1
  227. package/mcp-server/lib/knockout.mjs +435 -0
  228. package/mcp-server/lib/ops.mjs +4 -4
  229. package/mcp-server/lib/options.mjs +1 -1
  230. package/mcp-server/lib/plan.mjs +1 -1
  231. package/mcp-server/lib/runs.mjs +1 -1
  232. package/mcp-server/lib/scrub.mjs +2 -2
  233. package/mcp-server/lib/whatif.mjs +5 -5
  234. package/mcp-server/mint-token.mjs +1 -1
  235. package/mcp-server/package.json +2 -2
  236. package/mcp-server/packs/ops/EXAMPLES.md +2 -2
  237. package/mcp-server/server.mjs +77 -12
  238. package/package.json +30 -12
  239. package/portal-ui/dist/assets/{index-Ct3iQtZ2.css → index-1ziUJX1E.css} +43 -2
  240. package/portal-ui/dist/assets/{index-BUGgiYtF.js → index-CEYvXdqH.js} +226 -49
  241. package/portal-ui/dist/index.html +2 -2
  242. package/portal-ui/package.json +1 -1
  243. package/providers/_shared/enumerate.mjs +1 -1
  244. package/providers/_shared/ledger-path.mjs +3 -3
  245. package/providers/_shared/ledger.mjs +1 -1
  246. package/providers/_shared/result-shape.mjs +3 -3
  247. package/providers/_shared/term-shape.mjs +2 -2
  248. package/providers/corsearch/src/core.js +1 -1
  249. package/providers/jx-subclass/BUILDING.md +1 -1
  250. package/providers/oauth-mcp-bridge/CHANGELOG.md +6 -0
  251. package/providers/oauth-mcp-bridge/package.json +1 -1
  252. package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
  253. package/providers/uspto-local/src/index-store.js +2 -2
  254. package/scripts/README.md +1 -1
  255. package/scripts/added-reference-check.mjs +29 -1
  256. package/scripts/authority-boundary-probe.mjs +1 -1
  257. package/scripts/backfill-started-at.mjs +1 -1
  258. package/scripts/citation-line-check.mjs +124 -5
  259. package/scripts/compare.mjs +2 -2
  260. package/scripts/contract-dictation-scan.mjs +2 -2
  261. package/scripts/dead-names.mjs +1 -1
  262. package/scripts/drain-preflight.mjs +5 -5
  263. package/scripts/e2e-unread-terminals.mjs +1 -1
  264. package/scripts/e2e.mjs +8 -8
  265. package/scripts/env-audit.mjs +7 -7
  266. package/scripts/env-classify.mjs +206 -18
  267. package/scripts/freeze-example-run.mjs +3 -3
  268. package/scripts/head-arrived-gated.mjs +1 -1
  269. package/scripts/headless-page.mjs +51 -2
  270. package/scripts/live-surface-check.mjs +129 -19
  271. package/scripts/main-health.mjs +1 -1
  272. package/scripts/merge-presence-check.mjs +3 -3
  273. package/scripts/mint-suite-census.mjs +6 -6
  274. package/scripts/nightly-notice.mjs +1 -3
  275. package/scripts/preinstall-node-check.mjs +24 -0
  276. package/scripts/reconcile-runs.mjs +1 -1
  277. package/scripts/release-await-cut.mjs +6 -4
  278. package/scripts/release-version-pr-checks.mjs +1 -1
  279. package/scripts/release-version.mjs +2 -2
  280. package/scripts/render-check.mjs +66 -7
  281. package/scripts/report-frame-check.mjs +1 -1
  282. package/scripts/report-screenshot.mjs +1 -1
  283. package/scripts/revisit-render-check.mjs +1 -1
  284. package/scripts/score.mjs +4 -4
  285. package/scripts/strip-tracker-citations.mjs +139 -0
  286. package/scripts/test-run.mjs +19 -3
  287. package/scripts/third-party-notices.mjs +3 -3
  288. package/scripts/travelling-predicates.mjs +3 -3
  289. package/scripts/unexecuted-asserts.mjs +2 -2
  290. package/scripts/verify-publishable.mjs +2 -2
  291. package/scripts/write-up-form-census.mjs +1 -1
  292. package/shared/access-audience.mjs +1 -1
  293. package/shared/anon-overlay.mjs +3 -3
  294. package/shared/brand.mjs +13 -13
  295. package/shared/citation-scan.mjs +1 -1
  296. package/shared/client-door.mjs +7 -7
  297. package/shared/customer-store.mjs +1 -1
  298. package/shared/driver-dir.mjs +1 -1
  299. package/shared/env-aliases.mjs +0 -48
  300. package/shared/env-local.mjs +1 -1
  301. package/shared/identifier-scan.mjs +3 -3
  302. package/shared/invocation.mjs +29 -1
  303. package/shared/names-in-force.mjs +4 -0
  304. package/shared/node-floor.mjs +97 -0
  305. package/shared/product-owned-names.mjs +1 -1
  306. package/shared/register-selection.mjs +1 -1
  307. package/shared/scope.mjs +5 -5
  308. package/shared/server-units.mjs +4 -4
  309. package/shared/staff-domain.mjs +154 -0
  310. package/shared/store-in-repo.mjs +25 -4
  311. package/shared/suite-census.mjs +4 -4
  312. package/shared/tty-style.mjs +1 -1
  313. package/shared/uspto-index-size.mjs +1 -1
  314. package/shared/vacuous-pass.mjs +1 -1
  315. package/skills/clearotron-account/SKILL.md +42 -13
  316. package/skills/clearotron-ops/SKILL.md +1 -1
  317. package/driver/recipes/README.md +0 -49
  318. package/driver/skills/prelim-search/risk-framework-aurora.manifest.json +0 -19
  319. package/driver/skills/prelim-search/risk-framework-aurora.md +0 -77
  320. package/driver/skills/prelim-search/risk-framework-zephyr.manifest.json +0 -14
  321. package/driver/skills/prelim-search/risk-framework-zephyr.md +0 -33
  322. package/driver/skills/prelim-search/worked-examples-aurora.md +0 -10
  323. package/driver/skills/prelim-search/worked-examples-zephyr.md +0 -10
  324. package/driver/systemd/prelim-driver.path +0 -69
  325. package/driver/systemd/prelim-driver.service +0 -86
  326. package/driver/systemd/prelim-driver.timer +0 -14
  327. package/driver/systemd/prelim-outbox.path +0 -27
  328. package/driver/systemd/prelim-outbox.service +0 -37
  329. package/driver/systemd/prelim-outbox.timer +0 -21
  330. package/node_modules/exceljs/README_zh.md +0 -2878
  331. package/node_modules/exceljs/dist/LICENSE +0 -22
  332. package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
  333. package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
  334. package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
  335. package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
  336. package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
  337. package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
  338. package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
  339. package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
  340. package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
  341. package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
  342. package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
  343. package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
  344. package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
  345. package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
  346. package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
  347. package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
  348. package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
  349. package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
  350. package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
  351. package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
  352. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
  353. package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
  354. package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
  355. package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
  356. package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
  357. package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
  358. package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
  359. package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
  360. package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
  361. package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
  362. package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
  363. package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
  364. package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
  365. package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
  366. package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
  367. package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
  368. package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
  369. package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
  370. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
  371. package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
  372. package/node_modules/exceljs/dist/es5/index.js +0 -15
  373. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
  374. package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
  375. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
  376. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
  377. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
  378. package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
  379. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
  380. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
  381. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
  382. package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
  383. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
  384. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
  385. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
  386. package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
  387. package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
  388. package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
  389. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
  390. package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
  391. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
  392. package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
  393. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
  394. package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
  395. package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
  396. package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
  397. package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
  398. package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
  399. package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
  400. package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
  401. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
  402. package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
  403. package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
  404. package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
  405. package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
  406. package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
  407. package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
  408. package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
  409. package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
  410. package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
  411. package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
  412. package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
  413. package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
  414. package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
  415. package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
  416. package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
  417. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
  418. package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
  419. package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
  420. package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
  421. package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
  422. package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
  423. package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
  424. package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
  425. package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
  426. package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
  427. package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
  428. package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
  429. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
  430. package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
  431. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
  432. package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
  433. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
  434. package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
  435. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
  436. package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
  437. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
  438. package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
  439. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
  440. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
  441. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
  442. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
  443. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
  444. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
  445. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
  446. package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
  447. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
  448. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
  449. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
  450. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
  451. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
  452. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
  453. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
  454. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
  455. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
  456. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
  457. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
  458. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
  459. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
  460. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
  461. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
  462. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
  463. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
  464. package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
  465. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
  466. package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
  467. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
  468. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
  469. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
  470. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
  471. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
  472. package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
  473. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
  474. package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
  475. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
  476. package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
  477. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
  478. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
  479. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
  480. package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
  481. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
  482. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
  483. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
  484. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
  485. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
  486. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
  487. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
  488. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
  489. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
  490. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
  491. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
  492. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
  493. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
  494. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
  495. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
  496. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
  497. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
  498. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
  499. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
  500. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
  501. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
  502. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
  503. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
  504. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
  505. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
  506. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
  507. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
  508. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
  509. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
  510. package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
  511. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
  512. package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
  513. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
  514. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
  515. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
  516. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
  517. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
  518. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
  519. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
  520. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
  521. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
  522. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
  523. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
  524. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
  525. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
  526. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
  527. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
  528. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
  529. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
  530. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
  531. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
  532. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
  533. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
  534. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
  535. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
  536. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
  537. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
  538. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
  539. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
  540. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
  541. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
  542. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
  543. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
  544. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
  545. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
  546. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
  547. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
  548. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
  549. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
  550. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
  551. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
  552. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
  553. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
  554. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
  555. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
  556. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
  557. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
  558. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
  559. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
  560. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
  561. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
  562. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
  563. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
  564. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
  565. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
  566. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
  567. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
  568. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
  569. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
  570. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
  571. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
  572. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
  573. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
  574. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
  575. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
  576. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
  577. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
  578. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
  579. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
  580. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
  581. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
  582. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
  583. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
  584. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
  585. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
  586. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
  587. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
  588. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
  589. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
  590. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
  591. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
  592. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
  593. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
  594. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
  595. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
  596. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
  597. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
  598. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
  599. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
  600. package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
  601. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
  602. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
  603. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
  604. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
  605. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
  606. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
  607. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
  608. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
  609. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
  610. package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
  611. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
  612. package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
  613. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
  614. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
  615. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
  616. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
  617. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
  618. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
  619. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
  620. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
  621. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
  622. package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
  623. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
  624. package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
  625. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
  626. package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
  627. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
  628. package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
  629. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
  630. package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
  631. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
  632. package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
  633. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
  634. package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
  635. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
  636. package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
  637. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
  638. package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
  639. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
  640. package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
  641. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
  642. package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
  643. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
  644. package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
  645. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
  646. package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
  647. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
  648. package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
  649. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
  650. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
  651. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
  652. package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
  653. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
  654. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
  655. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
  656. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
  657. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
  658. package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
  659. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
  660. package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
  661. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
  662. package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
  663. package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
  664. package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
  665. package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
  666. package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
  667. package/node_modules/exceljs/dist/exceljs.js +0 -59900
  668. package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
  669. package/node_modules/exceljs/dist/exceljs.min.js +0 -45
  670. package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
  671. package/scripts/ai-page-render-check.mjs +0 -532
  672. package/scripts/clearances-render-check.mjs +0 -480
  673. package/scripts/composer-render-check.mjs +0 -1027
  674. package/scripts/deploy-test.sh +0 -309
  675. package/scripts/home-render-check.mjs +0 -526
  676. package/scripts/portal-lifecycle-check.mjs +0 -639
@@ -288,7 +288,7 @@ const COMMENT_LINE = /^\s*(\/\/|#|\*|<!--)/;
288
288
  // address, and a reader sent looking for one would be looking in the wrong place.
289
289
  // `contact` joins on the owner's ruling of 2026-08-24: the launch documents collapsed to ONE public
290
290
  // mailbox, and counsel's pack (ADDITIONAL-TERMS.md, NOTICES.md, TRADEMARKS.md) prints it. Added here in
291
- // the same PR that introduced it, per 's rule above — a ruled mailbox joins this list, it never gets
291
+ // the same PR that introduced it, per the rule above — a ruled mailbox joins this list, it never gets
292
292
  // a domain exemption. `interested` and `security` stay: they are no longer printed by any shipping
293
293
  // document, but removing a localpart from an allowlist is how a future document that uses one again
294
294
  // fails for a reason nobody expects.
@@ -390,7 +390,7 @@ export function scanOperatorIdentity(files, readFn, { withheld = () => false } =
390
390
  // ──: THE RETIRED PLATFORM ───────────────────────────────────────────────────────────────────
391
391
  //
392
392
  // The sixth pattern, and the narrowest: one token, matched case-insensitively, anywhere in a tracked
393
- // file. It is here rather than in a one-off script because 's last scope line asks for exactly
393
+ // file. It is here rather than in a one-off script because the last scope line asks for exactly
394
394
  // this — "extend the battery so this class cannot return" — and because the class it guards is the
395
395
  // one the other five provably could not see. An integrator platform's name is not a person, not a
396
396
  // home path, not a classification stamp, not an audience, and not a vendor standing where a category
@@ -439,7 +439,7 @@ export const namesRetiredPlatform = (text) => RETIRED_PLATFORM.test(String(text
439
439
  // reasonably concludes they need a Cloudflare account.
440
440
  //
441
441
  // WHY A QUALIFIER RATHER THAN A BAN. The vendor name must keep appearing — a runbook worked through
442
- // one real proxy end to end is worth more to an installer than an abstract one, and 's rewrite
442
+ // one real proxy end to end is worth more to an installer than an abstract one, and the rewrite
443
443
  // deliberately kept it. What must not happen is the name standing where the CATEGORY belongs. So the
444
444
  // rule is: name the vendor as much as you like, provided the line (or the one either side of it) says
445
445
  // it is an example, a reference, or what THIS deployment happens to use.
@@ -92,6 +92,34 @@ export function standFrom(dir) {
92
92
  return at === -1 ? s : s.slice(0, at);
93
93
  }
94
94
 
95
+ /**
96
+ * WHICH ROUTE THIS INSTALL ARRIVED BY — a package, or a source checkout.
97
+ *
98
+ * The setup wizard has two spellings and only one of them works for any given reader. Someone who ran
99
+ * `npm i clearotron` has no package scripts, so `npm run setup` is a command they cannot type; someone
100
+ * working in a clone of the source has the scripts but no `clearotron` binary linked for them, because
101
+ * npm links a package's bin for its dependencies and never for itself. Naming one of the two on a
102
+ * screen is a coin flip, and the screen that names it is read by people who have just installed and
103
+ * have nothing else to go on.
104
+ *
105
+ * The answer is a property of where this file sits on disk, so it is derived from that. A package —
106
+ * local or global — is unpacked inside a `node_modules` directory; a checkout is not. `standFrom`
107
+ * already draws that line for the sibling question of where to stand, and reusing it is deliberate:
108
+ * two predicates for "am I a package" would be two chances to disagree.
109
+ *
110
+ * NO PATH IS RETURNED, and that is the point of splitting it out from `invocationForm`. That function's
111
+ * `prefix` can be `cd /srv/whatever && npx `, which is the server's own layout, its account name and
112
+ * its directory structure. This answers the same question with a word, so the answer can travel to a
113
+ * browser without carrying the machine with it.
114
+ *
115
+ * @param {string} dir where this module is installed
116
+ * @returns {'packaged'|'checkout'}
117
+ */
118
+ export function installRoute(dir = INSTALL_DIR) {
119
+ const s = String(dir ?? "");
120
+ return standFrom(s) === s ? "checkout" : "packaged";
121
+ }
122
+
95
123
  /**
96
124
  * WHERE npm PUT THE EXECUTABLE for a GLOBAL install of this package —.
97
125
  *
@@ -263,7 +291,7 @@ export const bareInvocation = (verb) => `clearotron ${verb}`;
263
291
  /**
264
292
  * Refuse a prompt when there is nobody to answer it.
265
293
  *
266
- * — bb8's F14 item 5. `install` has said this since it was written; `connect`
294
+ * — found in review. `install` has said this since it was written; `connect`
267
295
  * and `disconnect` prompt through readline and did not, so piped or redirected they read EOF and took
268
296
  * it as an answer. `install`'s exit code and wording are the model, and this is that model shared
269
297
  * rather than copied a third time.
@@ -43,6 +43,7 @@ export const NAMES_IN_FORCE = Object.freeze([
43
43
  "CLEAROTRON_DEFAULT_AGENT",
44
44
  "CLEAROTRON_DELIVERY",
45
45
  "CLEAROTRON_DEMO",
46
+ "CLEAROTRON_DEMO_PROFILES",
46
47
  "CLEAROTRON_DISPATCH_RECORD",
47
48
  "CLEAROTRON_DOCTOR_ASSUME_PINNED",
48
49
  "CLEAROTRON_DUMP_JSON",
@@ -141,6 +142,7 @@ export const NAMES_IN_FORCE = Object.freeze([
141
142
  "CLEAROTRON_REPLAY_SNAPSHOT",
142
143
  "CLEAROTRON_REPORTS_DIR",
143
144
  "CLEAROTRON_REPORTS_URL",
145
+ "CLEAROTRON_REQUESTER_WHATSAPP",
144
146
  "CLEAROTRON_REQUIRE_EXPLICIT_PORTS",
145
147
  "CLEAROTRON_RETRY_BACKOFF_MS",
146
148
  "CLEAROTRON_RUN_DIR",
@@ -161,6 +163,7 @@ export const NAMES_IN_FORCE = Object.freeze([
161
163
  "CLEAROTRON_SUITE_TELEMETRY_DIR",
162
164
  "CLEAROTRON_SYNTHESIS_MODEL",
163
165
  "CLEAROTRON_TAINT_CHAIN",
166
+ "CLEAROTRON_TEST_FIXTURE_PROFILES",
164
167
  "CLEAROTRON_TURN_CAP",
165
168
  "CLEAROTRON_TURN_LOCK_POLL_MS",
166
169
  "CLEAROTRON_UNREACHABLE_SENIOR",
@@ -168,6 +171,7 @@ export const NAMES_IN_FORCE = Object.freeze([
168
171
  "CLEAROTRON_WARM_RETRY",
169
172
  "CLEAROTRON_WATCH_",
170
173
  "CLEAROTRON_WHATIF_MAX_CONCURRENT",
174
+ "CLEAROTRON_WHATSAPP_OPERATOR_COPY",
171
175
  "CLEAROTRON_WORKSPACE_PREFIX",
172
176
  "CLEAROTRON_WORK_DIR",
173
177
  "CLEAROTRON_X",
@@ -0,0 +1,97 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
+ //
4
+ // THE MINIMUM NODE VERSION, READ FROM THE ONE PLACE THAT DECLARES IT.
5
+ //
6
+ // `package.json` says `engines: { node: ">=22.13.0" }`. npm reads that field, and so does everything
7
+ // here. Nothing restates the number.
8
+ //
9
+ // WHY THIS FILE EXISTS RATHER THAN A CONSTANT. There was a constant: `NODE_FLOOR = 22` in bin/onboard.mjs,
10
+ // compared as `Number(process.versions.node.split(".")[0]) >= NODE_FLOOR`. A major-only comparison
11
+ // STRUCTURALLY CANNOT SEE A MINOR FLOOR, so 22.9.0 passed a check written for a 22.13.0 floor — the check said
12
+ // `node 22.9.0` and a tick while npm, reading the same requirement from the same repository, printed
13
+ // EBADENGINE for it. One requirement, two spellings, already disagreeing.
14
+ //
15
+ // The cost was a first-run failure nobody could diagnose: an engine door exited 1 on a machine below the
16
+ // floor, and every check the product offers said the runtime was fine.
17
+
18
+ import { readFileSync } from "node:fs";
19
+ import { fileURLToPath } from "node:url";
20
+ import { join, dirname } from "node:path";
21
+
22
+ const HERE = dirname(fileURLToPath(import.meta.url));
23
+
24
+ /** The declared range, verbatim, e.g. `">=22.13.0"`. Throws if the field is gone — an absent floor is a
25
+ * packaging fault, not a licence to run on anything. */
26
+ export function declaredRange(root = join(HERE, "..")) {
27
+ const range = JSON.parse(readFileSync(join(root, "package.json"), "utf8"))?.engines?.node;
28
+ if (!range) throw new Error("package.json declares no engines.node — the runtime floor has no source");
29
+ return String(range);
30
+ }
31
+
32
+ /**
33
+ * `">=22.13.0"` → [22, 13, 0]. `">=22"` and `">=22.13"` are accepted too, with the absent parts read as
34
+ * zero, because that is what they mean and not a guess — and because the field is edited by whoever
35
+ * changes the floor, who should not have to know which spelling this reader was written against. A
36
+ * coordination failure between two people editing one number is the defect this whole file exists for.
37
+ *
38
+ * ONLY the `>=` family. A caret or tilde range, or an `||` union, THROWS rather than being interpreted:
39
+ * a floor read wrongly is worse than one not read at all, because it would silently pass every version
40
+ * and take every check built on it with it.
41
+ */
42
+ export function floorOf(range) {
43
+ const m = /^>=\s*(\d+)(?:\.(\d+))?(?:\.(\d+))?\s*$/.exec(String(range).trim());
44
+ if (!m) throw new Error(`engines.node is ${range}, which this reader does not understand — expected ">=x", ">=x.y" or ">=x.y.z"`);
45
+ return [Number(m[1]), Number(m[2] ?? 0), Number(m[3] ?? 0)];
46
+ }
47
+
48
+ /**
49
+ * `"22.16.0"` → [22, 16, 0], ignoring any pre-release or build suffix. NULL when it cannot be read.
50
+ *
51
+ * Null rather than zeroes, and the difference is the whole of it: `[0, 0, 0]` compares as below every
52
+ * floor, so a version string this reader did not understand would REFUSE — and this file would become
53
+ * the reason an install fails on a Node that is probably fine. A parser gap must not become an outage.
54
+ * Found in review, 2026-09-08.
55
+ */
56
+ export const partsOf = (v) => {
57
+ // THE `v` IS OPTIONAL AND MUST BE, because both spellings are in reach: `process.versions.node` has
58
+ // no prefix and `process.version` does. Without it a caller handed the prefixed form gets null,
59
+ // null passes, and an out-of-date runtime is waved through by the guard written to stop it — the
60
+ // permissive half of the same asymmetry, which is the direction that fails silently.
61
+ const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(String(v).trim());
62
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
63
+ };
64
+
65
+ /** Is `current` at or above `floor`? ALL THREE PARTS, in order — the defect this replaces compared one. */
66
+ export function meetsFloor(current, floor) {
67
+ const c = partsOf(current);
68
+ // AN UNREADABLE RUNNING VERSION PASSES, and that asymmetry is deliberate. The DECLARED range is our
69
+ // own manifest and throws loudly when it cannot be read, because that is a packaging fault we own.
70
+ // The running version is whatever the runtime reports, and refusing one we failed to parse would
71
+ // stop a working install over our own gap. Refuse only what we can show is below the floor.
72
+ if (!c) return true;
73
+ for (let i = 0; i < 3; i += 1) {
74
+ if (c[i] > floor[i]) return true;
75
+ if (c[i] < floor[i]) return false;
76
+ }
77
+ return true;
78
+ }
79
+
80
+ /**
81
+ * The whole answer, for a caller that wants to refuse.
82
+ *
83
+ * `current` and `root` are injected so a check can drive every side of this without a second Node
84
+ * installation — a floor guard that can only be exercised by running on an old runtime is one nobody
85
+ * ever sees fail.
86
+ */
87
+ export function nodeFloorVerdict({ current = process.versions.node, root } = {}) {
88
+ const range = declaredRange(root);
89
+ const floor = floorOf(range);
90
+ return { ok: meetsFloor(current, floor), current, required: floor.join("."), range };
91
+ }
92
+
93
+ /** What a person is told, in one sentence, naming both versions. No stack, no advice they cannot act on. */
94
+ export function nodeFloorRefusal(v) {
95
+ return `This needs Node ${v.required} or newer, and this is Node ${v.current}. `
96
+ + "Upgrade Node and run the command again — nothing else here will work until you do.";
97
+ }
@@ -24,7 +24,7 @@
24
24
  // Add it here and nowhere else, and only if this product genuinely owns it. A prefix added to let one
25
25
  // awkward name through re-opens the gap for every future gather — the cost is not local.
26
26
  export const PRODUCT_NAME_PREFIXES = Object.freeze([
27
- "PRELIM", "CLEAROTRON", "PORTAL", "TRADEMARK_MCP", "CLIENT_MCP", "CLIENT_ACCESS",
27
+ "CLEAROTRON", "CLEAROTRON", "PORTAL", "TRADEMARK_MCP", "CLIENT_MCP", "CLIENT_ACCESS",
28
28
  "CLIENT_CF", "PROFILE", "RECIPE", "MCP_A",
29
29
  ]);
30
30
 
@@ -31,7 +31,7 @@
31
31
  // `driver/run-requirements.mjs` derives from those two fields and never restates them.
32
32
  //
33
33
  // The vendor sign-up steps travel WITH the table rather than staying behind in the wizard: they are
34
- // facts about the register, the wizard is one reader of them, and tracker issue 100 asks for the same
34
+ // facts about the register, the wizard is one reader of them, and the same steps are asked for on the same
35
35
  // steps on surfaces the wizard does not own.
36
36
 
37
37
  // The USPTO sizing figures are MEASURED and live in their own module; the warnings below quote them
package/shared/scope.mjs CHANGED
@@ -39,7 +39,7 @@ export function isRevoked(jti, { denylistPath = process.env.TRADEMARK_MCP_TOKEN_
39
39
  let text;
40
40
  try { text = readFileSync(denylistPath, "utf8"); }
41
41
  catch (e) {
42
- // FAIL CLOSED ( bb8's F14; overwatch ruling, recorded on 1889 for the owner's
42
+ // FAIL CLOSED (found in review; ruled and recorded for the owner's
43
43
  // review with the reversal path, which is this function).
44
44
  //
45
45
  // This returned false — "not revoked" — on any unreadable list, and that is how a revoked key kept
@@ -64,7 +64,7 @@ export function isRevoked(jti, { denylistPath = process.env.TRADEMARK_MCP_TOKEN_
64
64
  *
65
65
  * NOT AN AUTHENTICATOR. This parses without verifying, which is safe for exactly one job: reading the
66
66
  * revocation handle out of our own `mintToken` output so `clearotron connect` can write it down
67
- * (, owner ruling: record key IDs, never secrets). Anything answering "is this token
67
+ * (owner ruling: record key IDs, never secrets). Anything answering "is this token
68
68
  * good" goes through `verifyToken`; a caller handing this function a token from the WIRE is the defect.
69
69
  *
70
70
  * Returns null rather than throwing on a malformed string — the caller is recording, and a record of
@@ -302,7 +302,7 @@ export const USER_ARTIFACTS = new Set(["report"]);
302
302
  // SEALED MODEL IDENTITY, BILLED COUNTS, and THE ENGINE'S JUDGMENT OF ITS OWN OUTPUT. Which model tier
303
303
  // ran a stage and what it cost is the firm's cost structure, not an audit fact — and
304
304
  // `withdrawn_reason` ("confabulated attribution") is an assessment of our own quality that the
305
- // client has no counterpart for, already ruled un-forwardable (, scrub.mjs).
305
+ // client has no counterpart for, already ruled un-forwardable (scrub.mjs).
306
306
  //
307
307
  // That line is cheap to hold because the code had already drawn it: events.mjs says "Model identity is
308
308
  // deliberately NOT projected here: decision_timeline / run_changes are narrative surfaces", trace.mjs and
@@ -713,7 +713,7 @@ export function attributionOf(scope, onBehalfOf = null) {
713
713
  // the delegate does not widen what the token may do.
714
714
  const delegate = typeof onBehalfOf === "string" && onBehalfOf.trim() ? onBehalfOf.trim() : null;
715
715
  if (!delegate) return self;
716
- // COUNTS AND IDENTIFIERS, NOT PROSE ('s scope note): this file is a matter record. A delegate
716
+ // COUNTS AND IDENTIFIERS, NOT PROSE (the scope note): this file is a matter record. A delegate
717
717
  // carrying whitespace, a colon or a newline would forge the compound form or spill a sentence into the
718
718
  // archive, so anything that is not a bare identifier is refused and the verified half stands alone.
719
719
  if (!/^[A-Za-z0-9._%+@-]{1,128}$/.test(delegate)) return self;
@@ -759,7 +759,7 @@ export function authorize(scope, toolName, args = {}) {
759
759
  }
760
760
  // The PREVIEW only, deliberately — the same line the internal branch draws below.
761
761
  //
762
- // #53's defect was that the FREE call every principal makes first died on a message naming an
762
+ // The defect was that the FREE call every principal makes first died on a message naming an
763
763
  // internal doc, so that is the call the stamp exists to rescue. Extending it to start_run would
764
764
  // quietly remove a spend gate: an ops token's sub is often a connector name or "local", buildJob
765
765
  // fills forwarderEmail from `${forwarder}@example.com` when none is given, and the result is a real
@@ -28,7 +28,7 @@
28
28
  // today and zero right ones tomorrow. `orphanReason` cannot discriminate either — all six carry one, and
29
29
  // `clearotron-client-mcp`'s used to say the opposite thing — never install it eagerly, because starting
30
30
  // it was the on-demand consent that opened client-account access. That row was rewritten on 2026-09-03
31
- // when the owner superseded the posture (, settled point 2), which does not rescue the
31
+ // when the owner superseded the posture (settled point 2), which does not rescue the
32
32
  // rejected repair: the reason a skip-on-orphan filter fails is that `runsOn: []` records boxes MEASURED,
33
33
  // and every unit here starts life unmeasured.
34
34
  //
@@ -74,7 +74,7 @@ export const SERVER_INSTALL_SET = Object.freeze([
74
74
  // "On demand is fine" — starting the door WAS the consent that opened client-account access, so an
75
75
  // installer that placed it would have made that consent meaningless.
76
76
  //
77
- // The owner superseded that knowingly (, settled point 2): the door auto-starts
77
+ // The owner superseded that knowingly (settled point 2): the door auto-starts
78
78
  // with the product and THE PER-ACCOUNT KEY IS THE GATE, not whether a process runs. A door with no
79
79
  // key issued refuses everything, which is the same protection with a different mechanism — and a
80
80
  // better one, because it does not depend on a reader finding a verb.
@@ -85,7 +85,7 @@ export const SERVER_INSTALL_SET = Object.freeze([
85
85
  ]);
86
86
 
87
87
  /**
88
- * Installed and enabled ONLY by `clearotron connect`, never by an install path (,
88
+ * Installed and enabled ONLY by `clearotron connect`, never by an install path (
89
89
  * owner ruling 2026-08-31). Named here so a reader of this file learns it exists and learns it is
90
90
  * excluded on purpose — an absence with no reason beside it is the thing this module is against.
91
91
  */
@@ -98,7 +98,7 @@ export const ON_DEMAND_UNITS = Object.freeze([]);
98
98
  /**
99
99
  * Which of the installed units a `--background` REFRESH must restart.
100
100
  *
101
- * — Hera's review of the F15 fix. `enable --now` on an ALREADY-ACTIVE unit is a
101
+ * — A review of that fix. `enable --now` on an ALREADY-ACTIVE unit is a
102
102
  * no-op, so a refresh over an updated checkout leaves the old process running the old files. The restart
103
103
  * loop that exists for exactly that named a hardcoded PAIR — the same pair the health check named, three
104
104
  * lines below it — with the same stale justification: "the oneshot and its triggers pick the new copies
@@ -0,0 +1,154 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
+ // staff-domain.mjs — what a staff-domain rule ADMITS, decided before one is written.
4
+ //
5
+ // `PORTAL_STAFF_DOMAINS` is a list of email domains, and every address at a listed domain that gets
6
+ // past this instance's sign-in door is staff: it sees every brand owner on the instance
7
+ // (driver/portal-access.mjs). That is a rule about a set of people, not about one person.
8
+ //
9
+ // The install used to build that rule by taking everything after the last `@` of the one address it
10
+ // was given. On a laptop that address is `<account>@localhost` and the rule admits the one identity
11
+ // that can sign in, which is why it was safe and why nobody looked at it again. Given a real address
12
+ // the same line turns a person into their whole employer, or into every customer of a webmail
13
+ // provider, with nothing said to the operator and nothing to undo. A stranger's install granted a
14
+ // documentation domain that way, read its own settings page back, and reported it as a back door.
15
+ //
16
+ // So the derivation is classified before it is used, and there are three answers:
17
+ //
18
+ // "narrow" the domain cannot name a second person on this machine — `localhost`, or any bare
19
+ // hostname with no dot. Deriving a rule from it is what it always was: safe, silent.
20
+ // "public" a webmail or shared provider. Never a staff rule: it would admit strangers, and no
21
+ // deployment can want it. Refused outright, and the refusal names the domain.
22
+ // "reserved" a domain reserved for documentation and testing (RFC 2606). Nobody's real mail lives
23
+ // there, so a rule built from one is always an address somebody typed as a placeholder.
24
+ // Refused for the same reason, with a different sentence, because the remedy differs.
25
+ // "wide" an ordinary routable domain. It may well be the right rule — it is how a firm admits
26
+ // its own lawyers — but it admits people the operator has not met, so it is stated in
27
+ // the words the settings page will use and confirmed before it is written. It is never
28
+ // derived silently from one address.
29
+ //
30
+ // FAIL-CLOSED, in the direction of a smaller grant. A domain wrongly classified `public` refuses, and
31
+ // the operator sets `PORTAL_STAFF_DOMAINS` themselves in one line — an explicit decision, recorded
32
+ // where the settings page can name it. A domain wrongly classified `wide` asks a question. Neither
33
+ // outcome grants anything, which is why the lists below are allowed to be short and stay short: the
34
+ // `wide` branch is what actually protects an operator, and the lists only decide whether the product
35
+ // asks a question or refuses to ask one.
36
+
37
+ /** Last-@ semantics, matching driver/portal-access.mjs and shared/scope.mjs `isFirmDomain`. */
38
+ export function domainOfEmail(email) {
39
+ const e = String(email ?? "").trim().toLowerCase();
40
+ const at = e.lastIndexOf("@");
41
+ return at > 0 ? e.slice(at + 1) : "";
42
+ }
43
+
44
+ /**
45
+ * Webmail and shared mailbox providers, exactly.
46
+ *
47
+ * Not a census of the internet, and deliberately not growing into one: an unlisted provider still
48
+ * lands in `wide`, where it is stated and confirmed rather than written silently. What this list buys
49
+ * is that the commonest addresses a person types — their own personal mail — are refused with a
50
+ * sentence about why, instead of being offered as a rule somebody might say yes to.
51
+ */
52
+ export const PUBLIC_EMAIL_DOMAINS = Object.freeze(new Set([
53
+ "gmail.com", "googlemail.com", "icloud.com", "me.com", "mac.com",
54
+ "aol.com", "mail.com", "gmx.com", "gmx.de", "gmx.net", "web.de", "t-online.de",
55
+ "proton.me", "protonmail.com", "protonmail.ch", "pm.me", "tuta.io", "tutanota.com",
56
+ "fastmail.com", "fastmail.fm", "hey.com", "zoho.com", "hushmail.com",
57
+ "mail.ru", "inbox.ru", "list.ru", "bk.ru", "rambler.ru",
58
+ "qq.com", "163.com", "126.com", "sina.com", "naver.com", "daum.net",
59
+ "seznam.cz", "wp.pl", "o2.pl", "interia.pl", "libero.it", "virgilio.it", "tiscali.it",
60
+ "free.fr", "orange.fr", "wanadoo.fr", "laposte.net", "sfr.fr", "bbox.fr",
61
+ "comcast.net", "verizon.net", "att.net", "sbcglobal.net", "bellsouth.net", "cox.net",
62
+ "btinternet.com", "sky.com", "virginmedia.com", "ntlworld.com", "talktalk.net",
63
+ "bigpond.com", "optusnet.com.au", "shaw.ca", "sympatico.ca", "rogers.com",
64
+ "xs4all.nl", "ziggo.nl", "telenet.be", "uol.com.br", "bol.com.br", "terra.com.br",
65
+ "rediffmail.com", "yandex.com", "yandex.ru", "ya.ru",
66
+ ]));
67
+
68
+ /**
69
+ * Providers that sell the same mailbox under a per-country domain.
70
+ *
71
+ * Matched on the FIRST label, so `yahoo.co.uk` and `yahoo.fr` are covered without listing every
72
+ * country. Kept to names that are a provider and nothing else — a first label like `free` or `orange`
73
+ * is a real company's name somewhere, so those stay in the exact list above.
74
+ */
75
+ export const PUBLIC_EMAIL_FAMILIES = Object.freeze(new Set([
76
+ "yahoo", "ymail", "rocketmail", "hotmail", "outlook", "live", "msn", "gmx", "yandex", "googlemail",
77
+ ]));
78
+
79
+ /**
80
+ * Reserved for documentation and testing — RFC 2606 §2 and §3.
81
+ *
82
+ * `example.com`, `example.net`, `example.org` and everything under them, plus the whole of the
83
+ * `.example`, `.invalid`, `.test` and `.localhost` top-level names. Real mail is never delivered to
84
+ * any of them, so an address at one is a placeholder somebody typed — which is exactly what happened.
85
+ *
86
+ * `localhost` ITSELF IS NOT HERE. A bare `localhost` is the local-account default and is classified
87
+ * `narrow` below; only `something.localhost` reaches this test.
88
+ */
89
+ function isReservedDomain(domain) {
90
+ if (/^example\.(com|net|org)$/.test(domain)) return true;
91
+ if (/\.example\.(com|net|org)$/.test(domain)) return true;
92
+ const tld = domain.slice(domain.lastIndexOf(".") + 1);
93
+ return domain.includes(".") && ["example", "invalid", "test", "localhost"].includes(tld);
94
+ }
95
+
96
+ /** A domain that cannot name a second person on this machine: `localhost`, or any dotless hostname. */
97
+ function isNarrowDomain(domain) {
98
+ return domain === "localhost" || domain === "localhost.localdomain" || !domain.includes(".");
99
+ }
100
+
101
+ /**
102
+ * What a staff rule built from this domain would admit.
103
+ *
104
+ * @param {string} domain a bare domain, already lowercased — `domainOfEmail` produces one.
105
+ * @returns {"narrow"|"public"|"reserved"|"wide"|""} "" only when there is no domain to classify.
106
+ */
107
+ export function classifyStaffDomain(domain) {
108
+ const d = String(domain ?? "").trim().toLowerCase();
109
+ if (!d) return "";
110
+ if (isNarrowDomain(d)) return "narrow";
111
+ if (isReservedDomain(d)) return "reserved";
112
+ if (PUBLIC_EMAIL_DOMAINS.has(d)) return "public";
113
+ if (PUBLIC_EMAIL_FAMILIES.has(d.slice(0, d.indexOf(".")))) return "public";
114
+ return "wide";
115
+ }
116
+
117
+ /**
118
+ * The rule in the words the settings page uses, so the operator recognises what they agreed to.
119
+ *
120
+ * ONE COMPOSER FOR BOTH SURFACES. The People & access screen renders "Anyone at <domain>" under a
121
+ * heading that calls it a config rule rather than a person, and describes staff as capable of seeing
122
+ * every brand owner. A consent prompt phrased any other way asks about one thing and shows another.
123
+ */
124
+ export function staffGrantSentence(domain, { staffLabel = "Staff" } = {}) {
125
+ return `Anyone at ${domain} — a rule, not a person. ${staffLabel}: capable to see every brand owner `
126
+ + "on this instance.";
127
+ }
128
+
129
+ /**
130
+ * Why this domain cannot become a staff rule, and what to do instead.
131
+ *
132
+ * Returns null for a domain that CAN — `narrow` and `wide` are not refusals, and `wide` is answered by
133
+ * the confirmation the caller runs, not by this function.
134
+ */
135
+ export function staffDomainRefusal(domain, { variable = "PORTAL_STAFF_DOMAINS" } = {}) {
136
+ const d = String(domain ?? "").trim().toLowerCase();
137
+ const verdict = classifyStaffDomain(d);
138
+ if (verdict === "public") {
139
+ return `${d} is a public email provider, so a staff rule built from it would admit anyone with an `
140
+ + `address there — not your colleagues. Refusing to write one.\n`
141
+ + ` Use an address at a domain your organisation controls, or set ${variable} yourself to the `
142
+ + "domain you mean.\n"
143
+ + " If this machine is only yours, the local-account form takes no rule at all: leave the "
144
+ + "address as <account>@localhost.";
145
+ }
146
+ if (verdict === "reserved") {
147
+ return `${d} is reserved for documentation and receives no real mail (RFC 2606), so it is an `
148
+ + "address somebody typed as a placeholder rather than one that signs in. Refusing to build a "
149
+ + "staff rule from it.\n"
150
+ + " Use the address you actually sign in with, or the local-account form <account>@localhost "
151
+ + "if this machine is only yours.";
152
+ }
153
+ return null;
154
+ }
@@ -38,13 +38,34 @@
38
38
  // that does not exist yet is still misconfigured if it names another tree — the service would create it
39
39
  // and then fail every commit — so the lexical judgment stands where the filesystem cannot overturn it.
40
40
 
41
- import { resolve, dirname } from "node:path";
41
+ import { resolve, dirname, relative, isAbsolute } from "node:path";
42
42
  import { realpathSync } from "node:fs";
43
43
 
44
44
  /** `resolve`, then the symlink-resolved form when the path exists — null when it cannot be read. */
45
45
  const real = (p) => { try { return realpathSync(resolve(p)); } catch { return null; } };
46
46
 
47
- const within = (dir, root) => dir === root || dir.startsWith(root.endsWith("/") ? root : root + "/");
47
+ // CONTAINMENT IS ASKED OF THE PATH LIBRARY, NOT OF THE STRING.
48
+ //
49
+ // This was `dir.startsWith(root + "/")`, with the separator written in. On Windows `resolve()` returns
50
+ // backslashes, so `C:\…\config\recipes` does not start with `C:\…\config/` and a folder plainly inside
51
+ // its parent read as OUTSIDE — an operator on a correct install was told their recipe store was outside
52
+ // the repository root, and the saved-search door refused. Measured on his paths.
53
+ //
54
+ // The posix control passed throughout, which is why it survived: the string test is right on the platform
55
+ // it was written on and wrong on the one nobody here runs.
56
+ //
57
+ // `relative` also settles two cases a prefix test gets wrong on Windows even with the separator fixed: a
58
+ // different drive letter yields an absolute path rather than a `..` walk, and path comparison there is
59
+ // case-insensitive in a way `startsWith` is not. A sibling directory whose name merely begins with the
60
+ // root's — `config` and `configXX` — is still outside, which the old `+ "/"` also got right and any
61
+ // replacement had to keep.
62
+ // `impl` is the path module to ask, injected ONLY so a check can drive the Windows behaviour from a
63
+ // Linux runner. That matters here more than usual: this defect was invisible on the platform every one
64
+ // of us runs, and a guard that can only be exercised on Windows is a guard nobody will ever see fail.
65
+ export const within = (dir, root, impl = { relative, isAbsolute }) => {
66
+ const rel = impl.relative(root, dir);
67
+ return rel === "" || (!rel.startsWith("..") && !impl.isAbsolute(rel));
68
+ };
48
69
 
49
70
  /**
50
71
  * Is `storeDir` somewhere `git -C repoRoot add` could stage it?
@@ -226,7 +247,7 @@ export function commitWithAuditRow({ audit, gitCommit, files, message, by, row }
226
247
  // portal-service RECIPE_REPO_ROOT || <the profile repo root> → the config store → saves work
227
248
  // recipe-service RECIPE_REPO_ROOT || join(HERE, "..") → the PRODUCT CHECKOUT → FATAL
228
249
  //
229
- // Two ends of one contract measuring different things ('s class). The portal consulted the profile
250
+ // Two ends of one contract measuring different things (the class). The portal consulted the profile
230
251
  // root as a second chance and the recipe-service did not, so one door came up and the other exited 1.
231
252
  //
232
253
  // AND THE DIVERGENT FALLBACK IS THE DANGEROUS ONE, which is why this is not merely tidying. The product
@@ -320,7 +341,7 @@ export function makeStoreCommit({ repoRoot, log = () => {}, what = "store", retr
320
341
  } catch (e) {
321
342
  const detail = detailOf(e);
322
343
  if (isTransientGitFault(detail) && attempt <= retries) { napping(waitMs * attempt); continue; }
323
- // NAMED, not merely reported. 's line held that a failed commit is a permanent sync blocker
344
+ // NAMED, not merely reported. That line held that a failed commit is a permanent sync blocker
324
345
  // and belongs in the journal; it is no longer permanent — the next save completes it — but the
325
346
  // operator still needs to know WHICH fault, because a hook and a full disk want different people.
326
347
  log(`${what} COMMIT FAILED after the write landed — the save is LIVE and the paths are STAGED, `
@@ -15,7 +15,7 @@
15
15
  //
16
16
  // ── `.test(` IS NOT COUNTED, AND THAT IS THE WHOLE CALIBRATION ─────────────────────────────────────
17
17
  //
18
- // 's own thread records the miscount: 177 `RegExp.prototype.test` calls counted as subtests,
18
+ // its own thread records the miscount: 177 `RegExp.prototype.test` calls counted as subtests,
19
19
  // genuine subtests ZERO. So this counts `assert.<something>` and a `test(` at the START of a line, and
20
20
  // nothing else. Two independent checks that it is calibrated: on the tree it was minted from, the
21
21
  // counted test sites match the EXECUTED totals at 415/415 for portal-ui, 382 against 386 for
@@ -105,7 +105,7 @@ export function rootScriptDisagreements(readManifest, declared = CENSUS_ROOT_SCR
105
105
  //
106
106
  // while 581 of 639 driver test files stop being collected. Both sides agreed because both sides
107
107
  // enumerate through the list ABOVE, and nothing in this repository opened a package.json. The census
108
- // was move-proof about the tests and blind to itself being pointed somewhere else, which is 's own
108
+ // was move-proof about the tests and blind to itself being pointed somewhere else, which is its own
109
109
  // doctrine line: an enumerated check is blind to the thing moving; a discovered check is blind to
110
110
  // ITSELF moving.
111
111
  //
@@ -237,7 +237,7 @@ export function lossBetween(prevPerFile, nextPerFile) {
237
237
  }
238
238
 
239
239
  /**
240
- * tracker issue 205 — WHICH BUCKET EACH DIFFERENCE LANDS IN, and which of them refuses a re-stamp.
240
+ * WHICH BUCKET EACH DIFFERENCE LANDS IN, and which of them refuses a re-stamp.
241
241
  *
242
242
  * `lossBetween` above answers what MOVED. This answers what that MEANS, and it is a separate question
243
243
  * with a separate history. A rising skip count is a real difference and it used to refuse: it landed
@@ -343,7 +343,7 @@ export function countTestSites(text) {
343
343
  * The 1-based LINE of every assert site, in source order. One site per `assert.<x>` occurrence, so a
344
344
  * line carrying two of them appears twice — the same arithmetic `countTestSites` reports.
345
345
  *
346
- * 's fifth member needs the LINES, not just the total: a GATED arm — `if (!process.env.X) return;`
346
+ * That fifth member needs the LINES, not just the total: a GATED arm — `if (!process.env.X) return;`
347
347
  * at the top of a test body — leaves every token in place, so a count cannot see it and only "did this
348
348
  * line ever run" can. That question is answered by a coverage pass, and the two sides must ask it of the
349
349
  * SAME sites, so the rule lives here once rather than being re-typed against the same file.
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
3
  // tty-style.mjs — weight where the meaning is, and NOTHING when the reader is not a terminal.
4
4
  //
5
- // ── why this exists (, owner ruling 2026-08-31) ────────────────────────────────────
5
+ // ── why this exists (owner ruling 2026-08-31) ────────────────────────────────────
6
6
  //
7
7
  // "new terminals can do things like bold and colours etc — good formatting impresses people because it's
8
8
  // made clear to them someone put the time in." That is a product argument, not a decorative one: setup
@@ -102,7 +102,7 @@ export const USPTO_PEAK_GB = Math.round((USPTO_INDEX_GB + USPTO_PEAK_WAL_GB) * 1
102
102
  //
103
103
  // It was pessimistic by 4x. Charging 1.0 demanded ~43.8 GB for a build whose index came to 10.1 GB, and
104
104
  // INSTALL.md told the reader to provision 60 GB. On the free tier that is the difference between "I can
105
- // try this on the disk I have" and "I cannot", which is the whole of 's Why.
105
+ // try this on the disk I have" and "I cannot", which is the whole of the Why.
106
106
  //
107
107
  // Carried at 0.35 against 0.24 measured — a 46% margin, and the margin is doing real work rather than
108
108
  // decorating a guess:
@@ -158,7 +158,7 @@ export function discoveredLoops(text) {
158
158
 
159
159
  // ── THE EARLY-RETURN HALF ──────────────────────────────────────────────────────────────────
160
160
  //
161
- // 's ruling names two shapes. `discoveredLoops` above is the loop half. This is the other, and
161
+ // That ruling names two shapes. `discoveredLoops` above is the loop half. This is the other, and
162
162
  // the two are not alike enough to share a detector:
163
163
  //
164
164
  // test("the tree is clean", () => {