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
package/.env.example CHANGED
@@ -403,3 +403,108 @@ CLEAROTRON_DEMO=
403
403
  # Read by driver/whatif-worker.mjs. Refs tracker issue 1953.
404
404
  # effect: tuning
405
405
  CLEAROTRON_WHATIF_MAX_CONCURRENT=1
406
+
407
+ # The checkout every shipped systemd unit interpolates — and the one name in this file you are most
408
+ # likely to meet before you meet this file. Ten units name it in their `ExecStart`
409
+ # (clearotron-portal, -worker, -deploy, -client-mcp, -mcp-face, prelim-driver, prelim-outbox, the two
410
+ # mcp-server/remote units and the courtlistener bridge), and production's units all depend on it.
411
+ #
412
+ # YOU ALMOST CERTAINLY DO NOT SET THIS. `clearotron connect` writes it into the install's env file, set
413
+ # to the checkout it just installed (bin/connect.mjs, shared/checkout-move.mjs), and it rewrites it when
414
+ # the checkout moves. So this is not a decision waiting for you at install time, and the row does not
415
+ # exist because a deployment cannot be configured without it.
416
+ #
417
+ # IT EXISTS BECAUSE OF WHO READS IT AT 2AM. Somebody whose unit will not start reads
418
+ # `${CLEAROTRON_CHECKOUT_DIR}` in an ExecStart, comes to the file INSTALL.md §8 calls the catalogue, and
419
+ # finds nothing. `shared/names-in-force.mjs` already knew the name; neither governance document did.
420
+ # A row that says "the installer writes this" is the answer to their question — the absence was not.
421
+ #
422
+ # Surfaced by the cut-over overlay control once the withheld `ops/` bucket was laid back over the public
423
+ # tree: the ratchets that would have caught it had had no subject since the cut, so this is a gap of
424
+ # long standing rather than a regression. Refs tracker issue 213.
425
+ #
426
+ # Left EMPTY here on purpose. A path in this file would read as a default; there is none, and the
427
+ # installer supplies the real value.
428
+ # effect: deployment
429
+ CLEAROTRON_CHECKOUT_DIR=
430
+
431
+ # ── The release pipeline's own two names ─────────────────────────────────────────────────────────
432
+ # Both are set by `.github/workflows/release.yml` and read by the release scripts. NEITHER is an
433
+ # operator's decision, and on an install both are unset and the defaults are the right answer. They are
434
+ # catalogued for the same reason CLEAROTRON_CHECKOUT_DIR above is: they are OUR names, read by code that
435
+ # ships, and a reader who meets one in a workflow log needs somewhere to look it up.
436
+ #
437
+ # They are NOT in the system-owned list beside GITHUB_OUTPUT, and the line between them is worth stating:
438
+ # GitHub sets GITHUB_*, so a row would document somebody else's decision. We set these, so a row
439
+ # documents ours.
440
+ #
441
+ # Found by the audit while closing tracker issue 213, not by that issue's diagnosis — they arrived with
442
+ # tonight's release-pipeline work and the catalogue ratchet caught them on the next run, which is the
443
+ # ratchet doing its job. Raised with the release lane rather than silently absorbed.
444
+
445
+ # The commit the cut decision is ABOUT. The workflow sets it to `github.sha` — the push — because the
446
+ # checkout may have moved on since, and a decision made about "whatever HEAD is now" tried to republish
447
+ # an already-released version. Unset falls back to HEAD, which is correct for the cron and for a hand
448
+ # run, where nothing has moved. Read by scripts/release-cut-decision.mjs.
449
+ #
450
+ # DECLARED `deployment` FIRST, AND THAT WAS THE WRONG HALF OF THE DEFINITION. `deployment` is "where
451
+ # input and output live" — a pool root, an outbox, a database path. A git ref is not a location any
452
+ # input or output lives at; it is which subject the decision is taken about, and it changes only whether
453
+ # the pipeline republishes something it already shipped. Nothing a clearance run produces moves.
454
+ # effect: tuning
455
+ CLEAROTRON_CUT_REF=
456
+
457
+ # How long publishing waits for a parked version run, in whole milliseconds. Unset uses the built-in
458
+ # budget; the workflow sets it to 0 on a `workflow_dispatch` rehearsal so a dry run does not sit out the
459
+ # full wait. A malformed value REFUSES rather than defaulting — taken as 0 it would skip the wait
460
+ # entirely, which is that script not running at all. Read by scripts/release-await-cut.mjs.
461
+ # effect: tuning
462
+ CLEAROTRON_RELEASE_WAIT_MS=
463
+
464
+ # ── The local key door's socket ───────────────────────────────
465
+ # Same shape as the two below: read by product code, in neither this file nor the governance table
466
+ # until a private environment-contract ratchet caught it.
467
+
468
+ # WHERE the local key door listens. Unset means there is no key door and a deployment gets exactly the
469
+ # door it had before — this adds a path, it does not widen the existing one.
470
+ #
471
+ # WHY A SOCKET AND NOT A PORT. This interface serves two populations that authenticate differently:
472
+ # people arriving through a tunnel, who prove themselves with a proxy identity, and programs on the same
473
+ # machine holding a scoped access key, which can never produce one. "Only accept a key from loopback"
474
+ # does not separate them — the tunnel daemon runs on the same machine, so a request forwarded from the
475
+ # internet and one from the local portal arrive with the same peer address. A tunnel forwards to a port;
476
+ # it cannot reach a socket, so the transport is the discriminator.
477
+ #
478
+ # The socket is created 0660, owner and group only, and the mode is set after listen because listen
479
+ # creates the file and the umask decides what it starts as. The door refuses to open at all without a
480
+ # grants file, alongside the authentication bypass, or in token mode — that mode makes the NETWORK door
481
+ # take a key too, which is the thing this exists to prevent.
482
+ #
483
+ # Read by mcp-server/key-socket.mjs.
484
+ # effect: deployment
485
+ TRADEMARK_MCP_KEY_SOCKET=
486
+
487
+ # ── Who the completion notice reaches ────────────────────────────────────────────────────────────
488
+ # Both arrived with tracker issue 289 and shipped undeclared: they are read by product code and were in
489
+ # neither this file nor the governance table, which six private environment-contract ratchets caught on
490
+ # the next overlay run. Catalogued here on the same terms as the release names above — they are OUR
491
+ # names, read by code that ships.
492
+
493
+ # WHO the chat notice is addressed to: a JSON object of requester email or handle → number, e.g.
494
+ # {"lisa@tenant.example":"+41...","jordan":"+41..."}. Before this, the notice went to a map keyed by
495
+ # AGENT id, and every user of a deployment shares one agent — so the operator was notified about work
496
+ # other people ordered and the requester was told nothing.
497
+ #
498
+ # UNSET IS AN EMPTY ROSTER, never a demo one. A deployment that configures nothing routes no notice and
499
+ # the delivery record says whose number is missing, by name. The sibling agent map carries invented
500
+ # numbers for offline tests; doing that here would aim a real client's completion notice at a fixture.
501
+ #
502
+ # It holds contact data. Read by driver/stages.mjs (whatsappRouting).
503
+ # effect: deployment
504
+ CLEAROTRON_REQUESTER_WHATSAPP=
505
+
506
+ # The operator's own copy of the same notice, ON unless this is `0`, `false` or `no`. Independent of the
507
+ # roster above: an operator can stop receiving copies of everyone else's runs without touching who the
508
+ # requester notice reaches. Read by driver/stages.mjs (whatsappRouting).
509
+ # effect: deployment
510
+ CLEAROTRON_WHATSAPP_OPERATOR_COPY=
package/CONTRIBUTING.md CHANGED
@@ -91,9 +91,9 @@ any writing pass over the documentation, applies to them.
91
91
 
