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.
- package/dist/agent-commands.d.ts +4 -2
- package/dist/agent-commands.js +1 -1
- package/dist/agent-commands.js.map +1 -1
- package/dist/antigravity-hook-installer.d.ts +26 -0
- package/dist/antigravity-hook-installer.js +225 -0
- package/dist/antigravity-hook-installer.js.map +1 -0
- package/dist/ask-question-hook.d.ts +11 -0
- package/dist/ask-question-hook.js +37 -1
- package/dist/ask-question-hook.js.map +1 -1
- package/dist/centrifugo-client.js +15 -2
- package/dist/centrifugo-client.js.map +1 -1
- package/dist/command-rpc.js +2 -0
- package/dist/command-rpc.js.map +1 -1
- package/dist/create-ftown-session.d.ts +4 -2
- package/dist/create-ftown-session.js +13 -0
- package/dist/create-ftown-session.js.map +1 -1
- package/dist/direct-transport/loopback-server.d.ts +10 -3
- package/dist/direct-transport/loopback-server.js +20 -4
- package/dist/direct-transport/loopback-server.js.map +1 -1
- package/dist/direct-transport/peer-manager.d.ts +8 -3
- package/dist/direct-transport/peer-manager.js +20 -5
- package/dist/direct-transport/peer-manager.js.map +1 -1
- package/dist/file-stamp.d.ts +33 -0
- package/dist/file-stamp.js +35 -0
- package/dist/file-stamp.js.map +1 -0
- package/dist/grok-hook-installer.d.ts +10 -0
- package/dist/grok-hook-installer.js +87 -0
- package/dist/grok-hook-installer.js.map +1 -0
- package/dist/harness-commands.js +4 -1
- package/dist/harness-commands.js.map +1 -1
- package/dist/harness-registry.d.ts +17 -2
- package/dist/harness-registry.js +43 -1
- package/dist/harness-registry.js.map +1 -1
- package/dist/index.js +16 -32
- package/dist/index.js.map +1 -1
- package/dist/local-api-server.d.ts +1 -1
- package/dist/local-api-server.js +7 -1
- package/dist/local-api-server.js.map +1 -1
- package/dist/mail-store.d.ts +15 -1
- package/dist/mail-store.js +78 -16
- package/dist/mail-store.js.map +1 -1
- package/dist/outbound-pipeline-types.d.ts +5 -2
- package/dist/outbound-pipeline-types.js.map +1 -1
- package/dist/security/bridge/policy.d.ts +3 -0
- package/dist/security/bridge/policy.js +17 -0
- package/dist/security/bridge/policy.js.map +1 -1
- package/dist/security/bridge/security.d.ts +10 -0
- package/dist/security/bridge/security.js +18 -11
- package/dist/security/bridge/security.js.map +1 -1
- package/dist/security/crypto.d.ts +2 -0
- package/dist/security/crypto.js +43 -4
- package/dist/security/crypto.js.map +1 -1
- package/dist/session-ids.d.ts +3 -3
- package/dist/session-ids.js +50 -34
- package/dist/session-ids.js.map +1 -1
- package/dist/session-store.d.ts +22 -0
- package/dist/session-store.js +164 -15
- package/dist/session-store.js.map +1 -1
- package/dist/setup.js +6 -0
- package/dist/setup.js.map +1 -1
- package/dist/terminal-manager.d.ts +8 -0
- package/dist/terminal-manager.js +23 -1
- package/dist/terminal-manager.js.map +1 -1
- package/dist/terminal-output.d.ts +34 -0
- package/dist/terminal-output.js +68 -0
- package/dist/terminal-output.js.map +1 -0
- package/dist/terminal-pump.d.ts +48 -5
- package/dist/terminal-pump.js +143 -20
- package/dist/terminal-pump.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/hooks/ftown-antigravity-hook.sh +169 -0
- package/hooks/ftown-grok-hook.sh +157 -0
- package/hooks/notify.sh +8 -0
- package/package.json +2 -2
- 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;
|
package/dist/security/crypto.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
256
|
-
|
|
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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"}
|
package/dist/session-ids.d.ts
CHANGED
|
@@ -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
|
|
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 {
|
package/dist/session-ids.js
CHANGED
|
@@ -1,7 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
}
|
package/dist/session-ids.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-ids.js","sourceRoot":"","sources":["../src/session-ids.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-ids.js","sourceRoot":"","sources":["../src/session-ids.ts"],"names":[],"mappings":"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"}
|
package/dist/session-store.d.ts
CHANGED
|
@@ -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
|
package/dist/session-store.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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 '';
|