0agent 1.0.2 → 1.0.4

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 (431) hide show
  1. package/bin/0agent.js +26 -14
  2. package/dist/daemon.mjs +2644 -0
  3. package/package.json +7 -17
  4. package/packages/core/dist/bootstrap/BootstrapProtocol.d.ts +0 -37
  5. package/packages/core/dist/bootstrap/BootstrapProtocol.d.ts.map +0 -1
  6. package/packages/core/dist/bootstrap/BootstrapProtocol.js +0 -82
  7. package/packages/core/dist/bootstrap/BootstrapProtocol.js.map +0 -1
  8. package/packages/core/dist/bootstrap/GraphConstructor.d.ts +0 -44
  9. package/packages/core/dist/bootstrap/GraphConstructor.d.ts.map +0 -1
  10. package/packages/core/dist/bootstrap/GraphConstructor.js +0 -160
  11. package/packages/core/dist/bootstrap/GraphConstructor.js.map +0 -1
  12. package/packages/core/dist/bootstrap/HypothesisManager.d.ts +0 -50
  13. package/packages/core/dist/bootstrap/HypothesisManager.d.ts.map +0 -1
  14. package/packages/core/dist/bootstrap/HypothesisManager.js +0 -108
  15. package/packages/core/dist/bootstrap/HypothesisManager.js.map +0 -1
  16. package/packages/core/dist/bootstrap/StagedMutations.d.ts +0 -50
  17. package/packages/core/dist/bootstrap/StagedMutations.d.ts.map +0 -1
  18. package/packages/core/dist/bootstrap/StagedMutations.js +0 -80
  19. package/packages/core/dist/bootstrap/StagedMutations.js.map +0 -1
  20. package/packages/core/dist/concurrency/EdgeWeightUpdater.d.ts +0 -16
  21. package/packages/core/dist/concurrency/EdgeWeightUpdater.d.ts.map +0 -1
  22. package/packages/core/dist/concurrency/EdgeWeightUpdater.js +0 -57
  23. package/packages/core/dist/concurrency/EdgeWeightUpdater.js.map +0 -1
  24. package/packages/core/dist/concurrency/SessionSnapshot.d.ts +0 -63
  25. package/packages/core/dist/concurrency/SessionSnapshot.d.ts.map +0 -1
  26. package/packages/core/dist/concurrency/SessionSnapshot.js +0 -124
  27. package/packages/core/dist/concurrency/SessionSnapshot.js.map +0 -1
  28. package/packages/core/dist/embedding/HNSWIndex.d.ts +0 -37
  29. package/packages/core/dist/embedding/HNSWIndex.d.ts.map +0 -1
  30. package/packages/core/dist/embedding/HNSWIndex.js +0 -86
  31. package/packages/core/dist/embedding/HNSWIndex.js.map +0 -1
  32. package/packages/core/dist/embedding/MultimodalEmbedder.d.ts +0 -24
  33. package/packages/core/dist/embedding/MultimodalEmbedder.d.ts.map +0 -1
  34. package/packages/core/dist/embedding/MultimodalEmbedder.js +0 -75
  35. package/packages/core/dist/embedding/MultimodalEmbedder.js.map +0 -1
  36. package/packages/core/dist/embedding/adapters/NomicAdapter.d.ts +0 -7
  37. package/packages/core/dist/embedding/adapters/NomicAdapter.d.ts.map +0 -1
  38. package/packages/core/dist/embedding/adapters/NomicAdapter.js +0 -11
  39. package/packages/core/dist/embedding/adapters/NomicAdapter.js.map +0 -1
  40. package/packages/core/dist/embedding/adapters/OllamaAdapter.d.ts +0 -19
  41. package/packages/core/dist/embedding/adapters/OllamaAdapter.d.ts.map +0 -1
  42. package/packages/core/dist/embedding/adapters/OllamaAdapter.js +0 -27
  43. package/packages/core/dist/embedding/adapters/OllamaAdapter.js.map +0 -1
  44. package/packages/core/dist/embedding/adapters/OpenAIAdapter.d.ts +0 -14
  45. package/packages/core/dist/embedding/adapters/OpenAIAdapter.d.ts.map +0 -1
  46. package/packages/core/dist/embedding/adapters/OpenAIAdapter.js +0 -48
  47. package/packages/core/dist/embedding/adapters/OpenAIAdapter.js.map +0 -1
  48. package/packages/core/dist/engine/CreditAttribution.d.ts +0 -47
  49. package/packages/core/dist/engine/CreditAttribution.d.ts.map +0 -1
  50. package/packages/core/dist/engine/CreditAttribution.js +0 -196
  51. package/packages/core/dist/engine/CreditAttribution.js.map +0 -1
  52. package/packages/core/dist/engine/DecayScheduler.d.ts +0 -45
  53. package/packages/core/dist/engine/DecayScheduler.d.ts.map +0 -1
  54. package/packages/core/dist/engine/DecayScheduler.js +0 -115
  55. package/packages/core/dist/engine/DecayScheduler.js.map +0 -1
  56. package/packages/core/dist/engine/InferenceEngine.d.ts +0 -95
  57. package/packages/core/dist/engine/InferenceEngine.d.ts.map +0 -1
  58. package/packages/core/dist/engine/InferenceEngine.js +0 -242
  59. package/packages/core/dist/engine/InferenceEngine.js.map +0 -1
  60. package/packages/core/dist/engine/SelectionPolicy.d.ts +0 -29
  61. package/packages/core/dist/engine/SelectionPolicy.d.ts.map +0 -1
  62. package/packages/core/dist/engine/SelectionPolicy.js +0 -58
  63. package/packages/core/dist/engine/SelectionPolicy.js.map +0 -1
  64. package/packages/core/dist/engine/SelfImprovementEngine.d.ts +0 -58
  65. package/packages/core/dist/engine/SelfImprovementEngine.d.ts.map +0 -1
  66. package/packages/core/dist/engine/SelfImprovementEngine.js +0 -265
  67. package/packages/core/dist/engine/SelfImprovementEngine.js.map +0 -1
  68. package/packages/core/dist/engine/SelfImprovementPrompt.d.ts +0 -10
  69. package/packages/core/dist/engine/SelfImprovementPrompt.d.ts.map +0 -1
  70. package/packages/core/dist/engine/SelfImprovementPrompt.js +0 -193
  71. package/packages/core/dist/engine/SelfImprovementPrompt.js.map +0 -1
  72. package/packages/core/dist/engine/WeightPropagation.d.ts +0 -77
  73. package/packages/core/dist/engine/WeightPropagation.d.ts.map +0 -1
  74. package/packages/core/dist/engine/WeightPropagation.js +0 -101
  75. package/packages/core/dist/engine/WeightPropagation.js.map +0 -1
  76. package/packages/core/dist/engine/WorkflowSuggestionEngine.d.ts +0 -26
  77. package/packages/core/dist/engine/WorkflowSuggestionEngine.d.ts.map +0 -1
  78. package/packages/core/dist/engine/WorkflowSuggestionEngine.js +0 -54
  79. package/packages/core/dist/engine/WorkflowSuggestionEngine.js.map +0 -1
  80. package/packages/core/dist/entity/AliasIndex.d.ts +0 -39
  81. package/packages/core/dist/entity/AliasIndex.d.ts.map +0 -1
  82. package/packages/core/dist/entity/AliasIndex.js +0 -81
  83. package/packages/core/dist/entity/AliasIndex.js.map +0 -1
  84. package/packages/core/dist/entity/ContextActivator.d.ts +0 -53
  85. package/packages/core/dist/entity/ContextActivator.d.ts.map +0 -1
  86. package/packages/core/dist/entity/ContextActivator.js +0 -163
  87. package/packages/core/dist/entity/ContextActivator.js.map +0 -1
  88. package/packages/core/dist/entity/EntityHierarchy.d.ts +0 -48
  89. package/packages/core/dist/entity/EntityHierarchy.d.ts.map +0 -1
  90. package/packages/core/dist/entity/EntityHierarchy.js +0 -134
  91. package/packages/core/dist/entity/EntityHierarchy.js.map +0 -1
  92. package/packages/core/dist/entity/EntityResolutionPipeline.d.ts +0 -48
  93. package/packages/core/dist/entity/EntityResolutionPipeline.d.ts.map +0 -1
  94. package/packages/core/dist/entity/EntityResolutionPipeline.js +0 -221
  95. package/packages/core/dist/entity/EntityResolutionPipeline.js.map +0 -1
  96. package/packages/core/dist/entity/MCPEnrichedResolver.d.ts +0 -17
  97. package/packages/core/dist/entity/MCPEnrichedResolver.d.ts.map +0 -1
  98. package/packages/core/dist/entity/MCPEnrichedResolver.js +0 -19
  99. package/packages/core/dist/entity/MCPEnrichedResolver.js.map +0 -1
  100. package/packages/core/dist/entity/NodeResolutionService.d.ts +0 -46
  101. package/packages/core/dist/entity/NodeResolutionService.d.ts.map +0 -1
  102. package/packages/core/dist/entity/NodeResolutionService.js +0 -150
  103. package/packages/core/dist/entity/NodeResolutionService.js.map +0 -1
  104. package/packages/core/dist/entity/PersonalityAccumulator.d.ts +0 -41
  105. package/packages/core/dist/entity/PersonalityAccumulator.d.ts.map +0 -1
  106. package/packages/core/dist/entity/PersonalityAccumulator.js +0 -126
  107. package/packages/core/dist/entity/PersonalityAccumulator.js.map +0 -1
  108. package/packages/core/dist/entity/PersonalityProfile.d.ts +0 -31
  109. package/packages/core/dist/entity/PersonalityProfile.d.ts.map +0 -1
  110. package/packages/core/dist/entity/PersonalityProfile.js +0 -94
  111. package/packages/core/dist/entity/PersonalityProfile.js.map +0 -1
  112. package/packages/core/dist/entity/index.d.ts +0 -4
  113. package/packages/core/dist/entity/index.d.ts.map +0 -1
  114. package/packages/core/dist/entity/index.js +0 -4
  115. package/packages/core/dist/entity/index.js.map +0 -1
  116. package/packages/core/dist/graph/GraphEdge.d.ts +0 -37
  117. package/packages/core/dist/graph/GraphEdge.d.ts.map +0 -1
  118. package/packages/core/dist/graph/GraphEdge.js +0 -29
  119. package/packages/core/dist/graph/GraphEdge.js.map +0 -1
  120. package/packages/core/dist/graph/GraphNode.d.ts +0 -52
  121. package/packages/core/dist/graph/GraphNode.d.ts.map +0 -1
  122. package/packages/core/dist/graph/GraphNode.js +0 -41
  123. package/packages/core/dist/graph/GraphNode.js.map +0 -1
  124. package/packages/core/dist/graph/GraphQuery.d.ts +0 -46
  125. package/packages/core/dist/graph/GraphQuery.d.ts.map +0 -1
  126. package/packages/core/dist/graph/GraphQuery.js +0 -47
  127. package/packages/core/dist/graph/GraphQuery.js.map +0 -1
  128. package/packages/core/dist/graph/KnowledgeGraph.d.ts +0 -38
  129. package/packages/core/dist/graph/KnowledgeGraph.d.ts.map +0 -1
  130. package/packages/core/dist/graph/KnowledgeGraph.js +0 -345
  131. package/packages/core/dist/graph/KnowledgeGraph.js.map +0 -1
  132. package/packages/core/dist/graph/SubGraph.d.ts +0 -36
  133. package/packages/core/dist/graph/SubGraph.d.ts.map +0 -1
  134. package/packages/core/dist/graph/SubGraph.js +0 -86
  135. package/packages/core/dist/graph/SubGraph.js.map +0 -1
  136. package/packages/core/dist/index.d.ts +0 -54
  137. package/packages/core/dist/index.d.ts.map +0 -1
  138. package/packages/core/dist/index.js +0 -62
  139. package/packages/core/dist/index.js.map +0 -1
  140. package/packages/core/dist/maintenance/CompactionOrchestrator.d.ts +0 -22
  141. package/packages/core/dist/maintenance/CompactionOrchestrator.d.ts.map +0 -1
  142. package/packages/core/dist/maintenance/CompactionOrchestrator.js +0 -62
  143. package/packages/core/dist/maintenance/CompactionOrchestrator.js.map +0 -1
  144. package/packages/core/dist/maintenance/EdgePruner.d.ts +0 -20
  145. package/packages/core/dist/maintenance/EdgePruner.d.ts.map +0 -1
  146. package/packages/core/dist/maintenance/EdgePruner.js +0 -65
  147. package/packages/core/dist/maintenance/EdgePruner.js.map +0 -1
  148. package/packages/core/dist/maintenance/GraphCheckpoint.d.ts +0 -51
  149. package/packages/core/dist/maintenance/GraphCheckpoint.d.ts.map +0 -1
  150. package/packages/core/dist/maintenance/GraphCheckpoint.js +0 -81
  151. package/packages/core/dist/maintenance/GraphCheckpoint.js.map +0 -1
  152. package/packages/core/dist/maintenance/GraphRollback.d.ts +0 -36
  153. package/packages/core/dist/maintenance/GraphRollback.d.ts.map +0 -1
  154. package/packages/core/dist/maintenance/GraphRollback.js +0 -154
  155. package/packages/core/dist/maintenance/GraphRollback.js.map +0 -1
  156. package/packages/core/dist/maintenance/NodeDeduplicator.d.ts +0 -26
  157. package/packages/core/dist/maintenance/NodeDeduplicator.d.ts.map +0 -1
  158. package/packages/core/dist/maintenance/NodeDeduplicator.js +0 -171
  159. package/packages/core/dist/maintenance/NodeDeduplicator.js.map +0 -1
  160. package/packages/core/dist/maintenance/SubgraphArchiver.d.ts +0 -18
  161. package/packages/core/dist/maintenance/SubgraphArchiver.d.ts.map +0 -1
  162. package/packages/core/dist/maintenance/SubgraphArchiver.js +0 -180
  163. package/packages/core/dist/maintenance/SubgraphArchiver.js.map +0 -1
  164. package/packages/core/dist/memory/ArchivalMemory.d.ts +0 -28
  165. package/packages/core/dist/memory/ArchivalMemory.d.ts.map +0 -1
  166. package/packages/core/dist/memory/ArchivalMemory.js +0 -26
  167. package/packages/core/dist/memory/ArchivalMemory.js.map +0 -1
  168. package/packages/core/dist/memory/BlinkingMemory.d.ts +0 -34
  169. package/packages/core/dist/memory/BlinkingMemory.d.ts.map +0 -1
  170. package/packages/core/dist/memory/BlinkingMemory.js +0 -44
  171. package/packages/core/dist/memory/BlinkingMemory.js.map +0 -1
  172. package/packages/core/dist/memory/WorkingMemory.d.ts +0 -38
  173. package/packages/core/dist/memory/WorkingMemory.d.ts.map +0 -1
  174. package/packages/core/dist/memory/WorkingMemory.js +0 -70
  175. package/packages/core/dist/memory/WorkingMemory.js.map +0 -1
  176. package/packages/core/dist/storage/ObjectStore.d.ts +0 -24
  177. package/packages/core/dist/storage/ObjectStore.d.ts.map +0 -1
  178. package/packages/core/dist/storage/ObjectStore.js +0 -50
  179. package/packages/core/dist/storage/ObjectStore.js.map +0 -1
  180. package/packages/core/dist/storage/TraceStore.d.ts +0 -16
  181. package/packages/core/dist/storage/TraceStore.d.ts.map +0 -1
  182. package/packages/core/dist/storage/TraceStore.js +0 -19
  183. package/packages/core/dist/storage/TraceStore.js.map +0 -1
  184. package/packages/core/dist/storage/WeightEventLog.d.ts +0 -11
  185. package/packages/core/dist/storage/WeightEventLog.d.ts.map +0 -1
  186. package/packages/core/dist/storage/WeightEventLog.js +0 -16
  187. package/packages/core/dist/storage/WeightEventLog.js.map +0 -1
  188. package/packages/core/dist/storage/adapters/SQLiteAdapter.d.ts +0 -86
  189. package/packages/core/dist/storage/adapters/SQLiteAdapter.d.ts.map +0 -1
  190. package/packages/core/dist/storage/adapters/SQLiteAdapter.js +0 -514
  191. package/packages/core/dist/storage/adapters/SQLiteAdapter.js.map +0 -1
  192. package/packages/core/dist/trace/DeferredTrace.d.ts +0 -43
  193. package/packages/core/dist/trace/DeferredTrace.d.ts.map +0 -1
  194. package/packages/core/dist/trace/DeferredTrace.js +0 -44
  195. package/packages/core/dist/trace/DeferredTrace.js.map +0 -1
  196. package/packages/core/dist/trace/OutcomeTrace.d.ts +0 -38
  197. package/packages/core/dist/trace/OutcomeTrace.d.ts.map +0 -1
  198. package/packages/core/dist/trace/OutcomeTrace.js +0 -9
  199. package/packages/core/dist/trace/OutcomeTrace.js.map +0 -1
  200. package/packages/core/dist/trace/SkillTraceDecorator.d.ts +0 -25
  201. package/packages/core/dist/trace/SkillTraceDecorator.d.ts.map +0 -1
  202. package/packages/core/dist/trace/SkillTraceDecorator.js +0 -41
  203. package/packages/core/dist/trace/SkillTraceDecorator.js.map +0 -1
  204. package/packages/core/dist/trace/TraceReplay.d.ts +0 -25
  205. package/packages/core/dist/trace/TraceReplay.d.ts.map +0 -1
  206. package/packages/core/dist/trace/TraceReplay.js +0 -40
  207. package/packages/core/dist/trace/TraceReplay.js.map +0 -1
  208. package/packages/core/dist/trace/TraversalLedger.d.ts +0 -33
  209. package/packages/core/dist/trace/TraversalLedger.d.ts.map +0 -1
  210. package/packages/core/dist/trace/TraversalLedger.js +0 -61
  211. package/packages/core/dist/trace/TraversalLedger.js.map +0 -1
  212. package/packages/core/dist/types/SelfImprovement.d.ts +0 -174
  213. package/packages/core/dist/types/SelfImprovement.d.ts.map +0 -1
  214. package/packages/core/dist/types/SelfImprovement.js +0 -23
  215. package/packages/core/dist/types/SelfImprovement.js.map +0 -1
  216. package/packages/core/dist/types/SkillDefinition.d.ts +0 -68
  217. package/packages/core/dist/types/SkillDefinition.d.ts.map +0 -1
  218. package/packages/core/dist/types/SkillDefinition.js +0 -12
  219. package/packages/core/dist/types/SkillDefinition.js.map +0 -1
  220. package/packages/core/package.json +0 -25
  221. package/packages/daemon/dist/BackgroundWorkers.d.ts +0 -55
  222. package/packages/daemon/dist/BackgroundWorkers.d.ts.map +0 -1
  223. package/packages/daemon/dist/BackgroundWorkers.js +0 -121
  224. package/packages/daemon/dist/BackgroundWorkers.js.map +0 -1
  225. package/packages/daemon/dist/EntityScopedContext.d.ts +0 -22
  226. package/packages/daemon/dist/EntityScopedContext.d.ts.map +0 -1
  227. package/packages/daemon/dist/EntityScopedContext.js +0 -85
  228. package/packages/daemon/dist/EntityScopedContext.js.map +0 -1
  229. package/packages/daemon/dist/HTTPServer.d.ts +0 -27
  230. package/packages/daemon/dist/HTTPServer.d.ts.map +0 -1
  231. package/packages/daemon/dist/HTTPServer.js +0 -62
  232. package/packages/daemon/dist/HTTPServer.js.map +0 -1
  233. package/packages/daemon/dist/SessionManager.d.ts +0 -95
  234. package/packages/daemon/dist/SessionManager.d.ts.map +0 -1
  235. package/packages/daemon/dist/SessionManager.js +0 -205
  236. package/packages/daemon/dist/SessionManager.js.map +0 -1
  237. package/packages/daemon/dist/SkillRegistry.d.ts +0 -34
  238. package/packages/daemon/dist/SkillRegistry.d.ts.map +0 -1
  239. package/packages/daemon/dist/SkillRegistry.js +0 -90
  240. package/packages/daemon/dist/SkillRegistry.js.map +0 -1
  241. package/packages/daemon/dist/SkillVariableResolver.d.ts +0 -24
  242. package/packages/daemon/dist/SkillVariableResolver.d.ts.map +0 -1
  243. package/packages/daemon/dist/SkillVariableResolver.js +0 -85
  244. package/packages/daemon/dist/SkillVariableResolver.js.map +0 -1
  245. package/packages/daemon/dist/WebSocketEvents.d.ts +0 -107
  246. package/packages/daemon/dist/WebSocketEvents.d.ts.map +0 -1
  247. package/packages/daemon/dist/WebSocketEvents.js +0 -111
  248. package/packages/daemon/dist/WebSocketEvents.js.map +0 -1
  249. package/packages/daemon/dist/ZeroAgentDaemon.d.ts +0 -39
  250. package/packages/daemon/dist/ZeroAgentDaemon.d.ts.map +0 -1
  251. package/packages/daemon/dist/ZeroAgentDaemon.js +0 -161
  252. package/packages/daemon/dist/ZeroAgentDaemon.js.map +0 -1
  253. package/packages/daemon/dist/config/ConfigSchema.d.ts +0 -631
  254. package/packages/daemon/dist/config/ConfigSchema.d.ts.map +0 -1
  255. package/packages/daemon/dist/config/ConfigSchema.js +0 -107
  256. package/packages/daemon/dist/config/ConfigSchema.js.map +0 -1
  257. package/packages/daemon/dist/config/DaemonConfig.d.ts +0 -10
  258. package/packages/daemon/dist/config/DaemonConfig.d.ts.map +0 -1
  259. package/packages/daemon/dist/config/DaemonConfig.js +0 -34
  260. package/packages/daemon/dist/config/DaemonConfig.js.map +0 -1
  261. package/packages/daemon/dist/index.d.ts +0 -10
  262. package/packages/daemon/dist/index.d.ts.map +0 -1
  263. package/packages/daemon/dist/index.js +0 -8
  264. package/packages/daemon/dist/index.js.map +0 -1
  265. package/packages/daemon/dist/routes/entities.d.ts +0 -6
  266. package/packages/daemon/dist/routes/entities.d.ts.map +0 -1
  267. package/packages/daemon/dist/routes/entities.js +0 -54
  268. package/packages/daemon/dist/routes/entities.js.map +0 -1
  269. package/packages/daemon/dist/routes/graph.d.ts +0 -6
  270. package/packages/daemon/dist/routes/graph.d.ts.map +0 -1
  271. package/packages/daemon/dist/routes/graph.js +0 -61
  272. package/packages/daemon/dist/routes/graph.js.map +0 -1
  273. package/packages/daemon/dist/routes/health.d.ts +0 -15
  274. package/packages/daemon/dist/routes/health.d.ts.map +0 -1
  275. package/packages/daemon/dist/routes/health.js +0 -11
  276. package/packages/daemon/dist/routes/health.js.map +0 -1
  277. package/packages/daemon/dist/routes/sessions.d.ts +0 -6
  278. package/packages/daemon/dist/routes/sessions.d.ts.map +0 -1
  279. package/packages/daemon/dist/routes/sessions.js +0 -43
  280. package/packages/daemon/dist/routes/sessions.js.map +0 -1
  281. package/packages/daemon/dist/routes/skills.d.ts +0 -6
  282. package/packages/daemon/dist/routes/skills.d.ts.map +0 -1
  283. package/packages/daemon/dist/routes/skills.js +0 -62
  284. package/packages/daemon/dist/routes/skills.js.map +0 -1
  285. package/packages/daemon/dist/routes/subagents.d.ts +0 -3
  286. package/packages/daemon/dist/routes/subagents.d.ts.map +0 -1
  287. package/packages/daemon/dist/routes/subagents.js +0 -14
  288. package/packages/daemon/dist/routes/subagents.js.map +0 -1
  289. package/packages/daemon/dist/routes/traces.d.ts +0 -6
  290. package/packages/daemon/dist/routes/traces.d.ts.map +0 -1
  291. package/packages/daemon/dist/routes/traces.js +0 -31
  292. package/packages/daemon/dist/routes/traces.js.map +0 -1
  293. package/packages/daemon/dist/start.d.ts +0 -7
  294. package/packages/daemon/dist/start.d.ts.map +0 -1
  295. package/packages/daemon/dist/start.js +0 -24
  296. package/packages/daemon/dist/start.js.map +0 -1
  297. package/packages/daemon/package.json +0 -29
  298. package/packages/mcp-hub/dist/FilteredProxy.d.ts +0 -20
  299. package/packages/mcp-hub/dist/FilteredProxy.d.ts.map +0 -1
  300. package/packages/mcp-hub/dist/FilteredProxy.js +0 -43
  301. package/packages/mcp-hub/dist/FilteredProxy.js.map +0 -1
  302. package/packages/mcp-hub/dist/MCPDiscovery.d.ts +0 -18
  303. package/packages/mcp-hub/dist/MCPDiscovery.d.ts.map +0 -1
  304. package/packages/mcp-hub/dist/MCPDiscovery.js +0 -86
  305. package/packages/mcp-hub/dist/MCPDiscovery.js.map +0 -1
  306. package/packages/mcp-hub/dist/MCPHub.d.ts +0 -48
  307. package/packages/mcp-hub/dist/MCPHub.d.ts.map +0 -1
  308. package/packages/mcp-hub/dist/MCPHub.js +0 -100
  309. package/packages/mcp-hub/dist/MCPHub.js.map +0 -1
  310. package/packages/mcp-hub/dist/builtin/BrowserMCP.d.ts +0 -6
  311. package/packages/mcp-hub/dist/builtin/BrowserMCP.d.ts.map +0 -1
  312. package/packages/mcp-hub/dist/builtin/BrowserMCP.js +0 -69
  313. package/packages/mcp-hub/dist/builtin/BrowserMCP.js.map +0 -1
  314. package/packages/mcp-hub/dist/builtin/FilesystemMCP.d.ts +0 -11
  315. package/packages/mcp-hub/dist/builtin/FilesystemMCP.d.ts.map +0 -1
  316. package/packages/mcp-hub/dist/builtin/FilesystemMCP.js +0 -104
  317. package/packages/mcp-hub/dist/builtin/FilesystemMCP.js.map +0 -1
  318. package/packages/mcp-hub/dist/builtin/MemoryMCP.d.ts +0 -9
  319. package/packages/mcp-hub/dist/builtin/MemoryMCP.d.ts.map +0 -1
  320. package/packages/mcp-hub/dist/builtin/MemoryMCP.js +0 -185
  321. package/packages/mcp-hub/dist/builtin/MemoryMCP.js.map +0 -1
  322. package/packages/mcp-hub/dist/builtin/ShellMCP.d.ts +0 -8
  323. package/packages/mcp-hub/dist/builtin/ShellMCP.d.ts.map +0 -1
  324. package/packages/mcp-hub/dist/builtin/ShellMCP.js +0 -74
  325. package/packages/mcp-hub/dist/builtin/ShellMCP.js.map +0 -1
  326. package/packages/mcp-hub/dist/index.d.ts +0 -9
  327. package/packages/mcp-hub/dist/index.d.ts.map +0 -1
  328. package/packages/mcp-hub/dist/index.js +0 -8
  329. package/packages/mcp-hub/dist/index.js.map +0 -1
  330. package/packages/mcp-hub/dist/types.d.ts +0 -30
  331. package/packages/mcp-hub/dist/types.d.ts.map +0 -1
  332. package/packages/mcp-hub/dist/types.js +0 -2
  333. package/packages/mcp-hub/dist/types.js.map +0 -1
  334. package/packages/mcp-hub/package.json +0 -21
  335. package/packages/subagent/dist/CapabilityToken.d.ts +0 -66
  336. package/packages/subagent/dist/CapabilityToken.d.ts.map +0 -1
  337. package/packages/subagent/dist/CapabilityToken.js +0 -120
  338. package/packages/subagent/dist/CapabilityToken.js.map +0 -1
  339. package/packages/subagent/dist/ResourceDefaults.d.ts +0 -16
  340. package/packages/subagent/dist/ResourceDefaults.d.ts.map +0 -1
  341. package/packages/subagent/dist/ResourceDefaults.js +0 -68
  342. package/packages/subagent/dist/ResourceDefaults.js.map +0 -1
  343. package/packages/subagent/dist/SkillInputResolver.d.ts +0 -30
  344. package/packages/subagent/dist/SkillInputResolver.d.ts.map +0 -1
  345. package/packages/subagent/dist/SkillInputResolver.js +0 -59
  346. package/packages/subagent/dist/SkillInputResolver.js.map +0 -1
  347. package/packages/subagent/dist/SkillInvoker.d.ts +0 -33
  348. package/packages/subagent/dist/SkillInvoker.d.ts.map +0 -1
  349. package/packages/subagent/dist/SkillInvoker.js +0 -69
  350. package/packages/subagent/dist/SkillInvoker.js.map +0 -1
  351. package/packages/subagent/dist/SubagentOrchestrator.d.ts +0 -52
  352. package/packages/subagent/dist/SubagentOrchestrator.d.ts.map +0 -1
  353. package/packages/subagent/dist/SubagentOrchestrator.js +0 -198
  354. package/packages/subagent/dist/SubagentOrchestrator.js.map +0 -1
  355. package/packages/subagent/dist/SubagentResult.d.ts +0 -34
  356. package/packages/subagent/dist/SubagentResult.d.ts.map +0 -1
  357. package/packages/subagent/dist/SubagentResult.js +0 -21
  358. package/packages/subagent/dist/SubagentResult.js.map +0 -1
  359. package/packages/subagent/dist/Watchdog.d.ts +0 -23
  360. package/packages/subagent/dist/Watchdog.d.ts.map +0 -1
  361. package/packages/subagent/dist/Watchdog.js +0 -44
  362. package/packages/subagent/dist/Watchdog.js.map +0 -1
  363. package/packages/subagent/dist/index.d.ts +0 -15
  364. package/packages/subagent/dist/index.d.ts.map +0 -1
  365. package/packages/subagent/dist/index.js +0 -23
  366. package/packages/subagent/dist/index.js.map +0 -1
  367. package/packages/subagent/dist/sandbox/BwrapBackend.d.ts +0 -14
  368. package/packages/subagent/dist/sandbox/BwrapBackend.d.ts.map +0 -1
  369. package/packages/subagent/dist/sandbox/BwrapBackend.js +0 -171
  370. package/packages/subagent/dist/sandbox/BwrapBackend.js.map +0 -1
  371. package/packages/subagent/dist/sandbox/CloudBackend.d.ts +0 -28
  372. package/packages/subagent/dist/sandbox/CloudBackend.d.ts.map +0 -1
  373. package/packages/subagent/dist/sandbox/CloudBackend.js +0 -52
  374. package/packages/subagent/dist/sandbox/CloudBackend.js.map +0 -1
  375. package/packages/subagent/dist/sandbox/DockerBackend.d.ts +0 -14
  376. package/packages/subagent/dist/sandbox/DockerBackend.d.ts.map +0 -1
  377. package/packages/subagent/dist/sandbox/DockerBackend.js +0 -149
  378. package/packages/subagent/dist/sandbox/DockerBackend.js.map +0 -1
  379. package/packages/subagent/dist/sandbox/FirecrackerBackend.d.ts +0 -17
  380. package/packages/subagent/dist/sandbox/FirecrackerBackend.d.ts.map +0 -1
  381. package/packages/subagent/dist/sandbox/FirecrackerBackend.js +0 -54
  382. package/packages/subagent/dist/sandbox/FirecrackerBackend.js.map +0 -1
  383. package/packages/subagent/dist/sandbox/PodmanBackend.d.ts +0 -13
  384. package/packages/subagent/dist/sandbox/PodmanBackend.d.ts.map +0 -1
  385. package/packages/subagent/dist/sandbox/PodmanBackend.js +0 -144
  386. package/packages/subagent/dist/sandbox/PodmanBackend.js.map +0 -1
  387. package/packages/subagent/dist/sandbox/ProcessBackend.d.ts +0 -16
  388. package/packages/subagent/dist/sandbox/ProcessBackend.d.ts.map +0 -1
  389. package/packages/subagent/dist/sandbox/ProcessBackend.js +0 -152
  390. package/packages/subagent/dist/sandbox/ProcessBackend.js.map +0 -1
  391. package/packages/subagent/dist/sandbox/SandboxManager.d.ts +0 -17
  392. package/packages/subagent/dist/sandbox/SandboxManager.d.ts.map +0 -1
  393. package/packages/subagent/dist/sandbox/SandboxManager.js +0 -45
  394. package/packages/subagent/dist/sandbox/SandboxManager.js.map +0 -1
  395. package/packages/subagent/dist/sandbox/types.d.ts +0 -35
  396. package/packages/subagent/dist/sandbox/types.d.ts.map +0 -1
  397. package/packages/subagent/dist/sandbox/types.js +0 -5
  398. package/packages/subagent/dist/sandbox/types.js.map +0 -1
  399. package/packages/subagent/package.json +0 -22
  400. package/packages/subagent-runtime/dist/AgentLoop.d.ts +0 -46
  401. package/packages/subagent-runtime/dist/AgentLoop.d.ts.map +0 -1
  402. package/packages/subagent-runtime/dist/AgentLoop.js +0 -85
  403. package/packages/subagent-runtime/dist/AgentLoop.js.map +0 -1
  404. package/packages/subagent-runtime/dist/MCPProxy.d.ts +0 -24
  405. package/packages/subagent-runtime/dist/MCPProxy.d.ts.map +0 -1
  406. package/packages/subagent-runtime/dist/MCPProxy.js +0 -31
  407. package/packages/subagent-runtime/dist/MCPProxy.js.map +0 -1
  408. package/packages/subagent-runtime/dist/OutputChannel.d.ts +0 -10
  409. package/packages/subagent-runtime/dist/OutputChannel.d.ts.map +0 -1
  410. package/packages/subagent-runtime/dist/OutputChannel.js +0 -14
  411. package/packages/subagent-runtime/dist/OutputChannel.js.map +0 -1
  412. package/packages/subagent-runtime/dist/ResourceTracker.d.ts +0 -29
  413. package/packages/subagent-runtime/dist/ResourceTracker.d.ts.map +0 -1
  414. package/packages/subagent-runtime/dist/ResourceTracker.js +0 -46
  415. package/packages/subagent-runtime/dist/ResourceTracker.js.map +0 -1
  416. package/packages/subagent-runtime/dist/TokenValidator.d.ts +0 -17
  417. package/packages/subagent-runtime/dist/TokenValidator.d.ts.map +0 -1
  418. package/packages/subagent-runtime/dist/TokenValidator.js +0 -29
  419. package/packages/subagent-runtime/dist/TokenValidator.js.map +0 -1
  420. package/packages/subagent-runtime/dist/index.d.ts +0 -6
  421. package/packages/subagent-runtime/dist/index.d.ts.map +0 -1
  422. package/packages/subagent-runtime/dist/index.js +0 -11
  423. package/packages/subagent-runtime/dist/index.js.map +0 -1
  424. package/packages/subagent-runtime/dist/main.d.ts +0 -2
  425. package/packages/subagent-runtime/dist/main.d.ts.map +0 -1
  426. package/packages/subagent-runtime/dist/main.js +0 -102
  427. package/packages/subagent-runtime/dist/main.js.map +0 -1
  428. package/packages/subagent-runtime/package.json +0 -19
  429. package/pnpm-workspace.yaml +0 -2
  430. package/tsconfig.base.json +0 -19
  431. package/turbo.json +0 -16
