clearotron 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +54 -1
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +53 -49
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +4 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +27 -11
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +58 -118
- package/bin/start.mjs +22 -25
- package/bin/stop.mjs +65 -3
- package/bin/update.mjs +7 -7
- package/bin/uspto-sync.mjs +1 -1
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +6 -2
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +6 -3
- package/docs/architecture/05-config-governance.md +38 -5
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +65 -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 +1 -1
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/connotation-search.mjs +12 -12
- package/driver/contract-audit.mjs +5 -5
- package/driver/contract-dictation-registry.mjs +4 -4
- package/driver/contract-dictation.mjs +2 -2
- package/driver/contract-e3-backlog.mjs +6 -6
- package/driver/contract-vocabulary.mjs +3 -3
- package/driver/corrections-feedforward.mjs +1 -1
- package/driver/coverage-form-io.mjs +2 -2
- package/driver/coverage-form.mjs +4 -4
- package/driver/coverage-ledger.mjs +3 -3
- package/driver/coverage-union.mjs +1 -1
- package/driver/declination-call.mjs +35 -3
- package/driver/declination-duty.mjs +1 -1
- package/driver/deliver-trigger.sh +3 -3
- package/driver/deploy-live-run-guard.mjs +6 -2
- package/driver/dev-portal.mjs +1 -1
- package/driver/disposition-call.mjs +4 -4
- package/driver/disposition-tool.mjs +4 -4
- package/driver/disposition-union.mjs +2 -2
- package/driver/doc-constants.mjs +1 -1
- package/driver/door-gates.mjs +2 -2
- package/driver/doubt-selection.mjs +2 -2
- package/driver/drainer-identity.mjs +1 -1
- package/driver/driver.config.mjs +63 -11
- package/driver/e2e-rounds.mjs +2 -2
- package/driver/effort-model.mjs +2 -2
- package/driver/engine/anthropic-agent.mjs +24 -24
- package/driver/engine/auth.mjs +1 -1
- package/driver/engine/common.mjs +1 -1
- package/driver/engine/deny-authority-write.mjs +1 -1
- package/driver/engine/jx-turn.mjs +1 -1
- package/driver/engine/mcp/clarivate-server.mjs +1 -1
- package/driver/engine/mcp/corsearch-server.mjs +1 -1
- package/driver/engine/mcp/declination-server.mjs +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +1 -1
- package/driver/engine/mcp/euipo-server.mjs +1 -1
- package/driver/engine/mcp/fetch-server.mjs +1 -1
- package/driver/engine/mcp/free-tier-server.mjs +2 -2
- package/driver/engine/mcp/gather-config.mjs +11 -11
- package/driver/engine/mcp/perplexity-server.mjs +1 -1
- package/driver/engine/mcp/recording-server.mjs +8 -4
- package/driver/engine/mcp/signa-server.mjs +1 -1
- package/driver/engine/mcp/uspto-local-server.mjs +1 -1
- package/driver/engine/openai-agent.mjs +2 -2
- package/driver/engine-build.mjs +2 -2
- package/driver/enqueue-schema.mjs +2 -2
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/findings-model.mjs +8 -8
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +1 -1
- package/driver/gateway.mjs +28 -23
- package/driver/grounds-grammar.mjs +1 -1
- package/driver/hit-list.mjs +1 -1
- package/driver/jurisdiction-systems.mjs +1 -1
- package/driver/jx-lanes.mjs +1 -1
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +3 -3
- package/driver/knockout-assess-record.mjs +5 -1
- package/driver/narrative-refutation-record.mjs +3 -3
- package/driver/numeric-setting.mjs +1 -1
- package/driver/owner-use-check.mjs +184 -0
- package/driver/package.json +2 -2
- package/driver/phase0.mjs +1 -1
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +175 -62
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +2 -2
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +6 -6
- package/driver/portal-service.mjs +15 -15
- package/driver/predelivery-lint.mjs +28 -10
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +1 -1
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +2 -2
- package/driver/profiles.mjs +1 -1
- package/driver/progress.mjs +6 -6
- package/driver/provider-usage.mjs +1 -1
- package/driver/publish/demo-marking.mjs +1 -1
- package/driver/publish/index.mjs +47 -6
- package/driver/publish/knockout.mjs +36 -14
- package/driver/publish/parse.mjs +4 -4
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/register-presence.mjs +1 -1
- package/driver/publish/render-knockout.mjs +198 -31
- package/driver/publish/report-data.mjs +13 -3
- package/driver/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/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 +3 -3
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +1 -1
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +10 -4
- package/driver/skills/prelim-search/SKILL.md +2 -2
- package/driver/skills/prelim-search/template-formatting.md +1 -1
- package/driver/skills/prelim-search/templates/email/generic.md +1 -1
- package/driver/skills/prelim-search/worked-examples.md +1 -1
- package/driver/skills/prelim-variants/SKILL.md +2 -2
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +97 -40
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +146 -32
- package/driver/synthesis-record.mjs +1 -1
- package/driver/systemd/clearotron-client-mcp.service +1 -1
- package/driver/systemd/clearotron-portal.service +1 -1
- package/driver/systemd/render-units.mjs +1 -1
- package/driver/tokens.mjs +1 -1
- package/driver/tool-calls.mjs +1 -1
- package/driver/turnaround-bands.mjs +1 -1
- package/driver/unit-file-drift.mjs +1 -1
- package/driver/unit-inventory.mjs +121 -61
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +12 -12
- package/driver/whatif-memo-run.mjs +46 -5
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/mcp-server/CHANGELOG.md +4 -0
- package/mcp-server/README.md +3 -3
- package/mcp-server/http-server.mjs +44 -1
- package/mcp-server/key-socket.mjs +184 -0
- package/mcp-server/lib/audit-view.mjs +69 -2
- package/mcp-server/lib/brief.mjs +15 -0
- package/mcp-server/lib/driver.mjs +7 -1
- package/mcp-server/lib/events.mjs +1 -1
- package/mcp-server/lib/http-handler.mjs +1 -1
- package/mcp-server/lib/knockout.mjs +435 -0
- package/mcp-server/lib/ops.mjs +4 -4
- package/mcp-server/lib/options.mjs +1 -1
- package/mcp-server/lib/plan.mjs +1 -1
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/scrub.mjs +1 -1
- package/mcp-server/lib/whatif.mjs +3 -3
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/server.mjs +76 -11
- package/package.json +3 -3
- package/portal-ui/package.json +1 -1
- package/providers/_shared/enumerate.mjs +1 -1
- package/providers/_shared/ledger-path.mjs +3 -3
- package/providers/_shared/ledger.mjs +1 -1
- package/providers/_shared/result-shape.mjs +3 -3
- package/providers/_shared/term-shape.mjs +1 -1
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +4 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/ai-page-render-check.mjs +1 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +3 -3
- package/scripts/clearances-render-check.mjs +3 -3
- package/scripts/compare.mjs +2 -2
- package/scripts/composer-render-check.mjs +6 -6
- package/scripts/contract-dictation-scan.mjs +2 -2
- package/scripts/dead-names.mjs +1 -1
- package/scripts/drain-preflight.mjs +5 -5
- package/scripts/e2e-unread-terminals.mjs +1 -1
- package/scripts/e2e.mjs +8 -8
- package/scripts/env-audit.mjs +7 -7
- package/scripts/env-classify.mjs +139 -15
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +51 -2
- package/scripts/home-render-check.mjs +2 -2
- package/scripts/live-surface-check.mjs +92 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -1
- package/scripts/portal-lifecycle-check.mjs +3 -3
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +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 +116 -0
- package/scripts/test-run.mjs +3 -3
- package/scripts/third-party-notices.mjs +3 -3
- package/scripts/travelling-predicates.mjs +3 -3
- package/scripts/unexecuted-asserts.mjs +2 -2
- package/scripts/verify-publishable.mjs +2 -2
- package/scripts/write-up-form-census.mjs +1 -1
- package/shared/access-audience.mjs +1 -1
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +0 -48
- package/shared/env-local.mjs +1 -1
- package/shared/identifier-scan.mjs +3 -3
- package/shared/invocation.mjs +1 -1
- package/shared/names-in-force.mjs +2 -0
- package/shared/product-owned-names.mjs +1 -1
- package/shared/register-selection.mjs +1 -1
- package/shared/scope.mjs +5 -5
- package/shared/server-units.mjs +4 -4
- package/shared/store-in-repo.mjs +2 -2
- package/shared/suite-census.mjs +4 -4
- package/shared/tty-style.mjs +1 -1
- package/shared/uspto-index-size.mjs +1 -1
- package/shared/vacuous-pass.mjs +1 -1
- package/skills/clearotron-account/SKILL.md +42 -13
- package/driver/systemd/prelim-driver.path +0 -69
- package/driver/systemd/prelim-driver.service +0 -86
- package/driver/systemd/prelim-driver.timer +0 -14
- package/driver/systemd/prelim-outbox.path +0 -27
- package/driver/systemd/prelim-outbox.service +0 -37
- package/driver/systemd/prelim-outbox.timer +0 -21
- package/node_modules/exceljs/README_zh.md +0 -2878
- package/node_modules/exceljs/dist/LICENSE +0 -22
- package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
- package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
- package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
- package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
- package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
- package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
- package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
- package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
- package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
- package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
- package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
- package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
- package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
- package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
- package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
- package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
- package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
- package/node_modules/exceljs/dist/es5/index.js +0 -15
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
- package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
- package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
- package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
- package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
- package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
- package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
- package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
- package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.js +0 -59900
- package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
- package/node_modules/exceljs/dist/exceljs.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
- package/scripts/deploy-test.sh +0 -309
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,7 @@ 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
133
|
|
|
134
134
|
const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
135
135
|
const ENV_PATH = envLocalPath({ repoRoot: REPO }); // resolved, never composed: one resolver, so moving this file later is one line
|
|
@@ -321,7 +321,7 @@ export function portsForFlag(portFlag, ports, env = {}) {
|
|
|
321
321
|
/**
|
|
322
322
|
* Where the grants file is, for a command that is NOT the supervisor.
|
|
323
323
|
*
|
|
324
|
-
* —
|
|
324
|
+
* — found in review. `start` injects CLEAROTRON_ACCESS_FILE into the environment of
|
|
325
325
|
* the services it supervises (see the child env below) and never persists it, so the door finds the
|
|
326
326
|
* roster and every sibling CLI in the operator's own shell does not. `clearotron grant` then refused
|
|
327
327
|
* with "Set CLEAROTRON_ACCESS_FILE" — a variable nothing writes — and enrolling a client had no working
|
|
@@ -424,9 +424,12 @@ const unitTypeOf = (u) => {
|
|
|
424
424
|
// cost is the admission cap: counts are serial per queue while queues drain concurrently, so two
|
|
425
425
|
// claimers can overshoot a per-account cap by a bounded one per queue. A bounded overshoot is not a
|
|
426
426
|
// reason to leave a retired unit running when disarming it is one call.
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
427
|
+
// EMPTY, AND KEPT RATHER THAN DELETED. The retired path-watcher/timer units it named are gone from the
|
|
428
|
+
// tree, so naming them here would describe files this repo does not ship — which is exactly what the
|
|
429
|
+
// "every retired unit is a unit this repo actually ships" check refuses. The export stays because the
|
|
430
|
+
// next retirement wants somewhere to go, and an empty list is a statement that nothing is currently
|
|
431
|
+
// retired-but-shipped.
|
|
432
|
+
export const BACKGROUND_RETIRED = Object.freeze([]);
|
|
430
433
|
|
|
431
434
|
export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
432
435
|
// ── `clearotron-client-mcp.service` LEFT THIS TABLE ON 2026-09-03, AND SAYING SO IS THE POINT ────
|
|
@@ -436,7 +439,7 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
|
436
439
|
// that included it would have made that consent meaningless. That reasoning was right under that
|
|
437
440
|
// ruling and the exclusion was not an oversight.
|
|
438
441
|
//
|
|
439
|
-
// The owner superseded it knowingly (
|
|
442
|
+
// The owner superseded it knowingly (settled point 2): the door auto-starts with
|
|
440
443
|
// the product and the per-account key is the gate. It is now in SERVER_INSTALL_SET — which IS
|
|
441
444
|
// BACKGROUND_UNITS — and the pin/exclusion partition means it cannot be in both, so the row is gone
|
|
442
445
|
// rather than reworded. `--background` writes its settings from `enablePlan` before installing it.
|
|
@@ -447,12 +450,6 @@ export const BACKGROUND_EXCLUDED = Object.freeze({
|
|
|
447
450
|
// because production runs them today and deleting them would remove the only tracked description of a
|
|
448
451
|
// live service. An exclusion reason is required to be a sentence, and the true sentence is that the
|
|
449
452
|
// 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
453
|
"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
454
|
});
|
|
458
455
|
|
|
@@ -622,7 +619,7 @@ if (isMain) {
|
|
|
622
619
|
const argv = process.argv.slice(2);
|
|
623
620
|
const say = (s = "") => process.stdout.write(`${s}\n`);
|
|
624
621
|
const err = (s) => process.stderr.write(`${s}\n`);
|
|
625
|
-
// Flipped at the first state-changing act (
|
|
622
|
+
// Flipped at the first state-changing act (the third criterion): a refusal AFTER
|
|
626
623
|
// writes must say what survives and that re-running is safe — the reader's only question at that
|
|
627
624
|
// moment, and one the screen never answered while the writes sat above the port probe.
|
|
628
625
|
let wroteState = false;
|
|
@@ -834,7 +831,7 @@ if (isMain) {
|
|
|
834
831
|
say(` reports ${paths.pool}`);
|
|
835
832
|
say(` signs in as ${user}`);
|
|
836
833
|
|
|
837
|
-
// ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN (
|
|
834
|
+
// ── THE PORTS, PROBED BEFORE ANYTHING IS WRITTEN (the sibling,) ──
|
|
838
835
|
//
|
|
839
836
|
// This block used to sit in section 4, after the secrets were minted, the data plane created, the
|
|
840
837
|
// grants file written and an example report seeded. So a box where another copy already held the port
|
|
@@ -857,7 +854,7 @@ if (isMain) {
|
|
|
857
854
|
s.once("listening", () => s.close(() => resolve(null)));
|
|
858
855
|
s.listen(port, HOST);
|
|
859
856
|
});
|
|
860
|
-
// ALL THREE DOORS, NOT TWO (
|
|
857
|
+
// ALL THREE DOORS, NOT TWO (found in review). The client door's port is resolved
|
|
861
858
|
// beside the other two, three lines up, and was left out of the loop written for exactly this
|
|
862
859
|
// principle. So a held client port was discovered AFTER the portal and the engine door had bound: the
|
|
863
860
|
// run fatalled mid-flight, tore down what it had started, and then did not exit — measured at rc=124
|
|
@@ -892,7 +889,7 @@ if (isMain) {
|
|
|
892
889
|
continue;
|
|
893
890
|
}
|
|
894
891
|
}
|
|
895
|
-
//
|
|
892
|
+
// That wording, not a second copy of it. That helper already distinguishes EADDRINUSE from EACCES
|
|
896
893
|
// on a privileged port and from an address this host does not have, and names the way out of each;
|
|
897
894
|
// the launcher having its own shorter sentence for one of the three would mean a user meets two
|
|
898
895
|
// different answers to the same question depending on which door refused first.
|
|
@@ -960,7 +957,7 @@ if (isMain) {
|
|
|
960
957
|
catch (e) { fatal(`could not create the grants file at ${paths.grants} (${String(e?.message ?? e)}).`); }
|
|
961
958
|
say(` created ${paths.grants} (an empty roster — one staff address, no clients yet)`);
|
|
962
959
|
}
|
|
963
|
-
// THE REVOCATION LIST, CREATED — not merely named (
|
|
960
|
+
// THE REVOCATION LIST, CREATED — not merely named (found in review).
|
|
964
961
|
//
|
|
965
962
|
// The door is started with TRADEMARK_MCP_TOKEN_DENYLIST pointing here, and since this branch
|
|
966
963
|
// `isRevoked` fails CLOSED on an unreadable file — it refuses the token rather than assuming it was
|
|
@@ -1248,7 +1245,7 @@ if (isMain) {
|
|
|
1248
1245
|
} catch { /* no file yet — the union is the whole of it */ }
|
|
1249
1246
|
// ONE COMPOSER for "where do I set these", used by the start-time refusal and by the order-time
|
|
1250
1247
|
// announcement below it. Two copies of this sentence is how one of them comes to name a file the
|
|
1251
|
-
// reader cannot use
|
|
1248
|
+
// reader cannot use.
|
|
1252
1249
|
const orderRemedy = (homeEnv) => {
|
|
1253
1250
|
const cliEnv = envFileRead();
|
|
1254
1251
|
return cliEnv
|
|
@@ -1411,7 +1408,7 @@ if (isMain) {
|
|
|
1411
1408
|
// deriving the bus at two of them is worse than at none: `enable --now` would succeed against the
|
|
1412
1409
|
// derived bus while the health read three screens down still asks the bus-less one, so every unit
|
|
1413
1410
|
// would start and then be reported as not running. Driven into by accident while building
|
|
1414
|
-
//
|
|
1411
|
+
// "4 of 4 unit(s) did not come up" over four units that had just been enabled.
|
|
1415
1412
|
// Making all five derive it is a real improvement to the install path and is its own change with its
|
|
1416
1413
|
// own drive, not a side effect of repairing a refusal.
|
|
1417
1414
|
try { execFileSync("systemctl", ["--user", "daemon-reload"], CAPTURE_STDERR); }
|
|
@@ -1471,7 +1468,7 @@ if (isMain) {
|
|
|
1471
1468
|
}
|
|
1472
1469
|
// enable --now on an ALREADY-ACTIVE unit is a no-op, so a refresh would leave the old process
|
|
1473
1470
|
// running the old files. EVERY long-running unit in the set is restarted, not a hardcoded pair
|
|
1474
|
-
// (
|
|
1471
|
+
// (found in review): the pair here matched the pair the health check used three
|
|
1475
1472
|
// lines down, and carried the same stale justification about "the oneshot and its triggers". There
|
|
1476
1473
|
// is no oneshot in the set. So a refresh restarted the portal and the engine door onto new code and
|
|
1477
1474
|
// left the worker and the client door on the old — while the check below now reports all four up,
|
|
@@ -1490,7 +1487,7 @@ if (isMain) {
|
|
|
1490
1487
|
// reintroduce it through a second door.
|
|
1491
1488
|
//
|
|
1492
1489
|
// 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
|
|
1490
|
+
// not in the process. That is why this is a restart rather than a re-place
|
|
1494
1491
|
// rather than a re-place.
|
|
1495
1492
|
if (adoptedClientDoor && !backgroundRefresh) {
|
|
1496
1493
|
try { execFileSync("systemctl", ["--user", "restart", CLIENT_DOOR_UNIT], { stdio: "ignore" }); }
|
|
@@ -1499,7 +1496,7 @@ if (isMain) {
|
|
|
1499
1496
|
|
|
1500
1497
|
// STARTED IS NOT RUNNING (the connect lesson): settle, then read each service's own state.
|
|
1501
1498
|
//
|
|
1502
|
-
// EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET (
|
|
1499
|
+
// EVERY UNIT THIS FLAG INSTALLS, DERIVED FROM THE SET (found in review). This checked
|
|
1503
1500
|
// a hardcoded PAIR while `enable --now` had just started FOUR. So a client door crash-looping against
|
|
1504
1501
|
// a held port got no ✗, was never named in the banner, and `start --background` printed its success
|
|
1505
1502
|
// block and exited 0 over a product that was two-thirds up. The worker was unchecked for the same
|
|
@@ -1508,7 +1505,7 @@ if (isMain) {
|
|
|
1508
1505
|
// The comment here used to justify the gap: "the oneshot worker and its timer/path are judged by
|
|
1509
1506
|
// being enabled". That is stale — clearotron-worker.service is `runner.mjs --watch`, Type=simple,
|
|
1510
1507
|
// Restart=on-failure, and there is no timer or path unit in the install set at all. It described the
|
|
1511
|
-
// retired
|
|
1508
|
+
// retired clearotron-* units. A stale justification is worse than none: it reads as a decision.
|
|
1512
1509
|
//
|
|
1513
1510
|
// Judged by the unit's OWN declared Type rather than by a list kept here, so a oneshot added to the
|
|
1514
1511
|
// set later is judged correctly instead of being reported as broken for exiting.
|
|
@@ -1601,7 +1598,7 @@ if (isMain) {
|
|
|
1601
1598
|
if (stopping) return;
|
|
1602
1599
|
if (!fatal) {
|
|
1603
1600
|
err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)} — the portal is still up,`
|
|
1604
|
-
+ ` but the queue will not
|
|
1601
|
+
+ ` but the queue will not be worked.\n`);
|
|
1605
1602
|
return;
|
|
1606
1603
|
}
|
|
1607
1604
|
err(`\nstart: ${name} (${script}) could not be started: ${String(e?.message ?? e)}\n`);
|
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
package/docs/DELIVERY.md
CHANGED
|
@@ -53,7 +53,9 @@ both forms as defence.
|
|
|
53
53
|
| `msgId` | string | thread with `In-Reply-To:` on the email |
|
|
54
54
|
| `subject` | string | on a clearance, `<the product's own name> — <mark>` (`deliverySubject`, e.g. `Global preliminary search — NOVAPULSE`; the mark falls back to `ref`, then `matter`). On a knockout, `Knockout trademark review — <ref> (N marks)` |
|
|
55
55
|
| `emailBodyHtml` | string | the FULL email body, one self-contained inline-HTML fragment — send **verbatim**, do not re-encode; report + audit links are already inside |
|
|
56
|
-
| `whatsappTo` | string \| null |
|
|
56
|
+
| `whatsappTo` | string \| null | the chat recipient: **the person who requested the run**, when a number is held for them. `null` when none is — see `whatsappToReason` |
|
|
57
|
+
| `whatsappToReason` | string \| null | why `whatsappTo` is null. Present only when it is. The packet states the gap rather than quietly routing the notice somewhere else |
|
|
58
|
+
| `whatsappCcOperator` | string \| null | the operator's own copy of the same notice, from the agent roster. `null` when the deployment has switched it off. Independent of `whatsappTo`: either, both or neither may be present |
|
|
57
59
|
| `whatsappText` | string | ready-to-send completion line (includes every report URL) |
|
|
58
60
|
| `url` | string \| null | the run's published report URL — **null for a multi-name knockout**, which has no single report. See below |
|
|
59
61
|
| `reports` | `[{mark, url}]` | one entry per published document, one per name. Written by the KNOCKOUT lane only — **absent** on a clearance packet, whose single document is`url` |
|
|
@@ -145,7 +147,9 @@ The filesystem loop below remains equivalent for integrators that do have data-p
|
|
|
145
147
|
for `state: "delivered", sendPending: true` (backstop).
|
|
146
148
|
2. **Send**: for `delivered`, email `emailBodyHtml` verbatim to the requester behind
|
|
147
149
|
`forwarder`/`forwarderEmail`, `Subject:` = `subject`, `In-Reply-To:` = `msgId`; optionally
|
|
148
|
-
chat `whatsappText` to `whatsappTo
|
|
150
|
+
chat `whatsappText` to `whatsappTo` and, separately, to `whatsappCcOperator` when present. A null
|
|
151
|
+
`whatsappTo` with a `whatsappToReason` means nobody is reachable for that requester — surface it, do
|
|
152
|
+
not redirect the notice to the operator instead. For every other kind, `text` is ready to route as-is.
|
|
149
153
|
3. **Write back**: create a `.sent` marker in the (archived) run dir after a successful send —
|
|
150
154
|
the idempotency guard that prevents double-sends if markers fire twice. Then clear the
|
|
151
155
|
consumed `.pending` files. The MCP verb writes it as JSON
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Part of the architecture pack (`docs/architecture/`). The driver's module tree and the headless
|
|
4
4
|
> integrator contract are in [`driver/README.md`](../../driver/README.md).
|
|
5
5
|
|
|
6
|
-
The
|
|
6
|
+
The clearotron driver turns a plain-language clearance request into a delivered, lawyer-vetted
|
|
7
7
|
preliminary trademark clearance report. One matter in, one decision out — with the investigation,
|
|
8
8
|
the reasoning, the challenge, and the paper trail in between run by deterministic code that treats
|
|
9
9
|
the model as a reasoning step, never as the orchestrator.
|
|
@@ -54,7 +54,7 @@ flowchart LR
|
|
|
54
54
|
E -.- e2["Client's framework and format;<br/>lawyer vets, then it moves"]
|
|
55
55
|
|
|
56
56
|
classDef phase fill:#1a3a5c,stroke:#4a90d9,color:#fff
|
|
57
|
-
classDef note fill:none,stroke:none,color
|
|
57
|
+
classDef note fill:none,stroke:none,color:#888,font-size:12px
|
|
58
58
|
class A,B,C,D,E phase
|
|
59
59
|
class a2,b2,c2,d2,e2 note
|
|
60
60
|
```
|
|
@@ -48,7 +48,7 @@ flowchart TB
|
|
|
48
48
|
PL["Register-provider plugins<br/>(gateway-hosted tools)"]
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
subgraph DRV["The product:
|
|
51
|
+
subgraph DRV["The product: clearotron driver — plain Node, systemd, no agent sandbox"]
|
|
52
52
|
direction TB
|
|
53
53
|
RUN["runner.mjs<br/>queue drain · claims · dedup · parks"]
|
|
54
54
|
PIPE["pipeline.mjs<br/>stage sequence · gates · clamps · recovery"]
|
|
@@ -81,7 +81,7 @@ flowchart TB
|
|
|
81
81
|
OB -. "wake" .-> AG
|
|
82
82
|
POOL -.-> MCPQ
|
|
83
83
|
|
|
84
|
-
classDef product fill
|
|
84
|
+
classDef product fill:#12324f,stroke:#4a90d9,color:#fff
|
|
85
85
|
class DRV,RUN,PIPE,STG,GWM,ENG,SKL,PROF,PUB product
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -157,7 +157,7 @@ own declared `model`, or `axisTier(axis)` where it declares none (`register-unit
|
|
|
157
157
|
— with the thinking tier `thinkingFor()` gives it. There is no fallback rung and no cross-provider tail.
|
|
158
158
|
|
|
159
159
|
There used to be: a model-failover chain (same-family fallback, then `azure` and `gemini`) gated on a
|
|
160
|
-
multi-provider engine. It is **deleted** (
|
|
160
|
+
multi-provider engine. It is **deleted** (2026-08-03). It had never run — no stage ever declared
|
|
161
161
|
a fallback and the engine gate was never true — so it was dead machinery with a report-HTML block and a
|
|
162
162
|
test attached. It was deleted rather than armed, because arming it means untested code firing for the
|
|
163
163
|
first time in the middle of a production failure, and a silent mid-run model swap changes which model
|
|
@@ -188,8 +188,9 @@ deployment may override (verify live values per deployment).
|
|
|
188
188
|
| Var | Default | Meaning |
|
|
189
189
|
|---|---|---|
|
|
190
190
|
| `CLEAROTRON_WORK_DIR` | `$HOME/trademark/workspace` | Root holding `workspace-<agent>/` (queues, run dirs). Same name as before, new default: it used to be an agent platform's own dot-directory, which README says in bold the engine does not require. Nothing to migrate — the variable's spelling did not change — but **a deployment that ran on the old default and does not pin this variable moves its run directories on upgrade**, and`driver/systemd/prelim-driver.path` / `prelim-outbox.path` hardcode absolute globs that no environment variable can reach (read the units — the literal is in them). Set it explicitly on every deployed box; the units' globs must name the same root. |
|
|
191
|
+
| `CLEAROTRON_CHECKOUT_DIR` | the installed package root | Where the running code lives, and what the service units execute — every unit's `ExecStart` is `${CLEAROTRON_CHECKOUT_DIR}/…`. On a packaged install that is `<home>/app/node_modules/clearotron`, which is npm-owned and **replaced wholesale on upgrade**: an install deletes and recreates that tree, so anything kept inside it does not survive. This is why the settings file lives outside it. A running service holds its own copy of the deleted tree until restarted, so after an upgrade the units serve the OLD code until they are restarted deliberately — including any hand-made unit nobody remembered to restart. |
|
|
191
192
|
| `CLEAROTRON_INSTRUCTIONS_DIR` | `<driver>/skills` | Compute-skills tree; the engine absolutizes `skills/…` refs against it and grants `--add-dir`. |
|
|
192
|
-
| `CLEAROTRON_SKILLS_STORE_STRICT` | unset (warn) | Hard mode for the run door's doctrine-store check (
|
|
193
|
+
| `CLEAROTRON_SKILLS_STORE_STRICT` | unset (warn) | Hard mode for the run door's doctrine-store check (`driver/skills-store-provenance.mjs`). The door classifies the store `CLEAROTRON_INSTRUCTIONS_DIR` names into the publication gate's three outcomes — **pass**, **fail** (uncommitted changes under the served path, or a HEAD not contained in the main line), **blocked** (could not be determined: git absent, an unreadable ancestor, no main-line ref, or a store no commit tracks). A store affirmatively outside any checkout passes: the walk to the filesystem root must complete with every step readable, so "no git evidence" can never be inferred from a directory this process cannot see. Unset, a non-pass prints one `[preflight]` line to stderr and stamps a `skills-store` event into the run's `_driver/run.jsonl`, and the run proceeds. Set (`1`; `0`/`off`/`false`/`no`/empty do not arm it), any non-pass **refuses the run before any spend** — `blocked` included, because a store whose state nobody can name is not a store anybody can reproduce. |
|
|
193
194
|
| `CLEAROTRON_SKILLS_STORE_MAIN_BRANCH` | `main` | Which branch name the check above treats as the main line. A deployment whose config store is on `master` sets this; otherwise that store has no main-line ref to be measured against and every run reports `blocked`. Only the branch name — the check prefers `origin/<name>` and falls back to the local ref. |
|
|
194
195
|
| `CLEAROTRON_MIN_FREE_DISK_MB` | `500` | Free space the run door requires on the filesystem holding `CLEAROTRON_WORK_DIR`, in MB. Below it a run is **refused** before anything is written — a disk that fills mid-run surfaces as a *missing artifact* at some later stage, which is indistinguishable from an engine or provider fault. Not a sizing estimate: one real delivered run measured 5.85 MB, so 500 MB is the line below which the filesystem is in trouble for reasons of its own.`0` disables the check; a non-numeric value **throws** rather than silently disabling it. A disk that cannot be measured is reported and the run proceeds — never read as room. |
|
|
195
196
|
| `CLEAROTRON_REPORTS_DIR` | **none — set it** | Publish pool (web-served). **No default since: unset refuses and names the variable.** It read`/srv/trademark-archive` — a deployed server's real client archive — so a forgotten export published into somebody else's matter, and two entry points already carried hand-written defences against exactly that (`bin/onboard.mjs`, `bin/example.mjs`). Same shape as `CLEAROTRON_DATABASE` and `scripts/purge-runs.mjs`: guessing wrong is expensive, so it does not guess. Read-only surfaces (flag snapshot, status page, MCP options) degrade to "no pool" instead of throwing; anything that writes refuses. `driver/production-pool-guard.mjs` still names `/srv/trademark-archive` on purpose — that constant is a fact about where the archive is, not a default. |
|
|
@@ -276,7 +277,7 @@ of truncations.
|
|
|
276
277
|
### Surfaces beside the driver — portal, demo, e2e harness
|
|
277
278
|
|
|
278
279
|
These are read by code that ships in this repository but is not a clearance stage. They are here
|
|
279
|
-
because
|
|
280
|
+
because the rule is about what PRODUCT CODE reads, not about what a run reads.
|
|
280
281
|
|
|
281
282
|
| Var | Default | Meaning |
|
|
282
283
|
|---|---|---|
|
|
@@ -286,6 +287,8 @@ because 's rule is about what PRODUCT CODE reads, not about what a run reads.
|
|
|
286
287
|
| `PORTAL_LOCAL_PASSPHRASE` | unset | **NEVER set this in a file.** An internal one-shot handoff, not an operator control: on a first FOREGROUND start the supervisor mints the passphrase and hands it to the portal it spawns *at the spawn call*, so the closing summary can print the value beside the address rather than sending a first-time reader back into eleven startup log lines for the one value in this product that cannot be read back. It is deliberately absent from the composed child environments, because that composition is what `--background` writes into the units' env file — a passphrase there would be a permanent plaintext copy on disk and the product's own sentence, "it is stored only as a digest", would stop being true. Setting it in any env file recreates exactly that. Lost passphrase: `clearotron passphrase --reset`. |
|
|
287
288
|
| `PORTAL_URL` | `http://127.0.0.1:18802`, or built from `PORTAL_SERVICE_HOST`/`PORTAL_SERVICE_PORT` | Where the deploy tick's live-surface check expects to reach the portal. |
|
|
288
289
|
| `PORTAL_OPS_TOKEN_FILE` | `~/.config/systemd/user/trademark-portal.service.d/secrets.conf` | The systemd drop-in the live-surface check reads `PORTAL_OPS_TOKEN` out of. It reads the FILE rather than the environment so a check run by hand sees the same token the service does. |
|
|
290
|
+
| `CLEAROTRON_CUT_REF` | `HEAD` | Which ref the cut decision reads the version from. **Read only by the release workflow, never set on a deployment.** The jobs that ask about `main` set it to `origin/main` explicitly, because their checkout is pinned to the run's own ref and `HEAD` there is that ref rather than the branch they are deciding about. A job that asks the wrong subject gets a confident wrong answer. |
|
|
291
|
+
| `CLEAROTRON_RELEASE_WAIT_MS` | 25 minutes | How long a requested cut waits for the version pull request to merge itself before giving up. **Read only by the release workflow.** A rehearsal sets it to `0` so the wiring is exercised without holding a runner. Giving up is a quiet success by design — the scheduled run underneath catches a cut whose wait expired — so this budget failing shows up as a slow job rather than a red one. |
|
|
289
292
|
| `CLEAROTRON_AGENT_MCP_URL` | unset (⇒ `null`) | The API-key MCP door advertised to a signed-in client. Null until that door is deployed, and the UI keeps its honest empty state rather than inventing a URL. |
|
|
290
293
|
| `CLEAROTRON_AGENTS` | derived | Comma-separated agent ids for `scripts/purge-runs.mjs` to sweep. |
|
|
291
294
|
| `CLEAROTRON_E2E_DIR` | **none — the script refuses without it** | The config repo's `e2e/` directory. There is one suite and it is not in this repo (owner ruling 2026-08-07), so the comparison script names the variable rather than defaulting anywhere. |
|
|
@@ -97,11 +97,11 @@ product doc.
|
|
|
97
97
|
| **Client allowlist** (`{version, grants:[{email, customer}]}`) | T2 | git + PR on the `CLIENT_ACCESS_MAP` file | see §2 row 4 | LIVE, file-only; surfaced read-only at `admin.access` |
|
|
98
98
|
| **Ops tokens** (scope ops/user, verbs, accounts, TTL) | T4 | `mint-token.mjs` CLI; jti denylist file | operator-held tokens | LIVE, CLI |
|
|
99
99
|
|
|
100
|
-
## 4b. The install surface names (
|
|
100
|
+
## 4b. The install surface names ()
|
|
101
101
|
|
|
102
102
|
The variables a **customer or installer** ever types carry the product’s own prefix. They are listed
|
|
103
103
|
by name in §5 below and in the upgrade table in INSTALL.md.
|
|
104
|
-
`
|
|
104
|
+
`CLEAROTRON` is the internal codename of the first product this engine shipped and means nothing to a reader
|
|
105
105
|
who has not read the code. Vendor credentials keep the vendor’s name (`SIGNA_API_KEY`,
|
|
106
106
|
`PERPLEXITY_API_KEY`, `ANTHROPIC_API_KEY`) — that already says who you bought them from.
|
|
107
107
|
|
|
@@ -226,10 +226,13 @@ environment including production**; unset resolves to `null` and throws at first
|
|
|
226
226
|
|
|
227
227
|
`CLEAROTRON_WORK_DIR` (~/trademark/workspace since; the two`.path` units
|
|
228
228
|
hardcode the old glob — see 04), `CLEAROTRON_WORKSPACE_PREFIX` (workspace-), `CLEAROTRON_QUEUE_DIR`,
|
|
229
|
+
`CLEAROTRON_CHECKOUT_DIR` (the installed package root every unit's `ExecStart` names; npm-owned and
|
|
230
|
+
replaced wholesale on upgrade, which is why the settings file lives OUTSIDE it — and why a service not
|
|
231
|
+
restarted after an upgrade keeps serving the deleted tree),
|
|
229
232
|
`CLEAROTRON_INSTRUCTIONS_DIR` (config store), `CLEAROTRON_CUSTOMERS_DIR` (config store), `CLEAROTRON_RECIPES_DIR`,
|
|
230
233
|
`CLEAROTRON_REPORTS_DIR` (**no default since — unset refuses**),`CLEAROTRON_RUN_LOCK_DIR`, `CLEAROTRON_OUTBOX_DIR`,
|
|
231
234
|
`CLEAROTRON_STAFF_POOL_ROOT`, `CLEAROTRON_REGISTER_CALL_LOG` (~/trademark/telemetry/…, homedir-derived at
|
|
232
|
-
call time, resolved by existence over the pre- telemetry directory too; the pre-
|
|
235
|
+
call time, resolved by existence over the pre-change telemetry directory too; the pre-
|
|
233
236
|
`CORSEARCH_*_LOG` names remain accepted for one release),
|
|
234
237
|
`CLEAROTRON_REGISTER_RECORD_LOG` (**no longer a box path since ** — the driver injects
|
|
235
238
|
`<runDir>/_driver/register-record-bodies.jsonl` per run; setting it by hand pins every run's record
|
|
@@ -255,6 +258,19 @@ drops BACKOFF from the prefix, which the elided spelling this row used to carry
|
|
|
255
258
|
`CLEAROTRON_OUTBOX_NOPROGRESS_MAX`, `TRADEMARK_MSGID_DOMAIN` (enqueue.local).
|
|
256
259
|
Code-set per stage (not operator-set): `CLEAROTRON_GATHER_AGENT` / `CLEAROTRON_GATHER_SESSION_KEY` / `CLEAROTRON_GATHER_SESSION_ID`.
|
|
257
260
|
|
|
261
|
+
**Who the completion notice reaches** — `CLEAROTRON_REQUESTER_WHATSAPP` (empty; effect: deployment) is a
|
|
262
|
+
JSON map of requester email or handle → number, and `CLEAROTRON_WHATSAPP_OPERATOR_COPY` (on unless `0`,
|
|
263
|
+
`false` or `no`; effect: deployment) keeps or drops the operator's own copy of the same notice. The two are
|
|
264
|
+
independent: an operator can stop receiving copies of other people's runs without changing who the
|
|
265
|
+
requester notice reaches.
|
|
266
|
+
|
|
267
|
+
`CLEAROTRON_AGENT_WHATSAPP` above is keyed by AGENT id, and every user of a deployment shares one agent —
|
|
268
|
+
which is why the notice used to reach the operator and never the person who ordered the search. Unset is
|
|
269
|
+
an EMPTY roster and never a demo one: a deployment that configures nothing routes no notice, and the
|
|
270
|
+
delivery record names whose number is missing rather than quietly substituting the operator's.
|
|
271
|
+
`CLEAROTRON_REQUESTER_WHATSAPP` holds contact data; treat it as a mirror-aware value under §6 wherever an
|
|
272
|
+
integrator holds a copy.
|
|
273
|
+
|
|
258
274
|
### 5.8 Credentials — T4 (secrets; EnvironmentFile only; mirror-aware — see §6)
|
|
259
275
|
|
|
260
276
|
`ANTHROPIC_API_KEY`, `CORSEARCH_SESSION_KEY` (fail-closed preflight),
|
|
@@ -303,7 +319,7 @@ systemd, writes no heartbeat, and must keep saying "waiting to start" rather tha
|
|
|
303
319
|
repo** — `git grep process.env.CLIENT_ACCESS` here returns nothing, so they are governed here and
|
|
304
320
|
never appear in the audit).
|
|
305
321
|
|
|
306
|
-
**Which identity source the portal runs (
|
|
322
|
+
**Which identity source the portal runs () — T4, and it is chosen by name, never inferred.**
|
|
307
323
|
`PORTAL_AUTH_MODE` selects the door: unset or `auth-proxy` (the default for a hosted deployment) means
|
|
308
324
|
any login system in front that authenticates in the browser and forwards a verifiable JWT per request.
|
|
309
325
|
**Any OIDC or JWT proxy is a choice per deployment** — for example Cloudflare Access, which is not a
|
|
@@ -318,7 +334,7 @@ values the staff MCP face already reads as `TRADEMARK_MCP_OIDC_ISSUER`, `TRADEMA
|
|
|
318
334
|
never passed them, which is how one product shipped a provider-agnostic API face and a single-vendor
|
|
319
335
|
web portal.
|
|
320
336
|
|
|
321
|
-
**ALL FIVE DOORS READ THE FOUR NOW, and
|
|
337
|
+
**ALL FIVE DOORS READ THE FOUR NOW, and the "the auth mechanism is out of scope" boundary is
|
|
322
338
|
superseded** (owner, 2026-08-23: an installation brings its own identity provider and this product may
|
|
323
339
|
not force one). The two write services and the client MCP origin gained the set they lacked; the table
|
|
324
340
|
below names every one of the twelve. The client door's four fall back to the staff face's equivalents
|
|
@@ -441,6 +457,23 @@ it in CI and nowhere else — on a deployed box it silences the one check that n
|
|
|
441
457
|
`portal-ui/` has **zero** env config (no `VITE_*`, no `import.meta.env`) — the SPA talks to its
|
|
442
458
|
origin; all portal config lives server-side in portal-service.
|
|
443
459
|
|
|
460
|
+
### 5.11 Release pipeline — CI only (never set on a deployment)
|
|
461
|
+
|
|
462
|
+
These are read by the release workflow and by nothing a deployment runs. They are listed here because a
|
|
463
|
+
name absent from this register is a name nobody can look up, not because an operator has any reason to set
|
|
464
|
+
one — and setting either on a box does nothing at all.
|
|
465
|
+
|
|
466
|
+
`CLEAROTRON_CUT_REF` (default `HEAD`) — which ref the cut decision reads the version from. The jobs that
|
|
467
|
+
ask about `main` set it to `origin/main` explicitly, because their checkout is pinned to the run's own ref
|
|
468
|
+
and `HEAD` there is that ref rather than the branch being decided about. A job that asks about the wrong
|
|
469
|
+
subject gets a confident wrong answer.
|
|
470
|
+
|
|
471
|
+
`CLEAROTRON_RELEASE_WAIT_MS` (default 25 minutes) — how long a requested cut waits for the version pull
|
|
472
|
+
request to merge itself. A rehearsal sets `0`, so the wiring is exercised without holding a runner. Giving
|
|
473
|
+
up is a quiet success by design and the scheduled run underneath catches what it misses, so a budget that
|
|
474
|
+
is wrong shows up as a slow job rather than a red one — which is why it is written down rather than left
|
|
475
|
+
to be inferred from a timeout.
|
|
476
|
+
|
|
444
477
|
## 6. Drift patterns — values that are mirrored by design
|
|
445
478
|
|
|
446
479
|
Wherever one value must exist in more than one place, name every copy and rotate them in one
|
|
@@ -110,6 +110,18 @@ and the environment file holding the secrets.
|
|
|
110
110
|
- **A scheduled gateway restart** (chat-channel session and plugin-loader hygiene) should *defer*
|
|
111
111
|
off live work rather than skip: wait while a run is live, up to a bound, then restart anyway.
|
|
112
112
|
`XDG_RUNTIME_DIR` must be set for `systemctl --user` to work from cron.
|
|
113
|
+
- **Pin the agent id before upgrading an install made before 0.2.2.** The default agent id changed
|
|
114
|
+
from `clawdi` to `localagent`, and that id is a path segment: runs live under
|
|
115
|
+
`<workspaceRoot>/workspace-<agent>/studio/prelim-search/`. An install that never set one starts
|
|
116
|
+
reading an empty workspace, and empty reads as "no runs" rather than as an error. Set **both**
|
|
117
|
+
variables in the environment file — the gather servers read their own:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
CLEAROTRON_DEFAULT_AGENT=clawdi
|
|
121
|
+
CLEAROTRON_GATHER_AGENT=clawdi
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
An install that already sets them is unaffected, and a fresh install needs neither.
|
|
113
125
|
- **Integrator-platform upgrades** go through that platform's own guarded upgrade path — dry-run,
|
|
114
126
|
exact-version confirm, stop → update → start. Never `npm i -g` / `pnpm add -g` directly.
|
|
115
127
|
|
|
@@ -242,7 +254,7 @@ the measurement that says so is.
|
|
|
242
254
|
|
|
243
255
|
A box upgraded across the rename keeps whatever NAME its **call** ledger already had
|
|
244
256
|
(`corsearch-calls.jsonl`), and across the move keeps whatever DIRECTORY it sits in (the
|
|
245
|
-
pre- telemetry directory), because the resolver reads the file that is there. Read
|
|
257
|
+
pre-change telemetry directory), because the resolver reads the file that is there. Read
|
|
246
258
|
`providers/_shared/ledger-path.mjs` to see which of the four candidates a box resolves to.
|
|
247
259
|
|
|
248
260
|
## Access control and instance isolation
|
|
@@ -203,7 +203,7 @@ stylesheets above.
|
|
|
203
203
|
| **Doctrine** | `skills/`, framework decks, worked examples | The asset; transfers under the definitive agreement. Worked examples derive from real matters — treat as client-adjacent |
|
|
204
204
|
| **Customer profiles** | `profiles/*.json`, context packs, `_audit.log` | Client-identifying by design (names, own brands, competitor lists) — the reason this *pack* names no clients |
|
|
205
205
|
| **Reference library / calibration corpus** | outside the repo | Built on real client matters — **confidential client material, not freely transferable IP**; transfer needs a client-consent/sanitization plan |
|
|
206
|
-
| **Telemetry** | `~/trademark/telemetry/*.jsonl` (a box upgraded across the move keeps the pre- telemetry directory — resolved by existence, oldest first),`_driver/*.jsonl` | Billing-grade provider usage + attempt telemetry; append-only; no automated retention |
|
|
206
|
+
| **Telemetry** | `~/trademark/telemetry/*.jsonl` (a box upgraded across the move keeps the pre-change telemetry directory — resolved by existence, oldest first),`_driver/*.jsonl` | Billing-grade provider usage + attempt telemetry; append-only; no automated retention |
|
|
207
207
|
|
|
208
208
|
**Posture commitments** (engineering-true, restated from the outward materials): no client data
|
|
209
209
|
trains any model; each client's context is isolated in its profile bundle and frozen per run;
|
|
@@ -69,7 +69,7 @@ at runtime.
|
|
|
69
69
|
exceed the threshold, 15 were already named by an ancestor**, and three one-line additions closed the
|
|
70
70
|
rest. The mechanism was not new — it was unchecked.
|
|
71
71
|
|
|
72
|
-
**This paragraph is what
|
|
72
|
+
**This paragraph is what the absence-record predicted it would become.** That record said "a new
|
|
73
73
|
directory ships without a front door and nothing says so", named itself as a known gap rather than a
|
|
74
74
|
mechanism, and ended "if the guard is built later, this paragraph is what it replaces". It has been.
|
|
75
75
|
|