@cat-factory/contracts 0.63.0 → 0.65.0

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.
@@ -403,6 +403,12 @@ export declare const kubernetesEnvironmentConfigSchema: v.ObjectSchema<{
403
403
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
404
404
  /** Fallback TTL (ms) after which the env is swept + torn down. */
405
405
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
406
+ /**
407
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
408
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
409
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
410
+ */
411
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
406
412
  /** Extra labels stamped on the namespace + every applied resource. */
407
413
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
408
414
  /** Extra annotations stamped on the namespace. */
@@ -560,6 +566,193 @@ export declare const kubernetesSecretInjectionSchema: v.VariantSchema<"mode", [v
560
566
  }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
561
567
  }, undefined>], undefined>;
562
568
  export type KubernetesSecretInjection = v.InferOutput<typeof kubernetesSecretInjectionSchema>;
569
+ /**
570
+ * The full Kubernetes provision config the deploy adapter consumes: the combined cluster +
571
+ * URL + manifest-source config PLUS the kustomize/helm render inputs (image overrides, helm
572
+ * releases, secret injections). It is assembled at provision time by MERGING the workspace
573
+ * kube engine config (the "how": apiserver, sizing, shared helm releases) with the service's
574
+ * own provisioning (the "what/where": manifest source, per-environment helm releases, image
575
+ * overrides, secret injections) — so the provider reads everything it needs from one place.
576
+ * The native in-Worker REST adapter ignores the render fields (raw manifests only); the
577
+ * container-backed deploy adapter consumes them. Carries secret KEYS, never values.
578
+ */
579
+ export declare const kubernetesProvisionConfigSchema: v.ObjectSchema<{
580
+ /** Human label for the connection (shown in the UI). */
581
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
582
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
583
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
584
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
585
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
586
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
587
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
588
+ /**
589
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`.
590
+ * Rendered with the provision vars then sanitized to an RFC1123 label; absent ⇒ a
591
+ * default derived from the PR number / block id.
592
+ */
593
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
594
+ /** Where the manifests are read from (co-located in the PR repo, or a separate repo). */
595
+ readonly manifestSource: v.VariantSchema<"type", [v.ObjectSchema<{
596
+ readonly type: v.LiteralSchema<"colocated", undefined>;
597
+ /** File or directory path within the PR repo (read at the PR head branch). */
598
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
599
+ readonly renderer: v.OptionalSchema<v.PicklistSchema<["raw", "kustomize"], undefined>, undefined>;
600
+ }, undefined>, v.ObjectSchema<{
601
+ readonly type: v.LiteralSchema<"separate", undefined>;
602
+ /** `owner/repo` of the manifests repo. */
603
+ readonly repo: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "must be \"owner/repo\"">]>;
604
+ /** Branch/tag/sha to read at; absent ⇒ that repo's default branch. */
605
+ readonly ref: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
606
+ /** File or directory path within the manifests repo. */
607
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
608
+ readonly renderer: v.OptionalSchema<v.PicklistSchema<["raw", "kustomize"], undefined>, undefined>;
609
+ }, undefined>], undefined>;
610
+ /** How the environment URL is derived once applied. */
611
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
612
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
613
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
614
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
615
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
616
+ }, undefined>, v.ObjectSchema<{
617
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
618
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
619
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
620
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
621
+ }, undefined>, v.ObjectSchema<{
622
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
623
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
624
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
625
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
626
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
627
+ }, undefined>, v.ObjectSchema<{
628
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
629
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
630
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
631
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
632
+ }, undefined>, v.ObjectSchema<{
633
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
634
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
635
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
636
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
637
+ }, undefined>], undefined>;
638
+ /**
639
+ * Optional image reference made available to the manifests as `{{image}}` (e.g. a
640
+ * CI-built image tagged by branch/sha). Itself a template over the provision vars.
641
+ */
642
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
643
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
644
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
645
+ /**
646
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
647
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
648
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
649
+ */
650
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
651
+ /** Extra labels stamped on the namespace + every applied resource. */
652
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
653
+ /** Extra annotations stamped on the namespace. */
654
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
655
+ /** Structured image overrides (the kustomize `images:` shape), templated over provision vars. */
656
+ readonly images: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
657
+ /** The image to match (the `name:` in a kustomization `images:` entry), e.g. `registry/app`. */
658
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
659
+ /** Optional replacement repo, templated; absent ⇒ keep the original repo. */
660
+ readonly newNameTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
661
+ /** Replacement tag, templated (e.g. `{{branch}}` / `{{sha}}`); mutually exclusive with digest. */
662
+ readonly newTagTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
663
+ /** Replacement digest, templated; alternative to a tag. */
664
+ readonly digestTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
665
+ }, undefined>, v.CheckAction<{
666
+ name: string;
667
+ newNameTemplate?: string | undefined;
668
+ newTagTemplate?: string | undefined;
669
+ digestTemplate?: string | undefined;
670
+ }, "an image override must set at least one of newNameTemplate, newTagTemplate, or digestTemplate.">, v.CheckAction<{
671
+ name: string;
672
+ newNameTemplate?: string | undefined;
673
+ newTagTemplate?: string | undefined;
674
+ digestTemplate?: string | undefined;
675
+ }, "newTagTemplate and digestTemplate are mutually exclusive on an image override.">]>, undefined>, undefined>;
676
+ /** Helm releases to install — workspace-shared singletons merged with the service's per-env ones. */
677
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
678
+ /** Release name. */
679
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
680
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
681
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
682
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
683
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
684
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
685
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
686
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
687
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
688
+ /** Inline `--values` overrides. */
689
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
690
+ /** Templated `--set` overrides. */
691
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
692
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
693
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
694
+ /** The value, templated over the provision vars. */
695
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
696
+ }, undefined>, undefined>, undefined>;
697
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
698
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
699
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
700
+ readonly secretRef: v.ObjectSchema<{
701
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
702
+ }, undefined>;
703
+ }, undefined>, undefined>, undefined>;
704
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
705
+ }, undefined>, undefined>, undefined>;
706
+ /** Secrets fed in before apply (a `Secret` resource or a `secretGenerator` `.env`). */
707
+ readonly secretInjections: v.OptionalSchema<v.ArraySchema<v.VariantSchema<"mode", [v.ObjectSchema<{
708
+ readonly mode: v.LiteralSchema<"secret", undefined>;
709
+ /** Target Secret name in the namespace. */
710
+ readonly secretName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
711
+ /** Secret `type`; absent ⇒ `Opaque`. */
712
+ readonly secretType: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
713
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
714
+ /** Key inside the rendered Secret / `.env`. */
715
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
716
+ /** Resolve the value from the workspace encrypted bundle by key. */
717
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
718
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
719
+ }, undefined>, undefined>;
720
+ /** OR a non-secret value, templated over the provision vars. */
721
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
722
+ }, undefined>, v.CheckAction<{
723
+ key: string;
724
+ secretRef?: {
725
+ key: string;
726
+ } | undefined;
727
+ valueTemplate?: string | undefined;
728
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
729
+ }, undefined>, v.ObjectSchema<{
730
+ readonly mode: v.LiteralSchema<"generatorEnvFile", undefined>;
731
+ /**
732
+ * Repo-relative path within the overlay tree to write the `KEY=value` env file the
733
+ * overlay's `secretGenerator` reads (e.g. `overlays/<env>/<component>/.env`). The
734
+ * overlay names the Secret.
735
+ */
736
+ readonly envFilePath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
737
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
738
+ /** Key inside the rendered Secret / `.env`. */
739
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
740
+ /** Resolve the value from the workspace encrypted bundle by key. */
741
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
742
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
743
+ }, undefined>, undefined>;
744
+ /** OR a non-secret value, templated over the provision vars. */
745
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
746
+ }, undefined>, v.CheckAction<{
747
+ key: string;
748
+ secretRef?: {
749
+ key: string;
750
+ } | undefined;
751
+ valueTemplate?: string | undefined;
752
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
753
+ }, undefined>], undefined>, undefined>, undefined>;
754
+ }, undefined>;
755
+ export type KubernetesProvisionConfig = v.InferOutput<typeof kubernetesProvisionConfigSchema>;
563
756
  /** Built-in environment backend kinds the contract knows by name. */
564
757
  export declare const RESERVED_ENVIRONMENT_BACKEND_KINDS: readonly ['manifest', 'kubernetes'];
565
758
  /**
@@ -780,10 +973,115 @@ export declare const environmentBackendConfigSchema: v.VariantSchema<"kind", [v.
780
973
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
781
974
  /** Fallback TTL (ms) after which the env is swept + torn down. */
782
975
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
976
+ /**
977
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
978
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
979
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
980
+ */
981
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
783
982
  /** Extra labels stamped on the namespace + every applied resource. */
784
983
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
785
984
  /** Extra annotations stamped on the namespace. */
786
985
  readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
986
+ /** Structured image overrides (the kustomize `images:` shape), templated over provision vars. */
987
+ readonly images: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
988
+ /** The image to match (the `name:` in a kustomization `images:` entry), e.g. `registry/app`. */
989
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
990
+ /** Optional replacement repo, templated; absent ⇒ keep the original repo. */
991
+ readonly newNameTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
992
+ /** Replacement tag, templated (e.g. `{{branch}}` / `{{sha}}`); mutually exclusive with digest. */
993
+ readonly newTagTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
994
+ /** Replacement digest, templated; alternative to a tag. */
995
+ readonly digestTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
996
+ }, undefined>, v.CheckAction<{
997
+ name: string;
998
+ newNameTemplate?: string | undefined;
999
+ newTagTemplate?: string | undefined;
1000
+ digestTemplate?: string | undefined;
1001
+ }, "an image override must set at least one of newNameTemplate, newTagTemplate, or digestTemplate.">, v.CheckAction<{
1002
+ name: string;
1003
+ newNameTemplate?: string | undefined;
1004
+ newTagTemplate?: string | undefined;
1005
+ digestTemplate?: string | undefined;
1006
+ }, "newTagTemplate and digestTemplate are mutually exclusive on an image override.">]>, undefined>, undefined>;
1007
+ /** Helm releases to install — workspace-shared singletons merged with the service's per-env ones. */
1008
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
1009
+ /** Release name. */
1010
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1011
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
1012
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1013
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
1014
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
1015
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
1016
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
1017
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
1018
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
1019
+ /** Inline `--values` overrides. */
1020
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
1021
+ /** Templated `--set` overrides. */
1022
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
1023
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
1024
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1025
+ /** The value, templated over the provision vars. */
1026
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
1027
+ }, undefined>, undefined>, undefined>;
1028
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
1029
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
1030
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1031
+ readonly secretRef: v.ObjectSchema<{
1032
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1033
+ }, undefined>;
1034
+ }, undefined>, undefined>, undefined>;
1035
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
1036
+ }, undefined>, undefined>, undefined>;
1037
+ /** Secrets fed in before apply (a `Secret` resource or a `secretGenerator` `.env`). */
1038
+ readonly secretInjections: v.OptionalSchema<v.ArraySchema<v.VariantSchema<"mode", [v.ObjectSchema<{
1039
+ readonly mode: v.LiteralSchema<"secret", undefined>;
1040
+ /** Target Secret name in the namespace. */
1041
+ readonly secretName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1042
+ /** Secret `type`; absent ⇒ `Opaque`. */
1043
+ readonly secretType: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
1044
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
1045
+ /** Key inside the rendered Secret / `.env`. */
1046
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
1047
+ /** Resolve the value from the workspace encrypted bundle by key. */
1048
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
1049
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1050
+ }, undefined>, undefined>;
1051
+ /** OR a non-secret value, templated over the provision vars. */
1052
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
1053
+ }, undefined>, v.CheckAction<{
1054
+ key: string;
1055
+ secretRef?: {
1056
+ key: string;
1057
+ } | undefined;
1058
+ valueTemplate?: string | undefined;
1059
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
1060
+ }, undefined>, v.ObjectSchema<{
1061
+ readonly mode: v.LiteralSchema<"generatorEnvFile", undefined>;
1062
+ /**
1063
+ * Repo-relative path within the overlay tree to write the `KEY=value` env file the
1064
+ * overlay's `secretGenerator` reads (e.g. `overlays/<env>/<component>/.env`). The
1065
+ * overlay names the Secret.
1066
+ */
1067
+ readonly envFilePath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
1068
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
1069
+ /** Key inside the rendered Secret / `.env`. */
1070
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
1071
+ /** Resolve the value from the workspace encrypted bundle by key. */
1072
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
1073
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1074
+ }, undefined>, undefined>;
1075
+ /** OR a non-secret value, templated over the provision vars. */
1076
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
1077
+ }, undefined>, v.CheckAction<{
1078
+ key: string;
1079
+ secretRef?: {
1080
+ key: string;
1081
+ } | undefined;
1082
+ valueTemplate?: string | undefined;
1083
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
1084
+ }, undefined>], undefined>, undefined>, undefined>;
787
1085
  }, undefined>;
