ftown 0.24.0 → 0.25.1

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 (75) hide show
  1. package/dist/agent-commands.d.ts +4 -2
  2. package/dist/agent-commands.js +1 -1
  3. package/dist/agent-commands.js.map +1 -1
  4. package/dist/antigravity-hook-installer.d.ts +26 -0
  5. package/dist/antigravity-hook-installer.js +225 -0
  6. package/dist/antigravity-hook-installer.js.map +1 -0
  7. package/dist/ask-question-hook.d.ts +11 -0
  8. package/dist/ask-question-hook.js +37 -1
  9. package/dist/ask-question-hook.js.map +1 -1
  10. package/dist/centrifugo-client.js +15 -2
  11. package/dist/centrifugo-client.js.map +1 -1
  12. package/dist/command-rpc.js +2 -0
  13. package/dist/command-rpc.js.map +1 -1
  14. package/dist/create-ftown-session.d.ts +4 -2
  15. package/dist/create-ftown-session.js +13 -0
  16. package/dist/create-ftown-session.js.map +1 -1
  17. package/dist/direct-transport/loopback-server.d.ts +10 -3
  18. package/dist/direct-transport/loopback-server.js +20 -4
  19. package/dist/direct-transport/loopback-server.js.map +1 -1
  20. package/dist/direct-transport/peer-manager.d.ts +8 -3
  21. package/dist/direct-transport/peer-manager.js +20 -5
  22. package/dist/direct-transport/peer-manager.js.map +1 -1
  23. package/dist/file-stamp.d.ts +33 -0
  24. package/dist/file-stamp.js +35 -0
  25. package/dist/file-stamp.js.map +1 -0
  26. package/dist/grok-hook-installer.d.ts +10 -0
  27. package/dist/grok-hook-installer.js +87 -0
  28. package/dist/grok-hook-installer.js.map +1 -0
  29. package/dist/harness-commands.js +4 -1
  30. package/dist/harness-commands.js.map +1 -1
  31. package/dist/harness-registry.d.ts +17 -2
  32. package/dist/harness-registry.js +43 -1
  33. package/dist/harness-registry.js.map +1 -1
  34. package/dist/index.js +16 -32
  35. package/dist/index.js.map +1 -1
  36. package/dist/local-api-server.d.ts +1 -1
  37. package/dist/local-api-server.js +7 -1
  38. package/dist/local-api-server.js.map +1 -1
  39. package/dist/mail-store.d.ts +15 -1
  40. package/dist/mail-store.js +78 -16
  41. package/dist/mail-store.js.map +1 -1
  42. package/dist/outbound-pipeline-types.d.ts +5 -2
  43. package/dist/outbound-pipeline-types.js.map +1 -1
  44. package/dist/security/bridge/policy.d.ts +3 -0
  45. package/dist/security/bridge/policy.js +17 -0
  46. package/dist/security/bridge/policy.js.map +1 -1
  47. package/dist/security/bridge/security.d.ts +10 -0
  48. package/dist/security/bridge/security.js +18 -11
  49. package/dist/security/bridge/security.js.map +1 -1
  50. package/dist/security/crypto.d.ts +2 -0
  51. package/dist/security/crypto.js +43 -4
  52. package/dist/security/crypto.js.map +1 -1
  53. package/dist/session-ids.d.ts +3 -3
  54. package/dist/session-ids.js +50 -34
  55. package/dist/session-ids.js.map +1 -1
  56. package/dist/session-store.d.ts +22 -0
  57. package/dist/session-store.js +164 -15
  58. package/dist/session-store.js.map +1 -1
  59. package/dist/setup.js +6 -0
  60. package/dist/setup.js.map +1 -1
  61. package/dist/terminal-manager.d.ts +8 -0
  62. package/dist/terminal-manager.js +23 -1
  63. package/dist/terminal-manager.js.map +1 -1
  64. package/dist/terminal-output.d.ts +34 -0
  65. package/dist/terminal-output.js +68 -0
  66. package/dist/terminal-output.js.map +1 -0
  67. package/dist/terminal-pump.d.ts +48 -5
  68. package/dist/terminal-pump.js +143 -20
  69. package/dist/terminal-pump.js.map +1 -1
  70. package/dist/types.d.ts +4 -0
  71. package/hooks/ftown-antigravity-hook.sh +169 -0
  72. package/hooks/ftown-grok-hook.sh +157 -0
  73. package/hooks/notify.sh +8 -0
  74. package/package.json +2 -2
  75. package/skills/ftown/references/sessions.md +11 -3
