@jmtrin/opencode-kevin 0.1.1
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 +248 -0
- package/dist/migrations/001_initial.sql +92 -0
- package/dist/migrations/002_indexes.sql +14 -0
- package/dist/plugin/ContextInjector.d.ts +27 -0
- package/dist/plugin/ContextInjector.js +131 -0
- package/dist/plugin/ContextInjector.js.map +1 -0
- package/dist/plugin/MemoryService.d.ts +49 -0
- package/dist/plugin/MemoryService.js +228 -0
- package/dist/plugin/MemoryService.js.map +1 -0
- package/dist/plugin/Migrate.d.ts +13 -0
- package/dist/plugin/Migrate.js +54 -0
- package/dist/plugin/Migrate.js.map +1 -0
- package/dist/plugin/Reflector.d.ts +30 -0
- package/dist/plugin/Reflector.js +117 -0
- package/dist/plugin/Reflector.js.map +1 -0
- package/dist/plugin/Retrospective.d.ts +13 -0
- package/dist/plugin/Retrospective.js +77 -0
- package/dist/plugin/Retrospective.js.map +1 -0
- package/dist/plugin/Store.d.ts +14 -0
- package/dist/plugin/Store.js +36 -0
- package/dist/plugin/Store.js.map +1 -0
- package/dist/plugin/ToolCallObserver.d.ts +28 -0
- package/dist/plugin/ToolCallObserver.js +150 -0
- package/dist/plugin/ToolCallObserver.js.map +1 -0
- package/dist/plugin/index.d.ts +9 -0
- package/dist/plugin/index.js +340 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/redact.d.ts +1 -0
- package/dist/plugin/redact.js +12 -0
- package/dist/plugin/redact.js.map +1 -0
- package/dist/plugin/sqlite-adapter.d.ts +12 -0
- package/dist/plugin/sqlite-adapter.js +27 -0
- package/dist/plugin/sqlite-adapter.js.map +1 -0
- package/dist/plugin/uuid.d.ts +1 -0
- package/dist/plugin/uuid.js +51 -0
- package/dist/plugin/uuid.js.map +1 -0
- package/migrations/001_initial.sql +92 -0
- package/migrations/002_indexes.sql +14 -0
- package/package.json +50 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- Kevin 0.1.0 — Schema inicial
|
|
3
|
+
-- ============================================================
|
|
4
|
+
|
|
5
|
+
-- Tabla de versiones para migraciones
|
|
6
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
7
|
+
version TEXT PRIMARY KEY,
|
|
8
|
+
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
-- ============================================================
|
|
12
|
+
-- memories: lecciones aprendidas
|
|
13
|
+
-- ============================================================
|
|
14
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
type TEXT NOT NULL CHECK(type IN ('error', 'pattern', 'decision', 'context')),
|
|
17
|
+
content TEXT NOT NULL,
|
|
18
|
+
scope TEXT NOT NULL DEFAULT 'project' CHECK(scope IN ('project', 'session')),
|
|
19
|
+
relevance_score REAL DEFAULT 0.5,
|
|
20
|
+
source_tool TEXT,
|
|
21
|
+
source_session TEXT,
|
|
22
|
+
metadata TEXT,
|
|
23
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
24
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
25
|
+
expires_at TEXT
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_memories_relevance ON memories(relevance_score DESC);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at);
|
|
32
|
+
|
|
33
|
+
-- FTS5: búsqueda full-text con remoción de diacríticos (mejor para español)
|
|
34
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
35
|
+
content,
|
|
36
|
+
content='memories',
|
|
37
|
+
tokenize='unicode61 remove_diacritics 1'
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
-- Triggers para mantener FTS5 sincronizado (FTS5 external-content se indexa por rowid)
|
|
41
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
42
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.rowid, new.content);
|
|
43
|
+
END;
|
|
44
|
+
|
|
45
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
46
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.rowid, old.content);
|
|
47
|
+
END;
|
|
48
|
+
|
|
49
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
50
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.rowid, old.content);
|
|
51
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.rowid, new.content);
|
|
52
|
+
END;
|
|
53
|
+
|
|
54
|
+
-- ============================================================
|
|
55
|
+
-- tool_calls: observación de tool calls del agente
|
|
56
|
+
-- ============================================================
|
|
57
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
58
|
+
id TEXT PRIMARY KEY,
|
|
59
|
+
session_id TEXT NOT NULL,
|
|
60
|
+
ts TEXT NOT NULL DEFAULT (datetime('now')),
|
|
61
|
+
tool TEXT NOT NULL,
|
|
62
|
+
args_summary TEXT,
|
|
63
|
+
success INTEGER NOT NULL CHECK(success IN (0,1)),
|
|
64
|
+
duration_ms INTEGER,
|
|
65
|
+
agent TEXT,
|
|
66
|
+
error_type TEXT,
|
|
67
|
+
metadata TEXT
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_session ON tool_calls(session_id);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_tool ON tool_calls(tool);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_ts ON tool_calls(ts);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_success ON tool_calls(success);
|
|
74
|
+
|
|
75
|
+
-- ============================================================
|
|
76
|
+
-- retrospectives: resúmenes de sesión
|
|
77
|
+
-- ============================================================
|
|
78
|
+
CREATE TABLE IF NOT EXISTS retrospectives (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
session_id TEXT NOT NULL,
|
|
81
|
+
ts TEXT NOT NULL DEFAULT (datetime('now')),
|
|
82
|
+
failure_count INTEGER DEFAULT 0,
|
|
83
|
+
success_count INTEGER DEFAULT 0,
|
|
84
|
+
lessons_count INTEGER DEFAULT 0,
|
|
85
|
+
file_path TEXT,
|
|
86
|
+
metadata TEXT
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
-- ============================================================
|
|
90
|
+
-- Seed: versión inicial
|
|
91
|
+
-- ============================================================
|
|
92
|
+
INSERT OR IGNORE INTO schema_version (version) VALUES ('001');
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- Kevin 0.1.1 — Migration 002: indexes adicionales
|
|
3
|
+
-- ============================================================
|
|
4
|
+
|
|
5
|
+
-- F#29: uniqueness on retrospectives.session_id
|
|
6
|
+
-- Prevents duplicate retrospective rows under concurrent session.idle events.
|
|
7
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_retrospectives_session
|
|
8
|
+
ON retrospectives(session_id);
|
|
9
|
+
|
|
10
|
+
-- F#31: index on memories.expires_at
|
|
11
|
+
-- Every query/queryRelevant/loadAll filters WHERE (expires_at IS NULL OR expires_at > datetime('now')).
|
|
12
|
+
-- Without this index the filter is a linear scan on large tables.
|
|
13
|
+
CREATE INDEX IF NOT EXISTS idx_memories_expires
|
|
14
|
+
ON memories(expires_at);
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jmtrin/opencode-kevin",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Kevin — Observa y aprende: capa de aprendizaje para OpenCode",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/plugin/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/plugin/index.js",
|
|
10
|
+
"types": "./dist/plugin/index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/plugin",
|
|
15
|
+
"dist/migrations",
|
|
16
|
+
"migrations"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc --outDir dist && node scripts/copy-migrations.mjs",
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:unit": "vitest run tests/unit",
|
|
23
|
+
"test:integration": "vitest run tests/integration",
|
|
24
|
+
"test:e2e": "vitest run tests/e2e",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"lint": "biome check .",
|
|
27
|
+
"format": "biome format --write .",
|
|
28
|
+
"verify": "node --import tsx scripts/verify-install.ts"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@opencode-ai/plugin": "^1.17.6",
|
|
32
|
+
"better-sqlite3": "^12.11.0",
|
|
33
|
+
"zod": "^3.23.8"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@biomejs/biome": "^1.9.4",
|
|
37
|
+
"@types/better-sqlite3": "^7.6.12",
|
|
38
|
+
"@types/node": "^22.10.0",
|
|
39
|
+
"tsx": "^4.19.0",
|
|
40
|
+
"typescript": "^5.7.2",
|
|
41
|
+
"vitest": "^2.1.8"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20.0.0"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"license": "MIT"
|
|
50
|
+
}
|