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