92
92
  ## The three rules that fail CI
93
93
 
94
- **1. Rebuild `portal-ui/dist` and commit it.** The bundle is committed so a deploy never builds. CI
95
- rebuilds it from source and requires byte equality, so a change under `portal-ui/src` that ships
96
- without its rebuilt bundle fails:
94
+ **1. Rebuild `portal-ui/dist` before you push.** The bundle is not committed CI builds it from
95
+ source and requires byte equality, so a change under `portal-ui/src` that does not build cleanly
96
+ fails:
97
97
 
98
98
  ```bash
99
99
  npm run build:ui
package/INSTALL.md CHANGED
@@ -41,10 +41,11 @@ run is [mcp-server/CONNECT.md](mcp-server/CONNECT.md), and why something is the
41
41
  - **Node.js >= 22**, and npm. A hard floor: `package.json` declares it, `.nvmrc` pins it, and the free
42
42
  US register runs on `node:sqlite`, which ships with FTS5 from Node 22. Node 20 installs and then fails
43
43
  at the first US search. `nvm use` picks the pin up.
44
- - **macOS, Linux, or Windows via WSL2.** Native Windows is not supported: the engine resolves the
45
- reasoning CLI the POSIX way, so a native-Windows run refuses at preflight even with the CLI on `PATH`.
46
- On Windows, `wsl --install`, then install Node 22 **inside** the Linux distribution and work through
47
- this page from there. `npx clearotron demo` is the exception and runs anywhere Node does. A *hosted*
44
+ - **macOS, Linux, or native Windows for the demo; WSL2 with Node 22 for a clearance.** `npx clearotron
45
+ demo` runs anywhere Node does, native Windows included. A real clearance does not: the engine resolves
46
+ the reasoning CLI the POSIX way, so a native-Windows clearance refuses at preflight even with the CLI
47
+ on `PATH`. On Windows, `wsl --install`, then install Node 22 **inside** the Linux distribution and work
48
+ through this page from there. A *hosted*
48
49
  deployment needs Linux for one further thing, the systemd outbox trigger —
49
50
  [driver/systemd/README.md](driver/systemd/README.md).
50
51
  - **A reasoning CLI on your `PATH`, signed in.** This is the prerequisite people miss. Every stage runs
@@ -115,16 +116,31 @@ Nothing here requires an agent platform or a database — reports are written to
115
116
 
116
117
  ```
117
118
  npm install -g clearotron # stable — the tested one
