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
@@ -31,7 +31,7 @@ import { createHash } from "node:crypto";
31
31
  import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync, renameSync, statSync } from "node:fs";
32
32
  import { join, dirname } from "node:path";
33
33
  import { fileURLToPath } from "node:url";
34
- import { driverDir } from "../shared/driver-dir.mjs";
34
+ import { driverDir, DRIVER_DIR } from "../shared/driver-dir.mjs"; // the subtree name from its one definition, never a literal
35
35
  import { composeMemo } from "./whatif-memo.mjs";
36
36
 
37
37
  export const SKILL_ROOT = join(dirname(fileURLToPath(import.meta.url)), "skills");
@@ -85,6 +85,43 @@ export function movedArtifacts(before = {}, after = {}) {
85
85
  .map((p) => ({ path: p, before: before[p] ?? null, after: after[p] ?? null }));
86
86
  }
87
87
 
88
+ /**
89
+ * Split what moved into the memo's OWN RECORD and everything else.
90
+ *
91
+ * A memo legitimately leaves two kinds of trace on its parent. Its documents go under `_memos/`, which
92
+ * `digestRunDir` already skips. Its DISPATCH leaves driver telemetry — `_driver/whatif-memo.*` and an
93
+ * appended line in `_driver/run.jsonl` — because the memo rides the same gateway ladder as any seat and
94
+ * the gateway records what it dispatched. That is the parent gaining a RECORD of the memo, which is
95
+ * correct behaviour and the same rule the experiment path already lives by; it is not the archive being
96
+ * rewritten.
97
+ *
98
+ * ✕ EVERYTHING ELSE IS THE SEAT WRITING WHERE IT WAS NOT INVITED, and it is refused by name. The seat
99
+ * has a real file-write grant on the run directory, and on a delivered run it used it: an archived
100
+ * client run carries `memo-osler-coexistence.json` at its root, which is the seat's reply written to a
101
+ * path of its own choosing instead of to the `expectFile` it was given. That also explains the retry
102
+ * that preceded it — the harness looked for the reply where it had asked for it and did not find it.
103
+ *
104
+ * `run.jsonl` may only GROW. A shrink or a rewrite is not an append, and an append is the only thing a
105
+ * dispatch does to it. The check is on size because the digest carries `sha:size` and not the bytes; a
106
+ * rewrite that happened to keep the same length would pass, and that is written down rather than
107
+ * claimed against. PURE.
108
+ */
109
+ export function splitMemoFootprint(moved = []) {
110
+ const own = [];
111
+ const foreign = [];
112
+ const sizeOf = (v) => { const n = Number(String(v ?? "").split(":")[1]); return Number.isFinite(n) ? n : null; };
113
+ for (const m of moved) {
114
+ const p = String(m?.path ?? "");
115
+ if (p.startsWith(`${DRIVER_DIR}/whatif-memo.`)) { own.push(m); continue; }
116
+ if (p === `${DRIVER_DIR}/run.jsonl`) {
117
+ const b = sizeOf(m.before); const a = sizeOf(m.after);
118
+ if (b !== null && a !== null && a > b) { own.push(m); continue; }
119
+ }
120
+ foreign.push(m);
121
+ }
122
+ return { own, foreign };
123
+ }
124
+
88
125
  /** The profile key the PARENT rated under — read from its frozen sidecar, never re-resolved. */
