cmp-standards 2.0.0 → 2.4.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 +171 -101
- package/dist/cli/index.js +239 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +203 -39
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/cloud.d.ts +174 -0
- package/dist/db/cloud.d.ts.map +1 -0
- package/dist/db/cloud.js +241 -0
- package/dist/db/cloud.js.map +1 -0
- package/dist/db/errors.d.ts +76 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +135 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/turso-client.d.ts +178 -0
- package/dist/db/turso-client.d.ts.map +1 -0
- package/dist/db/turso-client.js +455 -0
- package/dist/db/turso-client.js.map +1 -0
- package/dist/db/upstash-client.d.ts +161 -0
- package/dist/db/upstash-client.d.ts.map +1 -0
- package/dist/db/upstash-client.js +325 -0
- package/dist/db/upstash-client.js.map +1 -0
- package/dist/hooks/cloud-post-tool-use.d.ts +30 -0
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-post-tool-use.js +116 -0
- package/dist/hooks/cloud-post-tool-use.js.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts +19 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.js +149 -0
- package/dist/hooks/cloud-pre-tool-use.js.map +1 -0
- package/dist/hooks/cloud-session-start.d.ts +20 -0
- package/dist/hooks/cloud-session-start.d.ts.map +1 -0
- package/dist/hooks/cloud-session-start.js +130 -0
- package/dist/hooks/cloud-session-start.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -1
- package/dist/hooks/memory-checkpoint.js +12 -20
- package/dist/hooks/memory-checkpoint.js.map +1 -1
- package/dist/hooks/pre-tool-use.d.ts +2 -8
- package/dist/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/hooks/pre-tool-use.js +7 -106
- package/dist/hooks/pre-tool-use.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +15 -6
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +223 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/tracking.d.ts +644 -0
- package/dist/schema/tracking.d.ts.map +1 -0
- package/dist/schema/tracking.js +204 -0
- package/dist/schema/tracking.js.map +1 -0
- package/dist/services/ProjectScaffold.d.ts.map +1 -1
- package/dist/services/ProjectScaffold.js +33 -5
- package/dist/services/ProjectScaffold.js.map +1 -1
- package/dist/services/TaskTracker.d.ts +1 -1
- package/dist/services/TaskTracker.d.ts.map +1 -1
- package/dist/services/TaskTracker.js +4 -8
- package/dist/services/TaskTracker.js.map +1 -1
- package/dist/services/WorkPlanManager.d.ts +1 -1
- package/dist/services/WorkPlanManager.d.ts.map +1 -1
- package/dist/services/WorkPlanManager.js +8 -14
- package/dist/services/WorkPlanManager.js.map +1 -1
- package/dist/services/auto-inject.d.ts +1 -0
- package/dist/services/auto-inject.d.ts.map +1 -1
- package/dist/services/auto-inject.js +12 -17
- package/dist/services/auto-inject.js.map +1 -1
- package/dist/services/cross-project-sync.d.ts +2 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -1
- package/dist/services/cross-project-sync.js +26 -21
- package/dist/services/cross-project-sync.js.map +1 -1
- package/dist/services/memory-consolidation.d.ts.map +1 -1
- package/dist/services/memory-consolidation.js +30 -27
- package/dist/services/memory-consolidation.js.map +1 -1
- package/dist/utils/env-loader.d.ts +41 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +78 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/git.d.ts +52 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +267 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/paths.d.ts +39 -5
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +88 -7
- package/dist/utils/paths.js.map +1 -1
- package/package.json +9 -4
- package/standards/README.md +50 -0
- package/standards/experts/expert-routing.md +215 -0
- package/standards/general/code-quality.md +86 -0
- package/standards/general/memory-usage.md +205 -0
- package/standards/general/sync-workflow.md +235 -0
- package/standards/general/workflow.md +82 -0
- package/standards/hooks/mandatory-tracking.md +446 -0
- package/standards/infrastructure/cloud-database.md +287 -0
- package/standards/mcp/server-design.md +243 -0
- package/standards/mcp/tool-patterns.md +354 -0
- package/standards/skills/skill-structure.md +286 -0
- package/standards/skills/workflow-design.md +323 -0
- package/standards/tools/tool-design.md +297 -0
- package/templates/claude-settings.json +72 -0
- package/templates/memory-config.json +2 -28
- package/templates/skills/continue.md +205 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cliente Turso (SQLite Edge)
|
|
3
|
+
* @description Cliente serverless para Turso - base de datos principal para tareas, mejoras y memorias
|
|
4
|
+
*/
|
|
5
|
+
import { createClient } from '@libsql/client';
|
|
6
|
+
import { ulid } from 'ulid';
|
|
7
|
+
import { TursoError, NotFoundError, ConfigError, safeJsonParse } from './errors.js';
|
|
8
|
+
// Allowed orderBy columns (prevent SQL injection)
|
|
9
|
+
const ALLOWED_ORDER_COLUMNS = ['created_at', 'updated_at', 'id', 'type', 'status'];
|
|
10
|
+
const ALLOWED_ORDER_DIRS = ['ASC', 'DESC'];
|
|
11
|
+
// Safe JSON paths for ordering (whitelist to prevent injection)
|
|
12
|
+
const ALLOWED_JSON_PATHS = ['$.lastActivityAt', '$.priority', '$.createdAt', '$.detectedAt'];
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Client
|
|
15
|
+
// =============================================================================
|
|
16
|
+
let client = null;
|
|
17
|
+
/**
|
|
18
|
+
* Inicializar cliente Turso
|
|
19
|
+
* @throws {ConfigError} If credentials are not configured
|
|
20
|
+
* @throws {TursoError} If connection fails
|
|
21
|
+
*/
|
|
22
|
+
export function initTurso(config) {
|
|
23
|
+
if (client)
|
|
24
|
+
return client;
|
|
25
|
+
const url = config?.url || process.env.TURSO_DATABASE_URL;
|
|
26
|
+
const authToken = config?.authToken || process.env.TURSO_AUTH_TOKEN;
|
|
27
|
+
if (!url || !authToken) {
|
|
28
|
+
const missing = [];
|
|
29
|
+
if (!url)
|
|
30
|
+
missing.push('TURSO_DATABASE_URL');
|
|
31
|
+
if (!authToken)
|
|
32
|
+
missing.push('TURSO_AUTH_TOKEN');
|
|
33
|
+
throw new ConfigError('Turso credentials not configured', missing);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
client = createClient({ url, authToken });
|
|
37
|
+
return client;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new TursoError('Failed to initialize Turso client', error, 'init');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Obtener cliente (inicializa si es necesario)
|
|
45
|
+
*/
|
|
46
|
+
export function getTurso() {
|
|
47
|
+
if (!client) {
|
|
48
|
+
return initTurso();
|
|
49
|
+
}
|
|
50
|
+
return client;
|
|
51
|
+
}
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// Schema Setup
|
|
54
|
+
// =============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Crear tablas en Turso
|
|
57
|
+
* @throws {TursoError} If schema creation fails
|
|
58
|
+
*/
|
|
59
|
+
export async function setupTursoSchema() {
|
|
60
|
+
try {
|
|
61
|
+
const db = getTurso();
|
|
62
|
+
// Tabla principal de items (similar a DEV_Items en MySQL)
|
|
63
|
+
await db.execute(`
|
|
64
|
+
CREATE TABLE IF NOT EXISTS items (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
type TEXT NOT NULL,
|
|
67
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
68
|
+
system TEXT NOT NULL,
|
|
69
|
+
content TEXT NOT NULL,
|
|
70
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
71
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
72
|
+
)
|
|
73
|
+
`);
|
|
74
|
+
// Índices para queries comunes
|
|
75
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_type ON items(type)`);
|
|
76
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_status ON items(status)`);
|
|
77
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_system ON items(system)`);
|
|
78
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_type_status ON items(type, status)`);
|
|
79
|
+
console.log('✓ Turso schema initialized');
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new TursoError('Failed to setup Turso schema', error, 'init');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// =============================================================================
|
|
86
|
+
// CRUD Operations
|
|
87
|
+
// =============================================================================
|
|
88
|
+
/**
|
|
89
|
+
* Crear un nuevo item
|
|
90
|
+
* @throws {TursoError} If insert fails
|
|
91
|
+
*/
|
|
92
|
+
export async function create(type, system, content, status = 'pending') {
|
|
93
|
+
try {
|
|
94
|
+
const db = getTurso();
|
|
95
|
+
const id = ulid();
|
|
96
|
+
const now = new Date().toISOString();
|
|
97
|
+
await db.execute({
|
|
98
|
+
sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
|
|
99
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
100
|
+
args: [id, type, status, system, JSON.stringify(content), now, now]
|
|
101
|
+
});
|
|
102
|
+
return id;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new TursoError(`Failed to create ${type} in ${system}`, error, 'create');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Obtener item por ID
|
|
110
|
+
* @throws {TursoError} If query fails
|
|
111
|
+
*/
|
|
112
|
+
export async function get(id) {
|
|
113
|
+
try {
|
|
114
|
+
const db = getTurso();
|
|
115
|
+
const result = await db.execute({
|
|
116
|
+
sql: `SELECT * FROM items WHERE id = ?`,
|
|
117
|
+
args: [id]
|
|
118
|
+
});
|
|
119
|
+
if (result.rows.length === 0)
|
|
120
|
+
return null;
|
|
121
|
+
const row = result.rows[0];
|
|
122
|
+
return {
|
|
123
|
+
id: row.id,
|
|
124
|
+
type: row.type,
|
|
125
|
+
status: row.status,
|
|
126
|
+
system: row.system,
|
|
127
|
+
content: safeJsonParse(row.content, `item ${id}`)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (error instanceof TursoError)
|
|
132
|
+
throw error;
|
|
133
|
+
throw new TursoError(`Failed to get item ${id}`, error, 'read');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Actualizar item
|
|
138
|
+
* @throws {NotFoundError} If item not found
|
|
139
|
+
* @throws {TursoError} If update fails
|
|
140
|
+
*/
|
|
141
|
+
export async function update(id, updates) {
|
|
142
|
+
try {
|
|
143
|
+
const db = getTurso();
|
|
144
|
+
const now = new Date().toISOString();
|
|
145
|
+
const existing = await get(id);
|
|
146
|
+
if (!existing)
|
|
147
|
+
throw new NotFoundError('Item', id);
|
|
148
|
+
const existingContent = existing.content;
|
|
149
|
+
const updateContent = updates.content;
|
|
150
|
+
const newContent = updateContent
|
|
151
|
+
? { ...existingContent, ...updateContent }
|
|
152
|
+
: existingContent;
|
|
153
|
+
await db.execute({
|
|
154
|
+
sql: `UPDATE items SET status = ?, content = ?, updated_at = ? WHERE id = ?`,
|
|
155
|
+
args: [
|
|
156
|
+
updates.status || existing.status,
|
|
157
|
+
JSON.stringify(newContent),
|
|
158
|
+
now,
|
|
159
|
+
id
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error instanceof NotFoundError)
|
|
165
|
+
throw error;
|
|
166
|
+
if (error instanceof TursoError)
|
|
167
|
+
throw error;
|
|
168
|
+
throw new TursoError(`Failed to update item ${id}`, error, 'update');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Buscar items
|
|
173
|
+
* @throws {TursoError} If query fails
|
|
174
|
+
*/
|
|
175
|
+
export async function query(options) {
|
|
176
|
+
try {
|
|
177
|
+
const db = getTurso();
|
|
178
|
+
let sql = 'SELECT * FROM items WHERE 1=1';
|
|
179
|
+
const args = [];
|
|
180
|
+
if (options.system) {
|
|
181
|
+
sql += ' AND system = ?';
|
|
182
|
+
args.push(options.system);
|
|
183
|
+
}
|
|
184
|
+
if (options.type) {
|
|
185
|
+
sql += ' AND type = ?';
|
|
186
|
+
args.push(options.type);
|
|
187
|
+
}
|
|
188
|
+
if (options.status) {
|
|
189
|
+
sql += ' AND status = ?';
|
|
190
|
+
args.push(options.status);
|
|
191
|
+
}
|
|
192
|
+
// Safe ORDER BY - only allow whitelisted columns/paths (prevents SQL injection)
|
|
193
|
+
const orderDir = ALLOWED_ORDER_DIRS.includes(options.orderDir)
|
|
194
|
+
? options.orderDir
|
|
195
|
+
: 'DESC';
|
|
196
|
+
if (options.jsonOrderBy && ALLOWED_JSON_PATHS.includes(options.jsonOrderBy)) {
|
|
197
|
+
// Safe JSON extraction ordering
|
|
198
|
+
sql += ` ORDER BY json_extract(content, '${options.jsonOrderBy}') ${orderDir}`;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Regular column ordering
|
|
202
|
+
const orderCol = ALLOWED_ORDER_COLUMNS.includes(options.orderBy)
|
|
203
|
+
? options.orderBy
|
|
204
|
+
: 'updated_at';
|
|
205
|
+
sql += ` ORDER BY ${orderCol} ${orderDir}`;
|
|
206
|
+
}
|
|
207
|
+
// Safe LIMIT - cap at 1000 to prevent excessive queries
|
|
208
|
+
const limit = Math.min(Math.max(1, options.limit || 50), 1000);
|
|
209
|
+
sql += ' LIMIT ?';
|
|
210
|
+
args.push(limit);
|
|
211
|
+
const result = await db.execute({ sql, args });
|
|
212
|
+
return result.rows.map(row => ({
|
|
213
|
+
id: row.id,
|
|
214
|
+
type: row.type,
|
|
215
|
+
status: row.status,
|
|
216
|
+
system: row.system,
|
|
217
|
+
content: safeJsonParse(row.content, 'query result')
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
if (error instanceof TursoError)
|
|
222
|
+
throw error;
|
|
223
|
+
throw new TursoError('Failed to query items', error, 'query');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Eliminar item
|
|
228
|
+
* @throws {TursoError} If delete fails
|
|
229
|
+
*/
|
|
230
|
+
export async function remove(id) {
|
|
231
|
+
try {
|
|
232
|
+
const db = getTurso();
|
|
233
|
+
await db.execute({
|
|
234
|
+
sql: `DELETE FROM items WHERE id = ?`,
|
|
235
|
+
args: [id]
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
throw new TursoError(`Failed to delete item ${id}`, error, 'delete');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// =============================================================================
|
|
243
|
+
// Task Operations
|
|
244
|
+
// =============================================================================
|
|
245
|
+
/**
|
|
246
|
+
* Crear nueva tarea
|
|
247
|
+
*/
|
|
248
|
+
export async function createTask(system, sessionId, options) {
|
|
249
|
+
const now = new Date().toISOString();
|
|
250
|
+
const content = {
|
|
251
|
+
title: options.title,
|
|
252
|
+
description: options.description,
|
|
253
|
+
userRequest: options.userRequest,
|
|
254
|
+
plan: options.plan,
|
|
255
|
+
currentStep: 0,
|
|
256
|
+
domain: options.domain,
|
|
257
|
+
files: [],
|
|
258
|
+
sessionId,
|
|
259
|
+
agentId: options.agentId,
|
|
260
|
+
startedAt: now,
|
|
261
|
+
lastActivityAt: now,
|
|
262
|
+
improvements: [],
|
|
263
|
+
lessons: []
|
|
264
|
+
};
|
|
265
|
+
return create('task', system, content, 'in_progress');
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Obtener tareas activas
|
|
269
|
+
*/
|
|
270
|
+
export async function getActiveTasks(system) {
|
|
271
|
+
const results = await query({
|
|
272
|
+
system,
|
|
273
|
+
type: 'task',
|
|
274
|
+
status: 'in_progress',
|
|
275
|
+
jsonOrderBy: '$.lastActivityAt',
|
|
276
|
+
orderDir: 'DESC'
|
|
277
|
+
});
|
|
278
|
+
return results.map(r => ({ id: r.id, content: r.content }));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Actualizar progreso de tarea
|
|
282
|
+
* @throws {NotFoundError} If task not found
|
|
283
|
+
* @throws {TursoError} If update fails
|
|
284
|
+
*/
|
|
285
|
+
export async function updateTaskProgress(taskId, updates) {
|
|
286
|
+
const existing = await get(taskId);
|
|
287
|
+
if (!existing)
|
|
288
|
+
throw new NotFoundError('Task', taskId);
|
|
289
|
+
await update(taskId, {
|
|
290
|
+
content: {
|
|
291
|
+
...existing.content,
|
|
292
|
+
...updates,
|
|
293
|
+
lastActivityAt: new Date().toISOString()
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Completar tarea
|
|
299
|
+
* @throws {NotFoundError} If task not found
|
|
300
|
+
* @throws {TursoError} If update fails
|
|
301
|
+
*/
|
|
302
|
+
export async function completeTask(taskId, result) {
|
|
303
|
+
const existing = await get(taskId);
|
|
304
|
+
if (!existing)
|
|
305
|
+
throw new NotFoundError('Task', taskId);
|
|
306
|
+
const now = new Date().toISOString();
|
|
307
|
+
// Crear mejoras como items separados
|
|
308
|
+
for (const imp of result.improvements) {
|
|
309
|
+
await create('improvement', existing.system, {
|
|
310
|
+
area: imp.area,
|
|
311
|
+
title: imp.title,
|
|
312
|
+
description: imp.description,
|
|
313
|
+
detectedInTask: taskId,
|
|
314
|
+
detectedBy: existing.content.agentId || 'unknown',
|
|
315
|
+
detectedAt: now,
|
|
316
|
+
priority: imp.priority,
|
|
317
|
+
effort: imp.effort
|
|
318
|
+
}, 'pending');
|
|
319
|
+
}
|
|
320
|
+
// Actualizar tarea
|
|
321
|
+
await update(taskId, {
|
|
322
|
+
status: 'completed',
|
|
323
|
+
content: {
|
|
324
|
+
...existing.content,
|
|
325
|
+
result: result.result,
|
|
326
|
+
resultNotes: result.resultNotes,
|
|
327
|
+
completedAt: now,
|
|
328
|
+
improvements: result.improvements.map((imp, i) => ({
|
|
329
|
+
id: `imp_${i}`,
|
|
330
|
+
...imp,
|
|
331
|
+
detectedAt: now
|
|
332
|
+
})),
|
|
333
|
+
lessons: result.lessons || []
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
// =============================================================================
|
|
338
|
+
// Improvement Operations
|
|
339
|
+
// =============================================================================
|
|
340
|
+
/**
|
|
341
|
+
* Obtener mejoras pendientes por área
|
|
342
|
+
*/
|
|
343
|
+
export async function getPendingImprovements(system, area) {
|
|
344
|
+
const results = await query({
|
|
345
|
+
system,
|
|
346
|
+
type: 'improvement',
|
|
347
|
+
status: 'pending'
|
|
348
|
+
});
|
|
349
|
+
const filtered = area
|
|
350
|
+
? results.filter(r => r.content.area === area)
|
|
351
|
+
: results;
|
|
352
|
+
return filtered.map(r => ({ id: r.id, content: r.content }));
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Marcar mejora como implementada
|
|
356
|
+
*/
|
|
357
|
+
export async function markImprovementDone(improvementId, implementedInTask) {
|
|
358
|
+
await update(improvementId, {
|
|
359
|
+
status: 'implemented',
|
|
360
|
+
content: {
|
|
361
|
+
implementedAt: new Date().toISOString(),
|
|
362
|
+
implementedInTask
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Crear mejora standalone (fuera de una tarea)
|
|
368
|
+
*/
|
|
369
|
+
export async function createImprovement(system, improvement) {
|
|
370
|
+
const now = new Date().toISOString();
|
|
371
|
+
const id = ulid();
|
|
372
|
+
const content = {
|
|
373
|
+
area: improvement.area,
|
|
374
|
+
title: improvement.title,
|
|
375
|
+
description: improvement.description,
|
|
376
|
+
priority: improvement.priority,
|
|
377
|
+
effort: improvement.effort,
|
|
378
|
+
detectedAt: now,
|
|
379
|
+
detectedBy: 'manual',
|
|
380
|
+
detectedInTask: improvement.taskId || 'standalone'
|
|
381
|
+
};
|
|
382
|
+
await create('improvement', system, content, 'pending');
|
|
383
|
+
return id;
|
|
384
|
+
}
|
|
385
|
+
// =============================================================================
|
|
386
|
+
// Session Operations
|
|
387
|
+
// =============================================================================
|
|
388
|
+
/**
|
|
389
|
+
* Crear nueva sesión
|
|
390
|
+
*/
|
|
391
|
+
export async function createSession(system, options) {
|
|
392
|
+
const now = new Date().toISOString();
|
|
393
|
+
const sessionId = ulid();
|
|
394
|
+
const content = {
|
|
395
|
+
sessionId,
|
|
396
|
+
userId: options.userId,
|
|
397
|
+
system,
|
|
398
|
+
projectPath: options.projectPath,
|
|
399
|
+
ide: options.ide,
|
|
400
|
+
startedAt: now,
|
|
401
|
+
lastActivityAt: now,
|
|
402
|
+
toolCalls: 0,
|
|
403
|
+
tasksStarted: 0,
|
|
404
|
+
tasksCompleted: 0,
|
|
405
|
+
improvementsDetected: 0
|
|
406
|
+
};
|
|
407
|
+
await create('session', system, content, 'active');
|
|
408
|
+
return sessionId;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Actualizar actividad de sesión
|
|
412
|
+
*/
|
|
413
|
+
export async function updateSessionActivity(sessionId) {
|
|
414
|
+
const results = await query({
|
|
415
|
+
type: 'session',
|
|
416
|
+
status: 'active'
|
|
417
|
+
});
|
|
418
|
+
const session = results.find(r => r.content.sessionId === sessionId);
|
|
419
|
+
if (!session)
|
|
420
|
+
return;
|
|
421
|
+
await update(session.id, {
|
|
422
|
+
content: {
|
|
423
|
+
...session.content,
|
|
424
|
+
lastActivityAt: new Date().toISOString(),
|
|
425
|
+
toolCalls: session.content.toolCalls + 1
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
// =============================================================================
|
|
430
|
+
// Exports
|
|
431
|
+
// =============================================================================
|
|
432
|
+
export const turso = {
|
|
433
|
+
init: initTurso,
|
|
434
|
+
getClient: getTurso,
|
|
435
|
+
setup: setupTursoSchema,
|
|
436
|
+
create,
|
|
437
|
+
getItem: get,
|
|
438
|
+
update,
|
|
439
|
+
query,
|
|
440
|
+
remove,
|
|
441
|
+
// Tasks
|
|
442
|
+
createTask,
|
|
443
|
+
getActiveTasks,
|
|
444
|
+
updateTaskProgress,
|
|
445
|
+
completeTask,
|
|
446
|
+
// Improvements
|
|
447
|
+
createImprovement,
|
|
448
|
+
getPendingImprovements,
|
|
449
|
+
markImprovementDone,
|
|
450
|
+
// Sessions
|
|
451
|
+
createSession,
|
|
452
|
+
updateSessionActivity
|
|
453
|
+
};
|
|
454
|
+
export default turso;
|
|
455
|
+
//# sourceMappingURL=turso-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turso-client.js","sourceRoot":"","sources":["../../src/db/turso-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cliente Upstash (Redis + Vector)
|
|
3
|
+
* @description Cliente serverless para cache y búsqueda semántica
|
|
4
|
+
*/
|
|
5
|
+
import { Redis } from '@upstash/redis';
|
|
6
|
+
import { Index } from '@upstash/vector';
|
|
7
|
+
export interface UpstashConfig {
|
|
8
|
+
redis?: {
|
|
9
|
+
url: string;
|
|
10
|
+
token: string;
|
|
11
|
+
};
|
|
12
|
+
vector?: {
|
|
13
|
+
url: string;
|
|
14
|
+
token: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface CachedConfig {
|
|
18
|
+
system: string;
|
|
19
|
+
config: Record<string, unknown>;
|
|
20
|
+
cachedAt: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ActiveSession {
|
|
23
|
+
sessionId: string;
|
|
24
|
+
system: string;
|
|
25
|
+
startedAt: string;
|
|
26
|
+
lastActivityAt: string;
|
|
27
|
+
activeTaskId?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Inicializar cliente Redis
|
|
31
|
+
*/
|
|
32
|
+
export declare function initRedis(config?: UpstashConfig['redis']): Redis;
|
|
33
|
+
/**
|
|
34
|
+
* Obtener cliente Redis
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRedis(): Redis;
|
|
37
|
+
/**
|
|
38
|
+
* Cachear configuración de proyecto
|
|
39
|
+
*/
|
|
40
|
+
export declare function cacheConfig(system: string, config: Record<string, unknown>): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Obtener configuración cacheada
|
|
43
|
+
*/
|
|
44
|
+
export declare function getCachedConfig(system: string): Promise<CachedConfig | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Invalidar cache de configuración
|
|
47
|
+
*/
|
|
48
|
+
export declare function invalidateConfig(system: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Registrar sesión activa
|
|
51
|
+
*/
|
|
52
|
+
export declare function registerSession(session: ActiveSession): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Obtener sesión activa
|
|
55
|
+
*/
|
|
56
|
+
export declare function getActiveSession(sessionId: string): Promise<ActiveSession | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Actualizar última actividad de sesión
|
|
59
|
+
*/
|
|
60
|
+
export declare function updateSessionActivity(sessionId: string, updates?: Partial<ActiveSession>): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Obtener todas las sesiones activas de un sistema
|
|
63
|
+
*/
|
|
64
|
+
export declare function getSystemSessions(system: string): Promise<ActiveSession[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Eliminar sesión
|
|
67
|
+
*/
|
|
68
|
+
export declare function removeSession(sessionId: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Check rate limit
|
|
71
|
+
*/
|
|
72
|
+
export declare function checkRateLimit(key: string, limit: number, windowSeconds: number): Promise<{
|
|
73
|
+
allowed: boolean;
|
|
74
|
+
remaining: number;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Set value with TTL
|
|
78
|
+
*/
|
|
79
|
+
export declare function setCache<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get cached value
|
|
82
|
+
*/
|
|
83
|
+
export declare function getCache<T>(key: string): Promise<T | null>;
|
|
84
|
+
/**
|
|
85
|
+
* Delete cached value
|
|
86
|
+
*/
|
|
87
|
+
export declare function deleteCache(key: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Verificar conexión a Redis
|
|
90
|
+
*/
|
|
91
|
+
export declare function healthCheck(): Promise<{
|
|
92
|
+
ok: boolean;
|
|
93
|
+
latency: number;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Inicializar cliente Vector
|
|
97
|
+
*/
|
|
98
|
+
export declare function initVector(config?: UpstashConfig['vector']): Index;
|
|
99
|
+
/**
|
|
100
|
+
* Obtener cliente Vector
|
|
101
|
+
*/
|
|
102
|
+
export declare function getVector(): Index;
|
|
103
|
+
/**
|
|
104
|
+
* Insertar/actualizar vector con embedding automático
|
|
105
|
+
*/
|
|
106
|
+
export declare function upsertVector(id: string, data: string, metadata: Record<string, unknown>): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Buscar por similitud semántica
|
|
109
|
+
*/
|
|
110
|
+
export declare function searchVectors(query: string, options?: {
|
|
111
|
+
topK?: number;
|
|
112
|
+
filter?: string;
|
|
113
|
+
includeMetadata?: boolean;
|
|
114
|
+
includeData?: boolean;
|
|
115
|
+
}): Promise<Array<{
|
|
116
|
+
id: string;
|
|
117
|
+
score: number;
|
|
118
|
+
metadata?: Record<string, unknown>;
|
|
119
|
+
data?: string;
|
|
120
|
+
}>>;
|
|
121
|
+
/**
|
|
122
|
+
* Eliminar vector
|
|
123
|
+
*/
|
|
124
|
+
export declare function deleteVector(id: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Eliminar múltiples vectores
|
|
127
|
+
*/
|
|
128
|
+
export declare function deleteVectors(ids: string[]): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Health check para Vector
|
|
131
|
+
*/
|
|
132
|
+
export declare function vectorHealthCheck(): Promise<{
|
|
133
|
+
ok: boolean;
|
|
134
|
+
message: string;
|
|
135
|
+
}>;
|
|
136
|
+
export declare const upstash: {
|
|
137
|
+
initRedis: typeof initRedis;
|
|
138
|
+
getRedis: typeof getRedis;
|
|
139
|
+
healthCheck: typeof healthCheck;
|
|
140
|
+
cacheConfig: typeof cacheConfig;
|
|
141
|
+
getCachedConfig: typeof getCachedConfig;
|
|
142
|
+
invalidateConfig: typeof invalidateConfig;
|
|
143
|
+
registerSession: typeof registerSession;
|
|
144
|
+
getActiveSession: typeof getActiveSession;
|
|
145
|
+
updateSessionActivity: typeof updateSessionActivity;
|
|
146
|
+
getSystemSessions: typeof getSystemSessions;
|
|
147
|
+
removeSession: typeof removeSession;
|
|
148
|
+
checkRateLimit: typeof checkRateLimit;
|
|
149
|
+
setCache: typeof setCache;
|
|
150
|
+
getCache: typeof getCache;
|
|
151
|
+
deleteCache: typeof deleteCache;
|
|
152
|
+
initVector: typeof initVector;
|
|
153
|
+
getVector: typeof getVector;
|
|
154
|
+
upsertVector: typeof upsertVector;
|
|
155
|
+
searchVectors: typeof searchVectors;
|
|
156
|
+
deleteVector: typeof deleteVector;
|
|
157
|
+
deleteVectors: typeof deleteVectors;
|
|
158
|
+
vectorHealthCheck: typeof vectorHealthCheck;
|
|
159
|
+
};
|
|
160
|
+
export default upstash;
|
|
161
|
+
//# sourceMappingURL=upstash-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstash-client.d.ts","sourceRoot":"","sources":["../../src/db/upstash-client.ts"],"names":[],"mappings":"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"}
|