opencode-rag-plugin 1.3.2 → 1.3.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/dist/tui.js CHANGED
@@ -1,4 +1,76 @@
1
1
  import { createElement, insert, setProp } from "@opentui/solid";
2
+ import { readFileSync } from "node:fs";
3
+ import { existsSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ let _version;
7
+ function getVersion() {
8
+ if (_version !== undefined)
9
+ return _version;
10
+ try {
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
13
+ _version = pkg.version ?? "dev";
14
+ }
15
+ catch {
16
+ _version = "dev";
17
+ }
18
+ return _version;
19
+ }
20
+ const DEFAULT_STATUS = {
21
+ chunkCount: 0,
22
+ provider: "ollama",
23
+ model: "",
24
+ lastIndexedAt: undefined,
25
+ indexed: false,
26
+ };
27
+ function loadRagStatus(worktree) {
28
+ const status = { ...DEFAULT_STATUS };
29
+ for (const loc of ["opencode-rag.json", ".opencode/opencode-rag.json", ".opencode/rag.json"]) {
30
+ const configPath = join(worktree, loc);
31
+ if (!existsSync(configPath))
32
+ continue;
33
+ try {
34
+ const cfg = JSON.parse(readFileSync(configPath, "utf-8"));
35
+ if (cfg.embedding) {
36
+ status.provider = cfg.embedding.provider ?? status.provider;
37
+ status.model = cfg.embedding.model ?? status.model;
38
+ }
39
+ const storePath = cfg.vectorStore?.path ?? ".opencode/rag_db";
40
+ const manifestPath = join(worktree, storePath, "manifest.json");
41
+ if (existsSync(manifestPath)) {
42
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
43
+ if (manifest.files && typeof manifest.files === "object") {
44
+ status.chunkCount = Object.values(manifest.files)
45
+ .reduce((sum, entry) => sum + (entry.chunkCount ?? 0), 0);
46
+ }
47
+ status.lastIndexedAt = manifest.lastIndexedAt;
48
+ status.indexed = status.chunkCount > 0;
49
+ }
50
+ break;
51
+ }
52
+ catch {
53
+ continue;
54
+ }
55
+ }
56
+ return status;
57
+ }
58
+ function formatRelativeTime(timestamp) {
59
+ if (timestamp === undefined)
60
+ return "never";
61
+ const diff = Date.now() - timestamp;
62
+ const seconds = Math.floor(diff / 1000);
63
+ if (seconds < 60)
64
+ return "just now";
65
+ const minutes = Math.floor(seconds / 60);
66
+ if (minutes < 60)
67
+ return `${minutes}m ago`;
68
+ const hours = Math.floor(minutes / 60);
69
+ if (hours < 24)
70
+ return `${hours}h ago`;
71
+ const days = Math.floor(hours / 24);
72
+ return `${days}d ago`;
73
+ }
2
74
  const PLUGIN_NAME = "opencode-rag-plugin";
3
75
  function element(tag, props, children = []) {
4
76
  const node = createElement(tag);
@@ -19,7 +91,11 @@ function text(props, children = []) {
19
91
  function box(props, children = []) {
20
92
  return element("box", props, children);
21
93
  }
22
- function renderSidebar(theme) {
94
+ function renderSidebar(theme, version, status) {
95
+ const statusLine = status.indexed
96
+ ? `${status.chunkCount} chunks \u00B7 ${status.provider}/${status.model}`
97
+ : "Not indexed";
98
+ const timeLine = `Indexed ${formatRelativeTime(status.lastIndexedAt)}`;
23
99
  return box({
24
100
  width: "100%",
25
101
  flexDirection: "column",
@@ -39,20 +115,35 @@ function renderSidebar(theme) {
39
115
  box({ paddingLeft: 1, paddingRight: 1, backgroundColor: theme.accent }, [
40
116
  text({ fg: "#000000" }, ["OpenCodeRAG"]),
41
117
  ]),
118
+ text({ fg: theme.textMuted }, [`v${version}`]),
42
119
  ]),
43
- box({ width: "100%", marginTop: 1 }, [
44
- text({ fg: theme.text }, ["Hello World"]),
45
- ]),
120
+ text({ fg: theme.text }, [statusLine]),
121
+ text({ fg: theme.textMuted }, [timeLine]),
46
122
  ]);
47
123
  }
48
124
  const plugin = {
49
125
  id: `${PLUGIN_NAME}:tui`,
50
- tui: async (api) => {
126
+ tui: async (api, _options, meta) => {
127
+ const version = meta.version ?? getVersion();
128
+ let cachedStatus = DEFAULT_STATUS;
129
+ let lastRefresh = 0;
130
+ const REFRESH_INTERVAL_MS = 30_000;
131
+ function refreshStatus() {
132
+ const worktree = api.state.path.worktree;
133
+ if (worktree) {
134
+ cachedStatus = loadRagStatus(worktree);
135
+ lastRefresh = Date.now();
136
+ }
137
+ }
138
+ refreshStatus();
51
139
  api.slots.register({
52
140
  order: 900,
53
141
  slots: {
54
142
  sidebar_content() {
55
- return renderSidebar(api.theme.current);
143
+ if (Date.now() - lastRefresh > REFRESH_INTERVAL_MS) {
144
+ refreshStatus();
145
+ }
146
+ return renderSidebar(api.theme.current, version, cachedStatus);
56
147
  },
57
148
  },
58
149
  });
package/dist/tui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAIhE,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,SAAS,OAAO,CACd,GAAW,EACX,KAA8B,EAC9B,WAAoB,EAAE;IAEtB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;YAAE,SAAS;QACvE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAA8B,CAAC;AACxC,CAAC;AAED,SAAS,IAAI,CAAC,KAA8B,EAAE,WAAoB,EAAE;IAClE,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,GAAG,CAAC,KAA8B,EAAE,WAAoB,EAAE;IACjE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,KAItB;IACC,OAAO,GAAG,CACR;QACE,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,QAAQ;QACvB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;KAChB,EACD;QACE,GAAG,CACD;YACE,KAAK,EAAE,MAAM;YACb,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,eAAe;YAC/B,UAAU,EAAE,QAAQ;SACrB,EACD;YACE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE;gBACtE,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;aACzC,CAAC;SACH,CACF;QACD,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;SAC1C,CAAC;KACH,CACF,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAqC;IAC/C,EAAE,EAAE,GAAG,WAAW,MAAM;IACxB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YACjB,KAAK,EAAE,GAAG;YACV,KAAK,EAAE;gBACL,eAAe;oBACb,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1C,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-rag-plugin",
3
- "version": "1.3.2",
3
+ "version": "1.3.6",
4
4
  "description": "OpenCode plugin for local-first RAG-based semantic code search",
5
5
  "type": "module",
6
6
  "main": "./dist/plugin-entry.js",
@@ -72,6 +72,7 @@
72
72
  "@e965/xlsx": "^0.20.3",
73
73
  "@lancedb/lancedb": "^0.29.0",
74
74
  "apache-arrow": "18.1.0",
75
+ "@thednp/dommatrix": "^3.0.4",
75
76
  "canvas": "^3.2.3",
76
77
  "chokidar": "^4.0.3",
77
78
  "commander": "^13.1.0",