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,280 @@
1
+ import { Aes256Gcm, CipherSuite, DhkemP256HkdfSha256, HkdfSha256 } from '@hpke/core';
2
+ /** Wire limits apply to serialized UTF-8, including headers and base64 expansion. */
3
+ export const MAX_ENVELOPE_BYTES = 450_000;
4
+ const MAX_RECIPIENTS = 100;
5
+ const encoder = new TextEncoder();
6
+ const domain = encoder.encode('ftown/e2ee/v1');
7
+ const kinds = ['bridge', 'browser', 'mcp', 'local-cli'];
8
+ const purposes = ['application', 'hello', 'welcome', 'enroll', 'enrolled', 'mcp-approval'];
9
+ const fields = [
10
+ 'type', 'version', 'senderId', 'recipientId', 'ownerId', 'bridgeId', 'channel',
11
+ 'purpose', 'messageId', 'createdAt', 'expiresAt', 'receiverEpoch', 'enc', 'ciphertext',
12
+ ];
13
+ const suite = new CipherSuite({
14
+ kem: new DhkemP256HkdfSha256(), kdf: new HkdfSha256(), aead: new Aes256Gcm(),
15
+ });
16
+ /** A safe, stable error: underlying crypto/input details never cross this boundary. */
17
+ export class SecurityError extends Error {
18
+ code;
19
+ retryable;
20
+ constructor(code, message, retryable = false) {
21
+ super(message);
22
+ this.code = code;
23
+ this.retryable = retryable;
24
+ this.name = 'SecurityError';
25
+ }
26
+ }
27
+ const invalid = () => { throw new SecurityError('invalid_envelope', 'Invalid encrypted packet'); };
28
+ const wrongContext = () => { throw new SecurityError('wrong_context', 'Encrypted packet targets a different context'); };
29
+ function subtle() {
30
+ if (!globalThis.crypto?.subtle)
31
+ throw new SecurityError('secure_context_required', 'Encryption requires HTTPS or trustworthy localhost');
32
+ return globalThis.crypto.subtle;
33
+ }
34
+ function object(value) {
35
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
36
+ }
37
+ function exact(value, keys) {
38
+ if (Object.keys(value).length !== keys.length || Object.keys(value).some(key => !keys.includes(key)))
39
+ invalid();
40
+ }
41
+ function token(value, max = 200) {
42
+ return typeof value === 'string' && value.length > 0 && value.length <= max && /^[A-Za-z0-9_-]+$/.test(value);
43
+ }
44
+ function owner(value) {
45
+ return typeof value === 'string' && (/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(value)
46
+ || /^solo:[A-Za-z0-9_-]{1,200}$/.test(value));
47
+ }
48
+ function base64(bytes) {
49
+ let binary = '';
50
+ for (let offset = 0; offset < bytes.length; offset += 16_384) {
51
+ binary += String.fromCharCode(...bytes.subarray(offset, offset + 16_384));
52
+ }
53
+ return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');
54
+ }
55
+ function bytes(value, min, max = min) {
56
+ if (typeof value !== 'string' || value.length > Math.ceil(max * 4 / 3) || !/^[A-Za-z0-9_-]+$/.test(value))
57
+ return invalid();
58
+ let binary;
59
+ try {
60
+ binary = atob(value.replaceAll('-', '+').replaceAll('_', '/'));
61
+ }
62
+ catch {
63
+ return invalid();
64
+ }
65
+ if (binary.length < min || binary.length > max)
66
+ return invalid();
67
+ const result = Uint8Array.from(binary, character => character.charCodeAt(0));
68
+ if (base64(result) !== value)
69
+ return invalid();
70
+ return result;
71
+ }
72
+ function fingerprintSyntax(value) {
73
+ if (typeof value !== 'string' || value.length !== 43)
74
+ return false;
75
+ try {
76
+ bytes(value, 32);
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ function header(value) {
84
+ if (!object(value))
85
+ return invalid();
86
+ if (value.type !== 'ftown_encrypted' || value.version !== 1
87
+ || !fingerprintSyntax(value.senderId) || !fingerprintSyntax(value.recipientId)
88
+ || !owner(value.ownerId) || !token(value.bridgeId)
89
+ || typeof value.channel !== 'string' || !/^[\x21-\x7e]{1,512}$/.test(value.channel)
90
+ || typeof value.purpose !== 'string' || !purposes.some(purpose => purpose === value.purpose)
91
+ || !token(value.messageId, 128) || !Number.isSafeInteger(value.createdAt) || !Number.isSafeInteger(value.expiresAt)
92
+ || typeof value.createdAt !== 'number' || typeof value.expiresAt !== 'number'
93
+ || value.createdAt < 0 || value.expiresAt <= value.createdAt
94
+ || (value.receiverEpoch !== null && !token(value.receiverEpoch, 128)))
95
+ return invalid();
96
+ // Avoid coercing untrusted values or retaining attacker-owned objects.
97
+ const purpose = purposes.find(candidate => candidate === value.purpose);
98
+ if (!purpose)
99
+ return invalid();
100
+ return {
101
+ type: 'ftown_encrypted', version: 1, senderId: value.senderId, recipientId: value.recipientId,
102
+ ownerId: value.ownerId, bridgeId: value.bridgeId, channel: value.channel, purpose,
103
+ messageId: value.messageId, createdAt: value.createdAt, expiresAt: value.expiresAt,
104
+ receiverEpoch: value.receiverEpoch,
105
+ };
106
+ }
107
+ /** One ordered tuple; property insertion order on received objects is irrelevant. */
108
+ function aad(value) {
109
+ return encoder.encode(JSON.stringify([
110
+ 'ftown/e2ee/v1', value.type, value.version, value.senderId, value.recipientId,
111
+ value.ownerId, value.bridgeId, value.channel, value.purpose, value.messageId,
112
+ value.createdAt, value.expiresAt, value.receiverEpoch,
113
+ ]));
114
+ }
115
+ function serializedSize(value) {
116
+ try {
117
+ return encoder.encode(JSON.stringify(value)).byteLength;
118
+ }
119
+ catch {
120
+ return invalid();
121
+ }
122
+ }
123
+ export function parseSecureEnvelope(value) {
124
+ if (!object(value))
125
+ return invalid();
126
+ exact(value, fields);
127
+ const parsed = header(value);
128
+ // Reject oversized strings before decoding/allocating their binary contents.
129
+ const enc = bytes(value.enc, 65);
130
+ if (enc[0] !== 4)
131
+ return invalid();
132
+ bytes(value.ciphertext, 16, MAX_ENVELOPE_BYTES);
133
+ if (serializedSize(value) > MAX_ENVELOPE_BYTES || typeof value.enc !== 'string' || typeof value.ciphertext !== 'string')
134
+ return invalid();
135
+ return { ...parsed, enc: value.enc, ciphertext: value.ciphertext };
136
+ }
137
+ export function parseSecurePublication(value) {
138
+ if (!object(value))
139
+ return invalid();
140
+ exact(value, ['type', 'version', 'envelopes']);
141
+ if (value.type !== 'ftown_encrypted_batch' || value.version !== 1 || !Array.isArray(value.envelopes)
142
+ || value.envelopes.length < 1 || value.envelopes.length > MAX_RECIPIENTS
143
+ || serializedSize(value) > MAX_ENVELOPE_BYTES)
144
+ return invalid();
145
+ return { type: 'ftown_encrypted_batch', version: 1, envelopes: value.envelopes.map(parseSecureEnvelope) };
146
+ }
147
+ export async function exportPublicKey(key) {
148
+ try {
149
+ if (key.type !== 'public' || key.algorithm.name !== 'ECDH' || !('namedCurve' in key.algorithm) || key.algorithm.namedCurve !== 'P-256')
150
+ return invalid();
151
+ const raw = new Uint8Array(await subtle().exportKey('raw', key));
152
+ if (raw.length !== 65 || raw[0] !== 4)
153
+ return invalid();
154
+ return base64(raw);
155
+ }
156
+ catch (error) {
157
+ if (error instanceof SecurityError)
158
+ throw error;
159
+ throw new SecurityError('key_unavailable', 'Encryption public key is unavailable');
160
+ }
161
+ }
162
+ export async function importPublicKey(raw) {
163
+ const decoded = bytes(raw, 65);
164
+ if (decoded[0] !== 4)
165
+ return invalid();
166
+ try {
167
+ return await subtle().importKey('raw', decoded, { name: 'ECDH', namedCurve: 'P-256' }, true, []);
168
+ }
169
+ catch (error) {
170
+ if (error instanceof SecurityError)
171
+ throw error;
172
+ return invalid();
173
+ }
174
+ }
175
+ async function endpointKey(endpoint) {
176
+ if (!object(endpoint))
177
+ return invalid();
178
+ exact(endpoint, ['version', 'id', 'ownerId', 'kind', 'publicKey']);
179
+ if (endpoint.version !== 1 || !owner(endpoint.ownerId) || !kinds.includes(endpoint.kind) || !fingerprintSyntax(endpoint.id))
180
+ return invalid();
181
+ const raw = bytes(endpoint.publicKey, 65);
182
+ const digest = base64(new Uint8Array(await subtle().digest('SHA-256', raw)));
183
+ if (digest !== endpoint.id)
184
+ return invalid();
185
+ return importPublicKey(endpoint.publicKey);
186
+ }
187
+ async function validateIdentity(identity) {
188
+ await endpointKey(identity.endpoint);
189
+ if (await exportPublicKey(identity.keyPair.publicKey) !== identity.endpoint.publicKey
190
+ || identity.keyPair.privateKey.type !== 'private' || identity.keyPair.privateKey.algorithm.name !== 'ECDH'
191
+ || !('namedCurve' in identity.keyPair.privateKey.algorithm) || identity.keyPair.privateKey.algorithm.namedCurve !== 'P-256'
192
+ || !identity.keyPair.privateKey.usages.includes('deriveBits'))
193
+ return invalid();
194
+ }
195
+ export async function generateEndpoint(ownerId, kind, extractable = false) {
196
+ if (!owner(ownerId) || !kinds.includes(kind))
197
+ return invalid();
198
+ try {
199
+ const keyPair = await subtle().generateKey({ name: 'ECDH', namedCurve: 'P-256' }, extractable, ['deriveBits']);
200
+ const publicKey = await exportPublicKey(keyPair.publicKey);
201
+ const id = base64(new Uint8Array(await subtle().digest('SHA-256', bytes(publicKey, 65))));
202
+ return { endpoint: { version: 1, id, ownerId, kind, publicKey }, keyPair };
203
+ }
204
+ catch (error) {
205
+ if (error instanceof SecurityError)
206
+ throw error;
207
+ throw new SecurityError('key_unavailable', 'Encryption identity could not be created');
208
+ }
209
+ }
210
+ export async function importEndpoint(endpoint, privateKey, extractable = false) {
211
+ const publicKey = await endpointKey(endpoint);
212
+ try {
213
+ // Check the JWK's public coordinates against the independently pinned point.
214
+ const publicJwk = await subtle().exportKey('jwk', publicKey);
215
+ if (privateKey.kty !== 'EC' || privateKey.crv !== 'P-256' || !privateKey.d
216
+ || privateKey.x !== publicJwk.x || privateKey.y !== publicJwk.y)
217
+ return invalid();
218
+ const imported = await subtle().importKey('jwk', privateKey, { name: 'ECDH', namedCurve: 'P-256' }, extractable, ['deriveBits']);
219
+ const identity = { endpoint: { ...endpoint }, keyPair: { publicKey, privateKey: imported } };
220
+ // WebCrypto imports may trust supplied public coordinates. Prove private/public correspondence.
221
+ const challenge = await subtle().generateKey({ name: 'ECDH', namedCurve: 'P-256' }, false, ['deriveBits']);
222
+ const left = new Uint8Array(await subtle().deriveBits({ name: 'ECDH', public: challenge.publicKey }, imported, 256));
223
+ const right = new Uint8Array(await subtle().deriveBits({ name: 'ECDH', public: publicKey }, challenge.privateKey, 256));
224
+ let difference = 0;
225
+ for (let index = 0; index < left.length; index++)
226
+ difference |= left[index] ^ right[index];
227
+ if (difference !== 0)
228
+ return invalid();
229
+ return identity;
230
+ }
231
+ catch (error) {
232
+ if (error instanceof SecurityError)
233
+ throw error;
234
+ throw new SecurityError('key_unavailable', 'Encryption identity could not be loaded');
235
+ }
236
+ }
237
+ function contextMatches(value, expected) {
238
+ if (value.ownerId !== expected.ownerId || value.bridgeId !== expected.bridgeId || value.channel !== expected.channel
239
+ || value.recipientId !== expected.recipientId || value.purpose !== expected.purpose)
240
+ return wrongContext();
241
+ }
242
+ export async function seal(identity, recipient, input, plaintext) {
243
+ const parsed = header(input);
244
+ await validateIdentity(identity);
245
+ const recipientPublicKey = await endpointKey(recipient);
246
+ if (parsed.senderId !== identity.endpoint.id || parsed.recipientId !== recipient.id
247
+ || parsed.ownerId !== identity.endpoint.ownerId || parsed.ownerId !== recipient.ownerId)
248
+ return wrongContext();
249
+ // Base64 expands the AEAD tag and plaintext; account for exact header overhead before encrypting.
250
+ const overhead = serializedSize({ ...parsed, enc: 'A'.repeat(87), ciphertext: '' });
251
+ if (overhead + Math.ceil((plaintext.byteLength + 16) * 4 / 3) > MAX_ENVELOPE_BYTES)
252
+ throw new SecurityError('capacity_exceeded', 'Encrypted packet exceeds the transport limit');
253
+ try {
254
+ const sender = await suite.createSenderContext({ recipientPublicKey, senderKey: identity.keyPair, info: domain });
255
+ const ciphertext = await sender.seal(plaintext, aad(parsed));
256
+ return parseSecureEnvelope({ ...parsed, enc: base64(new Uint8Array(sender.enc)), ciphertext: base64(new Uint8Array(ciphertext)) });
257
+ }
258
+ catch (error) {
259
+ if (error instanceof SecurityError)
260
+ throw error;
261
+ throw new SecurityError('authentication_failed', 'Encrypted packet could not be sealed');
262
+ }
263
+ }
264
+ export async function open(identity, sender, value, expected) {
265
+ const envelope = parseSecureEnvelope(value);
266
+ contextMatches(envelope, expected);
267
+ await validateIdentity(identity);
268
+ const senderPublicKey = await endpointKey(sender);
269
+ if (envelope.recipientId !== identity.endpoint.id || envelope.senderId !== sender.id
270
+ || envelope.ownerId !== identity.endpoint.ownerId || envelope.ownerId !== sender.ownerId)
271
+ return wrongContext();
272
+ try {
273
+ const recipient = await suite.createRecipientContext({ recipientKey: identity.keyPair, senderPublicKey, enc: bytes(envelope.enc, 65), info: domain });
274
+ return new Uint8Array(await recipient.open(bytes(envelope.ciphertext, 16, MAX_ENVELOPE_BYTES), aad(envelope)));
275
+ }
276
+ catch {
277
+ throw new SecurityError('authentication_failed', 'Encrypted packet authentication failed');
278
+ }
279
+ }
280
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/security/crypto.ts"],"names":[],"mappings":"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"}