@iworkforces/tracelattice 2.0.7 → 2.1.1

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.
Files changed (217) hide show
  1. package/README.md +88 -64
  2. package/dist/ServerConfig.d.ts +1 -1
  3. package/dist/ServerConfig.js.map +1 -1
  4. package/dist/cli.js +223 -254
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config/ConfigLoader.d.ts +29 -26
  7. package/dist/config/ConfigLoader.d.ts.map +1 -1
  8. package/dist/config/ConfigLoader.js +40 -36
  9. package/dist/config/ConfigLoader.js.map +1 -1
  10. package/dist/contracts/PersistenceBackend.d.ts +7 -108
  11. package/dist/contracts/PersistenceBackend.d.ts.map +1 -1
  12. package/dist/contracts/PersistenceBackend.js +1 -6
  13. package/dist/contracts/calibrator.d.ts +6 -6
  14. package/dist/contracts/calibrator.d.ts.map +1 -1
  15. package/dist/contracts/ids.d.ts +1 -8
  16. package/dist/contracts/ids.d.ts.map +1 -1
  17. package/dist/contracts/ids.js +2 -3
  18. package/dist/contracts/ids.js.map +1 -1
  19. package/dist/contracts/interfaces.d.ts +4 -6
  20. package/dist/contracts/interfaces.d.ts.map +1 -1
  21. package/dist/contracts/persistence-work.d.ts +2 -3
  22. package/dist/contracts/persistence-work.d.ts.map +1 -1
  23. package/dist/contracts/summary.d.ts +0 -1
  24. package/dist/contracts/summary.d.ts.map +1 -1
  25. package/dist/core/HistoryManager.d.ts +12 -16
  26. package/dist/core/HistoryManager.d.ts.map +1 -1
  27. package/dist/core/HistoryManager.js +19 -40
  28. package/dist/core/HistoryManager.js.map +1 -1
  29. package/dist/core/IHistoryManager.d.ts +22 -30
  30. package/dist/core/IHistoryManager.d.ts.map +1 -1
  31. package/dist/core/InputNormalizer.d.ts +7 -24
  32. package/dist/core/InputNormalizer.d.ts.map +1 -1
  33. package/dist/core/InputNormalizer.js +3 -9
  34. package/dist/core/InputNormalizer.js.map +1 -1
  35. package/dist/core/PersistenceBuffer.d.ts +3 -20
  36. package/dist/core/PersistenceBuffer.d.ts.map +1 -1
  37. package/dist/core/PersistenceBuffer.js +1 -4
  38. package/dist/core/PersistenceBuffer.js.map +1 -1
  39. package/dist/core/PersistenceRestore.d.ts +1 -1
  40. package/dist/core/PersistenceRestore.d.ts.map +1 -1
  41. package/dist/core/PersistenceRestore.js +4 -10
  42. package/dist/core/PersistenceRestore.js.map +1 -1
  43. package/dist/core/PersistenceWriter.d.ts.map +1 -1
  44. package/dist/core/PersistenceWriter.js +3 -12
  45. package/dist/core/PersistenceWriter.js.map +1 -1
  46. package/dist/core/SessionErrors.d.ts +0 -11
  47. package/dist/core/SessionErrors.d.ts.map +1 -1
  48. package/dist/core/SessionErrors.js +1 -14
  49. package/dist/core/SessionErrors.js.map +1 -1
  50. package/dist/core/SessionLock.d.ts +4 -5
  51. package/dist/core/SessionLock.d.ts.map +1 -1
  52. package/dist/core/SessionLock.js +5 -10
  53. package/dist/core/SessionLock.js.map +1 -1
  54. package/dist/core/SessionManager.d.ts +0 -2
  55. package/dist/core/SessionManager.d.ts.map +1 -1
  56. package/dist/core/SessionManager.js +3 -5
  57. package/dist/core/SessionManager.js.map +1 -1
  58. package/dist/core/SessionResetCoordinator.d.ts +10 -7
  59. package/dist/core/SessionResetCoordinator.d.ts.map +1 -1
  60. package/dist/core/SessionResetCoordinator.js +10 -28
  61. package/dist/core/SessionResetCoordinator.js.map +1 -1
  62. package/dist/core/ThoughtEvaluator.d.ts +5 -5
  63. package/dist/core/ThoughtEvaluator.d.ts.map +1 -1
  64. package/dist/core/ThoughtEvaluator.js +4 -40
  65. package/dist/core/ThoughtEvaluator.js.map +1 -1
  66. package/dist/core/ThoughtFormatter.js.map +1 -1
  67. package/dist/core/ThoughtProcessor.d.ts +10 -3
  68. package/dist/core/ThoughtProcessor.d.ts.map +1 -1
  69. package/dist/core/ThoughtProcessor.js +34 -38
  70. package/dist/core/ThoughtProcessor.js.map +1 -1
  71. package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -1
  72. package/dist/core/VerificationOutcomeAdmission.js +5 -7
  73. package/dist/core/VerificationOutcomeAdmission.js.map +1 -1
  74. package/dist/core/compression/CompressionService.d.ts +2 -1
  75. package/dist/core/compression/CompressionService.d.ts.map +1 -1
  76. package/dist/core/compression/CompressionService.js.map +1 -1
  77. package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -1
  78. package/dist/core/compression/DehydrationPolicy.js.map +1 -1
  79. package/dist/core/compression/InMemorySummaryStore.d.ts +2 -1
  80. package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -1
  81. package/dist/core/compression/InMemorySummaryStore.js.map +1 -1
  82. package/dist/core/evaluator/Calibrator.d.ts +2 -2
  83. package/dist/core/evaluator/Calibrator.d.ts.map +1 -1
  84. package/dist/core/evaluator/Calibrator.js +2 -5
  85. package/dist/core/evaluator/Calibrator.js.map +1 -1
  86. package/dist/core/evaluator/SignalComputer.d.ts +2 -1
  87. package/dist/core/evaluator/SignalComputer.d.ts.map +1 -1
  88. package/dist/core/evaluator/SignalComputer.js.map +1 -1
  89. package/dist/core/evaluator/internals.d.ts +1 -5
  90. package/dist/core/evaluator/internals.d.ts.map +1 -1
  91. package/dist/core/evaluator/internals.js +1 -3
  92. package/dist/core/evaluator/internals.js.map +1 -1
  93. package/dist/core/graph/Edge.d.ts +1 -1
  94. package/dist/core/graph/EdgeEmitter.d.ts +2 -4
  95. package/dist/core/graph/EdgeEmitter.d.ts.map +1 -1
  96. package/dist/core/graph/EdgeEmitter.js +2 -4
  97. package/dist/core/graph/EdgeEmitter.js.map +1 -1
  98. package/dist/core/graph/GraphView.d.ts +13 -1
  99. package/dist/core/graph/GraphView.d.ts.map +1 -1
  100. package/dist/core/graph/GraphView.js +34 -0
  101. package/dist/core/graph/GraphView.js.map +1 -1
  102. package/dist/core/reasoning/OutcomeRecorder.d.ts +0 -1
  103. package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -1
  104. package/dist/core/reasoning/OutcomeRecorder.js.map +1 -1
  105. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +3 -3
  106. package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -1
  107. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +6 -6
  108. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -1
  109. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +16 -2
  110. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -1
  111. package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -1
  112. package/dist/core/reasoning/strategies/totScoring.js.map +1 -1
  113. package/dist/core/reasoning.d.ts +1 -3
  114. package/dist/core/reasoning.d.ts.map +1 -1
  115. package/dist/core/thought.d.ts +3 -2
  116. package/dist/core/thought.d.ts.map +1 -1
  117. package/dist/errors.d.ts +4 -20
  118. package/dist/errors.d.ts.map +1 -1
  119. package/dist/errors.js +2 -28
  120. package/dist/errors.js.map +1 -1
  121. package/dist/lib.d.ts +31 -24
  122. package/dist/lib.d.ts.map +1 -1
  123. package/dist/lib.js +55 -10
  124. package/dist/lib.js.map +1 -1
  125. package/dist/logger/NullLogger.d.ts +9 -11
  126. package/dist/logger/NullLogger.d.ts.map +1 -1
  127. package/dist/logger/NullLogger.js.map +1 -1
  128. package/dist/persistence/FilePersistence.d.ts +3 -12
  129. package/dist/persistence/FilePersistence.d.ts.map +1 -1
  130. package/dist/persistence/FilePersistence.js +9 -61
  131. package/dist/persistence/FilePersistence.js.map +1 -1
  132. package/dist/persistence/FileSnapshotV2.d.ts +2 -2
  133. package/dist/persistence/FileSnapshotV2.js +2 -2
  134. package/dist/persistence/FileSnapshotV2.js.map +1 -1
  135. package/dist/persistence/FileWriter.d.ts +1 -0
  136. package/dist/persistence/FileWriter.d.ts.map +1 -1
  137. package/dist/persistence/FileWriter.js +3 -3
  138. package/dist/persistence/FileWriter.js.map +1 -1
  139. package/dist/persistence/MemoryPersistence.d.ts +5 -15
  140. package/dist/persistence/MemoryPersistence.d.ts.map +1 -1
  141. package/dist/persistence/MemoryPersistence.js +6 -40
  142. package/dist/persistence/MemoryPersistence.js.map +1 -1
  143. package/dist/persistence/PersistenceCodec.js +1 -3
  144. package/dist/persistence/PersistenceCodec.js.map +1 -1
  145. package/dist/persistence/PersistenceErrors.d.ts +0 -6
  146. package/dist/persistence/PersistenceErrors.d.ts.map +1 -1
  147. package/dist/persistence/PersistenceErrors.js +1 -9
  148. package/dist/persistence/PersistenceErrors.js.map +1 -1
  149. package/dist/persistence/PersistenceScope.d.ts.map +1 -1
  150. package/dist/persistence/PersistenceScope.js +2 -2
  151. package/dist/persistence/PersistenceScope.js.map +1 -1
  152. package/dist/persistence/SqlitePersistence.d.ts +3 -10
  153. package/dist/persistence/SqlitePersistence.d.ts.map +1 -1
  154. package/dist/persistence/SqlitePersistence.js +2 -26
  155. package/dist/persistence/SqlitePersistence.js.map +1 -1
  156. package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -1
  157. package/dist/persistence/SqliteSchemaV2.js +3 -12
  158. package/dist/persistence/SqliteSchemaV2.js.map +1 -1
  159. package/dist/pool/ConnectionPool.d.ts +3 -12
  160. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  161. package/dist/pool/ConnectionPool.js +5 -8
  162. package/dist/pool/ConnectionPool.js.map +1 -1
  163. package/dist/pool/IConnectionPool.d.ts +3 -9
  164. package/dist/pool/IConnectionPool.d.ts.map +1 -1
  165. package/dist/registry/SkillRegistry.d.ts +1 -7
  166. package/dist/registry/SkillRegistry.d.ts.map +1 -1
  167. package/dist/registry/SkillRegistry.js +0 -15
  168. package/dist/registry/SkillRegistry.js.map +1 -1
  169. package/dist/registry/ToolRegistry.d.ts +1 -9
  170. package/dist/registry/ToolRegistry.d.ts.map +1 -1
  171. package/dist/registry/ToolRegistry.js +0 -21
  172. package/dist/registry/ToolRegistry.js.map +1 -1
  173. package/dist/schema.d.ts +2 -1
  174. package/dist/schema.d.ts.map +1 -1
  175. package/dist/schema.js +3 -3
  176. package/dist/schema.js.map +1 -1
  177. package/dist/transport/BaseTransport.d.ts +0 -9
  178. package/dist/transport/BaseTransport.d.ts.map +1 -1
  179. package/dist/transport/BaseTransport.js +0 -11
  180. package/dist/transport/BaseTransport.js.map +1 -1
  181. package/dist/transport/HttpHelpers.d.ts +4 -1
  182. package/dist/transport/HttpHelpers.d.ts.map +1 -1
  183. package/dist/transport/HttpHelpers.js +61 -11
  184. package/dist/transport/HttpHelpers.js.map +1 -1
  185. package/dist/transport/HttpRequestLifecycle.d.ts +15 -1
  186. package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -1
  187. package/dist/transport/HttpRequestLifecycle.js +66 -4
  188. package/dist/transport/HttpRequestLifecycle.js.map +1 -1
  189. package/dist/transport/HttpTransport.d.ts +2 -0
  190. package/dist/transport/HttpTransport.d.ts.map +1 -1
  191. package/dist/transport/HttpTransport.js +75 -38
  192. package/dist/transport/HttpTransport.js.map +1 -1
  193. package/dist/transport/StreamableHttpTransport.d.ts +5 -29
  194. package/dist/transport/StreamableHttpTransport.d.ts.map +1 -1
  195. package/dist/transport/StreamableHttpTransport.js +74 -116
  196. package/dist/transport/StreamableHttpTransport.js.map +1 -1
  197. package/dist/watchers/SkillWatcher.d.ts.map +1 -1
  198. package/dist/watchers/SkillWatcher.js +1 -1
  199. package/dist/watchers/SkillWatcher.js.map +1 -1
  200. package/package.json +2 -2
  201. package/dist/contracts/PersistenceBackend.js.map +0 -1
  202. package/dist/persistence/FileLegacyImport.d.ts +0 -2
  203. package/dist/persistence/FileLegacyImport.d.ts.map +0 -1
  204. package/dist/persistence/FileLegacyImport.js +0 -183
  205. package/dist/persistence/FileLegacyImport.js.map +0 -1
  206. package/dist/persistence/SessionScopedPersistence.d.ts +0 -4
  207. package/dist/persistence/SessionScopedPersistence.d.ts.map +0 -1
  208. package/dist/persistence/SessionScopedPersistence.js +0 -9
  209. package/dist/persistence/SessionScopedPersistence.js.map +0 -1
  210. package/dist/persistence/SqliteLegacyImport.d.ts +0 -14
  211. package/dist/persistence/SqliteLegacyImport.d.ts.map +0 -1
  212. package/dist/persistence/SqliteLegacyImport.js +0 -136
  213. package/dist/persistence/SqliteLegacyImport.js.map +0 -1
  214. package/dist/persistence/SqliteLegacySchema.d.ts +0 -15
  215. package/dist/persistence/SqliteLegacySchema.d.ts.map +0 -1
  216. package/dist/persistence/SqliteLegacySchema.js +0 -72
  217. package/dist/persistence/SqliteLegacySchema.js.map +0 -1
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\n\n// CLI entry point for tracelattice MCP server.\n// This file handles CLI argument parsing, transport selection, and signal handlers.\n// For library usage, import from './lib.js' or './index.js' instead.\n\nimport { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';\nimport { StdioTransport } from '@tmcp/transport-stdio';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from 'tmcp';\nimport { CliLifecycle, createCliShutdownHandler } from './CliLifecycle.js';\nimport type { ToolAwareSequentialThinkingServer } from './lib.js';\nimport { initializeServer } from './lib.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { getErrorMessage } from './errors.js';\nimport { SEQUENTIAL_THINKING_TOOL, SequentialThinkingSchema } from './schema.js';\n\n// Get version from package.json\nconst CLI_NAME = 'tracelattice' as const;\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst package_json = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\nconst { version } = package_json;\n// Handle CLI arguments\nconst args = process.argv.slice(2);\nconst shouldShowVersion = args.includes('--version') || args.includes('-v');\n\nif (shouldShowVersion) {\n\tconsole.log(`${CLI_NAME} v${version}`);\n\tprocess.exit(0);\n}\nasync function main() {\n\tconst transportType = process.env.TRANSPORT_TYPE || 'stdio';\n\tconst adapter = new ValibotJsonSchemaAdapter();\n\tconst server = new McpServer(\n\t\t{\n\t\t\tname: CLI_NAME,\n\t\t\tversion,\n\t\t\tdescription: 'Semantic Sequential Thinking MCP Server',\n\t\t},\n\t\t{\n\t\t\tadapter,\n\t\t\tcapabilities: {\n\t\t\t\ttools: { listChanged: true },\n\t\t\t},\n\t\t}\n\t);\n\n\tconst thinkingServer = await initializeServer();\n\tconst lifecycle = new CliLifecycle(thinkingServer);\n\ttry {\n\t\tserver.tool(\n\t\t\t{\n\t\t\t\tname: 'sequentialthinking_tools',\n\t\t\t\tdescription: SEQUENTIAL_THINKING_TOOL.description,\n\t\t\t\tschema: SequentialThinkingSchema,\n\t\t\t},\n\t\t\tasync (input) => thinkingServer.processThought(input)\n\t\t);\n\t\tif (transportType === 'streamable-http') {\n\t\t\tawait startStreamableHttpTransport(server, thinkingServer, lifecycle);\n\t\t} else {\n\t\t\tawait startStdioTransport(server, thinkingServer, lifecycle);\n\t\t}\n\t\tregisterShutdownHandlers(lifecycle, thinkingServer, transportType === 'stdio');\n\t} catch (error) {\n\t\tawait lifecycle.rollbackStartup(error);\n\t}\n}\n/**\n * Start Streamable HTTP transport (MCP spec recommended)\n */\nasync function startStreamableHttpTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst { StreamableHttpTransport } = await import('./transport/StreamableHttpTransport.js');\n\tconst port = parseInt(process.env.STREAMABLE_HTTP_PORT || '9007', 10);\n\tconst host = process.env.STREAMABLE_HTTP_HOST || 'localhost';\n\tconst transportMetrics = thinkingServer.getContainer().resolve('Metrics');\n\tconst stateful = process.env.STREAMABLE_HTTP_STATEFUL !== 'false';\n\tconst streamableTransport = new StreamableHttpTransport({\n\t\tport,\n\t\thost,\n\t\tcorsOrigin: process.env.CORS_ORIGIN || '*',\n\t\tenableCors: process.env.ENABLE_CORS !== 'false',\n\t\tallowedHosts: process.env.ALLOWED_HOSTS?.split(',').map((hostValue) => hostValue.trim()),\n\t\tmetrics: transportMetrics,\n\t\tstateful,\n\t});\n\tlifecycle.attachTransport(streamableTransport);\n\t// Connect the Streamable HTTP transport\n\tawait streamableTransport.connect(server);\n\tthinkingServer['_logger'].info(\n\t\t`Sequential Thinking MCP Server running on Streamable HTTP transport at http://${host}:${port}`\n\t);\n}\n/**\n * Start stdio transport (default, single-user)\n */\nasync function startStdioTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst transport = new StdioTransport(server);\n\tconst processListeners = {\n\t\tsigint: new Set(process.listeners('SIGINT')),\n\t\tsigterm: new Set(process.listeners('SIGTERM')),\n\t\tstdinEnd: new Set(process.stdin.listeners('end')),\n\t};\n\tlifecycle.attachTransport({ stop: () => transport.close() });\n\ttransport.listen();\n\tfor (const listener of process.listeners('SIGINT')) {\n\t\tif (!processListeners.sigint.has(listener)) process.off('SIGINT', listener);\n\t}\n\tfor (const listener of process.listeners('SIGTERM')) {\n\t\tif (!processListeners.sigterm.has(listener)) process.off('SIGTERM', listener);\n\t}\n\tfor (const listener of process.stdin.listeners('end')) {\n\t\tif (!processListeners.stdinEnd.has(listener)) process.stdin.off('end', listener);\n\t}\n\tthinkingServer['_logger'].info('Sequential Thinking MCP Server running on stdio');\n}\n/**\n * Register shutdown signal handlers for a common pattern\n */\nfunction registerShutdownHandlers(\n\tlifecycle: CliLifecycle,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tshutdownOnStdinEnd: boolean\n): void {\n\tconst shutdown = createCliShutdownHandler(lifecycle, {\n\t\treportFailure: (error) => {\n\t\t\tthinkingServer['_logger'].error('CLI shutdown failed', failureMetadata(error));\n\t\t},\n\t\texit: (code) => process.exit(code),\n\t});\n\tconst requestShutdown = (): void => {\n\t\tvoid shutdown();\n\t};\n\tprocess.on('SIGINT', requestShutdown);\n\tprocess.on('SIGTERM', requestShutdown);\n\tif (shutdownOnStdinEnd) process.stdin.on('end', requestShutdown);\n}\n\nfunction failureMetadata(error: unknown): Record<string, unknown> {\n\tif (!(error instanceof AggregateError)) return { error: getErrorMessage(error) };\n\treturn {\n\t\terror: error.message,\n\t\tcauses: error.errors.map((cause) => getErrorMessage(cause)),\n\t};\n}\nmain().catch((error) => {\n\tconst logger = new StructuredLogger({\n\t\tlevel: 'error',\n\t\tcontext: 'SequentialThinking',\n\t\tpretty: true,\n\t});\n\tlogger.error('Fatal error running server', failureMetadata(error));\n\tprocess.exit(1);\n});\n"],"names":["CLI_NAME","__filename","fileURLToPath","__dirname","dirname","package_json","JSON","readFileSync","join","version","args","process","shouldShowVersion","console","main","transportType","adapter","ValibotJsonSchemaAdapter","server","McpServer","thinkingServer","initializeServer","lifecycle","CliLifecycle","SEQUENTIAL_THINKING_TOOL","SequentialThinkingSchema","input","startStreamableHttpTransport","startStdioTransport","registerShutdownHandlers","error","StreamableHttpTransport","port","parseInt","host","transportMetrics","stateful","streamableTransport","hostValue","transport","StdioTransport","processListeners","Set","listener","shutdownOnStdinEnd","shutdown","createCliShutdownHandler","failureMetadata","code","requestShutdown","AggregateError","getErrorMessage","cause","logger","StructuredLogger"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\n\n// CLI entry point for tracelattice MCP server.\n// This file handles CLI argument parsing, transport selection, and signal handlers.\n// For library usage, import from './lib.js' or './index.js' instead.\n\nimport { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';\nimport { StdioTransport } from '@tmcp/transport-stdio';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from 'tmcp';\nimport { CliLifecycle, createCliShutdownHandler } from './CliLifecycle.js';\nimport type { ToolAwareSequentialThinkingServer } from './lib.js';\nimport { initializeServer } from './lib.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { getErrorMessage } from './errors.js';\nimport { SEQUENTIAL_THINKING_TOOL, SequentialThinkingSchema } from './schema.js';\n\n// Get version from package.json\nconst CLI_NAME = 'tracelattice' as const;\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst package_json = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\nconst { version } = package_json;\n// Handle CLI arguments\nconst args = process.argv.slice(2);\nconst shouldShowVersion = args.includes('--version') || args.includes('-v');\n\nif (shouldShowVersion) {\n\tconsole.log(`${CLI_NAME} v${version}`);\n\tprocess.exit(0);\n}\nasync function main() {\n\tconst transportType = process.env.TRACELATTICE_TRANSPORT_TYPE || 'stdio';\n\tconst adapter = new ValibotJsonSchemaAdapter();\n\tconst server = new McpServer(\n\t\t{\n\t\t\tname: CLI_NAME,\n\t\t\tversion,\n\t\t\tdescription: 'Semantic Sequential Thinking MCP Server',\n\t\t},\n\t\t{\n\t\t\tadapter,\n\t\t\tcapabilities: {\n\t\t\t\ttools: { listChanged: true },\n\t\t\t},\n\t\t}\n\t);\n\n\tconst thinkingServer = await initializeServer();\n\tconst lifecycle = new CliLifecycle(thinkingServer);\n\ttry {\n\t\tserver.tool(\n\t\t\t{\n\t\t\t\tname: 'sequentialthinking_tools',\n\t\t\t\tdescription: SEQUENTIAL_THINKING_TOOL.description,\n\t\t\t\tschema: SequentialThinkingSchema,\n\t\t\t},\n\t\t\tasync (input) => thinkingServer.processThought(input)\n\t\t);\n\t\tif (transportType === 'streamable-http') {\n\t\t\tawait startStreamableHttpTransport(server, thinkingServer, lifecycle);\n\t\t} else {\n\t\t\tawait startStdioTransport(server, thinkingServer, lifecycle);\n\t\t}\n\t\tregisterShutdownHandlers(lifecycle, thinkingServer, transportType === 'stdio');\n\t} catch (error) {\n\t\tawait lifecycle.rollbackStartup(error);\n\t}\n}\n/**\n * Start Streamable HTTP transport (MCP spec recommended)\n */\nasync function startStreamableHttpTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst { StreamableHttpTransport } = await import('./transport/StreamableHttpTransport.js');\n\tconst port = parseInt(process.env.TRACELATTICE_STREAMABLE_HTTP_PORT || '9007', 10);\n\tconst host = process.env.TRACELATTICE_STREAMABLE_HTTP_HOST || 'localhost';\n\tconst transportMetrics = thinkingServer.getContainer().resolve('Metrics');\n\tconst stateful = process.env.TRACELATTICE_STREAMABLE_HTTP_STATEFUL !== 'false';\n\tconst streamableTransport = new StreamableHttpTransport({\n\t\tport,\n\t\thost,\n\t\tcorsOrigin: process.env.TRACELATTICE_CORS_ORIGIN || '*',\n\t\tenableCors: process.env.TRACELATTICE_ENABLE_CORS !== 'false',\n\t\tallowedHosts: process.env.TRACELATTICE_ALLOWED_HOSTS?.split(',').map((hostValue) =>\n\t\t\thostValue.trim()\n\t\t),\n\t\tmetrics: transportMetrics,\n\t\tstateful,\n\t});\n\tlifecycle.attachTransport(streamableTransport);\n\t// Connect the Streamable HTTP transport\n\tawait streamableTransport.connect(server);\n\tthinkingServer['_logger'].info(\n\t\t`Sequential Thinking MCP Server running on Streamable HTTP transport at http://${host}:${port}`\n\t);\n}\n/**\n * Start stdio transport (default, single-user)\n */\nasync function startStdioTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst transport = new StdioTransport(server);\n\tconst processListeners = {\n\t\tsigint: new Set(process.listeners('SIGINT')),\n\t\tsigterm: new Set(process.listeners('SIGTERM')),\n\t\tstdinEnd: new Set(process.stdin.listeners('end')),\n\t};\n\tlifecycle.attachTransport({ stop: () => transport.close() });\n\ttransport.listen();\n\tfor (const listener of process.listeners('SIGINT')) {\n\t\tif (!processListeners.sigint.has(listener)) process.off('SIGINT', listener);\n\t}\n\tfor (const listener of process.listeners('SIGTERM')) {\n\t\tif (!processListeners.sigterm.has(listener)) process.off('SIGTERM', listener);\n\t}\n\tfor (const listener of process.stdin.listeners('end')) {\n\t\tif (!processListeners.stdinEnd.has(listener)) process.stdin.off('end', listener);\n\t}\n\tthinkingServer['_logger'].info('Sequential Thinking MCP Server running on stdio');\n}\n/**\n * Register shutdown signal handlers for a common pattern\n */\nfunction registerShutdownHandlers(\n\tlifecycle: CliLifecycle,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tshutdownOnStdinEnd: boolean\n): void {\n\tconst shutdown = createCliShutdownHandler(lifecycle, {\n\t\treportFailure: (error) => {\n\t\t\tthinkingServer['_logger'].error('CLI shutdown failed', failureMetadata(error));\n\t\t},\n\t\texit: (code) => process.exit(code),\n\t});\n\tconst requestShutdown = (): void => {\n\t\tvoid shutdown();\n\t};\n\tprocess.on('SIGINT', requestShutdown);\n\tprocess.on('SIGTERM', requestShutdown);\n\tif (shutdownOnStdinEnd) process.stdin.on('end', requestShutdown);\n}\n\nfunction failureMetadata(error: unknown): Record<string, unknown> {\n\tif (!(error instanceof AggregateError)) return { error: getErrorMessage(error) };\n\treturn {\n\t\terror: error.message,\n\t\tcauses: error.errors.map((cause) => getErrorMessage(cause)),\n\t};\n}\nmain().catch((error) => {\n\tconst logger = new StructuredLogger({\n\t\tlevel: 'error',\n\t\tcontext: 'SequentialThinking',\n\t\tpretty: true,\n\t});\n\tlogger.error('Fatal error running server', failureMetadata(error));\n\tprocess.exit(1);\n});\n"],"names":["CLI_NAME","__filename","fileURLToPath","__dirname","dirname","package_json","JSON","readFileSync","join","version","args","process","shouldShowVersion","console","main","transportType","adapter","ValibotJsonSchemaAdapter","server","McpServer","thinkingServer","initializeServer","lifecycle","CliLifecycle","SEQUENTIAL_THINKING_TOOL","SequentialThinkingSchema","input","startStreamableHttpTransport","startStdioTransport","registerShutdownHandlers","error","StreamableHttpTransport","port","parseInt","host","transportMetrics","stateful","streamableTransport","hostValue","transport","StdioTransport","processListeners","Set","listener","shutdownOnStdinEnd","shutdown","createCliShutdownHandler","failureMetadata","code","requestShutdown","AggregateError","getErrorMessage","cause","logger","StructuredLogger"],"mappings":"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"}
@@ -41,47 +41,48 @@ import type { ServerConfigOptions } from '../ServerConfig.js';
41
41
  export interface ConfigFileOptions {
42
42
  /**
43
43
  * Maximum number of thoughts to keep in history.
44
- * Can be overridden by `MAX_HISTORY_SIZE` environment variable.
44
+ * Can be overridden by `TRACELATTICE_MAX_HISTORY_SIZE` environment variable.
45
45
  */
46
46
  readonly maxHistorySize?: number;
47
47
  /**
48
48
  * Maximum number of branches to maintain.
49
- * Can be overridden by `MAX_BRANCHES` environment variable.
49
+ * Can be overridden by `TRACELATTICE_MAX_BRANCHES` environment variable.
50
50
  */
51
51
  readonly maxBranches?: number;
52
52
  /**
53
53
  * Maximum size of each branch.
54
- * Can be overridden by `MAX_BRANCH_SIZE` environment variable.
54
+ * Can be overridden by `TRACELATTICE_MAX_BRANCH_SIZE` environment variable.
55
55
  */
56
56
  readonly maxBranchSize?: number;
57
57
  /**
58
58
  * Logging level for the application.
59
- * Can be overridden by `LOG_LEVEL` environment variable.
59
+ * Can be overridden by `TRACELATTICE_LOG_LEVEL` environment variable.
60
60
  */
61
61
  readonly logLevel?: 'debug' | 'info' | 'warn' | 'error';
62
62
  /**
63
63
  * Whether to enable pretty (formatted) logging output.
64
- * Can be overridden by `PRETTY_LOG` environment variable (set to "false" to disable).
64
+ * Can be overridden by `TRACELATTICE_PRETTY_LOG` environment variable (set to "false" to disable).
65
65
  */
66
66
  readonly prettyLog?: boolean;
67
67
  /**
68
68
  * Directory paths to search for skills.
69
- * Can be overridden by `SKILL_DIRS` environment variable (colon-separated).
69
+ * Can be overridden by `TRACELATTICE_SKILL_DIRS` environment variable (colon-separated).
70
70
  */
71
71
  readonly skillDirs?: string[];
72
72
  /**
73
73
  * Directory paths to search for tools.
74
- * Can be overridden by `TOOL_DIRS` environment variable (colon-separated).
74
+ * Can be overridden by `TRACELATTICE_TOOL_DIRS` environment variable (colon-separated).
75
75
  */
76
76
  readonly toolDirs?: string[];
77
77
  /**
78
78
  * Discovery cache configuration.
79
- * Can be overridden by `DISCOVERY_CACHE_TTL` and `DISCOVERY_CACHE_MAX_SIZE` environment variables.
79
+ * Can be overridden by `TRACELATTICE_DISCOVERY_CACHE_TTL` and
80
+ * `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` environment variables.
80
81
  */
81
82
  readonly discoveryCache?: {
82
83
  /**
83
84
  * Time-to-live for cache entries in milliseconds.
84
- * Environment variable `DISCOVERY_CACHE_TTL` accepts seconds.
85
+ * Environment variable `TRACELATTICE_DISCOVERY_CACHE_TTL` accepts seconds.
85
86
  */
86
87
  readonly ttl?: number;
87
88
  /**
@@ -114,7 +115,7 @@ export interface ConfigFileOptions {
114
115
  /**
115
116
  * Maximum sessions per owner. Per-owner LRU bucket prevents one user from
116
117
  * consuming all session slots.
117
- * Can be overridden by `SESSION_MAX_PER_OWNER` environment variable.
118
+ * Can be overridden by `TRACELATTICE_SESSION_MAX_PER_OWNER` environment variable.
118
119
  */
119
120
  readonly maxSessionsPerOwner?: number;
120
121
  }
@@ -138,15 +139,15 @@ export interface ConfigFileOptions {
138
139
  * **Environment Variable Overrides:**
139
140
  * | Variable | Type | Description |
140
141
  * |----------|------|-------------|
141
- * | `MAX_HISTORY_SIZE` | number | Max thoughts in history |
142
- * | `MAX_BRANCHES` | number | Max number of branches |
143
- * | `MAX_BRANCH_SIZE` | number | Max size of each branch |
144
- * | `LOG_LEVEL` | string | Logging level (debug/info/warn/error) |
145
- * | `PRETTY_LOG` | string | "false" to disable pretty logging |
146
- * | `SKILL_DIRS` | string | Colon-separated directory paths |
147
- * | `TOOL_DIRS` | string | Colon-separated directory paths |
148
- * | `DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |
149
- * | `DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |
142
+ * | `TRACELATTICE_MAX_HISTORY_SIZE` | number | Max thoughts in history |
143
+ * | `TRACELATTICE_MAX_BRANCHES` | number | Max number of branches |
144
+ * | `TRACELATTICE_MAX_BRANCH_SIZE` | number | Max size of each branch |
145
+ * | `TRACELATTICE_LOG_LEVEL` | string | Logging level (debug/info/warn/error) |
146
+ * | `TRACELATTICE_PRETTY_LOG` | string | "false" to disable pretty logging |
147
+ * | `TRACELATTICE_SKILL_DIRS` | string | Colon-separated directory paths |
148
+ * | `TRACELATTICE_TOOL_DIRS` | string | Colon-separated directory paths |
149
+ * | `TRACELATTICE_DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |
150
+ * | `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |
150
151
  *
151
152
  * @example
152
153
  * ```typescript
@@ -206,18 +207,20 @@ export declare class ConfigLoader {
206
207
  *
207
208
  * Environment variables take precedence over file-based configuration.
208
209
  * Supported environment variables:
209
- * - `MAX_HISTORY_SIZE`, `MAX_BRANCHES`, `MAX_BRANCH_SIZE` (numbers)
210
- * - `LOG_LEVEL` (debug/info/warn/error)
211
- * - `PRETTY_LOG` ("false" to disable)
212
- * - `SKILL_DIRS` (colon-separated paths)
213
- * - `TOOL_DIRS` (colon-separated paths)
214
- * - `DISCOVERY_CACHE_TTL` (in seconds, converted to ms)
215
- * - `DISCOVERY_CACHE_MAX_SIZE` (number)
210
+ * - `TRACELATTICE_MAX_HISTORY_SIZE`, `TRACELATTICE_MAX_BRANCHES`,
211
+ * `TRACELATTICE_MAX_BRANCH_SIZE` (numbers)
212
+ * - `TRACELATTICE_LOG_LEVEL` (debug/info/warn/error)
213
+ * - `TRACELATTICE_PRETTY_LOG` ("false" to disable)
214
+ * - `TRACELATTICE_SKILL_DIRS` (colon-separated paths)
215
+ * - `TRACELATTICE_TOOL_DIRS` (colon-separated paths)
216
+ * - `TRACELATTICE_DISCOVERY_CACHE_TTL` (in seconds, converted to ms)
217
+ * - `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` (number)
216
218
  *
217
219
  * @param config - The configuration to apply overrides to
218
220
  * @returns A new configuration object with environment overrides applied
219
221
  */
220
222
  applyEnvironmentOverrides(config: ConfigFileOptions): ConfigFileOptions;
223
+ private cloneConfig;
221
224
  /**
222
225
  * Applies TRACELATTICE_FEATURES_* environment variable overrides for feature flags.
223
226
  * Booleans accept 'true'/'false'/'1'/'0' (case-insensitive).
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAiC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAExD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE;QACzB;;;WAGG;QACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACtB;;WAEG;QACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAE3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,YAAY;IACxB,+DAA+D;IAC/D,OAAO,CAAC,YAAY,CAAW;IAE/B;;;;;;;;;;;;;OAaG;gBACS,UAAU,CAAC,EAAE,MAAM;IAa/B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,IAAI,iBAAiB,GAAG,IAAI;IAiBhC;;;;;;;;;;;;;;;OAeG;IACI,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IA6F9E;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAOpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;;;;;;;;;;;;;;OAkBG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB;CAkBrE"}
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAiC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAExD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE;QACzB;;;WAGG;QACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACtB;;WAEG;QACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAE3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,YAAY;IACxB,+DAA+D;IAC/D,OAAO,CAAC,YAAY,CAAW;IAE/B;;;;;;;;;;;;;OAaG;gBACS,UAAU,CAAC,EAAE,MAAM;IAc/B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,IAAI,iBAAiB,GAAG,IAAI;IAiBhC;;;;;;;;;;;;;;;;OAgBG;IACI,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IAsF9E,OAAO,CAAC,WAAW;IAsBnB;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAOpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;;;;;;;;;;;;;;OAkBG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB;CAkBrE"}
@@ -33,8 +33,9 @@ const ConfigFileOptionsSchema = __rspack_external_valibot.looseObject({
33
33
  class ConfigLoader {
34
34
  _configPaths;
35
35
  constructor(customPath){
36
- this._configPaths = customPath ? [
37
- customPath
36
+ const configuredPath = customPath ?? process.env.TRACELATTICE_CONFIG;
37
+ this._configPaths = configuredPath ? [
38
+ configuredPath
38
39
  ] : [
39
40
  '.claude/config.json',
40
41
  '.claude/config.yaml',
@@ -55,7 +56,43 @@ class ConfigLoader {
55
56
  return this.applyEnvironmentOverrides(config || {});
56
57
  }
57
58
  applyEnvironmentOverrides(config) {
58
- const result = {
59
+ const result = this.cloneConfig(config);
60
+ if (void 0 !== process.env.TRACELATTICE_MAX_HISTORY_SIZE) result.maxHistorySize = this.parseEnvironmentInteger('TRACELATTICE_MAX_HISTORY_SIZE', process.env.TRACELATTICE_MAX_HISTORY_SIZE);
61
+ if (void 0 !== process.env.TRACELATTICE_MAX_BRANCHES) result.maxBranches = this.parseEnvironmentInteger('TRACELATTICE_MAX_BRANCHES', process.env.TRACELATTICE_MAX_BRANCHES);
62
+ if (void 0 !== process.env.TRACELATTICE_MAX_BRANCH_SIZE) result.maxBranchSize = this.parseEnvironmentInteger('TRACELATTICE_MAX_BRANCH_SIZE', process.env.TRACELATTICE_MAX_BRANCH_SIZE);
63
+ if (process.env.TRACELATTICE_LOG_LEVEL && [
64
+ 'debug',
65
+ 'info',
66
+ 'warn',
67
+ 'error'
68
+ ].includes(process.env.TRACELATTICE_LOG_LEVEL)) result.logLevel = process.env.TRACELATTICE_LOG_LEVEL;
69
+ if ('false' === process.env.TRACELATTICE_PRETTY_LOG) result.prettyLog = false;
70
+ if (void 0 !== process.env.TRACELATTICE_SKILL_DIRS) result.skillDirs = '' === process.env.TRACELATTICE_SKILL_DIRS ? [] : process.env.TRACELATTICE_SKILL_DIRS.split(':');
71
+ if (void 0 !== process.env.TRACELATTICE_TOOL_DIRS) result.toolDirs = '' === process.env.TRACELATTICE_TOOL_DIRS ? [] : process.env.TRACELATTICE_TOOL_DIRS.split(':');
72
+ if (void 0 !== process.env.TRACELATTICE_DISCOVERY_CACHE_TTL) {
73
+ const seconds = this.parseEnvironmentInteger('TRACELATTICE_DISCOVERY_CACHE_TTL', process.env.TRACELATTICE_DISCOVERY_CACHE_TTL);
74
+ const ttl = 1000 * seconds;
75
+ if (!Number.isSafeInteger(ttl)) throw new ConfigurationError('TRACELATTICE_DISCOVERY_CACHE_TTL exceeds the safe integer range');
76
+ result.discoveryCache = {
77
+ ...result.discoveryCache,
78
+ ttl
79
+ };
80
+ }
81
+ if (void 0 !== process.env.TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE) {
82
+ const maxSize = this.parseEnvironmentInteger('TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE', process.env.TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE);
83
+ result.discoveryCache = {
84
+ ...result.discoveryCache,
85
+ maxSize
86
+ };
87
+ }
88
+ if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS) result.toolInterleaveTtlMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_TTL_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS);
89
+ if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS) result.toolInterleaveSweepMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS);
90
+ if (void 0 !== process.env.TRACELATTICE_SESSION_MAX_PER_OWNER) result.maxSessionsPerOwner = this.parseEnvironmentInteger('TRACELATTICE_SESSION_MAX_PER_OWNER', process.env.TRACELATTICE_SESSION_MAX_PER_OWNER);
91
+ this.applyFeatureFlagOverrides(result);
92
+ return result;
93
+ }
94
+ cloneConfig(config) {
95
+ return {
59
96
  ...config,
60
97
  ...void 0 === config.skillDirs ? {} : {
61
98
  skillDirs: [
@@ -88,39 +125,6 @@ class ConfigLoader {
88
125
  }
89
126
  }
90
127
  };
91
- if (void 0 !== process.env.MAX_HISTORY_SIZE) result.maxHistorySize = this.parseEnvironmentInteger('MAX_HISTORY_SIZE', process.env.MAX_HISTORY_SIZE);
92
- if (void 0 !== process.env.MAX_BRANCHES) result.maxBranches = this.parseEnvironmentInteger('MAX_BRANCHES', process.env.MAX_BRANCHES);
93
- if (void 0 !== process.env.MAX_BRANCH_SIZE) result.maxBranchSize = this.parseEnvironmentInteger('MAX_BRANCH_SIZE', process.env.MAX_BRANCH_SIZE);
94
- if (process.env.LOG_LEVEL && [
95
- 'debug',
96
- 'info',
97
- 'warn',
98
- 'error'
99
- ].includes(process.env.LOG_LEVEL)) result.logLevel = process.env.LOG_LEVEL;
100
- if ('false' === process.env.PRETTY_LOG) result.prettyLog = false;
101
- if (void 0 !== process.env.SKILL_DIRS) result.skillDirs = '' === process.env.SKILL_DIRS ? [] : process.env.SKILL_DIRS.split(':');
102
- if (void 0 !== process.env.TOOL_DIRS) result.toolDirs = '' === process.env.TOOL_DIRS ? [] : process.env.TOOL_DIRS.split(':');
103
- if (void 0 !== process.env.DISCOVERY_CACHE_TTL) {
104
- const seconds = this.parseEnvironmentInteger('DISCOVERY_CACHE_TTL', process.env.DISCOVERY_CACHE_TTL);
105
- const ttl = 1000 * seconds;
106
- if (!Number.isSafeInteger(ttl)) throw new ConfigurationError('DISCOVERY_CACHE_TTL exceeds the safe integer range');
107
- result.discoveryCache = {
108
- ...result.discoveryCache,
109
- ttl
110
- };
111
- }
112
- if (void 0 !== process.env.DISCOVERY_CACHE_MAX_SIZE) {
113
- const maxSize = this.parseEnvironmentInteger('DISCOVERY_CACHE_MAX_SIZE', process.env.DISCOVERY_CACHE_MAX_SIZE);
114
- result.discoveryCache = {
115
- ...result.discoveryCache,
116
- maxSize
117
- };
118
- }
119
- if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS) result.toolInterleaveTtlMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_TTL_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS);
120
- if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS) result.toolInterleaveSweepMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS);
121
- if (void 0 !== process.env.SESSION_MAX_PER_OWNER) result.maxSessionsPerOwner = this.parseEnvironmentInteger('SESSION_MAX_PER_OWNER', process.env.SESSION_MAX_PER_OWNER);
122
- this.applyFeatureFlagOverrides(result);
123
- return result;
124
128
  }
125
129
  applyFeatureFlagOverrides(result) {
126
130
  const boolMap = {
@@ -1 +1 @@
1
- {"version":3,"file":"config/ConfigLoader.js","sources":["../../src/config/ConfigLoader.ts"],"sourcesContent":["/**\n * Configuration file loading with environment variable override support.\n *\n * This module provides the `ConfigLoader` class which handles loading configuration\n * from YAML and JSON files in standard locations, with automatic environment variable\n * overrides for all settings.\n *\n * @module config\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport * as v from 'valibot';\nimport type { PersistenceConfig } from '../contracts/PersistenceBackend.js';\nimport { ConfigurationError, getErrorMessage } from '../errors.js';\nimport type { FeatureFlags } from '../contracts/features.js';\nimport type { ServerConfigOptions } from '../ServerConfig.js';\n\n/**\n * Lenient runtime schema for config files. Only validates top-level shape;\n * unknown extra fields are preserved by Valibot's default object behavior\n * being strict is avoided by using `v.looseObject`. All fields are optional.\n */\nconst ConfigFileOptionsSchema = v.looseObject({\n\tmaxHistorySize: v.optional(v.number()),\n\tmaxBranches: v.optional(v.number()),\n\tmaxBranchSize: v.optional(v.number()),\n\tlogLevel: v.optional(v.picklist(['debug', 'info', 'warn', 'error'])),\n\tprettyLog: v.optional(v.boolean()),\n\tskillDirs: v.optional(v.array(v.string())),\n\ttoolDirs: v.optional(v.array(v.string())),\n\tdiscoveryCache: v.optional(\n\t\tv.looseObject({\n\t\t\tttl: v.optional(v.number()),\n\t\t\tmaxSize: v.optional(v.number()),\n\t\t})\n\t),\n\tpersistence: v.optional(v.looseObject({})),\n\tpersistenceBufferSize: v.optional(v.number()),\n\tpersistenceFlushInterval: v.optional(v.number()),\n\tpersistenceMaxRetries: v.optional(v.number()),\n\tfeatures: v.optional(v.looseObject({})),\n\ttoolInterleaveTtlMs: v.optional(v.number()),\n\ttoolInterleaveSweepMs: v.optional(v.number()),\n\tmaxSessionsPerOwner: v.optional(v.number()),\n});\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\n/**\n * Configuration options loaded from config files.\n *\n * These options represent the structure of configuration files (JSON or YAML)\n * that can be loaded from standard locations. All values can be overridden\n * by environment variables.\n *\n * @example\n * ```yaml\n * # .claude/config.yaml\n * maxHistorySize: 500\n * maxBranches: 25\n * logLevel: debug\n * prettyLog: true\n * skillDirs:\n * - ./custom-skills\n * toolDirs:\n * - ./custom-tools\n * discoveryCache:\n * ttl: 600000\n * maxSize: 200\n * persistence:\n * enabled: true\n * backend: sqlite\n * options:\n * dbPath: ./data/history.db\n * ```\n */\nexport interface ConfigFileOptions {\n\t/**\n\t * Maximum number of thoughts to keep in history.\n\t * Can be overridden by `MAX_HISTORY_SIZE` environment variable.\n\t */\n\treadonly maxHistorySize?: number;\n\n\t/**\n\t * Maximum number of branches to maintain.\n\t * Can be overridden by `MAX_BRANCHES` environment variable.\n\t */\n\treadonly maxBranches?: number;\n\n\t/**\n\t * Maximum size of each branch.\n\t * Can be overridden by `MAX_BRANCH_SIZE` environment variable.\n\t */\n\treadonly maxBranchSize?: number;\n\n\t/**\n\t * Logging level for the application.\n\t * Can be overridden by `LOG_LEVEL` environment variable.\n\t */\n\treadonly logLevel?: 'debug' | 'info' | 'warn' | 'error';\n\n\t/**\n\t * Whether to enable pretty (formatted) logging output.\n\t * Can be overridden by `PRETTY_LOG` environment variable (set to \"false\" to disable).\n\t */\n\treadonly prettyLog?: boolean;\n\n\t/**\n\t * Directory paths to search for skills.\n\t * Can be overridden by `SKILL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly skillDirs?: string[];\n\n\t/**\n\t * Directory paths to search for tools.\n\t * Can be overridden by `TOOL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly toolDirs?: string[];\n\n\t/**\n\t * Discovery cache configuration.\n\t * Can be overridden by `DISCOVERY_CACHE_TTL` and `DISCOVERY_CACHE_MAX_SIZE` environment variables.\n\t */\n\treadonly discoveryCache?: {\n\t\t/**\n\t\t * Time-to-live for cache entries in milliseconds.\n\t\t * Environment variable `DISCOVERY_CACHE_TTL` accepts seconds.\n\t\t */\n\t\treadonly ttl?: number;\n\t\t/**\n\t\t * Maximum number of entries in the cache.\n\t\t */\n\t\treadonly maxSize?: number;\n\t};\n\n\t/**\n\t * Persistence configuration for storing history and state.\n\t */\n\treadonly persistence?: PersistenceConfig;\n\n\treadonly persistenceBufferSize?: number;\n\n\treadonly persistenceFlushInterval?: number;\n\n\treadonly persistenceMaxRetries?: number;\n\n\t/**\n\t * Feature flag overrides. Each field can be set independently.\n\t * Can be overridden by `TRACELATTICE_FEATURES_*` environment variables.\n\t */\n\treadonly features?: Partial<FeatureFlags>;\n\n\t/**\n\t * TTL in milliseconds for suspended tool-interleave entries.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_TTL_MS` environment variable.\n\t */\n\treadonly toolInterleaveTtlMs?: number;\n\n\t/**\n\t * Sweep interval in milliseconds for SuspensionStore expiration cleanup.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS` environment variable.\n\t */\n\treadonly toolInterleaveSweepMs?: number;\n\n\t/**\n\t * Maximum sessions per owner. Per-owner LRU bucket prevents one user from\n\t * consuming all session slots.\n\t * Can be overridden by `SESSION_MAX_PER_OWNER` environment variable.\n\t */\n\treadonly maxSessionsPerOwner?: number;\n}\n\n/**\n * Loads configuration from files with environment variable overrides.\n *\n * This class searches for configuration files in standard locations and applies\n * environment variable overrides. Files are searched in priority order, with the\n * first match being used. Environment variables always take precedence over file values.\n *\n * @remarks\n * **Config File Search Order (priority):**\n * 1. Custom path (if provided to constructor)\n * 2. `.claude/config.json` (project-local)\n * 3. `.claude/config.yaml` (project-local)\n * 4. `.claude/config.yml` (project-local)\n * 5. `~/.claude/config.json` (user-global)\n * 6. `~/.claude/config.yaml` (user-global)\n * 7. `~/.claude/config.yml` (user-global)\n *\n * **Environment Variable Overrides:**\n * | Variable | Type | Description |\n * |----------|------|-------------|\n * | `MAX_HISTORY_SIZE` | number | Max thoughts in history |\n * | `MAX_BRANCHES` | number | Max number of branches |\n * | `MAX_BRANCH_SIZE` | number | Max size of each branch |\n * | `LOG_LEVEL` | string | Logging level (debug/info/warn/error) |\n * | `PRETTY_LOG` | string | \"false\" to disable pretty logging |\n * | `SKILL_DIRS` | string | Colon-separated directory paths |\n * | `TOOL_DIRS` | string | Colon-separated directory paths |\n * | `DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |\n * | `DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |\n *\n * @example\n * ```typescript\n * // Use default search paths\n * const loader1 = new ConfigLoader();\n * const config1 = loader1.load();\n *\n * // Use custom config path\n * const loader2 = new ConfigLoader('./my-config.yaml');\n * const config2 = loader2.load();\n *\n * // Convert to ServerConfig options\n * const serverOptions = loader2.toServerConfigOptions(config2);\n * ```\n */\nexport class ConfigLoader {\n\t/** Array of config file paths to search, in priority order. */\n\tprivate _configPaths: string[];\n\n\t/**\n\t * Creates a new ConfigLoader instance.\n\t *\n\t * @param customPath - Optional custom config file path. If provided, only this path will be checked.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Use default search paths\n\t * const loader1 = new ConfigLoader();\n\t *\n\t * // Use a specific config file\n\t * const loader2 = new ConfigLoader('./custom-config.json');\n\t * ```\n\t */\n\tconstructor(customPath?: string) {\n\t\tthis._configPaths = customPath\n\t\t\t? [customPath]\n\t\t\t: [\n\t\t\t\t\t'.claude/config.json',\n\t\t\t\t\t'.claude/config.yaml',\n\t\t\t\t\t'.claude/config.yml',\n\t\t\t\t\tjoin(homedir(), '.claude/config.json'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yaml'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yml'),\n\t\t\t\t];\n\t}\n\n\t/**\n\t * Loads configuration from files and applies environment overrides.\n\t *\n\t * Searches for config files in the configured paths (in priority order),\n\t * parses the first match, and applies environment variable overrides.\n\t * Returns null if no config file is found and no environment overrides are set.\n\t *\n\t * @returns The loaded configuration with environment overrides applied, or null if no config found\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t *\n\t * if (config) {\n\t * console.log('Max history size:', config.maxHistorySize);\n\t * console.log('Log level:', config.logLevel);\n\t * }\n\t * ```\n\t */\n\tload(): ConfigFileOptions | null {\n\t\tlet config: ConfigFileOptions | null = null;\n\n\t\tfor (const configPath of this._configPaths) {\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconfig = this.parseConfig(configPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Failed to load config from ${configPath}:`, getErrorMessage(error));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.applyEnvironmentOverrides(config || {});\n\t}\n\n\t/**\n\t * Applies environment variable overrides to the configuration.\n\t *\n\t * Environment variables take precedence over file-based configuration.\n\t * Supported environment variables:\n\t * - `MAX_HISTORY_SIZE`, `MAX_BRANCHES`, `MAX_BRANCH_SIZE` (numbers)\n\t * - `LOG_LEVEL` (debug/info/warn/error)\n\t * - `PRETTY_LOG` (\"false\" to disable)\n\t * - `SKILL_DIRS` (colon-separated paths)\n\t * - `TOOL_DIRS` (colon-separated paths)\n\t * - `DISCOVERY_CACHE_TTL` (in seconds, converted to ms)\n\t * - `DISCOVERY_CACHE_MAX_SIZE` (number)\n\t *\n\t * @param config - The configuration to apply overrides to\n\t * @returns A new configuration object with environment overrides applied\n\t */\n\tpublic applyEnvironmentOverrides(config: ConfigFileOptions): ConfigFileOptions {\n\t\tconst result: Mutable<ConfigFileOptions> = {\n\t\t\t...config,\n\t\t\t...(config.skillDirs === undefined ? {} : { skillDirs: [...config.skillDirs] }),\n\t\t\t...(config.toolDirs === undefined ? {} : { toolDirs: [...config.toolDirs] }),\n\t\t\t...(config.discoveryCache === undefined\n\t\t\t\t? {}\n\t\t\t\t: { discoveryCache: { ...config.discoveryCache } }),\n\t\t\t...(config.persistence === undefined\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tpersistence: {\n\t\t\t\t\t\t\t...config.persistence,\n\t\t\t\t\t\t\t...(config.persistence.options === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { options: { ...config.persistence.options } }),\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t...(config.features === undefined ? {} : { features: { ...config.features } }),\n\t\t};\n\n\t\tif (process.env.MAX_HISTORY_SIZE !== undefined) {\n\t\t\tresult.maxHistorySize = this.parseEnvironmentInteger(\n\t\t\t\t'MAX_HISTORY_SIZE',\n\t\t\t\tprocess.env.MAX_HISTORY_SIZE\n\t\t\t);\n\t\t}\n\t\tif (process.env.MAX_BRANCHES !== undefined) {\n\t\t\tresult.maxBranches = this.parseEnvironmentInteger('MAX_BRANCHES', process.env.MAX_BRANCHES);\n\t\t}\n\t\tif (process.env.MAX_BRANCH_SIZE !== undefined) {\n\t\t\tresult.maxBranchSize = this.parseEnvironmentInteger(\n\t\t\t\t'MAX_BRANCH_SIZE',\n\t\t\t\tprocess.env.MAX_BRANCH_SIZE\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tprocess.env.LOG_LEVEL &&\n\t\t\t['debug', 'info', 'warn', 'error'].includes(process.env.LOG_LEVEL)\n\t\t) {\n\t\t\tresult.logLevel = process.env.LOG_LEVEL as 'debug' | 'info' | 'warn' | 'error';\n\t\t}\n\t\tif (process.env.PRETTY_LOG === 'false') {\n\t\t\tresult.prettyLog = false;\n\t\t}\n\t\tif (process.env.SKILL_DIRS !== undefined) {\n\t\t\tresult.skillDirs = process.env.SKILL_DIRS === '' ? [] : process.env.SKILL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.TOOL_DIRS !== undefined) {\n\t\t\tresult.toolDirs = process.env.TOOL_DIRS === '' ? [] : process.env.TOOL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.DISCOVERY_CACHE_TTL !== undefined) {\n\t\t\tconst seconds = this.parseEnvironmentInteger(\n\t\t\t\t'DISCOVERY_CACHE_TTL',\n\t\t\t\tprocess.env.DISCOVERY_CACHE_TTL\n\t\t\t);\n\t\t\tconst ttl = seconds * 1000;\n\t\t\tif (!Number.isSafeInteger(ttl)) {\n\t\t\t\tthrow new ConfigurationError('DISCOVERY_CACHE_TTL exceeds the safe integer range');\n\t\t\t}\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, ttl };\n\t\t}\n\t\tif (process.env.DISCOVERY_CACHE_MAX_SIZE !== undefined) {\n\t\t\tconst maxSize = this.parseEnvironmentInteger(\n\t\t\t\t'DISCOVERY_CACHE_MAX_SIZE',\n\t\t\t\tprocess.env.DISCOVERY_CACHE_MAX_SIZE\n\t\t\t);\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, maxSize };\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS !== undefined) {\n\t\t\tresult.toolInterleaveTtlMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_TTL_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS !== undefined) {\n\t\t\tresult.toolInterleaveSweepMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.SESSION_MAX_PER_OWNER !== undefined) {\n\t\t\tresult.maxSessionsPerOwner = this.parseEnvironmentInteger(\n\t\t\t\t'SESSION_MAX_PER_OWNER',\n\t\t\t\tprocess.env.SESSION_MAX_PER_OWNER\n\t\t\t);\n\t\t}\n\n\t\tthis.applyFeatureFlagOverrides(result);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Applies TRACELATTICE_FEATURES_* environment variable overrides for feature flags.\n\t * Booleans accept 'true'/'false'/'1'/'0' (case-insensitive).\n\t * Invalid reasoningStrategy values are rejected.\n\t *\n\t * @param result - Configuration object to mutate with feature flag overrides\n\t * @private\n\t */\n\tprivate applyFeatureFlagOverrides(result: Mutable<ConfigFileOptions>): void {\n\t\tconst boolMap: Record<string, Exclude<keyof FeatureFlags, 'reasoningStrategy'>> = {\n\t\t\tTRACELATTICE_FEATURES_DAG_EDGES: 'dagEdges',\n\t\t\tTRACELATTICE_FEATURES_CALIBRATION: 'calibration',\n\t\t\tTRACELATTICE_FEATURES_COMPRESSION: 'compression',\n\t\t\tTRACELATTICE_FEATURES_TOOL_INTERLEAVE: 'toolInterleave',\n\t\t\tTRACELATTICE_FEATURES_NEW_THOUGHT_TYPES: 'newThoughtTypes',\n\t\t\tTRACELATTICE_FEATURES_OUTCOME_RECORDING: 'outcomeRecording',\n\t\t};\n\t\tfor (const [envVar, key] of Object.entries(boolMap)) {\n\t\t\tconst raw = process.env[envVar];\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst parsed = this.parseBoolean(raw);\n\t\t\tif (parsed === undefined) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Invalid boolean value for ${envVar}: \"${raw}\" (expected true/false/1/0). Ignoring.`\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures[key] = parsed;\n\t\t\tresult.features = features;\n\t\t}\n\n\t\tconst strategyRaw = process.env.TRACELATTICE_FEATURES_REASONING_STRATEGY;\n\t\tif (strategyRaw !== undefined) {\n\t\t\tif (strategyRaw !== 'sequential' && strategyRaw !== 'tot') {\n\t\t\t\tthrow new ConfigurationError(\n\t\t\t\t\t`TRACELATTICE_FEATURES_REASONING_STRATEGY must be one of sequential, tot, got ${strategyRaw}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures.reasoningStrategy = strategyRaw;\n\t\t\tresult.features = features;\n\t\t}\n\t}\n\n\tprivate parseEnvironmentInteger(environmentName: string, raw: string): number {\n\t\tif (!/^(0|[1-9]\\d*)$/.test(raw)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be an integer, got ${raw}`);\n\t\t}\n\t\tconst parsed = Number(raw);\n\t\tif (!Number.isSafeInteger(parsed)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be a safe integer, got ${raw}`);\n\t\t}\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * Parses a boolean from an environment variable string.\n\t * Accepts 'true'/'false'/'1'/'0' case-insensitively.\n\t *\n\t * @param raw - Raw environment variable string\n\t * @returns Parsed boolean, or undefined if the value is invalid\n\t * @private\n\t */\n\tprivate parseBoolean(raw: string): boolean | undefined {\n\t\tconst v = raw.trim().toLowerCase();\n\t\tif (v === 'true' || v === '1') return true;\n\t\tif (v === 'false' || v === '0') return false;\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parses a configuration file (JSON or YAML).\n\t *\n\t * Detects the file type by extension and uses the appropriate parser.\n\t * Supports `.json`, `.yaml`, and `.yml` file extensions.\n\t *\n\t * @param filePath - Path to the configuration file to parse\n\t * @returns The parsed configuration object\n\t * @throws {Error} If the file cannot be parsed\n\t * @private\n\t */\n\tprivate parseConfig(filePath: string): ConfigFileOptions {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\n\t\tconst raw: unknown = ext === 'yaml' || ext === 'yml' ? parseYaml(content) : JSON.parse(content);\n\n\t\treturn v.parse(ConfigFileOptionsSchema, raw) as ConfigFileOptions;\n\t}\n\n\t/**\n\t * Converts file-based configuration to ServerConfig options.\n\t *\n\t * This is a convenience method for extracting the ServerConfig-relevant\n\t * options from a file-based configuration.\n\t *\n\t * @param config - The configuration to convert\n\t * @returns An object with ServerConfig-compatible options\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t * if (config) {\n\t * const serverOpts = loader.toServerConfigOptions(config);\n\t * const serverConfig = new ServerConfig(serverOpts);\n\t * }\n\t * ```\n\t */\n\ttoServerConfigOptions(config: ConfigFileOptions): ServerConfigOptions {\n\t\treturn {\n\t\t\tmaxHistorySize: config.maxHistorySize,\n\t\t\tmaxBranches: config.maxBranches,\n\t\t\tmaxBranchSize: config.maxBranchSize,\n\t\t\tskillDirs: config.skillDirs,\n\t\t\ttoolDirs: config.toolDirs,\n\t\t\tdiscoveryCache: config.discoveryCache,\n\t\t\tpersistence: config.persistence,\n\t\t\tpersistenceBufferSize: config.persistenceBufferSize,\n\t\t\tpersistenceFlushInterval: config.persistenceFlushInterval,\n\t\t\tpersistenceMaxRetries: config.persistenceMaxRetries,\n\t\t\tfeatures: config.features,\n\t\t\ttoolInterleaveTtlMs: config.toolInterleaveTtlMs,\n\t\t\ttoolInterleaveSweepMs: config.toolInterleaveSweepMs,\n\t\t\tmaxSessionsPerOwner: config.maxSessionsPerOwner,\n\t\t};\n\t}\n}\n"],"names":["ConfigFileOptionsSchema","v","ConfigLoader","customPath","join","homedir","config","configPath","existsSync","error","console","getErrorMessage","result","undefined","process","seconds","ttl","Number","ConfigurationError","maxSize","boolMap","envVar","key","Object","raw","parsed","features","strategyRaw","environmentName","filePath","content","readFileSync","ext","parseYaml","JSON"],"mappings":"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"}
1
+ {"version":3,"file":"config/ConfigLoader.js","sources":["../../src/config/ConfigLoader.ts"],"sourcesContent":["/**\n * Configuration file loading with environment variable override support.\n *\n * This module provides the `ConfigLoader` class which handles loading configuration\n * from YAML and JSON files in standard locations, with automatic environment variable\n * overrides for all settings.\n *\n * @module config\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport * as v from 'valibot';\nimport type { PersistenceConfig } from '../contracts/PersistenceBackend.js';\nimport { ConfigurationError, getErrorMessage } from '../errors.js';\nimport type { FeatureFlags } from '../contracts/features.js';\nimport type { ServerConfigOptions } from '../ServerConfig.js';\n\n/**\n * Lenient runtime schema for config files. Only validates top-level shape;\n * unknown extra fields are preserved by Valibot's default object behavior\n * being strict is avoided by using `v.looseObject`. All fields are optional.\n */\nconst ConfigFileOptionsSchema = v.looseObject({\n\tmaxHistorySize: v.optional(v.number()),\n\tmaxBranches: v.optional(v.number()),\n\tmaxBranchSize: v.optional(v.number()),\n\tlogLevel: v.optional(v.picklist(['debug', 'info', 'warn', 'error'])),\n\tprettyLog: v.optional(v.boolean()),\n\tskillDirs: v.optional(v.array(v.string())),\n\ttoolDirs: v.optional(v.array(v.string())),\n\tdiscoveryCache: v.optional(\n\t\tv.looseObject({\n\t\t\tttl: v.optional(v.number()),\n\t\t\tmaxSize: v.optional(v.number()),\n\t\t})\n\t),\n\tpersistence: v.optional(v.looseObject({})),\n\tpersistenceBufferSize: v.optional(v.number()),\n\tpersistenceFlushInterval: v.optional(v.number()),\n\tpersistenceMaxRetries: v.optional(v.number()),\n\tfeatures: v.optional(v.looseObject({})),\n\ttoolInterleaveTtlMs: v.optional(v.number()),\n\ttoolInterleaveSweepMs: v.optional(v.number()),\n\tmaxSessionsPerOwner: v.optional(v.number()),\n});\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\n/**\n * Configuration options loaded from config files.\n *\n * These options represent the structure of configuration files (JSON or YAML)\n * that can be loaded from standard locations. All values can be overridden\n * by environment variables.\n *\n * @example\n * ```yaml\n * # .claude/config.yaml\n * maxHistorySize: 500\n * maxBranches: 25\n * logLevel: debug\n * prettyLog: true\n * skillDirs:\n * - ./custom-skills\n * toolDirs:\n * - ./custom-tools\n * discoveryCache:\n * ttl: 600000\n * maxSize: 200\n * persistence:\n * enabled: true\n * backend: sqlite\n * options:\n * dbPath: ./data/history.db\n * ```\n */\nexport interface ConfigFileOptions {\n\t/**\n\t * Maximum number of thoughts to keep in history.\n\t * Can be overridden by `TRACELATTICE_MAX_HISTORY_SIZE` environment variable.\n\t */\n\treadonly maxHistorySize?: number;\n\n\t/**\n\t * Maximum number of branches to maintain.\n\t * Can be overridden by `TRACELATTICE_MAX_BRANCHES` environment variable.\n\t */\n\treadonly maxBranches?: number;\n\n\t/**\n\t * Maximum size of each branch.\n\t * Can be overridden by `TRACELATTICE_MAX_BRANCH_SIZE` environment variable.\n\t */\n\treadonly maxBranchSize?: number;\n\n\t/**\n\t * Logging level for the application.\n\t * Can be overridden by `TRACELATTICE_LOG_LEVEL` environment variable.\n\t */\n\treadonly logLevel?: 'debug' | 'info' | 'warn' | 'error';\n\n\t/**\n\t * Whether to enable pretty (formatted) logging output.\n\t * Can be overridden by `TRACELATTICE_PRETTY_LOG` environment variable (set to \"false\" to disable).\n\t */\n\treadonly prettyLog?: boolean;\n\n\t/**\n\t * Directory paths to search for skills.\n\t * Can be overridden by `TRACELATTICE_SKILL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly skillDirs?: string[];\n\n\t/**\n\t * Directory paths to search for tools.\n\t * Can be overridden by `TRACELATTICE_TOOL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly toolDirs?: string[];\n\n\t/**\n\t * Discovery cache configuration.\n\t * Can be overridden by `TRACELATTICE_DISCOVERY_CACHE_TTL` and\n\t * `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` environment variables.\n\t */\n\treadonly discoveryCache?: {\n\t\t/**\n\t\t * Time-to-live for cache entries in milliseconds.\n\t\t * Environment variable `TRACELATTICE_DISCOVERY_CACHE_TTL` accepts seconds.\n\t\t */\n\t\treadonly ttl?: number;\n\t\t/**\n\t\t * Maximum number of entries in the cache.\n\t\t */\n\t\treadonly maxSize?: number;\n\t};\n\n\t/**\n\t * Persistence configuration for storing history and state.\n\t */\n\treadonly persistence?: PersistenceConfig;\n\n\treadonly persistenceBufferSize?: number;\n\n\treadonly persistenceFlushInterval?: number;\n\n\treadonly persistenceMaxRetries?: number;\n\n\t/**\n\t * Feature flag overrides. Each field can be set independently.\n\t * Can be overridden by `TRACELATTICE_FEATURES_*` environment variables.\n\t */\n\treadonly features?: Partial<FeatureFlags>;\n\n\t/**\n\t * TTL in milliseconds for suspended tool-interleave entries.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_TTL_MS` environment variable.\n\t */\n\treadonly toolInterleaveTtlMs?: number;\n\n\t/**\n\t * Sweep interval in milliseconds for SuspensionStore expiration cleanup.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS` environment variable.\n\t */\n\treadonly toolInterleaveSweepMs?: number;\n\n\t/**\n\t * Maximum sessions per owner. Per-owner LRU bucket prevents one user from\n\t * consuming all session slots.\n\t * Can be overridden by `TRACELATTICE_SESSION_MAX_PER_OWNER` environment variable.\n\t */\n\treadonly maxSessionsPerOwner?: number;\n}\n\n/**\n * Loads configuration from files with environment variable overrides.\n *\n * This class searches for configuration files in standard locations and applies\n * environment variable overrides. Files are searched in priority order, with the\n * first match being used. Environment variables always take precedence over file values.\n *\n * @remarks\n * **Config File Search Order (priority):**\n * 1. Custom path (if provided to constructor)\n * 2. `.claude/config.json` (project-local)\n * 3. `.claude/config.yaml` (project-local)\n * 4. `.claude/config.yml` (project-local)\n * 5. `~/.claude/config.json` (user-global)\n * 6. `~/.claude/config.yaml` (user-global)\n * 7. `~/.claude/config.yml` (user-global)\n *\n * **Environment Variable Overrides:**\n * | Variable | Type | Description |\n * |----------|------|-------------|\n * | `TRACELATTICE_MAX_HISTORY_SIZE` | number | Max thoughts in history |\n * | `TRACELATTICE_MAX_BRANCHES` | number | Max number of branches |\n * | `TRACELATTICE_MAX_BRANCH_SIZE` | number | Max size of each branch |\n * | `TRACELATTICE_LOG_LEVEL` | string | Logging level (debug/info/warn/error) |\n * | `TRACELATTICE_PRETTY_LOG` | string | \"false\" to disable pretty logging |\n * | `TRACELATTICE_SKILL_DIRS` | string | Colon-separated directory paths |\n * | `TRACELATTICE_TOOL_DIRS` | string | Colon-separated directory paths |\n * | `TRACELATTICE_DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |\n * | `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |\n *\n * @example\n * ```typescript\n * // Use default search paths\n * const loader1 = new ConfigLoader();\n * const config1 = loader1.load();\n *\n * // Use custom config path\n * const loader2 = new ConfigLoader('./my-config.yaml');\n * const config2 = loader2.load();\n *\n * // Convert to ServerConfig options\n * const serverOptions = loader2.toServerConfigOptions(config2);\n * ```\n */\nexport class ConfigLoader {\n\t/** Array of config file paths to search, in priority order. */\n\tprivate _configPaths: string[];\n\n\t/**\n\t * Creates a new ConfigLoader instance.\n\t *\n\t * @param customPath - Optional custom config file path. If provided, only this path will be checked.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Use default search paths\n\t * const loader1 = new ConfigLoader();\n\t *\n\t * // Use a specific config file\n\t * const loader2 = new ConfigLoader('./custom-config.json');\n\t * ```\n\t */\n\tconstructor(customPath?: string) {\n\t\tconst configuredPath = customPath ?? process.env.TRACELATTICE_CONFIG;\n\t\tthis._configPaths = configuredPath\n\t\t\t? [configuredPath]\n\t\t\t: [\n\t\t\t\t\t'.claude/config.json',\n\t\t\t\t\t'.claude/config.yaml',\n\t\t\t\t\t'.claude/config.yml',\n\t\t\t\t\tjoin(homedir(), '.claude/config.json'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yaml'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yml'),\n\t\t\t\t];\n\t}\n\n\t/**\n\t * Loads configuration from files and applies environment overrides.\n\t *\n\t * Searches for config files in the configured paths (in priority order),\n\t * parses the first match, and applies environment variable overrides.\n\t * Returns null if no config file is found and no environment overrides are set.\n\t *\n\t * @returns The loaded configuration with environment overrides applied, or null if no config found\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t *\n\t * if (config) {\n\t * console.log('Max history size:', config.maxHistorySize);\n\t * console.log('Log level:', config.logLevel);\n\t * }\n\t * ```\n\t */\n\tload(): ConfigFileOptions | null {\n\t\tlet config: ConfigFileOptions | null = null;\n\n\t\tfor (const configPath of this._configPaths) {\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconfig = this.parseConfig(configPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Failed to load config from ${configPath}:`, getErrorMessage(error));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.applyEnvironmentOverrides(config || {});\n\t}\n\n\t/**\n\t * Applies environment variable overrides to the configuration.\n\t *\n\t * Environment variables take precedence over file-based configuration.\n\t * Supported environment variables:\n\t * - `TRACELATTICE_MAX_HISTORY_SIZE`, `TRACELATTICE_MAX_BRANCHES`,\n\t * `TRACELATTICE_MAX_BRANCH_SIZE` (numbers)\n\t * - `TRACELATTICE_LOG_LEVEL` (debug/info/warn/error)\n\t * - `TRACELATTICE_PRETTY_LOG` (\"false\" to disable)\n\t * - `TRACELATTICE_SKILL_DIRS` (colon-separated paths)\n\t * - `TRACELATTICE_TOOL_DIRS` (colon-separated paths)\n\t * - `TRACELATTICE_DISCOVERY_CACHE_TTL` (in seconds, converted to ms)\n\t * - `TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE` (number)\n\t *\n\t * @param config - The configuration to apply overrides to\n\t * @returns A new configuration object with environment overrides applied\n\t */\n\tpublic applyEnvironmentOverrides(config: ConfigFileOptions): ConfigFileOptions {\n\t\tconst result = this.cloneConfig(config);\n\n\t\tif (process.env.TRACELATTICE_MAX_HISTORY_SIZE !== undefined) {\n\t\t\tresult.maxHistorySize = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_MAX_HISTORY_SIZE',\n\t\t\t\tprocess.env.TRACELATTICE_MAX_HISTORY_SIZE\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_MAX_BRANCHES !== undefined) {\n\t\t\tresult.maxBranches = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_MAX_BRANCHES',\n\t\t\t\tprocess.env.TRACELATTICE_MAX_BRANCHES\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_MAX_BRANCH_SIZE !== undefined) {\n\t\t\tresult.maxBranchSize = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_MAX_BRANCH_SIZE',\n\t\t\t\tprocess.env.TRACELATTICE_MAX_BRANCH_SIZE\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tprocess.env.TRACELATTICE_LOG_LEVEL &&\n\t\t\t['debug', 'info', 'warn', 'error'].includes(process.env.TRACELATTICE_LOG_LEVEL)\n\t\t) {\n\t\t\tresult.logLevel = process.env.TRACELATTICE_LOG_LEVEL as 'debug' | 'info' | 'warn' | 'error';\n\t\t}\n\t\tif (process.env.TRACELATTICE_PRETTY_LOG === 'false') {\n\t\t\tresult.prettyLog = false;\n\t\t}\n\t\tif (process.env.TRACELATTICE_SKILL_DIRS !== undefined) {\n\t\t\tresult.skillDirs =\n\t\t\t\tprocess.env.TRACELATTICE_SKILL_DIRS === ''\n\t\t\t\t\t? []\n\t\t\t\t\t: process.env.TRACELATTICE_SKILL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_DIRS !== undefined) {\n\t\t\tresult.toolDirs =\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_DIRS === ''\n\t\t\t\t\t? []\n\t\t\t\t\t: process.env.TRACELATTICE_TOOL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.TRACELATTICE_DISCOVERY_CACHE_TTL !== undefined) {\n\t\t\tconst seconds = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_DISCOVERY_CACHE_TTL',\n\t\t\t\tprocess.env.TRACELATTICE_DISCOVERY_CACHE_TTL\n\t\t\t);\n\t\t\tconst ttl = seconds * 1000;\n\t\t\tif (!Number.isSafeInteger(ttl)) {\n\t\t\t\tthrow new ConfigurationError(\n\t\t\t\t\t'TRACELATTICE_DISCOVERY_CACHE_TTL exceeds the safe integer range'\n\t\t\t\t);\n\t\t\t}\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, ttl };\n\t\t}\n\t\tif (process.env.TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE !== undefined) {\n\t\t\tconst maxSize = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE',\n\t\t\t\tprocess.env.TRACELATTICE_DISCOVERY_CACHE_MAX_SIZE\n\t\t\t);\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, maxSize };\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS !== undefined) {\n\t\t\tresult.toolInterleaveTtlMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_TTL_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS !== undefined) {\n\t\t\tresult.toolInterleaveSweepMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_SESSION_MAX_PER_OWNER !== undefined) {\n\t\t\tresult.maxSessionsPerOwner = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_SESSION_MAX_PER_OWNER',\n\t\t\t\tprocess.env.TRACELATTICE_SESSION_MAX_PER_OWNER\n\t\t\t);\n\t\t}\n\n\t\tthis.applyFeatureFlagOverrides(result);\n\n\t\treturn result;\n\t}\n\n\tprivate cloneConfig(config: ConfigFileOptions): Mutable<ConfigFileOptions> {\n\t\treturn {\n\t\t\t...config,\n\t\t\t...(config.skillDirs === undefined ? {} : { skillDirs: [...config.skillDirs] }),\n\t\t\t...(config.toolDirs === undefined ? {} : { toolDirs: [...config.toolDirs] }),\n\t\t\t...(config.discoveryCache === undefined\n\t\t\t\t? {}\n\t\t\t\t: { discoveryCache: { ...config.discoveryCache } }),\n\t\t\t...(config.persistence === undefined\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tpersistence: {\n\t\t\t\t\t\t\t...config.persistence,\n\t\t\t\t\t\t\t...(config.persistence.options === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { options: { ...config.persistence.options } }),\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t...(config.features === undefined ? {} : { features: { ...config.features } }),\n\t\t};\n\t}\n\n\t/**\n\t * Applies TRACELATTICE_FEATURES_* environment variable overrides for feature flags.\n\t * Booleans accept 'true'/'false'/'1'/'0' (case-insensitive).\n\t * Invalid reasoningStrategy values are rejected.\n\t *\n\t * @param result - Configuration object to mutate with feature flag overrides\n\t * @private\n\t */\n\tprivate applyFeatureFlagOverrides(result: Mutable<ConfigFileOptions>): void {\n\t\tconst boolMap: Record<string, Exclude<keyof FeatureFlags, 'reasoningStrategy'>> = {\n\t\t\tTRACELATTICE_FEATURES_DAG_EDGES: 'dagEdges',\n\t\t\tTRACELATTICE_FEATURES_CALIBRATION: 'calibration',\n\t\t\tTRACELATTICE_FEATURES_COMPRESSION: 'compression',\n\t\t\tTRACELATTICE_FEATURES_TOOL_INTERLEAVE: 'toolInterleave',\n\t\t\tTRACELATTICE_FEATURES_NEW_THOUGHT_TYPES: 'newThoughtTypes',\n\t\t\tTRACELATTICE_FEATURES_OUTCOME_RECORDING: 'outcomeRecording',\n\t\t};\n\t\tfor (const [envVar, key] of Object.entries(boolMap)) {\n\t\t\tconst raw = process.env[envVar];\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst parsed = this.parseBoolean(raw);\n\t\t\tif (parsed === undefined) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Invalid boolean value for ${envVar}: \"${raw}\" (expected true/false/1/0). Ignoring.`\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures[key] = parsed;\n\t\t\tresult.features = features;\n\t\t}\n\n\t\tconst strategyRaw = process.env.TRACELATTICE_FEATURES_REASONING_STRATEGY;\n\t\tif (strategyRaw !== undefined) {\n\t\t\tif (strategyRaw !== 'sequential' && strategyRaw !== 'tot') {\n\t\t\t\tthrow new ConfigurationError(\n\t\t\t\t\t`TRACELATTICE_FEATURES_REASONING_STRATEGY must be one of sequential, tot, got ${strategyRaw}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures.reasoningStrategy = strategyRaw;\n\t\t\tresult.features = features;\n\t\t}\n\t}\n\n\tprivate parseEnvironmentInteger(environmentName: string, raw: string): number {\n\t\tif (!/^(0|[1-9]\\d*)$/.test(raw)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be an integer, got ${raw}`);\n\t\t}\n\t\tconst parsed = Number(raw);\n\t\tif (!Number.isSafeInteger(parsed)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be a safe integer, got ${raw}`);\n\t\t}\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * Parses a boolean from an environment variable string.\n\t * Accepts 'true'/'false'/'1'/'0' case-insensitively.\n\t *\n\t * @param raw - Raw environment variable string\n\t * @returns Parsed boolean, or undefined if the value is invalid\n\t * @private\n\t */\n\tprivate parseBoolean(raw: string): boolean | undefined {\n\t\tconst v = raw.trim().toLowerCase();\n\t\tif (v === 'true' || v === '1') return true;\n\t\tif (v === 'false' || v === '0') return false;\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parses a configuration file (JSON or YAML).\n\t *\n\t * Detects the file type by extension and uses the appropriate parser.\n\t * Supports `.json`, `.yaml`, and `.yml` file extensions.\n\t *\n\t * @param filePath - Path to the configuration file to parse\n\t * @returns The parsed configuration object\n\t * @throws {Error} If the file cannot be parsed\n\t * @private\n\t */\n\tprivate parseConfig(filePath: string): ConfigFileOptions {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\n\t\tconst raw: unknown = ext === 'yaml' || ext === 'yml' ? parseYaml(content) : JSON.parse(content);\n\n\t\treturn v.parse(ConfigFileOptionsSchema, raw) as ConfigFileOptions;\n\t}\n\n\t/**\n\t * Converts file-based configuration to ServerConfig options.\n\t *\n\t * This is a convenience method for extracting the ServerConfig-relevant\n\t * options from a file-based configuration.\n\t *\n\t * @param config - The configuration to convert\n\t * @returns An object with ServerConfig-compatible options\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t * if (config) {\n\t * const serverOpts = loader.toServerConfigOptions(config);\n\t * const serverConfig = new ServerConfig(serverOpts);\n\t * }\n\t * ```\n\t */\n\ttoServerConfigOptions(config: ConfigFileOptions): ServerConfigOptions {\n\t\treturn {\n\t\t\tmaxHistorySize: config.maxHistorySize,\n\t\t\tmaxBranches: config.maxBranches,\n\t\t\tmaxBranchSize: config.maxBranchSize,\n\t\t\tskillDirs: config.skillDirs,\n\t\t\ttoolDirs: config.toolDirs,\n\t\t\tdiscoveryCache: config.discoveryCache,\n\t\t\tpersistence: config.persistence,\n\t\t\tpersistenceBufferSize: config.persistenceBufferSize,\n\t\t\tpersistenceFlushInterval: config.persistenceFlushInterval,\n\t\t\tpersistenceMaxRetries: config.persistenceMaxRetries,\n\t\t\tfeatures: config.features,\n\t\t\ttoolInterleaveTtlMs: config.toolInterleaveTtlMs,\n\t\t\ttoolInterleaveSweepMs: config.toolInterleaveSweepMs,\n\t\t\tmaxSessionsPerOwner: config.maxSessionsPerOwner,\n\t\t};\n\t}\n}\n"],"names":["ConfigFileOptionsSchema","v","ConfigLoader","customPath","configuredPath","process","join","homedir","config","configPath","existsSync","error","console","getErrorMessage","result","undefined","seconds","ttl","Number","ConfigurationError","maxSize","boolMap","envVar","key","Object","raw","parsed","features","strategyRaw","environmentName","filePath","content","readFileSync","ext","parseYaml","JSON"],"mappings":"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"}
@@ -2,113 +2,7 @@ import type { ThoughtData } from '../core/thought.js';
2
2
  import type { Edge } from '../core/graph/Edge.js';
3
3
  import type { Summary } from '../core/compression/Summary.js';
4
4
  import type { BranchId, SessionId } from './ids.js';
5
- /**
6
- * Persistence backend interface for storing thought history and branches.
7
- *
8
- * Implementations can store data in various formats (JSON files, SQLite, etc.)
9
- * while providing a unified API for HistoryManager.
10
- */
11
5
  export interface PersistenceBackend {
12
- /**
13
- * Save a single thought to persistent storage.
14
- *
15
- * @param thought - The thought data to persist
16
- */
17
- saveThought(thought: ThoughtData): Promise<void>;
18
- /**
19
- * Load all thoughts from persistent storage.
20
- * Returns thoughts in chronological order (oldest first).
21
- *
22
- * @returns Array of all persisted thoughts
23
- */
24
- loadHistory(): Promise<ThoughtData[]>;
25
- /**
26
- * Save all thoughts in a branch to persistent storage.
27
- *
28
- * @param branchId - The unique identifier for the branch
29
- * @param thoughts - Array of thoughts in branch
30
- */
31
- saveBranch(branchId: BranchId, thoughts: ThoughtData[]): Promise<void>;
32
- /**
33
- * Delete one global branch without treating an empty branch as deletion.
34
- *
35
- * Optional on legacy backends; the complete scoped capability requires it.
36
- *
37
- * @param branchId - The branch identifier to delete
38
- */
39
- deleteBranch?(branchId: BranchId): Promise<void>;
40
- /**
41
- * Load all thoughts for a specific branch.
42
- *
43
- * @param branchId - The unique identifier for the branch
44
- * @returns Array of thoughts in branch, or undefined if branch doesn't exist
45
- */
46
- loadBranch(branchId: BranchId): Promise<ThoughtData[] | undefined>;
47
- /**
48
- * List all branch IDs that are persisted.
49
- *
50
- * @returns Array of branch identifiers
51
- */
52
- listBranches(): Promise<BranchId[]>;
53
- /**
54
- * Check if backend is healthy.
55
- * @returns Promise that resolves to true if healthy, false otherwise
56
- */
57
- healthy(): Promise<boolean>;
58
- /**
59
- * Clear all persisted data (history and branches).
60
- * Use with caution - this cannot be undone.
61
- */
62
- clear(): Promise<void>;
63
- /**
64
- * Close the backend and release resources.
65
- * Should be called during graceful shutdown to ensure data is flushed.
66
- */
67
- close(): Promise<void>;
68
- /**
69
- * Save edges for a session, replacing any previously saved edges.
70
- *
71
- * @param sessionId - The session whose edges to persist
72
- * @param edges - Array of edges to save
73
- */
74
- saveEdges(sessionId: SessionId, edges: readonly Edge[]): Promise<void>;
75
- /**
76
- * Load edges for a session from persistent storage.
77
- * Returns edges in chronological order (by createdAt ascending).
78
- * Returns empty array if no edges exist for the session.
79
- *
80
- * @param sessionId - The session whose edges to load
81
- * @returns Array of persisted edges, sorted by createdAt
82
- */
83
- loadEdges(sessionId: SessionId): Promise<Edge[]>;
84
- /**
85
- * List all session IDs that have persisted edge data.
86
- *
87
- * @returns Array of session identifiers with persisted edges
88
- */
89
- listEdgeSessions(): Promise<SessionId[]>;
90
- /**
91
- * Save summaries for a session, replacing any previously saved summaries.
92
- *
93
- * @param sessionId - The session whose summaries to persist
94
- * @param summaries - Array of summaries to save
95
- */
96
- saveSummaries(sessionId: SessionId, summaries: readonly Summary[]): Promise<void>;
97
- /**
98
- * Load summaries for a session from persistent storage.
99
- * Returns summaries in chronological order (by createdAt ascending).
100
- * Returns empty array if no summaries exist for the session.
101
- *
102
- * @param sessionId - The session whose summaries to load
103
- * @returns Array of persisted summaries, sorted by createdAt
104
- */
105
- loadSummaries(sessionId: SessionId): Promise<Summary[]>;
106
- }
107
- /** Session-scoped persistence operations implemented as one indivisible capability. */
108
- export type SessionScopedPersistenceOperation = 'saveThoughtForSession' | 'loadHistoryForSession' | 'saveBranchForSession' | 'deleteBranch' | 'deleteBranchForSession' | 'loadBranchForSession' | 'listBranchesForSession' | 'listSessions' | 'clearSession';
109
- /** Persistence contract for durable named-session isolation. */
110
- export interface SessionScopedPersistenceBackend extends PersistenceBackend {
111
- deleteBranch(branchId: BranchId): Promise<void>;
112
6
  saveThoughtForSession(sessionId: SessionId, thought: ThoughtData): Promise<void>;
113
7
  loadHistoryForSession(sessionId: SessionId): Promise<ThoughtData[]>;
114
8
  saveBranchForSession(sessionId: SessionId, branchId: BranchId, thoughts: readonly ThoughtData[]): Promise<void>;
@@ -116,10 +10,15 @@ export interface SessionScopedPersistenceBackend extends PersistenceBackend {
116
10
  loadBranchForSession(sessionId: SessionId, branchId: BranchId): Promise<ThoughtData[] | undefined>;
117
11
  listBranchesForSession(sessionId: SessionId): Promise<BranchId[]>;
118
12
  listSessions(): Promise<SessionId[]>;
13
+ healthy(): Promise<boolean>;
119
14
  clearSession(sessionId: SessionId): Promise<void>;
15
+ clearAll(): Promise<void>;
16
+ saveEdges(sessionId: SessionId, edges: readonly Edge[]): Promise<void>;
17
+ loadEdges(sessionId: SessionId): Promise<Edge[]>;
18
+ saveSummaries(sessionId: SessionId, summaries: readonly Summary[]): Promise<void>;
19
+ loadSummaries(sessionId: SessionId): Promise<Summary[]>;
20
+ close(): Promise<void>;
120
21
  }
121
- /** Return whether a backend implements every session-scoped operation. */
122
- export declare function supportsSessionScopedPersistence(backend: PersistenceBackend): backend is SessionScopedPersistenceBackend;
123
22
  export interface PersistenceConfig {
124
23
  enabled?: boolean;
125
24
  backend?: 'file' | 'sqlite' | 'memory';
@@ -1 +1 @@
1
- {"version":3,"file":"PersistenceBackend.d.ts","sourceRoot":"","sources":["../../src/contracts/PersistenceBackend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PersistenceBackend.d.ts","sourceRoot":"","sources":["../../src/contracts/PersistenceBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAClC,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,oBAAoB,CACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,SAAS,WAAW,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,oBAAoB,CACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC;IACtC,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClE,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;CACF"}
@@ -1,6 +1 @@
1
- function supportsSessionScopedPersistence(backend) {
2
- return 'saveThoughtForSession' in backend && 'function' == typeof backend.saveThoughtForSession && 'loadHistoryForSession' in backend && 'function' == typeof backend.loadHistoryForSession && 'saveBranchForSession' in backend && 'function' == typeof backend.saveBranchForSession && 'deleteBranch' in backend && 'function' == typeof backend.deleteBranch && 'deleteBranchForSession' in backend && 'function' == typeof backend.deleteBranchForSession && 'loadBranchForSession' in backend && 'function' == typeof backend.loadBranchForSession && 'listBranchesForSession' in backend && 'function' == typeof backend.listBranchesForSession && 'listSessions' in backend && 'function' == typeof backend.listSessions && 'clearSession' in backend && 'function' == typeof backend.clearSession;
3
- }
4
- export { supportsSessionScopedPersistence };
5
-
6
- //# sourceMappingURL=PersistenceBackend.js.map
1
+ export { };
@@ -73,25 +73,25 @@ export interface ICalibrator {
73
73
  */
74
74
  calibrate(rawConfidence: number, type: ThoughtType, sessionId: SessionId): CalibrationResult;
75
75
  /**
76
- * Get calibration metrics for a session, or globally if `sessionId` is omitted.
76
+ * Get calibration metrics for a session, or aggregate metrics if `sessionId` is omitted.
77
77
  *
78
- * @param sessionId - Optional session id; omit for global metrics.
78
+ * @param sessionId - Optional session id; omit for aggregate metrics.
79
79
  * @returns Aggregate calibration metrics.
80
80
  */
81
81
  metrics(sessionId?: SessionId): CalibrationMetrics;
82
82
  /**
83
83
  * Refit the calibration model from accumulated samples.
84
84
  *
85
- * @param sessionId - Optional session id; omit to refit global state.
85
+ * @param sessionId - Session id whose calibration model is refitted.
86
86
  */
87
- refit(sessionId?: SessionId): void;
87
+ refit(sessionId: SessionId): void;
88
88
  /**
89
- * Remove the fitted temperature for one session while preserving global state.
89
+ * Remove the fitted temperature for one session.
90
90
  *
91
91
  * @param sessionId - Session identifier whose fitted temperature is removed.
92
92
  */
93
93
  clearSession(sessionId: SessionId): void;
94
- /** Remove all fitted session and global temperatures. */
94
+ /** Remove all fitted session temperatures. */
95
95
  clearAll(): void;
96
96
  }
97
97
  //# sourceMappingURL=calibrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calibrator.d.ts","sourceRoot":"","sources":["../../src/contracts/calibrator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAC7F;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,kBAAkB,CAAC;IACnD;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,yDAAyD;IACzD,QAAQ,IAAI,IAAI,CAAC;CACjB"}
1
+ {"version":3,"file":"calibrator.d.ts","sourceRoot":"","sources":["../../src/contracts/calibrator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAC7F;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,kBAAkB,CAAC;IACnD;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,8CAA8C;IAC9C,QAAQ,IAAI,IAAI,CAAC;CACjB"}