@intentius/chant 0.124.13 → 0.124.15
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
package/dist/identity.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The identity contract (#1982) — which principal chant would act as in each
|
|
3
|
+
* substrate, reported before it acts.
|
|
4
|
+
*
|
|
5
|
+
* Every native observer already resolves this. `ObserverAdapter.bind()`
|
|
6
|
+
* (./observation.ts) reaches the provider on the applier's own transport, the
|
|
7
|
+
* k8s connector resolves a kubeconfig context and says which binding produced
|
|
8
|
+
* it, the aws read client resolves a region and an endpoint. All of it is
|
|
9
|
+
* discarded. The only way the answer has ever surfaced is as an `unobserved`
|
|
10
|
+
* entry with reason `no-credentials`, or — worse — as a successful read
|
|
11
|
+
* against the wrong account.
|
|
12
|
+
*
|
|
13
|
+
* A project spanning aws, k8s, gcp and github reaches four substrates with
|
|
14
|
+
* four credential sets, and nothing says which identity each one resolves to.
|
|
15
|
+
* `chant lifecycle whoami <env>` asks each configured lexicon that question
|
|
16
|
+
* and prints one row per lexicon.
|
|
17
|
+
*
|
|
18
|
+
* ## The tri-state
|
|
19
|
+
*
|
|
20
|
+
* The same discipline the observation contract draws between "absent" and
|
|
21
|
+
* "not observed" applies here, because the same mistake is available: an empty
|
|
22
|
+
* identity reads as "nobody", and "nobody" is not what "I could not find out"
|
|
23
|
+
* means.
|
|
24
|
+
*
|
|
25
|
+
* - **REPORTED** — the lexicon asked the substrate and it answered. A
|
|
26
|
+
* principal, a scope, and where the binding came from.
|
|
27
|
+
* - **UNRESOLVED** — the lexicon tried and could not, carrying a total
|
|
28
|
+
* {@link UnobservedReason}. `no-credentials` is "no identity is
|
|
29
|
+
* configured"; `no-binding` and `read-failed` are "could not determine".
|
|
30
|
+
* Those are different answers and the reason keeps them apart.
|
|
31
|
+
* - **NOT REPORTED** — the lexicon implements no {@link
|
|
32
|
+
* import("./lexicon.js").LexiconPlugin.describeIdentity}. It answers for
|
|
33
|
+
* nothing, which is honest; it is never rendered as an empty identity.
|
|
34
|
+
*
|
|
35
|
+
* ## Read-only, and never a gate
|
|
36
|
+
*
|
|
37
|
+
* `whoami` mutates nothing and blocks nothing. It exits 0 whatever the rows
|
|
38
|
+
* say unless the caller asks for a non-zero exit on an unresolved row with
|
|
39
|
+
* `--strict`. A lexicon's implementation is held to the same rule: a self-query
|
|
40
|
+
* that reaches the substrate must be one the substrate treats as a read of the
|
|
41
|
+
* caller's own identity.
|
|
42
|
+
*
|
|
43
|
+
* ## No credential ever reaches the output
|
|
44
|
+
*
|
|
45
|
+
* An identity is a principal and a scope — an account id, a project, an org, a
|
|
46
|
+
* cluster context, a service-account name. It is never a token, a key, a
|
|
47
|
+
* password or a certificate. The rule is on the lexicon: report the fact, not
|
|
48
|
+
* the value, and where a substrate's only identity signal IS a secret, say so
|
|
49
|
+
* without it.
|
|
50
|
+
*
|
|
51
|
+
* {@link redactCredentialMaterial} is the backstop core applies to every field
|
|
52
|
+
* of every row regardless, not a license to be careless. It is deliberately
|
|
53
|
+
* structural rather than heuristic — it redacts what the process actually
|
|
54
|
+
* holds in a credential-shaped environment variable, plus the three literal
|
|
55
|
+
* shapes (PEM block, JWT, `Bearer …`) that no principal string can be — so an
|
|
56
|
+
* account id, an ARN and a `system:serviceaccount:…` subject survive it intact.
|
|
57
|
+
*/
|
|
58
|
+
/** True when a lexicon answered with a typed refusal rather than an identity. */
|
|
59
|
+
export function isUnresolvedIdentity(value) {
|
|
60
|
+
return typeof value === "object" && value !== null && "unresolved" in value;
|
|
61
|
+
}
|
|
62
|
+
/** The marker a redacted field carries. Fixed text so a consumer can match it. */
|
|
63
|
+
export const REDACTED = "[redacted]";
|
|
64
|
+
/**
|
|
65
|
+
* Environment variables whose VALUE is credential material. Matched on the
|
|
66
|
+
* name, so a lexicon that echoes one of these into an identity string has the
|
|
67
|
+
* value removed before it is printed or serialized.
|
|
68
|
+
*/
|
|
69
|
+
export const CREDENTIAL_ENV_NAME = /(SECRET|TOKEN|PASSWORD|PASSWD|CREDENTIAL|PRIVATE_KEY|APIKEY|API_KEY|ACCESS_KEY|SESSION_KEY|AUTH)/i;
|
|
70
|
+
/** Shortest env value worth redacting. Below this a "secret" is a false positive. */
|
|
71
|
+
const MIN_CREDENTIAL_LENGTH = 8;
|
|
72
|
+
/**
|
|
73
|
+
* Literal credential shapes. Each is something a principal string cannot be,
|
|
74
|
+
* so matching one is proof rather than a guess.
|
|
75
|
+
*/
|
|
76
|
+
export const CREDENTIAL_SHAPES = [
|
|
77
|
+
// A PEM block of any key type.
|
|
78
|
+
/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
|
|
79
|
+
// A JWT: three base64url segments, the first starting with the `{"` header.
|
|
80
|
+
/\beyJ[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]*/g,
|
|
81
|
+
// An `Authorization`-style scheme plus its value.
|
|
82
|
+
/\b(?:Bearer|Basic)\s+[A-Za-z0-9\-._~+/]{16,}={0,2}/g,
|
|
83
|
+
];
|
|
84
|
+
/**
|
|
85
|
+
* Provider-prefixed access tokens, by their issuer's own prefix (#2356).
|
|
86
|
+
*
|
|
87
|
+
* Separate from {@link CREDENTIAL_SHAPES} because these are a **denylist of
|
|
88
|
+
* known formats** rather than proof-by-shape. A prefix nobody has added here —
|
|
89
|
+
* a new provider, an internal issuer, a bare random string — passes every one
|
|
90
|
+
* of them, and any caller relying on this must say so rather than claim
|
|
91
|
+
* coverage. What it does buy is that the tokens people actually paste are
|
|
92
|
+
* caught wherever they appear, whatever the field is called.
|
|
93
|
+
*
|
|
94
|
+
* The suffix bound is deliberately short. The prefix is the signal; a truncated
|
|
95
|
+
* or example token is still somebody having written a credential down.
|
|
96
|
+
*/
|
|
97
|
+
export const CREDENTIAL_TOKEN_SHAPES = [
|
|
98
|
+
{ name: "a GitHub token", re: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{6,}\b/g },
|
|
99
|
+
{ name: "a GitHub fine-grained token", re: /\bgithub_pat_[A-Za-z0-9_]{6,}\b/g },
|
|
100
|
+
{ name: "a GitLab personal access token", re: /\bglpat-[A-Za-z0-9_-]{3,}\b/g },
|
|
101
|
+
{ name: "an OpenAI-style secret key", re: /\bsk-(?:live-|proj-|test-)?[A-Za-z0-9]{6,}\b/g },
|
|
102
|
+
{ name: "a Stripe key", re: /\b[rs]k_(?:live|test)_[A-Za-z0-9]{6,}\b/g },
|
|
103
|
+
{ name: "a Slack token", re: /\bxox[abposr]-[A-Za-z0-9-]{6,}\b/g },
|
|
104
|
+
{ name: "an AWS access key id", re: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g },
|
|
105
|
+
{ name: "a Google API key", re: /\bAIza[0-9A-Za-z_-]{20,}\b/g },
|
|
106
|
+
{ name: "a Google OAuth token", re: /\bya29\.[0-9A-Za-z_-]{10,}/g },
|
|
107
|
+
{ name: "an npm token", re: /\bnpm_[A-Za-z0-9]{10,}\b/g },
|
|
108
|
+
];
|
|
109
|
+
/**
|
|
110
|
+
* Strip credential material from one reported field.
|
|
111
|
+
*
|
|
112
|
+
* Two rules, both structural. Any value this process holds in a
|
|
113
|
+
* credential-named environment variable is replaced wherever it appears, which
|
|
114
|
+
* covers the realistic accident — a lexicon echoing `$GITHUB_TOKEN` or
|
|
115
|
+
* `$AWS_SECRET_ACCESS_KEY` into a `source`. And the three literal shapes above
|
|
116
|
+
* are replaced on sight.
|
|
117
|
+
*
|
|
118
|
+
* Nothing is entropy-scored, so an ARN, an account id, a service-account email
|
|
119
|
+
* and a cluster context name pass through unchanged — which matters, because a
|
|
120
|
+
* mangled principal is a wrong answer, not a safe one.
|
|
121
|
+
*/
|
|
122
|
+
export function redactCredentialMaterial(value, env = process.env) {
|
|
123
|
+
let out = value;
|
|
124
|
+
for (const [name, secret] of Object.entries(env)) {
|
|
125
|
+
if (!secret || secret.length < MIN_CREDENTIAL_LENGTH)
|
|
126
|
+
continue;
|
|
127
|
+
if (!CREDENTIAL_ENV_NAME.test(name))
|
|
128
|
+
continue;
|
|
129
|
+
if (!out.includes(secret))
|
|
130
|
+
continue;
|
|
131
|
+
out = out.split(secret).join(REDACTED);
|
|
132
|
+
}
|
|
133
|
+
for (const shape of CREDENTIAL_SHAPES)
|
|
134
|
+
out = out.replace(shape, REDACTED);
|
|
135
|
+
// Provider-prefixed tokens too (#2356): these are the ones people paste, and
|
|
136
|
+
// the three shapes above match none of them.
|
|
137
|
+
for (const { re } of CREDENTIAL_TOKEN_SHAPES)
|
|
138
|
+
out = out.replace(re, REDACTED);
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
/** Apply {@link redactCredentialMaterial} to every free-text field of a row. */
|
|
142
|
+
export function redactIdentityRow(row, env = process.env) {
|
|
143
|
+
const clean = (v) => v === undefined ? undefined : redactCredentialMaterial(v, env);
|
|
144
|
+
return {
|
|
145
|
+
...row,
|
|
146
|
+
...(row.identity !== undefined ? { identity: clean(row.identity) } : {}),
|
|
147
|
+
...(row.scope !== undefined ? { scope: clean(row.scope) } : {}),
|
|
148
|
+
...(row.source !== undefined ? { source: clean(row.source) } : {}),
|
|
149
|
+
...(row.endpoint !== undefined ? { endpoint: clean(row.endpoint) } : {}),
|
|
150
|
+
...(row.detail !== undefined ? { detail: clean(row.detail) } : {}),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Normalize one lexicon's answer into a row.
|
|
155
|
+
*
|
|
156
|
+
* Every degradation lands somewhere honest. No method at all is NOT REPORTED.
|
|
157
|
+
* A throw is UNRESOLVED with `read-failed` — the lexicon reached for the
|
|
158
|
+
* substrate and something broke, which is a different claim from having no
|
|
159
|
+
* credentials. An answer that carries no identity string is UNRESOLVED too: a
|
|
160
|
+
* lexicon cannot report an empty principal, because an empty principal renders
|
|
161
|
+
* as "acting as nobody", and nobody is a claim.
|
|
162
|
+
*/
|
|
163
|
+
export function identityRowFor(lexicon, result, env = process.env) {
|
|
164
|
+
if (result === undefined)
|
|
165
|
+
return { lexicon, status: "not-reported" };
|
|
166
|
+
if (isUnresolvedIdentity(result)) {
|
|
167
|
+
return redactIdentityRow({
|
|
168
|
+
lexicon,
|
|
169
|
+
status: "unresolved",
|
|
170
|
+
reason: result.unresolved.reason,
|
|
171
|
+
...(result.unresolved.detail ? { detail: result.unresolved.detail } : {}),
|
|
172
|
+
}, env);
|
|
173
|
+
}
|
|
174
|
+
if (!result.identity || result.identity.trim() === "") {
|
|
175
|
+
return {
|
|
176
|
+
lexicon,
|
|
177
|
+
status: "unresolved",
|
|
178
|
+
reason: "read-failed",
|
|
179
|
+
detail: "the lexicon reported an identity with no principal in it",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return redactIdentityRow({
|
|
183
|
+
lexicon,
|
|
184
|
+
status: "reported",
|
|
185
|
+
identity: result.identity,
|
|
186
|
+
scope: result.scope,
|
|
187
|
+
source: result.source,
|
|
188
|
+
...(result.endpoint ? { endpoint: result.endpoint } : {}),
|
|
189
|
+
}, env);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Ask every plugin who it would act as. One call per lexicon, concurrently,
|
|
193
|
+
* in the order the plugins were configured so the report is stable.
|
|
194
|
+
*
|
|
195
|
+
* A plugin that throws never fails the run: the throw becomes that lexicon's
|
|
196
|
+
* UNRESOLVED row. Reporting is the whole point, and a report that aborts on
|
|
197
|
+
* the first broken substrate is exactly the report nobody can use.
|
|
198
|
+
*/
|
|
199
|
+
export async function describeIdentities(plugins, options, env = process.env) {
|
|
200
|
+
return Promise.all(plugins.map(async (plugin) => {
|
|
201
|
+
if (!plugin.describeIdentity)
|
|
202
|
+
return { lexicon: plugin.name, status: "not-reported" };
|
|
203
|
+
try {
|
|
204
|
+
return identityRowFor(plugin.name, await plugin.describeIdentity(options), env);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return identityRowFor(plugin.name, {
|
|
208
|
+
unresolved: {
|
|
209
|
+
reason: "read-failed",
|
|
210
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
211
|
+
},
|
|
212
|
+
}, env);
|
|
213
|
+
}
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* A row's verdict as one short cell, for the IDENTITY column. Deliberately
|
|
218
|
+
* without the `detail`, which is a sentence and belongs under the table rather
|
|
219
|
+
* than inside a column every other row has to be padded to.
|
|
220
|
+
*/
|
|
221
|
+
export function identityStatusText(row) {
|
|
222
|
+
switch (row.status) {
|
|
223
|
+
case "reported":
|
|
224
|
+
return row.identity ?? "";
|
|
225
|
+
case "unresolved":
|
|
226
|
+
return `could not determine — ${unresolvedReasonText(row.reason)}`;
|
|
227
|
+
case "not-reported":
|
|
228
|
+
return "not reported — this lexicon does not answer for an identity";
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Why an identity did not resolve, in words. Deliberately distinct from
|
|
233
|
+
* `unobservedReasonText`: `no-credentials` here means "no identity is
|
|
234
|
+
* configured for this substrate", which is an answer, not a failure to look.
|
|
235
|
+
*/
|
|
236
|
+
export function unresolvedReasonText(reason) {
|
|
237
|
+
switch (reason) {
|
|
238
|
+
case "no-credentials":
|
|
239
|
+
return "no identity is configured for this substrate";
|
|
240
|
+
case "no-binding":
|
|
241
|
+
return "this environment resolves to no target";
|
|
242
|
+
case "read-failed":
|
|
243
|
+
return "the substrate was reached and the self-query failed";
|
|
244
|
+
case "unsupported-kind":
|
|
245
|
+
return "the substrate exposes no self-query";
|
|
246
|
+
case "filtered":
|
|
247
|
+
return "withheld";
|
|
248
|
+
default:
|
|
249
|
+
return "no reason given";
|
|
250
|
+
}
|
|
251
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for template value parsers.
|
|
3
|
+
*
|
|
4
|
+
* Implements the generic recursive walk: null → array → single-key
|
|
5
|
+
* intrinsic dispatch → plain object → primitive. Subclasses provide
|
|
6
|
+
* format-specific intrinsic dispatch.
|
|
7
|
+
*/
|
|
8
|
+
export class BaseValueParser {
|
|
9
|
+
/**
|
|
10
|
+
* Parse a value recursively: null → array → single-key intrinsic → object → primitive.
|
|
11
|
+
*/
|
|
12
|
+
parseValue(value) {
|
|
13
|
+
if (value === null || value === undefined)
|
|
14
|
+
return value;
|
|
15
|
+
if (Array.isArray(value)) {
|
|
16
|
+
return value.map((v) => this.parseValue(v));
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "object") {
|
|
19
|
+
const obj = value;
|
|
20
|
+
const keys = Object.keys(obj);
|
|
21
|
+
if (keys.length === 1) {
|
|
22
|
+
const result = this.dispatchIntrinsic(keys[0], obj[keys[0]], obj);
|
|
23
|
+
if (result !== null)
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
const parsed = {};
|
|
27
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
28
|
+
parsed[k] = this.parseValue(v);
|
|
29
|
+
}
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content embedded in another lexicon's resources, imported by the lexicon
|
|
3
|
+
* that owns it (#2962).
|
|
4
|
+
*
|
|
5
|
+
* A Kubernetes ConfigMap holding a collector's `config.yaml`, a
|
|
6
|
+
* `PrometheusRule` whose `spec.groups` are Prometheus rule groups, and a
|
|
7
|
+
* ConfigMap holding Grafana dashboard JSON all carry another lexicon's
|
|
8
|
+
* source inside a k8s resource. The host lexicon's parser (k8s) finds such
|
|
9
|
+
* content and offers it here; the lexicon that can import it (otel,
|
|
10
|
+
* prometheus, grafana) declares so with `LexiconPlugin.embeddedImporters()`.
|
|
11
|
+
* Core matches the two at run time, so the host needs no dependency on the
|
|
12
|
+
* owner: when the owner is not installed the content stays as written, with
|
|
13
|
+
* a warning.
|
|
14
|
+
*
|
|
15
|
+
* The flow, driven by `chant import`:
|
|
16
|
+
*
|
|
17
|
+
* 1. The host's `TemplateParser.parse(content, context)` calls
|
|
18
|
+
* `context.embedded.resolve(site)` for each place content can be
|
|
19
|
+
* embedded, and puts the `EmbeddedReference` it gets back into its IR in
|
|
20
|
+
* place of the raw value. `undefined` means keep the raw value.
|
|
21
|
+
* 2. The owner's `EmbeddedContentImporter.import(site)` returns the modules
|
|
22
|
+
* declaring the content and how the host's value is built from them
|
|
23
|
+
* (`collectorYaml([...])`, a list of rule groups, `dashboardJson(...)`).
|
|
24
|
+
* 3. Core writes those modules in a directory of their own beside the
|
|
25
|
+
* host's files, and the host's generator renders the reference with
|
|
26
|
+
* `renderEmbeddedReference`, which also writes the imports it needs.
|
|
27
|
+
*/
|
|
28
|
+
import { posix } from "path";
|
|
29
|
+
import { parseYAMLDocument, splitYAMLDocuments } from "../yaml.js";
|
|
30
|
+
export function isEmbeddedReference(value) {
|
|
31
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
32
|
+
return false;
|
|
33
|
+
const e = value.$embedded;
|
|
34
|
+
return (typeof e === "object" &&
|
|
35
|
+
e !== null &&
|
|
36
|
+
Array.isArray(e.value?.bindings));
|
|
37
|
+
}
|
|
38
|
+
// ── the registry ─────────────────────────────────────────────────────
|
|
39
|
+
function isObject(v) {
|
|
40
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
41
|
+
}
|
|
42
|
+
/** The document a text holds: JSON, or a single YAML document. Undefined for anything else. */
|
|
43
|
+
export function embeddedDocument(text) {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(text);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not JSON: try YAML.
|
|
49
|
+
}
|
|
50
|
+
const docs = splitYAMLDocuments(text);
|
|
51
|
+
if (docs.length !== 1)
|
|
52
|
+
return undefined;
|
|
53
|
+
let doc;
|
|
54
|
+
try {
|
|
55
|
+
doc = parseYAMLDocument(docs[0]);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
// Text that is not YAML (`just text`, `KEY=value` lines) makes core's YAML
|
|
61
|
+
// reader throw, caught above (#2991); an empty or comment-only text reads
|
|
62
|
+
// as an empty mapping. Neither is a document.
|
|
63
|
+
if (typeof doc === "object" && doc !== null && Object.keys(doc).length === 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
return doc;
|
|
66
|
+
}
|
|
67
|
+
/** A directory name: lower-case letters, digits and `-`. */
|
|
68
|
+
function slug(text) {
|
|
69
|
+
const s = text
|
|
70
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
71
|
+
.toLowerCase()
|
|
72
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
73
|
+
.replace(/^-+|-+$/g, "");
|
|
74
|
+
return s === "" ? "embedded" : s;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolves embedded content against the importers registered for one
|
|
78
|
+
* import, and collects what the imports produce: the files to write beside
|
|
79
|
+
* the host's and the warnings to print. `offered` lists every piece of
|
|
80
|
+
* content the host offered, claimed or not.
|
|
81
|
+
*/
|
|
82
|
+
export class EmbeddedImports {
|
|
83
|
+
/**
|
|
84
|
+
* @param importers what the installed lexicons registered, in the order they are asked
|
|
85
|
+
* @param options.quiet collect `offered` only, with no warnings (a probe before the importers are known)
|
|
86
|
+
*/
|
|
87
|
+
constructor(importers = [], options = {}) {
|
|
88
|
+
this.importers = importers;
|
|
89
|
+
this.options = options;
|
|
90
|
+
this.offered = [];
|
|
91
|
+
this.files = [];
|
|
92
|
+
this.warnings = [];
|
|
93
|
+
this.directories = new Set();
|
|
94
|
+
}
|
|
95
|
+
resolve(offered) {
|
|
96
|
+
const content = offered.document === undefined && typeof offered.text === "string"
|
|
97
|
+
? { ...offered, document: embeddedDocument(offered.text) }
|
|
98
|
+
: offered;
|
|
99
|
+
this.offered.push(content);
|
|
100
|
+
const matching = this.importers.filter(({ importer }) => {
|
|
101
|
+
try {
|
|
102
|
+
return importer.matches(content);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const [chosen, ...others] = matching;
|
|
109
|
+
if (!chosen) {
|
|
110
|
+
const owner = content.expectedOwner;
|
|
111
|
+
if (owner && !this.options.quiet) {
|
|
112
|
+
this.warnings.push(`${content.location} looks like ${owner.what}, and no installed lexicon imports it, so it is kept as written. ` +
|
|
113
|
+
`Install @intentius/chant-lexicon-${owner.lexicon} (or a version that imports embedded content) to import it as typed declarations.`);
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
if (others.length > 0) {
|
|
118
|
+
this.warnings.push(`${content.location} is also importable by ${others.map((o) => o.lexicon).join(", ")}; imported with ${chosen.lexicon}.`);
|
|
119
|
+
}
|
|
120
|
+
const kept = chosen.importer.keepsAsWritten?.(content);
|
|
121
|
+
if (kept !== undefined) {
|
|
122
|
+
this.warnings.push(`${content.location} is ${chosen.importer.what}, kept as written: ${kept}`);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
let result;
|
|
126
|
+
try {
|
|
127
|
+
result = chosen.importer.import(content);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
this.warnings.push(`${content.location} looks like ${chosen.importer.what}, but the ${chosen.lexicon} import failed, so it is kept as written: ` +
|
|
131
|
+
(err instanceof Error ? err.message : String(err)));
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const dir = this.claimDirectory(content.directory);
|
|
135
|
+
const local = new Set(result.files.map((f) => f.path));
|
|
136
|
+
const rebase = (from) => (local.has(from) ? `${dir}/${from}` : from);
|
|
137
|
+
for (const f of result.files)
|
|
138
|
+
this.files.push({ path: `${dir}/${f.path}`, content: f.content });
|
|
139
|
+
for (const w of result.warnings ?? [])
|
|
140
|
+
this.warnings.push(`${content.location}: ${w}`);
|
|
141
|
+
const v = result.value;
|
|
142
|
+
const value = {
|
|
143
|
+
bindings: v.bindings.map((b) => ({ ...b, from: rebase(b.from) })),
|
|
144
|
+
shape: v.shape,
|
|
145
|
+
...(v.through ? { through: { ...v.through, from: rebase(v.through.from) } } : {}),
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
$embedded: { lexicon: chosen.lexicon, what: chosen.importer.what, location: content.location, value },
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
claimDirectory(name) {
|
|
152
|
+
const base = slug(name);
|
|
153
|
+
let dir = base;
|
|
154
|
+
for (let n = 2; this.directories.has(dir); n++)
|
|
155
|
+
dir = `${base}-${n}`;
|
|
156
|
+
this.directories.add(dir);
|
|
157
|
+
return dir;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ── rendering ────────────────────────────────────────────────────────
|
|
161
|
+
const RESERVED = new Set(("break case catch class const continue debugger default delete do else enum export extends false finally for " +
|
|
162
|
+
"function if import in instanceof new null return super switch this throw true try typeof var void while with " +
|
|
163
|
+
"yield let static implements interface package private protected public await arguments eval undefined").split(" "));
|
|
164
|
+
/**
|
|
165
|
+
* The imports one generated module needs for the references it renders.
|
|
166
|
+
* Names are made unique against the module's own declarations: a second
|
|
167
|
+
* `otlp` from another collector's directory is imported as `otlp2`.
|
|
168
|
+
*/
|
|
169
|
+
export class EmbeddedImportScope {
|
|
170
|
+
/**
|
|
171
|
+
* @param fromDir the directory of the module being generated, relative to the output directory (`""` for its top)
|
|
172
|
+
* @param taken names the module already declares or imports
|
|
173
|
+
*/
|
|
174
|
+
constructor(fromDir, taken = []) {
|
|
175
|
+
this.fromDir = fromDir;
|
|
176
|
+
/** specifier -> exported name -> local name */
|
|
177
|
+
this.bySpecifier = new Map();
|
|
178
|
+
this.taken = new Set(taken);
|
|
179
|
+
}
|
|
180
|
+
/** The local name `name`, exported by `from` (a package or an output-relative path), is used under. */
|
|
181
|
+
bind(from, name) {
|
|
182
|
+
const spec = this.specifier(from);
|
|
183
|
+
let names = this.bySpecifier.get(spec);
|
|
184
|
+
if (!names) {
|
|
185
|
+
names = new Map();
|
|
186
|
+
this.bySpecifier.set(spec, names);
|
|
187
|
+
}
|
|
188
|
+
const existing = names.get(name);
|
|
189
|
+
if (existing)
|
|
190
|
+
return existing;
|
|
191
|
+
let local = name;
|
|
192
|
+
for (let n = 2; this.taken.has(local) || RESERVED.has(local); n++)
|
|
193
|
+
local = `${name}${n}`;
|
|
194
|
+
this.taken.add(local);
|
|
195
|
+
names.set(name, local);
|
|
196
|
+
return local;
|
|
197
|
+
}
|
|
198
|
+
/** The import statements, packages first, then local modules, each sorted. */
|
|
199
|
+
lines() {
|
|
200
|
+
const specs = [...this.bySpecifier.keys()].sort((a, b) => {
|
|
201
|
+
const la = a.startsWith("."), lb = b.startsWith(".");
|
|
202
|
+
return la === lb ? a.localeCompare(b) : la ? 1 : -1;
|
|
203
|
+
});
|
|
204
|
+
return specs.map((spec) => {
|
|
205
|
+
const entries = [...this.bySpecifier.get(spec)].sort(([a], [b]) => a.localeCompare(b));
|
|
206
|
+
const list = entries.map(([name, local]) => (name === local ? name : `${name} as ${local}`));
|
|
207
|
+
const one = `import { ${list.join(", ")} } from "${spec}";`;
|
|
208
|
+
return one.length <= 100 ? one : `import {\n${list.map((n) => ` ${n},`).join("\n")}\n} from "${spec}";`;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
specifier(from) {
|
|
212
|
+
if (!from.endsWith(".ts"))
|
|
213
|
+
return from;
|
|
214
|
+
let rel = posix.relative(this.fromDir || ".", from.replace(/\.ts$/, ""));
|
|
215
|
+
if (!rel.startsWith("."))
|
|
216
|
+
rel = `./${rel}`;
|
|
217
|
+
return rel;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* The TypeScript expression for a reference, binding its names in `scope`.
|
|
222
|
+
* A list longer than one line is broken one binding per line, indented from
|
|
223
|
+
* `indent` spaces.
|
|
224
|
+
*/
|
|
225
|
+
export function renderEmbeddedReference(ref, scope, indent = 0) {
|
|
226
|
+
const { value } = ref.$embedded;
|
|
227
|
+
const items = value.bindings.map((b) => `${scope.bind(b.from, b.name)}${b.member ? `.${b.member}` : ""}`);
|
|
228
|
+
let inner;
|
|
229
|
+
if (value.shape === "single") {
|
|
230
|
+
if (items.length !== 1)
|
|
231
|
+
throw new Error(`${ref.$embedded.location}: a single embedded value needs exactly one binding`);
|
|
232
|
+
inner = items[0];
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
const one = `[${items.join(", ")}]`;
|
|
236
|
+
const pad = " ".repeat(indent);
|
|
237
|
+
inner = one.length <= 80 ? one : `[\n${items.map((i) => `${pad} ${i},`).join("\n")}\n${pad}]`;
|
|
238
|
+
}
|
|
239
|
+
return value.through ? `${scope.bind(value.through.from, value.through.name)}(${inner})` : inner;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* The names a generated module exports in its `export { … }` list, for an
|
|
243
|
+
* importer whose generator writes one per module (COR004).
|
|
244
|
+
*/
|
|
245
|
+
export function exportedNames(content) {
|
|
246
|
+
const names = [];
|
|
247
|
+
for (const m of content.matchAll(/^export\s*\{([^}]*)\};?\s*$/gm)) {
|
|
248
|
+
for (const part of m[1].split(",")) {
|
|
249
|
+
const name = part.trim().split(/\s+as\s+/).pop().trim();
|
|
250
|
+
if (name !== "" && !name.startsWith("type "))
|
|
251
|
+
names.push(name);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return names;
|
|
255
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IR intrinsic scanning utilities.
|
|
3
|
+
*
|
|
4
|
+
* Generic recursive walkers that scan the import IR value trees for
|
|
5
|
+
* intrinsic markers and dependency references.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a value tree contains an intrinsic with the given name.
|
|
9
|
+
* Looks for `{ __intrinsic: name }` objects recursively.
|
|
10
|
+
*/
|
|
11
|
+
export function hasIntrinsicInValue(value, name) {
|
|
12
|
+
if (value === null || value === undefined) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(value)) {
|
|
16
|
+
return value.some((item) => hasIntrinsicInValue(item, name));
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "object") {
|
|
19
|
+
const obj = value;
|
|
20
|
+
if (obj.__intrinsic === name) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return Object.values(obj).some((v) => hasIntrinsicInValue(v, name));
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if any resource, condition, or output in the IR uses a given intrinsic.
|
|
29
|
+
*/
|
|
30
|
+
export function irUsesIntrinsic(ir, name) {
|
|
31
|
+
for (const resource of ir.resources) {
|
|
32
|
+
if (hasIntrinsicInValue(resource.properties, name) ||
|
|
33
|
+
hasIntrinsicInValue(resource.metadata, name) ||
|
|
34
|
+
hasIntrinsicInValue(resource.attributes, name)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (hasIntrinsicInValue(ir.metadata, name))
|
|
39
|
+
return true;
|
|
40
|
+
for (const condition of ir.conditions ?? []) {
|
|
41
|
+
if (hasIntrinsicInValue(condition.expression, name)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const output of ir.outputs ?? []) {
|
|
46
|
+
if (hasIntrinsicInValue(output.value, name) || hasIntrinsicInValue(output.exportName, name)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Collect dependency references from a value tree.
|
|
54
|
+
*
|
|
55
|
+
* @param value - The value tree to scan
|
|
56
|
+
* @param isDependency - Given an object, returns a logical ID if it represents
|
|
57
|
+
* a dependency, or null otherwise. Each lexicon provides its own predicate.
|
|
58
|
+
*/
|
|
59
|
+
export function collectDependencies(value, isDependency) {
|
|
60
|
+
const deps = new Set();
|
|
61
|
+
collectDepsRecursive(value, isDependency, deps);
|
|
62
|
+
return deps;
|
|
63
|
+
}
|
|
64
|
+
function collectDepsRecursive(value, isDependency, deps) {
|
|
65
|
+
if (value === null || value === undefined)
|
|
66
|
+
return;
|
|
67
|
+
if (Array.isArray(value)) {
|
|
68
|
+
for (const item of value) {
|
|
69
|
+
collectDepsRecursive(item, isDependency, deps);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (typeof value === "object") {
|
|
74
|
+
const obj = value;
|
|
75
|
+
const dep = isDependency(obj);
|
|
76
|
+
if (dep !== null) {
|
|
77
|
+
deps.add(dep);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
for (const v of Object.values(obj)) {
|
|
81
|
+
collectDepsRecursive(v, isDependency, deps);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check `--parser-option` entries (`key` or `key=value`) against what the
|
|
3
|
+
* lexicon declares in `parserOptions()` and convert each value to its declared
|
|
4
|
+
* type (#2994). Returns the options, or an error message naming what is wrong
|
|
5
|
+
* and what the lexicon accepts. An empty list is always valid.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveParserOptions(plugin, entries) {
|
|
8
|
+
const options = {};
|
|
9
|
+
if (!entries || entries.length === 0)
|
|
10
|
+
return { options };
|
|
11
|
+
const specs = plugin.parserOptions?.() ?? [];
|
|
12
|
+
const accepted = specs.length === 0
|
|
13
|
+
? `lexicon "${plugin.name}" declares no parser options`
|
|
14
|
+
: `${plugin.name} accepts: ${specs.map((s) => `${s.name} (${s.type}): ${s.description}`).join("; ")}`;
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
const eq = entry.indexOf("=");
|
|
17
|
+
const name = eq === -1 ? entry : entry.slice(0, eq);
|
|
18
|
+
const raw = eq === -1 ? undefined : entry.slice(eq + 1);
|
|
19
|
+
const spec = specs.find((s) => s.name === name);
|
|
20
|
+
if (!spec) {
|
|
21
|
+
return { error: `Unknown parser option "${name}" for lexicon "${plugin.name}"; ${accepted}.` };
|
|
22
|
+
}
|
|
23
|
+
if (spec.type === "boolean") {
|
|
24
|
+
if (raw === undefined || raw === "true")
|
|
25
|
+
options[name] = true;
|
|
26
|
+
else if (raw === "false")
|
|
27
|
+
options[name] = false;
|
|
28
|
+
else
|
|
29
|
+
return { error: `Parser option "${name}" is a boolean: use ${name}, ${name}=true or ${name}=false, got "${raw}".` };
|
|
30
|
+
}
|
|
31
|
+
else if (raw === undefined) {
|
|
32
|
+
return { error: `Parser option "${name}" needs a value: --parser-option ${name}=<${spec.type}>.` };
|
|
33
|
+
}
|
|
34
|
+
else if (spec.type === "number") {
|
|
35
|
+
const n = Number(raw);
|
|
36
|
+
if (raw.trim() === "" || !Number.isFinite(n))
|
|
37
|
+
return { error: `Parser option "${name}" is a number, got "${raw}".` };
|
|
38
|
+
options[name] = n;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
options[name] = raw;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { options };
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|