@projectqai/proto 0.0.25 → 0.0.27

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/device.ts ADDED
@@ -0,0 +1,320 @@
1
+ import { createClient, type Client, ConnectError, Code } from "@connectrpc/connect";
2
+ import { createTransport } from "@connectrpc/connect/protocol-connect";
3
+ import type { UniversalClientFn } from "@connectrpc/connect/protocol";
4
+ import { create, clone } from "@bufbuild/protobuf";
5
+ import {
6
+ WorldService,
7
+ EntitySchema,
8
+ EntityFilterSchema,
9
+ ListEntitiesRequestSchema,
10
+ EntityChangeRequestSchema,
11
+ ConfigurableComponentSchema,
12
+ ConfigurableState,
13
+ EntityChange,
14
+ LifetimeSchema,
15
+ DeviceComponentSchema,
16
+ DeviceState,
17
+ ControllerSchema,
18
+ InteractivityComponentSchema,
19
+ type Entity,
20
+ } from "./dist/world_pb.js";
21
+ import { TimestampSchema } from "@bufbuild/protobuf/wkt";
22
+ import {
23
+ MetricComponentSchema,
24
+ MetricSchema,
25
+ MetricKind,
26
+ MetricUnit,
27
+ } from "./dist/metrics_pb.js";
28
+
29
+ export type WorldClient = Client<typeof WorldService>;
30
+
31
+ export { create } from "@bufbuild/protobuf";
32
+ export {
33
+ EntitySchema,
34
+ EntityFilterSchema,
35
+ ListEntitiesRequestSchema,
36
+ EntityChangeRequestSchema,
37
+ EntityChange,
38
+ type Entity,
39
+ } from "./dist/world_pb.js";
40
+
41
+ // fetch-based universal HTTP client for the Connect protocol.
42
+ // Works in Node, Bun, browsers, and goja — no http2 dependency.
43
+ const universalFetch: UniversalClientFn = async (req) => {
44
+ const body = req.body ? await collectBytes(req.body) : undefined;
45
+ // Prevent the server from gzip-encoding responses — the Connect
46
+ // transport handles its own compression negotiation.
47
+ req.header.set("Accept-Encoding", "identity");
48
+ const resp = await fetch(req.url, {
49
+ method: req.method,
50
+ headers: req.header,
51
+ body,
52
+ signal: (req as any).signal,
53
+ });
54
+ return {
55
+ status: resp.status,
56
+ header: resp.headers,
57
+ body: responseBodyStream(resp),
58
+ trailer: new Headers(),
59
+ };
60
+ };
61
+
62
+ async function collectBytes(iter: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
63
+ const chunks: Uint8Array[] = [];
64
+ for await (const value of iter) {
65
+ chunks.push(value);
66
+ }
67
+ const len = chunks.reduce((n, c) => n + c.length, 0);
68
+ const out = new Uint8Array(len);
69
+ let off = 0;
70
+ for (const c of chunks) { out.set(c, off); off += c.length; }
71
+ return out;
72
+ }
73
+
74
+ function responseBodyStream(resp: Response): AsyncIterable<Uint8Array> {
75
+ if (!resp.body) return { [Symbol.asyncIterator]() { return { next: () => Promise.resolve({ done: true as const, value: undefined }), throw: () => Promise.resolve({ done: true as const, value: undefined }) }; } };
76
+ const reader = resp.body.getReader();
77
+ return {
78
+ [Symbol.asyncIterator]() {
79
+ return {
80
+ async next() {
81
+ const { done, value } = await reader.read();
82
+ if (done) { reader.releaseLock(); return { done: true as const, value: undefined }; }
83
+ return { done: false as const, value };
84
+ },
85
+ async throw(e: unknown) {
86
+ reader.releaseLock();
87
+ return { done: true as const, value: undefined };
88
+ },
89
+ };
90
+ }
91
+ };
92
+ }
93
+
94
+ export function connect(serverURL?: string): WorldClient {
95
+ const base = serverURL ?? process.env.HYDRIS_SERVER ?? "http://localhost:50051";
96
+ const transport = createTransport({
97
+ baseUrl: base,
98
+ httpClient: universalFetch,
99
+ useBinaryFormat: true,
100
+ interceptors: [],
101
+ acceptCompression: [],
102
+ sendCompression: null,
103
+ compressMinBytes: Number.MAX_SAFE_INTEGER,
104
+ readMaxBytes: Number.MAX_SAFE_INTEGER,
105
+ writeMaxBytes: Number.MAX_SAFE_INTEGER,
106
+ });
107
+ return createClient(WorldService, transport);
108
+ }
109
+
110
+ export function push(client: WorldClient, ...entities: Entity[]) {
111
+ return client.push(create(EntityChangeRequestSchema, { changes: entities }));
112
+ }
113
+
114
+ // Schema → typed config inference
115
+
116
+ type SchemaProperty = { readonly type: string; readonly default?: unknown; readonly [key: string]: unknown };
117
+ type SchemaProperties = Readonly<Record<string, SchemaProperty>>;
118
+
119
+ type InferProperty<P extends SchemaProperty> =
120
+ P extends { type: "string" } ? string :
121
+ P extends { type: "boolean" } ? boolean :
122
+ P extends { type: "number" | "integer" } ? number :
123
+ unknown;
124
+
125
+ export type InferConfig<S extends SchemaProperties> = {
126
+ [K in keyof S]?: InferProperty<S[K]>;
127
+ };
128
+
129
+ function extractConfig<S extends SchemaProperties>(entity: Entity, schema: S): InferConfig<S> {
130
+ const raw = entity.config?.value ?? {};
131
+ const result: Record<string, unknown> = {};
132
+ for (const [key, prop] of Object.entries(schema)) {
133
+ const val = raw[key];
134
+ result[key] = (val !== undefined && val !== null && typeof val === prop.type) ? val : prop.default;
135
+ }
136
+ return result as InferConfig<S>;
137
+ }
138
+
139
+ // Attach options
140
+
141
+ export type HealthResult = boolean | Record<number, { label: string; value: number | bigint }>;
142
+
143
+ export interface AttachOptions<S extends SchemaProperties> {
144
+ id: string;
145
+ label?: string;
146
+ controller?: string;
147
+ device?: { category?: string };
148
+ icon?: string;
149
+ schema: S;
150
+ run: (client: WorldClient, config: InferConfig<S>, signal: AbortSignal) => Promise<void>;
151
+ health?: () => HealthResult | Promise<HealthResult>;
152
+ interval?: number;
153
+ signal?: AbortSignal;
154
+ }
155
+
156
+ // Internals
157
+
158
+ const DEFAULT_INTERVAL = 10_000;
159
+
160
+ function isCanceled(err: unknown): boolean {
161
+ return err instanceof ConnectError && err.code === Code.Canceled;
162
+ }
163
+
164
+ function sleep(ms: number, signal: AbortSignal): Promise<void> {
165
+ return new Promise((resolve) => {
166
+ if (signal.aborted) return resolve();
167
+ const timer = setTimeout(resolve, ms);
168
+ signal.addEventListener("abort", () => { clearTimeout(timer); resolve(); }, { once: true });
169
+ });
170
+ }
171
+
172
+ /**
173
+ * Attach to a single device entity. Registers the entity, starts a heartbeat
174
+ * with TTL, watches for config changes, and runs the provided function.
175
+ *
176
+ * The health callback is polled every `interval` ms. Return `true` for healthy,
177
+ * `false` to skip the heartbeat (device expires via TTL), or a metrics map
178
+ * to push metrics alongside the heartbeat.
179
+ */
180
+ export async function attach<S extends SchemaProperties>(opts: AttachOptions<S>) {
181
+ const client = connect();
182
+ const entityID = opts.id;
183
+ const interval = opts.interval ?? DEFAULT_INTERVAL;
184
+ const health = opts.health ?? (() => true);
185
+
186
+ const entity = create(EntitySchema, {
187
+ id: entityID,
188
+ ...(opts.label && { label: opts.label }),
189
+ ...(opts.controller && { controller: create(ControllerSchema, { id: opts.controller }) }),
190
+ ...(opts.device && { device: create(DeviceComponentSchema, opts.device) }),
191
+ ...(opts.icon && { interactivity: create(InteractivityComponentSchema, { icon: opts.icon }) }),
192
+ configurable: create(ConfigurableComponentSchema, {
193
+ schema: { type: "object", properties: opts.schema as Record<string, unknown> },
194
+ }),
195
+ });
196
+
197
+ // Register entity without device — device is managed by heartbeat
198
+ await push(client, create(EntitySchema, { ...entity, device: undefined }));
199
+ console.log(`attached entity=${entityID}`);
200
+
201
+ // Heartbeat
202
+
203
+ let heartbeatId: ReturnType<typeof setInterval> | null = null;
204
+
205
+ const pushHeartbeat = (result?: Record<number, { label: string; value: number | bigint }>) => {
206
+ const e = create(EntitySchema, {
207
+ id: entityID,
208
+ device: create(DeviceComponentSchema, { ...entity.device, state: DeviceState.DeviceStateActive }),
209
+ lifetime: create(LifetimeSchema, {
210
+ until: create(TimestampSchema, { seconds: BigInt(Math.floor((Date.now() + interval + 1_000) / 1000)) }),
211
+ }),
212
+ });
213
+ if (result) {
214
+ e.metric = create(MetricComponentSchema, {
215
+ metrics: Object.entries(result).map(([idStr, { label, value }]) =>
216
+ typeof value === "bigint"
217
+ ? create(MetricSchema, { id: Number(idStr), label, kind: MetricKind.MetricKindCount, unit: MetricUnit.MetricUnitCount, val: { case: "uint64", value } })
218
+ : create(MetricSchema, { id: Number(idStr), label, kind: MetricKind.MetricKindGauge, unit: MetricUnit.MetricUnitNone, val: { case: "float", value } }),
219
+ ),
220
+ });
221
+ }
222
+ return push(client, e);
223
+ };
224
+
225
+ const outerAbort = new AbortController();
226
+ const tick = async () => {
227
+ if (outerAbort.signal.aborted) return;
228
+ try {
229
+ const r = await health();
230
+ if (r !== false) await pushHeartbeat(r === true ? undefined : r);
231
+ } catch { /* health check failed */ }
232
+ };
233
+ tick();
234
+ heartbeatId = setInterval(tick, interval);
235
+
236
+ // Config state management
237
+
238
+ const pushState = async (entity: Entity, state: ConfigurableState, error?: string) => {
239
+ const cfg = entity.configurable
240
+ ? clone(ConfigurableComponentSchema, entity.configurable)
241
+ : create(ConfigurableComponentSchema);
242
+ cfg.state = state;
243
+ cfg.error = error;
244
+ if (entity.config && state === ConfigurableState.ConfigurableStateActive) {
245
+ cfg.appliedVersion = entity.config.version;
246
+ }
247
+ await push(client, create(EntitySchema, { id: entityID, configurable: cfg })).catch(() => { });
248
+ };
249
+
250
+ let runningAbort: AbortController | null = null;
251
+ let currentConfigVersion = 0n;
252
+ let currentEntity: Entity | null = null;
253
+
254
+ const stop = () => {
255
+ if (runningAbort) {
256
+ const e = currentEntity;
257
+ runningAbort.abort();
258
+ runningAbort = null;
259
+ currentEntity = null;
260
+ console.log(`stopped entity=${entityID}`);
261
+ if (e) pushState(e, ConfigurableState.ConfigurableStateInactive);
262
+ }
263
+ };
264
+
265
+ const start = (e: Entity) => {
266
+ runningAbort = new AbortController();
267
+ currentEntity = e;
268
+ const childSignal = runningAbort.signal;
269
+
270
+ (async () => {
271
+ while (!childSignal.aborted) {
272
+ await pushState(e, ConfigurableState.ConfigurableStateStarting);
273
+ await pushState(e, ConfigurableState.ConfigurableStateActive);
274
+
275
+ try {
276
+ await opts.run(client, extractConfig(e, opts.schema), childSignal);
277
+ } catch (err) {
278
+ if (childSignal.aborted || isCanceled(err)) return;
279
+ console.error(`error, restarting entity=${entityID}`, err);
280
+ await pushState(e, ConfigurableState.ConfigurableStateFailed, String(err));
281
+ }
282
+
283
+ await sleep(5_000, childSignal);
284
+ }
285
+ })();
286
+ };
287
+
288
+ // Watch for config changes
289
+
290
+ const stream = client.watchEntities(
291
+ create(ListEntitiesRequestSchema, { filter: create(EntityFilterSchema, { id: entityID }) }),
292
+ ...(opts.signal ? [{ signal: opts.signal }] : []),
293
+ );
294
+
295
+ try {
296
+ for await (const event of stream) {
297
+ if (!event.entity) continue;
298
+
299
+ if (event.t === EntityChange.EntityChangeExpired || event.t === EntityChange.EntityChangeUnobserved) {
300
+ stop();
301
+ continue;
302
+ }
303
+ if (event.t !== EntityChange.EntityChangeUpdated) continue;
304
+
305
+ const e = event.entity;
306
+ if (!e.config) { stop(); continue; }
307
+ if (e.config.version === currentConfigVersion && runningAbort) continue;
308
+
309
+ stop();
310
+ currentConfigVersion = e.config.version;
311
+ start(e);
312
+ }
313
+ } catch (err) {
314
+ if (!isCanceled(err)) throw err;
315
+ } finally {
316
+ stop();
317
+ outerAbort.abort();
318
+ if (heartbeatId) clearInterval(heartbeatId);
319
+ }
320
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectqai/proto",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "author": "projectq-release-bot",
5
5
  "type": "module",
6
6
  "exports": {
@@ -8,15 +8,23 @@
8
8
  "types": "./dist/*_pb.d.ts",
9
9
  "import": "./dist/*_pb.js",
10
10
  "default": "./dist/*_pb.js"
11
+ },
12
+ "./device": {
13
+ "import": "./device.ts",
14
+ "default": "./device.ts"
11
15
  }
12
16
  },
