opencode-forge 0.1.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.
Files changed (309) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +534 -0
  3. package/config.jsonc +47 -0
  4. package/dist/agents/architect.d.ts +3 -0
  5. package/dist/agents/architect.d.ts.map +1 -0
  6. package/dist/agents/architect.js +152 -0
  7. package/dist/agents/architect.js.map +1 -0
  8. package/dist/agents/auditor.d.ts +3 -0
  9. package/dist/agents/auditor.d.ts.map +1 -0
  10. package/dist/agents/auditor.js +168 -0
  11. package/dist/agents/auditor.js.map +1 -0
  12. package/dist/agents/code.d.ts +3 -0
  13. package/dist/agents/code.d.ts.map +1 -0
  14. package/dist/agents/code.js +67 -0
  15. package/dist/agents/code.js.map +1 -0
  16. package/dist/agents/index.d.ts +4 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +9 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/prompts.d.ts +1 -0
  21. package/dist/agents/prompts.d.ts.map +1 -0
  22. package/dist/agents/prompts.js +4 -0
  23. package/dist/agents/prompts.js.map +1 -0
  24. package/dist/agents/types.d.ts +34 -0
  25. package/dist/agents/types.d.ts.map +1 -0
  26. package/dist/agents/types.js +2 -0
  27. package/dist/agents/types.js.map +1 -0
  28. package/dist/cache/index.d.ts +4 -0
  29. package/dist/cache/index.d.ts.map +1 -0
  30. package/dist/cache/index.js +5 -0
  31. package/dist/cache/index.js.map +1 -0
  32. package/dist/cache/memory-cache.d.ts +14 -0
  33. package/dist/cache/memory-cache.d.ts.map +1 -0
  34. package/dist/cache/memory-cache.js +51 -0
  35. package/dist/cache/memory-cache.js.map +1 -0
  36. package/dist/cache/types.d.ts +8 -0
  37. package/dist/cache/types.d.ts.map +1 -0
  38. package/dist/cache/types.js +2 -0
  39. package/dist/cache/types.js.map +1 -0
  40. package/dist/cli/commands/cancel.d.ts +15 -0
  41. package/dist/cli/commands/cancel.d.ts.map +1 -0
  42. package/dist/cli/commands/cancel.js +194 -0
  43. package/dist/cli/commands/cancel.js.map +1 -0
  44. package/dist/cli/commands/graph.d.ts +16 -0
  45. package/dist/cli/commands/graph.d.ts.map +1 -0
  46. package/dist/cli/commands/graph.js +208 -0
  47. package/dist/cli/commands/graph.js.map +1 -0
  48. package/dist/cli/commands/restart.d.ts +15 -0
  49. package/dist/cli/commands/restart.d.ts.map +1 -0
  50. package/dist/cli/commands/restart.js +268 -0
  51. package/dist/cli/commands/restart.js.map +1 -0
  52. package/dist/cli/commands/status.d.ts +17 -0
  53. package/dist/cli/commands/status.d.ts.map +1 -0
  54. package/dist/cli/commands/status.js +356 -0
  55. package/dist/cli/commands/status.js.map +1 -0
  56. package/dist/cli/commands/upgrade.d.ts +3 -0
  57. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  58. package/dist/cli/commands/upgrade.js +40 -0
  59. package/dist/cli/commands/upgrade.js.map +1 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +224 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/utils.d.ts +36 -0
  65. package/dist/cli/utils.d.ts.map +1 -0
  66. package/dist/cli/utils.js +163 -0
  67. package/dist/cli/utils.js.map +1 -0
  68. package/dist/command/template/review.txt +101 -0
  69. package/dist/config.d.ts +5 -0
  70. package/dist/config.d.ts.map +1 -0
  71. package/dist/config.js +186 -0
  72. package/dist/config.js.map +1 -0
  73. package/dist/constants/loop.d.ts +10 -0
  74. package/dist/constants/loop.d.ts.map +1 -0
  75. package/dist/constants/loop.js +6 -0
  76. package/dist/constants/loop.js.map +1 -0
  77. package/dist/graph/cache.d.ts +17 -0
  78. package/dist/graph/cache.d.ts.map +1 -0
  79. package/dist/graph/cache.js +50 -0
  80. package/dist/graph/cache.js.map +1 -0
  81. package/dist/graph/client.d.ts +51 -0
  82. package/dist/graph/client.d.ts.map +1 -0
  83. package/dist/graph/client.js +152 -0
  84. package/dist/graph/client.js.map +1 -0
  85. package/dist/graph/clone-detection.d.ts +9 -0
  86. package/dist/graph/clone-detection.d.ts.map +1 -0
  87. package/dist/graph/clone-detection.js +148 -0
  88. package/dist/graph/clone-detection.js.map +1 -0
  89. package/dist/graph/constants.d.ts +18 -0
  90. package/dist/graph/constants.d.ts.map +1 -0
  91. package/dist/graph/constants.js +532 -0
  92. package/dist/graph/constants.js.map +1 -0
  93. package/dist/graph/database.d.ts +11 -0
  94. package/dist/graph/database.d.ts.map +1 -0
  95. package/dist/graph/database.js +250 -0
  96. package/dist/graph/database.js.map +1 -0
  97. package/dist/graph/index.d.ts +14 -0
  98. package/dist/graph/index.d.ts.map +1 -0
  99. package/dist/graph/index.js +13 -0
  100. package/dist/graph/index.js.map +1 -0
  101. package/dist/graph/repo-map.d.ts +59 -0
  102. package/dist/graph/repo-map.d.ts.map +1 -0
  103. package/dist/graph/repo-map.js +948 -0
  104. package/dist/graph/repo-map.js.map +1 -0
  105. package/dist/graph/rpc.d.ts +34 -0
  106. package/dist/graph/rpc.d.ts.map +1 -0
  107. package/dist/graph/rpc.js +139 -0
  108. package/dist/graph/rpc.js.map +1 -0
  109. package/dist/graph/service.d.ts +46 -0
  110. package/dist/graph/service.d.ts.map +1 -0
  111. package/dist/graph/service.js +329 -0
  112. package/dist/graph/service.js.map +1 -0
  113. package/dist/graph/tree-sitter.d.ts +40 -0
  114. package/dist/graph/tree-sitter.d.ts.map +1 -0
  115. package/dist/graph/tree-sitter.js +799 -0
  116. package/dist/graph/tree-sitter.js.map +1 -0
  117. package/dist/graph/types.d.ts +175 -0
  118. package/dist/graph/types.d.ts.map +1 -0
  119. package/dist/graph/types.js +105 -0
  120. package/dist/graph/types.js.map +1 -0
  121. package/dist/graph/utils.d.ts +64 -0
  122. package/dist/graph/utils.d.ts.map +1 -0
  123. package/dist/graph/utils.js +406 -0
  124. package/dist/graph/utils.js.map +1 -0
  125. package/dist/graph/worker.d.ts +2 -0
  126. package/dist/graph/worker.d.ts.map +1 -0
  127. package/dist/graph/worker.js +6043 -0
  128. package/dist/graph/worker.js.map +1 -0
  129. package/dist/hooks/compaction-utils.d.ts +21 -0
  130. package/dist/hooks/compaction-utils.d.ts.map +1 -0
  131. package/dist/hooks/compaction-utils.js +82 -0
  132. package/dist/hooks/compaction-utils.js.map +1 -0
  133. package/dist/hooks/graph-command.d.ts +27 -0
  134. package/dist/hooks/graph-command.d.ts.map +1 -0
  135. package/dist/hooks/graph-command.js +57 -0
  136. package/dist/hooks/graph-command.js.map +1 -0
  137. package/dist/hooks/graph-tools.d.ts +11 -0
  138. package/dist/hooks/graph-tools.d.ts.map +1 -0
  139. package/dist/hooks/graph-tools.js +125 -0
  140. package/dist/hooks/graph-tools.js.map +1 -0
  141. package/dist/hooks/index.d.ts +5 -0
  142. package/dist/hooks/index.d.ts.map +1 -0
  143. package/dist/hooks/index.js +5 -0
  144. package/dist/hooks/index.js.map +1 -0
  145. package/dist/hooks/loop.d.ts +23 -0
  146. package/dist/hooks/loop.d.ts.map +1 -0
  147. package/dist/hooks/loop.js +667 -0
  148. package/dist/hooks/loop.js.map +1 -0
  149. package/dist/hooks/sandbox-tools.d.ts +13 -0
  150. package/dist/hooks/sandbox-tools.d.ts.map +1 -0
  151. package/dist/hooks/sandbox-tools.js +105 -0
  152. package/dist/hooks/sandbox-tools.js.map +1 -0
  153. package/dist/hooks/session.d.ts +19 -0
  154. package/dist/hooks/session.d.ts.map +1 -0
  155. package/dist/hooks/session.js +56 -0
  156. package/dist/hooks/session.js.map +1 -0
  157. package/dist/index.d.ts +11 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +298 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/sandbox/context.d.ts +27 -0
  162. package/dist/sandbox/context.d.ts.map +1 -0
  163. package/dist/sandbox/context.js +18 -0
  164. package/dist/sandbox/context.js.map +1 -0
  165. package/dist/sandbox/docker.d.ts +29 -0
  166. package/dist/sandbox/docker.d.ts.map +1 -0
  167. package/dist/sandbox/docker.js +213 -0
  168. package/dist/sandbox/docker.js.map +1 -0
  169. package/dist/sandbox/manager.d.ts +23 -0
  170. package/dist/sandbox/manager.d.ts.map +1 -0
  171. package/dist/sandbox/manager.js +131 -0
  172. package/dist/sandbox/manager.js.map +1 -0
  173. package/dist/sandbox/path.d.ts +4 -0
  174. package/dist/sandbox/path.d.ts.map +1 -0
  175. package/dist/sandbox/path.js +27 -0
  176. package/dist/sandbox/path.js.map +1 -0
  177. package/dist/services/kv.d.ts +17 -0
  178. package/dist/services/kv.d.ts.map +1 -0
  179. package/dist/services/kv.js +62 -0
  180. package/dist/services/kv.js.map +1 -0
  181. package/dist/services/loop.d.ts +96 -0
  182. package/dist/services/loop.d.ts.map +1 -0
  183. package/dist/services/loop.js +315 -0
  184. package/dist/services/loop.js.map +1 -0
  185. package/dist/setup.d.ts +4 -0
  186. package/dist/setup.d.ts.map +1 -0
  187. package/dist/setup.js +118 -0
  188. package/dist/setup.js.map +1 -0
  189. package/dist/storage/database.d.ts +6 -0
  190. package/dist/storage/database.d.ts.map +1 -0
  191. package/dist/storage/database.js +90 -0
  192. package/dist/storage/database.js.map +1 -0
  193. package/dist/storage/graph-projects.d.ts +80 -0
  194. package/dist/storage/graph-projects.d.ts.map +1 -0
  195. package/dist/storage/graph-projects.js +154 -0
  196. package/dist/storage/graph-projects.js.map +1 -0
  197. package/dist/storage/index.d.ts +5 -0
  198. package/dist/storage/index.d.ts.map +1 -0
  199. package/dist/storage/index.js +3 -0
  200. package/dist/storage/index.js.map +1 -0
  201. package/dist/storage/kv-queries.d.ts +18 -0
  202. package/dist/storage/kv-queries.d.ts.map +1 -0
  203. package/dist/storage/kv-queries.js +70 -0
  204. package/dist/storage/kv-queries.js.map +1 -0
  205. package/dist/tools/graph.d.ts +9 -0
  206. package/dist/tools/graph.d.ts.map +1 -0
  207. package/dist/tools/graph.js +272 -0
  208. package/dist/tools/graph.js.map +1 -0
  209. package/dist/tools/index.d.ts +6 -0
  210. package/dist/tools/index.d.ts.map +1 -0
  211. package/dist/tools/index.js +16 -0
  212. package/dist/tools/index.js.map +1 -0
  213. package/dist/tools/loop.d.ts +21 -0
  214. package/dist/tools/loop.d.ts.map +1 -0
  215. package/dist/tools/loop.js +570 -0
  216. package/dist/tools/loop.js.map +1 -0
  217. package/dist/tools/plan-approval.d.ts +15 -0
  218. package/dist/tools/plan-approval.d.ts.map +1 -0
  219. package/dist/tools/plan-approval.js +203 -0
  220. package/dist/tools/plan-approval.js.map +1 -0
  221. package/dist/tools/plan-execute.d.ts +4 -0
  222. package/dist/tools/plan-execute.d.ts.map +1 -0
  223. package/dist/tools/plan-execute.js +85 -0
  224. package/dist/tools/plan-execute.js.map +1 -0
  225. package/dist/tools/plan-kv.d.ts +4 -0
  226. package/dist/tools/plan-kv.d.ts.map +1 -0
  227. package/dist/tools/plan-kv.js +107 -0
  228. package/dist/tools/plan-kv.js.map +1 -0
  229. package/dist/tools/review.d.ts +4 -0
  230. package/dist/tools/review.d.ts.map +1 -0
  231. package/dist/tools/review.js +90 -0
  232. package/dist/tools/review.js.map +1 -0
  233. package/dist/tools/sandbox-fs.d.ts +22 -0
  234. package/dist/tools/sandbox-fs.d.ts.map +1 -0
  235. package/dist/tools/sandbox-fs.js +83 -0
  236. package/dist/tools/sandbox-fs.js.map +1 -0
  237. package/dist/tools/types.d.ts +26 -0
  238. package/dist/tools/types.d.ts.map +1 -0
  239. package/dist/tools/types.js +2 -0
  240. package/dist/tools/types.js.map +1 -0
  241. package/dist/tui.d.ts +3 -0
  242. package/dist/tui.js +2061 -0
  243. package/dist/types.d.ts +124 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +2 -0
  246. package/dist/types.js.map +1 -0
  247. package/dist/utils/git-branch.d.ts +11 -0
  248. package/dist/utils/git-branch.d.ts.map +1 -0
  249. package/dist/utils/git-branch.js +35 -0
  250. package/dist/utils/git-branch.js.map +1 -0
  251. package/dist/utils/graph-status-store.d.ts +72 -0
  252. package/dist/utils/graph-status-store.d.ts.map +1 -0
  253. package/dist/utils/graph-status-store.js +62 -0
  254. package/dist/utils/graph-status-store.js.map +1 -0
  255. package/dist/utils/logger.d.ts +8 -0
  256. package/dist/utils/logger.d.ts.map +1 -0
  257. package/dist/utils/logger.js +89 -0
  258. package/dist/utils/logger.js.map +1 -0
  259. package/dist/utils/loop-format.d.ts +5 -0
  260. package/dist/utils/loop-format.d.ts.map +1 -0
  261. package/dist/utils/loop-format.js +29 -0
  262. package/dist/utils/loop-format.js.map +1 -0
  263. package/dist/utils/loop-helpers.d.ts +9 -0
  264. package/dist/utils/loop-helpers.d.ts.map +1 -0
  265. package/dist/utils/loop-helpers.js +20 -0
  266. package/dist/utils/loop-helpers.js.map +1 -0
  267. package/dist/utils/loop-launch.d.ts +32 -0
  268. package/dist/utils/loop-launch.d.ts.map +1 -0
  269. package/dist/utils/loop-launch.js +162 -0
  270. package/dist/utils/loop-launch.js.map +1 -0
  271. package/dist/utils/model-fallback.d.ts +27 -0
  272. package/dist/utils/model-fallback.d.ts.map +1 -0
  273. package/dist/utils/model-fallback.js +33 -0
  274. package/dist/utils/model-fallback.js.map +1 -0
  275. package/dist/utils/partial-match.d.ts +7 -0
  276. package/dist/utils/partial-match.d.ts.map +1 -0
  277. package/dist/utils/partial-match.js +56 -0
  278. package/dist/utils/partial-match.js.map +1 -0
  279. package/dist/utils/plan-execution.d.ts +65 -0
  280. package/dist/utils/plan-execution.d.ts.map +1 -0
  281. package/dist/utils/plan-execution.js +107 -0
  282. package/dist/utils/plan-execution.js.map +1 -0
  283. package/dist/utils/session-stats.d.ts +36 -0
  284. package/dist/utils/session-stats.d.ts.map +1 -0
  285. package/dist/utils/session-stats.js +145 -0
  286. package/dist/utils/session-stats.js.map +1 -0
  287. package/dist/utils/tui-graph-status.d.ts +38 -0
  288. package/dist/utils/tui-graph-status.d.ts.map +1 -0
  289. package/dist/utils/tui-graph-status.js +95 -0
  290. package/dist/utils/tui-graph-status.js.map +1 -0
  291. package/dist/utils/tui-plan-store.d.ts +54 -0
  292. package/dist/utils/tui-plan-store.d.ts.map +1 -0
  293. package/dist/utils/tui-plan-store.js +168 -0
  294. package/dist/utils/tui-plan-store.js.map +1 -0
  295. package/dist/utils/tui-refresh-helpers.d.ts +44 -0
  296. package/dist/utils/tui-refresh-helpers.d.ts.map +1 -0
  297. package/dist/utils/tui-refresh-helpers.js +120 -0
  298. package/dist/utils/tui-refresh-helpers.js.map +1 -0
  299. package/dist/utils/upgrade.d.ts +23 -0
  300. package/dist/utils/upgrade.d.ts.map +1 -0
  301. package/dist/utils/upgrade.js +111 -0
  302. package/dist/utils/upgrade.js.map +1 -0
  303. package/dist/version.d.ts +2 -0
  304. package/dist/version.d.ts.map +1 -0
  305. package/dist/version.js +2 -0
  306. package/dist/version.js.map +1 -0
  307. package/package.json +92 -0
  308. package/scripts/build.ts +67 -0
  309. package/src/command/template/review.txt +101 -0
