@dxos/protocols 0.8.1-main.ba2dec9 → 0.8.1-staging.31c3ee1

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 (79) hide show
  1. package/dist/cjs/src/buf/proto/gen/dxos/client/services_pb.d.ts +98 -0
  2. package/dist/cjs/src/buf/proto/gen/dxos/client/services_pb.d.ts.map +1 -1
  3. package/dist/cjs/src/buf/proto/gen/dxos/client/services_pb.js +44 -19
  4. package/dist/cjs/src/buf/proto/gen/dxos/client/services_pb.js.map +1 -1
  5. package/dist/cjs/src/buf/proto/gen/dxos/edge/calls_pb.d.ts +35 -16
  6. package/dist/cjs/src/buf/proto/gen/dxos/edge/calls_pb.d.ts.map +1 -1
  7. package/dist/cjs/src/buf/proto/gen/dxos/edge/calls_pb.js +12 -6
  8. package/dist/cjs/src/buf/proto/gen/dxos/edge/calls_pb.js.map +1 -1
  9. package/dist/cjs/src/edge-error.d.ts +26 -0
  10. package/dist/cjs/src/edge-error.d.ts.map +1 -0
  11. package/dist/cjs/src/edge-error.js +63 -0
  12. package/dist/cjs/src/edge-error.js.map +1 -0
  13. package/dist/cjs/src/edge.d.ts +34 -25
  14. package/dist/cjs/src/edge.d.ts.map +1 -1
  15. package/dist/cjs/src/edge.js +13 -57
  16. package/dist/cjs/src/edge.js.map +1 -1
  17. package/dist/cjs/src/index.d.ts +2 -0
  18. package/dist/cjs/src/index.d.ts.map +1 -1
  19. package/dist/cjs/src/index.js +2 -0
  20. package/dist/cjs/src/index.js.map +1 -1
  21. package/dist/cjs/src/proto/gen/dxos/client/services.d.ts +42 -0
  22. package/dist/cjs/src/proto/gen/dxos/client/services.d.ts.map +1 -1
  23. package/dist/cjs/src/proto/gen/dxos/client/services.js.map +1 -1
  24. package/dist/cjs/src/proto/gen/dxos/edge/calls.d.ts +16 -11
  25. package/dist/cjs/src/proto/gen/dxos/edge/calls.d.ts.map +1 -1
  26. package/dist/cjs/src/proto/gen/index.d.ts +7 -1
  27. package/dist/cjs/src/proto/gen/index.d.ts.map +1 -1
  28. package/dist/cjs/src/proto/gen/index.js +1 -1
  29. package/dist/cjs/src/proto/gen/index.js.map +1 -1
  30. package/dist/cjs/src/space-archive.d.ts +55 -0
  31. package/dist/cjs/src/space-archive.d.ts.map +1 -0
  32. package/dist/cjs/src/space-archive.js +29 -0
  33. package/dist/cjs/src/space-archive.js.map +1 -0
  34. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  35. package/dist/esm/src/buf/proto/gen/dxos/client/services_pb.d.ts +98 -0
  36. package/dist/esm/src/buf/proto/gen/dxos/client/services_pb.d.ts.map +1 -1
  37. package/dist/esm/src/buf/proto/gen/dxos/client/services_pb.js +42 -17
  38. package/dist/esm/src/buf/proto/gen/dxos/client/services_pb.js.map +1 -1
  39. package/dist/esm/src/buf/proto/gen/dxos/edge/calls_pb.d.ts +35 -16
  40. package/dist/esm/src/buf/proto/gen/dxos/edge/calls_pb.d.ts.map +1 -1
  41. package/dist/esm/src/buf/proto/gen/dxos/edge/calls_pb.js +11 -5
  42. package/dist/esm/src/buf/proto/gen/dxos/edge/calls_pb.js.map +1 -1
  43. package/dist/esm/src/edge-error.d.ts +26 -0
  44. package/dist/esm/src/edge-error.d.ts.map +1 -0
  45. package/dist/esm/src/edge-error.js +62 -0
  46. package/dist/esm/src/edge-error.js.map +1 -0
  47. package/dist/esm/src/edge.d.ts +34 -25
  48. package/dist/esm/src/edge.d.ts.map +1 -1
  49. package/dist/esm/src/edge.js +12 -58
  50. package/dist/esm/src/edge.js.map +1 -1
  51. package/dist/esm/src/index.d.ts +2 -0
  52. package/dist/esm/src/index.d.ts.map +1 -1
  53. package/dist/esm/src/index.js +2 -0
  54. package/dist/esm/src/index.js.map +1 -1
  55. package/dist/esm/src/proto/gen/dxos/client/services.d.ts +42 -0
  56. package/dist/esm/src/proto/gen/dxos/client/services.d.ts.map +1 -1
  57. package/dist/esm/src/proto/gen/dxos/client/services.js.map +1 -1
  58. package/dist/esm/src/proto/gen/dxos/edge/calls.d.ts +16 -11
  59. package/dist/esm/src/proto/gen/dxos/edge/calls.d.ts.map +1 -1
  60. package/dist/esm/src/proto/gen/index.d.ts +7 -1
  61. package/dist/esm/src/proto/gen/index.d.ts.map +1 -1
  62. package/dist/esm/src/proto/gen/index.js +1 -1
  63. package/dist/esm/src/proto/gen/index.js.map +1 -1
  64. package/dist/esm/src/space-archive.d.ts +55 -0
  65. package/dist/esm/src/space-archive.d.ts.map +1 -0
  66. package/dist/esm/src/space-archive.js +26 -0
  67. package/dist/esm/src/space-archive.js.map +1 -0
  68. package/package.json +7 -7
  69. package/src/buf/proto/gen/dxos/client/services_pb.ts +131 -17
  70. package/src/buf/proto/gen/dxos/edge/calls_pb.ts +40 -19
  71. package/src/edge-error.ts +79 -0
  72. package/src/edge.ts +30 -71
  73. package/src/index.ts +2 -0
  74. package/src/proto/dxos/client/services.proto +26 -0
  75. package/src/proto/dxos/edge/calls.proto +16 -9
  76. package/src/proto/gen/dxos/client/services.ts +42 -0
  77. package/src/proto/gen/dxos/edge/calls.ts +15 -11
  78. package/src/proto/gen/index.ts +8 -2
  79. package/src/space-archive.ts +66 -0
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EdgeErrorData, type EdgeHttpFailure } from './edge';
6
+
7
+ export class EdgeCallFailedError extends Error {
8
+ public static fromProcessingFailureCause(cause: Error) {
9
+ return new EdgeCallFailedError({
10
+ reason: 'Error processing request.',
11
+ isRetryable: true,
12
+ cause,
13
+ });
14
+ }
15
+
16
+ public static fromHttpFailure(response: Response) {
17
+ return new EdgeCallFailedError({
18
+ reason: `HTTP code ${response.status}: ${response.statusText}.`,
19
+ isRetryable: isRetryableCode(response.status),
20
+ retryAfterMs: getRetryAfterMillis(response),
21
+ });
22
+ }
23
+
24
+ public static fromUnsuccessfulResponse(response: Response, body: EdgeHttpFailure) {
25
+ return new EdgeCallFailedError({
26
+ reason: body.reason,
27
+ errorData: body.errorData,
28
+ isRetryable: body.errorData == null && response.headers.has('Retry-After'),
29
+ retryAfterMs: getRetryAfterMillis(response),
30
+ });
31
+ }
32
+
33
+ readonly reason: string;
34
+ readonly errorData?: EdgeErrorData;
35
+ readonly isRetryable?: boolean;
36
+ readonly retryAfterMs?: number;
37
+
38
+ constructor(args: {
39
+ reason: string;
40
+ isRetryable?: boolean;
41
+ errorData?: EdgeErrorData;
42
+ retryAfterMs?: number;
43
+ cause?: Error;
44
+ }) {
45
+ super(args.reason, { cause: args.cause });
46
+ this.reason = args.reason;
47
+ this.errorData = args.errorData;
48
+ this.retryAfterMs = args.retryAfterMs;
49
+ this.isRetryable = Boolean(args.isRetryable);
50
+ }
51
+ }
52
+
53
+ export class EdgeAuthChallengeError extends EdgeCallFailedError {
54
+ constructor(
55
+ public readonly challenge: string,
56
+ errorData: EdgeErrorData,
57
+ ) {
58
+ super({ reason: 'Auth challenge.', errorData, isRetryable: false });
59
+ }
60
+ }
61
+
62
+ const getRetryAfterMillis = (response: Response) => {
63
+ const retryAfter = Number(response.headers.get('Retry-After'));
64
+ return Number.isNaN(retryAfter) || retryAfter === 0 ? undefined : retryAfter * 1000;
65
+ };
66
+
67
+ export const createRetryableHttpFailure = (args: { reason: any; retryAfterSeconds: number }) => {
68
+ return new Response(JSON.stringify({ success: false, reason: args.reason }), {
69
+ headers: { 'Retry-After': String(args.retryAfterSeconds) },
70
+ });
71
+ };
72
+
73
+ const isRetryableCode = (status: number) => {
74
+ if (status === 501) {
75
+ // Not Implemented
76
+ return false;
77
+ }
78
+ return !(status >= 400 && status < 500);
79
+ };
package/src/edge.ts CHANGED
@@ -2,7 +2,9 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type SpaceId } from '@dxos/keys';
5
+ import { Schema as S } from 'effect';
6
+
7
+ import { SpaceId } from '@dxos/keys';
6
8
 
