@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,45 @@
1
+ /**
2
+ * @module @kb-labs/adapters-analytics-file/manifest
3
+ * Adapter manifest for file-based analytics.
4
+ */
5
+
6
+ import type { AdapterManifest } from "@kb-labs/core-platform";
7
+
8
+ /**
9
+ * Adapter manifest for file-based analytics.
10
+ */
11
+ export const manifest: AdapterManifest = {
12
+ manifestVersion: "1.0.0",
13
+ id: "analytics-file",
14
+ name: "File Analytics",
15
+ version: "1.0.0",
16
+ description: "Local filesystem analytics adapter for development and testing",
17
+ author: "KB Labs Team",
18
+ license: "KBPL-1.1",
19
+ type: "core",
20
+ implements: "IAnalytics",
21
+ optional: {
22
+ adapters: ["cache"], // Optional cache dependency for stats caching
23
+ },
24
+ contexts: ["workspace", "analytics"], // Request runtime contexts
25
+ capabilities: {
26
+ search: true,
27
+ custom: {
28
+ offline: true,
29
+
30
+ stats: true,
31
+ },
32
+ },
33
+ configSchema: {
34
+ baseDir: {
35
+ type: "string",
36
+ default: ".kb/analytics/buffer",
37
+ description: "Base directory for analytics logs",
38
+ },
39
+ filenamePattern: {
40
+ type: "string",
41
+ default: "events-YYYYMMDD",
42
+ description: "Filename pattern (without extension)",
43
+ },
44
+ },
45
+ };
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "baseUrl": ".",
6
+ "paths": {}
7
+ },
8
+ "include": [
9
+ "src/**/*"
10
+ ],
11
+ "exclude": [
12
+ "dist",
13
+ "node_modules"
14
+ ]
15
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "@kb-labs/devkit/tsconfig/node.json",
4
+ "compilerOptions": {
5
+ "rootDir": "src",
6
+ "outDir": "dist"
7
+ },
8
+ "include": ["src"]
9
+ }
@@ -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,55 @@
1
+ {
2
+ "name": "@kb-labs/adapters-analytics-sqlite",
3
+ "version": "0.5.0",
4
+ "type": "module",
5
+ "description": "SQLite analytics adapter for KB Labs platform — concurrent writes, SQL analytics, no lock issues",
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
+ "./manifest": {
14
+ "import": "./dist/manifest.js",
15
+ "types": "./dist/manifest.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "scripts",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "sideEffects": false,
25
+ "scripts": {
26
+ "clean": "rimraf dist",
27
+ "build": "tsup --config tsup.config.ts",
28
+ "dev": "tsup --config tsup.config.ts --watch",
29
+ "lint": "eslint src --ext .ts,.tsx,.js,.jsx",
30
+ "lint:fix": "eslint . --fix",
31
+ "type-check": "tsc --noEmit",
32
+ "test": "vitest run --passWithNoTests",
33
+ "test:watch": "vitest --passWithNoTests",
34
+ "migrate": "node scripts/migrate-from-jsonl.mjs"
35
+ },
36
+ "dependencies": {
37
+ "better-sqlite3": "^11.8.0",
38
+ "@kb-labs/core-platform": "link:../../../../platform/kb-labs-core/packages/core-platform"
39
+ },
40
+ "devDependencies": {
41
+ "@kb-labs/devkit": "link:../../../kb-labs-devkit",
42
+ "@types/better-sqlite3": "^7.6.13",
43
+ "@types/node": "^24.3.3",
44
+ "eslint": "^9",
45
+ "rimraf": "^6.0.1",
46
+ "tsup": "^8.5.0",
47
+ "typescript": "^5.6.3",
48
+ "vitest": "^3.2.4"
49
+ },
50
+ "engines": {
51
+ "node": ">=20.0.0",
52
+ "pnpm": ">=9.11.0"
53
+ },
54
+ "packageManager": "pnpm@9.11.0"
55
+ }
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Migration script: Import JSONL analytics events into SQLite.
4
+ *
5
+ * Usage:
6
+ * node scripts/migrate-from-jsonl.mjs [--source <dir>] [--db <path>] [--dry-run]
7
+ *
8
+ * Defaults:
9
+ * --source .kb/analytics/buffer
10
+ * --db .kb/analytics/analytics.sqlite
11
+ */
12
+
13
+ import Database from 'better-sqlite3';
14
+ import { existsSync, readdirSync, mkdirSync, readFileSync } from 'node:fs';
15
+ import { resolve, join, dirname } from 'node:path';
16
+ import { parseArgs } from 'node:util';
17
+
18
+ const { values: args } = parseArgs({
19
+ options: {
20
+ source: { type: 'string', default: '.kb/analytics/buffer' },
21
+ db: { type: 'string', default: '.kb/analytics/analytics.sqlite' },
22
+ 'dry-run': { type: 'boolean', default: false },
23
+ help: { type: 'boolean', default: false },
24
+ },
25
+ strict: false,
26
+ });
27
+
28
+ if (args.help) {
29
+ console.log(`
30
+ migrate-from-jsonl.mjs — Import JSONL events into SQLite
31
+
32
+ Usage:
33
+ node scripts/migrate-from-jsonl.mjs [options]
34
+
35
+ Options:
36
+ --source <dir> Source directory with .jsonl files (default: .kb/analytics/buffer)
37
+ --db <path> SQLite database file path (default: .kb/analytics/analytics.sqlite)
38
+ --dry-run Show what would be migrated without writing
39
+ --help Show this help
40
+ `);
41
+ process.exit(0);
42
+ }
43
+
44
+ const sourceDir = resolve(process.cwd(), args.source);
45
+ const dbPath = resolve(process.cwd(), args.db);
46
+ const isDryRun = args['dry-run'];
47
+
48
+ if (!existsSync(sourceDir)) {
49
+ console.error(`āŒ Source directory not found: ${sourceDir}`);
50
+ process.exit(1);
51
+ }
52
+
53
+ const jsonlFiles = readdirSync(sourceDir)
54
+ .filter((f) => f.endsWith('.jsonl'))
55
+ .map((f) => join(sourceDir, f));
56
+
57
+ if (jsonlFiles.length === 0) {
58
+ console.log(`āš ļø No .jsonl files found in: ${sourceDir}`);
59
+ process.exit(0);
60
+ }
61
+
62
+ console.log(`\nšŸ“‚ Source: ${sourceDir}`);
63
+ console.log(`šŸ“¦ Database: ${dbPath}`);
64
+ console.log(`šŸ“„ JSONL files found: ${jsonlFiles.length}`);
65
+ if (isDryRun) console.log(`šŸ” DRY RUN — no data will be written\n`);
66
+
67
+ if (!isDryRun) {
68
+ mkdirSync(dirname(dbPath), { recursive: true });
69
+ }
70
+
71
+ // Count total lines across all files
72
+ let totalLines = 0;
73
+ for (const f of jsonlFiles) {
74
+ const content = readFileSync(f, 'utf8');
75
+ totalLines += content.split('\n').filter(l => l.trim()).length;
76
+ }
77
+ console.log(`šŸ“Š Events in JSONL source: ${totalLines}`);
78
+
79
+ if (isDryRun) {
80
+ console.log(`\nWould insert up to ${totalLines} events into ${dbPath}`);
81
+ process.exit(0);
82
+ }
83
+
84
+ // Open SQLite
85
+ const db = new Database(dbPath);
86
+ db.pragma('journal_mode = WAL');
87
+ db.pragma('busy_timeout = 5000');
88
+ db.pragma('synchronous = NORMAL');
89
+
90
+ db.exec(`
91
+ CREATE TABLE IF NOT EXISTS events (
92
+ id TEXT PRIMARY KEY,
93
+ schema TEXT NOT NULL DEFAULT 'kb.v1',
94
+ type TEXT NOT NULL,
95
+ ts TEXT NOT NULL,
96
+ ingest_ts TEXT,
97
+ run_id TEXT,
98
+ product TEXT,
99
+ version TEXT,
100
+ actor_type TEXT,
101
+ actor_id TEXT,
102
+ actor_name TEXT,
103
+ ctx TEXT,
104
+ payload TEXT
105
+ )
106
+ `);
107
+
108
+ db.exec(`CREATE INDEX IF NOT EXISTS events_ts_idx ON events (ts)`);
109
+ db.exec(`CREATE INDEX IF NOT EXISTS events_type_idx ON events (type)`);
110
+ db.exec(`CREATE INDEX IF NOT EXISTS events_product_idx ON events (product)`);
111
+ db.exec(`CREATE INDEX IF NOT EXISTS events_type_ts_idx ON events (type, ts)`);
112
+
113
+ const countBefore = db.prepare('SELECT COUNT(*) as cnt FROM events').get().cnt;
114
+ console.log(`šŸ“Š Events in DB before migration: ${countBefore}`);
115
+
116
+ const insert = db.prepare(`
117
+ INSERT OR IGNORE INTO events
118
+ (id, schema, type, ts, ingest_ts, run_id, product, version, actor_type, actor_id, actor_name, ctx, payload)
119
+ VALUES
120
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
121
+ `);
122
+
123
+ console.log('\nā³ Migrating...');
124
+ const startMs = Date.now();
125
+
126
+ let parsed = 0;
127
+ let skipped = 0;
128
+
129
+ const migrate = db.transaction(() => {
130
+ for (const file of jsonlFiles) {
131
+ const lines = readFileSync(file, 'utf8').split('\n');
132
+ for (const line of lines) {
133
+ const trimmed = line.trim();
134
+ if (!trimmed) continue;
135
+ let event;
136
+ try {
137
+ event = JSON.parse(trimmed);
138
+ } catch {
139
+ skipped++;
140
+ continue;
141
+ }
142
+
143
+ if (!event.id || !event.type || !event.ts) {
144
+ skipped++;
145
+ continue;
146
+ }
147
+
148
+ insert.run(
149
+ String(event.id),
150
+ event.schema ?? 'kb.v1',
151
+ String(event.type),
152
+ String(event.ts),
153
+ event.ingestTs ?? event.ts ?? null,
154
+ event.runId ?? null,
155
+ event.source?.product ?? null,
156
+ event.source?.version ?? null,
157
+ event.actor?.type ?? null,
158
+ event.actor?.id ?? null,
159
+ event.actor?.name ?? null,
160
+ event.ctx ? JSON.stringify(event.ctx) : null,
161
+ event.payload ? JSON.stringify(event.payload) : null,
162
+ );
163
+ parsed++;
164
+ }
165
+ }
166
+ });
167
+
168
+ migrate();
169
+
170
+ const elapsedMs = Date.now() - startMs;
171
+ const countAfter = db.prepare('SELECT COUNT(*) as cnt FROM events').get().cnt;
172
+ const inserted = countAfter - countBefore;
173
+ const duplicates = parsed - inserted;
174
+
175
+ console.log(`\nāœ… Migration complete in ${(elapsedMs / 1000).toFixed(1)}s`);
176
+ console.log(` Parsed: ${parsed} events`);
177
+ console.log(` Inserted: ${inserted} events`);
178
+ console.log(` Skipped: ${duplicates} (duplicates) + ${skipped} (parse errors)`);
179
+ console.log(` Total now: ${countAfter} events in DB`);
180
+
181
+ const range = db.prepare('SELECT MIN(ts) as oldest, MAX(ts) as newest FROM events').get();
182
+ if (range?.oldest) {
183
+ console.log(` Time range: ${range.oldest} → ${range.newest}`);
184
+ }
185
+
186
+ console.log('\nšŸ“ˆ Top event types:');
187
+ const topTypes = db.prepare(`
188
+ SELECT type, COUNT(*) as cnt FROM events GROUP BY type ORDER BY cnt DESC LIMIT 10
189
+ `).all();
190
+ for (const row of topTypes) {
191
+ console.log(` ${String(row.cnt).padStart(6)} ${row.type}`);
192
+ }
193
+
194
+ db.close();