@@ -0,0 +1,90 @@
1
+ import { Database } from 'bun:sqlite';
2
+ import { mkdirSync, existsSync } from 'fs';
3
+ import { homedir, platform } from 'os';
4
+ import { join } from 'path';
5
+ const migrations = [
6
+ {
7
+ id: '001',
8
+ description: 'Remove status column from memories table',
9
+ apply: (db) => {
10
+ const tableInfo = db.prepare('PRAGMA table_info(memories)').all();
11
+ const hasStatusColumn = tableInfo.some((col) => col.name === 'status');
12
+ if (!hasStatusColumn) {
13
+ return;
14
+ }
15
+ try {
16
+ db.run('ALTER TABLE memories DROP COLUMN status');
17
+ }
18
+ catch {
19
+ const indexes = db.prepare("SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='memories'").all();
20
+ for (const idx of indexes) {
21
+ if (idx.name.includes('status')) {
22
+ db.run(`DROP INDEX IF EXISTS ${idx.name}`);
23
+ }
24
+ }
25
+ db.run('ALTER TABLE memories DROP COLUMN status');
26
+ }
27
+ },
28
+ },
29
+ ];
30
+ function runMigrations(db) {
31
+ db.run(`
32
+ CREATE TABLE IF NOT EXISTS migrations (
33
+ id TEXT PRIMARY KEY,
34
+ description TEXT NOT NULL,
35
+ applied_at INTEGER NOT NULL
36
+ )
37
+ `);
38
+ for (const migration of migrations) {
39
+ const existing = db.prepare('SELECT id FROM migrations WHERE id = ?').get(migration.id);
40
+ if (!existing) {
41
+ migration.apply(db);
42
+ db.prepare('INSERT INTO migrations (id, description, applied_at) VALUES (?, ?, ?)').run(migration.id, migration.description, Date.now());
43
+ }
44
+ }
45
+ }
46
+ export function resolveDataDir() {
47
+ const defaultBase = join(homedir(), platform() === 'win32' ? 'AppData' : '.local', 'share');
48
+ const xdgDataHome = process.env['XDG_DATA_HOME'] || defaultBase;
49
+ const forgeDir = join(xdgDataHome, 'opencode', 'forge');
50
+ const legacyGraphDir = join(xdgDataHome, 'opencode', 'graph');
51
+ return existsSync(legacyGraphDir) && !existsSync(forgeDir) ? legacyGraphDir : forgeDir;
52
+ }
53
+ export function resolveLogPath() {
54
+ return join(resolveDataDir(), 'logs', 'forge.log');
55
+ }
56
+ export function initializeDatabase(dataDir) {
57
+ if (!existsSync(dataDir)) {
58
+ mkdirSync(dataDir, { recursive: true });
59
+ }
60
+ const dbPath = `${dataDir}/graph.db`;
61
+ const db = new Database(dbPath);
62
+ db.run('PRAGMA journal_mode=WAL');
63
+ db.run('PRAGMA busy_timeout=5000');
64
+ db.run('PRAGMA synchronous=NORMAL');
65
+ runMigrations(db);
66
+ db.run(`
67
+ CREATE TABLE IF NOT EXISTS plugin_metadata (
68
+ key TEXT PRIMARY KEY,
69
+ value TEXT NOT NULL,
70
+ updated_at INTEGER NOT NULL
71
+ )
72
+ `);
73
+ db.run(`
74
+ CREATE TABLE IF NOT EXISTS project_kv (
75
+ project_id TEXT NOT NULL,
76
+ key TEXT NOT NULL,
77
+ data TEXT NOT NULL,
78
+ expires_at INTEGER NOT NULL,
79
+ created_at INTEGER NOT NULL,
80
+ updated_at INTEGER NOT NULL,
81
+ PRIMARY KEY (project_id, key)
82
+ )
83
+ `);
84
+ db.run(`CREATE INDEX IF NOT EXISTS idx_project_kv_expires_at ON project_kv(expires_at)`);
85
+ return db;
86
+ }
87
+ export function closeDatabase(db) {
88
+ db.close();
89
+ }
90
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Graph cache project inventory helpers.
3
+ *
4
+ * This module provides canonical helpers for enumerating and managing
5
+ * graph cache directories stored under <dataDir>/graph/<projectHash>/graph.db
6
+ */
7
+ /**
8
+ * Result of graph cache directory enumeration
9
+ */
10
+ export interface GraphCacheEntry {
11
+ /** Hash directory name (16-character SHA256 prefix) */
12
+ hashDir: string;
13
+ /** Absolute path to graph.db file */
14
+ graphDbPath: string;
15
+ /** Project ID if successfully resolved, null if unknown */
16
+ projectId: string | null;
17
+ /** Friendly project name if available (from opencode.db), null otherwise */
18
+ projectName: string | null;
19
+ /** Resolution status: 'known' if projectId resolved, 'unknown' otherwise */
20
+ resolutionStatus: 'known' | 'unknown';
21
+ /** File size in bytes */
22
+ sizeBytes: number;
23
+ /** Last modification time as Unix timestamp (ms) */
24
+ mtimeMs: number;
25
+ }
26
+ /**
27
+ * Hashes a project ID using SHA256 and returns the first 16 hex characters.
28
+ * This matches the hashing logic used in src/graph/database.ts
29
+ *
30
+ * @param projectId - The project ID to hash
31
+ * @returns 16-character hex string
32
+ */
33
+ export declare function hashProjectId(projectId: string): string;
34
+ /**
35
+ * Resolves the graph cache directory path for a given project ID.
36
+ *
37
+ * @param projectId - The project ID
38
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
39
+ * @returns Absolute path to the graph cache directory
40
+ */
41
+ export declare function resolveGraphCacheDir(projectId: string, dataDir?: string): string;
42
+ /**
43
+ * Checks if a graph cache directory exists for a given project ID.
44
+ *
45
+ * @param projectId - The project ID
46
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
47
+ * @returns true if the graph cache directory exists
48
+ */
49
+ export declare function hasGraphCache(projectId: string, dataDir?: string): boolean;
50
+ /**
51
+ * Enumerates all graph cache directories under the data directory.
52
+ *
53
+ * This function scans the <dataDir>/graph/ directory and returns information
54
+ * about each discovered graph cache entry. It attempts to resolve project
55
+ * identity by matching against known project IDs from opencode.db.
56
+ *
57
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
58
+ * @returns Array of graph cache entries
59
+ */
60
+ export declare function enumerateGraphCache(dataDir?: string): GraphCacheEntry[];
61
+ /**
62
+ * Finds a graph cache entry by project ID or hash directory.
63
+ *
64
+ * @param identifier - Either a project ID or hash directory name
65
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
66
+ * @returns The matching graph cache entry or null if not found
67
+ */
68
+ export declare function findGraphCacheEntry(identifier: string, dataDir?: string): GraphCacheEntry | null;
69
+ /**
70
+ * Deletes a graph cache directory.
71
+ *
72
+ * This function removes the entire graph cache directory for a given
73
+ * hash directory name. It does NOT delete any KV store data.
74
+ *
75
+ * @param hashDir - The 16-character hash directory name to delete
76
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
77
+ * @returns true if deletion was successful, false otherwise
78
+ */
79
+ export declare function deleteGraphCacheDir(hashDir: string, dataDir?: string): boolean;
80
+ //# sourceMappingURL=graph-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-projects.d.ts","sourceRoot":"","sources":["../../src/storage/graph-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,4EAA4E;IAC5E,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAiEvE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,GAAG,IAAI,CAUxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAeT"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Graph cache project inventory helpers.
3
+ *
4
+ * This module provides canonical helpers for enumerating and managing
5
+ * graph cache directories stored under <dataDir>/graph/<projectHash>/graph.db
6
+ */
7
+ import { existsSync, readdirSync, statSync, rmSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { createHash } from 'crypto';
10
+ import { resolveDataDir } from './database';
11
+ import { resolveProjectNames } from '../cli/utils';
12
+ /**
13
+ * Hashes a project ID using SHA256 and returns the first 16 hex characters.
14
+ * This matches the hashing logic used in src/graph/database.ts
15
+ *
16
+ * @param projectId - The project ID to hash
17
+ * @returns 16-character hex string
18
+ */
19
+ export function hashProjectId(projectId) {
20
+ return createHash('sha256').update(projectId).digest('hex').substring(0, 16);
21
+ }
22
+ /**
23
+ * Resolves the graph cache directory path for a given project ID.
24
+ *
25
+ * @param projectId - The project ID
26
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
27
+ * @returns Absolute path to the graph cache directory
28
+ */
29
+ export function resolveGraphCacheDir(projectId, dataDir) {
30
+ const resolvedDataDir = dataDir ?? resolveDataDir();
31
+ const projectIdHash = hashProjectId(projectId);
32
+ return join(resolvedDataDir, 'graph', projectIdHash);
33
+ }
34
+ /**
35
+ * Checks if a graph cache directory exists for a given project ID.
36
+ *
37
+ * @param projectId - The project ID
38
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
39
+ * @returns true if the graph cache directory exists
40
+ */
41
+ export function hasGraphCache(projectId, dataDir) {
42
+ const graphCacheDir = resolveGraphCacheDir(projectId, dataDir);
43
+ return existsSync(graphCacheDir);
44
+ }
45
+ /**
46
+ * Enumerates all graph cache directories under the data directory.
47
+ *
48
+ * This function scans the <dataDir>/graph/ directory and returns information
49
+ * about each discovered graph cache entry. It attempts to resolve project
50
+ * identity by matching against known project IDs from opencode.db.
51
+ *
52
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
53
+ * @returns Array of graph cache entries
54
+ */
55
+ export function enumerateGraphCache(dataDir) {
56
+ const resolvedDataDir = dataDir ?? resolveDataDir();
57
+ const graphBaseDir = join(resolvedDataDir, 'graph');
58
+ if (!existsSync(graphBaseDir)) {
59
+ return [];
60
+ }
61
+ let entries;
62
+ try {
63
+ const hashDirs = readdirSync(graphBaseDir, { withFileTypes: true })
64
+ .filter(dirent => dirent.isDirectory())
65
+ .map(dirent => dirent.name)
66
+ .filter(name => /^[0-9a-f]{16}$/i.test(name));
67
+ entries = hashDirs.map(hashDir => {
68
+ const graphDbPath = join(graphBaseDir, hashDir, 'graph.db');
69
+ const stat = statSync(graphDbPath, { throwIfNoEntry: false });
70
+ if (!stat) {
71
+ return {
72
+ hashDir,
73
+ graphDbPath,
74
+ projectId: null,
75
+ projectName: null,
76
+ resolutionStatus: 'unknown',
77
+ sizeBytes: 0,
78
+ mtimeMs: 0,
79
+ };
80
+ }
81
+ return {
82
+ hashDir,
83
+ graphDbPath,
84
+ projectId: null,
85
+ projectName: null,
86
+ resolutionStatus: 'unknown',
87
+ sizeBytes: stat.size,
88
+ mtimeMs: stat.mtimeMs,
89
+ };
90
+ });
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ const nameMap = resolveProjectNames();
96
+ const projectIdToName = new Map();
97
+ for (const [projectId, name] of nameMap.entries()) {
98
+ projectIdToName.set(projectId, name);
99
+ }
100
+ for (const entry of entries) {
101
+ for (const [projectId, projectName] of projectIdToName.entries()) {
102
+ const expectedHashDir = hashProjectId(projectId);
103
+ if (entry.hashDir === expectedHashDir) {
104
+ entry.projectId = projectId;
105
+ entry.projectName = projectName;
106
+ entry.resolutionStatus = 'known';
107
+ break;
108
+ }
109
+ }
110
+ }
111
+ return entries;
112
+ }
113
+ /**
114
+ * Finds a graph cache entry by project ID or hash directory.
115
+ *
116
+ * @param identifier - Either a project ID or hash directory name
117
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
118
+ * @returns The matching graph cache entry or null if not found
119
+ */
120
+ export function findGraphCacheEntry(identifier, dataDir) {
121
+ const entries = enumerateGraphCache(dataDir);
122
+ for (const entry of entries) {
123
+ if (entry.projectId === identifier || entry.hashDir === identifier) {
124
+ return entry;
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ /**
130
+ * Deletes a graph cache directory.
131
+ *
132
+ * This function removes the entire graph cache directory for a given
133
+ * hash directory name. It does NOT delete any KV store data.
134
+ *
135
+ * @param hashDir - The 16-character hash directory name to delete
136
+ * @param dataDir - Optional data directory (defaults to resolved data dir)
137
+ * @returns true if deletion was successful, false otherwise
138
+ */
139
+ export function deleteGraphCacheDir(hashDir, dataDir) {
140
+ const resolvedDataDir = dataDir ?? resolveDataDir();
141
+ const graphBaseDir = join(resolvedDataDir, 'graph');
142
+ const targetDir = join(graphBaseDir, hashDir);
143
+ if (!existsSync(targetDir)) {
144
+ return false;
145
+ }
146
+ try {
147
+ rmSync(targetDir, { recursive: true, force: true });
148
+ return true;
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ //# sourceMappingURL=graph-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-projects.js","sourceRoot":"","sources":["../../src/storage/graph-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { initializeDatabase, closeDatabase, resolveDataDir, resolveLogPath } from './database';
2
+ export { createKvQuery } from './kv-queries';
3
+ export type { KvRow } from './kv-queries';
4
+ export type { CompactionConfig, } from '../types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEzC,YAAY,EACV,gBAAgB,GACjB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { initializeDatabase, closeDatabase, resolveDataDir, resolveLogPath } from './database';
2
+ export { createKvQuery } from './kv-queries';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { Database } from 'bun:sqlite';
2
+ export interface KvRow {
3
+ projectId: string;
4
+ key: string;
5
+ data: string;
6
+ expiresAt: number;
7
+ createdAt: number;
8
+ updatedAt: number;
9
+ }
10
+ export declare function createKvQuery(db: Database): {
11
+ get(projectId: string, key: string): KvRow | undefined;
12
+ set(projectId: string, key: string, data: string, expiresAt: number): void;
13
+ delete(projectId: string, key: string): void;
14
+ list(projectId: string): KvRow[];
15
+ listByPrefix(projectId: string, prefix: string): KvRow[];
16
+ deleteExpired(): number;
17
+ };
18
+ //# sourceMappingURL=kv-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv-queries.d.ts","sourceRoot":"","sources":["../../src/storage/kv-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,WAAW,KAAK;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAyBD,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ;mBAqCvB,MAAM,OAAO,MAAM,GAAG,KAAK,GAAG,SAAS;mBAKvC,MAAM,OAAO,MAAM,QAAQ,MAAM,aAAa,MAAM,GAAG,IAAI;sBAgBxD,MAAM,OAAO,MAAM,GAAG,IAAI;oBAI5B,MAAM,GAAG,KAAK,EAAE;4BAKR,MAAM,UAAU,MAAM,GAAG,KAAK,EAAE;qBAKvC,MAAM;EAK1B"}
@@ -0,0 +1,70 @@
1
+ function mapRow(row) {
2
+ return {
3
+ projectId: row.project_id,
4
+ key: row.key,
5
+ data: row.data,
6
+ expiresAt: row.expires_at,
7
+ createdAt: row.created_at,
8
+ updatedAt: row.updated_at,
9
+ };
10
+ }
11
+ const CLEANUP_INTERVAL_MS = 300_000;
12
+ let lastCleanupAt = 0;
13
+ export function createKvQuery(db) {
14
+ const getStmt = db.prepare(`SELECT project_id, key, data, expires_at, created_at, updated_at
15
+ FROM project_kv
16
+ WHERE project_id = ? AND key = ? AND expires_at > ?`);
17
+ const setStmt = db.prepare(`INSERT INTO project_kv (project_id, key, data, expires_at, created_at, updated_at)
18
+ VALUES (?, ?, ?, ?, ?, ?)
19
+ ON CONFLICT(project_id, key) DO UPDATE SET
20
+ data = excluded.data,
21
+ expires_at = excluded.expires_at,
22
+ updated_at = excluded.updated_at`);
23
+ const deleteStmt = db.prepare(`DELETE FROM project_kv WHERE project_id = ? AND key = ?`);
24
+ const listStmt = db.prepare(`SELECT project_id, key, data, expires_at, created_at, updated_at
25
+ FROM project_kv
26
+ WHERE project_id = ? AND expires_at > ?
27
+ ORDER BY updated_at DESC`);
28
+ const listByPrefixStmt = db.prepare(`SELECT project_id, key, data, expires_at, created_at, updated_at
29
+ FROM project_kv
30
+ WHERE project_id = ? AND key LIKE ? AND expires_at > ?
31
+ ORDER BY updated_at DESC`);
32
+ const deleteExpiredStmt = db.prepare(`DELETE FROM project_kv WHERE expires_at < ?`);
33
+ return {
34
+ get(projectId, key) {
35
+ const row = getStmt.get(projectId, key, Date.now());
36
+ return row ? mapRow(row) : undefined;
37
+ },
38
+ set(projectId, key, data, expiresAt) {
39
+ const now = Date.now();
40
+ setStmt.run(projectId, key, data, expiresAt, now, now);
41
+ if (now - lastCleanupAt > CLEANUP_INTERVAL_MS) {
42
+ lastCleanupAt = now;
43
+ setImmediate(() => {
44
+ try {
45
+ deleteExpiredStmt.run(now);
46
+ }
47
+ catch {
48
+ // Ignore errors from cleanup (e.g., if db is closed)
49
+ }
50
+ });
51
+ }
52
+ },
53
+ delete(projectId, key) {
54
+ deleteStmt.run(projectId, key);
55
+ },
56
+ list(projectId) {
57
+ const rows = listStmt.all(projectId, Date.now());
58
+ return rows.map(mapRow);
59
+ },
60
+ listByPrefix(projectId, prefix) {
61
+ const rows = listByPrefixStmt.all(projectId, `${prefix}%`, Date.now());
62
+ return rows.map(mapRow);
63
+ },
64
+ deleteExpired() {
65
+ const result = deleteExpiredStmt.run(Date.now());
66
+ return result.changes;
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=kv-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv-queries.js","sourceRoot":"","sources":["../../src/storage/kv-queries.ts"],"names":[],"mappings":"AAoBA,SAAS,MAAM,CAAC,GAAa;IAC3B,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,OAAO,CAAA;AACnC,IAAI,aAAa,GAAG,CAAC,CAAA;AAErB,MAAM,UAAU,aAAa,CAAC,EAAY;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;;yDAEqD,CACtD,CAAA;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;;;;;wCAKoC,CACrC,CAAA;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAA;IAExF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB;;;8BAG0B,CAC3B,CAAA;IAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CACjC;;;8BAG0B,CAC3B,CAAA;IAED,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAClC,6CAA6C,CAC9C,CAAA;IAED,OAAO;QACL,GAAG,CAAC,SAAiB,EAAE,GAAW;YAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAoB,CAAA;YACtE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACtC,CAAC;QAED,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,IAAY,EAAE,SAAiB;YACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAEtD,IAAI,GAAG,GAAG,aAAa,GAAG,mBAAmB,EAAE,CAAC;gBAC9C,aAAa,GAAG,GAAG,CAAA;gBACnB,YAAY,CAAC,GAAG,EAAE;oBAChB,IAAI,CAAC;wBACH,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,qDAAqD;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,MAAM,CAAC,SAAiB,EAAE,GAAW;YACnC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAChC,CAAC;QAED,IAAI,CAAC,SAAiB;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAe,CAAA;YAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QAED,YAAY,CAAC,SAAiB,EAAE,MAAc;YAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAe,CAAA;YACpF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QAED,aAAa;YACX,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YAChD,OAAO,MAAM,CAAC,OAAO,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { tool } from '@opencode-ai/plugin';
2
+ import type { ToolContext } from './types';
3
+ import type { GraphService } from '../graph/service';
4
+ interface GraphToolContext {
5
+ graphService: GraphService | null;
6
+ }
7
+ export declare function createGraphTools(ctx: ToolContext & GraphToolContext): Record<string, ReturnType<typeof tool>>;
8
+ export {};
9
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/tools/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIpD,UAAU,gBAAgB;IACxB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;CAClC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CA4Q7G"}