@kb-labs/core-state-daemon 2.94.0 → 2.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -21,6 +21,6 @@ declare class StateDaemonServer {
21
21
  private registerRoutes;
22
22
  }
23
23
 
24
- declare function bootstrap(cwd?: string): Promise<void>;
24
+ declare function bootstrap(_cwd?: string): Promise<void>;
25
25
 
26
26
  export { type StateDaemonConfig, StateDaemonServer, bootstrap };
package/dist/index.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import Fastify from 'fastify';
2
2
  import { InMemoryStateBroker } from '@kb-labs/core-state-broker';
3
- import { HttpObservabilityCollector, createCorrelatedLogger, registerOpenAPI, createServiceReadyResponse, metricLine } from '@kb-labs/shared-http';
3
+ import { HttpObservabilityCollector, createCorrelatedLogger, registerOpenAPI, getListenOptions, createServiceReadyResponse, metricLine } from '@kb-labs/shared-http';
4
4
  import { randomUUID } from 'crypto';
5
- import { createServiceBootstrap, platform } from '@kb-labs/core-runtime';
6
- import { findRepoRoot } from '@kb-labs/core-sys';
5
+ import { createServiceBootstrap } from '@kb-labs/core-runtime';
6
+ import { makeAssemblyHook } from '@kb-labs/plugin-runtime';
7
+ import { runDaemon } from '@kb-labs/shared-daemon';
7
8
 
8
9
  // src/server.ts
