@kb-labs/adapters 0.5.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.
Files changed (276) hide show
  1. package/.cursorrules +32 -0
  2. package/.github/workflows/ci.yml +13 -0
  3. package/.github/workflows/deploy.yml +28 -0
  4. package/.github/workflows/docker-build.yml +25 -0
  5. package/.github/workflows/drift-check.yml +10 -0
  6. package/.github/workflows/profiles-validate.yml +16 -0
  7. package/.github/workflows/release.yml +8 -0
  8. package/.kb/devkit/agents/devkit-maintainer/context.globs +15 -0
  9. package/.kb/devkit/agents/devkit-maintainer/permissions.yml +17 -0
  10. package/.kb/devkit/agents/devkit-maintainer/prompt.md +28 -0
  11. package/.kb/devkit/agents/devkit-maintainer/runbook.md +31 -0
  12. package/.kb/devkit/agents/docs-crafter/prompt.md +24 -0
  13. package/.kb/devkit/agents/docs-crafter/runbook.md +18 -0
  14. package/.kb/devkit/agents/release-manager/context.globs +7 -0
  15. package/.kb/devkit/agents/release-manager/prompt.md +27 -0
  16. package/.kb/devkit/agents/release-manager/runbook.md +17 -0
  17. package/.kb/devkit/agents/test-generator/context.globs +7 -0
  18. package/.kb/devkit/agents/test-generator/prompt.md +27 -0
  19. package/.kb/devkit/agents/test-generator/runbook.md +18 -0
  20. package/CONTRIBUTING.md +90 -0
  21. package/IMPLEMENTATION_COMPLETE.md +416 -0
  22. package/LICENSE +186 -0
  23. package/README-TEMPLATE.md +179 -0
  24. package/README.md +306 -0
  25. package/docs/DOCUMENTATION.md +74 -0
  26. package/docs/adr/0000-template.md +49 -0
  27. package/docs/adr/0001-architecture-and-repository-layout.md +33 -0
  28. package/docs/adr/0002-plugins-and-extensibility.md +46 -0
  29. package/docs/adr/0003-package-and-module-boundaries.md +37 -0
  30. package/docs/adr/0004-versioning-and-release-policy.md +38 -0
  31. package/docs/adr/0005-use-devkit-for-shared-tooling.md +48 -0
  32. package/docs/adr/0006-adopt-devkit-sync.md +47 -0
  33. package/docs/adr/0007-drift-kit-check.md +72 -0
  34. package/docs/adr/0008-devkit-sync-wrapper-strategy.md +67 -0
  35. package/docs/naming-convention.md +272 -0
  36. package/eslint.config.js +27 -0
  37. package/kb-labs.config.json +5 -0
  38. package/package.json +84 -0
  39. package/package.json.bin +25 -0
  40. package/package.json.lib +30 -0
  41. package/packages/adapters-analytics-duckdb/package.json +54 -0
  42. package/packages/adapters-analytics-duckdb/scripts/migrate-from-jsonl.mjs +253 -0
  43. package/packages/adapters-analytics-duckdb/src/index.ts +380 -0
  44. package/packages/adapters-analytics-duckdb/src/manifest.ts +36 -0
  45. package/packages/adapters-analytics-duckdb/src/schema.ts +161 -0
  46. package/packages/adapters-analytics-duckdb/tsconfig.build.json +15 -0
  47. package/packages/adapters-analytics-duckdb/tsconfig.json +9 -0
  48. package/packages/adapters-analytics-duckdb/tsup.config.ts +9 -0
  49. package/packages/adapters-analytics-file/README.md +32 -0
  50. package/packages/adapters-analytics-file/eslint.config.js +27 -0
  51. package/packages/adapters-analytics-file/package.json +50 -0
  52. package/packages/adapters-analytics-file/src/__tests__/daily-stats.spec.ts +287 -0
  53. package/packages/adapters-analytics-file/src/__tests__/scoped-analytics.test.ts +233 -0
  54. package/packages/adapters-analytics-file/src/index.test.ts +214 -0
  55. package/packages/adapters-analytics-file/src/index.ts +830 -0
  56. package/packages/adapters-analytics-file/src/manifest.ts +45 -0
  57. package/packages/adapters-analytics-file/tsconfig.build.json +15 -0
  58. package/packages/adapters-analytics-file/tsconfig.json +9 -0
  59. package/packages/adapters-analytics-file/tsup.config.ts +9 -0
  60. package/packages/adapters-analytics-sqlite/package.json +55 -0
  61. package/packages/adapters-analytics-sqlite/scripts/migrate-from-jsonl.mjs +194 -0
  62. package/packages/adapters-analytics-sqlite/src/index.ts +460 -0
  63. package/packages/adapters-analytics-sqlite/src/manifest.ts +41 -0
  64. package/packages/adapters-analytics-sqlite/tsconfig.build.json +15 -0
  65. package/packages/adapters-analytics-sqlite/tsconfig.json +9 -0
  66. package/packages/adapters-analytics-sqlite/tsup.config.ts +9 -0
  67. package/packages/adapters-environment-docker/README.md +28 -0
  68. package/packages/adapters-environment-docker/eslint.config.js +5 -0
  69. package/packages/adapters-environment-docker/package.json +49 -0
  70. package/packages/adapters-environment-docker/src/index.test.ts +138 -0
  71. package/packages/adapters-environment-docker/src/index.ts +439 -0
  72. package/packages/adapters-environment-docker/src/manifest.ts +65 -0
  73. package/packages/adapters-environment-docker/tsconfig.build.json +15 -0
  74. package/packages/adapters-environment-docker/tsconfig.json +16 -0
  75. package/packages/adapters-environment-docker/tsup.config.ts +9 -0
  76. package/packages/adapters-eventbus-cache/README.md +242 -0
  77. package/packages/adapters-eventbus-cache/eslint.config.js +27 -0
  78. package/packages/adapters-eventbus-cache/package.json +46 -0
  79. package/packages/adapters-eventbus-cache/src/index.test.ts +235 -0
  80. package/packages/adapters-eventbus-cache/src/index.ts +215 -0
  81. package/packages/adapters-eventbus-cache/src/manifest.ts +50 -0
  82. package/packages/adapters-eventbus-cache/src/types.ts +58 -0
  83. package/packages/adapters-eventbus-cache/tsconfig.build.json +15 -0
  84. package/packages/adapters-eventbus-cache/tsconfig.json +9 -0
  85. package/packages/adapters-eventbus-cache/tsup.config.ts +9 -0
  86. package/packages/adapters-fs/README.md +171 -0
  87. package/packages/adapters-fs/allowed.txt +1 -0
  88. package/packages/adapters-fs/conflict.txt +1 -0
  89. package/packages/adapters-fs/dest.txt +1 -0
  90. package/packages/adapters-fs/eslint.config.js +27 -0
  91. package/packages/adapters-fs/exists.txt +1 -0
  92. package/packages/adapters-fs/not-allowed.txt +1 -0
  93. package/packages/adapters-fs/other.txt +1 -0
  94. package/packages/adapters-fs/package.json +55 -0
  95. package/packages/adapters-fs/public/file1.txt +1 -0
  96. package/packages/adapters-fs/public/file2.txt +1 -0
  97. package/packages/adapters-fs/secret.txt +1 -0
  98. package/packages/adapters-fs/secrets/key.txt +1 -0
  99. package/packages/adapters-fs/src/index.test.ts +243 -0
  100. package/packages/adapters-fs/src/index.ts +258 -0
  101. package/packages/adapters-fs/src/manifest.ts +35 -0
  102. package/packages/adapters-fs/src/secure-storage.test.ts +380 -0
  103. package/packages/adapters-fs/src/secure-storage.ts +268 -0
  104. package/packages/adapters-fs/test.json +1 -0
  105. package/packages/adapters-fs/test.txt +1 -0
  106. package/packages/adapters-fs/test.xyz +1 -0
  107. package/packages/adapters-fs/test1.txt +1 -0
  108. package/packages/adapters-fs/test2.txt +1 -0
  109. package/packages/adapters-fs/tsconfig.build.json +15 -0
  110. package/packages/adapters-fs/tsconfig.json +9 -0
  111. package/packages/adapters-fs/tsup.config.ts +8 -0
  112. package/packages/adapters-fs/vitest.config.ts +19 -0
  113. package/packages/adapters-log-ringbuffer/README.md +228 -0
  114. package/packages/adapters-log-ringbuffer/eslint.config.js +27 -0
  115. package/packages/adapters-log-ringbuffer/package.json +47 -0
  116. package/packages/adapters-log-ringbuffer/src/__tests__/ring-buffer.test.ts +450 -0
  117. package/packages/adapters-log-ringbuffer/src/index.ts +212 -0
  118. package/packages/adapters-log-ringbuffer/src/manifest.ts +30 -0
  119. package/packages/adapters-log-ringbuffer/tsconfig.build.json +15 -0
  120. package/packages/adapters-log-ringbuffer/tsconfig.json +9 -0
  121. package/packages/adapters-log-ringbuffer/tsup.config.ts +9 -0
  122. package/packages/adapters-log-ringbuffer/vitest.config.ts +14 -0
  123. package/packages/adapters-log-sqlite/README.md +396 -0
  124. package/packages/adapters-log-sqlite/eslint.config.js +27 -0
  125. package/packages/adapters-log-sqlite/package.json +49 -0
  126. package/packages/adapters-log-sqlite/src/__tests__/log-persistence.test.ts +718 -0
  127. package/packages/adapters-log-sqlite/src/index.ts +1068 -0
  128. package/packages/adapters-log-sqlite/src/manifest.ts +36 -0
  129. package/packages/adapters-log-sqlite/src/schema.sql +46 -0
  130. package/packages/adapters-log-sqlite/tsconfig.build.json +15 -0
  131. package/packages/adapters-log-sqlite/tsconfig.json +9 -0
  132. package/packages/adapters-log-sqlite/tsup.config.ts +9 -0
  133. package/packages/adapters-log-sqlite/vitest.config.ts +15 -0
  134. package/packages/adapters-mongodb/README.md +147 -0
  135. package/packages/adapters-mongodb/eslint.config.js +27 -0
  136. package/packages/adapters-mongodb/package.json +53 -0
  137. package/packages/adapters-mongodb/src/index.ts +428 -0
  138. package/packages/adapters-mongodb/src/manifest.ts +45 -0
  139. package/packages/adapters-mongodb/src/secure-document.ts +231 -0
  140. package/packages/adapters-mongodb/tsconfig.build.json +15 -0
  141. package/packages/adapters-mongodb/tsconfig.json +9 -0
  142. package/packages/adapters-mongodb/tsup.config.ts +8 -0
  143. package/packages/adapters-openai/README.md +151 -0
  144. package/packages/adapters-openai/embeddings.ts +37 -0
  145. package/packages/adapters-openai/eslint.config.js +26 -0
  146. package/packages/adapters-openai/index.ts +22 -0
  147. package/packages/adapters-openai/package.json +57 -0
  148. package/packages/adapters-openai/src/embeddings-manifest.ts +45 -0
  149. package/packages/adapters-openai/src/embeddings.ts +104 -0
  150. package/packages/adapters-openai/src/index.ts +13 -0
  151. package/packages/adapters-openai/src/llm.ts +304 -0
  152. package/packages/adapters-openai/src/manifest.ts +47 -0
  153. package/packages/adapters-openai/tsconfig.build.json +15 -0
  154. package/packages/adapters-openai/tsconfig.json +9 -0
  155. package/packages/adapters-openai/tsup.config.ts +8 -0
  156. package/packages/adapters-pino/README.md +152 -0
  157. package/packages/adapters-pino/eslint.config.js +27 -0
  158. package/packages/adapters-pino/package.json +49 -0
  159. package/packages/adapters-pino/src/index.test.ts +44 -0
  160. package/packages/adapters-pino/src/index.ts +322 -0
  161. package/packages/adapters-pino/src/log-ring-buffer.ts +142 -0
  162. package/packages/adapters-pino/src/manifest.ts +49 -0
  163. package/packages/adapters-pino/tsconfig.build.json +15 -0
  164. package/packages/adapters-pino/tsconfig.json +9 -0
  165. package/packages/adapters-pino/tsup.config.ts +9 -0
  166. package/packages/adapters-pino-http/README.md +141 -0
  167. package/packages/adapters-pino-http/eslint.config.js +27 -0
  168. package/packages/adapters-pino-http/package.json +46 -0
  169. package/packages/adapters-pino-http/src/index.ts +229 -0
  170. package/packages/adapters-pino-http/tsconfig.build.json +15 -0
  171. package/packages/adapters-pino-http/tsconfig.json +9 -0
  172. package/packages/adapters-pino-http/tsup.config.ts +9 -0
  173. package/packages/adapters-qdrant/README.md +166 -0
  174. package/packages/adapters-qdrant/eslint.config.js +27 -0
  175. package/packages/adapters-qdrant/package.json +49 -0
  176. package/packages/adapters-qdrant/src/index.ts +490 -0
  177. package/packages/adapters-qdrant/src/manifest.ts +54 -0
  178. package/packages/adapters-qdrant/src/retry.ts +204 -0
  179. package/packages/adapters-qdrant/tsconfig.build.json +15 -0
  180. package/packages/adapters-qdrant/tsconfig.json +9 -0
  181. package/packages/adapters-qdrant/tsup.config.ts +9 -0
  182. package/packages/adapters-redis/README.md +159 -0
  183. package/packages/adapters-redis/eslint.config.js +27 -0
  184. package/packages/adapters-redis/package.json +49 -0
  185. package/packages/adapters-redis/src/index.ts +164 -0
  186. package/packages/adapters-redis/src/manifest.ts +49 -0
  187. package/packages/adapters-redis/tsconfig.build.json +15 -0
  188. package/packages/adapters-redis/tsconfig.json +9 -0
  189. package/packages/adapters-redis/tsup.config.ts +9 -0
  190. package/packages/adapters-snapshot-localfs/README.md +10 -0
  191. package/packages/adapters-snapshot-localfs/eslint.config.js +2 -0
  192. package/packages/adapters-snapshot-localfs/package.json +46 -0
  193. package/packages/adapters-snapshot-localfs/src/index.test.ts +40 -0
  194. package/packages/adapters-snapshot-localfs/src/index.ts +292 -0
  195. package/packages/adapters-snapshot-localfs/src/manifest.ts +32 -0
  196. package/packages/adapters-snapshot-localfs/tsconfig.build.json +15 -0
  197. package/packages/adapters-snapshot-localfs/tsconfig.json +16 -0
  198. package/packages/adapters-snapshot-localfs/tsup.config.ts +11 -0
  199. package/packages/adapters-sqlite/README.md +163 -0
  200. package/packages/adapters-sqlite/eslint.config.js +27 -0
  201. package/packages/adapters-sqlite/package.json +54 -0
  202. package/packages/adapters-sqlite/src/index.test.ts +245 -0
  203. package/packages/adapters-sqlite/src/index.ts +382 -0
  204. package/packages/adapters-sqlite/src/manifest.ts +47 -0
  205. package/packages/adapters-sqlite/src/secure-sql.test.ts +290 -0
  206. package/packages/adapters-sqlite/src/secure-sql.ts +281 -0
  207. package/packages/adapters-sqlite/tsconfig.build.json +15 -0
  208. package/packages/adapters-sqlite/tsconfig.json +9 -0
  209. package/packages/adapters-sqlite/tsup.config.ts +8 -0
  210. package/packages/adapters-sqlite/vitest.config.ts +19 -0
  211. package/packages/adapters-transport/README.md +170 -0
  212. package/packages/adapters-transport/eslint.config.js +27 -0
  213. package/packages/adapters-transport/package.json +49 -0
  214. package/packages/adapters-transport/src/__tests__/unix-socket-server.test.ts +550 -0
  215. package/packages/adapters-transport/src/index.ts +101 -0
  216. package/packages/adapters-transport/src/ipc-transport.ts +228 -0
  217. package/packages/adapters-transport/src/transport.ts +224 -0
  218. package/packages/adapters-transport/src/types.ts +92 -0
  219. package/packages/adapters-transport/src/unix-socket-server.ts +193 -0
  220. package/packages/adapters-transport/src/unix-socket-transport.ts +280 -0
  221. package/packages/adapters-transport/tsconfig.build.json +15 -0
  222. package/packages/adapters-transport/tsconfig.json +9 -0
  223. package/packages/adapters-transport/tsup.config.ts +9 -0
  224. package/packages/adapters-vibeproxy/README.md +159 -0
  225. package/packages/adapters-vibeproxy/eslint.config.js +27 -0
  226. package/packages/adapters-vibeproxy/package.json +51 -0
  227. package/packages/adapters-vibeproxy/src/index.ts +13 -0
  228. package/packages/adapters-vibeproxy/src/llm.ts +437 -0
  229. package/packages/adapters-vibeproxy/src/manifest.ts +51 -0
  230. package/packages/adapters-vibeproxy/tsconfig.build.json +15 -0
  231. package/packages/adapters-vibeproxy/tsconfig.json +9 -0
  232. package/packages/adapters-vibeproxy/tsup.config.ts +8 -0
  233. package/packages/adapters-workspace-agent/package.json +46 -0
  234. package/packages/adapters-workspace-agent/src/__tests__/adapter.test.ts +212 -0
  235. package/packages/adapters-workspace-agent/src/index.ts +220 -0
  236. package/packages/adapters-workspace-agent/src/manifest.ts +36 -0
  237. package/packages/adapters-workspace-agent/tsconfig.build.json +15 -0
  238. package/packages/adapters-workspace-agent/tsconfig.json +16 -0
  239. package/packages/adapters-workspace-agent/tsup.config.ts +11 -0
  240. package/packages/adapters-workspace-localfs/README.md +9 -0
  241. package/packages/adapters-workspace-localfs/eslint.config.js +2 -0
  242. package/packages/adapters-workspace-localfs/package.json +46 -0
  243. package/packages/adapters-workspace-localfs/src/index.test.ts +27 -0
  244. package/packages/adapters-workspace-localfs/src/index.ts +172 -0
  245. package/packages/adapters-workspace-localfs/src/manifest.ts +32 -0
  246. package/packages/adapters-workspace-localfs/tsconfig.build.json +15 -0
  247. package/packages/adapters-workspace-localfs/tsconfig.json +16 -0
  248. package/packages/adapters-workspace-localfs/tsup.config.ts +11 -0
  249. package/packages/adapters-workspace-worktree/README.md +9 -0
  250. package/packages/adapters-workspace-worktree/eslint.config.js +2 -0
  251. package/packages/adapters-workspace-worktree/package.json +46 -0
  252. package/packages/adapters-workspace-worktree/src/index.test.ts +38 -0
  253. package/packages/adapters-workspace-worktree/src/index.ts +245 -0
  254. package/packages/adapters-workspace-worktree/src/manifest.ts +38 -0
  255. package/packages/adapters-workspace-worktree/tsconfig.build.json +15 -0
  256. package/packages/adapters-workspace-worktree/tsconfig.json +16 -0
  257. package/packages/adapters-workspace-worktree/tsup.config.ts +11 -0
  258. package/pnpm-workspace.yaml +2800 -0
  259. package/prettierrc.json +1 -0
  260. package/scripts/devkit-sync.mjs +37 -0
  261. package/scripts/hooks/post-push +9 -0
  262. package/scripts/hooks/pre-commit +9 -0
  263. package/scripts/hooks/pre-push +9 -0
  264. package/test-integration.ts +242 -0
  265. package/test.txt +1 -0
  266. package/tsconfig.base.json +6 -0
  267. package/tsconfig.build.json +15 -0
  268. package/tsconfig.json +9 -0
  269. package/tsconfig.paths.json +26 -0
  270. package/tsconfig.tools.json +17 -0
  271. package/tsup.config.bin.ts +34 -0
  272. package/tsup.config.cli.ts +41 -0
  273. package/tsup.config.dual.ts +46 -0
  274. package/tsup.config.ts +36 -0
  275. package/tsup.external.json +103 -0
  276. package/vitest.config.ts +2 -0
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'tsup';
2
+ import nodePreset from '@kb-labs/devkit/tsup/node';
3
+
4
+ export default defineConfig({
5
+ ...nodePreset,
6
+ tsconfig: 'tsconfig.build.json',
7
+ entry: ['src/index.ts', 'src/manifest.ts'],
8
+ dts: true,
9
+ });
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ environment: 'node',
7
+ include: ['src/**/*.test.ts'],
8
+ coverage: {
9
+ provider: 'v8',
10
+ reporter: ['text', 'json', 'html'],
11
+ exclude: ['node_modules/', 'dist/', '**/*.test.ts'],
12
+ },
13
+ },
14
+ });
@@ -0,0 +1,396 @@
1
+ # @kb-labs/adapters-log-sqlite
2
+
3
+ > Part of [KB Labs](https://github.com/KirillBaranov/kb-labs) ecosystem. Works exclusively within KB Labs platform.
4
+
5
+ SQLite persistence adapter for KB Labs logs. Provides long-term storage, cross-process log aggregation, and full-text search.
6
+
7
+ ## Features
8
+
9
+ - ✅ **Persistent storage** - Logs survive restarts
10
+ - ✅ **Cross-process aggregation** - All processes write to shared database
11
+ - ✅ **Full-text search** - SQLite FTS5 for fast message search
12
+ - ✅ **Batch writes** - High performance with configurable batching
13
+ - ✅ **Advanced queries** - Filter by level, source, timestamp, pagination
14
+ - ✅ **Retention policies** - Delete old logs automatically
15
+ - ✅ **Transaction support** - ACID guarantees for data integrity
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ pnpm add @kb-labs/adapters-log-sqlite
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ### Basic Usage
26
+
27
+ ```typescript
28
+ import { createAdapter as createPersistence } from '@kb-labs/adapters-log-sqlite';
29
+ import { createAdapter as createDB } from '@kb-labs/adapters-sqlite';
30
+
31
+ // Create database
32
+ const db = createDB({ filename: '.kb/data/kb.db' });
33
+
34
+ // Create persistence adapter
35
+ const persistence = await createPersistence({
36
+ database: db,
37
+ batchSize: 100,
38
+ flushInterval: 5000, // 5 seconds
39
+ });
40
+
41
+ // Write logs
42
+ await persistence.write({
43
+ timestamp: Date.now(),
44
+ level: 'info',
45
+ message: 'Server started',
46
+ fields: { port: 3000 },
47
+ source: 'rest-api',
48
+ });
49
+
50
+ // Query logs
51
+ const result = await persistence.query(
52
+ { level: 'error', from: Date.now() - 3600000 },
53
+ { limit: 50, offset: 0 }
54
+ );
55
+
56
+ console.log(result.logs);
57
+ console.log(result.total);
58
+ console.log(result.hasMore);
59
+
60
+ // Search logs
61
+ const searchResults = await persistence.search('authentication failed');
62
+
63
+ // Get single log
64
+ const log = await persistence.getById('log-id-123');
65
+
66
+ // Clean up
67
+ await persistence.close();
68
+ ```
69
+
70
+ ### With Platform Initialization
71
+
72
+ ```typescript
73
+ // .kb/kb.config.json
74
+ {
75
+ "adapters": {
76
+ "database": {
77
+ "sql": {
78
+ "module": "@kb-labs/adapters-sqlite",
79
+ "config": {
80
+ "filename": ".kb/data/kb.db"
81
+ }
82
+ }
83
+ },
84
+ "logPersistence": {
85
+ "module": "@kb-labs/adapters-log-sqlite",
86
+ "config": {
87
+ "database": "${platform.db}",
88
+ "tableName": "logs",
89
+ "batchSize": 100,
90
+ "flushInterval": 5000
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ```typescript
98
+ // In your application
99
+ const platform = await initPlatform(config);
100
+
101
+ // Persistence is available
102
+ await platform.logPersistence?.write(logRecord);
103
+
104
+ // Query logs
105
+ const logs = await platform.logPersistence?.query({ level: 'error' });
106
+ ```
107
+
108
+ ### REST API Integration
109
+
110
+ ```typescript
111
+ // Historical log queries
112
+ app.get('/logs', async (request, reply) => {
113
+ const { from, to, level, source, limit = 100, offset = 0 } = request.query;
114
+
115
+ const result = await platform.logPersistence!.query(
116
+ { from, to, level, source },
117
+ { limit, offset }
118
+ );
119
+
120
+ return result;
121
+ });
122
+
123
+ // Get single log
124
+ app.get('/logs/:id', async (request, reply) => {
125
+ const { id } = request.params;
126
+ const log = await platform.logPersistence!.getById(id);
127
+
128
+ if (!log) {
129
+ return reply.code(404).send({ error: 'Log not found' });
130
+ }
131
+
132
+ return log;
133
+ });
134
+
135
+ // Search logs
136
+ app.get('/logs/search', async (request, reply) => {
137
+ const { q, limit = 100, offset = 0 } = request.query;
138
+
139
+ const result = await platform.logPersistence!.search(q, { limit, offset });
140
+ return result;
141
+ });
142
+ ```
143
+
144
+ ## API Reference
145
+
146
+ ### `createAdapter(config)`
147
+
148
+ Factory function to create persistence adapter.
149
+
150
+ **Parameters:**
151
+ - `config.database` (ISQLDatabase, required) - Database adapter instance
152
+ - `config.tableName` (string, optional) - Table name (default: 'logs')
153
+ - `config.batchSize` (number, optional) - Batch size (default: 100)
154
+ - `config.flushInterval` (number, optional) - Flush interval in ms (default: 5000)
155
+
156
+ **Returns:** `Promise<ILogPersistence>`
157
+
158
+ ### `persistence.write(record)`
159
+
160
+ Write single log record.
161
+
162
+ **Parameters:**
163
+ - `record` (LogRecord) - Log record to persist
164
+
165
+ **Returns:** `Promise<void>`
166
+
167
+ ### `persistence.writeBatch(records)`
168
+
169
+ Write multiple log records in batch.
170
+
171
+ **Parameters:**
172
+ - `records` (LogRecord[]) - Array of log records
173
+
174
+ **Returns:** `Promise<void>`
175
+
176
+ ### `persistence.query(query, options)`
177
+
178
+ Query logs with filters and pagination.
179
+
180
+ **Parameters:**
181
+ - `query.level` (LogLevel, optional) - Filter by log level
182
+ - `query.source` (string, optional) - Filter by source
183
+ - `query.from` (number, optional) - Start timestamp (inclusive)
184
+ - `query.to` (number, optional) - End timestamp (inclusive)
185
+ - `options.limit` (number, optional) - Max results (default: 100)
186
+ - `options.offset` (number, optional) - Skip results (default: 0)
187
+ - `options.sortBy` ('timestamp' | 'level', optional) - Sort field (default: 'timestamp')
188
+ - `options.sortOrder` ('asc' | 'desc', optional) - Sort order (default: 'desc')
189
+
190
+ **Returns:** `Promise<{ logs, total, hasMore }>`
191
+
192
+ ### `persistence.getById(id)`
193
+
194
+ Get single log record by ID.
195
+
196
+ **Parameters:**
197
+ - `id` (string) - Log record ID
198
+
199
+ **Returns:** `Promise<LogRecord | null>`
200
+
201
+ ### `persistence.search(searchText, options)`
202
+
203
+ Full-text search on log messages.
204
+
205
+ **Parameters:**
206
+ - `searchText` (string) - Search query (FTS5 syntax)
207
+ - `options.limit` (number, optional) - Max results (default: 100)
208
+ - `options.offset` (number, optional) - Skip results (default: 0)
209
+
210
+ **Returns:** `Promise<{ logs, total, hasMore }>`
211
+
212
+ ### `persistence.deleteOlderThan(beforeTimestamp)`
213
+
214
+ Delete logs older than timestamp.
215
+
216
+ **Parameters:**
217
+ - `beforeTimestamp` (number) - Delete logs before this timestamp
218
+
219
+ **Returns:** `Promise<number>` - Number of deleted logs
220
+
221
+ ### `persistence.getStats()`
222
+
223
+ Get storage statistics.
224
+
225
+ **Returns:** `Promise<{ totalLogs, oldestTimestamp, newestTimestamp, sizeBytes }>`
226
+
227
+ ### `persistence.close()`
228
+
229
+ Close adapter and flush pending writes.
230
+
231
+ **Returns:** `Promise<void>`
232
+
233
+ ## Database Schema
234
+
235
+ ```sql
236
+ -- Logs table
237
+ CREATE TABLE logs (
238
+ id TEXT PRIMARY KEY,
239
+ timestamp INTEGER NOT NULL,
240
+ level TEXT NOT NULL,
241
+ message TEXT NOT NULL,
242
+ source TEXT NOT NULL,
243
+ fields TEXT, -- JSON
244
+ created_at INTEGER NOT NULL
245
+ );
246
+
247
+ -- Indexes
248
+ CREATE INDEX idx_logs_timestamp ON logs(timestamp DESC);
249
+ CREATE INDEX idx_logs_level ON logs(level);
250
+ CREATE INDEX idx_logs_source ON logs(source);
251
+ CREATE INDEX idx_logs_level_timestamp ON logs(level, timestamp DESC);
252
+ CREATE INDEX idx_logs_source_timestamp ON logs(source, timestamp DESC);
253
+
254
+ -- Full-text search
255
+ CREATE VIRTUAL TABLE logs_fts USING fts5(message, content=logs);
256
+ ```
257
+
258
+ ## Performance Characteristics
259
+
260
+ | Operation | Time Complexity | Notes |
261
+ |-----------|-----------------|-------|
262
+ | `write()` | O(1) amortized | Batched writes |
263
+ | `writeBatch()` | O(n) | Transaction-based |
264
+ | `query()` | O(log n + k) | Index scan + k results |
265
+ | `getById()` | O(log n) | Primary key lookup |
266
+ | `search()` | O(m) | FTS5 search, m = matches |
267
+ | `deleteOlderThan()` | O(d) | d = deleted rows |
268
+
269
+ **Batch write performance:**
270
+ - 100 logs/batch: ~10-20ms per batch
271
+ - 1000 logs/batch: ~50-100ms per batch
272
+ - Auto-flush: Every 5 seconds (configurable)
273
+
274
+ **Query performance:**
275
+ - Simple query: ~1-5ms (indexed)
276
+ - Full-text search: ~10-50ms (depends on corpus size)
277
+ - Pagination: O(1) with LIMIT/OFFSET
278
+
279
+ ## Configuration Examples
280
+
281
+ ### High-Traffic Server
282
+
283
+ ```typescript
284
+ const persistence = await createAdapter({
285
+ database: db,
286
+ batchSize: 500, // Larger batches
287
+ flushInterval: 10000, // 10 seconds
288
+ });
289
+ ```
290
+
291
+ ### Low-Traffic CLI
292
+
293
+ ```typescript
294
+ const persistence = await createAdapter({
295
+ database: db,
296
+ batchSize: 50, // Smaller batches
297
+ flushInterval: 2000, // 2 seconds
298
+ });
299
+ ```
300
+
301
+ ### Real-time Requirements
302
+
303
+ ```typescript
304
+ const persistence = await createAdapter({
305
+ database: db,
306
+ batchSize: 10, // Tiny batches
307
+ flushInterval: 100, // 100ms (fast flush)
308
+ });
309
+ ```
310
+
311
+ ## Retention Policy Example
312
+
313
+ ```typescript
314
+ // Delete logs older than 30 days
315
+ const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;
316
+ const deleted = await persistence.deleteOlderThan(thirtyDaysAgo);
317
+ console.log(`Deleted ${deleted} old logs`);
318
+
319
+ // Run as cron job (e.g., daily at 3am)
320
+ import { CronJob } from 'cron';
321
+
322
+ new CronJob('0 3 * * *', async () => {
323
+ const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;
324
+ const deleted = await persistence.deleteOlderThan(thirtyDaysAgo);
325
+ console.log(`Retention policy: deleted ${deleted} old logs`);
326
+ }).start();
327
+ ```
328
+
329
+ ## Cross-Process Log Aggregation
330
+
331
+ All processes write to the same SQLite database, enabling unified log queries:
332
+
333
+ ```typescript
334
+ // Process 1: REST API
335
+ await platform.logPersistence!.write({
336
+ timestamp: Date.now(),
337
+ level: 'info',
338
+ message: 'API request received',
339
+ source: 'rest-api',
340
+ fields: { endpoint: '/users' },
341
+ });
342
+
343
+ // Process 2: CLI
344
+ await platform.logPersistence!.write({
345
+ timestamp: Date.now(),
346
+ level: 'info',
347
+ message: 'Workflow started',
348
+ source: 'cli',
349
+ fields: { workflowId: 'wf-123' },
350
+ });
351
+
352
+ // Query from any process - sees logs from both
353
+ const allLogs = await platform.logPersistence!.query({});
354
+ // Returns logs from rest-api AND cli
355
+ ```
356
+
357
+ ## When to Use
358
+
359
+ ✅ **Use persistence when:**
360
+ - You need historical log queries (beyond 1 hour)
361
+ - You need cross-process log aggregation
362
+ - You need full-text search on log messages
363
+ - You need to implement retention policies
364
+ - You want logs to survive restarts
365
+
366
+ ❌ **Don't use persistence when:**
367
+ - You only need real-time streaming (use ring buffer)
368
+ - You need sub-millisecond latency (use ring buffer)
369
+ - Disk space is extremely constrained
370
+
371
+ ## Combining with Ring Buffer
372
+
373
+ For best results, use both adapters together:
374
+
375
+ ```typescript
376
+ // REST API config
377
+ {
378
+ "adapters": {
379
+ "logRingBuffer": {
380
+ "module": "@kb-labs/adapters-log-ringbuffer",
381
+ "config": { "maxSize": 1000, "ttl": 3600000 }
382
+ },
383
+ "logPersistence": {
384
+ "module": "@kb-labs/adapters-log-sqlite",
385
+ "config": { "database": "${platform.db}" }
386
+ }
387
+ }
388
+ }
389
+ ```
390
+
391
+ - **Ring buffer** → Real-time streaming (`/logs/stream`)
392
+ - **Persistence** → Historical queries (`/logs?from=...&to=...`)
393
+
394
+ ## License
395
+
396
+ [KB Public License v1.1](../../LICENSE) - KB Labs Team
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Standard ESLint configuration template
3
+ *
4
+ * This is the canonical template for all @kb-labs packages.
5
+ * DO NOT modify this file locally - it is synced from @kb-labs/devkit
6
+ *
7
+ * Customization guidelines:
8
+ * - DevKit preset already includes all standard ignores
9
+ * - Only add project-specific ignores if absolutely necessary
10
+ * - Document why custom ignores are needed
11
+ *
12
+ * @see https://github.com/kb-labs/devkit#eslint-configuration
13
+ */
14
+ import nodePreset from '@kb-labs/devkit/eslint/node.js';
15
+
16
+ export default [
17
+ ...nodePreset,
18
+
19
+ // OPTIONAL: Add project-specific ignores only if needed
20
+ // DevKit preset already ignores: dist/, coverage/, node_modules/, *.d.ts, scripts/, etc.
21
+ // {
22
+ // ignores: [
23
+ // // Add ONLY project-specific patterns here
24
+ // // Example: '**/*.generated.ts',
25
+ // ]
26
+ // }
27
+ ];
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@kb-labs/adapters-log-sqlite",
3
+ "version": "0.5.0",
4
+ "description": "SQLite persistence adapter for KB Labs logs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "src/schema.sql",
17
+ "README.md"
18
+ ],
19
+ "sideEffects": false,
20
+ "scripts": {
21
+ "clean": "rimraf dist",
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "type-check": "tsc --noEmit",
25
+ "test": "vitest run --passWithNoTests",
26
+ "test:watch": "vitest",
27
+ "lint": "eslint src --ext .ts",
28
+ "lint:fix": "eslint . --fix"
29
+ },
30
+ "peerDependencies": {
31
+ "@kb-labs/core-platform": "*"
32
+ },
33
+ "devDependencies": {
34
+ "@kb-labs/adapters-sqlite": "link:../adapters-sqlite",
35
+ "@kb-labs/core-platform": "link:../../../../platform/kb-labs-core/packages/core-platform",
36
+ "@types/node": "^24.3.3",
37
+ "eslint": "^9",
38
+ "rimraf": "^6.0.1",
39
+ "tsup": "^8.5.0",
40
+ "typescript": "^5.6.3",
41
+ "vitest": "^3.2.4",
42
+ "@kb-labs/devkit": "link:../../../kb-labs-devkit"
43
+ },
44
+ "engines": {
45
+ "node": ">=20.0.0",
46
+ "pnpm": ">=9.0.0"
47
+ },
48
+ "dependencies": {}
49
+ }