opencode-rag-plugin 1.12.17 → 1.14.6
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/ReadMe.md +15 -13
- package/dist/api.d.ts +54 -2
- package/dist/api.js +41 -1
- package/dist/api.js.map +1 -1
- package/dist/chunker/base.js +2 -0
- package/dist/chunker/base.js.map +1 -1
- package/dist/chunker/bash.d.ts +5 -0
- package/dist/chunker/bash.js +5 -0
- package/dist/chunker/bash.js.map +1 -1
- package/dist/chunker/c.d.ts +6 -0
- package/dist/chunker/c.js +6 -0
- package/dist/chunker/c.js.map +1 -1
- package/dist/chunker/cpp.d.ts +6 -0
- package/dist/chunker/cpp.js +6 -0
- package/dist/chunker/cpp.js.map +1 -1
- package/dist/chunker/csharp.d.ts +6 -0
- package/dist/chunker/csharp.js +6 -0
- package/dist/chunker/csharp.js.map +1 -1
- package/dist/chunker/css.d.ts +6 -0
- package/dist/chunker/css.js +6 -0
- package/dist/chunker/css.js.map +1 -1
- package/dist/chunker/doc.d.ts +18 -0
- package/dist/chunker/doc.js +18 -0
- package/dist/chunker/doc.js.map +1 -1
- package/dist/chunker/dockerfile.d.ts +6 -0
- package/dist/chunker/dockerfile.js +6 -0
- package/dist/chunker/dockerfile.js.map +1 -1
- package/dist/chunker/docx.d.ts +18 -0
- package/dist/chunker/docx.js +18 -0
- package/dist/chunker/docx.js.map +1 -1
- package/dist/chunker/excel.d.ts +19 -0
- package/dist/chunker/excel.js +19 -0
- package/dist/chunker/excel.js.map +1 -1
- package/dist/chunker/go.d.ts +5 -0
- package/dist/chunker/go.js +5 -0
- package/dist/chunker/go.js.map +1 -1
- package/dist/chunker/grammar.d.ts +62 -0
- package/dist/chunker/grammar.js +133 -0
- package/dist/chunker/grammar.js.map +1 -1
- package/dist/chunker/html.d.ts +5 -0
- package/dist/chunker/html.js +5 -0
- package/dist/chunker/html.js.map +1 -1
- package/dist/chunker/image.d.ts +31 -0
- package/dist/chunker/image.js +50 -4
- package/dist/chunker/image.js.map +1 -1
- package/dist/chunker/ini.d.ts +5 -0
- package/dist/chunker/ini.js +5 -0
- package/dist/chunker/ini.js.map +1 -1
- package/dist/chunker/java.d.ts +5 -0
- package/dist/chunker/java.js +5 -0
- package/dist/chunker/java.js.map +1 -1
- package/dist/chunker/javascript.d.ts +6 -0
- package/dist/chunker/javascript.js +6 -0
- package/dist/chunker/javascript.js.map +1 -1
- package/dist/chunker/json.d.ts +5 -0
- package/dist/chunker/json.js +5 -0
- package/dist/chunker/json.js.map +1 -1
- package/dist/chunker/kotlin.d.ts +6 -0
- package/dist/chunker/kotlin.js +6 -0
- package/dist/chunker/kotlin.js.map +1 -1
- package/dist/chunker/loader.d.ts +11 -0
- package/dist/chunker/loader.js +20 -0
- package/dist/chunker/loader.js.map +1 -1
- package/dist/chunker/markdown.d.ts +5 -0
- package/dist/chunker/markdown.js +5 -0
- package/dist/chunker/markdown.js.map +1 -1
- package/dist/chunker/pdf.d.ts +19 -0
- package/dist/chunker/pdf.js +30 -0
- package/dist/chunker/pdf.js.map +1 -1
- package/dist/chunker/php.d.ts +5 -0
- package/dist/chunker/php.js +5 -0
- package/dist/chunker/php.js.map +1 -1
- package/dist/chunker/powershell.d.ts +5 -0
- package/dist/chunker/powershell.js +5 -0
- package/dist/chunker/powershell.js.map +1 -1
- package/dist/chunker/python.d.ts +5 -0
- package/dist/chunker/python.js +5 -0
- package/dist/chunker/python.js.map +1 -1
- package/dist/chunker/razor.d.ts +12 -0
- package/dist/chunker/razor.js +25 -0
- package/dist/chunker/razor.js.map +1 -1
- package/dist/chunker/ruby.d.ts +5 -0
- package/dist/chunker/ruby.js +5 -0
- package/dist/chunker/ruby.js.map +1 -1
- package/dist/chunker/rust.d.ts +6 -0
- package/dist/chunker/rust.js +6 -0
- package/dist/chunker/rust.js.map +1 -1
- package/dist/chunker/sln.d.ts +11 -0
- package/dist/chunker/sln.js +11 -0
- package/dist/chunker/sln.js.map +1 -1
- package/dist/chunker/sql.d.ts +5 -0
- package/dist/chunker/sql.js +5 -0
- package/dist/chunker/sql.js.map +1 -1
- package/dist/chunker/ssl.d.ts +12 -0
- package/dist/chunker/ssl.js +21 -2
- package/dist/chunker/ssl.js.map +1 -1
- package/dist/chunker/swift.d.ts +5 -0
- package/dist/chunker/swift.js +5 -0
- package/dist/chunker/swift.js.map +1 -1
- package/dist/chunker/tex.d.ts +12 -0
- package/dist/chunker/tex.js +12 -0
- package/dist/chunker/tex.js.map +1 -1
- package/dist/chunker/toml.d.ts +5 -0
- package/dist/chunker/toml.js +5 -0
- package/dist/chunker/toml.js.map +1 -1
- package/dist/chunker/typescript.d.ts +6 -0
- package/dist/chunker/typescript.js +6 -0
- package/dist/chunker/typescript.js.map +1 -1
- package/dist/chunker/xml.d.ts +5 -0
- package/dist/chunker/xml.js +5 -0
- package/dist/chunker/xml.js.map +1 -1
- package/dist/chunker/yaml.d.ts +5 -0
- package/dist/chunker/yaml.js +5 -0
- package/dist/chunker/yaml.js.map +1 -1
- package/dist/cli/commands/clear.d.ts +12 -0
- package/dist/cli/commands/clear.js +81 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/describe-image.d.ts +14 -0
- package/dist/cli/commands/describe-image.js +68 -0
- package/dist/cli/commands/describe-image.js.map +1 -0
- package/dist/cli/commands/dump.d.ts +13 -0
- package/dist/cli/commands/dump.js +55 -0
- package/dist/cli/commands/dump.js.map +1 -0
- package/dist/cli/commands/eval.d.ts +32 -0
- package/dist/cli/commands/eval.js +158 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/index-command.d.ts +17 -0
- package/dist/cli/commands/index-command.js +167 -0
- package/dist/cli/commands/index-command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +16 -0
- package/dist/cli/commands/index.js +17 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init-helpers.d.ts +101 -0
- package/dist/cli/commands/init-helpers.js +397 -0
- package/dist/cli/commands/init-helpers.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.js +251 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +13 -0
- package/dist/cli/commands/list.js +46 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +14 -0
- package/dist/cli/commands/mcp.js +35 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/query.d.ts +14 -0
- package/dist/cli/commands/query.js +86 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/show.d.ts +13 -0
- package/dist/cli/commands/show.js +51 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/status.d.ts +14 -0
- package/dist/cli/commands/status.js +104 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/ui.d.ts +14 -0
- package/dist/cli/commands/ui.js +69 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/update.d.ts +14 -0
- package/dist/cli/commands/update.js +76 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/format.d.ts +112 -0
- package/dist/cli/format.js +184 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/helpers.d.ts +51 -0
- package/dist/cli/helpers.js +86 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +28 -0
- package/dist/cli/index.js +104 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/progress.d.ts +39 -0
- package/dist/cli/progress.js +137 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/types.d.ts +40 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli.d.ts +11 -4
- package/dist/cli.js +9 -1253
- package/dist/cli.js.map +1 -1
- package/dist/content/doc.d.ts +1 -1
- package/dist/content/doc.js +1 -1
- package/dist/content/doc.js.map +1 -1
- package/dist/content/docx.d.ts +1 -1
- package/dist/content/docx.js +1 -1
- package/dist/content/docx.js.map +1 -1
- package/dist/content/excel.d.ts +1 -1
- package/dist/content/excel.js +1 -1
- package/dist/content/excel.js.map +1 -1
- package/dist/content/pdf.d.ts +1 -1
- package/dist/content/pdf.js +1 -1
- package/dist/content/pdf.js.map +1 -1
- package/dist/content/reader.d.ts +3 -1
- package/dist/content/reader.js +42 -10
- package/dist/content/reader.js.map +1 -1
- package/dist/core/bootstrap.d.ts +18 -0
- package/dist/core/bootstrap.js +9 -15
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/config.d.ts +144 -0
- package/dist/core/config.js +65 -14
- package/dist/core/config.js.map +1 -1
- package/dist/core/doc-progress.d.ts +15 -0
- package/dist/core/doc-progress.js +61 -0
- package/dist/core/doc-progress.js.map +1 -0
- package/dist/core/fileLogger.d.ts +7 -0
- package/dist/core/fileLogger.js +2 -0
- package/dist/core/fileLogger.js.map +1 -1
- package/dist/core/interfaces.d.ts +52 -1
- package/dist/core/manifest.d.ts +25 -0
- package/dist/core/manifest.js +15 -1
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/provider-defaults.d.ts +8 -0
- package/dist/core/provider-defaults.js +3 -0
- package/dist/core/provider-defaults.js.map +1 -1
- package/dist/core/rag-injection-flag.d.ts +3 -0
- package/dist/core/rag-injection-flag.js +2 -0
- package/dist/core/rag-injection-flag.js.map +1 -1
- package/dist/core/resolve-api-key.d.ts +1 -0
- package/dist/core/resolve-api-key.js +1 -0
- package/dist/core/resolve-api-key.js.map +1 -1
- package/dist/core/runtime-overrides.d.ts +4 -0
- package/dist/core/runtime-overrides.js +4 -1
- package/dist/core/runtime-overrides.js.map +1 -1
- package/dist/describer/anthropic.d.ts +22 -2
- package/dist/describer/anthropic.js +42 -110
- package/dist/describer/anthropic.js.map +1 -1
- package/dist/describer/describer.d.ts +21 -4
- package/dist/describer/describer.js +52 -111
- package/dist/describer/describer.js.map +1 -1
- package/dist/describer/gemini.d.ts +1 -2
- package/dist/describer/gemini.js +20 -113
- package/dist/describer/gemini.js.map +1 -1
- package/dist/describer/shared.d.ts +3 -0
- package/dist/describer/shared.js +19 -0
- package/dist/describer/shared.js.map +1 -0
- package/dist/embedder/factory.d.ts +25 -0
- package/dist/embedder/factory.js +25 -0
- package/dist/embedder/factory.js.map +1 -1
- package/dist/embedder/health.d.ts +10 -0
- package/dist/embedder/health.js +26 -14
- package/dist/embedder/health.js.map +1 -1
- package/dist/embedder/http.d.ts +47 -0
- package/dist/embedder/http.js +61 -3
- package/dist/embedder/http.js.map +1 -1
- package/dist/eval/index.d.ts +6 -0
- package/dist/eval/index.js.map +1 -1
- package/dist/eval/run-token-test.js +1 -5
- package/dist/eval/run-token-test.js.map +1 -1
- package/dist/eval/session-logger.d.ts +5 -0
- package/dist/eval/session-logger.js +4 -0
- package/dist/eval/session-logger.js.map +1 -1
- package/dist/eval/storage.d.ts +9 -0
- package/dist/eval/storage.js +9 -5
- package/dist/eval/storage.js.map +1 -1
- package/dist/eval/token-analysis.d.ts +8 -0
- package/dist/eval/token-analysis.js +6 -2
- package/dist/eval/token-analysis.js.map +1 -1
- package/dist/eval/token-counter.d.ts +1 -3
- package/dist/eval/token-counter.js +4 -5
- package/dist/eval/token-counter.js.map +1 -1
- package/dist/eval/types.d.ts +6 -0
- package/dist/eval/types.js +2 -0
- package/dist/eval/types.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/indexer/description-stage.js +11 -2
- package/dist/indexer/description-stage.js.map +1 -1
- package/dist/indexer/embed-stage.js +0 -8
- package/dist/indexer/embed-stage.js.map +1 -1
- package/dist/indexer/pipeline.d.ts +27 -3
- package/dist/indexer/pipeline.js +314 -143
- package/dist/indexer/pipeline.js.map +1 -1
- package/dist/indexer/stats.d.ts +35 -0
- package/dist/indexer/stats.js +9 -0
- package/dist/indexer/stats.js.map +1 -1
- package/dist/indexer/watch.d.ts +25 -0
- package/dist/indexer/watch.js +21 -0
- package/dist/indexer/watch.js.map +1 -1
- package/dist/indexer/worker.d.ts +90 -2
- package/dist/indexer/worker.js +109 -24
- package/dist/indexer/worker.js.map +1 -1
- package/dist/indexer.d.ts +11 -1
- package/dist/indexer.js +9 -0
- package/dist/indexer.js.map +1 -1
- package/dist/mcp/cli.d.ts +3 -0
- package/dist/mcp/cli.js +1 -0
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/handlers.d.ts +41 -0
- package/dist/mcp/handlers.js +40 -1
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +18 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/opencode/create-read-tool.js +1 -0
- package/dist/opencode/create-read-tool.js.map +1 -1
- package/dist/opencode/tools.d.ts +8 -17
- package/dist/opencode/tools.js +74 -109
- package/dist/opencode/tools.js.map +1 -1
- package/dist/plugin-entry.d.ts +6 -0
- package/dist/plugin-entry.js +6 -0
- package/dist/plugin-entry.js.map +1 -1
- package/dist/plugin.d.ts +37 -0
- package/dist/plugin.js +265 -40
- package/dist/plugin.js.map +1 -1
- package/dist/retriever/keyword-index.js +9 -9
- package/dist/retriever/keyword-index.js.map +1 -1
- package/dist/retriever/retriever.js +14 -4
- package/dist/retriever/retriever.js.map +1 -1
- package/dist/tui.d.ts +5 -0
- package/dist/tui.js +100 -12
- package/dist/tui.js.map +1 -1
- package/dist/types/opencode-plugin.d.ts +4 -1
- package/dist/updater.d.ts +23 -1
- package/dist/updater.js +55 -16
- package/dist/updater.js.map +1 -1
- package/dist/vectorstore/factory.d.ts +13 -0
- package/dist/vectorstore/factory.js +13 -0
- package/dist/vectorstore/factory.js.map +1 -1
- package/dist/vectorstore/lancedb.d.ts +78 -1
- package/dist/vectorstore/lancedb.js +195 -21
- package/dist/vectorstore/lancedb.js.map +1 -1
- package/dist/vectorstore/memory.d.ts +5 -0
- package/dist/vectorstore/memory.js +11 -0
- package/dist/vectorstore/memory.js.map +1 -1
- package/dist/watcher.d.ts +24 -0
- package/dist/watcher.js +17 -35
- package/dist/watcher.js.map +1 -1
- package/dist/web/api.d.ts +37 -0
- package/dist/web/api.js +54 -0
- package/dist/web/api.js.map +1 -1
- package/dist/web/server.d.ts +15 -0
- package/dist/web/server.js +14 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/static.d.ts +8 -0
- package/dist/web/static.js +8 -0
- package/dist/web/static.js.map +1 -1
- package/package.json +11 -15
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `status` command — shows index statistics, store health, and configuration summary.
|
|
3
|
+
*/
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import { c, resolveCliContext, cleanupContext, logCliError, logCliInfo, formatTimestamp } from "../format.js";
|
|
7
|
+
import { getIndexStatusSummary } from "../../indexer.js";
|
|
8
|
+
/**
|
|
9
|
+
* Check for a stale index.lock file and clean it up if the owning process is dead.
|
|
10
|
+
*
|
|
11
|
+
* An `index.lock` file is created by `runIndexPass` to prevent concurrent index
|
|
12
|
+
* operations. If the process that created it has terminated (e.g. crash, Ctrl+C),
|
|
13
|
+
* the lock becomes stale and must be removed before any new index pass can start.
|
|
14
|
+
* This function also warns the user when a live index pass is detected.
|
|
15
|
+
*
|
|
16
|
+
* @param storePath - Path to the vector store directory.
|
|
17
|
+
* @param logFilePath - Path to the debug log file for status output.
|
|
18
|
+
*/
|
|
19
|
+
function checkStaleLock(storePath, logFilePath) {
|
|
20
|
+
const lockPath = path.join(storePath, "index.lock");
|
|
21
|
+
if (!fs.existsSync(lockPath))
|
|
22
|
+
return;
|
|
23
|
+
try {
|
|
24
|
+
const raw = fs.readFileSync(lockPath, "utf-8");
|
|
25
|
+
const lock = JSON.parse(raw);
|
|
26
|
+
if (lock.pid) {
|
|
27
|
+
try {
|
|
28
|
+
// Signal 0 tests whether the process exists without actually sending a signal.
|
|
29
|
+
process.kill(lock.pid, 0);
|
|
30
|
+
logCliInfo(logFilePath, "status", `\n${c.warn("⚠")} Index lock is held by running process ${c.num(lock.pid)} — status may be stale until it completes.`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Process is dead — lock is stale
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
logCliInfo(logFilePath, "status", `\n${c.warn("⚠")} Stale index.lock found (PID ${lock.pid ?? "unknown"} is no longer running) — removing it.`);
|
|
38
|
+
fs.unlinkSync(lockPath);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Can't read or parse the lock file — not our concern, ignore silently
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Register the `status` command on the given Commander program.
|
|
46
|
+
*
|
|
47
|
+
* Displays a comprehensive overview of the current index: chunk counts,
|
|
48
|
+
* store path, embedding provider/model, file extensions, manifest status,
|
|
49
|
+
* keyword index state, and whether a rebuild is required.
|
|
50
|
+
*
|
|
51
|
+
* @param program - The Commander `Command` instance to register on.
|
|
52
|
+
*/
|
|
53
|
+
export function registerStatusCommand(program) {
|
|
54
|
+
program
|
|
55
|
+
.command("status")
|
|
56
|
+
.description("Show indexing status")
|
|
57
|
+
.option("-c, --config <path>", "path to config file")
|
|
58
|
+
.action(async (options) => {
|
|
59
|
+
try {
|
|
60
|
+
const cwd = process.cwd();
|
|
61
|
+
let logFilePath = path.resolve(cwd, ".opencode", "opencode-rag.log");
|
|
62
|
+
const ctx = await resolveCliContext(options, logFilePath, { skipProbe: true, skipKeywordIndex: true });
|
|
63
|
+
const { config, store, storePath, keywordIndex } = ctx;
|
|
64
|
+
logFilePath = ctx.logFilePath;
|
|
65
|
+
checkStaleLock(storePath, logFilePath);
|
|
66
|
+
const count = await store.count();
|
|
67
|
+
const summary = await getIndexStatusSummary(cwd, storePath, config, store, true);
|
|
68
|
+
logCliInfo(logFilePath, "status", `\n${c.heading("Indexed chunks:")} ${c.num(count)}`);
|
|
69
|
+
logCliInfo(logFilePath, "status", `${c.label("Store path:")} ${c.file(storePath)}`);
|
|
70
|
+
logCliInfo(logFilePath, "status", `${c.label("Embedding provider:")} ${c.value(config.embedding.provider)}`);
|
|
71
|
+
logCliInfo(logFilePath, "status", `${c.label("Embedding model:")} ${c.value(config.embedding.model)}`);
|
|
72
|
+
logCliInfo(logFilePath, "status", `${c.label("File extensions:")} ${config.indexing.includeExtensions.join(", ")}`);
|
|
73
|
+
logCliInfo(logFilePath, "status", `${c.label("Excluded dirs:")} ${config.indexing.excludeDirs.join(", ")}`);
|
|
74
|
+
logCliInfo(logFilePath, "status", `${c.label("Default top-K:")} ${c.num(config.retrieval.topK)}`);
|
|
75
|
+
logCliInfo(logFilePath, "status", `${c.label("Plugin enabled:")} ${config.openCode.enabled ? c.enabled("yes") : c.disabled("no")}`);
|
|
76
|
+
logCliInfo(logFilePath, "status", `${c.label("Manifest status:")} ${summary.manifestStatus}`);
|
|
77
|
+
logCliInfo(logFilePath, "status", `${c.label("Manifest entries:")} ${c.num(summary.manifestEntries)}`);
|
|
78
|
+
logCliInfo(logFilePath, "status", `${c.label("Last indexed:")} ${c.value(formatTimestamp(summary.lastIndexedAt))}`);
|
|
79
|
+
logCliInfo(logFilePath, "status", `${c.label("Up-to-date files:")} ${c.num(summary.upToDateFiles)}`);
|
|
80
|
+
logCliInfo(logFilePath, "status", `${c.label("Pending files:")} ${c.num(summary.pendingFiles)}`);
|
|
81
|
+
logCliInfo(logFilePath, "status", `${c.label("Indexed chunks:")} ${c.num(summary.storeChunkCount)}`);
|
|
82
|
+
logCliInfo(logFilePath, "status", `${c.label("Expected chunks:")} ${c.num(summary.manifestExpectedChunks)}`);
|
|
83
|
+
logCliInfo(logFilePath, "status", `${c.label("Watch mode:")} ${c.dim("off")}`);
|
|
84
|
+
const kiCount = config.retrieval.hybridSearch?.enabled
|
|
85
|
+
? keywordIndex?.count() ?? 0
|
|
86
|
+
: 0;
|
|
87
|
+
logCliInfo(logFilePath, "status", `${c.label("Keyword index:")} ${config.retrieval.hybridSearch?.enabled ? c.enabled("enabled") : c.disabled("disabled")} (${c.num(kiCount)} chunks)`);
|
|
88
|
+
if (summary.rebuildRequired) {
|
|
89
|
+
logCliInfo(logFilePath, "status", `${c.label("Rebuild required:")} ${c.warn("yes")} (manifest missing/corrupt)`);
|
|
90
|
+
}
|
|
91
|
+
if (summary.storeChunkCount > 0 && summary.manifestExpectedChunks > 0 && summary.storeChunkCount < summary.manifestExpectedChunks * 0.5) {
|
|
92
|
+
logCliInfo(logFilePath, "status", `${c.label("Data loss detected:")} ${c.warn("yes")} — store has fewer chunks than expected. Run 'opencode-rag index' to rebuild.`);
|
|
93
|
+
}
|
|
94
|
+
await cleanupContext(ctx);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const message = err.message || String(err);
|
|
98
|
+
const logFilePath = path.resolve(process.cwd(), ".opencode", "opencode-rag.log");
|
|
99
|
+
logCliError(logFilePath, "status", `\nStatus check failed: ${message}`, err);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ui` command — starts a local web UI for browsing the vector database.
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from "commander";
|
|
5
|
+
/**
|
|
6
|
+
* Register the `ui` command on the given Commander program.
|
|
7
|
+
*
|
|
8
|
+
* Starts an HTTP server on localhost that serves a single-page dashboard
|
|
9
|
+
* for browsing indexed chunks, files, and running searches. Optionally
|
|
10
|
+
* opens the system browser automatically.
|
|
11
|
+
*
|
|
12
|
+
* @param program - The Commander `Command` instance to register on.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerUiCommand(program: Command): void;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ui` command — starts a local web UI for browsing the vector database.
|
|
3
|
+
*/
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { c, resolveCliContext, logCliError, logCliInfo } from "../format.js";
|
|
6
|
+
/**
|
|
7
|
+
* Register the `ui` command on the given Commander program.
|
|
8
|
+
*
|
|
9
|
+
* Starts an HTTP server on localhost that serves a single-page dashboard
|
|
10
|
+
* for browsing indexed chunks, files, and running searches. Optionally
|
|
11
|
+
* opens the system browser automatically.
|
|
12
|
+
*
|
|
13
|
+
* @param program - The Commander `Command` instance to register on.
|
|
14
|
+
*/
|
|
15
|
+
export function registerUiCommand(program) {
|
|
16
|
+
program
|
|
17
|
+
.command("ui")
|
|
18
|
+
.description("Start the web UI for browsing the vector database")
|
|
19
|
+
.option("-c, --config <path>", "path to config file")
|
|
20
|
+
.option("-p, --port <number>", "port to listen on (default: from config or 3210)")
|
|
21
|
+
.option("--no-open", "do not open browser automatically")
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
try {
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
let logFilePath = path.resolve(cwd, ".opencode", "opencode-rag.log");
|
|
26
|
+
const ctx = await resolveCliContext(options, logFilePath);
|
|
27
|
+
const { config, storePath } = ctx;
|
|
28
|
+
logFilePath = ctx.logFilePath;
|
|
29
|
+
const port = parseInt(options.port ?? String(config.ui?.port ?? 3210), 10);
|
|
30
|
+
const openBrowser = options.open !== false && (config.ui?.openBrowser ?? true);
|
|
31
|
+
const { startWebUi } = await import("../../web/server.js");
|
|
32
|
+
const server = await startWebUi(storePath, port, cwd);
|
|
33
|
+
const url = `http://127.0.0.1:${server.port}`;
|
|
34
|
+
logCliInfo(logFilePath, "ui", `\n${c.heading("OpenCodeRAG Web UI")}`);
|
|
35
|
+
logCliInfo(logFilePath, "ui", ` ${c.label("URL:")} ${c.value(url)}`);
|
|
36
|
+
logCliInfo(logFilePath, "ui", ` ${c.dim("Press Ctrl+C to stop")}\n`);
|
|
37
|
+
if (openBrowser) {
|
|
38
|
+
const { spawn } = await import("node:child_process");
|
|
39
|
+
try {
|
|
40
|
+
if (process.platform === "win32") {
|
|
41
|
+
spawn("cmd.exe", ["/c", "start", url], { detached: true, stdio: "ignore" }).unref();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const cmd = process.platform === "darwin" ? "open" : "xdg-open";
|
|
45
|
+
spawn(cmd, [url], { detached: true, stdio: "ignore" }).unref();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
console.error(c.dim(`Could not open browser automatically. Open ${url} manually.`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
process.on("SIGINT", async () => {
|
|
53
|
+
await server.close();
|
|
54
|
+
process.exit(0);
|
|
55
|
+
});
|
|
56
|
+
process.on("SIGTERM", async () => {
|
|
57
|
+
await server.close();
|
|
58
|
+
process.exit(0);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const message = err.message || String(err);
|
|
63
|
+
const logFilePath = path.resolve(process.cwd(), ".opencode", "opencode-rag.log");
|
|
64
|
+
logCliError(logFilePath, "ui", `\nUI failed: ${message}`, err);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/cli/commands/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `update` command — checks for and installs OpenCodeRAG updates from GitHub.
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from "commander";
|
|
5
|
+
/**
|
|
6
|
+
* Register the `update` command on the given Commander program.
|
|
7
|
+
*
|
|
8
|
+
* Checks the GitHub repository for a newer release, displays the current
|
|
9
|
+
* and latest versions, and optionally applies the update by pulling
|
|
10
|
+
* the latest code and rebuilding.
|
|
11
|
+
*
|
|
12
|
+
* @param program - The Commander `Command` instance to register on.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerUpdateCommand(program: Command): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `update` command — checks for and installs OpenCodeRAG updates from GitHub.
|
|
3
|
+
*/
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { getCurrentVersion, checkForUpdate, applyUpdate } from "../../updater.js";
|
|
6
|
+
import { c } from "../format.js";
|
|
7
|
+
import { getPackageRoot } from "../helpers.js";
|
|
8
|
+
/**
|
|
9
|
+
* Register the `update` command on the given Commander program.
|
|
10
|
+
*
|
|
11
|
+
* Checks the GitHub repository for a newer release, displays the current
|
|
12
|
+
* and latest versions, and optionally applies the update by pulling
|
|
13
|
+
* the latest code and rebuilding.
|
|
14
|
+
*
|
|
15
|
+
* @param program - The Commander `Command` instance to register on.
|
|
16
|
+
*/
|
|
17
|
+
export function registerUpdateCommand(program) {
|
|
18
|
+
program
|
|
19
|
+
.command("update")
|
|
20
|
+
.description("Check for and install OpenCodeRAG updates from GitHub")
|
|
21
|
+
.option("--check", "only check for updates, don't install")
|
|
22
|
+
.option("-y, --yes", "skip confirmation prompt")
|
|
23
|
+
.option("-v, --verbose", "show build/install output")
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
try {
|
|
26
|
+
const currentVersion = getCurrentVersion();
|
|
27
|
+
console.log(`\n${c.heading("OpenCodeRAG Updater")}\n`);
|
|
28
|
+
console.log(` ${c.label("Current version:")} ${c.value(currentVersion)}`);
|
|
29
|
+
console.log(` ${c.label("Checking for updates...")}`);
|
|
30
|
+
const info = await checkForUpdate(currentVersion);
|
|
31
|
+
if (!info.updateAvailable) {
|
|
32
|
+
console.log(` ${c.success("Already up to date.")}\n`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
console.log(` ${c.label("Latest version:")} ${c.value(info.latestVersion)}`);
|
|
36
|
+
if (info.releaseUrl) {
|
|
37
|
+
console.log(` ${c.label("Release:")} ${c.file(info.releaseUrl)}`);
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
if (options.check) {
|
|
41
|
+
console.log(` ${c.warn("Update available. Run `opencode-rag update` to install.")}\n`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!options.yes) {
|
|
45
|
+
const readline = await import("node:readline");
|
|
46
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
47
|
+
const answer = await new Promise((resolve) => {
|
|
48
|
+
rl.question(` Install update to ${info.latestVersion}? [y/N] `, resolve);
|
|
49
|
+
});
|
|
50
|
+
rl.close();
|
|
51
|
+
if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
|
|
52
|
+
console.log(` ${c.dim("Cancelled.")}\n`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
console.log(` ${c.label("Applying update...")}\n`);
|
|
57
|
+
const result = applyUpdate({
|
|
58
|
+
repoRoot: path.resolve(getPackageRoot()),
|
|
59
|
+
verbose: options.verbose ?? false,
|
|
60
|
+
});
|
|
61
|
+
if (result.success) {
|
|
62
|
+
console.log(` ${c.success(result.message)}\n`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error(` ${c.error(result.message)}\n`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const message = err.message || String(err);
|
|
71
|
+
console.error(c.error(`\nUpdate failed: ${message}\n`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI formatting helpers — color palette, logging utilities, context resolution,
|
|
3
|
+
* and result formatting functions shared across all CLI command modules.
|
|
4
|
+
*/
|
|
5
|
+
import { type BootstrapOptions, type RagContext } from "../core/bootstrap.js";
|
|
6
|
+
import type { SearchResult } from "../core/interfaces.js";
|
|
7
|
+
import type { IndexRunStats } from "../indexer.js";
|
|
8
|
+
import type { CliOptions } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Semantic color helpers for consistent CLI output styling.
|
|
11
|
+
*
|
|
12
|
+
* Each property wraps a {@link picocolors} function to provide semantic naming
|
|
13
|
+
* (e.g. `c.file` for file paths, `c.error` for errors) so that color choices
|
|
14
|
+
* can be changed in one place without updating every call site.
|
|
15
|
+
*/
|
|
16
|
+
export declare const c: {
|
|
17
|
+
/** Bold cyan — used for section headings. */
|
|
18
|
+
heading: (s: string) => string;
|
|
19
|
+
/** Dim text — used for labels and secondary information. */
|
|
20
|
+
label: (s: string) => string;
|
|
21
|
+
/** Dim text — alias for `label`, used for inline dimming. */
|
|
22
|
+
dim: (s: string) => string;
|
|
23
|
+
/** Green text — used for positive values and success states. */
|
|
24
|
+
value: (s: string) => string;
|
|
25
|
+
/** Green text — formats numbers as strings for inline display. */
|
|
26
|
+
num: (s: string | number) => string;
|
|
27
|
+
/** Yellow text — used for file paths. */
|
|
28
|
+
file: (s: string) => string;
|
|
29
|
+
/** Cyan text — used for language names and matched terms. */
|
|
30
|
+
lang: (s: string) => string;
|
|
31
|
+
/** Magenta text — used for relevance scores. */
|
|
32
|
+
score: (s: string) => string;
|
|
33
|
+
/** Dim text — used for chunk descriptions. */
|
|
34
|
+
desc: (s: string) => string;
|
|
35
|
+
/** Green text — used for success messages. */
|
|
36
|
+
success: (s: string) => string;
|
|
37
|
+
/** Yellow text — used for warnings. */
|
|
38
|
+
warn: (s: string) => string;
|
|
39
|
+
/** Red text — used for error messages. */
|
|
40
|
+
error: (s: string) => string;
|
|
41
|
+
/** Green text — used for "enabled" status indicators. */
|
|
42
|
+
enabled: (s: string) => string;
|
|
43
|
+
/** Yellow text — used for "disabled" status indicators. */
|
|
44
|
+
disabled: (s: string) => string;
|
|
45
|
+
/** Green text — used for "created" file status. */
|
|
46
|
+
created: (s: string) => string;
|
|
47
|
+
/** Yellow text — used for "updated" file status. */
|
|
48
|
+
updated: (s: string) => string;
|
|
49
|
+
/** Dim text — used for "already exists" file status. */
|
|
50
|
+
exists: (s: string) => string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Log an error message to stderr and optionally append to the debug log.
|
|
54
|
+
*
|
|
55
|
+
* @param logFilePath - Absolute path to the debug log file.
|
|
56
|
+
* @param scope - Logical scope (e.g. "index", "query") for log filtering.
|
|
57
|
+
* @param message - Human-readable error message.
|
|
58
|
+
* @param error - Optional error object for structured logging.
|
|
59
|
+
*/
|
|
60
|
+
export declare function logCliError(_logFilePath: string, _scope: string, message: string, _error: unknown): void;
|
|
61
|
+
/**
|
|
62
|
+
* Log an informational message to stdout and optionally append to the debug log.
|
|
63
|
+
*
|
|
64
|
+
* @param logFilePath - Absolute path to the debug log file.
|
|
65
|
+
* @param scope - Logical scope (e.g. "index", "query") for log filtering.
|
|
66
|
+
* @param message - Human-readable info message.
|
|
67
|
+
*/
|
|
68
|
+
export declare function logCliInfo(_logFilePath: string, _scope: string, message: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a full `RagContext` from CLI options and log the config details.
|
|
71
|
+
*
|
|
72
|
+
* Wraps `resolveRagContext` from the bootstrap module with CLI-specific logging.
|
|
73
|
+
*
|
|
74
|
+
* @param opt - Parsed CLI options (may include a `--config` path).
|
|
75
|
+
* @param logFilePath - Path to the debug log file for config logging.
|
|
76
|
+
* @returns A fully initialized `RagContext` with store, embedder, and keyword index.
|
|
77
|
+
*/
|
|
78
|
+
export declare function resolveCliContext(opt: CliOptions, logFilePath: string, bootstrapOpts?: Partial<BootstrapOptions>): Promise<RagContext>;
|
|
79
|
+
/**
|
|
80
|
+
* Gracefully close a `RagContext` — closes the vector store and destroys pooled HTTP connections.
|
|
81
|
+
*
|
|
82
|
+
* @param ctx - The `RagContext` to clean up.
|
|
83
|
+
*/
|
|
84
|
+
export declare function cleanupContext(ctx: RagContext): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Format a Unix timestamp (milliseconds) into a human-readable locale string.
|
|
87
|
+
*
|
|
88
|
+
* @param timestamp - Unix timestamp in milliseconds, or `undefined` for "never".
|
|
89
|
+
* @returns A localized date string, or `"never"` if the timestamp is falsy.
|
|
90
|
+
*/
|
|
91
|
+
export declare function formatTimestamp(timestamp?: number): string;
|
|
92
|
+
/**
|
|
93
|
+
* Print an indexing pass summary to stdout.
|
|
94
|
+
*
|
|
95
|
+
* @param logFilePath - Path to the debug log file.
|
|
96
|
+
* @param stats - Statistics from a single indexing pass.
|
|
97
|
+
*/
|
|
98
|
+
export declare function logIndexSummary(logFilePath: string, stats: IndexRunStats): void;
|
|
99
|
+
/**
|
|
100
|
+
* Format a millisecond duration into a compact human-readable string.
|
|
101
|
+
*
|
|
102
|
+
* @param ms - Duration in milliseconds.
|
|
103
|
+
* @returns A string like `"3.2s"` or `"2m 15s"`.
|
|
104
|
+
*/
|
|
105
|
+
export declare function formatDuration(ms: number): string;
|
|
106
|
+
/**
|
|
107
|
+
* Remove duplicate search results based on file path, line range, and content.
|
|
108
|
+
*
|
|
109
|
+
* @param results - Raw search results that may contain duplicates.
|
|
110
|
+
* @returns Deduplicated search results preserving original order.
|
|
111
|
+
*/
|
|
112
|
+
export declare function dedupeResults(results: SearchResult[]): SearchResult[];
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI formatting helpers — color palette, logging utilities, context resolution,
|
|
3
|
+
* and result formatting functions shared across all CLI command modules.
|
|
4
|
+
*/
|
|
5
|
+
import pc from "picocolors";
|
|
6
|
+
import { resolveRagContext } from "../core/bootstrap.js";
|
|
7
|
+
import { destroyAllPooledConnections } from "../embedder/http.js";
|
|
8
|
+
// ── Color palette ───────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Semantic color helpers for consistent CLI output styling.
|
|
11
|
+
*
|
|
12
|
+
* Each property wraps a {@link picocolors} function to provide semantic naming
|
|
13
|
+
* (e.g. `c.file` for file paths, `c.error` for errors) so that color choices
|
|
14
|
+
* can be changed in one place without updating every call site.
|
|
15
|
+
*/
|
|
16
|
+
export const c = {
|
|
17
|
+
/** Bold cyan — used for section headings. */
|
|
18
|
+
heading: (s) => pc.bold(pc.cyan(s)),
|
|
19
|
+
/** Dim text — used for labels and secondary information. */
|
|
20
|
+
label: (s) => pc.dim(s),
|
|
21
|
+
/** Dim text — alias for `label`, used for inline dimming. */
|
|
22
|
+
dim: (s) => pc.dim(s),
|
|
23
|
+
/** Green text — used for positive values and success states. */
|
|
24
|
+
value: (s) => pc.green(s),
|
|
25
|
+
/** Green text — formats numbers as strings for inline display. */
|
|
26
|
+
num: (s) => pc.green(String(s)),
|
|
27
|
+
/** Yellow text — used for file paths. */
|
|
28
|
+
file: (s) => pc.yellow(s),
|
|
29
|
+
/** Cyan text — used for language names and matched terms. */
|
|
30
|
+
lang: (s) => pc.cyan(s),
|
|
31
|
+
/** Magenta text — used for relevance scores. */
|
|
32
|
+
score: (s) => pc.magenta(s),
|
|
33
|
+
/** Dim text — used for chunk descriptions. */
|
|
34
|
+
desc: (s) => pc.dim(s),
|
|
35
|
+
/** Green text — used for success messages. */
|
|
36
|
+
success: (s) => pc.green(s),
|
|
37
|
+
/** Yellow text — used for warnings. */
|
|
38
|
+
warn: (s) => pc.yellow(s),
|
|
39
|
+
/** Red text — used for error messages. */
|
|
40
|
+
error: (s) => pc.red(s),
|
|
41
|
+
/** Green text — used for "enabled" status indicators. */
|
|
42
|
+
enabled: (s) => pc.green(s),
|
|
43
|
+
/** Yellow text — used for "disabled" status indicators. */
|
|
44
|
+
disabled: (s) => pc.yellow(s),
|
|
45
|
+
/** Green text — used for "created" file status. */
|
|
46
|
+
created: (s) => pc.green(s),
|
|
47
|
+
/** Yellow text — used for "updated" file status. */
|
|
48
|
+
updated: (s) => pc.yellow(s),
|
|
49
|
+
/** Dim text — used for "already exists" file status. */
|
|
50
|
+
exists: (s) => pc.dim(s),
|
|
51
|
+
};
|
|
52
|
+
// ── Logging helpers ─────────────────────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* Log an error message to stderr and optionally append to the debug log.
|
|
55
|
+
*
|
|
56
|
+
* @param logFilePath - Absolute path to the debug log file.
|
|
57
|
+
* @param scope - Logical scope (e.g. "index", "query") for log filtering.
|
|
58
|
+
* @param message - Human-readable error message.
|
|
59
|
+
* @param error - Optional error object for structured logging.
|
|
60
|
+
*/
|
|
61
|
+
export function logCliError(_logFilePath, _scope, message, _error) {
|
|
62
|
+
console.error(c.error(message));
|
|
63
|
+
//appendDebugLog(logFilePath, { scope, message, error });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Log an informational message to stdout and optionally append to the debug log.
|
|
67
|
+
*
|
|
68
|
+
* @param logFilePath - Absolute path to the debug log file.
|
|
69
|
+
* @param scope - Logical scope (e.g. "index", "query") for log filtering.
|
|
70
|
+
* @param message - Human-readable info message.
|
|
71
|
+
*/
|
|
72
|
+
export function logCliInfo(_logFilePath, _scope, message) {
|
|
73
|
+
console.log(message);
|
|
74
|
+
//appendDebugLog(logFilePath, { scope, message });
|
|
75
|
+
}
|
|
76
|
+
// ── Context resolution ──────────────────────────────────────────
|
|
77
|
+
/**
|
|
78
|
+
* Resolve a full `RagContext` from CLI options and log the config details.
|
|
79
|
+
*
|
|
80
|
+
* Wraps `resolveRagContext` from the bootstrap module with CLI-specific logging.
|
|
81
|
+
*
|
|
82
|
+
* @param opt - Parsed CLI options (may include a `--config` path).
|
|
83
|
+
* @param logFilePath - Path to the debug log file for config logging.
|
|
84
|
+
* @returns A fully initialized `RagContext` with store, embedder, and keyword index.
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveCliContext(opt, logFilePath, bootstrapOpts) {
|
|
87
|
+
const ctx = await resolveRagContext({
|
|
88
|
+
configPath: opt.config,
|
|
89
|
+
...bootstrapOpts,
|
|
90
|
+
});
|
|
91
|
+
logCliInfo(logFilePath, "config", `${c.label("Config:")} ${c.file(ctx.logFilePath)}`);
|
|
92
|
+
logConfigDetails(logFilePath, ctx.config);
|
|
93
|
+
return ctx;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Print embedding and vector store configuration to stdout.
|
|
97
|
+
*
|
|
98
|
+
* @param logFilePath - Path to the debug log file.
|
|
99
|
+
* @param config - The resolved `RagConfig` to display.
|
|
100
|
+
*/
|
|
101
|
+
function logConfigDetails(logFilePath, config) {
|
|
102
|
+
logCliInfo(logFilePath, "config", ` ${c.label("Embedding provider:")} ${c.value(config.embedding.provider)}`);
|
|
103
|
+
logCliInfo(logFilePath, "config", ` ${c.label("Embedding model:")} ${c.value(config.embedding.model)}`);
|
|
104
|
+
logCliInfo(logFilePath, "config", ` ${c.label("Vector store:")} ${c.file(config.vectorStore.path)}`);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Gracefully close a `RagContext` — closes the vector store and destroys pooled HTTP connections.
|
|
108
|
+
*
|
|
109
|
+
* @param ctx - The `RagContext` to clean up.
|
|
110
|
+
*/
|
|
111
|
+
export async function cleanupContext(ctx) {
|
|
112
|
+
await ctx.store.close();
|
|
113
|
+
destroyAllPooledConnections();
|
|
114
|
+
}
|
|
115
|
+
// ── Formatting helpers ──────────────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Format a Unix timestamp (milliseconds) into a human-readable locale string.
|
|
118
|
+
*
|
|
119
|
+
* @param timestamp - Unix timestamp in milliseconds, or `undefined` for "never".
|
|
120
|
+
* @returns A localized date string, or `"never"` if the timestamp is falsy.
|
|
121
|
+
*/
|
|
122
|
+
export function formatTimestamp(timestamp) {
|
|
123
|
+
if (!timestamp)
|
|
124
|
+
return "never";
|
|
125
|
+
return new Date(timestamp).toLocaleString();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Print an indexing pass summary to stdout.
|
|
129
|
+
*
|
|
130
|
+
* @param logFilePath - Path to the debug log file.
|
|
131
|
+
* @param stats - Statistics from a single indexing pass.
|
|
132
|
+
*/
|
|
133
|
+
export function logIndexSummary(logFilePath, stats) {
|
|
134
|
+
logCliInfo(logFilePath, "index", ` ${c.label("New:")} ${c.num(stats.newFiles)}`);
|
|
135
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Modified:")} ${c.num(stats.modifiedFiles)}`);
|
|
136
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Unchanged:")} ${c.num(stats.unchangedFiles)}`);
|
|
137
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Deleted:")} ${c.num(stats.deletedFiles)}`);
|
|
138
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Removed:")} ${c.num(stats.removedFiles)}`);
|
|
139
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Empty skipped:")} ${c.num(stats.skippedEmptyFiles)}`);
|
|
140
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Small skipped:")} ${c.num(stats.skippedSmallFiles)}`);
|
|
141
|
+
if (stats.descriptionFailedFiles > 0) {
|
|
142
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Desc failed:")} ${c.num(stats.descriptionFailedFiles)}`);
|
|
143
|
+
}
|
|
144
|
+
logCliInfo(logFilePath, "index", ` ${c.label("Chunks written:")} ${c.num(stats.totalChunks)}`);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Format a millisecond duration into a compact human-readable string.
|
|
148
|
+
*
|
|
149
|
+
* @param ms - Duration in milliseconds.
|
|
150
|
+
* @returns A string like `"3.2s"` or `"2m 15s"`.
|
|
151
|
+
*/
|
|
152
|
+
export function formatDuration(ms) {
|
|
153
|
+
const seconds = (ms / 1000).toFixed(1);
|
|
154
|
+
if (ms < 60000)
|
|
155
|
+
return `${seconds}s`;
|
|
156
|
+
const minutes = Math.floor(ms / 60000);
|
|
157
|
+
const secs = ((ms % 60000) / 1000).toFixed(0);
|
|
158
|
+
return `${minutes}m ${secs}s`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Remove duplicate search results based on file path, line range, and content.
|
|
162
|
+
*
|
|
163
|
+
* @param results - Raw search results that may contain duplicates.
|
|
164
|
+
* @returns Deduplicated search results preserving original order.
|
|
165
|
+
*/
|
|
166
|
+
export function dedupeResults(results) {
|
|
167
|
+
const seen = new Set();
|
|
168
|
+
const deduped = [];
|
|
169
|
+
for (const result of results) {
|
|
170
|
+
const chunk = result.chunk;
|
|
171
|
+
const key = [
|
|
172
|
+
chunk.metadata.filePath,
|
|
173
|
+
chunk.metadata.startLine,
|
|
174
|
+
chunk.metadata.endLine,
|
|
175
|
+
chunk.content,
|
|
176
|
+
].join(":");
|
|
177
|
+
if (seen.has(key))
|
|
178
|
+
continue;
|
|
179
|
+
seen.add(key);
|
|
180
|
+
deduped.push(result);
|
|
181
|
+
}
|
|
182
|
+
return deduped;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"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"}
|