788
1086
  }, undefined>, v.ObjectSchema<{
789
1087
  readonly kind: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>, v.RegexAction<string, "must be a lower-kebab slug">, v.CheckAction<string, "reserved backend kind">]>;
@@ -1108,6 +1406,12 @@ export declare const kubernetesEngineConfigSchema: v.ObjectSchema<{
1108
1406
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
1109
1407
  /** Fallback TTL (ms) after which the env is swept + torn down. */
1110
1408
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
1409
+ /**
1410
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
1411
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
1412
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
1413
+ */
1414
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
1111
1415
  /** Extra labels stamped on the namespace + every applied resource. */
1112
1416
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
1113
1417
  /** Extra annotations stamped on the namespace. */
@@ -1337,6 +1641,12 @@ export declare const infraHandlerConfigSchema: v.VariantSchema<"engine", [v.Obje
1337
1641
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
1338
1642
  /** Fallback TTL (ms) after which the env is swept + torn down. */
1339
1643
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
1644
+ /**
1645
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
1646
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
1647
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
1648
+ */
1649
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
1340
1650
  /** Extra labels stamped on the namespace + every applied resource. */
1341
1651
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
1342
1652
  /** Extra annotations stamped on the namespace. */
@@ -1427,6 +1737,12 @@ export declare const infraHandlerConfigSchema: v.VariantSchema<"engine", [v.Obje
1427
1737
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
1428
1738
  /** Fallback TTL (ms) after which the env is swept + torn down. */
1429
1739
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
1740
+ /**
1741
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
1742
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
1743
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
1744
+ */
1745
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
1430
1746
  /** Extra labels stamped on the namespace + every applied resource. */
1431
1747
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
1432
1748
  /** Extra annotations stamped on the namespace. */
@@ -1622,43 +1938,1941 @@ export declare const upsertCustomManifestTypeSchema: v.ObjectSchema<{
1622
1938
  readonly description: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
1623
1939
  }, undefined>;
1624
1940
  export type UpsertCustomManifestTypeInput = v.InferOutput<typeof upsertCustomManifestTypeSchema>;
1625
- /** Resolved access creds for a provisioned env, as surfaced to a tester agent. */
1626
- export declare const environmentAccessHandleSchema: v.ObjectSchema<{
1627
- readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
1628
- readonly token: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1629
- readonly username: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1630
- readonly password: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1631
- readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1632
- readonly headerValue: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1633
- }, undefined>;
1634
- export type EnvironmentAccessHandle = v.InferOutput<typeof environmentAccessHandleSchema>;
1635
- /** A provisioned environment, as exposed to clients and downstream agents. */
1636
- export declare const environmentHandleSchema: v.ObjectSchema<{
1637
- readonly id: v.StringSchema<undefined>;
1638
- readonly workspaceId: v.StringSchema<undefined>;
1639
- readonly blockId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1640
- readonly executionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1941
+ /** One registered infra handler, as exposed to clients (never secret VALUES). */
1942
+ export declare const environmentHandlerViewSchema: v.ObjectSchema<{
1943
+ readonly provisionType: v.PicklistSchema<["kubernetes", "docker-compose", "custom", "infraless"], undefined>;
1944
+ /** For `custom`: the manifest id this handler is keyed to; `null` otherwise. */
1945
+ readonly manifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1946
+ readonly engine: v.PicklistSchema<["local-docker", "local-k3s", "remote-kubernetes", "remote-custom", "none"], undefined>;
1641
1947
  readonly providerId: v.StringSchema<undefined>;
1642
- readonly externalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1643
- readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1644
- readonly status: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
1645
- /** Present only on the dedicated access endpoint / in agent context. */
1646
- readonly access: v.OptionalSchema<v.ObjectSchema<{
1647
- readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
1648
- readonly token: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1649
- readonly username: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1650
- readonly password: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1651
- readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1652
- readonly headerValue: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1653
- }, undefined>, undefined>;
1654
- readonly createdAt: v.NumberSchema<undefined>;
1655
- readonly expiresAt: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
1656
- readonly lastError: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1657
- /**
1658
- * The service's declared provision type this environment was stood up for
1659
- * (`kubernetes` | `docker-compose` | `custom` | `infraless`). Recorded at provision
1660
- * time so run details can show exactly what was provisioned. Null for legacy rows.
1661
- */
1948
+ readonly label: v.StringSchema<undefined>;
1949
+ readonly baseUrl: v.StringSchema<undefined>;
1950
+ readonly connectedAt: v.NumberSchema<undefined>;
1951
+ /** Which secret keys are set (names only), so the UI can show completeness. */
1952
+ readonly secretKeys: v.ArraySchema<v.StringSchema<undefined>, undefined>;
1953
+ /** For `remote-custom`: the manifest id this provider accepts; `null` otherwise. */
1954
+ readonly acceptsManifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1955
+ /** The stored handler config, sans secrets, for connect-form prefill on edit. */
1956
+ readonly config: v.OptionalSchema<v.VariantSchema<"engine", [v.ObjectSchema<{
1957
+ readonly engine: v.LiteralSchema<"local-docker", undefined>;
1958
+ readonly manifest: v.ObjectSchema<{
1959
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1960
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
1961
+ /** Management API root; provision/status/teardown paths are appended to it. */
1962
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
1963
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
1964
+ readonly type: v.LiteralSchema<"none", undefined>;
1965
+ }, undefined>, v.ObjectSchema<{
1966
+ readonly type: v.LiteralSchema<"api_key", undefined>;
1967
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
1968
+ readonly secretRef: v.ObjectSchema<{
1969
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1970
+ }, undefined>;
1971
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
1972
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1973
+ }, undefined>, v.ObjectSchema<{
1974
+ readonly type: v.LiteralSchema<"bearer", undefined>;
1975
+ readonly secretRef: v.ObjectSchema<{
1976
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1977
+ }, undefined>;
1978
+ }, undefined>, v.ObjectSchema<{
1979
+ readonly type: v.LiteralSchema<"basic", undefined>;
1980
+ readonly usernameSecretRef: v.ObjectSchema<{
1981
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1982
+ }, undefined>;
1983
+ readonly passwordSecretRef: v.ObjectSchema<{
1984
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1985
+ }, undefined>;
1986
+ }, undefined>, v.ObjectSchema<{
1987
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
1988
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
1989
+ readonly clientIdSecretRef: v.ObjectSchema<{
1990
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1991
+ }, undefined>;
1992
+ readonly clientSecretSecretRef: v.ObjectSchema<{
1993
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
1994
+ }, undefined>;
1995
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1996
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
1997
+ }, undefined>, v.ObjectSchema<{
1998
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
1999
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
2000
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2001
+ readonly secretRef: v.ObjectSchema<{
2002
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2003
+ }, undefined>;
2004
+ }, undefined>, undefined>;
2005
+ }, undefined>], undefined>;
2006
+ readonly provision: v.ObjectSchema<{
2007
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2008
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2009
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2010
+ readonly key: v.StringSchema<undefined>;
2011
+ readonly value: v.StringSchema<undefined>;
2012
+ }, undefined>, undefined>, undefined>;
2013
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2014
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2015
+ readonly value: v.StringSchema<undefined>;
2016
+ }, undefined>, undefined>, undefined>;
2017
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2018
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2019
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2020
+ }, undefined>;
2021
+ /** Optional: polled to observe async provisioning progress. */
2022
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
2023
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2024
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2025
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2026
+ readonly key: v.StringSchema<undefined>;
2027
+ readonly value: v.StringSchema<undefined>;
2028
+ }, undefined>, undefined>, undefined>;
2029
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2030
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2031
+ readonly value: v.StringSchema<undefined>;
2032
+ }, undefined>, undefined>, undefined>;
2033
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2034
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2035
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2036
+ }, undefined>, undefined>;
2037
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
2038
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
2039
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2040
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2041
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2042
+ readonly key: v.StringSchema<undefined>;
2043
+ readonly value: v.StringSchema<undefined>;
2044
+ }, undefined>, undefined>, undefined>;
2045
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2046
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2047
+ readonly value: v.StringSchema<undefined>;
2048
+ }, undefined>, undefined>, undefined>;
2049
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2050
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2051
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2052
+ }, undefined>, undefined>;
2053
+ readonly response: v.ObjectSchema<{
2054
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2055
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2056
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2057
+ readonly from: v.StringSchema<undefined>;
2058
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
2059
+ }, undefined>, undefined>, undefined>;
2060
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2061
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2062
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
2063
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
2064
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2065
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2066
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2067
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2068
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2069
+ }, undefined>, undefined>;
2070
+ }, undefined>;
2071
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
2072
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2073
+ /**
2074
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
2075
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
2076
+ * entirely; a custom backend — registered by reference into the app-owned
2077
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
2078
+ * + validates it off the per-call
2079
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
2080
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
2081
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
2082
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
2083
+ * (reuse the exported `UrlSafetyPolicy`).
2084
+ */
2085
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2086
+ }, undefined>;
2087
+ }, undefined>, v.ObjectSchema<{
2088
+ readonly engine: v.LiteralSchema<"local-k3s", undefined>;
2089
+ readonly kubernetes: v.ObjectSchema<{
2090
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2091
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
2092
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2093
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
2094
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2095
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
2096
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
2097
+ /**
2098
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
2099
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
2100
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
2101
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
2102
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
2103
+ */
2104
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
2105
+ /** How the environment URL is derived once applied. */
2106
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
2107
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
2108
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
2109
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
2110
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2111
+ }, undefined>, v.ObjectSchema<{
2112
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
2113
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
2114
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2115
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2116
+ }, undefined>, v.ObjectSchema<{
2117
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
2118
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
2119
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
2120
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
2121
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2122
+ }, undefined>, v.ObjectSchema<{
2123
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
2124
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
2125
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2126
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2127
+ }, undefined>, v.ObjectSchema<{
2128
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
2129
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
2130
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2131
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2132
+ }, undefined>], undefined>;
2133
+ /** Optional image reference made available to the manifests as `{{image}}`. */
2134
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2135
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
2136
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2137
+ /**
2138
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
2139
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
2140
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
2141
+ */
2142
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2143
+ /** Extra labels stamped on the namespace + every applied resource. */
2144
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2145
+ /** Extra annotations stamped on the namespace. */
2146
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2147
+ /**
2148
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
2149
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
2150
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
2151
+ * with the service's own (per-environment) `helmReleases` at provision time.
2152
+ */
2153
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2154
+ /** Release name. */
2155
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2156
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
2157
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2158
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
2159
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
2160
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
2161
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
2162
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
2163
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2164
+ /** Inline `--values` overrides. */
2165
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2166
+ /** Templated `--set` overrides. */
2167
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2168
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
2169
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2170
+ /** The value, templated over the provision vars. */
2171
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
2172
+ }, undefined>, undefined>, undefined>;
2173
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
2174
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2175
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2176
+ readonly secretRef: v.ObjectSchema<{
2177
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2178
+ }, undefined>;
2179
+ }, undefined>, undefined>, undefined>;
2180
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
2181
+ }, undefined>, undefined>, undefined>;
2182
+ }, undefined>;
2183
+ }, undefined>, v.ObjectSchema<{
2184
+ readonly engine: v.LiteralSchema<"remote-kubernetes", undefined>;
2185
+ readonly kubernetes: v.ObjectSchema<{
2186
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2187
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
2188
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2189
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
2190
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2191
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
2192
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
2193
+ /**
2194
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
2195
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
2196
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
2197
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
2198
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
2199
+ */
2200
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
2201
+ /** How the environment URL is derived once applied. */
2202
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
2203
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
2204
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
2205
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
2206
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2207
+ }, undefined>, v.ObjectSchema<{
2208
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
2209
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
2210
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2211
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2212
+ }, undefined>, v.ObjectSchema<{
2213
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
2214
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
2215
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
2216
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
2217
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2218
+ }, undefined>, v.ObjectSchema<{
2219
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
2220
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
2221
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2222
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2223
+ }, undefined>, v.ObjectSchema<{
2224
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
2225
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
2226
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2227
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2228
+ }, undefined>], undefined>;
2229
+ /** Optional image reference made available to the manifests as `{{image}}`. */
2230
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2231
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
2232
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2233
+ /**
2234
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
2235
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
2236
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
2237
+ */
2238
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2239
+ /** Extra labels stamped on the namespace + every applied resource. */
2240
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2241
+ /** Extra annotations stamped on the namespace. */
2242
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2243
+ /**
2244
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
2245
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
2246
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
2247
+ * with the service's own (per-environment) `helmReleases` at provision time.
2248
+ */
2249
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2250
+ /** Release name. */
2251
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2252
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
2253
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2254
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
2255
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
2256
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
2257
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
2258
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
2259
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2260
+ /** Inline `--values` overrides. */
2261
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2262
+ /** Templated `--set` overrides. */
2263
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2264
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
2265
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2266
+ /** The value, templated over the provision vars. */
2267
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
2268
+ }, undefined>, undefined>, undefined>;
2269
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
2270
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2271
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2272
+ readonly secretRef: v.ObjectSchema<{
2273
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2274
+ }, undefined>;
2275
+ }, undefined>, undefined>, undefined>;
2276
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
2277
+ }, undefined>, undefined>, undefined>;
2278
+ }, undefined>;
2279
+ }, undefined>, v.ObjectSchema<{
2280
+ readonly engine: v.LiteralSchema<"remote-custom", undefined>;
2281
+ readonly manifest: v.ObjectSchema<{
2282
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2283
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2284
+ /** Management API root; provision/status/teardown paths are appended to it. */
2285
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2286
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
2287
+ readonly type: v.LiteralSchema<"none", undefined>;
2288
+ }, undefined>, v.ObjectSchema<{
2289
+ readonly type: v.LiteralSchema<"api_key", undefined>;
2290
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2291
+ readonly secretRef: v.ObjectSchema<{
2292
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2293
+ }, undefined>;
2294
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
2295
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2296
+ }, undefined>, v.ObjectSchema<{
2297
+ readonly type: v.LiteralSchema<"bearer", undefined>;
2298
+ readonly secretRef: v.ObjectSchema<{
2299
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2300
+ }, undefined>;
2301
+ }, undefined>, v.ObjectSchema<{
2302
+ readonly type: v.LiteralSchema<"basic", undefined>;
2303
+ readonly usernameSecretRef: v.ObjectSchema<{
2304
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2305
+ }, undefined>;
2306
+ readonly passwordSecretRef: v.ObjectSchema<{
2307
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2308
+ }, undefined>;
2309
+ }, undefined>, v.ObjectSchema<{
2310
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
2311
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2312
+ readonly clientIdSecretRef: v.ObjectSchema<{
2313
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2314
+ }, undefined>;
2315
+ readonly clientSecretSecretRef: v.ObjectSchema<{
2316
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2317
+ }, undefined>;
2318
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2319
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2320
+ }, undefined>, v.ObjectSchema<{
2321
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
2322
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
2323
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2324
+ readonly secretRef: v.ObjectSchema<{
2325
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2326
+ }, undefined>;
2327
+ }, undefined>, undefined>;
2328
+ }, undefined>], undefined>;
2329
+ readonly provision: v.ObjectSchema<{
2330
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2331
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2332
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2333
+ readonly key: v.StringSchema<undefined>;
2334
+ readonly value: v.StringSchema<undefined>;
2335
+ }, undefined>, undefined>, undefined>;
2336
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2337
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2338
+ readonly value: v.StringSchema<undefined>;
2339
+ }, undefined>, undefined>, undefined>;
2340
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2341
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2342
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2343
+ }, undefined>;
2344
+ /** Optional: polled to observe async provisioning progress. */
2345
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
2346
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2347
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2348
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2349
+ readonly key: v.StringSchema<undefined>;
2350
+ readonly value: v.StringSchema<undefined>;
2351
+ }, undefined>, undefined>, undefined>;
2352
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2353
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2354
+ readonly value: v.StringSchema<undefined>;
2355
+ }, undefined>, undefined>, undefined>;
2356
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2357
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2358
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2359
+ }, undefined>, undefined>;
2360
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
2361
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
2362
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2363
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2364
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2365
+ readonly key: v.StringSchema<undefined>;
2366
+ readonly value: v.StringSchema<undefined>;
2367
+ }, undefined>, undefined>, undefined>;
2368
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2369
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2370
+ readonly value: v.StringSchema<undefined>;
2371
+ }, undefined>, undefined>, undefined>;
2372
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2373
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2374
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2375
+ }, undefined>, undefined>;
2376
+ readonly response: v.ObjectSchema<{
2377
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2378
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2379
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2380
+ readonly from: v.StringSchema<undefined>;
2381
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
2382
+ }, undefined>, undefined>, undefined>;
2383
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2384
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2385
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
2386
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
2387
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2388
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2389
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2390
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2391
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2392
+ }, undefined>, undefined>;
2393
+ }, undefined>;
2394
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
2395
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2396
+ /**
2397
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
2398
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
2399
+ * entirely; a custom backend — registered by reference into the app-owned
2400
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
2401
+ * + validates it off the per-call
2402
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
2403
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
2404
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
2405
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
2406
+ * (reuse the exported `UrlSafetyPolicy`).
2407
+ */
2408
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2409
+ }, undefined>;
2410
+ /** Which custom manifest shape this remote provider consumes — matched to a service's `manifestId`. */
2411
+ readonly acceptsManifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2412
+ }, undefined>], undefined>, undefined>;
2413
+ }, undefined>;
2414
+ export type EnvironmentHandlerView = v.InferOutput<typeof environmentHandlerViewSchema>;
2415
+ /**
2416
+ * Register (or replace) one per-type infra handler: the engine connection config + its
2417
+ * secret bundle (write-only). `manifestId` keys a `custom` handler to a specific manifest
2418
+ * id; `backendKind` pins the registry backend that builds the provider (else resolved from
2419
+ * the engine). Every secret key the chosen backend references must be supplied.
2420
+ */
2421
+ export declare const registerEnvironmentHandlerSchema: v.ObjectSchema<{
2422
+ readonly provisionType: v.PicklistSchema<["kubernetes", "docker-compose", "custom", "infraless"], undefined>;
2423
+ readonly manifestId: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>, undefined>, undefined>;
2424
+ readonly config: v.VariantSchema<"engine", [v.ObjectSchema<{
2425
+ readonly engine: v.LiteralSchema<"local-docker", undefined>;
2426
+ readonly manifest: v.ObjectSchema<{
2427
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2428
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2429
+ /** Management API root; provision/status/teardown paths are appended to it. */
2430
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2431
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
2432
+ readonly type: v.LiteralSchema<"none", undefined>;
2433
+ }, undefined>, v.ObjectSchema<{
2434
+ readonly type: v.LiteralSchema<"api_key", undefined>;
2435
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2436
+ readonly secretRef: v.ObjectSchema<{
2437
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2438
+ }, undefined>;
2439
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
2440
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2441
+ }, undefined>, v.ObjectSchema<{
2442
+ readonly type: v.LiteralSchema<"bearer", undefined>;
2443
+ readonly secretRef: v.ObjectSchema<{
2444
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2445
+ }, undefined>;
2446
+ }, undefined>, v.ObjectSchema<{
2447
+ readonly type: v.LiteralSchema<"basic", undefined>;
2448
+ readonly usernameSecretRef: v.ObjectSchema<{
2449
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2450
+ }, undefined>;
2451
+ readonly passwordSecretRef: v.ObjectSchema<{
2452
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2453
+ }, undefined>;
2454
+ }, undefined>, v.ObjectSchema<{
2455
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
2456
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2457
+ readonly clientIdSecretRef: v.ObjectSchema<{
2458
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2459
+ }, undefined>;
2460
+ readonly clientSecretSecretRef: v.ObjectSchema<{
2461
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2462
+ }, undefined>;
2463
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2464
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2465
+ }, undefined>, v.ObjectSchema<{
2466
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
2467
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
2468
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2469
+ readonly secretRef: v.ObjectSchema<{
2470
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2471
+ }, undefined>;
2472
+ }, undefined>, undefined>;
2473
+ }, undefined>], undefined>;
2474
+ readonly provision: v.ObjectSchema<{
2475
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2476
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2477
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2478
+ readonly key: v.StringSchema<undefined>;
2479
+ readonly value: v.StringSchema<undefined>;
2480
+ }, undefined>, undefined>, undefined>;
2481
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2482
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2483
+ readonly value: v.StringSchema<undefined>;
2484
+ }, undefined>, undefined>, undefined>;
2485
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2486
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2487
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2488
+ }, undefined>;
2489
+ /** Optional: polled to observe async provisioning progress. */
2490
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
2491
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2492
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2493
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2494
+ readonly key: v.StringSchema<undefined>;
2495
+ readonly value: v.StringSchema<undefined>;
2496
+ }, undefined>, undefined>, undefined>;
2497
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2498
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2499
+ readonly value: v.StringSchema<undefined>;
2500
+ }, undefined>, undefined>, undefined>;
2501
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2502
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2503
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2504
+ }, undefined>, undefined>;
2505
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
2506
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
2507
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2508
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2509
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2510
+ readonly key: v.StringSchema<undefined>;
2511
+ readonly value: v.StringSchema<undefined>;
2512
+ }, undefined>, undefined>, undefined>;
2513
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2514
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2515
+ readonly value: v.StringSchema<undefined>;
2516
+ }, undefined>, undefined>, undefined>;
2517
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2518
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2519
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2520
+ }, undefined>, undefined>;
2521
+ readonly response: v.ObjectSchema<{
2522
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2523
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2524
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2525
+ readonly from: v.StringSchema<undefined>;
2526
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
2527
+ }, undefined>, undefined>, undefined>;
2528
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2529
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2530
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
2531
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
2532
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2533
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2534
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2535
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2536
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2537
+ }, undefined>, undefined>;
2538
+ }, undefined>;
2539
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
2540
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2541
+ /**
2542
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
2543
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
2544
+ * entirely; a custom backend — registered by reference into the app-owned
2545
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
2546
+ * + validates it off the per-call
2547
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
2548
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
2549
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
2550
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
2551
+ * (reuse the exported `UrlSafetyPolicy`).
2552
+ */
2553
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2554
+ }, undefined>;
2555
+ }, undefined>, v.ObjectSchema<{
2556
+ readonly engine: v.LiteralSchema<"local-k3s", undefined>;
2557
+ readonly kubernetes: v.ObjectSchema<{
2558
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2559
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
2560
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2561
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
2562
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2563
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
2564
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
2565
+ /**
2566
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
2567
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
2568
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
2569
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
2570
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
2571
+ */
2572
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
2573
+ /** How the environment URL is derived once applied. */
2574
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
2575
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
2576
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
2577
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
2578
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2579
+ }, undefined>, v.ObjectSchema<{
2580
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
2581
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
2582
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2583
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2584
+ }, undefined>, v.ObjectSchema<{
2585
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
2586
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
2587
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
2588
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
2589
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2590
+ }, undefined>, v.ObjectSchema<{
2591
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
2592
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
2593
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2594
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2595
+ }, undefined>, v.ObjectSchema<{
2596
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
2597
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
2598
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2599
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2600
+ }, undefined>], undefined>;
2601
+ /** Optional image reference made available to the manifests as `{{image}}`. */
2602
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2603
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
2604
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2605
+ /**
2606
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
2607
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
2608
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
2609
+ */
2610
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2611
+ /** Extra labels stamped on the namespace + every applied resource. */
2612
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2613
+ /** Extra annotations stamped on the namespace. */
2614
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2615
+ /**
2616
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
2617
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
2618
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
2619
+ * with the service's own (per-environment) `helmReleases` at provision time.
2620
+ */
2621
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2622
+ /** Release name. */
2623
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2624
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
2625
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2626
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
2627
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
2628
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
2629
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
2630
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
2631
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2632
+ /** Inline `--values` overrides. */
2633
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2634
+ /** Templated `--set` overrides. */
2635
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2636
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
2637
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2638
+ /** The value, templated over the provision vars. */
2639
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
2640
+ }, undefined>, undefined>, undefined>;
2641
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
2642
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2643
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2644
+ readonly secretRef: v.ObjectSchema<{
2645
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2646
+ }, undefined>;
2647
+ }, undefined>, undefined>, undefined>;
2648
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
2649
+ }, undefined>, undefined>, undefined>;
2650
+ }, undefined>;
2651
+ }, undefined>, v.ObjectSchema<{
2652
+ readonly engine: v.LiteralSchema<"remote-kubernetes", undefined>;
2653
+ readonly kubernetes: v.ObjectSchema<{
2654
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2655
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
2656
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2657
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
2658
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2659
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
2660
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
2661
+ /**
2662
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
2663
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
2664
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
2665
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
2666
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
2667
+ */
2668
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
2669
+ /** How the environment URL is derived once applied. */
2670
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
2671
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
2672
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
2673
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
2674
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2675
+ }, undefined>, v.ObjectSchema<{
2676
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
2677
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
2678
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2679
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2680
+ }, undefined>, v.ObjectSchema<{
2681
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
2682
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
2683
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
2684
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
2685
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2686
+ }, undefined>, v.ObjectSchema<{
2687
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
2688
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
2689
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2690
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2691
+ }, undefined>, v.ObjectSchema<{
2692
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
2693
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
2694
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
2695
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
2696
+ }, undefined>], undefined>;
2697
+ /** Optional image reference made available to the manifests as `{{image}}`. */
2698
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2699
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
2700
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2701
+ /**
2702
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
2703
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
2704
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
2705
+ */
2706
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2707
+ /** Extra labels stamped on the namespace + every applied resource. */
2708
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2709
+ /** Extra annotations stamped on the namespace. */
2710
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2711
+ /**
2712
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
2713
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
2714
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
2715
+ * with the service's own (per-environment) `helmReleases` at provision time.
2716
+ */
2717
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2718
+ /** Release name. */
2719
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2720
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
2721
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2722
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
2723
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
2724
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
2725
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
2726
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
2727
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2728
+ /** Inline `--values` overrides. */
2729
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2730
+ /** Templated `--set` overrides. */
2731
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2732
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
2733
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2734
+ /** The value, templated over the provision vars. */
2735
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
2736
+ }, undefined>, undefined>, undefined>;
2737
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
2738
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2739
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2740
+ readonly secretRef: v.ObjectSchema<{
2741
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2742
+ }, undefined>;
2743
+ }, undefined>, undefined>, undefined>;
2744
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
2745
+ }, undefined>, undefined>, undefined>;
2746
+ }, undefined>;
2747
+ }, undefined>, v.ObjectSchema<{
2748
+ readonly engine: v.LiteralSchema<"remote-custom", undefined>;
2749
+ readonly manifest: v.ObjectSchema<{
2750
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2751
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2752
+ /** Management API root; provision/status/teardown paths are appended to it. */
2753
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2754
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
2755
+ readonly type: v.LiteralSchema<"none", undefined>;
2756
+ }, undefined>, v.ObjectSchema<{
2757
+ readonly type: v.LiteralSchema<"api_key", undefined>;
2758
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2759
+ readonly secretRef: v.ObjectSchema<{
2760
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2761
+ }, undefined>;
2762
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
2763
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2764
+ }, undefined>, v.ObjectSchema<{
2765
+ readonly type: v.LiteralSchema<"bearer", undefined>;
2766
+ readonly secretRef: v.ObjectSchema<{
2767
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2768
+ }, undefined>;
2769
+ }, undefined>, v.ObjectSchema<{
2770
+ readonly type: v.LiteralSchema<"basic", undefined>;
2771
+ readonly usernameSecretRef: v.ObjectSchema<{
2772
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2773
+ }, undefined>;
2774
+ readonly passwordSecretRef: v.ObjectSchema<{
2775
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2776
+ }, undefined>;
2777
+ }, undefined>, v.ObjectSchema<{
2778
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
2779
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2780
+ readonly clientIdSecretRef: v.ObjectSchema<{
2781
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2782
+ }, undefined>;
2783
+ readonly clientSecretSecretRef: v.ObjectSchema<{
2784
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2785
+ }, undefined>;
2786
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2787
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2788
+ }, undefined>, v.ObjectSchema<{
2789
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
2790
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
2791
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2792
+ readonly secretRef: v.ObjectSchema<{
2793
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2794
+ }, undefined>;
2795
+ }, undefined>, undefined>;
2796
+ }, undefined>], undefined>;
2797
+ readonly provision: v.ObjectSchema<{
2798
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2799
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2800
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2801
+ readonly key: v.StringSchema<undefined>;
2802
+ readonly value: v.StringSchema<undefined>;
2803
+ }, undefined>, undefined>, undefined>;
2804
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2805
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2806
+ readonly value: v.StringSchema<undefined>;
2807
+ }, undefined>, undefined>, undefined>;
2808
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2809
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2810
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2811
+ }, undefined>;
2812
+ /** Optional: polled to observe async provisioning progress. */
2813
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
2814
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2815
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2816
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2817
+ readonly key: v.StringSchema<undefined>;
2818
+ readonly value: v.StringSchema<undefined>;
2819
+ }, undefined>, undefined>, undefined>;
2820
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2821
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2822
+ readonly value: v.StringSchema<undefined>;
2823
+ }, undefined>, undefined>, undefined>;
2824
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2825
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2826
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2827
+ }, undefined>, undefined>;
2828
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
2829
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
2830
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2831
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2832
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2833
+ readonly key: v.StringSchema<undefined>;
2834
+ readonly value: v.StringSchema<undefined>;
2835
+ }, undefined>, undefined>, undefined>;
2836
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2837
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2838
+ readonly value: v.StringSchema<undefined>;
2839
+ }, undefined>, undefined>, undefined>;
2840
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2841
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2842
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2843
+ }, undefined>, undefined>;
2844
+ readonly response: v.ObjectSchema<{
2845
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2846
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2847
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2848
+ readonly from: v.StringSchema<undefined>;
2849
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
2850
+ }, undefined>, undefined>, undefined>;
2851
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2852
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2853
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
2854
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
2855
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2856
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2857
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2858
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2859
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2860
+ }, undefined>, undefined>;
2861
+ }, undefined>;
2862
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
2863
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
2864
+ /**
2865
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
2866
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
2867
+ * entirely; a custom backend — registered by reference into the app-owned
2868
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
2869
+ * + validates it off the per-call
2870
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
2871
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
2872
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
2873
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
2874
+ * (reuse the exported `UrlSafetyPolicy`).
2875
+ */
2876
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
2877
+ }, undefined>;
2878
+ /** Which custom manifest shape this remote provider consumes — matched to a service's `manifestId`. */
2879
+ readonly acceptsManifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2880
+ }, undefined>], undefined>;
2881
+ readonly backendKind: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2882
+ readonly secrets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
2883
+ }, undefined>;
2884
+ export type RegisterEnvironmentHandlerInput = v.InferOutput<typeof registerEnvironmentHandlerSchema>;
2885
+ /**
2886
+ * The body for a per-USER handler override PUT, where the provision type is taken from the
2887
+ * path (`/me/environment-handlers/:workspaceId/:provisionType`) — so the body carries only
2888
+ * the config + secrets (+ optional `manifestId`/`backendKind`), and must NOT re-send a
2889
+ * `provisionType` the handler would ignore.
2890
+ */
2891
+ export declare const upsertEnvironmentUserHandlerBodySchema: v.ObjectSchema<{
2892
+ readonly manifestId: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>, undefined>, undefined>;
2893
+ readonly config: v.VariantSchema<"engine", [v.ObjectSchema<{
2894
+ readonly engine: v.LiteralSchema<"local-docker", undefined>;
2895
+ readonly manifest: v.ObjectSchema<{
2896
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2897
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
2898
+ /** Management API root; provision/status/teardown paths are appended to it. */
2899
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2900
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
2901
+ readonly type: v.LiteralSchema<"none", undefined>;
2902
+ }, undefined>, v.ObjectSchema<{
2903
+ readonly type: v.LiteralSchema<"api_key", undefined>;
2904
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2905
+ readonly secretRef: v.ObjectSchema<{
2906
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2907
+ }, undefined>;
2908
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
2909
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2910
+ }, undefined>, v.ObjectSchema<{
2911
+ readonly type: v.LiteralSchema<"bearer", undefined>;
2912
+ readonly secretRef: v.ObjectSchema<{
2913
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2914
+ }, undefined>;
2915
+ }, undefined>, v.ObjectSchema<{
2916
+ readonly type: v.LiteralSchema<"basic", undefined>;
2917
+ readonly usernameSecretRef: v.ObjectSchema<{
2918
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2919
+ }, undefined>;
2920
+ readonly passwordSecretRef: v.ObjectSchema<{
2921
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2922
+ }, undefined>;
2923
+ }, undefined>, v.ObjectSchema<{
2924
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
2925
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2926
+ readonly clientIdSecretRef: v.ObjectSchema<{
2927
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2928
+ }, undefined>;
2929
+ readonly clientSecretSecretRef: v.ObjectSchema<{
2930
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2931
+ }, undefined>;
2932
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2933
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2934
+ }, undefined>, v.ObjectSchema<{
2935
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
2936
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
2937
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2938
+ readonly secretRef: v.ObjectSchema<{
2939
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
2940
+ }, undefined>;
2941
+ }, undefined>, undefined>;
2942
+ }, undefined>], undefined>;
2943
+ readonly provision: v.ObjectSchema<{
2944
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2945
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2946
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2947
+ readonly key: v.StringSchema<undefined>;
2948
+ readonly value: v.StringSchema<undefined>;
2949
+ }, undefined>, undefined>, undefined>;
2950
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2951
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2952
+ readonly value: v.StringSchema<undefined>;
2953
+ }, undefined>, undefined>, undefined>;
2954
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2955
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2956
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2957
+ }, undefined>;
2958
+ /** Optional: polled to observe async provisioning progress. */
2959
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
2960
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2961
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2962
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2963
+ readonly key: v.StringSchema<undefined>;
2964
+ readonly value: v.StringSchema<undefined>;
2965
+ }, undefined>, undefined>, undefined>;
2966
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2967
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2968
+ readonly value: v.StringSchema<undefined>;
2969
+ }, undefined>, undefined>, undefined>;
2970
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2971
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2972
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2973
+ }, undefined>, undefined>;
2974
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
2975
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
2976
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
2977
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
2978
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2979
+ readonly key: v.StringSchema<undefined>;
2980
+ readonly value: v.StringSchema<undefined>;
2981
+ }, undefined>, undefined>, undefined>;
2982
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2983
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
2984
+ readonly value: v.StringSchema<undefined>;
2985
+ }, undefined>, undefined>, undefined>;
2986
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2987
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
2988
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
2989
+ }, undefined>, undefined>;
2990
+ readonly response: v.ObjectSchema<{
2991
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2992
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2993
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
2994
+ readonly from: v.StringSchema<undefined>;
2995
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
2996
+ }, undefined>, undefined>, undefined>;
2997
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2998
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
2999
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
3000
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3001
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3002
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3003
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3004
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3005
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3006
+ }, undefined>, undefined>;
3007
+ }, undefined>;
3008
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
3009
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3010
+ /**
3011
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
3012
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
3013
+ * entirely; a custom backend — registered by reference into the app-owned
3014
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
3015
+ * + validates it off the per-call
3016
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
3017
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
3018
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
3019
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
3020
+ * (reuse the exported `UrlSafetyPolicy`).
3021
+ */
3022
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3023
+ }, undefined>;
3024
+ }, undefined>, v.ObjectSchema<{
3025
+ readonly engine: v.LiteralSchema<"local-k3s", undefined>;
3026
+ readonly kubernetes: v.ObjectSchema<{
3027
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3028
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
3029
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3030
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
3031
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3032
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
3033
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
3034
+ /**
3035
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
3036
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
3037
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
3038
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
3039
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
3040
+ */
3041
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
3042
+ /** How the environment URL is derived once applied. */
3043
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
3044
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
3045
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
3046
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3047
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3048
+ }, undefined>, v.ObjectSchema<{
3049
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
3050
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
3051
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3052
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3053
+ }, undefined>, v.ObjectSchema<{
3054
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
3055
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
3056
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
3057
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
3058
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3059
+ }, undefined>, v.ObjectSchema<{
3060
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
3061
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
3062
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3063
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3064
+ }, undefined>, v.ObjectSchema<{
3065
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
3066
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
3067
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3068
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3069
+ }, undefined>], undefined>;
3070
+ /** Optional image reference made available to the manifests as `{{image}}`. */
3071
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3072
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
3073
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3074
+ /**
3075
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
3076
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
3077
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
3078
+ */
3079
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
3080
+ /** Extra labels stamped on the namespace + every applied resource. */
3081
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3082
+ /** Extra annotations stamped on the namespace. */
3083
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3084
+ /**
3085
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
3086
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
3087
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
3088
+ * with the service's own (per-environment) `helmReleases` at provision time.
3089
+ */
3090
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3091
+ /** Release name. */
3092
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3093
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
3094
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3095
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
3096
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
3097
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
3098
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
3099
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
3100
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3101
+ /** Inline `--values` overrides. */
3102
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3103
+ /** Templated `--set` overrides. */
3104
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3105
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
3106
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3107
+ /** The value, templated over the provision vars. */
3108
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
3109
+ }, undefined>, undefined>, undefined>;
3110
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
3111
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3112
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3113
+ readonly secretRef: v.ObjectSchema<{
3114
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3115
+ }, undefined>;
3116
+ }, undefined>, undefined>, undefined>;
3117
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
3118
+ }, undefined>, undefined>, undefined>;
3119
+ }, undefined>;
3120
+ }, undefined>, v.ObjectSchema<{
3121
+ readonly engine: v.LiteralSchema<"remote-kubernetes", undefined>;
3122
+ readonly kubernetes: v.ObjectSchema<{
3123
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3124
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
3125
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3126
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
3127
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3128
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
3129
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
3130
+ /**
3131
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
3132
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
3133
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
3134
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
3135
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
3136
+ */
3137
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
3138
+ /** How the environment URL is derived once applied. */
3139
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
3140
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
3141
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
3142
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3143
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3144
+ }, undefined>, v.ObjectSchema<{
3145
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
3146
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
3147
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3148
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3149
+ }, undefined>, v.ObjectSchema<{
3150
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
3151
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
3152
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
3153
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
3154
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3155
+ }, undefined>, v.ObjectSchema<{
3156
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
3157
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
3158
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3159
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3160
+ }, undefined>, v.ObjectSchema<{
3161
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
3162
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
3163
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3164
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3165
+ }, undefined>], undefined>;
3166
+ /** Optional image reference made available to the manifests as `{{image}}`. */
3167
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3168
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
3169
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3170
+ /**
3171
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
3172
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
3173
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
3174
+ */
3175
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
3176
+ /** Extra labels stamped on the namespace + every applied resource. */
3177
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3178
+ /** Extra annotations stamped on the namespace. */
3179
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3180
+ /**
3181
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
3182
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
3183
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
3184
+ * with the service's own (per-environment) `helmReleases` at provision time.
3185
+ */
3186
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3187
+ /** Release name. */
3188
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3189
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
3190
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3191
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
3192
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
3193
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
3194
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
3195
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
3196
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3197
+ /** Inline `--values` overrides. */
3198
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3199
+ /** Templated `--set` overrides. */
3200
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3201
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
3202
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3203
+ /** The value, templated over the provision vars. */
3204
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
3205
+ }, undefined>, undefined>, undefined>;
3206
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
3207
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3208
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3209
+ readonly secretRef: v.ObjectSchema<{
3210
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3211
+ }, undefined>;
3212
+ }, undefined>, undefined>, undefined>;
3213
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
3214
+ }, undefined>, undefined>, undefined>;
3215
+ }, undefined>;
3216
+ }, undefined>, v.ObjectSchema<{
3217
+ readonly engine: v.LiteralSchema<"remote-custom", undefined>;
3218
+ readonly manifest: v.ObjectSchema<{
3219
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3220
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3221
+ /** Management API root; provision/status/teardown paths are appended to it. */
3222
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3223
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
3224
+ readonly type: v.LiteralSchema<"none", undefined>;
3225
+ }, undefined>, v.ObjectSchema<{
3226
+ readonly type: v.LiteralSchema<"api_key", undefined>;
3227
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3228
+ readonly secretRef: v.ObjectSchema<{
3229
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3230
+ }, undefined>;
3231
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
3232
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3233
+ }, undefined>, v.ObjectSchema<{
3234
+ readonly type: v.LiteralSchema<"bearer", undefined>;
3235
+ readonly secretRef: v.ObjectSchema<{
3236
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3237
+ }, undefined>;
3238
+ }, undefined>, v.ObjectSchema<{
3239
+ readonly type: v.LiteralSchema<"basic", undefined>;
3240
+ readonly usernameSecretRef: v.ObjectSchema<{
3241
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3242
+ }, undefined>;
3243
+ readonly passwordSecretRef: v.ObjectSchema<{
3244
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3245
+ }, undefined>;
3246
+ }, undefined>, v.ObjectSchema<{
3247
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
3248
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3249
+ readonly clientIdSecretRef: v.ObjectSchema<{
3250
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3251
+ }, undefined>;
3252
+ readonly clientSecretSecretRef: v.ObjectSchema<{
3253
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3254
+ }, undefined>;
3255
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3256
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3257
+ }, undefined>, v.ObjectSchema<{
3258
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
3259
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
3260
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3261
+ readonly secretRef: v.ObjectSchema<{
3262
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3263
+ }, undefined>;
3264
+ }, undefined>, undefined>;
3265
+ }, undefined>], undefined>;
3266
+ readonly provision: v.ObjectSchema<{
3267
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3268
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3269
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3270
+ readonly key: v.StringSchema<undefined>;
3271
+ readonly value: v.StringSchema<undefined>;
3272
+ }, undefined>, undefined>, undefined>;
3273
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3274
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3275
+ readonly value: v.StringSchema<undefined>;
3276
+ }, undefined>, undefined>, undefined>;
3277
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3278
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3279
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3280
+ }, undefined>;
3281
+ /** Optional: polled to observe async provisioning progress. */
3282
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
3283
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3284
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3285
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3286
+ readonly key: v.StringSchema<undefined>;
3287
+ readonly value: v.StringSchema<undefined>;
3288
+ }, undefined>, undefined>, undefined>;
3289
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3290
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3291
+ readonly value: v.StringSchema<undefined>;
3292
+ }, undefined>, undefined>, undefined>;
3293
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3294
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3295
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3296
+ }, undefined>, undefined>;
3297
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
3298
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
3299
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3300
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3301
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3302
+ readonly key: v.StringSchema<undefined>;
3303
+ readonly value: v.StringSchema<undefined>;
3304
+ }, undefined>, undefined>, undefined>;
3305
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3306
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3307
+ readonly value: v.StringSchema<undefined>;
3308
+ }, undefined>, undefined>, undefined>;
3309
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3310
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3311
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3312
+ }, undefined>, undefined>;
3313
+ readonly response: v.ObjectSchema<{
3314
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3315
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3316
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3317
+ readonly from: v.StringSchema<undefined>;
3318
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
3319
+ }, undefined>, undefined>, undefined>;
3320
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3321
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3322
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
3323
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3324
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3325
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3326
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3327
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3328
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3329
+ }, undefined>, undefined>;
3330
+ }, undefined>;
3331
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
3332
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3333
+ /**
3334
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
3335
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
3336
+ * entirely; a custom backend — registered by reference into the app-owned
3337
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
3338
+ * + validates it off the per-call
3339
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
3340
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
3341
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
3342
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
3343
+ * (reuse the exported `UrlSafetyPolicy`).
3344
+ */
3345
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3346
+ }, undefined>;
3347
+ /** Which custom manifest shape this remote provider consumes — matched to a service's `manifestId`. */
3348
+ readonly acceptsManifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3349
+ }, undefined>], undefined>;
3350
+ readonly backendKind: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3351
+ readonly secrets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
3352
+ }, undefined>;
3353
+ export type UpsertEnvironmentUserHandlerBody = v.InferOutput<typeof upsertEnvironmentUserHandlerBodySchema>;
3354
+ /** The batched per-type handler bundle: every workspace handler + the custom-type catalog. */
3355
+ export declare const environmentHandlersBundleSchema: v.ObjectSchema<{
3356
+ readonly handlers: v.ArraySchema<v.ObjectSchema<{
3357
+ readonly provisionType: v.PicklistSchema<["kubernetes", "docker-compose", "custom", "infraless"], undefined>;
3358
+ /** For `custom`: the manifest id this handler is keyed to; `null` otherwise. */
3359
+ readonly manifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3360
+ readonly engine: v.PicklistSchema<["local-docker", "local-k3s", "remote-kubernetes", "remote-custom", "none"], undefined>;
3361
+ readonly providerId: v.StringSchema<undefined>;
3362
+ readonly label: v.StringSchema<undefined>;
3363
+ readonly baseUrl: v.StringSchema<undefined>;
3364
+ readonly connectedAt: v.NumberSchema<undefined>;
3365
+ /** Which secret keys are set (names only), so the UI can show completeness. */
3366
+ readonly secretKeys: v.ArraySchema<v.StringSchema<undefined>, undefined>;
3367
+ /** For `remote-custom`: the manifest id this provider accepts; `null` otherwise. */
3368
+ readonly acceptsManifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3369
+ /** The stored handler config, sans secrets, for connect-form prefill on edit. */
3370
+ readonly config: v.OptionalSchema<v.VariantSchema<"engine", [v.ObjectSchema<{
3371
+ readonly engine: v.LiteralSchema<"local-docker", undefined>;
3372
+ readonly manifest: v.ObjectSchema<{
3373
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3374
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3375
+ /** Management API root; provision/status/teardown paths are appended to it. */
3376
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3377
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
3378
+ readonly type: v.LiteralSchema<"none", undefined>;
3379
+ }, undefined>, v.ObjectSchema<{
3380
+ readonly type: v.LiteralSchema<"api_key", undefined>;
3381
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3382
+ readonly secretRef: v.ObjectSchema<{
3383
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3384
+ }, undefined>;
3385
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
3386
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3387
+ }, undefined>, v.ObjectSchema<{
3388
+ readonly type: v.LiteralSchema<"bearer", undefined>;
3389
+ readonly secretRef: v.ObjectSchema<{
3390
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3391
+ }, undefined>;
3392
+ }, undefined>, v.ObjectSchema<{
3393
+ readonly type: v.LiteralSchema<"basic", undefined>;
3394
+ readonly usernameSecretRef: v.ObjectSchema<{
3395
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3396
+ }, undefined>;
3397
+ readonly passwordSecretRef: v.ObjectSchema<{
3398
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3399
+ }, undefined>;
3400
+ }, undefined>, v.ObjectSchema<{
3401
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
3402
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3403
+ readonly clientIdSecretRef: v.ObjectSchema<{
3404
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3405
+ }, undefined>;
3406
+ readonly clientSecretSecretRef: v.ObjectSchema<{
3407
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3408
+ }, undefined>;
3409
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3410
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3411
+ }, undefined>, v.ObjectSchema<{
3412
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
3413
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
3414
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3415
+ readonly secretRef: v.ObjectSchema<{
3416
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3417
+ }, undefined>;
3418
+ }, undefined>, undefined>;
3419
+ }, undefined>], undefined>;
3420
+ readonly provision: v.ObjectSchema<{
3421
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3422
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3423
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3424
+ readonly key: v.StringSchema<undefined>;
3425
+ readonly value: v.StringSchema<undefined>;
3426
+ }, undefined>, undefined>, undefined>;
3427
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3428
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3429
+ readonly value: v.StringSchema<undefined>;
3430
+ }, undefined>, undefined>, undefined>;
3431
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3432
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3433
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3434
+ }, undefined>;
3435
+ /** Optional: polled to observe async provisioning progress. */
3436
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
3437
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3438
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3439
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3440
+ readonly key: v.StringSchema<undefined>;
3441
+ readonly value: v.StringSchema<undefined>;
3442
+ }, undefined>, undefined>, undefined>;
3443
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3444
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3445
+ readonly value: v.StringSchema<undefined>;
3446
+ }, undefined>, undefined>, undefined>;
3447
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3448
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3449
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3450
+ }, undefined>, undefined>;
3451
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
3452
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
3453
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3454
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3455
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3456
+ readonly key: v.StringSchema<undefined>;
3457
+ readonly value: v.StringSchema<undefined>;
3458
+ }, undefined>, undefined>, undefined>;
3459
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3460
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3461
+ readonly value: v.StringSchema<undefined>;
3462
+ }, undefined>, undefined>, undefined>;
3463
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3464
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3465
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3466
+ }, undefined>, undefined>;
3467
+ readonly response: v.ObjectSchema<{
3468
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3469
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3470
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3471
+ readonly from: v.StringSchema<undefined>;
3472
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
3473
+ }, undefined>, undefined>, undefined>;
3474
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3475
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3476
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
3477
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3478
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3479
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3480
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3481
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3482
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3483
+ }, undefined>, undefined>;
3484
+ }, undefined>;
3485
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
3486
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3487
+ /**
3488
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
3489
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
3490
+ * entirely; a custom backend — registered by reference into the app-owned
3491
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
3492
+ * + validates it off the per-call
3493
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
3494
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
3495
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
3496
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
3497
+ * (reuse the exported `UrlSafetyPolicy`).
3498
+ */
3499
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3500
+ }, undefined>;
3501
+ }, undefined>, v.ObjectSchema<{
3502
+ readonly engine: v.LiteralSchema<"local-k3s", undefined>;
3503
+ readonly kubernetes: v.ObjectSchema<{
3504
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3505
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
3506
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3507
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
3508
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3509
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
3510
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
3511
+ /**
3512
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
3513
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
3514
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
3515
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
3516
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
3517
+ */
3518
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
3519
+ /** How the environment URL is derived once applied. */
3520
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
3521
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
3522
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
3523
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3524
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3525
+ }, undefined>, v.ObjectSchema<{
3526
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
3527
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
3528
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3529
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3530
+ }, undefined>, v.ObjectSchema<{
3531
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
3532
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
3533
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
3534
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
3535
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3536
+ }, undefined>, v.ObjectSchema<{
3537
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
3538
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
3539
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3540
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3541
+ }, undefined>, v.ObjectSchema<{
3542
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
3543
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
3544
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3545
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3546
+ }, undefined>], undefined>;
3547
+ /** Optional image reference made available to the manifests as `{{image}}`. */
3548
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3549
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
3550
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3551
+ /**
3552
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
3553
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
3554
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
3555
+ */
3556
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
3557
+ /** Extra labels stamped on the namespace + every applied resource. */
3558
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3559
+ /** Extra annotations stamped on the namespace. */
3560
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3561
+ /**
3562
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
3563
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
3564
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
3565
+ * with the service's own (per-environment) `helmReleases` at provision time.
3566
+ */
3567
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3568
+ /** Release name. */
3569
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3570
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
3571
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3572
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
3573
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
3574
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
3575
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
3576
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
3577
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3578
+ /** Inline `--values` overrides. */
3579
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3580
+ /** Templated `--set` overrides. */
3581
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3582
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
3583
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3584
+ /** The value, templated over the provision vars. */
3585
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
3586
+ }, undefined>, undefined>, undefined>;
3587
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
3588
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3589
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3590
+ readonly secretRef: v.ObjectSchema<{
3591
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3592
+ }, undefined>;
3593
+ }, undefined>, undefined>, undefined>;
3594
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
3595
+ }, undefined>, undefined>, undefined>;
3596
+ }, undefined>;
3597
+ }, undefined>, v.ObjectSchema<{
3598
+ readonly engine: v.LiteralSchema<"remote-kubernetes", undefined>;
3599
+ readonly kubernetes: v.ObjectSchema<{
3600
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3601
+ /** kube-apiserver root URL, e.g. `https://my-cluster.example:6443`. */
3602
+ readonly apiServerUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3603
+ /** PEM CA bundle to verify the apiserver TLS cert (omit only for a publicly-trusted CA). */
3604
+ readonly caCertPem: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3605
+ /** Skip apiserver TLS verification — strongly discouraged; kind/dev clusters only. */
3606
+ readonly insecureSkipTlsVerify: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
3607
+ /**
3608
+ * Namespace name template for the per-PR environment, e.g. `cf-env-{{pullNumber}}`. With
3609
+ * `renderer: 'kustomize'`, ABSENT ⇒ honor the overlay's own `namespace:` when it pins one
3610
+ * (the shared-namespace ephemeral-env shape, where base + overlay name a fixed namespace);
3611
+ * SET ⇒ override it (the adapter sets the namespace at build time) for true per-PR
3612
+ * isolation. For raw manifests, absent ⇒ a default derived from the PR number / block id.
3613
+ */
3614
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
3615
+ /** How the environment URL is derived once applied. */
3616
+ readonly url: v.VariantSchema<"source", [v.ObjectSchema<{
3617
+ readonly source: v.LiteralSchema<"ingressTemplate", undefined>;
3618
+ /** Host template, e.g. `{{branch}}.preview.example.com`; rendered with the provision vars. */
3619
+ readonly hostTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3620
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3621
+ }, undefined>, v.ObjectSchema<{
3622
+ readonly source: v.LiteralSchema<"ingressStatus", undefined>;
3623
+ /** Ingress object to read `.status.loadBalancer` from; absent ⇒ the only Ingress applied. */
3624
+ readonly ingressName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3625
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3626
+ }, undefined>, v.ObjectSchema<{
3627
+ readonly source: v.LiteralSchema<"serviceStatus", undefined>;
3628
+ /** Service object to read `.status.loadBalancer` (k3s ServiceLB) from. */
3629
+ readonly serviceName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
3630
+ readonly port: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65535, undefined>]>, undefined>;
3631
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3632
+ }, undefined>, v.ObjectSchema<{
3633
+ readonly source: v.LiteralSchema<"gatewayStatus", undefined>;
3634
+ /** Gateway-API `Gateway` to read `.status.addresses[]` from; absent ⇒ the only one applied. */
3635
+ readonly gatewayName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3636
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3637
+ }, undefined>, v.ObjectSchema<{
3638
+ readonly source: v.LiteralSchema<"httpRouteStatus", undefined>;
3639
+ /** `HTTPRoute` whose `parentRefs` resolve to the Gateway address; absent ⇒ the only one applied. */
3640
+ readonly httpRouteName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
3641
+ readonly scheme: v.OptionalSchema<v.PicklistSchema<["http", "https"], undefined>, undefined>;
3642
+ }, undefined>], undefined>;
3643
+ /** Optional image reference made available to the manifests as `{{image}}`. */
3644
+ readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3645
+ /** Fallback TTL (ms) after which the env is swept + torn down. */
3646
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3647
+ /**
3648
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
3649
+ * before reporting the env still `provisioning` (the backend keeps polling). Absent ⇒ the
3650
+ * harness default (180s). Merged into the provision config via `...kube` at provision time.
3651
+ */
3652
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
3653
+ /** Extra labels stamped on the namespace + every applied resource. */
3654
+ readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3655
+ /** Extra annotations stamped on the namespace. */
3656
+ readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
3657
+ /**
3658
+ * Workspace-level (cluster-singleton) helm releases the deploy adapter ensures before
3659
+ * applying a service's manifests — e.g. an ingress/gateway controller shared by every
3660
+ * per-PR env. Use `scope: 'shared'`; installed once, never torn down per-PR. Merged
3661
+ * with the service's own (per-environment) `helmReleases` at provision time.
3662
+ */
3663
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3664
+ /** Release name. */
3665
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3666
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
3667
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3668
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
3669
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
3670
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
3671
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
3672
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
3673
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3674
+ /** Inline `--values` overrides. */
3675
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3676
+ /** Templated `--set` overrides. */
3677
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3678
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
3679
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3680
+ /** The value, templated over the provision vars. */
3681
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
3682
+ }, undefined>, undefined>, undefined>;
3683
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
3684
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3685
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3686
+ readonly secretRef: v.ObjectSchema<{
3687
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3688
+ }, undefined>;
3689
+ }, undefined>, undefined>, undefined>;
3690
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
3691
+ }, undefined>, undefined>, undefined>;
3692
+ }, undefined>;
3693
+ }, undefined>, v.ObjectSchema<{
3694
+ readonly engine: v.LiteralSchema<"remote-custom", undefined>;
3695
+ readonly manifest: v.ObjectSchema<{
3696
+ readonly providerId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3697
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3698
+ /** Management API root; provision/status/teardown paths are appended to it. */
3699
+ readonly baseUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3700
+ readonly auth: v.VariantSchema<"type", [v.ObjectSchema<{
3701
+ readonly type: v.LiteralSchema<"none", undefined>;
3702
+ }, undefined>, v.ObjectSchema<{
3703
+ readonly type: v.LiteralSchema<"api_key", undefined>;
3704
+ readonly headerName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3705
+ readonly secretRef: v.ObjectSchema<{
3706
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3707
+ }, undefined>;
3708
+ /** Optional prefix prepended to the secret value, e.g. `Token `. */
3709
+ readonly valuePrefix: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3710
+ }, undefined>, v.ObjectSchema<{
3711
+ readonly type: v.LiteralSchema<"bearer", undefined>;
3712
+ readonly secretRef: v.ObjectSchema<{
3713
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3714
+ }, undefined>;
3715
+ }, undefined>, v.ObjectSchema<{
3716
+ readonly type: v.LiteralSchema<"basic", undefined>;
3717
+ readonly usernameSecretRef: v.ObjectSchema<{
3718
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3719
+ }, undefined>;
3720
+ readonly passwordSecretRef: v.ObjectSchema<{
3721
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3722
+ }, undefined>;
3723
+ }, undefined>, v.ObjectSchema<{
3724
+ readonly type: v.LiteralSchema<"oauth2_client_credentials", undefined>;
3725
+ readonly tokenUrl: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3726
+ readonly clientIdSecretRef: v.ObjectSchema<{
3727
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3728
+ }, undefined>;
3729
+ readonly clientSecretSecretRef: v.ObjectSchema<{
3730
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3731
+ }, undefined>;
3732
+ readonly scope: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3733
+ readonly audience: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3734
+ }, undefined>, v.ObjectSchema<{
3735
+ readonly type: v.LiteralSchema<"custom_headers", undefined>;
3736
+ readonly headers: v.ArraySchema<v.ObjectSchema<{
3737
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3738
+ readonly secretRef: v.ObjectSchema<{
3739
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3740
+ }, undefined>;
3741
+ }, undefined>, undefined>;
3742
+ }, undefined>], undefined>;
3743
+ readonly provision: v.ObjectSchema<{
3744
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3745
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3746
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3747
+ readonly key: v.StringSchema<undefined>;
3748
+ readonly value: v.StringSchema<undefined>;
3749
+ }, undefined>, undefined>, undefined>;
3750
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3751
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3752
+ readonly value: v.StringSchema<undefined>;
3753
+ }, undefined>, undefined>, undefined>;
3754
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3755
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3756
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3757
+ }, undefined>;
3758
+ /** Optional: polled to observe async provisioning progress. */
3759
+ readonly status: v.OptionalSchema<v.ObjectSchema<{
3760
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3761
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3762
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3763
+ readonly key: v.StringSchema<undefined>;
3764
+ readonly value: v.StringSchema<undefined>;
3765
+ }, undefined>, undefined>, undefined>;
3766
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3767
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3768
+ readonly value: v.StringSchema<undefined>;
3769
+ }, undefined>, undefined>, undefined>;
3770
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3771
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3772
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3773
+ }, undefined>, undefined>;
3774
+ /** Optional: called to destroy the environment (manual or on TTL expiry). */
3775
+ readonly teardown: v.OptionalSchema<v.ObjectSchema<{
3776
+ readonly method: v.PicklistSchema<["GET", "POST", "PUT", "PATCH", "DELETE"], undefined>;
3777
+ readonly pathTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
3778
+ readonly query: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3779
+ readonly key: v.StringSchema<undefined>;
3780
+ readonly value: v.StringSchema<undefined>;
3781
+ }, undefined>, undefined>, undefined>;
3782
+ readonly headers: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3783
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
3784
+ readonly value: v.StringSchema<undefined>;
3785
+ }, undefined>, undefined>, undefined>;
3786
+ readonly bodyTemplate: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3787
+ /** Per-call timeout (ms). Bounded; defaults applied by the adapter. */
3788
+ readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 60000, undefined>]>, undefined>;
3789
+ }, undefined>, undefined>;
3790
+ readonly response: v.ObjectSchema<{
3791
+ readonly urlPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3792
+ readonly statusPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3793
+ readonly statusMap: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
3794
+ readonly from: v.StringSchema<undefined>;
3795
+ readonly to: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
3796
+ }, undefined>, undefined>, undefined>;
3797
+ readonly expiresAtPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3798
+ readonly externalIdPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3799
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
3800
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3801
+ readonly tokenPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3802
+ readonly usernamePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3803
+ readonly passwordPath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3804
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3805
+ readonly headerValuePath: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3806
+ }, undefined>, undefined>;
3807
+ }, undefined>;
3808
+ /** Fallback TTL (ms) when the response carries no explicit expiry. */
3809
+ readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
3810
+ /**
3811
+ * Opaque, provider-specific configuration for a CUSTOM backend (e.g. a Kargo project,
3812
+ * link-selection key, status map). The generic HttpEnvironmentProvider ignores it
3813
+ * entirely; a custom backend — registered by reference into the app-owned
3814
+ * `EnvironmentBackendRegistry` (see `backend/docs/native-environment-adapter.md`) — reads
3815
+ * + validates it off the per-call
3816
+ * `manifest`. This is the per-WORKSPACE config carrier: a custom backend rides the generic
3817
+ * manifest member of `environmentBackendConfigSchema`, so its bespoke settings live here and
3818
+ * its credentials in the secret bundle. NOT covered by the manifest URL/SSRF checks (which
3819
+ * only guard `baseUrl`/`tokenUrl`); a backend that puts a URL here must guard it itself
3820
+ * (reuse the exported `UrlSafetyPolicy`).
3821
+ */
3822
+ readonly providerConfig: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
3823
+ }, undefined>;
3824
+ /** Which custom manifest shape this remote provider consumes — matched to a service's `manifestId`. */
3825
+ readonly acceptsManifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3826
+ }, undefined>], undefined>, undefined>;
3827
+ }, undefined>, undefined>;
3828
+ readonly customTypes: v.ArraySchema<v.ObjectSchema<{
3829
+ readonly manifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
3830
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
3831
+ /** `registered` (from a code provider) or `workspace` (UI-defined). */
3832
+ readonly source: v.PicklistSchema<["registered", "workspace"], undefined>;
3833
+ /** Optional hint describing the input shape the provider expects. */
3834
+ readonly acceptsInputHint: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
3835
+ readonly description: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
3836
+ }, undefined>, undefined>;
3837
+ }, undefined>;
3838
+ export type EnvironmentHandlersBundle = v.InferOutput<typeof environmentHandlersBundleSchema>;
3839
+ /** Resolved access creds for a provisioned env, as surfaced to a tester agent. */
3840
+ export declare const environmentAccessHandleSchema: v.ObjectSchema<{
3841
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3842
+ readonly token: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3843
+ readonly username: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3844
+ readonly password: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3845
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3846
+ readonly headerValue: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3847
+ }, undefined>;
3848
+ export type EnvironmentAccessHandle = v.InferOutput<typeof environmentAccessHandleSchema>;
3849
+ /** A provisioned environment, as exposed to clients and downstream agents. */
3850
+ export declare const environmentHandleSchema: v.ObjectSchema<{
3851
+ readonly id: v.StringSchema<undefined>;
3852
+ readonly workspaceId: v.StringSchema<undefined>;
3853
+ readonly blockId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3854
+ readonly executionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3855
+ readonly providerId: v.StringSchema<undefined>;
3856
+ readonly externalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3857
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3858
+ readonly status: v.PicklistSchema<["provisioning", "ready", "failed", "expired", "tearing_down", "torn_down"], undefined>;
3859
+ /** Present only on the dedicated access endpoint / in agent context. */
3860
+ readonly access: v.OptionalSchema<v.ObjectSchema<{
3861
+ readonly scheme: v.PicklistSchema<["none", "bearer", "basic", "custom_header"], undefined>;
3862
+ readonly token: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3863
+ readonly username: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3864
+ readonly password: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3865
+ readonly headerName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3866
+ readonly headerValue: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
3867
+ }, undefined>, undefined>;
3868
+ readonly createdAt: v.NumberSchema<undefined>;
3869
+ readonly expiresAt: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
3870
+ readonly lastError: v.NullableSchema<v.StringSchema<undefined>, undefined>;
3871
+ /**
3872
+ * The service's declared provision type this environment was stood up for
3873
+ * (`kubernetes` | `docker-compose` | `custom` | `infraless`). Recorded at provision
3874
+ * time so run details can show exactly what was provisioned. Null for legacy rows.
3875
+ */
1662
3876
  readonly provisionType: v.OptionalSchema<v.NullableSchema<v.PicklistSchema<["kubernetes", "docker-compose", "custom", "infraless"], undefined>, undefined>, undefined>;
1663
3877
  /**
1664
3878
  * The resolved engine that handled the provisioning (`local-docker` | `local-k3s` |
@@ -1882,10 +4096,115 @@ export declare const environmentConnectionSchema: v.ObjectSchema<{
1882
4096
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
1883
4097
  /** Fallback TTL (ms) after which the env is swept + torn down. */
1884
4098
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
4099
+ /**
4100
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
4101
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
4102
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
4103
+ */
4104
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
1885
4105
  /** Extra labels stamped on the namespace + every applied resource. */
1886
4106
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
1887
4107
  /** Extra annotations stamped on the namespace. */
1888
4108
  readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
4109
+ /** Structured image overrides (the kustomize `images:` shape), templated over provision vars. */
4110
+ readonly images: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4111
+ /** The image to match (the `name:` in a kustomization `images:` entry), e.g. `registry/app`. */
4112
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4113
+ /** Optional replacement repo, templated; absent ⇒ keep the original repo. */
4114
+ readonly newNameTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4115
+ /** Replacement tag, templated (e.g. `{{branch}}` / `{{sha}}`); mutually exclusive with digest. */
4116
+ readonly newTagTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4117
+ /** Replacement digest, templated; alternative to a tag. */
4118
+ readonly digestTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4119
+ }, undefined>, v.CheckAction<{
4120
+ name: string;
4121
+ newNameTemplate?: string | undefined;
4122
+ newTagTemplate?: string | undefined;
4123
+ digestTemplate?: string | undefined;
4124
+ }, "an image override must set at least one of newNameTemplate, newTagTemplate, or digestTemplate.">, v.CheckAction<{
4125
+ name: string;
4126
+ newNameTemplate?: string | undefined;
4127
+ newTagTemplate?: string | undefined;
4128
+ digestTemplate?: string | undefined;
4129
+ }, "newTagTemplate and digestTemplate are mutually exclusive on an image override.">]>, undefined>, undefined>;
4130
+ /** Helm releases to install — workspace-shared singletons merged with the service's per-env ones. */
4131
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4132
+ /** Release name. */
4133
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4134
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
4135
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4136
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
4137
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4138
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
4139
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
4140
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
4141
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4142
+ /** Inline `--values` overrides. */
4143
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
4144
+ /** Templated `--set` overrides. */
4145
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4146
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
4147
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4148
+ /** The value, templated over the provision vars. */
4149
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
4150
+ }, undefined>, undefined>, undefined>;
4151
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
4152
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4153
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4154
+ readonly secretRef: v.ObjectSchema<{
4155
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4156
+ }, undefined>;
4157
+ }, undefined>, undefined>, undefined>;
4158
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
4159
+ }, undefined>, undefined>, undefined>;
4160
+ /** Secrets fed in before apply (a `Secret` resource or a `secretGenerator` `.env`). */
4161
+ readonly secretInjections: v.OptionalSchema<v.ArraySchema<v.VariantSchema<"mode", [v.ObjectSchema<{
4162
+ readonly mode: v.LiteralSchema<"secret", undefined>;
4163
+ /** Target Secret name in the namespace. */
4164
+ readonly secretName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4165
+ /** Secret `type`; absent ⇒ `Opaque`. */
4166
+ readonly secretType: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
4167
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4168
+ /** Key inside the rendered Secret / `.env`. */
4169
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
4170
+ /** Resolve the value from the workspace encrypted bundle by key. */
4171
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
4172
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4173
+ }, undefined>, undefined>;
4174
+ /** OR a non-secret value, templated over the provision vars. */
4175
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4176
+ }, undefined>, v.CheckAction<{
4177
+ key: string;
4178
+ secretRef?: {
4179
+ key: string;
4180
+ } | undefined;
4181
+ valueTemplate?: string | undefined;
4182
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
4183
+ }, undefined>, v.ObjectSchema<{
4184
+ readonly mode: v.LiteralSchema<"generatorEnvFile", undefined>;
4185
+ /**
4186
+ * Repo-relative path within the overlay tree to write the `KEY=value` env file the
4187
+ * overlay's `secretGenerator` reads (e.g. `overlays/<env>/<component>/.env`). The
4188
+ * overlay names the Secret.
4189
+ */
4190
+ readonly envFilePath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
4191
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4192
+ /** Key inside the rendered Secret / `.env`. */
4193
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
4194
+ /** Resolve the value from the workspace encrypted bundle by key. */
4195
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
4196
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4197
+ }, undefined>, undefined>;
4198
+ /** OR a non-secret value, templated over the provision vars. */
4199
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4200
+ }, undefined>, v.CheckAction<{
4201
+ key: string;
4202
+ secretRef?: {
4203
+ key: string;
4204
+ } | undefined;
4205
+ valueTemplate?: string | undefined;
4206
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
4207
+ }, undefined>], undefined>, undefined>, undefined>;
1889
4208
  }, undefined>;