13
17
  "files": [
14
- "dist"
18
+ "dist",
19
+ "device.ts"
15
20
  ],
16
21
  "license": "Apache-2.0",
17
22
  "peerDependencies": {
18
23
  "@bufbuild/protobuf": "^2.10.1"
19
24
  },
25
+ "dependencies": {
26
+ "@connectrpc/connect": "^2.0.0"
27
+ },
20
28
  "devDependencies": {
21
29
  "@bufbuild/protoc-gen-es": "^2.10.1"
22
30
  },
@@ -1,154 +0,0 @@
1
- // @generated by protoc-gen-es v2.10.2 with parameter "target=js+dts,import_extension=.js"
2
- // @generated from file controller.proto (package world, syntax proto3)
3
- /* eslint-disable */
4
-
5
- import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
6
- import type { Message } from "@bufbuild/protobuf";
7
- import type { Entity } from "./world_pb.js";
8
-
9
- /**
10
- * Describes the file controller.proto.
11
- */
12
- export declare const file_controller: GenFile;
13
-
14
- /**
15
- * @generated from message world.ControllerReconciliationRequest
16
- */
17
- export declare type ControllerReconciliationRequest = Message<"world.ControllerReconciliationRequest"> & {
18
- /**
19
- * @generated from field: string controller = 1;
20
- */
21
- controller: string;
22
- };
23
-
24
- /**
25
- * Describes the message world.ControllerReconciliationRequest.
26
- * Use `create(ControllerReconciliationRequestSchema)` to create a new message.
27
- */
28
- export declare const ControllerReconciliationRequestSchema: GenMessage<ControllerReconciliationRequest>;
29
-
30
- /**
31
- * An entity with Config on this controller was added, changed, or removed.
32
- *
33
- * @generated from message world.ControllerDeviceConfigurationEvent
34
- */
35
- export declare type ControllerDeviceConfigurationEvent = Message<"world.ControllerDeviceConfigurationEvent"> & {
36
- /**
37
- * @generated from field: world.ControllerDeviceConfigurationEventType t = 1;
38
- */
39
- t: ControllerDeviceConfigurationEventType;
40
-
41
- /**
42
- * @generated from field: world.Entity config = 2;
43
- */
44
- config?: Entity;
45
- };
46
-
47
- /**
48
- * Describes the message world.ControllerDeviceConfigurationEvent.
49
- * Use `create(ControllerDeviceConfigurationEventSchema)` to create a new message.
50
- */
51
- export declare const ControllerDeviceConfigurationEventSchema: GenMessage<ControllerDeviceConfigurationEvent>;
52
-
53
- /**
54
- * @generated from message world.ControllerReconciliationEvent
55
- */
56
- export declare type ControllerReconciliationEvent = Message<"world.ControllerReconciliationEvent"> & {
57
- /**
58
- * @generated from oneof world.ControllerReconciliationEvent.event
59
- */
60
- event: {
61
- /**
62
- * @generated from field: world.ControllerDeviceConfigurationEvent config = 2;
63
- */
64
- value: ControllerDeviceConfigurationEvent;
65
- case: "config";
66
- } | { case: undefined; value?: undefined };
67
- };
68
-
69
- /**
70
- * Describes the message world.ControllerReconciliationEvent.
71
- * Use `create(ControllerReconciliationEventSchema)` to create a new message.
72
- */
73
- export declare const ControllerReconciliationEventSchema: GenMessage<ControllerReconciliationEvent>;
74
-
75
- /**
76
- * @generated from message world.RestartConnectorRequest
77
- */
78
- export declare type RestartConnectorRequest = Message<"world.RestartConnectorRequest"> & {
79
- /**
80
- * @generated from field: string controller = 1;
81
- */
82
- controller: string;
83
-
84
- /**
85
- * @generated from field: string entity_id = 2;
86
- */
87
- entityId: string;
88
- };
89
-
90
- /**
91
- * Describes the message world.RestartConnectorRequest.
92
- * Use `create(RestartConnectorRequestSchema)` to create a new message.
93
- */
94
- export declare const RestartConnectorRequestSchema: GenMessage<RestartConnectorRequest>;
95
-
96
- /**
97
- * @generated from message world.RestartConnectorResponse
98
- */
99
- export declare type RestartConnectorResponse = Message<"world.RestartConnectorResponse"> & {
100
- };
101
-
102
- /**
103
- * Describes the message world.RestartConnectorResponse.
104
- * Use `create(RestartConnectorResponseSchema)` to create a new message.
105
- */
106
- export declare const RestartConnectorResponseSchema: GenMessage<RestartConnectorResponse>;
107
-
108
- /**
109
- * @generated from enum world.ControllerDeviceConfigurationEventType
110
- */
111
- export enum ControllerDeviceConfigurationEventType {
112
- /**
113
- * @generated from enum value: ControllerDeviceConfigurationEventNew = 0;
114
- */
115
- ControllerDeviceConfigurationEventNew = 0,
116
-
117
- /**
118
- * @generated from enum value: ControllerDeviceConfigurationEventChanged = 1;
119
- */
120
- ControllerDeviceConfigurationEventChanged = 1,
121
-
122
- /**
123
- * @generated from enum value: ControllerDeviceConfigurationEventRemoved = 2;
124
- */
125
- ControllerDeviceConfigurationEventRemoved = 2,
126
- }
127
-
128
- /**
129
- * Describes the enum world.ControllerDeviceConfigurationEventType.
130
- */
131
- export declare const ControllerDeviceConfigurationEventTypeSchema: GenEnum<ControllerDeviceConfigurationEventType>;
132
-
133
- /**
134
- * @generated from service world.ControllerService
135
- */
136
- export declare const ControllerService: GenService<{
137
- /**
138
- * @generated from rpc world.ControllerService.Reconcile
139
- */
140
- reconcile: {
141
- methodKind: "server_streaming";
142
- input: typeof ControllerReconciliationRequestSchema;
143
- output: typeof ControllerReconciliationEventSchema;
144
- },
145
- /**
146
- * @generated from rpc world.ControllerService.RestartConnector
147
- */
148
- restartConnector: {
149
- methodKind: "unary";
150
- input: typeof RestartConnectorRequestSchema;
151
- output: typeof RestartConnectorResponseSchema;
152
- },
153
- }>;
154
-
@@ -1,66 +0,0 @@
1
- // @generated by protoc-gen-es v2.10.2 with parameter "target=js+dts,import_extension=.js"
2
- // @generated from file controller.proto (package world, syntax proto3)
3
- /* eslint-disable */
4
-
5
- import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
- import { file_world } from "./world_pb.js";
7
-
8
- /**
9
- * Describes the file controller.proto.
10
- */
11
- export const file_controller = /*@__PURE__*/
12
- fileDesc("ChBjb250cm9sbGVyLnByb3RvEgV3b3JsZCI1Ch9Db250cm9sbGVyUmVjb25jaWxpYXRpb25SZXF1ZXN0EhIKCmNvbnRyb2xsZXIYASABKAkifQoiQ29udHJvbGxlckRldmljZUNvbmZpZ3VyYXRpb25FdmVudBI4CgF0GAEgASgOMi0ud29ybGQuQ29udHJvbGxlckRldmljZUNvbmZpZ3VyYXRpb25FdmVudFR5cGUSHQoGY29uZmlnGAIgASgLMg0ud29ybGQuRW50aXR5ImUKHUNvbnRyb2xsZXJSZWNvbmNpbGlhdGlvbkV2ZW50EjsKBmNvbmZpZxgCIAEoCzIpLndvcmxkLkNvbnRyb2xsZXJEZXZpY2VDb25maWd1cmF0aW9uRXZlbnRIAEIHCgVldmVudCJAChdSZXN0YXJ0Q29ubmVjdG9yUmVxdWVzdBISCgpjb250cm9sbGVyGAEgASgJEhEKCWVudGl0eV9pZBgCIAEoCSIaChhSZXN0YXJ0Q29ubmVjdG9yUmVzcG9uc2UqsQEKJkNvbnRyb2xsZXJEZXZpY2VDb25maWd1cmF0aW9uRXZlbnRUeXBlEikKJUNvbnRyb2xsZXJEZXZpY2VDb25maWd1cmF0aW9uRXZlbnROZXcQABItCilDb250cm9sbGVyRGV2aWNlQ29uZmlndXJhdGlvbkV2ZW50Q2hhbmdlZBABEi0KKUNvbnRyb2xsZXJEZXZpY2VDb25maWd1cmF0aW9uRXZlbnRSZW1vdmVkEAIyxQEKEUNvbnRyb2xsZXJTZXJ2aWNlElsKCVJlY29uY2lsZRImLndvcmxkLkNvbnRyb2xsZXJSZWNvbmNpbGlhdGlvblJlcXVlc3QaJC53b3JsZC5Db250cm9sbGVyUmVjb25jaWxpYXRpb25FdmVudDABElMKEFJlc3RhcnRDb25uZWN0b3ISHi53b3JsZC5SZXN0YXJ0Q29ubmVjdG9yUmVxdWVzdBofLndvcmxkLlJlc3RhcnRDb25uZWN0b3JSZXNwb25zZUIgWh5naXRodWIuY29tL3Byb2plY3RxYWkvcHJvdG8vZ29iBnByb3RvMw", [file_world]);
13
-
14
- /**
15
- * Describes the message world.ControllerReconciliationRequest.
16
- * Use `create(ControllerReconciliationRequestSchema)` to create a new message.
17
- */
18
- export const ControllerReconciliationRequestSchema = /*@__PURE__*/
19
- messageDesc(file_controller, 0);
20
-
21
- /**
22
- * Describes the message world.ControllerDeviceConfigurationEvent.
23
- * Use `create(ControllerDeviceConfigurationEventSchema)` to create a new message.
24
- */
25
- export const ControllerDeviceConfigurationEventSchema = /*@__PURE__*/
26
- messageDesc(file_controller, 1);
27
-
28
- /**
29
- * Describes the message world.ControllerReconciliationEvent.
30
- * Use `create(ControllerReconciliationEventSchema)` to create a new message.
31
- */
32
- export const ControllerReconciliationEventSchema = /*@__PURE__*/
33
- messageDesc(file_controller, 2);
34
-
35
- /**
36
- * Describes the message world.RestartConnectorRequest.
37
- * Use `create(RestartConnectorRequestSchema)` to create a new message.
38
- */
39
- export const RestartConnectorRequestSchema = /*@__PURE__*/
40
- messageDesc(file_controller, 3);
41
-
42
- /**
43
- * Describes the message world.RestartConnectorResponse.
44
- * Use `create(RestartConnectorResponseSchema)` to create a new message.
45
- */
46
- export const RestartConnectorResponseSchema = /*@__PURE__*/
47
- messageDesc(file_controller, 4);
48
-
49
- /**
50
- * Describes the enum world.ControllerDeviceConfigurationEventType.
51
- */
52
- export const ControllerDeviceConfigurationEventTypeSchema = /*@__PURE__*/
53
- enumDesc(file_controller, 0);
54
-
55
- /**
56
- * @generated from enum world.ControllerDeviceConfigurationEventType
57
- */
58
- export const ControllerDeviceConfigurationEventType = /*@__PURE__*/
59
- tsEnum(ControllerDeviceConfigurationEventTypeSchema);
60
-
61
- /**
62
- * @generated from service world.ControllerService
63
- */
64
- export const ControllerService = /*@__PURE__*/
65
- serviceDesc(file_controller, 0);
66
-