@iworkforces/tracelattice 2.0.3

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 (422) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +260 -0
  3. package/dist/CliLifecycle.d.ts +31 -0
  4. package/dist/CliLifecycle.d.ts.map +1 -0
  5. package/dist/CliLifecycle.js +90 -0
  6. package/dist/CliLifecycle.js.map +1 -0
  7. package/dist/ServerConfig.d.ts +290 -0
  8. package/dist/ServerConfig.d.ts.map +1 -0
  9. package/dist/ServerConfig.js +175 -0
  10. package/dist/ServerConfig.js.map +1 -0
  11. package/dist/cache/DiscoveryCache.d.ts +269 -0
  12. package/dist/cache/DiscoveryCache.d.ts.map +1 -0
  13. package/dist/cache/DiscoveryCache.js +104 -0
  14. package/dist/cache/DiscoveryCache.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +5177 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/ConfigLoader.d.ts +270 -0
  20. package/dist/config/ConfigLoader.d.ts.map +1 -0
  21. package/dist/config/ConfigLoader.js +186 -0
  22. package/dist/config/ConfigLoader.js.map +1 -0
  23. package/dist/context/RequestContext.d.ts +43 -0
  24. package/dist/context/RequestContext.d.ts.map +1 -0
  25. package/dist/context/RequestContext.js +14 -0
  26. package/dist/context/RequestContext.js.map +1 -0
  27. package/dist/contracts/PersistenceBackend.d.ts +134 -0
  28. package/dist/contracts/PersistenceBackend.d.ts.map +1 -0
  29. package/dist/contracts/PersistenceBackend.js +6 -0
  30. package/dist/contracts/PersistenceBackend.js.map +1 -0
  31. package/dist/contracts/calibrator.d.ts +97 -0
  32. package/dist/contracts/calibrator.d.ts.map +1 -0
  33. package/dist/contracts/calibrator.js +1 -0
  34. package/dist/contracts/features.d.ts +35 -0
  35. package/dist/contracts/features.d.ts.map +1 -0
  36. package/dist/contracts/features.js +12 -0
  37. package/dist/contracts/features.js.map +1 -0
  38. package/dist/contracts/ids.d.ts +68 -0
  39. package/dist/contracts/ids.d.ts.map +1 -0
  40. package/dist/contracts/ids.js +40 -0
  41. package/dist/contracts/ids.js.map +1 -0
  42. package/dist/contracts/interfaces.d.ts +254 -0
  43. package/dist/contracts/interfaces.d.ts.map +1 -0
  44. package/dist/contracts/interfaces.js +1 -0
  45. package/dist/contracts/persistence-work.d.ts +96 -0
  46. package/dist/contracts/persistence-work.d.ts.map +1 -0
  47. package/dist/contracts/persistence-work.js +1 -0
  48. package/dist/contracts/reasoning-types.d.ts +21 -0
  49. package/dist/contracts/reasoning-types.d.ts.map +1 -0
  50. package/dist/contracts/reasoning-types.js +1 -0
  51. package/dist/contracts/strategy.d.ts +107 -0
  52. package/dist/contracts/strategy.d.ts.map +1 -0
  53. package/dist/contracts/strategy.js +1 -0
  54. package/dist/contracts/summary.d.ts +110 -0
  55. package/dist/contracts/summary.d.ts.map +1 -0
  56. package/dist/contracts/summary.js +1 -0
  57. package/dist/contracts/suspension.d.ts +215 -0
  58. package/dist/contracts/suspension.d.ts.map +1 -0
  59. package/dist/contracts/suspension.js +1 -0
  60. package/dist/contracts/transport.d.ts +26 -0
  61. package/dist/contracts/transport.d.ts.map +1 -0
  62. package/dist/contracts/transport.js +1 -0
  63. package/dist/core/CrossReferenceValidator.d.ts +18 -0
  64. package/dist/core/CrossReferenceValidator.d.ts.map +1 -0
  65. package/dist/core/CrossReferenceValidator.js +125 -0
  66. package/dist/core/CrossReferenceValidator.js.map +1 -0
  67. package/dist/core/HistoryManager.d.ts +215 -0
  68. package/dist/core/HistoryManager.d.ts.map +1 -0
  69. package/dist/core/HistoryManager.js +594 -0
  70. package/dist/core/HistoryManager.js.map +1 -0
  71. package/dist/core/IHistoryManager.d.ts +163 -0
  72. package/dist/core/IHistoryManager.d.ts.map +1 -0
  73. package/dist/core/IHistoryManager.js +1 -0
  74. package/dist/core/IThoughtFormatter.d.ts +51 -0
  75. package/dist/core/IThoughtFormatter.d.ts.map +1 -0
  76. package/dist/core/IThoughtFormatter.js +1 -0
  77. package/dist/core/InputNormalizer.d.ts +140 -0
  78. package/dist/core/InputNormalizer.d.ts.map +1 -0
  79. package/dist/core/InputNormalizer.js +95 -0
  80. package/dist/core/InputNormalizer.js.map +1 -0
  81. package/dist/core/PersistenceBuffer.d.ts +204 -0
  82. package/dist/core/PersistenceBuffer.d.ts.map +1 -0
  83. package/dist/core/PersistenceBuffer.js +382 -0
  84. package/dist/core/PersistenceBuffer.js.map +1 -0
  85. package/dist/core/PersistenceBufferErrors.d.ts +22 -0
  86. package/dist/core/PersistenceBufferErrors.d.ts.map +1 -0
  87. package/dist/core/PersistenceBufferErrors.js +30 -0
  88. package/dist/core/PersistenceBufferErrors.js.map +1 -0
  89. package/dist/core/PersistenceRestore.d.ts +21 -0
  90. package/dist/core/PersistenceRestore.d.ts.map +1 -0
  91. package/dist/core/PersistenceRestore.js +87 -0
  92. package/dist/core/PersistenceRestore.js.map +1 -0
  93. package/dist/core/PersistenceWorkQueue.d.ts +155 -0
  94. package/dist/core/PersistenceWorkQueue.d.ts.map +1 -0
  95. package/dist/core/PersistenceWorkQueue.js +298 -0
  96. package/dist/core/PersistenceWorkQueue.js.map +1 -0
  97. package/dist/core/PersistenceWriter.d.ts +55 -0
  98. package/dist/core/PersistenceWriter.d.ts.map +1 -0
  99. package/dist/core/PersistenceWriter.js +112 -0
  100. package/dist/core/PersistenceWriter.js.map +1 -0
  101. package/dist/core/SessionErrors.d.ts +37 -0
  102. package/dist/core/SessionErrors.d.ts.map +1 -0
  103. package/dist/core/SessionErrors.js +50 -0
  104. package/dist/core/SessionErrors.js.map +1 -0
  105. package/dist/core/SessionLifecycleCoordinator.d.ts +74 -0
  106. package/dist/core/SessionLifecycleCoordinator.d.ts.map +1 -0
  107. package/dist/core/SessionLifecycleCoordinator.js +222 -0
  108. package/dist/core/SessionLifecycleCoordinator.js.map +1 -0
  109. package/dist/core/SessionLock.d.ts +59 -0
  110. package/dist/core/SessionLock.d.ts.map +1 -0
  111. package/dist/core/SessionLock.js +39 -0
  112. package/dist/core/SessionLock.js.map +1 -0
  113. package/dist/core/SessionManager.d.ts +62 -0
  114. package/dist/core/SessionManager.d.ts.map +1 -0
  115. package/dist/core/SessionManager.js +75 -0
  116. package/dist/core/SessionManager.js.map +1 -0
  117. package/dist/core/SessionResetCoordinator.d.ts +37 -0
  118. package/dist/core/SessionResetCoordinator.d.ts.map +1 -0
  119. package/dist/core/SessionResetCoordinator.js +80 -0
  120. package/dist/core/SessionResetCoordinator.js.map +1 -0
  121. package/dist/core/ThoughtEvaluator.d.ts +48 -0
  122. package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
  123. package/dist/core/ThoughtEvaluator.js +85 -0
  124. package/dist/core/ThoughtEvaluator.js.map +1 -0
  125. package/dist/core/ThoughtFormatter.d.ts +134 -0
  126. package/dist/core/ThoughtFormatter.d.ts.map +1 -0
  127. package/dist/core/ThoughtFormatter.js +118 -0
  128. package/dist/core/ThoughtFormatter.js.map +1 -0
  129. package/dist/core/ThoughtProcessor.d.ts +259 -0
  130. package/dist/core/ThoughtProcessor.d.ts.map +1 -0
  131. package/dist/core/ThoughtProcessor.js +451 -0
  132. package/dist/core/ThoughtProcessor.js.map +1 -0
  133. package/dist/core/ThoughtReferenceIndex.d.ts +23 -0
  134. package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -0
  135. package/dist/core/ThoughtReferenceIndex.js +66 -0
  136. package/dist/core/ThoughtReferenceIndex.js.map +1 -0
  137. package/dist/core/VerificationOutcomeAdmission.d.ts +15 -0
  138. package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -0
  139. package/dist/core/VerificationOutcomeAdmission.js +28 -0
  140. package/dist/core/VerificationOutcomeAdmission.js.map +1 -0
  141. package/dist/core/compression/CompressionService.d.ts +76 -0
  142. package/dist/core/compression/CompressionService.d.ts.map +1 -0
  143. package/dist/core/compression/CompressionService.js +160 -0
  144. package/dist/core/compression/CompressionService.js.map +1 -0
  145. package/dist/core/compression/DehydrationPolicy.d.ts +75 -0
  146. package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -0
  147. package/dist/core/compression/DehydrationPolicy.js +45 -0
  148. package/dist/core/compression/DehydrationPolicy.js.map +1 -0
  149. package/dist/core/compression/InMemorySummaryStore.d.ts +132 -0
  150. package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -0
  151. package/dist/core/compression/InMemorySummaryStore.js +69 -0
  152. package/dist/core/compression/InMemorySummaryStore.js.map +1 -0
  153. package/dist/core/compression/Summary.d.ts +74 -0
  154. package/dist/core/compression/Summary.d.ts.map +1 -0
  155. package/dist/core/compression/Summary.js +16 -0
  156. package/dist/core/compression/Summary.js.map +1 -0
  157. package/dist/core/evaluator/Aggregator.d.ts +40 -0
  158. package/dist/core/evaluator/Aggregator.d.ts.map +1 -0
  159. package/dist/core/evaluator/Aggregator.js +36 -0
  160. package/dist/core/evaluator/Aggregator.js.map +1 -0
  161. package/dist/core/evaluator/Calibrator.d.ts +52 -0
  162. package/dist/core/evaluator/Calibrator.d.ts.map +1 -0
  163. package/dist/core/evaluator/Calibrator.js +135 -0
  164. package/dist/core/evaluator/Calibrator.js.map +1 -0
  165. package/dist/core/evaluator/PatternDetector.d.ts +69 -0
  166. package/dist/core/evaluator/PatternDetector.d.ts.map +1 -0
  167. package/dist/core/evaluator/PatternDetector.js +192 -0
  168. package/dist/core/evaluator/PatternDetector.js.map +1 -0
  169. package/dist/core/evaluator/SignalComputer.d.ts +116 -0
  170. package/dist/core/evaluator/SignalComputer.d.ts.map +1 -0
  171. package/dist/core/evaluator/SignalComputer.js +110 -0
  172. package/dist/core/evaluator/SignalComputer.js.map +1 -0
  173. package/dist/core/evaluator/calibration-math.d.ts +39 -0
  174. package/dist/core/evaluator/calibration-math.d.ts.map +1 -0
  175. package/dist/core/evaluator/calibration-math.js +42 -0
  176. package/dist/core/evaluator/calibration-math.js.map +1 -0
  177. package/dist/core/evaluator/internals.d.ts +36 -0
  178. package/dist/core/evaluator/internals.d.ts.map +1 -0
  179. package/dist/core/evaluator/internals.js +43 -0
  180. package/dist/core/evaluator/internals.js.map +1 -0
  181. package/dist/core/graph/Edge.d.ts +58 -0
  182. package/dist/core/graph/Edge.d.ts.map +1 -0
  183. package/dist/core/graph/Edge.js +1 -0
  184. package/dist/core/graph/EdgeEmitter.d.ts +68 -0
  185. package/dist/core/graph/EdgeEmitter.d.ts.map +1 -0
  186. package/dist/core/graph/EdgeEmitter.js +118 -0
  187. package/dist/core/graph/EdgeEmitter.js.map +1 -0
  188. package/dist/core/graph/EdgeStore.d.ts +116 -0
  189. package/dist/core/graph/EdgeStore.d.ts.map +1 -0
  190. package/dist/core/graph/EdgeStore.js +107 -0
  191. package/dist/core/graph/EdgeStore.js.map +1 -0
  192. package/dist/core/graph/GraphView.d.ts +157 -0
  193. package/dist/core/graph/GraphView.d.ts.map +1 -0
  194. package/dist/core/graph/GraphView.js +149 -0
  195. package/dist/core/graph/GraphView.js.map +1 -0
  196. package/dist/core/ids.d.ts +33 -0
  197. package/dist/core/ids.d.ts.map +1 -0
  198. package/dist/core/ids.js +11 -0
  199. package/dist/core/ids.js.map +1 -0
  200. package/dist/core/reasoning/OutcomeRecorder.d.ts +88 -0
  201. package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -0
  202. package/dist/core/reasoning/OutcomeRecorder.js +51 -0
  203. package/dist/core/reasoning/OutcomeRecorder.js.map +1 -0
  204. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +54 -0
  205. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts.map +1 -0
  206. package/dist/core/reasoning/strategies/SequentialStrategy.js +22 -0
  207. package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -0
  208. package/dist/core/reasoning/strategies/StrategyFactory.d.ts +25 -0
  209. package/dist/core/reasoning/strategies/StrategyFactory.d.ts.map +1 -0
  210. package/dist/core/reasoning/strategies/StrategyFactory.js +16 -0
  211. package/dist/core/reasoning/strategies/StrategyFactory.js.map +1 -0
  212. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +58 -0
  213. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -0
  214. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +103 -0
  215. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -0
  216. package/dist/core/reasoning/strategies/plateau.d.ts +18 -0
  217. package/dist/core/reasoning/strategies/plateau.d.ts.map +1 -0
  218. package/dist/core/reasoning/strategies/plateau.js +12 -0
  219. package/dist/core/reasoning/strategies/plateau.js.map +1 -0
  220. package/dist/core/reasoning/strategies/totScoring.d.ts +91 -0
  221. package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -0
  222. package/dist/core/reasoning/strategies/totScoring.js +88 -0
  223. package/dist/core/reasoning/strategies/totScoring.js.map +1 -0
  224. package/dist/core/reasoning.d.ts +179 -0
  225. package/dist/core/reasoning.d.ts.map +1 -0
  226. package/dist/core/reasoning.js +1 -0
  227. package/dist/core/step.d.ts +50 -0
  228. package/dist/core/step.d.ts.map +1 -0
  229. package/dist/core/step.js +1 -0
  230. package/dist/core/thought.d.ts +113 -0
  231. package/dist/core/thought.d.ts.map +1 -0
  232. package/dist/core/thought.js +1 -0
  233. package/dist/core/tools/InMemorySuspensionStore.d.ts +66 -0
  234. package/dist/core/tools/InMemorySuspensionStore.d.ts.map +1 -0
  235. package/dist/core/tools/InMemorySuspensionStore.js +121 -0
  236. package/dist/core/tools/InMemorySuspensionStore.js.map +1 -0
  237. package/dist/di/Container.d.ts +253 -0
  238. package/dist/di/Container.d.ts.map +1 -0
  239. package/dist/di/Container.js +111 -0
  240. package/dist/di/Container.js.map +1 -0
  241. package/dist/di/ServiceRegistry.d.ts +50 -0
  242. package/dist/di/ServiceRegistry.d.ts.map +1 -0
  243. package/dist/di/ServiceRegistry.js +1 -0
  244. package/dist/errors.d.ts +663 -0
  245. package/dist/errors.d.ts.map +1 -0
  246. package/dist/errors.js +282 -0
  247. package/dist/errors.js.map +1 -0
  248. package/dist/health/HealthChecker.d.ts +73 -0
  249. package/dist/health/HealthChecker.d.ts.map +1 -0
  250. package/dist/health/HealthChecker.js +70 -0
  251. package/dist/health/HealthChecker.js.map +1 -0
  252. package/dist/lib.d.ts +273 -0
  253. package/dist/lib.d.ts.map +1 -0
  254. package/dist/lib.js +409 -0
  255. package/dist/lib.js.map +1 -0
  256. package/dist/logger/NullLogger.d.ts +154 -0
  257. package/dist/logger/NullLogger.d.ts.map +1 -0
  258. package/dist/logger/NullLogger.js +24 -0
  259. package/dist/logger/NullLogger.js.map +1 -0
  260. package/dist/logger/StructuredLogger.d.ts +327 -0
  261. package/dist/logger/StructuredLogger.d.ts.map +1 -0
  262. package/dist/logger/StructuredLogger.js +72 -0
  263. package/dist/logger/StructuredLogger.js.map +1 -0
  264. package/dist/metrics/metrics.impl.d.ts +252 -0
  265. package/dist/metrics/metrics.impl.d.ts.map +1 -0
  266. package/dist/metrics/metrics.impl.js +197 -0
  267. package/dist/metrics/metrics.impl.js.map +1 -0
  268. package/dist/persistence/FileLegacyImport.d.ts +2 -0
  269. package/dist/persistence/FileLegacyImport.d.ts.map +1 -0
  270. package/dist/persistence/FileLegacyImport.js +183 -0
  271. package/dist/persistence/FileLegacyImport.js.map +1 -0
  272. package/dist/persistence/FilePersistence.d.ts +53 -0
  273. package/dist/persistence/FilePersistence.d.ts.map +1 -0
  274. package/dist/persistence/FilePersistence.js +312 -0
  275. package/dist/persistence/FilePersistence.js.map +1 -0
  276. package/dist/persistence/FileSnapshotTypes.d.ts +29 -0
  277. package/dist/persistence/FileSnapshotTypes.d.ts.map +1 -0
  278. package/dist/persistence/FileSnapshotTypes.js +1 -0
  279. package/dist/persistence/FileSnapshotV2.d.ts +377 -0
  280. package/dist/persistence/FileSnapshotV2.d.ts.map +1 -0
  281. package/dist/persistence/FileSnapshotV2.js +124 -0
  282. package/dist/persistence/FileSnapshotV2.js.map +1 -0
  283. package/dist/persistence/FileSnapshotValidation.d.ts +15 -0
  284. package/dist/persistence/FileSnapshotValidation.d.ts.map +1 -0
  285. package/dist/persistence/FileSnapshotValidation.js +64 -0
  286. package/dist/persistence/FileSnapshotValidation.js.map +1 -0
  287. package/dist/persistence/FileWriter.d.ts +30 -0
  288. package/dist/persistence/FileWriter.d.ts.map +1 -0
  289. package/dist/persistence/FileWriter.js +155 -0
  290. package/dist/persistence/FileWriter.js.map +1 -0
  291. package/dist/persistence/MemoryPersistence.d.ts +45 -0
  292. package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
  293. package/dist/persistence/MemoryPersistence.js +180 -0
  294. package/dist/persistence/MemoryPersistence.js.map +1 -0
  295. package/dist/persistence/PersistenceCodec.d.ts +7 -0
  296. package/dist/persistence/PersistenceCodec.d.ts.map +1 -0
  297. package/dist/persistence/PersistenceCodec.js +97 -0
  298. package/dist/persistence/PersistenceCodec.js.map +1 -0
  299. package/dist/persistence/PersistenceErrors.d.ts +23 -0
  300. package/dist/persistence/PersistenceErrors.d.ts.map +1 -0
  301. package/dist/persistence/PersistenceErrors.js +26 -0
  302. package/dist/persistence/PersistenceErrors.js.map +1 -0
  303. package/dist/persistence/PersistenceFactory.d.ts +21 -0
  304. package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
  305. package/dist/persistence/PersistenceFactory.js +28 -0
  306. package/dist/persistence/PersistenceFactory.js.map +1 -0
  307. package/dist/persistence/PersistenceScope.d.ts +42 -0
  308. package/dist/persistence/PersistenceScope.d.ts.map +1 -0
  309. package/dist/persistence/PersistenceScope.js +93 -0
  310. package/dist/persistence/PersistenceScope.js.map +1 -0
  311. package/dist/persistence/SessionScopedPersistence.d.ts +4 -0
  312. package/dist/persistence/SessionScopedPersistence.d.ts.map +1 -0
  313. package/dist/persistence/SessionScopedPersistence.js +9 -0
  314. package/dist/persistence/SessionScopedPersistence.js.map +1 -0
  315. package/dist/persistence/SqliteDriver.d.ts +22 -0
  316. package/dist/persistence/SqliteDriver.d.ts.map +1 -0
  317. package/dist/persistence/SqliteDriver.js +29 -0
  318. package/dist/persistence/SqliteDriver.js.map +1 -0
  319. package/dist/persistence/SqliteLegacyImport.d.ts +14 -0
  320. package/dist/persistence/SqliteLegacyImport.d.ts.map +1 -0
  321. package/dist/persistence/SqliteLegacyImport.js +136 -0
  322. package/dist/persistence/SqliteLegacyImport.js.map +1 -0
  323. package/dist/persistence/SqliteLegacySchema.d.ts +15 -0
  324. package/dist/persistence/SqliteLegacySchema.d.ts.map +1 -0
  325. package/dist/persistence/SqliteLegacySchema.js +72 -0
  326. package/dist/persistence/SqliteLegacySchema.js.map +1 -0
  327. package/dist/persistence/SqlitePayload.d.ts +11 -0
  328. package/dist/persistence/SqlitePayload.d.ts.map +1 -0
  329. package/dist/persistence/SqlitePayload.js +86 -0
  330. package/dist/persistence/SqlitePayload.js.map +1 -0
  331. package/dist/persistence/SqlitePersistence.d.ts +49 -0
  332. package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
  333. package/dist/persistence/SqlitePersistence.js +248 -0
  334. package/dist/persistence/SqlitePersistence.js.map +1 -0
  335. package/dist/persistence/SqliteSchemaV2.d.ts +14 -0
  336. package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -0
  337. package/dist/persistence/SqliteSchemaV2.js +129 -0
  338. package/dist/persistence/SqliteSchemaV2.js.map +1 -0
  339. package/dist/persistence/SqliteSnapshotWriter.d.ts +17 -0
  340. package/dist/persistence/SqliteSnapshotWriter.d.ts.map +1 -0
  341. package/dist/persistence/SqliteSnapshotWriter.js +30 -0
  342. package/dist/persistence/SqliteSnapshotWriter.js.map +1 -0
  343. package/dist/pool/ConnectionPool.d.ts +203 -0
  344. package/dist/pool/ConnectionPool.d.ts.map +1 -0
  345. package/dist/pool/ConnectionPool.js +303 -0
  346. package/dist/pool/ConnectionPool.js.map +1 -0
  347. package/dist/pool/IConnectionPool.d.ts +143 -0
  348. package/dist/pool/IConnectionPool.d.ts.map +1 -0
  349. package/dist/pool/IConnectionPool.js +1 -0
  350. package/dist/pool/PoolErrors.d.ts +11 -0
  351. package/dist/pool/PoolErrors.d.ts.map +1 -0
  352. package/dist/pool/PoolErrors.js +16 -0
  353. package/dist/pool/PoolErrors.js.map +1 -0
  354. package/dist/registry/BaseRegistry.d.ts +219 -0
  355. package/dist/registry/BaseRegistry.d.ts.map +1 -0
  356. package/dist/registry/BaseRegistry.js +215 -0
  357. package/dist/registry/BaseRegistry.js.map +1 -0
  358. package/dist/registry/SkillRegistry.d.ts +67 -0
  359. package/dist/registry/SkillRegistry.d.ts.map +1 -0
  360. package/dist/registry/SkillRegistry.js +87 -0
  361. package/dist/registry/SkillRegistry.js.map +1 -0
  362. package/dist/registry/ToolRegistry.d.ts +70 -0
  363. package/dist/registry/ToolRegistry.d.ts.map +1 -0
  364. package/dist/registry/ToolRegistry.js +96 -0
  365. package/dist/registry/ToolRegistry.js.map +1 -0
  366. package/dist/sanitize.d.ts +164 -0
  367. package/dist/sanitize.d.ts.map +1 -0
  368. package/dist/sanitize.js +100 -0
  369. package/dist/sanitize.js.map +1 -0
  370. package/dist/schema.d.ts +562 -0
  371. package/dist/schema.d.ts.map +1 -0
  372. package/dist/schema.js +251 -0
  373. package/dist/schema.js.map +1 -0
  374. package/dist/transport/BaseTransport.d.ts +166 -0
  375. package/dist/transport/BaseTransport.d.ts.map +1 -0
  376. package/dist/transport/BaseTransport.js +199 -0
  377. package/dist/transport/BaseTransport.js.map +1 -0
  378. package/dist/transport/HttpHelpers.d.ts +53 -0
  379. package/dist/transport/HttpHelpers.d.ts.map +1 -0
  380. package/dist/transport/HttpHelpers.js +44 -0
  381. package/dist/transport/HttpHelpers.js.map +1 -0
  382. package/dist/transport/HttpRequestLifecycle.d.ts +37 -0
  383. package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -0
  384. package/dist/transport/HttpRequestLifecycle.js +87 -0
  385. package/dist/transport/HttpRequestLifecycle.js.map +1 -0
  386. package/dist/transport/HttpTransport.d.ts +140 -0
  387. package/dist/transport/HttpTransport.d.ts.map +1 -0
  388. package/dist/transport/HttpTransport.js +245 -0
  389. package/dist/transport/HttpTransport.js.map +1 -0
  390. package/dist/transport/SseTransport.d.ts +149 -0
  391. package/dist/transport/SseTransport.d.ts.map +1 -0
  392. package/dist/transport/SseTransport.js +470 -0
  393. package/dist/transport/SseTransport.js.map +1 -0
  394. package/dist/transport/StreamableHttpTransport.d.ts +225 -0
  395. package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
  396. package/dist/transport/StreamableHttpTransport.js +449 -0
  397. package/dist/transport/StreamableHttpTransport.js.map +1 -0
  398. package/dist/types/disposable.d.ts +22 -0
  399. package/dist/types/disposable.d.ts.map +1 -0
  400. package/dist/types/disposable.js +1 -0
  401. package/dist/types/server-config.d.ts +32 -0
  402. package/dist/types/server-config.d.ts.map +1 -0
  403. package/dist/types/server-config.js +1 -0
  404. package/dist/types/skill.d.ts +74 -0
  405. package/dist/types/skill.d.ts.map +1 -0
  406. package/dist/types/skill.js +1 -0
  407. package/dist/types/tool.d.ts +78 -0
  408. package/dist/types/tool.d.ts.map +1 -0
  409. package/dist/types/tool.js +1 -0
  410. package/dist/utils.d.ts +27 -0
  411. package/dist/utils.d.ts.map +1 -0
  412. package/dist/utils.js +6 -0
  413. package/dist/utils.js.map +1 -0
  414. package/dist/watchers/SkillWatcher.d.ts +25 -0
  415. package/dist/watchers/SkillWatcher.d.ts.map +1 -0
  416. package/dist/watchers/SkillWatcher.js +96 -0
  417. package/dist/watchers/SkillWatcher.js.map +1 -0
  418. package/dist/watchers/ToolWatcher.d.ts +24 -0
  419. package/dist/watchers/ToolWatcher.d.ts.map +1 -0
  420. package/dist/watchers/ToolWatcher.js +92 -0
  421. package/dist/watchers/ToolWatcher.js.map +1 -0
  422. package/package.json +106 -0