@@ -0,0 +1,2644 @@
1
+ // packages/daemon/src/ZeroAgentDaemon.ts
2
+ import { writeFileSync as writeFileSync2, unlinkSync as unlinkSync2, existsSync as existsSync3, mkdirSync as mkdirSync2 } from "node:fs";
3
+ import { resolve as resolve2 } from "node:path";
4
+ import { homedir as homedir3 } from "node:os";
5
+
6
+ // packages/core/src/graph/GraphNode.ts
7
+ function createNode(params) {
8
+ const now = Date.now();
9
+ return {
10
+ id: params.id,
11
+ graph_id: params.graph_id,
12
+ label: params.label,
13
+ type: params.type,
14
+ created_at: now,
15
+ last_seen: now,
16
+ visit_count: 1,
17
+ metadata: params.metadata ?? {},
18
+ subgraph_id: params.subgraph_id ?? null,
19
+ embedding: null,
20
+ embedding_model: null,
21
+ embedding_at: null,
22
+ content: params.content ?? []
23
+ };
24
+ }
25
+
26
+ // packages/core/src/graph/SubGraph.ts
27
+ var SubGraph = class _SubGraph {
28
+ id;
29
+ rootEntityId;
30
+ nodes;
31
+ edges;
32
+ constructor(id, rootEntityId) {
33
+ this.id = id;
34
+ this.rootEntityId = rootEntityId;
35
+ this.nodes = /* @__PURE__ */ new Map();
36
+ this.edges = /* @__PURE__ */ new Map();
37
+ }
38
+ addNode(node) {
39
+ this.nodes.set(node.id, node);
40
+ }
41
+ addEdge(edge) {
42
+ this.edges.set(edge.id, edge);
43
+ }
44
+ getNode(id) {
45
+ return this.nodes.get(id);
46
+ }
47
+ getEdge(id) {
48
+ return this.edges.get(id);
49
+ }
50
+ /** Remove a node and all edges connected to it. */
51
+ removeNode(id) {
52
+ this.nodes.delete(id);
53
+ for (const [edgeId, edge] of this.edges) {
54
+ if (edge.from_node === id || edge.to_node === id) {
55
+ this.edges.delete(edgeId);
56
+ }
57
+ }
58
+ }
59
+ removeEdge(id) {
60
+ this.edges.delete(id);
61
+ }
62
+ getNodes() {
63
+ return Array.from(this.nodes.values());
64
+ }
65
+ getEdges() {
66
+ return Array.from(this.edges.values());
67
+ }
68
+ getEdgesFrom(nodeId) {
69
+ const result = [];
70
+ for (const edge of this.edges.values()) {
71
+ if (edge.from_node === nodeId) {
72
+ result.push(edge);
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ getEdgesTo(nodeId) {
78
+ const result = [];
79
+ for (const edge of this.edges.values()) {
80
+ if (edge.to_node === nodeId) {
81
+ result.push(edge);
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ get nodeCount() {
87
+ return this.nodes.size;
88
+ }
89
+ get edgeCount() {
90
+ return this.edges.size;
91
+ }
92
+ /** Serialize to a plain object for snapshot injection into subagents. */
93
+ toSnapshot() {
94
+ return {
95
+ id: this.id,
96
+ rootEntityId: this.rootEntityId,
97
+ nodes: this.getNodes(),
98
+ edges: this.getEdges()
99
+ };
100
+ }
101
+ static fromSnapshot(snapshot) {
102
+ const sg = new _SubGraph(snapshot.id, snapshot.rootEntityId);
103
+ for (const node of snapshot.nodes) {
104
+ sg.addNode(node);
105
+ }
106
+ for (const edge of snapshot.edges) {
107
+ sg.addEdge(edge);
108
+ }
109
+ return sg;
110
+ }
111
+ };
112
+
113
+ // packages/core/src/graph/KnowledgeGraph.ts
114
+ var KnowledgeGraph = class {
115
+ adapter;
116
+ // HNSWIndex is optional — semantic queries return empty if not set
117
+ hnswIndex;
118
+ constructor(adapter, hnswIndex) {
119
+ this.adapter = adapter;
120
+ this.hnswIndex = hnswIndex ?? null;
121
+ }
122
+ // ─── Node CRUD ────────────────────────────
123
+ addNode(node) {
124
+ this.adapter.insertNode(node);
125
+ if (node.embedding && this.hnswIndex) {
126
+ this.hnswIndex.add(node.id, node.embedding);
127
+ }
128
+ }
129
+ getNode(id) {
130
+ return this.adapter.getNode(id);
131
+ }
132
+ updateNode(id, updates) {
133
+ const existing = this.adapter.getNode(id);
134
+ if (!existing) {
135
+ throw new Error(`Node not found: ${id}`);
136
+ }
137
+ if (updates.label !== void 0) {
138
+ existing.label = updates.label;
139
+ }
140
+ if (updates.metadata !== void 0) {
141
+ existing.metadata = updates.metadata;
142
+ }
143
+ if (updates.embedding !== void 0) {
144
+ existing.embedding = updates.embedding;
145
+ if (updates.embedding && this.hnswIndex) {
146
+ this.hnswIndex.add(id, updates.embedding);
147
+ }
148
+ }
149
+ if (updates.embedding_model !== void 0) {
150
+ existing.embedding_model = updates.embedding_model;
151
+ }
152
+ if (updates.embedding_at !== void 0) {
153
+ existing.embedding_at = updates.embedding_at;
154
+ }
155
+ this.adapter.deleteNode(id);
156
+ this.adapter.insertNode(existing);
157
+ }
158
+ touchNode(id) {
159
+ this.adapter.updateNodeLastSeen(id, Date.now());
160
+ }
161
+ deleteNode(id) {
162
+ this.adapter.deleteNode(id);
163
+ if (this.hnswIndex) {
164
+ try {
165
+ this.hnswIndex.remove(id);
166
+ } catch {
167
+ }
168
+ }
169
+ }
170
+ // ─── Node Content ─────────────────────────
171
+ addContent(nodeId, content) {
172
+ const node = this.adapter.getNode(nodeId);
173
+ if (!node) {
174
+ throw new Error(`Node not found: ${nodeId}`);
175
+ }
176
+ this.adapter.insertNodeContent(content);
177
+ }
178
+ getContent(nodeId) {
179
+ return this.adapter.getNodeContent(nodeId);
180
+ }
181
+ // ─── Edge CRUD ────────────────────────────
182
+ addEdge(edge) {
183
+ this.adapter.insertEdge(edge);
184
+ }
185
+ getEdge(id) {
186
+ return this.adapter.getEdge(id);
187
+ }
188
+ deleteEdge(id) {
189
+ this.adapter.deleteEdge(id);
190
+ }
191
+ getEdgesFrom(nodeId) {
192
+ return this.adapter.getEdgesByNode(nodeId, "from");
193
+ }
194
+ getEdgesTo(nodeId) {
195
+ return this.adapter.getEdgesByNode(nodeId, "to");
196
+ }
197
+ getEdgesByNode(nodeId, direction) {
198
+ return this.adapter.getEdgesByNode(nodeId, direction);
199
+ }
200
+ getEdgesBetween(fromId, toId) {
201
+ const edges = this.adapter.getEdgesByNode(fromId, "from");
202
+ return edges.filter((e) => e.to_node === toId);
203
+ }
204
+ getAllEdges(graphId) {
205
+ return this.adapter.getAllEdges(graphId);
206
+ }
207
+ // ─── Subgraph ─────────────────────────────
208
+ /**
209
+ * BFS from entity node, loading nodes + edges up to `depth` hops.
210
+ */
211
+ getSubGraph(entityId, depth = 2) {
212
+ const rootNode = this.adapter.getNode(entityId);
213
+ if (!rootNode) {
214
+ throw new Error(`Entity node not found: ${entityId}`);
215
+ }
216
+ const subgraph = new SubGraph(entityId, entityId);
217
+ subgraph.addNode(rootNode);
218
+ let frontier = /* @__PURE__ */ new Set([entityId]);
219
+ const visited = /* @__PURE__ */ new Set([entityId]);
220
+ for (let d = 0; d < depth; d++) {
221
+ const nextFrontier = /* @__PURE__ */ new Set();
222
+ for (const nodeId of frontier) {
223
+ const outEdges = this.adapter.getEdgesByNode(nodeId, "both");
224
+ for (const edge of outEdges) {
225
+ subgraph.addEdge(edge);
226
+ const neighborId = edge.from_node === nodeId ? edge.to_node : edge.from_node;
227
+ if (!visited.has(neighborId)) {
228
+ visited.add(neighborId);
229
+ const neighborNode = this.adapter.getNode(neighborId);
230
+ if (neighborNode) {
231
+ subgraph.addNode(neighborNode);
232
+ nextFrontier.add(neighborId);
233
+ }
234
+ }
235
+ }
236
+ }
237
+ frontier = nextFrontier;
238
+ if (frontier.size === 0) break;
239
+ }
240
+ return subgraph;
241
+ }
242
+ // ─── Query ────────────────────────────────
243
+ queryStructural(opts) {
244
+ const results = [];
245
+ const limit = opts.limit ?? 50;
246
+ if (opts.from_node) {
247
+ let edges = this.adapter.getEdgesByNode(opts.from_node, "from");
248
+ if (opts.edge_type) {
249
+ edges = edges.filter((e) => e.type === opts.edge_type);
250
+ }
251
+ if (opts.min_weight !== void 0) {
252
+ edges = edges.filter((e) => e.weight >= opts.min_weight);
253
+ }
254
+ if (opts.max_weight !== void 0) {
255
+ edges = edges.filter((e) => e.weight <= opts.max_weight);
256
+ }
257
+ if (opts.graph_id) {
258
+ edges = edges.filter((e) => e.graph_id === opts.graph_id);
259
+ }
260
+ for (const edge of edges) {
261
+ const targetNode = this.adapter.getNode(edge.to_node);
262
+ if (!targetNode) continue;
263
+ if (opts.node_type && targetNode.type !== opts.node_type) continue;
264
+ results.push({
265
+ node: targetNode,
266
+ score: edge.weight,
267
+ source: "structural"
268
+ });
269
+ }
270
+ } else if (opts.to_node) {
271
+ let edges = this.adapter.getEdgesByNode(opts.to_node, "to");
272
+ if (opts.edge_type) {
273
+ edges = edges.filter((e) => e.type === opts.edge_type);
274
+ }
275
+ if (opts.min_weight !== void 0) {
276
+ edges = edges.filter((e) => e.weight >= opts.min_weight);
277
+ }
278
+ if (opts.max_weight !== void 0) {
279
+ edges = edges.filter((e) => e.weight <= opts.max_weight);
280
+ }
281
+ if (opts.graph_id) {
282
+ edges = edges.filter((e) => e.graph_id === opts.graph_id);
283
+ }
284
+ for (const edge of edges) {
285
+ const sourceNode = this.adapter.getNode(edge.from_node);
286
+ if (!sourceNode) continue;
287
+ if (opts.node_type && sourceNode.type !== opts.node_type) continue;
288
+ results.push({
289
+ node: sourceNode,
290
+ score: edge.weight,
291
+ source: "structural"
292
+ });
293
+ }
294
+ } else if (opts.graph_id || opts.node_type) {
295
+ const nodes = this.adapter.queryNodes({
296
+ graph_id: opts.graph_id,
297
+ type: opts.node_type,
298
+ limit
299
+ });
300
+ for (const node of nodes) {
301
+ results.push({
302
+ node,
303
+ score: 1,
304
+ // No edge weight context, default to 1.0
305
+ source: "structural"
306
+ });
307
+ }
308
+ }
309
+ this.sortResults(results, opts.order_by ?? "weight_desc");
310
+ return results.slice(0, limit);
311
+ }
312
+ querySemantic(opts) {
313
+ if (!this.hnswIndex) {
314
+ return [];
315
+ }
316
+ const limit = opts.limit ?? 20;
317
+ const minSimilarity = opts.min_similarity ?? 0;
318
+ let searchResults;
319
+ try {
320
+ searchResults = this.hnswIndex.search(opts.embedding, limit * 2);
321
+ } catch {
322
+ return [];
323
+ }
324
+ const results = [];
325
+ for (const hit of searchResults) {
326
+ if (hit.similarity < minSimilarity) continue;
327
+ const node = this.adapter.getNode(hit.id);
328
+ if (!node) continue;
329
+ if (opts.node_types && opts.node_types.length > 0) {
330
+ if (!opts.node_types.includes(node.type)) continue;
331
+ }
332
+ results.push({
333
+ node,
334
+ score: hit.similarity,
335
+ source: "semantic"
336
+ });
337
+ if (results.length >= limit) break;
338
+ }
339
+ return results;
340
+ }
341
+ queryMerged(opts) {
342
+ const structuralWeight = opts.structural_weight ?? 0.6;
343
+ const semanticWeight = opts.semantic_weight ?? 0.4;
344
+ const limit = opts.limit ?? 50;
345
+ const structuralResults = this.queryStructural(opts.structural);
346
+ const semanticResults = opts.semantic ? this.querySemantic(opts.semantic) : [];
347
+ const scoreMap = /* @__PURE__ */ new Map();
348
+ for (const r of structuralResults) {
349
+ scoreMap.set(r.node.id, {
350
+ node: r.node,
351
+ structScore: r.score,
352
+ semScore: 0
353
+ });
354
+ }
355
+ for (const r of semanticResults) {
356
+ const existing = scoreMap.get(r.node.id);
357
+ if (existing) {
358
+ existing.semScore = r.score;
359
+ } else {
360
+ scoreMap.set(r.node.id, {
361
+ node: r.node,
362
+ structScore: 0,
363
+ semScore: r.score
364
+ });
365
+ }
366
+ }
367
+ const merged = [];
368
+ for (const entry of scoreMap.values()) {
369
+ const score = structuralWeight * entry.structScore + semanticWeight * entry.semScore;
370
+ merged.push({
371
+ node: entry.node,
372
+ score,
373
+ source: "merged"
374
+ });
375
+ }
376
+ merged.sort((a, b) => b.score - a.score);
377
+ return merged.slice(0, limit);
378
+ }
379
+ query(q) {
380
+ const merged = q.getMergedOpts();
381
+ const structOpts = q.getStructuralOpts();
382
+ const semOpts = q.getSemanticOpts();
383
+ if (!structOpts && semOpts) {
384
+ return this.querySemantic(semOpts);
385
+ }
386
+ if (structOpts && !semOpts) {
387
+ return this.queryStructural(structOpts);
388
+ }
389
+ return this.queryMerged(merged);
390
+ }
391
+ // ─── Stats ────────────────────────────────
392
+ nodeCount(graphId) {
393
+ return this.adapter.countNodes(graphId);
394
+ }
395
+ edgeCount(graphId) {
396
+ return this.adapter.countEdges(graphId);
397
+ }
398
+ // ─── Lifecycle ────────────────────────────
399
+ close() {
400
+ this.adapter.close();
401
+ }
402
+ // ─── Private helpers ──────────────────────
403
+ sortResults(results, orderBy) {
404
+ switch (orderBy) {
405
+ case "weight_desc":
406
+ results.sort((a, b) => b.score - a.score);
407
+ break;
408
+ case "weight_asc":
409
+ results.sort((a, b) => a.score - b.score);
410
+ break;
411
+ case "created_at_desc":
412
+ results.sort((a, b) => b.node.created_at - a.node.created_at);
413
+ break;
414
+ case "traversal_count_desc":
415
+ results.sort((a, b) => b.node.visit_count - a.node.visit_count);
416
+ break;
417
+ }
418
+ }
419
+ };
420
+
421
+ // packages/core/src/storage/adapters/SQLiteAdapter.ts
422
+ import Database from "better-sqlite3";
423
+ var SQLiteAdapter = class {
424
+ db;
425
+ // Prepared statements — lazily initialized
426
+ _stmtCache = /* @__PURE__ */ new Map();
427
+ constructor(opts) {
428
+ this.db = new Database(opts.db_path === ":memory:" ? ":memory:" : opts.db_path);
429
+ this.db.pragma("journal_mode = WAL");
430
+ this.db.pragma("busy_timeout = 5000");
431
+ this.db.pragma("foreign_keys = ON");
432
+ this.db.exec(SCHEMA_SQL);
433
+ this.db.exec(INDEX_SQL);
434
+ }
435
+ // ---- Helpers ----
436
+ stmt(sql) {
437
+ let s = this._stmtCache.get(sql);
438
+ if (!s) {
439
+ s = this.db.prepare(sql);
440
+ this._stmtCache.set(sql, s);
441
+ }
442
+ return s;
443
+ }
444
+ // ---- Nodes ----
445
+ insertNode(node) {
446
+ const txn = this.db.transaction(() => {
447
+ this.stmt(`
448
+ INSERT INTO nodes (id, graph_id, label, type, created_at, last_seen, visit_count, metadata, subgraph_id, embedding, embedding_model, embedding_at)
449
+ VALUES (@id, @graph_id, @label, @type, @created_at, @last_seen, @visit_count, @metadata, @subgraph_id, @embedding, @embedding_model, @embedding_at)
450
+ `).run({
451
+ id: node.id,
452
+ graph_id: node.graph_id,
453
+ label: node.label,
454
+ type: node.type,
455
+ created_at: node.created_at,
456
+ last_seen: node.last_seen,
457
+ visit_count: node.visit_count,
458
+ metadata: JSON.stringify(node.metadata),
459
+ subgraph_id: node.subgraph_id,
460
+ embedding: node.embedding ? Buffer.from(node.embedding.buffer) : null,
461
+ embedding_model: node.embedding_model,
462
+ embedding_at: node.embedding_at
463
+ });
464
+ const insertContent = this.stmt(`
465
+ INSERT INTO node_content (id, node_id, type, data, metadata)
466
+ VALUES (@id, @node_id, @type, @data, @metadata)
467
+ `);
468
+ for (const c of node.content) {
469
+ insertContent.run({
470
+ id: c.id,
471
+ node_id: node.id,
472
+ type: c.type,
473
+ data: c.data,
474
+ metadata: JSON.stringify(c.metadata)
475
+ });
476
+ }
477
+ });
478
+ txn();
479
+ }
480
+ getNode(id) {
481
+ const row = this.stmt(`SELECT * FROM nodes WHERE id = ?`).get(id);
482
+ if (!row) return null;
483
+ const contentRows = this.stmt(`SELECT * FROM node_content WHERE node_id = ?`).all(id);
484
+ return this.mapNode(row, contentRows);
485
+ }
486
+ updateNode(id, updates) {
487
+ const fields = [];
488
+ const values = { id };
489
+ if (updates.graph_id !== void 0) {
490
+ fields.push("graph_id = @graph_id");
491
+ values.graph_id = updates.graph_id;
492
+ }
493
+ if (updates.label !== void 0) {
494
+ fields.push("label = @label");
495
+ values.label = updates.label;
496
+ }
497
+ if (updates.type !== void 0) {
498
+ fields.push("type = @type");
499
+ values.type = updates.type;
500
+ }
501
+ if (updates.created_at !== void 0) {
502
+ fields.push("created_at = @created_at");
503
+ values.created_at = updates.created_at;
504
+ }
505
+ if (updates.last_seen !== void 0) {
506
+ fields.push("last_seen = @last_seen");
507
+ values.last_seen = updates.last_seen;
508
+ }
509
+ if (updates.visit_count !== void 0) {
510
+ fields.push("visit_count = @visit_count");
511
+ values.visit_count = updates.visit_count;
512
+ }
513
+ if (updates.metadata !== void 0) {
514
+ fields.push("metadata = @metadata");
515
+ values.metadata = JSON.stringify(updates.metadata);
516
+ }
517
+ if (updates.subgraph_id !== void 0) {
518
+ fields.push("subgraph_id = @subgraph_id");
519
+ values.subgraph_id = updates.subgraph_id;
520
+ }
521
+ if (updates.embedding !== void 0) {
522
+ fields.push("embedding = @embedding");
523
+ values.embedding = updates.embedding ? Buffer.from(updates.embedding.buffer) : null;
524
+ }
525
+ if (updates.embedding_model !== void 0) {
526
+ fields.push("embedding_model = @embedding_model");
527
+ values.embedding_model = updates.embedding_model;
528
+ }
529
+ if (updates.embedding_at !== void 0) {
530
+ fields.push("embedding_at = @embedding_at");
531
+ values.embedding_at = updates.embedding_at;
532
+ }
533
+ if (fields.length === 0) return;
534
+ this.db.prepare(`UPDATE nodes SET ${fields.join(", ")} WHERE id = @id`).run(values);
535
+ }
536
+ updateNodeLastSeen(id, ts) {
537
+ this.stmt(`UPDATE nodes SET last_seen = ?, visit_count = visit_count + 1 WHERE id = ?`).run(ts, id);
538
+ }
539
+ deleteNode(id) {
540
+ this.stmt(`DELETE FROM nodes WHERE id = ?`).run(id);
541
+ }
542
+ queryNodes(opts) {
543
+ const conditions = [];
544
+ const params = [];
545
+ if (opts.graph_id !== void 0) {
546
+ conditions.push("graph_id = ?");
547
+ params.push(opts.graph_id);
548
+ }
549
+ if (opts.type !== void 0) {
550
+ conditions.push("type = ?");
551
+ params.push(opts.type);
552
+ }
553
+ if (opts.subgraph_id !== void 0) {
554
+ conditions.push("subgraph_id = ?");
555
+ params.push(opts.subgraph_id);
556
+ }
557
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
558
+ const limitClause = opts.limit !== void 0 ? `LIMIT ?` : "";
559
+ if (opts.limit !== void 0) params.push(opts.limit);
560
+ const rows = this.db.prepare(`SELECT * FROM nodes ${where} ${limitClause}`).all(...params);
561
+ return rows.map((row) => {
562
+ const contentRows = this.stmt(`SELECT * FROM node_content WHERE node_id = ?`).all(row.id);
563
+ return this.mapNode(row, contentRows);
564
+ });
565
+ }
566
+ countNodes(graph_id) {
567
+ if (graph_id !== void 0) {
568
+ const row2 = this.stmt(`SELECT COUNT(*) as cnt FROM nodes WHERE graph_id = ?`).get(graph_id);
569
+ return row2.cnt;
570
+ }
571
+ const row = this.stmt(`SELECT COUNT(*) as cnt FROM nodes`).get();
572
+ return row.cnt;
573
+ }
574
+ // ---- Edges ----
575
+ insertEdge(edge) {
576
+ this.stmt(`
577
+ INSERT INTO edges (id, graph_id, from_node, to_node, type, weight, locked, decay_rate, created_at, last_traversed, traversal_count, metadata)
578
+ VALUES (@id, @graph_id, @from_node, @to_node, @type, @weight, @locked, @decay_rate, @created_at, @last_traversed, @traversal_count, @metadata)
579
+ `).run({
580
+ id: edge.id,
581
+ graph_id: edge.graph_id,
582
+ from_node: edge.from_node,
583
+ to_node: edge.to_node,
584
+ type: edge.type,
585
+ weight: edge.weight,
586
+ locked: edge.locked ? 1 : 0,
587
+ decay_rate: edge.decay_rate,
588
+ created_at: edge.created_at,
589
+ last_traversed: edge.last_traversed,
590
+ traversal_count: edge.traversal_count,
591
+ metadata: JSON.stringify(edge.metadata)
592
+ });
593
+ }
594
+ getEdge(id) {
595
+ const row = this.stmt(`SELECT * FROM edges WHERE id = ?`).get(id);
596
+ if (!row) return null;
597
+ return this.mapEdge(row);
598
+ }
599
+ updateEdgeWeight(id, newWeight, expectedWeight) {
600
+ const result = this.stmt(`UPDATE edges SET weight = ? WHERE id = ? AND weight = ?`).run(newWeight, id, expectedWeight);
601
+ return result.changes === 1;
602
+ }
603
+ updateEdgeTraversal(id, ts) {
604
+ this.stmt(`UPDATE edges SET last_traversed = ?, traversal_count = traversal_count + 1 WHERE id = ?`).run(ts, id);
605
+ }
606
+ deleteEdge(id) {
607
+ this.stmt(`DELETE FROM edges WHERE id = ?`).run(id);
608
+ }
609
+ getEdgesByNode(nodeId, direction) {
610
+ let rows;
611
+ if (direction === "from") {
612
+ rows = this.stmt(`SELECT * FROM edges WHERE from_node = ?`).all(nodeId);
613
+ } else if (direction === "to") {
614
+ rows = this.stmt(`SELECT * FROM edges WHERE to_node = ?`).all(nodeId);
615
+ } else {
616
+ rows = this.stmt(`SELECT * FROM edges WHERE from_node = ? OR to_node = ?`).all(nodeId, nodeId);
617
+ }
618
+ return rows.map((r) => this.mapEdge(r));
619
+ }
620
+ getEdgesBetween(fromId, toId) {
621
+ const rows = this.stmt(`SELECT * FROM edges WHERE from_node = ? AND to_node = ?`).all(fromId, toId);
622
+ return rows.map((r) => this.mapEdge(r));
623
+ }
624
+ getAllEdges(graph_id) {
625
+ let rows;
626
+ if (graph_id !== void 0) {
627
+ rows = this.stmt(`SELECT * FROM edges WHERE graph_id = ?`).all(graph_id);
628
+ } else {
629
+ rows = this.stmt(`SELECT * FROM edges`).all();
630
+ }
631
+ return rows.map((r) => this.mapEdge(r));
632
+ }
633
+ // ---- Weight Events ----
634
+ insertWeightEvent(event) {
635
+ this.stmt(`
636
+ INSERT INTO weight_events (id, edge_id, old_weight, new_weight, delta, reason, trace_id, created_at)
637
+ VALUES (@id, @edge_id, @old_weight, @new_weight, @delta, @reason, @trace_id, @created_at)
638
+ `).run({
639
+ id: event.id,
640
+ edge_id: event.edge_id,
641
+ old_weight: event.old_weight,
642
+ new_weight: event.new_weight,
643
+ delta: event.delta,
644
+ reason: event.reason,
645
+ trace_id: event.trace_id,
646
+ created_at: event.created_at
647
+ });
648
+ }
649
+ getWeightEvents(edgeId) {
650
+ const rows = this.stmt(`SELECT * FROM weight_events WHERE edge_id = ? ORDER BY created_at`).all(edgeId);
651
+ return rows.map((r) => this.mapWeightEvent(r));
652
+ }
653
+ getWeightEventsByTrace(traceId) {
654
+ const rows = this.stmt(`SELECT * FROM weight_events WHERE trace_id = ? ORDER BY created_at`).all(traceId);
655
+ return rows.map((r) => this.mapWeightEvent(r));
656
+ }
657
+ // ---- Traces ----
658
+ insertTrace(trace) {
659
+ this.stmt(`
660
+ INSERT INTO traces (id, session_id, input, plan, outcome_signal, outcome_type, resolved_at, deferred, deferred_until, created_at, metadata)
661
+ VALUES (@id, @session_id, @input, @plan, @outcome_signal, @outcome_type, @resolved_at, @deferred, @deferred_until, @created_at, @metadata)
662
+ `).run({
663
+ id: trace.id,
664
+ session_id: trace.session_id,
665
+ input: trace.input,
666
+ plan: trace.plan,
667
+ outcome_signal: trace.outcome_signal,
668
+ outcome_type: trace.outcome_type,
669
+ resolved_at: trace.resolved_at,
670
+ deferred: trace.deferred ? 1 : 0,
671
+ deferred_until: trace.deferred_until,
672
+ created_at: trace.created_at,
673
+ metadata: JSON.stringify(trace.metadata)
674
+ });
675
+ }
676
+ getTrace(id) {
677
+ const row = this.stmt(`SELECT * FROM traces WHERE id = ?`).get(id);
678
+ if (!row) return null;
679
+ return this.mapTrace(row);
680
+ }
681
+ updateTraceOutcome(id, signal, type, resolvedAt) {
682
+ this.stmt(`UPDATE traces SET outcome_signal = ?, outcome_type = ?, resolved_at = ? WHERE id = ?`).run(signal, type, resolvedAt, id);
683
+ }
684
+ queryTraces(opts) {
685
+ const conditions = [];
686
+ const params = [];
687
+ if (opts.session_id !== void 0) {
688
+ conditions.push("session_id = ?");
689
+ params.push(opts.session_id);
690
+ }
691
+ if (opts.deferred !== void 0) {
692
+ conditions.push("deferred = ?");
693
+ params.push(opts.deferred ? 1 : 0);
694
+ }
695
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
696
+ const limitClause = opts.limit !== void 0 ? `LIMIT ?` : "";
697
+ if (opts.limit !== void 0) params.push(opts.limit);
698
+ const rows = this.db.prepare(`SELECT * FROM traces ${where} ORDER BY created_at DESC ${limitClause}`).all(...params);
699
+ return rows.map((r) => this.mapTrace(r));
700
+ }
701
+ // ---- Aliases ----
702
+ insertAlias(alias, nodeId, confidence) {
703
+ this.stmt(`
704
+ INSERT OR REPLACE INTO aliases (alias, node_id, confidence, created_at)
705
+ VALUES (?, ?, ?, ?)
706
+ `).run(alias, nodeId, confidence, Date.now());
707
+ }
708
+ getAliases(nodeId) {
709
+ const rows = this.stmt(`SELECT * FROM aliases WHERE node_id = ?`).all(nodeId);
710
+ return rows.map((r) => this.mapAlias(r));
711
+ }
712
+ findByAlias(alias) {
713
+ const rows = this.stmt(`SELECT * FROM aliases WHERE alias = ?`).all(alias);
714
+ return rows.map((r) => this.mapAlias(r));
715
+ }
716
+ deleteAlias(alias, nodeId) {
717
+ this.stmt(`DELETE FROM aliases WHERE alias = ? AND node_id = ?`).run(alias, nodeId);
718
+ }
719
+ // ---- Force update (LWW fallback for OCC) ----
720
+ forceUpdateEdgeWeight(id, newWeight) {
721
+ this.stmt(`UPDATE edges SET weight = ? WHERE id = ?`).run(newWeight, id);
722
+ }
723
+ // ---- Node Content (direct) ----
724
+ insertNodeContent(content) {
725
+ this.stmt(`
726
+ INSERT INTO node_content (id, node_id, type, data, metadata)
727
+ VALUES (@id, @node_id, @type, @data, @metadata)
728
+ `).run({
729
+ id: content.id,
730
+ node_id: content.node_id,
731
+ type: content.type,
732
+ data: content.data,
733
+ metadata: JSON.stringify(content.metadata)
734
+ });
735
+ }
736
+ getNodeContent(nodeId) {
737
+ const rows = this.stmt(`SELECT * FROM node_content WHERE node_id = ?`).all(nodeId);
738
+ return rows.map((c) => ({
739
+ id: c.id,
740
+ node_id: c.node_id,
741
+ type: c.type,
742
+ data: c.data,
743
+ metadata: JSON.parse(c.metadata)
744
+ }));
745
+ }
746
+ // ---- Edge Count ----
747
+ countEdges(graph_id) {
748
+ if (graph_id !== void 0) {
749
+ const row2 = this.stmt(`SELECT COUNT(*) as cnt FROM edges WHERE graph_id = ?`).get(graph_id);
750
+ return row2.cnt;
751
+ }
752
+ const row = this.stmt(`SELECT COUNT(*) as cnt FROM edges`).get();
753
+ return row.cnt;
754
+ }
755
+ // ---- Lifecycle ----
756
+ close() {
757
+ this.db.close();
758
+ }
759
+ // ---- Row mappers ----
760
+ mapNode(row, contentRows) {
761
+ let embedding = null;
762
+ if (row.embedding && row.embedding instanceof Buffer) {
763
+ embedding = new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4);
764
+ }
765
+ return {
766
+ id: row.id,
767
+ graph_id: row.graph_id,
768
+ label: row.label,
769
+ type: row.type,
770
+ created_at: row.created_at,
771
+ last_seen: row.last_seen,
772
+ visit_count: row.visit_count,
773
+ metadata: JSON.parse(row.metadata),
774
+ subgraph_id: row.subgraph_id ?? null,
775
+ embedding,
776
+ embedding_model: row.embedding_model ?? null,
777
+ embedding_at: row.embedding_at ?? null,
778
+ content: contentRows.map((c) => ({
779
+ id: c.id,
780
+ node_id: c.node_id,
781
+ type: c.type,
782
+ data: c.data,
783
+ metadata: JSON.parse(c.metadata)
784
+ }))
785
+ };
786
+ }
787
+ mapEdge(row) {
788
+ return {
789
+ id: row.id,
790
+ graph_id: row.graph_id,
791
+ from_node: row.from_node,
792
+ to_node: row.to_node,
793
+ type: row.type,
794
+ weight: row.weight,
795
+ locked: row.locked === 1,
796
+ decay_rate: row.decay_rate,
797
+ created_at: row.created_at,
798
+ last_traversed: row.last_traversed ?? null,
799
+ traversal_count: row.traversal_count,
800
+ metadata: JSON.parse(row.metadata)
801
+ };
802
+ }
803
+ mapWeightEvent(row) {
804
+ return {
805
+ id: row.id,
806
+ edge_id: row.edge_id,
807
+ old_weight: row.old_weight,
808
+ new_weight: row.new_weight,
809
+ delta: row.delta,
810
+ reason: row.reason,
811
+ trace_id: row.trace_id ?? null,
812
+ created_at: row.created_at
813
+ };
814
+ }
815
+ mapTrace(row) {
816
+ return {
817
+ id: row.id,
818
+ session_id: row.session_id,
819
+ input: row.input,
820
+ plan: row.plan,
821
+ outcome_signal: row.outcome_signal ?? null,
822
+ outcome_type: row.outcome_type ?? null,
823
+ resolved_at: row.resolved_at ?? null,
824
+ deferred: row.deferred === 1,
825
+ deferred_until: row.deferred_until ?? null,
826
+ created_at: row.created_at,
827
+ metadata: JSON.parse(row.metadata)
828
+ };
829
+ }
830
+ mapAlias(row) {
831
+ return {
832
+ alias: row.alias,
833
+ node_id: row.node_id,
834
+ confidence: row.confidence,
835
+ created_at: row.created_at
836
+ };
837
+ }
838
+ };
839
+ var SCHEMA_SQL = `
840
+ CREATE TABLE IF NOT EXISTS nodes (
841
+ id TEXT PRIMARY KEY,
842
+ graph_id TEXT NOT NULL,
843
+ label TEXT NOT NULL,
844
+ type TEXT NOT NULL,
845
+ created_at INTEGER NOT NULL,
846
+ last_seen INTEGER NOT NULL,
847
+ visit_count INTEGER NOT NULL DEFAULT 1,
848
+ metadata TEXT NOT NULL DEFAULT '{}',
849
+ subgraph_id TEXT,
850
+ embedding BLOB,
851
+ embedding_model TEXT,
852
+ embedding_at INTEGER
853
+ );
854
+
855
+ CREATE TABLE IF NOT EXISTS node_content (
856
+ id TEXT PRIMARY KEY,
857
+ node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
858
+ type TEXT NOT NULL,
859
+ data TEXT NOT NULL,
860
+ metadata TEXT NOT NULL DEFAULT '{}'
861
+ );
862
+
863
+ CREATE TABLE IF NOT EXISTS edges (
864
+ id TEXT PRIMARY KEY,
865
+ graph_id TEXT NOT NULL,
866
+ from_node TEXT NOT NULL REFERENCES nodes(id),
867
+ to_node TEXT NOT NULL REFERENCES nodes(id),
868
+ type TEXT NOT NULL,
869
+ weight REAL NOT NULL DEFAULT 0.5,
870
+ locked INTEGER NOT NULL DEFAULT 0,
871
+ decay_rate REAL NOT NULL DEFAULT 0.001,
872
+ created_at INTEGER NOT NULL,
873
+ last_traversed INTEGER,
874
+ traversal_count INTEGER NOT NULL DEFAULT 0,
875
+ metadata TEXT NOT NULL DEFAULT '{}'
876
+ );
877
+
878
+ CREATE TABLE IF NOT EXISTS weight_events (
879
+ id TEXT PRIMARY KEY,
880
+ edge_id TEXT NOT NULL REFERENCES edges(id),
881
+ old_weight REAL NOT NULL,
882
+ new_weight REAL NOT NULL,
883
+ delta REAL NOT NULL,
884
+ reason TEXT NOT NULL,
885
+ trace_id TEXT,
886
+ created_at INTEGER NOT NULL
887
+ );
888
+
889
+ CREATE TABLE IF NOT EXISTS traces (
890
+ id TEXT PRIMARY KEY,
891
+ session_id TEXT NOT NULL,
892
+ input TEXT NOT NULL,
893
+ plan TEXT NOT NULL,
894
+ outcome_signal REAL,
895
+ outcome_type TEXT,
896
+ resolved_at INTEGER,
897
+ deferred INTEGER NOT NULL DEFAULT 0,
898
+ deferred_until INTEGER,
899
+ created_at INTEGER NOT NULL,
900
+ metadata TEXT NOT NULL DEFAULT '{}'
901
+ );
902
+
903
+ CREATE TABLE IF NOT EXISTS aliases (
904
+ alias TEXT NOT NULL,
905
+ node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
906
+ confidence REAL NOT NULL DEFAULT 1.0,
907
+ created_at INTEGER NOT NULL,
908
+ PRIMARY KEY (alias, node_id)
909
+ );
910
+ `;
911
+ var INDEX_SQL = `
912
+ CREATE INDEX IF NOT EXISTS idx_nodes_graph_type ON nodes(graph_id, type);
913
+ CREATE INDEX IF NOT EXISTS idx_nodes_subgraph ON nodes(subgraph_id);
914
+ CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(from_node);
915
+ CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(to_node);
916
+ CREATE INDEX IF NOT EXISTS idx_edges_graph ON edges(graph_id);
917
+ CREATE INDEX IF NOT EXISTS idx_weight_events_edge ON weight_events(edge_id);
918
+ CREATE INDEX IF NOT EXISTS idx_weight_events_trace ON weight_events(trace_id);
919
+ CREATE INDEX IF NOT EXISTS idx_aliases_alias ON aliases(alias);
920
+ CREATE INDEX IF NOT EXISTS idx_traces_session ON traces(session_id);
921
+ `;
922
+
923
+ // packages/core/src/storage/TraceStore.ts
924
+ var TraceStore = class {
925
+ constructor(adapter) {
926
+ this.adapter = adapter;
927
+ }
928
+ insert(trace) {
929
+ this.adapter.insertTrace(trace);
930
+ }
931
+ get(id) {
932
+ return this.adapter.getTrace(id);
933
+ }
934
+ updateOutcome(id, signal, type, resolvedAt) {
935
+ this.adapter.updateTraceOutcome(id, signal, type, resolvedAt);
936
+ }
937
+ query(opts) {
938
+ return this.adapter.queryTraces(opts);
939
+ }
940
+ };
941
+
942
+ // packages/core/src/engine/SelectionPolicy.ts
943
+ var SelectionPolicy = class {
944
+ config;
945
+ rng;
946
+ // injectable RNG for testing
947
+ constructor(config, rng) {
948
+ this.config = {
949
+ epsilon: config?.epsilon ?? 0.15,
950
+ temperature: config?.temperature ?? 0.5
951
+ };
952
+ this.rng = rng ?? Math.random;
953
+ }
954
+ /**
955
+ * Select an edge from candidates using epsilon-greedy.
956
+ * - With probability epsilon: random selection (explore)
957
+ * - Otherwise: temperature-softmax weighted by edge weight (exploit)
958
+ * Returns null if no candidates.
959
+ */
960
+ select(candidates) {
961
+ if (candidates.length === 0) return null;
962
+ if (candidates.length === 1) {
963
+ return { edge: candidates[0], mode: "exploit", score: candidates[0].weight };
964
+ }
965
+ const roll = this.rng();
966
+ if (roll < this.config.epsilon) {
967
+ const idx = Math.floor(this.rng() * candidates.length);
968
+ return { edge: candidates[idx], mode: "explore", score: candidates[idx].weight };
969
+ }
970
+ return this.softmaxSelect(candidates);
971
+ }
972
+ /**
973
+ * Softmax selection weighted by edge weight / temperature.
974
+ * Higher temperature = more uniform. Lower = more greedy.
975
+ */
976
+ softmaxSelect(candidates) {
977
+ const weights = candidates.map((e) => e.weight / this.config.temperature);
978
+ const maxW = Math.max(...weights);
979
+ const exps = weights.map((w) => Math.exp(w - maxW));
980
+ const sumExp = exps.reduce((a, b) => a + b, 0);
981
+ const probs = exps.map((e) => e / sumExp);
982
+ let r = this.rng();
983
+ for (let i = 0; i < probs.length; i++) {
984
+ r -= probs[i];
985
+ if (r <= 0) {
986
+ return { edge: candidates[i], mode: "exploit", score: candidates[i].weight };
987
+ }
988
+ }
989
+ const last = candidates[candidates.length - 1];
990
+ return { edge: last, mode: "exploit", score: last.weight };
991
+ }
992
+ getConfig() {
993
+ return { ...this.config };
994
+ }
995
+ };
996
+
997
+ // packages/core/src/engine/InferenceEngine.ts
998
+ var InferenceEngine = class {
999
+ constructor(graph, resolver, policy, resolutionPipeline, attribution, propagation, updater) {
1000
+ this.graph = graph;
1001
+ this.resolver = resolver;
1002
+ this.policy = policy;
1003
+ this.resolutionPipeline = resolutionPipeline;
1004
+ this.attribution = attribution;
1005
+ this.propagation = propagation;
1006
+ this.updater = updater;
1007
+ }
1008
+ // ─── Phase 2 backward-compatible resolve() ─────────────
1009
+ async resolve(task, _context) {
1010
+ const plan = {
1011
+ task,
1012
+ resolved_entities: [],
1013
+ selected_edge: null,
1014
+ skill: null,
1015
+ confidence: 0,
1016
+ reasoning: ""
1017
+ };
1018
+ const mentions = this.extractMentions(task);
1019
+ for (const mention of mentions) {
1020
+ try {
1021
+ const result = await this.resolver.resolve(mention);
1022
+ plan.resolved_entities.push({
1023
+ mention,
1024
+ node_id: result.node_id,
1025
+ confidence: result.confidence,
1026
+ match_type: result.match_type
1027
+ });
1028
+ } catch {
1029
+ }
1030
+ }
1031
+ const candidateEdges = [];
1032
+ for (const entity of plan.resolved_entities) {
1033
+ const edges = this.graph.getEdgesFrom(entity.node_id);
1034
+ candidateEdges.push(...edges);
1035
+ }
1036
+ if (candidateEdges.length === 0) {
1037
+ const contextNodes = this.graph.queryStructural({
1038
+ node_type: "context" /* CONTEXT */,
1039
+ limit: 10
1040
+ });
1041
+ for (const result of contextNodes) {
1042
+ const edges = this.graph.getEdgesFrom(result.node.id);
1043
+ candidateEdges.push(...edges);
1044
+ }
1045
+ }
1046
+ if (candidateEdges.length > 0) {
1047
+ const unique = new Map(candidateEdges.map((e) => [e.id, e]));
1048
+ const selection = this.policy.select([...unique.values()]);
1049
+ if (selection) {
1050
+ const fromNode = this.graph.getNode(selection.edge.from_node);
1051
+ const toNode = this.graph.getNode(selection.edge.to_node);
1052
+ plan.selected_edge = {
1053
+ edge_id: selection.edge.id,
1054
+ from_label: fromNode?.label ?? selection.edge.from_node,
1055
+ to_label: toNode?.label ?? selection.edge.to_node,
1056
+ weight: selection.edge.weight,
1057
+ mode: selection.mode
1058
+ };
1059
+ plan.confidence = selection.score;
1060
+ if (toNode?.metadata?.is_skill) {
1061
+ plan.skill = toNode.label;
1062
+ }
1063
+ plan.reasoning = `Selected ${plan.selected_edge.from_label} \u2192 ${plan.selected_edge.to_label} (weight: ${selection.edge.weight.toFixed(2)}, mode: ${selection.mode})`;
1064
+ }
1065
+ }
1066
+ if (!plan.selected_edge) {
1067
+ plan.reasoning = "No candidate edges found \u2014 bootstrap mode may be needed";
1068
+ }
1069
+ return plan;
1070
+ }
1071
+ // ─── Phase 4 full inference pipeline ────────────────────
1072
+ async infer(req) {
1073
+ const trace_id = crypto.randomUUID();
1074
+ const started = Date.now();
1075
+ let resolvedEntities;
1076
+ if (this.resolutionPipeline) {
1077
+ resolvedEntities = await this.resolutionPipeline.extractAndResolve(
1078
+ req.input,
1079
+ req.context
1080
+ );
1081
+ } else {
1082
+ resolvedEntities = await this.resolveEntitiesFallback(req.input);
1083
+ }
1084
+ const candidateEdges = [];
1085
+ for (const entity of resolvedEntities) {
1086
+ const edges = this.graph.getEdgesFrom(entity.node_id);
1087
+ candidateEdges.push(...edges);
1088
+ }
1089
+ if (candidateEdges.length === 0) {
1090
+ const contextNodes = this.graph.queryStructural({
1091
+ node_type: "context" /* CONTEXT */,
1092
+ limit: 10
1093
+ });
1094
+ for (const result2 of contextNodes) {
1095
+ const edges = this.graph.getEdgesFrom(result2.node.id);
1096
+ candidateEdges.push(...edges);
1097
+ }
1098
+ }
1099
+ const unique = new Map(candidateEdges.map((e) => [e.id, e]));
1100
+ const deduped = [...unique.values()];
1101
+ const selection = deduped.length > 0 ? this.policy.select(deduped) : null;
1102
+ const planSelected = [];
1103
+ let skillName = null;
1104
+ if (selection) {
1105
+ planSelected.push(selection.edge.id);
1106
+ const toNode = this.graph.getNode(selection.edge.to_node);
1107
+ if (toNode?.metadata?.is_skill) {
1108
+ skillName = toNode.label;
1109
+ }
1110
+ const ledger = req.context?.["_traversal_ledger"];
1111
+ if (ledger) {
1112
+ const siblings = this.graph.getEdgesFrom(selection.edge.from_node);
1113
+ ledger.record(selection.edge, 0, siblings);
1114
+ }
1115
+ }
1116
+ let output;
1117
+ if (selection) {
1118
+ const fromNode = this.graph.getNode(selection.edge.from_node);
1119
+ const toNode = this.graph.getNode(selection.edge.to_node);
1120
+ const fromLabel = fromNode?.label ?? selection.edge.from_node;
1121
+ const toLabel = toNode?.label ?? selection.edge.to_node;
1122
+ output = skillName ? `Skill: ${skillName} (via ${fromLabel} \u2192 ${toLabel}, weight: ${selection.edge.weight.toFixed(2)}, mode: ${selection.mode})` : `Plan: ${fromLabel} \u2192 ${toLabel} (weight: ${selection.edge.weight.toFixed(2)}, mode: ${selection.mode})`;
1123
+ } else {
1124
+ output = "No plan selected \u2014 bootstrap mode may be needed";
1125
+ }
1126
+ const outcomeSignal = req.context?.["outcome_signal"];
1127
+ if (outcomeSignal !== void 0 && this.attribution && this.propagation) {
1128
+ const ledger = req.context?.["_traversal_ledger"];
1129
+ if (ledger) {
1130
+ await this.attribution.attribute(ledger, outcomeSignal, trace_id);
1131
+ const outcome = {
1132
+ value: outcomeSignal,
1133
+ type: "explicit",
1134
+ trace_id,
1135
+ resolved_at: Date.now()
1136
+ };
1137
+ await this.propagation.propagate(ledger.toStepLedgers(), outcome);
1138
+ }
1139
+ }
1140
+ const contextSkillName = req.context?.["skill_name"];
1141
+ const deferred = req.context?.["deferred"] === true;
1142
+ const result = {
1143
+ output,
1144
+ trace_id,
1145
+ entities_resolved: resolvedEntities.map((e) => e.node_id),
1146
+ plan_selected: planSelected,
1147
+ subagent_result: req.context?.["subagent_result"],
1148
+ outcome_signal: outcomeSignal,
1149
+ deferred
1150
+ };
1151
+ return result;
1152
+ }
1153
+ // ─── Private helpers ────────────────────────────────────
1154
+ /**
1155
+ * Fallback entity resolution using the simple NodeResolutionService.
1156
+ * Used when no EntityResolutionPipeline is provided.
1157
+ */
1158
+ async resolveEntitiesFallback(input) {
1159
+ const mentions = this.extractMentions(input);
1160
+ const resolved = [];
1161
+ for (const mention of mentions) {
1162
+ try {
1163
+ const result = await this.resolver.resolve(mention);
1164
+ resolved.push({
1165
+ mention,
1166
+ node_id: result.node_id,
1167
+ confidence: result.confidence,
1168
+ match_type: result.match_type
1169
+ });
1170
+ } catch {
1171
+ }
1172
+ }
1173
+ return resolved;
1174
+ }
1175
+ /**
1176
+ * Simple mention extraction: split task into potential entity names.
1177
+ * Phase 4 EntityResolutionPipeline provides LLM-based NER as upgrade.
1178
+ */
1179
+ extractMentions(task) {
1180
+ const mentions = [];
1181
+ const words = task.split(/\s+/).filter(Boolean);
1182
+ for (let i = 0; i < words.length - 1; i++) {
1183
+ const pair = `${words[i]} ${words[i + 1]}`;
1184
+ if (/^[A-Z]/.test(words[i]) && /^[A-Z]/.test(words[i + 1])) {
1185
+ mentions.push(pair);
1186
+ }
1187
+ }
1188
+ for (const word of words) {
1189
+ if (/^[A-Z]/.test(word) && word.length > 2) {
1190
+ mentions.push(word);
1191
+ }
1192
+ }
1193
+ return [...new Set(mentions)];
1194
+ }
1195
+ };
1196
+
1197
+ // packages/core/src/memory/WorkingMemory.ts
1198
+ var WorkingMemory = class {
1199
+ constructor(graph, config) {
1200
+ this.graph = graph;
1201
+ this.cache = /* @__PURE__ */ new Map();
1202
+ this.config = { max_nodes: config?.max_nodes ?? 200 };
1203
+ }
1204
+ cache;
1205
+ config;
1206
+ /**
1207
+ * Get a node by ID. Checks cache first (promoting to MRU on hit),
1208
+ * then falls back to graph lookup and caches the result.
1209
+ */
1210
+ get(id) {
1211
+ if (this.cache.has(id)) {
1212
+ const node2 = this.cache.get(id);
1213
+ this.cache.delete(id);
1214
+ this.cache.set(id, node2);
1215
+ return node2;
1216
+ }
1217
+ const node = this.graph.getNode(id);
1218
+ if (node) this.put(node);
1219
+ return node;
1220
+ }
1221
+ /**
1222
+ * Insert or update a node in the cache.
1223
+ * Evicts the LRU entry if at capacity.
1224
+ */
1225
+ put(node) {
1226
+ if (this.cache.has(node.id)) {
1227
+ this.cache.delete(node.id);
1228
+ } else if (this.cache.size >= this.config.max_nodes) {
1229
+ const firstKey = this.cache.keys().next().value;
1230
+ if (firstKey !== void 0) this.cache.delete(firstKey);
1231
+ }
1232
+ this.cache.set(node.id, node);
1233
+ }
1234
+ /**
1235
+ * Get the N most recently accessed nodes (from oldest to newest).
1236
+ */
1237
+ getRecentNodes(n) {
1238
+ return Array.from(this.cache.values()).slice(-n);
1239
+ }
1240
+ /** Check if a node is in the cache. */
1241
+ has(id) {
1242
+ return this.cache.has(id);
1243
+ }
1244
+ /** Number of nodes currently cached. */
1245
+ get size() {
1246
+ return this.cache.size;
1247
+ }
1248
+ /** Clear all cached nodes. */
1249
+ clear() {
1250
+ this.cache.clear();
1251
+ }
1252
+ };
1253
+
1254
+ // packages/core/src/entity/AliasIndex.ts
1255
+ var AliasIndex = class {
1256
+ constructor(adapter) {
1257
+ this.adapter = adapter;
1258
+ }
1259
+ /**
1260
+ * Register an alias for a node.
1261
+ * Normalizes alias to lowercase.
1262
+ */
1263
+ add(alias, nodeId, confidence = 1) {
1264
+ this.adapter.insertAlias(this.normalize(alias), nodeId, confidence);
1265
+ }
1266
+ /**
1267
+ * Remove an alias.
1268
+ */
1269
+ remove(alias, nodeId) {
1270
+ this.adapter.deleteAlias(this.normalize(alias), nodeId);
1271
+ }
1272
+ /**
1273
+ * Find nodes by exact alias match.
1274
+ */
1275
+ findExact(alias) {
1276
+ return this.adapter.findByAlias(this.normalize(alias));
1277
+ }
1278
+ /**
1279
+ * Get all aliases for a node.
1280
+ */
1281
+ getAliases(nodeId) {
1282
+ return this.adapter.getAliases(nodeId);
1283
+ }
1284
+ /**
1285
+ * Generate common abbreviations for a label.
1286
+ * "Acme Corp" -> ["acme corp", "acme", "ac"]
1287
+ * "John Smith" -> ["john smith", "john", "js"]
1288
+ */
1289
+ generateAbbreviations(label) {
1290
+ const normalized = this.normalize(label);
1291
+ const words = normalized.split(/\s+/).filter(Boolean);
1292
+ const results = [normalized];
1293
+ if (words.length > 1) {
1294
+ results.push(words[0]);
1295
+ const initials = words.map((w) => w[0]).join("");
1296
+ if (initials.length >= 2) {
1297
+ results.push(initials);
1298
+ }
1299
+ }
1300
+ return [...new Set(results)];
1301
+ }
1302
+ /**
1303
+ * Register a node with its label and auto-generated abbreviations.
1304
+ */
1305
+ registerNode(nodeId, label) {
1306
+ const abbreviations = this.generateAbbreviations(label);
1307
+ for (const abbr of abbreviations) {
1308
+ this.add(abbr, nodeId, abbr === this.normalize(label) ? 1 : 0.9);
1309
+ }
1310
+ }
1311
+ /**
1312
+ * Fuzzy scan: find aliases that contain the query string.
1313
+ * Returns matches sorted by confidence desc.
1314
+ */
1315
+ fuzzyFind(query) {
1316
+ const normalized = this.normalize(query);
1317
+ const allForQuery = this.adapter.findByAlias(normalized);
1318
+ if (allForQuery.length > 0) return allForQuery;
1319
+ return [];
1320
+ }
1321
+ normalize(s) {
1322
+ return s.toLowerCase().trim();
1323
+ }
1324
+ };
1325
+
1326
+ // packages/core/src/entity/NodeResolutionService.ts
1327
+ var DEFAULT_CONFIG = {
1328
+ exact_threshold: 1,
1329
+ alias_threshold: 0.9,
1330
+ fuzzy_threshold: 0.65,
1331
+ disambiguation_threshold: 0.8
1332
+ };
1333
+ var NodeResolutionService = class {
1334
+ constructor(graph, aliasIndex, embedder, hnswIndex, config) {
1335
+ this.graph = graph;
1336
+ this.aliasIndex = aliasIndex;
1337
+ this.embedder = embedder;
1338
+ this.hnswIndex = hnswIndex;
1339
+ this.config = { ...DEFAULT_CONFIG, ...config };
1340
+ }
1341
+ config;
1342
+ /**
1343
+ * Resolve a mention to an existing node or create a new one.
1344
+ *
1345
+ * Pipeline:
1346
+ * 1. Exact label match in graph
1347
+ * 2. Alias match
1348
+ * 3. Fuzzy embedding match (if embedder available)
1349
+ * 4. Create new node if no match above threshold
1350
+ */
1351
+ async resolve(mention, opts) {
1352
+ const graphId = opts?.graph_id ?? "root";
1353
+ const nodeType = opts?.type ?? "entity" /* ENTITY */;
1354
+ const exactMatches = this.graph.queryStructural({
1355
+ graph_id: graphId,
1356
+ node_type: nodeType,
1357
+ limit: 5
1358
+ }).filter((r) => r.node.label.toLowerCase() === mention.toLowerCase());
1359
+ if (exactMatches.length === 1) {
1360
+ this.graph.touchNode(exactMatches[0].node.id);
1361
+ return {
1362
+ node_id: exactMatches[0].node.id,
1363
+ confidence: this.config.exact_threshold,
1364
+ match_type: "exact"
1365
+ };
1366
+ }
1367
+ const aliasMatches = this.aliasIndex.findExact(mention);
1368
+ if (aliasMatches.length === 1) {
1369
+ this.graph.touchNode(aliasMatches[0].node_id);
1370
+ return {
1371
+ node_id: aliasMatches[0].node_id,
1372
+ confidence: aliasMatches[0].confidence,
1373
+ match_type: "alias"
1374
+ };
1375
+ }
1376
+ if (aliasMatches.length > 1 && opts?.context_node_ids?.length) {
1377
+ const disambiguated = this.disambiguate(
1378
+ aliasMatches.map((a) => a.node_id),
1379
+ opts.context_node_ids
1380
+ );
1381
+ if (disambiguated) {
1382
+ return {
1383
+ node_id: disambiguated,
1384
+ confidence: this.config.disambiguation_threshold,
1385
+ match_type: "alias"
1386
+ };
1387
+ }
1388
+ }
1389
+ if (this.embedder?.isAvailable && this.hnswIndex) {
1390
+ const queryEmbedding = await this.embedder.embedText(mention);
1391
+ if (queryEmbedding) {
1392
+ const results = this.hnswIndex.search(queryEmbedding, 5);
1393
+ const bestMatch = results[0];
1394
+ if (bestMatch && bestMatch.similarity >= this.config.fuzzy_threshold) {
1395
+ const node = this.graph.getNode(bestMatch.id);
1396
+ if (node && node.type === nodeType) {
1397
+ this.graph.touchNode(node.id);
1398
+ return {
1399
+ node_id: node.id,
1400
+ confidence: bestMatch.similarity,
1401
+ match_type: "fuzzy"
1402
+ };
1403
+ }
1404
+ }
1405
+ }
1406
+ }
1407
+ const newNode = this.createNewNode(mention, nodeType, graphId);
1408
+ return {
1409
+ node_id: newNode.id,
1410
+ confidence: 1,
1411
+ match_type: "created"
1412
+ };
1413
+ }
1414
+ /**
1415
+ * Disambiguate among multiple candidates using context.
1416
+ * Check which candidate has edges to/from context nodes.
1417
+ * Returns node_id of best candidate, or null if ambiguous.
1418
+ */
1419
+ disambiguate(candidateIds, contextNodeIds) {
1420
+ let bestId = null;
1421
+ let bestScore = 0;
1422
+ for (const candidateId of candidateIds) {
1423
+ let score = 0;
1424
+ for (const ctxId of contextNodeIds) {
1425
+ const edges = this.graph.getEdgesBetween(candidateId, ctxId);
1426
+ const reverseEdges = this.graph.getEdgesBetween(ctxId, candidateId);
1427
+ score += edges.length + reverseEdges.length;
1428
+ }
1429
+ if (score > bestScore) {
1430
+ bestScore = score;
1431
+ bestId = candidateId;
1432
+ }
1433
+ }
1434
+ return bestScore > 0 ? bestId : null;
1435
+ }
1436
+ createNewNode(label, type, graphId) {
1437
+ const id = crypto.randomUUID();
1438
+ const node = createNode({
1439
+ id,
1440
+ graph_id: graphId,
1441
+ label,
1442
+ type
1443
+ });
1444
+ this.graph.addNode(node);
1445
+ this.aliasIndex.registerNode(id, label);
1446
+ if (this.embedder?.isAvailable && this.hnswIndex) {
1447
+ this.embedder.embedText(label).then((emb) => {
1448
+ if (emb) {
1449
+ this.hnswIndex.add(id, emb);
1450
+ this.graph.updateNode(id, {
1451
+ embedding: emb,
1452
+ embedding_model: this.embedder.dimensions.toString(),
1453
+ embedding_at: Date.now()
1454
+ });
1455
+ }
1456
+ }).catch(() => {
1457
+ });
1458
+ }
1459
+ return node;
1460
+ }
1461
+ };
1462
+
1463
+ // packages/core/src/bootstrap/StagedMutations.ts
1464
+ var TTL_MS = 14 * 24 * 60 * 60 * 1e3;
1465
+
1466
+ // packages/core/src/bootstrap/HypothesisManager.ts
1467
+ var HYPOTHESIS_TTL_MS = 14 * 24 * 60 * 60 * 1e3;
1468
+
1469
+ // packages/core/src/maintenance/CompactionOrchestrator.ts
1470
+ var DEFAULT_SCHEDULE = {
1471
+ edge_pruning_interval_ms: 24 * 60 * 60 * 1e3,
1472
+ // 24 hours
1473
+ archival_trigger_nodes: 5e3,
1474
+ deduplication_interval_ms: 7 * 24 * 60 * 60 * 1e3
1475
+ // 7 days
1476
+ };
1477
+
1478
+ // packages/daemon/src/config/DaemonConfig.ts
1479
+ import { readFileSync, existsSync } from "node:fs";
1480
+ import { resolve } from "node:path";
1481
+ import { homedir } from "node:os";
1482
+ import YAML from "yaml";
1483
+
1484
+ // packages/daemon/src/config/ConfigSchema.ts
1485
+ import { z } from "zod";
1486
+ var LLMProviderSchema = z.object({
1487
+ provider: z.enum([
1488
+ "anthropic",
1489
+ "openai",
1490
+ "ollama",
1491
+ "groq",
1492
+ "gemini",
1493
+ "xai",
1494
+ "custom"
1495
+ ]),
1496
+ model: z.string(),
1497
+ api_key: z.string().optional(),
1498
+ base_url: z.string().optional(),
1499
+ is_default: z.boolean().default(false)
1500
+ });
1501
+ var EmbeddingConfigSchema = z.object({
1502
+ provider: z.enum(["nomic-ollama", "openai", "ollama"]).default("nomic-ollama"),
1503
+ model: z.string().default("nomic-embed-text"),
1504
+ dimensions: z.number().default(768),
1505
+ ollama_base_url: z.string().default("http://localhost:11434"),
1506
+ openai_api_key: z.string().optional()
1507
+ });
1508
+ var SandboxConfigSchema = z.object({
1509
+ backend: z.enum(["auto", "firecracker", "docker", "podman", "bwrap", "cloud", "process"]).default("auto"),
1510
+ e2b_api_key: z.string().optional(),
1511
+ memory_mb: z.number().default(512),
1512
+ cpus: z.number().default(1)
1513
+ });
1514
+ var MCPServerEntrySchema = z.object({
1515
+ name: z.string(),
1516
+ command: z.string().optional(),
1517
+ args: z.array(z.string()).optional(),
1518
+ url: z.string().optional(),
1519
+ env: z.record(z.string()).optional(),
1520
+ enabled: z.boolean().default(true)
1521
+ });
1522
+ var ServerConfigSchema = z.object({
1523
+ port: z.number().default(4200),
1524
+ host: z.string().default("127.0.0.1"),
1525
+ bearer_token: z.string().optional()
1526
+ });
1527
+ var GraphConfigSchema = z.object({
1528
+ db_path: z.string(),
1529
+ hnsw_path: z.string(),
1530
+ object_store_path: z.string()
1531
+ });
1532
+ var LearningConfigSchema = z.object({
1533
+ base_learning_rate: z.number().default(0.1),
1534
+ cross_graph_attenuation: z.number().default(0.3),
1535
+ base_step_discount: z.number().default(0.85),
1536
+ epsilon: z.number().default(0.15),
1537
+ temperature: z.number().default(0.5)
1538
+ });
1539
+ var DecayConfigSchema = z.object({
1540
+ interval_hours: z.number().default(6),
1541
+ max_deferral_hours: z.number().default(24),
1542
+ grace_period_hours: z.number().default(48),
1543
+ max_per_cycle: z.number().default(0.05)
1544
+ });
1545
+ var SelfImprovementConfigSchema = z.object({
1546
+ enabled: z.boolean().default(true),
1547
+ schedule: z.enum(["weekly", "daily", "after_every_retro", "manual"]).default("weekly"),
1548
+ auto_apply: z.object({
1549
+ graph_health: z.boolean().default(true),
1550
+ workflow_edges: z.boolean().default(false),
1551
+ skill_prompts: z.boolean().default(false),
1552
+ tool_install: z.boolean().default(false),
1553
+ new_skills: z.boolean().default(false)
1554
+ }).default({})
1555
+ });
1556
+ var EntityVisibilityPolicySchema = z.object({
1557
+ allow_work_context: z.boolean().default(true),
1558
+ allow_signal_nodes: z.boolean().default(true),
1559
+ allow_personality_profile: z.boolean().default(false),
1560
+ allow_raw_conversations: z.boolean().default(false)
1561
+ });
1562
+ var EntityNestingConfigSchema = z.object({
1563
+ enabled: z.boolean().default(true),
1564
+ // When a session has entity_id, accumulate personality after completion
1565
+ accumulate_personality: z.boolean().default(true),
1566
+ // Minimum interactions before personality influences responses
1567
+ personality_min_interactions: z.number().default(3),
1568
+ // How much to attenuate signals propagating to parent entities (0-1)
1569
+ parent_propagation_attenuation: z.number().default(0.5),
1570
+ // Visibility policy — what parent entities see from children
1571
+ visibility_policy: EntityVisibilityPolicySchema.default({})
1572
+ });
1573
+ var DaemonConfigSchema = z.object({
1574
+ version: z.string().default("1"),
1575
+ llm_providers: z.array(LLMProviderSchema).min(1),
1576
+ embedding: EmbeddingConfigSchema.default({}),
1577
+ sandbox: SandboxConfigSchema.default({}),
1578
+ mcp_servers: z.array(MCPServerEntrySchema).default([]),
1579
+ server: ServerConfigSchema.default({}),
1580
+ graph: GraphConfigSchema,
1581
+ learning: LearningConfigSchema.default({}),
1582
+ decay: DecayConfigSchema.default({}),
1583
+ seed: z.string().optional(),
1584
+ self_improvement: SelfImprovementConfigSchema.default({}),
1585
+ entity_nesting: EntityNestingConfigSchema.default({})
1586
+ });
1587
+
1588
+ // packages/daemon/src/config/DaemonConfig.ts
1589
+ var DEFAULT_CONFIG_PATH = resolve(homedir(), ".0agent", "config.yaml");
1590
+ var DEFAULT_GRAPH_CONFIG = {
1591
+ db_path: resolve(homedir(), ".0agent", "graph.db"),
1592
+ hnsw_path: resolve(homedir(), ".0agent", "hnsw.bin"),
1593
+ object_store_path: resolve(homedir(), ".0agent", "objects")
1594
+ };
1595
+ async function loadConfig(configPath = DEFAULT_CONFIG_PATH) {
1596
+ if (!existsSync(configPath)) {
1597
+ throw new Error(
1598
+ `Config file not found: ${configPath}
1599
+ Run '0agent init' to create one.`
1600
+ );
1601
+ }
1602
+ const raw = readFileSync(configPath, "utf8");
1603
+ const parsed = YAML.parse(raw);
1604
+ if (!parsed.graph) {
1605
+ parsed.graph = DEFAULT_GRAPH_CONFIG;
1606
+ }
1607
+ const result = DaemonConfigSchema.safeParse(parsed);
1608
+ if (!result.success) {
1609
+ const issues = result.error.issues.map((i) => ` - ${i.path.join(".")}: ${i.message}`).join("\n");
1610
+ throw new Error(`Invalid config:
1611
+ ${issues}`);
1612
+ }
1613
+ return result.data;
1614
+ }
1615
+
1616
+ // packages/daemon/src/EntityScopedContext.ts
1617
+ var EntityScopedContextLoader = class {
1618
+ constructor(graph) {
1619
+ this.graph = graph;
1620
+ }
1621
+ load(entityId) {
1622
+ const entity = this.graph.getNode(entityId);
1623
+ if (!entity) return null;
1624
+ const personalSubgraph = this.graph.getSubGraph(entityId, 2);
1625
+ const personalNodes = personalSubgraph.getNodes();
1626
+ const memberOfEdges = this.graph.getEdgesFrom(entityId).filter((e) => e.type === "member_of");
1627
+ const parents = memberOfEdges.map((e) => this.graph.getNode(e.to_node)).filter((n) => n !== null);
1628
+ const sharedNodes = [];
1629
+ for (const parent of parents) {
1630
+ const parentSubgraph = this.graph.getSubGraph(parent.id, 1);
1631
+ for (const node of parentSubgraph.getNodes()) {
1632
+ if (["context", "strategy", "plan", "step"].includes(node.type)) {
1633
+ if (!sharedNodes.find((n) => n.id === node.id)) {
1634
+ sharedNodes.push(node);
1635
+ }
1636
+ }
1637
+ }
1638
+ }
1639
+ const personalityNode = personalNodes.find(
1640
+ (n) => n.label === "__personality_profile__" && n.metadata?.entity_id === entityId
1641
+ );
1642
+ let personalityPrompt = "";
1643
+ if (personalityNode?.content[0]) {
1644
+ try {
1645
+ const profile = JSON.parse(personalityNode.content[0].data);
1646
+ if (profile.interaction_count >= 3) {
1647
+ const lines = [];
1648
+ if (profile.communication_style && !profile.communication_style.includes("unknown")) {
1649
+ lines.push(`Communication style: ${profile.communication_style}.`);
1650
+ }
1651
+ if (profile.response_preferences && profile.response_preferences.length > 0) {
1652
+ lines.push(`Preferences: ${profile.response_preferences.join(", ")}.`);
1653
+ }
1654
+ if (profile.working_context) {
1655
+ lines.push(`Currently working on: ${profile.working_context}.`);
1656
+ }
1657
+ if (profile.timezone && profile.timezone !== "UTC") {
1658
+ lines.push(`Timezone: ${profile.timezone}.`);
1659
+ }
1660
+ if (lines.length > 0) {
1661
+ personalityPrompt = [
1662
+ `Context about this person (${profile.interaction_count} past interactions):`,
1663
+ ...lines,
1664
+ "Match their style directly."
1665
+ ].join("\n");
1666
+ }
1667
+ }
1668
+ } catch {
1669
+ }
1670
+ }
1671
+ const workingMemory = new WorkingMemory(this.graph, { max_nodes: 50 });
1672
+ for (const node of personalNodes.slice(-20)) {
1673
+ workingMemory.put(node);
1674
+ }
1675
+ return {
1676
+ entity_id: entityId,
1677
+ entity_label: entity.label,
1678
+ entity_type: entity.type,
1679
+ personality_prompt: personalityPrompt,
1680
+ personal_nodes: personalNodes,
1681
+ shared_nodes: sharedNodes,
1682
+ parent_entity_labels: parents.map((p) => p.label),
1683
+ working_memory: workingMemory
1684
+ };
1685
+ }
1686
+ };
1687
+
1688
+ // packages/daemon/src/SessionManager.ts
1689
+ var SessionManager = class {
1690
+ sessions = /* @__PURE__ */ new Map();
1691
+ inferenceEngine;
1692
+ eventBus;
1693
+ graph;
1694
+ constructor(deps = {}) {
1695
+ this.inferenceEngine = deps.inferenceEngine;
1696
+ this.eventBus = deps.eventBus;
1697
+ this.graph = deps.graph;
1698
+ }
1699
+ /**
1700
+ * Create a new session with status 'pending'.
1701
+ */
1702
+ createSession(req) {
1703
+ const id = crypto.randomUUID();
1704
+ const session = {
1705
+ id,
1706
+ task: req.task,
1707
+ skill: req.skill,
1708
+ entity_id: req.entity_id,
1709
+ status: "pending",
1710
+ created_at: Date.now(),
1711
+ steps: []
1712
+ };
1713
+ this.sessions.set(id, session);
1714
+ return session;
1715
+ }
1716
+ /**
1717
+ * Transition session to 'running' and optionally invoke inference engine.
1718
+ */
1719
+ async startSession(id) {
1720
+ const session = this.getSessionOrThrow(id);
1721
+ session.status = "running";
1722
+ session.started_at = Date.now();
1723
+ this.emit({
1724
+ type: "session.started",
1725
+ session_id: session.id,
1726
+ task: session.task
1727
+ });
1728
+ if (this.inferenceEngine) {
1729
+ try {
1730
+ const plan = await this.inferenceEngine.resolve(session.task);
1731
+ session.plan = plan;
1732
+ if (plan.skill) {
1733
+ session.skill = plan.skill;
1734
+ }
1735
+ } catch {
1736
+ }
1737
+ }
1738
+ return session;
1739
+ }
1740
+ /**
1741
+ * Append a step to a running session.
1742
+ */
1743
+ addStep(id, description, result) {
1744
+ const session = this.getSessionOrThrow(id);
1745
+ const step = {
1746
+ index: session.steps.length,
1747
+ description,
1748
+ result,
1749
+ started_at: Date.now()
1750
+ };
1751
+ session.steps.push(step);
1752
+ this.emit({
1753
+ type: "session.step",
1754
+ session_id: session.id,
1755
+ step: description,
1756
+ result: result ?? null
1757
+ });
1758
+ return step;
1759
+ }
1760
+ /**
1761
+ * Mark session as completed with a result.
1762
+ */
1763
+ completeSession(id, result) {
1764
+ const session = this.getSessionOrThrow(id);
1765
+ session.status = "completed";
1766
+ session.completed_at = Date.now();
1767
+ session.result = result;
1768
+ this.emit({
1769
+ type: "session.completed",
1770
+ session_id: session.id,
1771
+ result: result ?? null
1772
+ });
1773
+ return session;
1774
+ }
1775
+ /**
1776
+ * Mark session as failed with an error message.
1777
+ */
1778
+ failSession(id, error) {
1779
+ const session = this.getSessionOrThrow(id);
1780
+ session.status = "failed";
1781
+ session.completed_at = Date.now();
1782
+ session.error = error;
1783
+ this.emit({
1784
+ type: "session.failed",
1785
+ session_id: session.id,
1786
+ error
1787
+ });
1788
+ return session;
1789
+ }
1790
+ /**
1791
+ * Cancel a session.
1792
+ */
1793
+ cancelSession(id) {
1794
+ const session = this.getSessionOrThrow(id);
1795
+ session.status = "cancelled";
1796
+ session.completed_at = Date.now();
1797
+ session.error = "cancelled";
1798
+ this.emit({
1799
+ type: "session.failed",
1800
+ session_id: session.id,
1801
+ error: "cancelled"
1802
+ });
1803
+ return session;
1804
+ }
1805
+ /**
1806
+ * Get session by ID, or null if not found.
1807
+ */
1808
+ getSession(id) {
1809
+ return this.sessions.get(id) ?? null;
1810
+ }
1811
+ /**
1812
+ * List all sessions sorted by created_at descending.
1813
+ */
1814
+ listSessions() {
1815
+ return [...this.sessions.values()].sort(
1816
+ (a, b) => b.created_at - a.created_at
1817
+ );
1818
+ }
1819
+ /**
1820
+ * End-to-end session run: create -> start -> resolve -> step -> complete.
1821
+ * Wraps everything in try/catch to fail gracefully.
1822
+ */
1823
+ async runSession(req) {
1824
+ let enrichedReq = req;
1825
+ if (req.entity_id && this.graph) {
1826
+ const loader = new EntityScopedContextLoader(this.graph);
1827
+ const scopedCtx = loader.load(req.entity_id);
1828
+ if (scopedCtx?.personality_prompt) {
1829
+ enrichedReq = {
1830
+ ...req,
1831
+ context: {
1832
+ ...req.context,
1833
+ system_context: [
1834
+ scopedCtx.personality_prompt,
1835
+ ...req.context?.system_context != null ? [String(req.context.system_context)] : []
1836
+ ].join("\n\n"),
1837
+ entity_label: scopedCtx.entity_label,
1838
+ parent_entity_labels: scopedCtx.parent_entity_labels
1839
+ }
1840
+ };
1841
+ }
1842
+ }
1843
+ const session = this.createSession(enrichedReq);
1844
+ try {
1845
+ await this.startSession(session.id);
1846
+ this.addStep(session.id, `Extracting entities from: "${req.task.slice(0, 60)}${req.task.length > 60 ? "\u2026" : ""}"`);
1847
+ this.addStep(session.id, "Querying knowledge graph (structural + semantic)\u2026");
1848
+ if (session.plan) {
1849
+ const edge = session.plan.selected_edge;
1850
+ if (edge) {
1851
+ this.addStep(
1852
+ session.id,
1853
+ `Selected plan: ${edge.from_label} \u2192 ${edge.to_label} (weight: ${edge.weight.toFixed(2)}, mode: ${edge.mode})`,
1854
+ session.plan
1855
+ );
1856
+ } else {
1857
+ this.addStep(session.id, `No prior plan found \u2014 bootstrapping from scratch`, session.plan);
1858
+ }
1859
+ if (session.plan.skill) {
1860
+ this.addStep(session.id, `Matched skill: /${session.plan.skill}`);
1861
+ }
1862
+ } else {
1863
+ this.addStep(session.id, "No inference engine connected \u2014 executing task directly");
1864
+ }
1865
+ this.addStep(session.id, "Executing\u2026");
1866
+ const output = session.plan?.reasoning ?? "Task queued \u2014 no plan selected";
1867
+ this.addStep(session.id, `Completed: ${output}`);
1868
+ this.completeSession(session.id, {
1869
+ output,
1870
+ plan: session.plan ?? null,
1871
+ steps: session.steps.length
1872
+ });
1873
+ } catch (err) {
1874
+ const message = err instanceof Error ? err.message : String(err);
1875
+ this.failSession(session.id, message);
1876
+ }
1877
+ return this.sessions.get(session.id);
1878
+ }
1879
+ /**
1880
+ * Return the number of active (running) sessions.
1881
+ */
1882
+ activeSessionCount() {
1883
+ let count = 0;
1884
+ for (const s of this.sessions.values()) {
1885
+ if (s.status === "running") count++;
1886
+ }
1887
+ return count;
1888
+ }
1889
+ // ─── Private helpers ───────────────────────────────
1890
+ getSessionOrThrow(id) {
1891
+ const session = this.sessions.get(id);
1892
+ if (!session) {
1893
+ throw new Error(`Session not found: ${id}`);
1894
+ }
1895
+ return session;
1896
+ }
1897
+ emit(event) {
1898
+ if (this.eventBus) {
1899
+ this.eventBus.emit(event);
1900
+ }
1901
+ }
1902
+ };
1903
+
1904
+ // packages/daemon/src/WebSocketEvents.ts
1905
+ var WebSocketEventBus = class {
1906
+ clients = /* @__PURE__ */ new Set();
1907
+ handlers = /* @__PURE__ */ new Set();
1908
+ heartbeatTimer = null;
1909
+ /**
1910
+ * Register a connected WebSocket client.
1911
+ * Automatically removes on close.
1912
+ */
1913
+ addClient(ws) {
1914
+ this.clients.add(ws);
1915
+ ws.on("close", () => {
1916
+ this.clients.delete(ws);
1917
+ });
1918
+ ws.on("error", () => {
1919
+ this.clients.delete(ws);
1920
+ });
1921
+ }
1922
+ /**
1923
+ * Manually remove a WebSocket client.
1924
+ */
1925
+ removeClient(ws) {
1926
+ this.clients.delete(ws);
1927
+ }
1928
+ /**
1929
+ * Emit an event to all local handlers and broadcast to WS clients.
1930
+ */
1931
+ emit(event) {
1932
+ const typed = event;
1933
+ for (const handler of this.handlers) {
1934
+ try {
1935
+ handler(typed);
1936
+ } catch {
1937
+ }
1938
+ }
1939
+ this.broadcast(typed);
1940
+ }
1941
+ /**
1942
+ * Register a local event handler.
1943
+ * Returns an unsubscribe function.
1944
+ */
1945
+ onEvent(handler) {
1946
+ this.handlers.add(handler);
1947
+ return () => {
1948
+ this.handlers.delete(handler);
1949
+ };
1950
+ }
1951
+ /**
1952
+ * Send an event to all connected WebSocket clients.
1953
+ */
1954
+ broadcast(event) {
1955
+ if (this.clients.size === 0) return;
1956
+ const data = JSON.stringify(event);
1957
+ for (const ws of this.clients) {
1958
+ try {
1959
+ ws.send(data);
1960
+ } catch {
1961
+ this.clients.delete(ws);
1962
+ }
1963
+ }
1964
+ }
1965
+ /**
1966
+ * Start a periodic heartbeat that emits daemon.stats events.
1967
+ * Runs every 30 seconds.
1968
+ */
1969
+ startStatsHeartbeat(getStats) {
1970
+ this.stopStatsHeartbeat();
1971
+ this.heartbeatTimer = setInterval(() => {
1972
+ const stats = getStats();
1973
+ this.emit({
1974
+ type: "daemon.stats",
1975
+ graph_nodes: stats.graph_nodes,
1976
+ active_sessions: stats.active_sessions
1977
+ });
1978
+ }, 3e4);
1979
+ }
1980
+ /**
1981
+ * Stop the stats heartbeat.
1982
+ */
1983
+ stopStatsHeartbeat() {
1984
+ if (this.heartbeatTimer !== null) {
1985
+ clearInterval(this.heartbeatTimer);
1986
+ this.heartbeatTimer = null;
1987
+ }
1988
+ }
1989
+ /**
1990
+ * Get the number of connected WS clients.
1991
+ */
1992
+ clientCount() {
1993
+ return this.clients.size;
1994
+ }
1995
+ /**
1996
+ * Get the number of registered local handlers.
1997
+ */
1998
+ handlerCount() {
1999
+ return this.handlers.size;
2000
+ }
2001
+ };
2002
+
2003
+ // packages/daemon/src/BackgroundWorkers.ts
2004
+ var DEFAULT_CONFIG2 = {
2005
+ decay_interval_ms: 6 * 60 * 60 * 1e3,
2006
+ // 6 hours
2007
+ deferred_trace_interval_ms: 6e4,
2008
+ // 60 seconds
2009
+ compactor_interval_ms: 24 * 60 * 60 * 1e3,
2010
+ // 24 hours
2011
+ enrichment_interval_ms: 5 * 60 * 1e3
2012
+ // 5 minutes
2013
+ };
2014
+ var BackgroundWorkers = class {
2015
+ graph;
2016
+ decayScheduler;
2017
+ traceStore;
2018
+ config;
2019
+ timers = /* @__PURE__ */ new Map();
2020
+ lastRunTimes = /* @__PURE__ */ new Map();
2021
+ running = false;
2022
+ constructor(deps = {}) {
2023
+ this.graph = deps.graph;
2024
+ this.decayScheduler = deps.decayScheduler;
2025
+ this.traceStore = deps.traceStore;
2026
+ this.config = { ...DEFAULT_CONFIG2, ...deps.config };
2027
+ }
2028
+ /**
2029
+ * Start all background workers.
2030
+ */
2031
+ start() {
2032
+ if (this.running) return;
2033
+ this.running = true;
2034
+ if (this.decayScheduler) {
2035
+ const timer = setInterval(async () => {
2036
+ try {
2037
+ await this.decayScheduler.runCycle();
2038
+ this.lastRunTimes.set("decay", Date.now());
2039
+ } catch (err) {
2040
+ console.error("[BackgroundWorkers] Decay cycle failed:", err);
2041
+ }
2042
+ }, this.config.decay_interval_ms);
2043
+ this.timers.set("decay", timer);
2044
+ }
2045
+ if (this.traceStore) {
2046
+ const timer = setInterval(() => {
2047
+ try {
2048
+ this.resolveDeferredTraces();
2049
+ this.lastRunTimes.set("deferred_traces", Date.now());
2050
+ } catch (err) {
2051
+ console.error("[BackgroundWorkers] Deferred trace resolution failed:", err);
2052
+ }
2053
+ }, this.config.deferred_trace_interval_ms);
2054
+ this.timers.set("deferred_traces", timer);
2055
+ }
2056
+ {
2057
+ const timer = setInterval(() => {
2058
+ console.log("[BackgroundWorkers] compactor not yet implemented");
2059
+ this.lastRunTimes.set("compactor", Date.now());
2060
+ }, this.config.compactor_interval_ms);
2061
+ this.timers.set("compactor", timer);
2062
+ }
2063
+ {
2064
+ const timer = setInterval(() => {
2065
+ console.log("[BackgroundWorkers] enrichment not yet implemented");
2066
+ this.lastRunTimes.set("enrichment", Date.now());
2067
+ }, this.config.enrichment_interval_ms);
2068
+ this.timers.set("enrichment", timer);
2069
+ }
2070
+ }
2071
+ /**
2072
+ * Stop all background workers and clear timers.
2073
+ */
2074
+ stop() {
2075
+ for (const timer of this.timers.values()) {
2076
+ clearInterval(timer);
2077
+ }
2078
+ this.timers.clear();
2079
+ this.running = false;
2080
+ }
2081
+ /**
2082
+ * Whether workers are currently running.
2083
+ */
2084
+ isRunning() {
2085
+ return this.running;
2086
+ }
2087
+ /**
2088
+ * Get status of all registered workers.
2089
+ */
2090
+ getWorkerStatus() {
2091
+ const workerNames = ["decay", "deferred_traces", "compactor", "enrichment"];
2092
+ return workerNames.map((name) => ({
2093
+ name,
2094
+ active: this.timers.has(name),
2095
+ last_run_at: this.lastRunTimes.get(name) ?? null
2096
+ }));
2097
+ }
2098
+ // ─── Private ───────────────────────────────────────
2099
+ /**
2100
+ * Find expired deferred traces and resolve them with signal 0.0.
2101
+ */
2102
+ resolveDeferredTraces() {
2103
+ if (!this.traceStore) return;
2104
+ const now = Date.now();
2105
+ const deferred = this.traceStore.query({ deferred: true, limit: 100 });
2106
+ for (const trace of deferred) {
2107
+ if (trace.deferred_until !== null && trace.deferred_until <= now) {
2108
+ this.traceStore.updateOutcome(trace.id, 0, "timeout", now);
2109
+ }
2110
+ }
2111
+ }
2112
+ };
2113
+
2114
+ // packages/daemon/src/SkillRegistry.ts
2115
+ import { readFileSync as readFileSync2, readdirSync, existsSync as existsSync2, writeFileSync, unlinkSync, mkdirSync } from "node:fs";
2116
+ import { join } from "node:path";
2117
+ import { homedir as homedir2 } from "node:os";
2118
+ import YAML2 from "yaml";
2119
+ var SkillRegistry = class {
2120
+ skills = /* @__PURE__ */ new Map();
2121
+ builtinNames = /* @__PURE__ */ new Set();
2122
+ builtinDir;
2123
+ customDir;
2124
+ constructor(opts) {
2125
+ this.builtinDir = opts?.builtinDir ?? join(homedir2(), ".0agent", "skills", "builtin");
2126
+ this.customDir = opts?.customDir ?? join(homedir2(), ".0agent", "skills", "custom");
2127
+ }
2128
+ /**
2129
+ * Load all skills from builtin + custom directories.
2130
+ */
2131
+ async loadAll() {
2132
+ this.skills.clear();
2133
+ this.builtinNames.clear();
2134
+ this.loadFromDir(this.builtinDir, true);
2135
+ this.loadFromDir(this.customDir, false);
2136
+ }
2137
+ loadFromDir(dir, isBuiltin) {
2138
+ if (!existsSync2(dir)) return;
2139
+ const files = readdirSync(dir).filter((f) => f.endsWith(".yaml") || f.endsWith(".yml"));
2140
+ for (const file of files) {
2141
+ try {
2142
+ const raw = readFileSync2(join(dir, file), "utf8");
2143
+ const skill = YAML2.parse(raw);
2144
+ if (skill.name) {
2145
+ this.skills.set(skill.name, skill);
2146
+ if (isBuiltin) this.builtinNames.add(skill.name);
2147
+ }
2148
+ } catch (err) {
2149
+ console.warn(`Failed to load skill ${file}: ${err}`);
2150
+ }
2151
+ }
2152
+ }
2153
+ /**
2154
+ * Reload all skills (after create/delete).
2155
+ */
2156
+ async reload() {
2157
+ await this.loadAll();
2158
+ }
2159
+ get(name) {
2160
+ const normalized = name.replace(/^\//, "");
2161
+ return this.skills.get(normalized);
2162
+ }
2163
+ list() {
2164
+ return [...this.skills.values()];
2165
+ }
2166
+ isBuiltin(name) {
2167
+ return this.builtinNames.has(name);
2168
+ }
2169
+ /**
2170
+ * Create a custom skill. Returns the SkillDefinition.
2171
+ * Throws if name conflicts with built-in.
2172
+ */
2173
+ createCustom(name, yamlContent) {
2174
+ if (this.builtinNames.has(name)) {
2175
+ throw new Error(`Cannot override built-in skill: ${name}`);
2176
+ }
2177
+ mkdirSync(this.customDir, { recursive: true });
2178
+ const filePath = join(this.customDir, `${name}.yaml`);
2179
+ writeFileSync(filePath, yamlContent, "utf8");
2180
+ const skill = YAML2.parse(yamlContent);
2181
+ this.skills.set(name, skill);
2182
+ return skill;
2183
+ }
2184
+ /**
2185
+ * Remove a custom skill. Throws if built-in.
2186
+ */
2187
+ removeCustom(name) {
2188
+ if (this.builtinNames.has(name)) {
2189
+ throw new Error(`Cannot delete built-in skill: ${name}`);
2190
+ }
2191
+ const filePath = join(this.customDir, `${name}.yaml`);
2192
+ if (existsSync2(filePath)) {
2193
+ unlinkSync(filePath);
2194
+ }
2195
+ this.skills.delete(name);
2196
+ }
2197
+ get size() {
2198
+ return this.skills.size;
2199
+ }
2200
+ };
2201
+
2202
+ // packages/daemon/src/HTTPServer.ts
2203
+ import { Hono as Hono8 } from "hono";
2204
+ import { serve } from "@hono/node-server";
2205
+
2206
+ // packages/daemon/src/routes/health.ts
2207
+ import { Hono } from "hono";
2208
+ function healthRoutes(deps) {
2209
+ const app = new Hono();
2210
+ app.get("/", (c) => {
2211
+ const status = deps.getStatus();
2212
+ return c.json({ ok: true, timestamp: Date.now(), ...status });
2213
+ });
2214
+ return app;
2215
+ }
2216
+
2217
+ // packages/daemon/src/routes/sessions.ts
2218
+ import { Hono as Hono2 } from "hono";
2219
+ function sessionRoutes(deps) {
2220
+ const app = new Hono2();
2221
+ app.post("/", async (c) => {
2222
+ const body = await c.req.json();
2223
+ if (!body.task || typeof body.task !== "string") {
2224
+ return c.json({ error: "task is required and must be a string" }, 400);
2225
+ }
2226
+ const session = deps.sessions.createSession(body);
2227
+ deps.sessions.runSession(body).catch(() => {
2228
+ });
2229
+ return c.json({ session_id: session.id, status: "pending" }, 201);
2230
+ });
2231
+ app.get("/", (c) => {
2232
+ const sessions = deps.sessions.listSessions();
2233
+ return c.json(sessions);
2234
+ });
2235
+ app.get("/:id", (c) => {
2236
+ const id = c.req.param("id");
2237
+ const session = deps.sessions.getSession(id);
2238
+ if (!session) {
2239
+ return c.json({ error: "Session not found" }, 404);
2240
+ }
2241
+ return c.json(session);
2242
+ });
2243
+ app.delete("/:id", (c) => {
2244
+ const id = c.req.param("id");
2245
+ const session = deps.sessions.getSession(id);
2246
+ if (!session) {
2247
+ return c.json({ error: "Session not found" }, 404);
2248
+ }
2249
+ deps.sessions.cancelSession(id);
2250
+ return c.json({ ok: true });
2251
+ });
2252
+ return app;
2253
+ }
2254
+
2255
+ // packages/daemon/src/routes/graph.ts
2256
+ import { Hono as Hono3 } from "hono";
2257
+ function graphRoutes(deps) {
2258
+ const app = new Hono3();
2259
+ app.get("/nodes", (c) => {
2260
+ const graph_id = c.req.query("graph_id");
2261
+ const type = c.req.query("type");
2262
+ const limitStr = c.req.query("limit");
2263
+ const limit = limitStr ? parseInt(limitStr, 10) : 50;
2264
+ const results = deps.graph.queryStructural({
2265
+ graph_id: graph_id || void 0,
2266
+ node_type: type || void 0,
2267
+ limit
2268
+ });
2269
+ return c.json(results.map((r) => r.node));
2270
+ });
2271
+ app.get("/nodes/:id", (c) => {
2272
+ const id = c.req.param("id");
2273
+ const node = deps.graph.getNode(id);
2274
+ if (!node) {
2275
+ return c.json({ error: "Node not found" }, 404);
2276
+ }
2277
+ return c.json(node);
2278
+ });
2279
+ app.get("/edges", (c) => {
2280
+ const from_node = c.req.query("from_node");
2281
+ const to_node = c.req.query("to_node");
2282
+ const type = c.req.query("type");
2283
+ let edges;
2284
+ if (from_node && to_node) {
2285
+ edges = deps.graph.getEdgesBetween(from_node, to_node);
2286
+ } else if (from_node) {
2287
+ edges = deps.graph.getEdgesFrom(from_node);
2288
+ } else if (to_node) {
2289
+ edges = deps.graph.getEdgesTo(to_node);
2290
+ } else {
2291
+ edges = deps.graph.getAllEdges();
2292
+ }
2293
+ if (type) {
2294
+ edges = edges.filter((e) => e.type === type);
2295
+ }
2296
+ return c.json(edges);
2297
+ });
2298
+ app.post("/query", async (c) => {
2299
+ const body = await c.req.json();
2300
+ const results = deps.graph.queryMerged({
2301
+ structural: body.structural ?? {},
2302
+ semantic: body.semantic,
2303
+ limit: body.limit
2304
+ });
2305
+ return c.json(results);
2306
+ });
2307
+ return app;
2308
+ }
2309
+
2310
+ // packages/daemon/src/routes/entities.ts
2311
+ import { Hono as Hono4 } from "hono";
2312
+ function entityRoutes(deps) {
2313
+ const app = new Hono4();
2314
+ app.get("/", (c) => {
2315
+ const results = deps.graph.queryStructural({
2316
+ node_type: "entity",
2317
+ limit: 200
2318
+ });
2319
+ return c.json(results.map((r) => r.node));
2320
+ });
2321
+ app.get("/:id", (c) => {
2322
+ const id = c.req.param("id");
2323
+ const node = deps.graph.getNode(id);
2324
+ if (!node) {
2325
+ return c.json({ error: "Entity not found" }, 404);
2326
+ }
2327
+ try {
2328
+ const subgraph = deps.graph.getSubGraph(id, 2);
2329
+ const nodes = subgraph.getNodes();
2330
+ const edges = subgraph.getEdges();
2331
+ let last_seen = node.last_seen;
2332
+ for (const n of nodes) {
2333
+ if (n.last_seen > last_seen) {
2334
+ last_seen = n.last_seen;
2335
+ }
2336
+ }
2337
+ return c.json({
2338
+ ...node,
2339
+ subgraph_summary: {
2340
+ nodeCount: nodes.length,
2341
+ edgeCount: edges.length,
2342
+ last_seen
2343
+ }
2344
+ });
2345
+ } catch {
2346
+ return c.json({
2347
+ ...node,
2348
+ subgraph_summary: {
2349
+ nodeCount: 1,
2350
+ edgeCount: 0,
2351
+ last_seen: node.last_seen
2352
+ }
2353
+ });
2354
+ }
2355
+ });
2356
+ return app;
2357
+ }
2358
+
2359
+ // packages/daemon/src/routes/traces.ts
2360
+ import { Hono as Hono5 } from "hono";
2361
+ function traceRoutes(deps) {
2362
+ const app = new Hono5();
2363
+ app.get("/", (c) => {
2364
+ const session_id = c.req.query("session_id");
2365
+ const deferredStr = c.req.query("deferred");
2366
+ const limitStr = c.req.query("limit");
2367
+ const deferred = deferredStr !== void 0 && deferredStr !== "" ? deferredStr === "true" : void 0;
2368
+ const limit = limitStr ? parseInt(limitStr, 10) : void 0;
2369
+ const traces = deps.traceStore.query({
2370
+ session_id: session_id || void 0,
2371
+ deferred,
2372
+ limit
2373
+ });
2374
+ return c.json(traces);
2375
+ });
2376
+ app.get("/:id", (c) => {
2377
+ const id = c.req.param("id");
2378
+ const trace = deps.traceStore.get(id);
2379
+ if (!trace) {
2380
+ return c.json({ error: "Trace not found" }, 404);
2381
+ }
2382
+ return c.json(trace);
2383
+ });
2384
+ return app;
2385
+ }
2386
+
2387
+ // packages/daemon/src/routes/subagents.ts
2388
+ import { Hono as Hono6 } from "hono";
2389
+ function subagentRoutes() {
2390
+ const app = new Hono6();
2391
+ app.get("/", (c) => {
2392
+ return c.json([]);
2393
+ });
2394
+ app.delete("/:id", (c) => {
2395
+ return c.json({ error: "No subagent system in Phase 2" }, 404);
2396
+ });
2397
+ return app;
2398
+ }
2399
+
2400
+ // packages/daemon/src/routes/skills.ts
2401
+ import { Hono as Hono7 } from "hono";
2402
+ function skillRoutes(deps) {
2403
+ const app = new Hono7();
2404
+ app.get("/", (c) => {
2405
+ const skills = deps.skillRegistry.list();
2406
+ return c.json(skills);
2407
+ });
2408
+ app.get("/:name", (c) => {
2409
+ const name = c.req.param("name");
2410
+ const skill = deps.skillRegistry.get(name);
2411
+ if (!skill) {
2412
+ return c.json({ error: "Skill not found" }, 404);
2413
+ }
2414
+ return c.json(skill);
2415
+ });
2416
+ app.post("/", async (c) => {
2417
+ const body = await c.req.json();
2418
+ if (!body.name || typeof body.name !== "string") {
2419
+ return c.json({ error: "name is required" }, 400);
2420
+ }
2421
+ if (!body.yaml || typeof body.yaml !== "string") {
2422
+ return c.json({ error: "yaml is required" }, 400);
2423
+ }
2424
+ if (deps.skillRegistry.isBuiltin(body.name)) {
2425
+ return c.json({ error: "Conflicts with built-in skill" }, 409);
2426
+ }
2427
+ try {
2428
+ const skill = deps.skillRegistry.createCustom(body.name, body.yaml);
2429
+ return c.json(skill, 201);
2430
+ } catch (err) {
2431
+ const message = err instanceof Error ? err.message : String(err);
2432
+ return c.json({ error: message }, 500);
2433
+ }
2434
+ });
2435
+ app.delete("/:name", (c) => {
2436
+ const name = c.req.param("name");
2437
+ if (deps.skillRegistry.isBuiltin(name)) {
2438
+ return c.json({ error: "Cannot delete built-in skill" }, 403);
2439
+ }
2440
+ const skill = deps.skillRegistry.get(name);
2441
+ if (!skill) {
2442
+ return c.json({ error: "Skill not found" }, 404);
2443
+ }
2444
+ try {
2445
+ deps.skillRegistry.removeCustom(name);
2446
+ return c.json({ ok: true });
2447
+ } catch (err) {
2448
+ const message = err instanceof Error ? err.message : String(err);
2449
+ return c.json({ error: message }, 500);
2450
+ }
2451
+ });
2452
+ return app;
2453
+ }
2454
+
2455
+ // packages/daemon/src/HTTPServer.ts
2456
+ var HTTPServer = class {
2457
+ app;
2458
+ server = null;
2459
+ deps;
2460
+ constructor(deps) {
2461
+ this.deps = deps;
2462
+ this.app = new Hono8();
2463
+ this.app.route("/api/health", healthRoutes({ getStatus: deps.getStatus }));
2464
+ this.app.route("/api/sessions", sessionRoutes({ sessions: deps.sessions }));
2465
+ this.app.route("/api/graph", graphRoutes({ graph: deps.graph }));
2466
+ this.app.route("/api/entities", entityRoutes({ graph: deps.graph }));
2467
+ this.app.route("/api/traces", traceRoutes({ traceStore: deps.traceStore }));
2468
+ this.app.route("/api/subagents", subagentRoutes());
2469
+ this.app.route("/api/skills", skillRoutes({ skillRegistry: deps.skillRegistry }));
2470
+ this.app.get("/", (c) => {
2471
+ return c.json({ name: "0agent-daemon", version: "2.0.0" });
2472
+ });
2473
+ }
2474
+ start() {
2475
+ return new Promise((resolve4) => {
2476
+ this.server = serve(
2477
+ {
2478
+ fetch: this.app.fetch,
2479
+ port: this.deps.port,
2480
+ hostname: this.deps.host
2481
+ },
2482
+ () => {
2483
+ resolve4();
2484
+ }
2485
+ );
2486
+ });
2487
+ }
2488
+ stop() {
2489
+ return new Promise((resolve4, reject) => {
2490
+ if (!this.server) {
2491
+ resolve4();
2492
+ return;
2493
+ }
2494
+ this.server.close((err) => {
2495
+ if (err) reject(err);
2496
+ else resolve4();
2497
+ });
2498
+ });
2499
+ }
2500
+ getApp() {
2501
+ return this.app;
2502
+ }
2503
+ };
2504
+
2505
+ // packages/daemon/src/ZeroAgentDaemon.ts
2506
+ var ZeroAgentDaemon = class {
2507
+ config = null;
2508
+ adapter = null;
2509
+ graph = null;
2510
+ traceStore = null;
2511
+ inferenceEngine = null;
2512
+ sessionManager = null;
2513
+ eventBus = null;
2514
+ httpServer = null;
2515
+ skillRegistry = null;
2516
+ backgroundWorkers = null;
2517
+ startedAt = 0;
2518
+ pidFilePath;
2519
+ constructor() {
2520
+ this.pidFilePath = resolve2(homedir3(), ".0agent", "daemon.pid");
2521
+ }
2522
+ async start(opts) {
2523
+ this.config = await loadConfig(opts?.config_path);
2524
+ const dotDir = resolve2(homedir3(), ".0agent");
2525
+ if (!existsSync3(dotDir)) {
2526
+ mkdirSync2(dotDir, { recursive: true });
2527
+ }
2528
+ this.adapter = new SQLiteAdapter({ db_path: this.config.graph.db_path });
2529
+ this.graph = new KnowledgeGraph(this.adapter);
2530
+ this.traceStore = new TraceStore(this.adapter);
2531
+ const aliasIndex = new AliasIndex(this.adapter);
2532
+ const resolver = new NodeResolutionService(this.graph, aliasIndex, null, null);
2533
+ const policy = new SelectionPolicy();
2534
+ this.inferenceEngine = new InferenceEngine(this.graph, resolver, policy);
2535
+ this.skillRegistry = new SkillRegistry();
2536
+ await this.skillRegistry.loadAll();
2537
+ this.eventBus = new WebSocketEventBus();
2538
+ this.sessionManager = new SessionManager({
2539
+ inferenceEngine: this.inferenceEngine,
2540
+ eventBus: this.eventBus
2541
+ });
2542
+ this.backgroundWorkers = new BackgroundWorkers({
2543
+ graph: this.graph,
2544
+ traceStore: this.traceStore
2545
+ });
2546
+ this.backgroundWorkers.start();
2547
+ this.eventBus.startStatsHeartbeat(() => ({
2548
+ graph_nodes: this.graph.nodeCount(),
2549
+ active_sessions: this.sessionManager.activeSessionCount()
2550
+ }));
2551
+ this.startedAt = Date.now();
2552
+ this.httpServer = new HTTPServer({
2553
+ port: this.config.server.port,
2554
+ host: this.config.server.host,
2555
+ sessions: this.sessionManager,
2556
+ graph: this.graph,
2557
+ traceStore: this.traceStore,
2558
+ skillRegistry: this.skillRegistry,
2559
+ getStatus: () => this.getStatus()
2560
+ });
2561
+ await this.httpServer.start();
2562
+ writeFileSync2(this.pidFilePath, String(process.pid), "utf8");
2563
+ console.log(
2564
+ `[0agent] Daemon started on ${this.config.server.host}:${this.config.server.port} (PID: ${process.pid})`
2565
+ );
2566
+ const shutdown = async () => {
2567
+ console.log("[0agent] Shutting down...");
2568
+ await this.stop();
2569
+ process.exit(0);
2570
+ };
2571
+ process.on("SIGTERM", shutdown);
2572
+ process.on("SIGINT", shutdown);
2573
+ }
2574
+ async stop() {
2575
+ if (this.httpServer) {
2576
+ await this.httpServer.stop();
2577
+ this.httpServer = null;
2578
+ }
2579
+ if (this.eventBus) {
2580
+ this.eventBus.stopStatsHeartbeat();
2581
+ this.eventBus = null;
2582
+ }
2583
+ if (this.backgroundWorkers) {
2584
+ this.backgroundWorkers.stop();
2585
+ this.backgroundWorkers = null;
2586
+ }
2587
+ this.sessionManager = null;
2588
+ this.skillRegistry = null;
2589
+ this.inferenceEngine = null;
2590
+ this.traceStore = null;
2591
+ if (this.graph) {
2592
+ this.graph.close();
2593
+ this.graph = null;
2594
+ }
2595
+ this.adapter = null;
2596
+ if (existsSync3(this.pidFilePath)) {
2597
+ try {
2598
+ unlinkSync2(this.pidFilePath);
2599
+ } catch {
2600
+ }
2601
+ }
2602
+ console.log("[0agent] Daemon stopped.");
2603
+ }
2604
+ getStatus() {
2605
+ const runningWorkers = [];
2606
+ if (this.backgroundWorkers?.isRunning()) {
2607
+ const statuses = this.backgroundWorkers.getWorkerStatus();
2608
+ for (const ws of statuses) {
2609
+ if (ws.active) runningWorkers.push(ws.name);
2610
+ }
2611
+ }
2612
+ return {
2613
+ version: "2.0.0",
2614
+ uptime_ms: this.startedAt ? Date.now() - this.startedAt : 0,
2615
+ graph_nodes: this.graph?.nodeCount() ?? 0,
2616
+ graph_edges: this.graph?.edgeCount() ?? 0,
2617
+ active_sessions: this.sessionManager?.activeSessionCount() ?? 0,
2618
+ mcp_servers_connected: 0,
2619
+ workers_running: runningWorkers,
2620
+ sandbox_backend: this.config?.sandbox.backend ?? "auto"
2621
+ };
2622
+ }
2623
+ };
2624
+
2625
+ // packages/daemon/src/start.ts
2626
+ import { resolve as resolve3 } from "node:path";
2627
+ import { homedir as homedir4 } from "node:os";
2628
+ import { existsSync as existsSync4 } from "node:fs";
2629
+ var CONFIG_PATH = process.env["ZEROAGENT_CONFIG"] ?? resolve3(homedir4(), ".0agent", "config.yaml");
2630
+ if (!existsSync4(CONFIG_PATH)) {
2631
+ console.error(`
2632
+ 0agent is not initialised.
2633
+
2634
+ Run: npx 0agent@latest init
2635
+ `);
2636
+ process.exit(1);
2637
+ }
2638
+ var daemon = new ZeroAgentDaemon();
2639
+ try {
2640
+ await daemon.start({ config_path: CONFIG_PATH });
2641
+ } catch (err) {
2642
+ console.error("Failed to start daemon:", err instanceof Error ? err.message : err);
2643
+ process.exit(1);
2644
+ }