@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,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,46 @@
1
+ {
2
+ "name": "@kb-labs/adapters-pino-http",
3
+ "version": "0.5.0",
4
+ "description": "Pino HTTP transport for streaming logs to REST API",
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
+ "README.md"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "clean": "rimraf dist",
21
+ "build": "tsup",
22
+ "dev": "tsup --watch",
23
+ "type-check": "tsc --noEmit",
24
+ "test": "vitest run --passWithNoTests",
25
+ "test:watch": "vitest",
26
+ "lint": "eslint src --ext .ts",
27
+ "lint:fix": "eslint . --fix"
28
+ },
29
+ "dependencies": {
30
+ "pino": "latest",
31
+ "pino-abstract-transport": "^2.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^24.3.3",
35
+ "eslint": "^9",
36
+ "tsup": "^8.5.0",
37
+ "typescript": "^5.6.3",
38
+ "vitest": "^3.2.4",
39
+ "@kb-labs/devkit": "link:../../../kb-labs-devkit",
40
+ "rimraf": "^6.0.1"
41
+ },
42
+ "engines": {
43
+ "node": ">=20.0.0",
44
+ "pnpm": ">=9.0.0"
45
+ }
46
+ }
@@ -0,0 +1,229 @@
1
+ /**
2
+ * @module @kb-labs/adapters-pino-http
3
+ * Pino HTTP transport for streaming logs to REST API
4
+ *
5
+ * This transport receives logs from Pino, batches them, and sends to
6
+ * REST API's /logs/ingest endpoint via HTTP POST.
7
+ *
8
+ * Features:
9
+ * - Batching (configurable batch size and flush interval)
10
+ * - Retry with exponential backoff
11
+ * - Graceful shutdown (flushes pending logs before exit)
12
+ * - Error handling (logs to stderr if HTTP fails)
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import pino from 'pino';
17
+ * import pinoHttp from '@kb-labs/adapters-pino-http';
18
+ *
19
+ * const logger = pino({
20
+ * transport: {
21
+ * target: '@kb-labs/adapters-pino-http',
22
+ * options: {
23
+ * url: 'http://localhost:5050/api/v1/logs/ingest',
24
+ * batchSize: 50,
25
+ * flushIntervalMs: 3000,
26
+ * },
27
+ * },
28
+ * });
29
+ *
30
+ * logger.info('Hello from Pino HTTP Transport!');
31
+ * ```
32
+ */
33
+
34
+ import build from "pino-abstract-transport";
35
+
36
+ /**
37
+ * Configuration for HTTP transport
38
+ */
39
+ export interface HTTPTransportOptions {
40
+ /** REST API URL for log ingestion (default: http://localhost:5050/api/v1/logs/ingest) */
41
+ url?: string;
42
+
43
+ /** Number of logs to batch before sending (default: 50) */
44
+ batchSize?: number;
45
+
46
+ /** Max time in ms to wait before flushing batch (default: 3000ms = 3s) */
47
+ flushIntervalMs?: number;
48
+
49
+ /** Number of retry attempts on HTTP failure (default: 3) */
50
+ retryAttempts?: number;
51
+
52
+ /** Initial retry delay in ms (default: 1000ms = 1s) */
53
+ retryDelayMs?: number;
54
+
55
+ /** Custom HTTP headers (e.g., for authentication) */
56
+ headers?: Record<string, string>;
57
+
58
+ /** Enable debug logging to stderr (default: false) */
59
+ debug?: boolean;
60
+ }
61
+
62
+ /**
63
+ * Create Pino HTTP transport
64
+ *
65
+ * This is the main export that Pino will call when loading the transport.
66
+ * Pino expects a function that returns a Promise resolving to a writable stream.
67
+ */
68
+ export default async function (opts: HTTPTransportOptions) {
69
+ const config = {
70
+ url: opts.url || "http://localhost:5050/api/v1/logs/ingest",
71
+ batchSize: opts.batchSize || 50,
72
+ flushIntervalMs: opts.flushIntervalMs || 3000,
73
+ retryAttempts: opts.retryAttempts || 3,
74
+ retryDelayMs: opts.retryDelayMs || 1000,
75
+ headers: opts.headers || {},
76
+ debug: opts.debug || false,
77
+ };
78
+
79
+ const batch: any[] = [];
80
+ let flushTimer: NodeJS.Timeout | null = null;
81
+ let isShuttingDown = false;
82
+
83
+ /**
84
+ * Send batch to REST API with retry logic
85
+ */
86
+ const flush = async (): Promise<void> => {
87
+ if (batch.length === 0) {
88
+ return;
89
+ }
90
+
91
+ // Copy batch and clear immediately to avoid blocking
92
+ const logs = [...batch];
93
+ batch.length = 0;
94
+
95
+ if (config.debug) {
96
+ console.error(`[PinoHTTP] Flushing ${logs.length} logs to ${config.url}`);
97
+ }
98
+
99
+ // Retry with exponential backoff
100
+ for (let attempt = 0; attempt < config.retryAttempts; attempt++) {
101
+ try {
102
+
103
+ const response = await fetch(config.url, {
104
+ method: "POST",
105
+ headers: {
106
+ "Content-Type": "application/json",
107
+ ...config.headers,
108
+ },
109
+ body: JSON.stringify(logs),
110
+ });
111
+
112
+ if (!response.ok) {
113
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
114
+ }
115
+
116
+ if (config.debug) {
117
+ console.error("[PinoHTTP] Flush successful");
118
+ }
119
+
120
+ return; // Success!
121
+ } catch (error) {
122
+ const isLastAttempt = attempt === config.retryAttempts - 1;
123
+
124
+ if (isLastAttempt) {
125
+ console.error("[PinoHTTP] Failed to send logs after retries:", error);
126
+ return; // Give up after max retries
127
+ }
128
+
129
+ // Exponential backoff: 1s, 2s, 4s, 8s...
130
+ const delayMs = config.retryDelayMs * Math.pow(2, attempt);
131
+
132
+ if (config.debug) {
133
+ console.error(
134
+ `[PinoHTTP] Retry ${attempt + 1}/${config.retryAttempts} after ${delayMs}ms`,
135
+ );
136
+ }
137
+
138
+
139
+ await new Promise((resolve) => {
140
+ setTimeout(resolve, delayMs);
141
+ });
142
+ }
143
+ }
144
+ };
145
+
146
+ /**
147
+ * Schedule next flush
148
+ */
149
+ const scheduleFlush = (): void => {
150
+ if (flushTimer !== null) {
151
+ return;
152
+ } // Timer already scheduled
153
+
154
+ flushTimer = setTimeout(() => {
155
+ flushTimer = null;
156
+ void flush(); // Fire and forget
157
+ }, config.flushIntervalMs);
158
+ };
159
+
160
+ /**
161
+ * Graceful shutdown: flush pending logs before exit
162
+ */
163
+ const shutdown = async (): Promise<void> => {
164
+ if (isShuttingDown) {
165
+ return;
166
+ }
167
+ isShuttingDown = true;
168
+
169
+ if (config.debug) {
170
+ console.error("[PinoHTTP] Shutting down, flushing pending logs...");
171
+ }
172
+
173
+ // Clear timer
174
+ if (flushTimer !== null) {
175
+ clearTimeout(flushTimer);
176
+ flushTimer = null;
177
+ }
178
+
179
+ // Flush remaining logs
180
+ await flush();
181
+
182
+ if (config.debug) {
183
+ console.error("[PinoHTTP] Shutdown complete");
184
+ }
185
+ };
186
+
187
+ // Register shutdown handlers
188
+ process.on("SIGINT", shutdown);
189
+ process.on("SIGTERM", shutdown);
190
+ process.on("beforeExit", shutdown);
191
+
192
+ /**
193
+ * Build abstract transport stream
194
+ *
195
+ * Pino will write log objects to this stream.
196
+ * We batch them and send to HTTP endpoint.
197
+ */
198
+ return build(
199
+ async (source) => {
200
+ for await (const log of source) {
201
+ if (isShuttingDown) {
202
+ // Ignore new logs during shutdown
203
+ continue;
204
+ }
205
+
206
+ // Add log to batch
207
+ batch.push(log);
208
+
209
+ // Immediate flush if batch is full
210
+ if (batch.length >= config.batchSize) {
211
+ if (flushTimer !== null) {
212
+ clearTimeout(flushTimer);
213
+ flushTimer = null;
214
+ }
215
+ await flush();
216
+ } else {
217
+ // Schedule delayed flush
218
+ scheduleFlush();
219
+ }
220
+ }
221
+ },
222
+ {
223
+ // Close handler - flush remaining logs
224
+ close: async () => {
225
+ await shutdown();
226
+ },
227
+ },
228
+ );
229
+ }
@@ -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,166 @@
1
+ # @kb-labs/adapters-qdrant
2
+
3
+ > Part of [KB Labs](https://github.com/KirillBaranov/kb-labs) ecosystem. Works exclusively within KB Labs platform.
4
+
5
+ High-performance vector database adapter for semantic search and RAG applications using Qdrant.
6
+
7
+ ## Overview
8
+
9
+ | Property | Value |
10
+ |----------|-------|
11
+ | **Implements** | `IVectorStore` |
12
+ | **Type** | `core` |
13
+ | **Requires** | None |
14
+ | **Category** | Database / AI |
15
+
16
+ ## Features
17
+
18
+ - **Vector Search** - Fast nearest neighbor search
19
+ - **Hybrid Search** - Combine dense and sparse vectors
20
+ - **Filtering** - Payload-based filtering with any query
21
+ - **Batch Operations** - Efficient bulk upsert and delete
22
+ - **Scalable** - Handles millions of vectors
23
+
24
+ ## Installation
25
+
26
+ ```bash
27
+ pnpm add @kb-labs/adapters-qdrant
28
+ ```
29
+
30
+ ## Configuration
31
+
32
+ Add to your `kb.config.json`:
33
+
34
+ ```json
35
+ {
36
+ "platform": {
37
+ "adapters": {
38
+ "vectorStore": "@kb-labs/adapters-qdrant"
39
+ },
40
+ "adapterOptions": {
41
+ "vectorStore": {
42
+ "url": "http://localhost:6333",
43
+ "collectionName": "kb-vectors",
44
+ "dimension": 1536
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Options
52
+
53
+ | Option | Type | Default | Description |
54
+ |--------|------|---------|-------------|
55
+ | `url` | `string` | - | Qdrant server URL |
56
+ | `apiKey` | `string` | - | API key for authentication (optional) |
57
+ | `collectionName` | `string` | `"kb-vectors"` | Collection name |
58
+ | `dimension` | `number` | `1536` | Vector dimension (1536 for OpenAI) |
59
+ | `timeout` | `number` | `30000` | Request timeout in ms |
60
+
61
+ ## Usage
62
+
63
+ ### Via Platform (Recommended)
64
+
65
+ ```typescript
66
+ import { usePlatform } from '@kb-labs/sdk';
67
+
68
+ const platform = usePlatform();
69
+
70
+ // Upsert vectors
71
+ await platform.vectorStore.upsert([
72
+ {
73
+ id: 'doc-1',
74
+ vector: [0.1, 0.2, ...], // 1536 dimensions
75
+ payload: { title: 'Document 1', category: 'tech' }
76
+ }
77
+ ]);
78
+
79
+ // Search
80
+ const results = await platform.vectorStore.search({
81
+ vector: queryVector,
82
+ limit: 10,
83
+ filter: { category: 'tech' }
84
+ });
85
+
86
+ // Delete
87
+ await platform.vectorStore.delete(['doc-1', 'doc-2']);
88
+ ```
89
+
90
+ ### Standalone (Testing/Development)
91
+
92
+ ```typescript
93
+ import { createAdapter } from '@kb-labs/adapters-qdrant';
94
+
95
+ const vectorStore = createAdapter({
96
+ url: 'http://localhost:6333',
97
+ collectionName: 'test-vectors',
98
+ dimension: 1536
99
+ });
100
+
101
+ await vectorStore.upsert([{ id: '1', vector: [...], payload: {} }]);
102
+ ```
103
+
104
+ ## Adapter Manifest
105
+
106
+ ```typescript
107
+ {
108
+ id: 'qdrant-vectorstore',
109
+ name: 'Qdrant Vector Store',
110
+ version: '1.0.0',
111
+ implements: 'IVectorStore',
112
+ capabilities: {
113
+ search: true,
114
+ batch: true,
115
+ custom: {
116
+ hybridSearch: true,
117
+ filtering: true,
118
+ },
119
+ },
120
+ }
121
+ ```
122
+
123
+ ## FAQ
124
+
125
+ <details>
126
+ <summary><strong>Q: How do I start Qdrant locally?</strong></summary>
127
+
128
+ Use Docker:
129
+
130
+ ```bash
131
+ docker run -p 6333:6333 qdrant/qdrant
132
+ ```
133
+ </details>
134
+
135
+ <details>
136
+ <summary><strong>Q: What embedding dimension should I use?</strong></summary>
137
+
138
+ - OpenAI `text-embedding-3-small`: 1536
139
+ - OpenAI `text-embedding-3-large`: 3072
140
+ - Cohere: 1024
141
+ </details>
142
+
143
+ <details>
144
+ <summary><strong>Q: How do I use hybrid search?</strong></summary>
145
+
146
+ Enable hybrid search in your query:
147
+
148
+ ```typescript
149
+ const results = await vectorStore.search({
150
+ vector: denseVector,
151
+ sparseVector: sparseVector,
152
+ limit: 10
153
+ });
154
+ ```
155
+ </details>
156
+
157
+ ## Related Adapters
158
+
159
+ | Adapter | Use Case |
160
+ |---------|----------|
161
+ | `@kb-labs/adapters-openai` | Generate embeddings for vectors |
162
+ | `@kb-labs/adapters-mongodb` | Document storage alongside vectors |
163
+
164
+ ## License
165
+
166
+ [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-qdrant",
3
+ "version": "0.5.0",
4
+ "description": "Qdrant adapter implementing IVectorStore interface",
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
+ "README.md"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "clean": "rimraf dist",
21
+ "build": "tsup",
22
+ "dev": "tsup --watch",
23
+ "type-check": "tsc --noEmit",
24
+ "test": "vitest run --passWithNoTests",
25
+ "test:watch": "vitest",
26
+ "lint": "eslint src --ext .ts",
27
+ "lint:fix": "eslint . --fix"
28
+ },
29
+ "dependencies": {
30
+ "@qdrant/js-client-rest": "^1.12.0"
31
+ },
32
+ "peerDependencies": {
33
+ "@kb-labs/core-platform": "*"
34
+ },
35
+ "devDependencies": {
36
+ "@kb-labs/core-platform": "link:../../../../platform/kb-labs-core/packages/core-platform",
37
+ "@types/node": "^24.3.3",
38
+ "eslint": "^9",
39
+ "tsup": "^8.5.0",
40
+ "typescript": "^5.6.3",
41
+ "vitest": "^3.2.4",
42
+ "@kb-labs/devkit": "link:../../../kb-labs-devkit",
43
+ "rimraf": "^6.0.1"
44
+ },
45
+ "engines": {
46
+ "node": ">=20.0.0",
47
+ "pnpm": ">=9.0.0"
48
+ }
49
+ }