@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.
- package/.cursorrules +32 -0
- package/.github/workflows/ci.yml +13 -0
- package/.github/workflows/deploy.yml +28 -0
- package/.github/workflows/docker-build.yml +25 -0
- package/.github/workflows/drift-check.yml +10 -0
- package/.github/workflows/profiles-validate.yml +16 -0
- package/.github/workflows/release.yml +8 -0
- package/.kb/devkit/agents/devkit-maintainer/context.globs +15 -0
- package/.kb/devkit/agents/devkit-maintainer/permissions.yml +17 -0
- package/.kb/devkit/agents/devkit-maintainer/prompt.md +28 -0
- package/.kb/devkit/agents/devkit-maintainer/runbook.md +31 -0
- package/.kb/devkit/agents/docs-crafter/prompt.md +24 -0
- package/.kb/devkit/agents/docs-crafter/runbook.md +18 -0
- package/.kb/devkit/agents/release-manager/context.globs +7 -0
- package/.kb/devkit/agents/release-manager/prompt.md +27 -0
- package/.kb/devkit/agents/release-manager/runbook.md +17 -0
- package/.kb/devkit/agents/test-generator/context.globs +7 -0
- package/.kb/devkit/agents/test-generator/prompt.md +27 -0
- package/.kb/devkit/agents/test-generator/runbook.md +18 -0
- package/CONTRIBUTING.md +90 -0
- package/IMPLEMENTATION_COMPLETE.md +416 -0
- package/LICENSE +186 -0
- package/README-TEMPLATE.md +179 -0
- package/README.md +306 -0
- package/docs/DOCUMENTATION.md +74 -0
- package/docs/adr/0000-template.md +49 -0
- package/docs/adr/0001-architecture-and-repository-layout.md +33 -0
- package/docs/adr/0002-plugins-and-extensibility.md +46 -0
- package/docs/adr/0003-package-and-module-boundaries.md +37 -0
- package/docs/adr/0004-versioning-and-release-policy.md +38 -0
- package/docs/adr/0005-use-devkit-for-shared-tooling.md +48 -0
- package/docs/adr/0006-adopt-devkit-sync.md +47 -0
- package/docs/adr/0007-drift-kit-check.md +72 -0
- package/docs/adr/0008-devkit-sync-wrapper-strategy.md +67 -0
- package/docs/naming-convention.md +272 -0
- package/eslint.config.js +27 -0
- package/kb-labs.config.json +5 -0
- package/package.json +84 -0
- package/package.json.bin +25 -0
- package/package.json.lib +30 -0
- package/packages/adapters-analytics-duckdb/package.json +54 -0
- package/packages/adapters-analytics-duckdb/scripts/migrate-from-jsonl.mjs +253 -0
- package/packages/adapters-analytics-duckdb/src/index.ts +380 -0
- package/packages/adapters-analytics-duckdb/src/manifest.ts +36 -0
- package/packages/adapters-analytics-duckdb/src/schema.ts +161 -0
- package/packages/adapters-analytics-duckdb/tsconfig.build.json +15 -0
- package/packages/adapters-analytics-duckdb/tsconfig.json +9 -0
- package/packages/adapters-analytics-duckdb/tsup.config.ts +9 -0
- package/packages/adapters-analytics-file/README.md +32 -0
- package/packages/adapters-analytics-file/eslint.config.js +27 -0
- package/packages/adapters-analytics-file/package.json +50 -0
- package/packages/adapters-analytics-file/src/__tests__/daily-stats.spec.ts +287 -0
- package/packages/adapters-analytics-file/src/__tests__/scoped-analytics.test.ts +233 -0
- package/packages/adapters-analytics-file/src/index.test.ts +214 -0
- package/packages/adapters-analytics-file/src/index.ts +830 -0
- package/packages/adapters-analytics-file/src/manifest.ts +45 -0
- package/packages/adapters-analytics-file/tsconfig.build.json +15 -0
- package/packages/adapters-analytics-file/tsconfig.json +9 -0
- package/packages/adapters-analytics-file/tsup.config.ts +9 -0
- package/packages/adapters-analytics-sqlite/package.json +55 -0
- package/packages/adapters-analytics-sqlite/scripts/migrate-from-jsonl.mjs +194 -0
- package/packages/adapters-analytics-sqlite/src/index.ts +460 -0
- package/packages/adapters-analytics-sqlite/src/manifest.ts +41 -0
- package/packages/adapters-analytics-sqlite/tsconfig.build.json +15 -0
- package/packages/adapters-analytics-sqlite/tsconfig.json +9 -0
- package/packages/adapters-analytics-sqlite/tsup.config.ts +9 -0
- package/packages/adapters-environment-docker/README.md +28 -0
- package/packages/adapters-environment-docker/eslint.config.js +5 -0
- package/packages/adapters-environment-docker/package.json +49 -0
- package/packages/adapters-environment-docker/src/index.test.ts +138 -0
- package/packages/adapters-environment-docker/src/index.ts +439 -0
- package/packages/adapters-environment-docker/src/manifest.ts +65 -0
- package/packages/adapters-environment-docker/tsconfig.build.json +15 -0
- package/packages/adapters-environment-docker/tsconfig.json +16 -0
- package/packages/adapters-environment-docker/tsup.config.ts +9 -0
- package/packages/adapters-eventbus-cache/README.md +242 -0
- package/packages/adapters-eventbus-cache/eslint.config.js +27 -0
- package/packages/adapters-eventbus-cache/package.json +46 -0
- package/packages/adapters-eventbus-cache/src/index.test.ts +235 -0
- package/packages/adapters-eventbus-cache/src/index.ts +215 -0
- package/packages/adapters-eventbus-cache/src/manifest.ts +50 -0
- package/packages/adapters-eventbus-cache/src/types.ts +58 -0
- package/packages/adapters-eventbus-cache/tsconfig.build.json +15 -0
- package/packages/adapters-eventbus-cache/tsconfig.json +9 -0
- package/packages/adapters-eventbus-cache/tsup.config.ts +9 -0
- package/packages/adapters-fs/README.md +171 -0
- package/packages/adapters-fs/allowed.txt +1 -0
- package/packages/adapters-fs/conflict.txt +1 -0
- package/packages/adapters-fs/dest.txt +1 -0
- package/packages/adapters-fs/eslint.config.js +27 -0
- package/packages/adapters-fs/exists.txt +1 -0
- package/packages/adapters-fs/not-allowed.txt +1 -0
- package/packages/adapters-fs/other.txt +1 -0
- package/packages/adapters-fs/package.json +55 -0
- package/packages/adapters-fs/public/file1.txt +1 -0
- package/packages/adapters-fs/public/file2.txt +1 -0
- package/packages/adapters-fs/secret.txt +1 -0
- package/packages/adapters-fs/secrets/key.txt +1 -0
- package/packages/adapters-fs/src/index.test.ts +243 -0
- package/packages/adapters-fs/src/index.ts +258 -0
- package/packages/adapters-fs/src/manifest.ts +35 -0
- package/packages/adapters-fs/src/secure-storage.test.ts +380 -0
- package/packages/adapters-fs/src/secure-storage.ts +268 -0
- package/packages/adapters-fs/test.json +1 -0
- package/packages/adapters-fs/test.txt +1 -0
- package/packages/adapters-fs/test.xyz +1 -0
- package/packages/adapters-fs/test1.txt +1 -0
- package/packages/adapters-fs/test2.txt +1 -0
- package/packages/adapters-fs/tsconfig.build.json +15 -0
- package/packages/adapters-fs/tsconfig.json +9 -0
- package/packages/adapters-fs/tsup.config.ts +8 -0
- package/packages/adapters-fs/vitest.config.ts +19 -0
- package/packages/adapters-log-ringbuffer/README.md +228 -0
- package/packages/adapters-log-ringbuffer/eslint.config.js +27 -0
- package/packages/adapters-log-ringbuffer/package.json +47 -0
- package/packages/adapters-log-ringbuffer/src/__tests__/ring-buffer.test.ts +450 -0
- package/packages/adapters-log-ringbuffer/src/index.ts +212 -0
- package/packages/adapters-log-ringbuffer/src/manifest.ts +30 -0
- package/packages/adapters-log-ringbuffer/tsconfig.build.json +15 -0
- package/packages/adapters-log-ringbuffer/tsconfig.json +9 -0
- package/packages/adapters-log-ringbuffer/tsup.config.ts +9 -0
- package/packages/adapters-log-ringbuffer/vitest.config.ts +14 -0
- package/packages/adapters-log-sqlite/README.md +396 -0
- package/packages/adapters-log-sqlite/eslint.config.js +27 -0
- package/packages/adapters-log-sqlite/package.json +49 -0
- package/packages/adapters-log-sqlite/src/__tests__/log-persistence.test.ts +718 -0
- package/packages/adapters-log-sqlite/src/index.ts +1068 -0
- package/packages/adapters-log-sqlite/src/manifest.ts +36 -0
- package/packages/adapters-log-sqlite/src/schema.sql +46 -0
- package/packages/adapters-log-sqlite/tsconfig.build.json +15 -0
- package/packages/adapters-log-sqlite/tsconfig.json +9 -0
- package/packages/adapters-log-sqlite/tsup.config.ts +9 -0
- package/packages/adapters-log-sqlite/vitest.config.ts +15 -0
- package/packages/adapters-mongodb/README.md +147 -0
- package/packages/adapters-mongodb/eslint.config.js +27 -0
- package/packages/adapters-mongodb/package.json +53 -0
- package/packages/adapters-mongodb/src/index.ts +428 -0
- package/packages/adapters-mongodb/src/manifest.ts +45 -0
- package/packages/adapters-mongodb/src/secure-document.ts +231 -0
- package/packages/adapters-mongodb/tsconfig.build.json +15 -0
- package/packages/adapters-mongodb/tsconfig.json +9 -0
- package/packages/adapters-mongodb/tsup.config.ts +8 -0
- package/packages/adapters-openai/README.md +151 -0
- package/packages/adapters-openai/embeddings.ts +37 -0
- package/packages/adapters-openai/eslint.config.js +26 -0
- package/packages/adapters-openai/index.ts +22 -0
- package/packages/adapters-openai/package.json +57 -0
- package/packages/adapters-openai/src/embeddings-manifest.ts +45 -0
- package/packages/adapters-openai/src/embeddings.ts +104 -0
- package/packages/adapters-openai/src/index.ts +13 -0
- package/packages/adapters-openai/src/llm.ts +304 -0
- package/packages/adapters-openai/src/manifest.ts +47 -0
- package/packages/adapters-openai/tsconfig.build.json +15 -0
- package/packages/adapters-openai/tsconfig.json +9 -0
- package/packages/adapters-openai/tsup.config.ts +8 -0
- package/packages/adapters-pino/README.md +152 -0
- package/packages/adapters-pino/eslint.config.js +27 -0
- package/packages/adapters-pino/package.json +49 -0
- package/packages/adapters-pino/src/index.test.ts +44 -0
- package/packages/adapters-pino/src/index.ts +322 -0
- package/packages/adapters-pino/src/log-ring-buffer.ts +142 -0
- package/packages/adapters-pino/src/manifest.ts +49 -0
- package/packages/adapters-pino/tsconfig.build.json +15 -0
- package/packages/adapters-pino/tsconfig.json +9 -0
- package/packages/adapters-pino/tsup.config.ts +9 -0
- package/packages/adapters-pino-http/README.md +141 -0
- package/packages/adapters-pino-http/eslint.config.js +27 -0
- package/packages/adapters-pino-http/package.json +46 -0
- package/packages/adapters-pino-http/src/index.ts +229 -0
- package/packages/adapters-pino-http/tsconfig.build.json +15 -0
- package/packages/adapters-pino-http/tsconfig.json +9 -0
- package/packages/adapters-pino-http/tsup.config.ts +9 -0
- package/packages/adapters-qdrant/README.md +166 -0
- package/packages/adapters-qdrant/eslint.config.js +27 -0
- package/packages/adapters-qdrant/package.json +49 -0
- package/packages/adapters-qdrant/src/index.ts +490 -0
- package/packages/adapters-qdrant/src/manifest.ts +54 -0
- package/packages/adapters-qdrant/src/retry.ts +204 -0
- package/packages/adapters-qdrant/tsconfig.build.json +15 -0
- package/packages/adapters-qdrant/tsconfig.json +9 -0
- package/packages/adapters-qdrant/tsup.config.ts +9 -0
- package/packages/adapters-redis/README.md +159 -0
- package/packages/adapters-redis/eslint.config.js +27 -0
- package/packages/adapters-redis/package.json +49 -0
- package/packages/adapters-redis/src/index.ts +164 -0
- package/packages/adapters-redis/src/manifest.ts +49 -0
- package/packages/adapters-redis/tsconfig.build.json +15 -0
- package/packages/adapters-redis/tsconfig.json +9 -0
- package/packages/adapters-redis/tsup.config.ts +9 -0
- package/packages/adapters-snapshot-localfs/README.md +10 -0
- package/packages/adapters-snapshot-localfs/eslint.config.js +2 -0
- package/packages/adapters-snapshot-localfs/package.json +46 -0
- package/packages/adapters-snapshot-localfs/src/index.test.ts +40 -0
- package/packages/adapters-snapshot-localfs/src/index.ts +292 -0
- package/packages/adapters-snapshot-localfs/src/manifest.ts +32 -0
- package/packages/adapters-snapshot-localfs/tsconfig.build.json +15 -0
- package/packages/adapters-snapshot-localfs/tsconfig.json +16 -0
- package/packages/adapters-snapshot-localfs/tsup.config.ts +11 -0
- package/packages/adapters-sqlite/README.md +163 -0
- package/packages/adapters-sqlite/eslint.config.js +27 -0
- package/packages/adapters-sqlite/package.json +54 -0
- package/packages/adapters-sqlite/src/index.test.ts +245 -0
- package/packages/adapters-sqlite/src/index.ts +382 -0
- package/packages/adapters-sqlite/src/manifest.ts +47 -0
- package/packages/adapters-sqlite/src/secure-sql.test.ts +290 -0
- package/packages/adapters-sqlite/src/secure-sql.ts +281 -0
- package/packages/adapters-sqlite/tsconfig.build.json +15 -0
- package/packages/adapters-sqlite/tsconfig.json +9 -0
- package/packages/adapters-sqlite/tsup.config.ts +8 -0
- package/packages/adapters-sqlite/vitest.config.ts +19 -0
- package/packages/adapters-transport/README.md +170 -0
- package/packages/adapters-transport/eslint.config.js +27 -0
- package/packages/adapters-transport/package.json +49 -0
- package/packages/adapters-transport/src/__tests__/unix-socket-server.test.ts +550 -0
- package/packages/adapters-transport/src/index.ts +101 -0
- package/packages/adapters-transport/src/ipc-transport.ts +228 -0
- package/packages/adapters-transport/src/transport.ts +224 -0
- package/packages/adapters-transport/src/types.ts +92 -0
- package/packages/adapters-transport/src/unix-socket-server.ts +193 -0
- package/packages/adapters-transport/src/unix-socket-transport.ts +280 -0
- package/packages/adapters-transport/tsconfig.build.json +15 -0
- package/packages/adapters-transport/tsconfig.json +9 -0
- package/packages/adapters-transport/tsup.config.ts +9 -0
- package/packages/adapters-vibeproxy/README.md +159 -0
- package/packages/adapters-vibeproxy/eslint.config.js +27 -0
- package/packages/adapters-vibeproxy/package.json +51 -0
- package/packages/adapters-vibeproxy/src/index.ts +13 -0
- package/packages/adapters-vibeproxy/src/llm.ts +437 -0
- package/packages/adapters-vibeproxy/src/manifest.ts +51 -0
- package/packages/adapters-vibeproxy/tsconfig.build.json +15 -0
- package/packages/adapters-vibeproxy/tsconfig.json +9 -0
- package/packages/adapters-vibeproxy/tsup.config.ts +8 -0
- package/packages/adapters-workspace-agent/package.json +46 -0
- package/packages/adapters-workspace-agent/src/__tests__/adapter.test.ts +212 -0
- package/packages/adapters-workspace-agent/src/index.ts +220 -0
- package/packages/adapters-workspace-agent/src/manifest.ts +36 -0
- package/packages/adapters-workspace-agent/tsconfig.build.json +15 -0
- package/packages/adapters-workspace-agent/tsconfig.json +16 -0
- package/packages/adapters-workspace-agent/tsup.config.ts +11 -0
- package/packages/adapters-workspace-localfs/README.md +9 -0
- package/packages/adapters-workspace-localfs/eslint.config.js +2 -0
- package/packages/adapters-workspace-localfs/package.json +46 -0
- package/packages/adapters-workspace-localfs/src/index.test.ts +27 -0
- package/packages/adapters-workspace-localfs/src/index.ts +172 -0
- package/packages/adapters-workspace-localfs/src/manifest.ts +32 -0
- package/packages/adapters-workspace-localfs/tsconfig.build.json +15 -0
- package/packages/adapters-workspace-localfs/tsconfig.json +16 -0
- package/packages/adapters-workspace-localfs/tsup.config.ts +11 -0
- package/packages/adapters-workspace-worktree/README.md +9 -0
- package/packages/adapters-workspace-worktree/eslint.config.js +2 -0
- package/packages/adapters-workspace-worktree/package.json +46 -0
- package/packages/adapters-workspace-worktree/src/index.test.ts +38 -0
- package/packages/adapters-workspace-worktree/src/index.ts +245 -0
- package/packages/adapters-workspace-worktree/src/manifest.ts +38 -0
- package/packages/adapters-workspace-worktree/tsconfig.build.json +15 -0
- package/packages/adapters-workspace-worktree/tsconfig.json +16 -0
- package/packages/adapters-workspace-worktree/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +2800 -0
- package/prettierrc.json +1 -0
- package/scripts/devkit-sync.mjs +37 -0
- package/scripts/hooks/post-push +9 -0
- package/scripts/hooks/pre-commit +9 -0
- package/scripts/hooks/pre-push +9 -0
- package/test-integration.ts +242 -0
- package/test.txt +1 -0
- package/tsconfig.base.json +6 -0
- package/tsconfig.build.json +15 -0
- package/tsconfig.json +9 -0
- package/tsconfig.paths.json +26 -0
- package/tsconfig.tools.json +17 -0
- package/tsup.config.bin.ts +34 -0
- package/tsup.config.cli.ts +41 -0
- package/tsup.config.dual.ts +46 -0
- package/tsup.config.ts +36 -0
- package/tsup.external.json +103 -0
- 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,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
|
+
}
|