@sumicom/quicksave 0.7.0 → 0.8.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 (64) hide show
  1. package/README.md +110 -0
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +14 -2
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  6. package/dist/ai/claudeCliProvider.js +8 -11
  7. package/dist/ai/claudeCliProvider.js.map +1 -1
  8. package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
  9. package/dist/ai/claudeSdkProvider.js +9 -14
  10. package/dist/ai/claudeSdkProvider.js.map +1 -1
  11. package/dist/ai/enrichEntry.d.ts +11 -0
  12. package/dist/ai/enrichEntry.d.ts.map +1 -0
  13. package/dist/ai/enrichEntry.js +27 -0
  14. package/dist/ai/enrichEntry.js.map +1 -0
  15. package/dist/ai/provider.d.ts +6 -0
  16. package/dist/ai/provider.d.ts.map +1 -1
  17. package/dist/ai/sandboxMcp.d.ts +41 -3
  18. package/dist/ai/sandboxMcp.d.ts.map +1 -1
  19. package/dist/ai/sandboxMcp.js +44 -3
  20. package/dist/ai/sandboxMcp.js.map +1 -1
  21. package/dist/ai/sandboxMcpStdio.js +103 -9
  22. package/dist/ai/sandboxMcpStdio.js.map +1 -1
  23. package/dist/ai/sessionManager.d.ts +23 -5
  24. package/dist/ai/sessionManager.d.ts.map +1 -1
  25. package/dist/ai/sessionManager.js +160 -22
  26. package/dist/ai/sessionManager.js.map +1 -1
  27. package/dist/ai/sessionRegistry.d.ts +57 -6
  28. package/dist/ai/sessionRegistry.d.ts.map +1 -1
  29. package/dist/ai/sessionRegistry.js +237 -31
  30. package/dist/ai/sessionRegistry.js.map +1 -1
  31. package/dist/config.d.ts +41 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +86 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/connection/connection.d.ts +61 -0
  36. package/dist/connection/connection.d.ts.map +1 -1
  37. package/dist/connection/connection.js +274 -1
  38. package/dist/connection/connection.js.map +1 -1
  39. package/dist/connection/relay.d.ts +20 -0
  40. package/dist/connection/relay.d.ts.map +1 -1
  41. package/dist/connection/relay.js +62 -1
  42. package/dist/connection/relay.js.map +1 -1
  43. package/dist/handlers/messageHandler.d.ts +10 -6
  44. package/dist/handlers/messageHandler.d.ts.map +1 -1
  45. package/dist/handlers/messageHandler.js +59 -62
  46. package/dist/handlers/messageHandler.js.map +1 -1
  47. package/dist/index.js +74 -5
  48. package/dist/index.js.map +1 -1
  49. package/dist/service/ipcClient.js +1 -1
  50. package/dist/service/ipcServer.d.ts.map +1 -1
  51. package/dist/service/ipcServer.js +10 -4
  52. package/dist/service/ipcServer.js.map +1 -1
  53. package/dist/service/run.d.ts.map +1 -1
  54. package/dist/service/run.js +69 -27
  55. package/dist/service/run.js.map +1 -1
  56. package/dist/service/types.d.ts +15 -0
  57. package/dist/service/types.d.ts.map +1 -1
  58. package/dist/service/types.js +6 -2
  59. package/dist/service/types.js.map +1 -1
  60. package/dist/tombstoneCheck.d.ts +43 -0
  61. package/dist/tombstoneCheck.d.ts.map +1 -0
  62. package/dist/tombstoneCheck.js +96 -0
  63. package/dist/tombstoneCheck.js.map +1 -0
  64. package/package.json +3 -3
@@ -2,23 +2,33 @@
2
2
  * Session registry — tracks which sessions have been opened via quicksave.
3
3
  *
4
4
  * Storage layout:
5
- * ~/.quicksave/state/session-registry/{encoded-project-path}/{sessionId}.json
5
+ * ~/.quicksave/state/session-registry/{encoded-project-path}/{sessionId}.json ← active
6
+ * ~/.quicksave/state/session-registry/archived/{encoded-project-path}/{sessionId}.json ← cold
6
7
  *