9
10
  function createFallbackLogger() {
@@ -132,9 +133,7 @@ var StateDaemonServer = class {
132
133
  this.registerRoutes(server);
133
134
  this.observability.recordOperation("state.bootstrap", 0, "ok");
134
135
  this.server = server;
135
- process.on("SIGTERM", () => void this.shutdown());
136
- process.on("SIGINT", () => void this.shutdown());
137
- await server.listen({ port, host });
136
+ await server.listen(getListenOptions(port, host));
138
137
  }
139
138
  async stop() {
140
139
  await this.broker.stop();
@@ -265,17 +264,22 @@ function buildBrokerMetricLines(stats) {
265
264
  metricLine("state_broker_evictions_total", stats.evictions)
266
265
  ];
267
266
  }
268
- async function bootstrap(cwd = process.cwd()) {
269
- const repoRoot = await findRepoRoot(cwd);
270
- await createServiceBootstrap({ appId: "state-daemon", repoRoot });
271
- const port = process.env.KB_STATE_DAEMON_PORT ? parseInt(process.env.KB_STATE_DAEMON_PORT, 10) : 7777;
272
- const host = process.env.KB_STATE_DAEMON_HOST ?? "localhost";
273
- const server = new StateDaemonServer({
274
- port,
275
- host,
276
- logger: platform.logger
277
- });
278
- await server.start();
267
+ async function bootstrap(_cwd = process.cwd()) {
268
+ await runDaemon(
269
+ {
270
+ appId: "state-daemon",
271
+ defaultPort: 7777,
272
+ portEnvVar: "KB_STATE_DAEMON_PORT",
273
+ defaultHost: "localhost",
274
+ hostEnvVar: "KB_STATE_DAEMON_HOST",
275
+ async setup({ platform, port, host }) {
276
+ const server = new StateDaemonServer({ port, host, logger: platform.logger });
277
+ await server.start();
278
+ return () => server.stop();
279
+ }
280
+ },
281
+ (appId, repoRoot) => createServiceBootstrap({ appId, repoRoot, assemblyHook: makeAssemblyHook() })
282
+ );
279
283
  }
280
284
 
281
285
  export { StateDaemonServer, bootstrap };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/bootstrap.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import Fastify, { type FastifyInstance } from 'fastify';\nimport { InMemoryStateBroker } from '@kb-labs/core-state-broker';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n createCorrelatedLogger,\n HttpObservabilityCollector,\n createServiceReadyResponse,\n metricLine,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport type { ObservabilityCheck, ServiceHealthStatus } from '@kb-labs/core-contracts';\nimport { randomUUID } from 'node:crypto';\n\nexport interface StateDaemonConfig {\n port?: number;\n host?: string;\n logger?: ILogger;\n}\n\nfunction createFallbackLogger(): ILogger {\n const bindings: Record<string, unknown> = {};\n\n const formatMeta = (meta?: Record<string, unknown>) => {\n const combined = { ...bindings, ...(meta ?? {}) };\n return Object.keys(combined).length > 0 ? ` ${JSON.stringify(combined)}` : '';\n };\n\n return {\n info(message: string, meta?: Record<string, unknown>) {\n console.log(`[INFO] ${message}${formatMeta(meta)}`);\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[WARN] ${message}${formatMeta(meta)}`);\n },\n error(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : meta;\n console.error(`[ERROR] ${message}${formatMeta(merged)}`);\n },\n fatal(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : meta;\n console.error(`[FATAL] ${message}${formatMeta(merged)}`);\n },\n debug(message: string, meta?: Record<string, unknown>) {\n console.debug(`[DEBUG] ${message}${formatMeta(meta)}`);\n },\n trace(message: string, meta?: Record<string, unknown>) {\n console.debug(`[TRACE] ${message}${formatMeta(meta)}`);\n },\n child(childBindings: Record<string, unknown>) {\n const childLogger = createFallbackLogger();\n return {\n ...childLogger,\n info(message: string, meta?: Record<string, unknown>) {\n console.log(`[INFO] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[WARN] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n error(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...childBindings, ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : { ...childBindings, ...(meta ?? {}) };\n console.error(`[ERROR] ${message}${formatMeta(merged)}`);\n },\n fatal(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...childBindings, ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : { ...childBindings, ...(meta ?? {}) };\n console.error(`[FATAL] ${message}${formatMeta(merged)}`);\n },\n debug(message: string, meta?: Record<string, unknown>) {\n console.debug(`[DEBUG] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n trace(message: string, meta?: Record<string, unknown>) {\n console.debug(`[TRACE] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n };\n },\n };\n}\n\nexport class StateDaemonServer {\n private readonly broker = new InMemoryStateBroker();\n private readonly observability = new HttpObservabilityCollector({\n serviceId: 'state-daemon',\n serviceType: 'state-daemon',\n version: '1.2.0',\n logsSource: 'state-daemon',\n });\n private readonly logger: ILogger;\n private server: FastifyInstance | null = null;\n private isShuttingDown = false;\n\n constructor(private readonly config: StateDaemonConfig = {}) {\n this.logger = config.logger ?? createFallbackLogger();\n }\n\n async start(): Promise<void> {\n const port = this.config.port ?? 7777;\n const host = this.config.host ?? 'localhost';\n\n const server = Fastify({\n logger: false,\n bodyLimit: 1048576,\n });\n\n server.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n request.kbLogger = createCorrelatedLogger(this.logger, {\n serviceId: 'state-daemon',\n logsSource: 'state-daemon',\n layer: 'state-daemon',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n request.kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n\n if (request.method === 'OPTIONS') {\n reply.code(204).send();\n }\n });\n server.addHook('onResponse', async (request, reply) => {\n const logger = request.kbLogger;\n if (!logger) {\n return;\n }\n\n logger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n server.addHook('onSend', async (_request, reply, payload) => {\n reply.header('Access-Control-Allow-Origin', '*');\n reply.header('Access-Control-Allow-Methods', 'GET, PUT, DELETE, POST, OPTIONS');\n reply.header('Access-Control-Allow-Headers', 'Content-Type');\n return payload;\n });\n\n await registerOpenAPI(server, {\n title: 'KB Labs State Daemon',\n description: 'State broker service for persistent cross-invocation state',\n version: '1.2.0',\n servers: [{ url: `http://${host}:${port}`, description: 'Local dev' }],\n ui: false,\n });\n\n this.observability.register(server);\n this.registerRoutes(server);\n this.observability.recordOperation('state.bootstrap', 0, 'ok');\n this.server = server;\n\n process.on('SIGTERM', () => void this.shutdown());\n process.on('SIGINT', () => void this.shutdown());\n\n await server.listen({ port, host });\n }\n\n async stop(): Promise<void> {\n await this.broker.stop();\n if (this.server) {\n await this.server.close();\n this.server = null;\n }\n }\n\n private async shutdown(): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n this.isShuttingDown = true;\n this.logger.info('Shutting down state daemon...');\n await this.stop();\n process.exit(0);\n }\n\n private getBrokerHealth() {\n return this.observability.observeOperation('state.health', () => this.broker.getHealth());\n }\n\n private getBrokerStats() {\n return this.observability.observeOperation('state.stats', () => this.broker.getStats());\n }\n\n private registerRoutes(server: FastifyInstance): void {\n server.get('/health', async () => this.getBrokerHealth());\n\n server.get('/ready', async () => {\n const health = await this.getBrokerHealth();\n const degraded = health.status !== 'ok';\n return createServiceReadyResponse({\n ready: health.status === 'ok',\n status: degraded ? 'degraded' : 'ready',\n reason: degraded ? `state_broker_${health.status}` : 'ready',\n components: {\n stateBroker: {\n ready: health.status === 'ok',\n status: health.status,\n },\n },\n });\n });\n\n server.get('/stats', async () => this.getBrokerStats());\n\n server.get('/metrics', async (_request, reply) => {\n const health = await this.getBrokerHealth();\n const stats = await this.getBrokerStats();\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return this.observability.renderPrometheusMetrics(\n mapBrokerHealthStatus(health.status),\n buildBrokerMetricLines(stats),\n );\n });\n\n server.get('/observability/describe', async () => this.observability.buildDescribe());\n\n server.get('/observability/health', async () => {\n const health = await this.getBrokerHealth();\n const stats = await this.getBrokerStats();\n\n return this.observability.buildHealth({\n status: mapBrokerHealthStatus(health.status),\n checks: buildBrokerChecks(health),\n meta: {\n serviceHealthEndpoint: '/health',\n statsEndpoint: '/stats',\n totalEntries: stats.totalEntries,\n totalSize: stats.totalSize,\n hitRate: stats.hitRate,\n missRate: stats.missRate,\n evictions: stats.evictions,\n },\n });\n });\n\n server.get('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n const value = await this.observability.observeOperation('state.get', () => this.broker.get(key));\n\n if (value === null) {\n reply.code(404);\n return null;\n }\n\n reply.type('application/json');\n return JSON.stringify(value);\n });\n\n server.put('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n const { value, ttl } = request.body as { value: unknown; ttl?: number };\n await this.observability.observeOperation('state.set', () => this.broker.set(key, value, ttl));\n reply.code(204);\n return null;\n });\n\n server.delete('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n await this.observability.observeOperation('state.delete', () => this.broker.delete(key));\n reply.code(204);\n return null;\n });\n\n server.post('/state/clear', async (request, reply) => {\n const pattern = (request.query as { pattern?: string }).pattern;\n await this.observability.observeOperation('state.clear', () => this.broker.clear(pattern));\n reply.code(204);\n return null;\n });\n }\n}\n\nfunction mapBrokerHealthStatus(status: 'ok' | 'degraded' | 'shutting_down'): ServiceHealthStatus {\n if (status === 'ok') {\n return 'healthy';\n }\n if (status === 'degraded') {\n return 'degraded';\n }\n return 'unhealthy';\n}\n\nfunction buildBrokerChecks(health: Awaited<ReturnType<InMemoryStateBroker['getHealth']>>): ObservabilityCheck[] {\n return [\n {\n id: 'state-broker',\n status: health.status === 'ok' ? 'ok' : health.status === 'degraded' ? 'warn' : 'error',\n message: `Broker status is ${health.status}`,\n },\n ];\n}\n\nfunction buildBrokerMetricLines(stats: Awaited<ReturnType<InMemoryStateBroker['getStats']>>): string[] {\n return [\n '# HELP state_broker_entries_total Total entries stored by the state broker',\n '# TYPE state_broker_entries_total gauge',\n metricLine('state_broker_entries_total', stats.totalEntries),\n '# HELP state_broker_size_bytes Estimated total size of state broker entries',\n '# TYPE state_broker_size_bytes gauge',\n metricLine('state_broker_size_bytes', stats.totalSize),\n '# HELP state_broker_evictions_total Number of evicted state broker entries',\n '# TYPE state_broker_evictions_total gauge',\n metricLine('state_broker_evictions_total', stats.evictions),\n ];\n}\n","import { createServiceBootstrap, platform } from '@kb-labs/core-runtime';\nimport { findRepoRoot } from '@kb-labs/core-sys';\nimport { StateDaemonServer } from './server.js';\n\nexport async function bootstrap(cwd: string = process.cwd()): Promise<void> {\n const repoRoot = await findRepoRoot(cwd);\n await createServiceBootstrap({ appId: 'state-daemon', repoRoot });\n\n const port = process.env.KB_STATE_DAEMON_PORT\n ? parseInt(process.env.KB_STATE_DAEMON_PORT, 10)\n : 7777;\n const host = process.env.KB_STATE_DAEMON_HOST ?? 'localhost';\n\n const server = new StateDaemonServer({\n port,\n host,\n logger: platform.logger,\n });\n\n await server.start();\n}\n\n"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/bootstrap.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import Fastify, { type FastifyInstance } from 'fastify';\nimport { InMemoryStateBroker } from '@kb-labs/core-state-broker';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n createCorrelatedLogger,\n HttpObservabilityCollector,\n createServiceReadyResponse,\n getListenOptions,\n metricLine,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport type { ObservabilityCheck, ServiceHealthStatus } from '@kb-labs/core-contracts';\nimport { randomUUID } from 'node:crypto';\n\nexport interface StateDaemonConfig {\n port?: number;\n host?: string;\n logger?: ILogger;\n}\n\nfunction createFallbackLogger(): ILogger {\n const bindings: Record<string, unknown> = {};\n\n const formatMeta = (meta?: Record<string, unknown>) => {\n const combined = { ...bindings, ...(meta ?? {}) };\n return Object.keys(combined).length > 0 ? ` ${JSON.stringify(combined)}` : '';\n };\n\n return {\n info(message: string, meta?: Record<string, unknown>) {\n console.log(`[INFO] ${message}${formatMeta(meta)}`);\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[WARN] ${message}${formatMeta(meta)}`);\n },\n error(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : meta;\n console.error(`[ERROR] ${message}${formatMeta(merged)}`);\n },\n fatal(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : meta;\n console.error(`[FATAL] ${message}${formatMeta(merged)}`);\n },\n debug(message: string, meta?: Record<string, unknown>) {\n console.debug(`[DEBUG] ${message}${formatMeta(meta)}`);\n },\n trace(message: string, meta?: Record<string, unknown>) {\n console.debug(`[TRACE] ${message}${formatMeta(meta)}`);\n },\n child(childBindings: Record<string, unknown>) {\n const childLogger = createFallbackLogger();\n return {\n ...childLogger,\n info(message: string, meta?: Record<string, unknown>) {\n console.log(`[INFO] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[WARN] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n error(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...childBindings, ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : { ...childBindings, ...(meta ?? {}) };\n console.error(`[ERROR] ${message}${formatMeta(merged)}`);\n },\n fatal(message: string, error?: Error, meta?: Record<string, unknown>) {\n const merged = error\n ? { ...childBindings, ...(meta ?? {}), error: { message: error.message, stack: error.stack } }\n : { ...childBindings, ...(meta ?? {}) };\n console.error(`[FATAL] ${message}${formatMeta(merged)}`);\n },\n debug(message: string, meta?: Record<string, unknown>) {\n console.debug(`[DEBUG] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n trace(message: string, meta?: Record<string, unknown>) {\n console.debug(`[TRACE] ${message}${formatMeta({ ...childBindings, ...(meta ?? {}) })}`);\n },\n };\n },\n };\n}\n\nexport class StateDaemonServer {\n private readonly broker = new InMemoryStateBroker();\n private readonly observability = new HttpObservabilityCollector({\n serviceId: 'state-daemon',\n serviceType: 'state-daemon',\n version: '1.2.0',\n logsSource: 'state-daemon',\n });\n private readonly logger: ILogger;\n private server: FastifyInstance | null = null;\n private isShuttingDown = false;\n\n constructor(private readonly config: StateDaemonConfig = {}) {\n this.logger = config.logger ?? createFallbackLogger();\n }\n\n async start(): Promise<void> {\n const port = this.config.port ?? 7777;\n const host = this.config.host ?? 'localhost';\n\n const server = Fastify({\n logger: false,\n bodyLimit: 1048576,\n });\n\n server.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n request.kbLogger = createCorrelatedLogger(this.logger, {\n serviceId: 'state-daemon',\n logsSource: 'state-daemon',\n layer: 'state-daemon',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n request.kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n\n if (request.method === 'OPTIONS') {\n reply.code(204).send();\n }\n });\n server.addHook('onResponse', async (request, reply) => {\n const logger = request.kbLogger;\n if (!logger) {\n return;\n }\n\n logger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n server.addHook('onSend', async (_request, reply, payload) => {\n reply.header('Access-Control-Allow-Origin', '*');\n reply.header('Access-Control-Allow-Methods', 'GET, PUT, DELETE, POST, OPTIONS');\n reply.header('Access-Control-Allow-Headers', 'Content-Type');\n return payload;\n });\n\n await registerOpenAPI(server, {\n title: 'KB Labs State Daemon',\n description: 'State broker service for persistent cross-invocation state',\n version: '1.2.0',\n servers: [{ url: `http://${host}:${port}`, description: 'Local dev' }],\n ui: false,\n });\n\n this.observability.register(server);\n this.registerRoutes(server);\n this.observability.recordOperation('state.bootstrap', 0, 'ok');\n this.server = server;\n\n await server.listen(getListenOptions(port, host));\n }\n\n async stop(): Promise<void> {\n await this.broker.stop();\n if (this.server) {\n await this.server.close();\n this.server = null;\n }\n }\n\n private async shutdown(): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n this.isShuttingDown = true;\n this.logger.info('Shutting down state daemon...');\n await this.stop();\n process.exit(0);\n }\n\n private getBrokerHealth() {\n return this.observability.observeOperation('state.health', () => this.broker.getHealth());\n }\n\n private getBrokerStats() {\n return this.observability.observeOperation('state.stats', () => this.broker.getStats());\n }\n\n private registerRoutes(server: FastifyInstance): void {\n server.get('/health', async () => this.getBrokerHealth());\n\n server.get('/ready', async () => {\n const health = await this.getBrokerHealth();\n const degraded = health.status !== 'ok';\n return createServiceReadyResponse({\n ready: health.status === 'ok',\n status: degraded ? 'degraded' : 'ready',\n reason: degraded ? `state_broker_${health.status}` : 'ready',\n components: {\n stateBroker: {\n ready: health.status === 'ok',\n status: health.status,\n },\n },\n });\n });\n\n server.get('/stats', async () => this.getBrokerStats());\n\n server.get('/metrics', async (_request, reply) => {\n const health = await this.getBrokerHealth();\n const stats = await this.getBrokerStats();\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return this.observability.renderPrometheusMetrics(\n mapBrokerHealthStatus(health.status),\n buildBrokerMetricLines(stats),\n );\n });\n\n server.get('/observability/describe', async () => this.observability.buildDescribe());\n\n server.get('/observability/health', async () => {\n const health = await this.getBrokerHealth();\n const stats = await this.getBrokerStats();\n\n return this.observability.buildHealth({\n status: mapBrokerHealthStatus(health.status),\n checks: buildBrokerChecks(health),\n meta: {\n serviceHealthEndpoint: '/health',\n statsEndpoint: '/stats',\n totalEntries: stats.totalEntries,\n totalSize: stats.totalSize,\n hitRate: stats.hitRate,\n missRate: stats.missRate,\n evictions: stats.evictions,\n },\n });\n });\n\n server.get('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n const value = await this.observability.observeOperation('state.get', () => this.broker.get(key));\n\n if (value === null) {\n reply.code(404);\n return null;\n }\n\n reply.type('application/json');\n return JSON.stringify(value);\n });\n\n server.put('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n const { value, ttl } = request.body as { value: unknown; ttl?: number };\n await this.observability.observeOperation('state.set', () => this.broker.set(key, value, ttl));\n reply.code(204);\n return null;\n });\n\n server.delete('/state/:key', async (request, reply) => {\n const { key } = request.params as { key: string };\n await this.observability.observeOperation('state.delete', () => this.broker.delete(key));\n reply.code(204);\n return null;\n });\n\n server.post('/state/clear', async (request, reply) => {\n const pattern = (request.query as { pattern?: string }).pattern;\n await this.observability.observeOperation('state.clear', () => this.broker.clear(pattern));\n reply.code(204);\n return null;\n });\n }\n}\n\nfunction mapBrokerHealthStatus(status: 'ok' | 'degraded' | 'shutting_down'): ServiceHealthStatus {\n if (status === 'ok') {\n return 'healthy';\n }\n if (status === 'degraded') {\n return 'degraded';\n }\n return 'unhealthy';\n}\n\nfunction buildBrokerChecks(health: Awaited<ReturnType<InMemoryStateBroker['getHealth']>>): ObservabilityCheck[] {\n return [\n {\n id: 'state-broker',\n status: health.status === 'ok' ? 'ok' : health.status === 'degraded' ? 'warn' : 'error',\n message: `Broker status is ${health.status}`,\n },\n ];\n}\n\nfunction buildBrokerMetricLines(stats: Awaited<ReturnType<InMemoryStateBroker['getStats']>>): string[] {\n return [\n '# HELP state_broker_entries_total Total entries stored by the state broker',\n '# TYPE state_broker_entries_total gauge',\n metricLine('state_broker_entries_total', stats.totalEntries),\n '# HELP state_broker_size_bytes Estimated total size of state broker entries',\n '# TYPE state_broker_size_bytes gauge',\n metricLine('state_broker_size_bytes', stats.totalSize),\n '# HELP state_broker_evictions_total Number of evicted state broker entries',\n '# TYPE state_broker_evictions_total gauge',\n metricLine('state_broker_evictions_total', stats.evictions),\n ];\n}\n","import { createServiceBootstrap } from '@kb-labs/core-runtime';\nimport { makeAssemblyHook } from '@kb-labs/plugin-runtime';\nimport { runDaemon } from '@kb-labs/shared-daemon';\nimport { StateDaemonServer } from './server.js';\n\nexport async function bootstrap(_cwd: string = process.cwd()): Promise<void> {\n await runDaemon(\n {\n appId: 'state-daemon',\n defaultPort: 7777,\n portEnvVar: 'KB_STATE_DAEMON_PORT',\n defaultHost: 'localhost',\n hostEnvVar: 'KB_STATE_DAEMON_HOST',\n async setup({ platform, port, host }) {\n const server = new StateDaemonServer({ port, host, logger: platform.logger });\n await server.start();\n return () => server.stop();\n },\n },\n (appId, repoRoot) =>\n createServiceBootstrap({ appId, repoRoot, assemblyHook: makeAssemblyHook() }),\n );\n}\n"]}
package/dist/manifest.js CHANGED
@@ -9,6 +9,10 @@ var manifest = {
9
9
  entry: "dist/bin.cjs",
10
10
  port: 7777,
11
11
  healthCheck: "/health"
12
+ // No socket: state-daemon stays on TCP. Its consumers (core/state-broker
13
+ // HTTP backend, rest-api observability) connect via http://localhost:7777
14
+ // directly — not through the gateway/serviceTransport — so a socket-only
15
+ // bind would break them.
12
16
  },
13
17
  env: {
14
18
  PORT: { description: "HTTP port", default: "7777" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAEO,IAAM,QAAA,GAA4B;AAAA,EACvC,MAAA,EAAQ,cAAA;AAAA,EACR,EAAA,EAAI,cAAA;AAAA,EACJ,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,yDAAA;AAAA,EACb,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,EAAE,WAAA,EAAa,WAAA,EAAa,SAAS,MAAA,EAAO;AAAA,IAClD,QAAA,EAAU,EAAE,WAAA,EAAa,kBAAA,EAAoB,SAAS,aAAA;AAAc;AAExE;AAEA,IAAO,gBAAA,GAAQ","file":"manifest.js","sourcesContent":["import type { ServiceManifest } from '@kb-labs/plugin-contracts';\n\nexport const manifest: ServiceManifest = {\n schema: 'kb.service/1',\n id: 'state-daemon',\n name: 'State Daemon',\n version: '1.4.0',\n description: 'Distributed state management (State Broker HTTP server)',\n runtime: {\n entry: 'dist/bin.cjs',\n port: 7777,\n healthCheck: '/health',\n },\n env: {\n PORT: { description: 'HTTP port', default: '7777' },\n NODE_ENV: { description: 'Environment mode', default: 'development' },\n },\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAEO,IAAM,QAAA,GAA4B;AAAA,EACvC,MAAA,EAAQ,cAAA;AAAA,EACR,EAAA,EAAI,cAAA;AAAA,EACJ,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,yDAAA;AAAA,EACb,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA,GAKf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,EAAE,WAAA,EAAa,WAAA,EAAa,SAAS,MAAA,EAAO;AAAA,IAClD,QAAA,EAAU,EAAE,WAAA,EAAa,kBAAA,EAAoB,SAAS,aAAA;AAAc;AAExE;AAEA,IAAO,gBAAA,GAAQ","file":"manifest.js","sourcesContent":["import type { ServiceManifest } from '@kb-labs/plugin-contracts';\n\nexport const manifest: ServiceManifest = {\n schema: 'kb.service/1',\n id: 'state-daemon',\n name: 'State Daemon',\n version: '1.4.0',\n description: 'Distributed state management (State Broker HTTP server)',\n runtime: {\n entry: 'dist/bin.cjs',\n port: 7777,\n healthCheck: '/health',\n // No socket: state-daemon stays on TCP. Its consumers (core/state-broker\n // HTTP backend, rest-api observability) connect via http://localhost:7777\n // directly — not through the gateway/serviceTransport — so a socket-only\n // bind would break them.\n },\n env: {\n PORT: { description: 'HTTP port', default: '7777' },\n NODE_ENV: { description: 'Environment mode', default: 'development' },\n },\n};\n\nexport default manifest;\n"]}
@@ -0,0 +1,22 @@
1
+ {
2
+ "schema": "kb.service/1",
3
+ "id": "state-daemon",
4
+ "name": "State Daemon",
5
+ "version": "1.4.0",
6
+ "description": "Distributed state management (State Broker HTTP server)",
7
+ "runtime": {
8
+ "entry": "dist/bin.cjs",
9
+ "port": 7777,
10
+ "healthCheck": "/health"
11
+ },
12
+ "env": {
13
+ "PORT": {
14
+ "description": "HTTP port",
15
+ "default": "7777"
16
+ },
17
+ "NODE_ENV": {
18
+ "description": "Environment mode",
19
+ "default": "development"
20
+ }
21
+ }
22
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/core-state-daemon",
3
3
  "description": "State daemon server for persistent cross-invocation state",
4
- "version": "2.94.0",
4
+ "version": "2.96.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -23,21 +23,23 @@
23
23
  "@fastify/swagger-ui": "^5.2.0",
24
24
  "fastify": "^5.8.5",
25
25
  "fastify-type-provider-zod": "^6.0.0",
26
- "@kb-labs/core-contracts": "2.94.0",
27
- "@kb-labs/core-platform": "2.94.0",
28
- "@kb-labs/core-runtime": "2.94.0",
29
- "@kb-labs/shared-http": "2.94.0",
30
- "@kb-labs/plugin-contracts": "2.94.0",
31
- "@kb-labs/core-sys": "2.94.0",
32
- "@kb-labs/core-state-broker": "2.94.0"
26
+ "@kb-labs/core-contracts": "2.96.0",
27
+ "@kb-labs/core-platform": "2.96.0",
28
+ "@kb-labs/plugin-runtime": "2.96.0",
29
+ "@kb-labs/core-runtime": "2.96.0",
30
+ "@kb-labs/shared-daemon": "2.96.0",
31
+ "@kb-labs/core-sys": "2.96.0",
32
+ "@kb-labs/plugin-contracts": "2.96.0",
33
+ "@kb-labs/shared-http": "2.96.0",
34
+ "@kb-labs/core-state-broker": "2.96.0"
33
35
  },
34
36
  "devDependencies": {
35
37
  "@types/node": "^24.3.3",
36
38
  "rimraf": "^6.0.1",
37
39
  "tsup": "^8.5.0",
38
40
  "typescript": "^5.6.3",
39
- "vitest": "^3.2.4",
40
- "@kb-labs/devkit": "2.94.0"
41
+ "vitest": "^3.2.6",
42
+ "@kb-labs/devkit": "2.96.0"
41
43
  },
42
44
  "engines": {
43
45
  "node": ">=20.0.0",