studiograph 1.1.1 → 1.1.3
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 +191 -0
- package/README.md +307 -10
- package/dist/agent/orchestrator.d.ts +17 -9
- package/dist/agent/orchestrator.js +95 -95
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +168 -0
- package/dist/agent/skills/bundled/enrich-entities.md +124 -0
- package/dist/agent/skills/bundled/gather-context.md +46 -0
- package/dist/agent/skills/skill-loader.d.ts +48 -0
- package/dist/agent/skills/skill-loader.js +166 -0
- package/dist/agent/skills/skill-loader.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +20 -2
- package/dist/agent/tools/graph-tools.js +64 -8
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +42 -0
- package/dist/agent/tools/load-skill.js +45 -0
- package/dist/agent/tools/load-skill.js.map +1 -0
- package/dist/agent/tools/tool-loader.d.ts +25 -0
- package/dist/agent/tools/tool-loader.js +73 -0
- package/dist/agent/tools/tool-loader.js.map +1 -0
- package/dist/cli/commands/app.d.ts +7 -0
- package/dist/cli/commands/app.js +167 -0
- package/dist/cli/commands/app.js.map +1 -0
- package/dist/cli/commands/config.d.ts +13 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connector.d.ts +33 -0
- package/dist/cli/commands/connector.js +170 -0
- package/dist/cli/commands/connector.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +11 -0
- package/dist/cli/commands/deploy.js +153 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/index.d.ts +15 -0
- package/dist/cli/commands/index.js +117 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.js +110 -28
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +67 -22
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/lint.d.ts +8 -0
- package/dist/cli/commands/lint.js +70 -0
- package/dist/cli/commands/lint.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +27 -0
- package/dist/cli/commands/mcp.js +56 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/provision.d.ts +8 -0
- package/dist/cli/commands/provision.js +112 -0
- package/dist/cli/commands/provision.js.map +1 -0
- package/dist/cli/commands/r2.d.ts +2 -0
- package/dist/cli/commands/r2.js +186 -4
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/serve.js +47 -2
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/start.js +210 -71
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync.js +4 -4
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/update.d.ts +8 -0
- package/dist/cli/commands/update.js +155 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +83 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +9 -0
- package/dist/cli/scaffolding.js +288 -0
- package/dist/cli/scaffolding.js.map +1 -0
- package/dist/core/graph.d.ts +12 -1
- package/dist/core/graph.js +147 -78
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +39 -0
- package/dist/core/migration-runner.js +221 -0
- package/dist/core/migration-runner.js.map +1 -0
- package/dist/core/migration-types.d.ts +101 -0
- package/dist/core/migration-types.js +21 -0
- package/dist/core/migration-types.js.map +1 -0
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
- package/dist/core/migrations/index.d.ts +11 -0
- package/dist/core/migrations/index.js +23 -0
- package/dist/core/migrations/index.js.map +1 -0
- package/dist/core/schema-registry.d.ts +36 -0
- package/dist/core/schema-registry.js +161 -0
- package/dist/core/schema-registry.js.map +1 -0
- package/dist/core/types.d.ts +242 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +10 -0
- package/dist/core/user-config.js +8 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +973 -32
- package/dist/core/validation.js +163 -4
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +26 -2
- package/dist/core/workspace-manager.js +113 -15
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +8 -7
- package/dist/core/workspace.js +25 -13
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/connector-manager.d.ts +61 -0
- package/dist/mcp/connector-manager.js +178 -0
- package/dist/mcp/connector-manager.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +43 -0
- package/dist/mcp/connectors/definitions.js +140 -0
- package/dist/mcp/connectors/definitions.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +28 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.js +172 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/server/index.js +17 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +8 -0
- package/dist/server/plugin-loader.js +14 -0
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/graph-api.js +1 -1
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/webhook.js +33 -0
- package/dist/server/routes/webhook.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +1 -0
- package/dist/services/github-provisioner.js +11 -0
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.d.ts +27 -0
- package/dist/services/lint-service.js +76 -0
- package/dist/services/lint-service.js.map +1 -0
- package/dist/services/markdown.d.ts +9 -0
- package/dist/services/markdown.js +23 -2
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -2
- package/dist/services/memory-service.js +6 -4
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/vector-service.d.ts +77 -0
- package/dist/services/vector-service.js +280 -0
- package/dist/services/vector-service.js.map +1 -0
- package/dist/utils/version-checker.d.ts +23 -0
- package/dist/utils/version-checker.js +116 -0
- package/dist/utils/version-checker.js.map +1 -0
- package/package.json +10 -6
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VectorService
|
|
3
|
+
*
|
|
4
|
+
* Manages semantic and full-text search using LanceDB.
|
|
5
|
+
*
|
|
6
|
+
* Tier 1 — FTS only (no API key required):
|
|
7
|
+
* All entities are indexed in LanceDB with a BM25 full-text search index on
|
|
8
|
+
* the `text` column. This is a significant upgrade over substring matching.
|
|
9
|
+
*
|
|
10
|
+
* Tier 2 — Hybrid semantic search (requires Voyage AI API key):
|
|
11
|
+
* When a voyage_api_key is configured, embeddings are generated via Voyage AI
|
|
12
|
+
* (voyage-3, 1024 dimensions) and stored alongside the FTS index. Searches
|
|
13
|
+
* use LanceDB hybrid mode (vector + FTS re-ranked).
|
|
14
|
+
*
|
|
15
|
+
* Storage: ~/.studiograph/vector/ (configurable via user.json vector_db_path)
|
|
16
|
+
* Last-index timestamps: ~/.studiograph/vector/last-indexed.json
|
|
17
|
+
*/
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
20
|
+
import * as lancedb from '@lancedb/lancedb';
|
|
21
|
+
const VOYAGE_API_URL = 'https://api.voyageai.com/v1/embeddings';
|
|
22
|
+
const VOYAGE_MODEL = 'voyage-3';
|
|
23
|
+
const VECTOR_DIM = 1024;
|
|
24
|
+
const TABLE_NAME = 'entities';
|
|
25
|
+
export class VectorService {
|
|
26
|
+
dbPath;
|
|
27
|
+
voyageApiKey;
|
|
28
|
+
db;
|
|
29
|
+
table;
|
|
30
|
+
lastIndexedPath;
|
|
31
|
+
initialized = false;
|
|
32
|
+
constructor(dbPath, voyageApiKey) {
|
|
33
|
+
this.dbPath = dbPath;
|
|
34
|
+
this.voyageApiKey = voyageApiKey;
|
|
35
|
+
this.lastIndexedPath = join(dbPath, 'last-indexed.json');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Open/create the LanceDB table and ensure the FTS index exists.
|
|
39
|
+
* Call once before using the service.
|
|
40
|
+
*/
|
|
41
|
+
async init() {
|
|
42
|
+
if (this.initialized)
|
|
43
|
+
return;
|
|
44
|
+
mkdirSync(this.dbPath, { recursive: true });
|
|
45
|
+
this.db = await lancedb.connect(this.dbPath);
|
|
46
|
+
const tableNames = await this.db.tableNames();
|
|
47
|
+
if (tableNames.includes(TABLE_NAME)) {
|
|
48
|
+
this.table = await this.db.openTable(TABLE_NAME);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Create table with a seed record (LanceDB infers schema from first batch)
|
|
52
|
+
const seed = {
|
|
53
|
+
id: '__seed__',
|
|
54
|
+
repo: '',
|
|
55
|
+
entity_type: '',
|
|
56
|
+
entity_id: '',
|
|
57
|
+
text: 'seed',
|
|
58
|
+
vector: new Array(VECTOR_DIM).fill(0),
|
|
59
|
+
updated_at: new Date().toISOString(),
|
|
60
|
+
};
|
|
61
|
+
this.table = await this.db.createTable(TABLE_NAME, [seed]);
|
|
62
|
+
// Create FTS index on text column
|
|
63
|
+
await this.table.createIndex('text', {
|
|
64
|
+
config: lancedb.Index.fts(),
|
|
65
|
+
});
|
|
66
|
+
// Delete the seed record
|
|
67
|
+
await this.table.delete(`id = '__seed__'`);
|
|
68
|
+
}
|
|
69
|
+
this.initialized = true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Index or re-index a single entity.
|
|
73
|
+
* Safe to call on create, update, or as part of bulk indexing.
|
|
74
|
+
*/
|
|
75
|
+
async upsert(repoName, entity) {
|
|
76
|
+
await this.init();
|
|
77
|
+
const id = `${repoName}/${entity.entityType}/${entity.id}`;
|
|
78
|
+
const text = buildEntityText(entity);
|
|
79
|
+
const vector = this.voyageApiKey
|
|
80
|
+
? await this.generateEmbedding(text)
|
|
81
|
+
: null;
|
|
82
|
+
const record = {
|
|
83
|
+
id,
|
|
84
|
+
repo: repoName,
|
|
85
|
+
entity_type: entity.entityType,
|
|
86
|
+
entity_id: entity.id,
|
|
87
|
+
text,
|
|
88
|
+
// Only include vector when we actually have one — avoids LanceDB schema inference issues
|
|
89
|
+
vector: vector ?? new Array(VECTOR_DIM).fill(0),
|
|
90
|
+
updated_at: new Date().toISOString(),
|
|
91
|
+
};
|
|
92
|
+
await this.table
|
|
93
|
+
.mergeInsert('id')
|
|
94
|
+
.whenMatchedUpdateAll()
|
|
95
|
+
.whenNotMatchedInsertAll()
|
|
96
|
+
.execute([record]);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Bulk upsert — used by `studiograph index`. Batches Voyage API calls.
|
|
100
|
+
*/
|
|
101
|
+
async upsertMany(repoName, entities) {
|
|
102
|
+
await this.init();
|
|
103
|
+
if (entities.length === 0)
|
|
104
|
+
return;
|
|
105
|
+
const texts = entities.map(e => buildEntityText(e));
|
|
106
|
+
// Batch embeddings (Voyage supports up to 128 per request)
|
|
107
|
+
let vectors = new Array(entities.length).fill(null);
|
|
108
|
+
if (this.voyageApiKey) {
|
|
109
|
+
vectors = await this.generateEmbeddingsBatch(texts);
|
|
110
|
+
}
|
|
111
|
+
const records = entities.map((entity, i) => ({
|
|
112
|
+
id: `${repoName}/${entity.entityType}/${entity.id}`,
|
|
113
|
+
repo: repoName,
|
|
114
|
+
entity_type: entity.entityType,
|
|
115
|
+
entity_id: entity.id,
|
|
116
|
+
text: texts[i],
|
|
117
|
+
vector: vectors[i] ?? new Array(VECTOR_DIM).fill(0),
|
|
118
|
+
updated_at: new Date().toISOString(),
|
|
119
|
+
}));
|
|
120
|
+
await this.table
|
|
121
|
+
.mergeInsert('id')
|
|
122
|
+
.whenMatchedUpdateAll()
|
|
123
|
+
.whenNotMatchedInsertAll()
|
|
124
|
+
.execute(records);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Remove an entity from the index.
|
|
128
|
+
*/
|
|
129
|
+
async delete(repoName, entityType, entityId) {
|
|
130
|
+
await this.init();
|
|
131
|
+
const id = `${repoName}/${entityType}/${entityId}`;
|
|
132
|
+
await this.table.delete(`id = '${id.replace(/'/g, "''")}'`);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Search the index.
|
|
136
|
+
* Uses hybrid search (vector + FTS) when Voyage key is configured, FTS only otherwise.
|
|
137
|
+
*/
|
|
138
|
+
async search(query, options = {}) {
|
|
139
|
+
await this.init();
|
|
140
|
+
const limit = options.limit ?? 10;
|
|
141
|
+
try {
|
|
142
|
+
let rows;
|
|
143
|
+
if (this.voyageApiKey) {
|
|
144
|
+
// Tier 2: hybrid search
|
|
145
|
+
const queryVector = await this.generateEmbedding(query);
|
|
146
|
+
rows = await this.table
|
|
147
|
+
.search(queryVector)
|
|
148
|
+
.limit(limit * 2) // fetch extra for re-ranking
|
|
149
|
+
.toArray();
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Tier 1: FTS only
|
|
153
|
+
rows = await this.table
|
|
154
|
+
.search(query, 'text')
|
|
155
|
+
.limit(limit)
|
|
156
|
+
.toArray();
|
|
157
|
+
}
|
|
158
|
+
let results = rows
|
|
159
|
+
.filter((r) => r.id !== '__seed__' && r.entity_id !== '')
|
|
160
|
+
.map((r, i) => ({
|
|
161
|
+
repoName: r.repo,
|
|
162
|
+
entityType: r.entity_type,
|
|
163
|
+
entityId: r.entity_id,
|
|
164
|
+
score: r._distance != null ? 1 / (1 + r._distance) : 1 - i * 0.01,
|
|
165
|
+
}));
|
|
166
|
+
if (options.repos && options.repos.length > 0) {
|
|
167
|
+
results = results.filter(r => options.repos.includes(r.repoName));
|
|
168
|
+
}
|
|
169
|
+
return results.slice(0, limit);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// FTS index may not be built yet — return empty
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get the last time a repo's entities were indexed.
|
|
178
|
+
*/
|
|
179
|
+
getLastIndexedTime(repoName) {
|
|
180
|
+
if (!existsSync(this.lastIndexedPath))
|
|
181
|
+
return undefined;
|
|
182
|
+
try {
|
|
183
|
+
const data = JSON.parse(readFileSync(this.lastIndexedPath, 'utf-8'));
|
|
184
|
+
return data[repoName];
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Record the current time as the last index time for a repo.
|
|
192
|
+
*/
|
|
193
|
+
setLastIndexedTime(repoName) {
|
|
194
|
+
mkdirSync(this.dbPath, { recursive: true });
|
|
195
|
+
let data = {};
|
|
196
|
+
if (existsSync(this.lastIndexedPath)) {
|
|
197
|
+
try {
|
|
198
|
+
data = JSON.parse(readFileSync(this.lastIndexedPath, 'utf-8'));
|
|
199
|
+
}
|
|
200
|
+
catch { /* ignore */ }
|
|
201
|
+
}
|
|
202
|
+
data[repoName] = new Date().toISOString();
|
|
203
|
+
writeFileSync(this.lastIndexedPath, JSON.stringify(data, null, 2) + '\n');
|
|
204
|
+
}
|
|
205
|
+
/** Whether Voyage AI embeddings are enabled (Tier 2). */
|
|
206
|
+
get hasEmbeddings() {
|
|
207
|
+
return !!this.voyageApiKey;
|
|
208
|
+
}
|
|
209
|
+
// ─── Private: Voyage AI ──────────────────────────────────────────────────────
|
|
210
|
+
async generateEmbedding(text) {
|
|
211
|
+
const results = await this.generateEmbeddingsBatch([text]);
|
|
212
|
+
return results[0] ?? new Array(VECTOR_DIM).fill(0);
|
|
213
|
+
}
|
|
214
|
+
async generateEmbeddingsBatch(texts) {
|
|
215
|
+
// Voyage supports up to 128 inputs per request
|
|
216
|
+
const BATCH_SIZE = 128;
|
|
217
|
+
const all = [];
|
|
218
|
+
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
|
219
|
+
const batch = texts.slice(i, i + BATCH_SIZE);
|
|
220
|
+
const response = await fetch(VOYAGE_API_URL, {
|
|
221
|
+
method: 'POST',
|
|
222
|
+
headers: {
|
|
223
|
+
'Authorization': `Bearer ${this.voyageApiKey}`,
|
|
224
|
+
'Content-Type': 'application/json',
|
|
225
|
+
},
|
|
226
|
+
body: JSON.stringify({ model: VOYAGE_MODEL, input: batch }),
|
|
227
|
+
});
|
|
228
|
+
if (!response.ok) {
|
|
229
|
+
const body = await response.text();
|
|
230
|
+
throw new Error(`Voyage AI error ${response.status}: ${body}`);
|
|
231
|
+
}
|
|
232
|
+
const json = await response.json();
|
|
233
|
+
all.push(...json.data.map(d => d.embedding));
|
|
234
|
+
}
|
|
235
|
+
return all;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
239
|
+
/**
|
|
240
|
+
* Build a text representation of an entity for FTS/embedding.
|
|
241
|
+
* Combines entity type, key frontmatter fields, and markdown body.
|
|
242
|
+
* Exported for testing.
|
|
243
|
+
*/
|
|
244
|
+
export function buildEntityText(entity) {
|
|
245
|
+
const parts = [];
|
|
246
|
+
// Entity type and ID as context
|
|
247
|
+
parts.push(`${entity.entityType}: ${entity.data.name || entity.id}`);
|
|
248
|
+
// Key frontmatter fields (skip system fields and empty values)
|
|
249
|
+
const systemFields = new Set([
|
|
250
|
+
'entity_type', 'entity_id', 'created_at', 'updated_at',
|
|
251
|
+
'created_by', 'updated_by', 'visibility', 'restricted_to',
|
|
252
|
+
'sensitive_fields',
|
|
253
|
+
]);
|
|
254
|
+
for (const [key, value] of Object.entries(entity.data)) {
|
|
255
|
+
if (systemFields.has(key) || value == null || value === '')
|
|
256
|
+
continue;
|
|
257
|
+
if (Array.isArray(value)) {
|
|
258
|
+
if (value.length > 0)
|
|
259
|
+
parts.push(`${key}: ${value.join(', ')}`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
parts.push(`${key}: ${String(value)}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Markdown body
|
|
266
|
+
if (entity.document.content) {
|
|
267
|
+
// Strip markdown syntax for cleaner FTS/embedding input
|
|
268
|
+
const plainText = entity.document.content
|
|
269
|
+
.replace(/^#{1,6}\s+/gm, '') // headings
|
|
270
|
+
.replace(/\*\*(.+?)\*\*/g, '$1') // bold
|
|
271
|
+
.replace(/\*(.+?)\*/g, '$1') // italic
|
|
272
|
+
.replace(/`(.+?)`/g, '$1') // inline code
|
|
273
|
+
.replace(/\[\[(.+?)\]\]/g, '$1') // wikilinks
|
|
274
|
+
.trim();
|
|
275
|
+
if (plainText)
|
|
276
|
+
parts.push(plainText);
|
|
277
|
+
}
|
|
278
|
+
return parts.join('\n');
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=vector-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-service.js","sourceRoot":"","sources":["../../src/services/vector-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version checking utility
|
|
3
|
+
*
|
|
4
|
+
* Provides lightweight version checking that can be called by commands
|
|
5
|
+
* to notify users of available updates.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get current CLI version from package.json
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCurrentVersion(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Check if an update is available (non-blocking, cached)
|
|
13
|
+
* Returns update info or null if up-to-date or check failed
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkForUpdate(): Promise<{
|
|
16
|
+
current: string;
|
|
17
|
+
latest: string;
|
|
18
|
+
} | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Print update notification to console (if update available)
|
|
21
|
+
* Call this in commands to notify users about updates
|
|
22
|
+
*/
|
|
23
|
+
export declare function notifyUpdateAvailable(): Promise<void>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version checking utility
|
|
3
|
+
*
|
|
4
|
+
* Provides lightweight version checking that can be called by commands
|
|
5
|
+
* to notify users of available updates.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import { dirname } from 'path';
|
|
13
|
+
const CACHE_PATH = join(homedir(), '.studiograph', 'version-cache.json');
|
|
14
|
+
const CACHE_TTL_HOURS = 24; // Check once per day
|
|
15
|
+
/**
|
|
16
|
+
* Get current CLI version from package.json
|
|
17
|
+
*/
|
|
18
|
+
export function getCurrentVersion() {
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
const pkgPath = join(__dirname, '../../package.json');
|
|
22
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
23
|
+
return pkg.version;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fetch latest version from npm (with caching)
|
|
27
|
+
*/
|
|
28
|
+
async function getLatestVersion() {
|
|
29
|
+
// Check cache first
|
|
30
|
+
if (existsSync(CACHE_PATH)) {
|
|
31
|
+
try {
|
|
32
|
+
const cache = JSON.parse(readFileSync(CACHE_PATH, 'utf-8'));
|
|
33
|
+
const cacheAge = Date.now() - new Date(cache.lastChecked).getTime();
|
|
34
|
+
const cacheAgeHours = cacheAge / (1000 * 60 * 60);
|
|
35
|
+
if (cacheAgeHours < CACHE_TTL_HOURS) {
|
|
36
|
+
return cache.latestVersion;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Cache read failed, continue to fetch
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Fetch from npm
|
|
44
|
+
try {
|
|
45
|
+
const result = execSync('npm view studiograph version', {
|
|
46
|
+
encoding: 'utf-8',
|
|
47
|
+
stdio: 'pipe',
|
|
48
|
+
timeout: 5000, // 5 second timeout
|
|
49
|
+
});
|
|
50
|
+
const latest = result.trim();
|
|
51
|
+
// Update cache
|
|
52
|
+
const cacheDir = dirname(CACHE_PATH);
|
|
53
|
+
if (!existsSync(cacheDir)) {
|
|
54
|
+
mkdirSync(cacheDir, { recursive: true, mode: 0o755 });
|
|
55
|
+
}
|
|
56
|
+
const cache = {
|
|
57
|
+
lastChecked: new Date().toISOString(),
|
|
58
|
+
latestVersion: latest,
|
|
59
|
+
};
|
|
60
|
+
writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2), 'utf-8');
|
|
61
|
+
return latest;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Network error or timeout - return null
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Compare two semantic versions
|
|
70
|
+
* Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
71
|
+
*/
|
|
72
|
+
function compareVersions(v1, v2) {
|
|
73
|
+
const parts1 = v1.split('.').map(Number);
|
|
74
|
+
const parts2 = v2.split('.').map(Number);
|
|
75
|
+
for (let i = 0; i < 3; i++) {
|
|
76
|
+
if (parts1[i] > parts2[i])
|
|
77
|
+
return 1;
|
|
78
|
+
if (parts1[i] < parts2[i])
|
|
79
|
+
return -1;
|
|
80
|
+
}
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if an update is available (non-blocking, cached)
|
|
85
|
+
* Returns update info or null if up-to-date or check failed
|
|
86
|
+
*/
|
|
87
|
+
export async function checkForUpdate() {
|
|
88
|
+
const current = getCurrentVersion();
|
|
89
|
+
const latest = await getLatestVersion();
|
|
90
|
+
if (!latest)
|
|
91
|
+
return null;
|
|
92
|
+
const comparison = compareVersions(latest, current);
|
|
93
|
+
if (comparison > 0) {
|
|
94
|
+
return { current, latest };
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Print update notification to console (if update available)
|
|
100
|
+
* Call this in commands to notify users about updates
|
|
101
|
+
*/
|
|
102
|
+
export async function notifyUpdateAvailable() {
|
|
103
|
+
try {
|
|
104
|
+
const update = await checkForUpdate();
|
|
105
|
+
if (update) {
|
|
106
|
+
console.log('');
|
|
107
|
+
console.log(`\x1b[33m⚠️ Update available: v${update.current} → v${update.latest}\x1b[0m`);
|
|
108
|
+
console.log(`\x1b[2m Run: studiograph update\x1b[0m`);
|
|
109
|
+
console.log('');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Silently fail - don't block command execution
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=version-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-checker.js","sourceRoot":"","sources":["../../src/utils/version-checker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "studiograph",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Team-based AI agent platform with Git-backed knowledge graphs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,10 +12,11 @@
|
|
|
12
12
|
"README.md"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
15
|
+
"build": "node --max-old-space-size=8192 node_modules/typescript/bin/tsc && mkdir -p dist/agent/prompts dist/agent/skills/bundled && cp src/agent/prompts/*.md dist/agent/prompts/ && cp src/agent/skills/bundled/*.md dist/agent/skills/bundled/",
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
17
|
"test": "vitest",
|
|
18
|
-
"lint": "eslint src --ext .ts"
|
|
18
|
+
"lint": "eslint src --ext .ts",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
19
20
|
},
|
|
20
21
|
"keywords": [
|
|
21
22
|
"ai",
|
|
@@ -25,22 +26,25 @@
|
|
|
25
26
|
"markdown"
|
|
26
27
|
],
|
|
27
28
|
"author": "Studiograph",
|
|
28
|
-
"license": "
|
|
29
|
+
"license": "Apache-2.0",
|
|
29
30
|
"dependencies": {
|
|
30
31
|
"@anthropic-ai/sdk": "^0.20.0",
|
|
31
32
|
"@aws-sdk/client-s3": "^3.500.0",
|
|
32
33
|
"@clack/prompts": "^0.7.0",
|
|
33
|
-
"@fastify/cors": "^
|
|
34
|
+
"@fastify/cors": "^10.1.0",
|
|
35
|
+
"@lancedb/lancedb": "^0.26.2",
|
|
34
36
|
"@mariozechner/pi-agent-core": "latest",
|
|
35
37
|
"@mariozechner/pi-ai": "latest",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
36
39
|
"@octokit/rest": "^20.0.0",
|
|
37
40
|
"commander": "^11.1.0",
|
|
38
41
|
"csv-parse": "^5.6.0",
|
|
39
42
|
"csv-stringify": "^6.6.0",
|
|
40
|
-
"fastify": "^
|
|
43
|
+
"fastify": "^5.7.4",
|
|
41
44
|
"glob": "^10.3.10",
|
|
42
45
|
"gray-matter": "^4.0.3",
|
|
43
46
|
"js-yaml": "^4.1.1",
|
|
47
|
+
"picocolors": "^1.1.1",
|
|
44
48
|
"zod": "^3.22.4"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|