@stoneforge/quarry 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +160 -0
  3. package/dist/api/index.d.ts +8 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +8 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/quarry-api.d.ts +268 -0
  8. package/dist/api/quarry-api.d.ts.map +1 -0
  9. package/dist/api/quarry-api.js +3905 -0
  10. package/dist/api/quarry-api.js.map +1 -0
  11. package/dist/api/types.d.ts +1359 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +204 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/bin/sf.d.ts +3 -0
  16. package/dist/bin/sf.d.ts.map +1 -0
  17. package/dist/bin/sf.js +9 -0
  18. package/dist/bin/sf.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +11 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +465 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/alias.d.ts +8 -0
  24. package/dist/cli/commands/alias.d.ts.map +1 -0
  25. package/dist/cli/commands/alias.js +70 -0
  26. package/dist/cli/commands/alias.js.map +1 -0
  27. package/dist/cli/commands/channel.d.ts +13 -0
  28. package/dist/cli/commands/channel.d.ts.map +1 -0
  29. package/dist/cli/commands/channel.js +680 -0
  30. package/dist/cli/commands/channel.js.map +1 -0
  31. package/dist/cli/commands/completion.d.ts +8 -0
  32. package/dist/cli/commands/completion.d.ts.map +1 -0
  33. package/dist/cli/commands/completion.js +87 -0
  34. package/dist/cli/commands/completion.js.map +1 -0
  35. package/dist/cli/commands/config.d.ts +12 -0
  36. package/dist/cli/commands/config.d.ts.map +1 -0
  37. package/dist/cli/commands/config.js +242 -0
  38. package/dist/cli/commands/config.js.map +1 -0
  39. package/dist/cli/commands/crud.d.ts +64 -0
  40. package/dist/cli/commands/crud.d.ts.map +1 -0
  41. package/dist/cli/commands/crud.js +805 -0
  42. package/dist/cli/commands/crud.js.map +1 -0
  43. package/dist/cli/commands/dep.d.ts +16 -0
  44. package/dist/cli/commands/dep.d.ts.map +1 -0
  45. package/dist/cli/commands/dep.js +499 -0
  46. package/dist/cli/commands/dep.js.map +1 -0
  47. package/dist/cli/commands/document.d.ts +12 -0
  48. package/dist/cli/commands/document.d.ts.map +1 -0
  49. package/dist/cli/commands/document.js +1039 -0
  50. package/dist/cli/commands/document.js.map +1 -0
  51. package/dist/cli/commands/embeddings.d.ts +12 -0
  52. package/dist/cli/commands/embeddings.d.ts.map +1 -0
  53. package/dist/cli/commands/embeddings.js +273 -0
  54. package/dist/cli/commands/embeddings.js.map +1 -0
  55. package/dist/cli/commands/entity.d.ts +16 -0
  56. package/dist/cli/commands/entity.d.ts.map +1 -0
  57. package/dist/cli/commands/entity.js +522 -0
  58. package/dist/cli/commands/entity.js.map +1 -0
  59. package/dist/cli/commands/gc.d.ts +10 -0
  60. package/dist/cli/commands/gc.d.ts.map +1 -0
  61. package/dist/cli/commands/gc.js +257 -0
  62. package/dist/cli/commands/gc.js.map +1 -0
  63. package/dist/cli/commands/help.d.ts +11 -0
  64. package/dist/cli/commands/help.d.ts.map +1 -0
  65. package/dist/cli/commands/help.js +169 -0
  66. package/dist/cli/commands/help.js.map +1 -0
  67. package/dist/cli/commands/history.d.ts +9 -0
  68. package/dist/cli/commands/history.d.ts.map +1 -0
  69. package/dist/cli/commands/history.js +160 -0
  70. package/dist/cli/commands/history.js.map +1 -0
  71. package/dist/cli/commands/identity.d.ts +18 -0
  72. package/dist/cli/commands/identity.d.ts.map +1 -0
  73. package/dist/cli/commands/identity.js +698 -0
  74. package/dist/cli/commands/identity.js.map +1 -0
  75. package/dist/cli/commands/inbox.d.ts +20 -0
  76. package/dist/cli/commands/inbox.d.ts.map +1 -0
  77. package/dist/cli/commands/inbox.js +493 -0
  78. package/dist/cli/commands/inbox.js.map +1 -0
  79. package/dist/cli/commands/init.d.ts +20 -0
  80. package/dist/cli/commands/init.d.ts.map +1 -0
  81. package/dist/cli/commands/init.js +144 -0
  82. package/dist/cli/commands/init.js.map +1 -0
  83. package/dist/cli/commands/install.d.ts +9 -0
  84. package/dist/cli/commands/install.d.ts.map +1 -0
  85. package/dist/cli/commands/install.js +200 -0
  86. package/dist/cli/commands/install.js.map +1 -0
  87. package/dist/cli/commands/library.d.ts +12 -0
  88. package/dist/cli/commands/library.d.ts.map +1 -0
  89. package/dist/cli/commands/library.js +665 -0
  90. package/dist/cli/commands/library.js.map +1 -0
  91. package/dist/cli/commands/message.d.ts +11 -0
  92. package/dist/cli/commands/message.d.ts.map +1 -0
  93. package/dist/cli/commands/message.js +608 -0
  94. package/dist/cli/commands/message.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +17 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +698 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/playbook.d.ts +12 -0
  100. package/dist/cli/commands/playbook.d.ts.map +1 -0
  101. package/dist/cli/commands/playbook.js +730 -0
  102. package/dist/cli/commands/playbook.js.map +1 -0
  103. package/dist/cli/commands/reset.d.ts +12 -0
  104. package/dist/cli/commands/reset.d.ts.map +1 -0
  105. package/dist/cli/commands/reset.js +306 -0
  106. package/dist/cli/commands/reset.js.map +1 -0
  107. package/dist/cli/commands/serve.d.ts +11 -0
  108. package/dist/cli/commands/serve.d.ts.map +1 -0
  109. package/dist/cli/commands/serve.js +106 -0
  110. package/dist/cli/commands/serve.js.map +1 -0
  111. package/dist/cli/commands/stats.d.ts +8 -0
  112. package/dist/cli/commands/stats.d.ts.map +1 -0
  113. package/dist/cli/commands/stats.js +82 -0
  114. package/dist/cli/commands/stats.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +14 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +370 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/commands/task.d.ts +25 -0
  120. package/dist/cli/commands/task.d.ts.map +1 -0
  121. package/dist/cli/commands/task.js +1153 -0
  122. package/dist/cli/commands/task.js.map +1 -0
  123. package/dist/cli/commands/team.d.ts +13 -0
  124. package/dist/cli/commands/team.d.ts.map +1 -0
  125. package/dist/cli/commands/team.js +471 -0
  126. package/dist/cli/commands/team.js.map +1 -0
  127. package/dist/cli/commands/workflow.d.ts +16 -0
  128. package/dist/cli/commands/workflow.d.ts.map +1 -0
  129. package/dist/cli/commands/workflow.js +753 -0
  130. package/dist/cli/commands/workflow.js.map +1 -0
  131. package/dist/cli/completion.d.ts +28 -0
  132. package/dist/cli/completion.d.ts.map +1 -0
  133. package/dist/cli/completion.js +295 -0
  134. package/dist/cli/completion.js.map +1 -0
  135. package/dist/cli/db.d.ts +38 -0
  136. package/dist/cli/db.d.ts.map +1 -0
  137. package/dist/cli/db.js +90 -0
  138. package/dist/cli/db.js.map +1 -0
  139. package/dist/cli/formatter.d.ts +87 -0
  140. package/dist/cli/formatter.d.ts.map +1 -0
  141. package/dist/cli/formatter.js +464 -0
  142. package/dist/cli/formatter.js.map +1 -0
  143. package/dist/cli/index.d.ts +33 -0
  144. package/dist/cli/index.d.ts.map +1 -0
  145. package/dist/cli/index.js +38 -0
  146. package/dist/cli/index.js.map +1 -0
  147. package/dist/cli/parser.d.ts +45 -0
  148. package/dist/cli/parser.d.ts.map +1 -0
  149. package/dist/cli/parser.js +256 -0
  150. package/dist/cli/parser.js.map +1 -0
  151. package/dist/cli/plugin-loader.d.ts +39 -0
  152. package/dist/cli/plugin-loader.d.ts.map +1 -0
  153. package/dist/cli/plugin-loader.js +165 -0
  154. package/dist/cli/plugin-loader.js.map +1 -0
  155. package/dist/cli/plugin-registry.d.ts +50 -0
  156. package/dist/cli/plugin-registry.d.ts.map +1 -0
  157. package/dist/cli/plugin-registry.js +206 -0
  158. package/dist/cli/plugin-registry.js.map +1 -0
  159. package/dist/cli/plugin-types.d.ts +106 -0
  160. package/dist/cli/plugin-types.d.ts.map +1 -0
  161. package/dist/cli/plugin-types.js +103 -0
  162. package/dist/cli/plugin-types.js.map +1 -0
  163. package/dist/cli/runner.d.ts +35 -0
  164. package/dist/cli/runner.d.ts.map +1 -0
  165. package/dist/cli/runner.js +340 -0
  166. package/dist/cli/runner.js.map +1 -0
  167. package/dist/cli/suggest.d.ts +15 -0
  168. package/dist/cli/suggest.d.ts.map +1 -0
  169. package/dist/cli/suggest.js +49 -0
  170. package/dist/cli/suggest.js.map +1 -0
  171. package/dist/cli/types.d.ts +138 -0
  172. package/dist/cli/types.d.ts.map +1 -0
  173. package/dist/cli/types.js +63 -0
  174. package/dist/cli/types.js.map +1 -0
  175. package/dist/config/config.d.ts +86 -0
  176. package/dist/config/config.d.ts.map +1 -0
  177. package/dist/config/config.js +348 -0
  178. package/dist/config/config.js.map +1 -0
  179. package/dist/config/defaults.d.ts +66 -0
  180. package/dist/config/defaults.d.ts.map +1 -0
  181. package/dist/config/defaults.js +114 -0
  182. package/dist/config/defaults.js.map +1 -0
  183. package/dist/config/duration.d.ts +75 -0
  184. package/dist/config/duration.d.ts.map +1 -0
  185. package/dist/config/duration.js +190 -0
  186. package/dist/config/duration.js.map +1 -0
  187. package/dist/config/env.d.ts +67 -0
  188. package/dist/config/env.d.ts.map +1 -0
  189. package/dist/config/env.js +207 -0
  190. package/dist/config/env.js.map +1 -0
  191. package/dist/config/file.d.ts +97 -0
  192. package/dist/config/file.d.ts.map +1 -0
  193. package/dist/config/file.js +365 -0
  194. package/dist/config/file.js.map +1 -0
  195. package/dist/config/index.d.ts +35 -0
  196. package/dist/config/index.d.ts.map +1 -0
  197. package/dist/config/index.js +41 -0
  198. package/dist/config/index.js.map +1 -0
  199. package/dist/config/merge.d.ts +53 -0
  200. package/dist/config/merge.d.ts.map +1 -0
  201. package/dist/config/merge.js +226 -0
  202. package/dist/config/merge.js.map +1 -0
  203. package/dist/config/types.d.ts +257 -0
  204. package/dist/config/types.d.ts.map +1 -0
  205. package/dist/config/types.js +72 -0
  206. package/dist/config/types.js.map +1 -0
  207. package/dist/config/validation.d.ts +55 -0
  208. package/dist/config/validation.d.ts.map +1 -0
  209. package/dist/config/validation.js +251 -0
  210. package/dist/config/validation.js.map +1 -0
  211. package/dist/http/index.d.ts +8 -0
  212. package/dist/http/index.d.ts.map +1 -0
  213. package/dist/http/index.js +12 -0
  214. package/dist/http/index.js.map +1 -0
  215. package/dist/http/sync-handlers.d.ts +162 -0
  216. package/dist/http/sync-handlers.d.ts.map +1 -0
  217. package/dist/http/sync-handlers.js +271 -0
  218. package/dist/http/sync-handlers.js.map +1 -0
  219. package/dist/index.d.ts +25 -0
  220. package/dist/index.d.ts.map +1 -0
  221. package/dist/index.js +69 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/server/index.d.ts +34 -0
  224. package/dist/server/index.d.ts.map +1 -0
  225. package/dist/server/index.js +3329 -0
  226. package/dist/server/index.js.map +1 -0
  227. package/dist/server/static.d.ts +18 -0
  228. package/dist/server/static.d.ts.map +1 -0
  229. package/dist/server/static.js +71 -0
  230. package/dist/server/static.js.map +1 -0
  231. package/dist/server/ws/broadcaster.d.ts +8 -0
  232. package/dist/server/ws/broadcaster.d.ts.map +1 -0
  233. package/dist/server/ws/broadcaster.js +7 -0
  234. package/dist/server/ws/broadcaster.js.map +1 -0
  235. package/dist/server/ws/handler.d.ts +55 -0
  236. package/dist/server/ws/handler.d.ts.map +1 -0
  237. package/dist/server/ws/handler.js +160 -0
  238. package/dist/server/ws/handler.js.map +1 -0
  239. package/dist/services/blocked-cache.d.ts +297 -0
  240. package/dist/services/blocked-cache.d.ts.map +1 -0
  241. package/dist/services/blocked-cache.js +755 -0
  242. package/dist/services/blocked-cache.js.map +1 -0
  243. package/dist/services/dependency.d.ts +205 -0
  244. package/dist/services/dependency.d.ts.map +1 -0
  245. package/dist/services/dependency.js +566 -0
  246. package/dist/services/dependency.js.map +1 -0
  247. package/dist/services/embeddings/fusion.d.ts +33 -0
  248. package/dist/services/embeddings/fusion.d.ts.map +1 -0
  249. package/dist/services/embeddings/fusion.js +34 -0
  250. package/dist/services/embeddings/fusion.js.map +1 -0
  251. package/dist/services/embeddings/index.d.ts +12 -0
  252. package/dist/services/embeddings/index.d.ts.map +1 -0
  253. package/dist/services/embeddings/index.js +10 -0
  254. package/dist/services/embeddings/index.js.map +1 -0
  255. package/dist/services/embeddings/local-provider.d.ts +31 -0
  256. package/dist/services/embeddings/local-provider.d.ts.map +1 -0
  257. package/dist/services/embeddings/local-provider.js +80 -0
  258. package/dist/services/embeddings/local-provider.js.map +1 -0
  259. package/dist/services/embeddings/service.d.ts +76 -0
  260. package/dist/services/embeddings/service.d.ts.map +1 -0
  261. package/dist/services/embeddings/service.js +153 -0
  262. package/dist/services/embeddings/service.js.map +1 -0
  263. package/dist/services/embeddings/types.d.ts +70 -0
  264. package/dist/services/embeddings/types.d.ts.map +1 -0
  265. package/dist/services/embeddings/types.js +8 -0
  266. package/dist/services/embeddings/types.js.map +1 -0
  267. package/dist/services/id-length-cache.d.ts +156 -0
  268. package/dist/services/id-length-cache.d.ts.map +1 -0
  269. package/dist/services/id-length-cache.js +197 -0
  270. package/dist/services/id-length-cache.js.map +1 -0
  271. package/dist/services/inbox.d.ts +147 -0
  272. package/dist/services/inbox.d.ts.map +1 -0
  273. package/dist/services/inbox.js +428 -0
  274. package/dist/services/inbox.js.map +1 -0
  275. package/dist/services/index.d.ts +10 -0
  276. package/dist/services/index.d.ts.map +1 -0
  277. package/dist/services/index.js +10 -0
  278. package/dist/services/index.js.map +1 -0
  279. package/dist/services/priority-service.d.ts +145 -0
  280. package/dist/services/priority-service.d.ts.map +1 -0
  281. package/dist/services/priority-service.js +272 -0
  282. package/dist/services/priority-service.js.map +1 -0
  283. package/dist/services/search-utils.d.ts +47 -0
  284. package/dist/services/search-utils.d.ts.map +1 -0
  285. package/dist/services/search-utils.js +83 -0
  286. package/dist/services/search-utils.js.map +1 -0
  287. package/dist/sync/hash.d.ts +48 -0
  288. package/dist/sync/hash.d.ts.map +1 -0
  289. package/dist/sync/hash.js +136 -0
  290. package/dist/sync/hash.js.map +1 -0
  291. package/dist/sync/index.d.ts +11 -0
  292. package/dist/sync/index.d.ts.map +1 -0
  293. package/dist/sync/index.js +16 -0
  294. package/dist/sync/index.js.map +1 -0
  295. package/dist/sync/merge.d.ts +80 -0
  296. package/dist/sync/merge.d.ts.map +1 -0
  297. package/dist/sync/merge.js +310 -0
  298. package/dist/sync/merge.js.map +1 -0
  299. package/dist/sync/serialization.d.ts +132 -0
  300. package/dist/sync/serialization.d.ts.map +1 -0
  301. package/dist/sync/serialization.js +306 -0
  302. package/dist/sync/serialization.js.map +1 -0
  303. package/dist/sync/service.d.ts +102 -0
  304. package/dist/sync/service.d.ts.map +1 -0
  305. package/dist/sync/service.js +493 -0
  306. package/dist/sync/service.js.map +1 -0
  307. package/dist/sync/types.d.ts +275 -0
  308. package/dist/sync/types.d.ts.map +1 -0
  309. package/dist/sync/types.js +76 -0
  310. package/dist/sync/types.js.map +1 -0
  311. package/dist/systems/identity.d.ts +479 -0
  312. package/dist/systems/identity.d.ts.map +1 -0
  313. package/dist/systems/identity.js +817 -0
  314. package/dist/systems/identity.js.map +1 -0
  315. package/dist/systems/index.d.ts +8 -0
  316. package/dist/systems/index.d.ts.map +1 -0
  317. package/dist/systems/index.js +29 -0
  318. package/dist/systems/index.js.map +1 -0
  319. package/package.json +121 -0
  320. package/web/assets/charts-vendor-D1YcbGux.js +55 -0
  321. package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
  322. package/web/assets/editor-vendor-BxraAWts.js +279 -0
  323. package/web/assets/index-B77vv208.js +341 -0
  324. package/web/assets/index-CF_XnVLh.css +1 -0
  325. package/web/assets/router-vendor-BCKpRBrB.js +41 -0
  326. package/web/assets/ui-vendor-DUahGnbT.js +45 -0
  327. package/web/assets/utils-vendor-CfYKiENT.js +813 -0
  328. package/web/favicon.ico +0 -0
  329. package/web/index.html +23 -0
  330. package/web/logo.png +0 -0
