@crosshands/runtime 0.1.2

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/dist/broker/broker.d.ts +53 -0
  3. package/dist/broker/broker.d.ts.map +1 -0
  4. package/dist/broker/broker.js +346 -0
  5. package/dist/broker/broker.js.map +1 -0
  6. package/dist/bundle-lifecycle.d.ts +75 -0
  7. package/dist/bundle-lifecycle.d.ts.map +1 -0
  8. package/dist/bundle-lifecycle.js +247 -0
  9. package/dist/bundle-lifecycle.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +10 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/ipc/control-transport.d.ts +59 -0
  15. package/dist/ipc/control-transport.d.ts.map +1 -0
  16. package/dist/ipc/control-transport.js +389 -0
  17. package/dist/ipc/control-transport.js.map +1 -0
  18. package/dist/ipc/endpoint.d.ts +15 -0
  19. package/dist/ipc/endpoint.d.ts.map +1 -0
  20. package/dist/ipc/endpoint.js +16 -0
  21. package/dist/ipc/endpoint.js.map +1 -0
  22. package/dist/ipc/framing.d.ts +4 -0
  23. package/dist/ipc/framing.d.ts.map +1 -0
  24. package/dist/ipc/framing.js +32 -0
  25. package/dist/ipc/framing.js.map +1 -0
  26. package/dist/ipc/unix.d.ts +17 -0
  27. package/dist/ipc/unix.d.ts.map +1 -0
  28. package/dist/ipc/unix.js +106 -0
  29. package/dist/ipc/unix.js.map +1 -0
  30. package/dist/ipc/windows.d.ts +13 -0
  31. package/dist/ipc/windows.d.ts.map +1 -0
  32. package/dist/ipc/windows.js +10 -0
  33. package/dist/ipc/windows.js.map +1 -0
  34. package/dist/policy/policy.d.ts +23 -0
  35. package/dist/policy/policy.d.ts.map +1 -0
  36. package/dist/policy/policy.js +53 -0
  37. package/dist/policy/policy.js.map +1 -0
  38. package/dist/providers/supervisor.d.ts +17 -0
  39. package/dist/providers/supervisor.d.ts.map +1 -0
  40. package/dist/providers/supervisor.js +122 -0
  41. package/dist/providers/supervisor.js.map +1 -0
  42. package/package.json +37 -0
  43. package/src/broker/broker.ts +439 -0
  44. package/src/bundle-lifecycle.ts +385 -0
  45. package/src/index.ts +9 -0
  46. package/src/ipc/control-transport.ts +517 -0
  47. package/src/ipc/endpoint.ts +27 -0
  48. package/src/ipc/framing.ts +31 -0
  49. package/src/ipc/unix.ts +110 -0
  50. package/src/ipc/windows.ts +26 -0
  51. package/src/policy/policy.ts +73 -0
  52. package/src/providers/supervisor.ts +140 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CrossHands contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,53 @@
