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
package/bin/start.mjs
CHANGED
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
// long-lived engine credential is written to disk by a command whose job is to show you the product.
|
|
76
76
|
|
|
77
77
|
import { envLocalPath, envFileRead } from "../shared/env-local.mjs"; // side effect: apply this install's .env when THIS file is the CLI entry (never on library import)
|
|
78
|
-
import { systemdFailure, systemdSaid, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; //
|
|
78
|
+
import { systemdFailure, systemdSaid, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; // a refusal, not a stack trace
|
|
79
79
|
import { writeSecretFile } from "../shared/secret-file.mjs"; // one atomic write for every file holding credentials, and it creates the directory
|
|
80
80
|
// — ONE AUTHORITY for what a clearance needs from its environment, used twice
|
|
81
81
|
// below: to COMPOSE the units' environment and to GUARD it before this command reports success. The
|
|
@@ -129,7 +129,10 @@ import { isEntrypoint } from "../shared/is-entrypoint.mjs"; // — one entry-p
|
|
|
129
129
|
import { productIdentity } from "../shared/product-identity.mjs"; // AGPL §13 — one answer, three surfaces
|
|
130
130
|
import { pinEnvAll } from "../shared/env-aliases.mjs"; // — a pin that names one spelling has set nothing that wins
|
|
131
131
|
import { BRAND } from "../shared/brand.mjs"; // — the installer's own name, from the tenant seam
|
|
132
|
-
import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; //
|
|
132
|
+
import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // never serve a bundle older than its sources
|
|
133
|
+
// ONE CLASSIFIER FOR WHAT A STAFF RULE ADMITS, shared with the setup wizard. Two copies of this
|
|
134
|
+
// judgement would be a wizard that asks about one rule and a launcher that writes another.
|
|
135
|
+
import { classifyStaffDomain, staffDomainRefusal, staffGrantSentence } from "../shared/staff-domain.mjs";
|
|
133
136
|
|
|
134
137
|
const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
135
138
|
const ENV_PATH = envLocalPath({ repoRoot: REPO }); // resolved, never composed: one resolver, so moving this file later is one line
|
|
@@ -321,7 +324,7 @@ export function portsForFlag(portFlag, ports, env = {}) {
|
|
|
321
324
|
/**
|
|
322
325
|
* Where the grants file is, for a command that is NOT the supervisor.
|
|
323
326
|
*
|
|
324
|
-
* —
|
|
327
|
+
* — found in review. `start` injects CLEAROTRON_ACCESS_FILE into the environment of
|
|
325
328
|
* the services it supervises (see the child env below) and never persists it, so the door finds the
|
|
326
329
|
* roster and every sibling CLI in the operator's own shell does not. `clearotron grant` then refused
|
|
327
330
|
* with "Set CLEAROTRON_ACCESS_FILE" — a variable nothing writes — and enrolling a client had no working
|
|
@@ -366,6 +369,11 @@ export function installPaths(base) {
|
|
|
366
369
|
};
|
|
367
370
|
}
|
|
368
371
|
|
|
372
|
+
/** A staff rule this command will not build. Carries the sentence the operator reads, and why. */
|
|
373
|
+
export class StaffDomainRefused extends Error {
|
|
374
|
+
constructor(domain, message) { super(message); this.name = "StaffDomainRefused"; this.domain = domain; }
|
|
375
|
+
}
|
|
376
|
+
|
|
369
377
|
/**
|
|
370
378
|
* The one address that signs in, and the staff domain derived from it.
|
|
371
379
|
*
|
|
@@ -374,10 +382,61 @@ export function installPaths(base) {
|
|
|
374
382
|
* it safe here and would not be safe on a hosted instance. Without it the sign-in succeeds and every
|
|
375
383
|
* page 403s, because signing in is not being enrolled (portal-access.mjs decides that, and it is
|
|
376
384
|
* deliberately blind to which door you came through).
|
|
385
|
+
*
|
|
386
|
+
* ── AND THAT PARAGRAPH IS ONLY TRUE OF `<account>@localhost` ─────────────────────────────────────────
|
|
387
|
+
*
|
|
388
|
+
* "admits exactly that address and nobody else" is a property of the DOMAIN, not of the mode. It holds
|
|
389
|
+
* for `localhost`. It does not hold for a domain other people have addresses at: the rule this line
|
|
390
|
+
* produces from `alex@a-firm.example-tld` says *anyone at that domain*, the settings page then reports
|
|
391
|
+
* it back in those words, and on a deployment where identity arrives from an external login system the
|
|
392
|
+
* domain is the whole of the check. Nobody was asked, and there is nothing on the box recording that a
|
|
393
|
+
* grant was made.
|
|
394
|
+
*
|
|
395
|
+
* So the derivation now refuses the domains that can never be a staff rule — a webmail provider, a
|
|
396
|
+
* documentation domain — and hands anything wider than one machine back to the caller to state and
|
|
397
|
+
* confirm. `shared/staff-domain.mjs` is the one classifier, shared with the setup wizard, so the
|
|
398
|
+
* question the wizard asks and the rule this command builds cannot drift apart.
|
|
399
|
+
*
|
|
400
|
+
* An UNPARSEABLE address still returns `""`, and that is not the same answer as a refusal: nothing was
|
|
401
|
+
* classified, so nothing was decided. The caller already refuses a non-address one line earlier.
|
|
377
402
|
*/
|
|
378
403
|
export function staffDomainFor(email) {
|
|
379
404
|
const at = String(email ?? "").lastIndexOf("@");
|
|
380
|
-
|
|
405
|
+
const domain = at > 0 ? String(email).slice(at + 1).toLowerCase() : "";
|
|
406
|
+
if (!domain) return "";
|
|
407
|
+
const refusal = staffDomainRefusal(domain);
|
|
408
|
+
if (refusal) throw new StaffDomainRefused(domain, refusal);
|
|
409
|
+
return domain;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* What to say when the derived domain is a real one — wider than this machine, and never assumed.
|
|
414
|
+
*
|
|
415
|
+
* A REFUSAL RATHER THAN A PROMPT, and the reason is that this command has no reader. `start` runs from
|
|
416
|
+
* a script, from `--background`, and from a service manager as often as from a terminal; a question
|
|
417
|
+
* asked there either hangs or is answered by whatever happens to be on stdin. Every other decision on
|
|
418
|
+
* this boundary already refuses instead — an unset access file, a multi-`@` identity, local mode off
|
|
419
|
+
* loopback — so this is the idiom the rest of the door speaks.
|
|
420
|
+
*
|
|
421
|
+
* The consent itself lives where a person is definitionally present: `clearotron install` asks for the
|
|
422
|
+
* address, shows this same sentence, and writes the answer down as an explicit `PORTAL_STAFF_DOMAINS`.
|
|
423
|
+
* After that the `||` above this call short-circuits and the derivation is never reached again.
|
|
424
|
+
*/
|
|
425
|
+
export function wideStaffDomainRefusal({ user, domain, envPath }) {
|
|
426
|
+
return `${user} would make every address at ${domain} an administrator of this install.\n`
|
|
427
|
+
+ "\n"
|
|
428
|
+
+ ` The rule that would be written is: ${staffGrantSentence(domain, { staffLabel: `${BRAND.name} staff` })}\n`
|
|
429
|
+
+ "\n"
|
|
430
|
+
+ " That is a grant to a group, and this command will not make one on your behalf. Pick the one\n"
|
|
431
|
+
+ " that is true here:\n"
|
|
432
|
+
+ "\n"
|
|
433
|
+
+ ` · only you use this machine — start without --user, or use ${String(user).slice(0, String(user).lastIndexOf("@"))}@localhost.\n`
|
|
434
|
+
+ ` The rule is then this machine and nobody else, and nothing is granted to anyone.\n`
|
|
435
|
+
+ ` · your colleagues at ${domain} should all be administrators — say so once, in writing:\n`
|
|
436
|
+
+ ` PORTAL_STAFF_DOMAINS=${domain}\n`
|
|
437
|
+
+ ` in ${envPath}, or in the environment. The settings page then names that file as where the\n`
|
|
438
|
+
+ " rule came from, so whoever reads it later can undo it.\n"
|
|
439
|
+
+ ` · run \`${invocationPrefix()}clearotron install\`, which asks for the address and this question with it.`;
|
|
381
440
|
}
|
|
382
441
|
|
|
383
442
|
/**
|
|
@@ -424,9 +483,12 @@ const unitTypeOf = (u) => {
|
|
|
424
483
|
// cost is the admission cap: counts are serial per queue while queues drain concurrently, so two
|
|
425
484
|
// claimers can overshoot a per-account cap by a bounded one per queue. A bounded overshoot is not a
|
|
426
485
|
// reason to leave a retired unit running when disarming it is one call.
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
486
|
+
// EMPTY, AND KEPT RATHER THAN DELETED. The retired path-watcher/timer units it named are gone from the
|
|
487
|
+
// tree, so naming them here would describe files this repo does not ship — which is exactly what the
|
|
488
|
+
// "every retired unit is a unit this repo actually ships" check refuses. The export stays because the
|
|
489
|
+
// next retirement wants somewhere to go, and an empty list is a statement that nothing is currently
|
|
490
|
+
// retired-but-shipped.
|
|
491
|
+
export const BACKGROUND_RETIRED = Object.freeze([]);
|
|
430
492
|
|
|
431
493
|
export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
432
494
|
// ── `clearotron-client-mcp.service` LEFT THIS TABLE ON 2026-09-03, AND SAYING SO IS THE POINT ────
|
|
@@ -436,7 +498,7 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
|
436
498
|
// that included it would have made that consent meaningless. That reasoning was right under that
|
|
437
499
|
// ruling and the exclusion was not an oversight.
|
|
438
500
|
//
|
|
439
|
-
// The owner superseded it knowingly (
|
|
501
|
+
// The owner superseded it knowingly (settled point 2): the door auto-starts with
|
|
440
502
|
// the product and the per-account key is the gate. It is now in SERVER_INSTALL_SET — which IS
|
|
441
503
|
// BACKGROUND_UNITS — and the pin/exclusion partition means it cannot be in both, so the row is gone
|
|
442
504
|
// rather than reworded. `--background` writes its settings from `enablePlan` before installing it.
|
|
@@ -447,12 +509,6 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
|
447
509
|
// because production runs them today and deleting them would remove the only tracked description of a
|
|
448
510
|
// live service. An exclusion reason is required to be a sentence, and the true sentence is that the
|
|
449
511
|
// unit is going — not that a workstation should not start it.
|
|
450
|
-
"prelim-driver.service": "RETIRED with the path-watcher/timer drain posture (owner ruling 2026-08-26, restated 2026-08-31) — clearotron-worker.service is the drain, and this file survives only until production's rebuild",
|
|
451
|
-
"prelim-driver.timer": "RETIRED with prelim-driver.service — the 90s pull the worker's --watch replaces",
|
|
452
|
-
"prelim-driver.path": "RETIRED with prelim-driver.service — the queue watcher whose glob a documented install never writes",
|
|
453
|
-
"prelim-outbox.service": "the delivery outbox drains toward real clients — a production lane, not something a workstation should start by default",
|
|
454
|
-
"prelim-outbox.path": "the outbox watcher — excluded with its service",
|
|
455
|
-
"prelim-outbox.timer": "the outbox sweep — excluded with its service",
|
|
456
512
|
"profile-service.service": "the portal constructs the profile service IN-PROCESS (driver/portal-service.mjs); the standalone unit is the separate-editor deployment shape and running both double-serves the store",
|
|
457
513
|
});
|
|
458
514
|
|
|
@@ -622,7 +678,7 @@ if (isMain) {
|
|
|
622
678
|
const argv = process.argv.slice(2);
|
|
623
679
|
const say = (s = "") => process.stdout.write(`${s}\n`);
|
|
624
680
|
const err = (s) => process.stderr.write(`${s}\n`);
|
|
625
|
-
// Flipped at the first state-changing act (
|
|
681
|
+
// Flipped at the first state-changing act (the third criterion): a refusal AFTER
|
|
626
682
|
// writes must say what survives and that re-running is safe — the reader's only question at that
|
|
627
683
|
// moment, and one the screen never answered while the writes sat above the port probe.
|
|
628
684
|
let wroteState = false;
|
|
@@ -780,6 +836,10 @@ if (isMain) {
|
|
|
780
836
|
// bound anywhere else in any mode. Sign-in is untouched — the demo signs in like any first start, and
|
|
781
837
|
// the portal mints and prints its passphrase exactly as it does for a real one.
|
|
782
838
|
const DEMO = argv.includes("--demo");
|
|
839
|
+
// THE DEMO BRINGS ITS OWN ACCOUNT. A fresh install resolves `generic` and nothing else (owner
|
|
840
|
+
// ruling, 2026-09-08), so the demo account is refused from the roster unless somebody asked for it.
|
|
841
|
+
// Asked here, once and visibly, rather than at each site that happens to read a roster.
|
|
842
|
+
if (DEMO) process.env.CLEAROTRON_DEMO_PROFILES ??= "1";
|
|
783
843
|
// ── `--port` MOVES EVERY DOOR IT OPENS (tracker issue 166) ───────────────────────────────────────
|
|
784
844
|
//
|
|
785
845
|
// It used to move ONE of the three. `resolvePorts` reads three independent variables with three
|
|
@@ -815,16 +875,47 @@ if (isMain) {
|
|
|
815
875
|
run: (cmd, args) => spawnSync(cmd, args, { cwd: REPO, stdio: "inherit", shell: process.platform === "win32" }).status ?? 1,
|
|
816
876
|
});
|
|
817
877
|
|
|
818
|
-
//
|
|
819
|
-
// the address never leaves the machine — `--user` is there for a reader who wants their real
|
|
820
|
-
// whatever is resolved here is written to `.env` so the question is never put twice.
|
|
878
|
+
// The ADDRESS is not asked for here: a local install has one user, this machine already knows their
|
|
879
|
+
// name, and the address never leaves the machine — `--user` is there for a reader who wants their real
|
|
880
|
+
// one, and whatever is resolved here is written to `.env` so the question is never put twice. What IS
|
|
881
|
+
// asked for, and used not to be, is the staff rule the address implies once it is a real one; that is
|
|
882
|
+
// the block below the address, and `clearotron install` is where the question is actually put.
|
|
821
883
|
let whoami = "user";
|
|
822
884
|
try { whoami = userInfo().username || "user"; } catch { /* a container with no passwd entry */ }
|
|
823
885
|
// In a demo the address is the demo's own and is never written anywhere: see the DEMO block above.
|
|
824
886
|
const user = String(flag("--user", DEMO ? "demo@localhost" : (process.env.PORTAL_LOCAL_USER || `${whoami}@localhost`))).trim().toLowerCase();
|
|
825
887
|
if (!user.includes("@") || user.indexOf("@") !== user.lastIndexOf("@"))
|
|
826
888
|
fatal(`--user "${user}" is not a single email address. It is the one identity that signs in here, and the portal refuses a multi-@ identity outright.`);
|
|
827
|
-
|
|
889
|
+
// ── THE STAFF RULE THIS ADDRESS IMPLIES, STATED BEFORE IT IS WRITTEN ──────────────────────────────
|
|
890
|
+
//
|
|
891
|
+
// An explicit `PORTAL_STAFF_DOMAINS` is a decision somebody already made in writing, and it wins
|
|
892
|
+
// untouched — including a domain the classifier would otherwise refuse, because an operator who
|
|
893
|
+
// typed it has said what they mean and this command does not overrule that.
|
|
894
|
+
//
|
|
895
|
+
// Absent one, the rule is DERIVED from the single address, and that derivation is the defect this
|
|
896
|
+
// block exists to close. Three outcomes:
|
|
897
|
+
//
|
|
898
|
+
// `localhost` (or any bare hostname) — one machine, no second person, nothing to ask. Silent, as
|
|
899
|
+
// it has always been. This is the default path and the only
|
|
900
|
+
// one a laptop ever reaches.
|
|
901
|
+
// a webmail or documentation domain — refused by `staffDomainFor` itself; there is no yes that
|
|
902
|
+
// makes it right.
|
|
903
|
+
// any other real domain — refused HERE, with the rule quoted in the words the
|
|
904
|
+
// settings page uses and the three ways out named.
|
|
905
|
+
//
|
|
906
|
+
// BEFORE THIS RUN CHANGES THE BOX, deliberately — it sits above the state-written divide further
|
|
907
|
+
// down, with the units gate, the auth-mode gate and the port probe. A refused start has written no
|
|
908
|
+
// `.env`, minted no secret and placed no unit, so the reader's only question — is my install
|
|
909
|
+
// half-made — has one answer.
|
|
910
|
+
let staffDomains = process.env.PORTAL_STAFF_DOMAINS;
|
|
911
|
+
if (!staffDomains) {
|
|
912
|
+
let derived = "";
|
|
913
|
+
try { derived = staffDomainFor(user); }
|
|
914
|
+
catch (e) { fatal(e.message); }
|
|
915
|
+
if (derived && classifyStaffDomain(derived) === "wide")
|
|
916
|
+
fatal(wideStaffDomainRefusal({ user, domain: derived, envPath: ENV_PATH }));
|
|
917
|
+
staffDomains = derived;
|
|
918
|
+
}
|
|
828
919
|
|
|
829
920
|
say("");
|
|
830
921
|
say(` ${BRAND.name} ${BRAND.product.toLowerCase()} — local install`);
|
|
@@ -834,7 +925,7 @@ if (isMain) {
|
|
|
834
925
|
say(` reports ${paths.pool}`);
|
|
835
926
|
say(` signs in as ${user}`);
|
|
836
927
|
|
|
837
|
-
// ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN (
|
|
928
|
+
// ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN (the sibling,) ──
|
|
838
929
|
//
|
|
839
930
|
// This block used to sit in section 4, after the secrets were minted, the data plane created, the
|
|
840
931
|
// grants file written and an example report seeded. So a box where another copy already held the port
|
|
@@ -857,7 +948,7 @@ if (isMain) {
|
|
|
857
948
|
s.once("listening", () => s.close(() => resolve(null)));
|
|
858
949
|
s.listen(port, HOST);
|
|
859
950
|
});
|
|
860
|
-
// ALL THREE DOORS, NOT TWO (
|
|
951
|
+
// ALL THREE DOORS, NOT TWO (found in review). The client door's port is resolved
|
|
861
952
|
// beside the other two, three lines up, and was left out of the loop written for exactly this
|
|
862
953
|
// principle. So a held client port was discovered AFTER the portal and the engine door had bound: the
|
|
863
954
|
// run fatalled mid-flight, tore down what it had started, and then did not exit — measured at rc=124
|
|
@@ -892,7 +983,7 @@ if (isMain) {
|
|
|
892
983
|
continue;
|
|
893
984
|
}
|
|
894
985
|
}
|
|
895
|
-
//
|
|
986
|
+
// That wording, not a second copy of it. That helper already distinguishes EADDRINUSE from EACCES
|
|
896
987
|
// on a privileged port and from an address this host does not have, and names the way out of each;
|
|
897
988
|
// the launcher having its own shorter sentence for one of the three would mean a user meets two
|
|
898
989
|
// different answers to the same question depending on which door refused first.
|
|
@@ -960,7 +1051,7 @@ if (isMain) {
|
|
|
960
1051
|
catch (e) { fatal(`could not create the grants file at ${paths.grants} (${String(e?.message ?? e)}).`); }
|
|
961
1052
|
say(` created ${paths.grants} (an empty roster — one staff address, no clients yet)`);
|
|
962
1053
|
}
|
|
963
|
-
// THE REVOCATION LIST, CREATED — not merely named (
|
|
1054
|
+
// THE REVOCATION LIST, CREATED — not merely named (found in review).
|
|
964
1055
|
//
|
|
965
1056
|
// The door is started with TRADEMARK_MCP_TOKEN_DENYLIST pointing here, and since this branch
|
|
966
1057
|
// `isRevoked` fails CLOSED on an unreadable file — it refuses the token rather than assuming it was
|
|
@@ -1248,7 +1339,7 @@ if (isMain) {
|
|
|
1248
1339
|
} catch { /* no file yet — the union is the whole of it */ }
|
|
1249
1340
|
// ONE COMPOSER for "where do I set these", used by the start-time refusal and by the order-time
|
|
1250
1341
|
// announcement below it. Two copies of this sentence is how one of them comes to name a file the
|
|
1251
|
-
// reader cannot use
|
|
1342
|
+
// reader cannot use.
|
|
1252
1343
|
const orderRemedy = (homeEnv) => {
|
|
1253
1344
|
const cliEnv = envFileRead();
|
|
1254
1345
|
return cliEnv
|
|
@@ -1411,7 +1502,7 @@ if (isMain) {
|
|
|
1411
1502
|
// deriving the bus at two of them is worse than at none: `enable --now` would succeed against the
|
|
1412
1503
|
// derived bus while the health read three screens down still asks the bus-less one, so every unit
|
|
1413
1504
|
// would start and then be reported as not running. Driven into by accident while building
|
|
1414
|
-
//
|
|
1505
|
+
// "4 of 4 unit(s) did not come up" over four units that had just been enabled.
|
|
1415
1506
|
// Making all five derive it is a real improvement to the install path and is its own change with its
|
|
1416
1507
|
// own drive, not a side effect of repairing a refusal.
|
|
1417
1508
|
try { execFileSync("systemctl", ["--user", "daemon-reload"], CAPTURE_STDERR); }
|
|
@@ -1471,7 +1562,7 @@ if (isMain) {
|
|
|
1471
1562
|
}
|
|
1472
1563
|
// enable --now on an ALREADY-ACTIVE unit is a no-op, so a refresh would leave the old process
|
|
1473
1564
|
// running the old files. EVERY long-running unit in the set is restarted, not a hardcoded pair
|
|
1474
|
-
// (
|
|
1565
|
+
// (found in review): the pair here matched the pair the health check used three
|
|
1475
1566
|
// lines down, and carried the same stale justification about "the oneshot and its triggers". There
|
|
1476
1567
|
// is no oneshot in the set. So a refresh restarted the portal and the engine door onto new code and
|
|
1477
1568
|
// left the worker and the client door on the old — while the check below now reports all four up,
|
|
@@ -1490,7 +1581,7 @@ if (isMain) {
|
|
|
1490
1581
|
// reintroduce it through a second door.
|
|
1491
1582
|
//
|
|
1492
1583
|
// The restart keeps the port and the key: both live in the unit's environment and the access file,
|
|
1493
|
-
// not in the process. That is
|
|
1584
|
+
// not in the process. That is why this is a restart rather than a re-place
|
|
1494
1585
|
// rather than a re-place.
|
|
1495
1586
|
if (adoptedClientDoor && !backgroundRefresh) {
|
|
1496
1587
|
try { execFileSync("systemctl", ["--user", "restart", CLIENT_DOOR_UNIT], { stdio: "ignore" }); }
|
|
@@ -1499,7 +1590,7 @@ if (isMain) {
|
|
|
1499
1590
|
|
|
1500
1591
|
// STARTED IS NOT RUNNING (the connect lesson): settle, then read each service's own state.
|
|
1501
1592
|
//
|
|
1502
|
-
// EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET (
|
|
1593
|
+
// EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET (found in review). This checked
|
|
1503
1594
|
// a hardcoded PAIR while `enable --now` had just started FOUR. So a client door crash-looping against
|
|
1504
1595
|
// a held port got no ✗, was never named in the banner, and `start --background` printed its success
|
|
1505
1596
|
// block and exited 0 over a product that was two-thirds up. The worker was unchecked for the same
|
|
@@ -1508,7 +1599,7 @@ if (isMain) {
|
|
|
1508
1599
|
// The comment here used to justify the gap: "the oneshot worker and its timer/path are judged by
|
|
1509
1600
|
// being enabled". That is stale — clearotron-worker.service is `runner.mjs --watch`, Type=simple,
|
|
1510
1601
|
// Restart=on-failure, and there is no timer or path unit in the install set at all. It described the
|
|
1511
|
-
// retired
|
|
1602
|
+
// retired clearotron-* units. A stale justification is worse than none: it reads as a decision.
|
|
1512
1603
|
//
|
|
1513
1604
|
// Judged by the unit's OWN declared Type rather than by a list kept here, so a oneshot added to the
|
|
1514
1605
|
// set later is judged correctly instead of being reported as broken for exiting.
|
|
@@ -1577,10 +1668,40 @@ if (isMain) {
|
|
|
1577
1668
|
// sequence rather than a race between the terminal's signal and ours. It also means the group
|
|
1578
1669
|
// kill below reaches anything a child spawns, not just the child.
|
|
1579
1670
|
detached: true,
|
|
1580
|
-
|
|
1671
|
+
// — STDERR IS TEED RATHER THAN INHERITED, AND ONLY STDERR.
|
|
1672
|
+
//
|
|
1673
|
+
// These children announce a refusal as one FATAL line on stderr and exit 1. With `inherit` the
|
|
1674
|
+
// parent holds no copy, so the failure message below could only point at output it had never seen —
|
|
1675
|
+
// and on one report that output never reached the reader's terminal at all. It said "its own output
|
|
1676
|
+
// above says why" about a line that was not above, which is worse than saying nothing: it sends
|
|
1677
|
+
// somebody scrolling for a sentence they will not find.
|
|
1678
|
+
//
|
|
1679
|
+
// stdout stays inherited. It carries no refusal — measured: on a refusing door stdout is empty and
|
|
1680
|
+
// stderr holds the whole of it — and leaving it alone keeps the child's terminal detection and any
|
|
1681
|
+
// progress rendering intact. Piping a stream costs the child its TTY, so only the stream that has to
|
|
1682
|
+
// be read is piped.
|
|
1683
|
+
stdio: ["ignore", "inherit", "pipe"],
|
|
1581
1684
|
env: { ...process.env, ...env },
|
|
1582
1685
|
});
|
|
1583
|
-
|
|
1686
|
+
// The last lines of that child's stderr, forwarded on as they arrive so nothing is delayed or
|
|
1687
|
+
// swallowed, and kept so the failure can QUOTE them rather than refer to them.
|
|
1688
|
+
const tail = [];
|
|
1689
|
+
// A CHUNK IS NOT A LINE. `data` arrives on whatever boundary the pipe gives us, so a stream split
|
|
1690
|
+
// mid-sentence would push two half-lines and the quoted last words would reach the reader cut in
|
|
1691
|
+
// half — on precisely the message that exists because they could not see the original. The partial
|
|
1692
|
+
// remainder is held over and completed by the next chunk; whatever is left when the stream ends is
|
|
1693
|
+
// flushed, because a process that dies mid-line still said the thing it was saying.
|
|
1694
|
+
let pending = "";
|
|
1695
|
+
const keep = (line) => { if (line.trim()) tail.push(line); while (tail.length > 12) tail.shift(); };
|
|
1696
|
+
child.stderr?.setEncoding("utf8");
|
|
1697
|
+
child.stderr?.on("data", (chunk) => {
|
|
1698
|
+
process.stderr.write(chunk);
|
|
1699
|
+
const parts = (pending + String(chunk)).split("\n");
|
|
1700
|
+
pending = parts.pop() ?? "";
|
|
1701
|
+
for (const line of parts) keep(line);
|
|
1702
|
+
});
|
|
1703
|
+
child.stderr?.on("end", () => { keep(pending); pending = ""; });
|
|
1704
|
+
const rec = { name, script, child, alive: true, tail };
|
|
1584
1705
|
children.push(rec);
|
|
1585
1706
|
child.on("exit", (code, signal) => {
|
|
1586
1707
|
rec.alive = false;
|
|
@@ -1593,7 +1714,7 @@ if (isMain) {
|
|
|
1593
1714
|
+ ` but nothing is draining the queue now. Start one with:\n node ${script} --watch\n`);
|
|
1594
1715
|
return;
|
|
1595
1716
|
}
|
|
1596
|
-
err(
|
|
1717
|
+
err(childExitReport({ name, script, code, signal, tail }));
|
|
1597
1718
|
void shutdown(1);
|
|
1598
1719
|
});
|
|
1599
1720
|
child.on("error", (e) => {
|
|
@@ -1601,7 +1722,7 @@ if (isMain) {
|
|
|
1601
1722
|
if (stopping) return;
|
|
1602
1723
|
if (!fatal) {
|
|
1603
1724
|
err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)} — the portal is still up,`
|
|
1604
|
-
+ ` but the queue will not
|
|
1725
|
+
+ ` but the queue will not be worked.\n`);
|
|
1605
1726
|
return;
|
|
1606
1727
|
}
|
|
1607
1728
|
err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)}\n`);
|
|
@@ -1864,3 +1985,25 @@ if (isMain) {
|
|
|
1864
1985
|
say(" — same product, managed by systemd, and it survives logout.");
|
|
1865
1986
|
say("");
|
|
1866
1987
|
}
|
|
1988
|
+
|
|
1989
|
+
/**
|
|
1990
|
+
* What a reader is told when a child this install cannot run without exits.
|
|
1991
|
+
*
|
|
1992
|
+
* QUOTED, NOT POINTED AT. This used to end "its own output above says why" while the parent inherited
|
|
1993
|
+
* the child's stderr and therefore held no copy of it. On one report that output never reached the
|
|
1994
|
+
* reader's terminal at all, so the sentence sent somebody scrolling for a line that was not there —
|
|
1995
|
+
* worse than saying nothing, because it reads as a working instruction.
|
|
1996
|
+
*
|
|
1997
|
+
* An empty tail is reported as an empty tail. A child that exits silently is a finding about the child,
|
|
1998
|
+
* and printing a heading with nothing under it would hide exactly that.
|
|
1999
|
+
*
|
|
2000
|
+
* PURE, and exported, so this can be driven without starting a supervisor — the failure path of a
|
|
2001
|
+
* process manager is the one nobody exercises by hand.
|
|
2002
|
+
*/
|
|
2003
|
+
export function childExitReport({ name, script, code, signal, tail = [] }) {
|
|
2004
|
+
const how = signal ? `on ${signal}` : `with code ${code}`;
|
|
2005
|
+
const said = tail.length
|
|
2006
|
+
? `Its last line${tail.length > 1 ? "s" : ""}:\n${tail.map((l) => ` ${l}`).join("\n")}\n`
|
|
2007
|
+
: "It exited without printing anything, which is itself the thing to report.\n";
|
|
2008
|
+
return `\nstart: ${name} (${script}) exited ${how}. Stopping the rest.\n${said}`;
|
|
2009
|
+
}
|
package/bin/stop.mjs
CHANGED
|
@@ -19,12 +19,16 @@ import { existsSync, rmSync } from "node:fs";
|
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { homedir } from "node:os";
|
|
21
21
|
import { execFileSync } from "node:child_process";
|
|
22
|
+
import { systemdSaid, looksLikeBusFailure, busRemedy, CAPTURE_STDERR } from "../shared/systemd-failure.mjs"; // a stop that could not look must not report that it stopped
|
|
22
23
|
import { BACKGROUND_UNITS } from "./start.mjs";
|
|
23
24
|
import { CLIENT_DOOR_UNIT } from "../shared/client-door.mjs";
|
|
24
25
|
import { invoke } from "../shared/invocation.mjs";
|
|
25
26
|
|
|
26
27
|
const UNIT_DIR = join(homedir(), ".config", "systemd", "user");
|
|
27
28
|
const say = (s = "") => console.log(s);
|
|
29
|
+
// ON STDERR, because a refusal that scrolls past in the same stream as the success lines is a
|
|
30
|
+
// refusal a script cannot act on and a reader skims (tracker issue 270).
|
|
31
|
+
const err = (s = "") => console.error(s);
|
|
28
32
|
|
|
29
33
|
const argv = process.argv.slice(2);
|
|
30
34
|
if (argv.includes("--help") || argv.includes("-h")) {
|
|
@@ -39,20 +43,76 @@ if (argv.includes("--help") || argv.includes("-h")) {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
let found = 0;
|
|
46
|
+
const failures = [];
|
|
42
47
|
for (const u of BACKGROUND_UNITS) {
|
|
43
48
|
if (u === CLIENT_DOOR_UNIT) continue; // structurally unreachable (the pin's census forbids it); belt anyway
|
|
44
49
|
const file = join(UNIT_DIR, u);
|
|
45
50
|
if (!existsSync(file)) continue;
|
|
46
51
|
found++;
|
|
47
|
-
|
|
52
|
+
// ── THE STOP IS VERIFIED, AND THE FILE GOES ONLY IF IT WORKED (tracker issue 270) ────────────────
|
|
53
|
+
//
|
|
54
|
+
// This was `catch { /* already down */ }` — a COMMENT standing in for a check. The comment guessed why
|
|
55
|
+
// the call failed, the next line deleted the unit file regardless, and the line after that announced
|
|
56
|
+
// "stopped and removed". Measured on a test box: `disable --now` failed for want of a session bus, all
|
|
57
|
+
// four services stayed up on unchanged pids holding all three ports, three unit files were deleted, and
|
|
58
|
+
// the command exited 0 saying the box ran nothing. The services were then unmanageable — running, with
|
|
59
|
+
// no unit file to stop them by — which is strictly worse than leaving both alone.
|
|
60
|
+
//
|
|
61
|
+
// `is-active` is what decides, not the exit code of the disable, because the exit code is what lied.
|
|
62
|
+
let stopped = false;
|
|
63
|
+
let why = null;
|
|
64
|
+
try {
|
|
65
|
+
execFileSync("systemctl", ["--user", "disable", "--now", u], CAPTURE_STDERR);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
why = systemdSaid(e);
|
|
68
|
+
}
|
|
69
|
+
// ASKED AFTER, WHATEVER THE DISABLE SAID. A disable that reported failure may still have stopped it,
|
|
70
|
+
// and one that reported success may not have — only the state answers.
|
|
71
|
+
try {
|
|
72
|
+
const state = execFileSync("systemctl", ["--user", "is-active", u], { ...CAPTURE_STDERR, stdio: ["ignore", "pipe", "pipe"] });
|
|
73
|
+
stopped = String(state).trim() !== "active";
|
|
74
|
+
} catch (e) {
|
|
75
|
+
// `is-active` exits non-zero for an inactive unit, which is the answer we want — but it exits
|
|
76
|
+
// non-zero for "cannot reach systemd" too, and those must not read the same. The stdout is the
|
|
77
|
+
// discriminator: an unreachable systemd prints nothing there.
|
|
78
|
+
const said = String(e?.stdout ?? "").trim();
|
|
79
|
+
if (said && said !== "active") stopped = true;
|
|
80
|
+
else why = why ?? systemdSaid(e);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!stopped) {
|
|
84
|
+
// NOT DELETED. A running service with no unit file cannot be stopped by any ordinary means.
|
|
85
|
+
failures.push({ unit: u, why: why ?? "systemd still reports it active" });
|
|
86
|
+
say(` COULD NOT STOP ${u} — its unit file is left in place, so it can still be stopped`);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
48
89
|
try { rmSync(file, { force: true }); } catch { /* already gone */ }
|
|
49
90
|
say(` stopped and removed ${u}`);
|
|
50
91
|
}
|
|
51
|
-
|
|
92
|
+
// THE COMMENT HERE ALREADY NAMED THE CAUSE AND SHRUGGED AT IT. If there is no user bus, the disables
|
|
93
|
+
// above did not happen either — so this is where that is said.
|
|
94
|
+
try {
|
|
95
|
+
execFileSync("systemctl", ["--user", "daemon-reload"], CAPTURE_STDERR);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
const said = systemdSaid(e);
|
|
98
|
+
err(` could not ask systemd to reload its units — ${said}`);
|
|
99
|
+
if (looksLikeBusFailure(said)) err(`\n${busRemedy()}\n`);
|
|
100
|
+
}
|
|
52
101
|
|
|
53
102
|
if (!found) {
|
|
54
103
|
say(" Nothing was running in the background — no pinned unit is installed on this box.");
|
|
55
104
|
say(" Nothing to do, and nothing was changed.");
|
|
105
|
+
} else if (failures.length) {
|
|
106
|
+
// THE SENTENCE THAT WAS WRONG. "The background product is stopped and the box runs nothing again" was
|
|
107
|
+
// printed unconditionally — including on the run where four services stayed up. A reader who is told
|
|
108
|
+
// that has no reason to look, which is what made the state unmanageable rather than merely wrong.
|
|
109
|
+
err("");
|
|
110
|
+
err(` ${failures.length} of ${found} service(s) could NOT be stopped, and their unit files are left in place:`);
|
|
111
|
+
for (const f of failures) err(` ${f.unit}: ${f.why}`);
|
|
112
|
+
if (failures.some((f) => looksLikeBusFailure(f.why))) err(`\n${busRemedy()}\n`);
|
|
113
|
+
err(" Nothing was removed for these, so they can still be stopped once systemd can be reached.");
|
|
114
|
+
err(" The box is NOT idle. This exits non-zero.");
|
|
115
|
+
process.exitCode = 1;
|
|
56
116
|
} else {
|
|
57
117
|
say("");
|
|
58
118
|
say(" The background product is stopped and the box runs nothing again — plain `clearotron start`");
|
|
@@ -60,4 +120,6 @@ if (!found) {
|
|
|
60
120
|
const door = existsSync(join(UNIT_DIR, CLIENT_DOOR_UNIT));
|
|
61
121
|
if (door) say(` Your assistant connection is untouched and still up; \`${invoke("disconnect")}\` is what closes it and revokes its key.`);
|
|
62
122
|
}
|
|
63
|
-
|
|
123
|
+
// NOT A BARE ZERO. A stop that could not stop something sets `exitCode` above, and exiting 0 here would
|
|
124
|
+
// discard it — printing the refusal and then reporting success, which is the shape this change removes.
|
|
125
|
+
process.exit(process.exitCode ?? 0);
|
package/bin/update.mjs
CHANGED
|
@@ -58,7 +58,7 @@ import { liveRunHolds } from "../driver/deploy-live-run-guard.mjs"; // — one
|
|
|
58
58
|
import { isEntrypoint } from "../shared/is-entrypoint.mjs"; // — one entry-point test, all spellings
|
|
59
59
|
import { readEnvFile } from "./onboard.mjs";
|
|
60
60
|
import { invoke, invocationPrefix } from "../shared/invocation.mjs"; // — name a command the reader can actually type
|
|
61
|
-
import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; //
|
|
61
|
+
import { rebuildIfStale } from "../shared/bundle-rebuild.mjs"; // a pull cannot update an untracked bundle
|
|
62
62
|
|
|
63
63
|
const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
64
64
|
const ENV_PATH = envLocalPath({ repoRoot: REPO }); // resolved, never composed: one resolver, so moving this file later is one line
|
|
@@ -155,7 +155,7 @@ function reportRefusal(risky) {
|
|
|
155
155
|
say(" mv <the-path-above> <somewhere-outside>/");
|
|
156
156
|
say("");
|
|
157
157
|
say(` then point the variable at the new location in your .env, and run \`${invoke("doctor")}\` to`);
|
|
158
|
-
say(" confirm it. This command will not move your files for you: where your own
|
|
158
|
+
say(" confirm it. This command will not move your files for you: where your own instructions and");
|
|
159
159
|
say(" customer records live is your decision, not a side effect of an upgrade.\n");
|
|
160
160
|
}
|
|
161
161
|
|
|
@@ -170,7 +170,7 @@ function reportRefusal(risky) {
|
|
|
170
170
|
* update` from inside some other repository must not have that repository answered about.
|
|
171
171
|
*/
|
|
172
172
|
export function isGitCheckout(repo = REPO, exists = existsSync) {
|
|
173
|
-
// NO SPAWN HERE, DELIBERATELY.
|
|
173
|
+
// NO SPAWN HERE, DELIBERATELY. That arm requires that update.mjs hold exactly ONE spawn site, so
|
|
174
174
|
// that one helper owns every command and pins `cwd` — "a later addition inherits whatever directory
|
|
175
175
|
// the user happened to be standing in". A `git rev-parse` here was that later addition, and the arm
|
|
176
176
|
// caught it. It is also more than the question needs: a packaged install has no `.git` at all, and a
|
|
@@ -276,7 +276,7 @@ export async function update(argv = process.argv.slice(2)) {
|
|
|
276
276
|
for (const c of holds.claimed) console.error(` claimed ${c.id} pid ${c.pid ?? "unknown"}`);
|
|
277
277
|
for (const sl of holds.slots) console.error(` slot ${sl.file} pid ${sl.pid}`);
|
|
278
278
|
console.error("\n `npm ci` rebuilds node_modules under whatever is running. Nothing was touched.");
|
|
279
|
-
console.error(" Wait for the queue to
|
|
279
|
+
console.error(" Wait for the queue to empty, or clear it, and run this again.\n");
|
|
280
280
|
return 4;
|
|
281
281
|
}
|
|
282
282
|
if (holds.unreadable.length) {
|
|
@@ -292,7 +292,7 @@ export async function update(argv = process.argv.slice(2)) {
|
|
|
292
292
|
say("\n Configuration store is outside the checkout. Updating the product.");
|
|
293
293
|
for (const e of entries) say(` ${e.name}=${e.value} (${e.from})`);
|
|
294
294
|
if (!entries.length) {
|
|
295
|
-
say(" Nothing set — this install runs the bundled demo customers and our
|
|
295
|
+
say(" Nothing set — this install runs the bundled demo customers and our instructions. That is a");
|
|
296
296
|
say(" fine way to start, and it means an upgrade has nothing of yours to land on.");
|
|
297
297
|
}
|
|
298
298
|
|
|
@@ -326,7 +326,7 @@ export async function update(argv = process.argv.slice(2)) {
|
|
|
326
326
|
//
|
|
327
327
|
// The point of running it HERE is that a pull is exactly the moment our files move under a user's
|
|
328
328
|
// overrides. Reported, never judged — an override is a choice, not a fault, and drift is information.
|
|
329
|
-
say("\n
|
|
329
|
+
say("\n Custom instructions");
|
|
330
330
|
try {
|
|
331
331
|
const report = overlayReport({ baseRoot: config.skillsBaseDir, overlayRoot: config.skillsOverlayDir });
|
|
332
332
|
for (const line of renderOverlayReport(report, { indent: "" })) say(` ${line}`);
|
|
@@ -334,7 +334,7 @@ export async function update(argv = process.argv.slice(2)) {
|
|
|
334
334
|
} catch (e) {
|
|
335
335
|
// An unreadable overlay throws by design. It must not abort the verb after a successful update: the
|
|
336
336
|
// update DID happen, and exiting nonzero here would tell a script it did not.
|
|
337
|
-
console.error(` the
|
|
337
|
+
console.error(` the custom instructions could not be read — ${e.message}`);
|
|
338
338
|
}
|
|
339
339
|
|
|
340
340
|
say("\n Up to date.\n");
|
package/bin/uspto-sync.mjs
CHANGED
|
@@ -76,7 +76,7 @@ if (!dbPath) die(`no index path. Pass --db, or set USPTO_LOCAL_DB (the same vari
|
|
|
76
76
|
//
|
|
77
77
|
// So the old check demanded 43.8 GB for a build that fits in 17, and INSTALL.md told the reader to
|
|
78
78
|
// provision 60. On the free tier that is the difference between "I can try this on the disk I have" and
|
|
79
|
-
// "I cannot", which is the whole of
|
|
79
|
+
// "I cannot", which is the whole of the Why.
|
|
80
80
|
//
|
|
81
81
|
// The ratio, the headroom and the arithmetic now live in shared/uspto-index-size.mjs with their
|
|
82
82
|
// provenance, because the same numbers are what the wizard prints and what INSTALL.md promises, and
|
package/build-info.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"framework_key": "house-default",
|
|
4
4
|
"title": "Generic default risk framework",
|
|
5
|
-
"source_deck": "
|
|
5
|
+
"source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
|
|
6
6
|
"entity_label": "the company",
|
|
7
7
|
"bands": [
|
|
8
8
|
{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"framework_key": "house-default",
|
|
4
4
|
"title": "Generic default risk framework",
|
|
5
|
-
"source_deck": "
|
|
5
|
+
"source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
|
|
6
6
|
"entity_label": "the company",
|
|
7
7
|
"bands": [
|
|
8
8
|
{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"framework_key": "house-triage",
|
|
4
4
|
"title": "House knockout triage ladder (Stage 0)",
|
|
5
|
-
"source_deck": "
|
|
5
|
+
"source_deck": "Cordillera house triage scale for knockout screening, authored in-house; five rating tiers",
|
|
6
6
|
"entity_label": "the client",
|
|
7
7
|
"bands": [
|
|
8
8
|
{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"framework_key": "house-default",
|
|
4
4
|
"title": "Generic default risk framework",
|
|
5
|
-
"source_deck": "
|
|
5
|
+
"source_deck": "Cordillera house risk framework, authored in-house and reviewed by counsel; 2026-08-31 revision",
|
|
6
6
|
"entity_label": "the company",
|
|
7
7
|
"bands": [
|
|
8
8
|
{
|