ftown 0.19.52 → 0.19.54

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 (139) hide show
  1. package/claude-mod/hooks/register.js +6 -5
  2. package/dist/bridge-auth.d.ts +4 -0
  3. package/dist/bridge-auth.js +2 -2
  4. package/dist/bridge-auth.js.map +1 -1
  5. package/dist/centrifugo-client.d.ts +11 -1
  6. package/dist/centrifugo-client.js +71 -69
  7. package/dist/centrifugo-client.js.map +1 -1
  8. package/dist/cli-client.d.ts +6 -0
  9. package/dist/cli-client.js +43 -18
  10. package/dist/cli-client.js.map +1 -1
  11. package/dist/command-rpc.d.ts +5 -2
  12. package/dist/command-rpc.js +62 -16
  13. package/dist/command-rpc.js.map +1 -1
  14. package/dist/direct-transport/loopback-server.d.ts +5 -1
  15. package/dist/direct-transport/loopback-server.js +19 -6
  16. package/dist/direct-transport/loopback-server.js.map +1 -1
  17. package/dist/direct-transport/peer-manager.d.ts +4 -0
  18. package/dist/direct-transport/peer-manager.js +16 -2
  19. package/dist/direct-transport/peer-manager.js.map +1 -1
  20. package/dist/ftown-cli.js +4 -1
  21. package/dist/ftown-cli.js.map +1 -1
  22. package/dist/index.js +100 -40
  23. package/dist/index.js.map +1 -1
  24. package/dist/local-api-server.d.ts +12 -0
  25. package/dist/local-api-server.js +182 -41
  26. package/dist/local-api-server.js.map +1 -1
  27. package/dist/local-pair-cli.d.ts +2 -3
  28. package/dist/local-pair-cli.js +12 -53
  29. package/dist/local-pair-cli.js.map +1 -1
  30. package/dist/mcp/fleet.d.ts +11 -9
  31. package/dist/mcp/fleet.js +61 -44
  32. package/dist/mcp/fleet.js.map +1 -1
  33. package/dist/mcp/http.d.ts +10 -9
  34. package/dist/mcp/http.js +133 -8
  35. package/dist/mcp/http.js.map +1 -1
  36. package/dist/mcp/legacy-relay.d.ts +2 -2
  37. package/dist/mcp/legacy-relay.js +4 -43
  38. package/dist/mcp/legacy-relay.js.map +1 -1
  39. package/dist/mcp/mcp-key-store.d.ts +52 -0
  40. package/dist/mcp/mcp-key-store.js +206 -0
  41. package/dist/mcp/mcp-key-store.js.map +1 -0
  42. package/dist/mcp/oauth.d.ts +5 -1
  43. package/dist/mcp/oauth.js +113 -39
  44. package/dist/mcp/oauth.js.map +1 -1
  45. package/dist/mcp/relay-handler.d.ts +2 -1
  46. package/dist/mcp/relay-handler.js +5 -40
  47. package/dist/mcp/relay-handler.js.map +1 -1
  48. package/dist/mcp/relay.d.ts +4 -4
  49. package/dist/mcp/relay.js +35 -85
  50. package/dist/mcp/relay.js.map +1 -1
  51. package/dist/mcp/secure-client.d.ts +23 -0
  52. package/dist/mcp/secure-client.js +124 -0
  53. package/dist/mcp/secure-client.js.map +1 -0
  54. package/dist/mcp/security-events.d.ts +65 -0
  55. package/dist/mcp/security-events.js +210 -0
  56. package/dist/mcp/security-events.js.map +1 -0
  57. package/dist/mcp/server.d.ts +1 -0
  58. package/dist/mcp/server.js +2 -2
  59. package/dist/mcp/server.js.map +1 -1
  60. package/dist/mcp/test-support.d.ts +32 -0
  61. package/dist/mcp/test-support.js +120 -0
  62. package/dist/mcp/test-support.js.map +1 -0
  63. package/dist/mcp-cli.js +56 -36
  64. package/dist/mcp-cli.js.map +1 -1
  65. package/dist/pairing-client.d.ts +10 -12
  66. package/dist/pairing-client.js +36 -9
  67. package/dist/pairing-client.js.map +1 -1
  68. package/dist/push-notifier.js +3 -1
  69. package/dist/push-notifier.js.map +1 -1
  70. package/dist/security/account-crypto.d.ts +33 -0
  71. package/dist/security/account-crypto.js +649 -0
  72. package/dist/security/account-crypto.js.map +1 -0
  73. package/dist/security/account-protocol.d.ts +228 -0
  74. package/dist/security/account-protocol.js +2 -0
  75. package/dist/security/account-protocol.js.map +1 -0
  76. package/dist/security/bridge/account-client.d.ts +7 -0
  77. package/dist/security/bridge/account-client.js +87 -0
  78. package/dist/security/bridge/account-client.js.map +1 -0
  79. package/dist/security/bridge/account-state.d.ts +471 -0
  80. package/dist/security/bridge/account-state.js +78 -0
  81. package/dist/security/bridge/account-state.js.map +1 -0
  82. package/dist/security/bridge/audit.d.ts +37 -0
  83. package/dist/security/bridge/audit.js +185 -0
  84. package/dist/security/bridge/audit.js.map +1 -0
  85. package/dist/security/bridge/direct.d.ts +22 -0
  86. package/dist/security/bridge/direct.js +72 -0
  87. package/dist/security/bridge/direct.js.map +1 -0
  88. package/dist/security/bridge/errors.d.ts +7 -0
  89. package/dist/security/bridge/errors.js +12 -0
  90. package/dist/security/bridge/errors.js.map +1 -0
  91. package/dist/security/bridge/execute.d.ts +3 -0
  92. package/dist/security/bridge/execute.js +38 -0
  93. package/dist/security/bridge/execute.js.map +1 -0
  94. package/dist/security/bridge/identity.d.ts +441 -0
  95. package/dist/security/bridge/identity.js +64 -0
  96. package/dist/security/bridge/identity.js.map +1 -0
  97. package/dist/security/bridge/local-client.d.ts +4 -0
  98. package/dist/security/bridge/local-client.js +43 -0
  99. package/dist/security/bridge/local-client.js.map +1 -0
  100. package/dist/security/bridge/metadata.d.ts +99 -0
  101. package/dist/security/bridge/metadata.js +23 -0
  102. package/dist/security/bridge/metadata.js.map +1 -0
  103. package/dist/security/bridge/native-wake.d.ts +16 -0
  104. package/dist/security/bridge/native-wake.js +15 -0
  105. package/dist/security/bridge/native-wake.js.map +1 -0
  106. package/dist/security/bridge/pending-enrollment.d.ts +12 -0
  107. package/dist/security/bridge/pending-enrollment.js +113 -0
  108. package/dist/security/bridge/pending-enrollment.js.map +1 -0
  109. package/dist/security/bridge/permissions.d.ts +11 -0
  110. package/dist/security/bridge/permissions.js +97 -0
  111. package/dist/security/bridge/permissions.js.map +1 -0
  112. package/dist/security/bridge/policy.d.ts +55 -0
  113. package/dist/security/bridge/policy.js +415 -0
  114. package/dist/security/bridge/policy.js.map +1 -0
  115. package/dist/security/bridge/security.d.ts +61 -0
  116. package/dist/security/bridge/security.js +388 -0
  117. package/dist/security/bridge/security.js.map +1 -0
  118. package/dist/security/bridge/snapshot.d.ts +14 -0
  119. package/dist/security/bridge/snapshot.js +77 -0
  120. package/dist/security/bridge/snapshot.js.map +1 -0
  121. package/dist/security/crypto.d.ts +17 -0
  122. package/dist/security/crypto.js +280 -0
  123. package/dist/security/crypto.js.map +1 -0
  124. package/dist/security/protocol.d.ts +400 -0
  125. package/dist/security/protocol.js +9 -0
  126. package/dist/security/protocol.js.map +1 -0
  127. package/dist/security-cli.d.ts +3 -0
  128. package/dist/security-cli.js +69 -0
  129. package/dist/security-cli.js.map +1 -0
  130. package/dist/solo/solo-server.js +24 -2
  131. package/dist/solo/solo-server.js.map +1 -1
  132. package/dist/types.d.ts +1 -1
  133. package/dist/wire-types.d.ts +3 -0
  134. package/dist/wire-types.js.map +1 -1
  135. package/hooks/notify.sh +1 -1
  136. package/muse-plugin/lib/ftown-hook.sh +6 -22
  137. package/opencode-plugin/ftown.js +33 -5
  138. package/package.json +4 -2
  139. package/pi-extension/ftown.js +33 -5
