|
|
@@ -2,9 +2,9 @@ import fs from "fs/promises"
|
|
|
import path from "path"
|
|
|
import { Global } from "../global"
|
|
|
import { Identifier } from "../id/id"
|
|
|
-import { lazy } from "../util/lazy"
|
|
|
import { PermissionNext } from "../permission/next"
|
|
|
import type { Agent } from "../agent/agent"
|
|
|
+import { Scheduler } from "../scheduler"
|
|
|
|
|
|
export namespace Truncate {
|
|
|
export const MAX_LINES = 2000
|
|
|
@@ -12,6 +12,7 @@ export namespace Truncate {
|
|
|
export const DIR = path.join(Global.Path.data, "tool-output")
|
|
|
export const GLOB = path.join(DIR, "*")
|
|
|
const RETENTION_MS = 7 * 24 * 60 * 60 * 1000 // 7 days
|
|
|
+ const HOUR_MS = 60 * 60 * 1000
|
|
|
|
|
|
export type Result = { content: string; truncated: false } | { content: string; truncated: true; outputPath: string }
|
|
|
|
|
|
@@ -21,6 +22,15 @@ export namespace Truncate {
|
|
|
direction?: "head" | "tail"
|
|
|
}
|
|
|
|
|
|
+ export function init() {
|
|
|
+ Scheduler.register({
|
|
|
+ id: "tool.truncation.cleanup",
|
|
|
+ interval: HOUR_MS,
|
|
|
+ run: cleanup,
|
|
|
+ scope: "global",
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
export async function cleanup() {
|
|
|
const cutoff = Identifier.timestamp(Identifier.create("tool", false, Date.now() - RETENTION_MS))
|
|
|
const glob = new Bun.Glob("tool_*")
|
|
|
@@ -31,8 +41,6 @@ export namespace Truncate {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- const init = lazy(cleanup)
|
|
|
-
|
|
|
function hasTaskTool(agent?: Agent.Info): boolean {
|
|
|
if (!agent?.permission) return false
|
|
|
const rule = PermissionNext.evaluate("task", "*", agent.permission)
|
|
|
@@ -81,7 +89,6 @@ export namespace Truncate {
|
|
|
const unit = hitBytes ? "bytes" : "lines"
|
|
|
const preview = out.join("\n")
|
|
|
|
|
|
- await init()
|
|
|
const id = Identifier.ascending("tool")
|
|
|
const filepath = path.join(DIR, id)
|
|
|
await Bun.write(Bun.file(filepath), text)
|