clearotron 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +82 -1
- package/.nvmrc +1 -1
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +64 -58
- package/README.md +11 -16
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +26 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +31 -11
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +252 -136
- package/bin/start.mjs +176 -33
- 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/demo/full-country-search/run/_driver/framework.json +1 -1
- package/demo/global-preliminary-search/run/_driver/framework.json +1 -1
- package/demo/knockout-search/run/_driver/framework.json +1 -1
- package/demo/multi-country-focus-search/run/_driver/framework.json +1 -1
- package/docs/DELIVERY.md +6 -2
- package/docs/E2E.md +5 -5
- package/docs/PORTAL.md +2 -2
- package/docs/README.md +5 -4
- package/docs/SECURITY.md +17 -0
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +8 -3
- package/docs/architecture/05-config-governance.md +52 -5
- package/docs/architecture/05-customer-profiles.md +2 -2
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/configuration.md +4 -3
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +121 -1
- package/driver/README.md +2 -2
- package/driver/ask-ledger.mjs +3 -3
- 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 +2 -2
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/config-staleness.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 +3 -3
- 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 +64 -12
- 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/cli-version.mjs +103 -0
- 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 +10 -10
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/feedback-store.mjs +1 -1
- package/driver/findings-model.mjs +60 -10
- package/driver/flag-snapshot.mjs +20 -0
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +2 -2
- package/driver/gateway.mjs +45 -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 +4 -4
- package/driver/party-facts.mjs +2 -2
- package/driver/phase0.mjs +2 -2
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +180 -67
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/plain-register.mjs +120 -0
- package/driver/portal-access.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +42 -3
- package/driver/portal-families.mjs +1 -1
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +7 -7
- package/driver/portal-service.mjs +41 -22
- package/driver/portal-upstream.mjs +2 -2
- package/driver/predelivery-lint.mjs +149 -11
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +11 -3
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +6 -6
- package/driver/profiles/README.md +3 -3
- package/driver/profiles.mjs +145 -13
- 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 +49 -8
- package/driver/publish/knockout.mjs +42 -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 +646 -144
- package/driver/publish/render.mjs +2 -2
- package/driver/publish/report-data.mjs +13 -3
- 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 +5 -5
- package/driver/recording-agreement.mjs +3 -3
- package/driver/reference-score.mjs +7 -7
- package/driver/reference-strip-signatures.mjs +20 -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-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 +6 -6
- 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 +5 -5
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +2 -2
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +94 -4
- package/driver/skills/matter-frame/SKILL.md +6 -6
- package/driver/skills/matter-frame/watchlist-reference.md +2 -2
- package/driver/skills/prelim-common-law/SKILL.md +1 -1
- package/driver/skills/prelim-search/SKILL.md +3 -3
- package/driver/skills/prelim-search/report-prose.md +82 -0
- package/driver/skills/prelim-search/risk-framework-demo.manifest.json +1 -1
- package/driver/skills/prelim-search/risk-framework-triage.manifest.json +1 -1
- package/driver/skills/prelim-search/risk-framework.manifest.json +1 -1
- package/driver/skills/prelim-search/synthesis-rules.md +1 -1
- 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 +5 -5
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +101 -44
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +275 -65
- 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 +297 -80
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +13 -13
- package/driver/whatif-memo-run.mjs +72 -9
- package/driver/whatif-memo.mjs +19 -1
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/examples/README.md +2 -2
- package/examples/grants.example.json +6 -7
- package/mcp-server/CHANGELOG.md +6 -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 +2 -2
- package/mcp-server/lib/whatif.mjs +5 -5
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/packs/ops/EXAMPLES.md +2 -2
- package/mcp-server/server.mjs +77 -12
- package/package.json +30 -12
- package/portal-ui/dist/assets/{index-Ct3iQtZ2.css → index-1ziUJX1E.css} +43 -2
- package/portal-ui/dist/assets/{index-BUGgiYtF.js → index-CEYvXdqH.js} +226 -49
- package/portal-ui/dist/index.html +2 -2
- 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 +2 -2
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +6 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/providers/uspto-local/src/index-store.js +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +124 -5
- package/scripts/compare.mjs +2 -2
- 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 +7 -7
- package/scripts/env-classify.mjs +206 -18
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +51 -2
- package/scripts/live-surface-check.mjs +129 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -3
- package/scripts/preinstall-node-check.mjs +24 -0
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +6 -4
- package/scripts/release-version-pr-checks.mjs +1 -1
- package/scripts/release-version.mjs +2 -2
- package/scripts/render-check.mjs +66 -7
- package/scripts/report-frame-check.mjs +1 -1
- package/scripts/report-screenshot.mjs +1 -1
- package/scripts/revisit-render-check.mjs +1 -1
- package/scripts/score.mjs +4 -4
- package/scripts/strip-tracker-citations.mjs +139 -0
- package/scripts/test-run.mjs +19 -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 +1 -1
- package/shared/anon-overlay.mjs +3 -3
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/customer-store.mjs +1 -1
- 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 +29 -1
- package/shared/names-in-force.mjs +4 -0
- package/shared/node-floor.mjs +97 -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/staff-domain.mjs +154 -0
- package/shared/store-in-repo.mjs +25 -4
- package/shared/suite-census.mjs +4 -4
- 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/skills/clearotron-ops/SKILL.md +1 -1
- package/driver/recipes/README.md +0 -49
- package/driver/skills/prelim-search/risk-framework-aurora.manifest.json +0 -19
- package/driver/skills/prelim-search/risk-framework-aurora.md +0 -77
- package/driver/skills/prelim-search/risk-framework-zephyr.manifest.json +0 -14
- package/driver/skills/prelim-search/risk-framework-zephyr.md +0 -33
- package/driver/skills/prelim-search/worked-examples-aurora.md +0 -10
- package/driver/skills/prelim-search/worked-examples-zephyr.md +0 -10
- 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/ai-page-render-check.mjs +0 -532
- package/scripts/clearances-render-check.mjs +0 -480
- package/scripts/composer-render-check.mjs +0 -1027
- package/scripts/deploy-test.sh +0 -309
- package/scripts/home-render-check.mjs +0 -526
- package/scripts/portal-lifecycle-check.mjs +0 -639
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
//
|
|
15
15
|
// Anything that is neither `active` nor `inactive` is a fault. `prelim-driver` is a `Type=oneshot` fired
|
|
16
16
|
// by a 90-second timer, so EVERY drain passes through `activating` — and `activating` landed in that
|
|
17
|
-
// list. The filter tolerated the oneshot at rest and failed it for working.
|
|
18
|
-
//
|
|
19
|
-
//
|
|
17
|
+
// list. The filter tolerated the oneshot at rest and failed it for working. The hourly test-instance
|
|
18
|
+
// deploy gates on this script's exit code, so a deploy that happened to land inside a drain window
|
|
19
|
+
// reported the instance unhealthy and exited 1 on a deployment that was fine.
|
|
20
20
|
//
|
|
21
21
|
// The bug is not the enumeration — was right to give this three outcomes instead of two. The bug is
|
|
22
22
|
// INVERSE ENUMERATION over an incomplete vocabulary: listing the two states you have seen and calling
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
// The ruling on says "starting and stopping are both tolerated for a one-shot". That is descriptive
|
|
40
40
|
// of the case that was observed, not a restriction: the issue's own Scope section carries no unit-type
|
|
41
41
|
// qualifier, the arm has never been unit-type-aware, and it already tolerates `inactive` for everything.
|
|
42
|
-
// It is also the wrong place to draw the line — deploy
|
|
42
|
+
// It is also the wrong place to draw the line — the hourly deploy RESTARTS the long-running services
|
|
43
43
|
// immediately before running this check, so `trademark-portal=activating` is the same race with a
|
|
44
44
|
// different unit, and a oneshot-only fix would leave it standing. The unit's Type is still carried into
|
|
45
45
|
// the message so a reader can tell a oneshot mid-fire from a service mid-restart.
|
|
@@ -56,16 +56,16 @@
|
|
|
56
56
|
//
|
|
57
57
|
// ── what this module deliberately does NOT touch: the zero-check ────────────────────────────────
|
|
58
58
|
//
|
|
59
|
-
//
|
|
60
|
-
// the only branch whose behaviour changes.
|
|
59
|
+
// That Scope is one paragraph and it names one thing — the state vocabulary. So the FAULT branch is
|
|
60
|
+
// the only branch whose behaviour changes. That separate guard, "0 active is not a pass", keeps
|
|
61
61
|
// origin/main's predicate (`ActiveState === "active"`, literally) and origin/main's message.
|
|
62
62
|
//
|
|
63
63
|
// This is not caution for its own sake. An earlier draft of this fix also widened the count to treat
|
|
64
64
|
// transitional units as up, on the reasoning that a oneshot mid-fire is "not nothing". The consequence:
|
|
65
65
|
// {5 services activating, 3 inactive} returned `pass` with a message that began "0 active" — a green
|
|
66
|
-
// tick on the deploy's final gate having confirmed that ZERO services were running. deploy
|
|
66
|
+
// tick on the deploy's final gate having confirmed that ZERO services were running. The hourly deploy
|
|
67
67
|
// restarts the long-running services immediately before running this check, so that is the ordinary
|
|
68
|
-
// shape of the
|
|
68
|
+
// shape of the instance, not a corner. Widening a count to make a message read better is how a guard dies.
|
|
69
69
|
|
|
70
70
|
/** The six documented ActiveState values of systemd 255, mapped to what the check must do about them. */
|
|
71
71
|
export const ACTIVE_STATE_MEANING = Object.freeze({
|
|
@@ -134,19 +134,27 @@ export function unitsActiveVerdict({ units, probe }) {
|
|
|
134
134
|
// CHANGES NOTHING HERE. The count below is origin/main's, predicate and message unchanged:
|
|
135
135
|
// `active`, literally, and nothing else. An earlier draft of this fix widened it to count
|
|
136
136
|
// transitional units as up, which defeated this guard outright — {5 activating, 3 inactive} then
|
|
137
|
-
// returned `pass` with a message that began "0 active", on the deploy's FINAL gate, on
|
|
138
|
-
// deploy
|
|
137
|
+
// returned `pass` with a message that began "0 active", on the deploy's FINAL gate, on an instance
|
|
138
|
+
// where the hourly deploy has just restarted every long-running service. Scope names one thing, the
|
|
139
139
|
// state vocabulary of the FAULT branch above. Transitional units are named in the messages here so
|
|
140
140
|
// they are never swallowed; they are counted as up nowhere.
|
|
141
|
+
// A unit this inventory declares can be absent from THIS box for a legitimate reason: the inventory
|
|
142
|
+
// spans prod and test, so on the test box every prod-only entry reports `LoadState=not-found`. So the
|
|
143
|
+
// count is INFORMATION in the message and never a verdict of its own — a warn here would fire on every
|
|
144
|
+
// run of the test box and be ignored by the second week. The finding that matters is the mirror of it
|
|
145
|
+
// and lives in unitInventoryVerdict: a unit RUNNING here whose entry claims it runs on no box.
|
|
146
|
+
const absentHere = (units ?? []).filter((u) => u.load === "not-found").length;
|
|
147
|
+
const notHere = absentHere ? `; ${absentHere} declared unit(s) do not exist on this box` : "";
|
|
148
|
+
|
|
141
149
|
const activeCount = (units ?? []).filter((u) => u.active === "active").length;
|
|
142
150
|
const alsoSeen = (by.transitional.length ? `; ${by.transitional.length} starting or stopping — ${by.transitional.map(label).join(", ")}` : "")
|
|
143
151
|
+ (by["at-rest"].length ? `; ${by["at-rest"].length} at rest` : "");
|
|
144
152
|
|
|
145
153
|
if (activeCount === 0)
|
|
146
154
|
return { state: "skip", message: "systemd --user answered and reported 0 active units — nothing was probed, "
|
|
147
|
-
+ `which is not the same as nothing being wrong${alsoSeen}` };
|
|
155
|
+
+ `which is not the same as nothing being wrong${alsoSeen}${notHere}` };
|
|
148
156
|
|
|
149
|
-
return { state: "pass", message: `${activeCount} active`
|
|
157
|
+
return { state: "pass", message: `${activeCount} active${notHere}`
|
|
150
158
|
+ (by.transitional.length ? `; ${by.transitional.length} starting or stopping — ${by.transitional.map(label).join(", ")}, which is a unit doing its job, not a fault` : "")
|
|
151
159
|
+ (by["at-rest"].length ? `; ${by["at-rest"].length} at rest` : "") };
|
|
152
160
|
}
|
|
@@ -442,7 +442,7 @@ export const validators = {
|
|
|
442
442
|
// — the register reads and the per-finding weighed lists, both joined to the store.
|
|
443
443
|
if (m.registerReads !== undefined && m.registerReads !== null) {
|
|
444
444
|
if (!Array.isArray(m.registerReads))
|
|
445
|
-
return { ok: false, reason: `mark "${m.name}": registerReads must be an ARRAY of { recordId, read } rows, or omitted entirely` };
|
|
445
|
+
return { ok: false, reason: `mark "${m.name}": registerReads must be an ARRAY of { recordId, read, band? } rows, or omitted entirely` };
|
|
446
446
|
const held = registerRecordIdsFor(runDir, m.name);
|
|
447
447
|
for (const row of m.registerReads) {
|
|
448
448
|
const id = String(row?.recordId ?? "").trim();
|
|
@@ -451,6 +451,14 @@ export const validators = {
|
|
|
451
451
|
if (!read) return { ok: false, reason: `mark "${m.name}": registerReads row "${id}" has an empty read. Omit the row rather than sending an empty one: a filing with no read keeps the card's neutral line, which is true` };
|
|
452
452
|
if (!held.has(id))
|
|
453
453
|
return { ok: false, reason: `mark "${m.name}": registerReads cites "${id}", which is not a record this run holds for that mark. The id must be copied from the filings you were handed — the driver joins it against the store and never takes your word for it` };
|
|
454
|
+
// The band is OPTIONAL and, when present, is the same closed vocabulary the mark's own rating
|
|
455
|
+
// uses — the card prints it as this filing's rating, so a word outside the frozen ladder would
|
|
456
|
+
// put a chip on the page in a dialect the framework does not define. Absence stays free: a read
|
|
457
|
+
// with no band prints the read and no chip, which is what every run before this one produced.
|
|
458
|
+
if (row?.band != null && String(row.band).trim()) {
|
|
459
|
+
if (ladder.length && bandIdx(ladder, row.band) < 0)
|
|
460
|
+
return { ok: false, reason: `knockout_band_unknown:${m.name}: registerReads row "${id}" carries band "${row.band}", which is not in the frozen ladder (${ladder.join(" / ")}) — rate the filing in the framework's own vocabulary, or omit the band and let the read stand alone` };
|
|
461
|
+
}
|
|
454
462
|
}
|
|
455
463
|
}
|
|
456
464
|
for (const f of (Array.isArray(m.findings) ? m.findings : [])) {
|
|
@@ -490,7 +498,7 @@ export const validators = {
|
|
|
490
498
|
// THE TYPED RECORD. findings-model.mjs owns the shape; this is where it becomes a GATE.
|
|
491
499
|
// Unconditional — no shape sniffing: this validator only ever reads a chunk THIS run's assess turn
|
|
492
500
|
// just wrote, so a "looks like the old shape, validate it loosely" arm could only ever be a way to
|
|
493
|
-
// skip the check. A resumed run holding a pre- chunk file fails here and re-asks the turn
|
|
501
|
+
// skip the check. A resumed run holding a pre-change chunk file fails here and re-asks the turn
|
|
494
502
|
// (pipeline-knockout.mjs koStage logs stage-stale and re-runs), which is the correct outcome: the
|
|
495
503
|
// report renders `net`/`basis`/`evidence[]` and a prose row cannot fill them.
|
|
496
504
|
//
|
package/driver/verify.mjs
CHANGED
|
@@ -61,7 +61,7 @@ function readRunProfile(p) {
|
|
|
61
61
|
|
|
62
62
|
// ── doc 50: the run-scoped FROZEN framework manifest ────────────────────────────────────────────────
|
|
63
63
|
// _driver/framework.json is the framework-in-force's manifest, frozen beside profile.json at
|
|
64
|
-
// attachProfile time — the band vocabulary every v4 gate joins against (
|
|
64
|
+
// attachProfile time — the band vocabulary every v4 gate joins against (a customer ladder's "Medium" vs house
|
|
65
65
|
// "Moderate" stays consistent within a run and across resume). Same walk-up + fail-closed convention as
|
|
66
66
|
// readRunProfile: absent ⇒ null (archived/legacy runs); unreadable ⇒ invalid (driver-written, so a
|
|
67
67
|
// corrupt one is a bug that must surface, never a silent downgrade to the wrong vocabulary).
|
|
@@ -146,7 +146,7 @@ function nonEmpty(content, min = MIN) {
|
|
|
146
146
|
* The obvious fix — emit the failing marker INSTEAD of the label — silently breaks the corrective hints.
|
|
147
147
|
* `correctionHint` branches on the label text (`gateway.mjs:2181` on `findings+ledger`, `:2188` on
|
|
148
148
|
* `negative-results|coverage-ledger|audit-trail|findings-heading`), so a renamed token would fall through
|
|
149
|
-
* to a generic hint.
|
|
149
|
+
* to a generic hint. That comment records that arm being removed once already on a reading that was
|
|
150
150
|
* true for only one lane, and put back. Appending keeps every existing matcher matching — they all test
|
|
151
151
|
* substrings — and gives the seat the one word it was missing.
|
|
152
152
|
*
|
|
@@ -289,7 +289,7 @@ const COMMONLAW_UNAVAILABLE_RE = /(perplexity|marketplace research|common.?law (
|
|
|
289
289
|
// Deliberately NOT done: loosening the honesty vocabulary. The prose is correct and stays.
|
|
290
290
|
//
|
|
291
291
|
// Driver-bug tokens are never masked. `half_path_unrecognized` says the DRIVER called this validator
|
|
292
|
-
// with a path it does not own; "write NO findings file" is the wrong remedy for that, and pre- the
|
|
292
|
+
// with a path it does not own; "write NO findings file" is the wrong remedy for that, and pre-change the
|
|
293
293
|
// path guard returned before the regex was ever reached. Keep it that way.
|
|
294
294
|
const VETO_NEVER_MASKS = new Set(["half_path_unrecognized"]);
|
|
295
295
|
|
|
@@ -651,7 +651,7 @@ export function parseVerdict(content) {
|
|
|
651
651
|
* `UPSTREAM_STALE_REPAIR["narrative-refutation"]` re-runs the reviewer at DELIVERY time, long after the
|
|
652
652
|
* verdict gate. Its caller re-reads what the repaired stage wrote — findings.json, the case-law layer —
|
|
653
653
|
* but not `senior-eye-review.md`, which is the one artifact that stage authors. So the reviewer could
|
|
654
|
-
* refuse to sign at 00:52 and the run would deliver on the verdict it settled at 00:22 (
|
|
654
|
+
* refuse to sign at 00:52 and the run would deliver on the verdict it settled at 00:22 (
|
|
655
655
|
* `bf21580e`, 2026-08-23: a registration date contradicting the fetched record reached the client).
|
|
656
656
|
*
|
|
657
657
|
* ONE DIRECTION ONLY, and that is deliberate. This returns the file's verdict when it is STRICTER than
|
|
@@ -683,7 +683,7 @@ export function verdictHardenedTo(carried, reviewMd) {
|
|
|
683
683
|
// The two guards must not share a POLICY and they still do not: what separates them is which sections
|
|
684
684
|
// they read, and whether a bullet under a flag is that flag's body. Whether a line is a list item at
|
|
685
685
|
// all is NOT policy — and while each walk carried its own copy of that answer, the copies drifted.
|
|
686
|
-
// taught one of them to see `**1.` and left the other on the pre- pattern, so the walk whose
|
|
686
|
+
// taught one of them to see `**1.` and left the other on the pre-change pattern, so the walk whose
|
|
687
687
|
// job is to decide whether to DISCARD a review quietly became the stricter of the two.
|
|
688
688
|
//
|
|
689
689
|
// Restating the marker in a second place is what made that possible, so it is stated once here. Both
|
|
@@ -692,7 +692,7 @@ export function verdictHardenedTo(carried, reviewMd) {
|
|
|
692
692
|
// The trailing `\*{0,2}` is the bold CLOSER: reviewers write both `**1. [kind: …]** text` (bold around
|
|
693
693
|
// the marker and its tokens) and `**1.** text` (bold around the marker alone). The second counted ZERO
|
|
694
694
|
// on both walks — consistently, so it is not the asymmetry above, but it is the same defect wearing a
|
|
695
|
-
// different style, and
|
|
695
|
+
// different style, and the criterion says a bold-numbered flag must count. It cannot swallow prose:
|
|
696
696
|
// a single letter or digit must still be followed by its own `.` or `)`, so `**Note.** …` matches nothing.
|
|
697
697
|
const LIST_MARKER = String.raw`(?:\*{0,2})(?:[-*•]|\d+[.)]|[A-Za-z][.)])(?:\*{0,2})\s+`;
|
|
698
698
|
const LIST_LINE_RE = new RegExp(`^${LIST_MARKER}\\S`);
|
|
@@ -819,7 +819,7 @@ function parseOn(line) {
|
|
|
819
819
|
// deferrals`, `Headline, re-derived independently`, `Grounded profiles` and the plan audit.
|
|
820
820
|
//
|
|
821
821
|
// THE HEADLESS FALLBACK IS DELIBERATE AND IT IS NOT A DENYLIST IN DISGUISE. A review with NO corrections
|
|
822
|
-
// heading anywhere still has corrections —
|
|
822
|
+
// heading anywhere still has corrections — the fixture is exactly that, and the writes them under
|
|
823
823
|
// `## Corrections`. So: if the document names a corrections section, ONLY that section is read; if it
|
|
824
824
|
// names none, the whole document is read as before. The fallback cannot reopen this defect, because it
|
|
825
825
|
// only applies to documents that have no section structure to get wrong.
|
|
@@ -840,7 +840,7 @@ export const NOT_A_CORRECTIONS_SECTION_RE =
|
|
|
840
840
|
//
|
|
841
841
|
// THE FAILURE IS SILENT IN THE WORST DIRECTION. An unreadable flag does not error — it is simply not
|
|
842
842
|
// there, and every downstream count agrees with itself about a document it never read. Both directions
|
|
843
|
-
// of
|
|
843
|
+
// of the lesson apply at the LINE level too: too permissive publishes noise as grounds, too strict
|
|
844
844
|
// drops the grounds entirely.
|
|
845
845
|
//
|
|
846
846
|
// SCOPE OF THE WIDENING, MEASURED RATHER THAN ASSUMED. Across the 28 distinct reviews on both scratch
|
|
@@ -874,7 +874,7 @@ export const opensWithKind = (content) => /^\[kind:/i.test(String(content ?? "")
|
|
|
874
874
|
* matched and the whole document was skipped". The allowlist fails closed on purpose, and a guard that
|
|
875
875
|
* fails closed silently is how a real defect reads as a clean run.
|
|
876
876
|
*
|
|
877
|
-
* `named: false` is not a fault — it is the headless document
|
|
877
|
+
* `named: false` is not a fault — it is the headless document the fixture is built from, and the walk
|
|
878
878
|
* falls back to the whole document. It is reported so a caller can tell the two apart.
|
|
879
879
|
*
|
|
880
880
|
* PURE.
|
|
@@ -918,7 +918,7 @@ export function parseCorrections(reviewMd) {
|
|
|
918
918
|
// underneath as `- "…"` bullets. Those are evidence FOR a correction, not five more corrections,
|
|
919
919
|
// and counting them is how five quoted excerpts became five of the published grounds of a BLOCKING
|
|
920
920
|
// verdict. A review that writes its flags as BULLETS never trips this — no numbered flag is ever
|
|
921
|
-
// seen, so every bullet stays a flag, which is
|
|
921
|
+
// seen, so every bullet stays a flag, which is the contract and the fail-safe both intact.
|
|
922
922
|
// ORDER MATTERS: ask "is this enumerated" FIRST. `**2. [kind: …]` begins with an asterisk, so a
|
|
923
923
|
// bullet test run before the enumerated test swallows every flag after the first as the first
|
|
924
924
|
// one's body.
|
|
@@ -1023,7 +1023,7 @@ export function findReviewerCoherenceFlags(md) {
|
|
|
1023
1023
|
// divergent arms of one requirement. They are three different contracts:
|
|
1024
1024
|
// · commonLawStructural (LIVE) — the common-law findings' prose Coverage ledger still carries these
|
|
1025
1025
|
// tokens, and this floor still polices it.
|
|
1026
|
-
// · registerFindings' UNSTAMPED arm (ARCHIVE-ONLY since M6) — judges pre- archived replays
|
|
1026
|
+
// · registerFindings' UNSTAMPED arm (ARCHIVE-ONLY since M6) — judges pre-change archived replays
|
|
1027
1027
|
// whose seats hand-wrote the prose table. No live run reaches it; replay verdicts get quoted, so
|
|
1028
1028
|
// it stays.
|
|
1029
1029
|
// · register-digest's LIVE path carries the same three tokens as VALUES through the
|
|
@@ -1957,7 +1957,7 @@ export const validators = {
|
|
|
1957
1957
|
// So the old floor and the new gate are armed by the SAME condition, and it is this one:
|
|
1958
1958
|
// stamped ⇒ the driver wrote a form, the seat was told not to write a table, and the form is the
|
|
1959
1959
|
// whole coverage judgement (below).
|
|
1960
|
-
// unstamped ⇒ every pre- check applies unchanged, and stages.mjs — reading THIS SAME STAMP —
|
|
1960
|
+
// unstamped ⇒ every pre-change check applies unchanged, and stages.mjs — reading THIS SAME STAMP —
|
|
1961
1961
|
// tells the seat to write the prose table. The two cannot disagree about which
|
|
1962
1962
|
// document the run owes.
|
|
1963
1963
|
//
|
|
@@ -1967,7 +1967,7 @@ export const validators = {
|
|
|
1967
1967
|
// digest and before it — so NO LIVE RUN reaches here unstamped, and stages.mjs no longer has a
|
|
1968
1968
|
// second arm to tell a seat to write the prose table. The prose floor below, and the prose-era
|
|
1969
1969
|
// joins it feeds (findUnaccountedDeferredSlices, findUnverifiedIncompleteCleanClaims), are
|
|
1970
|
-
// therefore DEAD FOR LIVE RUNS and LOAD-BEARING FOR REPLAY: an archived pre- run carries no
|
|
1970
|
+
// therefore DEAD FOR LIVE RUNS and LOAD-BEARING FOR REPLAY: an archived pre-change run carries no
|
|
1971
1971
|
// stamp at all, and its coverage verdict is judged by exactly this arm.
|
|
1972
1972
|
//
|
|
1973
1973
|
// DO NOT DELETE THEM AS DEAD CODE. Removing them does not change any live run's answer; it changes
|
|
@@ -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; }
|
|
@@ -120,7 +157,7 @@ export async function seatReason({ runDir, runId, assumption, ratedUnder, findin
|
|
|
120
157
|
const replyPath = join(runDir, MEMO_DIR, `reply-${sha(`${runId}${assumption}`).slice(0, 10)}.json`);
|
|
121
158
|
mkdirSync(join(runDir, MEMO_DIR), { recursive: true });
|
|
122
159
|
const r = await dispatch("whatif-memo", {
|
|
123
|
-
message: composeMemoMessage({ assumption, findings, ratedUnder, skill }),
|
|
160
|
+
message: composeMemoMessage({ assumption, findings, ratedUnder, skill, replyPath }),
|
|
124
161
|
model,
|
|
125
162
|
// A BOUNDED READING, and the ceiling says so. This re-reads evidence already gathered; a memo that
|
|
126
163
|
// needed the clearance's own ceiling would not be the cheap thing the plan promised the reader.
|
|
@@ -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
|
|
@@ -193,7 +230,12 @@ export function validateMemoReply(raw) {
|
|
|
193
230
|
* The findings are handed over as the run's own JSON rather than summarised: a memo that reasoned over
|
|
194
231
|
* our paraphrase of the evidence would be answering about the paraphrase.
|
|
195
232
|
*/
|
|
196
|
-
|
|
233
|
+
// `ratedUnder` DEFAULTS HERE AND IS REFUSED BY `composeMemo`, and that asymmetry is only safe while the
|
|
234
|
+
// artifact is the gate. One resolution is threaded to both, and nothing reaches disk without the memo
|
|
235
|
+
// composing — so a forgotten field is caught there. It stops being safe the moment a dispatch path calls
|
|
236
|
+
// this composer alone: the seat would be instructed "house default" with no artifact refusal behind it,
|
|
237
|
+
// because no artifact would be composed. A caller that dispatches without composing owes its own check.
|
|
238
|
+
export function composeMemoMessage({ assumption, findings, ratedUnder = null, skill = "", replyPath = null } = {}) {
|
|
197
239
|
return [
|
|
198
240
|
skill.trim(),
|
|
199
241
|
"",
|
|
@@ -213,8 +255,21 @@ export function composeMemoMessage({ assumption, findings, ratedUnder = null, sk
|
|
|
213
255
|
JSON.stringify(findings ?? null, null, 2),
|
|
214
256
|
"```",
|
|
215
257
|
"",
|
|
216
|
-
|
|
217
|
-
|
|
258
|
+
// NAME THE FILE, IN THE FIRST MESSAGE. The skill says what to write and the harness was told where
|
|
259
|
+
// to look, and until this line nothing told the SEAT where to put it. A seat given a write grant and
|
|
260
|
+
// no destination writes somewhere reasonable of its own choosing — an archived run carries one such
|
|
261
|
+
// reply at its run root — and the harness then looks where it asked, does not find it, and fails the
|
|
262
|
+
// attempt on `missing_file`. The warm patch names the path, which is the whole reason the retry
|
|
263
|
+
// succeeded: the second attempt was the first one that said where.
|
|
264
|
+
//
|
|
265
|
+
// The cost of not saying it was never the failure. It was that every memo billed two dispatches for
|
|
266
|
+
// one document and left a retried stage on the parent run's ledger — an INVESTIGATE line on a report
|
|
267
|
+
// that had already been delivered clean.
|
|
268
|
+
replyPath
|
|
269
|
+
? `Write it to this ABSOLUTE path (create parent dirs if needed): ${replyPath}`
|
|
270
|
+
: "Write the JSON object the skill dictates, and nothing else.",
|
|
271
|
+
replyPath ? "Write the JSON object the skill dictates, and nothing else." : null,
|
|
272
|
+
].filter((l) => l !== null).join("\n");
|
|
218
273
|
}
|
|
219
274
|
|
|
220
275
|
/**
|
|
@@ -282,6 +337,10 @@ export async function askArchivedRun({ runId, question, requestedBy = null } = {
|
|
|
282
337
|
body: String(reading?.body ?? ""),
|
|
283
338
|
limits: Array.isArray(reading?.limits) ? reading.limits : [],
|
|
284
339
|
mark: run.markName ?? null,
|
|
340
|
+
// The authority the seat was instructed to assess under, carried to the artifact rather than ending
|
|
341
|
+
// at the return value. `parentRatedUnder` answers null for a run that froze no profile, which is a
|
|
342
|
+
// fact the memo states rather than omits.
|
|
343
|
+
ratedUnder,
|
|
285
344
|
});
|
|
286
345
|
if (!composed.ok)
|
|
287
346
|
return { ok: false, fail: MEMO_FAILS.COMPOSE_REFUSED, detail: composed.reason, missing: composed.missing };
|
|
@@ -299,10 +358,14 @@ export async function askArchivedRun({ runId, question, requestedBy = null } = {
|
|
|
299
358
|
|
|
300
359
|
// AFTER the write, deliberately: the check has to cover this call's own behaviour, not merely the
|
|
301
360
|
// reasoning pass's. If writing the memo touched the parent, that is exactly what must be caught.
|
|
302
|
-
const
|
|
303
|
-
if (
|
|
361
|
+
const { own, foreign } = splitMemoFootprint(movedArtifacts(before, digestRunDir(run.runDir)));
|
|
362
|
+
if (foreign.length)
|
|
304
363
|
return { ok: false, fail: MEMO_FAILS.PARENT_MOVED,
|
|
305
|
-
|
|
364
|
+
// NAMES WHAT IT FOUND AND WHY IT IS WRONG. "the parent's artifacts moved" was true of a correct
|
|
365
|
+
// memo too — the dispatch telemetry tripped it — so the sentence could not tell a reader whether
|
|
366
|
+
// the archive had been rewritten or the memo had merely run.
|
|
367
|
+
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(", ")}`,
|
|
368
|
+
moved: foreign, memoFootprint: own };
|
|
306
369
|
|
|
307
370
|
return {
|
|
308
371
|
ok: true,
|
package/driver/whatif-memo.mjs
CHANGED
|
@@ -43,10 +43,25 @@ export const REQUIRED = Object.freeze(["assumption", "parentRunId", "parentRepor
|
|
|
43
43
|
* needs new evidence" — it is a claim, and `limitsStated` records which claim was made rather than
|
|
44
44
|
* leaving a reader to infer it from silence.
|
|
45
45
|
*/
|
|
46
|
-
export function composeMemo({ assumption, parentRunId, parentReport, date, body, limits = [], mark = null } = {}) {
|
|
46
|
+
export function composeMemo({ assumption, parentRunId, parentReport, date, body, limits = [], mark = null, ratedUnder } = {}) {
|
|
47
47
|
const missing = REQUIRED.filter((k) => !String({ assumption, parentRunId, parentReport, date, body }[k] ?? "").trim());
|
|
48
48
|
if (missing.length) return { ok: false, missing, reason: `a memo cannot be composed without: ${missing.join(", ")}` };
|
|
49
49
|
|
|
50
|
+
// THE RATING AUTHORITY IS REQUIRED BY PRESENCE, NOT BY TRUTHINESS, because `null` is a real answer.
|
|
51
|
+
// A memo is reasoned under an authority — the seat is instructed to assess under a named framework, or
|
|
52
|
+
// told the run froze none and to stay with the house default — and until this line the only thing that
|
|
53
|
+
// reached disk was the reasoning. A lawyer may act on this document; it has to say what it was rated
|
|
54
|
+
// under.
|
|
55
|
+
//
|
|
56
|
+
// Three states, and the third is the one worth separating. A named key is one fact. The house default
|
|
57
|
+
// is a DIFFERENT fact, not an absence, and it is recorded rather than left blank. A caller that never
|
|
58
|
+
// resolved an authority at all is neither, and refusing it is the point: a memo whose artifact is
|
|
59
|
+
// silent about its authority is exactly the defect this closes, so it must not be composable.
|
|
60
|
+
if (ratedUnder === undefined)
|
|
61
|
+
return { ok: false, missing: ["ratedUnder"],
|
|
62
|
+
reason: "a memo cannot be composed without its rating authority — pass the resolved key, or null "
|
|
63
|
+
+ "for a run that froze no customer profile. Absent is not the same fact as either." };
|
|
64
|
+
|
|
50
65
|
const limitLines = limits
|
|
51
66
|
.map((l) => ({ cannot: String(l?.cannot ?? "").trim(), smallestSearch: String(l?.smallestSearch ?? "").trim() }))
|
|
52
67
|
.filter((l) => l.cannot);
|
|
@@ -64,6 +79,9 @@ export function composeMemo({ assumption, parentRunId, parentReport, date, body,
|
|
|
64
79
|
"",
|
|
65
80
|
`**Date:** ${date}`,
|
|
66
81
|
`**Derived from:** ${parentReport} (run ${parentRunId})`,
|
|
82
|
+
`**Rated under:** ${ratedUnder === null
|
|
83
|
+
? "the house default — this report's run froze no customer profile"
|
|
84
|
+
: String(ratedUnder).trim()}`,
|
|
67
85
|
"",
|
|
68
86
|
"## The assumption you asked me to apply",
|
|
69
87
|
"",
|
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/examples/README.md
CHANGED
|
@@ -26,8 +26,8 @@ surfaces as a failing test rather than as a wrong report.
|
|
|
26
26
|
(`loadGrants` in `shared/scope.mjs`) and asserted to grant what it looks like it grants — `../INSTALL.md`
|
|
27
27
|
§8 tells an installer to copy this file, and a row that silently resolves to nothing means an empty
|
|
28
28
|
world on their first sign-in. **Read it as a shape, not as a starting roster.** Most of the accounts it
|
|
29
|
-
names
|
|
30
|
-
|
|
29
|
+
names are invented and resolve to nothing on a fresh install; the one account a fresh install
|
|
30
|
+
actually has is `demo-brand-owner`. Replace the names with
|
|
31
31
|
your own accounts and keep the shapes: a tenant with every account, a tenant with one, a tenant whose
|
|
32
32
|
users see different subsets.
|
|
33
33
|
|
|
@@ -5,27 +5,26 @@
|
|
|
5
5
|
"users": {
|
|
6
6
|
"principal@firm.example": "*",
|
|
7
7
|
"associate@firm.example": [
|
|
8
|
-
"
|
|
8
|
+
"demo-brand-owner"
|
|
9
9
|
]
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
|
-
"
|
|
12
|
+
"brand-owner-direct": {
|
|
13
13
|
"accounts": [
|
|
14
|
-
"
|
|
14
|
+
"demo-brand-owner"
|
|
15
15
|
],
|
|
16
16
|
"users": {
|
|
17
|
-
"*@
|
|
17
|
+
"*@brand-owner.example": "*"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"evaluation": {
|
|
21
21
|
"accounts": [
|
|
22
|
-
"
|
|
23
|
-
"petcary"
|
|
22
|
+
"demo-brand-owner"
|
|
24
23
|
],
|
|
25
24
|
"users": {
|
|
26
25
|
"reviewer@partner.example": "*",
|
|
27
26
|
"observer@partner.example": [
|
|
28
|
-
"
|
|
27
|
+
"demo-brand-owner"
|
|
29
28
|
]
|
|
30
29
|
}
|
|
31
30
|
},
|
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
|
}
|