1890
4209
  }, undefined>, v.ObjectSchema<{
1891
4210
  readonly kind: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>, v.RegexAction<string, "must be a lower-kebab slug">, v.CheckAction<string, "reserved backend kind">]>;
@@ -2229,10 +4548,115 @@ export declare const registerEnvironmentProviderSchema: v.ObjectSchema<{
2229
4548
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2230
4549
  /** Fallback TTL (ms) after which the env is swept + torn down. */
2231
4550
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
4551
+ /**
4552
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
4553
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
4554
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
4555
+ */
4556
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2232
4557
  /** Extra labels stamped on the namespace + every applied resource. */
2233
4558
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2234
4559
  /** Extra annotations stamped on the namespace. */
2235
4560
  readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
4561
+ /** Structured image overrides (the kustomize `images:` shape), templated over provision vars. */
4562
+ readonly images: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4563
+ /** The image to match (the `name:` in a kustomization `images:` entry), e.g. `registry/app`. */
4564
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4565
+ /** Optional replacement repo, templated; absent ⇒ keep the original repo. */
4566
+ readonly newNameTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4567
+ /** Replacement tag, templated (e.g. `{{branch}}` / `{{sha}}`); mutually exclusive with digest. */
4568
+ readonly newTagTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4569
+ /** Replacement digest, templated; alternative to a tag. */
4570
+ readonly digestTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4571
+ }, undefined>, v.CheckAction<{
4572
+ name: string;
4573
+ newNameTemplate?: string | undefined;
4574
+ newTagTemplate?: string | undefined;
4575
+ digestTemplate?: string | undefined;
4576
+ }, "an image override must set at least one of newNameTemplate, newTagTemplate, or digestTemplate.">, v.CheckAction<{
4577
+ name: string;
4578
+ newNameTemplate?: string | undefined;
4579
+ newTagTemplate?: string | undefined;
4580
+ digestTemplate?: string | undefined;
4581
+ }, "newTagTemplate and digestTemplate are mutually exclusive on an image override.">]>, undefined>, undefined>;
4582
+ /** Helm releases to install — workspace-shared singletons merged with the service's per-env ones. */
4583
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4584
+ /** Release name. */
4585
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4586
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
4587
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4588
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
4589
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4590
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
4591
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
4592
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
4593
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
4594
+ /** Inline `--values` overrides. */
4595
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
4596
+ /** Templated `--set` overrides. */
4597
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4598
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
4599
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4600
+ /** The value, templated over the provision vars. */
4601
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
4602
+ }, undefined>, undefined>, undefined>;
4603
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
4604
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
4605
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4606
+ readonly secretRef: v.ObjectSchema<{
4607
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4608
+ }, undefined>;
4609
+ }, undefined>, undefined>, undefined>;
4610
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
4611
+ }, undefined>, undefined>, undefined>;
4612
+ /** Secrets fed in before apply (a `Secret` resource or a `secretGenerator` `.env`). */
4613
+ readonly secretInjections: v.OptionalSchema<v.ArraySchema<v.VariantSchema<"mode", [v.ObjectSchema<{
4614
+ readonly mode: v.LiteralSchema<"secret", undefined>;
4615
+ /** Target Secret name in the namespace. */
4616
+ readonly secretName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
4617
+ /** Secret `type`; absent ⇒ `Opaque`. */
4618
+ readonly secretType: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
4619
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4620
+ /** Key inside the rendered Secret / `.env`. */
4621
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
4622
+ /** Resolve the value from the workspace encrypted bundle by key. */
4623
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
4624
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4625
+ }, undefined>, undefined>;
4626
+ /** OR a non-secret value, templated over the provision vars. */
4627
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4628
+ }, undefined>, v.CheckAction<{
4629
+ key: string;
4630
+ secretRef?: {
4631
+ key: string;
4632
+ } | undefined;
4633
+ valueTemplate?: string | undefined;
4634
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
4635
+ }, undefined>, v.ObjectSchema<{
4636
+ readonly mode: v.LiteralSchema<"generatorEnvFile", undefined>;
4637
+ /**
4638
+ * Repo-relative path within the overlay tree to write the `KEY=value` env file the
4639
+ * overlay's `secretGenerator` reads (e.g. `overlays/<env>/<component>/.env`). The
4640
+ * overlay names the Secret.
4641
+ */
4642
+ readonly envFilePath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
4643
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
4644
+ /** Key inside the rendered Secret / `.env`. */
4645
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
4646
+ /** Resolve the value from the workspace encrypted bundle by key. */
4647
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
4648
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
4649
+ }, undefined>, undefined>;
4650
+ /** OR a non-secret value, templated over the provision vars. */
4651
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
4652
+ }, undefined>, v.CheckAction<{
4653
+ key: string;
4654
+ secretRef?: {
4655
+ key: string;
4656
+ } | undefined;
4657
+ valueTemplate?: string | undefined;
4658
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
4659
+ }, undefined>], undefined>, undefined>, undefined>;
2236
4660
  }, undefined>;
