FN-5911: move agent logs to per-task JSONL storage
Store agent logs in per-task JSONL files instead of the legacy SQLite table. - add a file-backed agent log store with JSONL append/read/prune helpers and task-scoped source refs - migrate legacy SQLite agentLogEntries data into task files, rewrite goal citation references, and preserve soft-deleted logs for forensics - update task store, settings, docs, dashboard route coverage, and add regression tests for migration, retention, and log access Files changed: .changeset/fn-5911-agent-log-jsonl.md | 5 + AGENTS.md | 2 +- docs/diagnostics.md | 2 +- docs/settings-reference.md | 2 + docs/soft-delete-verification-matrix.md | 7 +- docs/storage.md | 8 +- .../src/__tests__/agent-log-file-store.test.ts | 123 ++++++ .../core/src/__tests__/agent-log-migration.test.ts | 186 +++++++++ .../core/src/__tests__/agent-log-retention.test.ts | 208 ++++++++++ packages/core/src/__tests__/db-migrate.test.ts | 14 +- packages/core/src/__tests__/db.test.ts | 39 +- .../src/__tests__/goal-citations-store.test.ts | 38 +- packages/core/src/__tests__/goals-schema.test.ts | 2 +- packages/core/src/__tests__/insight-store.test.ts | 10 +- .../src/__tests__/merge-request-record.test.ts | 2 +- packages/core/src/__tests__/mission-store.test.ts | 2 +- packages/core/src/__tests__/run-audit.test.ts | 2 +- packages/core/src/__tests__/secrets-schema.test.ts | 6 +- .../src/__tests__/soft-delete-agent-logs.test.ts | 71 ++-- .../src/__tests__/store-agent-log-file.test.ts | 91 +++++ .../core/src/__tests__/store-merge-queue.test.ts | 2 +- packages/core/src/__tests__/store-test-helpers.ts | 43 +- packages/core/src/__tests__/store-upsert.test.ts | 37 +- packages/core/src/__tests__/task-documents.test.ts | 2 +- packages/core/src/agent-log-constants.ts | 25 ++ packages/core/src/agent-log-file-store.ts | 267 ++++++++++++ packages/core/src/db.ts | 51 ++- packages/core/src/settings-schema.ts | 1 + packages/core/src/store.ts | 453 ++++++++++++--------- packages/core/src/types.ts | 10 +- .../__tests__/agent-log-routes.integration.test.ts | 48 +++ .../src/__tests__/evaluator-evidence.test.ts | 47 ++- packages/engine/src/self-healing.ts | 12 + .../src/store/__tests__/roadmap-store.test.ts | 4 +- 34 files changed, 1477 insertions(+), 345 deletions(-) Fusion-Task-Id: FN-5911 Fusion-Task-Lineage: 07c42f3a-87cf-4558-8f01-ac8460b5558b
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
// @vitest-environment node
|
||||
|
||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||
import express from "express";
|
||||
import { existsSync, mkdtempSync, rmSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { TaskStore } from "@fusion/core";
|
||||
import { createApiRoutes } from "../routes.js";
|
||||
import { get } from "../test-request.js";
|
||||
|
||||
describe("task log routes with file-backed agent logs", () => {
|
||||
let rootDir: string;
|
||||
let store: TaskStore;
|
||||
let app: express.Express;
|
||||
|
||||
beforeEach(async () => {
|
||||
rootDir = mkdtempSync(join(tmpdir(), "fusion-dashboard-agent-log-routes-"));
|
||||
store = new TaskStore(rootDir, join(rootDir, ".fusion-global-settings"), { inMemoryDb: true });
|
||||
await store.init();
|
||||
app = express();
|
||||
app.use(express.json());
|
||||
app.use("/api", createApiRoutes(store));
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
store.close();
|
||||
rmSync(rootDir, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
it("GET /api/tasks/:id/logs returns file-backed entries with count headers", async () => {
|
||||
const task = await store.createTask({ description: "Route reads file-backed agent logs" });
|
||||
await store.appendAgentLog(task.id, "first", "text", undefined, "executor");
|
||||
await store.appendAgentLog(task.id, "second", "tool", "detail-2", "executor");
|
||||
await store.appendAgentLog(task.id, "third", "tool_result", "detail-3", "executor");
|
||||
|
||||
const expected = await store.getAgentLogs(task.id, { limit: 2 });
|
||||
const agentLogPath = join(rootDir, ".fusion", "tasks", task.id, "agent-log.jsonl");
|
||||
expect(existsSync(agentLogPath)).toBe(true);
|
||||
|
||||
const res = await get(app, `/api/tasks/${task.id}/logs?limit=2`);
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
expect(res.body).toEqual(expected);
|
||||
expect(res.headers["x-total-count"]).toBe("3");
|
||||
expect(res.headers["x-has-more"]).toBe("true");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user