89
126
  export function parentRatedUnder(runDir, { read = readFileSync } = {}) {
90
127
  try { return JSON.parse(read(driverDir(runDir, "profile.json"), "utf8"))?.profileKey ?? null; }
@@ -141,7 +178,7 @@ export async function seatReason({ runDir, runId, assumption, ratedUnder, findin
141
178
 
142
179
  /**
143
180
  * Validate the seat's reply. TYPED, not parsed prose — the reply is a JSON object the skill dictates,
144
- * so a phrasing choice can never fail it. That is deliberate and it is tracker issue 129's lesson applied
181
+ * so a phrasing choice can never fail it. That is deliberate and the lesson is applied
145
182
  * before the fact: a gate keyed on how a model worded something is one drift from killing the call.
146
183
  *
147
184
  * Returns { ok, reading } or { ok: false, fail, detail }. Refuses rather than repairing: a memo composed
@@ -299,10 +336,14 @@ export async function askArchivedRun({ runId, question, requestedBy = null } = {
299
336
 
300
337
  // AFTER the write, deliberately: the check has to cover this call's own behaviour, not merely the
301
338
  // reasoning pass's. If writing the memo touched the parent, that is exactly what must be caught.
302
- const moved = movedArtifacts(before, digestRunDir(run.runDir));
303
- if (moved.length)
339
+ const { own, foreign } = splitMemoFootprint(movedArtifacts(before, digestRunDir(run.runDir)));
340
+ if (foreign.length)
304
341
  return { ok: false, fail: MEMO_FAILS.PARENT_MOVED,
305
- detail: `the parent run's artifacts moved during the memo: ${moved.slice(0, 5).map((m) => m.path).join(", ")}`, moved };
342
+ // NAMES WHAT IT FOUND AND WHY IT IS WRONG. "the parent's artifacts moved" was true of a correct
343
+ // memo too — the dispatch telemetry tripped it — so the sentence could not tell a reader whether
344
+ // the archive had been rewritten or the memo had merely run.
345
+ detail: `a memo may write only to ${MEMO_DIR}/ and its own reply file; these were written into the parent run instead: ${foreign.slice(0, 5).map((m) => m.path).join(", ")}`,
346
+ moved: foreign, memoFootprint: own };
306
347
 
307
348
  return {
308
349
  ok: true,
@@ -50,7 +50,7 @@ import { randomUUID } from "node:crypto";
50
50
 
51
51
  // ── WHICH RUNS A WHAT-IF MAY TOUCH — ONE DECLARATION, TWO READERS ───────────────────────────────────
52
52
  //
53
- // FOUND BY DRIVING IT (, 2026-09-03). There were THREE copies of this question and
53
+ // FOUND BY DRIVING IT (2026-09-03). There were THREE copies of this question and
54
54
  // they did not agree. `whatIfPlan` and `whatIfEnqueue` refused `location === "archive" || state ===
55
55
  // "delivered"`; the worker refused the presence of any of `.delivered`, `.failed`, `.cancelled`,
56
56
  // `.cancel`. A run that had FAILED passed the first two and was refused by the third — so a client could
@@ -119,7 +119,7 @@ async function settleOne(entry, exec) {
119
119
  if (!job) return null; // another worker won it, or the manifest was recorded bad
120
120
  const { runDir, id } = entry;
121
121
  // The verdict is rendered HERE and not in the scan, because only now is the job's kind known. A
122
- // delivered run refuses a stage re-run and welcomes a memo — that is the whole of tracker issue 132
122
+ // delivered run refuses a stage re-run and welcomes a memo — that is the whole distinction
123
123
  // and a scan over run directories cannot tell those apart.
124
124
  const refusal = whatIfRefusal({ markers: entry.markers ?? [], kind: job.op?.kind ?? "stage" });
125
125
  if (refusal) {
@@ -1,5 +1,17 @@
1
1
  # trademark-artifacts-mcp
2
2
 
3
+ ## 0.2.2
4
+
5
+ ## 0.3.0-beta.0
6
+
7
+ ## 0.2.1
8
+
9
+ ## 0.2.1-beta.2
10
+
11
+ ## 0.2.1-beta.1
12
+
13
+ ## 0.2.1-beta.0
14
+
3
15
  ## 0.2.0
4
16
 
5
17
  ## 0.1.12
@@ -1,9 +1,9 @@
1
1
  # trademark-artifacts-mcp
2
2
 
3
- An MCP server to **interrogate prelim trademark-clearance runs** — for an integrator's agent platform and for
3
+ An MCP server to **interrogate clearotron trademark-clearance runs** — for an integrator's agent platform and for
4
4
  your **own Claude** (Claude Code / Desktop) alike. One stdio binary, two consumers.
5
5
 
6
- It answers three kinds of question against any run the `prelim-driver` produced:
6
+ It answers three kinds of question against any run the `clearotron-driver` produced:
7
7
  1. **"How did you reach Y?"** — `trace` walks the full logic flow from any point (a stage, an artifact, a
8
8
  finding, the verdict) back through the stage that emitted it, its model + any failover, its inputs (with the
9
9
  sha each input had *when consumed* vs now), the per-search audit-trail rationale, the search terms + record
@@ -15,7 +15,7 @@ It answers three kinds of question against any run the `prelim-driver` produced:
15
15
 
16
16
  ## Design
17
17
 
18
- - **Imports the `prelim-driver` read-only** via `lib/driver.mjs` (the single coupling point). It hardcodes **no**
18
+ - **Imports the `clearotron-driver` read-only** via `lib/driver.mjs` (the single coupling point). It hardcodes **no**
19
19
  artifact filename or stage name, so the driver can rename artifacts freely — the server tracks
20
20
  `paths()` / `STAGE_ORDER` automatically. It edits **no** driver, template, or deploy file.
21
21
  - **Provenance from the self-describing `_driver/run.jsonl`** (each `stage` event records its own
@@ -27,6 +27,9 @@ import { envFileRead } from "../shared/env-local.mjs"; // side effect: apply t
27
27
  import { envFrom } from "../shared/env-aliases.mjs"; // — a refusal names the name in force
28
28
  import { accessAudience, audienceLabel } from "../shared/access-audience.mjs"; // — F54; jose-free on purpose
29
29
  import { doorPostureVerdict } from "./door-posture.mjs"; // — say when this door's mode came from another door's variables
30
+ // The local key door (tracker issue 174): a second listener on a unix socket, so a scoped access key has
31
+ // a path that no tunnel can forward to and the TCP door never learns about keys.
32
+ import { keyDoorRefusal, openKeyDoor, KEY_SOCKET_MODE } from "./key-socket.mjs";
30
33
  import { demoPostureLine } from "../driver/demo-posture.mjs"; // — the two mis-aimed warnings answer from one place
31
34
  import { createServer } from "node:http";
32
35
  import { randomUUID } from "node:crypto";
@@ -85,13 +88,17 @@ const DEV = process.env.TRADEMARK_MCP_DEV === "1";
85
88
  // the opposite of `TRADEMARK_MCP_AUTH_DISABLED` — which authenticates nobody and hands every caller
86
89
  // `local-test@disabled` — and the handler refuses outright to build the two together.
87
90
  //
88
- // It exists because 's one-command local install needs the trigger lane, the trigger lane is this
91
+ // It exists because the one-command local install needs the trigger lane, the trigger lane is this
89
92
  // face, and a startup command that has to switch authentication off to reach it is the defect that
90
93
  // issue is about. The portal holds a verb-scoped, account-capped ops token; this door demands it.
91
94
  //
92
95
  // NAMED, NEVER INFERRED — the same rule wrote for PORTAL_AUTH_MODE, for the same reason. Unset
93
96
  // means exactly what it meant before this line existed, including the dev bypass still working, so a
94
97
  // deployment that loses CLEAROTRON_OIDC_AUDIENCE still refuses to start rather than quietly becoming a key door.
98
+ // NAMED, NEVER INFERRED, like every other setting on this door: the key path is opt-in and a deployment
99
+ // that does not set it gets exactly the door it has today. Unset is not "pick a default socket" — a
100
+ // default path would put a key door on every install that never asked for one.
101
+ const KEY_SOCKET = (process.env.TRADEMARK_MCP_KEY_SOCKET || "").trim();
95
102
  const AUTH_MODE = (process.env.TRADEMARK_MCP_AUTH_MODE || "").trim().toLowerCase();
96
103
  const TOKEN_ONLY = AUTH_MODE === "token";
97
104
  const TEAM = process.env.CF_ACCESS_TEAM || "";
@@ -214,6 +221,19 @@ if (isMain) {
214
221
  }
215
222
  }
216
223
 
224
+ // ── THE KEY PATH, ON THE POSTURE SURFACE (tracker issue 174) ──────────────────────────────────────
225
+ //
226
+ // An operator must be able to see that a local key path exists, and with what permissions, WITHOUT
227
+ // reading a unit file — the acceptance asks for exactly that, and it is the same reasoning as the
228
+ // posture line above: a door whose shape can only be learned by reading configuration is a door whose
229
+ // shape nobody checks. The mode is printed in octal because that is how an operator reads `ls -l`.
230
+ //
231
+ // The ABSENT case is a line too. Silence would leave "this deployment has no key path" and "this build
232
+ // does not have the feature" looking identical, which is the confusion this issue is about.
233
+ log(KEY_SOCKET
234
+ ? `key path: ${KEY_SOCKET} (mode ${KEY_SOCKET_MODE.toString(8)} once open) — a scoped access key is accepted HERE and nowhere else; the network door never honours one`
235
+ : "key path: none configured (TRADEMARK_MCP_KEY_SOCKET unset) — a program on this box holding an access key has no door on this process");
236
+
217
237
  // ── THE ROSTER THIS PROCESS CAN ACTUALLY SEE ──────────────────────────────────────────────────────
218
238
  //
219
239
  // WHAT THIS EXISTS FOR. `start_run` validates `profileKey` against `loadProfiles()`, which reads
@@ -297,4 +317,27 @@ if (isMain) {
297
317
  port: PORT, host: HOST, what: "the MCP staff surface", portVar: "TRADEMARK_MCP_HTTP_PORT", portSource: PORT_CHOICE.source, portFile: envFileRead(), log,
298
318
  onReady: ({ port: bound }) => log(`listening on http://${HOST}:${bound}/mcp — READ-ONLY staff surface, firmDomains=[${ALLOWED_DOMAINS.join(", ")}], ${door}`),
299
319
  });
320
+
321
+ // ── THE SECOND DOOR: A LOCAL KEY PATH ON A UNIX SOCKET (tracker issue 174) ────────────────────────
322
+ //
323
+ // One process, two transports, two handlers. The TCP door above is untouched and still never honours a
324
+ // key; this one takes a scoped access key and cannot be reached from any network. A tunnel forwards to
325
+ // a port, so it cannot reach a socket — which is the whole reason the discriminator is the transport
326
+ // rather than the peer address. See key-socket.mjs for why a loopback check is not a control here.
327
+ //
328
+ // A SEPARATE SESSION MAP, deliberately. The handler already refuses a session whose owner is not the
329
+ // caller, so sharing one map would probably be safe — but "probably safe" across an authentication
330
+ // boundary is the kind of reasoning this repository keeps paying for, and two maps cost one allocation.
331
+ // A session minted behind the key door is not addressable from the tunnel-facing one at all.
332
+ if (KEY_SOCKET) {
333
+ const refusal = keyDoorRefusal({ authDisabled: AUTH_DISABLED, accessFile: envFrom(process.env, "CLEAROTRON_ACCESS_FILE"), authMode: AUTH_MODE });
334
+ if (refusal) { log(`FATAL: ${refusal}`); process.exit(1); }
335
+ const keyHandler = makeHttpHandler({
336
+ verify: null, tokenOnly: true, devMode: false,
337
+ limiter, opsLimiter, sessions: new Map(), createSession, ns: NS, sessionMax: SESSION_MAX,
338
+ authHeader: AUTH_HEADER, firmDomains: ALLOWED_DOMAINS, log,
339
+ });
340
+ openKeyDoor({ handler: keyHandler, path: KEY_SOCKET, log })
341
+ .catch((e) => { log(`FATAL: could not open the key socket at ${KEY_SOCKET} — ${e.message}`); process.exit(1); });
342
+ }
300
343
  }
@@ -0,0 +1,184 @@
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
+ // key-socket.mjs — the local key door, on a unix socket, beside the TCP door that takes a proxy identity
4
+ // (tracker issue 174).
5
+ //
6
+ // ── THE PROBLEM, AND WHY THE OBVIOUS FIX IS NOT ONE ─────────────────────────────────────────────────
7
+ //
8
+ // This interface serves two populations that authenticate differently: people arriving through a tunnel,
9
+ // who prove themselves with a proxy JWT, and programs on the same machine holding a scoped access key,
10
+ // which can never produce a JWT. The handler refuses to do both — `tokenOnly` and `verify` are mutually
11
+ // exclusive by construction — so a deployment needing both has had to run the process twice. On the
12
+ // production install that cost an outage: the shared instance was switched to the proxy mode so the
13
+ // desktop path would work, which silently took the portal's trigger with it, and both sides logged a
14
+ // true sentence that was not the one the operator needed.
15
+ //
16
+ // "ONLY ACCEPT A KEY FROM LOOPBACK" DOES NOT WORK HERE, and this is the whole design. The tunnel daemon
17
+ // runs ON the box and connects to the listener over loopback, so a request forwarded from the internet
18
+ // and a request from the local portal have the SAME peer address. A peer-IP check would accept a stolen
19
+ // key replayed through the tunnel, and it would look correct in every test written on a box with no
20
+ // tunnel — green, and wrong exactly where it matters.
21
+ //
22
+ // ── THE DISCRIMINATOR IS THE TRANSPORT ──────────────────────────────────────────────────────────────
23
+ //
24
+ // A tunnel forwards to a TCP port. It cannot reach a unix socket. So the key door is a SECOND listener
25
+ // on a socket, and the TCP door keeps the proxy rule unchanged and never learns about keys.
26
+ //
27
+ // REFUSAL BY CONSTRUCTION, NOT BY A CHECK. The two handlers are separate objects: the TCP one is built
28
+ // with `verify` and `tokenOnly:false`, this one with `verify:null` and `tokenOnly:true`. "A key
29
+ // presented on the TCP port is refused" is therefore not a branch anybody can delete — there is no code
30
+ // path on that handler that reads a key at all, and the existing mutual-exclusion guard keeps it that
31
+ // way. Filesystem permissions then state which local accounts may present a key, which is a stronger
32
+ // claim than any header check and one an operator can read with `ls -l`.
33
+ import { createServer } from "node:http";
34
+ import { connect } from "node:net";
35
+ import { chmodSync, statSync, unlinkSync } from "node:fs";
36
+ import { dirname } from "node:path";
37
+
38
+ /** The socket's mode: owner and group read/write, nobody else. The group is the door's own egid. */
39
+ export const KEY_SOCKET_MODE = 0o660;
40
+
41
+ /**
42
+ * The refusals that bind on the key door WHATEVER transport it listens on.
43
+ *
44
+ * WHY THIS FUNCTION EXISTS RATHER THAN REUSING THE TOKEN-MODE BLOCK. Those refusals live inside
45
+ * `if (TOKEN_ONLY)` in http-server.mjs, and this door opens on a process that is typically NOT in token
46
+ * mode — it is in proxy mode for its TCP half. Without this, adding a key door to a proxy-mode process
47
+ * would skip every one of them, and the grants-file refusal is the one that matters: a missing grants
48
+ * file with `firmStaff` ever flipped back on is silent read-all across every customer.
49
+ *
50
+ * TWO OF THE FOUR TOKEN-MODE REFUSALS DELIBERATELY DO NOT APPEAR HERE, and saying which and why is the
51
+ * point — a fence that disappears without a sentence is how the next one goes:
52
+ *
53
+ * · the loopback-only refusal guards a key riding plaintext to ANOTHER MACHINE. A unix socket has no
54
+ * host and no wire; it is a filesystem object and cannot be addressed off the box at all. The hazard
55
+ * it names does not exist here, and filesystem mode replaces it.
56
+ * · the allowed-hosts refusal arms DNS-rebinding protection, which is an attack on a browser resolving
57
+ * a HOSTNAME. A socket has no hostname and no DNS. Same reasoning.
58
+ *
59
+ * Both still bind on the TCP token door, untouched.
60
+ *
61
+ * @returns {string|null} the refusal sentence, or null when the door may open.
62
+ */
63
+ export function keyDoorRefusal({ authDisabled, accessFile, authMode = "" }) {
64
+ // THE COMBINATION THAT MAKES BOTH DOORS KEY DOORS, and the one this whole issue exists to prevent.
65
+ //
66
+ // The mutual exclusion in makeHttpHandler is between `verify` and `tokenOnly` on ONE handler. It says
67
+ // nothing about two handlers in one process — and the TCP handler is built with `tokenOnly: TOKEN_ONLY`,
68
+ // which is `TRADEMARK_MCP_AUTH_MODE === "token"`. So with the mode set to token AND a socket configured,
69
+ // BOTH listeners accept a key, the TCP one is reachable through the tunnel, and the posture line below
70
+ // would announce that a key is "accepted HERE and nowhere else" while that is false.
71
+ //
72
+ // The loopback refusal in token mode does not save it: the tunnel daemon runs on this box and connects
73
+ // over loopback, which is the exact reason this door is a socket rather than a loopback port.
74
+ //
75
+ // AND IT IS THE LIKELY CONFIGURATION, not a contrived one. The deployment this issue was raised from is
76
+ // in token mode today, because somebody switched it to make one path work. An operator adding the socket
77
+ // is far more likely to leave the mode alone than to change it, so this refusal is the one that will
78
+ // actually fire. Found in review, not by me.
79
+ if (String(authMode).trim().toLowerCase() === "token") {
80
+ return "TRADEMARK_MCP_KEY_SOCKET is set and TRADEMARK_MCP_AUTH_MODE=token — that mode makes the NETWORK "
81
+ + "door take a key too, and a tunnel can reach it. The socket exists so a key has one door: unset the "
82
+ + "mode (the network door then takes a proxy identity) or unset the socket. Refusing to open both.";
83
+ }
84
+ if (authDisabled) {
85
+ return "TRADEMARK_MCP_KEY_SOCKET is set and TRADEMARK_MCP_AUTH_DISABLED=1 — one demands a valid access "
86
+ + "key on every request, the other authenticates nobody. Unset the bypass. Refusing to open the key door.";
87
+ }
88
+ if (!accessFile) {
89
+ return "TRADEMARK_MCP_KEY_SOCKET is set but CLEAROTRON_ACCESS_FILE is unset — refusing to open the key "
90
+ + "door. Point it at a grants file, even one containing only {\"tenants\":{}}.";
91
+ }
92
+ return null;
93
+ }
94
+
95
+ /**
96
+ * Is a socket at this path being served by a LIVE process, or is it a leftover?
97
+ *
98
+ * A unix socket is a file: it survives a crash, and `listen` on an existing path fails with EADDRINUSE
99
+ * whether or not anybody is behind it. Unlinking unconditionally is the obvious move and it is the
100
+ * dangerous one — it silently steals the path from a healthy sibling process, and the symptom is a portal
101
+ * whose calls stop arriving at a door that is still running.
102
+ *
103
+ * So: try to connect. A refused connection means nothing is listening and the file is stale. A successful
104
+ * one means somebody is there, and this process must refuse rather than take the path.
105
+ */
106
+ export function probeSocket(path, { timeoutMs = 500 } = {}) {
107
+ return new Promise((resolve) => {
108
+ let done = false;
109
+ const finish = (v) => { if (!done) { done = true; resolve(v); } };
110
+ let c;
111
+ try { c = connect(path); } catch { return finish("stale"); }
112
+ const t = setTimeout(() => { try { c.destroy(); } catch { /* closing */ } finish("live"); }, timeoutMs);
113
+ c.on("connect", () => { clearTimeout(t); try { c.destroy(); } catch { /* closing */ } finish("live"); });
114
+ c.on("error", (e) => {
115
+ clearTimeout(t);
116
+ // ENOENT: no such file. ECONNREFUSED: the file is there and nothing is behind it.
117
+ finish(e?.code === "ENOENT" ? "absent" : e?.code === "ECONNREFUSED" ? "stale" : "unknown");
118
+ });
119
+ });
120
+ }
121
+
122
+ /**
123
+ * Open the key door. Resolves to `{ mode, path }` once listening.
124
+ *
125
+ * `listenOrDie` is deliberately not used: its subject is port conflicts and the explicit-port policy, and
126
+ * a socket path has neither. Its refusals would read as nonsense here ("set TRADEMARK_MCP_HTTP_PORT") and
127
+ * borrowing them would mean an operator being told to fix a variable this door does not read.
128
+ *
129
+ * THE MODE IS SET AFTER LISTEN, not before, because `listen` creates the file itself and the process
130
+ * umask decides what it starts as. A door that assumed its umask would be world-writable on a box whose
131
+ * umask was 0, which is the kind of thing nobody notices until it is the finding.
132
+ */
133
+ export async function openKeyDoor({ handler, path, log = () => {}, chmod = chmodSync, stat = statSync, unlink = unlinkSync, probe = probeSocket, listen = null }) {
134
+ // ── THE DIRECTORY, NOT JUST THE SOCKET (found in review) ───────────────────────────────────────────
135
+ //
136
+ // 0660 on the socket says who may CONNECT to it. It says nothing about who may REPLACE it: unlinking a
137
+ // file is governed by write permission on the containing directory. So a socket in a world-writable
138
+ // directory without the sticky bit can be removed by any local account, which then binds its own
139
+ // listener on the path — and the portal presents its ops key to that listener. The mode on the socket
140
+ // does not prevent one line of it.
141
+ //
142
+ // The stale-socket handling below makes that reachable rather than theoretical: an impostor who binds
143
+ // first simply reads as "live", this process refuses by design, and the impostor is left holding the
144
+ // path with the door it replaced never having started.
145
+ //
146
+ // WORLD-WRITABLE WITHOUT STICKY IS REFUSED. Group-writable is NOT: the socket is already group-
147
+ // readable, so the group is the trust boundary an operator has chosen for this door, and a service
148
+ // directory owned by the service group at 0770 is the ordinary correct shape. The sticky bit is
149
+ // honoured because that is exactly what it means — /tmp is world-writable and safe for this precisely
150
+ // because of it.
151
+ const dir = dirname(path);
152
+ const dmode = stat(dir).mode & 0o7777;
153
+ if ((dmode & 0o002) && !(dmode & 0o1000)) {
154
+ throw new Error(`the directory holding the key socket is world-writable without the sticky bit (${dir}, mode ${dmode.toString(8)}) `
155
+ + "— any local account could remove this socket and bind its own listener in its place, and callers would present their key to it. "
156
+ + "Tighten the directory, or set the sticky bit.");
157
+ }
158
+
159
+ const state = await probe(path);
160
+ if (state === "live") {
161
+ throw new Error(`a process is already serving the key socket at ${path} — refusing to take the path from it. `
162
+ + "Stop that process, or point TRADEMARK_MCP_KEY_SOCKET somewhere else.");
163
+ }
164
+ if (state === "stale") { try { unlink(path); } catch { /* it may have gone between the probe and here */ } }
165
+ // THE FOURTH STATE, which was handled by accident (found in review). A socket owned by another account
166
+ // whose mode this process cannot reach answers EACCES — neither ENOENT nor ECONNREFUSED — and fell
167
+ // through to `listen`, which then failed with a bare EADDRINUSE and no sentence. That is precisely the
168
+ // case the probe exists for: something is at this path and this process cannot tell what.
169
+ if (state === "unknown") {
170
+ throw new Error(`something is at the key socket path and this process cannot determine what (${path}) `
171
+ + "— most often a socket owned by another account. Refusing to unlink a path this process cannot inspect. "
172
+ + "Check its owner and mode, or point TRADEMARK_MCP_KEY_SOCKET somewhere this service owns.");
173
+ }
174
+
175
+ const server = createServer(handler);
176
+ await new Promise((resolve, reject) => {
177
+ server.once("error", reject);
178
+ (listen ?? ((p, cb) => server.listen(p, cb)))(path, resolve);
179
+ });
180
+ chmod(path, KEY_SOCKET_MODE);
181
+ const mode = stat(path).mode & 0o777;
182
+ log(`key door listening on ${path} (mode ${mode.toString(8)}, dir ${dir} mode ${dmode.toString(8)}) — access key required, no auth proxy, unreachable from any network`);
183
+ return { server, path, mode };
184
+ }
@@ -102,7 +102,7 @@ export function scrubBlocks(items) {
102
102
  /**
103
103
  * get_finding — one block.
104
104
  *
105
- * A WITHDRAWN block scrubs away to nothing, and the choice there is 's choice: the tool itself
105
+ * A WITHDRAWN block scrubs away to nothing, and the choice there is the choice: the tool itself
106
106
  * throws on a finding it cannot resolve, so returning `null` would hand a client an empty answer they
107
107
  * would believe, on the one call whose whole job is to resolve an id. It REFUSES instead, in the words
108
108
  * the record actually supports — the finding exists and was withdrawn, which is why it renders nowhere.
@@ -173,9 +173,76 @@ function accountNode(node) {
173
173
  return out;
174
174
  }
175
175
 
176
+ // ── THE KNOCKOUT TRACE IS A DIFFERENT SHAPE, AND THE CLEARANCE ALLOWLIST DROPS ALL OF IT ────────────
177
+ //
178
+ // `accountTrace` below is an allowlist built field by field around the clearance trace. A Knockout trace
179
+ // shares only `runId` and `target` with it: the fields that carry the answer are `mark`, `band`, `basis`,
180
+ // `factors`, `counterFactors`, `findings` and `registerReads`, and none of them is in that list. So a
181
+ // client session asking about a Knockout mark received 142 bytes of shell — and, worse, kept the `note`,
182
+ // which reads "The band, the one-sentence ground for it, and the observations it rests on." The one field
183
+ // that survived was a promise about the fields that did not. Measured on all four shapes: verdict
184
+ // 303→200, mark 427→142, stage 210→95 bytes. The ops path and get_run were never affected.
185
+ //
186
+ // WHY THIS IS A SEPARATE PROJECTION AND NOT A WIDENED PICK LIST. Adding these names to the clearance list
187
+ // would make a clearance trace start forwarding any same-named field it later grew, unreviewed. Each
188
+ // shape states its own fields, so a new field on either side is invisible until somebody adds it here.
189
+ //
190
+ // TWO THINGS ARE PROJECTED RATHER THAN FORWARDED, both for the reason the clearance side already gives:
191
+ // · `events` is raw `run.jsonl` — model names, token counts and timings. It goes through `accountNode`,
192
+ // the same node fields the clearance walk already rules client-safe, rather than passing whole.
193
+ // · `basis`, `factors`, `counterFactors` and a finding's `name` are MODEL OUTPUT, so they take `clean`
194
+ // exactly as `summary` and `note` do on the clearance side. The knockout notes are our own literals
195
+ // and are cleaned anyway: a rule with an exception is a rule somebody edits the wrong way later.
196
+ const KNOCKOUT_TRACE_KINDS = new Set(["verdict", "mark", "stage"]);
197
+
198
+ /** A knockout trace, projected per shape. Only reached for a result the clearance branch cannot read. */
199
+ function accountKnockoutTrace(result) {
200
+ const base = pick(result, ["runId", "target", "kind"]);
201
+ const cleanList = (v) => (Array.isArray(v) ? v.map(clean) : []);
202
+ if (result.kind === "verdict") {
203
+ return {
204
+ ...base,
205
+ verdict: result.verdict ?? null,
206
+ marks: (Array.isArray(result.marks) ? result.marks : [])
207
+ .map((m) => ({ ...pick(m, ["mark", "band"]), basis: clean(m?.basis ?? null) })),
208
+ note: clean(result.note),
209
+ };
210
+ }
211
+ if (result.kind === "mark") {
212
+ return {
213
+ ...base,
214
+ mark: result.mark ?? null,
215
+ band: result.band ?? null,
216
+ basis: clean(result.basis ?? null),
217
+ factors: cleanList(result.factors),
218
+ counterFactors: cleanList(result.counterFactors),
219
+ findings: (Array.isArray(result.findings) ? result.findings : []).map((f) => ({
220
+ ...pick(f, ["ordinal", "band"]),
221
+ name: clean(f?.name ?? null),
222
+ evidence: cleanList(f?.evidence),
223
+ })),
224
+ registerReads: (Array.isArray(result.registerReads) ? result.registerReads : [])
225
+ .map((r) => ({ ...pick(r, ["recordId", "band"]), read: clean(r?.read ?? null) })),
226
+ note: clean(result.note),
227
+ };
228
+ }
229
+ // stage
230
+ return {
231
+ ...base,
232
+ stage: result.stage ?? null,
233
+ events: (Array.isArray(result.events) ? result.events : []).map(accountNode),
234
+ produced: (Array.isArray(result.produced) ? result.produced : []).map((a) => pick(a, ["name", "file"])),
235
+ note: clean(result.note),
236
+ };
237
+ }
238
+
176
239
  export function accountTrace(result) {
177
240
  if (!result || typeof result !== "object") return result;
178
241
  if (result.error) return pick(result, ["runId", "target", "error"]); // the resolver's own guidance, no run content
242
+ // A clearance trace always carries `resolvedAs`; a knockout trace never does and carries a top-level
243
+ // `kind` instead. Requiring BOTH is what stops a clearance trace that later grows a top-level `kind`
244
+ // from being routed into the knockout projection and silently losing its own fields.
245
+ if (!result.resolvedAs && KNOCKOUT_TRACE_KINDS.has(result.kind)) return accountKnockoutTrace(result);
179
246
  const out = {
180
247
  ...pick(result, ["runId", "target", "mode"]),
181
248
  resolvedAs: pick(result.resolvedAs, ["kind", "stage", "fuzzy", "codeBuilt"]),
@@ -288,7 +355,7 @@ export function accountWhatIfPlan(result) {
288
355
 
289
356
  // The enqueue acknowledgement. It is composed in whatIfEnqueue from fields this file names, so nothing is
290
357
  // withheld here — it is declared so that a field added to that acknowledgement later cannot arrive
291
- // unruled, which is what 's default-deny is for.
358
+ // unruled, which is what the default-deny is for.
292
359
  const QUEUED_FIELDS = ["queued", "runId", "experimentId", "stage", "axis", "queuedAt", "next"];
293
360
  export const accountWhatIfQueued = (result) => (result && typeof result === "object" ? pick(result, QUEUED_FIELDS) : result);
294
361
 
@@ -135,6 +135,21 @@ export function buildBrief(run) {
135
135
  lines.push(`- **${m.name}** — ${band}.${d.url ? ` Report: ${d.url}` : ""}`);
136
136
  for (const f of (m.findings ?? [])) {
137
137
  const who = [f.name, f.owner].filter(Boolean).join(" — ");
138
+ // A PROMOTED REGISTER FILING SHOWS THE RATING AND THE READ THE SEARCH ACTUALLY MADE (tracker
139
+ // issue 274). This line used to print `net` alone, and for a register card `net` carried the
140
+ // stated "no rating of its own" — so the one hard legal right on a page was described here as
141
+ // unrated even on runs where the assessment had written a full read of that exact filing and
142
+ // the report was already printing it. The page and this briefing disagreed.
143
+ //
144
+ // SCOPED TO `shape === 'register'` DELIBERATELY. Every other finding line is left exactly as it
145
+ // was: a typed conflict already leads with its own band on the report, and widening this to all
146
+ // findings would change what this briefing says about runs that have no register layer at all.
147
+ if (f.shape === "register") {
148
+ const rating = f.band ? ` — ${titleCase(String(f.band))} risk.` : "";
149
+ const read = f.basis && f.basis !== f.net ? ` ${f.basis}` : "";
150
+ lines.push(` - ${who}${rating}${f.net ? ` ${f.net}` : ""}${read}`.trimEnd());
151
+ continue;
152
+ }
138
153
  lines.push(` - ${who}${f.net ? `: ${f.net}` : ""}`.trimEnd());
139
154
  }
140
155
  }
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
3
- // lib/driver.mjs — the SINGLE coupling point to the prelim-driver.
3
+ // lib/driver.mjs — the SINGLE coupling point to the clearotron-driver.
4
4
  //
5
5
  // Everything the MCP imports from the deterministic driver passes through here, so the dependency surface
6
6
  // is one file: if the driver renames an export, this file fails loudly (test-caught), instead of silent
@@ -14,6 +14,12 @@ export {
14
14
  REGISTER_AXES, decideAxes, axisTier,
15
15
  } from "../../driver/stages.mjs";
16
16
 
17
+ // The KNOCKOUT lane's own run-dir table. `paths` above is the CLEARANCE table and has no entry for any
18
+ // file this lane writes, which is why every audit projection read a delivered knockout as a run with
19
+ // nothing on disk (tracker issue 275). Re-exported rather than re-derived for the reason this whole file
20
+ // exists: a second copy of a path table drifts, and the drift shows up as an artifact reported missing.
21
+ export { koPaths } from "../../driver/stages-knockout.mjs";
22
+
17
23
  // stripInternal/stripEngineInternals/stripTelemetry are the driver's OWN client-safety transforms — the
18
24
  // same ones publish/render.mjs applies to the client HTML export. lib/scrub.mjs composes them so the MCP
19
25
  // client surface and the delivered report answer "what may a client see?" from ONE definition ( R1:
@@ -129,7 +129,7 @@ function classify(e, st, rat) {
129
129
  // dropped nothing on goods when it dropped and nobody counted". Carrying the cause is what keeps that
130
130
  // true here without alarming every ordinary run.
131
131
  //
132
- // A pre- event carries no `cause`. It is left `null` and stays on the clear side: this surface
132
+ // A pre-change event carries no `cause`. It is left `null` and stays on the clear side: this surface
133
133
  // must not retro-label old runs as incomplete on the strength of a field their engine never wrote.
134
134
  case "screen-gate-clean": {
135
135
  const cause = e.cause ?? null;
@@ -117,7 +117,7 @@ export function makeHttpHandler({ verify, limiter, opsLimiter = null, sessions,
117
117
  try { t = verifyToken(tok); }
118
118
  catch (e) {
119
119
  // AN OPERATOR FAULT IS NOT A BAD KEY, and it must not read like one ( —
120
- // bb8's F14). `isRevoked` now refuses rather than assuming a token was never revoked when the
120
+ // found in review). `isRevoked` now refuses rather than assuming a token was never revoked when the
121
121
  // denylist cannot be read; that is a configuration fault on THIS box, and logged in the same
122
122
  // words as a stranger presenting a bad key it would sit unnoticed in auth noise — which is how
123
123
  // the original defect survived, silently, on every default install.