@dxos/halo 0.0.0 → 0.11.1
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/CHANGELOG.md +17 -0
- package/dist/lib/index.mjs +272 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +1 -7
- package/package.json +4 -4
- package/vite.config.ts +7 -0
- package/dist/lib/neutral/index.mjs +0 -186
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @dxos/halo
|
|
2
|
+
|
|
3
|
+
## 0.11.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @dxos/errors@0.11.1
|
|
8
|
+
- @dxos/keys@0.11.1
|
|
9
|
+
|
|
10
|
+
## 0.11.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 6439417: Publish the HALO Effect service packages (`@dxos/halo`, `@dxos/halo-adapter-client`, `@dxos/halo-react`) and begin migrating Composer/plugins off direct `@dxos/client` HALO access onto them: `plugin-client` now provides `Identity.Service` / `Space.Service` layer specs and wraps the app in `HaloProvider`.
|
|
15
|
+
- Updated dependencies [6a03a30]
|
|
16
|
+
- @dxos/keys@0.11.0
|
|
17
|
+
- @dxos/errors@0.11.0
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Schema from "effect/Schema";
|
|
4
|
+
import * as Stream from "effect/Stream";
|
|
5
|
+
import { IdentityDid, SpaceId } from "@dxos/keys";
|
|
6
|
+
import { BaseError } from "@dxos/errors";
|
|
7
|
+
//#region \0rolldown/runtime.js
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __exportAll = (all, no_symbols) => {
|
|
10
|
+
let target = {};
|
|
11
|
+
for (var name in all) __defProp(target, name, {
|
|
12
|
+
get: all[name],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
16
|
+
return target;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/Identity.ts
|
|
20
|
+
var Identity_exports = /* @__PURE__ */ __exportAll({
|
|
21
|
+
Credential: () => Credential,
|
|
22
|
+
DeviceInfo: () => DeviceInfo,
|
|
23
|
+
DeviceKind: () => DeviceKind,
|
|
24
|
+
Info: () => Info$1,
|
|
25
|
+
Service: () => Service$1,
|
|
26
|
+
create: () => create$1,
|
|
27
|
+
credentials: () => credentials,
|
|
28
|
+
devices: () => devices,
|
|
29
|
+
getDevicesSnapshot: () => getDevicesSnapshot,
|
|
30
|
+
getSnapshot: () => getSnapshot,
|
|
31
|
+
grantServiceAccess: () => grantServiceAccess,
|
|
32
|
+
identity: () => identity,
|
|
33
|
+
invitations: () => invitations$1,
|
|
34
|
+
join: () => join$1,
|
|
35
|
+
recover: () => recover,
|
|
36
|
+
share: () => share$1,
|
|
37
|
+
updateProfile: () => updateProfile
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Device kind (platform / host class). Replaces the legacy protobuf `DeviceType` enum;
|
|
41
|
+
* `agent`/`agent-managed` denote EDGE- or Hub-hosted agent devices.
|
|
42
|
+
*/
|
|
43
|
+
var DeviceKind = Schema.Literal("unknown", "browser", "native", "mobile", "agent", "agent-managed");
|
|
44
|
+
/**
|
|
45
|
+
* Public view of the local identity. Keyed by the DID; `identityKey` (hex) is retained for
|
|
46
|
+
* consumers that seed deterministic UI (avatar/hue) or address the legacy credential key.
|
|
47
|
+
* `data` carries arbitrary profile metadata (e.g. avatar emoji, hue).
|
|
48
|
+
*/
|
|
49
|
+
var Info$1 = Schema.Struct({
|
|
50
|
+
did: IdentityDid,
|
|
51
|
+
/** Hex-encoded identity (credential) key, when known. */
|
|
52
|
+
identityKey: Schema.optional(Schema.String),
|
|
53
|
+
displayName: Schema.optional(Schema.String),
|
|
54
|
+
/** Arbitrary profile metadata. */
|
|
55
|
+
data: Schema.optional(Schema.Record({
|
|
56
|
+
key: Schema.String,
|
|
57
|
+
value: Schema.Any
|
|
58
|
+
}))
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Public view of a device belonging to the local identity. Replaces the legacy `Device` proxy
|
|
62
|
+
* type (`deviceKey` → `key`).
|
|
63
|
+
*/
|
|
64
|
+
var DeviceInfo = Schema.Struct({
|
|
65
|
+
/** Hex-encoded device key. */
|
|
66
|
+
key: Schema.String,
|
|
67
|
+
kind: Schema.optional(DeviceKind),
|
|
68
|
+
label: Schema.optional(Schema.String),
|
|
69
|
+
/** Whether this device is the local (current) device. */
|
|
70
|
+
current: Schema.Boolean
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Public view of a HALO credential. Replaces direct consumption of the protobuf `Credential`:
|
|
74
|
+
* `type` is the subject assertion's `@type`, `id` its hex-encoded credential id.
|
|
75
|
+
*/
|
|
76
|
+
var Credential = Schema.Struct({
|
|
77
|
+
/** Hex-encoded credential id, when assigned. */
|
|
78
|
+
id: Schema.optional(Schema.String),
|
|
79
|
+
/** The subject assertion's `@type` (e.g. `dxos.halo.credentials.IdentityRecovery`). */
|
|
80
|
+
type: Schema.String,
|
|
81
|
+
issuanceDate: Schema.optional(Schema.DateFromSelf)
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* Identity and device management, plus device invitations. `share`/`join` construct
|
|
85
|
+
* {@link Invitation.Flow}s driven through the {@link Invitation} flow verbs; `invitations`
|
|
86
|
+
* observes the active (host-created) device-invitation flows.
|
|
87
|
+
*/
|
|
88
|
+
var Service$1 = class extends Context.Tag("@dxos/halo/Identity")() {};
|
|
89
|
+
/** The local identity as a current-value stream (requires {@link Service}). */
|
|
90
|
+
var identity = Stream.unwrap(Effect.map(Service$1, (service) => service.identity));
|
|
91
|
+
/** Synchronous snapshot of the local identity (requires {@link Service}). */
|
|
92
|
+
var getSnapshot = Effect.map(Service$1, (service) => service.getSnapshot());
|
|
93
|
+
/** Create the local identity (requires {@link Service}). */
|
|
94
|
+
var create$1 = (options) => Effect.flatMap(Service$1, (service) => service.create(options));
|
|
95
|
+
/** Re-admit this device via a recovery credential (requires {@link Service}). */
|
|
96
|
+
var recover = (args) => Effect.flatMap(Service$1, (service) => service.recover(args));
|
|
97
|
+
/** Update the identity profile (requires {@link Service}). */
|
|
98
|
+
var updateProfile = (profile) => Effect.flatMap(Service$1, (service) => service.updateProfile(profile));
|
|
99
|
+
/** Devices belonging to the local identity as a current-value stream (requires {@link Service}). */
|
|
100
|
+
var devices = Stream.unwrap(Effect.map(Service$1, (service) => service.devices));
|
|
101
|
+
/** Synchronous snapshot of the local identity's devices (requires {@link Service}). */
|
|
102
|
+
var getDevicesSnapshot = Effect.map(Service$1, (service) => service.getDevicesSnapshot());
|
|
103
|
+
/** HALO credentials as a current-value stream (requires {@link Service}). */
|
|
104
|
+
var credentials = Stream.unwrap(Effect.map(Service$1, (service) => service.credentials));
|
|
105
|
+
/** Grant the identity access to an EDGE/Hub service (requires {@link Service}). */
|
|
106
|
+
var grantServiceAccess = (options) => Effect.flatMap(Service$1, (service) => service.grantServiceAccess(options));
|
|
107
|
+
/** Initiate a device invitation (requires {@link Service}). */
|
|
108
|
+
var share$1 = (options) => Effect.flatMap(Service$1, (service) => service.share(options));
|
|
109
|
+
/** Redeem a device-invitation code (requires {@link Service}). */
|
|
110
|
+
var join$1 = (code) => Effect.flatMap(Service$1, (service) => service.join(code));
|
|
111
|
+
/** Active device-invitation flows as a current-value stream (requires {@link Service}). */
|
|
112
|
+
var invitations$1 = Stream.unwrap(Effect.map(Service$1, (service) => service.invitations));
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/Invitation.ts
|
|
115
|
+
var Invitation_exports = /* @__PURE__ */ __exportAll({
|
|
116
|
+
authenticate: () => authenticate,
|
|
117
|
+
cancel: () => cancel,
|
|
118
|
+
code: () => code,
|
|
119
|
+
events: () => events
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Supply the auth code to a flow awaiting authentication. Flow verbs operate on a {@link Flow}
|
|
123
|
+
* handle directly and require no service; the active-flow set is queried through
|
|
124
|
+
* {@link Identity} (device invitations) and {@link Space} (space invitations).
|
|
125
|
+
*/
|
|
126
|
+
var authenticate = (flow, code) => flow.authenticate(code);
|
|
127
|
+
/** Abort a flow. */
|
|
128
|
+
var cancel = (flow) => flow.cancel();
|
|
129
|
+
/** Lifecycle event stream of a flow. */
|
|
130
|
+
var events = (flow) => flow.events;
|
|
131
|
+
/** Encoded, shareable code for a flow. */
|
|
132
|
+
var code = (flow) => flow.code;
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region src/Space.ts
|
|
135
|
+
var Space_exports = /* @__PURE__ */ __exportAll({
|
|
136
|
+
Access: () => Access,
|
|
137
|
+
EdgeReplication: () => EdgeReplication,
|
|
138
|
+
Info: () => Info,
|
|
139
|
+
Member: () => Member,
|
|
140
|
+
MembershipPolicy: () => MembershipPolicy,
|
|
141
|
+
Service: () => Service,
|
|
142
|
+
State: () => State,
|
|
143
|
+
create: () => create,
|
|
144
|
+
exportSpace: () => exportSpace,
|
|
145
|
+
get: () => get,
|
|
146
|
+
importSpace: () => importSpace,
|
|
147
|
+
invitations: () => invitations,
|
|
148
|
+
join: () => join,
|
|
149
|
+
members: () => members,
|
|
150
|
+
removeMember: () => removeMember,
|
|
151
|
+
setEdgeReplication: () => setEdgeReplication,
|
|
152
|
+
share: () => share,
|
|
153
|
+
spaces: () => spaces,
|
|
154
|
+
updateMemberRole: () => updateMemberRole,
|
|
155
|
+
waitReady: () => waitReady
|
|
156
|
+
});
|
|
157
|
+
/**
|
|
158
|
+
* Capability level granted to a space member, matching the Keyhive `Access` enum. Ordered; each
|
|
159
|
+
* implies the previous: `pull` < `read` < `edit` < `admin`. Replaces the legacy
|
|
160
|
+
* `SpaceMember.Role` enum.
|
|
161
|
+
*/
|
|
162
|
+
var Access = Schema.Literal("pull", "read", "edit", "admin");
|
|
163
|
+
/**
|
|
164
|
+
* Lifecycle state of a space. Replaces the legacy `SpaceState` protobuf enum (subset relevant to
|
|
165
|
+
* consumers).
|
|
166
|
+
*/
|
|
167
|
+
var State = Schema.Literal("inactive", "closed", "ready");
|
|
168
|
+
/**
|
|
169
|
+
* Who may join a space. Replaces the legacy `MembershipPolicy` protobuf enum: `invite` admits
|
|
170
|
+
* members via invitation only; `locked` admits no new members.
|
|
171
|
+
*/
|
|
172
|
+
var MembershipPolicy = Schema.Literal("invite", "locked");
|
|
173
|
+
/**
|
|
174
|
+
* Whether a space replicates through EDGE. Replaces the legacy `EdgeReplicationSetting` protobuf
|
|
175
|
+
* enum.
|
|
176
|
+
*/
|
|
177
|
+
var EdgeReplication = Schema.Literal("disabled", "enabled");
|
|
178
|
+
/**
|
|
179
|
+
* A space membership entry. Membership (HALO) only — liveness/presence is a separate concern
|
|
180
|
+
* (see API_AUDIT.md §3.6).
|
|
181
|
+
*/
|
|
182
|
+
var Member = Schema.Struct({
|
|
183
|
+
/** DID of the member identity, when known. */
|
|
184
|
+
did: Schema.optional(IdentityDid),
|
|
185
|
+
/** Hex-encoded identity key of the member, for avatar/presence keying. */
|
|
186
|
+
identityKey: Schema.optional(Schema.String),
|
|
187
|
+
displayName: Schema.optional(Schema.String),
|
|
188
|
+
/** Arbitrary profile metadata (e.g. avatar emoji, hue). */
|
|
189
|
+
data: Schema.optional(Schema.Record({
|
|
190
|
+
key: Schema.String,
|
|
191
|
+
value: Schema.Any
|
|
192
|
+
})),
|
|
193
|
+
role: Access,
|
|
194
|
+
/** Whether the member is currently online. */
|
|
195
|
+
online: Schema.Boolean
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* Public view of a space. A plain snapshot — database access stays on the ECHO `Database`
|
|
199
|
+
* service keyed by {@link SpaceId}, not on this value.
|
|
200
|
+
*/
|
|
201
|
+
var Info = Schema.Struct({
|
|
202
|
+
id: SpaceId,
|
|
203
|
+
name: Schema.optional(Schema.String),
|
|
204
|
+
state: State
|
|
205
|
+
});
|
|
206
|
+
/**
|
|
207
|
+
* Space management and membership, plus space invitations. `share`/`join` construct
|
|
208
|
+
* {@link Invitation.Flow}s driven through the {@link Invitation} flow verbs; `invitations`
|
|
209
|
+
* observes the active (host-created) space-invitation flows.
|
|
210
|
+
*/
|
|
211
|
+
var Service = class extends Context.Tag("@dxos/halo/Space")() {};
|
|
212
|
+
/** All spaces as a current-value stream (requires {@link Service}). */
|
|
213
|
+
var spaces = Stream.unwrap(Effect.map(Service, (service) => service.spaces));
|
|
214
|
+
/** Resolve a space by id (requires {@link Service}). */
|
|
215
|
+
var get = (id) => Effect.flatMap(Service, (service) => service.get(id));
|
|
216
|
+
/** Create a new space (requires {@link Service}). */
|
|
217
|
+
var create = (options) => Effect.flatMap(Service, (service) => service.create(options));
|
|
218
|
+
/** Resolve once the space is ready (requires {@link Service}). */
|
|
219
|
+
var waitReady = (id) => Effect.flatMap(Service, (service) => service.waitReady(id));
|
|
220
|
+
/** Enable or disable EDGE replication for a space (requires {@link Service}). */
|
|
221
|
+
var setEdgeReplication = (id, setting) => Effect.flatMap(Service, (service) => service.setEdgeReplication(id, setting));
|
|
222
|
+
/** A space's membership as a current-value stream (requires {@link Service}). */
|
|
223
|
+
var members = (id) => Stream.unwrap(Effect.map(Service, (service) => service.members(id)));
|
|
224
|
+
/** Change a member's access level (requires {@link Service}). */
|
|
225
|
+
var updateMemberRole = (id, subject, role) => Effect.flatMap(Service, (service) => service.updateMemberRole(id, subject, role));
|
|
226
|
+
/** Remove a member (requires {@link Service}). */
|
|
227
|
+
var removeMember = (id, subject) => Effect.flatMap(Service, (service) => service.removeMember(id, subject));
|
|
228
|
+
/** Initiate a space invitation (requires {@link Service}). */
|
|
229
|
+
var share = (id, options) => Effect.flatMap(Service, (service) => service.share(id, options));
|
|
230
|
+
/** Redeem a space-invitation code (requires {@link Service}). */
|
|
231
|
+
var join = (code) => Effect.flatMap(Service, (service) => service.join(code));
|
|
232
|
+
/** A space's active invitation flows as a current-value stream (requires {@link Service}). */
|
|
233
|
+
var invitations = (id) => Stream.unwrap(Effect.map(Service, (service) => service.invitations(id)));
|
|
234
|
+
/** Export a space to an archive (requires {@link Service}). */
|
|
235
|
+
var exportSpace = (id) => Effect.flatMap(Service, (service) => service.export(id));
|
|
236
|
+
/** Import a space from an archive (requires {@link Service}). */
|
|
237
|
+
var importSpace = (archive, options) => Effect.flatMap(Service, (service) => service.import(archive, options));
|
|
238
|
+
//#endregion
|
|
239
|
+
//#region src/errors.ts
|
|
240
|
+
/**
|
|
241
|
+
* The acting principal lacks the capability required for the operation
|
|
242
|
+
* (e.g. delegating access above their own level, or revoking without causal seniority).
|
|
243
|
+
*/
|
|
244
|
+
var NotAuthorizedError = class extends BaseError.extend("NotAuthorizedError", "Not authorized") {};
|
|
245
|
+
/**
|
|
246
|
+
* The referenced principal (individual or group) is not known to the service.
|
|
247
|
+
*/
|
|
248
|
+
var UnknownPrincipalError = class extends BaseError.extend("UnknownPrincipalError", "Unknown principal") {};
|
|
249
|
+
/**
|
|
250
|
+
* A signed payload failed signature verification or its id does not match its key.
|
|
251
|
+
*/
|
|
252
|
+
var InvalidSignatureError = class extends BaseError.extend("InvalidSignatureError", "Invalid signature") {};
|
|
253
|
+
/**
|
|
254
|
+
* A membership operation references causal predecessors that have not been received.
|
|
255
|
+
*/
|
|
256
|
+
var MissingDependencyError = class extends BaseError.extend("MissingDependencyError", "Missing dependency") {};
|
|
257
|
+
/**
|
|
258
|
+
* An identity/device operation (create, recover, profile/device update, device invitation) failed.
|
|
259
|
+
*/
|
|
260
|
+
var IdentityError = class extends BaseError.extend("IdentityError", "Identity operation failed") {};
|
|
261
|
+
/**
|
|
262
|
+
* A space operation (create, query, membership, invitation, export/import) failed.
|
|
263
|
+
*/
|
|
264
|
+
var SpaceError = class extends BaseError.extend("SpaceError", "Space operation failed") {};
|
|
265
|
+
/**
|
|
266
|
+
* An invitation-lifecycle operation (authenticate, cancel) failed.
|
|
267
|
+
*/
|
|
268
|
+
var InvitationError = class extends BaseError.extend("InvitationError", "Invitation operation failed") {};
|
|
269
|
+
//#endregion
|
|
270
|
+
export { Identity_exports as Identity, IdentityError, InvalidSignatureError, Invitation_exports as Invitation, InvitationError, MissingDependencyError, NotAuthorizedError, Space_exports as Space, SpaceError, UnknownPrincipalError };
|
|
271
|
+
|
|
272
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/Identity.ts","../../src/Invitation.ts","../../src/Space.ts","../../src/errors.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport * as Stream from 'effect/Stream';\n\nimport { IdentityDid } from '@dxos/keys';\n\nimport { type IdentityError } from './errors';\nimport * as Invitation from './Invitation';\n\n/**\n * Device kind (platform / host class). Replaces the legacy protobuf `DeviceType` enum;\n * `agent`/`agent-managed` denote EDGE- or Hub-hosted agent devices.\n */\nexport const DeviceKind = Schema.Literal('unknown', 'browser', 'native', 'mobile', 'agent', 'agent-managed');\nexport type DeviceKind = typeof DeviceKind.Type;\n\n/**\n * Public view of the local identity. Keyed by the DID; `identityKey` (hex) is retained for\n * consumers that seed deterministic UI (avatar/hue) or address the legacy credential key.\n * `data` carries arbitrary profile metadata (e.g. avatar emoji, hue).\n */\nexport const Info = Schema.Struct({\n did: IdentityDid,\n /** Hex-encoded identity (credential) key, when known. */\n identityKey: Schema.optional(Schema.String),\n displayName: Schema.optional(Schema.String),\n /** Arbitrary profile metadata. */\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n});\nexport type Info = typeof Info.Type;\n\n/**\n * Public view of a device belonging to the local identity. Replaces the legacy `Device` proxy\n * type (`deviceKey` → `key`).\n */\nexport const DeviceInfo = Schema.Struct({\n /** Hex-encoded device key. */\n key: Schema.String,\n kind: Schema.optional(DeviceKind),\n label: Schema.optional(Schema.String),\n /** Whether this device is the local (current) device. */\n current: Schema.Boolean,\n});\nexport type DeviceInfo = typeof DeviceInfo.Type;\n\n/**\n * Public view of a HALO credential. Replaces direct consumption of the protobuf `Credential`:\n * `type` is the subject assertion's `@type`, `id` its hex-encoded credential id.\n */\nexport const Credential = Schema.Struct({\n /** Hex-encoded credential id, when assigned. */\n id: Schema.optional(Schema.String),\n /** The subject assertion's `@type` (e.g. `dxos.halo.credentials.IdentityRecovery`). */\n type: Schema.String,\n issuanceDate: Schema.optional(Schema.DateFromSelf),\n});\nexport type Credential = typeof Credential.Type;\n\n/**\n * Options for a self-issued `ServiceAccess` credential granting the identity access to an\n * EDGE/Hub service.\n */\nexport type ServiceAccessOptions = {\n /** Target server name (e.g. `hub.dxos.network`). */\n readonly serverName: string;\n /** Capabilities to grant (e.g. `['composer:beta']`). */\n readonly capabilities: readonly string[];\n};\n\n/**\n * Recovery credential presented to re-admit a device to an existing identity.\n */\nexport type RecoverArgs =\n | { readonly recoveryCode: string }\n | { readonly token: string }\n | { readonly recoveryProof: string };\n\n/**\n * Identity and device management, plus device invitations. `share`/`join` construct\n * {@link Invitation.Flow}s driven through the {@link Invitation} flow verbs; `invitations`\n * observes the active (host-created) device-invitation flows.\n */\nexport class Service extends Context.Tag('@dxos/halo/Identity')<\n Service,\n {\n /**\n * The local identity (`Option.none` when none exists) as a stream that emits the current\n * value immediately on subscription. Take the first element for a one-shot read; subscribe\n * for updates.\n */\n readonly identity: Stream.Stream<Option.Option<Info>>;\n /**\n * Synchronous snapshot of the local identity (`Option.none` when none exists). For imperative\n * callers (non-React, non-Effect) that need the current value without subscribing.\n */\n readonly getSnapshot: () => Option.Option<Info>;\n /**\n * Subscribe to local-identity changes (imperative). Invokes `callback` immediately with the\n * current value, then on each change. Returns an unsubscribe function.\n */\n readonly subscribe: (callback: (identity: Option.Option<Info>) => void) => () => void;\n /** Create the local identity (and its first device). */\n readonly create: (options?: { displayName?: string; deviceLabel?: string }) => Effect.Effect<Info, IdentityError>;\n /** Re-admit this device to an existing identity via a recovery credential. */\n readonly recover: (args: RecoverArgs) => Effect.Effect<Info, IdentityError>;\n /** Update the identity profile. */\n readonly updateProfile: (profile: {\n displayName?: string;\n data?: Record<string, unknown>;\n }) => Effect.Effect<Info, IdentityError>;\n /** Devices belonging to the local identity; emits the current set immediately. */\n readonly devices: Stream.Stream<readonly DeviceInfo[]>;\n /** Synchronous snapshot of the local identity's devices, for imperative callers. */\n readonly getDevicesSnapshot: () => readonly DeviceInfo[];\n /** HALO credentials of the local identity; emits the current set immediately. */\n readonly credentials: Stream.Stream<readonly Credential[]>;\n /**\n * Grant this identity access to an EDGE/Hub service by writing a `ServiceAccess` credential\n * (self-issued). Replaces hand-constructing the protobuf credential at the call site.\n */\n readonly grantServiceAccess: (options: ServiceAccessOptions) => Effect.Effect<void, IdentityError>;\n /** Initiate a device invitation (host side). */\n readonly share: (options?: Invitation.ShareOptions) => Effect.Effect<Invitation.Flow, IdentityError>;\n /** Redeem a device-invitation code on a new device (guest side). */\n readonly join: (code: string) => Effect.Effect<Invitation.Flow, IdentityError>;\n /** Active (host-created) device-invitation flows; emits the current set immediately. */\n readonly invitations: Stream.Stream<readonly Invitation.Flow[]>;\n }\n>() {}\n\n/** The local identity as a current-value stream (requires {@link Service}). */\nexport const identity: Stream.Stream<Option.Option<Info>, never, Service> = Stream.unwrap(\n Effect.map(Service, (service) => service.identity),\n);\n\n/** Synchronous snapshot of the local identity (requires {@link Service}). */\nexport const getSnapshot: Effect.Effect<Option.Option<Info>, never, Service> = Effect.map(Service, (service) =>\n service.getSnapshot(),\n);\n\n/** Create the local identity (requires {@link Service}). */\nexport const create = (options?: {\n displayName?: string;\n deviceLabel?: string;\n}): Effect.Effect<Info, IdentityError, Service> => Effect.flatMap(Service, (service) => service.create(options));\n\n/** Re-admit this device via a recovery credential (requires {@link Service}). */\nexport const recover = (args: RecoverArgs): Effect.Effect<Info, IdentityError, Service> =>\n Effect.flatMap(Service, (service) => service.recover(args));\n\n/** Update the identity profile (requires {@link Service}). */\nexport const updateProfile = (profile: {\n displayName?: string;\n data?: Record<string, unknown>;\n}): Effect.Effect<Info, IdentityError, Service> => Effect.flatMap(Service, (service) => service.updateProfile(profile));\n\n/** Devices belonging to the local identity as a current-value stream (requires {@link Service}). */\nexport const devices: Stream.Stream<readonly DeviceInfo[], never, Service> = Stream.unwrap(\n Effect.map(Service, (service) => service.devices),\n);\n\n/** Synchronous snapshot of the local identity's devices (requires {@link Service}). */\nexport const getDevicesSnapshot: Effect.Effect<readonly DeviceInfo[], never, Service> = Effect.map(Service, (service) =>\n service.getDevicesSnapshot(),\n);\n\n/** HALO credentials as a current-value stream (requires {@link Service}). */\nexport const credentials: Stream.Stream<readonly Credential[], never, Service> = Stream.unwrap(\n Effect.map(Service, (service) => service.credentials),\n);\n\n/** Grant the identity access to an EDGE/Hub service (requires {@link Service}). */\nexport const grantServiceAccess = (options: ServiceAccessOptions): Effect.Effect<void, IdentityError, Service> =>\n Effect.flatMap(Service, (service) => service.grantServiceAccess(options));\n\n/** Initiate a device invitation (requires {@link Service}). */\nexport const share = (options?: Invitation.ShareOptions): Effect.Effect<Invitation.Flow, IdentityError, Service> =>\n Effect.flatMap(Service, (service) => service.share(options));\n\n/** Redeem a device-invitation code (requires {@link Service}). */\nexport const join = (code: string): Effect.Effect<Invitation.Flow, IdentityError, Service> =>\n Effect.flatMap(Service, (service) => service.join(code));\n\n/** Active device-invitation flows as a current-value stream (requires {@link Service}). */\nexport const invitations: Stream.Stream<readonly Invitation.Flow[], never, Service> = Stream.unwrap(\n Effect.map(Service, (service) => service.invitations),\n);\n","//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport * as Stream from 'effect/Stream';\n\nimport { type IdentityDid, type SpaceId } from '@dxos/keys';\n\nimport { type InvitationError } from './errors';\n\n/**\n * Whether an invitation admits a device to an identity or a member to a space.\n */\nexport type Kind = 'device' | 'space';\n\n/**\n * How a guest proves it may redeem the invitation.\n * Mirrors the legacy `Invitation.AuthMethod` protobuf enum.\n */\nexport type AuthMethod = 'none' | 'shared-secret' | 'known-public-key';\n\n/**\n * Interactive (online host+guest handshake) vs delegated (offline-redeemable) invitation.\n * Mirrors the legacy `Invitation.Type` protobuf enum.\n */\nexport type Type = 'interactive' | 'delegated' | 'multiuse';\n\n/**\n * Options for initiating an invitation. Passed to {@link Identity.share} / {@link Space.share}.\n */\nexport type ShareOptions = {\n readonly authMethod?: AuthMethod;\n readonly type?: Type;\n readonly multiUse?: boolean;\n /** Restrict a `known-public-key` invitation to a specific guest (key/DID). */\n readonly target?: string;\n};\n\n/**\n * Outcome of a completed invitation flow.\n */\nexport type Result = {\n readonly spaceId?: SpaceId;\n readonly identityDid?: IdentityDid;\n};\n\n/**\n * A lifecycle event emitted by an invitation {@link Flow}. Terminal events are `success`,\n * `cancelled`, and `error`. Replaces polling on the legacy `Invitation.State` enum.\n */\nexport type Event =\n | { readonly _tag: 'connecting' }\n | { readonly _tag: 'connected' }\n | { readonly _tag: 'readyForAuthentication'; readonly authCode?: string }\n | { readonly _tag: 'authenticating' }\n | { readonly _tag: 'success'; readonly result: Result }\n | { readonly _tag: 'cancelled' }\n | { readonly _tag: 'error'; readonly message: string };\n\n/**\n * An in-flight invitation, host or guest side. Produced by {@link Identity.share}/`join` and\n * {@link Space.share}/`join`; its lifecycle is then driven through this handle and the\n * {@link Service}.\n */\nexport interface Flow {\n readonly id: string;\n readonly kind: Kind;\n /** Hot stream of lifecycle events; completes after a terminal event. */\n readonly events: Stream.Stream<Event>;\n /** Supply the auth code when the flow reaches `readyForAuthentication`. */\n authenticate(code: string): Effect.Effect<void, InvitationError>;\n /** Abort the flow. */\n cancel(): Effect.Effect<void>;\n /** Encoded, shareable invitation code (host side). */\n readonly code: Effect.Effect<string>;\n}\n\n/**\n * Supply the auth code to a flow awaiting authentication. Flow verbs operate on a {@link Flow}\n * handle directly and require no service; the active-flow set is queried through\n * {@link Identity} (device invitations) and {@link Space} (space invitations).\n */\nexport const authenticate = (flow: Flow, code: string): Effect.Effect<void, InvitationError> => flow.authenticate(code);\n\n/** Abort a flow. */\nexport const cancel = (flow: Flow): Effect.Effect<void> => flow.cancel();\n\n/** Lifecycle event stream of a flow. */\nexport const events = (flow: Flow): Stream.Stream<Event> => flow.events;\n\n/** Encoded, shareable code for a flow. */\nexport const code = (flow: Flow): Effect.Effect<string> => flow.code;\n","//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport * as Stream from 'effect/Stream';\n\nimport { IdentityDid, SpaceId } from '@dxos/keys';\n\nimport { type SpaceError } from './errors';\nimport * as Invitation from './Invitation';\n\n/**\n * Capability level granted to a space member, matching the Keyhive `Access` enum. Ordered; each\n * implies the previous: `pull` < `read` < `edit` < `admin`. Replaces the legacy\n * `SpaceMember.Role` enum.\n */\nexport const Access = Schema.Literal('pull', 'read', 'edit', 'admin');\nexport type Access = typeof Access.Type;\n\n/**\n * Lifecycle state of a space. Replaces the legacy `SpaceState` protobuf enum (subset relevant to\n * consumers).\n */\nexport const State = Schema.Literal('inactive', 'closed', 'ready');\nexport type State = typeof State.Type;\n\n/**\n * Who may join a space. Replaces the legacy `MembershipPolicy` protobuf enum: `invite` admits\n * members via invitation only; `locked` admits no new members.\n */\nexport const MembershipPolicy = Schema.Literal('invite', 'locked');\nexport type MembershipPolicy = typeof MembershipPolicy.Type;\n\n/**\n * Whether a space replicates through EDGE. Replaces the legacy `EdgeReplicationSetting` protobuf\n * enum.\n */\nexport const EdgeReplication = Schema.Literal('disabled', 'enabled');\nexport type EdgeReplication = typeof EdgeReplication.Type;\n\n/**\n * A space membership entry. Membership (HALO) only — liveness/presence is a separate concern\n * (see API_AUDIT.md §3.6).\n */\nexport const Member = Schema.Struct({\n /** DID of the member identity, when known. */\n did: Schema.optional(IdentityDid),\n /** Hex-encoded identity key of the member, for avatar/presence keying. */\n identityKey: Schema.optional(Schema.String),\n displayName: Schema.optional(Schema.String),\n /** Arbitrary profile metadata (e.g. avatar emoji, hue). */\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n role: Access,\n /** Whether the member is currently online. */\n online: Schema.Boolean,\n});\nexport type Member = typeof Member.Type;\n\n/**\n * Public view of a space. A plain snapshot — database access stays on the ECHO `Database`\n * service keyed by {@link SpaceId}, not on this value.\n */\nexport const Info = Schema.Struct({\n id: SpaceId,\n name: Schema.optional(Schema.String),\n state: State,\n});\nexport type Info = typeof Info.Type;\n\n/**\n * A serialized space archive (export/import payload).\n */\nexport type Archive = {\n readonly filename: string;\n readonly contents: Uint8Array;\n};\n\nexport type CreateOptions = {\n readonly name?: string;\n /** Tags applied to the new space. */\n readonly tags?: readonly string[];\n /** Who may join the space (defaults to `invite`). */\n readonly membershipPolicy?: MembershipPolicy;\n};\n\n/**\n * Space management and membership, plus space invitations. `share`/`join` construct\n * {@link Invitation.Flow}s driven through the {@link Invitation} flow verbs; `invitations`\n * observes the active (host-created) space-invitation flows.\n */\nexport class Service extends Context.Tag('@dxos/halo/Space')<\n Service,\n {\n /**\n * All spaces known to the local identity as a stream that emits the current set immediately\n * on subscription. Take the first element for a one-shot read; subscribe for updates.\n */\n readonly spaces: Stream.Stream<readonly Info[]>;\n /** Resolve a space by id. */\n readonly get: (id: SpaceId) => Effect.Effect<Option.Option<Info>>;\n /** Create a new space. */\n readonly create: (options?: CreateOptions) => Effect.Effect<Info, SpaceError>;\n /** Resolve once the space has reached the `ready` state. */\n readonly waitReady: (id: SpaceId) => Effect.Effect<void, SpaceError>;\n /** Enable or disable EDGE replication for a space. */\n readonly setEdgeReplication: (id: SpaceId, setting: EdgeReplication) => Effect.Effect<void, SpaceError>;\n /** A space's membership; emits the current set immediately, then on join/leave/role/presence. */\n readonly members: (id: SpaceId) => Stream.Stream<readonly Member[]>;\n /** Change a member's access level (Keyhive delegation). */\n readonly updateMemberRole: (id: SpaceId, subject: IdentityDid, role: Access) => Effect.Effect<void, SpaceError>;\n /** Remove a member (Keyhive revocation). */\n readonly removeMember: (id: SpaceId, subject: IdentityDid) => Effect.Effect<void, SpaceError>;\n /** Initiate a space invitation (host side). */\n readonly share: (id: SpaceId, options?: Invitation.ShareOptions) => Effect.Effect<Invitation.Flow, SpaceError>;\n /** Redeem a space-invitation code (guest side). */\n readonly join: (code: string) => Effect.Effect<Invitation.Flow, SpaceError>;\n /** A space's active (host-created) invitation flows; emits the current set immediately. */\n readonly invitations: (id: SpaceId) => Stream.Stream<readonly Invitation.Flow[]>;\n /** Export a space to an archive. */\n readonly export: (id: SpaceId) => Effect.Effect<Archive, SpaceError>;\n /** Import a space from an archive. */\n readonly import: (archive: Archive, options?: { tags?: readonly string[] }) => Effect.Effect<Info, SpaceError>;\n }\n>() {}\n\n/** All spaces as a current-value stream (requires {@link Service}). */\nexport const spaces: Stream.Stream<readonly Info[], never, Service> = Stream.unwrap(\n Effect.map(Service, (service) => service.spaces),\n);\n\n/** Resolve a space by id (requires {@link Service}). */\nexport const get = (id: SpaceId): Effect.Effect<Option.Option<Info>, never, Service> =>\n Effect.flatMap(Service, (service) => service.get(id));\n\n/** Create a new space (requires {@link Service}). */\nexport const create = (options?: CreateOptions): Effect.Effect<Info, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.create(options));\n\n/** Resolve once the space is ready (requires {@link Service}). */\nexport const waitReady = (id: SpaceId): Effect.Effect<void, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.waitReady(id));\n\n/** Enable or disable EDGE replication for a space (requires {@link Service}). */\nexport const setEdgeReplication = (id: SpaceId, setting: EdgeReplication): Effect.Effect<void, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.setEdgeReplication(id, setting));\n\n/** A space's membership as a current-value stream (requires {@link Service}). */\nexport const members = (id: SpaceId): Stream.Stream<readonly Member[], never, Service> =>\n Stream.unwrap(Effect.map(Service, (service) => service.members(id)));\n\n/** Change a member's access level (requires {@link Service}). */\nexport const updateMemberRole = (\n id: SpaceId,\n subject: IdentityDid,\n role: Access,\n): Effect.Effect<void, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.updateMemberRole(id, subject, role));\n\n/** Remove a member (requires {@link Service}). */\nexport const removeMember = (id: SpaceId, subject: IdentityDid): Effect.Effect<void, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.removeMember(id, subject));\n\n/** Initiate a space invitation (requires {@link Service}). */\nexport const share = (\n id: SpaceId,\n options?: Invitation.ShareOptions,\n): Effect.Effect<Invitation.Flow, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.share(id, options));\n\n/** Redeem a space-invitation code (requires {@link Service}). */\nexport const join = (code: string): Effect.Effect<Invitation.Flow, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.join(code));\n\n/** A space's active invitation flows as a current-value stream (requires {@link Service}). */\nexport const invitations = (id: SpaceId): Stream.Stream<readonly Invitation.Flow[], never, Service> =>\n Stream.unwrap(Effect.map(Service, (service) => service.invitations(id)));\n\n/** Export a space to an archive (requires {@link Service}). */\nexport const exportSpace = (id: SpaceId): Effect.Effect<Archive, SpaceError, Service> =>\n Effect.flatMap(Service, (service) => service.export(id));\n\n/** Import a space from an archive (requires {@link Service}). */\nexport const importSpace = (\n archive: Archive,\n options?: { tags?: readonly string[] },\n): Effect.Effect<Info, SpaceError, Service> => Effect.flatMap(Service, (service) => service.import(archive, options));\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { BaseError } from '@dxos/errors';\n\n/**\n * The acting principal lacks the capability required for the operation\n * (e.g. delegating access above their own level, or revoking without causal seniority).\n */\nexport class NotAuthorizedError extends BaseError.extend('NotAuthorizedError', 'Not authorized') {}\n\n/**\n * The referenced principal (individual or group) is not known to the service.\n */\nexport class UnknownPrincipalError extends BaseError.extend('UnknownPrincipalError', 'Unknown principal') {}\n\n/**\n * A signed payload failed signature verification or its id does not match its key.\n */\nexport class InvalidSignatureError extends BaseError.extend('InvalidSignatureError', 'Invalid signature') {}\n\n/**\n * A membership operation references causal predecessors that have not been received.\n */\nexport class MissingDependencyError extends BaseError.extend('MissingDependencyError', 'Missing dependency') {}\n\n/**\n * An identity/device operation (create, recover, profile/device update, device invitation) failed.\n */\nexport class IdentityError extends BaseError.extend('IdentityError', 'Identity operation failed') {}\n\n/**\n * A space operation (create, query, membership, invitation, export/import) failed.\n */\nexport class SpaceError extends BaseError.extend('SpaceError', 'Space operation failed') {}\n\n/**\n * An invitation-lifecycle operation (authenticate, cancel) failed.\n */\nexport class InvitationError extends BaseError.extend('InvitationError', 'Invitation operation failed') {}\n"],"mappings":"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"}
|