@sealant/sdk-next 0.40.0-next.759 → 0.40.0-next.760
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`)
|
|
363
|
-
`owner-map-unsupported` before anything starts
|
|
364
|
-
|
|
365
|
-
|
|
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
|
|
246
|
-
*
|
|
247
|
-
* report `restore.owner_map
|
|
248
|
-
*
|
|
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.
|
|
3
|
+
"version": "0.40.0-next.760",
|
|
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.
|
|
29
|
+
"@sealant/api-contracts": "npm:@sealant/api-contracts-next@0.40.0-next.760"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"effect": "^4.0.5"
|
|
33
33
|
},
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "eb43ab8076dbdd584f026d068c478078a294d570",
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
37
37
|
}
|