118
- npm install -g clearotron@beta # newest — every merge, minutes after it lands
119
+ npm install -g clearotron@beta # newest — cut when there is something worth testing
119
120
  ```
120
121
 
121
122
  A **stable** has run a real clearance end to end and had a from-scratch install driven by somebody who has
122
- never seen the product, before it was published. A **beta** is published automatically on every merge to
123
- `main`; it built and the suite passed, and nothing has driven a live register through it.
123
+ never seen the product, before it was published. A **beta** is published when a change lands that is worth
124
+ testing, or while a stable is being prepared — days apart, not on every merge; it built and the suite
125
+ passed, and nothing has driven a live register through it.
124
126
 
125
127
  **Upgrade production to stables only.** What each channel promises and how often one is cut:
126
128
  **[docs/RELEASES.md](docs/RELEASES.md)**.
127
129
 
130
+ **Upgrading an install made before 0.2.2: pin the agent id first.** The default agent id changed from
131
+ `clawdi` to `localagent`, and that id is part of a path — your runs live under
132
+ `<workspaceRoot>/workspace-<agent>/studio/prelim-search/`. If you never set an agent id, the upgraded
133
+ install reads a workspace that does not exist yet, and an empty workspace looks like an account with no
134
+ runs rather than like a misconfiguration. Set **both** names in your environment file before starting
135
+ it, because the register-search servers read their own:
136
+
137
+ ```
138
+ CLEAROTRON_DEFAULT_AGENT=clawdi
139
+ CLEAROTRON_GATHER_AGENT=clawdi
140
+ ```
141
+
142
+ If your environment file already sets them, nothing changes. A first-time install needs neither.
143
+
128
144
  The rest of this section is about the two ways a package reaches you, which is a separate question from
129
145
  which version it is.
130
146
 
@@ -229,9 +245,9 @@ the line between them. Either way nothing is contacted and nothing is billed —
229
245
  it starts. Neither runs on a packaged install: the test files are not in the package.
230
246
 
231
247
  The engine itself has no build step. The **portal UI does** — `portal-ui/` is React + Vite — but its
232
- built bundle (`portal-ui/dist/`) is **committed to git** and travels in the package, so a clone and a
233
- tarball install are both already runnable and a deploy never builds. You only need to build after
234
- changing something under `portal-ui/src`:
248
+ built bundle (`portal-ui/dist/`) is **not committed to git**: it travels in the published package and
249
+ CI builds it, so a tarball install is already runnable while a clone needs one build first. You also
250
+ need to build after changing something under `portal-ui/src`:
235
251
 
236
252
  ```
237
253
  npm run tokens # regenerate the design tokens from shared/brand.mjs, if colours changed
@@ -275,45 +291,6 @@ Three more things about it are worth knowing before you write one:
275
291
  **Or the environment directly** — your shell, a container spec, a systemd `EnvironmentFile`. This is
276
292
  what production does, and nothing about it changed.
277
293
 
278
- ### An install that used `PRELIM_*` names
279
-
280
- The variables an installer types are `CLEAROTRON_*`, and they are the only spelling. The old names are
281
- not read, not translated and not looked for — a line using one is a line nothing reads.
282
-
283
- **Rebuilding is the supported path**, and it is the only one that is tested: `npx clearotron install`
284
- writes a correct file from scratch, which is the path a new reader walks. If you would rather edit the
285
- file you have, rename every line in one pass and use the table below — a half-renamed file leaves the
286
- un-renamed half unset.
287
-
288
- | Old name | Write instead |
289
- |---|---|
290
- | `PRELIM_ENGINE` | `CLEAROTRON_AI` |
291
- | `PRELIM_ANTHROPIC_AUTH` · `PRELIM_OPENAI_AUTH` | `CLEAROTRON_AI_BILLING` |
292
- | `PRELIM_CLAUDE_BIN` | `CLEAROTRON_CLAUDE_PATH` |
293
- | `PRELIM_CODEX_BIN` | `CLEAROTRON_CODEX_PATH` |
294
- | `PRELIM_REGISTER_PROVIDER` | `CLEAROTRON_DATABASE` |
295
- | `PRELIM_POOL_ROOT` · `PRELIM_POOL_URL` | `CLEAROTRON_REPORTS_DIR` · `CLEAROTRON_REPORTS_URL` |
296
- | `PRELIM_WORKSPACE_ROOT` | `CLEAROTRON_WORK_DIR` |
297
- | `PRELIM_PROFILES_DIR` | `CLEAROTRON_CUSTOMERS_DIR` |
298
- | `PRELIM_SKILLS_DIR` | `CLEAROTRON_INSTRUCTIONS_DIR` |
299
- | `PRELIM_QUEUE_DIR` · `PRELIM_OUTBOX_DIR` | `CLEAROTRON_QUEUE_DIR` · `CLEAROTRON_OUTBOX_DIR` |
300
- | `PRELIM_GRANTS_FILE` | `CLEAROTRON_ACCESS_FILE` |
301
- | `PRELIM_NO_ENV_FILE` | `CLEAROTRON_NO_ENV_FILE` |
302
- | `CF_ACCESS_AUD` · `CLIENT_CF_ACCESS_AUD` | `CLEAROTRON_OIDC_AUDIENCE` · `CLEAROTRON_CLIENT_OIDC_AUDIENCE` |
303
- | `PRELIM_BRAND_NAME` · `PRELIM_BRAND_TAGLINE` · `PRELIM_BRAND_PRODUCT` | `CLEAROTRON_BRAND_*` |
304
- | `PRELIM_LANE_<code>` | `CLEAROTRON_NATIVE_LANGUAGE_<code>` |
305
- | `PRELIM_DELIVERY` | nothing — **retired, see below** |
306
-
307
-
308
- > **A note on the 2026-09-04 rename.** The left column above is HISTORY and keeps the dead spelling on
309
- > purpose — it is the only thing that makes the table usable, and a text sweep that "corrects" it turns
310
- > a migration guide into two identical columns. On 2026-09-04 the owner extended the rename to the whole
311
- > namespace, including the internal variables an installer never types and the two names the August
312
- > sweep had deliberately exempted as engine internals. There is one prefix now, everywhere, with no
313
- > compatibility layer and no alias reading: greenfield, no public installs, our own boxes rebuilt rather
314
- > than migrated. If you are reading this holding a file older than that, the rule is unchanged and
315
- > simpler than the table: rebuild.
316
-
317
294
  Vendor credentials keep their vendor’s name — `SIGNA_API_KEY`, `PERPLEXITY_API_KEY`,
318
295
  `ANTHROPIC_API_KEY` — because those already say who you bought them from.
319
296
 