@@ -0,0 +1,566 @@
1
+ /**
2
+ * Dependency Service - Core operations for managing dependencies
3
+ *
4
+ * Provides CRUD operations for dependencies:
5
+ * - addDependency: Create a new dependency between elements
6
+ * - removeDependency: Remove an existing dependency
7
+ * - getDependencies: Get all dependencies from a source element
8
+ * - getDependents: Get all elements that depend on a target
9
+ *
10
+ * All operations emit events for audit trail.
11
+ */
12
+ import { createDependency, validateDependencyType, validateElementId, validateEntityId, DependencyType as DT, normalizeRelatesToDependency, participatesInCycleDetection, EventType, createEvent, NotFoundError, ConflictError, ErrorCode, } from '@stoneforge/core';
13
+ /**
14
+ * Default cycle detection configuration
15
+ */
16
+ export const DEFAULT_CYCLE_DETECTION_CONFIG = {
17
+ maxDepth: 100,
18
+ };
19
+ // ============================================================================
20
+ // DependencyService Class
21
+ // ============================================================================
22
+ /**
23
+ * Service for managing dependencies between elements
24
+ */
25
+ export class DependencyService {
26
+ db;
27
+ constructor(db) {
28
+ this.db = db;
29
+ }
30
+ // --------------------------------------------------------------------------
31
+ // Schema Initialization
32
+ // --------------------------------------------------------------------------
33
+ /**
34
+ * Initialize the dependencies table schema
35
+ * Should be called during database setup
36
+ */
37
+ initSchema() {
38
+ this.db.exec(`
39
+ CREATE TABLE IF NOT EXISTS dependencies (
40
+ blocked_id TEXT NOT NULL,
41
+ blocker_id TEXT NOT NULL,
42
+ type TEXT NOT NULL,
43
+ created_at TEXT NOT NULL,
44
+ created_by TEXT NOT NULL,
45
+ metadata TEXT,
46
+ PRIMARY KEY (blocked_id, blocker_id, type)
47
+ )
48
+ `);
49
+ // Create indexes for efficient lookups
50
+ this.db.exec(`
51
+ CREATE INDEX IF NOT EXISTS idx_dependencies_blocker ON dependencies(blocker_id)
52
+ `);
53
+ this.db.exec(`
54
+ CREATE INDEX IF NOT EXISTS idx_dependencies_type ON dependencies(type)
55
+ `);
56
+ this.db.exec(`
57
+ CREATE INDEX IF NOT EXISTS idx_dependencies_blocked_type ON dependencies(blocked_id, type)
58
+ `);
59
+ }
60
+ // --------------------------------------------------------------------------
61
+ // Add Dependency
62
+ // --------------------------------------------------------------------------
63
+ /**
64
+ * Add a new dependency between elements
65
+ *
66
+ * @param input - Dependency creation input
67
+ * @param cycleConfig - Optional configuration for cycle detection
68
+ * @returns The created dependency
69
+ * @throws ValidationError if input is invalid
70
+ * @throws ConflictError if dependency already exists or would create a cycle
71
+ */
72
+ addDependency(input, cycleConfig) {
73
+ // Create and validate the dependency
74
+ const dependency = createDependency(input);
75
+ // For relates-to, normalize the direction (smaller ID is always blockedId)
76
+ let blockedId = dependency.blockedId;
77
+ let blockerId = dependency.blockerId;
78
+ if (dependency.type === DT.RELATES_TO) {
79
+ const normalized = normalizeRelatesToDependency(blockedId, blockerId);
80
+ blockedId = normalized.blockedId;
81
+ blockerId = normalized.blockerId;
82
+ }
83
+ // Check for cycles before inserting (for blocking dependency types)
84
+ this.checkForCycle(blockedId, blockerId, dependency.type, cycleConfig);
85
+ // Serialize metadata
86
+ const metadataJson = Object.keys(dependency.metadata).length > 0
87
+ ? JSON.stringify(dependency.metadata)
88
+ : null;
89
+ // Insert into database
90
+ try {
91
+ this.db.run(`INSERT INTO dependencies (blocked_id, blocker_id, type, created_at, created_by, metadata)
92
+ VALUES (?, ?, ?, ?, ?, ?)`, [
93
+ blockedId,
94
+ blockerId,
95
+ dependency.type,
96
+ dependency.createdAt,
97
+ dependency.createdBy,
98
+ metadataJson,
99
+ ]);
100
+ }
101
+ catch (error) {
102
+ // Check for duplicate key error
103
+ if (error instanceof Error && error.message.includes('UNIQUE constraint failed')) {
104
+ throw new ConflictError(`Dependency already exists: ${blockedId} -> ${blockerId} (${dependency.type})`, ErrorCode.DUPLICATE_DEPENDENCY, { blockedId, blockerId, type: dependency.type });
105
+ }
106
+ throw error;
107
+ }
108
+ // Return the dependency (with potentially normalized IDs for relates-to)
109
+ if (dependency.type === DT.RELATES_TO && blockedId !== dependency.blockedId) {
110
+ return {
111
+ ...dependency,
112
+ blockedId: blockedId,
113
+ blockerId: blockerId,
114
+ };
115
+ }
116
+ return dependency;
117
+ }
118
+ // --------------------------------------------------------------------------
119
+ // Remove Dependency
120
+ // --------------------------------------------------------------------------
121
+ /**
122
+ * Remove an existing dependency
123
+ *
124
+ * @param blockedId - Blocked element ID
125
+ * @param blockerId - Blocker element ID
126
+ * @param type - Dependency type
127
+ * @param actor - Entity performing the removal (for events)
128
+ * @returns true if dependency was removed
129
+ * @throws NotFoundError if dependency doesn't exist
130
+ */
131
+ removeDependency(blockedId, blockerId, type, actor) {
132
+ // Validate inputs
133
+ validateElementId(blockedId, 'blockedId');
134
+ validateElementId(blockerId, 'blockerId');
135
+ validateDependencyType(type);
136
+ validateEntityId(actor, 'actor');
137
+ // For relates-to, normalize the direction
138
+ let normalizedBlocked = blockedId;
139
+ let normalizedBlocker = blockerId;
140
+ if (type === DT.RELATES_TO) {
141
+ const normalized = normalizeRelatesToDependency(blockedId, blockerId);
142
+ normalizedBlocked = normalized.blockedId;
143
+ normalizedBlocker = normalized.blockerId;
144
+ }
145
+ // Delete from database
146
+ const result = this.db.run(`DELETE FROM dependencies WHERE blocked_id = ? AND blocker_id = ? AND type = ?`, [normalizedBlocked, normalizedBlocker, type]);
147
+ if (result.changes === 0) {
148
+ throw new NotFoundError(`Dependency not found: ${normalizedBlocked} -> ${normalizedBlocker} (${type})`, ErrorCode.DEPENDENCY_NOT_FOUND, { blockedId: normalizedBlocked, blockerId: normalizedBlocker, type });
149
+ }
150
+ return true;
151
+ }
152
+ // --------------------------------------------------------------------------
153
+ // Get Dependencies
154
+ // --------------------------------------------------------------------------
155
+ /**
156
+ * Get all dependencies where the given element is blocked
157
+ *
158
+ * @param blockedId - Blocked element ID
159
+ * @param type - Optional filter by dependency type
160
+ * @returns Array of dependencies
161
+ */
162
+ getDependencies(blockedId, type) {
163
+ validateElementId(blockedId, 'blockedId');
164
+ if (type !== undefined) {
165
+ validateDependencyType(type);
166
+ }
167
+ let sql = `SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
168
+ FROM dependencies WHERE blocked_id = ?`;
169
+ const params = [blockedId];
170
+ if (type !== undefined) {
171
+ sql += ` AND type = ?`;
172
+ params.push(type);
173
+ }
174
+ sql += ` ORDER BY created_at`;
175
+ const rows = this.db.query(sql, params);
176
+ return rows.map((row) => this.rowToDependency(row));
177
+ }
178
+ /**
179
+ * Get all bidirectional relates-to dependencies for an element
180
+ * (since relates-to is stored with normalized IDs, we need to check both directions)
181
+ *
182
+ * @param elementId - Element ID
183
+ * @returns Array of relates-to dependencies
184
+ */
185
+ getRelatedTo(elementId) {
186
+ validateElementId(elementId, 'elementId');
187
+ const sql = `SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
188
+ FROM dependencies
189
+ WHERE type = ? AND (blocked_id = ? OR blocker_id = ?)
190
+ ORDER BY created_at`;
191
+ const rows = this.db.query(sql, [DT.RELATES_TO, elementId, elementId]);
192
+ return rows.map((row) => this.rowToDependency(row));
193
+ }
194
+ // --------------------------------------------------------------------------
195
+ // Get Dependents
196
+ // --------------------------------------------------------------------------
197
+ /**
198
+ * Get all elements that are blocked by a given blocker (reverse lookup)
199
+ *
200
+ * @param blockerId - Blocker element ID
201
+ * @param type - Optional filter by dependency type
202
+ * @returns Array of dependencies where blockerId is the blocker
203
+ */
204
+ getDependents(blockerId, type) {
205
+ validateElementId(blockerId, 'blockerId');
206
+ if (type !== undefined) {
207
+ validateDependencyType(type);
208
+ }
209
+ let sql = `SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
210
+ FROM dependencies WHERE blocker_id = ?`;
211
+ const params = [blockerId];
212
+ if (type !== undefined) {
213
+ sql += ` AND type = ?`;
214
+ params.push(type);
215
+ }
216
+ sql += ` ORDER BY created_at`;
217
+ const rows = this.db.query(sql, params);
218
+ return rows.map((row) => this.rowToDependency(row));
219
+ }
220
+ // --------------------------------------------------------------------------
221
+ // Existence Check
222
+ // --------------------------------------------------------------------------
223
+ /**
224
+ * Check if a specific dependency exists
225
+ *
226
+ * @param blockedId - Blocked element ID
227
+ * @param blockerId - Blocker element ID
228
+ * @param type - Dependency type
229
+ * @returns true if dependency exists
230
+ */
231
+ exists(blockedId, blockerId, type) {
232
+ validateElementId(blockedId, 'blockedId');
233
+ validateElementId(blockerId, 'blockerId');
234
+ validateDependencyType(type);
235
+ // For relates-to, normalize the direction
236
+ let normalizedBlocked = blockedId;
237
+ let normalizedBlocker = blockerId;
238
+ if (type === DT.RELATES_TO) {
239
+ const normalized = normalizeRelatesToDependency(blockedId, blockerId);
240
+ normalizedBlocked = normalized.blockedId;
241
+ normalizedBlocker = normalized.blockerId;
242
+ }
243
+ const result = this.db.queryOne(`SELECT COUNT(*) as count FROM dependencies
244
+ WHERE blocked_id = ? AND blocker_id = ? AND type = ?`, [normalizedBlocked, normalizedBlocker, type]);
245
+ return (result?.count ?? 0) > 0;
246
+ }
247
+ // --------------------------------------------------------------------------
248
+ // Get Single Dependency
249
+ // --------------------------------------------------------------------------
250
+ /**
251
+ * Get a specific dependency by its composite key
252
+ *
253
+ * @param blockedId - Blocked element ID
254
+ * @param blockerId - Blocker element ID
255
+ * @param type - Dependency type
256
+ * @returns The dependency or undefined if not found
257
+ */
258
+ getDependency(blockedId, blockerId, type) {
259
+ validateElementId(blockedId, 'blockedId');
260
+ validateElementId(blockerId, 'blockerId');
261
+ validateDependencyType(type);
262
+ // For relates-to, normalize the direction
263
+ let normalizedBlocked = blockedId;
264
+ let normalizedBlocker = blockerId;
265
+ if (type === DT.RELATES_TO) {
266
+ const normalized = normalizeRelatesToDependency(blockedId, blockerId);
267
+ normalizedBlocked = normalized.blockedId;
268
+ normalizedBlocker = normalized.blockerId;
269
+ }
270
+ const row = this.db.queryOne(`SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
271
+ FROM dependencies
272
+ WHERE blocked_id = ? AND blocker_id = ? AND type = ?`, [normalizedBlocked, normalizedBlocker, type]);
273
+ return row ? this.rowToDependency(row) : undefined;
274
+ }
275
+ // --------------------------------------------------------------------------
276
+ // Bulk Operations
277
+ // --------------------------------------------------------------------------
278
+ /**
279
+ * Get all dependencies for multiple source elements
280
+ *
281
+ * @param blockedIds - Array of blocked element IDs
282
+ * @param type - Optional filter by dependency type
283
+ * @returns Array of dependencies
284
+ */
285
+ getDependenciesForMany(blockedIds, type) {
286
+ if (blockedIds.length === 0) {
287
+ return [];
288
+ }
289
+ blockedIds.forEach((id, i) => validateElementId(id, `blockedIds[${i}]`));
290
+ if (type !== undefined) {
291
+ validateDependencyType(type);
292
+ }
293
+ const placeholders = blockedIds.map(() => '?').join(',');
294
+ let sql = `SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
295
+ FROM dependencies WHERE blocked_id IN (${placeholders})`;
296
+ const params = [...blockedIds];
297
+ if (type !== undefined) {
298
+ sql += ` AND type = ?`;
299
+ params.push(type);
300
+ }
301
+ sql += ` ORDER BY blocked_id, created_at`;
302
+ const rows = this.db.query(sql, params);
303
+ return rows.map((row) => this.rowToDependency(row));
304
+ }
305
+ /**
306
+ * Remove all dependencies from a source element
307
+ *
308
+ * @param blockedId - Blocked element ID
309
+ * @param type - Optional filter by dependency type
310
+ * @returns Number of dependencies removed
311
+ */
312
+ removeAllDependencies(blockedId, type) {
313
+ validateElementId(blockedId, 'blockedId');
314
+ if (type !== undefined) {
315
+ validateDependencyType(type);
316
+ }
317
+ let sql = `DELETE FROM dependencies WHERE blocked_id = ?`;
318
+ const params = [blockedId];
319
+ if (type !== undefined) {
320
+ sql += ` AND type = ?`;
321
+ params.push(type);
322
+ }
323
+ const result = this.db.run(sql, params);
324
+ return result.changes;
325
+ }
326
+ /**
327
+ * Remove all dependencies to a target element (cascade on element delete)
328
+ *
329
+ * @param blockerId - Blocker element ID
330
+ * @returns Number of dependencies removed
331
+ */
332
+ removeAllDependents(blockerId) {
333
+ validateElementId(blockerId, 'blockerId');
334
+ const result = this.db.run(`DELETE FROM dependencies WHERE blocker_id = ?`, [blockerId]);
335
+ return result.changes;
336
+ }
337
+ // --------------------------------------------------------------------------
338
+ // Count Operations
339
+ // --------------------------------------------------------------------------
340
+ /**
341
+ * Count dependencies from a source element
342
+ */
343
+ countDependencies(blockedId, type) {
344
+ validateElementId(blockedId, 'blockedId');
345
+ if (type !== undefined) {
346
+ validateDependencyType(type);
347
+ }
348
+ let sql = `SELECT COUNT(*) as count FROM dependencies WHERE blocked_id = ?`;
349
+ const params = [blockedId];
350
+ if (type !== undefined) {
351
+ sql += ` AND type = ?`;
352
+ params.push(type);
353
+ }
354
+ const result = this.db.queryOne(sql, params);
355
+ return result?.count ?? 0;
356
+ }
357
+ /**
358
+ * Count dependents of a target element
359
+ */
360
+ countDependents(blockerId, type) {
361
+ validateElementId(blockerId, 'blockerId');
362
+ if (type !== undefined) {
363
+ validateDependencyType(type);
364
+ }
365
+ let sql = `SELECT COUNT(*) as count FROM dependencies WHERE blocker_id = ?`;
366
+ const params = [blockerId];
367
+ if (type !== undefined) {
368
+ sql += ` AND type = ?`;
369
+ params.push(type);
370
+ }
371
+ const result = this.db.queryOne(sql, params);
372
+ return result?.count ?? 0;
373
+ }
374
+ // --------------------------------------------------------------------------
375
+ // Cycle Detection
376
+ // --------------------------------------------------------------------------
377
+ /**
378
+ * Check if adding a dependency would create a cycle
379
+ *
380
+ * Uses BFS traversal from target to check if source is reachable
381
+ * through existing blocking dependencies. Only blocking dependency
382
+ * types participate in cycle detection (blocks, parent-child, awaits).
383
+ *
384
+ * The relates-to type is excluded because it's bidirectional by design.
385
+ *
386
+ * @param blockedId - The blocked element of the proposed dependency
387
+ * @param blockerId - The blocker element of the proposed dependency
388
+ * @param type - The type of dependency being added
389
+ * @param config - Optional configuration for cycle detection
390
+ * @returns CycleDetectionResult with cycle status and details
391
+ */
392
+ detectCycle(blockedId, blockerId, type, config = DEFAULT_CYCLE_DETECTION_CONFIG) {
393
+ validateElementId(blockedId, 'blockedId');
394
+ validateElementId(blockerId, 'blockerId');
395
+ validateDependencyType(type);
396
+ // Non-blocking types don't participate in cycle detection
397
+ if (!participatesInCycleDetection(type)) {
398
+ return {
399
+ hasCycle: false,
400
+ nodesVisited: 0,
401
+ depthLimitReached: false,
402
+ };
403
+ }
404
+ // BFS from blocker to see if we can reach blockedId
405
+ const visited = new Set();
406
+ const queue = [
407
+ { elementId: blockerId, depth: 0, path: [blockerId] },
408
+ ];
409
+ while (queue.length > 0) {
410
+ const current = queue.shift();
411
+ // Check depth limit
412
+ if (current.depth >= config.maxDepth) {
413
+ return {
414
+ hasCycle: false,
415
+ nodesVisited: visited.size,
416
+ depthLimitReached: true,
417
+ };
418
+ }
419
+ // Skip already visited nodes
420
+ if (visited.has(current.elementId)) {
421
+ continue;
422
+ }
423
+ visited.add(current.elementId);
424
+ // Found the blocked element - cycle detected!
425
+ if (current.elementId === blockedId) {
426
+ return {
427
+ hasCycle: true,
428
+ cyclePath: [...current.path, blockedId],
429
+ nodesVisited: visited.size,
430
+ depthLimitReached: false,
431
+ };
432
+ }
433
+ // Get all blocking dependencies from this element
434
+ const blockingDeps = this.getBlockingDependenciesFrom(current.elementId);
435
+ for (const dep of blockingDeps) {
436
+ if (!visited.has(dep.blockerId)) {
437
+ queue.push({
438
+ elementId: dep.blockerId,
439
+ depth: current.depth + 1,
440
+ path: [...current.path, dep.blockerId],
441
+ });
442
+ }
443
+ }
444
+ }
445
+ return {
446
+ hasCycle: false,
447
+ nodesVisited: visited.size,
448
+ depthLimitReached: false,
449
+ };
450
+ }
451
+ /**
452
+ * Check if adding a dependency would create a cycle and throw if so
453
+ *
454
+ * @param blockedId - The blocked element of the proposed dependency
455
+ * @param blockerId - The blocker element of the proposed dependency
456
+ * @param type - The type of dependency being added
457
+ * @param config - Optional configuration for cycle detection
458
+ * @throws ConflictError if a cycle would be created
459
+ */
460
+ checkForCycle(blockedId, blockerId, type, config) {
461
+ const result = this.detectCycle(blockedId, blockerId, type, config);
462
+ if (result.hasCycle) {
463
+ const cyclePath = result.cyclePath?.join(' -> ') ?? `${blockerId} -> ... -> ${blockedId}`;
464
+ throw new ConflictError(`Adding dependency would create a cycle: ${cyclePath}`, ErrorCode.CYCLE_DETECTED, {
465
+ blockedId,
466
+ blockerId,
467
+ dependencyType: type,
468
+ cyclePath: result.cyclePath,
469
+ });
470
+ }
471
+ }
472
+ /**
473
+ * Get all blocking dependencies from an element
474
+ * (internal helper for cycle detection)
475
+ */
476
+ getBlockingDependenciesFrom(elementId) {
477
+ const sql = `SELECT blocked_id, blocker_id, type, created_at, created_by, metadata
478
+ FROM dependencies
479
+ WHERE blocked_id = ? AND type IN (?, ?, ?)
480
+ ORDER BY created_at`;
481
+ const rows = this.db.query(sql, [
482
+ elementId,
483
+ DT.BLOCKS,
484
+ DT.PARENT_CHILD,
485
+ DT.AWAITS,
486
+ ]);
487
+ return rows.map((row) => this.rowToDependency(row));
488
+ }
489
+ // --------------------------------------------------------------------------
490
+ // Private Helpers
491
+ // --------------------------------------------------------------------------
492
+ /**
493
+ * Convert a database row to a Dependency object
494
+ */
495
+ rowToDependency(row) {
496
+ const metadata = row.metadata ? JSON.parse(row.metadata) : {};
497
+ return {
498
+ blockedId: row.blocked_id,
499
+ blockerId: row.blocker_id,
500
+ type: row.type,
501
+ createdAt: row.created_at,
502
+ createdBy: row.created_by,
503
+ metadata,
504
+ };
505
+ }
506
+ }
507
+ // ============================================================================
508
+ // Event Creation Helpers
509
+ // ============================================================================
510
+ /**
511
+ * Create a dependency_added event
512
+ *
513
+ * Use this to create an audit event when a dependency is added.
514
+ * The event should be persisted by an EventService.
515
+ *
516
+ * @param dependency - The dependency that was added
517
+ * @returns An EventWithoutId ready to be persisted
518
+ */
519
+ export function createDependencyAddedEvent(dependency) {
520
+ return createEvent({
521
+ elementId: dependency.blockedId,
522
+ eventType: EventType.DEPENDENCY_ADDED,
523
+ actor: dependency.createdBy,
524
+ oldValue: null,
525
+ newValue: {
526
+ blockedId: dependency.blockedId,
527
+ blockerId: dependency.blockerId,
528
+ type: dependency.type,
529
+ metadata: dependency.metadata,
530
+ },
531
+ });
532
+ }
533
+ /**
534
+ * Create a dependency_removed event
535
+ *
536
+ * Use this to create an audit event when a dependency is removed.
537
+ * The event should be persisted by an EventService.
538
+ *
539
+ * @param dependency - The dependency that was removed
540
+ * @param actor - The entity that removed the dependency
541
+ * @returns An EventWithoutId ready to be persisted
542
+ */
543
+ export function createDependencyRemovedEvent(dependency, actor) {
544
+ return createEvent({
545
+ elementId: dependency.blockedId,
546
+ eventType: EventType.DEPENDENCY_REMOVED,
547
+ actor,
548
+ oldValue: {
549
+ blockedId: dependency.blockedId,
550
+ blockerId: dependency.blockerId,
551
+ type: dependency.type,
552
+ metadata: dependency.metadata,
553
+ },
554
+ newValue: null,
555
+ });
556
+ }
557
+ // ============================================================================
558
+ // Factory Function
559
+ // ============================================================================
560
+ /**
561
+ * Create a new DependencyService instance
562
+ */
563
+ export function createDependencyService(db) {
564
+ return new DependencyService(db);
565
+ }
566
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/services/dependency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Reciprocal Rank Fusion (RRF)
3
+ *
4
+ * Combines multiple ranked result sets into a single fused ranking.
5
+ * Used to merge FTS5 (keyword) and vector (semantic) search results.
6
+ *
7
+ * Algorithm: score(d) = Σ 1/(k + rank_i(d)) for each ranking i
8
+ * where k is a smoothing constant (default: 60)
9
+ */
10
+ /**
11
+ * A ranked result set identified by document ID.
12
+ */
13
+ export interface RankedResult {
14
+ documentId: string;
15
+ rank: number;
16
+ }
17
+ /**
18
+ * Fused result with combined RRF score.
19
+ */
20
+ export interface FusedResult {
21
+ documentId: string;
22
+ score: number;
23
+ }
24
+ /**
25
+ * Combine multiple ranked result sets using Reciprocal Rank Fusion.
26
+ *
27
+ * @param rankings - Array of ranked result sets (each sorted by relevance)
28
+ * @param k - Smoothing constant (default: 60, standard value from literature)
29
+ * @param limit - Maximum results to return
30
+ * @returns Fused results sorted by combined score (descending)
31
+ */
32
+ export declare function reciprocalRankFusion(rankings: RankedResult[][], k?: number, limit?: number): FusedResult[];
33
+ //# sourceMappingURL=fusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fusion.d.ts","sourceRoot":"","sources":["../../../src/services/embeddings/fusion.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAC1B,CAAC,GAAE,MAAW,EACd,KAAK,CAAC,EAAE,MAAM,GACb,WAAW,EAAE,CAkBf"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Reciprocal Rank Fusion (RRF)
3
+ *
4
+ * Combines multiple ranked result sets into a single fused ranking.
5
+ * Used to merge FTS5 (keyword) and vector (semantic) search results.
6
+ *
7
+ * Algorithm: score(d) = Σ 1/(k + rank_i(d)) for each ranking i
8
+ * where k is a smoothing constant (default: 60)
9
+ */
10
+ /**
11
+ * Combine multiple ranked result sets using Reciprocal Rank Fusion.
12
+ *
13
+ * @param rankings - Array of ranked result sets (each sorted by relevance)
14
+ * @param k - Smoothing constant (default: 60, standard value from literature)
15
+ * @param limit - Maximum results to return
16
+ * @returns Fused results sorted by combined score (descending)
17
+ */
18
+ export function reciprocalRankFusion(rankings, k = 60, limit) {
19
+ // Accumulate RRF scores per document
20
+ const scores = new Map();
21
+ for (const ranking of rankings) {
22
+ for (const result of ranking) {
23
+ const rrfScore = 1 / (k + result.rank);
24
+ const current = scores.get(result.documentId) ?? 0;
25
+ scores.set(result.documentId, current + rrfScore);
26
+ }
27
+ }
28
+ // Sort by score descending
29
+ const fused = Array.from(scores.entries())
30
+ .map(([documentId, score]) => ({ documentId, score }))
31
+ .sort((a, b) => b.score - a.score);
32
+ return limit ? fused.slice(0, limit) : fused;
33
+ }
34
+ //# sourceMappingURL=fusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fusion.js","sourceRoot":"","sources":["../../../src/services/embeddings/fusion.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA0B,EAC1B,IAAY,EAAE,EACd,KAAc;IAEd,qCAAqC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACtD,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;SACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Embeddings Module
3
+ *
4
+ * Public API for document embedding services: semantic search,
5
+ * hybrid search (RRF fusion), and local embedding providers.
6
+ */
7
+ export { EmbeddingService } from './service.js';
8
+ export { LocalEmbeddingProvider } from './local-provider.js';
9
+ export { reciprocalRankFusion } from './fusion.js';
10
+ export type { RankedResult, FusedResult } from './fusion.js';
11
+ export type { EmbeddingProvider, StoredEmbedding, SemanticSearchResult, EmbeddingServiceConfig, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map