@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.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- 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
|