@@ -667,7 +644,7 @@ A run stopped by a **provider rate limit** or parked for **automatic recovery**
667
644
  that is the systemd units in `driver/systemd/`. Everywhere else, run the watcher yourself:
668
645
 
669
646
  ```
670
- npx clearotron drain --watch
647
+ npx clearotron run-queue --watch
671
648
  ```
672
649
 
673
650
  That polls every 90 seconds for queued jobs and for parked runs whose window has elapsed, and it resumes
@@ -776,11 +753,11 @@ Before the worker ran, that promise was untrue in your favour: confirming queued
776
753
  spent until you gave a second command in another terminal.
777
754
 
778
755
  If you want the old separation — order here, drain deliberately over there — start with `--no-worker` and
779
- run the drain yourself:
756
+ run the queue yourself:
780
757
 
781
758
  ```
782
759
  npx clearotron start --no-worker
783
- npx clearotron drain --watch
760
+ npx clearotron run-queue --watch
784
761
  ```
785
762
 
786
763
  A queued job whose worker is not running says so on the portal rather than sitting at "Waiting to start".
@@ -948,6 +925,30 @@ you.
948
925
  `TRADEMARK_MCP_AUTH_MODE=cf-access` so the origin re-validates the proxy's JWT rather than trusting
949
926
  it — the mechanism is generic, whichever proxy is in front.
950
927
 
928
+ **One process, two doors.** A deployment that serves both people arriving through a tunnel and programs
929
+ on the same machine no longer needs to run this service twice. Set `TRADEMARK_MCP_KEY_SOCKET` to a
930
+ socket path and the service listens for a scoped access key there, while its network port continues to
931
+ take the proxy identity and never honours a key. A tunnel forwards to a port and cannot reach a socket,
932
+ so the key path is not addressable from outside the machine; who may present a key is stated by the
933
+ socket's permissions, which the startup lines print beside its path.
934
+
935
+ This replaces a **second unit run for its authentication shape** — a loopback port in key mode beside
936
+ the tunnel-fronted one — and nothing else. It is not the test-instance-beside-a-live-one arrangement
937
+ described in §8: that separation is about data and ports, it is unaffected, and its seven variables are
938
+ still all required. Removing the auth-shape duplicate is a deployment decision and nothing here does it
939
+ for you.
940
+
941
+ **Do not set `TRADEMARK_MCP_AUTH_MODE=token` alongside the socket.** That mode makes the network port
942
+ take a key as well, which is what the socket exists to avoid; the service refuses to start and says so.
943
+
944
+ **Put the socket somewhere only the service's own group can write.** The socket's own permissions decide
945
+ who may *present* a key. Whether the socket can be *replaced* is decided by the directory holding it — a
946
+ process that can remove the file can bind its own listener on the same path, and callers would then
947
+ present their keys to it. That is a different permission from the socket's and it is the one worth
948
+ checking. The service refuses to start if that directory is writable by everyone without the sticky bit,
949
+ and prints the directory's mode beside the socket's on its startup line so the number is readable without
950
+ going to look.
951
+
951
952
  > ⚠ **What does not work is an INTERACTIVE-only sign-in policy on a route an assistant must reach
952
953
  > without a browser.** Such a policy demands a login the vendor's servers cannot complete: they present
953
954
  > a credential and get a login page back, and the connection fails with nothing useful said on either
@@ -1112,6 +1113,10 @@ that fails at boot, which reads as a broken install rather than as a port alread
1112
1113
 
1113
1114
  Set all seven. Nothing else separates them.
1114
1115
 
1116
+ A deployment that once ran the service twice for a different reason — one door needing a key and the
1117
+ other a proxy identity — no longer has to; see *One process, two doors* in §9. That is an
1118
+ authentication arrangement and has nothing to do with this one. The seven above are still all required.
1119
+
1115
1120
  ## 9. What the integrator supplies
1116
1121
 
1117
1122
  The engine is complete as a clearance-and-report producer. A deployment adds:
package/README.md CHANGED
@@ -39,7 +39,8 @@ Node 22 or newer, on macOS, Linux, or Windows via WSL2. That puts `clearotron` o
39
39
  command below works in that short form.
40
40
 
41
41
  That command gives you the **stable** release — the one that has run a real clearance end to end before it
42
- was published. If you want the newest code instead, every merge publishes a beta within minutes:
42
+ was published. If you want the newest code instead, a beta is published whenever there is something worth
43
+ testing — deliberately, days apart, not on every merge:
43
44
 
