opencode-rag-plugin 1.3.1 → 1.3.5

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 ADDED
@@ -0,0 +1,153 @@
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
+ }
74
+ const PLUGIN_NAME = "opencode-rag-plugin";
75
+ function element(tag, props, children = []) {
76
+ const node = createElement(tag);
77
+ for (const [key, value] of Object.entries(props)) {
78
+ if (value !== undefined)
79
+ setProp(node, key, value);
80
+ }
81
+ for (const child of children) {
82
+ if (child === null || child === undefined || child === false)
83
+ continue;
84
+ insert(node, child);
85
+ }
86
+ return node;
87
+ }
88
+ function text(props, children = []) {
89
+ return element("text", props, children);
90
+ }
91
+ function box(props, children = []) {
92
+ return element("box", props, children);
93
+ }
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)}`;
99
+ return box({
100
+ width: "100%",
101
+ flexDirection: "column",
102
+ border: { type: "single" },
103
+ borderColor: theme.accent,
104
+ paddingTop: 1,
105
+ paddingBottom: 1,
106
+ paddingLeft: 1,
107
+ paddingRight: 1,
108
+ }, [
109
+ box({
110
+ width: "100%",
111
+ flexDirection: "row",
112
+ justifyContent: "space-between",
113
+ alignItems: "center",
114
+ }, [
115
+ box({ paddingLeft: 1, paddingRight: 1, backgroundColor: theme.accent }, [
116
+ text({ fg: "#000000" }, ["OpenCodeRAG"]),
117
+ ]),
118
+ text({ fg: theme.textMuted }, [`v${version}`]),
119
+ ]),
120
+ text({ fg: theme.text }, [statusLine]),
121
+ text({ fg: theme.textMuted }, [timeLine]),
122
+ ]);
123
+ }
124
+ const plugin = {
125
+ id: `${PLUGIN_NAME}:tui`,
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();
139
+ api.slots.register({
140
+ order: 900,
141
+ slots: {
142
+ sidebar_content() {
143
+ if (Date.now() - lastRefresh > REFRESH_INTERVAL_MS) {
144
+ refreshStatus();
145
+ }
146
+ return renderSidebar(api.theme.current, version, cachedStatus);
147
+ },
148
+ },
149
+ });
150
+ },
151
+ };
152
+ export default plugin;
153
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
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.1",
3
+ "version": "1.3.5",
4
4
  "description": "OpenCode plugin for local-first RAG-based semantic code search",
5
5
  "type": "module",
6
6
  "main": "./dist/plugin-entry.js",
@@ -21,6 +21,10 @@
21
21
  "import": "./dist/index.js",
22
22
  "require": "./dist/index.js",
23
23
  "types": "./dist/index.d.ts"
24
+ },
25
+ "./tui": {
26
+ "import": "./dist/tui.js",
27
+ "types": "./dist/tui.d.ts"
24
28
  }
25
29
  },
26
30
  "files": [
@@ -79,12 +83,18 @@
79
83
  },
80
84
  "devDependencies": {
81
85
  "@opencode-ai/plugin": "1.15.5",
86
+ "@opentui/core": "^0.4.0",
87
+ "@opentui/keymap": "^0.4.0",
88
+ "@opentui/solid": "^0.4.0",
82
89
  "@types/node": "^22.15.0",
90
+ "@types/react": "^19.2.17",
83
91
  "@types/word-extractor": "^1.0.6",
92
+ "solid-js": "^1.9.12",
84
93
  "tsx": "^4.19.4",
85
94
  "typescript": "^5.8.3"
86
95
  },
87
96
  "overrides": {
88
- "uuid": "^11.1.1"
97
+ "uuid": "^11.1.1",
98
+ "web-tree-sitter": "$web-tree-sitter"
89
99
  }
90
100
  }