1
+ import { type ComputerOperationName, type ContractVersions, type InteractionContext, type ReferenceBindings } from '@crosshands/contract';
2
+ import { type StableAppIdentity } from '../policy/policy.js';
3
+ import { ProviderSupervisor } from '../providers/supervisor.js';
4
+ export type BrokerPeer = {
5
+ osIdentity: string;
6
+ graphicalSessionId: string;
7
+ verified: boolean;
8
+ local: boolean;
9
+ };
10
+ export type TargetInspection = {
11
+ bindings: ReferenceBindings;
12
+ appIdentity: StableAppIdentity;
13
+ };
14
+ export type BrokerRequest = {
15
+ operation: ComputerOperationName;
16
+ input: unknown;
17
+ deadlineMs?: number;
18
+ };
19
+ export type BrokerResponse = {
20
+ requestId: string;
21
+ result: unknown;
22
+ desktopEpoch: number;
23
+ providerGeneration: string;
24
+ context?: InteractionContext;
25
+ };
26
+ export type LocalBrokerOptions = {
27
+ identity: BrokerPeer;
28
+ generation?: string;
29
+ providerFactory: ConstructorParameters<typeof ProviderSupervisor>[0]['providerFactory'];
30
+ inspectTarget?: (operation: ComputerOperationName, input: unknown) => Promise<TargetInspection | null>;
31
+ publish?: (response: BrokerResponse) => Promise<void>;
32
+ contextTtlMs?: number;
33
+ now?: () => number;
34
+ };
35
+ export declare class BrokerClient {
36
+ private readonly broker;
37
+ constructor(broker: LocalBroker);
38
+ request(request: BrokerRequest): Promise<BrokerResponse>;
39
+ }
40
+ export declare class LocalBroker {
41
+ #private;
42
+ readonly generation: string;
43
+ constructor(options: LocalBrokerOptions);
44
+ get desktopEpoch(): number;
45
+ connect(handshake: {
46
+ peer: BrokerPeer;
47
+ versions: ContractVersions;
48
+ }): Promise<BrokerClient>;
49
+ issueContext(bindings: ReferenceBindings): InteractionContext;
50
+ resolveContext(token: string): InteractionContext;
51
+ request(request: BrokerRequest): Promise<BrokerResponse>;
52
+ }
53
+ //# sourceMappingURL=broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/broker/broker.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,WAAW,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,qBAAqB,CAAA;IAChC,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,UAAU,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,qBAAqB,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;IACvF,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,qBAAqB,EAChC,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,CAAA;AAiKD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAGzD;AAED,qBAAa,WAAW;;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAWf,OAAO,EAAE,kBAAkB;IAgBvC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAEK,OAAO,CAAC,SAAS,EAAE;QACvB,IAAI,EAAE,UAAU,CAAA;QAChB,QAAQ,EAAE,gBAAgB,CAAA;KAC3B,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBzB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,kBAAkB;IAU7D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAIjD,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAiJzD"}
@@ -0,0 +1,346 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { COMPUTER_OPERATIONS, InteractionContextStore, createComputerError, negotiateVersionHandshake, parseOperationOutput } from '@crosshands/contract';
3
+ import { assertAppAllowed } from '../policy/policy.js';
4
+ import { ProviderSupervisor } from '../providers/supervisor.js';
5
+ class SerialQueue {
6
+ #tail = Promise.resolve();
7
+ async run(work) {
8
+ const previous = this.#tail;
9
+ let release;
10
+ this.#tail = new Promise((resolve) => {
11
+ release = resolve;
12
+ });
13
+ await previous;
14
+ try {
15
+ return await work();
16
+ }
17
+ finally {
18
+ release();
19
+ }
20
+ }
21
+ }
22
+ function isMutation(operation) {
23
+ return COMPUTER_OPERATIONS[operation].mutation;
24
+ }
25
+ function assertedInputApp(input) {
26
+ if (input === null || typeof input !== 'object')
27
+ return;
28
+ const app = input.app;
29
+ if (typeof app === 'string' && app.length > 0) {
30
+ assertAppAllowed({ appId: app, executableId: app });
31
+ }
32
+ }
33
+ function targetReference(input) {
34
+ if (input === null || typeof input !== 'object')
35
+ return undefined;
36
+ const record = input;
37
+ const candidate = record.target ?? record.from;
38
+ if (candidate === null || typeof candidate !== 'object')
39
+ return undefined;
40
+ const target = candidate;
41
+ if (target.kind === 'element')
42
+ return target.ref;
43
+ if (target.kind === 'coordinate' && target.window !== undefined)
44
+ return target.window;
45
+ if ('contextToken' in target)
46
+ return target;
47
+ return undefined;
48
+ }
49
+ function bindReference(context, current, kind, ref) {
50
+ return {
51
+ ...current,
52
+ kind,
53
+ ref,
54
+ contextToken: context.token,
55
+ expiresAt: context.expiresAt
56
+ };
57
+ }
58
+ function normalizeTarget(candidate, context, current) {
59
+ if (candidate === null || typeof candidate !== 'object')
60
+ return candidate;
61
+ const target = candidate;
62
+ if (target.kind === 'element' && typeof target.elementIndex === 'number') {
63
+ return {
64
+ kind: 'element',
65
+ ref: bindReference(context, current, 'element', `element:${target.elementIndex}`)
66
+ };
67
+ }
68
+ if (target.kind === 'coordinate' && target.window === undefined) {
69
+ return {
70
+ ...target,
71
+ window: bindReference(context, current, 'window', current.window.id)
72
+ };
73
+ }
74
+ if (target.kind === 'context-window') {
75
+ return bindReference(context, current, 'window', current.window.id);
76
+ }
77
+ return candidate;
78
+ }
79
+ function normalizeMutationInput(input, context, current) {
80
+ if (input === null || typeof input !== 'object')
81
+ return input;
82
+ const record = input;
83
+ return {
84
+ ...record,
85
+ ...(record.target === undefined
86
+ ? {}
87
+ : { target: normalizeTarget(record.target, context, current) }),
88
+ ...(record.from === undefined ? {} : { from: normalizeTarget(record.from, context, current) }),
89
+ ...(record.to === undefined ? {} : { to: normalizeTarget(record.to, context, current) })
90
+ };
91
+ }
92
+ function mutationReferences(input) {
93
+ if (input === null || typeof input !== 'object')
94
+ return [];
95
+ const record = input;
96
+ return [record.target, record.from, record.to]
97
+ .map((candidate) => targetReference({ target: candidate }))
98
+ .filter((candidate) => candidate !== undefined);
99
+ }
100
+ function contextToken(input) {
101
+ if (input === null || typeof input !== 'object')
102
+ return undefined;
103
+ const token = input.contextToken;
104
+ return typeof token === 'string' ? token : undefined;
105
+ }
106
+ function computerError(cause) {
107
+ if (cause instanceof Error)
108
+ return cause;
109
+ return { message: 'Unknown provider failure' };
110
+ }
111
+ function assertFreshReference(reference, context, current, now) {
112
+ const mismatches = [
113
+ [reference.contextToken !== context.token, 'context token'],
114
+ [reference.brokerGeneration !== context.brokerGeneration, 'context broker generation'],
115
+ [reference.providerGeneration !== context.providerGeneration, 'context provider generation'],
116
+ [reference.graphicalSessionId !== context.graphicalSessionId, 'context session'],
117
+ [reference.brokerGeneration !== current.brokerGeneration, 'current broker generation'],
118
+ [reference.providerGeneration !== current.providerGeneration, 'current provider generation'],
119
+ [reference.graphicalSessionId !== current.graphicalSessionId, 'current session'],
120
+ [reference.process.pid !== context.process.pid, 'context pid'],
121
+ [reference.process.startedAt !== context.process.startedAt, 'context process start'],
122
+ [reference.process.executableId !== context.process.executableId, 'context executable'],
123
+ [reference.process.pid !== current.process.pid, 'current pid'],
124
+ [reference.process.startedAt !== current.process.startedAt, 'current process start'],
125
+ [reference.process.executableId !== current.process.executableId, 'current executable'],
126
+ [reference.appId !== context.appId, 'context app'],
127
+ [reference.appId !== current.appId, 'current app'],
128
+ [reference.window.id !== context.window.id, 'context window'],
129
+ [reference.window.ownerPid !== context.window.ownerPid, 'context window owner'],
130
+ [reference.window.id !== current.window.id, 'current window'],
131
+ [reference.window.ownerPid !== current.window.ownerPid, 'current window owner'],
132
+ [reference.snapshotId !== context.snapshotId, 'context snapshot'],
133
+ [reference.snapshotId !== current.snapshotId, 'current snapshot'],
134
+ [reference.desktopEpoch !== context.desktopEpoch, 'context desktop epoch'],
135
+ [reference.desktopEpoch !== current.desktopEpoch, 'current desktop epoch'],
136
+ [Date.parse(reference.expiresAt) < now, 'reference expiration'],
137
+ [Date.parse(context.expiresAt) < now, 'context expiration']
138
+ ]
139
+ .filter(([failed]) => failed)
140
+ .map(([, label]) => label);
141
+ if (mismatches.length > 0) {
142
+ throw createComputerError('stale_target', 'Target reference is no longer fresh', { mismatches });
143
+ }
144
+ }
145
+ export class BrokerClient {
146
+ broker;
147
+ constructor(broker) {
148
+ this.broker = broker;
149
+ }
150
+ request(request) {
151
+ return this.broker.request(request);
152
+ }
153
+ }
154
+ export class LocalBroker {
155
+ generation;
156
+ #identity;
157
+ #supervisor;
158
+ #contexts;
159
+ #inspectTarget;
160
+ #publish;
161
+ #now;
162
+ #queue = new SerialQueue();
163
+ #desktopEpoch = 0;
164
+ #requestSequence = 0;
165
+ constructor(options) {
166
+ this.generation = options.generation ?? `broker-${randomUUID()}`;
167
+ this.#identity = options.identity;
168
+ this.#inspectTarget = options.inspectTarget;
169
+ this.#publish = options.publish;
170
+ this.#now = options.now ?? Date.now;
171
+ this.#contexts = new InteractionContextStore({
172
+ ...(options.contextTtlMs === undefined ? {} : { ttlMs: options.contextTtlMs }),
173
+ now: this.#now
174
+ });
175
+ this.#supervisor = new ProviderSupervisor({
176
+ providerFactory: options.providerFactory,
177
+ graphicalSessionId: options.identity.graphicalSessionId
178
+ });
179
+ }
180
+ get desktopEpoch() {
181
+ return this.#desktopEpoch;
182
+ }
183
+ async connect(handshake) {
184
+ const { peer } = handshake;
185
+ if (!peer.verified || !peer.local) {
186
+ throw createComputerError('session_unavailable', 'Broker peer could not be verified locally');
187
+ }
188
+ if (peer.osIdentity !== this.#identity.osIdentity ||
189
+ peer.graphicalSessionId !== this.#identity.graphicalSessionId) {
190
+ throw createComputerError('session_unavailable', 'Broker peer belongs to a different OS identity or graphical session');
191
+ }
192
+ const versions = negotiateVersionHandshake(handshake.versions);
193
+ if (!versions.ok)
194
+ throw versions.error;
195
+ await this.#supervisor.start();
196
+ return new BrokerClient(this);
197
+ }
198
+ issueContext(bindings) {
199
+ return this.#contexts.issue({
200
+ ...bindings,
201
+ brokerGeneration: this.generation,
202
+ providerGeneration: this.#supervisor.generation ?? bindings.providerGeneration,
203
+ graphicalSessionId: this.#identity.graphicalSessionId,
204
+ desktopEpoch: this.#desktopEpoch
205
+ });
206
+ }
207
+ resolveContext(token) {
208
+ return this.#contexts.resolve(token);
209
+ }
210
+ request(request) {
211
+ return this.#queue.run(() => this.#requestLocked(request));
212
+ }
213
+ async #requestLocked(request) {
214
+ const requestId = `broker-${++this.#requestSequence}`;
215
+ const deadlineAt = this.#now() + (request.deadlineMs ?? 30_000);
216
+ const mutation = isMutation(request.operation);
217
+ assertedInputApp(request.input);
218
+ let context;
219
+ let inspectionInput = request.input;
220
+ if (mutation) {
221
+ const token = contextToken(request.input);
222
+ if (token === undefined) {
223
+ throw createComputerError('invalid_argument', 'Mutation requires a context token and target');
224
+ }
225
+ context = this.#contexts.resolve(token);
226
+ // Context-window and index shorthand do not carry an identity until the
227
+ // broker binds them. Inspect the bound form so native providers can
228
+ // re-resolve the exact process/window before dispatch.
229
+ inspectionInput = normalizeMutationInput(request.input, context, context);
230
+ }
231
+ const inspection = await this.#inspectTarget?.(request.operation, inspectionInput);
232
+ if (inspection !== undefined && inspection !== null)
233
+ assertAppAllowed(inspection.appIdentity);
234
+ let providerInput = request.input;
235
+ if (mutation) {
236
+ if (inspection === undefined || inspection === null) {
237
+ throw createComputerError('stale_target', 'Target identity could not be re-resolved');
238
+ }
239
+ providerInput = normalizeMutationInput(request.input, context, inspection.bindings);
240
+ const references = mutationReferences(providerInput);
241
+ if (references.length === 0) {
242
+ throw createComputerError('invalid_argument', 'Mutation requires a target selector');
243
+ }
244
+ for (const reference of references) {
245
+ assertFreshReference(reference, context, inspection.bindings, this.#now());
246
+ }
247
+ }
248
+ try {
249
+ const providerResponse = await this.#supervisor.dispatch({
250
+ requestId,
251
+ operation: request.operation,
252
+ input: providerInput,
253
+ deadlineAt
254
+ });
255
+ if (mutation) {
256
+ const dispatched = providerResponse.dispatched;
257
+ if (dispatched)
258
+ this.#desktopEpoch += 1;
259
+ const result = 'error' in providerResponse
260
+ ? {
261
+ outcome: dispatched
262
+ ? { state: 'indeterminate', reason: providerResponse.error.message }
263
+ : { state: 'not_attempted', error: providerResponse.error }
264
+ }
265
+ : providerResponse.result;
266
+ const response = {
267
+ requestId,
268
+ result: this.#publicResult(request.operation, result),
269
+ desktopEpoch: this.#desktopEpoch,
270
+ providerGeneration: this.#supervisor.generation ?? 'unknown'
271
+ };
272
+ await this.#publish?.(response);
273
+ return response;
274
+ }
275
+ return this.#observationResponse(requestId, request.operation, providerResponse.result);
276
+ }
277
+ catch (cause) {
278
+ const error = computerError(cause);
279
+ if (!mutation && error.code === 'provider_crashed') {
280
+ await this.#supervisor.restart();
281
+ this.#contexts.invalidateAll();
282
+ const retry = await this.#supervisor.dispatch({
283
+ requestId: `${requestId}-retry`,
284
+ operation: request.operation,
285
+ input: request.input,
286
+ deadlineAt
287
+ });
288
+ if ('error' in retry)
289
+ throw Object.assign(new Error(retry.error.message), retry.error);
290
+ return this.#observationResponse(requestId, request.operation, retry.result);
291
+ }
292
+ if (mutation && (error.code === 'provider_crashed' || error.code === 'timeout')) {
293
+ this.#desktopEpoch += 1;
294
+ this.#contexts.invalidateAll();
295
+ const response = {
296
+ requestId,
297
+ result: this.#publicResult(request.operation, {
298
+ outcome: { state: 'indeterminate', reason: error.message }
299
+ }),
300
+ desktopEpoch: this.#desktopEpoch,
301
+ providerGeneration: this.#supervisor.generation ?? 'unknown'
302
+ };
303
+ await this.#publish?.(response);
304
+ return response;
305
+ }
306
+ throw cause;
307
+ }
308
+ }
309
+ #observationResponse(requestId, operation, result) {
310
+ let context;
311
+ const publicResult = this.#publicResult(operation, result);
312
+ if (publicResult !== null && typeof publicResult === 'object' && 'context' in publicResult)
313
+ context = publicResult.context;
314
+ return {
315
+ requestId,
316
+ result: publicResult,
317
+ desktopEpoch: this.#desktopEpoch,
318
+ providerGeneration: this.#supervisor.generation ?? 'unknown',
319
+ ...(context === undefined ? {} : { context })
320
+ };
321
+ }
322
+ #publicResult(operation, result) {
323
+ if (result === null || typeof result !== 'object')
324
+ return parseOperationOutput(operation, result);
325
+ const value = result;
326
+ let publicResult = value;
327
+ if ('bindings' in value) {
328
+ const { bindings, ...snapshot } = value;
329
+ publicResult = { ...snapshot, context: this.issueContext(bindings) };
330
+ }
331
+ else if (value.freshState !== null &&
332
+ typeof value.freshState === 'object' &&
333
+ 'bindings' in value.freshState) {
334
+ const { bindings, ...freshState } = value.freshState;
335
+ publicResult = {
336
+ ...value,
337
+ freshState: {
338
+ ...freshState,
339
+ context: this.issueContext(bindings)
340
+ }
341
+ };
342
+ }
343
+ return parseOperationOutput(operation, publicResult);
344
+ }
345
+ }
346
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/broker/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export type BundleArtifact = {
2
+ name: string;
3
+ version: string;
4
+ expectedDigest: string;
5
+ actualDigest: string;
6
+ trustVerified: boolean;
7
+ };
8
+ export type BundleCandidate = {
9
+ version: string;
10
+ release: number;
11
+ manifestDigest: string;
12
+ requiredArtifacts: readonly string[];
13
+ artifacts: readonly BundleArtifact[];
14
+ };
15
+ export type LifecyclePhase = 'idle' | 'running' | 'draining' | 'activating' | 'uninstalling' | 'uninstalled';
16
+ export type LifecycleErrorCode = 'bundle_incomplete' | 'bundle_integrity' | 'bundle_version_mismatch' | 'lifecycle_busy' | 'mutation_rejected' | 'version_incompatible';
17
+ export declare class BundleLifecycleError extends Error {
18
+ readonly code: LifecycleErrorCode;
19
+ constructor(code: LifecycleErrorCode, message: string);
20
+ }
21
+ export type ActivationHooks = {
22
+ /** Runs before the atomic active-version pointer changes. */
23
+ beforeCommit?: () => void | Promise<void>;
24
+ /** Runs after the pointer changes, to model restart/interruption after commit. */
25
+ afterCommit?: () => void | Promise<void>;
26
+ };
27
+ export type ClientState = {
28
+ id: string;
29
+ version: string;
30
+ reconnectRequired: boolean;
31
+ };
32
+ export type DispatchVersions = {
33
+ client: string;
34
+ broker: string;
35
+ provider: string;
36
+ payload: string;
37
+ };
38
+ export type InteractionContextGeneration = {
39
+ generation: number;
40
+ };
41
+ export type InstalledResourceKind = 'broker-registration' | 'ipc' | 'cache' | 'log' | 'temporary-capture' | 'export' | 'configuration' | 'permission';
42
+ export type InstalledResource = {
43
+ id: string;
44
+ kind: InstalledResourceKind;
45
+ owner: 'crosshands' | 'user' | 'os';
46
+ };
47
+ export type UninstallPlan = {
48
+ remove: readonly InstalledResource[];
49
+ preserve: readonly InstalledResource[];
50
+ manual: readonly InstalledResource[];
51
+ };
52
+ export declare function planUninstall(resources: readonly InstalledResource[]): UninstallPlan;
53
+ /**
54
+ * Coordinates installed bundle state. Filesystem/package-manager work is deliberately
55
+ * supplied by callers; this class owns only verification gates and atomic state changes.
56
+ */
57
+ export declare class BundleLifecycle {
58
+ #private;
59
+ get phase(): LifecyclePhase;
60
+ get activeVersion(): string | undefined;
61
+ get inFlightMutations(): number;
62
+ stage(candidate: BundleCandidate): void;
63
+ bundle(version: string): BundleCandidate | undefined;
64
+ beginMutation(): () => void;
65
+ activate(version: string, hooks?: ActivationHooks): Promise<void>;
66
+ rollback(version: string, hooks?: ActivationHooks): Promise<void>;
67
+ connectClient(id: string, version: string): ClientState;
68
+ reconnectClient(id: string, version: string): ClientState;
69
+ client(id: string): ClientState | undefined;
70
+ assertDispatchCompatible(versions: DispatchVersions): void;
71
+ issueContext(): InteractionContextGeneration;
72
+ isContextCurrent(context: InteractionContextGeneration): boolean;
73
+ uninstall(resources: readonly InstalledResource[], remove: (resource: InstalledResource) => void | Promise<void>): Promise<UninstallPlan>;
74
+ }
75
+ //# sourceMappingURL=bundle-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-lifecycle.d.ts","sourceRoot":"","sources":["../src/bundle-lifecycle.ts"],"names":[],"mappings":"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"}