@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.
- package/README.md +110 -0
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +14 -2
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +8 -11
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
- package/dist/ai/claudeSdkProvider.js +9 -14
- package/dist/ai/claudeSdkProvider.js.map +1 -1
- package/dist/ai/enrichEntry.d.ts +11 -0
- package/dist/ai/enrichEntry.d.ts.map +1 -0
- package/dist/ai/enrichEntry.js +27 -0
- package/dist/ai/enrichEntry.js.map +1 -0
- package/dist/ai/provider.d.ts +6 -0
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/sandboxMcp.d.ts +41 -3
- package/dist/ai/sandboxMcp.d.ts.map +1 -1
- package/dist/ai/sandboxMcp.js +44 -3
- package/dist/ai/sandboxMcp.js.map +1 -1
- package/dist/ai/sandboxMcpStdio.js +103 -9
- package/dist/ai/sandboxMcpStdio.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +23 -5
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +160 -22
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/sessionRegistry.d.ts +57 -6
- package/dist/ai/sessionRegistry.d.ts.map +1 -1
- package/dist/ai/sessionRegistry.js +237 -31
- package/dist/ai/sessionRegistry.js.map +1 -1
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +86 -0
- package/dist/config.js.map +1 -1
- package/dist/connection/connection.d.ts +61 -0
- package/dist/connection/connection.d.ts.map +1 -1
- package/dist/connection/connection.js +274 -1
- package/dist/connection/connection.js.map +1 -1
- package/dist/connection/relay.d.ts +20 -0
- package/dist/connection/relay.d.ts.map +1 -1
- package/dist/connection/relay.js +62 -1
- package/dist/connection/relay.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +10 -6
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +59 -62
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +74 -5
- package/dist/index.js.map +1 -1
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/ipcServer.d.ts.map +1 -1
- package/dist/service/ipcServer.js +10 -4
- package/dist/service/ipcServer.js.map +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +69 -27
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.d.ts +15 -0
- package/dist/service/types.d.ts.map +1 -1
- package/dist/service/types.js +6 -2
- package/dist/service/types.js.map +1 -1
- package/dist/tombstoneCheck.d.ts +43 -0
- package/dist/tombstoneCheck.d.ts.map +1 -0
- package/dist/tombstoneCheck.js +96 -0
- package/dist/tombstoneCheck.js.map +1 -0
- 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
|
-
*
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
301
|
+
}
|
|
302
|
+
writeArchivedFile(entry) {
|
|
118
303
|
try {
|
|
119
|
-
const
|
|
120
|
-
|
|
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
|
|
310
|
+
console.error(`[sessionRegistry] Failed to write archived entry session=${entry.sessionId}:`, err);
|
|
124
311
|
}
|
|
125
|
-
return true;
|
|
126
312
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (!
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
326
|
+
unlinkArchivedFile(cwd, sessionId) {
|
|
327
|
+
const path = this.archivedFilePath(cwd, sessionId);
|
|
328
|
+
if (!existsSync(path))
|
|
329
|
+
return false;
|
|
136
330
|
try {
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
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
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAgB,MAAM,2BAA2B,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|