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