From 21ad6ed978c3d0f05be0d9aeeafb252e4cf7b93f Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 20 Mar 2026 17:31:53 -0700 Subject: [PATCH] feat(backend): add @bytelyst/backend-flags + backend-telemetry, fix config defaults - Add @bytelyst/backend-flags and @bytelyst/backend-telemetry packages - Create feature-flags.ts and telemetry.ts wrappers using shared packages - Add TELEMETRY_ENABLED, FEATURE_FLAGS_ENABLED, DB_PROVIDER=memory, JWT_SECRET dev default - 80/80 tests pass (integration tests now work without env vars) --- backend/package-lock.json | 26 ++++++++++++++++++++++++++ backend/package.json | 2 ++ backend/src/lib/config.ts | 4 ++++ backend/src/lib/feature-flags.ts | 16 ++++++++++++++++ backend/src/lib/telemetry.ts | 8 ++++++++ 5 files changed, 56 insertions(+) create mode 100644 backend/src/lib/feature-flags.ts create mode 100644 backend/src/lib/telemetry.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index 397bc41..3249c86 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,8 @@ "@azure/cosmos": "^4.2.0", "@bytelyst/auth": "file:../../learning_ai_common_plat/packages/auth", "@bytelyst/backend-config": "file:../../learning_ai_common_plat/packages/backend-config", + "@bytelyst/backend-flags": "file:../../learning_ai_common_plat/packages/backend-flags", + "@bytelyst/backend-telemetry": "file:../../learning_ai_common_plat/packages/backend-telemetry", "@bytelyst/config": "file:../../learning_ai_common_plat/packages/config", "@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos", "@bytelyst/datastore": "file:../../learning_ai_common_plat/packages/datastore", @@ -52,6 +54,22 @@ "vitest": "^3.0.5" } }, + "../../learning_ai_common_plat/packages/backend-flags": { + "name": "@bytelyst/backend-flags", + "version": "0.1.0", + "devDependencies": { + "typescript": "^5.7.3", + "vitest": "^3.0.5" + } + }, + "../../learning_ai_common_plat/packages/backend-telemetry": { + "name": "@bytelyst/backend-telemetry", + "version": "0.1.0", + "devDependencies": { + "typescript": "^5.7.3", + "vitest": "^3.0.5" + } + }, "../../learning_ai_common_plat/packages/config": { "name": "@bytelyst/config", "version": "0.1.0", @@ -399,6 +417,14 @@ "resolved": "../../learning_ai_common_plat/packages/backend-config", "link": true }, + "node_modules/@bytelyst/backend-flags": { + "resolved": "../../learning_ai_common_plat/packages/backend-flags", + "link": true + }, + "node_modules/@bytelyst/backend-telemetry": { + "resolved": "../../learning_ai_common_plat/packages/backend-telemetry", + "link": true + }, "node_modules/@bytelyst/config": { "resolved": "../../learning_ai_common_plat/packages/config", "link": true diff --git a/backend/package.json b/backend/package.json index 1e0a913..b3de137 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,6 +19,8 @@ "@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos", "@bytelyst/datastore": "file:../../learning_ai_common_plat/packages/datastore", "@bytelyst/backend-config": "file:../../learning_ai_common_plat/packages/backend-config", + "@bytelyst/backend-flags": "file:../../learning_ai_common_plat/packages/backend-flags", + "@bytelyst/backend-telemetry": "file:../../learning_ai_common_plat/packages/backend-telemetry", "@bytelyst/errors": "file:../../learning_ai_common_plat/packages/errors", "@bytelyst/fastify-auth": "file:../../learning_ai_common_plat/packages/fastify-auth", "@bytelyst/fastify-core": "file:../../learning_ai_common_plat/packages/fastify-core", diff --git a/backend/src/lib/config.ts b/backend/src/lib/config.ts index 200b4b3..5d8464f 100644 --- a/backend/src/lib/config.ts +++ b/backend/src/lib/config.ts @@ -5,11 +5,15 @@ import { PRODUCT_ID } from './product-config.js'; const envSchema = baseBackendConfigSchema.extend({ PORT: baseBackendConfigSchema.shape.PORT.default(4016), SERVICE_NAME: baseBackendConfigSchema.shape.SERVICE_NAME.default('notelett-backend'), + DB_PROVIDER: baseBackendConfigSchema.shape.DB_PROVIDER.default('memory'), + JWT_SECRET: z.string().default('dev-secret-do-not-use-in-prod'), COSMOS_DATABASE: baseBackendConfigSchema.shape.COSMOS_DATABASE.default('bytelyst'), PRODUCT_ID: z.string().default(PRODUCT_ID), PLATFORM_SERVICE_URL: z.string().default('http://localhost:4003'), EXTRACTION_SERVICE_URL: z.string().default('http://localhost:4005'), MCP_SERVER_URL: z.string().default('http://localhost:4007'), + TELEMETRY_ENABLED: z.coerce.boolean().default(false), + FEATURE_FLAGS_ENABLED: z.coerce.boolean().default(false), }); export const config = envSchema.parse(process.env); diff --git a/backend/src/lib/feature-flags.ts b/backend/src/lib/feature-flags.ts new file mode 100644 index 0000000..8d84761 --- /dev/null +++ b/backend/src/lib/feature-flags.ts @@ -0,0 +1,16 @@ +import { createFlagRegistry } from '@bytelyst/backend-flags'; +import { config } from './config.js'; + +const registry = createFlagRegistry({ + defaults: { + 'notes.enabled': true, + 'workspaces.enabled': true, + 'relationships.enabled': true, + 'tasks.enabled': true, + 'artifacts.enabled': true, + 'mcp.enabled': true, + }, + enabled: config.FEATURE_FLAGS_ENABLED, +}); + +export const { isFeatureEnabled, getAllFlags, setFlag } = registry; diff --git a/backend/src/lib/telemetry.ts b/backend/src/lib/telemetry.ts new file mode 100644 index 0000000..9bd6411 --- /dev/null +++ b/backend/src/lib/telemetry.ts @@ -0,0 +1,8 @@ +import { createTelemetryBuffer } from '@bytelyst/backend-telemetry'; +import { config } from './config.js'; + +export type { TelemetryEvent } from '@bytelyst/backend-telemetry'; + +const buffer = createTelemetryBuffer({ enabled: config.TELEMETRY_ENABLED }); + +export const { trackEvent, getBufferedEvents, flushEvents } = buffer;