@toshicloud/sdk 0.4.0 → 0.5.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.
Files changed (38) hide show
  1. package/README.md +44 -3
  2. package/dist/client.d.ts +7 -2
  3. package/dist/client.js +9 -3
  4. package/dist/errors.d.ts +47 -0
  5. package/dist/errors.js +136 -0
  6. package/dist/gen/toshi/permission_pb.d.ts +39 -0
  7. package/dist/gen/toshi/permission_pb.js +42 -0
  8. package/dist/gen/toshi/workspace/v1/artifacts_pb.d.ts +1 -1
  9. package/dist/gen/toshi/workspace/v1/artifacts_pb.js +3 -2
  10. package/dist/gen/toshi/workspace/v1/audit_events_pb.js +2 -1
  11. package/dist/gen/toshi/workspace/v1/channels_pb.js +2 -1
  12. package/dist/gen/toshi/workspace/v1/discovery_pb.d.ts +676 -0
  13. package/dist/gen/toshi/workspace/v1/discovery_pb.js +182 -0
  14. package/dist/gen/toshi/workspace/v1/display_pb.js +2 -1
  15. package/dist/gen/toshi/workspace/v1/fillers_pb.js +2 -1
  16. package/dist/gen/toshi/workspace/v1/hostjobs_pb.js +2 -1
  17. package/dist/gen/toshi/workspace/v1/hosts_pb.js +2 -1
  18. package/dist/gen/toshi/workspace/v1/products_pb.d.ts +703 -0
  19. package/dist/gen/toshi/workspace/v1/products_pb.js +106 -0
  20. package/dist/gen/toshi/workspace/v1/projects_pb.js +2 -1
  21. package/dist/gen/toshi/workspace/v1/recordings_pb.js +2 -1
  22. package/dist/gen/toshi/workspace/v1/secrets_pb.js +2 -1
  23. package/dist/gen/toshi/workspace/v1/storage_providers_pb.js +2 -1
  24. package/dist/gen/toshi/workspace/v1/tokens_pb.js +2 -1
  25. package/dist/gen/toshi/workspace/v1/volumes_pb.js +2 -1
  26. package/dist/gen/toshi/workspace/v1/webhook_pb.js +2 -1
  27. package/dist/gen/toshi/workspace/v1/workloads_pb.js +2 -1
  28. package/dist/gen/toshi/workspace/v1/workspace_pb.d.ts +2 -2
  29. package/dist/gen/toshi/workspace/v1/workspace_pb.js +1 -1
  30. package/dist/gen/toshi/workspace/v1/workspace_service_pb.js +2 -1
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.js +3 -1
  33. package/dist/interceptors.d.ts +6 -0
  34. package/dist/interceptors.js +29 -0
  35. package/dist/retry.js +4 -0
  36. package/dist/version.d.ts +1 -1
  37. package/dist/version.js +1 -1
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -135,8 +135,8 @@ picked up without a new client.
135
135
  The client has one field per Workspace API service: `project`, `secret`,
136
136
  `webhook`, `display`, `channel`, `recording`, `volume`, `artifact`,
137
137
  `artifactUpload`, `workspace`, `hostJob`, `host`, `token`, `auditEvent`,
138
- `filler` and `storageProvider`, each holding that service's generated
139
- client.
138
+ `filler`, `storageProvider`, `product` and `discovery`, each holding that
139
+ service's generated client.
140
140
  `workload` holds `WorkloadService`'s calls, grouped by the type they
141
141
  name: `workload.jobs`, `workload.sandboxes` and `workload.services`, one
