@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.
Files changed (39) hide show
  1. package/README.md +248 -0
  2. package/dist/migrations/001_initial.sql +92 -0
  3. package/dist/migrations/002_indexes.sql +14 -0
  4. package/dist/plugin/ContextInjector.d.ts +27 -0
  5. package/dist/plugin/ContextInjector.js +131 -0
  6. package/dist/plugin/ContextInjector.js.map +1 -0
  7. package/dist/plugin/MemoryService.d.ts +49 -0
  8. package/dist/plugin/MemoryService.js +228 -0
  9. package/dist/plugin/MemoryService.js.map +1 -0
  10. package/dist/plugin/Migrate.d.ts +13 -0
  11. package/dist/plugin/Migrate.js +54 -0
  12. package/dist/plugin/Migrate.js.map +1 -0
  13. package/dist/plugin/Reflector.d.ts +30 -0
  14. package/dist/plugin/Reflector.js +117 -0
  15. package/dist/plugin/Reflector.js.map +1 -0
  16. package/dist/plugin/Retrospective.d.ts +13 -0
  17. package/dist/plugin/Retrospective.js +77 -0
  18. package/dist/plugin/Retrospective.js.map +1 -0
  19. package/dist/plugin/Store.d.ts +14 -0
  20. package/dist/plugin/Store.js +36 -0
  21. package/dist/plugin/Store.js.map +1 -0
  22. package/dist/plugin/ToolCallObserver.d.ts +28 -0
  23. package/dist/plugin/ToolCallObserver.js +150 -0
  24. package/dist/plugin/ToolCallObserver.js.map +1 -0
  25. package/dist/plugin/index.d.ts +9 -0
  26. package/dist/plugin/index.js +340 -0
  27. package/dist/plugin/index.js.map +1 -0
  28. package/dist/plugin/redact.d.ts +1 -0
  29. package/dist/plugin/redact.js +12 -0
  30. package/dist/plugin/redact.js.map +1 -0
  31. package/dist/plugin/sqlite-adapter.d.ts +12 -0
  32. package/dist/plugin/sqlite-adapter.js +27 -0
  33. package/dist/plugin/sqlite-adapter.js.map +1 -0
  34. package/dist/plugin/uuid.d.ts +1 -0
  35. package/dist/plugin/uuid.js +51 -0
  36. package/dist/plugin/uuid.js.map +1 -0
  37. package/migrations/001_initial.sql +92 -0
  38. package/migrations/002_indexes.sql +14 -0
  39. 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
+ }