studiograph 1.0.0
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 +18 -0
- package/dist/agent/orchestrator.d.ts +69 -0
- package/dist/agent/orchestrator.js +211 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +30 -0
- package/dist/agent/tools/graph-tools.js +536 -0
- package/dist/agent/tools/graph-tools.js.map +1 -0
- package/dist/auth/github.d.ts +53 -0
- package/dist/auth/github.js +180 -0
- package/dist/auth/github.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.js +63 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.js +299 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/join.d.ts +14 -0
- package/dist/cli/commands/join.js +230 -0
- package/dist/cli/commands/join.js.map +1 -0
- package/dist/cli/commands/members.d.ts +11 -0
- package/dist/cli/commands/members.js +230 -0
- package/dist/cli/commands/members.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +17 -0
- package/dist/cli/commands/serve.js +90 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.js +381 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +10 -0
- package/dist/cli/commands/sync.js +121 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/graph.d.ts +169 -0
- package/dist/core/graph.js +558 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/types.d.ts +216 -0
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/user-config.d.ts +31 -0
- package/dist/core/user-config.js +50 -0
- package/dist/core/user-config.js.map +1 -0
- package/dist/core/validation.d.ts +2371 -0
- package/dist/core/validation.js +432 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/workspace-manager.d.ts +104 -0
- package/dist/core/workspace-manager.js +432 -0
- package/dist/core/workspace-manager.js.map +1 -0
- package/dist/core/workspace.d.ts +103 -0
- package/dist/core/workspace.js +306 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/server/index.d.ts +25 -0
- package/dist/server/index.js +84 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plugin-loader.d.ts +31 -0
- package/dist/server/plugin-loader.js +81 -0
- package/dist/server/plugin-loader.js.map +1 -0
- package/dist/server/routes/chat.d.ts +11 -0
- package/dist/server/routes/chat.js +66 -0
- package/dist/server/routes/chat.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +9 -0
- package/dist/server/routes/graph-api.js +72 -0
- package/dist/server/routes/graph-api.js.map +1 -0
- package/dist/server/routes/webhook.d.ts +14 -0
- package/dist/server/routes/webhook.js +69 -0
- package/dist/server/routes/webhook.js.map +1 -0
- package/dist/services/assets/base.d.ts +69 -0
- package/dist/services/assets/base.js +113 -0
- package/dist/services/assets/base.js.map +1 -0
- package/dist/services/assets/index.d.ts +36 -0
- package/dist/services/assets/index.js +89 -0
- package/dist/services/assets/index.js.map +1 -0
- package/dist/services/assets/local.d.ts +42 -0
- package/dist/services/assets/local.js +161 -0
- package/dist/services/assets/local.js.map +1 -0
- package/dist/services/assets/r2.d.ts +36 -0
- package/dist/services/assets/r2.js +182 -0
- package/dist/services/assets/r2.js.map +1 -0
- package/dist/services/csv-service.d.ts +36 -0
- package/dist/services/csv-service.js +143 -0
- package/dist/services/csv-service.js.map +1 -0
- package/dist/services/git.d.ts +99 -0
- package/dist/services/git.js +306 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/github-provisioner.d.ts +30 -0
- package/dist/services/github-provisioner.js +89 -0
- package/dist/services/github-provisioner.js.map +1 -0
- package/dist/services/markdown.d.ts +82 -0
- package/dist/services/markdown.js +338 -0
- package/dist/services/markdown.js.map +1 -0
- package/dist/services/memory-service.d.ts +74 -0
- package/dist/services/memory-service.js +183 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/utils/git.d.ts +28 -0
- package/dist/utils/git.js +55 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/preflight.d.ts +44 -0
- package/dist/utils/preflight.js +95 -0
- package/dist/utils/preflight.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Graph Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides unified entity management across any repo type.
|
|
5
|
+
* Integrates Git, Markdown, and Asset services.
|
|
6
|
+
*/
|
|
7
|
+
import { join, basename } from 'path';
|
|
8
|
+
import { existsSync, readdirSync } from 'fs';
|
|
9
|
+
import { GitService } from '../services/git.js';
|
|
10
|
+
import { MarkdownService } from '../services/markdown.js';
|
|
11
|
+
import { AssetService } from '../services/assets/index.js';
|
|
12
|
+
import { ENTITY_SCHEMAS } from './validation.js';
|
|
13
|
+
import { CSVService } from '../services/csv-service.js';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
export class BaseGraphManager {
|
|
16
|
+
repoPath;
|
|
17
|
+
gitService;
|
|
18
|
+
markdownService;
|
|
19
|
+
assetService;
|
|
20
|
+
gitUser;
|
|
21
|
+
csvService;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.repoPath = config.repoPath;
|
|
24
|
+
this.gitUser = config.gitUser;
|
|
25
|
+
// Initialize services
|
|
26
|
+
this.gitService = new GitService(this.repoPath);
|
|
27
|
+
this.markdownService = new MarkdownService();
|
|
28
|
+
this.csvService = new CSVService();
|
|
29
|
+
// Asset service is optional (can be disabled for repos without assets)
|
|
30
|
+
if (config.assetConfig) {
|
|
31
|
+
this.assetService = new AssetService(config.assetConfig);
|
|
32
|
+
}
|
|
33
|
+
// Ensure repo is initialized
|
|
34
|
+
this.ensureRepo();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensure repository exists
|
|
38
|
+
*/
|
|
39
|
+
ensureRepo() {
|
|
40
|
+
if (!existsSync(this.repoPath)) {
|
|
41
|
+
throw new Error(`Repository path does not exist: ${this.repoPath}`);
|
|
42
|
+
}
|
|
43
|
+
// GitService automatically initializes in constructor
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get entity file path
|
|
47
|
+
*/
|
|
48
|
+
getEntityPath(entityType, entityId) {
|
|
49
|
+
// Entity files are stored in {entityType}/{entityId}.md
|
|
50
|
+
return join(this.repoPath, entityType, `${entityId}.md`);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get entity folder path
|
|
54
|
+
*/
|
|
55
|
+
getEntityFolder(entityType) {
|
|
56
|
+
return join(this.repoPath, entityType);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Public alias for getEntityPath (used internally by dataset methods)
|
|
60
|
+
*/
|
|
61
|
+
getEntityPathPublic(entityType, entityId) {
|
|
62
|
+
return this.getEntityPath(entityType, entityId);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate entity data against schema
|
|
66
|
+
*/
|
|
67
|
+
validateEntity(entityType, data) {
|
|
68
|
+
const schema = ENTITY_SCHEMAS[entityType];
|
|
69
|
+
if (!schema) {
|
|
70
|
+
throw new Error(`Unknown entity type: ${entityType}`);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Add entity_type if not present
|
|
74
|
+
const dataWithType = {
|
|
75
|
+
...data,
|
|
76
|
+
entity_type: entityType,
|
|
77
|
+
};
|
|
78
|
+
return schema.parse(dataWithType);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof z.ZodError) {
|
|
82
|
+
const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`);
|
|
83
|
+
throw new Error(`Validation failed for ${entityType}:\n${messages.join('\n')}`);
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a new entity
|
|
90
|
+
*/
|
|
91
|
+
async create(options) {
|
|
92
|
+
const { entityType, entityId, data, content = '', commitMessage } = options;
|
|
93
|
+
// Validate data
|
|
94
|
+
const validatedData = this.validateEntity(entityType, data);
|
|
95
|
+
// Check if entity already exists
|
|
96
|
+
const entityPath = this.getEntityPath(entityType, entityId);
|
|
97
|
+
if (existsSync(entityPath)) {
|
|
98
|
+
throw new Error(`Entity already exists: ${entityType}/${entityId}`);
|
|
99
|
+
}
|
|
100
|
+
// Create git transaction
|
|
101
|
+
const transaction = this.gitService.createTransaction();
|
|
102
|
+
// Write markdown file
|
|
103
|
+
this.markdownService.writeFile(entityPath, {
|
|
104
|
+
frontmatter: validatedData,
|
|
105
|
+
content,
|
|
106
|
+
wikilinks: this.markdownService.extractWikilinks(content, validatedData),
|
|
107
|
+
});
|
|
108
|
+
transaction.add({
|
|
109
|
+
operation: 'create',
|
|
110
|
+
entityType,
|
|
111
|
+
entityId,
|
|
112
|
+
filePath: entityPath,
|
|
113
|
+
});
|
|
114
|
+
// Commit transaction
|
|
115
|
+
const message = commitMessage || `Create ${entityType}: ${entityId}`;
|
|
116
|
+
await transaction.commit(this.gitUser, message);
|
|
117
|
+
// Return created entity
|
|
118
|
+
return this.get(entityType, entityId);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get an entity by type and ID
|
|
122
|
+
*/
|
|
123
|
+
get(entityType, entityId) {
|
|
124
|
+
const entityPath = this.getEntityPath(entityType, entityId);
|
|
125
|
+
if (!existsSync(entityPath)) {
|
|
126
|
+
throw new Error(`Entity not found: ${entityType}/${entityId}`);
|
|
127
|
+
}
|
|
128
|
+
const document = this.markdownService.parseFile(entityPath);
|
|
129
|
+
// Validate frontmatter
|
|
130
|
+
const validatedData = this.validateEntity(entityType, document.frontmatter);
|
|
131
|
+
return {
|
|
132
|
+
id: entityId,
|
|
133
|
+
path: entityPath,
|
|
134
|
+
entityType,
|
|
135
|
+
data: validatedData,
|
|
136
|
+
document,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Update an existing entity
|
|
141
|
+
*/
|
|
142
|
+
async update(options) {
|
|
143
|
+
const { entityType, entityId, data, content, commitMessage } = options;
|
|
144
|
+
// Get existing entity
|
|
145
|
+
const existing = this.get(entityType, entityId);
|
|
146
|
+
// Merge data (if provided) and add update metadata
|
|
147
|
+
const mergedData = data
|
|
148
|
+
? {
|
|
149
|
+
...existing.data,
|
|
150
|
+
...data,
|
|
151
|
+
entity_type: entityType,
|
|
152
|
+
updated_at: new Date().toISOString(),
|
|
153
|
+
updated_by: this.gitUser.id,
|
|
154
|
+
}
|
|
155
|
+
: existing.data;
|
|
156
|
+
// Validate merged data
|
|
157
|
+
const validatedData = this.validateEntity(entityType, mergedData);
|
|
158
|
+
// Merge content (if provided)
|
|
159
|
+
const mergedContent = content !== undefined ? content : existing.document.content;
|
|
160
|
+
// Create git transaction
|
|
161
|
+
const transaction = this.gitService.createTransaction();
|
|
162
|
+
// Write updated markdown file
|
|
163
|
+
const entityPath = this.getEntityPath(entityType, entityId);
|
|
164
|
+
this.markdownService.writeFile(entityPath, {
|
|
165
|
+
frontmatter: validatedData,
|
|
166
|
+
content: mergedContent,
|
|
167
|
+
wikilinks: this.markdownService.extractWikilinks(mergedContent, validatedData),
|
|
168
|
+
});
|
|
169
|
+
transaction.add({
|
|
170
|
+
operation: 'update',
|
|
171
|
+
entityType,
|
|
172
|
+
entityId,
|
|
173
|
+
filePath: entityPath,
|
|
174
|
+
});
|
|
175
|
+
// Commit transaction
|
|
176
|
+
const message = commitMessage || `Update ${entityType}: ${entityId}`;
|
|
177
|
+
await transaction.commit(this.gitUser, message);
|
|
178
|
+
// Return updated entity
|
|
179
|
+
return this.get(entityType, entityId);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Delete an entity
|
|
183
|
+
*/
|
|
184
|
+
async delete(entityType, entityId, commitMessage) {
|
|
185
|
+
// Verify entity exists
|
|
186
|
+
const existing = this.get(entityType, entityId);
|
|
187
|
+
// Create git transaction
|
|
188
|
+
const transaction = this.gitService.createTransaction();
|
|
189
|
+
// Delete the file
|
|
190
|
+
const { unlinkSync } = await import('fs');
|
|
191
|
+
unlinkSync(existing.path);
|
|
192
|
+
transaction.add({
|
|
193
|
+
operation: 'delete',
|
|
194
|
+
entityType,
|
|
195
|
+
entityId,
|
|
196
|
+
filePath: existing.path,
|
|
197
|
+
});
|
|
198
|
+
// Commit transaction
|
|
199
|
+
const message = commitMessage || `Delete ${entityType}: ${entityId}`;
|
|
200
|
+
await transaction.commit(this.gitUser, message);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* List entities of a given type
|
|
204
|
+
*/
|
|
205
|
+
list(entityType, limit) {
|
|
206
|
+
const results = [];
|
|
207
|
+
// If entityType specified, search only that folder
|
|
208
|
+
if (entityType) {
|
|
209
|
+
const folder = this.getEntityFolder(entityType);
|
|
210
|
+
if (!existsSync(folder)) {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
const files = readdirSync(folder)
|
|
214
|
+
.filter(f => f.endsWith('.md'))
|
|
215
|
+
.map(f => {
|
|
216
|
+
const entityId = basename(f, '.md');
|
|
217
|
+
try {
|
|
218
|
+
return this.get(entityType, entityId);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
.filter((e) => e !== null);
|
|
225
|
+
results.push(...files);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Search all entity type folders
|
|
229
|
+
const entityTypes = Object.keys(ENTITY_SCHEMAS);
|
|
230
|
+
for (const type of entityTypes) {
|
|
231
|
+
const folder = this.getEntityFolder(type);
|
|
232
|
+
if (!existsSync(folder)) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const files = readdirSync(folder)
|
|
236
|
+
.filter(f => f.endsWith('.md'))
|
|
237
|
+
.map(f => {
|
|
238
|
+
const entityId = basename(f, '.md');
|
|
239
|
+
try {
|
|
240
|
+
return this.get(type, entityId);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
})
|
|
246
|
+
.filter((e) => e !== null);
|
|
247
|
+
results.push(...files);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Apply limit
|
|
251
|
+
if (limit && limit > 0) {
|
|
252
|
+
return results.slice(0, limit);
|
|
253
|
+
}
|
|
254
|
+
return results;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Search entities
|
|
258
|
+
*/
|
|
259
|
+
search(options) {
|
|
260
|
+
const { entityType, query, filters, visibility, tags, dateRange, sortBy, limit } = options;
|
|
261
|
+
// Get all entities (optionally filtered by type)
|
|
262
|
+
let entities = this.list(entityType);
|
|
263
|
+
// Apply query filter (full-text search in content)
|
|
264
|
+
if (query && query.trim() !== '') {
|
|
265
|
+
const lowerQuery = query.toLowerCase();
|
|
266
|
+
entities = entities.filter(e => {
|
|
267
|
+
const content = e.document.content.toLowerCase();
|
|
268
|
+
const name = (e.data.name || '').toString().toLowerCase();
|
|
269
|
+
return content.includes(lowerQuery) || name.includes(lowerQuery);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Apply visibility filter
|
|
273
|
+
if (visibility && visibility.length > 0) {
|
|
274
|
+
entities = entities.filter(e => {
|
|
275
|
+
const entityVisibility = e.data.visibility || 'team';
|
|
276
|
+
return visibility.includes(entityVisibility);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
// Apply tags filter
|
|
280
|
+
if (tags && tags.length > 0) {
|
|
281
|
+
entities = entities.filter(e => {
|
|
282
|
+
const entityTags = (e.data.tags || []);
|
|
283
|
+
// Check if any filter tag matches any entity tag
|
|
284
|
+
return tags.some(tag => entityTags.includes(tag));
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Apply date range filter
|
|
288
|
+
if (dateRange) {
|
|
289
|
+
const fromDate = new Date(dateRange.from);
|
|
290
|
+
const toDate = new Date(dateRange.to);
|
|
291
|
+
entities = entities.filter(e => {
|
|
292
|
+
const createdAt = new Date(e.data.created_at);
|
|
293
|
+
return createdAt >= fromDate && createdAt <= toDate;
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
// Apply custom metadata filters
|
|
297
|
+
if (filters) {
|
|
298
|
+
entities = entities.filter(e => {
|
|
299
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
300
|
+
const entityValue = e.data[key];
|
|
301
|
+
// Handle array values (tags, etc.)
|
|
302
|
+
if (Array.isArray(value)) {
|
|
303
|
+
if (!Array.isArray(entityValue)) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
// Check if any filter value matches any entity value
|
|
307
|
+
const hasMatch = value.some(v => entityValue.includes(v));
|
|
308
|
+
if (!hasMatch) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
// Exact match
|
|
314
|
+
if (entityValue !== value) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return true;
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Sort results
|
|
323
|
+
if (sortBy) {
|
|
324
|
+
if (sortBy === 'created_at') {
|
|
325
|
+
entities.sort((a, b) => {
|
|
326
|
+
const aDate = new Date(a.data.created_at).getTime();
|
|
327
|
+
const bDate = new Date(b.data.created_at).getTime();
|
|
328
|
+
return bDate - aDate; // Most recent first
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
else if (sortBy === 'updated_at') {
|
|
332
|
+
entities.sort((a, b) => {
|
|
333
|
+
const aDate = new Date(a.data.updated_at).getTime();
|
|
334
|
+
const bDate = new Date(b.data.updated_at).getTime();
|
|
335
|
+
return bDate - aDate; // Most recent first
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
else if (sortBy === 'relevance' && query) {
|
|
339
|
+
// Simple relevance scoring based on number of query matches
|
|
340
|
+
const lowerQuery = query.toLowerCase();
|
|
341
|
+
entities.sort((a, b) => {
|
|
342
|
+
const aContent = a.document.content.toLowerCase();
|
|
343
|
+
const bContent = b.document.content.toLowerCase();
|
|
344
|
+
const aName = (a.data.name || '').toString().toLowerCase();
|
|
345
|
+
const bName = (b.data.name || '').toString().toLowerCase();
|
|
346
|
+
// Count occurrences
|
|
347
|
+
const aMatches = (aContent.match(new RegExp(lowerQuery, 'g')) || []).length +
|
|
348
|
+
(aName.match(new RegExp(lowerQuery, 'g')) || []).length * 2; // Weight name matches higher
|
|
349
|
+
const bMatches = (bContent.match(new RegExp(lowerQuery, 'g')) || []).length +
|
|
350
|
+
(bName.match(new RegExp(lowerQuery, 'g')) || []).length * 2;
|
|
351
|
+
return bMatches - aMatches; // Higher score first
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// Apply limit
|
|
356
|
+
if (limit && limit > 0) {
|
|
357
|
+
return entities.slice(0, limit);
|
|
358
|
+
}
|
|
359
|
+
return entities;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Get entities related to a given entity (via wikilinks)
|
|
363
|
+
*/
|
|
364
|
+
getRelated(entityType, entityId) {
|
|
365
|
+
const entity = this.get(entityType, entityId);
|
|
366
|
+
const related = [];
|
|
367
|
+
// Find all wikilinked entities
|
|
368
|
+
for (const link of entity.document.wikilinks) {
|
|
369
|
+
// Try to find the linked entity in all folders
|
|
370
|
+
const found = this.markdownService.findEntity(link, [this.repoPath]);
|
|
371
|
+
if (found) {
|
|
372
|
+
// Determine entity type from path
|
|
373
|
+
const relPath = found.replace(this.repoPath + '/', '');
|
|
374
|
+
const parts = relPath.split('/');
|
|
375
|
+
if (parts.length >= 2) {
|
|
376
|
+
const linkedType = parts[0];
|
|
377
|
+
const linkedId = basename(parts[1], '.md');
|
|
378
|
+
try {
|
|
379
|
+
const linkedEntity = this.get(linkedType, linkedId);
|
|
380
|
+
related.push(linkedEntity);
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
// Entity exists as file but failed validation - skip
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return related;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Get entities that link to a given entity (backlinks)
|
|
392
|
+
*/
|
|
393
|
+
getBacklinks(entityType, entityId) {
|
|
394
|
+
const backlinks = this.markdownService.findBacklinks(entityId, [this.repoPath]);
|
|
395
|
+
const results = [];
|
|
396
|
+
for (const { file } of backlinks) {
|
|
397
|
+
// Determine entity type from path
|
|
398
|
+
const relPath = file.replace(this.repoPath + '/', '');
|
|
399
|
+
const parts = relPath.split('/');
|
|
400
|
+
if (parts.length >= 2) {
|
|
401
|
+
const linkedType = parts[0];
|
|
402
|
+
const linkedId = basename(parts[1], '.md');
|
|
403
|
+
try {
|
|
404
|
+
const linkedEntity = this.get(linkedType, linkedId);
|
|
405
|
+
results.push(linkedEntity);
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
// Entity exists as file but failed validation - skip
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return results;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Validate wikilinks in an entity
|
|
416
|
+
*/
|
|
417
|
+
validateWikilinks(entityType, entityId) {
|
|
418
|
+
const entity = this.get(entityType, entityId);
|
|
419
|
+
return this.markdownService.validateWikilinks(entity.document.wikilinks, [this.repoPath]);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Refactor a wikilink (rename entity and update all references)
|
|
423
|
+
*/
|
|
424
|
+
async refactorWikilink(oldId, newId, commitMessage) {
|
|
425
|
+
const transaction = this.gitService.createTransaction();
|
|
426
|
+
// Find all files that reference the old entity ID
|
|
427
|
+
const backlinks = this.markdownService.findBacklinks(oldId, [this.repoPath]);
|
|
428
|
+
// Update each file
|
|
429
|
+
for (const { file } of backlinks) {
|
|
430
|
+
this.markdownService.updateWikilinks(file, oldId, newId);
|
|
431
|
+
const relPath = file.replace(this.repoPath + '/', '');
|
|
432
|
+
const parts = relPath.split('/');
|
|
433
|
+
if (parts.length >= 2) {
|
|
434
|
+
const entityType = parts[0];
|
|
435
|
+
const entityId = basename(parts[1], '.md');
|
|
436
|
+
transaction.add({
|
|
437
|
+
operation: 'update',
|
|
438
|
+
entityType,
|
|
439
|
+
entityId,
|
|
440
|
+
filePath: file,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
// Commit transaction
|
|
445
|
+
const message = commitMessage || `Refactor wikilink: ${oldId} → ${newId}`;
|
|
446
|
+
await transaction.commit(this.gitUser, message);
|
|
447
|
+
return { updated: backlinks.length };
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Upload asset for an entity
|
|
451
|
+
*/
|
|
452
|
+
async uploadAsset(repoName, entityType, entityId, filename, buffer) {
|
|
453
|
+
if (!this.assetService) {
|
|
454
|
+
throw new Error('Asset service is not configured for this graph');
|
|
455
|
+
}
|
|
456
|
+
return await this.assetService.upload(repoName, entityType, entityId, filename, buffer);
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* List assets for an entity
|
|
460
|
+
*/
|
|
461
|
+
async listAssets(repoName, entityType, entityId) {
|
|
462
|
+
if (!this.assetService) {
|
|
463
|
+
throw new Error('Asset service is not configured for this graph');
|
|
464
|
+
}
|
|
465
|
+
return await this.assetService.list(repoName, entityType, entityId);
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Delete an asset
|
|
469
|
+
*/
|
|
470
|
+
async deleteAsset(repoName, entityType, entityId, filename) {
|
|
471
|
+
if (!this.assetService) {
|
|
472
|
+
throw new Error('Asset service is not configured for this graph');
|
|
473
|
+
}
|
|
474
|
+
return await this.assetService.delete(repoName, entityType, entityId, filename);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Delete all assets for an entity (when entity is deleted)
|
|
478
|
+
*/
|
|
479
|
+
async deleteAllAssets(repoName, entityType, entityId) {
|
|
480
|
+
if (!this.assetService) {
|
|
481
|
+
throw new Error('Asset service is not configured for this graph');
|
|
482
|
+
}
|
|
483
|
+
return await this.assetService.deleteAll(repoName, entityType, entityId);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Get dataset rows, optionally filtered
|
|
487
|
+
*/
|
|
488
|
+
getDatasetRows(entityId, filter) {
|
|
489
|
+
const entity = this.get('dataset', entityId);
|
|
490
|
+
if (entity.data.entity_type !== 'dataset') {
|
|
491
|
+
throw new Error(`Entity ${entityId} is not a dataset`);
|
|
492
|
+
}
|
|
493
|
+
const schema = entity.data.schema;
|
|
494
|
+
const rows = this.csvService.parseRows(entity.document.content, schema);
|
|
495
|
+
if (filter && Object.keys(filter).length > 0) {
|
|
496
|
+
return this.csvService.filterRows(rows, filter);
|
|
497
|
+
}
|
|
498
|
+
return rows;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Append rows to a dataset entity
|
|
502
|
+
*/
|
|
503
|
+
async appendDatasetRows(entityId, newRows, commitMessage) {
|
|
504
|
+
const entity = this.get('dataset', entityId);
|
|
505
|
+
if (entity.data.entity_type !== 'dataset') {
|
|
506
|
+
throw new Error(`Entity ${entityId} is not a dataset`);
|
|
507
|
+
}
|
|
508
|
+
const schema = entity.data.schema;
|
|
509
|
+
// Validate new rows against schema
|
|
510
|
+
const validatedRows = newRows.map(row => {
|
|
511
|
+
const stringRow = {};
|
|
512
|
+
for (const [k, v] of Object.entries(row)) {
|
|
513
|
+
stringRow[k] = v !== null && v !== undefined ? String(v) : '';
|
|
514
|
+
}
|
|
515
|
+
return this.csvService.validateRow(stringRow, schema);
|
|
516
|
+
});
|
|
517
|
+
// Parse existing rows and append
|
|
518
|
+
const existingRows = this.csvService.parseRows(entity.document.content, schema);
|
|
519
|
+
const allRows = [...existingRows, ...validatedRows];
|
|
520
|
+
// Stringify back to CSV
|
|
521
|
+
const newContent = this.csvService.stringifyRows(allRows, schema);
|
|
522
|
+
// Update the entity file (update content, bump updated_at)
|
|
523
|
+
const entityPath = this.getEntityPathPublic('dataset', entityId);
|
|
524
|
+
const updatedData = {
|
|
525
|
+
...entity.data,
|
|
526
|
+
updated_at: new Date().toISOString(),
|
|
527
|
+
updated_by: this.gitUser.id,
|
|
528
|
+
};
|
|
529
|
+
const transaction = this.gitService.createTransaction();
|
|
530
|
+
this.markdownService.writeFile(entityPath, {
|
|
531
|
+
frontmatter: updatedData,
|
|
532
|
+
content: newContent,
|
|
533
|
+
wikilinks: this.markdownService.extractWikilinks(newContent, updatedData),
|
|
534
|
+
});
|
|
535
|
+
transaction.add({
|
|
536
|
+
operation: 'update',
|
|
537
|
+
entityType: 'dataset',
|
|
538
|
+
entityId,
|
|
539
|
+
filePath: entityPath,
|
|
540
|
+
});
|
|
541
|
+
const message = commitMessage || `Append ${validatedRows.length} row(s) to dataset: ${entityId}`;
|
|
542
|
+
await transaction.commit(this.gitUser, message);
|
|
543
|
+
return this.get('dataset', entityId);
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Get repository status
|
|
547
|
+
*/
|
|
548
|
+
getStatus() {
|
|
549
|
+
return this.gitService.getStatus();
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Get commit history
|
|
553
|
+
*/
|
|
554
|
+
getHistory(limit = 10) {
|
|
555
|
+
return this.gitService.getHistory(limit);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/core/graph.ts"],"names":[],"mappings":"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"}
|