2237
4661
  }, undefined>, v.ObjectSchema<{
2238
4662
  readonly kind: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>, v.RegexAction<string, "must be a lower-kebab slug">, v.CheckAction<string, "reserved backend kind">]>;
@@ -2578,10 +5002,115 @@ export declare const testEnvironmentConnectionSchema: v.ObjectSchema<{
2578
5002
  readonly imageTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
2579
5003
  /** Fallback TTL (ms) after which the env is swept + torn down. */
2580
5004
  readonly defaultTtlMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 60000, undefined>]>, undefined>;
5005
+ /**
5006
+ * How long (seconds) the container deploy adapter waits for each Deployment to roll out
5007
+ * before reporting the env still `provisioning` (the backend keeps polling). Only the
5008
+ * container-backed render path honors it; absent ⇒ the harness default (180s).
5009
+ */
5010
+ readonly rolloutTimeoutSeconds: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
2581
5011
  /** Extra labels stamped on the namespace + every applied resource. */
2582
5012
  readonly labels: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
2583
5013
  /** Extra annotations stamped on the namespace. */
2584
5014
  readonly annotations: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
5015
+ /** Structured image overrides (the kustomize `images:` shape), templated over provision vars. */
5016
+ readonly images: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
5017
+ /** The image to match (the `name:` in a kustomization `images:` entry), e.g. `registry/app`. */
5018
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5019
+ /** Optional replacement repo, templated; absent ⇒ keep the original repo. */
5020
+ readonly newNameTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
5021
+ /** Replacement tag, templated (e.g. `{{branch}}` / `{{sha}}`); mutually exclusive with digest. */
5022
+ readonly newTagTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
5023
+ /** Replacement digest, templated; alternative to a tag. */
5024
+ readonly digestTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
5025
+ }, undefined>, v.CheckAction<{
5026
+ name: string;
5027
+ newNameTemplate?: string | undefined;
5028
+ newTagTemplate?: string | undefined;
5029
+ digestTemplate?: string | undefined;
5030
+ }, "an image override must set at least one of newNameTemplate, newTagTemplate, or digestTemplate.">, v.CheckAction<{
5031
+ name: string;
5032
+ newNameTemplate?: string | undefined;
5033
+ newTagTemplate?: string | undefined;
5034
+ digestTemplate?: string | undefined;
5035
+ }, "newTagTemplate and digestTemplate are mutually exclusive on an image override.">]>, undefined>, undefined>;
5036
+ /** Helm releases to install — workspace-shared singletons merged with the service's per-env ones. */
5037
+ readonly helmReleases: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
5038
+ /** Release name. */
5039
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5040
+ /** Chart ref: an OCI ref (`oci://…`) or, with `repo`, a `repo/chart` name. */
5041
+ readonly chart: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5042
+ /** Chart repo URL; absent ⇒ `chart` is an OCI ref. */
5043
+ readonly repo: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
5044
+ /** PINNED chart version, e.g. `1.2.3` / `v1.2.3` (floating tags like `latest`/`^1.0` rejected). */
5045
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "version must be a pinned semver (e.g. 1.2.3), not a floating tag like latest or ^1.0.">]>;
5046
+ /** Namespace to install into, templated; absent ⇒ the environment namespace. */
5047
+ readonly namespaceTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
5048
+ /** Inline `--values` overrides. */
5049
+ readonly values: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
5050
+ /** Templated `--set` overrides. */
5051
+ readonly set: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
5052
+ /** Dotted `--set` path, e.g. `config.rateLimit.enabled`. */
5053
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5054
+ /** The value, templated over the provision vars. */
5055
+ readonly valueTemplate: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 2000, undefined>]>;
5056
+ }, undefined>, undefined>, undefined>;
5057
+ /** Secret-bundle-backed values folded in at provision time (`--set <path>=<secret>`). */
5058
+ readonly valuesSecretRefs: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
5059
+ readonly path: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5060
+ readonly secretRef: v.ObjectSchema<{
5061
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
5062
+ }, undefined>;
5063
+ }, undefined>, undefined>, undefined>;
5064
+ readonly scope: v.OptionalSchema<v.PicklistSchema<["per-environment", "shared"], undefined>, undefined>;
5065
+ }, undefined>, undefined>, undefined>;
5066
+ /** Secrets fed in before apply (a `Secret` resource or a `secretGenerator` `.env`). */
5067
+ readonly secretInjections: v.OptionalSchema<v.ArraySchema<v.VariantSchema<"mode", [v.ObjectSchema<{
5068
+ readonly mode: v.LiteralSchema<"secret", undefined>;
5069
+ /** Target Secret name in the namespace. */
5070
+ readonly secretName: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5071
+ /** Secret `type`; absent ⇒ `Opaque`. */
5072
+ readonly secretType: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
5073
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
5074
+ /** Key inside the rendered Secret / `.env`. */
5075
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
5076
+ /** Resolve the value from the workspace encrypted bundle by key. */
5077
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
5078
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
5079
+ }, undefined>, undefined>;
5080
+ /** OR a non-secret value, templated over the provision vars. */
5081
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
5082
+ }, undefined>, v.CheckAction<{
5083
+ key: string;
5084
+ secretRef?: {
5085
+ key: string;
5086
+ } | undefined;
5087
+ valueTemplate?: string | undefined;
5088
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
5089
+ }, undefined>, v.ObjectSchema<{
5090
+ readonly mode: v.LiteralSchema<"generatorEnvFile", undefined>;
5091
+ /**
5092
+ * Repo-relative path within the overlay tree to write the `KEY=value` env file the
5093
+ * overlay's `secretGenerator` reads (e.g. `overlays/<env>/<component>/.env`). The
5094
+ * overlay names the Secret.
5095
+ */
5096
+ readonly envFilePath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
5097
+ readonly entries: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
5098
+ /** Key inside the rendered Secret / `.env`. */
5099
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 256, undefined>]>;
5100
+ /** Resolve the value from the workspace encrypted bundle by key. */
5101
+ readonly secretRef: v.OptionalSchema<v.ObjectSchema<{
5102
+ readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
5103
+ }, undefined>, undefined>;
5104
+ /** OR a non-secret value, templated over the provision vars. */
5105
+ readonly valueTemplate: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>, undefined>;
5106
+ }, undefined>, v.CheckAction<{
5107
+ key: string;
5108
+ secretRef?: {
5109
+ key: string;
5110
+ } | undefined;
5111
+ valueTemplate?: string | undefined;
5112
+ }, "a secret entry must set exactly one of secretRef or valueTemplate.">]>, undefined>;
5113
+ }, undefined>], undefined>, undefined>, undefined>;
2585
5114
  }, undefined>;
2586
5115
  }, undefined>, v.ObjectSchema<{
2587
5116
  readonly kind: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>, v.RegexAction<string, "must be a lower-kebab slug">, v.CheckAction<string, "reserved backend kind">]>;