142
142
  method for each call (`create`, `get`, `list`, `update`, `delete`,
@@ -305,6 +305,46 @@ await run.wait(); // rejects with JobExitError on a non-zero exit
305
305
  Stopping the loop stops only the output stream: the job keeps running,
306
306
  and `workload.jobs.cancel` ends it.
307
307
 
308
+ ## Products that are off
309
+
310
+ A call for a product that is off for the workspace, or that turns on an
311
+ outside product without accepting the access it asks for, rejects with a
312
+ `ProductError`, `wait`, the watches and `execute` included.
313
+ `isProductError(err)` tells it apart. It is still a `ConnectError` with the
314
+ same `code`, and it has the product's ID (`product`), the `reason`
315
+ (`ProductReason.NotInstalled`, `Disabled`, `NotEntitled`, `TurnedOff` or
316
+ `AccessNotAccepted`), the setting that turns the product on (`feature`,
317
+ such as `runners.enabled`), how far a product the deployment disables has
318
+ wound down (`state`) and, for `AccessNotAccepted`, the access to accept
319
+ (`access`).
320
+
321
+ <!-- examples/product-error.ts -->
322
+
323
+ ```ts
324
+
325
+ // Turning an outside product on installs it, and the API asks the caller to
326
+ // accept the access it wants first.
327
+ const enable = { id: "acme_ci", enabled: true, acceptedAccess: [] as string[] };
328
+ try {
329
+ try {
330
+ await toshi.product.updateProduct(enable);
331
+ } catch (err) {
332
+ if (!isProductError(err) || err.reason !== ProductReason.AccessNotAccepted) {
333
+ throw err;
334
+ }
335
+ console.log(err.product, err.reason, err.access);
336
+ // Accept exactly the access the product asks for.
337
+ await toshi.product.updateProduct({ ...enable, acceptedAccess: err.access });
338
+ }
339
+ } catch (err) {
340
+ if (!isProductError(err)) {
341
+ throw err;
342
+ }
343
+ // Off for the workspace: say which product and why.
344
+ console.log(err.product, err.reason, err.feature);
345
+ }
346
+ ```
347
+
308
348
  ## Testing with `@toshicloud/sdk/test`
309
349
 
310
350
  `createFake()` serves the whole Workspace API in memory: no server, no port,
@@ -340,7 +380,8 @@ first, with the procedure, the request and the headers.
340
380
  [`protoc-gen-es`](https://github.com/bufbuild/protobuf-es) from the protos
341
381
  in `proto/toshi/workspace/v1` of the
342
382
  [toshi-api](https://github.com/toshicloud/toshi-api) repository, one
343
- `*_pb.ts` file per proto. The generated code is committed and imports
383
+ `*_pb.ts` file per proto, and `src/gen/toshi/permission_pb.ts` from
384
+ `proto/toshi/permission.proto`, which they import. The generated code is committed and imports
344
385
  only `@bufbuild/protobuf`, so installing the package needs no generator.
345
386
 
346
387
  `pin.env` names the toshi-api commit (or, once one exists, the release
package/dist/client.d.ts CHANGED
@@ -3,10 +3,12 @@ import type { Client, Interceptor, Transport } from "@connectrpc/connect";
3
3
  import { ArtifactService, ArtifactUploadService } from "./gen/toshi/workspace/v1/artifacts_pb.js";
4
4
  import { AuditEventService } from "./gen/toshi/workspace/v1/audit_events_pb.js";
5
5
  import { ChannelService } from "./gen/toshi/workspace/v1/channels_pb.js";
6
+ import { DiscoveryService } from "./gen/toshi/workspace/v1/discovery_pb.js";
6
7
  import { DisplayService } from "./gen/toshi/workspace/v1/display_pb.js";
7
8
  import { FillerService } from "./gen/toshi/workspace/v1/fillers_pb.js";
8
9
  import { HostJobService } from "./gen/toshi/workspace/v1/hostjobs_pb.js";
9
10
  import { HostService } from "./gen/toshi/workspace/v1/hosts_pb.js";
11
+ import { ProductService } from "./gen/toshi/workspace/v1/products_pb.js";
10
12
  import { ProjectService } from "./gen/toshi/workspace/v1/projects_pb.js";
11
13
  import { RecordingService } from "./gen/toshi/workspace/v1/recordings_pb.js";
12
14
  import { SecretService } from "./gen/toshi/workspace/v1/secrets_pb.js";
@@ -64,6 +66,8 @@ export interface ToshiClient {
64
66
  readonly auditEvent: Client<typeof AuditEventService>;
65
67
  readonly filler: Client<typeof FillerService>;
66
68
  readonly storageProvider: Client<typeof StorageProviderService>;
69
+ readonly product: Client<typeof ProductService>;
70
+ readonly discovery: Client<typeof DiscoveryService>;
67
71
  run(req: MessageInitShape<typeof CreateJobRequestSchema>, opts?: CallOptions): Promise<JobRun>;
68
72
  }
69
73
  /** WorkloadService's calls, grouped by the type they name. */
@@ -181,8 +185,9 @@ export interface JobRun extends AsyncIterable<OutputChunk> {
181
185
  wait(): Promise<void>;
182
186
  }
183
187
  /**
184
- * Creates the client: one normalized retry setting, the scope, key, retry and
185
- * auth interceptors (scope outermost, auth innermost, so no interceptor sees
188
+ * Creates the client: one normalized retry setting, the product, scope, key,
189
+ * retry and auth interceptors (product outermost, so a product's refusal
190
+ * reaches the caller as a ProductError; auth innermost, so no interceptor sees
186
191
  * the Authorization header), one transport for every client and helper.
187
192
  *
188
193
  * Since 0.2.0 the workload calls are grouped by the type they name under
package/dist/client.js CHANGED
@@ -4,10 +4,12 @@ import { executeCommand } from "./execute.js";
4
4
  import { ArtifactService, ArtifactUploadService } from "./gen/toshi/workspace/v1/artifacts_pb.js";
5
5
  import { AuditEventService } from "./gen/toshi/workspace/v1/audit_events_pb.js";
6
6
  import { ChannelService } from "./gen/toshi/workspace/v1/channels_pb.js";
7
+ import { DiscoveryService } from "./gen/toshi/workspace/v1/discovery_pb.js";
7
8
  import { DisplayService } from "./gen/toshi/workspace/v1/display_pb.js";
8
9
  import { FillerService } from "./gen/toshi/workspace/v1/fillers_pb.js";
9
10
  import { HostJobService } from "./gen/toshi/workspace/v1/hostjobs_pb.js";
10
11
  import { HostService } from "./gen/toshi/workspace/v1/hosts_pb.js";
12
+ import { ProductService } from "./gen/toshi/workspace/v1/products_pb.js";
11
13
  import { ProjectService } from "./gen/toshi/workspace/v1/projects_pb.js";
12
14
  import { RecordingService } from "./gen/toshi/workspace/v1/recordings_pb.js";
13
15
  import { SecretService } from "./gen/toshi/workspace/v1/secrets_pb.js";
@@ -20,15 +22,16 @@ import { CancelJobRequestSchema, CreateJobRequestSchema, CreateSandboxRequestSch
20
22
  import { ExecuteStartSchema, GetOperationRequestSchema, HoldServiceRequestSchema, ListEventsRequestSchema, ListServiceRunsRequestSchema, ReleaseServiceRequestSchema, SetServiceModeRequestSchema, StartServiceRequestSchema, StopServiceRequestSchema, WaitOperationRequestSchema, WakeServiceRequestSchema, WatchEventsRequestSchema, WatchOutputRequestSchema, } from "./gen/toshi/workspace/v1/workspace_pb.js";
21
23
  import { openOutputWatch } from "./output.js";
22
24
  import { paginate } from "./paginate.js";
23
- import { authInterceptor, keyInterceptor, retryInterceptor, scopeInterceptor } from "./interceptors.js";
25
+ import { authInterceptor, keyInterceptor, productInterceptor, retryInterceptor, scopeInterceptor, } from "./interceptors.js";
24
26
  import { normalizeRetry } from "./retry.js";
25
27
  import { withDefaultUnaryTimeout } from "./timeout.js";
26
28
  import { openEventWatch, openJobWatch, openSandboxWatch, openServiceWatch } from "./watch.js";
27
29
  import { runJob } from "./run.js";
28
30
  import { waitJob, waitOperation, waitSandbox, waitService } from "./wait.js";
29
31
  /**
30
- * Creates the client: one normalized retry setting, the scope, key, retry and
31
- * auth interceptors (scope outermost, auth innermost, so no interceptor sees
32
+ * Creates the client: one normalized retry setting, the product, scope, key,
33
+ * retry and auth interceptors (product outermost, so a product's refusal
34
+ * reaches the caller as a ProductError; auth innermost, so no interceptor sees
32
35
  * the Authorization header), one transport for every client and helper.
33
36
  *
34
37
  * Since 0.2.0 the workload calls are grouped by the type they name under
@@ -38,6 +41,7 @@ import { waitJob, waitOperation, waitSandbox, waitService } from "./wait.js";
38
41
  export function createToshiClient(options) {
39
42
  const retry = normalizeRetry(options.retry);
40
43
  const interceptors = [
44
+ productInterceptor(),
41
45
  scopeInterceptor(options.project ?? "", options.environment ?? ""),
42
46
  keyInterceptor(),
43
47
  retryInterceptor(retry),
@@ -111,5 +115,7 @@ export function createToshiClient(options) {
111
115
  auditEvent: createClient(AuditEventService, transport),
112
116
  filler: createClient(FillerService, transport),
113
117
  storageProvider: createClient(StorageProviderService, transport),
118
+ product: createClient(ProductService, transport),
119
+ discovery: createClient(DiscoveryService, transport),
114
120
  };
115
121
  }
package/dist/errors.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { ConnectError } from "@connectrpc/connect";
1
2
  import type { ExecutionExit, OutputEnd } from "./gen/toshi/workspace/v1/workspace_pb.js";
2
3
  /** A command that ended non-zero, or was cancelled before it had a status (errors.go:9-26). */
3
4
  export declare class ExitError extends Error {
@@ -26,3 +27,49 @@ export declare class StreamLostError extends Error {
26
27
  readonly requestKey: string;
27
28
  constructor(executionId: string, requestKey: string, cause?: unknown);
28
29
  }
30
+ /** Why the API refused a call for a product: the reason of the refusal's ErrorInfo detail. */
31
+ export type ProductReason = "PRODUCT_NOT_INSTALLED" | "PRODUCT_DISABLED" | "PRODUCT_NOT_ENTITLED" | "PRODUCT_TURNED_OFF" | "ACCESS_NOT_ACCEPTED";
32
+ /** The reasons a call is refused for a product. */
33
+ export declare const ProductReason: {
34
+ /** The deployment's build does not include the product; the code is Unimplemented. */
35
+ readonly NotInstalled: "PRODUCT_NOT_INSTALLED";
36
+ /** The deployment turned the product off; the code is FailedPrecondition. */
37
+ readonly Disabled: "PRODUCT_DISABLED";
38
+ /** The workspace's entitlements leave the product out; the code is PermissionDenied. */
39
+ readonly NotEntitled: "PRODUCT_NOT_ENTITLED";
40
+ /**
41
+ * The workspace's settings turn the product off, or an outside product's
42
+ * installation is turned off; the code is FailedPrecondition.
43
+ */
44
+ readonly TurnedOff: "PRODUCT_TURNED_OFF";
45
+ /**
46
+ * Turning an outside product on installs it, and the call did not accept the
47
+ * access it asks for; the code is FailedPrecondition.
48
+ */
49
+ readonly AccessNotAccepted: "ACCESS_NOT_ACCEPTED";
50
+ };
51
+ /**
52
+ * The API's refusal of a call for a product: one that is off for the
53
+ * workspace, or an outside product whose access the call did not accept.
54
+ * Every call the client makes throws it in place of the ConnectError, wait,
55
+ * watch and execute included. It is a ConnectError, so `instanceof
56
+ * ConnectError` and `code` read as before; test for it with
57
+ * {@link isProductError}.
58
+ */
59
+ export declare class ProductError extends ConnectError {
60
+ /** The product's ID, such as `runners`. */
61
+ readonly product: string;
62
+ readonly reason: ProductReason;
63
+ /** The setting that turns the product on, such as `runners.enabled`; empty for ACCESS_NOT_ACCEPTED. */
64
+ readonly feature: string;
65
+ /** How far a product the deployment disables has wound down: `no_new_work`, `draining` or `stopped`; empty otherwise. */
66
+ readonly state: string;
67
+ /** The access an outside product asks for, for ACCESS_NOT_ACCEPTED: accept exactly this list to install it. */
68
+ readonly access: string[];
69
+ constructor(err: ConnectError, reason: ProductReason, metadata: ReadonlyMap<string, string>);
70
+ static [Symbol.hasInstance](v: unknown): boolean;
71
+ }
72
+ /** Reports whether err is a product's refusal. */
73
+ export declare function isProductError(err: unknown): err is ProductError;
74
+ /** err as a ProductError when it is a product's refusal, and err unchanged otherwise. */
75
+ export declare function asProductError(err: unknown): unknown;
package/dist/errors.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { BinaryReader, WireType } from "@bufbuild/protobuf/wire";
2
+ import { ConnectError } from "@connectrpc/connect";
1
3
  /** A command that ended non-zero, or was cancelled before it had a status (errors.go:9-26). */
2
4
  export class ExitError extends Error {
3
5
  /** The execution the exit belongs to. */
@@ -75,3 +77,137 @@ function describe(cause) {
75
77
  }
76
78
  return "the stream ended";
77
79
  }
80
+ /** The reasons a call is refused for a product. */
81
+ export const ProductReason = {
82
+ /** The deployment's build does not include the product; the code is Unimplemented. */
83
+ NotInstalled: "PRODUCT_NOT_INSTALLED",
84
+ /** The deployment turned the product off; the code is FailedPrecondition. */
85
+ Disabled: "PRODUCT_DISABLED",
86
+ /** The workspace's entitlements leave the product out; the code is PermissionDenied. */
87
+ NotEntitled: "PRODUCT_NOT_ENTITLED",
88
+ /**
89
+ * The workspace's settings turn the product off, or an outside product's
90
+ * installation is turned off; the code is FailedPrecondition.
91
+ */
92
+ TurnedOff: "PRODUCT_TURNED_OFF",
93
+ /**
94
+ * Turning an outside product on installs it, and the call did not accept the
95
+ * access it asks for; the code is FailedPrecondition.
96
+ */
97
+ AccessNotAccepted: "ACCESS_NOT_ACCEPTED",
98
+ };
99
+ const productReasons = new Set(Object.values(ProductReason));
100
+ // The ErrorInfo domain of a product's refusal.
101
+ const productErrorDomain = "toshi.run";
102
+ /**
103
+ * The API's refusal of a call for a product: one that is off for the
104
+ * workspace, or an outside product whose access the call did not accept.
105
+ * Every call the client makes throws it in place of the ConnectError, wait,
106
+ * watch and execute included. It is a ConnectError, so `instanceof
107
+ * ConnectError` and `code` read as before; test for it with
108
+ * {@link isProductError}.
109
+ */
110
+ export class ProductError extends ConnectError {
111
+ /** The product's ID, such as `runners`. */
112
+ product;
113
+ reason;
114
+ /** The setting that turns the product on, such as `runners.enabled`; empty for ACCESS_NOT_ACCEPTED. */
115
+ feature;
116
+ /** How far a product the deployment disables has wound down: `no_new_work`, `draining` or `stopped`; empty otherwise. */
117
+ state;
118
+ /** The access an outside product asks for, for ACCESS_NOT_ACCEPTED: accept exactly this list to install it. */
119
+ access;
120
+ constructor(err, reason, metadata) {
121
+ super(err.rawMessage, err.code, err.metadata, undefined, err);
122
+ // ConnectError's instanceof accepts a subclass only by this name.
123
+ this.name = "ConnectError";
124
+ this.details = err.details;
125
+ this.product = metadata.get("product") ?? "";
126
+ this.reason = reason;
127
+ this.feature = metadata.get("feature") ?? "";
128
+ this.state = metadata.get("state") ?? "";
129
+ const access = metadata.get("access") ?? "";
130
+ this.access = access === "" ? [] : access.split(",");
131
+ }
132
+ // ConnectError's own check would accept any ConnectError.
133
+ static [Symbol.hasInstance](v) {
134
+ return Function.prototype[Symbol.hasInstance].call(ProductError, v);
135
+ }
136
+ }
137
+ /** Reports whether err is a product's refusal. */
138
+ export function isProductError(err) {
139
+ return err instanceof ProductError;
140
+ }
141
+ /** err as a ProductError when it is a product's refusal, and err unchanged otherwise. */
142
+ export function asProductError(err) {
143
+ if (!(err instanceof ConnectError) || err instanceof ProductError) {
144
+ return err;
145
+ }
146
+ for (const detail of err.details) {
147
+ if (!("type" in detail) || detail.type !== "google.rpc.ErrorInfo") {
148
+ continue;
149
+ }
150
+ const info = decodeErrorInfo(detail.value);
151
+ if (info === undefined || info.domain !== productErrorDomain || !productReasons.has(info.reason)) {
152
+ continue;
153
+ }
154
+ return new ProductError(err, info.reason, info.metadata);
155
+ }
156
+ return err;
157
+ }
158
+ /**
159
+ * Reads a google.rpc.ErrorInfo message: reason (1), domain (2) and metadata
160
+ * (3), a map of strings. It reads the wire format itself, so the SDK needs no
161
+ * package for the googleapis types.
162
+ */
163
+ function decodeErrorInfo(bytes) {
164
+ const info = { reason: "", domain: "", metadata: new Map() };
165
+ try {
166
+ const reader = new BinaryReader(bytes);
167
+ while (reader.pos < reader.len) {
168
+ const [field, wireType] = reader.tag();
169
+ if (wireType !== WireType.LengthDelimited) {
170
+ reader.skip(wireType);
171
+ continue;
172
+ }
173
+ switch (field) {
174
+ case 1:
175
+ info.reason = reader.string();
176
+ break;
177
+ case 2:
178
+ info.domain = reader.string();
179
+ break;
180
+ case 3: {
181
+ const [key, value] = decodeMapEntry(reader.bytes());
182
+ info.metadata.set(key, value);
183
+ break;
184
+ }
185
+ default:
186
+ reader.skip(wireType);
187
+ }
188
+ }
189
+ }
190
+ catch {
191
+ return undefined;
192
+ }
193
+ return info;
194
+ }
195
+ /** Reads one entry of a map<string, string>: key (1), value (2). */
196
+ function decodeMapEntry(bytes) {
197
+ let key = "";
198
+ let value = "";
199
+ const reader = new BinaryReader(bytes);
200
+ while (reader.pos < reader.len) {
201
+ const [field, wireType] = reader.tag();
202
+ if (wireType === WireType.LengthDelimited && field === 1) {
203
+ key = reader.string();
204
+ }
205
+ else if (wireType === WireType.LengthDelimited && field === 2) {
206
+ value = reader.string();
207
+ }
208
+ else {
209
+ reader.skip(wireType);
210
+ }
211
+ }
212
+ return [key, value];
213
+ }
@@ -0,0 +1,39 @@
1
+ import type { GenExtension, GenFile } from "@bufbuild/protobuf/codegenv2";
2
+ import type { MethodOptions } from "@bufbuild/protobuf/wkt";
3
+ /**
4
+ * Describes the file toshi/permission.proto.
5
+ */
6
+ export declare const file_toshi_permission: GenFile;
7
+ /**
8
+ * permission names what a caller needs to make the call: an area and a
9
+ * level. "<area>.read" sees what the area holds and "<area>.write" changes
10
+ * it, where the area is a product, such as "sandboxes", or a part of the
11
+ * workspace, such as "secrets". A call that needs more than its area's
12
+ * level names a permission of its own, such as "debug.connect" for the key
13
+ * into a host job's debug session.
14
+ *
15
+ * Every Workspace API method carries it, and a method without it fails the
16
+ * build: the control plane's check table and the permissions page are
17
+ * generated from it. A workspace that is suspended keeps the calls whose
18
+ * level is "read".
19
+ *
20
+ * @generated from extension: string permission = 51000;
21
+ */
22
+ export declare const permission: GenExtension<MethodOptions, string>;
23
+ /**
24
+ * scope names what a call acts in: "workspace", the default when the
25
+ * option is absent, or "project" or "environment" for a call that names a
26
+ * project or an environment of the workspace, or a resource that belongs
27
+ * to one. A token limited to a project, or to one of its environments,
28
+ * makes only the calls whose scope is "project" or "environment".
29
+ *
30
+ * A method whose request has a project or environment field (project,
31
+ * project_id, environment, environment_id) names its scope, and the build
32
+ * checks it against that field: "environment" when the request has an
33
+ * environment field, "project" when it has only a project field, or
34
+ * "workspace" when the field is not where the call acts, such as the
35
+ * project a new token is limited to.
36
+ *
37
+ * @generated from extension: string scope = 51001;
38
+ */
39
+ export declare const scope: GenExtension<MethodOptions, string>;
@@ -0,0 +1,42 @@
1
+ // @generated by protoc-gen-es v2.16.0 with parameter "target=ts,json_types=true,import_extension=js"
2
+ // @generated from file toshi/permission.proto (package toshi, syntax proto3)
3
+ /* eslint-disable */
4
+ import { extDesc, fileDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt";
6
+ /**
7
+ * Describes the file toshi/permission.proto.
8
+ */
9
+ export const file_toshi_permission = /*@__PURE__*/ fileDesc("ChZ0b3NoaS9wZXJtaXNzaW9uLnByb3RvEgV0b3NoaTpACgpwZXJtaXNzaW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYuI4DIAEoCVIKcGVybWlzc2lvbjo2CgVzY29wZRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLmOAyABKAlSBXNjb3BlQh5aHGdvLnRvc2hpY2xvdWQuaW8vYXBpL3Rvc2hpcGJiBnByb3RvMw", [file_google_protobuf_descriptor]);
10
+ /**
11
+ * permission names what a caller needs to make the call: an area and a
12
+ * level. "<area>.read" sees what the area holds and "<area>.write" changes
13
+ * it, where the area is a product, such as "sandboxes", or a part of the
14
+ * workspace, such as "secrets". A call that needs more than its area's
15
+ * level names a permission of its own, such as "debug.connect" for the key
16
+ * into a host job's debug session.
17
+ *
18
+ * Every Workspace API method carries it, and a method without it fails the
19
+ * build: the control plane's check table and the permissions page are
20
+ * generated from it. A workspace that is suspended keeps the calls whose
21
+ * level is "read".
22
+ *
23
+ * @generated from extension: string permission = 51000;
24
+ */
25
+ export const permission = /*@__PURE__*/ extDesc(file_toshi_permission, 0);
26
+ /**
27
+ * scope names what a call acts in: "workspace", the default when the
28
+ * option is absent, or "project" or "environment" for a call that names a
29
+ * project or an environment of the workspace, or a resource that belongs
30
+ * to one. A token limited to a project, or to one of its environments,
31
+ * makes only the calls whose scope is "project" or "environment".
32
+ *
33
+ * A method whose request has a project or environment field (project,
34
+ * project_id, environment, environment_id) names its scope, and the build
35
+ * checks it against that field: "environment" when the request has an
36
+ * environment field, "project" when it has only a project field, or
37
+ * "workspace" when the field is not where the call acts, such as the
38
+ * project a new token is limited to.
39
+ *
40
+ * @generated from extension: string scope = 51001;
41
+ */
42
+ export const scope = /*@__PURE__*/ extDesc(file_toshi_permission, 1);
@@ -757,7 +757,7 @@ export declare const GetArtifactDownloadURLResponseSchema: GenMessage<GetArtifac
757
757
  * it reserves an artifact, uploads each part to a presigned URL, and
758
758
  * completes the upload. The caller is the workload itself: every call
759
759
  * carries a workload identity token for the audience
760
- * "toshi:artifacts", and the tenant, project, environment, workload and
760
+ * "toshi:artifacts", and the workspace, project, environment, workload and
761
761
  * execution of the artifact are the token's claims, never the request's.
762
762
  * A token of another audience, a display token, an expired token, or one
763
763
  * that names no workload is refused with UNAUTHENTICATED. A workspace that
@@ -3,11 +3,12 @@
3
3
  /* eslint-disable */
4
4
  import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
5
5
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
6
+ import { file_toshi_permission } from "../../permission_pb.js";
6
7
  import { file_toshi_workspace_v1_recordings } from "./recordings_pb.js";
7
8
  /**
8
9
  * Describes the file toshi/workspace/v1/artifacts.proto.
9
10
  */
10
- export const file_toshi_workspace_v1_artifacts = /*@__PURE__*/ fileDesc("CiJ0b3NoaS93b3Jrc3BhY2UvdjEvYXJ0aWZhY3RzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEi9wIKCEFydGlmYWN0EgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSFgoOZW52aXJvbm1lbnRfaWQYAyABKAkSEwoLd29ya2xvYWRfaWQYBCABKAkSFAoMZXhlY3V0aW9uX2lkGAUgASgJEgwKBGtpbmQYBiABKAkSDAoEbmFtZRgHIAEoCRIUCgxjb250ZW50X3R5cGUYCCABKAkSEgoKcGFydF9jb3VudBgJIAEoAxISCgpwYXJ0X3NpemVzGAogAygDEhIKCmluZGV4X3NpemUYCyABKAMSDQoFc3RhdGUYDCABKAkSEgoKZW5jcnlwdGlvbhgNIAEoCRIuCgpjcmVhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxjb21wbGV0ZWRfYXQYDyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDXdvcmtsb2FkX2tpbmQYECABKAkizQEKBlVwbG9hZBIMCgRwYXJ0GAEgASgJEg4KBm1ldGhvZBgCIAEoCRILCgN1cmwYAyABKAkSOAoHaGVhZGVycxgEIAMoCzInLnRvc2hpLndvcmtzcGFjZS52MS5VcGxvYWQuSGVhZGVyc0VudHJ5Ei4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGi4KDEhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIqYBChRSZXNlcnZlVXBsb2FkUmVxdWVzdBIMCgRraW5kGAEgASgJEgwKBG5hbWUYAiABKAkSFAoMY29udGVudF90eXBlGAMgASgJEhIKCnBhcnRfc2l6ZXMYBCADKAMSEgoKaW5kZXhfc2l6ZRgFIAEoAxI0CglyZWNvcmRpbmcYBiABKA4yIS50b3NoaS53b3Jrc3BhY2UudjEuUmVjb3JkaW5nS2luZCLKAQoVUmVzZXJ2ZVVwbG9hZFJlc3BvbnNlEhMKC2FydGlmYWN0X2lkGAEgASgJEisKB3VwbG9hZHMYAiADKAsyGi50b3NoaS53b3Jrc3BhY2UudjEuVXBsb2FkEjMKD3VwbG9hZF9kZWFkbGluZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKZW5jcnlwdGlvbhgEIAEoCRIQCghkYXRhX2tleRgFIAEoDBIUCgxndWVzdF91cGxvYWQYBiABKAgiLAoVQ29tcGxldGVVcGxvYWRSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkgKFkNvbXBsZXRlVXBsb2FkUmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiogEKFExpc3RBcnRpZmFjdHNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSFgoOZW52aXJvbm1lbnRfaWQYAiABKAkSEwoLd29ya2xvYWRfaWQYAyABKAkSFAoMZXhlY3V0aW9uX2lkGAQgASgJEgwKBGtpbmQYBSABKAkSEQoJcGFnZV9zaXplGAYgASgFEhIKCnBhZ2VfdG9rZW4YByABKAkiYQoVTGlzdEFydGlmYWN0c1Jlc3BvbnNlEi8KCWFydGlmYWN0cxgBIAMoCzIcLnRvc2hpLndvcmtzcGFjZS52MS5BcnRpZmFjdBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiKQoSR2V0QXJ0aWZhY3RSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkUKE0dldEFydGlmYWN0UmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiVwodR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlcXVlc3QSEwoLYXJ0aWZhY3RfaWQYASABKAkSDAoEcGFydBgCIAEoCRITCgt0dGxfc2Vjb25kcxgDIAEoAyKDAQoeR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlc3BvbnNlEgsKA3VybBgBIAEoCRIuCgpleHBpcmVzX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmNyeXB0aW9uGAMgASgJEhAKCGRhdGFfa2V5GAQgASgMMuYBChVBcnRpZmFjdFVwbG9hZFNlcnZpY2USZAoNUmVzZXJ2ZVVwbG9hZBIoLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVzcG9uc2USZwoOQ29tcGxldGVVcGxvYWQSKS50b3NoaS53b3Jrc3BhY2UudjEuQ29tcGxldGVVcGxvYWRSZXF1ZXN0GioudG9zaGkud29ya3NwYWNlLnYxLkNvbXBsZXRlVXBsb2FkUmVzcG9uc2Uy2AIKD0FydGlmYWN0U2VydmljZRJkCg1MaXN0QXJ0aWZhY3RzEigudG9zaGkud29ya3NwYWNlLnYxLkxpc3RBcnRpZmFjdHNSZXF1ZXN0GikudG9zaGkud29ya3NwYWNlLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZRJeCgtHZXRBcnRpZmFjdBImLnRvc2hpLndvcmtzcGFjZS52MS5HZXRBcnRpZmFjdFJlcXVlc3QaJy50b3NoaS53b3Jrc3BhY2UudjEuR2V0QXJ0aWZhY3RSZXNwb25zZRJ/ChZHZXRBcnRpZmFjdERvd25sb2FkVVJMEjEudG9zaGkud29ya3NwYWNlLnYxLkdldEFydGlmYWN0RG93bmxvYWRVUkxSZXF1ZXN0GjIudG9zaGkud29ya3NwYWNlLnYxLkdldEFydGlmYWN0RG93bmxvYWRVUkxSZXNwb25zZUItWitnaXRodWIuY29tL3Rvc2hpY2xvdWQvdG9zaGktYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_timestamp, file_toshi_workspace_v1_recordings]);
11
+ export const file_toshi_workspace_v1_artifacts = /*@__PURE__*/ fileDesc("CiJ0b3NoaS93b3Jrc3BhY2UvdjEvYXJ0aWZhY3RzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEi9wIKCEFydGlmYWN0EgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSFgoOZW52aXJvbm1lbnRfaWQYAyABKAkSEwoLd29ya2xvYWRfaWQYBCABKAkSFAoMZXhlY3V0aW9uX2lkGAUgASgJEgwKBGtpbmQYBiABKAkSDAoEbmFtZRgHIAEoCRIUCgxjb250ZW50X3R5cGUYCCABKAkSEgoKcGFydF9jb3VudBgJIAEoAxISCgpwYXJ0X3NpemVzGAogAygDEhIKCmluZGV4X3NpemUYCyABKAMSDQoFc3RhdGUYDCABKAkSEgoKZW5jcnlwdGlvbhgNIAEoCRIuCgpjcmVhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxjb21wbGV0ZWRfYXQYDyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDXdvcmtsb2FkX2tpbmQYECABKAkizQEKBlVwbG9hZBIMCgRwYXJ0GAEgASgJEg4KBm1ldGhvZBgCIAEoCRILCgN1cmwYAyABKAkSOAoHaGVhZGVycxgEIAMoCzInLnRvc2hpLndvcmtzcGFjZS52MS5VcGxvYWQuSGVhZGVyc0VudHJ5Ei4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGi4KDEhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIqYBChRSZXNlcnZlVXBsb2FkUmVxdWVzdBIMCgRraW5kGAEgASgJEgwKBG5hbWUYAiABKAkSFAoMY29udGVudF90eXBlGAMgASgJEhIKCnBhcnRfc2l6ZXMYBCADKAMSEgoKaW5kZXhfc2l6ZRgFIAEoAxI0CglyZWNvcmRpbmcYBiABKA4yIS50b3NoaS53b3Jrc3BhY2UudjEuUmVjb3JkaW5nS2luZCLKAQoVUmVzZXJ2ZVVwbG9hZFJlc3BvbnNlEhMKC2FydGlmYWN0X2lkGAEgASgJEisKB3VwbG9hZHMYAiADKAsyGi50b3NoaS53b3Jrc3BhY2UudjEuVXBsb2FkEjMKD3VwbG9hZF9kZWFkbGluZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKZW5jcnlwdGlvbhgEIAEoCRIQCghkYXRhX2tleRgFIAEoDBIUCgxndWVzdF91cGxvYWQYBiABKAgiLAoVQ29tcGxldGVVcGxvYWRSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkgKFkNvbXBsZXRlVXBsb2FkUmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiogEKFExpc3RBcnRpZmFjdHNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSFgoOZW52aXJvbm1lbnRfaWQYAiABKAkSEwoLd29ya2xvYWRfaWQYAyABKAkSFAoMZXhlY3V0aW9uX2lkGAQgASgJEgwKBGtpbmQYBSABKAkSEQoJcGFnZV9zaXplGAYgASgFEhIKCnBhZ2VfdG9rZW4YByABKAkiYQoVTGlzdEFydGlmYWN0c1Jlc3BvbnNlEi8KCWFydGlmYWN0cxgBIAMoCzIcLnRvc2hpLndvcmtzcGFjZS52MS5BcnRpZmFjdBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiKQoSR2V0QXJ0aWZhY3RSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkUKE0dldEFydGlmYWN0UmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiVwodR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlcXVlc3QSEwoLYXJ0aWZhY3RfaWQYASABKAkSDAoEcGFydBgCIAEoCRITCgt0dGxfc2Vjb25kcxgDIAEoAyKDAQoeR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlc3BvbnNlEgsKA3VybBgBIAEoCRIuCgpleHBpcmVzX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmNyeXB0aW9uGAMgASgJEhAKCGRhdGFfa2V5GAQgASgMMpACChVBcnRpZmFjdFVwbG9hZFNlcnZpY2USeQoNUmVzZXJ2ZVVwbG9hZBIoLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVzcG9uc2UiE8LzGA9hcnRpZmFjdHMud3JpdGUSfAoOQ29tcGxldGVVcGxvYWQSKS50b3NoaS53b3Jrc3BhY2UudjEuQ29tcGxldGVVcGxvYWRSZXF1ZXN0GioudG9zaGkud29ya3NwYWNlLnYxLkNvbXBsZXRlVXBsb2FkUmVzcG9uc2UiE8LzGA9hcnRpZmFjdHMud3JpdGUyxAMKD0FydGlmYWN0U2VydmljZRKHAQoNTGlzdEFydGlmYWN0cxIoLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0QXJ0aWZhY3RzUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudBKBAQoLR2V0QXJ0aWZhY3QSJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0QXJ0aWZhY3RSZXF1ZXN0GicudG9zaGkud29ya3NwYWNlLnYxLkdldEFydGlmYWN0UmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudBKiAQoWR2V0QXJ0aWZhY3REb3dubG9hZFVSTBIxLnRvc2hpLndvcmtzcGFjZS52MS5HZXRBcnRpZmFjdERvd25sb2FkVVJMUmVxdWVzdBoyLnRvc2hpLndvcmtzcGFjZS52MS5HZXRBcnRpZmFjdERvd25sb2FkVVJMUmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudEIiWiBnby50b3NoaWNsb3VkLmlvL2FwaS93b3Jrc3BhY2V2MWIGcHJvdG8z", [file_google_protobuf_timestamp, file_toshi_permission, file_toshi_workspace_v1_recordings]);
11
12
  /**
12
13
  * Describes the message toshi.workspace.v1.Artifact.
13
14
  * Use `create(ArtifactSchema)` to create a new message.
@@ -73,7 +74,7 @@ export const GetArtifactDownloadURLResponseSchema = /*@__PURE__*/ messageDesc(fi
73
74
  * it reserves an artifact, uploads each part to a presigned URL, and
74
75
  * completes the upload. The caller is the workload itself: every call
75
76
  * carries a workload identity token for the audience
76
- * "toshi:artifacts", and the tenant, project, environment, workload and
77
+ * "toshi:artifacts", and the workspace, project, environment, workload and
77
78
  * execution of the artifact are the token's claims, never the request's.
78
79
  * A token of another audience, a display token, an expired token, or one
79
80
  * that names no workload is refused with UNAUTHENTICATED. A workspace that
@@ -3,10 +3,11 @@
3
3
  /* eslint-disable */
4
4
  import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
5
5
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
6
+ import { file_toshi_permission } from "../../permission_pb.js";
6
7
  /**
7
8
  * Describes the file toshi/workspace/v1/audit_events.proto.
8
9
  */
9
- export const file_toshi_workspace_v1_audit_events = /*@__PURE__*/ fileDesc("CiV0b3NoaS93b3Jrc3BhY2UvdjEvYXVkaXRfZXZlbnRzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEisAEKCkF1ZGl0RXZlbnQSCgoCaWQYASABKAMSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmFjdG9yX2tpbmQYAyABKAkSEAoIYWN0b3JfaWQYBCABKAkSDgoGYWN0aW9uGAUgASgJEg4KBnRhcmdldBgGIAEoCRIUCgxkZXRhaWxzX2pzb24YByABKAkSEgoKcmVxdWVzdF9pZBgIIAEoCSKqAQoWTGlzdEF1ZGl0RXZlbnRzUmVxdWVzdBIOCgZhY3Rpb24YASABKAkSKQoFc2luY2UYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhEKCXBhZ2Vfc2l6ZRgDIAEoBRINCgVhY3RvchgEIAEoCRIPCgdhY3Rpb25zGAUgAygJEg4KBnRhcmdldBgGIAEoCRISCgpwYWdlX3Rva2VuGAcgASgJImIKF0xpc3RBdWRpdEV2ZW50c1Jlc3BvbnNlEi4KBmV2ZW50cxgBIAMoCzIeLnRvc2hpLndvcmtzcGFjZS52MS5BdWRpdEV2ZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCTJ/ChFBdWRpdEV2ZW50U2VydmljZRJqCg9MaXN0QXVkaXRFdmVudHMSKi50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEF1ZGl0RXZlbnRzUmVxdWVzdBorLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0QXVkaXRFdmVudHNSZXNwb25zZUItWitnaXRodWIuY29tL3Rvc2hpY2xvdWQvdG9zaGktYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_timestamp]);
10
+ export const file_toshi_workspace_v1_audit_events = /*@__PURE__*/ fileDesc("CiV0b3NoaS93b3Jrc3BhY2UvdjEvYXVkaXRfZXZlbnRzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEisAEKCkF1ZGl0RXZlbnQSCgoCaWQYASABKAMSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmFjdG9yX2tpbmQYAyABKAkSEAoIYWN0b3JfaWQYBCABKAkSDgoGYWN0aW9uGAUgASgJEg4KBnRhcmdldBgGIAEoCRIUCgxkZXRhaWxzX2pzb24YByABKAkSEgoKcmVxdWVzdF9pZBgIIAEoCSKqAQoWTGlzdEF1ZGl0RXZlbnRzUmVxdWVzdBIOCgZhY3Rpb24YASABKAkSKQoFc2luY2UYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhEKCXBhZ2Vfc2l6ZRgDIAEoBRINCgVhY3RvchgEIAEoCRIPCgdhY3Rpb25zGAUgAygJEg4KBnRhcmdldBgGIAEoCRISCgpwYWdlX3Rva2VuGAcgASgJImIKF0xpc3RBdWRpdEV2ZW50c1Jlc3BvbnNlEi4KBmV2ZW50cxgBIAMoCzIeLnRvc2hpLndvcmtzcGFjZS52MS5BdWRpdEV2ZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCTKPAQoRQXVkaXRFdmVudFNlcnZpY2USegoPTGlzdEF1ZGl0RXZlbnRzEioudG9zaGkud29ya3NwYWNlLnYxLkxpc3RBdWRpdEV2ZW50c1JlcXVlc3QaKy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEF1ZGl0RXZlbnRzUmVzcG9uc2UiDsLzGAphdWRpdC5yZWFkQiJaIGdvLnRvc2hpY2xvdWQuaW8vYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_timestamp, file_toshi_permission]);
10
11
  /**
11
12
  * Describes the message toshi.workspace.v1.AuditEvent.
12
13
  * Use `create(AuditEventSchema)` to create a new message.
@@ -3,10 +3,11 @@
3
3
  /* eslint-disable */
4
4
  import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
5
5
  import { file_google_protobuf_duration, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
6
+ import { file_toshi_permission } from "../../permission_pb.js";
6
7
  /**
7
8
  * Describes the file toshi/workspace/v1/channels.proto.
8
9
  */
9
- export const file_toshi_workspace_v1_channels = /*@__PURE__*/ fileDesc("CiF0b3NoaS93b3Jrc3BhY2UvdjEvY2hhbm5lbHMucHJvdG8SEnRvc2hpLndvcmtzcGFjZS52MSLJBAoHQ2hhbm5lbBIKCgJpZBgBIAEoCRIOCgZqb2JfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIvCgVzaGFwZRgEIAEoDjIgLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsU2hhcGUSDAoEcG9ydBgFIAEoBRIPCgdjb21tYW5kGAYgAygJEi8KBXN0YXRlGAcgASgOMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxTdGF0ZRISCgpjcmVhdGVkX2J5GAggASgJEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmRfcmVhc29uGAsgASgJEhYKCWV4aXRfY29kZRgMIAEoBUgAiAEBEg0KBW93bmVyGA0gASgJEhQKDG91dHB1dF9zdGFydBgOIAEoAxITCgtvdXRwdXRfbmV4dBgPIAEoAxIUCgxpbnB1dF9jbG9zZWQYECABKAgSFwoPcmVxdWVzdHNfb2xkZXN0GBEgASgDEhcKD3JlcXVlc3RzX25ld2VzdBgSIAEoAxIxCgZwb2xpY3kYEyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeRIyCgdjbGllbnRzGBQgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxDbGllbnRCDAoKX2V4aXRfY29kZSLDAgoNQ2hhbm5lbENsaWVudBIKCgJpZBgBIAEoCRIzCgRtb2RlGAIgASgOMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxBdHRhY2hNb2RlEhMKC2F0dGFjaGVkX2J5GAMgASgJEg4KBmRldmljZRgEIAEoCRISCgpjcmVkZW50aWFsGAUgASgJEjIKDmF0dGFjaGVkX3NpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdzZWVuX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtkZXRhY2hlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMb3V0cHV0X2Fja2VkGAkgASgDEhAKCGF0dGFjaGVkGAogASgIIq8BCg1DaGFubmVsUG9saWN5Eg8KB3ZlcnNpb24YASABKAMSDgoGYXR0YWNoGAIgASgJEhgKC21heF9jbGllbnRzGAMgASgFSACIAQESDQoFaW5wdXQYBCABKAkSDAoEa2VlcBgFIAEoCRI2Cgdtb2R1bGVzGAYgASgLMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGVMaXN0Qg4KDF9tYXhfY2xpZW50cyJHChFDaGFubmVsTW9kdWxlTGlzdBIyCgdtb2R1bGVzGAEgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGUifwoNQ2hhbm5lbE1vZHVsZRIMCgRraW5kGAEgASgJEi8KBW1hdGNoGAIgASgLMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNYXRjaBIOCgZyYW5nZXMYAyADKAkSDQoFbGV2ZWwYBCABKAkSEAoIYm9keV9jYXAYBSABKAMirQEKDENoYW5uZWxNYXRjaBINCgVob3N0cxgBIAMoCRINCgVwYXRocxgCIAMoCRIPCgdtZXRob2RzGAMgAygJEj4KB2hlYWRlcnMYBCADKAsyLS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbE1hdGNoLkhlYWRlcnNFbnRyeRouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLwBAoOQ2hhbm5lbFJlcXVlc3QSCwoDc2VxGAEgASgDEi4KCmFycml2ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBGhvc3QYAyABKAkSDgoGbWV0aG9kGAQgASgJEgwKBHBhdGgYBSABKAkSDgoGc3RhdHVzGAYgASgFEhUKDXJlcXVlc3RfYnl0ZXMYByABKAMSFgoOcmVzcG9uc2VfYnl0ZXMYCCABKAMSKwoIZHVyYXRpb24YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SOAoGY2FsbGVyGAogASgLMigudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0Q2FsbGVyEg8KB2FkZHJlc3MYCyABKAkSEgoKcmVmdXNlZF9ieRgMIAEoCRIRCgl3ZWJzb2NrZXQYDSABKAgSDQoFbGV2ZWwYDiABKAkSDQoFcXVlcnkYDyABKAkSEQoJcXVlcnlfY3V0GBAgASgIEjoKD3JlcXVlc3RfaGVhZGVycxgRIAMoCzIhLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsSGVhZGVyEjsKEHJlc3BvbnNlX2hlYWRlcnMYEiADKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEhlYWRlchI1CgxyZXF1ZXN0X2JvZHkYEyABKAsyHy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEJvZHkSNgoNcmVzcG9uc2VfYm9keRgUIAEoCzIfLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQm9keSJIChRDaGFubmVsUmVxdWVzdENhbGxlchIMCgR1c2VyGAEgASgJEg4KBmRldmljZRgCIAEoCRISCgpzaGFyZV9saW5rGAMgASgJIj0KDUNoYW5uZWxIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIPCgdyZW1vdmVkGAMgASgIIj4KC0NoYW5uZWxCb2R5EhQKDGNvbnRlbnRfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMEgsKA2N1dBgDIAEoCCJ1CgdGb3J3YXJkEg4KBnRhcmdldBgBIAEoCRIKCgJieRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSDwoHY2hhbm5lbBgEIAEoCRItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIrEBCgRMaW5rEhEKCWNvbm5lY3RlZBgBIAEoCBIpCgVzaW5jZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEAoIY29ubmVjdHMYAyABKAUSDwoHc3RyZWFtcxgEIAEoBRISCgpsYXN0X2Vycm9yGAUgASgJEg8KB3JlcGxpY2EYBiABKAkSEAoIZm9yd2FyZHMYByABKAUSEQoJam9iX3N0YXRlGAggASgJIoYBChRDcmVhdGVDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRwb3J0GAMgASgFEg8KB2NvbW1hbmQYBCADKAkSMQoGcG9saWN5GAUgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kiRQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiwKB2NoYW5uZWwYASABKAsyGy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbCJMChNMaXN0Q2hhbm5lbHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJeChRMaXN0Q2hhbm5lbHNSZXNwb25zZRItCghjaGFubmVscxgBIAMoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSIxChFHZXRDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCSJCChJHZXRDaGFubmVsUmVzcG9uc2USLAoHY2hhbm5lbBgBIAEoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsIjcKF0dldENoYW5uZWxQb2xpY3lSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIk0KGEdldENoYW5uZWxQb2xpY3lSZXNwb25zZRIxCgZwb2xpY3kYASABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJqChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIxCgZwb2xpY3kYAyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJNChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USMQoGcG9saWN5GAEgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kijQIKGkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRISCgpwYWdlX3Rva2VuGAQgASgJEhEKCWFmdGVyX3NlcRgFIAEoAxIpCgVzaW5jZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKQoFdW50aWwYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBnN0YXR1cxgIIAEoCRIMCgRob3N0GAkgASgJEg4KBm1ldGhvZBgKIAEoCRITCgtwYXRoX3ByZWZpeBgLIAEoCSKUAQobTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEjQKCHJlcXVlc3RzGAEgAygLMiIudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgpvbGRlc3Rfc2VxGAMgASgDEhIKCm5ld2VzdF9zZXEYBCABKAMiRQoYR2V0Q2hhbm5lbFJlcXVlc3RSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3NlcRgDIAEoAyJQChlHZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEjMKB3JlcXVlc3QYASABKAsyIi50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFJlcXVlc3Qi7gEKF0V4cG9ydENoYW5uZWxMb2dSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEisKA2xvZxgDIAEoDjIeLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsTG9nEhEKBGZyb20YBCABKANIAIgBARIPCgJ0bxgFIAEoA0gBiAEBEikKBXNpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIpCgV1bnRpbBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCBwoFX2Zyb21CBQoDX3RvIm0KGEV4cG9ydENoYW5uZWxMb2dSZXNwb25zZRIMCgRkYXRhGAEgASgMEhEKCWZpbGVfbmFtZRgCIAEoCRIUCgxjb250ZW50X3R5cGUYAyABKAkSDAoEZnJvbRgEIAEoAxIMCgRuZXh0GAUgASgDIoUBCiBDcmVhdGVDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSMwoEbW9kZRgEIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSLDAQohQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEgoKAmlkGAEgASgJEg0KBXRva2VuGAIgASgJEgsKA3VybBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIRCgl0cmFuc3BvcnQYBSABKAkSMwoEbW9kZRgGIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSJMCiBSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIKCgJpZBgDIAEoCSIjCiFSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVzcG9uc2UiNAoURGVsZXRlQ2hhbm5lbFJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiFwoVRGVsZXRlQ2hhbm5lbFJlc3BvbnNlIkwKE0xpc3RGb3J3YXJkc1JlcXVlc3QSDgoGam9iX2lkGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoBRISCgpwYWdlX3Rva2VuGAMgASgJIl4KFExpc3RGb3J3YXJkc1Jlc3BvbnNlEi0KCGZvcndhcmRzGAEgAygLMhsudG9zaGkud29ya3NwYWNlLnYxLkZvcndhcmQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiAKDkdldExpbmtSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCSI5Cg9HZXRMaW5rUmVzcG9uc2USJgoEbGluaxgBIAEoCzIYLnRvc2hpLndvcmtzcGFjZS52MS5MaW5rKl8KDENoYW5uZWxTaGFwZRIdChlDSEFOTkVMX1NIQVBFX1VOU1BFQ0lGSUVEEAASFgoSQ0hBTk5FTF9TSEFQRV9IVFRQEAESGAoUQ0hBTk5FTF9TSEFQRV9TVFJFQU0QAiqTAQoMQ2hhbm5lbFN0YXRlEh0KGUNIQU5ORUxfU1RBVEVfVU5TUEVDSUZJRUQQABIWChJDSEFOTkVMX1NUQVRFX09QRU4QARIYChRDSEFOTkVMX1NUQVRFX0VYSVRFRBACEhkKFUNIQU5ORUxfU1RBVEVfQ0xPU0lORxADEhcKE0NIQU5ORUxfU1RBVEVfRU5ERUQQBCp6ChFDaGFubmVsQXR0YWNoTW9kZRIjCh9DSEFOTkVMX0FUVEFDSF9NT0RFX1VOU1BFQ0lGSUVEEAASHQoZQ0hBTk5FTF9BVFRBQ0hfTU9ERV9JTlBVVBABEiEKHUNIQU5ORUxfQVRUQUNIX01PREVfUkVBRF9PTkxZEAIqWwoKQ2hhbm5lbExvZxIbChdDSEFOTkVMX0xPR19VTlNQRUNJRklFRBAAEhYKEkNIQU5ORUxfTE9HX09VVFBVVBABEhgKFENIQU5ORUxfTE9HX1JFUVVFU1RTEAIyogsKDkNoYW5uZWxTZXJ2aWNlEmQKDUNyZWF0ZUNoYW5uZWwSKC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3QaKS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEmEKDExpc3RDaGFubmVscxInLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Q2hhbm5lbHNSZXF1ZXN0GigudG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsc1Jlc3BvbnNlElsKCkdldENoYW5uZWwSJS50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlcXVlc3QaJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlc3BvbnNlEm0KEEdldENoYW5uZWxQb2xpY3kSKy50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFBvbGljeVJlc3BvbnNlEm0KEFNldENoYW5uZWxQb2xpY3kSKy50b3NoaS53b3Jrc3BhY2UudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuU2V0Q2hhbm5lbFBvbGljeVJlc3BvbnNlEnYKE0xpc3RDaGFubmVsUmVxdWVzdHMSLi50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxSZXF1ZXN0c1JlcXVlc3QaLy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEnAKEUdldENoYW5uZWxSZXF1ZXN0EiwudG9zaGkud29ya3NwYWNlLnYxLkdldENoYW5uZWxSZXF1ZXN0UmVxdWVzdBotLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEm8KEEV4cG9ydENoYW5uZWxMb2cSKy50b3NoaS53b3Jrc3BhY2UudjEuRXhwb3J0Q2hhbm5lbExvZ1JlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuRXhwb3J0Q2hhbm5lbExvZ1Jlc3BvbnNlMAESiAEKGUNyZWF0ZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEogBChlSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuEjQudG9zaGkud29ya3NwYWNlLnYxLlJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW5SZXF1ZXN0GjUudG9zaGkud29ya3NwYWNlLnYxLlJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW5SZXNwb25zZRJkCg1EZWxldGVDaGFubmVsEigudG9zaGkud29ya3NwYWNlLnYxLkRlbGV0ZUNoYW5uZWxSZXF1ZXN0GikudG9zaGkud29ya3NwYWNlLnYxLkRlbGV0ZUNoYW5uZWxSZXNwb25zZRJhCgxMaXN0Rm9yd2FyZHMSJy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEZvcndhcmRzUmVxdWVzdBooLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Rm9yd2FyZHNSZXNwb25zZRJSCgdHZXRMaW5rEiIudG9zaGkud29ya3NwYWNlLnYxLkdldExpbmtSZXF1ZXN0GiMudG9zaGkud29ya3NwYWNlLnYxLkdldExpbmtSZXNwb25zZUItWitnaXRodWIuY29tL3Rvc2hpY2xvdWQvdG9zaGktYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_duration, file_google_protobuf_timestamp]);
10
+ export const file_toshi_workspace_v1_channels = /*@__PURE__*/ fileDesc("CiF0b3NoaS93b3Jrc3BhY2UvdjEvY2hhbm5lbHMucHJvdG8SEnRvc2hpLndvcmtzcGFjZS52MSLJBAoHQ2hhbm5lbBIKCgJpZBgBIAEoCRIOCgZqb2JfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIvCgVzaGFwZRgEIAEoDjIgLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsU2hhcGUSDAoEcG9ydBgFIAEoBRIPCgdjb21tYW5kGAYgAygJEi8KBXN0YXRlGAcgASgOMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxTdGF0ZRISCgpjcmVhdGVkX2J5GAggASgJEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmRfcmVhc29uGAsgASgJEhYKCWV4aXRfY29kZRgMIAEoBUgAiAEBEg0KBW93bmVyGA0gASgJEhQKDG91dHB1dF9zdGFydBgOIAEoAxITCgtvdXRwdXRfbmV4dBgPIAEoAxIUCgxpbnB1dF9jbG9zZWQYECABKAgSFwoPcmVxdWVzdHNfb2xkZXN0GBEgASgDEhcKD3JlcXVlc3RzX25ld2VzdBgSIAEoAxIxCgZwb2xpY3kYEyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeRIyCgdjbGllbnRzGBQgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxDbGllbnRCDAoKX2V4aXRfY29kZSLDAgoNQ2hhbm5lbENsaWVudBIKCgJpZBgBIAEoCRIzCgRtb2RlGAIgASgOMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxBdHRhY2hNb2RlEhMKC2F0dGFjaGVkX2J5GAMgASgJEg4KBmRldmljZRgEIAEoCRISCgpjcmVkZW50aWFsGAUgASgJEjIKDmF0dGFjaGVkX3NpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdzZWVuX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtkZXRhY2hlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMb3V0cHV0X2Fja2VkGAkgASgDEhAKCGF0dGFjaGVkGAogASgIIq8BCg1DaGFubmVsUG9saWN5Eg8KB3ZlcnNpb24YASABKAMSDgoGYXR0YWNoGAIgASgJEhgKC21heF9jbGllbnRzGAMgASgFSACIAQESDQoFaW5wdXQYBCABKAkSDAoEa2VlcBgFIAEoCRI2Cgdtb2R1bGVzGAYgASgLMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGVMaXN0Qg4KDF9tYXhfY2xpZW50cyJHChFDaGFubmVsTW9kdWxlTGlzdBIyCgdtb2R1bGVzGAEgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGUifwoNQ2hhbm5lbE1vZHVsZRIMCgRraW5kGAEgASgJEi8KBW1hdGNoGAIgASgLMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNYXRjaBIOCgZyYW5nZXMYAyADKAkSDQoFbGV2ZWwYBCABKAkSEAoIYm9keV9jYXAYBSABKAMirQEKDENoYW5uZWxNYXRjaBINCgVob3N0cxgBIAMoCRINCgVwYXRocxgCIAMoCRIPCgdtZXRob2RzGAMgAygJEj4KB2hlYWRlcnMYBCADKAsyLS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbE1hdGNoLkhlYWRlcnNFbnRyeRouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLwBAoOQ2hhbm5lbFJlcXVlc3QSCwoDc2VxGAEgASgDEi4KCmFycml2ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBGhvc3QYAyABKAkSDgoGbWV0aG9kGAQgASgJEgwKBHBhdGgYBSABKAkSDgoGc3RhdHVzGAYgASgFEhUKDXJlcXVlc3RfYnl0ZXMYByABKAMSFgoOcmVzcG9uc2VfYnl0ZXMYCCABKAMSKwoIZHVyYXRpb24YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SOAoGY2FsbGVyGAogASgLMigudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0Q2FsbGVyEg8KB2FkZHJlc3MYCyABKAkSEgoKcmVmdXNlZF9ieRgMIAEoCRIRCgl3ZWJzb2NrZXQYDSABKAgSDQoFbGV2ZWwYDiABKAkSDQoFcXVlcnkYDyABKAkSEQoJcXVlcnlfY3V0GBAgASgIEjoKD3JlcXVlc3RfaGVhZGVycxgRIAMoCzIhLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsSGVhZGVyEjsKEHJlc3BvbnNlX2hlYWRlcnMYEiADKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEhlYWRlchI1CgxyZXF1ZXN0X2JvZHkYEyABKAsyHy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEJvZHkSNgoNcmVzcG9uc2VfYm9keRgUIAEoCzIfLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQm9keSJIChRDaGFubmVsUmVxdWVzdENhbGxlchIMCgR1c2VyGAEgASgJEg4KBmRldmljZRgCIAEoCRISCgpzaGFyZV9saW5rGAMgASgJIj0KDUNoYW5uZWxIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIPCgdyZW1vdmVkGAMgASgIIj4KC0NoYW5uZWxCb2R5EhQKDGNvbnRlbnRfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMEgsKA2N1dBgDIAEoCCJ1CgdGb3J3YXJkEg4KBnRhcmdldBgBIAEoCRIKCgJieRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSDwoHY2hhbm5lbBgEIAEoCRItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIrEBCgRMaW5rEhEKCWNvbm5lY3RlZBgBIAEoCBIpCgVzaW5jZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEAoIY29ubmVjdHMYAyABKAUSDwoHc3RyZWFtcxgEIAEoBRISCgpsYXN0X2Vycm9yGAUgASgJEg8KB3JlcGxpY2EYBiABKAkSEAoIZm9yd2FyZHMYByABKAUSEQoJam9iX3N0YXRlGAggASgJIoYBChRDcmVhdGVDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRwb3J0GAMgASgFEg8KB2NvbW1hbmQYBCADKAkSMQoGcG9saWN5GAUgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kiRQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiwKB2NoYW5uZWwYASABKAsyGy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbCJMChNMaXN0Q2hhbm5lbHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJeChRMaXN0Q2hhbm5lbHNSZXNwb25zZRItCghjaGFubmVscxgBIAMoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSIxChFHZXRDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCSJCChJHZXRDaGFubmVsUmVzcG9uc2USLAoHY2hhbm5lbBgBIAEoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsIjcKF0dldENoYW5uZWxQb2xpY3lSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIk0KGEdldENoYW5uZWxQb2xpY3lSZXNwb25zZRIxCgZwb2xpY3kYASABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJqChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIxCgZwb2xpY3kYAyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJNChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USMQoGcG9saWN5GAEgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kijQIKGkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRISCgpwYWdlX3Rva2VuGAQgASgJEhEKCWFmdGVyX3NlcRgFIAEoAxIpCgVzaW5jZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKQoFdW50aWwYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBnN0YXR1cxgIIAEoCRIMCgRob3N0GAkgASgJEg4KBm1ldGhvZBgKIAEoCRITCgtwYXRoX3ByZWZpeBgLIAEoCSKUAQobTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEjQKCHJlcXVlc3RzGAEgAygLMiIudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgpvbGRlc3Rfc2VxGAMgASgDEhIKCm5ld2VzdF9zZXEYBCABKAMiRQoYR2V0Q2hhbm5lbFJlcXVlc3RSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3NlcRgDIAEoAyJQChlHZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEjMKB3JlcXVlc3QYASABKAsyIi50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFJlcXVlc3Qi7gEKF0V4cG9ydENoYW5uZWxMb2dSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEisKA2xvZxgDIAEoDjIeLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsTG9nEhEKBGZyb20YBCABKANIAIgBARIPCgJ0bxgFIAEoA0gBiAEBEikKBXNpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIpCgV1bnRpbBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCBwoFX2Zyb21CBQoDX3RvIm0KGEV4cG9ydENoYW5uZWxMb2dSZXNwb25zZRIMCgRkYXRhGAEgASgMEhEKCWZpbGVfbmFtZRgCIAEoCRIUCgxjb250ZW50X3R5cGUYAyABKAkSDAoEZnJvbRgEIAEoAxIMCgRuZXh0GAUgASgDIoUBCiBDcmVhdGVDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSMwoEbW9kZRgEIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSLDAQohQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEgoKAmlkGAEgASgJEg0KBXRva2VuGAIgASgJEgsKA3VybBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIRCgl0cmFuc3BvcnQYBSABKAkSMwoEbW9kZRgGIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSJMCiBSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIKCgJpZBgDIAEoCSIjCiFSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVzcG9uc2UiNAoURGVsZXRlQ2hhbm5lbFJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiFwoVRGVsZXRlQ2hhbm5lbFJlc3BvbnNlIkwKE0xpc3RGb3J3YXJkc1JlcXVlc3QSDgoGam9iX2lkGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoBRISCgpwYWdlX3Rva2VuGAMgASgJIl4KFExpc3RGb3J3YXJkc1Jlc3BvbnNlEi0KCGZvcndhcmRzGAEgAygLMhsudG9zaGkud29ya3NwYWNlLnYxLkZvcndhcmQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiAKDkdldExpbmtSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCSI5Cg9HZXRMaW5rUmVzcG9uc2USJgoEbGluaxgBIAEoCzIYLnRvc2hpLndvcmtzcGFjZS52MS5MaW5rKl8KDENoYW5uZWxTaGFwZRIdChlDSEFOTkVMX1NIQVBFX1VOU1BFQ0lGSUVEEAASFgoSQ0hBTk5FTF9TSEFQRV9IVFRQEAESGAoUQ0hBTk5FTF9TSEFQRV9TVFJFQU0QAiqTAQoMQ2hhbm5lbFN0YXRlEh0KGUNIQU5ORUxfU1RBVEVfVU5TUEVDSUZJRUQQABIWChJDSEFOTkVMX1NUQVRFX09QRU4QARIYChRDSEFOTkVMX1NUQVRFX0VYSVRFRBACEhkKFUNIQU5ORUxfU1RBVEVfQ0xPU0lORxADEhcKE0NIQU5ORUxfU1RBVEVfRU5ERUQQBCp6ChFDaGFubmVsQXR0YWNoTW9kZRIjCh9DSEFOTkVMX0FUVEFDSF9NT0RFX1VOU1BFQ0lGSUVEEAASHQoZQ0hBTk5FTF9BVFRBQ0hfTU9ERV9JTlBVVBABEiEKHUNIQU5ORUxfQVRUQUNIX01PREVfUkVBRF9PTkxZEAIqWwoKQ2hhbm5lbExvZxIbChdDSEFOTkVMX0xPR19VTlNQRUNJRklFRBAAEhYKEkNIQU5ORUxfTE9HX09VVFBVVBABEhgKFENIQU5ORUxfTE9HX1JFUVVFU1RTEAIyow0KDkNoYW5uZWxTZXJ2aWNlEngKDUNyZWF0ZUNoYW5uZWwSKC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3QaKS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSdAoMTGlzdENoYW5uZWxzEicudG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsc1JlcXVlc3QaKC50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxzUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkEm4KCkdldENoYW5uZWwSJS50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlcXVlc3QaJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlc3BvbnNlIhHC8xgNY2hhbm5lbHMucmVhZBKAAQoQR2V0Q2hhbm5lbFBvbGljeRIrLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUG9saWN5UmVxdWVzdBosLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUG9saWN5UmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkEoEBChBTZXRDaGFubmVsUG9saWN5EisudG9zaGkud29ya3NwYWNlLnYxLlNldENoYW5uZWxQb2xpY3lSZXF1ZXN0GiwudG9zaGkud29ya3NwYWNlLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZSISwvMYDmNoYW5uZWxzLndyaXRlEokBChNMaXN0Q2hhbm5lbFJlcXVlc3RzEi4udG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Gi8udG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsUmVxdWVzdHNSZXNwb25zZSIRwvMYDWNoYW5uZWxzLnJlYWQSgwEKEUdldENoYW5uZWxSZXF1ZXN0EiwudG9zaGkud29ya3NwYWNlLnYxLkdldENoYW5uZWxSZXF1ZXN0UmVxdWVzdBotLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlIhHC8xgNY2hhbm5lbHMucmVhZBKCAQoQRXhwb3J0Q2hhbm5lbExvZxIrLnRvc2hpLndvcmtzcGFjZS52MS5FeHBvcnRDaGFubmVsTG9nUmVxdWVzdBosLnRvc2hpLndvcmtzcGFjZS52MS5FeHBvcnRDaGFubmVsTG9nUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkMAESnAEKGUNyZWF0ZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSnAEKGVJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuUmV2b2tlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuUmV2b2tlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSeAoNRGVsZXRlQ2hhbm5lbBIoLnRvc2hpLndvcmtzcGFjZS52MS5EZWxldGVDaGFubmVsUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5EZWxldGVDaGFubmVsUmVzcG9uc2UiEsLzGA5jaGFubmVscy53cml0ZRJ0CgxMaXN0Rm9yd2FyZHMSJy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEZvcndhcmRzUmVxdWVzdBooLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Rm9yd2FyZHNSZXNwb25zZSIRwvMYDWNoYW5uZWxzLnJlYWQSZQoHR2V0TGluaxIiLnRvc2hpLndvcmtzcGFjZS52MS5HZXRMaW5rUmVxdWVzdBojLnRvc2hpLndvcmtzcGFjZS52MS5HZXRMaW5rUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkQiJaIGdvLnRvc2hpY2xvdWQuaW8vYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_duration, file_google_protobuf_timestamp, file_toshi_permission]);
10
11
  /**
11
12
  * Describes the message toshi.workspace.v1.Channel.
12
13
  * Use `create(ChannelSchema)` to create a new message.