ftown 0.20.9 → 0.21.0

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 (118) hide show
  1. package/dist/centrifugo-client.d.ts +15 -11
  2. package/dist/centrifugo-client.js +63 -70
  3. package/dist/centrifugo-client.js.map +1 -1
  4. package/dist/cli-client.d.ts +11 -1
  5. package/dist/cli-client.js +23 -3
  6. package/dist/cli-client.js.map +1 -1
  7. package/dist/command-rpc.js +4 -8
  8. package/dist/command-rpc.js.map +1 -1
  9. package/dist/identity-reset.d.ts +1 -0
  10. package/dist/identity-reset.js +31 -5
  11. package/dist/identity-reset.js.map +1 -1
  12. package/dist/index.js +184 -288
  13. package/dist/index.js.map +1 -1
  14. package/dist/ledger-pairing-client.d.ts +28 -0
  15. package/dist/ledger-pairing-client.js +152 -0
  16. package/dist/ledger-pairing-client.js.map +1 -0
  17. package/dist/ledger-relay.d.ts +124 -0
  18. package/dist/ledger-relay.js +453 -0
  19. package/dist/ledger-relay.js.map +1 -0
  20. package/dist/ledger-startup.d.ts +151 -0
  21. package/dist/ledger-startup.js +203 -0
  22. package/dist/ledger-startup.js.map +1 -0
  23. package/dist/relay-token.d.ts +39 -0
  24. package/dist/relay-token.js +130 -0
  25. package/dist/relay-token.js.map +1 -0
  26. package/dist/revocation-gating.d.ts +0 -13
  27. package/dist/revocation-gating.js +0 -16
  28. package/dist/revocation-gating.js.map +1 -1
  29. package/dist/security/bridge/identity.d.ts +2 -47
  30. package/dist/security/bridge/identity.js +3 -3
  31. package/dist/security/bridge/identity.js.map +1 -1
  32. package/dist/security/bridge/ledger-identity.d.ts +48 -0
  33. package/dist/security/bridge/ledger-identity.js +342 -0
  34. package/dist/security/bridge/ledger-identity.js.map +1 -0
  35. package/dist/security/bridge/ledger-store.d.ts +84 -0
  36. package/dist/security/bridge/ledger-store.js +485 -0
  37. package/dist/security/bridge/ledger-store.js.map +1 -0
  38. package/dist/security/bridge/metadata.d.ts +2 -2
  39. package/dist/security/bridge/permissions.js +2 -2
  40. package/dist/security/bridge/permissions.js.map +1 -1
  41. package/dist/security/bridge/policy.d.ts +42 -23
  42. package/dist/security/bridge/policy.js +214 -146
  43. package/dist/security/bridge/policy.js.map +1 -1
  44. package/dist/security/bridge/security.d.ts +84 -33
  45. package/dist/security/bridge/security.js +240 -166
  46. package/dist/security/bridge/security.js.map +1 -1
  47. package/dist/security/crypto.js +1 -1
  48. package/dist/security/crypto.js.map +1 -1
  49. package/dist/security/ledger/channels.d.ts +5 -0
  50. package/dist/security/ledger/channels.js +21 -0
  51. package/dist/security/ledger/channels.js.map +1 -0
  52. package/dist/security/ledger/ledger.d.ts +61 -0
  53. package/dist/security/ledger/ledger.js +597 -0
  54. package/dist/security/ledger/ledger.js.map +1 -0
  55. package/dist/security/ledger/pairing.d.ts +81 -0
  56. package/dist/security/ledger/pairing.js +414 -0
  57. package/dist/security/ledger/pairing.js.map +1 -0
  58. package/dist/security/ledger/proof.d.ts +24 -0
  59. package/dist/security/ledger/proof.js +161 -0
  60. package/dist/security/ledger/proof.js.map +1 -0
  61. package/dist/security/ledger/protocol.d.ts +100 -0
  62. package/dist/security/ledger/protocol.js +16 -0
  63. package/dist/security/ledger/protocol.js.map +1 -0
  64. package/dist/security/ledger/testing.d.ts +27 -0
  65. package/dist/security/ledger/testing.js +70 -0
  66. package/dist/security/ledger/testing.js.map +1 -0
  67. package/dist/security/ledger/webauthn.d.ts +12 -0
  68. package/dist/security/ledger/webauthn.js +147 -0
  69. package/dist/security/ledger/webauthn.js.map +1 -0
  70. package/dist/security/protocol.d.ts +5 -10
  71. package/dist/security-cli.d.ts +5 -0
  72. package/dist/security-cli.js +28 -16
  73. package/dist/security-cli.js.map +1 -1
  74. package/dist/token-provider.d.ts +39 -0
  75. package/dist/token-provider.js +101 -0
  76. package/dist/token-provider.js.map +1 -0
  77. package/dist/types.d.ts +1 -1
  78. package/package.json +2 -2
  79. package/skills/ftown/references/sessions.md +3 -2
  80. package/dist/bridge-auth.d.ts +0 -31
  81. package/dist/bridge-auth.js +0 -70
  82. package/dist/bridge-auth.js.map +0 -1
  83. package/dist/pairing-client.d.ts +0 -62
  84. package/dist/pairing-client.js +0 -469
  85. package/dist/pairing-client.js.map +0 -1
  86. package/dist/rotating-token-refresher.d.ts +0 -42
  87. package/dist/rotating-token-refresher.js +0 -91
  88. package/dist/rotating-token-refresher.js.map +0 -1
  89. package/dist/security/account-crypto.d.ts +0 -33
  90. package/dist/security/account-crypto.js +0 -649
  91. package/dist/security/account-crypto.js.map +0 -1
  92. package/dist/security/account-protocol.d.ts +0 -228
  93. package/dist/security/account-protocol.js +0 -2
  94. package/dist/security/account-protocol.js.map +0 -1
  95. package/dist/security/bridge/account-client.d.ts +0 -7
  96. package/dist/security/bridge/account-client.js +0 -101
  97. package/dist/security/bridge/account-client.js.map +0 -1
  98. package/dist/security/bridge/account-state.d.ts +0 -105
  99. package/dist/security/bridge/account-state.js +0 -79
  100. package/dist/security/bridge/account-state.js.map +0 -1
  101. package/dist/security/bridge/pending-approval.d.ts +0 -21
  102. package/dist/security/bridge/pending-approval.js +0 -80
  103. package/dist/security/bridge/pending-approval.js.map +0 -1
  104. package/dist/security/bridge/pending-enrollment.d.ts +0 -33
  105. package/dist/security/bridge/pending-enrollment.js +0 -177
  106. package/dist/security/bridge/pending-enrollment.js.map +0 -1
  107. package/dist/security/bridge/revocation.d.ts +0 -14
  108. package/dist/security/bridge/revocation.js +0 -40
  109. package/dist/security/bridge/revocation.js.map +0 -1
  110. package/dist/security/pending-approval-crypto.d.ts +0 -29
  111. package/dist/security/pending-approval-crypto.js +0 -716
  112. package/dist/security/pending-approval-crypto.js.map +0 -1
  113. package/dist/security/pending-approval-protocol.d.ts +0 -329
  114. package/dist/security/pending-approval-protocol.js +0 -2
  115. package/dist/security/pending-approval-protocol.js.map +0 -1
  116. package/dist/security/security-nudge.d.ts +0 -31
  117. package/dist/security/security-nudge.js +0 -98
  118. package/dist/security/security-nudge.js.map +0 -1
