@kb-labs/rest-api-core 2.89.0 → 2.94.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/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/studio-registry.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/rest-api-core/config/schema\n * Zod schema for REST API configuration\n */\n\nimport { z } from 'zod';\n\nexport const restApiConfigSchema = z.object({\n port: z.number().int().positive().default(5050),\n basePath: z.string().default('/api/v1'),\n apiVersion: z.string().default('1.0.0'),\n cors: z.object({\n origins: z.array(z.string()).default(['http://localhost:3000', 'http://localhost:5173']),\n allowCredentials: z.boolean().default(true),\n profile: z.enum(['dev', 'preview', 'prod']).default('dev'),\n }).default({}),\n timeouts: z.object({\n requestTimeout: z.number().int().positive().default(30000),\n bodyLimit: z.number().int().positive().default(10_485_760),\n }).optional(),\n rateLimit: z.object({\n max: z.number().int().positive().default(60),\n timeWindow: z.string().default('1 minute'),\n }).optional(),\n startup: z.object({\n maxConcurrent: z.number().int().positive().default(32),\n queueLimit: z.number().int().nonnegative().default(128),\n timeoutMs: z.number().int().positive().default(5000),\n retryAfterSeconds: z.number().int().positive().default(2),\n }).optional(),\n plugins: z.array(z.string()).default([]),\n mockMode: z.boolean().default(false),\n redis: z\n .object({\n url: z.string().min(1),\n namespace: z.string().default('kb'),\n })\n .optional(),\n events: z\n .object({\n registry: z\n .object({\n token: z.string().min(1),\n headerName: z.string().default('authorization'),\n queryParam: z.string().default('access_token'),\n })\n .optional(),\n })\n .optional(),\n http2: z\n .object({\n enabled: z.boolean().default(false),\n allowHTTP1: z.boolean().default(true), // Fallback for old clients\n })\n .optional(),\n ssl: z\n .object({\n keyPath: z.string().min(1),\n certPath: z.string().min(1),\n })\n .optional(),\n});\n\nexport type RestApiConfig = z.infer<typeof restApiConfigSchema>;\n\n","/**\n * @module @kb-labs/rest-api-core/config/loader\n * Configuration loader using loadBundle from @kb-labs/core-bundle\n */\n\nimport { loadBundle } from '@kb-labs/core-bundle';\nimport { resolveConfig, findNearestConfig, readJsonWithDiagnostics } from '@kb-labs/core-config';\nimport { restApiConfigSchema, type RestApiConfig } from './schema';\n\n/**\n * Load REST API configuration\n */\nexport async function loadRestApiConfig(\n cwd: string = process.cwd(),\n cliOverrides?: Partial<RestApiConfig>\n): Promise<{ config: RestApiConfig; diagnostics: Array<{ level: string; code: string; message: string }> }> {\n // Try to load bundle with 'restApi' product\n // Note: if 'restApi' is not registered as ProductId, we'll fall back to direct config loading\n let bundleConfig: any = {};\n \n try {\n const bundle = await loadBundle({\n cwd,\n product: 'restApi' as any, // TODO: Add 'restApi' to ProductId type\n profileId: 'default',\n });\n bundleConfig = bundle.config;\n } catch {\n // If bundle loading fails (product not registered), try direct config loading\n const { path: configPath } = await findNearestConfig({\n startDir: cwd,\n filenames: ['.kb/kb.config.json', '.kb/kb.config.yaml'],\n });\n \n if (configPath) {\n const readResult = await readJsonWithDiagnostics<any>(configPath);\n if (readResult.ok && readResult.data?.rest) {\n bundleConfig = readResult.data.rest;\n }\n }\n }\n \n const defaults: RestApiConfig = {\n port: 5050,\n basePath: '/api/v1',\n apiVersion: '1.0.0',\n cors: {\n origins: ['http://localhost:3000', 'http://localhost:5173'],\n allowCredentials: true,\n profile: 'dev',\n },\n timeouts: {\n requestTimeout: 30000,\n bodyLimit: 10_485_760,\n },\n rateLimit: {\n // 600/min for dev (dashboard needs ~10 requests per page load)\n // Override with KB_REST_RATE_LIMIT_MAX=60 for production public API\n max: 600,\n timeWindow: '1 minute',\n },\n plugins: [],\n mockMode: false,\n };\n\n const envMapper = (env: NodeJS.ProcessEnv): Partial<RestApiConfig> => {\n const overrides: Partial<RestApiConfig> = {};\n\n if (env.KB_REST_PORT) {\n const parsedPort = Number.parseInt(env.KB_REST_PORT, 10);\n if (!Number.isNaN(parsedPort)) {\n overrides.port = parsedPort;\n }\n }\n\n if (env.KB_REST_BASE_PATH) {\n overrides.basePath = env.KB_REST_BASE_PATH;\n }\n\n if (env.KB_REST_API_VERSION) {\n overrides.apiVersion = env.KB_REST_API_VERSION;\n }\n\n if (env.KB_REST_CORS_ORIGINS) {\n const origins = env.KB_REST_CORS_ORIGINS.split(',').map(origin => origin.trim()).filter(Boolean);\n overrides.cors = {\n ...(overrides.cors ?? defaults.cors),\n origins,\n };\n }\n\n if (env.KB_REST_CORS_PROFILE) {\n overrides.cors = {\n ...(overrides.cors ?? defaults.cors),\n profile: env.KB_REST_CORS_PROFILE as RestApiConfig['cors']['profile'],\n };\n }\n\n if (env.KB_REST_MOCK_MODE === 'true' || env.KB_REST_MOCK_MODE === '1') {\n overrides.mockMode = true;\n }\n\n if (env.KB_REST_REDIS_URL) {\n overrides.redis = {\n ...(overrides.redis ?? {}),\n url: env.KB_REST_REDIS_URL,\n namespace: overrides.redis?.namespace ?? defaults.redis?.namespace ?? 'kb',\n } as RestApiConfig['redis'];\n }\n\n if (env.KB_REST_REDIS_NAMESPACE) {\n overrides.redis = {\n ...(overrides.redis ?? (env.KB_REST_REDIS_URL ? { url: env.KB_REST_REDIS_URL } : defaults.redis ?? {})),\n namespace: env.KB_REST_REDIS_NAMESPACE,\n } as RestApiConfig['redis'];\n }\n\n if (env.KB_REST_RATE_LIMIT_MAX) {\n const parsedMax = Number.parseInt(env.KB_REST_RATE_LIMIT_MAX, 10);\n if (!Number.isNaN(parsedMax)) {\n overrides.rateLimit = {\n ...(overrides.rateLimit ?? defaults.rateLimit ?? { max: 600, timeWindow: '1 minute' }),\n max: parsedMax,\n };\n }\n }\n\n if (env.KB_REST_RATE_LIMIT_WINDOW) {\n overrides.rateLimit = {\n ...(overrides.rateLimit ?? defaults.rateLimit ?? { max: 600, timeWindow: '1 minute' }),\n timeWindow: env.KB_REST_RATE_LIMIT_WINDOW,\n };\n }\n\n if (env.KB_REST_REQUEST_TIMEOUT) {\n const parsedTimeout = Number.parseInt(env.KB_REST_REQUEST_TIMEOUT, 10);\n if (!Number.isNaN(parsedTimeout)) {\n const baseTimeout = overrides.timeouts ?? defaults.timeouts;\n overrides.timeouts = {\n requestTimeout: parsedTimeout,\n bodyLimit: baseTimeout?.bodyLimit ?? defaults.timeouts?.bodyLimit ?? 10_485_760,\n };\n }\n }\n\n if (env.KB_REST_BODY_LIMIT) {\n const parsedBodyLimit = Number.parseInt(env.KB_REST_BODY_LIMIT, 10);\n if (!Number.isNaN(parsedBodyLimit)) {\n const baseTimeout = overrides.timeouts ?? defaults.timeouts;\n overrides.timeouts = {\n requestTimeout: baseTimeout?.requestTimeout ?? defaults.timeouts?.requestTimeout ?? 30000,\n bodyLimit: parsedBodyLimit,\n };\n }\n }\n\n return overrides;\n };\n \n // Resolve configuration: defaults → bundleConfig → env → cliOverrides\n const resolved = resolveConfig<RestApiConfig>({\n defaults,\n fileConfig: bundleConfig,\n envMapper,\n cliOverrides,\n validate: (cfg) => {\n const result = restApiConfigSchema.safeParse(cfg);\n if (result.success) {\n return { ok: true };\n }\n return {\n ok: false,\n diagnostics: result.error.errors.map((err) => ({\n level: 'error' as const,\n code: 'CONFIG_VALIDATION_ERROR',\n message: `${err.path.join('.')}: ${err.message}`,\n })),\n };\n },\n });\n \n // Parse with Zod to get properly typed config\n const validated = restApiConfigSchema.parse(resolved.value);\n \n return {\n config: validated,\n diagnostics: resolved.diagnostics,\n };\n}\n\n","/**\n * @module @kb-labs/rest-api-core/studio-registry\n *\n * Transforms ManifestV3 studio sections into StudioRegistryV2 format.\n *\n * Each plugin entry includes:\n * - remoteEntryUrl: browser-facing URL (proxied through gateway)\n * - widgetBundleDir: absolute filesystem path to dist/widgets/ (used by gateway to serve files)\n */\n\nimport { join } from 'node:path';\nimport { statSync } from 'node:fs';\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts';\nimport type { StudioRegistryV2, StudioPluginEntryV2 } from '@kb-labs/rest-api-contracts';\n\nfunction getRemoteEntryVersion(widgetBundleDir: string): string {\n try {\n const stat = statSync(join(widgetBundleDir, 'remoteEntry.js'));\n return String(Math.floor(stat.mtimeMs));\n } catch {\n return '0';\n }\n}\n\n/**\n * Convert a single ManifestV3 with studio V2 config to a registry entry.\n *\n * @param manifest - Plugin manifest with studio V2 config\n * @param pluginRoot - Absolute path to the plugin package root (where package.json lives)\n */\nexport function manifestToRegistryEntry(\n manifest: ManifestV3,\n pluginRoot: string,\n): StudioPluginEntryV2 | null {\n const studio = manifest.studio;\n if (!studio || studio.version !== 2) {\n return null;\n }\n\n return {\n pluginId: manifest.id,\n displayName: manifest.display?.name,\n pluginVersion: manifest.version,\n remoteName: studio.remoteName,\n remoteEntryUrl: `/plugins/${manifest.id}/widgets/remoteEntry.js?v=${getRemoteEntryVersion(join(pluginRoot, 'dist', 'widgets'))}`,\n widgetBundleDir: join(pluginRoot, 'dist', 'widgets'),\n pages: studio.pages ?? [],\n menus: studio.menus ?? [],\n };\n}\n\n/**\n * Combine multiple manifests into a StudioRegistryV2.\n */\nexport function combineManifestsToRegistry(\n manifests: Array<{ manifest: ManifestV3; pluginRoot: string }>,\n): StudioRegistryV2 {\n const plugins: StudioPluginEntryV2[] = [];\n\n for (const { manifest, pluginRoot } of manifests) {\n const entry = manifestToRegistryEntry(manifest, pluginRoot);\n if (entry) {\n plugins.push(entry);\n }\n }\n\n return {\n schema: 'kb.studio/2',\n schemaVersion: 2,\n generatedAt: new Date().toISOString(),\n plugins,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/studio-registry.ts"],"names":[],"mappings":";;;;;;;AAOO,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC9C,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,SAAS,CAAA;AAAA,EACtC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,OAAO,CAAA;AAAA,EACtC,IAAA,EAAM,EAAE,MAAA,CAAO;AAAA,IACb,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,uBAAA,EAAyB,uBAAuB,CAAC,CAAA;AAAA,IACvF,gBAAA,EAAkB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IAC1C,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,WAAW,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK;AAAA,GAC1D,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACb,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,cAAA,EAAgB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAK,CAAA;AAAA,IACzD,SAAA,EAAW,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAU;AAAA,GAC1D,EAAE,QAAA,EAAS;AAAA,EACZ,SAAA,EAAW,EAAE,MAAA,CAAO;AAAA,IAClB,GAAA,EAAK,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IAC3C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,UAAU;AAAA,GAC1C,EAAE,QAAA,EAAS;AAAA,EACZ,OAAA,EAAS,EAAE,MAAA,CAAO;AAAA,IAChB,aAAA,EAAe,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IACrD,UAAA,EAAY,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,IACtD,SAAA,EAAW,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAI,CAAA;AAAA,IACnD,iBAAA,EAAmB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC;AAAA,GACzD,EAAE,QAAA,EAAS;AAAA,EACZ,OAAA,EAAS,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACvC,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EACnC,KAAA,EAAO,EACJ,MAAA,CAAO;AAAA,IACN,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACrB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,IAAI;AAAA,GACnC,EACA,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,QAAA,EAAU,EACP,MAAA,CAAO;AAAA,MACN,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACvB,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,eAAe,CAAA;AAAA,MAC9C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,cAAc;AAAA,KAC9C,EACA,QAAA;AAAS,GACb,EACA,QAAA,EAAS;AAAA,EACZ,KAAA,EAAO,EACJ,MAAA,CAAO;AAAA,IACN,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,IAClC,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI;AAAA;AAAA,GACrC,EACA,QAAA,EAAS;AAAA,EACZ,GAAA,EAAK,EACF,MAAA,CAAO;AAAA,IACN,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACzB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AAAA,GAC3B,EACA,QAAA;AACL,CAAC;;;ACjDD,eAAsB,iBAAA,CACpB,GAAA,GAAc,OAAA,CAAQ,GAAA,IACtB,YAAA,EAC0G;AAG1G,EAAA,IAAI,eAAwC,EAAC;AAE7C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW;AAAA,MAC9B,GAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,iBAAA,CAAkB;AAAA,MACnD,QAAA,EAAU,GAAA;AAAA,MACV,SAAA,EAAW,CAAC,oBAAA,EAAsB,oBAAoB;AAAA,KACvD,CAAA;AAED,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,UAAA,GAAa,MAAM,uBAAA,CAA6B,UAAU,CAAA;AAChE,MAAA,IAAI,UAAA,CAAW,EAAA,IAAM,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM;AAC1C,QAAA,YAAA,GAAe,WAAW,IAAA,CAAK,IAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,IAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,CAAC,uBAAA,EAAyB,uBAAuB,CAAA;AAAA,MAC1D,gBAAA,EAAkB,IAAA;AAAA,MAClB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAU;AAAA,MACR,cAAA,EAAgB,GAAA;AAAA,MAChB,SAAA,EAAW;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA;AAAA;AAAA,MAGT,GAAA,EAAK,GAAA;AAAA,MACL,UAAA,EAAY;AAAA,KACd;AAAA,IACA,SAAS,EAAC;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAmD;AACpE,IAAA,MAAM,YAAoC,EAAC;AAE3C,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,cAAc,EAAE,CAAA;AACvD,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAC7B,QAAA,SAAA,CAAU,IAAA,GAAO,UAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,SAAA,CAAU,WAAW,GAAA,CAAI,iBAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,IAAI,mBAAA,EAAqB;AAC3B,MAAA,SAAA,CAAU,aAAa,GAAA,CAAI,mBAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,IAAI,oBAAA,EAAsB;AAC5B,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,oBAAA,CAAqB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/F,MAAA,SAAA,CAAU,IAAA,GAAO;AAAA,QACf,GAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,QAC/B;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,oBAAA,EAAsB;AAC5B,MAAA,SAAA,CAAU,IAAA,GAAO;AAAA,QACf,GAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,QAC/B,SAAS,GAAA,CAAI;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,iBAAA,KAAsB,MAAA,IAAU,GAAA,CAAI,sBAAsB,GAAA,EAAK;AACrE,MAAA,SAAA,CAAU,QAAA,GAAW,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,SAAA,CAAU,KAAA,GAAQ;AAAA,QAChB,GAAI,SAAA,CAAU,KAAA,IAAS,EAAC;AAAA,QACxB,KAAK,GAAA,CAAI,iBAAA;AAAA,QACT,WAAW,SAAA,CAAU,KAAA,EAAO,SAAA,IAAa,QAAA,CAAS,OAAO,SAAA,IAAa;AAAA,OACxE;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,uBAAA,EAAyB;AAC/B,MAAA,SAAA,CAAU,KAAA,GAAQ;AAAA,QAChB,GAAI,SAAA,CAAU,KAAA,KAAU,GAAA,CAAI,iBAAA,GAAoB,EAAE,GAAA,EAAK,GAAA,CAAI,iBAAA,EAAkB,GAAI,QAAA,CAAS,KAAA,IAAS,EAAC,CAAA;AAAA,QACpG,WAAW,GAAA,CAAI;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,sBAAA,EAAwB;AAC9B,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,wBAAwB,EAAE,CAAA;AAChE,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5B,QAAA,SAAA,CAAU,SAAA,GAAY;AAAA,UACpB,GAAI,UAAU,SAAA,IAAa,QAAA,CAAS,aAAa,EAAE,GAAA,EAAK,GAAA,EAAK,UAAA,EAAY,UAAA,EAAW;AAAA,UACpF,GAAA,EAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,yBAAA,EAA2B;AACjC,MAAA,SAAA,CAAU,SAAA,GAAY;AAAA,QACpB,GAAI,UAAU,SAAA,IAAa,QAAA,CAAS,aAAa,EAAE,GAAA,EAAK,GAAA,EAAK,UAAA,EAAY,UAAA,EAAW;AAAA,QACpF,YAAY,GAAA,CAAI;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,uBAAA,EAAyB;AAC/B,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,yBAAyB,EAAE,CAAA;AACrE,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,EAAG;AAChC,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,QAAA,IAAY,QAAA,CAAS,QAAA;AACnD,QAAA,SAAA,CAAU,QAAA,GAAW;AAAA,UACnB,cAAA,EAAgB,aAAA;AAAA,UAChB,SAAA,EAAW,WAAA,EAAa,SAAA,IAAa,QAAA,CAAS,UAAU,SAAA,IAAa;AAAA,SACvE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAI,kBAAA,EAAoB;AAC1B,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,oBAAoB,EAAE,CAAA;AAClE,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA,EAAG;AAClC,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,QAAA,IAAY,QAAA,CAAS,QAAA;AACnD,QAAA,SAAA,CAAU,QAAA,GAAW;AAAA,UACnB,cAAA,EAAgB,WAAA,EAAa,cAAA,IAAkB,QAAA,CAAS,UAAU,cAAA,IAAkB,GAAA;AAAA,UACpF,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,WAAW,aAAA,CAA6B;AAAA,IAC5C,QAAA;AAAA,IACA,UAAA,EAAY,YAAA;AAAA,IACZ,SAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,GAAG,CAAA;AAChD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,aAAa,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,UAC7C,KAAA,EAAO,OAAA;AAAA,UACP,IAAA,EAAM,yBAAA;AAAA,UACN,OAAA,EAAS,GAAG,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA;AAAA,SAChD,CAAE;AAAA,OACJ;AAAA,IACF;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAE1D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,aAAa,QAAA,CAAS;AAAA,GACxB;AACF;AC7KA,SAAS,sBAAsB,eAAA,EAAiC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAC7D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAQO,SAAS,uBAAA,CACd,UACA,UAAA,EAC4B;AAC5B,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,OAAA,KAAY,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,UAAU,QAAA,CAAS,EAAA;AAAA,IACnB,WAAA,EAAa,SAAS,OAAA,EAAS,IAAA;AAAA,IAC/B,eAAe,QAAA,CAAS,OAAA;AAAA,IACxB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAA,EAAgB,CAAA,SAAA,EAAY,QAAA,CAAS,EAAE,CAAA,0BAAA,EAA6B,qBAAA,CAAsB,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAC,CAAC,CAAA,CAAA;AAAA,IAC9H,eAAA,EAAiB,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAA;AAAA,IACnD,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,IACxB,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS;AAAC,GAC1B;AACF;AAKO,SAAS,2BACd,SAAA,EACkB;AAClB,EAAA,MAAM,UAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,EAAE,QAAA,EAAU,UAAA,EAAW,IAAK,SAAA,EAAW;AAChD,IAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,QAAA,EAAU,UAAU,CAAA;AAC1D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,aAAA;AAAA,IACR,aAAA,EAAe,CAAA;AAAA,IACf,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/rest-api-core/config/schema\n * Zod schema for REST API configuration\n */\n\nimport { z } from 'zod';\n\nexport const restApiConfigSchema = z.object({\n port: z.number().int().positive().default(5050),\n basePath: z.string().default('/api/v1'),\n apiVersion: z.string().default('1.0.0'),\n cors: z.object({\n origins: z.array(z.string()).default(['http://localhost:3000', 'http://localhost:5173']),\n allowCredentials: z.boolean().default(true),\n profile: z.enum(['dev', 'preview', 'prod']).default('dev'),\n }).default({}),\n timeouts: z.object({\n requestTimeout: z.number().int().positive().default(30000),\n bodyLimit: z.number().int().positive().default(10_485_760),\n }).optional(),\n rateLimit: z.object({\n max: z.number().int().positive().default(60),\n timeWindow: z.string().default('1 minute'),\n }).optional(),\n startup: z.object({\n maxConcurrent: z.number().int().positive().default(32),\n queueLimit: z.number().int().nonnegative().default(128),\n timeoutMs: z.number().int().positive().default(5000),\n retryAfterSeconds: z.number().int().positive().default(2),\n }).optional(),\n plugins: z.array(z.string()).default([]),\n mockMode: z.boolean().default(false),\n redis: z\n .object({\n url: z.string().min(1),\n namespace: z.string().default('kb'),\n })\n .optional(),\n events: z\n .object({\n registry: z\n .object({\n token: z.string().min(1),\n headerName: z.string().default('authorization'),\n queryParam: z.string().default('access_token'),\n })\n .optional(),\n })\n .optional(),\n http2: z\n .object({\n enabled: z.boolean().default(false),\n allowHTTP1: z.boolean().default(true), // Fallback for old clients\n })\n .optional(),\n ssl: z\n .object({\n keyPath: z.string().min(1),\n certPath: z.string().min(1),\n })\n .optional(),\n});\n\nexport type RestApiConfig = z.infer<typeof restApiConfigSchema>;\n\n","/**\n * @module @kb-labs/rest-api-core/config/loader\n * Configuration loader using loadBundle from @kb-labs/core-bundle\n */\n\nimport { loadBundle, type ProductId } from '@kb-labs/core-bundle';\nimport { resolveConfig, findNearestConfig, readJsonWithDiagnostics } from '@kb-labs/core-config';\nimport { restApiConfigSchema, type RestApiConfig } from './schema';\n\n/**\n * Load REST API configuration\n */\nexport async function loadRestApiConfig(\n cwd: string = process.cwd(),\n cliOverrides?: Partial<RestApiConfig>\n): Promise<{ config: RestApiConfig; diagnostics: Array<{ level: string; code: string; message: string }> }> {\n // Try to load bundle with 'restApi' product\n // Note: if 'restApi' is not registered as ProductId, we'll fall back to direct config loading\n let bundleConfig: Record<string, unknown> = {};\n \n try {\n const bundle = await loadBundle({\n cwd,\n product: 'restApi' as unknown as ProductId,\n profileId: 'default',\n });\n bundleConfig = bundle.config;\n } catch {\n // If bundle loading fails (product not registered), try direct config loading\n const { path: configPath } = await findNearestConfig({\n startDir: cwd,\n filenames: ['.kb/kb.config.json', '.kb/kb.config.yaml'],\n });\n \n if (configPath) {\n const readResult = await readJsonWithDiagnostics<any>(configPath);\n if (readResult.ok && readResult.data?.rest) {\n bundleConfig = readResult.data.rest;\n }\n }\n }\n \n const defaults: RestApiConfig = {\n port: 5050,\n basePath: '/api/v1',\n apiVersion: '1.0.0',\n cors: {\n origins: ['http://localhost:3000', 'http://localhost:5173'],\n allowCredentials: true,\n profile: 'dev',\n },\n timeouts: {\n requestTimeout: 30000,\n bodyLimit: 10_485_760,\n },\n rateLimit: {\n // 600/min for dev (dashboard needs ~10 requests per page load)\n // Override with KB_REST_RATE_LIMIT_MAX=60 for production public API\n max: 600,\n timeWindow: '1 minute',\n },\n plugins: [],\n mockMode: false,\n };\n\n const envMapper = (env: NodeJS.ProcessEnv): Partial<RestApiConfig> => {\n const overrides: Partial<RestApiConfig> = {};\n\n if (env.KB_REST_PORT) {\n const parsedPort = Number.parseInt(env.KB_REST_PORT, 10);\n if (!Number.isNaN(parsedPort)) {\n overrides.port = parsedPort;\n }\n }\n\n if (env.KB_REST_BASE_PATH) {\n overrides.basePath = env.KB_REST_BASE_PATH;\n }\n\n if (env.KB_REST_API_VERSION) {\n overrides.apiVersion = env.KB_REST_API_VERSION;\n }\n\n if (env.KB_REST_CORS_ORIGINS) {\n const origins = env.KB_REST_CORS_ORIGINS.split(',').map(origin => origin.trim()).filter(Boolean);\n overrides.cors = {\n ...(overrides.cors ?? defaults.cors),\n origins,\n };\n }\n\n if (env.KB_REST_CORS_PROFILE) {\n overrides.cors = {\n ...(overrides.cors ?? defaults.cors),\n profile: env.KB_REST_CORS_PROFILE as RestApiConfig['cors']['profile'],\n };\n }\n\n if (env.KB_REST_MOCK_MODE === 'true' || env.KB_REST_MOCK_MODE === '1') {\n overrides.mockMode = true;\n }\n\n if (env.KB_REST_REDIS_URL) {\n overrides.redis = {\n ...(overrides.redis ?? {}),\n url: env.KB_REST_REDIS_URL,\n namespace: overrides.redis?.namespace ?? defaults.redis?.namespace ?? 'kb',\n } as RestApiConfig['redis'];\n }\n\n if (env.KB_REST_REDIS_NAMESPACE) {\n overrides.redis = {\n ...(overrides.redis ?? (env.KB_REST_REDIS_URL ? { url: env.KB_REST_REDIS_URL } : defaults.redis ?? {})),\n namespace: env.KB_REST_REDIS_NAMESPACE,\n } as RestApiConfig['redis'];\n }\n\n if (env.KB_REST_RATE_LIMIT_MAX) {\n const parsedMax = Number.parseInt(env.KB_REST_RATE_LIMIT_MAX, 10);\n if (!Number.isNaN(parsedMax)) {\n overrides.rateLimit = {\n ...(overrides.rateLimit ?? defaults.rateLimit ?? { max: 600, timeWindow: '1 minute' }),\n max: parsedMax,\n };\n }\n }\n\n if (env.KB_REST_RATE_LIMIT_WINDOW) {\n overrides.rateLimit = {\n ...(overrides.rateLimit ?? defaults.rateLimit ?? { max: 600, timeWindow: '1 minute' }),\n timeWindow: env.KB_REST_RATE_LIMIT_WINDOW,\n };\n }\n\n if (env.KB_REST_REQUEST_TIMEOUT) {\n const parsedTimeout = Number.parseInt(env.KB_REST_REQUEST_TIMEOUT, 10);\n if (!Number.isNaN(parsedTimeout)) {\n const baseTimeout = overrides.timeouts ?? defaults.timeouts;\n overrides.timeouts = {\n requestTimeout: parsedTimeout,\n bodyLimit: baseTimeout?.bodyLimit ?? defaults.timeouts?.bodyLimit ?? 10_485_760,\n };\n }\n }\n\n if (env.KB_REST_BODY_LIMIT) {\n const parsedBodyLimit = Number.parseInt(env.KB_REST_BODY_LIMIT, 10);\n if (!Number.isNaN(parsedBodyLimit)) {\n const baseTimeout = overrides.timeouts ?? defaults.timeouts;\n overrides.timeouts = {\n requestTimeout: baseTimeout?.requestTimeout ?? defaults.timeouts?.requestTimeout ?? 30000,\n bodyLimit: parsedBodyLimit,\n };\n }\n }\n\n return overrides;\n };\n \n // Resolve configuration: defaults → bundleConfig → env → cliOverrides\n const resolved = resolveConfig<RestApiConfig>({\n defaults,\n fileConfig: bundleConfig,\n envMapper,\n cliOverrides,\n validate: (cfg) => {\n const result = restApiConfigSchema.safeParse(cfg);\n if (result.success) {\n return { ok: true };\n }\n return {\n ok: false,\n diagnostics: result.error.errors.map((err) => ({\n level: 'error' as const,\n code: 'CONFIG_VALIDATION_ERROR',\n message: `${err.path.join('.')}: ${err.message}`,\n })),\n };\n },\n });\n \n // Parse with Zod to get properly typed config\n const validated = restApiConfigSchema.parse(resolved.value);\n \n return {\n config: validated,\n diagnostics: resolved.diagnostics,\n };\n}\n\n","/**\n * @module @kb-labs/rest-api-core/studio-registry\n *\n * Transforms ManifestV3 studio sections into StudioRegistryV2 format.\n *\n * Each plugin entry includes:\n * - remoteEntryUrl: browser-facing URL (proxied through gateway)\n * - widgetBundleDir: absolute filesystem path to dist/widgets/ (used by gateway to serve files)\n */\n\nimport { join } from 'node:path';\nimport { statSync } from 'node:fs';\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts';\nimport type { StudioRegistryV2, StudioPluginEntryV2 } from '@kb-labs/rest-api-contracts';\n\nfunction getRemoteEntryVersion(widgetBundleDir: string): string {\n try {\n const stat = statSync(join(widgetBundleDir, 'remoteEntry.js'));\n return String(Math.floor(stat.mtimeMs));\n } catch {\n return '0';\n }\n}\n\n/**\n * Convert a single ManifestV3 with studio V2 config to a registry entry.\n *\n * @param manifest - Plugin manifest with studio V2 config\n * @param pluginRoot - Absolute path to the plugin package root (where package.json lives)\n */\nexport function manifestToRegistryEntry(\n manifest: ManifestV3,\n pluginRoot: string,\n): StudioPluginEntryV2 | null {\n const studio = manifest.studio;\n if (!studio || studio.version !== 2) {\n return null;\n }\n\n return {\n pluginId: manifest.id,\n displayName: manifest.display?.name,\n pluginVersion: manifest.version,\n remoteName: studio.remoteName,\n remoteEntryUrl: `/plugins/${manifest.id}/widgets/remoteEntry.js?v=${getRemoteEntryVersion(join(pluginRoot, 'dist', 'widgets'))}`,\n widgetBundleDir: join(pluginRoot, 'dist', 'widgets'),\n pages: studio.pages ?? [],\n menus: studio.menus ?? [],\n };\n}\n\n/**\n * Combine multiple manifests into a StudioRegistryV2.\n */\nexport function combineManifestsToRegistry(\n manifests: Array<{ manifest: ManifestV3; pluginRoot: string }>,\n): StudioRegistryV2 {\n const plugins: StudioPluginEntryV2[] = [];\n\n for (const { manifest, pluginRoot } of manifests) {\n const entry = manifestToRegistryEntry(manifest, pluginRoot);\n if (entry) {\n plugins.push(entry);\n }\n }\n\n return {\n schema: 'kb.studio/2',\n schemaVersion: 2,\n generatedAt: new Date().toISOString(),\n plugins,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/rest-api-core",
|
|
3
3
|
"description": "Core REST API functionality for KB Labs, including request handling and routing",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.94.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"zod": "^3.25.76",
|
|
21
|
-
"@kb-labs/core-
|
|
22
|
-
"@kb-labs/
|
|
23
|
-
"@kb-labs/
|
|
24
|
-
"@kb-labs/
|
|
21
|
+
"@kb-labs/core-config": "2.94.0",
|
|
22
|
+
"@kb-labs/plugin-contracts": "2.94.0",
|
|
23
|
+
"@kb-labs/rest-api-contracts": "2.94.0",
|
|
24
|
+
"@kb-labs/core-bundle": "2.94.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^24.3.3",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"tsup": "^8.5.0",
|
|
30
30
|
"typescript": "^5.6.3",
|
|
31
31
|
"vitest": "^3.2.4",
|
|
32
|
-
"@kb-labs/devkit": "2.
|
|
32
|
+
"@kb-labs/devkit": "2.94.0"
|
|
33
33
|
},
|
|
34
34
|
"engines": {
|
|
35
35
|
"node": ">=20.0.0",
|