import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; const isNativeSessionId = Schema.is(Schema.String.check(Schema.isUUID(4))); const decodeSessionMetadata = Schema.decodeEffect( Schema.fromJsonString(Schema.Struct({ cwd: Schema.String })), ); /** Call after the process closes. The unique temporary cwd proves which session we own. */ export const removeAntigravitySessionFiles = Effect.fn("removeAntigravitySessionFiles")( function* (input: { readonly profileDirectory: string; readonly sessionId: string | undefined; readonly cwd: string; }) { if (input.sessionId === undefined || !isNativeSessionId(input.sessionId)) { return; } const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const acpDirectory = path.join(input.profileDirectory, "antigravity-acp"); const base = path.join(acpDirectory, "conversations", input.sessionId); if (!(yield* fs.exists(`${base}.meta`))) { return; } const metadata = yield* fs .readFileString(`${base}.meta`) .pipe(Effect.flatMap(decodeSessionMetadata)); if (metadata.cwd !== input.cwd) { return; } for (const suffix of [".db", ".db-wal", ".db-shm", ".db-journal", ".meta"]) { yield* fs.remove(`${base}${suffix}`, { force: true }); } yield* fs.remove(path.join(acpDirectory, "brain", input.sessionId), { recursive: true, force: true, }); }, Effect.catch(() => Effect.logWarning("Could not remove temporary Antigravity session files.")), );