@@ -0,0 +1,485 @@
1
+ /*
2
+ * The bridge's local replica of its account ledger: `<dataDir>/security/ledger.json`,
3
+ * {version:1, ledger, checkpoint, sticky, lastServerReadAt}, file mode 0600, replaced atomically.
4
+ * - Replica rule (CONTRACT "Decision 2026-11-09" and "Amendments after the L2 re-review"): chooseLedger decides; the cache passed to it
5
+ * is always the RAW checkpoint of the stored chain. Every candidate that is kept or adopted adds its revocations to the sticky set; a
6
+ * rejected one adds nothing. trusted() = applyRevocations(checkpoint, sticky) is the only checkpoint for trust decisions.
7
+ * - An empty store is bound to an account ONLY by adoptPaired (link secret proof + confirmPairedLedger) or adoptBound (the identity is
8
+ * already bound to that account and the chain lists this bridge's keys). offer() never binds an empty store.
9
+ * - Once bound (a stored ledger, or the `accountId` option) every other account's ledger is rejected.
10
+ * - The file is written only after a decision that changes it. A corrupted file throws LedgerStoreError and is never reset.
11
+ * - All operations on one file run one at a time within this process; across processes the bridge's single-instance guarantee is
12
+ * relied on. Stale `ledger.json.<uuid>.tmp` files left by a crash are removed on the first load in a process.
13
+ */
14
+ import { createHash, randomUUID } from 'node:crypto';
15
+ import { mkdir, open, readdir, rename, rm, unlink } from 'node:fs/promises';
16
+ import { basename, dirname, join, resolve } from 'node:path';
17
+ import { accountIdOf, applyRevocations, chooseLedger, ledgerLastIssuedAt, ledgerRevocations, parseLedger, verifyLedger, } from '../ledger/ledger.js';
18
+ import { confirmPairedLedger } from '../ledger/pairing.js';
19
+ import { BridgeSecurityError } from './errors.js';
20
+ import { bindLedgerIdentity, readLedgerIdentity } from './ledger-identity.js';
21
+ const messages = {
22
+ ledger_store_corrupt: 'Local account ledger is corrupted.',
23
+ ledger_store_wrong_account: 'Local account ledger belongs to a different account.',
24
+ ledger_store_pairing_rejected: 'Paired account ledger was rejected.',
25
+ ledger_store_bound_rejected: 'Account ledger does not match this bridge identity.',
26
+ };
27
+ /** Not retryable; file contents and crypto errors never enter it. Read/write failures throw BridgeSecurityError('storage_unavailable'). */
28
+ export class LedgerStoreError extends Error {
29
+ code;
30
+ retryable = false;
31
+ constructor(code) {
32
+ super(messages[code]);
33
+ this.code = code;
34
+ this.name = 'LedgerStoreError';
35
+ }
36
+ }
37
+ const FILE_NAME = 'ledger.json';
38
+ const FILE_KEYS = ['version', 'ledger', 'checkpoint', 'sticky', 'lastServerReadAt'];
39
+ const MAX_FILE_BYTES = 16 * 1024 * 1024;
40
+ const MAX_TIME = 253402300799999;
41
+ const TEMPORARY = /^\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.tmp$/;
42
+ const queues = new Map();
43
+ const swept = new Set();
44
+ function corrupt() {
45
+ throw new LedgerStoreError('ledger_store_corrupt');
46
+ }
47
+ function errorCode(error) {
48
+ return typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string' ? error.code : undefined;
49
+ }
50
+ function isRecord(value) {
51
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
52
+ }
53
+ function isAccountId(value) {
54
+ if (typeof value !== 'string' || !/^[A-Za-z0-9_-]{43}$/.test(value))
55
+ return false;
56
+ const raw = Buffer.from(value, 'base64url');
57
+ return raw.length === 32 && raw.toString('base64url') === value;
58
+ }
59
+ function isTime(value) {
60
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= MAX_TIME;
61
+ }
62
+ /** Sorted-key JSON, to compare a stored checkpoint with a recomputed one. */
63
+ function canonical(value) {
64
+ if (Array.isArray(value)) {
65
+ const items = value;
66
+ return `[${items.map(canonical).join(',')}]`;
67
+ }
68
+ if (isRecord(value))
69
+ return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`;
70
+ return JSON.stringify(value);
71
+ }
72
+ function uniqueStrings(value) {
73
+ if (!Array.isArray(value))
74
+ return corrupt();
75
+ const items = value;
76
+ const result = [];
77
+ for (const item of items) {
78
+ if (typeof item !== 'string' || result.indexOf(item) !== -1)
79
+ return corrupt();
80
+ result.push(item);
81
+ }
82
+ return result;
83
+ }
84
+ function union(left, right) {
85
+ const merge = (base, extra) => base.concat(extra.filter((id, index) => base.indexOf(id) === -1 && extra.indexOf(id) === index));
86
+ return { deviceIds: merge(left.deviceIds, right.deviceIds), bridgeIds: merge(left.bridgeIds, right.bridgeIds) };
87
+ }
88
+ function covers(sticky, ids) {
89
+ return ids.deviceIds.every(id => sticky.deviceIds.indexOf(id) !== -1) && ids.bridgeIds.every(id => sticky.bridgeIds.indexOf(id) !== -1);
90
+ }
91
+ function sameSticky(left, right) {
92
+ return left.deviceIds.length === right.deviceIds.length && left.bridgeIds.length === right.bridgeIds.length && covers(left, right);
93
+ }
94
+ function statusOf(trusted, bridgeId, authPublicKey) {
95
+ if (trusted === null)
96
+ return 'absent';
97
+ if (trusted.revokedBridgeIds.indexOf(bridgeId) !== -1)
98
+ return 'revoked';
99
+ return trusted.bridges.some(bridge => bridge.bridgeId === bridgeId && bridge.authPublicKey === authPublicKey) ? 'active' : 'absent';
100
+ }
101
+ /** Is a bridge with exactly these keys a member of the trusted roster (any bridgeId when `bridgeId` is null)? */
102
+ function lists(trusted, bridgeId, endpointId, authPublicKey) {
103
+ return trusted.bridges.some((bridge) => (bridgeId === null || bridge.bridgeId === bridgeId)
104
+ && bridge.endpoint.id === endpointId && bridge.authPublicKey === authPublicKey);
105
+ }
106
+ function cacheOf(stored) {
107
+ // The cache is the stored chain's raw checkpoint, never the trusted one.
108
+ return { head: stored.checkpoint.head, checkpoint: stored.checkpoint };
109
+ }
110
+ /** Operations on one file run one at a time within this process, whichever store instance or helper issues them. */
111
+ function serialized(file, run) {
112
+ const previous = queues.get(file) ?? Promise.resolve();
113
+ const next = previous.then(run);
114
+ const settled = next.then(() => undefined, () => undefined);
115
+ queues.set(file, settled);
116
+ void settled.then(() => { if (queues.get(file) === settled)
117
+ queues.delete(file); });
118
+ return next;
119
+ }
120
+ async function syncDirectory(directory) {
121
+ let handle;
122
+ try {
123
+ handle = await open(directory, 'r');
124
+ }
125
+ catch {
126
+ return;
127
+ }
128
+ try {
129
+ await handle.sync();
130
+ }
131
+ catch { /* directory fsync is unsupported on some platforms */ }
132
+ finally {
133
+ await handle.close();
134
+ }
135
+ }
136
+ /** Once per process: removes `ledger.json.<uuid>.tmp` left by a crash mid-write. Runs inside the queue, so no own write is in flight. */
137
+ async function sweepTemporaries(file) {
138
+ if (swept.has(file))
139
+ return;
140
+ swept.add(file);
141
+ const prefix = basename(file);
142
+ let names;
143
+ try {
144
+ names = await readdir(dirname(file));
145
+ }
146
+ catch {
147
+ return;
148
+ }
149
+ for (const name of names) {
150
+ if (name.indexOf(prefix) === 0 && TEMPORARY.test(name.slice(prefix.length)))
151
+ await rm(join(dirname(file), name), { force: true }).catch(() => undefined);
152
+ }
153
+ }
154
+ function replicaOf(dataDir, options) {
155
+ const accountId = options.accountId ?? null;
156
+ if (accountId !== null && !isAccountId(accountId))
157
+ throw new BridgeSecurityError('wrong_context');
158
+ return { dataDir, file: resolve(join(dataDir, 'security', FILE_NAME)), accountId, clock: options.now ?? Date.now, memo: null };
159
+ }
160
+ async function readText(replica) {
161
+ let handle;
162
+ try {
163
+ handle = await open(replica.file, 'r');
164
+ }
165
+ catch (error) {
166
+ if (errorCode(error) === 'ENOENT')
167
+ return null;
168
+ throw new BridgeSecurityError('storage_unavailable');
169
+ }
170
+ try {
171
+ const info = await handle.stat();
172
+ if (!info.isFile() || info.size > MAX_FILE_BYTES)
173
+ return corrupt();
174
+ return await handle.readFile('utf8');
175
+ }
176
+ catch (error) {
177
+ if (error instanceof LedgerStoreError)
178
+ throw error;
179
+ throw new BridgeSecurityError('storage_unavailable');
180
+ }
181
+ finally {
182
+ await handle.close();
183
+ }
184
+ }
185
+ /** Full check of a stored file: shape, the chain from genesis, the checkpoint it yields, and sticky covering its own revocations. */
186
+ async function decode(replica, text) {
187
+ try {
188
+ const record = JSON.parse(text);
189
+ if (!isRecord(record))
190
+ return corrupt();
191
+ const keys = Object.keys(record);
192
+ if (keys.length !== FILE_KEYS.length || keys.some(key => FILE_KEYS.indexOf(key) === -1) || record.version !== 1)
193
+ return corrupt();
194
+ const lastServerReadAt = record.lastServerReadAt === null ? null : isTime(record.lastServerReadAt) ? record.lastServerReadAt : corrupt();
195
+ if (!isRecord(record.sticky))
196
+ return corrupt();
197
+ const stickyKeys = Object.keys(record.sticky);
198
+ if (stickyKeys.length !== 2 || stickyKeys.indexOf('deviceIds') === -1 || stickyKeys.indexOf('bridgeIds') === -1)
199
+ return corrupt();
200
+ const sticky = { deviceIds: uniqueStrings(record.sticky.deviceIds), bridgeIds: uniqueStrings(record.sticky.bridgeIds) };
201
+ const ledger = parseLedger(record.ledger);
202
+ // An accepted chain stays valid when the clock later moves back: verify at no earlier than its last record.
203
+ const checkpoint = await verifyLedger(ledger, Math.max(replica.clock(), ledgerLastIssuedAt(ledger)));
204
+ if (canonical(record.checkpoint) !== canonical(checkpoint))
205
+ return corrupt();
206
+ if (!covers(sticky, ledgerRevocations(ledger)))
207
+ return corrupt();
208
+ return { ledger, checkpoint, trusted: applyRevocations(checkpoint, sticky), sticky, lastServerReadAt };
209
+ }
210
+ catch {
211
+ return corrupt();
212
+ }
213
+ }
214
+ /** null when absent. Re-reads the file on every call and re-verifies it whenever its text changed. */
215
+ async function load(replica) {
216
+ await sweepTemporaries(replica.file);
217
+ const text = await readText(replica);
218
+ if (text === null) {
219
+ replica.memo = null;
220
+ return null;
221
+ }
222
+ const state = replica.memo !== null && replica.memo.text === text ? replica.memo.state : await decode(replica, text);
223
+ if (replica.accountId !== null && state.checkpoint.accountId !== replica.accountId)
224
+ throw new LedgerStoreError('ledger_store_wrong_account');
225
+ replica.memo = { text, state };
226
+ return state;
227
+ }
228
+ async function save(replica, state) {
229
+ const text = JSON.stringify({
230
+ version: 1, ledger: state.ledger, checkpoint: state.checkpoint, sticky: state.sticky, lastServerReadAt: state.lastServerReadAt,
231
+ });
232
+ const directory = dirname(replica.file);
233
+ const temporary = `${replica.file}.${randomUUID()}.tmp`;
234
+ replica.memo = null;
235
+ try {
236
+ await mkdir(directory, { recursive: true, mode: 0o700 });
237
+ const handle = await open(temporary, 'wx', 0o600);
238
+ try {
239
+ await handle.writeFile(text);
240
+ await handle.sync();
241
+ }
242
+ finally {
243
+ await handle.close();
244
+ }
245
+ await rename(temporary, replica.file);
246
+ }
247
+ catch {
248
+ await rm(temporary, { force: true }).catch(() => undefined);
249
+ throw new BridgeSecurityError('storage_unavailable');
250
+ }
251
+ await syncDirectory(directory);
252
+ replica.memo = { text, state };
253
+ }
254
+ async function erase(replica) {
255
+ replica.memo = null;
256
+ try {
257
+ await unlink(replica.file);
258
+ }
259
+ catch (error) {
260
+ if (errorCode(error) !== 'ENOENT')
261
+ throw new BridgeSecurityError('storage_unavailable');
262
+ }
263
+ await syncDirectory(dirname(replica.file));
264
+ }
265
+ /** The replica rule for an untrusted candidate on a bound store. Never binds an empty store. */
266
+ async function decide(replica, candidate, source) {
267
+ const now = replica.clock();
268
+ const stored = await load(replica);
269
+ const unchanged = (decision) => ({ decision, state: stored, discarded: [] });
270
+ if (source !== 'server' && source !== 'relay')
271
+ return unchanged('reject');
272
+ if (stored === null)
273
+ return unchanged('reject');
274
+ let ledger;
275
+ try {
276
+ ledger = parseLedger(candidate);
277
+ }
278
+ catch {
279
+ return unchanged('reject');
280
+ }
281
+ if (await accountIdOf(ledger.genesis.payload) !== stored.checkpoint.accountId)
282
+ return unchanged('reject');
283
+ const choice = await chooseLedger(stored.ledger, ledger, now, cacheOf(stored));
284
+ if (choice.decision === 'reject')
285
+ return unchanged('reject');
286
+ const sticky = union(stored.sticky, ledgerRevocations(ledger));
287
+ if (choice.decision === 'adopt') {
288
+ const adopted = await commit(replica, { ledger, checkpoint: choice.checkpoint, sticky, lastServerReadAt: stored.lastServerReadAt });
289
+ return adopted === null ? unchanged('reject') : { decision: 'adopt', state: adopted, discarded: choice.discarded };
290
+ }
291
+ if (sameSticky(sticky, stored.sticky))
292
+ return unchanged('keep');
293
+ const kept = await commit(replica, { ledger: stored.ledger, checkpoint: stored.checkpoint, sticky, lastServerReadAt: stored.lastServerReadAt });
294
+ return kept === null ? unchanged('reject') : { decision: 'keep', state: kept, discarded: [] };
295
+ }
296
+ /** Persists a decided state; null (nothing written) when its sticky set exceeds applyRevocations' limits. */
297
+ async function commit(replica, next) {
298
+ let trusted;
299
+ try {
300
+ trusted = applyRevocations(next.checkpoint, next.sticky);
301
+ }
302
+ catch {
303
+ return null;
304
+ }
305
+ const state = { ...next, trusted };
306
+ await save(replica, state);
307
+ return state;
308
+ }
309
+ /**
310
+ * Binds an empty store, or applies the replica rule to a bound one, for a chain the caller has authenticated. The resulting trusted
311
+ * roster must list this bridge (`isMember`); on any failure throws LedgerStoreError(code) and writes nothing. Returns trusted().
312
+ */
313
+ async function admit(replica, stored, ledger, now, isMember, code) {
314
+ let next;
315
+ if (stored === null) {
316
+ let checkpoint;
317
+ try {
318
+ checkpoint = (await chooseLedger(null, ledger, now)).checkpoint;
319
+ }
320
+ catch {
321
+ throw new LedgerStoreError(code);
322
+ }
323
+ next = { ledger, checkpoint, sticky: union({ deviceIds: [], bridgeIds: [] }, ledgerRevocations(ledger)), lastServerReadAt: null };
324
+ }
325
+ else {
326
+ const choice = await chooseLedger(stored.ledger, ledger, now, cacheOf(stored));
327
+ if (choice.decision === 'reject')
328
+ throw new LedgerStoreError(code);
329
+ const sticky = union(stored.sticky, ledgerRevocations(ledger));
330
+ next = choice.decision === 'adopt'
331
+ ? { ledger, checkpoint: choice.checkpoint, sticky, lastServerReadAt: stored.lastServerReadAt }
332
+ : { ledger: stored.ledger, checkpoint: stored.checkpoint, sticky, lastServerReadAt: stored.lastServerReadAt };
333
+ }
334
+ let trusted;
335
+ try {
336
+ trusted = applyRevocations(next.checkpoint, next.sticky);
337
+ }
338
+ catch {
339
+ throw new LedgerStoreError(code);
340
+ }
341
+ if (!isMember(trusted))
342
+ throw new LedgerStoreError(code);
343
+ if (stored === null || next.ledger !== stored.ledger || !sameSticky(next.sticky, stored.sticky))
344
+ await save(replica, { ...next, trusted });
345
+ return structuredClone(trusted);
346
+ }
347
+ export class BridgeLedgerStore {
348
+ replica;
349
+ constructor(dataDir, options = {}) {
350
+ this.replica = replicaOf(dataDir, options);
351
+ }
352
+ /** The stored state, or null while no ledger is stored. Throws LedgerStoreError for a corrupted or wrong-account file. */
353
+ read() {
354
+ return serialized(this.replica.file, async () => structuredClone(await load(this.replica)));
355
+ }
356
+ /** applyRevocations(checkpoint, sticky) of the stored chain, or null while no ledger is stored. */
357
+ trusted() {
358
+ return serialized(this.replica.file, async () => {
359
+ const state = await load(this.replica);
360
+ return state === null ? null : structuredClone(state.trusted);
361
+ });
362
+ }
363
+ /** 'revoked' iff bridgeId is revoked in trusted(); 'active' iff trusted() lists bridgeId with this auth key; else 'absent'. */
364
+ async ownBridgeStatus(bridgeId, authPublicKey) {
365
+ return statusOf(await this.trusted(), bridgeId, authPublicKey);
366
+ }
367
+ /** ownBridgeStatus(bridgeId, …) === 'revoked': by the stored chain or by any chain this replica ever kept or adopted. */
368
+ async ownBridgeRevoked(bridgeId) {
369
+ return statusOf(await this.trusted(), bridgeId, '') === 'revoked';
370
+ }
371
+ /**
372
+ * Offers an untrusted candidate chain from the server or the relay. Never binds an empty store, and never throws for a bad candidate:
373
+ * it is rejected. Throws LedgerStoreError for a corrupted or wrong-account local file, and BridgeSecurityError('storage_unavailable')
374
+ * when the file cannot be read or written.
375
+ */
376
+ offer(candidate, source) {
377
+ return serialized(this.replica.file, async () => structuredClone(await decide(this.replica, candidate, source)));
378
+ }
379
+ /**
380
+ * The pairing path, after openPairApproval. Runs confirmPairedLedger(link, approval, ledger, now, sticky) with this replica's sticky
381
+ * set, then binds the empty store (or applies the replica rule to a bound store of the same account); the request's bridge must be in
382
+ * the resulting trusted roster. Returns trusted(). Throws LedgerStoreError('ledger_store_pairing_rejected') and writes nothing on any
383
+ * pairing failure.
384
+ */
385
+ adoptPaired(link, approval, ledger, now) {
386
+ const replica = this.replica;
387
+ return serialized(replica.file, async () => {
388
+ const at = now === undefined ? replica.clock() : now;
389
+ const stored = await load(replica);
390
+ const rejected = () => new LedgerStoreError('ledger_store_pairing_rejected');
391
+ let parsed;
392
+ try {
393
+ parsed = parseLedger(ledger);
394
+ }
395
+ catch {
396
+ throw rejected();
397
+ }
398
+ const bound = stored === null ? replica.accountId : stored.checkpoint.accountId;
399
+ if (bound !== null && await accountIdOf(parsed.genesis.payload) !== bound)
400
+ throw rejected();
401
+ const sticky = union(stored === null ? { deviceIds: [], bridgeIds: [] } : stored.sticky, ledgerRevocations(parsed));
402
+ try {
403
+ await confirmPairedLedger(link, approval, parsed, at, sticky);
404
+ }
405
+ catch {
406
+ throw rejected();
407
+ }
408
+ const request = link.request;
409
+ const endpointId = createHash('sha256').update(Buffer.from(request.endpointPublicKey, 'base64url')).digest('base64url');
410
+ return admit(replica, stored, parsed, at, trusted => lists(trusted, request.bridgeId, endpointId, request.authPublicKey), 'ledger_store_pairing_rejected');
411
+ });
412
+ }
413
+ /**
414
+ * Recovery when the identity is bound but the store is empty (reconcileIdentityAndStore returned 'needs_ledger'): accepts a server
415
+ * ledger only if its account is the identity's bound account and its trusted roster lists this identity's bridge keys (endpoint id and
416
+ * authPublicKey). Returns trusted(). Throws LedgerStoreError('ledger_store_bound_rejected') and writes nothing otherwise.
417
+ */
418
+ adoptBound(ledger, now) {
419
+ const replica = this.replica;
420
+ return serialized(replica.file, async () => {
421
+ const at = now === undefined ? replica.clock() : now;
422
+ const rejected = () => new LedgerStoreError('ledger_store_bound_rejected');
423
+ const identity = await readLedgerIdentity(replica.dataDir);
424
+ if (identity === null || identity.accountId === null)
425
+ throw rejected();
426
+ const stored = await load(replica);
427
+ let parsed;
428
+ try {
429
+ parsed = parseLedger(ledger);
430
+ }
431
+ catch {
432
+ throw rejected();
433
+ }
434
+ const accountId = await accountIdOf(parsed.genesis.payload);
435
+ if (accountId !== identity.accountId)
436
+ throw rejected();
437
+ if ((replica.accountId !== null && accountId !== replica.accountId) || (stored !== null && accountId !== stored.checkpoint.accountId))
438
+ throw rejected();
439
+ return admit(replica, stored, parsed, at, trusted => lists(trusted, null, identity.endpointId, identity.authPublicKey), 'ledger_store_bound_rejected');
440
+ });
441
+ }
442
+ /** Records the time of the last successful server ledger read. No-op while no ledger is stored. */
443
+ markServerRead(now) {
444
+ if (!isTime(now))
445
+ return Promise.reject(new TypeError('Invalid server read time'));
446
+ return serialized(this.replica.file, async () => {
447
+ const state = await load(this.replica);
448
+ if (state === null || state.lastServerReadAt === now)
449
+ return;
450
+ await save(this.replica, { ...state, lastServerReadAt: now });
451
+ });
452
+ }
453
+ }
454
+ /**
455
+ * Startup recovery between the identity file and the ledger store, under the store's queue:
456
+ * - identity bound, store holds its account's ledger -> 'ok'; store holds another account's -> throws ledger_store_wrong_account;
457
+ * - identity bound, store empty -> 'needs_ledger' (fetch the server ledger, then adoptBound); a bound identity is never unbound;
458
+ * - identity unbound (or absent), store empty -> 'unpaired';
459
+ * - identity unbound, store's trusted roster lists this identity's bridge keys -> binds the identity to that account -> 'ok';
460
+ * - otherwise (absent identity, or keys not listed) the stale ledger.json is deleted -> 'unpaired'.
461
+ * Corrupted files throw (LedgerStoreError / BridgeSecurityError('key_unavailable')) and are never reset.
462
+ */
463
+ export function reconcileIdentityAndStore(dataDir, options = {}) {
464
+ const replica = replicaOf(dataDir, { now: options.now });
465
+ return serialized(replica.file, async () => {
466
+ const identity = await readLedgerIdentity(dataDir);
467
+ const stored = await load(replica);
468
+ if (identity !== null && identity.accountId !== null) {
469
+ if (stored === null)
470
+ return 'needs_ledger';
471
+ if (stored.checkpoint.accountId !== identity.accountId)
472
+ throw new LedgerStoreError('ledger_store_wrong_account');
473
+ return 'ok';
474
+ }
475
+ if (stored === null)
476
+ return 'unpaired';
477
+ if (identity !== null && lists(stored.trusted, null, identity.endpointId, identity.authPublicKey)) {
478
+ await bindLedgerIdentity(dataDir, stored.checkpoint.accountId);
479
+ return 'ok';
480
+ }
481
+ await erase(replica);
482
+ return 'unpaired';
483
+ });
484
+ }
485
+ //# sourceMappingURL=ledger-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.js","sourceRoot":"","sources":["../../../src/security/bridge/ledger-store.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,8 @@ export declare const endpointSchema: z.ZodObject<{
5
5
  id: z.ZodString;
6
6
  ownerId: z.ZodString;
7
7
  kind: z.ZodEnum<{
8
- browser: "browser";
9
8
  bridge: "bridge";
9
+ browser: "browser";
10
10
  "local-cli": "local-cli";
11
11
  }>;
12
12
  publicKey: z.ZodString;
@@ -22,8 +22,8 @@ export declare const approvedSchema: z.ZodObject<{
22
22
  id: z.ZodString;
23
23
  ownerId: z.ZodString;
24
24
  kind: z.ZodEnum<{
25
- browser: "browser";
26
25
  bridge: "bridge";
26
+ browser: "browser";
27
27
  "local-cli": "local-cli";
28
28
  }>;
29
29
  publicKey: z.ZodString;
@@ -3,8 +3,8 @@ const session = /^[A-Za-z0-9_-]+$/;
3
3
  const readCommands = new Set(['get_pull_request_statuses', 'session_preview_status', 'session_preview_chunk', 'get_bridge_update', 'list_sessions', 'get_history', 'get_session_usage', 'get_sessions_usage', 'get_session_attention']);
4
4
  const controlCommands = new Set(['update_bridge', 'create_session', 'stop_session', 'retry_session', 'send_message', 'rename_session', 'remove_session',
5
5
  'bridge_exec', 'clear_terminal', 'update_session_parent', 'resolve_session_attention', 'answer_session_attention']);
6
- const adminCommands = new Set(['security_devices', 'security_invite', 'security_revoke', 'security_account_adopt']);
7
- const result = (permission, operation, sessionId = null) => ({ permission, mutating: permission === 'control' || ['security_invite', 'security_revoke', 'security_account_adopt'].includes(operation), operation, sessionId });
6
+ const adminCommands = new Set(['security_devices', 'security_invite', 'security_revoke']);
7
+ const result = (permission, operation, sessionId = null) => ({ permission, mutating: permission === 'control' || ['security_invite', 'security_revoke'].includes(operation), operation, sessionId });
8
8
  const deny = () => { throw new BridgeSecurityError('permission_denied'); };
9
9
  const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
10
10
  /** Deliberately semantic: GET inbox consumes mail unless explicitly non-consuming. */
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/security/bridge/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/security/bridge/permissions.ts"],"names":[],"mappings":"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"}