@orquentra/codebuddy 2.14.0 → 2.15.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/ARCHITECTURE.md +98 -0
- package/README.md +87 -6
- package/dist/{chunk-YNSTIMCF.js → chunk-4DTO2E4Y.js} +352 -157
- package/dist/chunk-4DTO2E4Y.js.map +1 -0
- package/dist/{chunk-CAEPHLHC.js → chunk-57642NGU.js} +2 -44
- package/dist/chunk-57642NGU.js.map +1 -0
- package/dist/chunk-6OQKL35B.js +55 -0
- package/dist/chunk-6OQKL35B.js.map +1 -0
- package/dist/{chunk-4DKYKDHI.js → chunk-7IPSDDO5.js} +5 -3
- package/dist/{chunk-4DKYKDHI.js.map → chunk-7IPSDDO5.js.map} +1 -1
- package/dist/chunk-7JPUMXFE.js +413 -0
- package/dist/chunk-7JPUMXFE.js.map +1 -0
- package/dist/{chunk-LRQNPYCK.js → chunk-AFXWCSQ4.js} +13 -7
- package/dist/chunk-AFXWCSQ4.js.map +1 -0
- package/dist/chunk-BNZDEU5K.js +368 -0
- package/dist/chunk-BNZDEU5K.js.map +1 -0
- package/dist/chunk-EMWGLKPR.js +45 -0
- package/dist/chunk-EMWGLKPR.js.map +1 -0
- package/dist/{chunk-YJPCS2GP.js → chunk-GNV4X67F.js} +59 -20
- package/dist/chunk-GNV4X67F.js.map +1 -0
- package/dist/{chunk-YWDH6DQ6.js → chunk-IM5RFEW4.js} +21 -19
- package/dist/{chunk-YWDH6DQ6.js.map → chunk-IM5RFEW4.js.map} +1 -1
- package/dist/chunk-K4XNTYV7.js +136 -0
- package/dist/chunk-K4XNTYV7.js.map +1 -0
- package/dist/{chunk-ESZXCZIN.js → chunk-MNSMW4MZ.js} +33 -5
- package/dist/chunk-MNSMW4MZ.js.map +1 -0
- package/dist/chunk-NNJSAYHY.js +372 -0
- package/dist/chunk-NNJSAYHY.js.map +1 -0
- package/dist/{chunk-XSNW6Y3X.js → chunk-OO7Q7XZF.js} +28 -24
- package/dist/chunk-OO7Q7XZF.js.map +1 -0
- package/dist/{chunk-L6BRYZ6G.js → chunk-PZ4EBFIA.js} +7 -7
- package/dist/{chunk-L6BRYZ6G.js.map → chunk-PZ4EBFIA.js.map} +1 -1
- package/dist/chunk-RGIVHKBH.js +156 -0
- package/dist/chunk-RGIVHKBH.js.map +1 -0
- package/dist/{chunk-LW75SKZR.js → chunk-RKF4HBBQ.js} +126 -18
- package/dist/chunk-RKF4HBBQ.js.map +1 -0
- package/dist/{chunk-7QMHIJBA.js → chunk-VBDM7HC5.js} +969 -968
- package/dist/chunk-VBDM7HC5.js.map +1 -0
- package/dist/chunk-VF7DKRIU.js +50 -0
- package/dist/chunk-VF7DKRIU.js.map +1 -0
- package/dist/{chunk-KNR2P2UY.js → chunk-Y4QQML24.js} +21 -6
- package/dist/chunk-Y4QQML24.js.map +1 -0
- package/dist/cli/index.js +4 -4
- package/dist/config-S2BDMT4B.js +15 -0
- package/dist/expand-TONFVT5D.js +98 -0
- package/dist/expand-TONFVT5D.js.map +1 -0
- package/dist/file-vectors-VREL75MA.js +19 -0
- package/dist/index-facts-MBJKBYA3.js +38 -0
- package/dist/index-pass-RP23G2CR.js +15 -0
- package/dist/index.js +24 -22
- package/dist/{install-EU35ERK5.js → install-MCJIJMFF.js} +11 -10
- package/dist/{lean-43ADYTBW.js → lean-CBHVW6JM.js} +8 -7
- package/dist/local-TH5XCLVJ.js +48 -0
- package/dist/local-llm-GZREB5DF.js +19 -0
- package/dist/local-llm-GZREB5DF.js.map +1 -0
- package/dist/{main-SFC5LV4E.js → main-QF6Z552J.js} +346 -140
- package/dist/main-QF6Z552J.js.map +1 -0
- package/dist/{memory-TGHVTBME.js → memory-LSZKSF53.js} +9 -6
- package/dist/{memory-TGHVTBME.js.map → memory-LSZKSF53.js.map} +1 -1
- package/dist/{operations-6Z6ZDVBP.js → operations-BPI633VN.js} +8 -7
- package/dist/operations-BPI633VN.js.map +1 -0
- package/dist/{rerank-IQAEWLQR.js → rerank-EPCTSEVP.js} +7 -4
- package/dist/{rerank-IQAEWLQR.js.map → rerank-EPCTSEVP.js.map} +1 -1
- package/dist/{runtime-W5AW32SD.js → runtime-W5ACTDFS.js} +9 -8
- package/dist/runtime-W5ACTDFS.js.map +1 -0
- package/dist/summaries-W2J5FCLG.js +32 -0
- package/dist/summaries-W2J5FCLG.js.map +1 -0
- package/dist/{zvec-24HLAFGN.js → zvec-LSA2IRAU.js} +13 -5
- package/dist/zvec-LSA2IRAU.js.map +1 -0
- package/package.json +3 -2
- package/dist/chunk-7QMHIJBA.js.map +0 -1
- package/dist/chunk-CAEPHLHC.js.map +0 -1
- package/dist/chunk-ESC4Y3L7.js +0 -204
- package/dist/chunk-ESC4Y3L7.js.map +0 -1
- package/dist/chunk-ESZXCZIN.js.map +0 -1
- package/dist/chunk-KNR2P2UY.js.map +0 -1
- package/dist/chunk-LRQNPYCK.js.map +0 -1
- package/dist/chunk-LW75SKZR.js.map +0 -1
- package/dist/chunk-SFMIMLXR.js +0 -63
- package/dist/chunk-SFMIMLXR.js.map +0 -1
- package/dist/chunk-XSNW6Y3X.js.map +0 -1
- package/dist/chunk-YJPCS2GP.js.map +0 -1
- package/dist/chunk-YNSTIMCF.js.map +0 -1
- package/dist/config-GEZFLXK6.js +0 -12
- package/dist/main-SFC5LV4E.js.map +0 -1
- package/dist/summaries-32PHOB6L.js +0 -20
- /package/dist/{config-GEZFLXK6.js.map → config-S2BDMT4B.js.map} +0 -0
- /package/dist/{install-EU35ERK5.js.map → file-vectors-VREL75MA.js.map} +0 -0
- /package/dist/{lean-43ADYTBW.js.map → index-facts-MBJKBYA3.js.map} +0 -0
- /package/dist/{operations-6Z6ZDVBP.js.map → index-pass-RP23G2CR.js.map} +0 -0
- /package/dist/{runtime-W5AW32SD.js.map → install-MCJIJMFF.js.map} +0 -0
- /package/dist/{summaries-32PHOB6L.js.map → lean-CBHVW6JM.js.map} +0 -0
- /package/dist/{zvec-24HLAFGN.js.map → local-TH5XCLVJ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/llm/local.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { createWriteStream } from \"node:fs\";\nimport { mkdir, rename, rm, stat, statfs, utimes, writeFile } from \"node:fs/promises\";\nimport { availableParallelism, freemem, totalmem } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { z } from \"zod\";\nimport { modelCacheDir } from \"../providers/local.js\";\nimport type { ChatJsonRequest, LlmResult } from \"./client.js\";\n\n/**\n * Local text generation (Qwen3 only: 0.6B default, 1.7B \"better\") for the small-model features (intent cards, index\n * facts, query expansion, and optionally rerank): a GGUF model run by\n * node-llama-cpp (llama.cpp bindings; prebuilt for macOS arm64/x64, Linux\n * x64/arm64 and Windows x64; Metal/CUDA/Vulkan when present, CPU otherwise).\n * See ARCHITECTURE.md for why node-llama-cpp and not Cactus.\n *\n * Installed by setup (`codebuddy`, skipped with `--no-local-llm` or\n * `CODEBUDDY_LOCAL_LLM=0`) or `codebuddy models add local-llm`: the runtime with\n * npm, the weights checksum-verified into the shared model cache. Without\n * either, every caller gets `disabled` and keeps 2.14.0 behaviour. Nothing\n * here makes a network call except `downloadLocalModel`.\n *\n * Generation runs on llama.cpp's own native threads (capped at cores − 1),\n * so the MCP event loop keeps answering while a card is written; background\n * passes also yield to foreground work through `waitForForeground`.\n */\n\nexport type LocalModelSize = \"default\" | \"better\";\n\nexport type LocalModelSpec = {\n size: LocalModelSize;\n id: string;\n repo: string;\n revision: string;\n file: string;\n bytes: number;\n sha256: string;\n /** Rough resident memory while loaded, for the free-RAM check. */\n ramBytes: number;\n /** Qwen3 thinks unless told not to; the JSON grammar alone does not stop it. */\n noThink: boolean;\n};\n\nconst GB = 1024 ** 3;\n\n/** Pinned revisions and checksums (Hugging Face LFS sha256). */\nexport const LOCAL_MODELS: Record<LocalModelSize, LocalModelSpec> = {\n default: {\n size: \"default\",\n id: \"qwen3-0.6b-q4_k_m\",\n repo: \"unsloth/Qwen3-0.6B-GGUF\",\n revision: \"50968a4468ef4233ed78cd7c3de230dd1d61a56b\",\n file: \"Qwen3-0.6B-Q4_K_M.gguf\",\n bytes: 396_705_472,\n sha256: \"ac2d97712095a558e31573f62f466a3f9d93990898b0ec79d7c974c1780d524a\",\n ramBytes: 1 * GB,\n noThink: true,\n },\n better: {\n size: \"better\",\n id: \"qwen3-1.7b-q4_k_m\",\n repo: \"unsloth/Qwen3-1.7B-GGUF\",\n revision: \"d7f544eead698dbd1f15126ef60b45a1e1933222\",\n file: \"Qwen3-1.7B-Q4_K_M.gguf\",\n bytes: 1_107_409_472,\n sha256: \"b139949c5bd74937ad8ed8c8cf3d9ffb1e99c866c823204dc42c0d91fa181897\",\n ramBytes: 2.2 * GB,\n noThink: true,\n },\n};\n\n/** Exact runtime version the adapter was tested against. */\nexport const LLAMA_RUNTIME = \"node-llama-cpp@3.22.3\";\n\nexport function localModelPath(spec: LocalModelSpec): string {\n return join(modelCacheDir(), \"gguf\", spec.file);\n}\n\n/** The installed model of `preferred` size, else any installed one (default first). */\nexport async function installedLocalModel(\n preferred?: LocalModelSize,\n): Promise<LocalModelSpec | null> {\n if (process.env.CODEBUDDY_LOCAL_LLM === \"0\") return null;\n const order: LocalModelSize[] = [...(preferred ? [preferred] : []), \"default\", \"better\"];\n for (const size of new Set(order)) {\n const spec = LOCAL_MODELS[size];\n const info = await stat(localModelPath(spec)).catch(() => null);\n if (info?.isFile() && info.size === spec.bytes) return spec;\n }\n return null;\n}\n\n/** Whether the node-llama-cpp runtime can be imported from this install. */\nexport async function localRuntimeAvailable(): Promise<boolean> {\n try {\n await importRuntime();\n return true;\n } catch {\n return false;\n }\n}\n\nexport type DownloadCheck = { ok: true } | { ok: false; reason: string };\n\n/**\n * Whether setup should install the model on its own. A low-end machine (under\n * 4 GB of RAM or a single core) would spend most of a session carding at a few\n * tokens per second; it keeps keyword + vector discovery, and\n * `codebuddy models add local-llm` still works there by hand.\n */\nexport function machineCanCard(): DownloadCheck {\n if (totalmem() < 4 * GB) {\n return { ok: false, reason: `${formatBytes(totalmem())} RAM (setup installs it from 4 GB)` };\n }\n if (availableParallelism() < 2) return { ok: false, reason: \"a single CPU core\" };\n return { ok: true };\n}\n\n/** Free disk (model cache volume) and RAM before a download. */\nexport async function checkLocalModelResources(spec: LocalModelSpec): Promise<DownloadCheck> {\n const directory = modelCacheDir();\n await mkdir(directory, { recursive: true });\n const fs = await statfs(directory).catch(() => null);\n if (fs && fs.bavail * fs.bsize < spec.bytes * 1.1) {\n return {\n ok: false,\n reason: `needs ${formatBytes(spec.bytes * 1.1)} free in ${directory}, ${formatBytes(fs.bavail * fs.bsize)} available`,\n };\n }\n if (totalmem() < spec.ramBytes * 2) {\n return {\n ok: false,\n reason: `needs about ${formatBytes(spec.ramBytes)} of RAM while loaded; this machine has ${formatBytes(totalmem())} in total`,\n };\n }\n return { ok: true };\n}\n\n/**\n * Download the pinned GGUF into the model cache, verifying size and sha256\n * before it is moved into place (a partial or corrupt file is never used).\n */\nexport async function downloadLocalModel(\n spec: LocalModelSpec,\n onProgress?: (received: number, total: number) => void,\n fetchImpl: typeof fetch = fetch,\n): Promise<string> {\n const target = localModelPath(spec);\n await mkdir(dirname(target), { recursive: true });\n const partial = `${target}.partial`;\n const url = `https://huggingface.co/${spec.repo}/resolve/${spec.revision}/${spec.file}`;\n const response = await fetchImpl(url);\n if (!response.ok || !response.body) {\n throw new Error(`download failed: HTTP ${response.status} for ${url}`);\n }\n const hash = createHash(\"sha256\");\n let received = 0;\n const source = Readable.fromWeb(response.body as import(\"node:stream/web\").ReadableStream);\n source.on(\"data\", (chunk: Buffer) => {\n hash.update(chunk);\n received += chunk.length;\n onProgress?.(received, spec.bytes);\n });\n try {\n await pipeline(source, createWriteStream(partial));\n const digest = hash.digest(\"hex\");\n if (received !== spec.bytes || digest !== spec.sha256) {\n throw new Error(\n `checksum mismatch for ${spec.file} (got ${received} bytes, sha256 ${digest.slice(0, 12)}…); not installed`,\n );\n }\n await rename(partial, target);\n } finally {\n await rm(partial, { force: true });\n }\n return target;\n}\n\nexport async function removeLocalModels(): Promise<string[]> {\n const removed: string[] = [];\n for (const spec of Object.values(LOCAL_MODELS)) {\n const path = localModelPath(spec);\n if (await stat(path).catch(() => null)) {\n await rm(path, { force: true });\n removed.push(spec.id);\n }\n }\n return removed;\n}\n\n// ── Generation ──────────────────────────────────────────────────────────\n\n/** Minimal structural types for the dynamically imported runtime. */\ntype Llama = {\n loadModel(options: { modelPath: string }): Promise<LlamaModel>;\n createGrammarForJsonSchema(schema: unknown): Promise<unknown>;\n getGrammarFor(type: \"json\"): Promise<unknown>;\n};\ntype LlamaModel = {\n createContext(options: { contextSize: number; threads: number }): Promise<LlamaContext>;\n dispose(): Promise<void>;\n};\ntype LlamaContext = { getSequence(): unknown; dispose(): Promise<void> };\ntype ChatSession = {\n prompt(\n text: string,\n options: {\n grammar?: unknown;\n maxTokens: number;\n temperature: number;\n budgets?: { thoughtTokens: number };\n signal?: AbortSignal;\n stopOnAbortSignal?: boolean;\n },\n ): Promise<string>;\n resetChatHistory(): void;\n setChatHistory?(history: unknown): void;\n dispose(options?: { disposeSequence?: boolean }): void;\n};\ntype Runtime = {\n getLlama(options?: { gpu?: \"auto\" | false }): Promise<Llama>;\n LlamaChatSession: new (options: {\n contextSequence: unknown;\n autoDisposeSequence?: boolean;\n systemPrompt?: string;\n }) => ChatSession;\n};\n\ntype Loaded = {\n spec: LocalModelSpec;\n llama: Llama;\n model: LlamaModel;\n context: LlamaContext;\n sequence: unknown;\n runtime: Runtime;\n};\n\nlet loading: Promise<Loaded> | null = null;\nlet loaded: Loaded | null = null;\n/** One generation at a time: a single context sequence is shared. */\nlet queue: Promise<unknown> = Promise.resolve();\nconst grammars = new Map<unknown, Promise<unknown>>();\n\nasync function importRuntime(): Promise<Runtime> {\n // A variable specifier: not a dependency, never bundled, resolved at run time.\n const specifier = process.env.CODEBUDDY_LLAMA_RUNTIME ?? \"node-llama-cpp\";\n return (await import(specifier)) as Runtime;\n}\n\n/** Context large enough for the bounded card/fact prompts (~1k tokens in, ≤ 400 out). */\nconst CONTEXT_TOKENS = 4096;\n\n/** Physical cores minus one (logical on SMT machines: a ceiling, not an exact count). */\nexport function generationThreads(): number {\n const configured = Number(process.env.CODEBUDDY_LLM_THREADS);\n if (Number.isInteger(configured) && configured > 0) return configured;\n return Math.max(1, availableParallelism() - 1);\n}\n\nasync function load(spec: LocalModelSpec): Promise<Loaded> {\n if (loaded?.spec.id === spec.id) return loaded;\n if (!loading) {\n loading = (async () => {\n const runtime = await importRuntime();\n const llama = await runtime.getLlama({ gpu: \"auto\" });\n const model = await llama.loadModel({ modelPath: localModelPath(spec) });\n const context = await model.createContext({\n contextSize: CONTEXT_TOKENS,\n threads: generationThreads(),\n });\n loaded = { spec, llama, model, context, sequence: context.getSequence(), runtime };\n return loaded;\n })().finally(() => {\n loading = null;\n });\n }\n return loading;\n}\n\n/**\n * The model leaves memory this long after its last generation, so a finished\n * card pass does not keep ~1 GB resident in `codebuddy serve` for the rest of\n * the session. The next pass (or a warm-up) loads it again in under a second.\n */\nexport const IDLE_UNLOAD_MS = 60_000;\nlet idleTimer: NodeJS.Timeout | null = null;\nlet running = 0;\n\nfunction scheduleUnload(): void {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => void unloadLocalModel(), IDLE_UNLOAD_MS);\n // Never keeps the process alive on its own.\n idleTimer.unref();\n}\n\n/** Free the model and its context now (idle timer, `serve` shutdown). Never throws. */\nexport async function unloadLocalModel(): Promise<void> {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = null;\n const current = loaded;\n if (!current || running > 0) return;\n loaded = null;\n grammars.clear();\n await current.context.dispose().catch(() => {});\n await current.model.dispose().catch(() => {});\n}\n\n/** True once the model is resident in this process (query expansion only runs then). */\nexport function isLocalModelWarm(): boolean {\n return loaded !== null;\n}\n\n/** Load the model now (background warm-up); resolves false when it cannot load. */\nexport async function warmLocalModel(spec: LocalModelSpec): Promise<boolean> {\n try {\n await load(spec);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * `chatJson` for the local backend: JSON constrained by a grammar built from\n * the request's zod schema (plain JSON grammar if the schema cannot be\n * converted), then validated with zod. Never throws.\n */\nexport async function localChatJson<T>(\n spec: LocalModelSpec,\n request: ChatJsonRequest<T>,\n): Promise<LlmResult<T>> {\n const started = Date.now();\n const fail = (reason: \"timeout\" | \"invalid\" | \"disabled\", detail: string): LlmResult<T> => ({\n ok: false,\n reason,\n detail: detail.slice(0, 300),\n latencyMs: Date.now() - started,\n });\n let model: Loaded;\n try {\n model = await withDeadline(load(spec), request.deadlineMs);\n } catch (error) {\n return (error as Error).name === \"TimeoutError\"\n ? fail(\"timeout\", \"model still loading\")\n : fail(\"disabled\", `local model unavailable: ${(error as Error).message}`);\n }\n const run = async (): Promise<LlmResult<T>> => {\n running++;\n try {\n return await generate();\n } finally {\n running--;\n scheduleUnload();\n }\n };\n const generate = async (): Promise<LlmResult<T>> => {\n // The idle unload may have run while this call waited in the queue.\n if (!loaded) model = await load(spec);\n const remaining = request.deadlineMs - (Date.now() - started);\n if (remaining <= 0) return fail(\"timeout\", `no answer within ${request.deadlineMs} ms`);\n const grammar = await grammarFor(model.llama, request.jsonSchema ?? request.schema);\n const session = new model.runtime.LlamaChatSession({\n contextSequence: model.sequence,\n autoDisposeSequence: false,\n systemPrompt: request.system,\n });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), remaining);\n try {\n const text = await session.prompt(`${spec.noThink ? \"/no_think\\n\" : \"\"}${request.user}`, {\n grammar,\n maxTokens: request.maxTokens,\n temperature: 0,\n ...(spec.noThink ? { budgets: { thoughtTokens: 0 } } : {}),\n signal: controller.signal,\n stopOnAbortSignal: true,\n });\n if (controller.signal.aborted) {\n return fail(\"timeout\", `no answer within ${request.deadlineMs} ms`);\n }\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch {\n return fail(\"invalid\", `output is not JSON: ${text.slice(0, 120)}`);\n }\n const parsed = request.schema.safeParse(value);\n if (!parsed.success)\n return fail(\"invalid\", `output failed validation: ${text.slice(0, 120)}`);\n return {\n ok: true,\n value: parsed.data,\n model: spec.id,\n latencyMs: Date.now() - started,\n tokens: Math.ceil((request.system.length + request.user.length + text.length) / 4),\n cached: false,\n };\n } catch (error) {\n return controller.signal.aborted\n ? fail(\"timeout\", `no answer within ${request.deadlineMs} ms`)\n : fail(\"invalid\", String((error as Error)?.message ?? error));\n } finally {\n clearTimeout(timer);\n session.dispose({ disposeSequence: false });\n }\n };\n const result = queue.then(run, run);\n queue = result.catch(() => undefined);\n return result;\n}\n\nasync function grammarFor(llama: Llama, schema: z.ZodType | object): Promise<unknown> {\n let grammar = grammars.get(schema);\n if (!grammar) {\n grammar = (async () => {\n try {\n const json =\n schema instanceof z.ZodType\n ? z.toJSONSchema(schema, { io: \"input\", unrepresentable: \"any\" })\n : schema;\n return await llama.createGrammarForJsonSchema(stripSchemaMeta(json));\n } catch {\n return llama.getGrammarFor(\"json\");\n }\n })();\n grammars.set(schema, grammar);\n }\n return grammar;\n}\n\n/** llama.cpp's schema grammar wants plain structure: no `$schema`, no defaults. */\nfunction stripSchemaMeta(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stripSchemaMeta);\n if (!value || typeof value !== \"object\") return value;\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n if (key === \"$schema\" || key === \"default\" || key === \"additionalProperties\") continue;\n out[key] = stripSchemaMeta(child);\n }\n return out;\n}\n\nfunction withDeadline<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(Object.assign(new Error(\"deadline\"), { name: \"TimeoutError\" })),\n ms,\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n}\n\n// ── Foreground yield ────────────────────────────────────────────────────\n\n/** A prompt hook or MCP tool call touched this within the window: background work waits. */\nconst FOREGROUND_WINDOW_MS = 2_000;\nconst FOREGROUND_MAX_WAIT_MS = 15_000;\n\nfunction foregroundPath(root: string): string {\n return join(root, \".codebuddy\", \"cache\", \"foreground\");\n}\n\n/** Record that a hook or tool call is running (cheap: one utimes). Never throws. */\nexport async function markForeground(root: string): Promise<void> {\n const path = foregroundPath(root);\n const now = new Date();\n try {\n await utimes(path, now, now);\n } catch {\n await mkdir(dirname(path), { recursive: true }).catch(() => {});\n await writeFile(path, \"\").catch(() => {});\n }\n}\n\n/** Wait (bounded) until no foreground work was marked within the window. */\nexport async function waitForForeground(root: string, signal?: AbortSignal): Promise<void> {\n const until = Date.now() + FOREGROUND_MAX_WAIT_MS;\n while (Date.now() < until && !signal?.aborted) {\n const info = await stat(foregroundPath(root)).catch(() => null);\n if (!info || Date.now() - info.mtimeMs > FOREGROUND_WINDOW_MS) return;\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n}\n\n// ── Status ──────────────────────────────────────────────────────────────\n\nexport type LocalModelStatus = {\n runtime: boolean;\n installed: LocalModelSpec | null;\n path: string | null;\n};\n\nexport async function localModelStatus(preferred?: LocalModelSize): Promise<LocalModelStatus> {\n const installed = await installedLocalModel(preferred);\n return {\n runtime: await localRuntimeAvailable(),\n installed,\n path: installed ? localModelPath(installed) : null,\n };\n}\n\nexport function formatBytes(bytes: number): string {\n return bytes >= GB ? `${(bytes / GB).toFixed(1)} GB` : `${Math.round(bytes / 1024 ** 2)} MB`;\n}\n\n/** Free RAM now (for the `models add` warning; the hard check uses total RAM). */\nexport function freeMemory(): number {\n return freemem();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
detectTestCommand,
|
|
7
7
|
estimateTokens,
|
|
8
8
|
findCoveringTest
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7IPSDDO5.js";
|
|
10
10
|
import {
|
|
11
11
|
hookRoot
|
|
12
12
|
} from "./chunk-TGFTKWOR.js";
|
|
@@ -17,17 +17,6 @@ import {
|
|
|
17
17
|
MEMORY_CLASSES,
|
|
18
18
|
memoryCandidateSchema
|
|
19
19
|
} from "./chunk-DFV2SK6C.js";
|
|
20
|
-
import {
|
|
21
|
-
INCIDENT_SEVERITIES,
|
|
22
|
-
MemoryFileStore,
|
|
23
|
-
admitsLexically,
|
|
24
|
-
isEligibleMemory,
|
|
25
|
-
lexicalTerms,
|
|
26
|
-
termOverlap
|
|
27
|
-
} from "./chunk-7QMHIJBA.js";
|
|
28
|
-
import {
|
|
29
|
-
generateEntityId
|
|
30
|
-
} from "./chunk-CAEPHLHC.js";
|
|
31
20
|
import {
|
|
32
21
|
NON_SOURCE_PATH,
|
|
33
22
|
TASK_PATH_LIMIT,
|
|
@@ -42,11 +31,22 @@ import {
|
|
|
42
31
|
readBoundedSource,
|
|
43
32
|
syncFileVectors,
|
|
44
33
|
taskTerms
|
|
45
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-4DTO2E4Y.js";
|
|
46
35
|
import {
|
|
47
36
|
extractSymbolTable,
|
|
48
37
|
supportsSymbols
|
|
49
38
|
} from "./chunk-Y7D7PUBE.js";
|
|
39
|
+
import {
|
|
40
|
+
INCIDENT_SEVERITIES,
|
|
41
|
+
MemoryFileStore,
|
|
42
|
+
admitsLexically,
|
|
43
|
+
isEligibleMemory,
|
|
44
|
+
lexicalTerms,
|
|
45
|
+
termOverlap
|
|
46
|
+
} from "./chunk-VBDM7HC5.js";
|
|
47
|
+
import {
|
|
48
|
+
generateEntityId
|
|
49
|
+
} from "./chunk-EMWGLKPR.js";
|
|
50
50
|
import {
|
|
51
51
|
REDACTED_LINE,
|
|
52
52
|
claimText,
|
|
@@ -58,21 +58,21 @@ import {
|
|
|
58
58
|
scanFields,
|
|
59
59
|
scanSensitive
|
|
60
60
|
} from "./chunk-AL6VBTNA.js";
|
|
61
|
-
import {
|
|
62
|
-
DEFAULT_RERANK_MODELS,
|
|
63
|
-
LOCAL_EMBEDDING_MODEL
|
|
64
|
-
} from "./chunk-HPOR6YXA.js";
|
|
65
61
|
import {
|
|
66
62
|
loadPlanPolicy,
|
|
67
63
|
loadRuntimeConfig,
|
|
68
64
|
readConfigFile
|
|
69
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-Y4QQML24.js";
|
|
70
66
|
import {
|
|
71
67
|
assertNoSymlinkBetween,
|
|
72
68
|
composeMarkdown,
|
|
73
69
|
parseFrontMatter,
|
|
74
70
|
writeAtomic
|
|
75
71
|
} from "./chunk-CG5B3LYG.js";
|
|
72
|
+
import {
|
|
73
|
+
DEFAULT_RERANK_MODELS,
|
|
74
|
+
LOCAL_EMBEDDING_MODEL
|
|
75
|
+
} from "./chunk-HPOR6YXA.js";
|
|
76
76
|
|
|
77
77
|
// src/hooks/runtime.ts
|
|
78
78
|
import { mkdir as mkdir7, readFile as readFile10, rm as rm5, stat as stat4, writeFile } from "fs/promises";
|
|
@@ -1474,7 +1474,7 @@ async function buildBeforeEditContext(input) {
|
|
|
1474
1474
|
...hasExplicitTargets ? { useGit: false } : input.useGit !== void 0 ? { useGit: input.useGit } : {}
|
|
1475
1475
|
});
|
|
1476
1476
|
const mapPromise = loadProjectArchitectureMap(repositoryRoot, manifest);
|
|
1477
|
-
const discovery = !hasExplicitTargets && input.task ? await discoverTaskPaths(repositoryRoot, input.task, manifest, mapPromise) : { paths: [], hits: [], explain: [] };
|
|
1477
|
+
const discovery = !hasExplicitTargets && input.task ? await discoverTaskPaths(repositoryRoot, input.task, manifest, mapPromise) : { paths: [], hits: [], explain: [], confidence: void 0 };
|
|
1478
1478
|
const taskPaths = discovery.paths;
|
|
1479
1479
|
const askedTask = Boolean(input.task?.trim());
|
|
1480
1480
|
const targetPaths = hasExplicitTargets ? resolvedPaths : taskPaths.length > 0 ? taskPaths : askedTask && input.useGit !== true ? [] : resolvedPaths;
|
|
@@ -1592,11 +1592,15 @@ async function buildBeforeEditContext(input) {
|
|
|
1592
1592
|
tests,
|
|
1593
1593
|
testCommand,
|
|
1594
1594
|
diffs,
|
|
1595
|
-
explain
|
|
1595
|
+
explain,
|
|
1596
|
+
...discovery.confidence && !hasExplicitTargets ? { confidence: discovery.confidence } : {},
|
|
1597
|
+
// A plain abstention: no guessed files, and the agent is told to search itself.
|
|
1598
|
+
...askedTask && !hasExplicitTargets && targetPaths.length === 0 ? { note: NO_MATCH_NOTE } : {}
|
|
1596
1599
|
};
|
|
1597
1600
|
const tokens = buildTokenStats(assembled, input.tokenBudget);
|
|
1598
1601
|
return enforceContextBudget({ ...assembled, tokens });
|
|
1599
1602
|
}
|
|
1603
|
+
var NO_MATCH_NOTE = "No confident file match for this task; search the repository normally (grep/glob) instead of relying on CodeBuddy targets.";
|
|
1600
1604
|
async function recallHandoffs(repositoryRoot, input) {
|
|
1601
1605
|
try {
|
|
1602
1606
|
return await new WorklogStore(repositoryRoot).recall(input);
|
|
@@ -3846,7 +3850,7 @@ async function openHookSemantics(repositoryRoot) {
|
|
|
3846
3850
|
const connect = async () => {
|
|
3847
3851
|
const config = await loadRuntimeConfig(repositoryRoot, { requireDatabase: false });
|
|
3848
3852
|
if (!config.postgresUrl) return null;
|
|
3849
|
-
const { createRuntime } = await import("./operations-
|
|
3853
|
+
const { createRuntime } = await import("./operations-BPI633VN.js");
|
|
3850
3854
|
const opening = createRuntime(config, {
|
|
3851
3855
|
repositoryRoot,
|
|
3852
3856
|
startWorker: false,
|
|
@@ -4176,7 +4180,7 @@ async function runStageHook(input) {
|
|
|
4176
4180
|
}
|
|
4177
4181
|
async function llmMemoryOptions(repositoryRoot) {
|
|
4178
4182
|
try {
|
|
4179
|
-
return await (await import("./memory-
|
|
4183
|
+
return await (await import("./memory-LSZKSF53.js")).llmCaptureOptions(repositoryRoot);
|
|
4180
4184
|
} catch {
|
|
4181
4185
|
return {};
|
|
4182
4186
|
}
|
|
@@ -4271,7 +4275,7 @@ async function runSyncHook(repositoryRoot, options = {}) {
|
|
|
4271
4275
|
await writeFile(dirty, "").catch(() => void 0);
|
|
4272
4276
|
return null;
|
|
4273
4277
|
}
|
|
4274
|
-
const { createRuntime } = await import("./operations-
|
|
4278
|
+
const { createRuntime } = await import("./operations-BPI633VN.js");
|
|
4275
4279
|
const runtime = await createRuntime(config, { repositoryRoot }).catch(async (error) => {
|
|
4276
4280
|
await rm5(lock, { recursive: true, force: true });
|
|
4277
4281
|
throw error;
|
|
@@ -4729,4 +4733,4 @@ export {
|
|
|
4729
4733
|
readCaptureTurn,
|
|
4730
4734
|
renderContextBlock
|
|
4731
4735
|
};
|
|
4732
|
-
//# sourceMappingURL=chunk-
|
|
4736
|
+
//# sourceMappingURL=chunk-OO7Q7XZF.js.map
|