7
8
  * Path encoding: `/` → `-` (same convention as Claude Code's ~/.claude/projects/).
8
9
  *
9
- * In-memory: two-level Map<cwd, Map<sessionId, entry>>.
10
- * Loaded once at daemon startup; writes update memory + single file synchronously.
10
+ * In-memory: two-level Map<cwd, Map<sessionId, entry>> holding ONLY active entries.
11
+ * Archived entries live on disk only; they're read on-demand when the caller
12
+ * asks for them (listArchivedEntries / readArchivedEntry) and moved between
13
+ * the two subtrees when the `archived` flag is flipped via upsertEntry /
14
+ * updateEntry.
15
+ *
16
+ * This keeps daemon cold-start and PWA sync bandwidth proportional to the
17
+ * number of *active* sessions, not the full historical total.
11
18
  */
12
19
  import { readdirSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, existsSync, statSync, } from 'fs';
13
20
  import { join } from 'path';
14
21
  import { getSessionRegistryDir } from '../service/singleton.js';
22
+ const ARCHIVED_SUBDIR = 'archived';
15
23
  function encodeProjectPath(cwd) {
16
24
  return cwd.replace(/\//g, '-');
17
25
  }
18
26
  export class SessionRegistry {
19
27
  registry = new Map();
20
28
  /**
21
- * Scan session-registry directory and load all entries into memory.
29
+ * Scan session-registry directory and load all ACTIVE entries into memory.
30
+ * Entries found with `archived: true` in the active subtree are migrated
31
+ * to the archived subtree (one-time legacy migration) and not loaded.
22
32
  */
23
33
  loadAll() {
24
34
  const baseDir = getSessionRegistryDir();
@@ -32,7 +42,10 @@ export class SessionRegistry {
32
42
  console.error('[sessionRegistry] Failed to read registry dir:', err);
33
43
  return;
34
44
  }
45
+ let migrated = 0;
35
46
  for (const subdir of subdirs) {
47
+ if (subdir === ARCHIVED_SUBDIR)
48
+ continue; // never load archived into memory
36
49
  const subdirPath = join(baseDir, subdir);
37
50
  try {
38
51
  if (!statSync(subdirPath).isDirectory())
@@ -49,13 +62,26 @@ export class SessionRegistry {
49
62
  continue;
50
63
  }
51
64
  for (const file of files) {
65
+ const filePath = join(subdirPath, file);
52
66
  try {
53
- const raw = readFileSync(join(subdirPath, file), 'utf-8');
67
+ const raw = readFileSync(filePath, 'utf-8');
54
68
  const entry = JSON.parse(raw);
55
69
  if (!entry.sessionId || !entry.cwd) {
56
70
  console.warn(`[sessionRegistry] Skipping invalid entry: ${join(subdir, file)}`);
57
71
  continue;
58
72
  }
73
+ if (entry.archived) {
74
+ // Legacy migration: archived entry in the active subtree → move it.
75
+ this.writeArchivedFile(entry);
76
+ try {
77
+ unlinkSync(filePath);
78
+ migrated++;
79
+ }
80
+ catch (err) {
81
+ console.warn(`[sessionRegistry] Migration: failed to remove active copy ${filePath}`, err);
82
+ }
83
+ continue;
84
+ }
59
85
  this.setInMemory(entry);
60
86
  }
61
87
  catch (err) {
@@ -64,12 +90,13 @@ export class SessionRegistry {
64
90
  }
65
91
  }
66
92
  const totalEntries = Array.from(this.registry.values()).reduce((sum, m) => sum + m.size, 0);
67
- console.log(`[sessionRegistry] Loaded ${totalEntries} entries from ${this.registry.size} projects`);
93
+ const migrationNote = migrated > 0 ? ` (migrated ${migrated} archived entries)` : '';
94
+ console.log(`[sessionRegistry] Loaded ${totalEntries} active entries from ${this.registry.size} projects${migrationNote}`);
68
95
  }
69
96
  getEntry(cwd, sessionId) {
70
97
  return this.registry.get(cwd)?.get(sessionId);
71
98
  }
72
- /** Scan all projects for a session by id. O(n) over projects; small registries only. */
99
+ /** Scan active projects for a session by id. Archived entries are NOT searched. */
73
100
  findBySessionId(sessionId) {
74
101
  for (const projectMap of this.registry.values()) {
75
102
  const entry = projectMap.get(sessionId);
@@ -78,6 +105,7 @@ export class SessionRegistry {
78
105
  }
79
106
  return undefined;
80
107
  }
108
+ /** Active entries only — archived entries are never in memory. */
81
109
  getEntriesForProject(cwd) {
82
110
  if (cwd) {
83
111
  const projectMap = this.registry.get(cwd);
@@ -85,7 +113,6 @@ export class SessionRegistry {
85
113
  return [];
86
114
  return Array.from(projectMap.values()).sort((a, b) => b.lastAccessedAt - a.lastAccessedAt);
87
115
  }
88
- // Return all entries across all projects
89
116
  const all = [];
90
117
  for (const projectMap of this.registry.values()) {
91
118
  for (const entry of projectMap.values()) {
@@ -94,55 +121,234 @@ export class SessionRegistry {
94
121
  }
95
122
  return all.sort((a, b) => b.lastAccessedAt - a.lastAccessedAt);
96
123
  }
124
+ /** Read a single archived entry from disk (not cached in memory). */
125
+ readArchivedEntry(cwd, sessionId) {
126
+ const path = this.archivedFilePath(cwd, sessionId);
127
+ if (!existsSync(path))
128
+ return undefined;
129
+ try {
130
+ const raw = readFileSync(path, 'utf-8');
131
+ const entry = JSON.parse(raw);
132
+ if (!entry.sessionId || !entry.cwd)
133
+ return undefined;
134
+ return entry;
135
+ }
136
+ catch (err) {
137
+ console.warn(`[sessionRegistry] Failed to read archived entry ${sessionId}:`, err);
138
+ return undefined;
139
+ }
140
+ }
141
+ /**
142
+ * List archived entries from disk for a project (or across all projects).
143
+ * Reads and parses files on demand — do not call on a hot path.
144
+ */
145
+ listArchivedEntries(cwd) {
146
+ const archivedRoot = join(getSessionRegistryDir(), ARCHIVED_SUBDIR);
147
+ if (!existsSync(archivedRoot))
148
+ return [];
149
+ const entries = [];
150
+ const projectDirs = cwd ? [encodeProjectPath(cwd)] : this.listArchivedProjectDirs(archivedRoot);
151
+ for (const projectDir of projectDirs) {
152
+ const projectPath = join(archivedRoot, projectDir);
153
+ let files;
154
+ try {
155
+ files = readdirSync(projectPath).filter((f) => f.endsWith('.json'));
156
+ }
157
+ catch {
158
+ continue;
159
+ }
160
+ for (const file of files) {
161
+ try {
162
+ const raw = readFileSync(join(projectPath, file), 'utf-8');
163
+ const entry = JSON.parse(raw);
164
+ if (entry.sessionId && entry.cwd)
165
+ entries.push(entry);
166
+ }
167
+ catch (err) {
168
+ console.warn(`[sessionRegistry] Skipping malformed archived file ${file}:`, err);
169
+ }
170
+ }
171
+ }
172
+ return entries.sort((a, b) => b.lastAccessedAt - a.lastAccessedAt);
173
+ }
174
+ /**
175
+ * Paginated archived listing. Two-phase so the read cost scales with the
176
+ * page size, not the total archive count:
177
+ * 1. `readdir` + `stat` every archived JSON for its mtime (cheap —
178
+ * no file open, no parse).
179
+ * 2. Sort by mtime desc, slice to [offset, offset+limit), then parse
180
+ * only the selected page.
181
+ *
182
+ * mtime is set at `upsertEntry` time so it equals the moment the session
183
+ * was archived — which is also what the UI wants as "most recently
184
+ * archived first". We ignore the JSON's `lastAccessedAt` here because
185
+ * reading it would require parsing the whole archive.
186
+ */
187
+ listArchivedEntriesPage(cwd, offset, limit) {
188
+ const archivedRoot = join(getSessionRegistryDir(), ARCHIVED_SUBDIR);
189
+ if (!existsSync(archivedRoot))
190
+ return { entries: [], total: 0 };
191
+ const projectDirs = cwd ? [encodeProjectPath(cwd)] : this.listArchivedProjectDirs(archivedRoot);
192
+ const candidates = [];
193
+ for (const projectDir of projectDirs) {
194
+ const projectPath = join(archivedRoot, projectDir);
195
+ let files;
196
+ try {
197
+ files = readdirSync(projectPath).filter((f) => f.endsWith('.json'));
198
+ }
199
+ catch {
200
+ continue;
201
+ }
202
+ for (const file of files) {
203
+ const fullPath = join(projectPath, file);
204
+ try {
205
+ candidates.push({ path: fullPath, mtimeMs: statSync(fullPath).mtimeMs });
206
+ }
207
+ catch {
208
+ // file vanished between readdir and stat — ignore
209
+ }
210
+ }
211
+ }
212
+ candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
213
+ const total = candidates.length;
214
+ const safeOffset = Math.max(0, offset | 0);
215
+ const safeLimit = Math.max(0, limit | 0);
216
+ const page = candidates.slice(safeOffset, safeOffset + safeLimit);
217
+ const entries = [];
218
+ for (const { path } of page) {
219
+ try {
220
+ const raw = readFileSync(path, 'utf-8');
221
+ const entry = JSON.parse(raw);
222
+ if (entry.sessionId && entry.cwd)
223
+ entries.push(entry);
224
+ }
225
+ catch (err) {
226
+ console.warn(`[sessionRegistry] Skipping malformed archived file ${path}:`, err);
227
+ }
228
+ }
229
+ return { entries, total };
230
+ }
231
+ /**
232
+ * Persist an entry. Routes to active or archived subtree based on
233
+ * `entry.archived`, and removes any stale copy from the other subtree so
234
+ * transitions (archive / unarchive) are atomic from the caller's view.
235
+ */
97
236
  upsertEntry(entry) {
98
- this.setInMemory(entry);
99
- this.writeToDisk(entry);
237
+ if (entry.archived) {
238
+ this.removeFromMemory(entry.cwd, entry.sessionId);
239
+ this.unlinkActiveFile(entry.cwd, entry.sessionId);
240
+ this.writeArchivedFile(entry);
241
+ }
242
+ else {
243
+ this.unlinkArchivedFile(entry.cwd, entry.sessionId);
244
+ this.setInMemory(entry);
245
+ this.writeActiveFile(entry);
246
+ }
100
247
  }
248
+ /**
249
+ * Merge a partial update into an existing entry (active or archived).
250
+ * Returns the updated entry, or null if no entry with that id exists.
251
+ */
101
252
  updateEntry(cwd, sessionId, updates) {
102
- const existing = this.getEntry(cwd, sessionId);
253
+ const existing = this.getEntry(cwd, sessionId) ?? this.readArchivedEntry(cwd, sessionId);
103
254
  if (!existing)
104
255
  return null;
105
256
  const updated = { ...existing, ...updates };
106
257
  this.upsertEntry(updated);
107
258
  return updated;
108
259
  }
260
+ /** Remove from memory + both disk subtrees. */
109
261
  deleteEntry(cwd, sessionId) {
262
+ const hadInMemory = this.removeFromMemory(cwd, sessionId);
263
+ const removedActive = this.unlinkActiveFile(cwd, sessionId);
264
+ const removedArchived = this.unlinkArchivedFile(cwd, sessionId);
265
+ return hadInMemory || removedActive || removedArchived;
266
+ }
267
+ // ── internals ────────────────────────────────────────────────────────────
268
+ setInMemory(entry) {
269
+ let projectMap = this.registry.get(entry.cwd);
270
+ if (!projectMap) {
271
+ projectMap = new Map();
272
+ this.registry.set(entry.cwd, projectMap);
273
+ }
274
+ projectMap.set(entry.sessionId, entry);
275
+ }
276
+ removeFromMemory(cwd, sessionId) {
110
277
  const projectMap = this.registry.get(cwd);
111
278
  if (!projectMap || !projectMap.has(sessionId))
112
279
  return false;
113
280
  projectMap.delete(sessionId);
114
- if (projectMap.size === 0) {
281
+ if (projectMap.size === 0)
115
282
  this.registry.delete(cwd);
283
+ return true;
284
+ }
285
+ activeFilePath(cwd, sessionId) {
286
+ return join(getSessionRegistryDir(), encodeProjectPath(cwd), `${sessionId}.json`);
287
+ }
288
+ archivedFilePath(cwd, sessionId) {
289
+ return join(getSessionRegistryDir(), ARCHIVED_SUBDIR, encodeProjectPath(cwd), `${sessionId}.json`);
290
+ }
291
+ writeActiveFile(entry) {
292
+ try {
293
+ const dir = join(getSessionRegistryDir(), encodeProjectPath(entry.cwd));
294
+ if (!existsSync(dir))
295
+ mkdirSync(dir, { recursive: true });
296
+ writeFileSync(this.activeFilePath(entry.cwd, entry.sessionId), JSON.stringify(entry, null, 2) + '\n', 'utf-8');
297
+ }
298
+ catch (err) {
299
+ console.error(`[sessionRegistry] Failed to write active entry session=${entry.sessionId}:`, err);
116
300
  }
117
- // Remove file
301
+ }
302
+ writeArchivedFile(entry) {
118
303
  try {
119
- const filePath = join(getSessionRegistryDir(), encodeProjectPath(cwd), `${sessionId}.json`);
120
- unlinkSync(filePath);
304
+ const dir = join(getSessionRegistryDir(), ARCHIVED_SUBDIR, encodeProjectPath(entry.cwd));
305
+ if (!existsSync(dir))
306
+ mkdirSync(dir, { recursive: true });
307
+ writeFileSync(this.archivedFilePath(entry.cwd, entry.sessionId), JSON.stringify(entry, null, 2) + '\n', 'utf-8');
121
308
  }
122
309
  catch (err) {
123
- console.error(`[sessionRegistry] Failed to delete file for session=${sessionId}:`, err);
310
+ console.error(`[sessionRegistry] Failed to write archived entry session=${entry.sessionId}:`, err);
124
311
  }
125
- return true;
126
312
  }
127
- setInMemory(entry) {
128
- let projectMap = this.registry.get(entry.cwd);
129
- if (!projectMap) {
130
- projectMap = new Map();
131
- this.registry.set(entry.cwd, projectMap);
313
+ unlinkActiveFile(cwd, sessionId) {
314
+ const path = this.activeFilePath(cwd, sessionId);
315
+ if (!existsSync(path))
316
+ return false;
317
+ try {
318
+ unlinkSync(path);
319
+ return true;
320
+ }
321
+ catch (err) {
322
+ console.error(`[sessionRegistry] Failed to unlink active file session=${sessionId}:`, err);
323
+ return false;
132
324
  }
133
- projectMap.set(entry.sessionId, entry);
134
325
  }
135
- writeToDisk(entry) {
326
+ unlinkArchivedFile(cwd, sessionId) {
327
+ const path = this.archivedFilePath(cwd, sessionId);
328
+ if (!existsSync(path))
329
+ return false;
136
330
  try {
137
- const dir = join(getSessionRegistryDir(), encodeProjectPath(entry.cwd));
138
- if (!existsSync(dir)) {
139
- mkdirSync(dir, { recursive: true });
140
- }
141
- const filePath = join(dir, `${entry.sessionId}.json`);
142
- writeFileSync(filePath, JSON.stringify(entry, null, 2) + '\n', 'utf-8');
331
+ unlinkSync(path);
332
+ return true;
143
333
  }
144
334
  catch (err) {
145
- console.error(`[sessionRegistry] Failed to write entry for session=${entry.sessionId}:`, err);
335
+ console.error(`[sessionRegistry] Failed to unlink archived file session=${sessionId}:`, err);
336
+ return false;
337
+ }
338
+ }
339
+ listArchivedProjectDirs(archivedRoot) {
340
+ try {
341
+ return readdirSync(archivedRoot).filter((d) => {
342
+ try {
343
+ return statSync(join(archivedRoot, d)).isDirectory();
344
+ }
345
+ catch {
346
+ return false;
347
+ }
348
+ });
349
+ }
350
+ catch {
351
+ return [];
146
352
  }
147
353
  }
148
354
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessionRegistry.js","sourceRoot":"","sources":["../../src/ai/sessionRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionRegistry.js","sourceRoot":"","sources":["../../src/ai/sessionRegistry.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -9,6 +9,24 @@ export interface AgentConfig {
9
9
  publicKey: string;
10
10
  secretKey: string;
11
11
  };
12
+ /**
13
+ * TOFU-pinned PWA group identity. `null` on a fresh / closed agent, which
14
+ * accepts the first successful V2 handshake as the trust anchor and writes
15
+ * both fields here. Once pinned, subsequent handshakes must prove possession
16
+ * of the same Ed25519 signing key before they are accepted.
17
+ *
18
+ * Cleared (set back to `null`) when a tombstone is observed on the pinned
19
+ * mailbox — the agent then enters the "closed" state until the user runs
20
+ * `quicksave pair` again.
21
+ */
22
+ peerPWAPublicKey?: string | null;
23
+ peerPWASignPublicKey?: string | null;
24
+ /**
25
+ * Sticky self-destruct flag set after a verified tombstone. Persists across
26
+ * daemon restarts so a crash/restart window can't silently re-open TOFU.
27
+ * Cleared only by `unlockPairingAndRotate()` (driven by `quicksave pair`).
28
+ */
29
+ closed?: boolean;
12
30
  license?: License;
13
31
  signalingServer: string;
14
32
  anthropicApiKey?: string;
@@ -36,4 +54,27 @@ export declare function removeManagedCodingPath(path: string): void;
36
54
  * This invalidates all existing PWA connections.
37
55
  */
38
56
  export declare function rotateKeyPair(): AgentConfig;
57
+ /** True iff the agent has TOFU-pinned a PWA group identity. */
58
+ export declare function isPaired(config?: AgentConfig): boolean;
59
+ /**
60
+ * Pin the given PWA group identity as this agent's trust anchor. Idempotent
61
+ * if the same pair is already stored; throws if a *different* pair is already
62
+ * pinned (caller must `clearPeerPWA` first, which is the tombstone path).
63
+ */
64
+ export declare function pinPeerPWA(peerPWAPublicKey: string, peerPWASignPublicKey: string): AgentConfig;
65
+ /**
66
+ * Forget the pinned PWA group identity. Called when a signed tombstone is
67
+ * observed on the pinned mailbox. Rotates the agent's entire cryptographic
68
+ * identity (`agentId`, X25519 box keypair, Ed25519 signing keypair) so the
69
+ * old routing address and keys can no longer be used, and sets `closed: true`
70
+ * so the agent refuses every inbound handshake until `quicksave pair`.
71
+ */
72
+ export declare function clearPeerPWA(): AgentConfig;
73
+ /**
74
+ * Lift the `closed` gate and produce a fresh agent identity. Called by the
75
+ * `quicksave pair` CLI path: even if the agent was already in a fresh state
76
+ * after tombstone, rotating again here means each new pairing attempt comes
77
+ * with an unburdened identity — no lingering state from prior pairings.
78
+ */
79
+ export declare function unlockPairingAndRotate(): AgentConfig;
39
80
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGjH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAID,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAU/C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CASxE;AAED,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAsBtE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAMjD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAGD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUpD;AAGD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAQ3C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGjH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAID,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAU/C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAYxE;AAED,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAmCtE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAMjD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAGD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUpD;AAGD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAQ3C;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,MAAM,GAAE,WAA2B,GAAG,OAAO,CAMrE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,EAAE,MAAM,GAC3B,WAAW,CAqBb;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,WAAW,CAa1C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,WAAW,CAapD"}
package/dist/config.js CHANGED
@@ -30,6 +30,9 @@ export function createDefaultConfig(signalingServer) {
30
30
  agentId: generateAgentId(),
31
31
  keyPair: generateAgentKeyPair(),
32
32
  signKeyPair: encodeKeyPair(generateSigningKeyPair()),
33
+ peerPWAPublicKey: null,
34
+ peerPWASignPublicKey: null,
35
+ closed: false,
33
36
  signalingServer,
34
37
  };
35
38
  saveConfig(config);
@@ -49,6 +52,19 @@ export function getOrCreateConfig(signalingServer) {
49
52
  config.signKeyPair = encodeKeyPair(generateSigningKeyPair());
50
53
  dirty = true;
51
54
  }
55
+ // Pre-TOFU configs are legacy unpaired → normalize missing fields to null.
56
+ if (config.peerPWAPublicKey === undefined) {
57
+ config.peerPWAPublicKey = null;
58
+ dirty = true;
59
+ }
60
+ if (config.peerPWASignPublicKey === undefined) {
61
+ config.peerPWASignPublicKey = null;
62
+ dirty = true;
63
+ }
64
+ if (config.closed === undefined) {
65
+ config.closed = false;
66
+ dirty = true;
67
+ }
52
68
  if (config.signalingServer !== signalingServer) {
53
69
  config.signalingServer = signalingServer;
54
70
  dirty = true;
@@ -145,4 +161,74 @@ export function rotateKeyPair() {
145
161
  saveConfig(config);
146
162
  return config;
147
163
  }
164
+ /** True iff the agent has TOFU-pinned a PWA group identity. */
165
+ export function isPaired(config = loadConfig()) {
166
+ return (!!config &&
167
+ !!config.peerPWAPublicKey &&
168
+ !!config.peerPWASignPublicKey);
169
+ }
170
+ /**
171
+ * Pin the given PWA group identity as this agent's trust anchor. Idempotent
172
+ * if the same pair is already stored; throws if a *different* pair is already
173
+ * pinned (caller must `clearPeerPWA` first, which is the tombstone path).
174
+ */
175
+ export function pinPeerPWA(peerPWAPublicKey, peerPWASignPublicKey) {
176
+ const config = loadConfig();
177
+ if (!config) {
178
+ throw new Error('No config found. Run the agent first to generate a config.');
179
+ }
180
+ if (config.peerPWAPublicKey && config.peerPWASignPublicKey) {
181
+ if (config.peerPWAPublicKey === peerPWAPublicKey &&
182
+ config.peerPWASignPublicKey === peerPWASignPublicKey) {
183
+ return config;
184
+ }
185
+ throw new Error('Agent is already paired with a different PWA group identity. ' +
186
+ 'Clear the pairing (rotate-keys tombstone or manual reset) first.');
187
+ }
188
+ config.peerPWAPublicKey = peerPWAPublicKey;
189
+ config.peerPWASignPublicKey = peerPWASignPublicKey;
190
+ saveConfig(config);
191
+ return config;
192
+ }
193
+ /**
194
+ * Forget the pinned PWA group identity. Called when a signed tombstone is
195
+ * observed on the pinned mailbox. Rotates the agent's entire cryptographic
196
+ * identity (`agentId`, X25519 box keypair, Ed25519 signing keypair) so the
197
+ * old routing address and keys can no longer be used, and sets `closed: true`
198
+ * so the agent refuses every inbound handshake until `quicksave pair`.
199
+ */
200
+ export function clearPeerPWA() {
201
+ const config = loadConfig();
202
+ if (!config) {
203
+ throw new Error('No config found.');
204
+ }
205
+ config.peerPWAPublicKey = null;
206
+ config.peerPWASignPublicKey = null;
207
+ config.agentId = generateAgentId();
208
+ config.keyPair = generateAgentKeyPair();
209
+ config.signKeyPair = encodeKeyPair(generateSigningKeyPair());
210
+ config.closed = true;
211
+ saveConfig(config);
212
+ return config;
213
+ }
214
+ /**
215
+ * Lift the `closed` gate and produce a fresh agent identity. Called by the
216
+ * `quicksave pair` CLI path: even if the agent was already in a fresh state
217
+ * after tombstone, rotating again here means each new pairing attempt comes
218
+ * with an unburdened identity — no lingering state from prior pairings.
219
+ */
220
+ export function unlockPairingAndRotate() {
221
+ const config = loadConfig();
222
+ if (!config) {
223
+ throw new Error('No config found.');
224
+ }
225
+ config.peerPWAPublicKey = null;
226
+ config.peerPWASignPublicKey = null;
227
+ config.agentId = generateAgentId();
228
+ config.keyPair = generateAgentKeyPair();
229
+ config.signKeyPair = encodeKeyPair(generateSigningKeyPair());
230
+ config.closed = false;
231
+ saveConfig(config);
232
+ return config;
233
+ }
148
234
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}