44
45
  ```bash
45
46
  npm install -g clearotron@beta
@@ -288,7 +288,7 @@ export async function add(argv, {
288
288
  } = {}) {
289
289
  const args = parseArgs(argv);
290
290
  if (!args.key) throw new Refusal(`this command needs a brand owner key.${USAGE}`);
291
- // A REFUSAL, NOT A STACK (, acceptance: "refuses malformed input BY NAME — key
291
+ // A REFUSAL, NOT A STACK (acceptance: "refuses malformed input BY NAME — key
292
292
  // pattern"). `assertProfileKey` throws a plain Error, and main() deliberately lets a non-Refusal keep
293
293
  // its stack because an unexpected throw here is a defect worth debugging. A key an operator typed is
294
294
  // not that: it is the first thing this command validates and the most likely thing to get wrong, and
@@ -52,7 +52,7 @@ export const VERBS = {
52
52
  connect: ["bin/connect.mjs"],
53
53
  disconnect: ["bin/disconnect.mjs"],
54
54
  run: ["driver/pipeline.mjs"],
55
- drain: ["driver/runner.mjs"],
55
+ "run-queue": ["driver/runner.mjs"],
56
56
  cancel: ["bin/cancel.mjs"],
57
57
  grant: ["bin/grant.mjs"],
58
58
  key: ["bin/key.mjs"],
@@ -73,7 +73,7 @@ export const SUMMARY = {
73
73
  connect: "connect the assistant you already use — pick it by name and get the one thing it needs",
74
74
  disconnect: "close what connect opened and revoke the key it issued — the enrolment stays",
75
75
  run: "run one clearance from a job file",
76
- drain: "do the queued work. THIS SPENDS: hours of model time and real register calls",
76
+ "run-queue": "do the queued work. THIS SPENDS: hours of model time and real register calls",
77
77
  cancel: "stop one run by name. The rest of the product keeps running, and nothing resumes it",
78
78
  grant: "enrol a client, or list who may see what",
79
79
  key: "issue the key a person's own assistant presents — after you have enrolled them with `grant`",
@@ -135,7 +135,7 @@ const [verb, ...rest] = process.argv.slice(2);
135
135
 
136
136
  // — EVERY VERB ANSWERS --help, INCLUDING THE TWO WHOSE CHILDREN REFUSE IT.
137
137
  //
138
- // `run` and `drain` dispatch to driver/pipeline.mjs and driver/runner.mjs, orchestrator entry points
138
+ // `run` and `run-queue` dispatch to driver/pipeline.mjs and driver/runner.mjs, orchestrator entry points
139
139
  // with strict argument parsers and no help path: `--help` came back as `error: unknown flag --help`,
140
140
  // exit non-zero. Their parsers are RIGHT to refuse what they do not understand -- that is what makes
141
141
  // them fail safe, and showed what the permissive alternative costs (`update --help` performed
@@ -149,7 +149,7 @@ const [verb, ...rest] = process.argv.slice(2);
149
149
  console.log(`\n ${invocationPrefix()}clearotron ${verb} — ${SUMMARY[verb]}\n`);
150
150
  console.log(` Options after the verb are passed through to ${VERBS[verb][0]}, which has no --help of`);
151
151
  console.log(` its own. Run it with no arguments to see what it requires.\n`);
152
- if (verb === "run" || verb === "drain") {
152
+ if (verb === "run" || verb === "run-queue") {
153
153
  console.log(` THIS SPENDS: hours of model time and real register calls. See INSTALL.md §5 and §6.\n`);
154
154
  }
155
155
  process.exit(0);
package/bin/connect.mjs CHANGED
@@ -58,7 +58,7 @@ import { checkoutMove, movePosture, describeMove, describeConflict } from "../sh
58
58
  import { unitEnvironment, unitValue, couldNotDetermine } from "../driver/unit-environment.mjs";
59
59
  import { isEntrypoint } from "../shared/is-entrypoint.mjs";
60
60
  import { looksLikeBusFailure, systemdSaid, userBusEnv, CAPTURE_STDERR,
61
- systemdFailure as sharedSystemdFailure } from "../shared/systemd-failure.mjs"; // tracker issue 203 — `start` needed the same three answers
61
+ systemdFailure as sharedSystemdFailure } from "../shared/systemd-failure.mjs"; // `start` needed the same three answers
62
62
 
63
63
  const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
64
64
  // `userBusEnv` and `busRemedy` MOVED TO shared/systemd-failure.mjs, unchanged, because
@@ -372,7 +372,7 @@ export function unitIsHealthy(name, { show = showUnit, pause = settle } = {}) {
372
372
  if (error) {
373
373
  // ── A BUS THAT COULD NOT BE REACHED IS NOT A DOOR THAT IS DOWN (tracker issue 130) ────────────
374
374
  //
375
- // Returning false here is what made the operator worse off than before tracker issue 121's fix.
375
+ // Returning false here is what made the operator worse off than before that fix.
376
376
  // The caller renders false as "the door is not open, so no key was issued" — a confident, wrong,
377
377
  // client-facing sentence about a door that is `active`, with the real cause discarded. And it is
378
378
  // reachable on the ordinary path: a box whose door is already installed and running never calls
package/bin/example.mjs CHANGED
@@ -40,8 +40,8 @@ import "../shared/env-local.mjs"; // step 4 / — FIRST: this program read a
40
40
  import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, statSync } from "node:fs";
41
41
  import { homedir, tmpdir } from "node:os";
42
42
  import { invoke } from "../shared/invocation.mjs"; // — the printed command is resolved once, for the reader who is actually standing there
43
- import { join, resolve, dirname, sep } from "node:path";
44
- import { fileURLToPath } from "node:url";
43
+ import { basename, dirname, join, resolve, sep } from "node:path";
44
+ import { fileURLToPath, pathToFileURL } from "node:url";
45
45
  import { spawn } from "node:child_process";
46
46
  import { BRAND } from "../shared/brand.mjs"; // — the installer's own name, from the tenant seam
47
47
  import { envFrom } from "../shared/env-aliases.mjs"; // — resolves EITHER spelling; names the retired one because that is the live-writable half
@@ -68,7 +68,11 @@ if (has("--help") || has("-h")) {
68
68
  const shipped = demoChildren(join(REPO, "demo"));
69
69
  if (shipped.length) {
70
70
  console.log(`\n --product takes one of:`);
71
- for (const id of shipped) console.log(` ${id}${id === shipped[0] ? " (the default, when --product is not given)" : ""}`);
71
+ // NO "DEFAULT" MARKER (tracker issue 277). This printed "(the default, when --product is not given)"
72
+ // beside the first id, and kept printing it after the default became ALL of them — so `--help` taught
73
+ // a reader the exact belief the change removed, in the command it was reported against.
74
+ for (const id of shipped) console.log(` ${id}`);
75
+ console.log(`\n With no --product, every one of them is published.`);
72
76
  console.log("");
73
77
  } else {
74
78
  // An absence is a finding: a tree with no demo says so rather than printing an empty list.
@@ -96,15 +100,30 @@ const DEMO_ROOT = join(REPO, "demo");
96
100
  // disagreed. That file records what a knockout demo carries instead of a report.md, and why this line
97
101
  // once let `demo/knockout-search` ship and stay unopenable..
98
102
 
99
- // --run-dir takes a directory outright. --product names a child. Neither given: the first child, and the
100
- // name is PRINTED below rather than assumed, because "the demo" is about to mean one of several.
103
+ // --run-dir takes a directory outright. --product names a child. Neither given: EVERY child, and the
104
+ // names are PRINTED below rather than assumed, because "the demo" means several.
101
105
  const wanted = flag("--product");
102
106
  const children = demoChildren(DEMO_ROOT);
103
- const sampleDir = resolve(
104
- flag("--run-dir")
105
- ?? (wanted ? join(DEMO_ROOT, wanted) : (children[0] ? join(DEMO_ROOT, children[0]) : DEMO_ROOT)),
106
- );
107
- if (!isFrozen(sampleDir)) {
107
+
108
+ // ── ALL OF THEM, UNLESS THE CALLER NARROWED IT (tracker issue 277) ──────────────────────────────────
109
+ //
110
+ // This used to replay `children[0]` and stop. The package ships one finished report per product, and a
111
+ // first-time reader met one of them with nothing on screen saying the other three existed — so three
112
+ // quarters of what was shipped was reachable only by someone who already knew to ask for it. The owner's
113
+ // ruling is that they auto-load: "it should auto-load since it is NOT obvious these runs are there unless
114
+ // you know about it."
115
+ //
116
+ // `--product` and `--run-dir` still narrow to one, because "show me just this one" is a real thing to
117
+ // want. Neither given now means every product this tree ships, in the container's own order.
118
+ const sampleDirs = flag("--run-dir")
119
+ ? [resolve(flag("--run-dir"))]
120
+ : wanted
121
+ ? [resolve(join(DEMO_ROOT, wanted))]
122
+ : children.map((c) => resolve(join(DEMO_ROOT, c)));
123
+ // The refusal below is about ONE directory, and with nothing shipped there is no directory to name — so
124
+ // the container itself is what it looks at, which is what it always did when `demo/` was empty.
125
+ const sampleDir = sampleDirs[0] ?? resolve(DEMO_ROOT);
126
+ if (!sampleDirs.length || !isFrozen(sampleDir)) {
108
127
  // AN ABSENCE IS A FINDING, AND IT NAMES WHAT IT LOOKED AT. This exits 1 and always has; tracker issue
109
128
  // 2193 reported it exiting 0, which did not reproduce at v0.1.0 or at main's tip. An arm pins it.
110
129
  die(
@@ -128,10 +147,17 @@ if (!isFrozen(sampleDir)) {
128
147
  // PUBLISHING WRITES A RECEIPT INTO THE RUN DIRECTORY, and `demo/` is tracked — so a reader who only READ
129
148
  // the demo came back to a dirty checkout. `publishSource` is the one definition of that rule, shared with
130
149
  // the launcher, which seeds the pool from the same container on every `--demo` start.
131
- const publishFrom = publishSource(sampleDir, { repoRoot: REPO });
132
-
133
- const meta = JSON.parse(readFileSync(join(sampleDir, "meta.json"), "utf8"));
134
- if (!meta?.runId) die(`example: ${join(sampleDir, "meta.json")} names no runId — it is not a frozen example manifest.`);
150
+ // EVERY ONE THAT WAS ASKED FOR IS READ BEFORE ANY IS PUBLISHED, so a manifest missing a runId is a
151
+ // refusal about that demo by name rather than a partial pool nobody can account for.
152
+ const samples = sampleDirs.map((dir) => {
153
+ const manifest = join(dir, "meta.json");
154
+ if (!isFrozen(dir)) die(`demo: ${dir} is not a frozen demo — it holds no meta.json and lane entry file.`);
155
+ const m = JSON.parse(readFileSync(manifest, "utf8"));
156
+ if (!m?.runId) die(`example: ${manifest} names no runId — it is not a frozen example manifest.`);
157
+ return { dir, meta: m, publishFrom: publishSource(dir, { repoRoot: REPO }), name: basename(dir) };
158
+ });
159
+ const publishFrom = samples[0].publishFrom;
160
+ const meta = samples[0].meta;
135
161
 
136
162
  // ── 2. the pool guard ────────────────────────────────────────────────────────────────────────────────
137
163
  // Resolve through symlinks. A $HOME that resolves inside the archive is exactly the shape a `===` test
@@ -158,7 +184,7 @@ const demoBase = resolve(flag("--base") ?? join(homedir(), "trademark-demo"));
158
184
  if (flag("--pool") && !has("--once")) die(
159
185
  "demo: --pool is for --once, which publishes and exits.",
160
186
  "",
161
- "The demo serves the portal's own archive, which lives inside its base directory, so a pool chosen",
187
+ "The demo serves the portal's own archive, which lives inside its base directory, so a reports folder chosen",
162
188
  "somewhere else would be published to and never served. Move the whole demo instead:",
163
189
  ` ${invoke("demo")} --base <dir>`,
164
190
  );
@@ -192,19 +218,38 @@ if (existsSync(poolRoot) && !statSync(poolRoot).isDirectory()) die(`demo: ${pool
192
218
 
193
219
  // ── 3. replay ────────────────────────────────────────────────────────────────────────────────────────
194
220
  console.log(`\n ${BRAND.name} ${BRAND.product.toLowerCase()} — demo\n`);
195
- console.log(` sample: ${sampleDir}`);
196
- console.log(` pool: ${poolRoot}\n`);
221
+ console.log(samples.length === 1
222
+ ? ` sample: ${samples[0].dir}`
223
+ : ` samples: ${samples.length} — ${samples.map((x) => x.name).join(", ")}`);
224
+ console.log(` reports folder: ${poolRoot}\n`);
197
225
 
198
226
  mkdirSync(poolRoot, { recursive: true });
199
- const { republishRun } = await import(join(REPO, "driver", "publish", "report-registry.mjs"));
200
- let published;
201
- try {
202
- // poolUrl "" on purpose: the report's own link block is for a deployment that serves the pool at a
203
- // public URL. This one is served from this process, at a port picked below.
204
- published = await republishRun({ runId: meta.runId, meta, pool: poolRoot, poolUrl: "", runDir: join(publishFrom, "run") });
205
- } catch (e) {
206
- die(`demo: replaying the sample failed: ${String(e?.message ?? e)}`);
227
+ const { republishRun } = await import(pathToFileURL(join(REPO, "driver", "publish", "report-registry.mjs")).href);
228
+
229
+ // ── ONE FAILURE MUST NOT COST THE OTHERS, AND MUST NOT BE A QUIET COUNT (tracker issue 277) ─────────
230
+ //
231
+ // Publishing stopped at the first error, which was right when there was one demo and is wrong now: a
232
+ // reader whose knockout capture is unreadable should still get the other three, and should be TOLD which
233
+ // one is missing. "3 published" with no other line is the shape this repository calls a silent count —
234
+ // the number is true and the reader cannot tell it is short.
235
+ //
236
+ // The failures are collected and reported together at the end, and the process exits non-zero, because a
237
+ // demo that came up missing a quarter of itself is not a success however good the three look.
238
+ const results = [];
239
+ const failures = [];
240
+ for (const s0 of samples) {
241
+ try {
242
+ // poolUrl "" on purpose: the report's own link block is for a deployment that serves the pool at a
243
+ // public URL. This one is served from this process, at a port picked below.
244
+ results.push({ ...s0, published: await republishRun({ runId: s0.meta.runId, meta: s0.meta, pool: poolRoot, poolUrl: "", runDir: join(s0.publishFrom, "run") }) });
245
+ } catch (e) {
246
+ failures.push({ name: s0.name, why: String(e?.message ?? e) });
247
+ }
248
+ }
249
+ if (!results.length) {
250
+ die(`demo: no demo could be replayed.`, "", ...failures.map((f) => ` ${f.name}: ${f.why}`));
207
251
  }
252
+ const published = results[0].published;
208
253
 
209
254
  // THE LABEL. The reader is about to look at a document that reads like advice about a real mark. It is
210
255
  // not, and the demo says so before the browser opens rather than in a footnote nobody reaches.
@@ -227,18 +272,34 @@ console.log(" re-rendered from its artifacts. It is an example, not advice.\n")
227
272
  //
228
273
  // The third branch is the point: a lane whose publisher reports no count says so. This line printed a
229
274
  // bare "?" to the knockout — a could-not-look wearing the costume of a number.
230
- const spine =
231
- Number.isFinite(published.counts?.findings)
232
- ? `${published.counts.findings} finding(s) recorded in the run's audit spine; the report shows
275
+ // PER LANE, FOR EVERY DEMO — not for the first one with the rest reduced to a product name. The three
276
+ // branches below are the whole point of this sentence: two lanes count different populations and a third
277
+ // counts none, and printing one lane's number beside four reports would state the wrong population three
278
+ // times.
279
+ const spineOf = (pub) =>
280
+ Number.isFinite(pub.counts?.findings)
281
+ ? `${pub.counts.findings} finding(s) recorded in the run's audit trail; the report shows
233
282
  the ones it retains`
234
- : Number.isFinite(published.receipts?.findings)
235
- ? `${published.receipts.findings} finding(s) with citations traced to this run's own held
236
- evidence, on ${published.receipts.citing}/${published.receipts.marks} mark(s)`
283
+ : Number.isFinite(pub.receipts?.findings)
284
+ ? `${pub.receipts.findings} finding(s) with citations traced to this run's own held
285
+ evidence, on ${pub.receipts.citing}/${pub.receipts.marks} mark(s)`
237
286
  : `this lane's publisher reported no finding count — the report itself is the record`;
238
- console.log(` published: ${published.runId} (${spine})`);
287
+ for (const r of results) console.log(` published: ${r.published.runId}\n ${r.name} — ${spineOf(r.published)}`);
288
+ if (results.length > 1) console.log(`\n ${results.length} demo reports are published and listed — one per product.`);
289
+ // LOUD, AND ON STDERR, AND NON-ZERO. Said after the successes so a reader sees what they DID get first,
290
+ // and cannot mistake the run for a clean one.
291
+ if (failures.length) {
292
+ console.error(`\n ${failures.length} of ${samples.length} demo(s) could NOT be replayed:`);
293
+ for (const f of failures) console.error(` ${f.name}: ${f.why}`);
294
+ console.error(` The portal below lists the ${results.length} that published. This exits non-zero.`);
295
+ process.exitCode = 1;
296
+ }
239
297
 
240
298
  if (has("--once")) {
241
- console.log(`\n report: ${join(poolRoot, meta.runId, "report.html")}`);
299
+ // EVERY REPORT THAT WAS PUBLISHED, not the first one. Naming one of four here is the same defect as
300
+ // publishing one of four: the reader is handed a path and has no way to learn the others exist.
301
+ console.log("");
302
+ for (const r of results) console.log(` report: ${join(poolRoot, r.published.runId, "report.html")}`);
242
303
  //, criterion 5 — SAY WHAT WAS CREATED, ON EVERY PATH THAT CREATES SOMETHING.
243
304
  //
244
305
  // The portal path below prints this and `--once` did not, so the one invocation a reader is most
@@ -251,7 +312,11 @@ if (has("--once")) {
251
312
  // does — worse than silence, because it reads as an answer.
252
313
  const created = flag("--pool") ? poolRoot : demoBase;
253
314
  console.log(` Removing it later is one directory: rm -rf ${created}\n`);
254
- process.exit(0);
315
+ // NOT A BARE ZERO. A demo that failed to replay one of its four sets `exitCode` above, and exiting 0
316
+ // here would discard it — printing the failure and then reporting success, which is the shape this
317
+ // change exists to remove. `--once` is also the invocation a script is most likely to use, so it is
318
+ // the one where a swallowed code does the most damage.
319
+ process.exit(process.exitCode ?? 0);
255
320
  }
256
321
 
257
322
  /**
@@ -306,9 +371,21 @@ child.on("error", (e) => die(`demo: could not start the portal: ${String(e?.mess
306
371
  // Its exit code is the demo's. A supervisor that swallowed a child's refusal would report a demo that
307
372
  // is up when nothing is listening.
308
373
  child.on("exit", (code, signal) => process.exit(signal ? 1 : (code ?? 0)));
309
- // Ctrl-C reaches the child through the shared terminal; this process waits for it to finish tearing
310
- // down rather than exiting first and orphaning it.
311
- process.on("SIGINT", () => {});
374
+ // ── SIGINT IS FORWARDED, FOR THE SAME REASON SIGTERM IS ─────────────────────────────────────────
375
+ //
376
+ // This was a no-op, on the reasoning that a terminal delivers SIGINT to the whole foreground process
377
+ // group so `start.mjs` gets its own copy. That is true of a terminal and it is the only case it is true
378
+ // of. MEASURED on this tree: with the demo running on three ports, a SIGINT delivered to THIS PID ALONE
379
+ // left all three still bound and both processes alive, because the no-op tore nothing down and the
380
+ // services sit in their own process group where a group signal aimed at the terminal never reaches
381
+ // them. A SIGINT sent to the group tears everything down correctly; only the pid-alone case leaked.
382
+ //
383
+ // That is the same defect, and the same shape, as the SIGTERM case recorded below — which was found by
384
+ // somebody killing the one pid a reader can see. This half was left as a no-op then.
385
+ //
386
+ // Forwarding is safe when the terminal ALSO delivered its own copy: `start.mjs`'s shutdown is
387
+ // re-entrant (`if (stopping) return`), so the second signal is ignored rather than racing the first.
388
+ process.on("SIGINT", () => { try { child.kill("SIGINT"); } catch { /* already gone */ } });
312
389
  // ── AND SIGTERM, WHICH DOES NOT REACH THE CHILD ─────────────────────────────────────────────────