@@ -0,0 +1,388 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { z } from 'zod';
3
+ import { open, seal, parseSecureEnvelope } from '../crypto.js';
4
+ import { BridgePolicyStore } from './policy.js';
5
+ import { BridgeAuditStore } from './audit.js';
6
+ import { BridgeSecurityError } from './errors.js';
7
+ import { classifyCommand, classifyHttp, classifyTerminal } from './permissions.js';
8
+ import { endpointSchema } from './metadata.js';
9
+ import { ACCOUNT_TRUST_LIMITS, AccountTrustError } from '../account-crypto.js';
10
+ import { AccountReadUnavailable } from './account-client.js';
11
+ const token = z.string().regex(/^[A-Za-z0-9_-]{1,200}$/);
12
+ const actionSchema = z.object({ actionId: token, parentActionId: token.nullable(), clientId: token, grantId: token,
13
+ tool: z.string().max(200), operation: z.string().max(200).nullable() }).strict();
14
+ const routeSchema = z.discriminatedUnion('kind', [
15
+ z.object({ kind: z.literal('command'), requestId: token, command: z.string().min(1).max(100), sessionId: token.nullable() }).strict(),
16
+ z.object({ kind: z.literal('http'), requestId: token, method: z.enum(['GET', 'POST', 'PATCH', 'PUT', 'DELETE']), path: z.string().max(16384) }).strict(),
17
+ z.object({ kind: z.literal('terminal'), sessionId: z.string().max(200), frameType: z.string().max(50), pairId: token.nullable() }).strict(),
18
+ z.object({ kind: z.literal('response'), requestId: token }).strict(), z.object({ kind: z.literal('publication') }).strict(),
19
+ ]);
20
+ const object = (value) => {
21
+ if (!value || typeof value !== 'object' || Array.isArray(value))
22
+ throw new BridgeSecurityError('invalid_envelope');
23
+ return value;
24
+ };
25
+ export const applicationJson = (value) => JSON.parse(JSON.stringify(value));
26
+ export class BridgeSecurityService {
27
+ identity;
28
+ bridgeId;
29
+ options;
30
+ endpoint;
31
+ receiverEpoch = randomUUID();
32
+ policy;
33
+ audit;
34
+ now;
35
+ replay = new Map();
36
+ revoked = new Set();
37
+ admissions = new Map();
38
+ verified = new WeakSet();
39
+ closed = false;
40
+ accountTimer = null;
41
+ accountRefresh = null;
42
+ accountAbort = new AbortController();
43
+ constructor(identity, bridgeId, dataDir, options) {
44
+ this.identity = identity;
45
+ this.bridgeId = bridgeId;
46
+ this.options = options;
47
+ this.endpoint = identity.endpoint;
48
+ this.now = options.now ?? Date.now;
49
+ this.policy = new BridgePolicyStore(dataDir, bridgeId, this.endpoint, options);
50
+ this.audit = new BridgeAuditStore(dataDir, this.endpoint.ownerId, bridgeId, options);
51
+ }
52
+ context(route) {
53
+ if (this.closed || route.bridgeId !== this.bridgeId)
54
+ throw new BridgeSecurityError('wrong_context');
55
+ const expected = route.transport === 'local-http' ? `local-http:${this.bridgeId}`
56
+ : route.transport === 'local-events' ? `local-events:${this.bridgeId}`
57
+ : route.transport === 'cloud' ? route.channel
58
+ : `direct:${route.transport}:${this.bridgeId}:${route.pairId}`;
59
+ if (expected !== route.channel || ((route.transport === 'webrtc' || route.transport === 'loopback-ws') && !route.pairId)) {
60
+ throw new BridgeSecurityError('wrong_context');
61
+ }
62
+ }
63
+ freshness(envelope, executable) {
64
+ const now = this.now();
65
+ if (envelope.createdAt > now + 30000 || envelope.expiresAt <= now || envelope.expiresAt - envelope.createdAt > 120000) {
66
+ throw new BridgeSecurityError('expired');
67
+ }
68
+ if (executable && envelope.receiverEpoch !== this.receiverEpoch)
69
+ throw new BridgeSecurityError('epoch_changed');
70
+ }
71
+ claim(envelope) {
72
+ const now = this.now();
73
+ for (const [id, expires] of this.replay)
74
+ if (expires <= now)
75
+ this.replay.delete(id);
76
+ const id = `${envelope.senderId}:${envelope.messageId}`;
77
+ if (this.replay.has(id))
78
+ throw new BridgeSecurityError('replayed');
79
+ if (this.replay.size >= 10000)
80
+ throw new BridgeSecurityError('capacity_exceeded');
81
+ this.replay.set(id, envelope.expiresAt);
82
+ }
83
+ async decode(sender, envelope, route) {
84
+ this.context(route);
85
+ const bytes = await open(this.identity, sender, envelope, { ownerId: this.endpoint.ownerId, bridgeId: this.bridgeId,
86
+ channel: route.channel, recipientId: this.endpoint.id, purpose: envelope.purpose });
87
+ try {
88
+ return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
89
+ }
90
+ catch {
91
+ throw new BridgeSecurityError('invalid_envelope');
92
+ }
93
+ }
94
+ async reply(recipient, purpose, data, route, messageId = randomUUID()) {
95
+ this.context(route);
96
+ return seal(this.identity, recipient, { type: 'ftown_encrypted', version: 1, senderId: this.endpoint.id, recipientId: recipient.id,
97
+ ownerId: this.endpoint.ownerId, bridgeId: this.bridgeId, channel: route.channel, purpose, messageId,
98
+ createdAt: this.now(), expiresAt: this.now() + 120000, receiverEpoch: null }, new TextEncoder().encode(JSON.stringify(data)));
99
+ }
100
+ async handleHandshake(packet, route) {
101
+ this.context(route);
102
+ if (packet.type === 'ftown_enrollment') {
103
+ const wrapper = z.object({ type: z.literal('ftown_enrollment'), version: z.literal(1), candidate: endpointSchema, envelope: z.unknown() }).strict().parse(packet);
104
+ const envelope = parseSecureEnvelope(wrapper.envelope);
105
+ if (envelope.purpose !== 'enroll')
106
+ throw new BridgeSecurityError('wrong_context');
107
+ this.freshness(envelope, false);
108
+ const message = z.object({ type: z.literal('enroll'), candidate: endpointSchema, invitationId: z.string().uuid(),
109
+ invitationSecret: z.string().regex(/^[A-Za-z0-9_-]{43}$/), label: z.string().max(200) }).strict().parse(await this.decode(wrapper.candidate, envelope, route));
110
+ if (JSON.stringify(message.candidate) !== JSON.stringify(wrapper.candidate))
111
+ throw new BridgeSecurityError('wrong_context');
112
+ const approved = await this.policy.consumeInvitation(message);
113
+ return this.reply(approved.endpoint, 'enrolled', { type: 'enrolled', invitationId: message.invitationId, approved, receiverEpoch: this.receiverEpoch }, route, envelope.messageId);
114
+ }
115
+ const envelope = parseSecureEnvelope(packet);
116
+ if (envelope.purpose !== 'hello')
117
+ throw new BridgeSecurityError('wrong_context');
118
+ this.freshness(envelope, false);
119
+ const principal = await this.policy.principal(envelope.senderId, true);
120
+ const hello = z.object({ type: z.literal('hello'), challenge: token }).strict().parse(await this.decode(principal.endpoint, envelope, route));
121
+ const welcome = await this.reply(principal.endpoint, 'welcome', { type: 'welcome', challenge: hello.challenge, receiverEpoch: this.receiverEpoch }, route, envelope.messageId);
122
+ // Pending MCP identities may hello but cannot acquire ordinary application permissions.
123
+ const current = await this.policy.principal(principal.endpoint.id, true);
124
+ if (current.endpoint.publicKey !== principal.endpoint.publicKey)
125
+ throw new BridgeSecurityError('wrong_context');
126
+ return welcome;
127
+ }
128
+ parseApplication(value) {
129
+ const parsed = z.object({ type: z.literal('application'), route: routeSchema, data: z.unknown(), mcp: actionSchema.nullable() }).strict().parse(value);
130
+ return { ...parsed, data: applicationJson(parsed.data) };
131
+ }
132
+ requirement(application, transport) {
133
+ const route = application.route;
134
+ if ((transport.transport === 'webrtc' || transport.transport === 'loopback-ws') && route.kind !== 'terminal') {
135
+ throw new BridgeSecurityError('wrong_context');
136
+ }
137
+ if (route.kind === 'command') {
138
+ const data = object(application.data);
139
+ if (['terminal_watch', 'terminal_unwatch', 'webrtc_offer', 'webrtc_answer', 'webrtc_ice', 'webrtc_close'].includes(route.command)) {
140
+ if (data.type !== route.command || (data.bridgeId !== undefined && data.bridgeId !== this.bridgeId)
141
+ || (typeof data.sessionId === 'string' ? data.sessionId : null) !== route.sessionId)
142
+ throw new BridgeSecurityError('wrong_context');
143
+ return classifyCommand(route.command, data);
144
+ }
145
+ const payload = object(data.payload ?? null);
146
+ if (data.type !== route.command || data.requestId !== route.requestId || payload.bridgeId !== this.bridgeId
147
+ || (typeof payload.sessionId === 'string' ? payload.sessionId : null) !== route.sessionId)
148
+ throw new BridgeSecurityError('wrong_context');
149
+ return classifyCommand(route.command, payload);
150
+ }
151
+ if (route.kind === 'http') {
152
+ const data = object(application.data);
153
+ if (Object.keys(data).some(key => key !== 'body' && key !== 'timeoutMs' && key !== 'callerSessionId')
154
+ || (data.timeoutMs !== undefined && (typeof data.timeoutMs !== 'number' || !Number.isInteger(data.timeoutMs) || data.timeoutMs < 1 || data.timeoutMs > 60000)))
155
+ throw new BridgeSecurityError('invalid_envelope');
156
+ return classifyHttp(route.method, route.path);
157
+ }
158
+ if (route.kind === 'terminal') {
159
+ const data = object(application.data);
160
+ if (route.pairId !== transport.pairId || data.kind !== route.frameType
161
+ || (typeof data.sessionId === 'string' ? data.sessionId : '') !== route.sessionId)
162
+ throw new BridgeSecurityError('wrong_context');
163
+ if (route.sessionId && !/^[A-Za-z0-9_-]+$/.test(route.sessionId))
164
+ throw new BridgeSecurityError('invalid_envelope');
165
+ return classifyTerminal(route.frameType);
166
+ }
167
+ throw new BridgeSecurityError('permission_denied');
168
+ }
169
+ async admission(envelope, principal, app, operation) {
170
+ if (principal.endpoint.kind !== 'mcp') {
171
+ if (app.mcp !== null)
172
+ throw new BridgeSecurityError('permission_denied');
173
+ return;
174
+ }
175
+ const context = app.mcp;
176
+ if (!context || context.grantId !== principal.grantId)
177
+ throw new BridgeSecurityError('wrong_context');
178
+ const admitted = await this.audit.admit({ admissionId: envelope.messageId, ...context, endpointId: principal.endpoint.id,
179
+ operation: operation.operation, sessionId: operation.sessionId, mutating: operation.mutating });
180
+ if (!admitted.isNew)
181
+ throw new BridgeSecurityError('replayed');
182
+ this.admissions.set(`${envelope.senderId}:${envelope.messageId}`, admitted.event.id);
183
+ }
184
+ async acceptApplication(packet, route) {
185
+ const envelope = parseSecureEnvelope(packet);
186
+ if (envelope.purpose !== 'application')
187
+ throw new BridgeSecurityError('wrong_context');
188
+ const principal = await this.policy.principal(envelope.senderId, true);
189
+ const app = this.parseApplication(await this.decode(principal.endpoint, envelope, route));
190
+ if (app.route.kind === 'http') {
191
+ const data = object(app.data);
192
+ if (data.callerSessionId !== undefined && (principal.endpoint.kind !== 'local-cli'
193
+ || typeof data.callerSessionId !== 'string' || !/^[A-Za-z0-9_-]{1,200}$/.test(data.callerSessionId)))
194
+ throw new BridgeSecurityError('permission_denied');
195
+ }
196
+ this.freshness(envelope, true);
197
+ this.claim(envelope);
198
+ // Pending identities can do precisely this one bound operation; never generic application work.
199
+ if (app.route.kind === 'command' && app.route.command === 'security_activate_mcp') {
200
+ const data = object(app.data);
201
+ const payload = object(data.payload ?? null);
202
+ if (data.type !== app.route.command || data.requestId !== app.route.requestId || payload.bridgeId !== this.bridgeId
203
+ || payload.grantId !== principal.grantId || principal.endpoint.kind !== 'mcp')
204
+ throw new BridgeSecurityError('permission_denied');
205
+ const message = { principal, envelope, application: app };
206
+ this.verified.add(message);
207
+ return message;
208
+ }
209
+ let operation;
210
+ try {
211
+ operation = this.requirement(app, route);
212
+ }
213
+ catch (error) {
214
+ if (principal.endpoint.kind === 'mcp' && app.mcp) {
215
+ await this.admission(envelope, principal, app, { permission: 'control', mutating: true, operation: 'invalid_operation', sessionId: null });
216
+ await this.complete({ principal, envelope, application: app }, 'rejected', 'permission_denied');
217
+ }
218
+ throw error;
219
+ }
220
+ await this.admission(envelope, principal, app, operation);
221
+ try {
222
+ await this.policy.revalidate(principal, operation.permission);
223
+ }
224
+ catch (error) {
225
+ await this.complete({ principal, envelope, application: app }, 'rejected', 'permission_denied');
226
+ throw error;
227
+ }
228
+ const message = { principal, envelope, application: app };
229
+ this.verified.add(message);
230
+ return message;
231
+ }
232
+ async revalidate(principal) { await this.policy.revalidate(principal); }
233
+ /** One non-content receipt, prepared while authorized and released only after durable self-removal. */
234
+ async revokeSelfWithReceipt(message, route) {
235
+ const application = message.application;
236
+ if (application.route.kind !== 'command' || application.route.command !== 'security_revoke')
237
+ return null;
238
+ const data = object(application.data);
239
+ const payload = object(data.payload ?? null);
240
+ if (payload.endpointId !== message.principal.endpoint.id)
241
+ return null;
242
+ if (!this.verified.has(message) || message.envelope.senderId !== message.principal.endpoint.id
243
+ || message.envelope.channel !== route.channel || message.envelope.bridgeId !== route.bridgeId
244
+ || message.envelope.messageId !== application.route.requestId || payload.bridgeId !== this.bridgeId) {
245
+ throw new BridgeSecurityError('wrong_context');
246
+ }
247
+ await this.policy.revalidate(message.principal, 'admin');
248
+ const receipt = await this.reply(message.principal.endpoint, 'application', { type: 'application',
249
+ route: { kind: 'response', requestId: application.route.requestId }, mcp: null,
250
+ data: { type: 'command_response', response: { requestId: application.route.requestId, success: true,
251
+ data: { endpointId: message.principal.endpoint.id, revoked: true } } } }, route, application.route.requestId);
252
+ // No sealed value leaves this method before both persistence steps have succeeded.
253
+ await this.revokeEndpoint(message.principal, message.principal.endpoint.id);
254
+ await this.complete(message, 'succeeded');
255
+ this.verified.delete(message);
256
+ return receipt;
257
+ }
258
+ async complete(message, status, errorCode = null) {
259
+ const key = `${message.envelope.senderId}:${message.envelope.messageId}`;
260
+ const admission = this.admissions.get(key);
261
+ if (!admission)
262
+ return;
263
+ try {
264
+ await this.audit.finish(admission, status, errorCode);
265
+ this.admissions.delete(key);
266
+ }
267
+ catch {
268
+ throw new BridgeSecurityError('outcome_unknown');
269
+ }
270
+ }
271
+ async sealTo(recipientId, application, route) {
272
+ const principal = await this.policy.principal(recipientId);
273
+ const envelope = await this.reply(principal.endpoint, 'application', application, route, application.route.kind === 'response' ? application.route.requestId : randomUUID());
274
+ await this.policy.revalidate(principal);
275
+ return envelope;
276
+ }
277
+ async sealPublication(channel, application) {
278
+ const recipients = await this.policy.recipients();
279
+ const packets = [];
280
+ for (const recipient of recipients) {
281
+ try {
282
+ packets.push(await this.sealTo(recipient.endpoint.id, application, { transport: 'cloud', channel, bridgeId: this.bridgeId, pairId: null }));
283
+ }
284
+ catch (error) {
285
+ if (!(error instanceof BridgeSecurityError) || (!['endpoint_revoked', 'approval_required', 'expired', 'invalid_account_trust'].includes(error.code)
286
+ && !error.code.startsWith('account_')))
287
+ throw error;
288
+ }
289
+ }
290
+ return packets;
291
+ }
292
+ createInvitation(actor, options) { return this.policy.createInvitation(actor, options); }
293
+ listDevices(actor) { return this.policy.list(actor); }
294
+ async approveMcp(actor, approval) {
295
+ const receipt = await this.policy.approveMcp(actor, approval);
296
+ const envelope = await this.reply(approval.endpoint, 'mcp-approval', receipt, { transport: 'cloud', channel: `mcp-approval:${this.bridgeId}:${approval.requestId}`,
297
+ bridgeId: this.bridgeId, pairId: null });
298
+ return { bridgeId: this.bridgeId, bridge: this.endpoint, receipt: envelope };
299
+ }
300
+ activateMcp(actor, grantId) { return this.policy.activateMcp(actor, grantId); }
301
+ async revokeEndpoint(actor, endpointId) {
302
+ await this.policy.revoke(actor, endpointId);
303
+ for (const listener of this.revoked)
304
+ listener(endpointId);
305
+ }
306
+ /** Called once at startup; legacy/Solo stores never adopt an unsigned server directory. */
307
+ async startAccount(trust) {
308
+ if (trust)
309
+ await this.policy.pinBootstrap(trust);
310
+ await this.refreshAccount().catch(() => undefined);
311
+ if (!this.closed && !this.accountTimer && this.options.readAccountHistory) {
312
+ this.accountTimer = setInterval(() => { void this.refreshAccount().catch(() => undefined); }, ACCOUNT_TRUST_LIMITS.refreshIntervalMs);
313
+ this.accountTimer.unref();
314
+ }
315
+ }
316
+ accountFailure(error) {
317
+ return error instanceof BridgeSecurityError ? error : new BridgeSecurityError(error instanceof AccountTrustError ? error.code : 'invalid_account_trust');
318
+ }
319
+ emitRevoked(endpointIds) {
320
+ for (const id of endpointIds)
321
+ for (const listener of this.revoked)
322
+ listener(id);
323
+ }
324
+ async refreshAccount() {
325
+ if (this.accountRefresh)
326
+ return this.accountRefresh;
327
+ const run = async () => {
328
+ if (this.closed || !await this.policy.accountTrust())
329
+ return;
330
+ try {
331
+ if (!this.options.readAccountHistory)
332
+ throw new AccountReadUnavailable();
333
+ const history = await this.options.readAccountHistory(this.accountAbort.signal);
334
+ if (!history)
335
+ throw new BridgeSecurityError('account_trust_rollback');
336
+ if (this.closed)
337
+ return;
338
+ const result = await this.policy.applyAccountRead(history);
339
+ this.emitRevoked(result.revoked);
340
+ }
341
+ catch (error) {
342
+ if (!(error instanceof AccountReadUnavailable))
343
+ this.policy.blockAccount(this.accountFailure(error).code);
344
+ if (!await this.policy.accountAvailable())
345
+ this.emitRevoked(await this.policy.accountEndpointIds());
346
+ throw error;
347
+ }
348
+ };
349
+ this.accountRefresh = run().finally(() => { this.accountRefresh = null; });
350
+ return this.accountRefresh;
351
+ }
352
+ async adoptAccount(actor, head) {
353
+ await this.policy.revalidate(actor, 'admin');
354
+ if (actor.endpoint.kind !== 'browser' || !this.options.readAccountHistory)
355
+ throw new BridgeSecurityError('account_approval_required');
356
+ try {
357
+ const parsedHead = z.object({ rootId: z.string().regex(/^[A-Za-z0-9_-]{43}$/), head: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
358
+ revision: z.number().int().min(0).max(ACCOUNT_TRUST_LIMITS.maxTransitions) }).strict().parse(head);
359
+ const history = await this.options.readAccountHistory(this.accountAbort.signal);
360
+ if (!history)
361
+ throw new BridgeSecurityError('account_approval_required');
362
+ if (this.closed)
363
+ throw new BridgeSecurityError('account_storage_unavailable');
364
+ const result = await this.policy.applyAccountRead(history, { actor, head: parsedHead });
365
+ this.emitRevoked(result.revoked);
366
+ return result.head;
367
+ }
368
+ catch (error) {
369
+ if (error instanceof AccountReadUnavailable)
370
+ throw new BridgeSecurityError('account_storage_unavailable');
371
+ throw this.accountFailure(error);
372
+ }
373
+ }
374
+ onRevoked(listener) { this.revoked.add(listener); return () => this.revoked.delete(listener); }
375
+ async close() {
376
+ this.closed = true;
377
+ this.accountAbort.abort();
378
+ if (this.accountTimer)
379
+ clearInterval(this.accountTimer);
380
+ this.accountTimer = null;
381
+ await this.accountRefresh?.catch(() => undefined);
382
+ this.revoked.clear();
383
+ this.replay.clear();
384
+ await this.audit.close();
385
+ await this.policy.close();
386
+ }
387
+ }
388
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/security/bridge/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { z } from 'zod';
2
+ /** One process owns each instance directory. Never publish in-memory state before durable replacement. */
3
+ export declare class AtomicSnapshot<T> {
4
+ private readonly file;
5
+ private readonly schema;
6
+ private readonly initial;
7
+ private tail;
8
+ constructor(file: string, schema: z.ZodType<T, z.ZodTypeDef, unknown>, initial: () => T);
9
+ private load;
10
+ private save;
11
+ transact<R>(update: (state: T) => R | Promise<R>): Promise<R>;
12
+ read<R>(select: (state: T) => R): Promise<R>;
13
+ close(): Promise<void>;
14
+ }
@@ -0,0 +1,77 @@
1
+ import { mkdir, open, rename, rm } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { BridgeSecurityError } from './errors.js';
5
+ /** One process owns each instance directory. Never publish in-memory state before durable replacement. */
6
+ export class AtomicSnapshot {
7
+ file;
8
+ schema;
9
+ initial;
10
+ tail = Promise.resolve();
11
+ constructor(file, schema, initial) {
12
+ this.file = file;
13
+ this.schema = schema;
14
+ this.initial = initial;
15
+ }
16
+ async load() {
17
+ let handle;
18
+ try {
19
+ handle = await open(this.file, 'r');
20
+ if ((await handle.stat()).size > 64 * 1024 * 1024)
21
+ throw new Error('Oversize snapshot');
22
+ return this.schema.parse(JSON.parse(await handle.readFile('utf8')));
23
+ }
24
+ catch (error) {
25
+ if (error.code === 'ENOENT')
26
+ return this.initial();
27
+ throw new BridgeSecurityError('storage_unavailable');
28
+ }
29
+ finally {
30
+ await handle?.close();
31
+ }
32
+ }
33
+ async save(value) {
34
+ const directory = dirname(this.file);
35
+ const temporary = `${this.file}.${randomUUID()}.tmp`;
36
+ try {
37
+ await mkdir(directory, { recursive: true, mode: 0o700 });
38
+ const handle = await open(temporary, 'wx', 0o600);
39
+ try {
40
+ await handle.writeFile(JSON.stringify(this.schema.parse(value)));
41
+ await handle.sync();
42
+ }
43
+ finally {
44
+ await handle.close();
45
+ }
46
+ await rename(temporary, this.file);
47
+ const parent = await open(directory, 'r');
48
+ try {
49
+ await parent.sync();
50
+ }
51
+ finally {
52
+ await parent.close();
53
+ }
54
+ }
55
+ catch {
56
+ await rm(temporary, { force: true }).catch(() => undefined);
57
+ throw new BridgeSecurityError('storage_unavailable');
58
+ }
59
+ }
60
+ transact(update) {
61
+ const run = this.tail.then(async () => {
62
+ const state = await this.load();
63
+ const result = await update(state);
64
+ await this.save(state);
65
+ return structuredClone(result);
66
+ });
67
+ this.tail = run.catch(() => undefined);
68
+ return run;
69
+ }
70
+ read(select) {
71
+ const run = this.tail.then(async () => structuredClone(select(await this.load())));
72
+ this.tail = run.catch(() => undefined);
73
+ return run;
74
+ }
75
+ async close() { await this.tail; }
76
+ }
77
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/security/bridge/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { EndpointIdentity, EndpointKind, EndpointPublic, EnvelopeHeader, OpenContext, SecureEnvelope, SecurePublication, SecurityErrorCode, SecurityFailure } from './protocol.js';
2
+ /** Wire limits apply to serialized UTF-8, including headers and base64 expansion. */
3
+ export declare const MAX_ENVELOPE_BYTES = 450000;
4
+ /** A safe, stable error: underlying crypto/input details never cross this boundary. */
5
+ export declare class SecurityError extends Error implements SecurityFailure {
6
+ readonly code: SecurityErrorCode;
7
+ readonly retryable: boolean;
8
+ constructor(code: SecurityErrorCode, message: string, retryable?: boolean);
9
+ }
10
+ export declare function parseSecureEnvelope(value: unknown): SecureEnvelope;
11
+ export declare function parseSecurePublication(value: unknown): SecurePublication;
12
+ export declare function exportPublicKey(key: CryptoKey): Promise<string>;
13
+ export declare function importPublicKey(raw: string): Promise<CryptoKey>;
14
+ export declare function generateEndpoint(ownerId: string, kind: EndpointKind, extractable?: boolean): Promise<EndpointIdentity>;
15
+ export declare function importEndpoint(endpoint: EndpointPublic, privateKey: JsonWebKey, extractable?: boolean): Promise<EndpointIdentity>;
16
+ export declare function seal(identity: EndpointIdentity, recipient: EndpointPublic, input: EnvelopeHeader, plaintext: Uint8Array): Promise<SecureEnvelope>;
17
+ export declare function open(identity: EndpointIdentity, sender: EndpointPublic, value: SecureEnvelope, expected: OpenContext): Promise<Uint8Array>;