@@ -0,0 +1,43 @@
1
+ const ALL_THOUGHT_TYPES = [
2
+ 'regular',
3
+ 'hypothesis',
4
+ 'verification',
5
+ 'critique',
6
+ 'synthesis',
7
+ 'meta',
8
+ 'tool_call',
9
+ 'tool_observation',
10
+ 'assumption',
11
+ 'decomposition',
12
+ 'backtrack'
13
+ ];
14
+ function _countByType(history) {
15
+ const counts = Object.fromEntries(ALL_THOUGHT_TYPES.map((t)=>[
16
+ t,
17
+ 0
18
+ ]));
19
+ for (const thought of history){
20
+ const type = thought.thought_type ?? 'regular';
21
+ if (type in counts) counts[type]++;
22
+ }
23
+ return counts;
24
+ }
25
+ const countByType = _countByType;
26
+ function _computeChainDepth(history) {
27
+ if (0 === history.length) return 0;
28
+ let maxDepth = 1;
29
+ let currentDepth = 1;
30
+ for(let i = 1; i < history.length; i++){
31
+ const thought = history[i];
32
+ if (thought.branch_from_thought) currentDepth = 1;
33
+ else {
34
+ currentDepth++;
35
+ maxDepth = Math.max(maxDepth, currentDepth);
36
+ }
37
+ }
38
+ return maxDepth;
39
+ }
40
+ const computeChainDepth = _computeChainDepth;
41
+ export { ALL_THOUGHT_TYPES, _computeChainDepth, _countByType, computeChainDepth, countByType };
42
+
43
+ //# sourceMappingURL=internals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core/evaluator/internals.js","sources":["../../../src/core/evaluator/internals.ts"],"sourcesContent":["/**\n * Shared internal helpers for evaluator submodules.\n *\n * Pure utility functions used by SignalComputer (and future evaluator\n * components such as StatsComputer / PatternDetector). All helpers are\n * stateless and have no side effects.\n *\n * @module core/evaluator/internals\n */\n\nimport type { ThoughtType } from '../reasoning.js';\nimport type { ThoughtData } from '../thought.js';\n\n/** All valid thought types for distribution counting. */\nexport const ALL_THOUGHT_TYPES: ThoughtType[] = [\n\t'regular',\n\t'hypothesis',\n\t'verification',\n\t'critique',\n\t'synthesis',\n\t'meta',\n\t'tool_call',\n\t'tool_observation',\n\t'assumption',\n\t'decomposition',\n\t'backtrack',\n];\n\n/**\n * Count thoughts in `history` grouped by {@link ThoughtType}.\n *\n * Thoughts without an explicit `thought_type` are counted as `'regular'`.\n *\n * @param history - Thoughts to count\n * @returns Record mapping each ThoughtType to its occurrence count\n */\nexport function _countByType(history: ThoughtData[]): Record<ThoughtType, number> {\n\tconst counts = Object.fromEntries(ALL_THOUGHT_TYPES.map((t) => [t, 0])) as Record<\n\t\tThoughtType,\n\t\tnumber\n\t>;\n\n\tfor (const thought of history) {\n\t\tconst type = thought.thought_type ?? 'regular';\n\t\tif (type in counts) {\n\t\t\tcounts[type]++;\n\t\t}\n\t}\n\n\treturn counts;\n}\n\n/** Alias of {@link _countByType} without the underscore prefix. */\nexport const countByType = _countByType;\n\n/**\n * Compute the longest contiguous chain depth (sequence of thoughts without branching).\n *\n * A new chain starts whenever a thought has `branch_from_thought` set.\n *\n * @param history - Thoughts in chronological order\n * @returns Length of the longest non-branching chain (0 for empty history)\n */\nexport function _computeChainDepth(history: ThoughtData[]): number {\n\tif (history.length === 0) return 0;\n\tlet maxDepth = 1;\n\tlet currentDepth = 1;\n\n\tfor (let i = 1; i < history.length; i++) {\n\t\tconst thought = history[i]!;\n\t\tif (!thought.branch_from_thought) {\n\t\t\tcurrentDepth++;\n\t\t\tmaxDepth = Math.max(maxDepth, currentDepth);\n\t\t} else {\n\t\t\tcurrentDepth = 1;\n\t\t}\n\t}\n\n\treturn maxDepth;\n}\n\n/** Alias of {@link _computeChainDepth} without the underscore prefix. */\nexport const computeChainDepth = _computeChainDepth;\n"],"names":["ALL_THOUGHT_TYPES","_countByType","history","counts","Object","t","thought","type","countByType","_computeChainDepth","maxDepth","currentDepth","i","Math","computeChainDepth"],"mappings":"AAcO,MAAMA,oBAAmC;IAC/C;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACA;AAUM,SAASC,aAAaC,OAAsB;IAClD,MAAMC,SAASC,OAAO,WAAW,CAACJ,kBAAkB,GAAG,CAAC,CAACK,IAAM;YAACA;YAAG;SAAE;IAKrE,KAAK,MAAMC,WAAWJ,QAAS;QAC9B,MAAMK,OAAOD,QAAQ,YAAY,IAAI;QACrC,IAAIC,QAAQJ,QACXA,MAAM,CAACI,KAAK;IAEd;IAEA,OAAOJ;AACR;AAGO,MAAMK,cAAcP;AAUpB,SAASQ,mBAAmBP,OAAsB;IACxD,IAAIA,AAAmB,MAAnBA,QAAQ,MAAM,EAAQ,OAAO;IACjC,IAAIQ,WAAW;IACf,IAAIC,eAAe;IAEnB,IAAK,IAAIC,IAAI,GAAGA,IAAIV,QAAQ,MAAM,EAAEU,IAAK;QACxC,MAAMN,UAAUJ,OAAO,CAACU,EAAE;QAC1B,IAAKN,QAAQ,mBAAmB,EAI/BK,eAAe;aAJkB;YACjCA;YACAD,WAAWG,KAAK,GAAG,CAACH,UAAUC;QAC/B;IAGD;IAEA,OAAOD;AACR;AAGO,MAAMI,oBAAoBL"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Edge type definitions for the thought DAG.
3
+ *
4
+ * Edges represent semantic relationships between thoughts. Endpoints reference
5
+ * `thought.id` (ulid string) rather than `thought_number` to avoid ambiguity
6
+ * across branches.
7
+ *
8
+ * @module core/graph/Edge
9
+ */
10
+ import type { EdgeId, SessionId, ThoughtId } from '../../contracts/ids.js';
11
+ /**
12
+ * Kinds of relationships between thoughts in the DAG.
13
+ *
14
+ * Each kind represents a semantic relationship that the reasoning controller
15
+ * can use for search policy decisions.
16
+ *
17
+ * NOTE: Kept as a hand-written union (not inferred from `EdgeKindSchema`) because
18
+ * `schema.ts` imports `EdgeKind` from this file to constrain the schema via
19
+ * `satisfies v.GenericSchema<EdgeKind>`. Reversing the dependency would create a
20
+ * circular import (schema.ts → Edge.ts → schema.ts). The `satisfies` clause in
21
+ * schema.ts already guarantees the schema and the union stay in sync.
22
+ */
23
+ export type EdgeKind = 'sequence' | 'branch' | 'merge' | 'verifies' | 'critiques' | 'derives_from' | 'tool_invocation' | 'revises';
24
+ /**
25
+ * A directed edge in the thought DAG.
26
+ *
27
+ * Endpoints use `thought.id` (ulid string), not `thought_number`,
28
+ * to avoid ambiguity under branching.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const edge: Edge = {
33
+ * id: generateUlid(),
34
+ * from: parentThought.id,
35
+ * to: childThought.id,
36
+ * kind: 'sequence',
37
+ * sessionId: '__global__',
38
+ * createdAt: Date.now(),
39
+ * };
40
+ * ```
41
+ */
42
+ export interface Edge {
43
+ /** Unique edge identifier (ulid). */
44
+ readonly id: EdgeId;
45
+ /** Source thought id. */
46
+ readonly from: ThoughtId;
47
+ /** Target thought id. */
48
+ readonly to: ThoughtId;
49
+ /** Semantic relationship kind. */
50
+ readonly kind: EdgeKind;
51
+ /** Session this edge belongs to. */
52
+ readonly sessionId: SessionId;
53
+ /** Creation timestamp (`Date.now()`). */
54
+ readonly createdAt: number;
55
+ /** Optional metadata for strategy-specific annotations. */
56
+ readonly metadata?: Record<string, unknown>;
57
+ }
58
+ //# sourceMappingURL=Edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Edge.d.ts","sourceRoot":"","sources":["../../../src/core/graph/Edge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE3E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,QAAQ,GACjB,UAAU,GACV,QAAQ,GACR,OAAO,GACP,UAAU,GACV,WAAW,GACX,cAAc,GACd,iBAAiB,GACjB,SAAS,CAAC;AAEb;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,IAAI;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * EdgeEmitter — emits DAG edges for thoughts based on their metadata.
3
+ *
4
+ * Stateless helper extracted from HistoryManager. Holds a reference to an
5
+ * optional `IEdgeStore` and a feature flag (`dagEdges`) gating writes.
6
+ *
7
+ * @module EdgeEmitter
8
+ */
9
+ import type { IEdgeStore } from '../../contracts/interfaces.js';
10
+ import type { Logger } from '../../logger/StructuredLogger.js';
11
+ import type { ThoughtData } from '../thought.js';
12
+ import type { ThoughtAdmissionContext } from '../IHistoryManager.js';
13
+ import { type BranchId, type SessionId } from '../../contracts/ids.js';
14
+ /** Minimal session view needed for edge emission. */
15
+ export interface EdgeEmissionSession {
16
+ thought_history: ThoughtData[];
17
+ branches: Record<BranchId, ThoughtData[]>;
18
+ }
19
+ /** Configuration options for EdgeEmitter. */
20
+ export interface EdgeEmitterConfig {
21
+ edgeStore?: IEdgeStore;
22
+ dagEdges?: boolean;
23
+ defaultSessionId: SessionId;
24
+ logger?: Logger;
25
+ }
26
+ /**
27
+ * Emits DAG edges for thought relationships when an `IEdgeStore` is configured
28
+ * and the `dagEdges` feature flag is enabled. No-ops otherwise.
29
+ */
30
+ export declare class EdgeEmitter {
31
+ private readonly _edgeStore?;
32
+ private readonly _dagEdges;
33
+ private readonly _defaultSessionId;
34
+ private readonly _logger;
35
+ constructor(config: EdgeEmitterConfig);
36
+ /** Returns true when edge emission is active (store + flag both set). */
37
+ isEnabled(): boolean;
38
+ /**
39
+ * Emits DAG edges for a thought based on its metadata fields.
40
+ *
41
+ * Edge kinds (in priority order):
42
+ * - branch: branch_from_thought + branch_id → parent.id → current.id
43
+ * - merge: merge_from_thoughts → source.id → current.id (per source)
44
+ * - verifies: verification_target + thought_type=verification → current.id → target.id
45
+ * - critiques: verification_target + thought_type=critique → current.id → target.id
46
+ * - derives_from: synthesis_sources → source.id → current.id (per source)
47
+ * - revises: revises_thought → current.id → target.id
48
+ * - tool_invocation: stable admission source id → current.id
49
+ * - sequence: default chronological link from previous thought (if none of the above)
50
+ * @returns True only when at least one edge was added to the store
51
+ */
52
+ emitEdgesForThought(session: EdgeEmissionSession, thought: ThoughtData, context?: ThoughtAdmissionContext): boolean;
53
+ private _emitBranchEdge;
54
+ private _emitMergeEdges;
55
+ private _emitVerificationEdge;
56
+ private _emitCritiqueEdge;
57
+ private _emitSynthesisEdges;
58
+ private _emitRevisionEdge;
59
+ private _emitToolInvocationEdge;
60
+ private _emitSequenceEdge;
61
+ /**
62
+ * Adds an edge to the edge store if both endpoints are non-empty strings.
63
+ * Returns true if added, false if skipped (missing endpoint).
64
+ * Failures (e.g. self-edge) are caught and logged.
65
+ */
66
+ private _addEdgeIfValid;
67
+ }
68
+ //# sourceMappingURL=EdgeEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeEmitter.d.ts","sourceRoot":"","sources":["../../../src/core/graph/EdgeEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAA6B,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhG,OAAO,EAEN,KAAK,QAAQ,EACb,KAAK,SAAS,EAEd,MAAM,wBAAwB,CAAC;AAEhC,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IACnC,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;CAC1C;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,iBAAiB;IAOrC,yEAAyE;IAClE,SAAS,IAAI,OAAO;IAI3B;;;;;;;;;;;;;OAaG;IACI,mBAAmB,CACzB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,uBAAuB,GAC/B,OAAO;IA6BV,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,iBAAiB;IAczB;;;;OAIG;IACH,OAAO,CAAC,eAAe;CA2CvB"}
@@ -0,0 +1,118 @@
1
+ import { getErrorMessage } from "../../errors.js";
2
+ import { NullLogger } from "../../logger/NullLogger.js";
3
+ import { generateEdgeId } from "../../contracts/ids.js";
4
+ class EdgeEmitter {
5
+ _edgeStore;
6
+ _dagEdges;
7
+ _defaultSessionId;
8
+ _logger;
9
+ constructor(config){
10
+ this._edgeStore = config.edgeStore;
11
+ this._dagEdges = config.dagEdges ?? true;
12
+ this._defaultSessionId = config.defaultSessionId;
13
+ this._logger = config.logger ?? new NullLogger();
14
+ }
15
+ isEnabled() {
16
+ return void 0 !== this._edgeStore && this._dagEdges;
17
+ }
18
+ emitEdgesForThought(session, thought, context) {
19
+ if (!this._edgeStore || !this._dagEdges) return false;
20
+ if (!thought.id) return false;
21
+ const sessionId = thought.session_id ?? this._defaultSessionId;
22
+ const references = context?.resolvedReferences ?? {};
23
+ const hasRelationalIntent = void 0 !== thought.branch_from_thought && void 0 !== thought.branch_id || (thought.merge_from_thoughts?.length ?? 0) > 0 || void 0 !== thought.verification_target && ('verification' === thought.thought_type || 'critique' === thought.thought_type) || (thought.synthesis_sources?.length ?? 0) > 0 || void 0 !== thought.revises_thought || 'tool_observation' === thought.thought_type && context?.toolInvocationSourceThoughtId !== void 0;
24
+ const emittedRelational = [
25
+ this._emitBranchEdge(thought, references, sessionId),
26
+ this._emitMergeEdges(thought, references, sessionId),
27
+ this._emitVerificationEdge(thought, references, sessionId),
28
+ this._emitCritiqueEdge(thought, references, sessionId),
29
+ this._emitSynthesisEdges(thought, references, sessionId),
30
+ this._emitRevisionEdge(thought, references, sessionId),
31
+ this._emitToolInvocationEdge(thought, sessionId, context)
32
+ ].some((emitted)=>emitted);
33
+ if (emittedRelational || hasRelationalIntent) return emittedRelational;
34
+ return this._emitSequenceEdge(session, thought, sessionId);
35
+ }
36
+ _emitBranchEdge(thought, references, sessionId) {
37
+ if (void 0 === thought.branch_from_thought || !thought.branch_id) return false;
38
+ return this._addEdgeIfValid(references.branchFromThoughtId, thought.id, 'branch', sessionId);
39
+ }
40
+ _emitMergeEdges(thought, references, sessionId) {
41
+ let emitted = false;
42
+ for (const srcId of references.mergeFromThoughtIds ?? [])emitted = this._addEdgeIfValid(srcId, thought.id, 'merge', sessionId) || emitted;
43
+ return emitted;
44
+ }
45
+ _emitVerificationEdge(thought, references, sessionId) {
46
+ if (void 0 === thought.verification_target || 'verification' !== thought.thought_type) return false;
47
+ return this._addEdgeIfValid(thought.id, references.verificationTargetThoughtId, 'verifies', sessionId);
48
+ }
49
+ _emitCritiqueEdge(thought, references, sessionId) {
50
+ if (void 0 === thought.verification_target || 'critique' !== thought.thought_type) return false;
51
+ return this._addEdgeIfValid(thought.id, references.verificationTargetThoughtId, 'critiques', sessionId);
52
+ }
53
+ _emitSynthesisEdges(thought, references, sessionId) {
54
+ let emitted = false;
55
+ for (const srcId of references.synthesisSourceThoughtIds ?? [])emitted = this._addEdgeIfValid(srcId, thought.id, 'derives_from', sessionId) || emitted;
56
+ return emitted;
57
+ }
58
+ _emitRevisionEdge(thought, references, sessionId) {
59
+ if (void 0 === thought.revises_thought) return false;
60
+ return this._addEdgeIfValid(thought.id, references.revisesThoughtId, 'revises', sessionId);
61
+ }
62
+ _emitToolInvocationEdge(thought, sessionId, context) {
63
+ if ('tool_observation' !== thought.thought_type || context?.toolInvocationSourceThoughtId === void 0) return false;
64
+ const metadata = void 0 !== thought.tool_name ? {
65
+ tool_name: thought.tool_name
66
+ } : void 0;
67
+ return this._addEdgeIfValid(context.toolInvocationSourceThoughtId, thought.id, 'tool_invocation', sessionId, metadata);
68
+ }
69
+ _emitSequenceEdge(session, thought, sessionId) {
70
+ const history = session.thought_history;
71
+ if (history.length < 2) return false;
72
+ const prev = history[history.length - 2];
73
+ if (!prev?.id) return false;
74
+ return this._addEdgeIfValid(prev.id, thought.id, 'sequence', sessionId);
75
+ }
76
+ _addEdgeIfValid(from, to, kind, sessionId, metadata) {
77
+ if (!from || !to) {
78
+ this._logger.debug('Skipping edge: unresolved endpoint', {
79
+ kind,
80
+ from: from ?? null,
81
+ to: to ?? null
82
+ });
83
+ return false;
84
+ }
85
+ const edge = {
86
+ id: generateEdgeId(),
87
+ from: from,
88
+ to: to,
89
+ kind,
90
+ sessionId: sessionId,
91
+ createdAt: Date.now(),
92
+ ...void 0 !== metadata ? {
93
+ metadata
94
+ } : {}
95
+ };
96
+ if (!this._edgeStore) {
97
+ this._logger.warn('EdgeStore not available; skipping edge', {
98
+ kind
99
+ });
100
+ return false;
101
+ }
102
+ const duplicate = this._edgeStore.edgesForSession(sessionId).some((existing)=>existing.kind === kind && existing.from === from && existing.to === to);
103
+ if (duplicate) return false;
104
+ try {
105
+ this._edgeStore.addEdge(edge);
106
+ return true;
107
+ } catch (err) {
108
+ this._logger.info('Failed to add DAG edge', {
109
+ kind,
110
+ error: getErrorMessage(err)
111
+ });
112
+ return false;
113
+ }
114
+ }
115
+ }
116
+ export { EdgeEmitter };
117
+
118
+ //# sourceMappingURL=EdgeEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core/graph/EdgeEmitter.js","sources":["../../../src/core/graph/EdgeEmitter.ts"],"sourcesContent":["/**\n * EdgeEmitter — emits DAG edges for thoughts based on their metadata.\n *\n * Stateless helper extracted from HistoryManager. Holds a reference to an\n * optional `IEdgeStore` and a feature flag (`dagEdges`) gating writes.\n *\n * @module EdgeEmitter\n */\n\nimport type { IEdgeStore } from '../../contracts/interfaces.js';\nimport { getErrorMessage } from '../../errors.js';\nimport type { Logger } from '../../logger/StructuredLogger.js';\nimport { NullLogger } from '../../logger/NullLogger.js';\nimport type { ThoughtData } from '../thought.js';\nimport type { ResolvedThoughtReferences, ThoughtAdmissionContext } from '../IHistoryManager.js';\nimport type { Edge, EdgeKind } from './Edge.js';\nimport {\n\tgenerateEdgeId,\n\ttype BranchId,\n\ttype SessionId,\n\ttype ThoughtId,\n} from '../../contracts/ids.js';\n\n/** Minimal session view needed for edge emission. */\nexport interface EdgeEmissionSession {\n\tthought_history: ThoughtData[];\n\tbranches: Record<BranchId, ThoughtData[]>;\n}\n\n/** Configuration options for EdgeEmitter. */\nexport interface EdgeEmitterConfig {\n\tedgeStore?: IEdgeStore;\n\tdagEdges?: boolean;\n\tdefaultSessionId: SessionId;\n\tlogger?: Logger;\n}\n\n/**\n * Emits DAG edges for thought relationships when an `IEdgeStore` is configured\n * and the `dagEdges` feature flag is enabled. No-ops otherwise.\n */\nexport class EdgeEmitter {\n\tprivate readonly _edgeStore?: IEdgeStore;\n\tprivate readonly _dagEdges: boolean;\n\tprivate readonly _defaultSessionId: SessionId;\n\tprivate readonly _logger: Logger;\n\n\tconstructor(config: EdgeEmitterConfig) {\n\t\tthis._edgeStore = config.edgeStore;\n\t\tthis._dagEdges = config.dagEdges ?? true;\n\t\tthis._defaultSessionId = config.defaultSessionId;\n\t\tthis._logger = config.logger ?? new NullLogger();\n\t}\n\n\t/** Returns true when edge emission is active (store + flag both set). */\n\tpublic isEnabled(): boolean {\n\t\treturn this._edgeStore !== undefined && this._dagEdges;\n\t}\n\n\t/**\n\t * Emits DAG edges for a thought based on its metadata fields.\n\t *\n\t * Edge kinds (in priority order):\n\t * - branch: branch_from_thought + branch_id → parent.id → current.id\n\t * - merge: merge_from_thoughts → source.id → current.id (per source)\n\t * - verifies: verification_target + thought_type=verification → current.id → target.id\n\t * - critiques: verification_target + thought_type=critique → current.id → target.id\n\t * - derives_from: synthesis_sources → source.id → current.id (per source)\n\t * - revises: revises_thought → current.id → target.id\n\t * - tool_invocation: stable admission source id → current.id\n\t * - sequence: default chronological link from previous thought (if none of the above)\n\t * @returns True only when at least one edge was added to the store\n\t */\n\tpublic emitEdgesForThought(\n\t\tsession: EdgeEmissionSession,\n\t\tthought: ThoughtData,\n\t\tcontext?: ThoughtAdmissionContext\n\t): boolean {\n\t\tif (!this._edgeStore || !this._dagEdges) return false;\n\t\tif (!thought.id) return false;\n\n\t\tconst sessionId = thought.session_id ?? this._defaultSessionId;\n\t\tconst references = context?.resolvedReferences ?? {};\n\t\tconst hasRelationalIntent =\n\t\t\t(thought.branch_from_thought !== undefined && thought.branch_id !== undefined) ||\n\t\t\t(thought.merge_from_thoughts?.length ?? 0) > 0 ||\n\t\t\t(thought.verification_target !== undefined &&\n\t\t\t\t(thought.thought_type === 'verification' || thought.thought_type === 'critique')) ||\n\t\t\t(thought.synthesis_sources?.length ?? 0) > 0 ||\n\t\t\tthought.revises_thought !== undefined ||\n\t\t\t(thought.thought_type === 'tool_observation' &&\n\t\t\t\tcontext?.toolInvocationSourceThoughtId !== undefined);\n\t\tconst emittedRelational = [\n\t\t\tthis._emitBranchEdge(thought, references, sessionId),\n\t\t\tthis._emitMergeEdges(thought, references, sessionId),\n\t\t\tthis._emitVerificationEdge(thought, references, sessionId),\n\t\t\tthis._emitCritiqueEdge(thought, references, sessionId),\n\t\t\tthis._emitSynthesisEdges(thought, references, sessionId),\n\t\t\tthis._emitRevisionEdge(thought, references, sessionId),\n\t\t\tthis._emitToolInvocationEdge(thought, sessionId, context),\n\t\t].some((emitted) => emitted);\n\n\t\tif (emittedRelational || hasRelationalIntent) return emittedRelational;\n\t\treturn this._emitSequenceEdge(session, thought, sessionId);\n\t}\n\n\tprivate _emitBranchEdge(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tif (thought.branch_from_thought === undefined || !thought.branch_id) return false;\n\n\t\treturn this._addEdgeIfValid(references.branchFromThoughtId, thought.id, 'branch', sessionId);\n\t}\n\n\tprivate _emitMergeEdges(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tlet emitted = false;\n\t\tfor (const srcId of references.mergeFromThoughtIds ?? []) {\n\t\t\temitted = this._addEdgeIfValid(srcId, thought.id, 'merge', sessionId) || emitted;\n\t\t}\n\t\treturn emitted;\n\t}\n\n\tprivate _emitVerificationEdge(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tif (thought.verification_target === undefined || thought.thought_type !== 'verification')\n\t\t\treturn false;\n\n\t\treturn this._addEdgeIfValid(\n\t\t\tthought.id,\n\t\t\treferences.verificationTargetThoughtId,\n\t\t\t'verifies',\n\t\t\tsessionId\n\t\t);\n\t}\n\n\tprivate _emitCritiqueEdge(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tif (thought.verification_target === undefined || thought.thought_type !== 'critique')\n\t\t\treturn false;\n\n\t\treturn this._addEdgeIfValid(\n\t\t\tthought.id,\n\t\t\treferences.verificationTargetThoughtId,\n\t\t\t'critiques',\n\t\t\tsessionId\n\t\t);\n\t}\n\n\tprivate _emitSynthesisEdges(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tlet emitted = false;\n\t\tfor (const srcId of references.synthesisSourceThoughtIds ?? []) {\n\t\t\temitted = this._addEdgeIfValid(srcId, thought.id, 'derives_from', sessionId) || emitted;\n\t\t}\n\t\treturn emitted;\n\t}\n\n\tprivate _emitRevisionEdge(\n\t\tthought: ThoughtData,\n\t\treferences: ResolvedThoughtReferences,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tif (thought.revises_thought === undefined) return false;\n\n\t\treturn this._addEdgeIfValid(thought.id, references.revisesThoughtId, 'revises', sessionId);\n\t}\n\n\tprivate _emitToolInvocationEdge(\n\t\tthought: ThoughtData,\n\t\tsessionId: SessionId,\n\t\tcontext?: ThoughtAdmissionContext\n\t): boolean {\n\t\tif (\n\t\t\tthought.thought_type !== 'tool_observation' ||\n\t\t\tcontext?.toolInvocationSourceThoughtId === undefined\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst metadata = thought.tool_name !== undefined ? { tool_name: thought.tool_name } : undefined;\n\t\treturn this._addEdgeIfValid(\n\t\t\tcontext.toolInvocationSourceThoughtId,\n\t\t\tthought.id,\n\t\t\t'tool_invocation',\n\t\t\tsessionId,\n\t\t\tmetadata\n\t\t);\n\t}\n\n\tprivate _emitSequenceEdge(\n\t\tsession: EdgeEmissionSession,\n\t\tthought: ThoughtData,\n\t\tsessionId: SessionId\n\t): boolean {\n\t\tconst history = session.thought_history;\n\t\tif (history.length < 2) return false;\n\n\t\tconst prev = history[history.length - 2];\n\t\tif (!prev?.id) return false;\n\n\t\treturn this._addEdgeIfValid(prev.id, thought.id, 'sequence', sessionId);\n\t}\n\n\t/**\n\t * Adds an edge to the edge store if both endpoints are non-empty strings.\n\t * Returns true if added, false if skipped (missing endpoint).\n\t * Failures (e.g. self-edge) are caught and logged.\n\t */\n\tprivate _addEdgeIfValid(\n\t\tfrom: ThoughtId | undefined,\n\t\tto: ThoughtId | undefined,\n\t\tkind: EdgeKind,\n\t\tsessionId: SessionId,\n\t\tmetadata?: Record<string, unknown>\n\t): boolean {\n\t\tif (!from || !to) {\n\t\t\tthis._logger.debug('Skipping edge: unresolved endpoint', {\n\t\t\t\tkind,\n\t\t\t\tfrom: from ?? null,\n\t\t\t\tto: to ?? null,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\tconst edge: Edge = {\n\t\t\tid: generateEdgeId(),\n\t\t\tfrom: from as Edge['from'],\n\t\t\tto: to as Edge['to'],\n\t\t\tkind,\n\t\t\tsessionId: sessionId as Edge['sessionId'],\n\t\t\tcreatedAt: Date.now(),\n\t\t\t...(metadata !== undefined ? { metadata } : {}),\n\t\t};\n\t\tif (!this._edgeStore) {\n\t\t\tthis._logger.warn('EdgeStore not available; skipping edge', { kind });\n\t\t\treturn false;\n\t\t}\n\t\tconst duplicate = this._edgeStore\n\t\t\t.edgesForSession(sessionId)\n\t\t\t.some((existing) => existing.kind === kind && existing.from === from && existing.to === to);\n\t\tif (duplicate) return false;\n\t\ttry {\n\t\t\tthis._edgeStore.addEdge(edge);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tthis._logger.info('Failed to add DAG edge', {\n\t\t\t\tkind,\n\t\t\t\terror: getErrorMessage(err),\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"],"names":["EdgeEmitter","config","NullLogger","undefined","session","thought","context","sessionId","references","hasRelationalIntent","emittedRelational","emitted","srcId","metadata","history","prev","from","to","kind","edge","generateEdgeId","Date","duplicate","existing","err","getErrorMessage"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * EdgeStore — in-memory store for the thought DAG with per-session isolation.
3
+ *
4
+ * Stores directed edges between thoughts, keyed by their `id` field. Each
5
+ * session maintains independent adjacency maps (outgoing/incoming) so that
6
+ * edges in one session are invisible to another.
7
+ *
8
+ * The store is intentionally small and synchronous; it does not persist
9
+ * anything and does not perform graph traversal. Strategy code consumes
10
+ * `outgoing()` / `incoming()` to navigate the DAG.
11
+ *
12
+ * @module core/graph/EdgeStore
13
+ */
14
+ import type { IEdgeStore } from '../../contracts/interfaces.js';
15
+ import { type SessionId, type ThoughtId } from '../../contracts/ids.js';
16
+ import type { Edge } from './Edge.js';
17
+ /**
18
+ * In-memory implementation of {@link IEdgeStore}.
19
+ *
20
+ * Edges are stored per-session in three indexes:
21
+ * - `byId`: edge id → edge (for `getEdge`)
22
+ * - `outgoing`: from-id → edges sorted by `createdAt` ascending
23
+ * - `incoming`: to-id → edges sorted by `createdAt` ascending
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const store = new EdgeStore();
28
+ * store.addEdge({
29
+ * id: generateUlid(),
30
+ * from: 'thought-1',
31
+ * to: 'thought-2',
32
+ * kind: 'sequence',
33
+ * sessionId: 's1',
34
+ * createdAt: Date.now(),
35
+ * });
36
+ * const out = store.outgoing('s1', 'thought-1');
37
+ * ```
38
+ */
39
+ export declare class EdgeStore implements IEdgeStore {
40
+ private readonly _sessions;
41
+ /**
42
+ * Add a directed edge to the store.
43
+ *
44
+ * Self-edges (`from === to`) are rejected. Identical edges
45
+ * (same `from`, `to`, `kind`, `sessionId`) are silently deduped — the
46
+ * existing edge is preserved and its id is not replaced.
47
+ *
48
+ * @param edge - The edge to add
49
+ * @throws {InvalidEdgeError} When `edge.from === edge.to`
50
+ */
51
+ addEdge(edge: Edge): void;
52
+ /**
53
+ * Retrieve a specific edge by its id, searching across all sessions.
54
+ *
55
+ * @param id - The edge's unique identifier
56
+ * @returns The edge, or `undefined` if not found
57
+ */
58
+ getEdge(id: string): Edge | undefined;
59
+ /**
60
+ * Get all outgoing edges from a thought, sorted by `createdAt` ascending.
61
+ *
62
+ * @param sessionId - Session to query within
63
+ * @param from - Source thought id
64
+ * @returns Array of outgoing edges (empty if none / unknown session)
65
+ */
66
+ outgoing(sessionId: SessionId, from: string): readonly Edge[];
67
+ /**
68
+ * Get all incoming edges to a thought, sorted by `createdAt` ascending.
69
+ *
70
+ * @param sessionId - Session to query within
71
+ * @param to - Target thought id
72
+ * @returns Array of incoming edges (empty if none / unknown session)
73
+ */
74
+ incoming(sessionId: SessionId, to: string): readonly Edge[];
75
+ /**
76
+ * Get all edges in a session, sorted by `createdAt` ascending.
77
+ *
78
+ * @param sessionId - Session to query
79
+ * @returns All edges in the session (empty if unknown session)
80
+ */
81
+ edgesForSession(sessionId: SessionId): readonly Edge[];
82
+ /**
83
+ * Remove edges whose source or target is absent from the retained thought set.
84
+ * Rebuilds all indexes before replacing the session container atomically.
85
+ *
86
+ * @param sessionId - Session whose edges should be pruned
87
+ * @param retainedThoughtIds - Union of retained thought ids for the session
88
+ * @param retainedBranchThoughtIds - Retained targets for branch edges
89
+ * @returns The exact number of removed edges
90
+ */
91
+ pruneSession(sessionId: SessionId, retainedThoughtIds: ReadonlySet<ThoughtId>, retainedBranchThoughtIds?: ReadonlySet<ThoughtId>): number;
92
+ /**
93
+ * Clear all edges for a specific session. Other sessions are unaffected.
94
+ *
95
+ * @param sessionId - Session to clear
96
+ */
97
+ clearSession(sessionId: SessionId): void;
98
+ clearAll(): void;
99
+ /**
100
+ * Count edges, optionally scoped to one session.
101
+ *
102
+ * @param sessionId - If provided, count only that session's edges
103
+ * @returns Total edge count
104
+ */
105
+ size(sessionId?: SessionId): number;
106
+ /**
107
+ * Get an existing session container or create a new empty one.
108
+ */
109
+ private _getOrCreateSession;
110
+ /**
111
+ * Insert an edge into an adjacency bucket, maintaining ascending
112
+ * `createdAt` order. Uses binary search to keep insertion at O(log n).
113
+ */
114
+ private _insertSorted;
115
+ }
116
+ //# sourceMappingURL=EdgeStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeStore.d.ts","sourceRoot":"","sources":["../../../src/core/graph/EdgeStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAIN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWtC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IAErE;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAwBzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAUrC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,IAAI,EAAE;IAQ7D;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,IAAI,EAAE;IAQ3D;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,IAAI,EAAE;IAQtD;;;;;;;;OAQG;IACH,YAAY,CACX,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,WAAW,CAAC,SAAS,CAAC,EAC1C,wBAAwB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAC/C,MAAM;IAkCT;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,QAAQ,IAAI,IAAI;IAIhB;;;;;OAKG;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM;IAYnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;;OAGG;IACH,OAAO,CAAC,aAAa;CAoBrB"}
@@ -0,0 +1,107 @@
1
+ import { asEdgeId, asThoughtId } from "../../contracts/ids.js";
2
+ import { InvalidEdgeError } from "../../errors.js";
3
+ class EdgeStore {
4
+ _sessions = new Map();
5
+ addEdge(edge) {
6
+ if (edge.from === edge.to) throw new InvalidEdgeError(`Self-edge not allowed: from and to are the same (${edge.from})`);
7
+ const session = this._getOrCreateSession(edge.sessionId);
8
+ const existing = session.outgoing.get(edge.from);
9
+ if (existing) {
10
+ for (const candidate of existing)if (candidate.to === edge.to && candidate.kind === edge.kind) return;
11
+ }
12
+ session.byId.set(edge.id, edge);
13
+ this._insertSorted(session.outgoing, edge.from, edge);
14
+ this._insertSorted(session.incoming, edge.to, edge);
15
+ }
16
+ getEdge(id) {
17
+ for (const session of this._sessions.values()){
18
+ const edge = session.byId.get(asEdgeId(id));
19
+ if (edge) return edge;
20
+ }
21
+ }
22
+ outgoing(sessionId, from) {
23
+ const session = this._sessions.get(sessionId);
24
+ if (!session) return [];
25
+ return session.outgoing.get(asThoughtId(from)) ?? [];
26
+ }
27
+ incoming(sessionId, to) {
28
+ const session = this._sessions.get(sessionId);
29
+ if (!session) return [];
30
+ return session.incoming.get(asThoughtId(to)) ?? [];
31
+ }
32
+ edgesForSession(sessionId) {
33
+ const session = this._sessions.get(sessionId);
34
+ if (!session) return [];
35
+ return Array.from(session.byId.values()).sort((a, b)=>a.createdAt - b.createdAt);
36
+ }
37
+ pruneSession(sessionId, retainedThoughtIds, retainedBranchThoughtIds) {
38
+ const session = this._sessions.get(sessionId);
39
+ if (!session) return 0;
40
+ const retainedEdges = Array.from(session.byId.values()).filter((edge)=>{
41
+ if (!retainedThoughtIds.has(edge.from) || !retainedThoughtIds.has(edge.to)) return false;
42
+ return 'branch' !== edge.kind || void 0 === retainedBranchThoughtIds || retainedBranchThoughtIds.has(edge.to);
43
+ });
44
+ const removed = session.byId.size - retainedEdges.length;
45
+ if (0 === retainedEdges.length) {
46
+ this._sessions.delete(sessionId);
47
+ return removed;
48
+ }
49
+ const rebuilt = {
50
+ byId: new Map(),
51
+ outgoing: new Map(),
52
+ incoming: new Map()
53
+ };
54
+ for (const edge of retainedEdges){
55
+ rebuilt.byId.set(edge.id, edge);
56
+ this._insertSorted(rebuilt.outgoing, edge.from, edge);
57
+ this._insertSorted(rebuilt.incoming, edge.to, edge);
58
+ }
59
+ this._sessions.set(sessionId, rebuilt);
60
+ return removed;
61
+ }
62
+ clearSession(sessionId) {
63
+ this._sessions.delete(sessionId);
64
+ }
65
+ clearAll() {
66
+ this._sessions.clear();
67
+ }
68
+ size(sessionId) {
69
+ if (void 0 !== sessionId) {
70
+ const session = this._sessions.get(sessionId);
71
+ return session ? session.byId.size : 0;
72
+ }
73
+ let total = 0;
74
+ for (const session of this._sessions.values())total += session.byId.size;
75
+ return total;
76
+ }
77
+ _getOrCreateSession(sessionId) {
78
+ let session = this._sessions.get(sessionId);
79
+ if (!session) {
80
+ session = {
81
+ byId: new Map(),
82
+ outgoing: new Map(),
83
+ incoming: new Map()
84
+ };
85
+ this._sessions.set(sessionId, session);
86
+ }
87
+ return session;
88
+ }
89
+ _insertSorted(index, key, edge) {
90
+ let bucket = index.get(key);
91
+ if (!bucket) {
92
+ bucket = [];
93
+ index.set(key, bucket);
94
+ }
95
+ let lo = 0;
96
+ let hi = bucket.length;
97
+ while(lo < hi){
98
+ const mid = lo + hi >>> 1;
99
+ if (bucket[mid].createdAt <= edge.createdAt) lo = mid + 1;
100
+ else hi = mid;
101
+ }
102
+ bucket.splice(lo, 0, edge);
103
+ }
104
+ }
105
+ export { EdgeStore };
106
+
107
+ //# sourceMappingURL=EdgeStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core/graph/EdgeStore.js","sources":["../../../src/core/graph/EdgeStore.ts"],"sourcesContent":["/**\n * EdgeStore — in-memory store for the thought DAG with per-session isolation.\n *\n * Stores directed edges between thoughts, keyed by their `id` field. Each\n * session maintains independent adjacency maps (outgoing/incoming) so that\n * edges in one session are invisible to another.\n *\n * The store is intentionally small and synchronous; it does not persist\n * anything and does not perform graph traversal. Strategy code consumes\n * `outgoing()` / `incoming()` to navigate the DAG.\n *\n * @module core/graph/EdgeStore\n */\n\nimport type { IEdgeStore } from '../../contracts/interfaces.js';\nimport {\n\tasEdgeId,\n\tasThoughtId,\n\ttype EdgeId,\n\ttype SessionId,\n\ttype ThoughtId,\n} from '../../contracts/ids.js';\nimport { InvalidEdgeError } from '../../errors.js';\nimport type { Edge } from './Edge.js';\n\n/**\n * Per-session adjacency container.\n */\ninterface SessionEdges {\n\treadonly byId: Map<EdgeId, Edge>;\n\treadonly outgoing: Map<ThoughtId, Edge[]>;\n\treadonly incoming: Map<ThoughtId, Edge[]>;\n}\n\n/**\n * In-memory implementation of {@link IEdgeStore}.\n *\n * Edges are stored per-session in three indexes:\n * - `byId`: edge id → edge (for `getEdge`)\n * - `outgoing`: from-id → edges sorted by `createdAt` ascending\n * - `incoming`: to-id → edges sorted by `createdAt` ascending\n *\n * @example\n * ```typescript\n * const store = new EdgeStore();\n * store.addEdge({\n * id: generateUlid(),\n * from: 'thought-1',\n * to: 'thought-2',\n * kind: 'sequence',\n * sessionId: 's1',\n * createdAt: Date.now(),\n * });\n * const out = store.outgoing('s1', 'thought-1');\n * ```\n */\nexport class EdgeStore implements IEdgeStore {\n\tprivate readonly _sessions: Map<SessionId, SessionEdges> = new Map();\n\n\t/**\n\t * Add a directed edge to the store.\n\t *\n\t * Self-edges (`from === to`) are rejected. Identical edges\n\t * (same `from`, `to`, `kind`, `sessionId`) are silently deduped — the\n\t * existing edge is preserved and its id is not replaced.\n\t *\n\t * @param edge - The edge to add\n\t * @throws {InvalidEdgeError} When `edge.from === edge.to`\n\t */\n\taddEdge(edge: Edge): void {\n\t\tif (edge.from === edge.to) {\n\t\t\tthrow new InvalidEdgeError(`Self-edge not allowed: from and to are the same (${edge.from})`);\n\t\t}\n\n\t\tconst session = this._getOrCreateSession(edge.sessionId);\n\n\t\t// Dedupe: if an edge with the same (from, to, kind) already exists in this\n\t\t// session, silently no-op. Searching the smaller `outgoing` bucket avoids\n\t\t// scanning every edge in the session.\n\t\tconst existing = session.outgoing.get(edge.from);\n\t\tif (existing) {\n\t\t\tfor (const candidate of existing) {\n\t\t\t\tif (candidate.to === edge.to && candidate.kind === edge.kind) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsession.byId.set(edge.id, edge);\n\t\tthis._insertSorted(session.outgoing, edge.from, edge);\n\t\tthis._insertSorted(session.incoming, edge.to, edge);\n\t}\n\n\t/**\n\t * Retrieve a specific edge by its id, searching across all sessions.\n\t *\n\t * @param id - The edge's unique identifier\n\t * @returns The edge, or `undefined` if not found\n\t */\n\tgetEdge(id: string): Edge | undefined {\n\t\tfor (const session of this._sessions.values()) {\n\t\t\tconst edge = session.byId.get(asEdgeId(id));\n\t\t\tif (edge) {\n\t\t\t\treturn edge;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Get all outgoing edges from a thought, sorted by `createdAt` ascending.\n\t *\n\t * @param sessionId - Session to query within\n\t * @param from - Source thought id\n\t * @returns Array of outgoing edges (empty if none / unknown session)\n\t */\n\toutgoing(sessionId: SessionId, from: string): readonly Edge[] {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn [];\n\t\t}\n\t\treturn session.outgoing.get(asThoughtId(from)) ?? [];\n\t}\n\n\t/**\n\t * Get all incoming edges to a thought, sorted by `createdAt` ascending.\n\t *\n\t * @param sessionId - Session to query within\n\t * @param to - Target thought id\n\t * @returns Array of incoming edges (empty if none / unknown session)\n\t */\n\tincoming(sessionId: SessionId, to: string): readonly Edge[] {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn [];\n\t\t}\n\t\treturn session.incoming.get(asThoughtId(to)) ?? [];\n\t}\n\n\t/**\n\t * Get all edges in a session, sorted by `createdAt` ascending.\n\t *\n\t * @param sessionId - Session to query\n\t * @returns All edges in the session (empty if unknown session)\n\t */\n\tedgesForSession(sessionId: SessionId): readonly Edge[] {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Array.from(session.byId.values()).sort((a, b) => a.createdAt - b.createdAt);\n\t}\n\n\t/**\n\t * Remove edges whose source or target is absent from the retained thought set.\n\t * Rebuilds all indexes before replacing the session container atomically.\n\t *\n\t * @param sessionId - Session whose edges should be pruned\n\t * @param retainedThoughtIds - Union of retained thought ids for the session\n\t * @param retainedBranchThoughtIds - Retained targets for branch edges\n\t * @returns The exact number of removed edges\n\t */\n\tpruneSession(\n\t\tsessionId: SessionId,\n\t\tretainedThoughtIds: ReadonlySet<ThoughtId>,\n\t\tretainedBranchThoughtIds?: ReadonlySet<ThoughtId>\n\t): number {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst retainedEdges = Array.from(session.byId.values()).filter((edge) => {\n\t\t\tif (!retainedThoughtIds.has(edge.from) || !retainedThoughtIds.has(edge.to)) return false;\n\t\t\treturn (\n\t\t\t\tedge.kind !== 'branch' ||\n\t\t\t\tretainedBranchThoughtIds === undefined ||\n\t\t\t\tretainedBranchThoughtIds.has(edge.to)\n\t\t\t);\n\t\t});\n\t\tconst removed = session.byId.size - retainedEdges.length;\n\t\tif (retainedEdges.length === 0) {\n\t\t\tthis._sessions.delete(sessionId);\n\t\t\treturn removed;\n\t\t}\n\n\t\tconst rebuilt: SessionEdges = {\n\t\t\tbyId: new Map<EdgeId, Edge>(),\n\t\t\toutgoing: new Map<ThoughtId, Edge[]>(),\n\t\t\tincoming: new Map<ThoughtId, Edge[]>(),\n\t\t};\n\t\tfor (const edge of retainedEdges) {\n\t\t\trebuilt.byId.set(edge.id, edge);\n\t\t\tthis._insertSorted(rebuilt.outgoing, edge.from, edge);\n\t\t\tthis._insertSorted(rebuilt.incoming, edge.to, edge);\n\t\t}\n\t\tthis._sessions.set(sessionId, rebuilt);\n\t\treturn removed;\n\t}\n\n\t/**\n\t * Clear all edges for a specific session. Other sessions are unaffected.\n\t *\n\t * @param sessionId - Session to clear\n\t */\n\tclearSession(sessionId: SessionId): void {\n\t\tthis._sessions.delete(sessionId);\n\t}\n\n\tclearAll(): void {\n\t\tthis._sessions.clear();\n\t}\n\n\t/**\n\t * Count edges, optionally scoped to one session.\n\t *\n\t * @param sessionId - If provided, count only that session's edges\n\t * @returns Total edge count\n\t */\n\tsize(sessionId?: SessionId): number {\n\t\tif (sessionId !== undefined) {\n\t\t\tconst session = this._sessions.get(sessionId);\n\t\t\treturn session ? session.byId.size : 0;\n\t\t}\n\t\tlet total = 0;\n\t\tfor (const session of this._sessions.values()) {\n\t\t\ttotal += session.byId.size;\n\t\t}\n\t\treturn total;\n\t}\n\n\t/**\n\t * Get an existing session container or create a new empty one.\n\t */\n\tprivate _getOrCreateSession(sessionId: SessionId): SessionEdges {\n\t\tlet session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\tsession = {\n\t\t\t\tbyId: new Map<EdgeId, Edge>(),\n\t\t\t\toutgoing: new Map<ThoughtId, Edge[]>(),\n\t\t\t\tincoming: new Map<ThoughtId, Edge[]>(),\n\t\t\t};\n\t\t\tthis._sessions.set(sessionId, session);\n\t\t}\n\t\treturn session;\n\t}\n\n\t/**\n\t * Insert an edge into an adjacency bucket, maintaining ascending\n\t * `createdAt` order. Uses binary search to keep insertion at O(log n).\n\t */\n\tprivate _insertSorted<K>(index: Map<K, Edge[]>, key: K, edge: Edge): void {\n\t\tlet bucket = index.get(key);\n\t\tif (!bucket) {\n\t\t\tbucket = [];\n\t\t\tindex.set(key, bucket);\n\t\t}\n\n\t\t// Binary search for insertion index.\n\t\tlet lo = 0;\n\t\tlet hi = bucket.length;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = (lo + hi) >>> 1;\n\t\t\tif (bucket[mid]!.createdAt <= edge.createdAt) {\n\t\t\t\tlo = mid + 1;\n\t\t\t} else {\n\t\t\t\thi = mid;\n\t\t\t}\n\t\t}\n\t\tbucket.splice(lo, 0, edge);\n\t}\n}\n"],"names":["EdgeStore","Map","edge","InvalidEdgeError","session","existing","candidate","id","asEdgeId","sessionId","from","asThoughtId","to","Array","a","b","retainedThoughtIds","retainedBranchThoughtIds","retainedEdges","undefined","removed","rebuilt","total","index","key","bucket","lo","hi","mid"],"mappings":"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"}