@smplkit/sdk 1.3.15 → 1.3.17
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.cjs +10 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/config/client.ts","../src/errors.ts","../src/config/resolve.ts","../src/config/types.ts","../src/config/proxy.ts","../src/helpers.ts","../src/flags/client.ts","../src/flags/models.ts","../src/logging/client.ts","../src/logging/models.ts","../src/ws.ts","../src/resolve.ts","../src/flags/types.ts","../src/logging/types.ts"],"sourcesContent":["/**\n * Top-level SDK client — SmplClient.\n *\n * The main entry point for the smplkit TypeScript SDK. Provides access\n * to sub-clients for each API domain (config, flags, logging).\n */\n\nimport createClient from \"openapi-fetch\";\nimport { ConfigClient } from \"./config/client.js\";\nimport { FlagsClient } from \"./flags/client.js\";\nimport { LoggingClient } from \"./logging/client.js\";\nimport { SharedWebSocket } from \"./ws.js\";\nimport { resolveApiKey } from \"./resolve.js\";\nimport { SmplError } from \"./errors.js\";\n\nconst APP_BASE_URL = \"https://app.smplkit.com\";\n\nconst NO_ENVIRONMENT_MESSAGE =\n \"No environment provided. Set one of:\\n\" +\n \" 1. Pass environment to the constructor\\n\" +\n \" 2. Set the SMPLKIT_ENVIRONMENT environment variable\";\n\nconst NO_SERVICE_MESSAGE =\n \"No service provided. Set one of:\\n\" +\n \" 1. Pass service in options\\n\" +\n \" 2. Set the SMPLKIT_SERVICE environment variable\";\n\n/** Configuration options for the {@link SmplClient}. */\nexport interface SmplClientOptions {\n /**\n * API key for authenticating with the smplkit platform.\n * When omitted, the SDK resolves it from the `SMPLKIT_API_KEY`\n * environment variable or the `~/.smplkit` configuration file.\n */\n apiKey?: string;\n\n /**\n * The environment to connect to (e.g. `\"production\"`, `\"staging\"`).\n * When omitted, resolved from the `SMPLKIT_ENVIRONMENT` environment variable.\n */\n environment?: string;\n\n /**\n * Service name. The SDK automatically registers the service as a\n * context instance and includes it in flag evaluation context.\n * When omitted, resolved from the `SMPLKIT_SERVICE` environment variable.\n */\n service?: string;\n\n /**\n * Request timeout in milliseconds.\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Entry point for the smplkit TypeScript SDK.\n *\n * @example\n * ```typescript\n * import { SmplClient } from \"@smplkit/sdk\";\n *\n * const client = new SmplClient({\n * apiKey: \"sk_api_...\",\n * environment: \"production\",\n * service: \"my-service\",\n * });\n *\n * // Flags runtime\n * await client.flags.initialize();\n * const flag = client.flags.booleanFlag(\"checkout-v2\", false);\n * console.log(flag.get());\n *\n * // Config runtime\n * const values = await client.config.resolve(\"user-service\");\n * ```\n */\nexport class SmplClient {\n /** Client for config management and runtime. */\n readonly config: ConfigClient;\n\n /** Client for flags management and runtime. */\n readonly flags: FlagsClient;\n\n /** Client for logging management and runtime. */\n readonly logging: LoggingClient;\n\n private _wsManager: SharedWebSocket | null = null;\n private readonly _apiKey: string;\n\n /** @internal */\n readonly _environment: string;\n\n /** @internal */\n readonly _service: string;\n\n private readonly _timeout: number;\n private readonly _appHttp: ReturnType<typeof createClient<import(\"./generated/app.d.ts\").paths>>;\n\n constructor(options: SmplClientOptions = {}) {\n // 1. Resolve environment first\n const environment = options.environment || process.env.SMPLKIT_ENVIRONMENT;\n if (!environment) {\n throw new SmplError(NO_ENVIRONMENT_MESSAGE);\n }\n this._environment = environment;\n\n // 2. Resolve service second\n const service = options.service || process.env.SMPLKIT_SERVICE;\n if (!service) {\n throw new SmplError(NO_SERVICE_MESSAGE);\n }\n this._service = service;\n\n // 3. Resolve API key last (receives the already-resolved environment)\n const apiKey = resolveApiKey(options.apiKey, environment);\n this._apiKey = apiKey;\n\n this._timeout = options.timeout ?? 30_000;\n\n this._appHttp = createClient<import(\"./generated/app.d.ts\").paths>({\n baseUrl: APP_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n });\n\n this.config = new ConfigClient(apiKey, this._timeout);\n this.flags = new FlagsClient(apiKey, () => this._ensureWs(), this._timeout);\n this.logging = new LoggingClient(apiKey, () => this._ensureWs(), this._timeout);\n\n // Wire the shared WebSocket into the config client\n this.config._getSharedWs = () => this._ensureWs();\n\n // Wire parent reference into sub-clients\n this.flags._parent = this;\n this.config._parent = this;\n this.logging._parent = this;\n\n // Fire-and-forget: register service context\n void this._registerServiceContext();\n }\n\n /** @internal */\n private async _registerServiceContext(): Promise<void> {\n try {\n await this._appHttp.POST(\"/api/v1/contexts/bulk\", {\n body: {\n contexts: [\n {\n type: \"service\",\n key: this._service,\n attributes: { name: this._service },\n },\n ],\n },\n });\n } catch {\n // Fire-and-forget: log warning on failure\n }\n }\n\n /** Lazily create and start the shared WebSocket. @internal */\n private _ensureWs(): SharedWebSocket {\n if (this._wsManager === null) {\n this._wsManager = new SharedWebSocket(APP_BASE_URL, this._apiKey);\n this._wsManager.start();\n }\n return this._wsManager;\n }\n\n /** Close the shared WebSocket and release resources. */\n close(): void {\n this.logging._close();\n if (this._wsManager !== null) {\n this._wsManager.stop();\n this._wsManager = null;\n }\n }\n}\n","/**\n * ConfigClient — management plane + runtime for Smpl Config.\n *\n * Uses the generated OpenAPI types (`src/generated/config.d.ts`) via\n * `openapi-fetch` for all HTTP calls.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components, operations } from \"../generated/config.d.ts\";\nimport {\n SmplConflictError,\n SmplNotFoundError,\n SmplValidationError,\n SmplError,\n SmplConnectionError,\n SmplTimeoutError,\n throwForStatus,\n} from \"../errors.js\";\nimport { resolveChain } from \"./resolve.js\";\nimport { Config } from \"./types.js\";\nimport { LiveConfigProxy } from \"./proxy.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\n\n/** Describes a single config value change detected on refresh. */\nexport interface ConfigChangeEvent {\n /** The config key that changed. */\n configKey: string;\n /** The item key within the config that changed. */\n itemKey: string;\n /** The previous value (null if the key was absent). */\n oldValue: unknown;\n /** The updated value (null if the key was removed). */\n newValue: unknown;\n /** How the change was delivered. */\n source: \"websocket\" | \"manual\";\n}\n\n/** @internal */\ninterface ChangeListener {\n callback: (event: ConfigChangeEvent) => void;\n configKey: string | null;\n itemKey: string | null;\n}\n\nconst BASE_URL = \"https://config.smplkit.com\";\n\ntype ConfigResource = components[\"schemas\"][\"ConfigResource\"];\n\n/**\n * Extract raw values from typed items: `{key: {value, type?, description?}}` -> `{key: rawValue}`.\n * @internal\n */\nfunction extractItemValues(\n items: Record<string, { value: unknown }> | null | undefined,\n): Record<string, unknown> {\n if (!items) return {};\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(items)) {\n result[key] = item && typeof item === \"object\" && \"value\" in item ? item.value : item;\n }\n return result;\n}\n\n/**\n * Extract raw values from environment overrides.\n * Wire format: `{ env: { values: { key: { value: raw } } } }`\n * SDK format: `{ env: { values: { key: raw } } }`\n * @internal\n */\nfunction extractEnvironments(\n environments:\n | Record<string, { values?: Record<string, { value: unknown }> | null }>\n | null\n | undefined,\n): Record<string, unknown> {\n if (!environments) return {};\n const result: Record<string, unknown> = {};\n for (const [envName, envEntry] of Object.entries(environments)) {\n if (envEntry && typeof envEntry === \"object\" && envEntry.values) {\n const unwrapped: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(envEntry.values)) {\n unwrapped[key] = item && typeof item === \"object\" && \"value\" in item ? item.value : item;\n }\n result[envName] = { values: unwrapped };\n } else {\n result[envName] = envEntry;\n }\n }\n return result;\n}\n\n/** @internal */\nfunction resourceToConfig(resource: ConfigResource, client: ConfigClient): Config {\n const attrs = resource.attributes;\n return new Config(client, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n description: attrs.description ?? null,\n parent: attrs.parent ?? null,\n items: extractItemValues(attrs.items as Record<string, { value: unknown }> | null | undefined),\n environments: extractEnvironments(\n attrs.environments as\n | Record<string, { values?: Record<string, { value: unknown }> | null }>\n | null\n | undefined,\n ),\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n}\n\n/** @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n/**\n * Wrap plain values into typed item format for the API.\n * `{key: rawValue}` -> `{key: {value: rawValue}}`\n * @internal\n */\nfunction wrapItemValues(\n values: Record<string, unknown> | null | undefined,\n): Record<string, { value: unknown }> | null {\n if (!values) return null;\n const result: Record<string, { value: unknown }> = {};\n for (const [key, val] of Object.entries(values)) {\n result[key] = { value: val };\n }\n return result;\n}\n\n/**\n * Wrap plain environment values into the API wire format.\n * SDK format: `{ env: { values: { key: raw } } }`\n * Wire format: `{ env: { values: { key: { value: raw } } } }`\n * @internal\n */\nfunction wrapEnvironments(\n environments: Record<string, unknown> | null | undefined,\n): Record<string, unknown> | null {\n if (!environments) return null;\n const result: Record<string, unknown> = {};\n for (const [envName, envEntry] of Object.entries(environments)) {\n if (envEntry && typeof envEntry === \"object\" && !Array.isArray(envEntry)) {\n const entry = envEntry as Record<string, unknown>;\n if (entry.values && typeof entry.values === \"object\" && !Array.isArray(entry.values)) {\n const wrapped: Record<string, { value: unknown }> = {};\n for (const [key, val] of Object.entries(entry.values as Record<string, unknown>)) {\n wrapped[key] = { value: val };\n }\n result[envName] = { ...entry, values: wrapped };\n } else {\n result[envName] = envEntry;\n }\n } else {\n result[envName] = envEntry;\n }\n }\n return result;\n}\n\n/**\n * Build a JSON:API request body for create/update operations.\n * @internal\n */\nfunction buildRequestBody(options: {\n id?: string | null;\n name: string;\n key?: string | null;\n description?: string | null;\n parent?: string | null;\n items?: Record<string, unknown> | null;\n environments?: Record<string, unknown> | null;\n}): operations[\"create_config\"][\"requestBody\"][\"content\"][\"application/json\"] {\n const attrs: components[\"schemas\"][\"Config\"] = {\n name: options.name,\n };\n if (options.key !== undefined) attrs.key = options.key;\n if (options.description !== undefined) attrs.description = options.description;\n if (options.parent !== undefined) attrs.parent = options.parent;\n if (options.items !== undefined)\n attrs.items = wrapItemValues(options.items) as typeof attrs.items;\n if (options.environments !== undefined)\n attrs.environments = wrapEnvironments(options.environments) as typeof attrs.environments;\n\n return {\n data: {\n id: options.id ?? null,\n type: \"config\",\n attributes: attrs,\n },\n };\n}\n\n/**\n * Client for the smplkit Config API — management plane + runtime.\n *\n * Obtained via `SmplClient.config`.\n */\nexport class ConfigClient {\n /** @internal */\n readonly _apiKey: string;\n\n /** @internal */\n readonly _baseUrl: string = BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<typeof createClient<import(\"../generated/config.d.ts\").paths>>;\n\n /** @internal — returns the shared WebSocket for real-time updates. */\n _getSharedWs?: () => import(\"../ws.js\").SharedWebSocket;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n private _configCache: Record<string, Record<string, unknown>> = {};\n private _initialized = false;\n private _listeners: ChangeListener[] = [];\n\n /** @internal */\n constructor(apiKey: string, timeout?: number) {\n this._apiKey = apiKey;\n const ms = timeout ?? 30_000;\n this._http = createClient<import(\"../generated/config.d.ts\").paths>({\n baseUrl: BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n },\n });\n }\n\n // ------------------------------------------------------------------\n // Management: factory method\n // ------------------------------------------------------------------\n\n /** Create an unsaved config. Call `.save()` to persist. */\n new(key: string, options?: { name?: string; description?: string; parent?: string }): Config {\n return new Config(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n description: options?.description ?? null,\n parent: options?.parent ?? null,\n items: {},\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a config by key. */\n async get(key: string): Promise<Config> {\n return this._getByKey(key);\n }\n\n /** List all configs. */\n async list(): Promise<Config[]> {\n let data: components[\"schemas\"][\"ConfigListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list configs\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => resourceToConfig(r, this));\n }\n\n /** Delete a config by key. */\n async delete(key: string): Promise<void> {\n const config = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/configs/{id}\", {\n params: { path: { id: config.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete config '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods (called by Config.save())\n // ------------------------------------------------------------------\n\n /** @internal — POST a new config. */\n async _createConfig(config: Config): Promise<Config> {\n const body = buildRequestBody({\n name: config.name,\n key: config.key,\n description: config.description,\n parent: config.parent,\n items: config.items,\n environments: config.environments,\n });\n\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/configs\", { body });\n if (result.error !== undefined) await checkError(result.response, \"Failed to create config\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create config\");\n return resourceToConfig(data.data, this);\n }\n\n /** @internal — PUT a config update. */\n async _updateConfig(config: Config): Promise<Config> {\n const body = buildRequestBody({\n id: config.id,\n name: config.name,\n key: config.key,\n description: config.description,\n parent: config.parent,\n items: config.items,\n environments: config.environments,\n });\n\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/configs/{id}\", {\n params: { path: { id: config.id! } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update config ${config.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(`Failed to update config ${config.id}`);\n return resourceToConfig(data.data, this);\n }\n\n /** @internal — fetch a config by UUID. */\n async _getById(configId: string): Promise<Config> {\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs/{id}\", {\n params: { path: { id: configId } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Config ${configId} not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplNotFoundError(`Config ${configId} not found`);\n return resourceToConfig(data.data, this);\n }\n\n // ------------------------------------------------------------------\n // Runtime: resolve and subscribe\n // ------------------------------------------------------------------\n\n /**\n * Resolve a config's values for the current environment.\n *\n * Returns a flat dict of resolved key-value pairs, walking the\n * parent chain and applying environment overrides.\n *\n * Optionally pass a model class to map the resolved values.\n */\n async resolve<T = Record<string, unknown>>(\n key: string,\n model?: new (data: any) => T,\n ): Promise<T> {\n await this._ensureInitialized();\n const values = this._configCache[key];\n if (values === undefined) {\n throw new SmplNotFoundError(`Config with key '${key}' not found in cache`);\n }\n if (model) {\n return new model(values);\n }\n return values as T;\n }\n\n /**\n * Subscribe to a config's values — returns a live proxy that\n * auto-updates when the underlying config changes.\n *\n * Optionally pass a model class to map the resolved values.\n */\n async subscribe<T = Record<string, unknown>>(\n key: string,\n model?: new (data: any) => T,\n ): Promise<LiveConfigProxy<T>> {\n await this._ensureInitialized();\n if (!(key in this._configCache)) {\n throw new SmplNotFoundError(`Config with key '${key}' not found in cache`);\n }\n return new LiveConfigProxy<T>(this, key, model);\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (3-level overloads)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any config change (global).\n * - `onChange(configKey, callback)` — fires for changes to a specific config.\n * - `onChange(configKey, itemKey, callback)` — fires for a specific item.\n */\n onChange(\n callbackOrConfigKey: string | ((event: ConfigChangeEvent) => void),\n callbackOrItemKey?: string | ((event: ConfigChangeEvent) => void),\n callback?: (event: ConfigChangeEvent) => void,\n ): void {\n if (typeof callbackOrConfigKey === \"function\") {\n // Global listener: onChange(callback)\n this._listeners.push({\n callback: callbackOrConfigKey,\n configKey: null,\n itemKey: null,\n });\n } else if (typeof callbackOrItemKey === \"function\") {\n // Config-scoped: onChange(configKey, callback)\n this._listeners.push({\n callback: callbackOrItemKey,\n configKey: callbackOrConfigKey,\n itemKey: null,\n });\n } else if (typeof callbackOrItemKey === \"string\" && callback) {\n // Item-scoped: onChange(configKey, itemKey, callback)\n this._listeners.push({\n callback,\n configKey: callbackOrConfigKey,\n itemKey: callbackOrItemKey,\n });\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: refresh\n // ------------------------------------------------------------------\n\n /**\n * Re-fetch all configs, re-resolve values, and update the cache.\n * Fires change listeners for any values that differ.\n */\n async refresh(): Promise<void> {\n if (!this._initialized) {\n throw new SmplError(\"Config not initialized. Call resolve() or subscribe() first.\");\n }\n const environment = this._parent?._environment;\n if (!environment) {\n throw new SmplError(\"No environment set.\");\n }\n const configs = await this.list();\n const newCache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain();\n newCache[cfg.key] = resolveChain(chain, environment);\n }\n const oldCache = this._configCache;\n this._configCache = newCache;\n this._diffAndFire(oldCache, newCache, \"manual\");\n }\n\n // ------------------------------------------------------------------\n // Runtime: lazy initialization\n // ------------------------------------------------------------------\n\n /** @internal */\n private async _ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n const environment = this._parent?._environment;\n if (!environment) {\n throw new SmplError(\"No environment set. Ensure SmplClient is configured.\");\n }\n const configs = await this.list();\n const cache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain();\n cache[cfg.key] = resolveChain(chain, environment);\n }\n this._configCache = cache;\n this._initialized = true;\n\n // Wire WebSocket for real-time updates\n if (this._getSharedWs) {\n const ws = this._getSharedWs();\n ws.on(\"config_changed\", this._handleConfigChanged);\n }\n }\n\n /** @internal — called by SmplClient for backward compat. */\n async _connectInternal(environment: string): Promise<void> {\n if (this._initialized) return;\n const configs = await this.list();\n const cache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain();\n cache[cfg.key] = resolveChain(chain, environment);\n }\n this._configCache = cache;\n this._initialized = true;\n }\n\n /** @internal — get resolved config from cache. Used by LiveConfigProxy. */\n _getCachedConfig(key: string): Record<string, unknown> | undefined {\n return this._configCache[key];\n }\n\n // ------------------------------------------------------------------\n // Internal: WebSocket handler\n // ------------------------------------------------------------------\n\n private _handleConfigChanged = (_data: Record<string, any>): void => {\n void this.refresh().catch(() => {\n // ignore refresh errors from WebSocket events\n });\n };\n\n // ------------------------------------------------------------------\n // Internal: change detection\n // ------------------------------------------------------------------\n\n /** @internal */\n private _diffAndFire(\n oldCache: Record<string, Record<string, unknown>>,\n newCache: Record<string, Record<string, unknown>>,\n source: \"websocket\" | \"manual\",\n ): void {\n const allConfigKeys = new Set([...Object.keys(oldCache), ...Object.keys(newCache)]);\n for (const cfgKey of allConfigKeys) {\n const oldItems = oldCache[cfgKey] ?? {};\n const newItems = newCache[cfgKey] ?? {};\n const allItemKeys = new Set([...Object.keys(oldItems), ...Object.keys(newItems)]);\n for (const iKey of allItemKeys) {\n const oldVal = iKey in oldItems ? oldItems[iKey] : null;\n const newVal = iKey in newItems ? newItems[iKey] : null;\n if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n const event: ConfigChangeEvent = {\n configKey: cfgKey,\n itemKey: iKey,\n oldValue: oldVal,\n newValue: newVal,\n source,\n };\n for (const listener of this._listeners) {\n if (listener.configKey !== null && listener.configKey !== cfgKey) continue;\n if (listener.itemKey !== null && listener.itemKey !== iKey) continue;\n try {\n listener.callback(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: fetch by key\n // ------------------------------------------------------------------\n\n private async _getByKey(key: string): Promise<Config> {\n let data: components[\"schemas\"][\"ConfigListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Config with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Config with key '${key}' not found`);\n }\n return resourceToConfig(data.data[0], this);\n }\n}\n","/**\n * Structured SDK error types.\n *\n * All smplkit errors extend {@link SmplError}, allowing callers to catch\n * the base class for generic handling or specific subclasses for\n * fine-grained control.\n */\n\n/** A single error object from a JSON:API error response. */\nexport interface ApiErrorObject {\n status?: string;\n title?: string;\n detail?: string;\n source?: Record<string, unknown>;\n}\n\n/** Base exception for all smplkit SDK errors. */\nexport class SmplError extends Error {\n /** The HTTP status code, if the error originated from an HTTP response. */\n public readonly statusCode?: number;\n\n /** The raw response body, if available. */\n public readonly responseBody?: string;\n\n /** Structured JSON:API error objects from the server response, if available. */\n public readonly errors: ReadonlyArray<ApiErrorObject>;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message);\n this.name = \"SmplError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n this.errors = errors ?? [];\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toString(): string {\n if (this.errors.length === 0) {\n return `${this.name}: ${this.message}`;\n }\n if (this.errors.length === 1) {\n return `${this.name}: ${this.message}\\nError: ${JSON.stringify(this.errors[0])}`;\n }\n const lines = this.errors.map((e, i) => ` [${i}] ${JSON.stringify(e)}`);\n return `${this.name}: ${this.message}\\nErrors:\\n${lines.join(\"\\n\")}`;\n }\n}\n\n/** Raised when a network request fails (e.g., DNS resolution, connection refused). */\nexport class SmplConnectionError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode, responseBody, errors);\n this.name = \"SmplConnectionError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when an operation exceeds its timeout. */\nexport class SmplTimeoutError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode, responseBody, errors);\n this.name = \"SmplTimeoutError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when a requested resource does not exist (HTTP 404). */\nexport class SmplNotFoundError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 404, responseBody, errors);\n this.name = \"SmplNotFoundError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when an operation conflicts with current state (HTTP 409). */\nexport class SmplConflictError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 409, responseBody, errors);\n this.name = \"SmplConflictError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when the server rejects a request due to validation errors (HTTP 422). */\nexport class SmplValidationError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 422, responseBody, errors);\n this.name = \"SmplValidationError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared helper: parse JSON:API error body and throw the right exception\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON:API error response body into structured error objects.\n * @internal\n */\nfunction parseJsonApiErrors(body: string): ApiErrorObject[] {\n try {\n const parsed = JSON.parse(body);\n if (parsed && Array.isArray(parsed.errors)) {\n return parsed.errors.map((e: Record<string, unknown>) => ({\n ...(e.status !== undefined ? { status: String(e.status) } : {}),\n ...(e.title !== undefined ? { title: String(e.title) } : {}),\n ...(e.detail !== undefined ? { detail: String(e.detail) } : {}),\n ...(e.source !== undefined && typeof e.source === \"object\" && e.source !== null\n ? { source: e.source as Record<string, unknown> }\n : {}),\n }));\n }\n } catch {\n // Not JSON — return empty\n }\n return [];\n}\n\n/**\n * Derive a human-readable message from parsed JSON:API error objects.\n * Falls back to `HTTP {statusCode}` when no detail/title/status is available.\n * @internal\n */\nfunction deriveMessage(errors: ApiErrorObject[], statusCode: number, body?: string): string {\n if (errors.length === 0) {\n return body ? `HTTP ${statusCode}: ${body}` : `HTTP ${statusCode}`;\n }\n const first = errors[0];\n const base =\n first.detail ?? first.title ?? (first.status ? `HTTP ${first.status}` : `HTTP ${statusCode}`);\n if (errors.length > 1) {\n return `${base} (and ${errors.length - 1} more error${errors.length - 1 > 1 ? \"s\" : \"\"})`;\n }\n return base;\n}\n\n/**\n * Parse an HTTP error response and throw the appropriate typed SDK exception.\n *\n * 1. Attempts to parse the body as a JSON:API error envelope.\n * 2. Derives a message from the first error's detail > title > status.\n * 3. Maps 400/422 -> SmplValidationError, 404 -> SmplNotFoundError,\n * 409 -> SmplConflictError, others -> SmplError.\n *\n * @internal\n */\nexport function throwForStatus(statusCode: number, body: string): never {\n const errors = parseJsonApiErrors(body);\n const message = deriveMessage(errors, statusCode, body);\n\n switch (statusCode) {\n case 400:\n case 422:\n throw new SmplValidationError(message, statusCode, body, errors);\n case 404:\n throw new SmplNotFoundError(message, statusCode, body, errors);\n case 409:\n throw new SmplConflictError(message, statusCode, body, errors);\n default:\n throw new SmplError(message, statusCode, body, errors);\n }\n}\n","/**\n * Deep-merge resolution algorithm for config inheritance chains.\n *\n * Mirrors the Python SDK's `_resolver.py` (ADR-024 §2.5–2.6).\n */\n\n/** A single entry in a config inheritance chain (child-to-root ordering). */\nexport interface ChainConfig {\n /** Config UUID. */\n id: string;\n /** Base key-value pairs (unwrapped from typed item definitions). */\n items: Record<string, unknown>;\n /**\n * Per-environment overrides.\n * Each entry is `{ values: { key: value, ... } }` — values are already\n * unwrapped from the server's `{ value: raw }` wrapper by the client layer.\n */\n environments: Record<string, unknown>;\n}\n\n/**\n * Recursively merge two dicts, with `override` taking precedence.\n *\n * Nested dicts are merged recursively. Non-dict values (strings, numbers,\n * booleans, arrays, null) are replaced wholesale.\n */\nexport function deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (\n key in result &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolve the full configuration for an environment given a config chain.\n *\n * Walks from root (last element) to child (first element), accumulating\n * values via deep merge so that child configs override parent configs.\n *\n * For each config in the chain, base `values` are merged with\n * environment-specific values (env wins), then that result is merged\n * on top of the accumulated parent result (child wins over parent).\n *\n * @param chain - Ordered list of config data from child (index 0) to root ancestor (last).\n * @param environment - The environment key to resolve for.\n */\nexport function resolveChain(chain: ChainConfig[], environment: string): Record<string, unknown> {\n let accumulated: Record<string, unknown> = {};\n\n // Walk from root to child (reverse order — chain is child-to-root)\n for (let i = chain.length - 1; i >= 0; i--) {\n const config = chain[i];\n const baseValues: Record<string, unknown> = config.items ?? {};\n\n // Environments are stored as { env_name: { values: { key: val } } }\n const envEntry = (config.environments ?? {})[environment];\n const envValues: Record<string, unknown> =\n envEntry !== null &&\n envEntry !== undefined &&\n typeof envEntry === \"object\" &&\n !Array.isArray(envEntry)\n ? (((envEntry as Record<string, unknown>).values ?? {}) as Record<string, unknown>)\n : {};\n\n // Merge environment overrides on top of base values (env wins)\n const configResolved = deepMerge(baseValues, envValues);\n\n // Merge this config's resolved values on top of accumulated parent values (child wins)\n accumulated = deepMerge(accumulated, configResolved);\n }\n\n return accumulated;\n}\n","/**\n * Config resource — active-record model with save() pattern.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ConfigClient } from \"./client.js\";\n\n/**\n * A configuration resource managed by the smplkit platform.\n *\n * Management: mutate properties directly and call `save()` to persist.\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\nexport class Config {\n /** UUID of the config, or `null` if unsaved. */\n id: string | null;\n\n /** Human-readable key (e.g. `\"user-service\"`). */\n key: string;\n\n /** Display name. */\n name: string;\n\n /** Optional description. */\n description: string | null;\n\n /** Parent config UUID, or null if this is a root config. */\n parent: string | null;\n\n /** Base key-value pairs (unwrapped from typed item definitions). */\n items: Record<string, unknown>;\n\n /**\n * Per-environment overrides.\n * Stored as `{ env_name: { values: { key: value } } }` — values are\n * unwrapped from the server's `{ value: raw }` wrapper.\n */\n environments: Record<string, unknown>;\n\n /** When the config was created, or null if unavailable. */\n createdAt: string | null;\n\n /** When the config was last updated, or null if unavailable. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: ConfigClient;\n\n /** @internal */\n constructor(\n client: ConfigClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n description: string | null;\n parent: string | null;\n items: Record<string, unknown>;\n environments: Record<string, unknown>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.description = fields.description;\n this.parent = fields.parent;\n this.items = fields.items;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this config to the server.\n *\n * POST if `id` is null (new config), PUT if `id` is set (update).\n * Updates this instance in-place with the server response.\n */\n async save(): Promise<void> {\n if (this.id === null) {\n const created = await this._client._createConfig(this);\n this._apply(created);\n } else {\n const updated = await this._client._updateConfig(this);\n this._apply(updated);\n }\n }\n\n /**\n * Walk the parent chain and return config data objects, child-to-root.\n * @internal\n */\n async _buildChain(): Promise<\n Array<{ id: string; items: Record<string, unknown>; environments: Record<string, unknown> }>\n > {\n const chain: Array<{\n id: string;\n items: Record<string, unknown>;\n environments: Record<string, unknown>;\n }> = [{ id: this.id ?? \"\", items: this.items, environments: this.environments }];\n\n let parentId = this.parent;\n while (parentId !== null) {\n const parentConfig = await this._client._getById(parentId);\n chain.push({\n id: parentConfig.id ?? \"\",\n items: parentConfig.items,\n environments: parentConfig.environments,\n });\n parentId = parentConfig.parent;\n }\n\n return chain;\n }\n\n /** @internal — copy all fields from another Config instance. */\n _apply(other: Config): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.description = other.description;\n this.parent = other.parent;\n this.items = other.items;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Config(id=${this.id}, key=${this.key}, name=${this.name})`;\n }\n}\n","/**\n * LiveConfigProxy — ES6 Proxy-based live configuration access.\n *\n * Property reads are delegated to the latest resolved values in the\n * ConfigClient cache. When the cache updates via WebSocket, subsequent\n * reads automatically reflect the new values.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ConfigClient } from \"./client.js\";\n\n/**\n * A live proxy that auto-updates when the underlying config changes.\n *\n * Access properties directly — each read re-resolves from the cache.\n *\n * @example\n * ```typescript\n * const proxy = await client.config.subscribe(\"user-service\");\n * console.log(proxy.timeout); // reads from live cache\n * // ... later, after a WebSocket update ...\n * console.log(proxy.timeout); // reads the updated value\n * ```\n */\nexport class LiveConfigProxy<T = Record<string, unknown>> {\n /** @internal */\n private readonly _client: ConfigClient;\n /** @internal */\n private readonly _key: string;\n /** @internal */\n private readonly _model?: new (data: any) => T;\n\n constructor(client: ConfigClient, key: string, model?: new (data: any) => T) {\n this._client = client;\n this._key = key;\n this._model = model;\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Allow access to built-in properties and the class's own methods\n if (typeof prop === \"symbol\" || prop === \"constructor\" || prop === \"toJSON\") {\n return Reflect.get(target, prop, receiver);\n }\n\n // Delegate property access to the live cache\n const values = target._currentValues();\n if (target._model) {\n const instance = new target._model(values) as any;\n return instance[prop];\n }\n return (values as any)[prop];\n },\n\n has(target, prop) {\n if (typeof prop === \"symbol\") return Reflect.has(target, prop);\n const values = target._currentValues();\n return prop in values;\n },\n\n ownKeys(target) {\n const values = target._currentValues();\n return Object.keys(values);\n },\n\n getOwnPropertyDescriptor(target, prop) {\n if (typeof prop === \"symbol\") return Reflect.getOwnPropertyDescriptor(target, prop);\n const values = target._currentValues();\n if (prop in values) {\n return {\n configurable: true,\n enumerable: true,\n value: (values as any)[prop],\n writable: false,\n };\n }\n return undefined;\n },\n }) as LiveConfigProxy<T>;\n }\n\n /** @internal */\n _currentValues(): Record<string, unknown> {\n return this._client._getCachedConfig(this._key) ?? {};\n }\n}\n","/**\n * Shared helper utilities used across SDK modules.\n */\n\n/**\n * Convert a slug-style key to a human-readable display name.\n *\n * @example\n * ```typescript\n * keyToDisplayName(\"checkout-v2\") // \"Checkout V2\"\n * keyToDisplayName(\"payment_service\") // \"Payment Service\"\n * ```\n */\nexport function keyToDisplayName(key: string): string {\n return key.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * FlagsClient — management + prescriptive runtime for Smpl Flags.\n *\n * Uses the generated OpenAPI types (`src/generated/flags.d.ts`) via\n * `openapi-fetch` for all flag HTTP calls. Context registration uses\n * the generated app service types (`src/generated/app.d.ts`).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components } from \"../generated/flags.d.ts\";\nimport {\n SmplConflictError,\n SmplError,\n SmplNotFoundError,\n SmplTimeoutError,\n SmplValidationError,\n throwForStatus,\n} from \"../errors.js\";\n\nimport { Flag, BooleanFlag, StringFlag, NumberFlag, JsonFlag } from \"./models.js\";\nimport type { Context } from \"./types.js\";\nimport type { SharedWebSocket } from \"../ws.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\n\n// Use require-style import for json-logic-js (no TS types)\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nimport jsonLogic from \"json-logic-js\";\n\nconst FLAGS_BASE_URL = \"https://flags.smplkit.com\";\nconst APP_BASE_URL = \"https://app.smplkit.com\";\nconst CACHE_MAX_SIZE = 10_000;\nconst CONTEXT_REGISTRATION_LRU_SIZE = 10_000;\nconst CONTEXT_BATCH_FLUSH_SIZE = 100;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ntype FlagResource = components[\"schemas\"][\"FlagResource\"];\n\n/** Map HTTP errors to typed SDK exceptions. @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** Re-raise fetch-level errors as typed SDK exceptions. @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n// Re-import for the above helper\nimport { SmplConnectionError } from \"../errors.js\";\n\n/** Convert Context list to nested evaluation dict. @internal */\nfunction contextsToEvalDict(contexts: Context[]): Record<string, any> {\n const result: Record<string, any> = {};\n for (const ctx of contexts) {\n result[ctx.type] = { key: ctx.key, ...ctx.attributes };\n }\n return result;\n}\n\n/** Recursively sort object keys for stable serialization. @internal */\nfunction sortedStringify(obj: any): string {\n if (obj === null || obj === undefined) return \"null\";\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n if (Array.isArray(obj)) return \"[\" + obj.map(sortedStringify).join(\",\") + \"]\";\n const keys = Object.keys(obj).sort();\n return \"{\" + keys.map((k) => JSON.stringify(k) + \":\" + sortedStringify(obj[k])).join(\",\") + \"}\";\n}\n\n/** Compute a stable hash for a context evaluation dict. @internal */\nfunction hashContext(evalDict: Record<string, any>): string {\n const serialized = sortedStringify(evalDict);\n let hash = 0;\n for (let i = 0; i < serialized.length; i++) {\n const chr = serialized.charCodeAt(i);\n hash = ((hash << 5) - hash + chr) | 0;\n }\n return hash.toString(36);\n}\n\n/**\n * Evaluate a flag definition against the given context.\n *\n * Follows ADR-022 §2.6 semantics:\n * 1. Look up the environment. If missing, return flag-level default.\n * 2. If disabled, return env default or flag default.\n * 3. Iterate rules; first match wins.\n * 4. No match → env default or flag default.\n * @internal\n */\nfunction evaluateFlag(\n flagDef: Record<string, any>,\n environment: string | null,\n evalDict: Record<string, any>,\n): any {\n const flagDefault = flagDef.default;\n const environments = flagDef.environments ?? {};\n\n if (environment === null || !(environment in environments)) {\n return flagDefault;\n }\n\n const envConfig = environments[environment];\n const envDefault = envConfig.default;\n const fallback = envDefault !== undefined && envDefault !== null ? envDefault : flagDefault;\n\n if (!envConfig.enabled) {\n return fallback;\n }\n\n const rules = envConfig.rules ?? [];\n for (const rule of rules) {\n const logic = rule.logic;\n if (!logic || Object.keys(logic).length === 0) {\n continue;\n }\n try {\n const result = jsonLogic.apply(logic, evalDict);\n if (result) {\n return rule.value;\n }\n } catch {\n // Skip invalid rules\n continue;\n }\n }\n\n return fallback;\n}\n\n// ---------------------------------------------------------------------------\n// Change event\n// ---------------------------------------------------------------------------\n\n/** Describes a flag definition change. */\nexport class FlagChangeEvent {\n readonly key: string;\n readonly source: string;\n\n constructor(key: string, source: string) {\n this.key = key;\n this.source = source;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resolution cache + stats\n// ---------------------------------------------------------------------------\n\n/** @internal */\nclass ResolutionCache {\n private _maxSize: number;\n private _cache = new Map<string, any>();\n cacheHits = 0;\n cacheMisses = 0;\n\n constructor(maxSize: number = CACHE_MAX_SIZE) {\n this._maxSize = maxSize;\n }\n\n get(cacheKey: string): [boolean, any] {\n if (this._cache.has(cacheKey)) {\n // Move to end (delete + re-set)\n const value = this._cache.get(cacheKey);\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, value);\n this.cacheHits++;\n return [true, value];\n }\n this.cacheMisses++;\n return [false, null];\n }\n\n put(cacheKey: string, value: any): void {\n if (this._cache.has(cacheKey)) {\n this._cache.delete(cacheKey);\n }\n this._cache.set(cacheKey, value);\n if (this._cache.size > this._maxSize) {\n // Remove oldest (first) entry\n const firstKey = this._cache.keys().next().value;\n if (firstKey !== undefined) {\n this._cache.delete(firstKey);\n }\n }\n }\n\n clear(): void {\n this._cache.clear();\n }\n}\n\n/** Cache statistics for the flags runtime. */\nexport class FlagStats {\n readonly cacheHits: number;\n readonly cacheMisses: number;\n\n constructor(cacheHits: number, cacheMisses: number) {\n this.cacheHits = cacheHits;\n this.cacheMisses = cacheMisses;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context registration buffer\n// ---------------------------------------------------------------------------\n\n/** @internal */\nclass ContextRegistrationBuffer {\n private _seen = new Map<string, Record<string, any>>();\n private _pending: Array<Record<string, any>> = [];\n\n observe(contexts: Context[]): void {\n for (const ctx of contexts) {\n const cacheKey = `${ctx.type}:${ctx.key}`;\n if (!this._seen.has(cacheKey)) {\n if (this._seen.size >= CONTEXT_REGISTRATION_LRU_SIZE) {\n // Remove oldest entry\n const firstKey = this._seen.keys().next().value;\n if (firstKey !== undefined) {\n this._seen.delete(firstKey);\n }\n }\n this._seen.set(cacheKey, ctx.attributes);\n this._pending.push({\n type: ctx.type,\n key: ctx.key,\n attributes: { ...ctx.attributes },\n });\n }\n }\n }\n\n drain(): Array<Record<string, any>> {\n const batch = this._pending;\n this._pending = [];\n return batch;\n }\n\n get pendingCount(): number {\n return this._pending.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// FlagsClient\n// ---------------------------------------------------------------------------\n\n/**\n * Client for the smplkit Flags API — management plane + prescriptive runtime.\n *\n * Obtained via `SmplClient.flags`.\n */\nexport class FlagsClient {\n /** @internal */\n readonly _apiKey: string;\n /** @internal */\n readonly _baseUrl: string = FLAGS_BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<typeof createClient<import(\"../generated/flags.d.ts\").paths>>;\n /** @internal */\n private readonly _appHttp: ReturnType<typeof createClient<import(\"../generated/app.d.ts\").paths>>;\n\n // Runtime state\n private _environment: string | null = null;\n private _flagStore: Record<string, Record<string, any>> = {};\n private _initialized = false;\n private _cache = new ResolutionCache();\n private _contextProvider: (() => Context[]) | null = null;\n private _contextBuffer = new ContextRegistrationBuffer();\n private _handles: Record<string, Flag> = {};\n private _globalListeners: Array<(event: FlagChangeEvent) => void> = [];\n private _keyListeners: Map<string, Array<(event: FlagChangeEvent) => void>> = new Map();\n\n // Shared WebSocket (set during initialize)\n private _wsManager: SharedWebSocket | null = null;\n private readonly _ensureWs: () => SharedWebSocket;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n /** @internal */\n constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number) {\n this._apiKey = apiKey;\n this._ensureWs = ensureWs;\n const ms = timeout ?? 30_000;\n\n const fetchWithTimeout = async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n };\n\n this._http = createClient<import(\"../generated/flags.d.ts\").paths>({\n baseUrl: FLAGS_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: fetchWithTimeout,\n });\n\n this._appHttp = createClient<import(\"../generated/app.d.ts\").paths>({\n baseUrl: APP_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: fetchWithTimeout,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: factory methods (return unsaved flags)\n // ------------------------------------------------------------------\n\n /** Create an unsaved boolean flag. Call `.save()` to persist. */\n newBooleanFlag(\n key: string,\n options: { default: boolean; name?: string; description?: string },\n ): BooleanFlag {\n return new BooleanFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"BOOLEAN\",\n default: options.default,\n values: [\n { name: \"True\", value: true },\n { name: \"False\", value: false },\n ],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved string flag. Call `.save()` to persist. */\n newStringFlag(\n key: string,\n options: {\n default: string;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): StringFlag {\n return new StringFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"STRING\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved number flag. Call `.save()` to persist. */\n newNumberFlag(\n key: string,\n options: {\n default: number;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): NumberFlag {\n return new NumberFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"NUMERIC\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved JSON flag. Call `.save()` to persist. */\n newJsonFlag(\n key: string,\n options: {\n default: Record<string, any>;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): JsonFlag {\n return new JsonFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"JSON\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a flag by key. */\n async get(key: string): Promise<Flag> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Flag with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Flag with key '${key}' not found`);\n }\n return this._resourceToModel(data.data[0]);\n }\n\n /** List all flags. */\n async list(): Promise<Flag[]> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list flags\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._resourceToModel(r));\n }\n\n /** Delete a flag by key. */\n async delete(key: string): Promise<void> {\n const flag = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/flags/{id}\", {\n params: { path: { id: flag.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete flag '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods (called by Flag.save())\n // ------------------------------------------------------------------\n\n /** @internal — POST a new flag. */\n async _createFlag(flag: Flag): Promise<Flag> {\n const body = {\n data: {\n type: \"flag\" as const,\n attributes: {\n key: flag.key,\n name: flag.name,\n description: flag.description ?? \"\",\n type: flag.type,\n default: flag.default,\n values: flag.values,\n ...(Object.keys(flag.environments).length > 0 ? { environments: flag.environments } : {}),\n },\n },\n };\n\n let data: components[\"schemas\"][\"FlagResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/flags\", { body });\n if (result.error !== undefined) await checkError(result.response, \"Failed to create flag\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create flag\");\n return this._resourceToModel(data.data);\n }\n\n /** @internal — PUT a flag update. */\n async _updateFlag(flag: Flag): Promise<Flag> {\n const body = {\n data: {\n type: \"flag\" as const,\n attributes: {\n key: flag.key,\n name: flag.name,\n type: flag.type,\n default: flag.default,\n values: flag.values,\n description: flag.description ?? \"\",\n ...(Object.keys(flag.environments).length > 0 ? { environments: flag.environments } : {}),\n },\n },\n };\n\n let data: components[\"schemas\"][\"FlagResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/flags/{id}\", {\n params: { path: { id: flag.id! } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update flag ${flag.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(`Failed to update flag ${flag.id}`);\n return this._resourceToModel(data.data);\n }\n\n // ------------------------------------------------------------------\n // Runtime: typed flag handles\n // ------------------------------------------------------------------\n\n /** Declare a boolean flag handle for runtime evaluation. */\n booleanFlag(key: string, defaultValue: boolean): BooleanFlag {\n const handle = new BooleanFlag(this, {\n id: null,\n key,\n name: key,\n type: \"BOOLEAN\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a string flag handle for runtime evaluation. */\n stringFlag(key: string, defaultValue: string): StringFlag {\n const handle = new StringFlag(this, {\n id: null,\n key,\n name: key,\n type: \"STRING\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a numeric flag handle for runtime evaluation. */\n numberFlag(key: string, defaultValue: number): NumberFlag {\n const handle = new NumberFlag(this, {\n id: null,\n key,\n name: key,\n type: \"NUMERIC\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a JSON flag handle for runtime evaluation. */\n jsonFlag(key: string, defaultValue: Record<string, any>): JsonFlag {\n const handle = new JsonFlag(this, {\n id: null,\n key,\n name: key,\n type: \"JSON\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n // ------------------------------------------------------------------\n // Runtime: context provider\n // ------------------------------------------------------------------\n\n /**\n * Register a context provider function.\n *\n * Called on every `handle.get()` to supply the current evaluation context.\n */\n setContextProvider(fn: () => Context[]): void {\n this._contextProvider = fn;\n }\n\n /**\n * Register a context provider — decorator-style alias.\n */\n contextProvider(fn: () => Context[]): () => Context[] {\n this._contextProvider = fn;\n return fn;\n }\n\n // ------------------------------------------------------------------\n // Runtime: initialize / disconnect / refresh\n // ------------------------------------------------------------------\n\n /**\n * Initialize the flags runtime: fetch definitions and wire WebSocket.\n *\n * Idempotent — safe to call multiple times. Must be called (and awaited)\n * before using `.get()` on flag handles.\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n this._environment = this._parent?._environment ?? null;\n await this._fetchAllFlags();\n this._initialized = true;\n this._cache.clear();\n\n // Register on the shared WebSocket\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.on(\"flag_deleted\", this._handleFlagDeleted);\n }\n\n /** Disconnect: unregister from WebSocket, flush contexts, clear state. */\n async disconnect(): Promise<void> {\n if (this._wsManager !== null) {\n this._wsManager.off(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.off(\"flag_deleted\", this._handleFlagDeleted);\n this._wsManager = null;\n }\n\n await this._flushContexts();\n this._flagStore = {};\n this._cache.clear();\n this._initialized = false;\n this._environment = null;\n }\n\n /** Re-fetch all flag definitions and clear cache. */\n async refresh(): Promise<void> {\n await this._fetchAllFlags();\n this._cache.clear();\n this._fireChangeListenersAll(\"manual\");\n }\n\n /** Return the current WebSocket connection status. */\n connectionStatus(): string {\n if (this._wsManager !== null) {\n return this._wsManager.connectionStatus;\n }\n return \"disconnected\";\n }\n\n /** Return cache statistics. */\n stats(): FlagStats {\n return new FlagStats(this._cache.cacheHits, this._cache.cacheMisses);\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (dual-mode)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any flag change (global).\n * - `onChange(key, callback)` — fires only for the specified flag key.\n */\n onChange(\n callbackOrKey: string | ((event: FlagChangeEvent) => void),\n callback?: (event: FlagChangeEvent) => void,\n ): void {\n if (typeof callbackOrKey === \"function\") {\n // Global listener\n this._globalListeners.push(callbackOrKey);\n } else {\n // Key-scoped listener\n const key = callbackOrKey;\n if (!callback) {\n throw new SmplError(\"onChange(key, callback) requires a callback function.\");\n }\n if (!this._keyListeners.has(key)) {\n this._keyListeners.set(key, []);\n }\n this._keyListeners.get(key)!.push(callback);\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: context registration\n // ------------------------------------------------------------------\n\n /**\n * Explicitly register context(s) for background batch registration.\n *\n * Accepts a single Context or an array. Fire-and-forget — never\n * blocks. Works before `initialize()` is called.\n */\n register(context: Context | Context[]): void {\n if (Array.isArray(context)) {\n this._contextBuffer.observe(context);\n } else {\n this._contextBuffer.observe([context]);\n }\n }\n\n /** Flush pending context registrations to the server. */\n async flushContexts(): Promise<void> {\n await this._flushContexts();\n }\n\n // ------------------------------------------------------------------\n // Runtime: Tier 1 evaluate\n // ------------------------------------------------------------------\n\n /**\n * Tier 1 explicit evaluation — stateless, no provider or cache.\n */\n async evaluate(key: string, options: { environment: string; context: Context[] }): Promise<any> {\n const evalDict = contextsToEvalDict(options.context);\n\n // Auto-inject service context if set and not already provided\n if (this._parent?._service && !(\"service\" in evalDict)) {\n evalDict[\"service\"] = { key: this._parent._service };\n }\n\n // Use local store if initialized, otherwise fetch\n let flagDef: Record<string, any> | null = null;\n if (this._initialized && key in this._flagStore) {\n flagDef = this._flagStore[key];\n } else {\n const flags = await this._fetchFlagsList();\n for (const f of flags) {\n if (f.key === key) {\n flagDef = f;\n break;\n }\n }\n }\n\n if (flagDef === null) {\n return null;\n }\n\n return evaluateFlag(flagDef, options.environment, evalDict);\n }\n\n // ------------------------------------------------------------------\n // Internal: evaluation\n // ------------------------------------------------------------------\n\n /** @internal */\n _evaluateHandle(key: string, defaultValue: any, context: Context[] | null): any {\n if (!this._initialized) {\n throw new SmplError(\"Flags not initialized. Call await client.flags.initialize() first.\");\n }\n\n let evalDict: Record<string, any>;\n if (context !== null) {\n evalDict = contextsToEvalDict(context);\n } else if (this._contextProvider !== null) {\n const contexts = this._contextProvider();\n evalDict = contextsToEvalDict(contexts);\n this._contextBuffer.observe(contexts);\n if (this._contextBuffer.pendingCount >= CONTEXT_BATCH_FLUSH_SIZE) {\n // Fire-and-forget background flush\n void this._flushContexts();\n }\n } else {\n evalDict = {};\n }\n\n // Auto-inject service context if set and not already provided\n if (this._parent?._service && !(\"service\" in evalDict)) {\n evalDict[\"service\"] = { key: this._parent._service };\n }\n\n const ctxHash = hashContext(evalDict);\n const cacheKey = `${key}:${ctxHash}`;\n\n const [hit, cachedValue] = this._cache.get(cacheKey);\n if (hit) {\n return cachedValue;\n }\n\n const flagDef = this._flagStore[key];\n if (flagDef === undefined) {\n this._cache.put(cacheKey, defaultValue);\n return defaultValue;\n }\n\n let value = evaluateFlag(flagDef, this._environment, evalDict);\n if (value === null || value === undefined) {\n value = defaultValue;\n }\n\n this._cache.put(cacheKey, value);\n return value;\n }\n\n // ------------------------------------------------------------------\n // Internal: _connectInternal (called by SmplClient for backward compat)\n // ------------------------------------------------------------------\n\n /** @internal — called by SmplClient constructor / lazy init. */\n async _connectInternal(environment: string): Promise<void> {\n this._environment = environment;\n await this._fetchAllFlags();\n this._initialized = true;\n this._cache.clear();\n\n // Register on the shared WebSocket\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.on(\"flag_deleted\", this._handleFlagDeleted);\n }\n\n // ------------------------------------------------------------------\n // Internal: event handlers (called by SharedWebSocket)\n // ------------------------------------------------------------------\n\n private _handleFlagChanged = (data: Record<string, any>): void => {\n const flagKey = data.key as string | undefined;\n // Re-fetch all flags (async, fire-and-forget)\n void this._fetchAllFlags().then(() => {\n this._cache.clear();\n this._fireChangeListeners(flagKey ?? null, \"websocket\");\n });\n };\n\n private _handleFlagDeleted = (data: Record<string, any>): void => {\n const flagKey = data.key as string | undefined;\n void this._fetchAllFlags().then(() => {\n this._cache.clear();\n this._fireChangeListeners(flagKey ?? null, \"websocket\");\n });\n };\n\n // ------------------------------------------------------------------\n // Internal: flag store\n // ------------------------------------------------------------------\n\n private async _fetchAllFlags(): Promise<void> {\n const flags = await this._fetchFlagsList();\n const store: Record<string, Record<string, any>> = {};\n for (const f of flags) {\n store[f.key] = f;\n }\n this._flagStore = store;\n }\n\n private async _fetchFlagsList(): Promise<Array<Record<string, any>>> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list flags\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._resourceToPlainDict(r));\n }\n\n // ------------------------------------------------------------------\n // Internal: change listeners\n // ------------------------------------------------------------------\n\n private _fireChangeListeners(flagKey: string | null, source: string): void {\n if (flagKey) {\n const event = new FlagChangeEvent(flagKey, source);\n // Global listeners first\n for (const cb of this._globalListeners) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n // Key-scoped listeners\n const keyCallbacks = this._keyListeners.get(flagKey);\n if (keyCallbacks) {\n for (const cb of keyCallbacks) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n }\n\n private _fireChangeListenersAll(source: string): void {\n for (const flagKey of Object.keys(this._flagStore)) {\n this._fireChangeListeners(flagKey, source);\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: context flush\n // ------------------------------------------------------------------\n\n private async _flushContexts(): Promise<void> {\n const batch = this._contextBuffer.drain();\n if (batch.length === 0) return;\n try {\n await this._appHttp.POST(\"/api/v1/contexts/bulk\", {\n body: {\n contexts: batch.map((ctx) => ({\n type: ctx.type,\n key: ctx.key,\n attributes: ctx.attributes,\n })),\n },\n });\n } catch {\n // Fire-and-forget: ignore registration failures\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: model conversion\n // ------------------------------------------------------------------\n\n /** @internal */\n _resourceToModel(resource: FlagResource): Flag {\n const attrs = resource.attributes;\n return new Flag(this, {\n id: resource.id ?? null,\n key: attrs.key,\n name: attrs.name,\n type: attrs.type,\n default: attrs.default,\n values: (attrs.values ?? []).map((v) => ({ name: v.name, value: v.value })),\n description: attrs.description ?? null,\n environments: attrs.environments ?? {},\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n\n private _resourceToPlainDict(resource: FlagResource): Record<string, any> {\n const attrs = resource.attributes;\n return {\n key: attrs.key,\n name: attrs.name,\n type: attrs.type,\n default: attrs.default,\n values: (attrs.values ?? []).map((v) => ({ name: v.name, value: v.value })),\n description: attrs.description ?? null,\n environments: attrs.environments ?? {},\n };\n }\n}\n","/**\n * Unified Flag hierarchy — management model + runtime handle.\n *\n * A single {@link Flag} class replaces the old separate Flag + FlagHandle\n * classes. Typed subclasses ({@link BooleanFlag}, {@link StringFlag},\n * {@link NumberFlag}, {@link JsonFlag}) override `get()` for type safety.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { FlagsClient } from \"./client.js\";\nimport type { Context } from \"./types.js\";\n\n/**\n * A flag resource that doubles as a runtime handle.\n *\n * Management: call `save()` to persist (POST if new, PUT if existing).\n * Runtime: call `get()` for local JSON Logic evaluation.\n */\nexport class Flag {\n /** UUID of the flag, or `null` if unsaved. */\n id: string | null;\n /** Unique key within the account. */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Value type: BOOLEAN, STRING, NUMERIC, or JSON. */\n type: string;\n /** Flag-level default value. */\n default: unknown;\n /** Closed set of possible values. */\n values: Array<{ name: string; value: unknown }>;\n /** Optional description. */\n description: string | null;\n /** Per-environment configuration. */\n environments: Record<string, any>;\n /** When the flag was created. */\n createdAt: string | null;\n /** When the flag was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: FlagsClient;\n\n /** @internal */\n constructor(\n client: FlagsClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n type: string;\n default: unknown;\n values: Array<{ name: string; value: unknown }>;\n description: string | null;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.type = fields.type;\n this.default = fields.default;\n this.values = fields.values;\n this.description = fields.description;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this flag to the server.\n *\n * POST if `id` is null (new flag), PUT if `id` is set (update).\n * Updates this instance in-place with the server response.\n */\n async save(): Promise<void> {\n if (this.id === null) {\n const created = await this._client._createFlag(this);\n this._apply(created);\n } else {\n const updated = await this._client._updateFlag(this);\n this._apply(updated);\n }\n }\n\n /**\n * Add a rule to a specific environment (sync local mutation).\n *\n * The built rule must include an `environment` key (set via\n * `Rule(...).environment(\"env_key\")`). No HTTP call is made.\n *\n * @returns `this` for chaining.\n */\n addRule(builtRule: Record<string, any>): Flag {\n const envKey = builtRule.environment as string | undefined;\n if (!envKey) {\n throw new Error(\n \"Built rule must include 'environment' key. \" +\n 'Use new Rule(...).environment(\"env_key\").when(...).serve(...).build()',\n );\n }\n\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: true, rules: [] }) };\n const rules = [...(envData.rules ?? [])];\n\n // Strip the environment key from the rule — it's metadata\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { environment: _env, ...ruleCopy } = builtRule;\n rules.push(ruleCopy);\n envData.rules = rules;\n envs[envKey] = envData;\n\n this.environments = envs;\n return this;\n }\n\n /** Enable or disable a flag in a specific environment (sync local mutation). */\n setEnvironmentEnabled(envKey: string, enabled: boolean): void {\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: false, rules: [] }) };\n envData.enabled = enabled;\n envs[envKey] = envData;\n this.environments = envs;\n }\n\n /** Set the default value for a specific environment (sync local mutation). */\n setEnvironmentDefault(envKey: string, defaultValue: unknown): void {\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: false, rules: [] }) };\n envData.default = defaultValue;\n envs[envKey] = envData;\n this.environments = envs;\n }\n\n /** Clear all rules for a specific environment (sync local mutation). */\n clearRules(envKey: string): void {\n const envs = { ...this.environments };\n const envData = envs[envKey];\n if (envData) {\n envs[envKey] = { ...envData, rules: [] };\n this.environments = envs;\n }\n }\n\n /**\n * Evaluate the flag locally (sync, no HTTP).\n *\n * Requires `initialize()` to have been called.\n */\n get(options?: { context?: Context[] }): unknown {\n return this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n }\n\n /** @internal — copy all fields from another Flag instance. */\n _apply(other: Flag): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.type = other.type;\n this.default = other.default;\n this.values = other.values;\n this.description = other.description;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Flag(key=${this.key}, type=${this.type}, default=${this.default})`;\n }\n}\n\n/** Typed flag that returns `boolean` from `get()`. */\nexport class BooleanFlag extends Flag {\n get(options?: { context?: Context[] }): boolean {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"boolean\") {\n return value;\n }\n return this.default as boolean;\n }\n}\n\n/** Typed flag that returns `string` from `get()`. */\nexport class StringFlag extends Flag {\n get(options?: { context?: Context[] }): string {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"string\") {\n return value;\n }\n return this.default as string;\n }\n}\n\n/** Typed flag that returns `number` from `get()`. */\nexport class NumberFlag extends Flag {\n get(options?: { context?: Context[] }): number {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"number\") {\n return value;\n }\n return this.default as number;\n }\n}\n\n/** Typed flag that returns `Record<string, any>` from `get()`. */\nexport class JsonFlag extends Flag {\n get(options?: { context?: Context[] }): Record<string, any> {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, any>;\n }\n return this.default as Record<string, any>;\n }\n}\n","/**\n * LoggingClient — management plane + scaffolded runtime for Smpl Logging.\n *\n * Uses the generated OpenAPI types (`src/generated/logging.d.ts`) via\n * `openapi-fetch` for all HTTP calls.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components } from \"../generated/logging.d.ts\";\nimport {\n SmplConflictError,\n SmplNotFoundError,\n SmplValidationError,\n SmplError,\n SmplConnectionError,\n SmplTimeoutError,\n throwForStatus,\n} from \"../errors.js\";\nimport { Logger, LogGroup } from \"./models.js\";\nimport type { LoggerChangeEvent } from \"./types.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\nimport type { SharedWebSocket } from \"../ws.js\";\n\nconst LOGGING_BASE_URL = \"https://logging.smplkit.com\";\n\ntype LoggerResource = components[\"schemas\"][\"LoggerResource\"];\ntype LogGroupResource = components[\"schemas\"][\"LogGroupResource\"];\n\n/** @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n/**\n * Client for the smplkit Logging API — management plane + scaffolded runtime.\n *\n * Obtained via `SmplClient.logging`.\n */\nexport class LoggingClient {\n /** @internal */\n readonly _apiKey: string;\n /** @internal */\n readonly _baseUrl: string = LOGGING_BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<\n typeof createClient<import(\"../generated/logging.d.ts\").paths>\n >;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n private readonly _ensureWs: () => SharedWebSocket;\n private _wsManager: SharedWebSocket | null = null;\n private _started = false;\n private _globalListeners: Array<(event: LoggerChangeEvent) => void> = [];\n private _keyListeners: Map<string, Array<(event: LoggerChangeEvent) => void>> = new Map();\n\n /** @internal */\n constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number) {\n this._apiKey = apiKey;\n this._ensureWs = ensureWs;\n const ms = timeout ?? 30_000;\n\n this._http = createClient<import(\"../generated/logging.d.ts\").paths>({\n baseUrl: LOGGING_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n },\n });\n }\n\n // ------------------------------------------------------------------\n // Management: Logger factory\n // ------------------------------------------------------------------\n\n /** Create an unsaved logger. Call `.save()` to persist. */\n new(key: string, options?: { name?: string; managed?: boolean }): Logger {\n return new Logger(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n level: null,\n group: null,\n managed: options?.managed ?? false,\n sources: [],\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: Logger CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a logger by key. */\n async get(key: string): Promise<Logger> {\n let data: components[\"schemas\"][\"LoggerListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/loggers\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Logger with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Logger with key '${key}' not found`);\n }\n return this._loggerToModel(data.data[0]);\n }\n\n /** List all loggers. */\n async list(): Promise<Logger[]> {\n let data: components[\"schemas\"][\"LoggerListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/loggers\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list loggers\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._loggerToModel(r));\n }\n\n /** Delete a logger by key. */\n async delete(key: string): Promise<void> {\n const logger = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/loggers/{id}\", {\n params: { path: { id: logger.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete logger '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: LogGroup factory\n // ------------------------------------------------------------------\n\n /** Create an unsaved log group. Call `.save()` to persist. */\n newGroup(key: string, options?: { name?: string; group?: string }): LogGroup {\n return new LogGroup(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n level: null,\n group: options?.group ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: LogGroup CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a log group by key. */\n async getGroup(key: string): Promise<LogGroup> {\n // The logging API doesn't have a filter[key] on groups in the generated spec,\n // so we list all and filter client-side.\n const groups = await this.listGroups();\n const match = groups.find((g) => g.key === key);\n if (!match) {\n throw new SmplNotFoundError(`LogGroup with key '${key}' not found`);\n }\n return match;\n }\n\n /** List all log groups. */\n async listGroups(): Promise<LogGroup[]> {\n let data: components[\"schemas\"][\"LogGroupListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/log_groups\", {});\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to list log groups\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._groupToModel(r));\n }\n\n /** Delete a log group by key. */\n async deleteGroup(key: string): Promise<void> {\n const group = await this.getGroup(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/log_groups/{id}\", {\n params: { path: { id: group.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete log group '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods\n // ------------------------------------------------------------------\n\n /** @internal — POST or PUT a logger. */\n async _saveLogger(logger: Logger): Promise<Logger> {\n const body = {\n data: {\n type: \"logger\" as const,\n attributes: {\n key: logger.key,\n name: logger.name,\n level: logger.level,\n group: logger.group,\n managed: logger.managed,\n environments: logger.environments,\n },\n },\n };\n\n if (logger.id === null) {\n // POST — create\n let data: components[\"schemas\"][\"LoggerResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/loggers\", { body });\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to create logger\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create logger\");\n return this._loggerToModel(data.data);\n } else {\n // PUT — update\n let data: components[\"schemas\"][\"LoggerResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/loggers/{id}\", {\n params: { path: { id: logger.id } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update logger ${logger.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data)\n throw new SmplValidationError(`Failed to update logger ${logger.id}`);\n return this._loggerToModel(data.data);\n }\n }\n\n /** @internal — POST or PUT a log group. */\n async _saveLogGroup(group: LogGroup): Promise<LogGroup> {\n const body = {\n data: {\n type: \"log_group\" as const,\n attributes: {\n key: group.key,\n name: group.name,\n level: group.level,\n group: group.group,\n environments: group.environments,\n },\n },\n };\n\n if (group.id === null) {\n // POST — create\n let data: components[\"schemas\"][\"LogGroupResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/log_groups\", { body });\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to create log group\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create log group\");\n return this._groupToModel(data.data);\n } else {\n // PUT — update\n let data: components[\"schemas\"][\"LogGroupResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/log_groups/{id}\", {\n params: { path: { id: group.id } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update log group ${group.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data)\n throw new SmplValidationError(`Failed to update log group ${group.id}`);\n return this._groupToModel(data.data);\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: start (scaffolded)\n // ------------------------------------------------------------------\n\n /**\n * Start the logging runtime.\n *\n * Fetches existing loggers/groups and wires WebSocket listeners for\n * live updates. Idempotent — safe to call multiple times.\n *\n * Note: Node.js auto-discovery (equivalent to Python's logging module\n * monkey-patching) is deferred. Management methods work without start().\n */\n async start(): Promise<void> {\n if (this._started) return;\n\n // Wire WebSocket for logger_changed events\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"logger_changed\", this._handleLoggerChanged);\n\n this._started = true;\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (dual-mode)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any logger change (global).\n * - `onChange(key, callback)` — fires only for the specified logger key.\n */\n onChange(\n callbackOrKey: string | ((event: LoggerChangeEvent) => void),\n callback?: (event: LoggerChangeEvent) => void,\n ): void {\n if (typeof callbackOrKey === \"function\") {\n this._globalListeners.push(callbackOrKey);\n } else {\n const key = callbackOrKey;\n if (!callback) {\n throw new SmplError(\"onChange(key, callback) requires a callback function.\");\n }\n if (!this._keyListeners.has(key)) {\n this._keyListeners.set(key, []);\n }\n this._keyListeners.get(key)!.push(callback);\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: close\n // ------------------------------------------------------------------\n\n /** @internal */\n _close(): void {\n if (this._wsManager !== null) {\n this._wsManager.off(\"logger_changed\", this._handleLoggerChanged);\n this._wsManager = null;\n }\n this._started = false;\n }\n\n // ------------------------------------------------------------------\n // Internal: WebSocket handler\n // ------------------------------------------------------------------\n\n private _handleLoggerChanged = (data: Record<string, any>): void => {\n const key = data.key as string | undefined;\n if (key) {\n const level = data.level ?? null;\n const event: LoggerChangeEvent = {\n key,\n level,\n source: \"websocket\",\n };\n // Global listeners first\n for (const cb of this._globalListeners) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n // Key-scoped listeners\n const keyCallbacks = this._keyListeners.get(key);\n if (keyCallbacks) {\n for (const cb of keyCallbacks) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n };\n\n // ------------------------------------------------------------------\n // Internal: model conversion\n // ------------------------------------------------------------------\n\n private _loggerToModel(resource: LoggerResource): Logger {\n const attrs = resource.attributes;\n return new Logger(this, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n level: attrs.level ?? null,\n group: attrs.group ?? null,\n managed: attrs.managed ?? false,\n sources: (attrs.sources ?? []) as Array<Record<string, any>>,\n environments: (attrs.environments ?? {}) as Record<string, any>,\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n\n private _groupToModel(resource: LogGroupResource): LogGroup {\n const attrs = resource.attributes;\n return new LogGroup(this, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n level: attrs.level ?? null,\n group: attrs.group ?? null,\n environments: (attrs.environments ?? {}) as Record<string, any>,\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n}\n","/**\n * Logger and LogGroup active-record models for the Logging SDK.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { LoggingClient } from \"./client.js\";\nimport { LogLevel } from \"./types.js\";\n\n/**\n * A logger resource managed by the smplkit platform.\n *\n * Management: mutate properties and call `save()` to persist.\n * Convenience methods (`setLevel`, `setEnvironmentLevel`, etc.) are\n * sync local mutations — no HTTP until `save()`.\n */\nexport class Logger {\n /** UUID of the logger, or `null` if unsaved. */\n id: string | null;\n /** Unique key (dot-separated hierarchy). */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Base log level, or null if inherited. */\n level: string | null;\n /** UUID of the parent log group, or null. */\n group: string | null;\n /** Whether this logger is managed by the platform. */\n managed: boolean;\n /** Observed sources (services that report this logger). */\n sources: Array<Record<string, any>>;\n /** Per-environment level overrides. */\n environments: Record<string, any>;\n /** When the logger was created. */\n createdAt: string | null;\n /** When the logger was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: LoggingClient;\n\n /** @internal */\n constructor(\n client: LoggingClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n level: string | null;\n group: string | null;\n managed: boolean;\n sources: Array<Record<string, any>>;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.level = fields.level;\n this.group = fields.group;\n this.managed = fields.managed;\n this.sources = fields.sources;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this logger to the server.\n *\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\n async save(): Promise<void> {\n const saved = await this._client._saveLogger(this);\n this._apply(saved);\n }\n\n /** Set the base log level (sync local mutation). */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Clear the base log level (sync local mutation). */\n clearLevel(): void {\n this.level = null;\n }\n\n /** Set an environment-specific log level (sync local mutation). */\n setEnvironmentLevel(env: string, level: LogLevel): void {\n const envs = { ...this.environments };\n envs[env] = { ...(envs[env] ?? {}), level: level };\n this.environments = envs;\n }\n\n /** Clear an environment-specific log level (sync local mutation). */\n clearEnvironmentLevel(env: string): void {\n const envs = { ...this.environments };\n if (envs[env]) {\n const entry = { ...envs[env] };\n delete entry.level;\n envs[env] = entry;\n this.environments = envs;\n }\n }\n\n /** Clear all environment-specific log levels (sync local mutation). */\n clearAllEnvironmentLevels(): void {\n this.environments = {};\n }\n\n /** @internal — copy all fields from another Logger instance. */\n _apply(other: Logger): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.level = other.level;\n this.group = other.group;\n this.managed = other.managed;\n this.sources = other.sources;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Logger(key=${this.key}, level=${this.level})`;\n }\n}\n\n/**\n * A log group resource for organizing loggers.\n *\n * Management: mutate properties and call `save()` to persist.\n */\nexport class LogGroup {\n /** UUID of the log group, or `null` if unsaved. */\n id: string | null;\n /** Unique key. */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Base log level, or null if inherited. */\n level: string | null;\n /** UUID of the parent log group, or null. */\n group: string | null;\n /** Per-environment level overrides. */\n environments: Record<string, any>;\n /** When the log group was created. */\n createdAt: string | null;\n /** When the log group was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: LoggingClient;\n\n /** @internal */\n constructor(\n client: LoggingClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n level: string | null;\n group: string | null;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.level = fields.level;\n this.group = fields.group;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this log group to the server.\n *\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\n async save(): Promise<void> {\n const saved = await this._client._saveLogGroup(this);\n this._apply(saved);\n }\n\n /** Set the base log level (sync local mutation). */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Clear the base log level (sync local mutation). */\n clearLevel(): void {\n this.level = null;\n }\n\n /** Set an environment-specific log level (sync local mutation). */\n setEnvironmentLevel(env: string, level: LogLevel): void {\n const envs = { ...this.environments };\n envs[env] = { ...(envs[env] ?? {}), level: level };\n this.environments = envs;\n }\n\n /** Clear an environment-specific log level (sync local mutation). */\n clearEnvironmentLevel(env: string): void {\n const envs = { ...this.environments };\n if (envs[env]) {\n const entry = { ...envs[env] };\n delete entry.level;\n envs[env] = entry;\n this.environments = envs;\n }\n }\n\n /** Clear all environment-specific log levels (sync local mutation). */\n clearAllEnvironmentLevels(): void {\n this.environments = {};\n }\n\n /** @internal — copy all fields from another LogGroup instance. */\n _apply(other: LogGroup): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.level = other.level;\n this.group = other.group;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `LogGroup(key=${this.key}, level=${this.level})`;\n }\n}\n","/**\n * Shared WebSocket connection to the app service event gateway.\n *\n * A single {@link SharedWebSocket} instance is shared across all product\n * modules (config, flags) within one {@link SmplClient}. Product modules\n * register listeners for specific event types; the shared connection\n * dispatches incoming events to the appropriate listeners.\n *\n * Protocol:\n * - Connect to `wss://app.smplkit.com/api/ws/v1/events?api_key={key}`\n * - Receive `{\"type\": \"connected\"}` on success\n * - Receive events: `{\"event\": \"config_changed\", ...}`, `{\"event\": \"flag_changed\", ...}`\n * - No subscribe message — the API key determines the account\n * - Heartbeat: server sends `ping`, client responds with `pong`\n * - Reconnect with exponential backoff\n */\n\nimport WebSocket from \"ws\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype EventCallback = (data: Record<string, any>) => void;\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 16000, 32000, 60000];\n\n/**\n * Manages a single WebSocket connection to the app service event gateway.\n *\n * Shared across config and flags modules for efficient multiplexing.\n */\nexport class SharedWebSocket {\n private readonly _appBaseUrl: string;\n private readonly _apiKey: string;\n\n private _listeners: Map<string, EventCallback[]> = new Map();\n private _connectionStatus: string = \"disconnected\";\n private _closed = false;\n private _ws: InstanceType<typeof WebSocket> | null = null;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _backoffIndex = 0;\n\n constructor(appBaseUrl: string, apiKey: string) {\n this._appBaseUrl = appBaseUrl;\n this._apiKey = apiKey;\n }\n\n // ------------------------------------------------------------------\n // Listener registration\n // ------------------------------------------------------------------\n\n /** Register a listener for a specific event type. */\n on(eventName: string, callback: EventCallback): void {\n if (!this._listeners.has(eventName)) {\n this._listeners.set(eventName, []);\n }\n this._listeners.get(eventName)!.push(callback);\n }\n\n /** Unregister a listener for a specific event type. */\n off(eventName: string, callback: EventCallback): void {\n const list = this._listeners.get(eventName);\n if (list) {\n const idx = list.indexOf(callback);\n if (idx !== -1) {\n list.splice(idx, 1);\n }\n }\n }\n\n private _dispatch(eventName: string, data: Record<string, any>): void {\n const callbacks = this._listeners.get(eventName);\n if (callbacks) {\n for (const cb of [...callbacks]) {\n try {\n cb(data);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Connection status\n // ------------------------------------------------------------------\n\n get connectionStatus(): string {\n return this._connectionStatus;\n }\n\n // ------------------------------------------------------------------\n // Lifecycle\n // ------------------------------------------------------------------\n\n /** Start the WebSocket connection. */\n start(): void {\n this._closed = false;\n this._connect();\n }\n\n /** Stop the WebSocket connection. */\n stop(): void {\n this._closed = true;\n this._connectionStatus = \"disconnected\";\n\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n\n if (this._ws !== null) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n // ------------------------------------------------------------------\n // Connection internals\n // ------------------------------------------------------------------\n\n private _buildWsUrl(): string {\n let url = this._appBaseUrl;\n if (url.startsWith(\"https://\")) {\n url = \"wss://\" + url.slice(\"https://\".length);\n } else if (url.startsWith(\"http://\")) {\n url = \"ws://\" + url.slice(\"http://\".length);\n } else {\n url = \"wss://\" + url;\n }\n url = url.replace(/\\/$/, \"\");\n return `${url}/api/ws/v1/events?api_key=${this._apiKey}`;\n }\n\n private _connect(): void {\n if (this._closed) return;\n\n this._connectionStatus = \"connecting\";\n const wsUrl = this._buildWsUrl();\n\n try {\n const ws = new WebSocket(wsUrl);\n this._ws = ws;\n\n ws.on(\"open\", () => {\n if (this._closed) {\n ws.close();\n return;\n }\n // Don't set connected yet — wait for {\"type\": \"connected\"} confirmation\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n try {\n const raw = String(data);\n\n // Heartbeat: server sends \"ping\", we respond with \"pong\"\n if (raw === \"ping\") {\n ws.send(\"pong\");\n return;\n }\n\n const msg = JSON.parse(raw) as Record<string, any>;\n\n // Connection confirmation\n if (msg.type === \"connected\") {\n this._backoffIndex = 0;\n this._connectionStatus = \"connected\";\n return;\n }\n\n // Error from server\n if (msg.type === \"error\") {\n return;\n }\n\n // Route events by the \"event\" field\n const eventName = msg.event as string | undefined;\n if (eventName) {\n this._dispatch(eventName, msg);\n }\n } catch {\n // ignore unparseable messages\n }\n });\n\n ws.on(\"close\", () => {\n if (!this._closed) {\n this._connectionStatus = \"disconnected\";\n this._scheduleReconnect();\n }\n });\n\n ws.on(\"error\", () => {\n // 'close' will fire after 'error'; reconnect is handled there\n });\n } catch {\n if (!this._closed) {\n this._scheduleReconnect();\n }\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._closed) return;\n\n const delay = BACKOFF_MS[Math.min(this._backoffIndex, BACKOFF_MS.length - 1)];\n this._backoffIndex++;\n this._connectionStatus = \"connecting\";\n\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n this._connect();\n }, delay);\n }\n}\n","/**\n * API key resolution chain: explicit → env var → config file.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { SmplError } from \"./errors.js\";\n\nfunction noApiKeyMessage(environment: string): string {\n return (\n \"No API key provided. Set one of:\\n\" +\n \" 1. Pass apiKey to the constructor\\n\" +\n \" 2. Set the SMPLKIT_API_KEY environment variable\\n\" +\n \" 3. Create a ~/.smplkit file with:\\n\" +\n ` [${environment}]\\n` +\n \" api_key = your_key_here\"\n );\n}\n\n/**\n * Parse the ~/.smplkit INI file and return the api_key value.\n * Tries the `[{environment}]` section first, then falls back to `[default]`.\n */\nfunction readApiKeyFromConfig(environment: string): string | undefined {\n const configPath = join(homedir(), \".smplkit\");\n try {\n const content = readFileSync(configPath, \"utf-8\");\n let currentSection: string | null = null;\n let envKey: string | undefined;\n let defaultKey: string | undefined;\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n if (trimmed.startsWith(\"[\")) {\n const sectionName = trimmed.slice(1, trimmed.indexOf(\"]\")).toLowerCase();\n currentSection = sectionName;\n continue;\n }\n if (currentSection && trimmed.startsWith(\"api_key\")) {\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex !== -1) {\n const value = trimmed.slice(eqIndex + 1).trim();\n if (value) {\n if (currentSection === environment.toLowerCase()) {\n envKey = value;\n } else if (currentSection === \"default\") {\n defaultKey = value;\n }\n }\n }\n }\n }\n\n return envKey ?? defaultKey;\n } catch {\n // File doesn't exist or isn't readable — skip\n return undefined;\n }\n}\n\nexport function resolveApiKey(explicit: string | undefined, environment: string): string {\n if (explicit) return explicit;\n\n const envVal = process.env.SMPLKIT_API_KEY;\n if (envVal) return envVal;\n\n const fileKey = readApiKeyFromConfig(environment);\n if (fileKey) return fileKey;\n\n throw new SmplError(noApiKeyMessage(environment));\n}\n","/**\n * Public types for the Flags SDK: Context, Rule.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * A typed evaluation context entity.\n *\n * Represents a single entity (user, account, device, etc.) in the\n * evaluation context. The *type* and *key* identify the entity;\n * *attributes* carry the data that JSON Logic rules target.\n *\n * @example\n * ```typescript\n * new Context(\"user\", \"user-123\", { plan: \"enterprise\", firstName: \"Alice\" })\n * new Context(\"user\", \"user-123\", { plan: \"enterprise\" }, { name: \"Alice Smith\" })\n * ```\n */\nexport class Context {\n readonly type: string;\n readonly key: string;\n readonly name: string | null;\n readonly attributes: Record<string, unknown>;\n\n constructor(\n type: string,\n key: string,\n attributes?: Record<string, unknown>,\n options?: { name?: string },\n ) {\n this.type = type;\n this.key = key;\n this.name = options?.name ?? null;\n this.attributes = { ...(attributes ?? {}) };\n }\n\n toString(): string {\n return `Context(type=${this.type}, key=${this.key}, name=${this.name})`;\n }\n}\n\n/**\n * Fluent builder for JSON Logic rule dicts.\n *\n * @example\n * ```typescript\n * new Rule(\"Enable for enterprise users\")\n * .when(\"user.plan\", \"==\", \"enterprise\")\n * .when(\"account.region\", \"==\", \"us\")\n * .serve(true)\n * .build()\n * ```\n *\n * Multiple `.when()` calls are AND'd. `.environment()` tags the\n * built dict with an environment key for use with `Flag.addRule()`.\n */\nexport class Rule {\n private _description: string;\n private _conditions: Record<string, any>[] = [];\n private _value: any = null;\n private _environment: string | null = null;\n\n constructor(description: string) {\n this._description = description;\n }\n\n /** Tag this rule with an environment key (used by `addRule`). */\n environment(envKey: string): Rule {\n this._environment = envKey;\n return this;\n }\n\n /** Add a condition. Multiple calls are AND'd. */\n when(variable: string, op: string, value: any): Rule {\n if (op === \"contains\") {\n // JSON Logic \"in\" with reversed operands: value in var\n this._conditions.push({ in: [value, { var: variable }] });\n } else {\n this._conditions.push({ [op]: [{ var: variable }, value] });\n }\n return this;\n }\n\n /** Set the value returned when this rule matches. */\n serve(value: any): Rule {\n this._value = value;\n return this;\n }\n\n /** Finalize and return the rule as a plain object. */\n build(): Record<string, any> {\n let logic: Record<string, any>;\n if (this._conditions.length === 1) {\n logic = this._conditions[0];\n } else if (this._conditions.length > 1) {\n logic = { and: this._conditions };\n } else {\n logic = {};\n }\n\n const result: Record<string, any> = {\n description: this._description,\n logic,\n value: this._value,\n };\n\n if (this._environment !== null) {\n result.environment = this._environment;\n }\n\n return result;\n }\n}\n","/**\n * Public types for the Logging SDK.\n */\n\n/** Log level values matching the smplkit platform. */\nexport enum LogLevel {\n TRACE = \"TRACE\",\n DEBUG = \"DEBUG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n FATAL = \"FATAL\",\n SILENT = \"SILENT\",\n}\n\n/** Describes a logger configuration change. */\nexport interface LoggerChangeEvent {\n /** The logger key that changed. */\n key: string;\n /** The new effective log level, or null if removed. */\n level: LogLevel | null;\n /** How the change was delivered. */\n source: string;\n}\n"],"mappings":"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","names":["createClient","createClient","checkError","wrapFetchError","createClient","createClient","checkError","wrapFetchError","createClient","APP_BASE_URL","createClient","LogLevel"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/config/client.ts","../src/errors.ts","../src/config/resolve.ts","../src/config/types.ts","../src/config/proxy.ts","../src/helpers.ts","../src/flags/client.ts","../src/flags/models.ts","../src/logging/client.ts","../src/logging/models.ts","../src/ws.ts","../src/resolve.ts","../src/flags/types.ts","../src/logging/types.ts"],"sourcesContent":["/**\n * Top-level SDK client — SmplClient.\n *\n * The main entry point for the smplkit TypeScript SDK. Provides access\n * to sub-clients for each API domain (config, flags, logging).\n */\n\nimport createClient from \"openapi-fetch\";\nimport { ConfigClient } from \"./config/client.js\";\nimport { FlagsClient } from \"./flags/client.js\";\nimport { LoggingClient } from \"./logging/client.js\";\nimport { SharedWebSocket } from \"./ws.js\";\nimport { resolveApiKey } from \"./resolve.js\";\nimport { SmplError } from \"./errors.js\";\n\nconst APP_BASE_URL = \"https://app.smplkit.com\";\n\nconst NO_ENVIRONMENT_MESSAGE =\n \"No environment provided. Set one of:\\n\" +\n \" 1. Pass environment to the constructor\\n\" +\n \" 2. Set the SMPLKIT_ENVIRONMENT environment variable\";\n\nconst NO_SERVICE_MESSAGE =\n \"No service provided. Set one of:\\n\" +\n \" 1. Pass service in options\\n\" +\n \" 2. Set the SMPLKIT_SERVICE environment variable\";\n\n/** Configuration options for the {@link SmplClient}. */\nexport interface SmplClientOptions {\n /**\n * API key for authenticating with the smplkit platform.\n * When omitted, the SDK resolves it from the `SMPLKIT_API_KEY`\n * environment variable or the `~/.smplkit` configuration file.\n */\n apiKey?: string;\n\n /**\n * The environment to connect to (e.g. `\"production\"`, `\"staging\"`).\n * When omitted, resolved from the `SMPLKIT_ENVIRONMENT` environment variable.\n */\n environment?: string;\n\n /**\n * Service name. The SDK automatically registers the service as a\n * context instance and includes it in flag evaluation context.\n * When omitted, resolved from the `SMPLKIT_SERVICE` environment variable.\n */\n service?: string;\n\n /**\n * Request timeout in milliseconds.\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Entry point for the smplkit TypeScript SDK.\n *\n * @example\n * ```typescript\n * import { SmplClient } from \"@smplkit/sdk\";\n *\n * const client = new SmplClient({\n * apiKey: \"sk_api_...\",\n * environment: \"production\",\n * service: \"my-service\",\n * });\n *\n * // Flags runtime\n * await client.flags.initialize();\n * const flag = client.flags.booleanFlag(\"checkout-v2\", false);\n * console.log(flag.get());\n *\n * // Config runtime\n * const values = await client.config.resolve(\"user-service\");\n * ```\n */\nexport class SmplClient {\n /** Client for config management and runtime. */\n readonly config: ConfigClient;\n\n /** Client for flags management and runtime. */\n readonly flags: FlagsClient;\n\n /** Client for logging management and runtime. */\n readonly logging: LoggingClient;\n\n private _wsManager: SharedWebSocket | null = null;\n private readonly _apiKey: string;\n\n /** @internal */\n readonly _environment: string;\n\n /** @internal */\n readonly _service: string;\n\n private readonly _timeout: number;\n private readonly _appHttp: ReturnType<typeof createClient<import(\"./generated/app.d.ts\").paths>>;\n\n constructor(options: SmplClientOptions = {}) {\n // 1. Resolve environment first\n const environment = options.environment || process.env.SMPLKIT_ENVIRONMENT;\n if (!environment) {\n throw new SmplError(NO_ENVIRONMENT_MESSAGE);\n }\n this._environment = environment;\n\n // 2. Resolve service second\n const service = options.service || process.env.SMPLKIT_SERVICE;\n if (!service) {\n throw new SmplError(NO_SERVICE_MESSAGE);\n }\n this._service = service;\n\n // 3. Resolve API key last (receives the already-resolved environment)\n const apiKey = resolveApiKey(options.apiKey, environment);\n this._apiKey = apiKey;\n\n this._timeout = options.timeout ?? 30_000;\n\n this._appHttp = createClient<import(\"./generated/app.d.ts\").paths>({\n baseUrl: APP_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n });\n\n this.config = new ConfigClient(apiKey, this._timeout);\n this.flags = new FlagsClient(apiKey, () => this._ensureWs(), this._timeout);\n this.logging = new LoggingClient(apiKey, () => this._ensureWs(), this._timeout);\n\n // Wire the shared WebSocket into the config client\n this.config._getSharedWs = () => this._ensureWs();\n\n // Wire parent reference into sub-clients\n this.flags._parent = this;\n this.config._parent = this;\n this.logging._parent = this;\n\n // Fire-and-forget: register service context\n void this._registerServiceContext();\n }\n\n /** @internal */\n private async _registerServiceContext(): Promise<void> {\n try {\n await this._appHttp.POST(\"/api/v1/contexts/bulk\", {\n body: {\n contexts: [\n {\n type: \"service\",\n key: this._service,\n attributes: { name: this._service },\n },\n ],\n },\n });\n } catch {\n // Fire-and-forget: log warning on failure\n }\n }\n\n /** Lazily create and start the shared WebSocket. @internal */\n private _ensureWs(): SharedWebSocket {\n if (this._wsManager === null) {\n this._wsManager = new SharedWebSocket(APP_BASE_URL, this._apiKey);\n this._wsManager.start();\n }\n return this._wsManager;\n }\n\n /** Close the shared WebSocket and release resources. */\n close(): void {\n this.logging._close();\n if (this._wsManager !== null) {\n this._wsManager.stop();\n this._wsManager = null;\n }\n }\n}\n","/**\n * ConfigClient — management plane + runtime for Smpl Config.\n *\n * Uses the generated OpenAPI types (`src/generated/config.d.ts`) via\n * `openapi-fetch` for all HTTP calls.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components, operations } from \"../generated/config.d.ts\";\nimport {\n SmplConflictError,\n SmplNotFoundError,\n SmplValidationError,\n SmplError,\n SmplConnectionError,\n SmplTimeoutError,\n throwForStatus,\n} from \"../errors.js\";\nimport { resolveChain } from \"./resolve.js\";\nimport { Config } from \"./types.js\";\nimport { LiveConfigProxy } from \"./proxy.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\n\n/** Describes a single config value change detected on refresh. */\nexport interface ConfigChangeEvent {\n /** The config key that changed. */\n configKey: string;\n /** The item key within the config that changed. */\n itemKey: string;\n /** The previous value (null if the key was absent). */\n oldValue: unknown;\n /** The updated value (null if the key was removed). */\n newValue: unknown;\n /** How the change was delivered. */\n source: \"websocket\" | \"manual\";\n}\n\n/** @internal */\ninterface ChangeListener {\n callback: (event: ConfigChangeEvent) => void;\n configKey: string | null;\n itemKey: string | null;\n}\n\nconst BASE_URL = \"https://config.smplkit.com\";\n\ntype ConfigResource = components[\"schemas\"][\"ConfigResource\"];\n\n/**\n * Extract raw values from typed items: `{key: {value, type?, description?}}` -> `{key: rawValue}`.\n * @internal\n */\nfunction extractItemValues(\n items: Record<string, { value: unknown }> | null | undefined,\n): Record<string, unknown> {\n if (!items) return {};\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(items)) {\n result[key] = item && typeof item === \"object\" && \"value\" in item ? item.value : item;\n }\n return result;\n}\n\n/**\n * Extract raw values from environment overrides.\n * Wire format: `{ env: { values: { key: { value: raw } } } }`\n * SDK format: `{ env: { values: { key: raw } } }`\n * @internal\n */\nfunction extractEnvironments(\n environments:\n | Record<string, { values?: Record<string, { value: unknown }> | null }>\n | null\n | undefined,\n): Record<string, unknown> {\n if (!environments) return {};\n const result: Record<string, unknown> = {};\n for (const [envName, envEntry] of Object.entries(environments)) {\n if (envEntry && typeof envEntry === \"object\" && envEntry.values) {\n const unwrapped: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(envEntry.values)) {\n unwrapped[key] = item && typeof item === \"object\" && \"value\" in item ? item.value : item;\n }\n result[envName] = { values: unwrapped };\n } else {\n result[envName] = envEntry;\n }\n }\n return result;\n}\n\n/** @internal */\nfunction resourceToConfig(resource: ConfigResource, client: ConfigClient): Config {\n const attrs = resource.attributes;\n return new Config(client, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n description: attrs.description ?? null,\n parent: attrs.parent ?? null,\n items: extractItemValues(attrs.items as Record<string, { value: unknown }> | null | undefined),\n environments: extractEnvironments(\n attrs.environments as\n | Record<string, { values?: Record<string, { value: unknown }> | null }>\n | null\n | undefined,\n ),\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n}\n\n/** @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n/**\n * Wrap plain values into typed item format for the API.\n * `{key: rawValue}` -> `{key: {value: rawValue}}`\n * @internal\n */\nfunction wrapItemValues(\n values: Record<string, unknown> | null | undefined,\n): Record<string, { value: unknown }> | null {\n if (!values) return null;\n const result: Record<string, { value: unknown }> = {};\n for (const [key, val] of Object.entries(values)) {\n result[key] = { value: val };\n }\n return result;\n}\n\n/**\n * Wrap plain environment values into the API wire format.\n * SDK format: `{ env: { values: { key: raw } } }`\n * Wire format: `{ env: { values: { key: { value: raw } } } }`\n * @internal\n */\nfunction wrapEnvironments(\n environments: Record<string, unknown> | null | undefined,\n): Record<string, unknown> | null {\n if (!environments) return null;\n const result: Record<string, unknown> = {};\n for (const [envName, envEntry] of Object.entries(environments)) {\n if (envEntry && typeof envEntry === \"object\" && !Array.isArray(envEntry)) {\n const entry = envEntry as Record<string, unknown>;\n if (entry.values && typeof entry.values === \"object\" && !Array.isArray(entry.values)) {\n const wrapped: Record<string, { value: unknown }> = {};\n for (const [key, val] of Object.entries(entry.values as Record<string, unknown>)) {\n wrapped[key] = { value: val };\n }\n result[envName] = { ...entry, values: wrapped };\n } else {\n result[envName] = envEntry;\n }\n } else {\n result[envName] = envEntry;\n }\n }\n return result;\n}\n\n/**\n * Build a JSON:API request body for create/update operations.\n * @internal\n */\nfunction buildRequestBody(options: {\n id?: string | null;\n name: string;\n key?: string | null;\n description?: string | null;\n parent?: string | null;\n items?: Record<string, unknown> | null;\n environments?: Record<string, unknown> | null;\n}): operations[\"create_config\"][\"requestBody\"][\"content\"][\"application/json\"] {\n const attrs: components[\"schemas\"][\"Config\"] = {\n name: options.name,\n };\n if (options.key !== undefined) attrs.key = options.key;\n if (options.description !== undefined) attrs.description = options.description;\n if (options.parent !== undefined) attrs.parent = options.parent;\n if (options.items !== undefined)\n attrs.items = wrapItemValues(options.items) as typeof attrs.items;\n if (options.environments !== undefined)\n attrs.environments = wrapEnvironments(options.environments) as typeof attrs.environments;\n\n return {\n data: {\n id: options.id ?? null,\n type: \"config\",\n attributes: attrs,\n },\n };\n}\n\n/**\n * Client for the smplkit Config API — management plane + runtime.\n *\n * Obtained via `SmplClient.config`.\n */\nexport class ConfigClient {\n /** @internal */\n readonly _apiKey: string;\n\n /** @internal */\n readonly _baseUrl: string = BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<typeof createClient<import(\"../generated/config.d.ts\").paths>>;\n\n /** @internal — returns the shared WebSocket for real-time updates. */\n _getSharedWs?: () => import(\"../ws.js\").SharedWebSocket;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n private _configCache: Record<string, Record<string, unknown>> = {};\n private _initialized = false;\n private _listeners: ChangeListener[] = [];\n\n /** @internal */\n constructor(apiKey: string, timeout?: number) {\n this._apiKey = apiKey;\n const ms = timeout ?? 30_000;\n this._http = createClient<import(\"../generated/config.d.ts\").paths>({\n baseUrl: BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n },\n });\n }\n\n // ------------------------------------------------------------------\n // Management: factory method\n // ------------------------------------------------------------------\n\n /** Create an unsaved config. Call `.save()` to persist. */\n new(key: string, options?: { name?: string; description?: string; parent?: string }): Config {\n return new Config(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n description: options?.description ?? null,\n parent: options?.parent ?? null,\n items: {},\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a config by key. */\n async get(key: string): Promise<Config> {\n return this._getByKey(key);\n }\n\n /** List all configs. */\n async list(): Promise<Config[]> {\n let data: components[\"schemas\"][\"ConfigListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list configs\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => resourceToConfig(r, this));\n }\n\n /** Delete a config by key. */\n async delete(key: string): Promise<void> {\n const config = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/configs/{id}\", {\n params: { path: { id: config.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete config '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods (called by Config.save())\n // ------------------------------------------------------------------\n\n /** @internal — POST a new config. */\n async _createConfig(config: Config): Promise<Config> {\n const body = buildRequestBody({\n name: config.name,\n key: config.key,\n description: config.description,\n parent: config.parent,\n items: config.items,\n environments: config.environments,\n });\n\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/configs\", { body });\n if (result.error !== undefined) await checkError(result.response, \"Failed to create config\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create config\");\n return resourceToConfig(data.data, this);\n }\n\n /** @internal — PUT a config update. */\n async _updateConfig(config: Config): Promise<Config> {\n const body = buildRequestBody({\n id: config.id,\n name: config.name,\n key: config.key,\n description: config.description,\n parent: config.parent,\n items: config.items,\n environments: config.environments,\n });\n\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/configs/{id}\", {\n params: { path: { id: config.id! } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update config ${config.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(`Failed to update config ${config.id}`);\n return resourceToConfig(data.data, this);\n }\n\n /** @internal — fetch a config by UUID. */\n async _getById(configId: string): Promise<Config> {\n let data: components[\"schemas\"][\"ConfigResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs/{id}\", {\n params: { path: { id: configId } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Config ${configId} not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplNotFoundError(`Config ${configId} not found`);\n return resourceToConfig(data.data, this);\n }\n\n // ------------------------------------------------------------------\n // Runtime: resolve and subscribe\n // ------------------------------------------------------------------\n\n /**\n * Resolve a config's values for the current environment.\n *\n * Returns a flat dict of resolved key-value pairs, walking the\n * parent chain and applying environment overrides.\n *\n * Optionally pass a model class to map the resolved values.\n */\n async resolve<T = Record<string, unknown>>(\n key: string,\n model?: new (data: any) => T,\n ): Promise<T> {\n await this._ensureInitialized();\n const values = this._configCache[key];\n if (values === undefined) {\n throw new SmplNotFoundError(`Config with key '${key}' not found in cache`);\n }\n if (model) {\n return new model(values);\n }\n return values as T;\n }\n\n /**\n * Subscribe to a config's values — returns a live proxy that\n * auto-updates when the underlying config changes.\n *\n * Optionally pass a model class to map the resolved values.\n */\n async subscribe<T = Record<string, unknown>>(\n key: string,\n model?: new (data: any) => T,\n ): Promise<LiveConfigProxy<T>> {\n await this._ensureInitialized();\n if (!(key in this._configCache)) {\n throw new SmplNotFoundError(`Config with key '${key}' not found in cache`);\n }\n return new LiveConfigProxy<T>(this, key, model);\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (3-level overloads)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any config change (global).\n * - `onChange(configKey, callback)` — fires for changes to a specific config.\n * - `onChange(configKey, itemKey, callback)` — fires for a specific item.\n */\n onChange(\n callbackOrConfigKey: string | ((event: ConfigChangeEvent) => void),\n callbackOrItemKey?: string | ((event: ConfigChangeEvent) => void),\n callback?: (event: ConfigChangeEvent) => void,\n ): void {\n if (typeof callbackOrConfigKey === \"function\") {\n // Global listener: onChange(callback)\n this._listeners.push({\n callback: callbackOrConfigKey,\n configKey: null,\n itemKey: null,\n });\n } else if (typeof callbackOrItemKey === \"function\") {\n // Config-scoped: onChange(configKey, callback)\n this._listeners.push({\n callback: callbackOrItemKey,\n configKey: callbackOrConfigKey,\n itemKey: null,\n });\n } else if (typeof callbackOrItemKey === \"string\" && callback) {\n // Item-scoped: onChange(configKey, itemKey, callback)\n this._listeners.push({\n callback,\n configKey: callbackOrConfigKey,\n itemKey: callbackOrItemKey,\n });\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: refresh\n // ------------------------------------------------------------------\n\n /**\n * Re-fetch all configs, re-resolve values, and update the cache.\n * Fires change listeners for any values that differ.\n */\n async refresh(): Promise<void> {\n if (!this._initialized) {\n throw new SmplError(\"Config not initialized. Call resolve() or subscribe() first.\");\n }\n const environment = this._parent?._environment;\n if (!environment) {\n throw new SmplError(\"No environment set.\");\n }\n const configs = await this.list();\n const newCache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain(configs);\n newCache[cfg.key] = resolveChain(chain, environment);\n }\n const oldCache = this._configCache;\n this._configCache = newCache;\n this._diffAndFire(oldCache, newCache, \"manual\");\n }\n\n // ------------------------------------------------------------------\n // Runtime: lazy initialization\n // ------------------------------------------------------------------\n\n /** @internal */\n private async _ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n const environment = this._parent?._environment;\n if (!environment) {\n throw new SmplError(\"No environment set. Ensure SmplClient is configured.\");\n }\n const configs = await this.list();\n const cache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain(configs);\n cache[cfg.key] = resolveChain(chain, environment);\n }\n this._configCache = cache;\n this._initialized = true;\n\n // Wire WebSocket for real-time updates\n if (this._getSharedWs) {\n const ws = this._getSharedWs();\n ws.on(\"config_changed\", this._handleConfigChanged);\n }\n }\n\n /** @internal — called by SmplClient for backward compat. */\n async _connectInternal(environment: string): Promise<void> {\n if (this._initialized) return;\n const configs = await this.list();\n const cache: Record<string, Record<string, unknown>> = {};\n for (const cfg of configs) {\n const chain = await cfg._buildChain(configs);\n cache[cfg.key] = resolveChain(chain, environment);\n }\n this._configCache = cache;\n this._initialized = true;\n }\n\n /** @internal — get resolved config from cache. Used by LiveConfigProxy. */\n _getCachedConfig(key: string): Record<string, unknown> | undefined {\n return this._configCache[key];\n }\n\n // ------------------------------------------------------------------\n // Internal: WebSocket handler\n // ------------------------------------------------------------------\n\n private _handleConfigChanged = (_data: Record<string, any>): void => {\n void this.refresh().catch(() => {\n // ignore refresh errors from WebSocket events\n });\n };\n\n // ------------------------------------------------------------------\n // Internal: change detection\n // ------------------------------------------------------------------\n\n /** @internal */\n private _diffAndFire(\n oldCache: Record<string, Record<string, unknown>>,\n newCache: Record<string, Record<string, unknown>>,\n source: \"websocket\" | \"manual\",\n ): void {\n const allConfigKeys = new Set([...Object.keys(oldCache), ...Object.keys(newCache)]);\n for (const cfgKey of allConfigKeys) {\n const oldItems = oldCache[cfgKey] ?? {};\n const newItems = newCache[cfgKey] ?? {};\n const allItemKeys = new Set([...Object.keys(oldItems), ...Object.keys(newItems)]);\n for (const iKey of allItemKeys) {\n const oldVal = iKey in oldItems ? oldItems[iKey] : null;\n const newVal = iKey in newItems ? newItems[iKey] : null;\n if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n const event: ConfigChangeEvent = {\n configKey: cfgKey,\n itemKey: iKey,\n oldValue: oldVal,\n newValue: newVal,\n source,\n };\n for (const listener of this._listeners) {\n if (listener.configKey !== null && listener.configKey !== cfgKey) continue;\n if (listener.itemKey !== null && listener.itemKey !== iKey) continue;\n try {\n listener.callback(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: fetch by key\n // ------------------------------------------------------------------\n\n private async _getByKey(key: string): Promise<Config> {\n let data: components[\"schemas\"][\"ConfigListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/configs\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Config with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Config with key '${key}' not found`);\n }\n return resourceToConfig(data.data[0], this);\n }\n}\n","/**\n * Structured SDK error types.\n *\n * All smplkit errors extend {@link SmplError}, allowing callers to catch\n * the base class for generic handling or specific subclasses for\n * fine-grained control.\n */\n\n/** A single error object from a JSON:API error response. */\nexport interface ApiErrorObject {\n status?: string;\n title?: string;\n detail?: string;\n source?: Record<string, unknown>;\n}\n\n/** Base exception for all smplkit SDK errors. */\nexport class SmplError extends Error {\n /** The HTTP status code, if the error originated from an HTTP response. */\n public readonly statusCode?: number;\n\n /** The raw response body, if available. */\n public readonly responseBody?: string;\n\n /** Structured JSON:API error objects from the server response, if available. */\n public readonly errors: ReadonlyArray<ApiErrorObject>;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message);\n this.name = \"SmplError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n this.errors = errors ?? [];\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toString(): string {\n if (this.errors.length === 0) {\n return `${this.name}: ${this.message}`;\n }\n if (this.errors.length === 1) {\n return `${this.name}: ${this.message}\\nError: ${JSON.stringify(this.errors[0])}`;\n }\n const lines = this.errors.map((e, i) => ` [${i}] ${JSON.stringify(e)}`);\n return `${this.name}: ${this.message}\\nErrors:\\n${lines.join(\"\\n\")}`;\n }\n}\n\n/** Raised when a network request fails (e.g., DNS resolution, connection refused). */\nexport class SmplConnectionError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode, responseBody, errors);\n this.name = \"SmplConnectionError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when an operation exceeds its timeout. */\nexport class SmplTimeoutError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode, responseBody, errors);\n this.name = \"SmplTimeoutError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when a requested resource does not exist (HTTP 404). */\nexport class SmplNotFoundError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 404, responseBody, errors);\n this.name = \"SmplNotFoundError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when an operation conflicts with current state (HTTP 409). */\nexport class SmplConflictError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 409, responseBody, errors);\n this.name = \"SmplConflictError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised when the server rejects a request due to validation errors (HTTP 422). */\nexport class SmplValidationError extends SmplError {\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n errors?: ApiErrorObject[],\n ) {\n super(message, statusCode ?? 422, responseBody, errors);\n this.name = \"SmplValidationError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared helper: parse JSON:API error body and throw the right exception\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON:API error response body into structured error objects.\n * @internal\n */\nfunction parseJsonApiErrors(body: string): ApiErrorObject[] {\n try {\n const parsed = JSON.parse(body);\n if (parsed && Array.isArray(parsed.errors)) {\n return parsed.errors.map((e: Record<string, unknown>) => ({\n ...(e.status !== undefined ? { status: String(e.status) } : {}),\n ...(e.title !== undefined ? { title: String(e.title) } : {}),\n ...(e.detail !== undefined ? { detail: String(e.detail) } : {}),\n ...(e.source !== undefined && typeof e.source === \"object\" && e.source !== null\n ? { source: e.source as Record<string, unknown> }\n : {}),\n }));\n }\n } catch {\n // Not JSON — return empty\n }\n return [];\n}\n\n/**\n * Derive a human-readable message from parsed JSON:API error objects.\n * Falls back to `HTTP {statusCode}` when no detail/title/status is available.\n * @internal\n */\nfunction deriveMessage(errors: ApiErrorObject[], statusCode: number, body?: string): string {\n if (errors.length === 0) {\n return body ? `HTTP ${statusCode}: ${body}` : `HTTP ${statusCode}`;\n }\n const first = errors[0];\n const base =\n first.detail ?? first.title ?? (first.status ? `HTTP ${first.status}` : `HTTP ${statusCode}`);\n if (errors.length > 1) {\n return `${base} (and ${errors.length - 1} more error${errors.length - 1 > 1 ? \"s\" : \"\"})`;\n }\n return base;\n}\n\n/**\n * Parse an HTTP error response and throw the appropriate typed SDK exception.\n *\n * 1. Attempts to parse the body as a JSON:API error envelope.\n * 2. Derives a message from the first error's detail > title > status.\n * 3. Maps 400/422 -> SmplValidationError, 404 -> SmplNotFoundError,\n * 409 -> SmplConflictError, others -> SmplError.\n *\n * @internal\n */\nexport function throwForStatus(statusCode: number, body: string): never {\n const errors = parseJsonApiErrors(body);\n const message = deriveMessage(errors, statusCode, body);\n\n switch (statusCode) {\n case 400:\n case 422:\n throw new SmplValidationError(message, statusCode, body, errors);\n case 404:\n throw new SmplNotFoundError(message, statusCode, body, errors);\n case 409:\n throw new SmplConflictError(message, statusCode, body, errors);\n default:\n throw new SmplError(message, statusCode, body, errors);\n }\n}\n","/**\n * Deep-merge resolution algorithm for config inheritance chains.\n *\n * Mirrors the Python SDK's `_resolver.py` (ADR-024 §2.5–2.6).\n */\n\n/** A single entry in a config inheritance chain (child-to-root ordering). */\nexport interface ChainConfig {\n /** Config UUID. */\n id: string;\n /** Base key-value pairs (unwrapped from typed item definitions). */\n items: Record<string, unknown>;\n /**\n * Per-environment overrides.\n * Each entry is `{ values: { key: value, ... } }` — values are already\n * unwrapped from the server's `{ value: raw }` wrapper by the client layer.\n */\n environments: Record<string, unknown>;\n}\n\n/**\n * Recursively merge two dicts, with `override` taking precedence.\n *\n * Nested dicts are merged recursively. Non-dict values (strings, numbers,\n * booleans, arrays, null) are replaced wholesale.\n */\nexport function deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (\n key in result &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolve the full configuration for an environment given a config chain.\n *\n * Walks from root (last element) to child (first element), accumulating\n * values via deep merge so that child configs override parent configs.\n *\n * For each config in the chain, base `values` are merged with\n * environment-specific values (env wins), then that result is merged\n * on top of the accumulated parent result (child wins over parent).\n *\n * @param chain - Ordered list of config data from child (index 0) to root ancestor (last).\n * @param environment - The environment key to resolve for.\n */\nexport function resolveChain(chain: ChainConfig[], environment: string): Record<string, unknown> {\n let accumulated: Record<string, unknown> = {};\n\n // Walk from root to child (reverse order — chain is child-to-root)\n for (let i = chain.length - 1; i >= 0; i--) {\n const config = chain[i];\n const baseValues: Record<string, unknown> = config.items ?? {};\n\n // Environments are stored as { env_name: { values: { key: val } } }\n const envEntry = (config.environments ?? {})[environment];\n const envValues: Record<string, unknown> =\n envEntry !== null &&\n envEntry !== undefined &&\n typeof envEntry === \"object\" &&\n !Array.isArray(envEntry)\n ? (((envEntry as Record<string, unknown>).values ?? {}) as Record<string, unknown>)\n : {};\n\n // Merge environment overrides on top of base values (env wins)\n const configResolved = deepMerge(baseValues, envValues);\n\n // Merge this config's resolved values on top of accumulated parent values (child wins)\n accumulated = deepMerge(accumulated, configResolved);\n }\n\n return accumulated;\n}\n","/**\n * Config resource — active-record model with save() pattern.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ConfigClient } from \"./client.js\";\n\n/**\n * A configuration resource managed by the smplkit platform.\n *\n * Management: mutate properties directly and call `save()` to persist.\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\nexport class Config {\n /** UUID of the config, or `null` if unsaved. */\n id: string | null;\n\n /** Human-readable key (e.g. `\"user-service\"`). */\n key: string;\n\n /** Display name. */\n name: string;\n\n /** Optional description. */\n description: string | null;\n\n /** Parent config UUID, or null if this is a root config. */\n parent: string | null;\n\n /** Base key-value pairs (unwrapped from typed item definitions). */\n items: Record<string, unknown>;\n\n /**\n * Per-environment overrides.\n * Stored as `{ env_name: { values: { key: value } } }` — values are\n * unwrapped from the server's `{ value: raw }` wrapper.\n */\n environments: Record<string, unknown>;\n\n /** When the config was created, or null if unavailable. */\n createdAt: string | null;\n\n /** When the config was last updated, or null if unavailable. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: ConfigClient;\n\n /** @internal */\n constructor(\n client: ConfigClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n description: string | null;\n parent: string | null;\n items: Record<string, unknown>;\n environments: Record<string, unknown>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.description = fields.description;\n this.parent = fields.parent;\n this.items = fields.items;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this config to the server.\n *\n * POST if `id` is null (new config), PUT if `id` is set (update).\n * Updates this instance in-place with the server response.\n */\n async save(): Promise<void> {\n if (this.id === null) {\n const created = await this._client._createConfig(this);\n this._apply(created);\n } else {\n const updated = await this._client._updateConfig(this);\n this._apply(updated);\n }\n }\n\n /**\n * Walk the parent chain and return config data objects, child-to-root.\n *\n * @param configs - Optional pre-fetched list of configs to look up parents\n * by ID, avoiding extra network calls and the key-vs-UUID mismatch with\n * {@link ConfigClient.get}.\n * @internal\n */\n async _buildChain(\n configs?: Config[],\n ): Promise<\n Array<{ id: string; items: Record<string, unknown>; environments: Record<string, unknown> }>\n > {\n const chain: Array<{\n id: string;\n items: Record<string, unknown>;\n environments: Record<string, unknown>;\n }> = [{ id: this.id ?? \"\", items: this.items, environments: this.environments }];\n\n const configsById = new Map(configs?.map((c) => [c.id, c]) ?? []);\n\n let parentId = this.parent;\n while (parentId !== null) {\n const parentConfig = configsById.get(parentId) ?? (await this._client._getById(parentId));\n chain.push({\n id: parentConfig.id ?? \"\",\n items: parentConfig.items,\n environments: parentConfig.environments,\n });\n parentId = parentConfig.parent;\n }\n\n return chain;\n }\n\n /** @internal — copy all fields from another Config instance. */\n _apply(other: Config): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.description = other.description;\n this.parent = other.parent;\n this.items = other.items;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Config(id=${this.id}, key=${this.key}, name=${this.name})`;\n }\n}\n","/**\n * LiveConfigProxy — ES6 Proxy-based live configuration access.\n *\n * Property reads are delegated to the latest resolved values in the\n * ConfigClient cache. When the cache updates via WebSocket, subsequent\n * reads automatically reflect the new values.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ConfigClient } from \"./client.js\";\n\n/**\n * A live proxy that auto-updates when the underlying config changes.\n *\n * Access properties directly — each read re-resolves from the cache.\n *\n * @example\n * ```typescript\n * const proxy = await client.config.subscribe(\"user-service\");\n * console.log(proxy.timeout); // reads from live cache\n * // ... later, after a WebSocket update ...\n * console.log(proxy.timeout); // reads the updated value\n * ```\n */\nexport class LiveConfigProxy<T = Record<string, unknown>> {\n /** @internal */\n private readonly _client: ConfigClient;\n /** @internal */\n private readonly _key: string;\n /** @internal */\n private readonly _model?: new (data: any) => T;\n\n constructor(client: ConfigClient, key: string, model?: new (data: any) => T) {\n this._client = client;\n this._key = key;\n this._model = model;\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Allow access to built-in properties and the class's own methods\n if (typeof prop === \"symbol\" || prop === \"constructor\" || prop === \"toJSON\") {\n return Reflect.get(target, prop, receiver);\n }\n\n // Delegate property access to the live cache\n const values = target._currentValues();\n if (target._model) {\n const instance = new target._model(values) as any;\n return instance[prop];\n }\n return (values as any)[prop];\n },\n\n has(target, prop) {\n if (typeof prop === \"symbol\") return Reflect.has(target, prop);\n const values = target._currentValues();\n return prop in values;\n },\n\n ownKeys(target) {\n const values = target._currentValues();\n return Object.keys(values);\n },\n\n getOwnPropertyDescriptor(target, prop) {\n if (typeof prop === \"symbol\") return Reflect.getOwnPropertyDescriptor(target, prop);\n const values = target._currentValues();\n if (prop in values) {\n return {\n configurable: true,\n enumerable: true,\n value: (values as any)[prop],\n writable: false,\n };\n }\n return undefined;\n },\n }) as LiveConfigProxy<T>;\n }\n\n /** @internal */\n _currentValues(): Record<string, unknown> {\n return this._client._getCachedConfig(this._key) ?? {};\n }\n}\n","/**\n * Shared helper utilities used across SDK modules.\n */\n\n/**\n * Convert a slug-style key to a human-readable display name.\n *\n * @example\n * ```typescript\n * keyToDisplayName(\"checkout-v2\") // \"Checkout V2\"\n * keyToDisplayName(\"payment_service\") // \"Payment Service\"\n * ```\n */\nexport function keyToDisplayName(key: string): string {\n return key.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * FlagsClient — management + prescriptive runtime for Smpl Flags.\n *\n * Uses the generated OpenAPI types (`src/generated/flags.d.ts`) via\n * `openapi-fetch` for all flag HTTP calls. Context registration uses\n * the generated app service types (`src/generated/app.d.ts`).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components } from \"../generated/flags.d.ts\";\nimport {\n SmplConflictError,\n SmplError,\n SmplNotFoundError,\n SmplTimeoutError,\n SmplValidationError,\n throwForStatus,\n} from \"../errors.js\";\n\nimport { Flag, BooleanFlag, StringFlag, NumberFlag, JsonFlag } from \"./models.js\";\nimport type { Context } from \"./types.js\";\nimport type { SharedWebSocket } from \"../ws.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\n\n// Use require-style import for json-logic-js (no TS types)\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nimport jsonLogic from \"json-logic-js\";\n\nconst FLAGS_BASE_URL = \"https://flags.smplkit.com\";\nconst APP_BASE_URL = \"https://app.smplkit.com\";\nconst CACHE_MAX_SIZE = 10_000;\nconst CONTEXT_REGISTRATION_LRU_SIZE = 10_000;\nconst CONTEXT_BATCH_FLUSH_SIZE = 100;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ntype FlagResource = components[\"schemas\"][\"FlagResource\"];\n\n/** Map HTTP errors to typed SDK exceptions. @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** Re-raise fetch-level errors as typed SDK exceptions. @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n// Re-import for the above helper\nimport { SmplConnectionError } from \"../errors.js\";\n\n/** Convert Context list to nested evaluation dict. @internal */\nfunction contextsToEvalDict(contexts: Context[]): Record<string, any> {\n const result: Record<string, any> = {};\n for (const ctx of contexts) {\n result[ctx.type] = { key: ctx.key, ...ctx.attributes };\n }\n return result;\n}\n\n/** Recursively sort object keys for stable serialization. @internal */\nfunction sortedStringify(obj: any): string {\n if (obj === null || obj === undefined) return \"null\";\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n if (Array.isArray(obj)) return \"[\" + obj.map(sortedStringify).join(\",\") + \"]\";\n const keys = Object.keys(obj).sort();\n return \"{\" + keys.map((k) => JSON.stringify(k) + \":\" + sortedStringify(obj[k])).join(\",\") + \"}\";\n}\n\n/** Compute a stable hash for a context evaluation dict. @internal */\nfunction hashContext(evalDict: Record<string, any>): string {\n const serialized = sortedStringify(evalDict);\n let hash = 0;\n for (let i = 0; i < serialized.length; i++) {\n const chr = serialized.charCodeAt(i);\n hash = ((hash << 5) - hash + chr) | 0;\n }\n return hash.toString(36);\n}\n\n/**\n * Evaluate a flag definition against the given context.\n *\n * Follows ADR-022 §2.6 semantics:\n * 1. Look up the environment. If missing, return flag-level default.\n * 2. If disabled, return env default or flag default.\n * 3. Iterate rules; first match wins.\n * 4. No match → env default or flag default.\n * @internal\n */\nfunction evaluateFlag(\n flagDef: Record<string, any>,\n environment: string | null,\n evalDict: Record<string, any>,\n): any {\n const flagDefault = flagDef.default;\n const environments = flagDef.environments ?? {};\n\n if (environment === null || !(environment in environments)) {\n return flagDefault;\n }\n\n const envConfig = environments[environment];\n const envDefault = envConfig.default;\n const fallback = envDefault !== undefined && envDefault !== null ? envDefault : flagDefault;\n\n if (!envConfig.enabled) {\n return fallback;\n }\n\n const rules = envConfig.rules ?? [];\n for (const rule of rules) {\n const logic = rule.logic;\n if (!logic || Object.keys(logic).length === 0) {\n continue;\n }\n try {\n const result = jsonLogic.apply(logic, evalDict);\n if (result) {\n return rule.value;\n }\n } catch {\n // Skip invalid rules\n continue;\n }\n }\n\n return fallback;\n}\n\n// ---------------------------------------------------------------------------\n// Change event\n// ---------------------------------------------------------------------------\n\n/** Describes a flag definition change. */\nexport class FlagChangeEvent {\n readonly key: string;\n readonly source: string;\n\n constructor(key: string, source: string) {\n this.key = key;\n this.source = source;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resolution cache + stats\n// ---------------------------------------------------------------------------\n\n/** @internal */\nclass ResolutionCache {\n private _maxSize: number;\n private _cache = new Map<string, any>();\n cacheHits = 0;\n cacheMisses = 0;\n\n constructor(maxSize: number = CACHE_MAX_SIZE) {\n this._maxSize = maxSize;\n }\n\n get(cacheKey: string): [boolean, any] {\n if (this._cache.has(cacheKey)) {\n // Move to end (delete + re-set)\n const value = this._cache.get(cacheKey);\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, value);\n this.cacheHits++;\n return [true, value];\n }\n this.cacheMisses++;\n return [false, null];\n }\n\n put(cacheKey: string, value: any): void {\n if (this._cache.has(cacheKey)) {\n this._cache.delete(cacheKey);\n }\n this._cache.set(cacheKey, value);\n if (this._cache.size > this._maxSize) {\n // Remove oldest (first) entry\n const firstKey = this._cache.keys().next().value;\n if (firstKey !== undefined) {\n this._cache.delete(firstKey);\n }\n }\n }\n\n clear(): void {\n this._cache.clear();\n }\n}\n\n/** Cache statistics for the flags runtime. */\nexport class FlagStats {\n readonly cacheHits: number;\n readonly cacheMisses: number;\n\n constructor(cacheHits: number, cacheMisses: number) {\n this.cacheHits = cacheHits;\n this.cacheMisses = cacheMisses;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context registration buffer\n// ---------------------------------------------------------------------------\n\n/** @internal */\nclass ContextRegistrationBuffer {\n private _seen = new Map<string, Record<string, any>>();\n private _pending: Array<Record<string, any>> = [];\n\n observe(contexts: Context[]): void {\n for (const ctx of contexts) {\n const cacheKey = `${ctx.type}:${ctx.key}`;\n if (!this._seen.has(cacheKey)) {\n if (this._seen.size >= CONTEXT_REGISTRATION_LRU_SIZE) {\n // Remove oldest entry\n const firstKey = this._seen.keys().next().value;\n if (firstKey !== undefined) {\n this._seen.delete(firstKey);\n }\n }\n this._seen.set(cacheKey, ctx.attributes);\n this._pending.push({\n type: ctx.type,\n key: ctx.key,\n attributes: { ...ctx.attributes },\n });\n }\n }\n }\n\n drain(): Array<Record<string, any>> {\n const batch = this._pending;\n this._pending = [];\n return batch;\n }\n\n get pendingCount(): number {\n return this._pending.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// FlagsClient\n// ---------------------------------------------------------------------------\n\n/**\n * Client for the smplkit Flags API — management plane + prescriptive runtime.\n *\n * Obtained via `SmplClient.flags`.\n */\nexport class FlagsClient {\n /** @internal */\n readonly _apiKey: string;\n /** @internal */\n readonly _baseUrl: string = FLAGS_BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<typeof createClient<import(\"../generated/flags.d.ts\").paths>>;\n /** @internal */\n private readonly _appHttp: ReturnType<typeof createClient<import(\"../generated/app.d.ts\").paths>>;\n\n // Runtime state\n private _environment: string | null = null;\n private _flagStore: Record<string, Record<string, any>> = {};\n private _initialized = false;\n private _cache = new ResolutionCache();\n private _contextProvider: (() => Context[]) | null = null;\n private _contextBuffer = new ContextRegistrationBuffer();\n private _handles: Record<string, Flag> = {};\n private _globalListeners: Array<(event: FlagChangeEvent) => void> = [];\n private _keyListeners: Map<string, Array<(event: FlagChangeEvent) => void>> = new Map();\n\n // Shared WebSocket (set during initialize)\n private _wsManager: SharedWebSocket | null = null;\n private readonly _ensureWs: () => SharedWebSocket;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n /** @internal */\n constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number) {\n this._apiKey = apiKey;\n this._ensureWs = ensureWs;\n const ms = timeout ?? 30_000;\n\n const fetchWithTimeout = async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n };\n\n this._http = createClient<import(\"../generated/flags.d.ts\").paths>({\n baseUrl: FLAGS_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: fetchWithTimeout,\n });\n\n this._appHttp = createClient<import(\"../generated/app.d.ts\").paths>({\n baseUrl: APP_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: fetchWithTimeout,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: factory methods (return unsaved flags)\n // ------------------------------------------------------------------\n\n /** Create an unsaved boolean flag. Call `.save()` to persist. */\n newBooleanFlag(\n key: string,\n options: { default: boolean; name?: string; description?: string },\n ): BooleanFlag {\n return new BooleanFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"BOOLEAN\",\n default: options.default,\n values: [\n { name: \"True\", value: true },\n { name: \"False\", value: false },\n ],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved string flag. Call `.save()` to persist. */\n newStringFlag(\n key: string,\n options: {\n default: string;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): StringFlag {\n return new StringFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"STRING\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved number flag. Call `.save()` to persist. */\n newNumberFlag(\n key: string,\n options: {\n default: number;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): NumberFlag {\n return new NumberFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"NUMERIC\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n /** Create an unsaved JSON flag. Call `.save()` to persist. */\n newJsonFlag(\n key: string,\n options: {\n default: Record<string, any>;\n name?: string;\n description?: string;\n values?: Array<{ name: string; value: unknown }>;\n },\n ): JsonFlag {\n return new JsonFlag(this, {\n id: null,\n key,\n name: options.name ?? keyToDisplayName(key),\n type: \"JSON\",\n default: options.default,\n values: options.values ?? [],\n description: options.description ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a flag by key. */\n async get(key: string): Promise<Flag> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Flag with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Flag with key '${key}' not found`);\n }\n return this._resourceToModel(data.data[0]);\n }\n\n /** List all flags. */\n async list(): Promise<Flag[]> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list flags\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._resourceToModel(r));\n }\n\n /** Delete a flag by key. */\n async delete(key: string): Promise<void> {\n const flag = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/flags/{id}\", {\n params: { path: { id: flag.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete flag '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods (called by Flag.save())\n // ------------------------------------------------------------------\n\n /** @internal — POST a new flag. */\n async _createFlag(flag: Flag): Promise<Flag> {\n const body = {\n data: {\n type: \"flag\" as const,\n attributes: {\n key: flag.key,\n name: flag.name,\n description: flag.description ?? \"\",\n type: flag.type,\n default: flag.default,\n values: flag.values,\n ...(Object.keys(flag.environments).length > 0 ? { environments: flag.environments } : {}),\n },\n },\n };\n\n let data: components[\"schemas\"][\"FlagResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/flags\", { body });\n if (result.error !== undefined) await checkError(result.response, \"Failed to create flag\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create flag\");\n return this._resourceToModel(data.data);\n }\n\n /** @internal — PUT a flag update. */\n async _updateFlag(flag: Flag): Promise<Flag> {\n const body = {\n data: {\n type: \"flag\" as const,\n attributes: {\n key: flag.key,\n name: flag.name,\n type: flag.type,\n default: flag.default,\n values: flag.values,\n description: flag.description ?? \"\",\n ...(Object.keys(flag.environments).length > 0 ? { environments: flag.environments } : {}),\n },\n },\n };\n\n let data: components[\"schemas\"][\"FlagResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/flags/{id}\", {\n params: { path: { id: flag.id! } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update flag ${flag.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(`Failed to update flag ${flag.id}`);\n return this._resourceToModel(data.data);\n }\n\n // ------------------------------------------------------------------\n // Runtime: typed flag handles\n // ------------------------------------------------------------------\n\n /** Declare a boolean flag handle for runtime evaluation. */\n booleanFlag(key: string, defaultValue: boolean): BooleanFlag {\n const handle = new BooleanFlag(this, {\n id: null,\n key,\n name: key,\n type: \"BOOLEAN\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a string flag handle for runtime evaluation. */\n stringFlag(key: string, defaultValue: string): StringFlag {\n const handle = new StringFlag(this, {\n id: null,\n key,\n name: key,\n type: \"STRING\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a numeric flag handle for runtime evaluation. */\n numberFlag(key: string, defaultValue: number): NumberFlag {\n const handle = new NumberFlag(this, {\n id: null,\n key,\n name: key,\n type: \"NUMERIC\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n /** Declare a JSON flag handle for runtime evaluation. */\n jsonFlag(key: string, defaultValue: Record<string, any>): JsonFlag {\n const handle = new JsonFlag(this, {\n id: null,\n key,\n name: key,\n type: \"JSON\",\n default: defaultValue,\n values: [],\n description: null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n this._handles[key] = handle;\n return handle;\n }\n\n // ------------------------------------------------------------------\n // Runtime: context provider\n // ------------------------------------------------------------------\n\n /**\n * Register a context provider function.\n *\n * Called on every `handle.get()` to supply the current evaluation context.\n */\n setContextProvider(fn: () => Context[]): void {\n this._contextProvider = fn;\n }\n\n /**\n * Register a context provider — decorator-style alias.\n */\n contextProvider(fn: () => Context[]): () => Context[] {\n this._contextProvider = fn;\n return fn;\n }\n\n // ------------------------------------------------------------------\n // Runtime: initialize / disconnect / refresh\n // ------------------------------------------------------------------\n\n /**\n * Initialize the flags runtime: fetch definitions and wire WebSocket.\n *\n * Idempotent — safe to call multiple times. Must be called (and awaited)\n * before using `.get()` on flag handles.\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n this._environment = this._parent?._environment ?? null;\n await this._fetchAllFlags();\n this._initialized = true;\n this._cache.clear();\n\n // Register on the shared WebSocket\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.on(\"flag_deleted\", this._handleFlagDeleted);\n }\n\n /** Disconnect: unregister from WebSocket, flush contexts, clear state. */\n async disconnect(): Promise<void> {\n if (this._wsManager !== null) {\n this._wsManager.off(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.off(\"flag_deleted\", this._handleFlagDeleted);\n this._wsManager = null;\n }\n\n await this._flushContexts();\n this._flagStore = {};\n this._cache.clear();\n this._initialized = false;\n this._environment = null;\n }\n\n /** Re-fetch all flag definitions and clear cache. */\n async refresh(): Promise<void> {\n await this._fetchAllFlags();\n this._cache.clear();\n this._fireChangeListenersAll(\"manual\");\n }\n\n /** Return the current WebSocket connection status. */\n connectionStatus(): string {\n if (this._wsManager !== null) {\n return this._wsManager.connectionStatus;\n }\n return \"disconnected\";\n }\n\n /** Return cache statistics. */\n stats(): FlagStats {\n return new FlagStats(this._cache.cacheHits, this._cache.cacheMisses);\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (dual-mode)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any flag change (global).\n * - `onChange(key, callback)` — fires only for the specified flag key.\n */\n onChange(\n callbackOrKey: string | ((event: FlagChangeEvent) => void),\n callback?: (event: FlagChangeEvent) => void,\n ): void {\n if (typeof callbackOrKey === \"function\") {\n // Global listener\n this._globalListeners.push(callbackOrKey);\n } else {\n // Key-scoped listener\n const key = callbackOrKey;\n if (!callback) {\n throw new SmplError(\"onChange(key, callback) requires a callback function.\");\n }\n if (!this._keyListeners.has(key)) {\n this._keyListeners.set(key, []);\n }\n this._keyListeners.get(key)!.push(callback);\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: context registration\n // ------------------------------------------------------------------\n\n /**\n * Explicitly register context(s) for background batch registration.\n *\n * Accepts a single Context or an array. Fire-and-forget — never\n * blocks. Works before `initialize()` is called.\n */\n register(context: Context | Context[]): void {\n if (Array.isArray(context)) {\n this._contextBuffer.observe(context);\n } else {\n this._contextBuffer.observe([context]);\n }\n }\n\n /** Flush pending context registrations to the server. */\n async flushContexts(): Promise<void> {\n await this._flushContexts();\n }\n\n // ------------------------------------------------------------------\n // Runtime: Tier 1 evaluate\n // ------------------------------------------------------------------\n\n /**\n * Tier 1 explicit evaluation — stateless, no provider or cache.\n */\n async evaluate(key: string, options: { environment: string; context: Context[] }): Promise<any> {\n const evalDict = contextsToEvalDict(options.context);\n\n // Auto-inject service context if set and not already provided\n if (this._parent?._service && !(\"service\" in evalDict)) {\n evalDict[\"service\"] = { key: this._parent._service };\n }\n\n // Use local store if initialized, otherwise fetch\n let flagDef: Record<string, any> | null = null;\n if (this._initialized && key in this._flagStore) {\n flagDef = this._flagStore[key];\n } else {\n const flags = await this._fetchFlagsList();\n for (const f of flags) {\n if (f.key === key) {\n flagDef = f;\n break;\n }\n }\n }\n\n if (flagDef === null) {\n return null;\n }\n\n return evaluateFlag(flagDef, options.environment, evalDict);\n }\n\n // ------------------------------------------------------------------\n // Internal: evaluation\n // ------------------------------------------------------------------\n\n /** @internal */\n _evaluateHandle(key: string, defaultValue: any, context: Context[] | null): any {\n if (!this._initialized) {\n throw new SmplError(\"Flags not initialized. Call await client.flags.initialize() first.\");\n }\n\n let evalDict: Record<string, any>;\n if (context !== null) {\n evalDict = contextsToEvalDict(context);\n } else if (this._contextProvider !== null) {\n const contexts = this._contextProvider();\n evalDict = contextsToEvalDict(contexts);\n this._contextBuffer.observe(contexts);\n if (this._contextBuffer.pendingCount >= CONTEXT_BATCH_FLUSH_SIZE) {\n // Fire-and-forget background flush\n void this._flushContexts();\n }\n } else {\n evalDict = {};\n }\n\n // Auto-inject service context if set and not already provided\n if (this._parent?._service && !(\"service\" in evalDict)) {\n evalDict[\"service\"] = { key: this._parent._service };\n }\n\n const ctxHash = hashContext(evalDict);\n const cacheKey = `${key}:${ctxHash}`;\n\n const [hit, cachedValue] = this._cache.get(cacheKey);\n if (hit) {\n return cachedValue;\n }\n\n const flagDef = this._flagStore[key];\n if (flagDef === undefined) {\n this._cache.put(cacheKey, defaultValue);\n return defaultValue;\n }\n\n let value = evaluateFlag(flagDef, this._environment, evalDict);\n if (value === null || value === undefined) {\n value = defaultValue;\n }\n\n this._cache.put(cacheKey, value);\n return value;\n }\n\n // ------------------------------------------------------------------\n // Internal: _connectInternal (called by SmplClient for backward compat)\n // ------------------------------------------------------------------\n\n /** @internal — called by SmplClient constructor / lazy init. */\n async _connectInternal(environment: string): Promise<void> {\n this._environment = environment;\n await this._fetchAllFlags();\n this._initialized = true;\n this._cache.clear();\n\n // Register on the shared WebSocket\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"flag_changed\", this._handleFlagChanged);\n this._wsManager.on(\"flag_deleted\", this._handleFlagDeleted);\n }\n\n // ------------------------------------------------------------------\n // Internal: event handlers (called by SharedWebSocket)\n // ------------------------------------------------------------------\n\n private _handleFlagChanged = (data: Record<string, any>): void => {\n const flagKey = data.key as string | undefined;\n // Re-fetch all flags (async, fire-and-forget)\n void this._fetchAllFlags().then(() => {\n this._cache.clear();\n this._fireChangeListeners(flagKey ?? null, \"websocket\");\n });\n };\n\n private _handleFlagDeleted = (data: Record<string, any>): void => {\n const flagKey = data.key as string | undefined;\n void this._fetchAllFlags().then(() => {\n this._cache.clear();\n this._fireChangeListeners(flagKey ?? null, \"websocket\");\n });\n };\n\n // ------------------------------------------------------------------\n // Internal: flag store\n // ------------------------------------------------------------------\n\n private async _fetchAllFlags(): Promise<void> {\n const flags = await this._fetchFlagsList();\n const store: Record<string, Record<string, any>> = {};\n for (const f of flags) {\n store[f.key] = f;\n }\n this._flagStore = store;\n }\n\n private async _fetchFlagsList(): Promise<Array<Record<string, any>>> {\n let data: components[\"schemas\"][\"FlagListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/flags\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list flags\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._resourceToPlainDict(r));\n }\n\n // ------------------------------------------------------------------\n // Internal: change listeners\n // ------------------------------------------------------------------\n\n private _fireChangeListeners(flagKey: string | null, source: string): void {\n if (flagKey) {\n const event = new FlagChangeEvent(flagKey, source);\n // Global listeners first\n for (const cb of this._globalListeners) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n // Key-scoped listeners\n const keyCallbacks = this._keyListeners.get(flagKey);\n if (keyCallbacks) {\n for (const cb of keyCallbacks) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n }\n\n private _fireChangeListenersAll(source: string): void {\n for (const flagKey of Object.keys(this._flagStore)) {\n this._fireChangeListeners(flagKey, source);\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: context flush\n // ------------------------------------------------------------------\n\n private async _flushContexts(): Promise<void> {\n const batch = this._contextBuffer.drain();\n if (batch.length === 0) return;\n try {\n await this._appHttp.POST(\"/api/v1/contexts/bulk\", {\n body: {\n contexts: batch.map((ctx) => ({\n type: ctx.type,\n key: ctx.key,\n attributes: ctx.attributes,\n })),\n },\n });\n } catch {\n // Fire-and-forget: ignore registration failures\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: model conversion\n // ------------------------------------------------------------------\n\n /** @internal */\n _resourceToModel(resource: FlagResource): Flag {\n const attrs = resource.attributes;\n return new Flag(this, {\n id: resource.id ?? null,\n key: attrs.key,\n name: attrs.name,\n type: attrs.type,\n default: attrs.default,\n values: (attrs.values ?? []).map((v) => ({ name: v.name, value: v.value })),\n description: attrs.description ?? null,\n environments: attrs.environments ?? {},\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n\n private _resourceToPlainDict(resource: FlagResource): Record<string, any> {\n const attrs = resource.attributes;\n return {\n key: attrs.key,\n name: attrs.name,\n type: attrs.type,\n default: attrs.default,\n values: (attrs.values ?? []).map((v) => ({ name: v.name, value: v.value })),\n description: attrs.description ?? null,\n environments: attrs.environments ?? {},\n };\n }\n}\n","/**\n * Unified Flag hierarchy — management model + runtime handle.\n *\n * A single {@link Flag} class replaces the old separate Flag + FlagHandle\n * classes. Typed subclasses ({@link BooleanFlag}, {@link StringFlag},\n * {@link NumberFlag}, {@link JsonFlag}) override `get()` for type safety.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { FlagsClient } from \"./client.js\";\nimport type { Context } from \"./types.js\";\n\n/**\n * A flag resource that doubles as a runtime handle.\n *\n * Management: call `save()` to persist (POST if new, PUT if existing).\n * Runtime: call `get()` for local JSON Logic evaluation.\n */\nexport class Flag {\n /** UUID of the flag, or `null` if unsaved. */\n id: string | null;\n /** Unique key within the account. */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Value type: BOOLEAN, STRING, NUMERIC, or JSON. */\n type: string;\n /** Flag-level default value. */\n default: unknown;\n /** Closed set of possible values. */\n values: Array<{ name: string; value: unknown }>;\n /** Optional description. */\n description: string | null;\n /** Per-environment configuration. */\n environments: Record<string, any>;\n /** When the flag was created. */\n createdAt: string | null;\n /** When the flag was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: FlagsClient;\n\n /** @internal */\n constructor(\n client: FlagsClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n type: string;\n default: unknown;\n values: Array<{ name: string; value: unknown }>;\n description: string | null;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.type = fields.type;\n this.default = fields.default;\n this.values = fields.values;\n this.description = fields.description;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this flag to the server.\n *\n * POST if `id` is null (new flag), PUT if `id` is set (update).\n * Updates this instance in-place with the server response.\n */\n async save(): Promise<void> {\n if (this.id === null) {\n const created = await this._client._createFlag(this);\n this._apply(created);\n } else {\n const updated = await this._client._updateFlag(this);\n this._apply(updated);\n }\n }\n\n /**\n * Add a rule to a specific environment (sync local mutation).\n *\n * The built rule must include an `environment` key (set via\n * `Rule(...).environment(\"env_key\")`). No HTTP call is made.\n *\n * @returns `this` for chaining.\n */\n addRule(builtRule: Record<string, any>): Flag {\n const envKey = builtRule.environment as string | undefined;\n if (!envKey) {\n throw new Error(\n \"Built rule must include 'environment' key. \" +\n 'Use new Rule(...).environment(\"env_key\").when(...).serve(...).build()',\n );\n }\n\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: true, rules: [] }) };\n const rules = [...(envData.rules ?? [])];\n\n // Strip the environment key from the rule — it's metadata\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { environment: _env, ...ruleCopy } = builtRule;\n rules.push(ruleCopy);\n envData.rules = rules;\n envs[envKey] = envData;\n\n this.environments = envs;\n return this;\n }\n\n /** Enable or disable a flag in a specific environment (sync local mutation). */\n setEnvironmentEnabled(envKey: string, enabled: boolean): void {\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: false, rules: [] }) };\n envData.enabled = enabled;\n envs[envKey] = envData;\n this.environments = envs;\n }\n\n /** Set the default value for a specific environment (sync local mutation). */\n setEnvironmentDefault(envKey: string, defaultValue: unknown): void {\n const envs = { ...this.environments };\n const envData = { ...(envs[envKey] ?? { enabled: false, rules: [] }) };\n envData.default = defaultValue;\n envs[envKey] = envData;\n this.environments = envs;\n }\n\n /** Clear all rules for a specific environment (sync local mutation). */\n clearRules(envKey: string): void {\n const envs = { ...this.environments };\n const envData = envs[envKey];\n if (envData) {\n envs[envKey] = { ...envData, rules: [] };\n this.environments = envs;\n }\n }\n\n /**\n * Evaluate the flag locally (sync, no HTTP).\n *\n * Requires `initialize()` to have been called.\n */\n get(options?: { context?: Context[] }): unknown {\n return this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n }\n\n /** @internal — copy all fields from another Flag instance. */\n _apply(other: Flag): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.type = other.type;\n this.default = other.default;\n this.values = other.values;\n this.description = other.description;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Flag(key=${this.key}, type=${this.type}, default=${this.default})`;\n }\n}\n\n/** Typed flag that returns `boolean` from `get()`. */\nexport class BooleanFlag extends Flag {\n get(options?: { context?: Context[] }): boolean {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"boolean\") {\n return value;\n }\n return this.default as boolean;\n }\n}\n\n/** Typed flag that returns `string` from `get()`. */\nexport class StringFlag extends Flag {\n get(options?: { context?: Context[] }): string {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"string\") {\n return value;\n }\n return this.default as string;\n }\n}\n\n/** Typed flag that returns `number` from `get()`. */\nexport class NumberFlag extends Flag {\n get(options?: { context?: Context[] }): number {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"number\") {\n return value;\n }\n return this.default as number;\n }\n}\n\n/** Typed flag that returns `Record<string, any>` from `get()`. */\nexport class JsonFlag extends Flag {\n get(options?: { context?: Context[] }): Record<string, any> {\n const value = this._client._evaluateHandle(this.key, this.default, options?.context ?? null);\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, any>;\n }\n return this.default as Record<string, any>;\n }\n}\n","/**\n * LoggingClient — management plane + scaffolded runtime for Smpl Logging.\n *\n * Uses the generated OpenAPI types (`src/generated/logging.d.ts`) via\n * `openapi-fetch` for all HTTP calls.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport createClient from \"openapi-fetch\";\nimport type { components } from \"../generated/logging.d.ts\";\nimport {\n SmplConflictError,\n SmplNotFoundError,\n SmplValidationError,\n SmplError,\n SmplConnectionError,\n SmplTimeoutError,\n throwForStatus,\n} from \"../errors.js\";\nimport { Logger, LogGroup } from \"./models.js\";\nimport type { LoggerChangeEvent } from \"./types.js\";\nimport { keyToDisplayName } from \"../helpers.js\";\nimport type { SharedWebSocket } from \"../ws.js\";\n\nconst LOGGING_BASE_URL = \"https://logging.smplkit.com\";\n\ntype LoggerResource = components[\"schemas\"][\"LoggerResource\"];\ntype LogGroupResource = components[\"schemas\"][\"LogGroupResource\"];\n\n/** @internal */\nasync function checkError(response: Response, _context: string): Promise<never> {\n const body = await response.text().catch(() => \"\");\n throwForStatus(response.status, body);\n}\n\n/** @internal */\nfunction wrapFetchError(err: unknown): never {\n if (\n err instanceof SmplNotFoundError ||\n err instanceof SmplConflictError ||\n err instanceof SmplValidationError ||\n err instanceof SmplError\n ) {\n throw err;\n }\n if (err instanceof TypeError) {\n throw new SmplConnectionError(`Network error: ${err.message}`);\n }\n throw new SmplConnectionError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n}\n\n/**\n * Client for the smplkit Logging API — management plane + scaffolded runtime.\n *\n * Obtained via `SmplClient.logging`.\n */\nexport class LoggingClient {\n /** @internal */\n readonly _apiKey: string;\n /** @internal */\n readonly _baseUrl: string = LOGGING_BASE_URL;\n\n /** @internal */\n private readonly _http: ReturnType<\n typeof createClient<import(\"../generated/logging.d.ts\").paths>\n >;\n\n /** @internal — set by SmplClient after construction. */\n _parent: { readonly _environment: string; readonly _service: string | null } | null = null;\n\n private readonly _ensureWs: () => SharedWebSocket;\n private _wsManager: SharedWebSocket | null = null;\n private _started = false;\n private _globalListeners: Array<(event: LoggerChangeEvent) => void> = [];\n private _keyListeners: Map<string, Array<(event: LoggerChangeEvent) => void>> = new Map();\n\n /** @internal */\n constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number) {\n this._apiKey = apiKey;\n this._ensureWs = ensureWs;\n const ms = timeout ?? 30_000;\n\n this._http = createClient<import(\"../generated/logging.d.ts\").paths>({\n baseUrl: LOGGING_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: \"application/json\",\n },\n fetch: async (request: Request): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(new Request(request, { signal: controller.signal }));\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new SmplTimeoutError(`Request timed out after ${ms}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n },\n });\n }\n\n // ------------------------------------------------------------------\n // Management: Logger factory\n // ------------------------------------------------------------------\n\n /** Create an unsaved logger. Call `.save()` to persist. */\n new(key: string, options?: { name?: string; managed?: boolean }): Logger {\n return new Logger(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n level: null,\n group: null,\n managed: options?.managed ?? false,\n sources: [],\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: Logger CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a logger by key. */\n async get(key: string): Promise<Logger> {\n let data: components[\"schemas\"][\"LoggerListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/loggers\", {\n params: { query: { \"filter[key]\": key } },\n });\n if (result.error !== undefined)\n await checkError(result.response, `Logger with key '${key}' not found`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data || data.data.length === 0) {\n throw new SmplNotFoundError(`Logger with key '${key}' not found`);\n }\n return this._loggerToModel(data.data[0]);\n }\n\n /** List all loggers. */\n async list(): Promise<Logger[]> {\n let data: components[\"schemas\"][\"LoggerListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/loggers\", {});\n if (result.error !== undefined) await checkError(result.response, \"Failed to list loggers\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._loggerToModel(r));\n }\n\n /** Delete a logger by key. */\n async delete(key: string): Promise<void> {\n const logger = await this.get(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/loggers/{id}\", {\n params: { path: { id: logger.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete logger '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: LogGroup factory\n // ------------------------------------------------------------------\n\n /** Create an unsaved log group. Call `.save()` to persist. */\n newGroup(key: string, options?: { name?: string; group?: string }): LogGroup {\n return new LogGroup(this, {\n id: null,\n key,\n name: options?.name ?? keyToDisplayName(key),\n level: null,\n group: options?.group ?? null,\n environments: {},\n createdAt: null,\n updatedAt: null,\n });\n }\n\n // ------------------------------------------------------------------\n // Management: LogGroup CRUD\n // ------------------------------------------------------------------\n\n /** Fetch a log group by key. */\n async getGroup(key: string): Promise<LogGroup> {\n // The logging API doesn't have a filter[key] on groups in the generated spec,\n // so we list all and filter client-side.\n const groups = await this.listGroups();\n const match = groups.find((g) => g.key === key);\n if (!match) {\n throw new SmplNotFoundError(`LogGroup with key '${key}' not found`);\n }\n return match;\n }\n\n /** List all log groups. */\n async listGroups(): Promise<LogGroup[]> {\n let data: components[\"schemas\"][\"LogGroupListResponse\"] | undefined;\n try {\n const result = await this._http.GET(\"/api/v1/log_groups\", {});\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to list log groups\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data) return [];\n return data.data.map((r) => this._groupToModel(r));\n }\n\n /** Delete a log group by key. */\n async deleteGroup(key: string): Promise<void> {\n const group = await this.getGroup(key);\n try {\n const result = await this._http.DELETE(\"/api/v1/log_groups/{id}\", {\n params: { path: { id: group.id! } },\n });\n if (result.error !== undefined && result.response.status !== 204)\n await checkError(result.response, `Failed to delete log group '${key}'`);\n } catch (err) {\n wrapFetchError(err);\n }\n }\n\n // ------------------------------------------------------------------\n // Management: internal save methods\n // ------------------------------------------------------------------\n\n /** @internal — POST or PUT a logger. */\n async _saveLogger(logger: Logger): Promise<Logger> {\n const body = {\n data: {\n type: \"logger\" as const,\n attributes: {\n key: logger.key,\n name: logger.name,\n level: logger.level,\n group: logger.group,\n managed: logger.managed,\n environments: logger.environments,\n },\n },\n };\n\n if (logger.id === null) {\n // POST — create\n let data: components[\"schemas\"][\"LoggerResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/loggers\", { body });\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to create logger\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create logger\");\n return this._loggerToModel(data.data);\n } else {\n // PUT — update\n let data: components[\"schemas\"][\"LoggerResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/loggers/{id}\", {\n params: { path: { id: logger.id } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update logger ${logger.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data)\n throw new SmplValidationError(`Failed to update logger ${logger.id}`);\n return this._loggerToModel(data.data);\n }\n }\n\n /** @internal — POST or PUT a log group. */\n async _saveLogGroup(group: LogGroup): Promise<LogGroup> {\n const body = {\n data: {\n type: \"log_group\" as const,\n attributes: {\n key: group.key,\n name: group.name,\n level: group.level,\n group: group.group,\n environments: group.environments,\n },\n },\n };\n\n if (group.id === null) {\n // POST — create\n let data: components[\"schemas\"][\"LogGroupResponse\"] | undefined;\n try {\n const result = await this._http.POST(\"/api/v1/log_groups\", { body });\n if (result.error !== undefined)\n await checkError(result.response, \"Failed to create log group\");\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data) throw new SmplValidationError(\"Failed to create log group\");\n return this._groupToModel(data.data);\n } else {\n // PUT — update\n let data: components[\"schemas\"][\"LogGroupResponse\"] | undefined;\n try {\n const result = await this._http.PUT(\"/api/v1/log_groups/{id}\", {\n params: { path: { id: group.id } },\n body,\n });\n if (result.error !== undefined)\n await checkError(result.response, `Failed to update log group ${group.id}`);\n data = result.data;\n } catch (err) {\n wrapFetchError(err);\n }\n if (!data || !data.data)\n throw new SmplValidationError(`Failed to update log group ${group.id}`);\n return this._groupToModel(data.data);\n }\n }\n\n // ------------------------------------------------------------------\n // Runtime: start (scaffolded)\n // ------------------------------------------------------------------\n\n /**\n * Start the logging runtime.\n *\n * Fetches existing loggers/groups and wires WebSocket listeners for\n * live updates. Idempotent — safe to call multiple times.\n *\n * Note: Node.js auto-discovery (equivalent to Python's logging module\n * monkey-patching) is deferred. Management methods work without start().\n */\n async start(): Promise<void> {\n if (this._started) return;\n\n // Wire WebSocket for logger_changed events\n this._wsManager = this._ensureWs();\n this._wsManager.on(\"logger_changed\", this._handleLoggerChanged);\n\n this._started = true;\n }\n\n // ------------------------------------------------------------------\n // Runtime: change listeners (dual-mode)\n // ------------------------------------------------------------------\n\n /**\n * Register a change listener.\n *\n * - `onChange(callback)` — fires for any logger change (global).\n * - `onChange(key, callback)` — fires only for the specified logger key.\n */\n onChange(\n callbackOrKey: string | ((event: LoggerChangeEvent) => void),\n callback?: (event: LoggerChangeEvent) => void,\n ): void {\n if (typeof callbackOrKey === \"function\") {\n this._globalListeners.push(callbackOrKey);\n } else {\n const key = callbackOrKey;\n if (!callback) {\n throw new SmplError(\"onChange(key, callback) requires a callback function.\");\n }\n if (!this._keyListeners.has(key)) {\n this._keyListeners.set(key, []);\n }\n this._keyListeners.get(key)!.push(callback);\n }\n }\n\n // ------------------------------------------------------------------\n // Internal: close\n // ------------------------------------------------------------------\n\n /** @internal */\n _close(): void {\n if (this._wsManager !== null) {\n this._wsManager.off(\"logger_changed\", this._handleLoggerChanged);\n this._wsManager = null;\n }\n this._started = false;\n }\n\n // ------------------------------------------------------------------\n // Internal: WebSocket handler\n // ------------------------------------------------------------------\n\n private _handleLoggerChanged = (data: Record<string, any>): void => {\n const key = data.key as string | undefined;\n if (key) {\n const level = data.level ?? null;\n const event: LoggerChangeEvent = {\n key,\n level,\n source: \"websocket\",\n };\n // Global listeners first\n for (const cb of this._globalListeners) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n // Key-scoped listeners\n const keyCallbacks = this._keyListeners.get(key);\n if (keyCallbacks) {\n for (const cb of keyCallbacks) {\n try {\n cb(event);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n };\n\n // ------------------------------------------------------------------\n // Internal: model conversion\n // ------------------------------------------------------------------\n\n private _loggerToModel(resource: LoggerResource): Logger {\n const attrs = resource.attributes;\n return new Logger(this, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n level: attrs.level ?? null,\n group: attrs.group ?? null,\n managed: attrs.managed ?? false,\n sources: (attrs.sources ?? []) as Array<Record<string, any>>,\n environments: (attrs.environments ?? {}) as Record<string, any>,\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n\n private _groupToModel(resource: LogGroupResource): LogGroup {\n const attrs = resource.attributes;\n return new LogGroup(this, {\n id: resource.id ?? null,\n key: attrs.key ?? \"\",\n name: attrs.name,\n level: attrs.level ?? null,\n group: attrs.group ?? null,\n environments: (attrs.environments ?? {}) as Record<string, any>,\n createdAt: attrs.created_at ?? null,\n updatedAt: attrs.updated_at ?? null,\n });\n }\n}\n","/**\n * Logger and LogGroup active-record models for the Logging SDK.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { LoggingClient } from \"./client.js\";\nimport { LogLevel } from \"./types.js\";\n\n/**\n * A logger resource managed by the smplkit platform.\n *\n * Management: mutate properties and call `save()` to persist.\n * Convenience methods (`setLevel`, `setEnvironmentLevel`, etc.) are\n * sync local mutations — no HTTP until `save()`.\n */\nexport class Logger {\n /** UUID of the logger, or `null` if unsaved. */\n id: string | null;\n /** Unique key (dot-separated hierarchy). */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Base log level, or null if inherited. */\n level: string | null;\n /** UUID of the parent log group, or null. */\n group: string | null;\n /** Whether this logger is managed by the platform. */\n managed: boolean;\n /** Observed sources (services that report this logger). */\n sources: Array<Record<string, any>>;\n /** Per-environment level overrides. */\n environments: Record<string, any>;\n /** When the logger was created. */\n createdAt: string | null;\n /** When the logger was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: LoggingClient;\n\n /** @internal */\n constructor(\n client: LoggingClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n level: string | null;\n group: string | null;\n managed: boolean;\n sources: Array<Record<string, any>>;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.level = fields.level;\n this.group = fields.group;\n this.managed = fields.managed;\n this.sources = fields.sources;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this logger to the server.\n *\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\n async save(): Promise<void> {\n const saved = await this._client._saveLogger(this);\n this._apply(saved);\n }\n\n /** Set the base log level (sync local mutation). */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Clear the base log level (sync local mutation). */\n clearLevel(): void {\n this.level = null;\n }\n\n /** Set an environment-specific log level (sync local mutation). */\n setEnvironmentLevel(env: string, level: LogLevel): void {\n const envs = { ...this.environments };\n envs[env] = { ...(envs[env] ?? {}), level: level };\n this.environments = envs;\n }\n\n /** Clear an environment-specific log level (sync local mutation). */\n clearEnvironmentLevel(env: string): void {\n const envs = { ...this.environments };\n if (envs[env]) {\n const entry = { ...envs[env] };\n delete entry.level;\n envs[env] = entry;\n this.environments = envs;\n }\n }\n\n /** Clear all environment-specific log levels (sync local mutation). */\n clearAllEnvironmentLevels(): void {\n this.environments = {};\n }\n\n /** @internal — copy all fields from another Logger instance. */\n _apply(other: Logger): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.level = other.level;\n this.group = other.group;\n this.managed = other.managed;\n this.sources = other.sources;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `Logger(key=${this.key}, level=${this.level})`;\n }\n}\n\n/**\n * A log group resource for organizing loggers.\n *\n * Management: mutate properties and call `save()` to persist.\n */\nexport class LogGroup {\n /** UUID of the log group, or `null` if unsaved. */\n id: string | null;\n /** Unique key. */\n key: string;\n /** Human-readable display name. */\n name: string;\n /** Base log level, or null if inherited. */\n level: string | null;\n /** UUID of the parent log group, or null. */\n group: string | null;\n /** Per-environment level overrides. */\n environments: Record<string, any>;\n /** When the log group was created. */\n createdAt: string | null;\n /** When the log group was last updated. */\n updatedAt: string | null;\n\n /** @internal */\n readonly _client: LoggingClient;\n\n /** @internal */\n constructor(\n client: LoggingClient,\n fields: {\n id: string | null;\n key: string;\n name: string;\n level: string | null;\n group: string | null;\n environments: Record<string, any>;\n createdAt: string | null;\n updatedAt: string | null;\n },\n ) {\n this._client = client;\n this.id = fields.id;\n this.key = fields.key;\n this.name = fields.name;\n this.level = fields.level;\n this.group = fields.group;\n this.environments = fields.environments;\n this.createdAt = fields.createdAt;\n this.updatedAt = fields.updatedAt;\n }\n\n /**\n * Persist this log group to the server.\n *\n * POST if `id` is null (new), PUT if `id` is set (update).\n */\n async save(): Promise<void> {\n const saved = await this._client._saveLogGroup(this);\n this._apply(saved);\n }\n\n /** Set the base log level (sync local mutation). */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Clear the base log level (sync local mutation). */\n clearLevel(): void {\n this.level = null;\n }\n\n /** Set an environment-specific log level (sync local mutation). */\n setEnvironmentLevel(env: string, level: LogLevel): void {\n const envs = { ...this.environments };\n envs[env] = { ...(envs[env] ?? {}), level: level };\n this.environments = envs;\n }\n\n /** Clear an environment-specific log level (sync local mutation). */\n clearEnvironmentLevel(env: string): void {\n const envs = { ...this.environments };\n if (envs[env]) {\n const entry = { ...envs[env] };\n delete entry.level;\n envs[env] = entry;\n this.environments = envs;\n }\n }\n\n /** Clear all environment-specific log levels (sync local mutation). */\n clearAllEnvironmentLevels(): void {\n this.environments = {};\n }\n\n /** @internal — copy all fields from another LogGroup instance. */\n _apply(other: LogGroup): void {\n this.id = other.id;\n this.key = other.key;\n this.name = other.name;\n this.level = other.level;\n this.group = other.group;\n this.environments = other.environments;\n this.createdAt = other.createdAt;\n this.updatedAt = other.updatedAt;\n }\n\n toString(): string {\n return `LogGroup(key=${this.key}, level=${this.level})`;\n }\n}\n","/**\n * Shared WebSocket connection to the app service event gateway.\n *\n * A single {@link SharedWebSocket} instance is shared across all product\n * modules (config, flags) within one {@link SmplClient}. Product modules\n * register listeners for specific event types; the shared connection\n * dispatches incoming events to the appropriate listeners.\n *\n * Protocol:\n * - Connect to `wss://app.smplkit.com/api/ws/v1/events?api_key={key}`\n * - Receive `{\"type\": \"connected\"}` on success\n * - Receive events: `{\"event\": \"config_changed\", ...}`, `{\"event\": \"flag_changed\", ...}`\n * - No subscribe message — the API key determines the account\n * - Heartbeat: server sends `ping`, client responds with `pong`\n * - Reconnect with exponential backoff\n */\n\nimport WebSocket from \"ws\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype EventCallback = (data: Record<string, any>) => void;\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 16000, 32000, 60000];\n\n/**\n * Manages a single WebSocket connection to the app service event gateway.\n *\n * Shared across config and flags modules for efficient multiplexing.\n */\nexport class SharedWebSocket {\n private readonly _appBaseUrl: string;\n private readonly _apiKey: string;\n\n private _listeners: Map<string, EventCallback[]> = new Map();\n private _connectionStatus: string = \"disconnected\";\n private _closed = false;\n private _ws: InstanceType<typeof WebSocket> | null = null;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _backoffIndex = 0;\n\n constructor(appBaseUrl: string, apiKey: string) {\n this._appBaseUrl = appBaseUrl;\n this._apiKey = apiKey;\n }\n\n // ------------------------------------------------------------------\n // Listener registration\n // ------------------------------------------------------------------\n\n /** Register a listener for a specific event type. */\n on(eventName: string, callback: EventCallback): void {\n if (!this._listeners.has(eventName)) {\n this._listeners.set(eventName, []);\n }\n this._listeners.get(eventName)!.push(callback);\n }\n\n /** Unregister a listener for a specific event type. */\n off(eventName: string, callback: EventCallback): void {\n const list = this._listeners.get(eventName);\n if (list) {\n const idx = list.indexOf(callback);\n if (idx !== -1) {\n list.splice(idx, 1);\n }\n }\n }\n\n private _dispatch(eventName: string, data: Record<string, any>): void {\n const callbacks = this._listeners.get(eventName);\n if (callbacks) {\n for (const cb of [...callbacks]) {\n try {\n cb(data);\n } catch {\n // ignore listener errors\n }\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Connection status\n // ------------------------------------------------------------------\n\n get connectionStatus(): string {\n return this._connectionStatus;\n }\n\n // ------------------------------------------------------------------\n // Lifecycle\n // ------------------------------------------------------------------\n\n /** Start the WebSocket connection. */\n start(): void {\n this._closed = false;\n this._connect();\n }\n\n /** Stop the WebSocket connection. */\n stop(): void {\n this._closed = true;\n this._connectionStatus = \"disconnected\";\n\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n\n if (this._ws !== null) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n // ------------------------------------------------------------------\n // Connection internals\n // ------------------------------------------------------------------\n\n private _buildWsUrl(): string {\n let url = this._appBaseUrl;\n if (url.startsWith(\"https://\")) {\n url = \"wss://\" + url.slice(\"https://\".length);\n } else if (url.startsWith(\"http://\")) {\n url = \"ws://\" + url.slice(\"http://\".length);\n } else {\n url = \"wss://\" + url;\n }\n url = url.replace(/\\/$/, \"\");\n return `${url}/api/ws/v1/events?api_key=${this._apiKey}`;\n }\n\n private _connect(): void {\n if (this._closed) return;\n\n this._connectionStatus = \"connecting\";\n const wsUrl = this._buildWsUrl();\n\n try {\n const ws = new WebSocket(wsUrl);\n this._ws = ws;\n\n ws.on(\"open\", () => {\n if (this._closed) {\n ws.close();\n return;\n }\n // Don't set connected yet — wait for {\"type\": \"connected\"} confirmation\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n try {\n const raw = String(data);\n\n // Heartbeat: server sends \"ping\", we respond with \"pong\"\n if (raw === \"ping\") {\n ws.send(\"pong\");\n return;\n }\n\n const msg = JSON.parse(raw) as Record<string, any>;\n\n // Connection confirmation\n if (msg.type === \"connected\") {\n this._backoffIndex = 0;\n this._connectionStatus = \"connected\";\n return;\n }\n\n // Error from server\n if (msg.type === \"error\") {\n return;\n }\n\n // Route events by the \"event\" field\n const eventName = msg.event as string | undefined;\n if (eventName) {\n this._dispatch(eventName, msg);\n }\n } catch {\n // ignore unparseable messages\n }\n });\n\n ws.on(\"close\", () => {\n if (!this._closed) {\n this._connectionStatus = \"disconnected\";\n this._scheduleReconnect();\n }\n });\n\n ws.on(\"error\", () => {\n // 'close' will fire after 'error'; reconnect is handled there\n });\n } catch {\n if (!this._closed) {\n this._scheduleReconnect();\n }\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._closed) return;\n\n const delay = BACKOFF_MS[Math.min(this._backoffIndex, BACKOFF_MS.length - 1)];\n this._backoffIndex++;\n this._connectionStatus = \"connecting\";\n\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n this._connect();\n }, delay);\n }\n}\n","/**\n * API key resolution chain: explicit → env var → config file.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { SmplError } from \"./errors.js\";\n\nfunction noApiKeyMessage(environment: string): string {\n return (\n \"No API key provided. Set one of:\\n\" +\n \" 1. Pass apiKey to the constructor\\n\" +\n \" 2. Set the SMPLKIT_API_KEY environment variable\\n\" +\n \" 3. Create a ~/.smplkit file with:\\n\" +\n ` [${environment}]\\n` +\n \" api_key = your_key_here\"\n );\n}\n\n/**\n * Parse the ~/.smplkit INI file and return the api_key value.\n * Tries the `[{environment}]` section first, then falls back to `[default]`.\n */\nfunction readApiKeyFromConfig(environment: string): string | undefined {\n const configPath = join(homedir(), \".smplkit\");\n try {\n const content = readFileSync(configPath, \"utf-8\");\n let currentSection: string | null = null;\n let envKey: string | undefined;\n let defaultKey: string | undefined;\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n if (trimmed.startsWith(\"[\")) {\n const sectionName = trimmed.slice(1, trimmed.indexOf(\"]\")).toLowerCase();\n currentSection = sectionName;\n continue;\n }\n if (currentSection && trimmed.startsWith(\"api_key\")) {\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex !== -1) {\n const value = trimmed.slice(eqIndex + 1).trim();\n if (value) {\n if (currentSection === environment.toLowerCase()) {\n envKey = value;\n } else if (currentSection === \"default\") {\n defaultKey = value;\n }\n }\n }\n }\n }\n\n return envKey ?? defaultKey;\n } catch {\n // File doesn't exist or isn't readable — skip\n return undefined;\n }\n}\n\nexport function resolveApiKey(explicit: string | undefined, environment: string): string {\n if (explicit) return explicit;\n\n const envVal = process.env.SMPLKIT_API_KEY;\n if (envVal) return envVal;\n\n const fileKey = readApiKeyFromConfig(environment);\n if (fileKey) return fileKey;\n\n throw new SmplError(noApiKeyMessage(environment));\n}\n","/**\n * Public types for the Flags SDK: Context, Rule.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * A typed evaluation context entity.\n *\n * Represents a single entity (user, account, device, etc.) in the\n * evaluation context. The *type* and *key* identify the entity;\n * *attributes* carry the data that JSON Logic rules target.\n *\n * @example\n * ```typescript\n * new Context(\"user\", \"user-123\", { plan: \"enterprise\", firstName: \"Alice\" })\n * new Context(\"user\", \"user-123\", { plan: \"enterprise\" }, { name: \"Alice Smith\" })\n * ```\n */\nexport class Context {\n readonly type: string;\n readonly key: string;\n readonly name: string | null;\n readonly attributes: Record<string, unknown>;\n\n constructor(\n type: string,\n key: string,\n attributes?: Record<string, unknown>,\n options?: { name?: string },\n ) {\n this.type = type;\n this.key = key;\n this.name = options?.name ?? null;\n this.attributes = { ...(attributes ?? {}) };\n }\n\n toString(): string {\n return `Context(type=${this.type}, key=${this.key}, name=${this.name})`;\n }\n}\n\n/**\n * Fluent builder for JSON Logic rule dicts.\n *\n * @example\n * ```typescript\n * new Rule(\"Enable for enterprise users\")\n * .when(\"user.plan\", \"==\", \"enterprise\")\n * .when(\"account.region\", \"==\", \"us\")\n * .serve(true)\n * .build()\n * ```\n *\n * Multiple `.when()` calls are AND'd. `.environment()` tags the\n * built dict with an environment key for use with `Flag.addRule()`.\n */\nexport class Rule {\n private _description: string;\n private _conditions: Record<string, any>[] = [];\n private _value: any = null;\n private _environment: string | null = null;\n\n constructor(description: string) {\n this._description = description;\n }\n\n /** Tag this rule with an environment key (used by `addRule`). */\n environment(envKey: string): Rule {\n this._environment = envKey;\n return this;\n }\n\n /** Add a condition. Multiple calls are AND'd. */\n when(variable: string, op: string, value: any): Rule {\n if (op === \"contains\") {\n // JSON Logic \"in\" with reversed operands: value in var\n this._conditions.push({ in: [value, { var: variable }] });\n } else {\n this._conditions.push({ [op]: [{ var: variable }, value] });\n }\n return this;\n }\n\n /** Set the value returned when this rule matches. */\n serve(value: any): Rule {\n this._value = value;\n return this;\n }\n\n /** Finalize and return the rule as a plain object. */\n build(): Record<string, any> {\n let logic: Record<string, any>;\n if (this._conditions.length === 1) {\n logic = this._conditions[0];\n } else if (this._conditions.length > 1) {\n logic = { and: this._conditions };\n } else {\n logic = {};\n }\n\n const result: Record<string, any> = {\n description: this._description,\n logic,\n value: this._value,\n };\n\n if (this._environment !== null) {\n result.environment = this._environment;\n }\n\n return result;\n }\n}\n","/**\n * Public types for the Logging SDK.\n */\n\n/** Log level values matching the smplkit platform. */\nexport enum LogLevel {\n TRACE = \"TRACE\",\n DEBUG = \"DEBUG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n FATAL = \"FATAL\",\n SILENT = \"SILENT\",\n}\n\n/** Describes a logger configuration change. */\nexport interface LoggerChangeEvent {\n /** The logger key that changed. */\n key: string;\n /** The new effective log level, or null if removed. */\n level: LogLevel | null;\n /** How the change was delivered. */\n source: string;\n}\n"],"mappings":"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","names":["createClient","createClient","checkError","wrapFetchError","createClient","createClient","checkError","wrapFetchError","createClient","APP_BASE_URL","createClient","LogLevel"]}
|