@sealant/sdk-next 0.40.0-next.759 → 0.40.0-next.761

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -359,10 +359,13 @@ const workspace = await sealant.workspaces.create({
359
359
  are one directory name (letters, digits, `.`, `_`, `-`, at most 128, not starting with `.` or
360
360
  `-`), no id and no uid twice, at most 256 people.
361
361
  - Launched only on an image whose probe reports `restore.owner_map` from its sealantd
362
- (`personLayout`); on any other image, or one with no probe, the launch fails with
363
- `owner-map-unsupported` before anything starts. Refused at create on Cloudflare, and on
364
- Kubernetes, whose Pods run with `allowPrivilegeEscalation: false`, so no person's `sudo` could
365
- work there.
362
+ (`personLayout`). On an image whose sealantd does not report it, the launch fails with
363
+ `owner-map-unsupported` before anything starts; on one with no probe, or a probe Core cannot read,
364
+ it fails with `owner-map-unverified`. Refused at create on Cloudflare. On Kubernetes it runs under
365
+ runc: a per-person Pod may escalate, so each person's `sudo` works, and the cluster's image
366
+ builder reads the probe back from the pushed image. Under gVisor (`ociRuntime: "runsc"`) it is
367
+ refused. `features().kubernetesPersonLayout` says whether the control plane takes it on
368
+ Kubernetes.
366
369
  - The map is the executor's for its life: the daemon reads it at boot. A standby's claim
367
370
  (`capture.replan()`) and a recovery restore under the map it booted with. Pass
368
371
  `capture.replan({ expectedOwnerMap })` (or `null` for none) to have the claim refused
@@ -985,6 +985,7 @@ declare const buildControlPlaneClient: (config: SealantInternalConfig) => Effect
985
985
  readonly personBinding: import("effect/Schema").optional<import("effect/Schema").Boolean>;
986
986
  readonly sshKeyRemovalEndsConnections: import("effect/Schema").optional<import("effect/Schema").Boolean>;
987
987
  readonly connectedAccountDefaults: import("effect/Schema").optional<import("effect/Schema").Boolean>;
988
+ readonly kubernetesPersonLayout: import("effect/Schema").optional<import("effect/Schema").Boolean>;
988
989
  }>>;
989
990
  }>>, never, import("@sealant/api-contracts").RequestRefusal, never>, never, never>;
990
991
  readonly getSetupState: HttpApiClient.Client.Method<import("effect/http-api/HttpApiEndpoint").HttpApiEndpoint<"getSetupState", "GET", "/v1/system/setup-state", never, never, never, never, import("effect/Schema").toCodecJson<import("effect/Schema").Struct<{
@@ -2803,6 +2804,7 @@ declare const SealantApiClient_base: Context.ServiceClass<SealantApiClient, "@se
2803
2804
  readonly personBinding: import("effect/Schema").optional<import("effect/Schema").Boolean>;
2804
2805
  readonly sshKeyRemovalEndsConnections: import("effect/Schema").optional<import("effect/Schema").Boolean>;
2805
2806
  readonly connectedAccountDefaults: import("effect/Schema").optional<import("effect/Schema").Boolean>;
2807
+ readonly kubernetesPersonLayout: import("effect/Schema").optional<import("effect/Schema").Boolean>;
2806
2808
  }>>;
2807
2809
  }>>, never, import("@sealant/api-contracts").RequestRefusal, never>, never, never>;
2808
2810
  readonly getSetupState: HttpApiClient.Client.Method<import("effect/http-api/HttpApiEndpoint").HttpApiEndpoint<"getSetupState", "GET", "/v1/system/setup-state", never, never, never, never, import("effect/Schema").toCodecJson<import("effect/Schema").Struct<{
@@ -1280,6 +1280,7 @@ export declare const getIndexOp: () => Effect.Effect<{
1280
1280
  readonly personBinding?: boolean | undefined;
1281
1281
  readonly sshKeyRemovalEndsConnections?: boolean | undefined;
1282
1282
  readonly connectedAccountDefaults?: boolean | undefined;
1283
+ readonly kubernetesPersonLayout?: boolean | undefined;
1283
1284
  } | undefined;
1284
1285
  }, import("effect/http/HttpClientError").HttpClientError | import("@sealant/api-contracts").RequestRefusedError | import("effect/Schema").SchemaError, SealantApiClient>;
