@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
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@kb-labs/adapters",
3
+ "version": "0.5.0",
4
+ "description": "KB Labs adapters — adapters for different platforms and services",
5
+ "type": "module",
6
+ "author": {
7
+ "name": "Kirill Baranov",
8
+ "url": "https://github.com/kirill-baranov"
9
+ },
10
+ "license": "SEE LICENSE IN LICENSE",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/kirill-baranov/kb-labs-adapters.git"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/kirill-baranov/kb-labs-adapters/issues"
17
+ },
18
+ "homepage": "https://github.com/kirill-baranov/kb-labs-adapters#readme",
19
+ "workspaces": [
20
+ "apps/*",
21
+ "packages/*"
22
+ ],
23
+ "scripts": {
24
+ "devkit:sync": "node scripts/devkit-sync.mjs",
25
+ "predevkit:sync": "pnpm devkit:paths",
26
+ "devkit:paths": "pnpm exec kb-devkit-paths",
27
+ "devkit:sync:ci": "node scripts/devkit-sync.mjs --ci-only",
28
+ "predevkit:sync:ci": "pnpm devkit:paths",
29
+ "devkit:check": "node scripts/devkit-sync.mjs --check",
30
+ "predevkit:check": "pnpm devkit:paths",
31
+ "devkit:force": "node scripts/devkit-sync.mjs --force",
32
+ "predevkit:force": "pnpm devkit:paths",
33
+ "devkit:help": "node scripts/devkit-sync.mjs --help",
34
+ "postinstall": "pnpm -s devkit:sync || true",
35
+ "// ——— core": "────────────────────────────────────────",
36
+ "build": "pnpm -r run build",
37
+ "build:clean": "pnpm -r run clean && pnpm -r run build",
38
+ "dev": "pnpm -r --parallel run dev",
39
+ "// ——— quality": "────────────────────────────────────────",
40
+ "lint": "pnpm -r exec eslint .",
41
+ "lint:fix": "pnpm -r exec eslint . --fix",
42
+ "test": "pnpm -r --if-present run test",
43
+ "test:coverage": "pnpm -r --if-present run test --coverage",
44
+ "test:watch": "pnpm -r --parallel --if-present run test:watch",
45
+ "type-check": "pnpm -r run type-check",
46
+ "format": "prettier -w .",
47
+ "format:check": "prettier -c .",
48
+ "// ——— ci/qa": "────────────────────────────────────────",
49
+ "check": "pnpm lint && pnpm type-check && pnpm test",
50
+ "ci": "pnpm clean && pnpm build && pnpm check",
51
+ "// ——— cleanup": "────────────────────────────────────────",
52
+ "clean": "pnpm -r run clean",
53
+ "clean:all": "rimraf node_modules packages/*/node_modules apps/*/node_modules dist"
54
+ },
55
+ "lint-staged": {
56
+ "*.{ts,tsx,js,jsx,json,md,yml,yaml}": [
57
+ "prettier -w"
58
+ ],
59
+ "*.{ts,tsx,js,jsx}": [
60
+ "eslint --fix"
61
+ ]
62
+ },
63
+ "devDependencies": {
64
+ "@kb-labs/devkit": "link:../kb-labs-devkit",
65
+ "@typescript-eslint/eslint-plugin": "^8",
66
+ "@typescript-eslint/parser": "^8",
67
+ "@vitest/coverage-v8": "^3",
68
+ "@vue/eslint-config-typescript": "^14.6.0",
69
+ "eslint": "^9",
70
+ "eslint-plugin-vue": "^10.5.0",
71
+ "prettier": "^3",
72
+ "rimraf": "^6",
73
+ "tsup": "^8",
74
+ "typescript": "^5",
75
+ "vitest": "^3.2.4",
76
+ "@byjohann/toon": "*",
77
+ "@types/node": "^24.3.3"
78
+ },
79
+ "engines": {
80
+ "node": ">=18.18.0",
81
+ "pnpm": ">=9.0.0"
82
+ },
83
+ "packageManager": "pnpm@9.11.0"
84
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@kb-labs/your-package",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Your package description",
6
+ "bin": {
7
+ "your-cli": "./dist/bin.cjs"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "dev": "tsup --watch",
15
+ "lint": "eslint .",
16
+ "test": "vitest"
17
+ },
18
+ "dependencies": {},
19
+ "devDependencies": {
20
+ "@kb-labs/devkit": "workspace:*",
21
+ "tsup": "^8.5.0",
22
+ "typescript": "^5.9.2",
23
+ "vitest": "^3.2.4"
24
+ }
25
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@kb-labs/your-package",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Your package description",
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
+ ],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "lint": "eslint .",
21
+ "test": "vitest"
22
+ },
23
+ "dependencies": {},
24
+ "devDependencies": {
25
+ "@kb-labs/devkit": "workspace:*",
26
+ "tsup": "^8.5.0",
27
+ "typescript": "^5.9.2",
28
+ "vitest": "^3.2.4"
29
+ }
30
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@kb-labs/adapters-analytics-duckdb",
3
+ "version": "0.5.0",
4
+ "type": "module",
5
+ "description": "DuckDB analytics adapter for KB Labs platform (SQL-native time-series analytics)",
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 --experimental-vm-modules scripts/migrate-from-jsonl.js"
35
+ },
36
+ "dependencies": {
37
+ "@duckdb/node-api": "^1.4.4-r.1",
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/node": "^24.3.3",
43
+ "eslint": "^9",
44
+ "rimraf": "^6.0.1",
45
+ "tsup": "^8.5.0",
46
+ "typescript": "^5.6.3",
47
+ "vitest": "^3.2.4"
48
+ },
49
+ "engines": {
50
+ "node": ">=20.0.0",
51
+ "pnpm": ">=9.0.0"
52
+ },
53
+ "packageManager": "pnpm@9.11.0"
54
+ }
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Migration script: Import JSONL analytics events into DuckDB.
4
+ *
5
+ * Uses DuckDB's native read_json_auto() to load NDJSON files directly via SQL.
6
+ * Much faster than parsing in JS — all I/O and transformation happens in DuckDB.
7
+ *
8
+ * Usage:
9
+ * node scripts/migrate-from-jsonl.mjs [--source <dir>] [--db <path>] [--dry-run]
10
+ *
11
+ * Defaults:
12
+ * --source .kb/analytics/buffer
13
+ * --db .kb/analytics/analytics.duckdb
14
+ *
15
+ * Example:
16
+ * node scripts/migrate-from-jsonl.mjs \
17
+ * --source .kb/analytics/buffer \
18
+ * --db .kb/analytics/analytics.duckdb
19
+ */
20
+
21
+ import { DuckDBInstance } from '@duckdb/node-api';
22
+ import { existsSync, readdirSync, mkdirSync } from 'node:fs';
23
+ import { resolve, join, dirname } from 'node:path';
24
+ import { parseArgs } from 'node:util';
25
+
26
+ // ─── Parse CLI args ───────────────────────────────────────────────────────────
27
+
28
+ const { values: args } = parseArgs({
29
+ options: {
30
+ source: { type: 'string', default: '.kb/analytics/buffer' },
31
+ db: { type: 'string', default: '.kb/analytics/analytics.duckdb' },
32
+ 'dry-run': { type: 'boolean', default: false },
33
+ help: { type: 'boolean', default: false },
34
+ },
35
+ strict: false,
36
+ });
37
+
38
+ if (args.help) {
39
+ console.log(`
40
+ migrate-from-jsonl.mjs — Import JSONL events into DuckDB
41
+
42
+ Usage:
43
+ node scripts/migrate-from-jsonl.mjs [options]
44
+
45
+ Options:
46
+ --source <dir> Source directory with .jsonl files (default: .kb/analytics/buffer)
47
+ --db <path> DuckDB database file path (default: .kb/analytics/analytics.duckdb)
48
+ --dry-run Show what would be migrated without writing
49
+ --help Show this help
50
+ `);
51
+ process.exit(0);
52
+ }
53
+
54
+ const sourceDir = resolve(process.cwd(), args.source);
55
+ const dbPath = resolve(process.cwd(), args.db);
56
+ const isDryRun = args['dry-run'];
57
+
58
+ // ─── Validate source directory ────────────────────────────────────────────────
59
+
60
+ if (!existsSync(sourceDir)) {
61
+ console.error(`❌ Source directory not found: ${sourceDir}`);
62
+ process.exit(1);
63
+ }
64
+
65
+ const jsonlFiles = readdirSync(sourceDir)
66
+ .filter((f) => f.endsWith('.jsonl'))
67
+ .map((f) => join(sourceDir, f));
68
+
69
+ if (jsonlFiles.length === 0) {
70
+ console.log(`⚠️ No .jsonl files found in: ${sourceDir}`);
71
+ process.exit(0);
72
+ }
73
+
74
+ console.log(`\n📂 Source: ${sourceDir}`);
75
+ console.log(`📦 Database: ${dbPath}`);
76
+ console.log(`📄 JSONL files found: ${jsonlFiles.length}`);
77
+ if (isDryRun) console.log(`🔍 DRY RUN — no data will be written\n`);
78
+
79
+ // ─── Ensure DB directory exists ───────────────────────────────────────────────
80
+
81
+ if (!isDryRun) {
82
+ const dbDir = dirname(dbPath);
83
+ if (!existsSync(dbDir)) {
84
+ mkdirSync(dbDir, { recursive: true });
85
+ console.log(`📁 Created directory: ${dbDir}`);
86
+ }
87
+ }
88
+
89
+ // ─── DuckDB setup ─────────────────────────────────────────────────────────────
90
+
91
+ const CREATE_TABLE = `
92
+ CREATE TABLE IF NOT EXISTS events (
93
+ id VARCHAR PRIMARY KEY,
94
+ schema VARCHAR NOT NULL DEFAULT 'kb.v1',
95
+ type VARCHAR NOT NULL,
96
+ ts TIMESTAMPTZ NOT NULL,
97
+ ingest_ts TIMESTAMPTZ,
98
+ run_id VARCHAR,
99
+ product VARCHAR,
100
+ version VARCHAR,
101
+ actor_type VARCHAR,
102
+ actor_id VARCHAR,
103
+ actor_name VARCHAR,
104
+ ctx JSON,
105
+ payload JSON
106
+ )
107
+ `;
108
+
109
+ const CREATE_INDEXES = [
110
+ `CREATE INDEX IF NOT EXISTS events_ts_idx ON events (ts)`,
111
+ `CREATE INDEX IF NOT EXISTS events_type_idx ON events (type)`,
112
+ `CREATE INDEX IF NOT EXISTS events_product_idx ON events (product)`,
113
+ `CREATE INDEX IF NOT EXISTS events_type_ts_idx ON events (type, ts)`,
114
+ ];
115
+
116
+ // ─── Migration ────────────────────────────────────────────────────────────────
117
+
118
+ async function migrate() {
119
+ // Build glob pattern for all jsonl files (DuckDB supports glob natively)
120
+ const globPattern = join(sourceDir, '*.jsonl').replace(/\\/g, '/');
121
+
122
+ if (isDryRun) {
123
+ console.log(`\nWould load files matching: ${globPattern}`);
124
+ console.log('\nWould run:');
125
+ console.log(` CREATE TABLE IF NOT EXISTS events (...)`);
126
+ console.log(` INSERT OR IGNORE INTO events SELECT ... FROM read_json_auto('${globPattern}', ...)`);
127
+
128
+ // Still open DuckDB to count how many rows we'd insert (in-memory)
129
+ const db = await DuckDBInstance.create(':memory:');
130
+ const conn = await db.connect();
131
+ try {
132
+ const result = await conn.run(`
133
+ SELECT COUNT(*) as total
134
+ FROM read_json_auto('${globPattern}', format='newline_delimited', ignore_errors=true)
135
+ WHERE id IS NOT NULL AND type IS NOT NULL AND ts IS NOT NULL
136
+ `);
137
+ const rows = await fetchAllRows(result);
138
+ console.log(`\n📊 Events eligible for migration: ${rows[0]?.total ?? 0}`);
139
+ } finally {
140
+ conn.closeSync();
141
+ }
142
+ return;
143
+ }
144
+
145
+ // Open the real DuckDB file
146
+ const db = await DuckDBInstance.create(dbPath);
147
+ const conn = await db.connect();
148
+
149
+ try {
150
+ // Setup schema
151
+ console.log('\n🔧 Setting up schema...');
152
+ await conn.run(CREATE_TABLE);
153
+ for (const idx of CREATE_INDEXES) {
154
+ await conn.run(idx);
155
+ }
156
+
157
+ // Count before
158
+ const beforeResult = await conn.run(`SELECT COUNT(*) as cnt FROM events`);
159
+ const beforeRows = await fetchAllRows(beforeResult);
160
+ const countBefore = Number(beforeRows[0]?.cnt ?? 0);
161
+ console.log(`📊 Events in DB before migration: ${countBefore}`);
162
+
163
+ // Count source rows
164
+ const sourceCountResult = await conn.run(`
165
+ SELECT COUNT(*) as total
166
+ FROM read_json_auto('${globPattern}', format='newline_delimited', ignore_errors=true)
167
+ WHERE id IS NOT NULL AND type IS NOT NULL AND ts IS NOT NULL
168
+ `);
169
+ const sourceRows = await fetchAllRows(sourceCountResult);
170
+ const totalSource = Number(sourceRows[0]?.total ?? 0);
171
+ console.log(`📄 Events in JSONL source: ${totalSource}`);
172
+
173
+ if (totalSource === 0) {
174
+ console.log('⚠️ No valid events found in source files.');
175
+ return;
176
+ }
177
+
178
+ // Run migration INSERT
179
+ console.log('\n⏳ Migrating...');
180
+ const startMs = Date.now();
181
+
182
+ await conn.run(`
183
+ INSERT OR IGNORE INTO events
184
+ SELECT
185
+ CAST(id AS VARCHAR) AS id,
186
+ COALESCE(CAST(schema AS VARCHAR), 'kb.v1') AS schema,
187
+ CAST(type AS VARCHAR) AS type,
188
+ CAST(ts AS TIMESTAMPTZ) AS ts,
189
+ TRY_CAST(ingestTs AS TIMESTAMPTZ) AS ingest_ts,
190
+ CAST(runId AS VARCHAR) AS run_id,
191
+ CAST(source->>'product' AS VARCHAR) AS product,
192
+ CAST(source->>'version' AS VARCHAR) AS version,
193
+ CAST(actor->>'type' AS VARCHAR) AS actor_type,
194
+ CAST(actor->>'id' AS VARCHAR) AS actor_id,
195
+ CAST(actor->>'name' AS VARCHAR) AS actor_name,
196
+ TRY_CAST(ctx AS JSON) AS ctx,
197
+ TRY_CAST(payload AS JSON) AS payload
198
+ FROM read_json_auto('${globPattern}', format='newline_delimited', ignore_errors=true)
199
+ WHERE id IS NOT NULL AND type IS NOT NULL AND ts IS NOT NULL
200
+ `);
201
+
202
+ const elapsedMs = Date.now() - startMs;
203
+
204
+ // Count after
205
+ const afterResult = await conn.run(`SELECT COUNT(*) as cnt FROM events`);
206
+ const afterRows = await fetchAllRows(afterResult);
207
+ const countAfter = Number(afterRows[0]?.cnt ?? 0);
208
+ const inserted = countAfter - countBefore;
209
+ const skipped = totalSource - inserted;
210
+
211
+ console.log(`\n✅ Migration complete in ${(elapsedMs / 1000).toFixed(1)}s`);
212
+ console.log(` Inserted: ${inserted} events`);
213
+ console.log(` Skipped: ${skipped} (already existed)`);
214
+ console.log(` Total now: ${countAfter} events in DB`);
215
+
216
+ // Show time range
217
+ const rangeResult = await conn.run(`SELECT MIN(ts) as oldest, MAX(ts) as newest FROM events`);
218
+ const rangeRows = await fetchAllRows(rangeResult);
219
+ if (rangeRows[0]) {
220
+ console.log(` Time range: ${rangeRows[0].oldest} → ${rangeRows[0].newest}`);
221
+ }
222
+
223
+ // Show top event types
224
+ console.log('\n📈 Top event types:');
225
+ const topTypesResult = await conn.run(`
226
+ SELECT type, COUNT(*) as cnt
227
+ FROM events
228
+ GROUP BY type
229
+ ORDER BY cnt DESC
230
+ LIMIT 10
231
+ `);
232
+ const topTypes = await fetchAllRows(topTypesResult);
233
+ for (const row of topTypes) {
234
+ console.log(` ${String(row.cnt).padStart(6)} ${row.type}`);
235
+ }
236
+
237
+ } finally {
238
+ conn.closeSync();
239
+ }
240
+ }
241
+
242
+ // ─── DuckDB row reader helper ─────────────────────────────────────────────────
243
+
244
+ async function fetchAllRows(result) {
245
+ return result.getRowObjects();
246
+ }
247
+
248
+ // ─── Run ──────────────────────────────────────────────────────────────────────
249
+
250
+ migrate().catch((err) => {
251
+ console.error('❌ Migration failed:', err.message ?? err);
252
+ process.exit(1);
253
+ });