705f792e87
Move the Global module from packages/opencode/src/global to packages/core/src/global to provide a unified location for managing XDG directories and application paths. This eliminates duplicate path definitions across packages and ensures consistent access to data, config, cache, state, log, and bin directories throughout the codebase.
60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import path from "path"
|
|
import { writeHeapSnapshot } from "node:v8"
|
|
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
import { Global } from "@opencode-ai/core/global"
|
|
import { Log } from "@/util"
|
|
|
|
const log = Log.create({ service: "heap" })
|
|
const MINUTE = 60_000
|
|
const LIMIT = 2 * 1024 * 1024 * 1024
|
|
|
|
let timer: Timer | undefined
|
|
let lock = false
|
|
let armed = true
|
|
|
|
export function start() {
|
|
if (!Flag.OPENCODE_AUTO_HEAP_SNAPSHOT) return
|
|
if (timer) return
|
|
|
|
const run = async () => {
|
|
if (lock) return
|
|
|
|
const stat = process.memoryUsage()
|
|
if (stat.rss <= LIMIT) {
|
|
armed = true
|
|
return
|
|
}
|
|
if (!armed) return
|
|
|
|
lock = true
|
|
armed = false
|
|
const file = path.join(
|
|
Global.Path.log,
|
|
`heap-${process.pid}-${new Date().toISOString().replace(/[:.]/g, "")}.heapsnapshot`,
|
|
)
|
|
log.warn("heap usage exceeded limit", {
|
|
rss: stat.rss,
|
|
heap: stat.heapUsed,
|
|
file,
|
|
})
|
|
|
|
await Promise.resolve()
|
|
.then(() => writeHeapSnapshot(file))
|
|
.catch((err) => {
|
|
log.error("failed to write heap snapshot", {
|
|
error: err instanceof Error ? err.message : String(err),
|
|
file,
|
|
})
|
|
})
|
|
|
|
lock = false
|
|
}
|
|
|
|
timer = setInterval(() => {
|
|
void run()
|
|
}, MINUTE)
|
|
timer.unref?.()
|
|
}
|
|
|
|
export * as Heap from "./heap"
|