313
390
  //
314
391
  // SIGINT is delivered to the whole foreground process group by the terminal, so the no-op above is
package/bin/grant.mjs CHANGED
@@ -46,7 +46,7 @@
46
46
  //
47
47
  // It is also why FILE below reads the CLEAROTRON_* spelling. An operator sets CLEAROTRON_ACCESS_FILE;
48
48
  // `applyEnvAliases` translates it. Reading the operator's spelling directly would work — and would put
49
- // the first direct CLEAROTRON_* product read in the tree, which 's arm catches, because the
49
+ // the first direct CLEAROTRON_* product read in the tree, which the arm catches, because the
50
50
  // declaration ratchet is keyed on the CLEAROTRON_* prefix and goes blind the moment that premise stops
51
51
  // holding. One reader, one spelling.
52
52
  import "../shared/env-local.mjs";
@@ -59,7 +59,7 @@ import { makePrincipal } from "../driver/portal-access.mjs";
59
59
  import { envFrom } from "../shared/env-aliases.mjs"; // — resolves EITHER spelling; names the retired one because that is the live-writable half
60
60
  import { defaultGrantsPath } from "./start.mjs"; // — one owner for the roster's path
61
61
 
62
- // — bb8's F13. This read the variable and nothing else, so it refused with
62
+ // — found in review. This read the variable and nothing else, so it refused with
63
63
  // "Set CLEAROTRON_ACCESS_FILE" — a name NOTHING writes. `start` injects it into the environment of the
64
64
  // services it supervises and never persists it, so the door found the roster and this command, run in
65
65
  // the operator's own shell, could not. Enrolling a client had no working path at all.
@@ -184,7 +184,7 @@ if (cmd === "add") {
184
184
  // The route exists — it is the file — and `grant --help` documents it. What was missing is that the
185
185
  // refusal which STOPS you did not carry it, so the shape of the object is printed here, against this
186
186
  // install's own path, rather than left to a reader to find in another command's help.
187
- // — bb8's F13. THE FIRST TENANT IS CREATED HERE. Before this, enrolling anyone
187
+ // — found in review. THE FIRST TENANT IS CREATED HERE. Before this, enrolling anyone
188
188
  // on a fresh install ran out of road: the file is {"tenants":{}}, `brandowner` does not write tenants,
189
189
  // and this command refused because none existed. 2176's F38 fix printed the JSON shape into the
190
190
  // refusal, which is better than a bare stop and still asks a person to hand-edit the file the product