@@ -1,6 +1,8 @@
1
1
  import type { EndpointIdentity, EndpointKind, EndpointPublic, EnvelopeHeader, OpenContext, SecureEnvelope, SecurePublication, SecurityErrorCode, SecurityFailure } from './protocol.js';
2
2
  /** Wire limits apply to serialized UTF-8, including headers and base64 expansion. */
3
3
  export declare const MAX_ENVELOPE_BYTES = 450000;
4
+ /** Upper bound of validated public keys kept; the least recently used one is dropped first. */
5
+ export declare const PUBLIC_KEY_CACHE_LIMIT = 256;
4
6
  /** A safe, stable error: underlying crypto/input details never cross this boundary. */
5
7
  export declare class SecurityError extends Error implements SecurityFailure {
6
8
  readonly code: SecurityErrorCode;
@@ -13,6 +13,17 @@ const fields = [
13
13
  const suite = new CipherSuite({
14
14
  kem: new DhkemP256HkdfSha256(), kdf: new HkdfSha256(), aead: new Aes256Gcm(),
15
15
  });
16
+ /** Upper bound of validated public keys kept; the least recently used one is dropped first. */
17
+ export const PUBLIC_KEY_CACHE_LIMIT = 256;
18
+ /**
19
+ * Public keys that passed full validation, by their exact canonical base64url bytes: the SHA-256 fingerprint of those bytes and the
20
+ * imported handle. Public material only. An entry exists only after the digest matched the claimed id AND the import succeeded, and
21
+ * every use still compares the claimed id with the stored fingerprint. It authorizes nothing: whom to seal to or accept from is decided
22
+ * by the caller's policy on every message; this only avoids hashing and importing the same bytes again.
23
+ */
24
+ const validatedPublicKeys = new Map();
25
+ /** Raw export of an identity's own public CryptoKey (immutable once created), by key identity. Failed exports are not recorded. */
26
+ const exportedPublicKeys = new WeakMap();
16
27
  /** A safe, stable error: underlying crypto/input details never cross this boundary. */
17
28
  export class SecurityError extends Error {
18
29
  code;
@@ -179,14 +190,37 @@ async function endpointKey(endpoint) {
179
190
  if (endpoint.version !== 1 || !owner(endpoint.ownerId) || !kinds.includes(endpoint.kind) || !fingerprintSyntax(endpoint.id))
180
191
  return invalid();
181
192
  const raw = bytes(endpoint.publicKey, 65);
193
+ const known = validatedPublicKeys.get(endpoint.publicKey);
194
+ if (known) {
195
+ if (known.id !== endpoint.id)
196
+ return invalid();
197
+ validatedPublicKeys.delete(endpoint.publicKey);
198
+ validatedPublicKeys.set(endpoint.publicKey, known);
199
+ return known.key;
200
+ }
182
201
  const digest = base64(new Uint8Array(await subtle().digest('SHA-256', raw)));
183
202
  if (digest !== endpoint.id)
184
203
  return invalid();
185
- return importPublicKey(endpoint.publicKey);
204
+ const key = await importPublicKey(endpoint.publicKey);
205
+ validatedPublicKeys.set(endpoint.publicKey, { id: digest, key });
206
+ for (const oldest of validatedPublicKeys.keys()) {
207
+ if (validatedPublicKeys.size <= PUBLIC_KEY_CACHE_LIMIT)
208
+ break;
209
+ validatedPublicKeys.delete(oldest);
210
+ }
211
+ return key;
212
+ }
213
+ async function ownPublicKey(key) {
214
+ const known = exportedPublicKeys.get(key);
215
+ if (known !== undefined)
216
+ return known;
217
+ const exported = await exportPublicKey(key);
218
+ exportedPublicKeys.set(key, exported);
219
+ return exported;
186
220
  }
187
221
  async function validateIdentity(identity) {
188
222
  await endpointKey(identity.endpoint);
189
- if (await exportPublicKey(identity.keyPair.publicKey) !== identity.endpoint.publicKey
223
+ if (await ownPublicKey(identity.keyPair.publicKey) !== identity.endpoint.publicKey
190
224
  || identity.keyPair.privateKey.type !== 'private' || identity.keyPair.privateKey.algorithm.name !== 'ECDH'
191
225
  || !('namedCurve' in identity.keyPair.privateKey.algorithm) || identity.keyPair.privateKey.algorithm.namedCurve !== 'P-256'
192
226
  || !identity.keyPair.privateKey.usages.includes('deriveBits'))
@@ -252,8 +286,13 @@ export async function seal(identity, recipient, input, plaintext) {
252
286
  throw new SecurityError('capacity_exceeded', 'Encrypted packet exceeds the transport limit');
253
287
  try {
254
288
  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)) });
289
+ const enc = new Uint8Array(sender.enc);
290
+ const ciphertext = new Uint8Array(await sender.seal(plaintext, aad(parsed)));
291
+ // The header was validated above and the size bounded before encrypting, so the only parts of this envelope not yet checked are
292
+ // the two HPKE outputs. These are the properties parseSecureEnvelope requires of them, without decoding the envelope again.
293
+ if (enc.length !== 65 || enc[0] !== 4 || ciphertext.length !== plaintext.byteLength + 16)
294
+ return invalid();
295
+ return { ...parsed, enc: base64(enc), ciphertext: base64(ciphertext) };
257
296
  }
258
297
  catch (error) {
259
298
  if (error instanceof SecurityError)
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/security/crypto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/security/crypto.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,9 @@ export interface AgentSessionIdPersisterDeps {
6
6
  publishSessionUpdate: (session: Session) => Promise<void>;
7
7
  }
8
8
  /**
9
- * Persists agent-native session identity (Claude/Codex/Pi/opencode/Muse
10
- * session_id, Pi session_file, or Cursor conversation_id) from hook events
11
- * onto the stored session record, with an in-memory cache of the last
9
+ * Persists agent-native session identity (Claude/Codex/Pi/opencode/Muse/Grok/
10
+ * Antigravity session_id, Pi session_file, or Cursor conversation_id) from hook
11
+ * events onto the stored session record, with an in-memory cache of the last
12
12
  * persisted values to skip disk reads on the hot hook path.
13
13
  */
14
14
  export declare class AgentSessionIdPersister {
@@ -1,7 +1,27 @@
1
1
  /**
2
- * Persists agent-native session identity (Claude/Codex/Pi/opencode/Muse
3
- * session_id, Pi session_file, or Cursor conversation_id) from hook events
4
- * onto the stored session record, with an in-memory cache of the last
2
+ * True when the cached entry already holds `agentId` as the native id for the
3
+ * session's harness. Claude is the default: any shell type without its own
4
+ * native-id field is compared against the cached Claude session id.
5
+ */
6
+ function cachedNativeIdMatches(cached, agentId) {
7
+ if (cached.isPi)
8
+ return cached.pi === agentId;
9
+ if (cached.isCodex)
10
+ return cached.codex === agentId;
11
+ if (cached.isOpencode)
12
+ return cached.opencode === agentId;
13
+ if (cached.isMuse)
14
+ return cached.muse === agentId;
15
+ if (cached.isGrok)
16
+ return cached.grok === agentId;
17
+ if (cached.isAntigravity)
18
+ return cached.antigravity === agentId;
19
+ return cached.claude === agentId;
20
+ }
21
+ /**
22
+ * Persists agent-native session identity (Claude/Codex/Pi/opencode/Muse/Grok/
23
+ * Antigravity session_id, Pi session_file, or Cursor conversation_id) from hook
24
+ * events onto the stored session record, with an in-memory cache of the last
5
25
  * persisted values to skip disk reads on the hot hook path.
6
26
  */
7
27
  export class AgentSessionIdPersister {
@@ -29,15 +49,7 @@ export class AgentSessionIdPersister {
29
49
  return;
30
50
  const cached = this.cache.get(hookEvent.sessionId);
31
51
  if (cached
32
- && (!agentId || (cached.isPi
33
- ? cached.pi === agentId
34
- : cached.isCodex
35
- ? cached.codex === agentId
36
- : cached.isOpencode
37
- ? cached.opencode === agentId
38
- : cached.isMuse
39
- ? cached.muse === agentId
40
- : cached.claude === agentId))
52
+ && (!agentId || cachedNativeIdMatches(cached, agentId))
41
53
  && (!cursorId || cached.cursor === cursorId)
42
54
  && (!sessionFile || cached.piFile === sessionFile)) {
43
55
  return;
@@ -49,6 +61,8 @@ export class AgentSessionIdPersister {
49
61
  const isPi = session.shellType === 'pi';
50
62
  const isOpencode = session.shellType === 'opencode';
51
63
  const isMuse = session.shellType === 'muse';
64
+ const isGrok = session.shellType === 'grok';
65
+ const isAntigravity = session.shellType === 'antigravity';
52
66
  let changed = false;
53
67
  if (agentId) {
54
68
  if (isPi && session.piSessionId !== agentId) {
@@ -67,7 +81,16 @@ export class AgentSessionIdPersister {
67
81
  session.museSessionId = agentId;
68
82
  changed = true;
69
83
  }
70
- else if (!isCodex && !isOpencode && !isMuse && session.claudeSessionId !== agentId) {
84
+ else if (isGrok && session.grokSessionId !== agentId) {
85
+ session.grokSessionId = agentId;
86
+ changed = true;
87
+ }
88
+ else if (isAntigravity && session.antigravitySessionId !== agentId) {
89
+ session.antigravitySessionId = agentId;
90
+ changed = true;
91
+ }
92
+ else if (!isPi && !isCodex && !isOpencode && !isMuse && !isGrok && !isAntigravity
93
+ && session.claudeSessionId !== agentId) {
71
94
  session.claudeSessionId = agentId;
72
95
  changed = true;
73
96
  }
@@ -80,26 +103,7 @@ export class AgentSessionIdPersister {
80
103
  session.piSessionFile = sessionFile;
81
104
  changed = true;
82
105
  }
83
- if (!changed) {
84
- this.cache.set(hookEvent.sessionId, {
85
- claude: session.claudeSessionId,
86
- cursor: session.cursorSessionId,
87
- codex: session.codexSessionId,
88
- pi: session.piSessionId,
89
- piFile: session.piSessionFile,
90
- opencode: session.opencodeSessionId,
91
- muse: session.museSessionId,
92
- isCodex,
93
- isPi,
94
- isOpencode,
95
- isMuse,
96
- });
97
- return;
98
- }
99
- session.updatedAt = new Date().toISOString();
100
- await this.deps.store.saveSession(session);
101
- // Cache only after a successful save, so a failed persist is retried.
102
- this.cache.set(hookEvent.sessionId, {
106
+ const nextCache = {
103
107
  claude: session.claudeSessionId,
104
108
  cursor: session.cursorSessionId,
105
109
  codex: session.codexSessionId,
@@ -107,11 +111,23 @@ export class AgentSessionIdPersister {
107
111
  piFile: session.piSessionFile,
108
112
  opencode: session.opencodeSessionId,
109
113
  muse: session.museSessionId,
114
+ grok: session.grokSessionId,
115
+ antigravity: session.antigravitySessionId,
110
116
  isCodex,
111
117
  isPi,
112
118
  isOpencode,
113
119
  isMuse,
114
- });
120
+ isGrok,
121
+ isAntigravity,
122
+ };
123
+ if (!changed) {
124
+ this.cache.set(hookEvent.sessionId, nextCache);
125
+ return;
126
+ }
127
+ session.updatedAt = new Date().toISOString();
128
+ await this.deps.store.saveSession(session);
129
+ // Cache only after a successful save, so a failed persist is retried.
130
+ this.cache.set(hookEvent.sessionId, nextCache);
115
131
  await this.deps.publishSessionUpdate(session);
116
132
  }
117
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-ids.js","sourceRoot":"","sources":["../src/session-ids.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-ids.js","sourceRoot":"","sources":["../src/session-ids.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,14 @@ export declare class SessionStore {
5
5
  private readonly writeLocks;
6
6
  private readonly retiredSessionIds;
7
7
  private readonly maxTerminalLogBytes;
8
+ private readonly recordIndex;
9
+ private readonly terminalDirsReady;
10
+ private readonly terminalLogSizes;
11
+ private flushPendingTerminalData;
12
+ private readonly now;
8
13
  constructor(dataDir: string, options?: {
9
14
  maxTerminalLogBytes?: number;
15
+ now?: () => number;
10
16
  });
11
17
  /** Per-session data dir (session.json, terminal.log, inbox.jsonl). */
12
18
  sessionDir(sessionId: string): string;
@@ -15,9 +21,25 @@ export declare class SessionStore {
15
21
  /** Serialize all directory mutations, recovering after a failed operation. */
16
22
  private withSessionWrite;
17
23
  saveSession(session: Session): Promise<void>;
24
+ /** One stat of a file, reduced to its stamp; undefined when it cannot be stat'ed. */
25
+ private stampOf;
26
+ /**
27
+ * session.json content as JSON text for a stamp just taken from disk, or null
28
+ * when the file does not exist — including when it was removed between the
29
+ * stat and the read. Reads and parses only a new or changed file; corrupt
30
+ * files throw and are never indexed.
31
+ */
32
+ private recordJsonAt;
18
33
  loadSession(sessionId: string): Promise<Session | null>;
19
34
  listSessions(): Promise<Session[]>;
35
+ /**
36
+ * Registers the owner of not-yet-persisted terminal output (the pump). It is
37
+ * invoked before terminal.log is read or cleared so no reader can observe a
38
+ * log that is missing bytes still waiting in a coalescing window.
39
+ */
40
+ setPendingTerminalFlush(flush: (sessionId: string) => void): void;
20
41
  appendTerminalData(sessionId: string, data: string): Promise<void>;
42
+ private appendTerminalBytes;
21
43
  /**
22
44
  * Cap a terminal.log's on-disk size. Runs inside the per-session write lock,
23
45
  * so it never races an append. The file is allowed to grow to 2x the retained
@@ -2,6 +2,7 @@ import { readFile, writeFile, mkdir, readdir, appendFile, rm, truncate, stat, op
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { existsSync } from 'node:fs';
5
+ import { isSettledStamp, sameStamp, toFileStamp } from './file-stamp.js';
5
6
  /**
6
7
  * Drop the legacy preview shape on load: version !== 2 or a preview without a
7
8
  * files array means both fields go, so a stale descriptor never reaches the
@@ -18,6 +19,16 @@ function dropLegacyPreviewShape(session) {
18
19
  delete session.previewSource;
19
20
  }
20
21
  }
22
+ /**
23
+ * A fresh Session parsed from cached session.json text, with the legacy
24
+ * preview shape dropped. Every read path goes through here so the stat-validated
25
+ * cache never serves a legacy preview.
26
+ */
27
+ function parseSessionRecord(json) {
28
+ const session = JSON.parse(json);
29
+ dropLegacyPreviewShape(session);
30
+ return session;
31
+ }
21
32
  /**
22
33
  * Retained tail size for a session's terminal.log. A misbehaving child (e.g. a
23
34
  * TUI stuck in a runaway repaint loop) can otherwise stream unbounded output
@@ -29,6 +40,20 @@ function dropLegacyPreviewShape(session) {
29
40
  */
30
41
  const DEFAULT_MAX_TERMINAL_LOG_BYTES = 64 * 1024 * 1024;
31
42
  const NEWLINE = 0x0a;
43
+ /**
44
+ * session.json files stat'ed concurrently while listing. Each batch is awaited,
45
+ * so a listing of any size yields to the event loop between batches instead of
46
+ * holding it for the whole directory.
47
+ */
48
+ const LIST_STAT_CONCURRENCY = 32;
49
+ function isMissing(error) {
50
+ return error?.code === 'ENOENT';
51
+ }
52
+ /** The file, or a directory on the way to it, is no longer there. */
53
+ function isGone(error) {
54
+ const code = error?.code;
55
+ return code === 'ENOENT' || code === 'ENOTDIR';
56
+ }
32
57
  export class SessionStore {
33
58
  sessionsDir;
34
59
  archivePath;
@@ -36,7 +61,19 @@ export class SessionStore {
36
61
  // Removal is final for this store's lifetime; explicit revival uses a new ID.
37
62
  retiredSessionIds = new Set();
38
63
  maxTerminalLogBytes;
64
+ // session.json index, keyed by session id. An entry is served only while a
65
+ // fresh stat of the file still matches its stamp, and is stored only for a
66
+ // file that was already quiet when it was read (see file-stamp.ts), so it can
67
+ // never be stale.
68
+ recordIndex = new Map();
69
+ // Sessions whose directory this process has already created.
70
+ terminalDirsReady = new Set();
71
+ // terminal.log size in bytes, tracked after one initial stat per session.
72
+ terminalLogSizes = new Map();
73
+ flushPendingTerminalData;
74
+ now;
39
75
  constructor(dataDir, options = {}) {
76
+ this.now = options.now ?? Date.now;
40
77
  this.sessionsDir = join(dataDir, 'sessions');
41
78
  this.archivePath = join(dataDir, 'archive.jsonl');
42
79
  const envCap = Number(process.env.FTOWN_MAX_TERMINAL_LOG_BYTES);
@@ -83,51 +120,140 @@ export class SessionStore {
83
120
  // incomplete document. A same-directory rename is atomic for readers.
84
121
  // 0600: session.json carries the env map with provider tokens, the exact
85
122
  // field toWireSession strips from the wire. Never world-readable.
86
- await writeFile(tempFilePath, JSON.stringify(session, null, 2), { encoding: 'utf-8', mode: 0o600 });
123
+ const text = JSON.stringify(session, null, 2);
124
+ const handle = await open(tempFilePath, 'w', 0o600);
125
+ try {
126
+ await handle.writeFile(text, 'utf-8');
127
+ }
128
+ finally {
129
+ await handle.close();
130
+ }
87
131
  await rename(tempFilePath, filePath);
88
132
  }
89
133
  catch (error) {
90
134
  await rm(tempFilePath, { force: true }).catch(() => undefined);
91
135
  throw error;
92
136
  }
137
+ finally {
138
+ // A file published just now cannot be validated by its stamp (another
139
+ // writer in the same timestamp tick would leave it unchanged), so the
140
+ // record is read back from disk once it has settled.
141
+ this.recordIndex.delete(session.id);
142
+ }
93
143
  });
94
144
  }
95
- async loadSession(sessionId) {
96
- const filePath = this.sessionFilePath(sessionId);
97
- if (!existsSync(filePath)) {
145
+ /** One stat of a file, reduced to its stamp; undefined when it cannot be stat'ed. */
146
+ async stampOf(filePath) {
147
+ try {
148
+ return toFileStamp(await stat(filePath, { bigint: true }));
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ }
154
+ /**
155
+ * session.json content as JSON text for a stamp just taken from disk, or null
156
+ * when the file does not exist — including when it was removed between the
157
+ * stat and the read. Reads and parses only a new or changed file; corrupt
158
+ * files throw and are never indexed.
159
+ */
160
+ async recordJsonAt(sessionId, stamp) {
161
+ if (!stamp) {
162
+ this.recordIndex.delete(sessionId);
98
163
  return null;
99
164
  }
100
- const data = await readFile(filePath, 'utf-8');
101
- const session = JSON.parse(data);
102
- dropLegacyPreviewShape(session);
103
- return session;
165
+ const indexed = this.recordIndex.get(sessionId);
166
+ if (indexed && sameStamp(indexed, stamp)) {
167
+ return indexed.json;
168
+ }
169
+ // The stamp was taken BEFORE the read: if the file is replaced meanwhile,
170
+ // the next stat differs from it and the entry is re-read.
171
+ this.recordIndex.delete(sessionId);
172
+ const readStartedAt = this.now();
173
+ let raw;
174
+ try {
175
+ raw = await readFile(this.sessionFilePath(sessionId), 'utf-8');
176
+ }
177
+ catch (error) {
178
+ if (isGone(error))
179
+ return null;
180
+ throw error;
181
+ }
182
+ const json = JSON.stringify(JSON.parse(raw));
183
+ if (isSettledStamp(stamp, readStartedAt))
184
+ this.recordIndex.set(sessionId, { ...stamp, json });
185
+ return json;
186
+ }
187
+ async loadSession(sessionId) {
188
+ const json = await this.recordJsonAt(sessionId, await this.stampOf(this.sessionFilePath(sessionId)));
189
+ return json === null ? null : parseSessionRecord(json);
104
190
  }
105
191
  async listSessions() {
106
192
  if (!existsSync(this.sessionsDir)) {
193
+ this.recordIndex.clear();
107
194
  return [];
108
195
  }
109
196
  const entries = await readdir(this.sessionsDir, { withFileTypes: true });
197
+ const ids = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
110
198
  const sessions = [];
111
- for (const entry of entries) {
112
- if (entry.isDirectory()) {
113
- const session = await this.loadSession(entry.name);
199
+ // Directory order is kept: stats run a batch at a time, records are then
200
+ // resolved one by one in that order.
201
+ for (let start = 0; start < ids.length; start += LIST_STAT_CONCURRENCY) {
202
+ const batch = ids.slice(start, start + LIST_STAT_CONCURRENCY);
203
+ const stamps = await Promise.all(batch.map((id) => this.stampOf(this.sessionFilePath(id))));
204
+ for (let i = 0; i < batch.length; i++) {
205
+ const json = await this.recordJsonAt(batch[i], stamps[i]);
206
+ const session = json === null ? null : parseSessionRecord(json);
114
207
  if (session) {
115
208
  sessions.push(session);
116
209
  }
117
210
  }
118
211
  }
212
+ const present = new Set(ids);
213
+ for (const sessionId of this.recordIndex.keys()) {
214
+ if (!present.has(sessionId))
215
+ this.recordIndex.delete(sessionId);
216
+ }
119
217
  return sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
120
218
  }
219
+ /**
220
+ * Registers the owner of not-yet-persisted terminal output (the pump). It is
221
+ * invoked before terminal.log is read or cleared so no reader can observe a
222
+ * log that is missing bytes still waiting in a coalescing window.
223
+ */
224
+ setPendingTerminalFlush(flush) {
225
+ this.flushPendingTerminalData = flush;
226
+ }
121
227
  async appendTerminalData(sessionId, data) {
122
228
  await this.withSessionWrite(sessionId, async () => {
123
229
  if (this.retiredSessionIds.has(sessionId))
124
230
  return;
125
- await mkdir(this.sessionDir(sessionId), { recursive: true, mode: 0o700 });
126
231
  const filePath = this.terminalLogPath(sessionId);
127
- await appendFile(filePath, data, { encoding: 'utf-8', mode: 0o600 });
128
- await this.trimTerminalLogIfNeeded(filePath);
232
+ const bytes = Buffer.from(data, 'utf-8');
233
+ try {
234
+ await this.appendTerminalBytes(sessionId, filePath, bytes);
235
+ }
236
+ catch (error) {
237
+ this.terminalDirsReady.delete(sessionId);
238
+ this.terminalLogSizes.delete(sessionId);
239
+ if (!isMissing(error))
240
+ throw error;
241
+ // The directory vanished since it was created: recreate it and retry.
242
+ await this.appendTerminalBytes(sessionId, filePath, bytes);
243
+ }
244
+ await this.trimTerminalLogIfNeeded(sessionId, filePath);
129
245
  });
130
246
  }
247
+ async appendTerminalBytes(sessionId, filePath, bytes) {
248
+ if (!this.terminalDirsReady.has(sessionId)) {
249
+ await mkdir(this.sessionDir(sessionId), { recursive: true, mode: 0o700 });
250
+ this.terminalDirsReady.add(sessionId);
251
+ }
252
+ await appendFile(filePath, bytes, { mode: 0o600 });
253
+ const known = this.terminalLogSizes.get(sessionId);
254
+ if (known !== undefined)
255
+ this.terminalLogSizes.set(sessionId, known + bytes.length);
256
+ }
131
257
  /**
132
258
  * Cap a terminal.log's on-disk size. Runs inside the per-session write lock,
133
259
  * so it never races an append. The file is allowed to grow to 2x the retained
@@ -138,10 +264,19 @@ export class SessionStore {
138
264
  * older output was discarded. Best-effort: any failure is swallowed so it can
139
265
  * never poison the write-lock chain and stall future appends.
140
266
  */
141
- async trimTerminalLogIfNeeded(filePath) {
267
+ async trimTerminalLogIfNeeded(sessionId, filePath) {
142
268
  try {
269
+ // The size is tracked in memory after one stat; the file is stat'ed again
270
+ // only when the tracked size says a trim is due (the trim needs the real
271
+ // size) or after an error dropped the tracked value.
272
+ const tracked = this.terminalLogSizes.get(sessionId);
273
+ if (tracked !== undefined && tracked <= this.maxTerminalLogBytes * 2) {
274
+ return;
275
+ }
276
+ this.terminalLogSizes.delete(sessionId);
143
277
  const { size } = await stat(filePath);
144
278
  if (size <= this.maxTerminalLogBytes * 2) {
279
+ this.terminalLogSizes.set(sessionId, size);
145
280
  return;
146
281
  }
147
282
  const keep = this.maxTerminalLogBytes;
@@ -165,14 +300,20 @@ export class SessionStore {
165
300
  const tmpPath = `${filePath}.trim-${process.pid}.tmp`;
166
301
  await writeFile(tmpPath, Buffer.concat([marker, body]), { mode: 0o600 });
167
302
  await rename(tmpPath, filePath);
303
+ this.terminalLogSizes.set(sessionId, marker.length + body.length);
168
304
  }
169
305
  catch (err) {
306
+ this.terminalLogSizes.delete(sessionId);
170
307
  console.error(`[SessionStore] Failed to trim terminal log ${filePath}:`, err);
171
308
  }
172
309
  }
173
310
  async deleteSession(sessionId) {
174
311
  await this.withSessionWrite(sessionId, async () => {
312
+ this.recordIndex.delete(sessionId);
313
+ this.terminalDirsReady.delete(sessionId);
314
+ this.terminalLogSizes.delete(sessionId);
175
315
  await rm(this.sessionDir(sessionId), { recursive: true, force: true });
316
+ this.recordIndex.delete(sessionId);
176
317
  // Latch only after successful deletion so failures remain retryable.
177
318
  this.retiredSessionIds.add(sessionId);
178
319
  });
@@ -237,16 +378,24 @@ export class SessionStore {
237
378
  return archived;
238
379
  }
239
380
  async clearTerminalLog(sessionId) {
381
+ // Queue pending output ahead of the truncate so it cannot land afterwards.
382
+ this.flushPendingTerminalData?.(sessionId);
240
383
  await this.withSessionWrite(sessionId, async () => {
241
384
  if (this.retiredSessionIds.has(sessionId))
242
385
  return;
243
386
  const filePath = this.terminalLogPath(sessionId);
387
+ this.terminalLogSizes.delete(sessionId);
244
388
  if (existsSync(filePath)) {
245
389
  await truncate(filePath, 0);
390
+ this.terminalLogSizes.set(sessionId, 0);
246
391
  }
247
392
  });
248
393
  }
249
394
  async loadTerminalLog(sessionId) {
395
+ // Pending output is handed to appendTerminalData synchronously, which joins
396
+ // the session's write chain; waiting for that chain makes the read complete.
397
+ this.flushPendingTerminalData?.(sessionId);
398
+ await this.writeLocks.get(sessionId);
250
399
  const filePath = this.terminalLogPath(sessionId);
251
400
  if (!existsSync(filePath)) {
252
401
  return '';