7
9
  // TODO(burdon): Rename EdgerRouterEndpoint?
8
10
  export enum EdgeService {
@@ -83,6 +85,7 @@ export type RecoverIdentityRequest = {
83
85
  controlFeedKey: string;
84
86
  lookupKey?: string;
85
87
  signature?: RecoverIdentitySignature;
88
+ token?: string;
86
89
  };
87
90
 
88
91
  export type RecoverIdentityResponseBody = {
@@ -132,87 +135,43 @@ export type UploadFunctionResponseBody = {
132
135
  };
133
136
  };
134
137
 
138
+ export type CreateSpaceRequest = {
139
+ agentKey: string;
140
+ };
141
+
142
+ export type CreateSpaceResponseBody = {
143
+ spaceKey: string;
144
+ spaceId: string;
145
+ automergeRoot: string;
146
+ };
147
+
135
148
  export enum EdgeAgentStatus {
136
149
  ACTIVE = 'active',
137
150
  INACTIVE = 'inactive',
138
151
  NOT_FOUND = 'not_found',
139
152
  }
140
153
 
141
- export class EdgeCallFailedError extends Error {
142
- public static fromProcessingFailureCause(cause: Error) {
143
- return new EdgeCallFailedError({
144
- reason: 'Error processing request.',
145
- isRetryable: true,
146
- cause,
147
- });
148
- }
149
-
150
- public static fromHttpFailure(response: Response) {
151
- return new EdgeCallFailedError({
152
- reason: `HTTP code ${response.status}: ${response.statusText}.`,
153
- isRetryable: isRetryableCode(response.status),
154
- retryAfterMs: getRetryAfterMillis(response),
155
- });
156
- }
157
-
158
- public static fromUnsuccessfulResponse(response: Response, body: EdgeHttpFailure) {
159
- return new EdgeCallFailedError({
160
- reason: body.reason,
161
- errorData: body.errorData,
162
- isRetryable: body.errorData == null && response.headers.has('Retry-After'),
163
- retryAfterMs: getRetryAfterMillis(response),
164
- });
165
- }
166
-
167
- readonly reason: string;
168
- readonly errorData?: EdgeErrorData;
169
- readonly isRetryable?: boolean;
170
- readonly retryAfterMs?: number;
171
-
172
- constructor(args: {
173
- reason: string;
174
- isRetryable?: boolean;
175
- errorData?: EdgeErrorData;
176
- retryAfterMs?: number;
177
- cause?: Error;
178
- }) {
179
- super(args.reason, { cause: args.cause });
180
- this.reason = args.reason;
181
- this.errorData = args.errorData;
182
- this.retryAfterMs = args.retryAfterMs;
183
- this.isRetryable = Boolean(args.isRetryable);
184
- }
185
- }
186
-
187
- export class EdgeAuthChallengeError extends EdgeCallFailedError {
188
- constructor(
189
- public readonly challenge: string,
190
- errorData: EdgeErrorData,
191
- ) {
192
- super({ reason: 'Auth challenge.', errorData, isRetryable: false });
193
- }
194
- }
195
-
196
154
  export type EdgeAuthChallenge = {
197
155
  type: 'auth_challenge';
198
156
  challenge: string;
199
157
  };
200
158
 
201
- const getRetryAfterMillis = (response: Response) => {
202
- const retryAfter = Number(response.headers.get('Retry-After'));
203
- return Number.isNaN(retryAfter) || retryAfter === 0 ? undefined : retryAfter * 1000;
204
- };
159
+ export enum OAuthProvider {
160
+ GOOGLE = 'google',
161
+ }
205
162
 
206
- export const createRetryableHttpFailure = (args: { reason: any; retryAfterSeconds: number }) => {
207
- return new Response(JSON.stringify({ success: false, reason: args.reason }), {
208
- headers: { 'Retry-After': String(args.retryAfterSeconds) },
209
- });
210
- };
163
+ export const InitiateOAuthFlowRequestSchema = S.Struct({
164
+ provider: S.Enums(OAuthProvider),
165
+ spaceId: S.String.pipe(S.filter(SpaceId.isValid)),
166
+ accessTokenId: S.String,
167
+ scopes: S.mutable(S.Array(S.String)),
168
+ });
169
+ export type InitiateOAuthFlowRequest = S.Schema.Type<typeof InitiateOAuthFlowRequestSchema>;
211
170
 
212
- const isRetryableCode = (status: number) => {
213
- if (status === 501) {
214
- // Not Implemented
215
- return false;
216
- }
217
- return !(status >= 400 && status < 500);
171
+ export type InitiateOAuthFlowResponse = {
172
+ authUrl: string;
218
173
  };
174
+
175
+ export type OAuthFlowResult =
176
+ | { success: true; accessToken: string; accessTokenId: string }
177
+ | { success: false; reason: string };
package/src/index.ts CHANGED
@@ -12,3 +12,5 @@ export * from './profile-archive.js';
12
12
  export * from './automerge.js';
13
13
  export * from './edge.js';
14
14
  export * from './queue.js';
15
+ export * from './space-archive.js';
16
+ export * from './edge-error.js';
@@ -144,6 +144,7 @@ message RecoverIdentityRequest {
144
144
  oneof request {
145
145
  string recovery_code = 1;
146
146
  ExternalSignature external = 2;
147
+ string token = 3;
147
148
  }
148
149
  }
149
150
 
@@ -433,6 +434,28 @@ message JoinBySpaceKeyRequest {
433
434
  dxos.keys.PublicKey space_key = 1;
434
435
  }
435
436
 
437
+ message SpaceArchive {
438
+ string filename = 1;
439
+ bytes contents = 2;
440
+ }
441
+
442
+ message ExportSpaceRequest {
443
+ string space_id = 1;
444
+ }
445
+
446
+ message ExportSpaceResponse {
447
+ SpaceArchive archive = 1;
448
+ }
449
+
450
+ message ImportSpaceRequest {
451
+ SpaceArchive archive = 1;
452
+ }
453
+
454
+ message ImportSpaceResponse {
455
+ /// the ID of the new space.
456
+ string new_space_id = 1;
457
+ }
458
+
436
459
  service SpacesService {
437
460
  rpc CreateSpace(google.protobuf.Empty) returns (Space);
438
461
  rpc UpdateSpace(UpdateSpaceRequest) returns (google.protobuf.Empty);
@@ -454,6 +477,9 @@ service SpacesService {
454
477
  rpc QueryCredentials(QueryCredentialsRequest) returns (stream dxos.halo.credentials.Credential);
455
478
 
456
479
  rpc CreateEpoch(CreateEpochRequest) returns (CreateEpochResponse);
480
+
481
+ rpc ExportSpace(ExportSpaceRequest) returns (ExportSpaceResponse);
482
+ rpc ImportSpace(ImportSpaceRequest) returns (ImportSpaceResponse);
457
483
  }
458
484
 
459
485
  //
@@ -4,6 +4,8 @@
4
4
 
5
5
  syntax = "proto3";
6
6
 
7
+ import "google/protobuf/any.proto";
8
+
7
9
  import "dxos/keys.proto";
8
10
 
9
11
  package dxos.edge.calls;
@@ -25,22 +27,27 @@ message UserState {
25
27
  bool speaking = 5;
26
28
  bool joined = 6;
27
29
  Tracks tracks = 7;
28
- optional Transcription transcription = 8;
30
+ map<string, Activity> activities = 8;
29
31
  }
30
32
 
31
33
  /**
32
- * Transcription settings.
34
+ * Activity state.
33
35
  * It will be merged across all users in the room based on the Lamport timestamp (last one wins).
34
36
  */
35
- message Transcription {
36
- bool enabled = 1;
37
+ message Activity {
38
+ LamportTimestamp lamport_timestamp = 1;
37
39
 
38
- LamportTimestamp lamport_timestamp = 2;
40
+ google.protobuf.Any payload = 10;
41
+ }
39
42
 
40
- /**
41
- * Transcription queue DXN.
42
- */
43
- string queue_dxn = 3;
43
+ /**
44
+ * Transcription state.
45
+ *
46
+ * Used to encode/decode the Any payload of a call activity for the transcription plugin.
47
+ */
48
+ message TranscriptionPayload {
49
+ bool enabled = 1;
50
+ string queue_dxn = 2;
44
51
  }
45
52
 
46
53
  /**
@@ -622,6 +622,7 @@ export interface RequestRecoveryChallengeResponse {
622
622
  export interface RecoverIdentityRequest {
623
623
  recoveryCode?: string;
624
624
  external?: RecoverIdentityRequest.ExternalSignature;
625
+ token?: string;
625
626
  }
626
627
  export namespace RecoverIdentityRequest {
627
628
  /**
@@ -1170,6 +1171,45 @@ export interface JoinSpaceResponse {
1170
1171
  export interface JoinBySpaceKeyRequest {
1171
1172
  spaceKey: ReturnType<(typeof substitutions)["dxos.keys.PublicKey"]["decode"]>;
1172
1173
  }
1174
+ /**
1175
+ * Defined in:
1176
+ * {@link file://./../../../dxos/client/services.proto}
1177
+ */
1178
+ export interface SpaceArchive {
1179
+ filename: string;
1180
+ contents: Uint8Array;
1181
+ }
1182
+ /**
1183
+ * Defined in:
1184
+ * {@link file://./../../../dxos/client/services.proto}
1185
+ */
1186
+ export interface ExportSpaceRequest {
1187
+ spaceId: string;
1188
+ }
1189
+ /**
1190
+ * Defined in:
1191
+ * {@link file://./../../../dxos/client/services.proto}
1192
+ */
1193
+ export interface ExportSpaceResponse {
1194
+ archive: SpaceArchive;
1195
+ }
1196
+ /**
1197
+ * Defined in:
1198
+ * {@link file://./../../../dxos/client/services.proto}
1199
+ */
1200
+ export interface ImportSpaceRequest {
1201
+ archive: SpaceArchive;
1202
+ }
1203
+ /**
1204
+ * Defined in:
1205
+ * {@link file://./../../../dxos/client/services.proto}
1206
+ */
1207
+ export interface ImportSpaceResponse {
1208
+ /**
1209
+ * the ID of the new space.
1210
+ */
1211
+ newSpaceId: string;
1212
+ }
1173
1213
  /**
1174
1214
  * Defined in:
1175
1215
  * {@link file://./../../../dxos/client/services.proto}
@@ -1198,6 +1238,8 @@ export interface SpacesService {
1198
1238
  */
1199
1239
  queryCredentials: (request: QueryCredentialsRequest, options?: RequestOptions) => Stream<dxos_halo_credentials.Credential>;
1200
1240
  createEpoch: (request: CreateEpochRequest, options?: RequestOptions) => Promise<CreateEpochResponse>;
1241
+ exportSpace: (request: ExportSpaceRequest, options?: RequestOptions) => Promise<ExportSpaceResponse>;
1242
+ importSpace: (request: ImportSpaceRequest, options?: RequestOptions) => Promise<ImportSpaceResponse>;
1201
1243
  }
1202
1244
  /**
1203
1245
  * Defined in:
@@ -117,25 +117,29 @@ export interface UserState {
117
117
  speaking: boolean;
118
118
  joined: boolean;
119
119
  tracks: Tracks;
120
- /**
121
- * Options:
122
- * - proto3_optional = true
123
- */
124
- transcription?: Transcription;
120
+ activities?: Partial<Record<string, Activity>>;
125
121
  }
126
122
  /**
127
- * Transcription settings.
123
+ * Activity state.
128
124
  * It will be merged across all users in the room based on the Lamport timestamp (last one wins).
129
125
  *
130
126
  * Defined in:
131
127
  * {@link file://./../../../dxos/edge/calls.proto}
132
128
  */
133
- export interface Transcription {
134
- enabled: boolean;
129
+ export interface Activity {
135
130
  lamportTimestamp: LamportTimestamp;
136
- /**
137
- * Transcription queue DXN.
138
- */
131
+ payload: ReturnType<(typeof substitutions)["google.protobuf.Any"]["decode"]>;
132
+ }
133
+ /**
134
+ * Transcription state.
135
+ *
136
+ * Used to encode/decode the Any payload of a call activity for the transcription plugin.
137
+ *
138
+ * Defined in:
139
+ * {@link file://./../../../dxos/edge/calls.proto}
140
+ */
141
+ export interface TranscriptionPayload {
142
+ enabled: boolean;
139
143
  queueDxn: string;
140
144
  }
141
145
  /**