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.
- package/.env.example +105 -0
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +57 -52
- package/README.md +2 -1
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +4 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +114 -37
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +97 -119
- package/bin/start.mjs +29 -25
- package/bin/stop.mjs +65 -3
- package/bin/update.mjs +7 -7
- package/bin/uspto-sync.mjs +1 -1
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +6 -2
- package/docs/RELEASES.md +6 -4
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +7 -4
- package/docs/architecture/05-config-governance.md +38 -5
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +95 -1
- package/driver/README.md +2 -2
- package/driver/ask-ledger.mjs +72 -4
- package/driver/authority-trees.mjs +1 -1
- package/driver/call-capture.mjs +1 -1
- package/driver/card-frame.mjs +1 -1
- package/driver/case-law-ledger.mjs +1 -1
- package/driver/claim-liveness.mjs +1 -1
- package/driver/common-law-receipts.mjs +1 -1
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/connotation-search.mjs +12 -12
- package/driver/contract-audit.mjs +5 -5
- package/driver/contract-dictation-registry.mjs +4 -4
- package/driver/contract-dictation.mjs +2 -2
- package/driver/contract-e3-backlog.mjs +6 -6
- package/driver/contract-vocabulary.mjs +3 -3
- package/driver/corrections-feedforward.mjs +1 -1
- package/driver/coverage-form-io.mjs +2 -2
- package/driver/coverage-form.mjs +4 -4
- package/driver/coverage-ledger.mjs +3 -3
- package/driver/coverage-union.mjs +1 -1
- package/driver/declination-call.mjs +35 -3
- package/driver/declination-duty.mjs +1 -1
- package/driver/deliver-trigger.sh +3 -3
- package/driver/deploy-live-run-guard.mjs +6 -2
- package/driver/dev-portal.mjs +1 -1
- package/driver/disposition-call.mjs +4 -4
- package/driver/disposition-tool.mjs +4 -4
- package/driver/disposition-union.mjs +2 -2
- package/driver/doc-constants.mjs +1 -1
- package/driver/door-gates.mjs +2 -2
- package/driver/doubt-selection.mjs +2 -2
- package/driver/drainer-identity.mjs +1 -1
- package/driver/driver.config.mjs +63 -11
- package/driver/e2e-rounds.mjs +2 -2
- package/driver/effort-model.mjs +2 -2
- package/driver/engine/anthropic-agent.mjs +24 -24
- package/driver/engine/auth.mjs +1 -1
- package/driver/engine/common.mjs +1 -1
- package/driver/engine/deny-authority-write.mjs +1 -1
- package/driver/engine/jx-turn.mjs +1 -1
- package/driver/engine/mcp/clarivate-server.mjs +1 -1
- package/driver/engine/mcp/corsearch-server.mjs +1 -1
- package/driver/engine/mcp/declination-server.mjs +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +1 -1
- package/driver/engine/mcp/euipo-server.mjs +1 -1
- package/driver/engine/mcp/fetch-server.mjs +1 -1
- package/driver/engine/mcp/free-tier-server.mjs +2 -2
- package/driver/engine/mcp/gather-config.mjs +11 -11
- package/driver/engine/mcp/perplexity-server.mjs +1 -1
- package/driver/engine/mcp/recording-server.mjs +8 -4
- package/driver/engine/mcp/signa-server.mjs +1 -1
- package/driver/engine/mcp/uspto-local-server.mjs +1 -1
- package/driver/engine/openai-agent.mjs +2 -2
- package/driver/engine-build.mjs +2 -2
- package/driver/enqueue-schema.mjs +2 -2
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/findings-model.mjs +8 -8
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +1 -1
- package/driver/gateway.mjs +28 -23
- package/driver/grounds-grammar.mjs +1 -1
- package/driver/hit-list.mjs +1 -1
- package/driver/jurisdiction-systems.mjs +1 -1
- package/driver/jx-lanes.mjs +1 -1
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +3 -3
- package/driver/knockout-assess-record.mjs +5 -1
- package/driver/narrative-refutation-record.mjs +3 -3
- package/driver/numeric-setting.mjs +1 -1
- package/driver/owner-use-check.mjs +184 -0
- package/driver/package.json +2 -2
- package/driver/phase0.mjs +1 -1
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +215 -63
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +2 -2
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +6 -6
- package/driver/portal-service.mjs +15 -15
- package/driver/predelivery-lint.mjs +29 -11
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +1 -1
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +2 -2
- package/driver/profiles.mjs +1 -1
- package/driver/progress.mjs +6 -6
- package/driver/provider-usage.mjs +1 -1
- package/driver/publish/demo-marking.mjs +1 -1
- package/driver/publish/index.mjs +47 -6
- package/driver/publish/knockout.mjs +36 -14
- package/driver/publish/parse.mjs +4 -4
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/register-presence.mjs +1 -1
- package/driver/publish/render-knockout.mjs +198 -31
- package/driver/publish/report-data.mjs +13 -3
- package/driver/publish/seed-pool.mjs +24 -9
- package/driver/queue-watch-probe.mjs +1 -1
- package/driver/queue-watch-verdict.mjs +1 -1
- package/driver/recall-reconciliation.mjs +1 -1
- package/driver/recipe-service.mjs +1 -1
- package/driver/record-carry.mjs +141 -2
- package/driver/recording-agreement.mjs +3 -3
- package/driver/reference-score.mjs +59 -9
- package/driver/reference-strip-signatures.mjs +68 -0
- package/driver/refusal-bound.mjs +3 -3
- package/driver/register-availability.mjs +2 -2
- package/driver/register-count.mjs +1 -1
- package/driver/register-digest-record.mjs +31 -1
- package/driver/register-grant-vocabulary.mjs +2 -2
- package/driver/register-plan.mjs +8 -8
- package/driver/register-records.mjs +2 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/remedy-accounting.mjs +1 -1
- package/driver/repair-composers.mjs +2 -2
- package/driver/repair-digest.mjs +3 -3
- package/driver/repairs.mjs +7 -7
- package/driver/replay-archive.mjs +2 -0
- package/driver/report-card-record.mjs +2 -2
- package/driver/result-noun-fields.mjs +10 -3
- package/driver/run-economics.mjs +2 -2
- package/driver/run-integrity.mjs +1 -1
- package/driver/runner.mjs +22 -22
- package/driver/scope-rules.mjs +1 -1
- package/driver/search-policy.mjs +3 -3
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +1 -1
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +10 -4
- package/driver/skills/prelim-search/SKILL.md +2 -2
- package/driver/skills/prelim-search/template-formatting.md +1 -1
- package/driver/skills/prelim-search/templates/email/generic.md +1 -1
- package/driver/skills/prelim-search/worked-examples.md +1 -1
- package/driver/skills/prelim-variants/SKILL.md +2 -2
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +97 -40
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +188 -44
- package/driver/synthesis-record.mjs +1 -1
- package/driver/systemd/clearotron-client-mcp.service +1 -1
- package/driver/systemd/clearotron-portal.service +1 -1
- package/driver/systemd/render-units.mjs +1 -1
- package/driver/tokens.mjs +1 -1
- package/driver/tool-calls.mjs +1 -1
- package/driver/turnaround-bands.mjs +1 -1
- package/driver/unit-file-drift.mjs +1 -1
- package/driver/unit-inventory.mjs +121 -61
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +14 -14
- package/driver/whatif-memo-run.mjs +46 -5
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/mcp-server/CHANGELOG.md +12 -0
- package/mcp-server/README.md +3 -3
- package/mcp-server/http-server.mjs +44 -1
- package/mcp-server/key-socket.mjs +184 -0
- package/mcp-server/lib/audit-view.mjs +69 -2
- package/mcp-server/lib/brief.mjs +15 -0
- package/mcp-server/lib/driver.mjs +7 -1
- package/mcp-server/lib/events.mjs +1 -1
- package/mcp-server/lib/http-handler.mjs +1 -1
- package/mcp-server/lib/knockout.mjs +435 -0
- package/mcp-server/lib/ops.mjs +4 -4
- package/mcp-server/lib/options.mjs +1 -1
- package/mcp-server/lib/plan.mjs +1 -1
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/scrub.mjs +1 -1
- package/mcp-server/lib/whatif.mjs +12 -3
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/server.mjs +76 -11
- package/package.json +3 -3
- package/portal-ui/package.json +1 -1
- package/providers/_shared/enumerate.mjs +1 -1
- package/providers/_shared/ledger-path.mjs +3 -3
- package/providers/_shared/ledger.mjs +1 -1
- package/providers/_shared/result-shape.mjs +3 -3
- package/providers/_shared/term-shape.mjs +1 -1
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +12 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/ai-page-render-check.mjs +2 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +3 -3
- package/scripts/clearances-render-check.mjs +4 -3
- package/scripts/compare.mjs +2 -2
- package/scripts/composer-render-check.mjs +6 -6
- package/scripts/contract-dictation-scan.mjs +2 -2
- package/scripts/dead-names.mjs +1 -1
- package/scripts/drain-preflight.mjs +5 -5
- package/scripts/e2e-unread-terminals.mjs +1 -1
- package/scripts/e2e.mjs +8 -8
- package/scripts/env-audit.mjs +27 -7
- package/scripts/env-classify.mjs +139 -15
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +274 -0
- package/scripts/home-render-check.mjs +3 -2
- package/scripts/live-surface-check.mjs +92 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-reference-strip-backlog.mjs +41 -0
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -1
- package/scripts/portal-lifecycle-check.mjs +3 -3
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +101 -11
- package/scripts/release-version-pr-checks.mjs +26 -2
- package/scripts/release-version.mjs +2 -2
- package/scripts/render-check.mjs +66 -7
- package/scripts/report-frame-check.mjs +12 -0
- package/scripts/report-screenshot.mjs +62 -2
- package/scripts/revisit-render-check.mjs +3 -2
- package/scripts/score.mjs +18 -4
- package/scripts/strip-tracker-citations.mjs +116 -0
- package/scripts/test-run.mjs +3 -3
- package/scripts/third-party-notices.mjs +3 -3
- package/scripts/travelling-predicates.mjs +3 -3
- package/scripts/unexecuted-asserts.mjs +2 -2
- package/scripts/verify-publishable.mjs +2 -2
- package/scripts/write-up-form-census.mjs +1 -1
- package/shared/access-audience.mjs +215 -0
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +0 -48
- package/shared/env-local.mjs +1 -1
- package/shared/identifier-scan.mjs +3 -3
- package/shared/invocation.mjs +1 -1
- package/shared/names-in-force.mjs +2 -0
- package/shared/product-owned-names.mjs +1 -1
- package/shared/register-selection.mjs +1 -1
- package/shared/scope.mjs +5 -5
- package/shared/server-units.mjs +4 -4
- package/shared/store-in-repo.mjs +2 -2
- package/shared/suite-census.mjs +4 -4
- package/shared/tracked-files.mjs +31 -0
- package/shared/tty-style.mjs +1 -1
- package/shared/uspto-index-size.mjs +1 -1
- package/shared/vacuous-pass.mjs +1 -1
- package/skills/clearotron-account/SKILL.md +42 -13
- package/driver/systemd/prelim-driver.path +0 -69
- package/driver/systemd/prelim-driver.service +0 -86
- package/driver/systemd/prelim-driver.timer +0 -14
- package/driver/systemd/prelim-outbox.path +0 -27
- package/driver/systemd/prelim-outbox.service +0 -37
- package/driver/systemd/prelim-outbox.timer +0 -21
- package/node_modules/exceljs/README_zh.md +0 -2878
- package/node_modules/exceljs/dist/LICENSE +0 -22
- package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
- package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
- package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
- package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
- package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
- package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
- package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
- package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
- package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
- package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
- package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
- package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
- package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
- package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
- package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
- package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
- package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
- package/node_modules/exceljs/dist/es5/index.js +0 -15
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
- package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
- package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
- package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
- package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
- package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
- package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
- package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
- package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.js +0 -59900
- package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
- package/node_modules/exceljs/dist/exceljs.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
- 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
|
|
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
|
|
303
|
-
if (
|
|
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
|
-
|
|
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,
|
package/driver/whatif-queue.mjs
CHANGED
|
@@ -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 (
|
|
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
|
package/driver/whatif-worker.mjs
CHANGED
|
@@ -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
|
|
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) {
|
package/mcp-server/CHANGELOG.md
CHANGED
package/mcp-server/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# trademark-artifacts-mcp
|
|
2
2
|
|
|
3
|
-
An MCP server to **interrogate
|
|
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 `
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
package/mcp-server/lib/brief.mjs
CHANGED
|
@@ -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
|
|
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
|
-
//
|
|
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.
|