1285
1286
  export declare const getSetupStateOp: () => Effect.Effect<{
@@ -17,6 +17,7 @@ export declare const toFeatures: (index: {
17
17
  readonly personBinding?: boolean | undefined;
18
18
  readonly sshKeyRemovalEndsConnections?: boolean | undefined;
19
19
  readonly connectedAccountDefaults?: boolean | undefined;
20
+ readonly kubernetesPersonLayout?: boolean | undefined;
20
21
  } | undefined;
21
22
  }) => SealantFeatures;
22
23
  /**
@@ -21,6 +21,7 @@ export const toFeatures = (index) => {
21
21
  personBinding: features?.personBinding === true,
22
22
  sshKeyRemovalEndsConnections: features?.sshKeyRemovalEndsConnections === true,
23
23
  connectedAccountDefaults: features?.connectedAccountDefaults === true,
24
+ kubernetesPersonLayout: features?.kubernetesPersonLayout === true,
24
25
  };
25
26
  };
26
27
  /**
package/dist/types.d.ts CHANGED
@@ -242,10 +242,11 @@ export interface WorkspaceCaptureSource {
242
242
  * leaves no-new-privileges unset so every person's `sudo` works. Fixed for the executor's life:
243
243
  * the daemon reads it at boot, so a standby's claim (`capture.replan()`) and a recovery restore
244
244
  * under the map it booted with (`replan({ expectedOwnerMap })` refuses a mismatch). Refused on
245
- * Cloudflare and Kubernetes (no person's `sudo` works under `allowPrivilegeEscalation: false`),
246
- * and at launch (`owner-map-unsupported`, nothing started) on an image whose probe does not
247
- * report `restore.owner_map`. The workspace creator's choice of privilege; only this field sets
248
- * it.
245
+ * Cloudflare, and on Kubernetes under gVisor (`ociRuntime: "runsc"`); under runc a per-person Pod
246
+ * may escalate, so each person's `sudo` works. Refused at launch, with nothing started, on an
247
+ * image whose sealantd does not report `restore.owner_map` (`owner-map-unsupported`) and on one
248
+ * with no probe Core can read (`owner-map-unverified`). The workspace creator's choice of
249
+ * privilege; only this field sets it.
249
250
  */
250
251
  readonly ownerMap?: WorkspaceCaptureOwnerMap;
251
252
  }
@@ -1404,6 +1405,12 @@ export interface SealantFeatures {
1404
1405
  * `default`.
1405
1406
  */
1406
1407
  readonly connectedAccountDefaults: boolean;
1408
+ /**
1409
+ * `ownerMap` is taken on Kubernetes (runc): each person's `sudo` works in the Pod, and images the
1410
+ * cluster builds record the probe a per-person launch checks. From an older control plane a
1411
+ * create with `ownerMap` on Kubernetes is refused.
1412
+ */
1413
+ readonly kubernetesPersonLayout: boolean;
1407
1414
  }
1408
1415
  /** A published workspace image. */
1409
1416
  export interface WorkspaceImage {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealant/sdk-next",
3
- "version": "0.40.0-next.759",
3
+ "version": "0.40.0-next.761",
4
4
  "description": "The fluent public SDK for Sealant — create a workspace, run a harness, replay the record.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -26,12 +26,12 @@
26
26
  "node": ">=20"
27
27
  },
28
28
  "dependencies": {
29
- "@sealant/api-contracts": "npm:@sealant/api-contracts-next@0.40.0-next.759"
29
+ "@sealant/api-contracts": "npm:@sealant/api-contracts-next@0.40.0-next.761"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "effect": "^4.0.5"
33
33
  },
34
- "gitHead": "2e8d2c658ec3dda4ba925f6734a7fdda3919ca7d",
34
+ "gitHead": "3c4e8a0fe207247b1940197389924f330769ffb8",
35
35
  "publishConfig": {
36
36
  "access": "public"
37
37
  }