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.
- package/LICENSE +21 -0
- package/README.md +534 -0
- package/config.jsonc +47 -0
- package/dist/agents/architect.d.ts +3 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/architect.js +152 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/auditor.d.ts +3 -0
- package/dist/agents/auditor.d.ts.map +1 -0
- package/dist/agents/auditor.js +168 -0
- package/dist/agents/auditor.js.map +1 -0
- package/dist/agents/code.d.ts +3 -0
- package/dist/agents/code.d.ts.map +1 -0
- package/dist/agents/code.js +67 -0
- package/dist/agents/code.js.map +1 -0
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +9 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/prompts.d.ts +1 -0
- package/dist/agents/prompts.d.ts.map +1 -0
- package/dist/agents/prompts.js +4 -0
- package/dist/agents/prompts.js.map +1 -0
- package/dist/agents/types.d.ts +34 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-cache.d.ts +14 -0
- package/dist/cache/memory-cache.d.ts.map +1 -0
- package/dist/cache/memory-cache.js +51 -0
- package/dist/cache/memory-cache.js.map +1 -0
- package/dist/cache/types.d.ts +8 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/commands/cancel.d.ts +15 -0
- package/dist/cli/commands/cancel.d.ts.map +1 -0
- package/dist/cli/commands/cancel.js +194 -0
- package/dist/cli/commands/cancel.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +16 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +208 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +15 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +268 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/status.d.ts +17 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +356 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +3 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +40 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +224 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils.d.ts +36 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +163 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/command/template/review.txt +101 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +186 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/loop.d.ts +10 -0
- package/dist/constants/loop.d.ts.map +1 -0
- package/dist/constants/loop.js +6 -0
- package/dist/constants/loop.js.map +1 -0
- package/dist/graph/cache.d.ts +17 -0
- package/dist/graph/cache.d.ts.map +1 -0
- package/dist/graph/cache.js +50 -0
- package/dist/graph/cache.js.map +1 -0
- package/dist/graph/client.d.ts +51 -0
- package/dist/graph/client.d.ts.map +1 -0
- package/dist/graph/client.js +152 -0
- package/dist/graph/client.js.map +1 -0
- package/dist/graph/clone-detection.d.ts +9 -0
- package/dist/graph/clone-detection.d.ts.map +1 -0
- package/dist/graph/clone-detection.js +148 -0
- package/dist/graph/clone-detection.js.map +1 -0
- package/dist/graph/constants.d.ts +18 -0
- package/dist/graph/constants.d.ts.map +1 -0
- package/dist/graph/constants.js +532 -0
- package/dist/graph/constants.js.map +1 -0
- package/dist/graph/database.d.ts +11 -0
- package/dist/graph/database.d.ts.map +1 -0
- package/dist/graph/database.js +250 -0
- package/dist/graph/database.js.map +1 -0
- package/dist/graph/index.d.ts +14 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/repo-map.d.ts +59 -0
- package/dist/graph/repo-map.d.ts.map +1 -0
- package/dist/graph/repo-map.js +948 -0
- package/dist/graph/repo-map.js.map +1 -0
- package/dist/graph/rpc.d.ts +34 -0
- package/dist/graph/rpc.d.ts.map +1 -0
- package/dist/graph/rpc.js +139 -0
- package/dist/graph/rpc.js.map +1 -0
- package/dist/graph/service.d.ts +46 -0
- package/dist/graph/service.d.ts.map +1 -0
- package/dist/graph/service.js +329 -0
- package/dist/graph/service.js.map +1 -0
- package/dist/graph/tree-sitter.d.ts +40 -0
- package/dist/graph/tree-sitter.d.ts.map +1 -0
- package/dist/graph/tree-sitter.js +799 -0
- package/dist/graph/tree-sitter.js.map +1 -0
- package/dist/graph/types.d.ts +175 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +105 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/utils.d.ts +64 -0
- package/dist/graph/utils.d.ts.map +1 -0
- package/dist/graph/utils.js +406 -0
- package/dist/graph/utils.js.map +1 -0
- package/dist/graph/worker.d.ts +2 -0
- package/dist/graph/worker.d.ts.map +1 -0
- package/dist/graph/worker.js +6043 -0
- package/dist/graph/worker.js.map +1 -0
- package/dist/hooks/compaction-utils.d.ts +21 -0
- package/dist/hooks/compaction-utils.d.ts.map +1 -0
- package/dist/hooks/compaction-utils.js +82 -0
- package/dist/hooks/compaction-utils.js.map +1 -0
- package/dist/hooks/graph-command.d.ts +27 -0
- package/dist/hooks/graph-command.d.ts.map +1 -0
- package/dist/hooks/graph-command.js +57 -0
- package/dist/hooks/graph-command.js.map +1 -0
- package/dist/hooks/graph-tools.d.ts +11 -0
- package/dist/hooks/graph-tools.d.ts.map +1 -0
- package/dist/hooks/graph-tools.js +125 -0
- package/dist/hooks/graph-tools.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/loop.d.ts +23 -0
- package/dist/hooks/loop.d.ts.map +1 -0
- package/dist/hooks/loop.js +667 -0
- package/dist/hooks/loop.js.map +1 -0
- package/dist/hooks/sandbox-tools.d.ts +13 -0
- package/dist/hooks/sandbox-tools.d.ts.map +1 -0
- package/dist/hooks/sandbox-tools.js +105 -0
- package/dist/hooks/sandbox-tools.js.map +1 -0
- package/dist/hooks/session.d.ts +19 -0
- package/dist/hooks/session.d.ts.map +1 -0
- package/dist/hooks/session.js +56 -0
- package/dist/hooks/session.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +298 -0
- package/dist/index.js.map +1 -0
- package/dist/sandbox/context.d.ts +27 -0
- package/dist/sandbox/context.d.ts.map +1 -0
- package/dist/sandbox/context.js +18 -0
- package/dist/sandbox/context.js.map +1 -0
- package/dist/sandbox/docker.d.ts +29 -0
- package/dist/sandbox/docker.d.ts.map +1 -0
- package/dist/sandbox/docker.js +213 -0
- package/dist/sandbox/docker.js.map +1 -0
- package/dist/sandbox/manager.d.ts +23 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +131 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/path.d.ts +4 -0
- package/dist/sandbox/path.d.ts.map +1 -0
- package/dist/sandbox/path.js +27 -0
- package/dist/sandbox/path.js.map +1 -0
- package/dist/services/kv.d.ts +17 -0
- package/dist/services/kv.d.ts.map +1 -0
- package/dist/services/kv.js +62 -0
- package/dist/services/kv.js.map +1 -0
- package/dist/services/loop.d.ts +96 -0
- package/dist/services/loop.d.ts.map +1 -0
- package/dist/services/loop.js +315 -0
- package/dist/services/loop.js.map +1 -0
- package/dist/setup.d.ts +4 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +118 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +90 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/graph-projects.d.ts +80 -0
- package/dist/storage/graph-projects.d.ts.map +1 -0
- package/dist/storage/graph-projects.js +154 -0
- package/dist/storage/graph-projects.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/kv-queries.d.ts +18 -0
- package/dist/storage/kv-queries.d.ts.map +1 -0
- package/dist/storage/kv-queries.js +70 -0
- package/dist/storage/kv-queries.js.map +1 -0
- package/dist/tools/graph.d.ts +9 -0
- package/dist/tools/graph.d.ts.map +1 -0
- package/dist/tools/graph.js +272 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/loop.d.ts +21 -0
- package/dist/tools/loop.d.ts.map +1 -0
- package/dist/tools/loop.js +570 -0
- package/dist/tools/loop.js.map +1 -0
- package/dist/tools/plan-approval.d.ts +15 -0
- package/dist/tools/plan-approval.d.ts.map +1 -0
- package/dist/tools/plan-approval.js +203 -0
- package/dist/tools/plan-approval.js.map +1 -0
- package/dist/tools/plan-execute.d.ts +4 -0
- package/dist/tools/plan-execute.d.ts.map +1 -0
- package/dist/tools/plan-execute.js +85 -0
- package/dist/tools/plan-execute.js.map +1 -0
- package/dist/tools/plan-kv.d.ts +4 -0
- package/dist/tools/plan-kv.d.ts.map +1 -0
- package/dist/tools/plan-kv.js +107 -0
- package/dist/tools/plan-kv.js.map +1 -0
- package/dist/tools/review.d.ts +4 -0
- package/dist/tools/review.d.ts.map +1 -0
- package/dist/tools/review.js +90 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/sandbox-fs.d.ts +22 -0
- package/dist/tools/sandbox-fs.d.ts.map +1 -0
- package/dist/tools/sandbox-fs.js +83 -0
- package/dist/tools/sandbox-fs.js.map +1 -0
- package/dist/tools/types.d.ts +26 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tui.d.ts +3 -0
- package/dist/tui.js +2061 -0
- package/dist/types.d.ts +124 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-branch.d.ts +11 -0
- package/dist/utils/git-branch.d.ts.map +1 -0
- package/dist/utils/git-branch.js +35 -0
- package/dist/utils/git-branch.js.map +1 -0
- package/dist/utils/graph-status-store.d.ts +72 -0
- package/dist/utils/graph-status-store.d.ts.map +1 -0
- package/dist/utils/graph-status-store.js +62 -0
- package/dist/utils/graph-status-store.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +89 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/loop-format.d.ts +5 -0
- package/dist/utils/loop-format.d.ts.map +1 -0
- package/dist/utils/loop-format.js +29 -0
- package/dist/utils/loop-format.js.map +1 -0
- package/dist/utils/loop-helpers.d.ts +9 -0
- package/dist/utils/loop-helpers.d.ts.map +1 -0
- package/dist/utils/loop-helpers.js +20 -0
- package/dist/utils/loop-helpers.js.map +1 -0
- package/dist/utils/loop-launch.d.ts +32 -0
- package/dist/utils/loop-launch.d.ts.map +1 -0
- package/dist/utils/loop-launch.js +162 -0
- package/dist/utils/loop-launch.js.map +1 -0
- package/dist/utils/model-fallback.d.ts +27 -0
- package/dist/utils/model-fallback.d.ts.map +1 -0
- package/dist/utils/model-fallback.js +33 -0
- package/dist/utils/model-fallback.js.map +1 -0
- package/dist/utils/partial-match.d.ts +7 -0
- package/dist/utils/partial-match.d.ts.map +1 -0
- package/dist/utils/partial-match.js +56 -0
- package/dist/utils/partial-match.js.map +1 -0
- package/dist/utils/plan-execution.d.ts +65 -0
- package/dist/utils/plan-execution.d.ts.map +1 -0
- package/dist/utils/plan-execution.js +107 -0
- package/dist/utils/plan-execution.js.map +1 -0
- package/dist/utils/session-stats.d.ts +36 -0
- package/dist/utils/session-stats.d.ts.map +1 -0
- package/dist/utils/session-stats.js +145 -0
- package/dist/utils/session-stats.js.map +1 -0
- package/dist/utils/tui-graph-status.d.ts +38 -0
- package/dist/utils/tui-graph-status.d.ts.map +1 -0
- package/dist/utils/tui-graph-status.js +95 -0
- package/dist/utils/tui-graph-status.js.map +1 -0
- package/dist/utils/tui-plan-store.d.ts +54 -0
- package/dist/utils/tui-plan-store.d.ts.map +1 -0
- package/dist/utils/tui-plan-store.js +168 -0
- package/dist/utils/tui-plan-store.js.map +1 -0
- package/dist/utils/tui-refresh-helpers.d.ts +44 -0
- package/dist/utils/tui-refresh-helpers.d.ts.map +1 -0
- package/dist/utils/tui-refresh-helpers.js +120 -0
- package/dist/utils/tui-refresh-helpers.js.map +1 -0
- package/dist/utils/upgrade.d.ts +23 -0
- package/dist/utils/upgrade.d.ts.map +1 -0
- package/dist/utils/upgrade.js +111 -0
- package/dist/utils/upgrade.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +92 -0
- package/scripts/build.ts +67 -0
- 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 @@
|
|
|
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"}
|