@jamesaphoenix/tx-core 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db.d.ts +42 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +46 -0
- package/dist/db.js.map +1 -0
- package/dist/errors.d.ts +231 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +139 -0
- package/dist/errors.js.map +1 -0
- package/dist/id.d.ts +6 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +21 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/layer.d.ts +50 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +155 -0
- package/dist/layer.js.map +1 -0
- package/dist/mappers/anchor.d.ts +14 -0
- package/dist/mappers/anchor.d.ts.map +1 -0
- package/dist/mappers/anchor.js +38 -0
- package/dist/mappers/anchor.js.map +1 -0
- package/dist/mappers/attempt.d.ts +15 -0
- package/dist/mappers/attempt.d.ts.map +1 -0
- package/dist/mappers/attempt.js +23 -0
- package/dist/mappers/attempt.js.map +1 -0
- package/dist/mappers/candidate.d.ts +23 -0
- package/dist/mappers/candidate.d.ts.map +1 -0
- package/dist/mappers/candidate.js +53 -0
- package/dist/mappers/candidate.js.map +1 -0
- package/dist/mappers/claim.d.ts +30 -0
- package/dist/mappers/claim.d.ts.map +1 -0
- package/dist/mappers/claim.js +32 -0
- package/dist/mappers/claim.js.map +1 -0
- package/dist/mappers/deduplication.d.ts +39 -0
- package/dist/mappers/deduplication.d.ts.map +1 -0
- package/dist/mappers/deduplication.js +53 -0
- package/dist/mappers/deduplication.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -0
- package/dist/mappers/edge.d.ts.map +1 -0
- package/dist/mappers/edge.js +19 -0
- package/dist/mappers/edge.js.map +1 -0
- package/dist/mappers/file-learning.d.ts +14 -0
- package/dist/mappers/file-learning.d.ts.map +1 -0
- package/dist/mappers/file-learning.js +75 -0
- package/dist/mappers/file-learning.js.map +1 -0
- package/dist/mappers/index.d.ts +17 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +30 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/mappers/learning.d.ts +19 -0
- package/dist/mappers/learning.d.ts.map +1 -0
- package/dist/mappers/learning.js +41 -0
- package/dist/mappers/learning.js.map +1 -0
- package/dist/mappers/orchestrator-state.d.ts +33 -0
- package/dist/mappers/orchestrator-state.d.ts.map +1 -0
- package/dist/mappers/orchestrator-state.js +34 -0
- package/dist/mappers/orchestrator-state.js.map +1 -0
- package/dist/mappers/run.d.ts +32 -0
- package/dist/mappers/run.d.ts.map +1 -0
- package/dist/mappers/run.js +64 -0
- package/dist/mappers/run.js.map +1 -0
- package/dist/mappers/task.d.ts +23 -0
- package/dist/mappers/task.d.ts.map +1 -0
- package/dist/mappers/task.js +54 -0
- package/dist/mappers/task.js.map +1 -0
- package/dist/mappers/tracked-project.d.ts +15 -0
- package/dist/mappers/tracked-project.d.ts.map +1 -0
- package/dist/mappers/tracked-project.js +23 -0
- package/dist/mappers/tracked-project.js.map +1 -0
- package/dist/mappers/worker.d.ts +33 -0
- package/dist/mappers/worker.d.ts.map +1 -0
- package/dist/mappers/worker.js +35 -0
- package/dist/mappers/worker.js.map +1 -0
- package/dist/repo/anchor-repo.d.ts +52 -0
- package/dist/repo/anchor-repo.d.ts.map +1 -0
- package/dist/repo/anchor-repo.js +204 -0
- package/dist/repo/anchor-repo.js.map +1 -0
- package/dist/repo/attempt-repo.d.ts +25 -0
- package/dist/repo/attempt-repo.d.ts.map +1 -0
- package/dist/repo/attempt-repo.js +78 -0
- package/dist/repo/attempt-repo.js.map +1 -0
- package/dist/repo/candidate-repo.d.ts +16 -0
- package/dist/repo/candidate-repo.d.ts.map +1 -0
- package/dist/repo/candidate-repo.js +143 -0
- package/dist/repo/candidate-repo.js.map +1 -0
- package/dist/repo/claim-repo.d.ts +17 -0
- package/dist/repo/claim-repo.d.ts.map +1 -0
- package/dist/repo/claim-repo.js +62 -0
- package/dist/repo/claim-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +37 -0
- package/dist/repo/deduplication-repo.d.ts.map +1 -0
- package/dist/repo/deduplication-repo.js +133 -0
- package/dist/repo/deduplication-repo.js.map +1 -0
- package/dist/repo/dep-repo.d.ts +19 -0
- package/dist/repo/dep-repo.d.ts.map +1 -0
- package/dist/repo/dep-repo.js +104 -0
- package/dist/repo/dep-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +26 -0
- package/dist/repo/edge-repo.d.ts.map +1 -0
- package/dist/repo/edge-repo.js +227 -0
- package/dist/repo/edge-repo.js.map +1 -0
- package/dist/repo/file-learning-repo.d.ts +17 -0
- package/dist/repo/file-learning-repo.d.ts.map +1 -0
- package/dist/repo/file-learning-repo.js +60 -0
- package/dist/repo/file-learning-repo.js.map +1 -0
- package/dist/repo/index.d.ts +18 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +18 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/learning-repo.d.ts +31 -0
- package/dist/repo/learning-repo.d.ts.map +1 -0
- package/dist/repo/learning-repo.js +165 -0
- package/dist/repo/learning-repo.js.map +1 -0
- package/dist/repo/orchestrator-state-repo.d.ts +27 -0
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
- package/dist/repo/orchestrator-state-repo.js +96 -0
- package/dist/repo/orchestrator-state-repo.js.map +1 -0
- package/dist/repo/run-repo.d.ts +31 -0
- package/dist/repo/run-repo.d.ts.map +1 -0
- package/dist/repo/run-repo.js +132 -0
- package/dist/repo/run-repo.js.map +1 -0
- package/dist/repo/task-repo.d.ts +21 -0
- package/dist/repo/task-repo.d.ts.map +1 -0
- package/dist/repo/task-repo.js +169 -0
- package/dist/repo/task-repo.js.map +1 -0
- package/dist/repo/tracked-project-repo.d.ts +16 -0
- package/dist/repo/tracked-project-repo.d.ts.map +1 -0
- package/dist/repo/tracked-project-repo.js +54 -0
- package/dist/repo/tracked-project-repo.js.map +1 -0
- package/dist/repo/worker-repo.d.ts +19 -0
- package/dist/repo/worker-repo.d.ts.map +1 -0
- package/dist/repo/worker-repo.js +72 -0
- package/dist/repo/worker-repo.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/sync.d.ts +296 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +146 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/worker.d.ts +77 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +80 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/services/anchor-service.d.ts +147 -0
- package/dist/services/anchor-service.d.ts.map +1 -0
- package/dist/services/anchor-service.js +540 -0
- package/dist/services/anchor-service.js.map +1 -0
- package/dist/services/anchor-verification.d.ts +94 -0
- package/dist/services/anchor-verification.d.ts.map +1 -0
- package/dist/services/anchor-verification.js +617 -0
- package/dist/services/anchor-verification.js.map +1 -0
- package/dist/services/ast-grep-service.d.ts +58 -0
- package/dist/services/ast-grep-service.d.ts.map +1 -0
- package/dist/services/ast-grep-service.js +356 -0
- package/dist/services/ast-grep-service.js.map +1 -0
- package/dist/services/attempt-service.d.ts +24 -0
- package/dist/services/attempt-service.d.ts.map +1 -0
- package/dist/services/attempt-service.js +55 -0
- package/dist/services/attempt-service.js.map +1 -0
- package/dist/services/auto-sync-service.d.ts +56 -0
- package/dist/services/auto-sync-service.d.ts.map +1 -0
- package/dist/services/auto-sync-service.js +66 -0
- package/dist/services/auto-sync-service.js.map +1 -0
- package/dist/services/candidate-extractor-service.d.ts +56 -0
- package/dist/services/candidate-extractor-service.d.ts.map +1 -0
- package/dist/services/candidate-extractor-service.js +365 -0
- package/dist/services/candidate-extractor-service.js.map +1 -0
- package/dist/services/claim-service.d.ts +52 -0
- package/dist/services/claim-service.d.ts.map +1 -0
- package/dist/services/claim-service.js +134 -0
- package/dist/services/claim-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +214 -0
- package/dist/services/daemon-service.d.ts.map +1 -0
- package/dist/services/daemon-service.js +522 -0
- package/dist/services/daemon-service.js.map +1 -0
- package/dist/services/deduplication-service.d.ts +67 -0
- package/dist/services/deduplication-service.d.ts.map +1 -0
- package/dist/services/deduplication-service.js +145 -0
- package/dist/services/deduplication-service.js.map +1 -0
- package/dist/services/dep-service.d.ts +14 -0
- package/dist/services/dep-service.d.ts.map +1 -0
- package/dist/services/dep-service.js +34 -0
- package/dist/services/dep-service.js.map +1 -0
- package/dist/services/diversifier-service.d.ts +46 -0
- package/dist/services/diversifier-service.d.ts.map +1 -0
- package/dist/services/diversifier-service.js +197 -0
- package/dist/services/diversifier-service.js.map +1 -0
- package/dist/services/edge-service.d.ts +78 -0
- package/dist/services/edge-service.d.ts.map +1 -0
- package/dist/services/edge-service.js +158 -0
- package/dist/services/edge-service.js.map +1 -0
- package/dist/services/embedding-service.d.ts +138 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +318 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/feedback-tracker.d.ts +64 -0
- package/dist/services/feedback-tracker.d.ts.map +1 -0
- package/dist/services/feedback-tracker.js +110 -0
- package/dist/services/feedback-tracker.js.map +1 -0
- package/dist/services/file-learning-service.d.ts +17 -0
- package/dist/services/file-learning-service.d.ts.map +1 -0
- package/dist/services/file-learning-service.js +41 -0
- package/dist/services/file-learning-service.js.map +1 -0
- package/dist/services/file-watcher-service.d.ts +141 -0
- package/dist/services/file-watcher-service.d.ts.map +1 -0
- package/dist/services/file-watcher-service.js +278 -0
- package/dist/services/file-watcher-service.js.map +1 -0
- package/dist/services/graph-expansion.d.ts +155 -0
- package/dist/services/graph-expansion.d.ts.map +1 -0
- package/dist/services/graph-expansion.js +466 -0
- package/dist/services/graph-expansion.js.map +1 -0
- package/dist/services/hierarchy-service.d.ts +16 -0
- package/dist/services/hierarchy-service.d.ts.map +1 -0
- package/dist/services/hierarchy-service.js +66 -0
- package/dist/services/hierarchy-service.js.map +1 -0
- package/dist/services/index.d.ts +36 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +36 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/learning-service.d.ts +39 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +151 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +67 -0
- package/dist/services/migration-service.d.ts.map +1 -0
- package/dist/services/migration-service.js +144 -0
- package/dist/services/migration-service.js.map +1 -0
- package/dist/services/orchestrator-service.d.ts +52 -0
- package/dist/services/orchestrator-service.d.ts.map +1 -0
- package/dist/services/orchestrator-service.js +203 -0
- package/dist/services/orchestrator-service.js.map +1 -0
- package/dist/services/promotion-service.d.ts +67 -0
- package/dist/services/promotion-service.d.ts.map +1 -0
- package/dist/services/promotion-service.js +151 -0
- package/dist/services/promotion-service.js.map +1 -0
- package/dist/services/query-expansion-service.d.ts +55 -0
- package/dist/services/query-expansion-service.d.ts.map +1 -0
- package/dist/services/query-expansion-service.js +174 -0
- package/dist/services/query-expansion-service.js.map +1 -0
- package/dist/services/ready-service.d.ts +16 -0
- package/dist/services/ready-service.d.ts.map +1 -0
- package/dist/services/ready-service.js +70 -0
- package/dist/services/ready-service.js.map +1 -0
- package/dist/services/reranker-service.d.ts +51 -0
- package/dist/services/reranker-service.d.ts.map +1 -0
- package/dist/services/reranker-service.js +128 -0
- package/dist/services/reranker-service.js.map +1 -0
- package/dist/services/retriever-service.d.ts +49 -0
- package/dist/services/retriever-service.d.ts.map +1 -0
- package/dist/services/retriever-service.js +419 -0
- package/dist/services/retriever-service.js.map +1 -0
- package/dist/services/score-service.d.ts +43 -0
- package/dist/services/score-service.d.ts.map +1 -0
- package/dist/services/score-service.js +82 -0
- package/dist/services/score-service.js.map +1 -0
- package/dist/services/swarm-verification.d.ts +104 -0
- package/dist/services/swarm-verification.d.ts.map +1 -0
- package/dist/services/swarm-verification.js +400 -0
- package/dist/services/swarm-verification.js.map +1 -0
- package/dist/services/sync-service.d.ts +115 -0
- package/dist/services/sync-service.d.ts.map +1 -0
- package/dist/services/sync-service.js +350 -0
- package/dist/services/sync-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +221 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +41 -0
- package/dist/services/worker-process.d.ts.map +1 -0
- package/dist/services/worker-process.js +280 -0
- package/dist/services/worker-process.js.map +1 -0
- package/dist/services/worker-service.d.ts +74 -0
- package/dist/services/worker-service.d.ts.map +1 -0
- package/dist/services/worker-service.js +148 -0
- package/dist/services/worker-service.js.map +1 -0
- package/dist/utils/glob.d.ts +15 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +27 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/math.d.ts +6 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +21 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tx/core/services - Service exports
|
|
3
|
+
*/
|
|
4
|
+
export { TaskService, TaskServiceLive } from "./task-service.js";
|
|
5
|
+
export { DependencyService, DependencyServiceLive } from "./dep-service.js";
|
|
6
|
+
export { ReadyService, ReadyServiceLive } from "./ready-service.js";
|
|
7
|
+
export { HierarchyService, HierarchyServiceLive } from "./hierarchy-service.js";
|
|
8
|
+
export { ScoreService, ScoreServiceLive } from "./score-service.js";
|
|
9
|
+
export { LearningService, LearningServiceLive } from "./learning-service.js";
|
|
10
|
+
export { FileLearningService, FileLearningServiceLive } from "./file-learning-service.js";
|
|
11
|
+
export { AttemptService, AttemptServiceLive } from "./attempt-service.js";
|
|
12
|
+
export { EmbeddingService, EmbeddingServiceNoop, EmbeddingServiceLive, EmbeddingServiceOpenAI, EmbeddingServiceAuto, createEmbedderLayer } from "./embedding-service.js";
|
|
13
|
+
export { QueryExpansionService, QueryExpansionServiceNoop, QueryExpansionServiceLive, QueryExpansionServiceAuto, QueryExpansionUnavailableError } from "./query-expansion-service.js";
|
|
14
|
+
export { RerankerService, RerankerServiceNoop, RerankerServiceLive, RerankerServiceAuto } from "./reranker-service.js";
|
|
15
|
+
export { SyncService, SyncServiceLive } from "./sync-service.js";
|
|
16
|
+
export { MigrationService, MigrationServiceLive, MIGRATIONS, getLatestVersion } from "./migration-service.js";
|
|
17
|
+
export { AutoSyncService, AutoSyncServiceLive, AutoSyncServiceNoop } from "./auto-sync-service.js";
|
|
18
|
+
export { AnchorService, AnchorServiceLive } from "./anchor-service.js";
|
|
19
|
+
export { EdgeService, EdgeServiceLive } from "./edge-service.js";
|
|
20
|
+
export { DeduplicationService, DeduplicationServiceLive } from "./deduplication-service.js";
|
|
21
|
+
export { CandidateExtractorService, CandidateExtractorServiceNoop, CandidateExtractorServiceAnthropic, CandidateExtractorServiceOpenAI, CandidateExtractorServiceAuto } from "./candidate-extractor-service.js";
|
|
22
|
+
export { RetrieverService, RetrieverServiceNoop, RetrieverServiceLive, RetrieverServiceAuto } from "./retriever-service.js";
|
|
23
|
+
export { GraphExpansionService, GraphExpansionServiceNoop, GraphExpansionServiceLive } from "./graph-expansion.js";
|
|
24
|
+
export { AnchorVerificationService, AnchorVerificationServiceLive, getAnchorTTL, isStale, DEFAULT_ANCHOR_CACHE_TTL } from "./anchor-verification.js";
|
|
25
|
+
export { SwarmVerificationService, SwarmVerificationServiceLive, calculateMajorityVote } from "./swarm-verification.js";
|
|
26
|
+
export { AstGrepService, AstGrepServiceLive, AstGrepServiceNoop, AstGrepServiceAuto, EXT_TO_LANGUAGE, DEFAULT_SYMBOL_PATTERNS } from "./ast-grep-service.js";
|
|
27
|
+
export { DaemonService, DaemonServiceLive, DaemonServiceNoop, PID_FILE_PATH, LAUNCHD_PLIST_PATH, writePid, readPid, removePid, isProcessRunning, defaultDaemonConfig, generateLaunchdPlist, generateSystemdService, SYSTEMD_SERVICE_PATH } from "./daemon-service.js";
|
|
28
|
+
export { FileWatcherService, FileWatcherServiceLive, FileWatcherServiceNoop } from "./file-watcher-service.js";
|
|
29
|
+
export { PromotionService, PromotionServiceLive } from "./promotion-service.js";
|
|
30
|
+
export { DiversifierService, DiversifierServiceNoop, DiversifierServiceLive, DiversifierServiceAuto } from "./diversifier-service.js";
|
|
31
|
+
export { FeedbackTrackerService, FeedbackTrackerServiceNoop, FeedbackTrackerServiceLive } from "./feedback-tracker.js";
|
|
32
|
+
export { WorkerService, WorkerServiceLive } from "./worker-service.js";
|
|
33
|
+
export { ClaimService, ClaimServiceLive } from "./claim-service.js";
|
|
34
|
+
export { OrchestratorService, OrchestratorServiceLive } from "./orchestrator-service.js";
|
|
35
|
+
export { runWorkerProcess } from "./worker-process.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { LearningRepository } from "../repo/learning-repo.js";
|
|
3
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
4
|
+
import { EmbeddingService } from "./embedding-service.js";
|
|
5
|
+
import { RetrieverService } from "./retriever-service.js";
|
|
6
|
+
import { LearningNotFoundError, TaskNotFoundError, ValidationError, DatabaseError, RetrievalError } from "../errors.js";
|
|
7
|
+
import type { Learning, LearningWithScore, CreateLearningInput, LearningQuery, ContextOptions, ContextResult } from "@jamesaphoenix/tx-types";
|
|
8
|
+
/** Result of embedding operation */
|
|
9
|
+
export interface EmbedResult {
|
|
10
|
+
processed: number;
|
|
11
|
+
skipped: number;
|
|
12
|
+
failed: number;
|
|
13
|
+
total: number;
|
|
14
|
+
}
|
|
15
|
+
/** Embedding coverage status */
|
|
16
|
+
export interface EmbedStatus {
|
|
17
|
+
total: number;
|
|
18
|
+
withEmbeddings: number;
|
|
19
|
+
withoutEmbeddings: number;
|
|
20
|
+
coveragePercent: number;
|
|
21
|
+
}
|
|
22
|
+
declare const LearningService_base: Context.TagClass<LearningService, "LearningService", {
|
|
23
|
+
readonly create: (input: CreateLearningInput) => Effect.Effect<Learning, ValidationError | DatabaseError>;
|
|
24
|
+
readonly get: (id: number) => Effect.Effect<Learning, LearningNotFoundError | DatabaseError>;
|
|
25
|
+
readonly remove: (id: number) => Effect.Effect<void, LearningNotFoundError | DatabaseError>;
|
|
26
|
+
readonly search: (query: LearningQuery) => Effect.Effect<readonly LearningWithScore[], RetrievalError | DatabaseError>;
|
|
27
|
+
readonly getRecent: (limit?: number) => Effect.Effect<readonly Learning[], DatabaseError>;
|
|
28
|
+
readonly recordUsage: (id: number) => Effect.Effect<void, LearningNotFoundError | DatabaseError>;
|
|
29
|
+
readonly updateOutcome: (id: number, score: number) => Effect.Effect<void, LearningNotFoundError | ValidationError | DatabaseError>;
|
|
30
|
+
readonly getContextForTask: (taskId: string, options?: ContextOptions) => Effect.Effect<ContextResult, TaskNotFoundError | RetrievalError | DatabaseError>;
|
|
31
|
+
readonly count: () => Effect.Effect<number, DatabaseError>;
|
|
32
|
+
readonly embedAll: (forceAll?: boolean) => Effect.Effect<EmbedResult, DatabaseError>;
|
|
33
|
+
readonly embeddingStatus: () => Effect.Effect<EmbedStatus, DatabaseError>;
|
|
34
|
+
}>;
|
|
35
|
+
export declare class LearningService extends LearningService_base {
|
|
36
|
+
}
|
|
37
|
+
export declare const LearningServiceLive: Layer.Layer<LearningService, never, TaskRepository | LearningRepository | EmbeddingService | RetrieverService>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=learning-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-service.d.ts","sourceRoot":"","sources":["../../src/services/learning-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACvH,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE7I,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,eAAe,EAAE,MAAM,CAAA;CACxB;;qBAKoB,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa,CAAC;kBAC3F,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,GAAG,aAAa,CAAC;qBAC3E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,CAAC;qBAC1E,CAAC,KAAK,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,EAAE,cAAc,GAAG,aAAa,CAAC;wBAClG,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,EAAE,EAAE,aAAa,CAAC;0BACnE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,CAAC;4BACxE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,eAAe,GAAG,aAAa,CAAC;gCACvG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,GAAG,cAAc,GAAG,aAAa,CAAC;oBAC1I,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;uBACvC,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;8BAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;;AAb7E,qBAAa,eAAgB,SAAQ,oBAelC;CAAG;AAEN,eAAO,MAAM,mBAAmB,gHAgL/B,CAAA"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { LearningRepository } from "../repo/learning-repo.js";
|
|
3
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
4
|
+
import { EmbeddingService } from "./embedding-service.js";
|
|
5
|
+
import { RetrieverService } from "./retriever-service.js";
|
|
6
|
+
import { LearningNotFoundError, TaskNotFoundError, ValidationError } from "../errors.js";
|
|
7
|
+
export class LearningService extends Context.Tag("LearningService")() {
|
|
8
|
+
}
|
|
9
|
+
export const LearningServiceLive = Layer.effect(LearningService, Effect.gen(function* () {
|
|
10
|
+
const learningRepo = yield* LearningRepository;
|
|
11
|
+
const taskRepo = yield* TaskRepository;
|
|
12
|
+
const embeddingService = yield* EmbeddingService;
|
|
13
|
+
const retrieverService = yield* RetrieverService;
|
|
14
|
+
return {
|
|
15
|
+
create: (input) => Effect.gen(function* () {
|
|
16
|
+
if (!input.content || input.content.trim().length === 0) {
|
|
17
|
+
return yield* Effect.fail(new ValidationError({ reason: "Content is required" }));
|
|
18
|
+
}
|
|
19
|
+
return yield* learningRepo.insert({
|
|
20
|
+
...input,
|
|
21
|
+
content: input.content.trim()
|
|
22
|
+
});
|
|
23
|
+
}),
|
|
24
|
+
get: (id) => Effect.gen(function* () {
|
|
25
|
+
const learning = yield* learningRepo.findById(id);
|
|
26
|
+
if (!learning) {
|
|
27
|
+
return yield* Effect.fail(new LearningNotFoundError({ id }));
|
|
28
|
+
}
|
|
29
|
+
return learning;
|
|
30
|
+
}),
|
|
31
|
+
remove: (id) => Effect.gen(function* () {
|
|
32
|
+
const learning = yield* learningRepo.findById(id);
|
|
33
|
+
if (!learning) {
|
|
34
|
+
return yield* Effect.fail(new LearningNotFoundError({ id }));
|
|
35
|
+
}
|
|
36
|
+
yield* learningRepo.remove(id);
|
|
37
|
+
}),
|
|
38
|
+
search: (query) => Effect.gen(function* () {
|
|
39
|
+
const { query: searchQuery, limit = 10, minScore = 0.1 } = query;
|
|
40
|
+
// Delegate to RetrieverService for the actual search
|
|
41
|
+
return yield* retrieverService.search(searchQuery, {
|
|
42
|
+
limit,
|
|
43
|
+
minScore
|
|
44
|
+
});
|
|
45
|
+
}),
|
|
46
|
+
getRecent: (limit = 10) => learningRepo.findRecent(limit),
|
|
47
|
+
recordUsage: (id) => Effect.gen(function* () {
|
|
48
|
+
const learning = yield* learningRepo.findById(id);
|
|
49
|
+
if (!learning) {
|
|
50
|
+
return yield* Effect.fail(new LearningNotFoundError({ id }));
|
|
51
|
+
}
|
|
52
|
+
yield* learningRepo.incrementUsage(id);
|
|
53
|
+
}),
|
|
54
|
+
updateOutcome: (id, score) => Effect.gen(function* () {
|
|
55
|
+
if (score < 0 || score > 1) {
|
|
56
|
+
return yield* Effect.fail(new ValidationError({ reason: "Outcome score must be between 0 and 1" }));
|
|
57
|
+
}
|
|
58
|
+
const learning = yield* learningRepo.findById(id);
|
|
59
|
+
if (!learning) {
|
|
60
|
+
return yield* Effect.fail(new LearningNotFoundError({ id }));
|
|
61
|
+
}
|
|
62
|
+
yield* learningRepo.updateOutcomeScore(id, score);
|
|
63
|
+
}),
|
|
64
|
+
getContextForTask: (taskId, options) => Effect.gen(function* () {
|
|
65
|
+
const startTime = Date.now();
|
|
66
|
+
// Get task to build search query from title/description
|
|
67
|
+
const task = yield* taskRepo.findById(taskId);
|
|
68
|
+
if (!task) {
|
|
69
|
+
return yield* Effect.fail(new TaskNotFoundError({ id: taskId }));
|
|
70
|
+
}
|
|
71
|
+
// Build search query from task content
|
|
72
|
+
const searchQuery = `${task.title} ${task.description}`.trim();
|
|
73
|
+
// Build retrieval options with optional graph expansion
|
|
74
|
+
const retrievalOptions = {
|
|
75
|
+
limit: 10,
|
|
76
|
+
minScore: 0.05,
|
|
77
|
+
graphExpansion: options?.useGraph
|
|
78
|
+
? {
|
|
79
|
+
enabled: true,
|
|
80
|
+
depth: options.expansionDepth ?? 2, // Default depth=2 per PRD-016
|
|
81
|
+
edgeTypes: options.edgeTypes
|
|
82
|
+
}
|
|
83
|
+
: undefined
|
|
84
|
+
};
|
|
85
|
+
// Delegate to RetrieverService for the actual search
|
|
86
|
+
const learnings = yield* retrieverService.search(searchQuery, retrievalOptions);
|
|
87
|
+
// Record usage for returned learnings (batch update to avoid N+1)
|
|
88
|
+
if (learnings.length > 0) {
|
|
89
|
+
yield* learningRepo.incrementUsageMany(learnings.map(l => l.id));
|
|
90
|
+
}
|
|
91
|
+
// Calculate graph expansion stats if enabled
|
|
92
|
+
const graphExpansion = options?.useGraph
|
|
93
|
+
? {
|
|
94
|
+
enabled: true,
|
|
95
|
+
seedCount: learnings.filter(l => l.expansionHops === 0 || l.expansionHops === undefined).length,
|
|
96
|
+
expandedCount: learnings.filter(l => l.expansionHops !== undefined && l.expansionHops > 0).length,
|
|
97
|
+
maxDepthReached: Math.max(0, ...learnings.map(l => l.expansionHops ?? 0))
|
|
98
|
+
}
|
|
99
|
+
: undefined;
|
|
100
|
+
return {
|
|
101
|
+
taskId,
|
|
102
|
+
taskTitle: task.title,
|
|
103
|
+
learnings,
|
|
104
|
+
searchQuery,
|
|
105
|
+
searchDuration: Date.now() - startTime,
|
|
106
|
+
graphExpansion
|
|
107
|
+
};
|
|
108
|
+
}),
|
|
109
|
+
count: () => learningRepo.count(),
|
|
110
|
+
embedAll: (forceAll = false) => Effect.gen(function* () {
|
|
111
|
+
// Get learnings to embed
|
|
112
|
+
const allLearnings = yield* learningRepo.findAll();
|
|
113
|
+
const toEmbed = forceAll
|
|
114
|
+
? allLearnings
|
|
115
|
+
: allLearnings.filter(l => !l.embedding);
|
|
116
|
+
let processed = 0;
|
|
117
|
+
let skipped = 0;
|
|
118
|
+
let failed = 0;
|
|
119
|
+
for (const learning of toEmbed) {
|
|
120
|
+
const result = yield* Effect.either(embeddingService.embed(learning.content));
|
|
121
|
+
if (result._tag === "Right") {
|
|
122
|
+
yield* learningRepo.updateEmbedding(learning.id, result.right);
|
|
123
|
+
processed++;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
failed++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
skipped = allLearnings.length - toEmbed.length;
|
|
130
|
+
return {
|
|
131
|
+
processed,
|
|
132
|
+
skipped,
|
|
133
|
+
failed,
|
|
134
|
+
total: allLearnings.length
|
|
135
|
+
};
|
|
136
|
+
}),
|
|
137
|
+
embeddingStatus: () => Effect.gen(function* () {
|
|
138
|
+
const total = yield* learningRepo.count();
|
|
139
|
+
const withEmbeddings = yield* learningRepo.countWithEmbeddings();
|
|
140
|
+
const withoutEmbeddings = total - withEmbeddings;
|
|
141
|
+
const coveragePercent = total > 0 ? (withEmbeddings / total) * 100 : 0;
|
|
142
|
+
return {
|
|
143
|
+
total,
|
|
144
|
+
withEmbeddings,
|
|
145
|
+
withoutEmbeddings,
|
|
146
|
+
coveragePercent
|
|
147
|
+
};
|
|
148
|
+
})
|
|
149
|
+
};
|
|
150
|
+
}));
|
|
151
|
+
//# sourceMappingURL=learning-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-service.js","sourceRoot":"","sources":["../../src/services/learning-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
/**
|
|
5
|
+
* Describes a single database migration.
|
|
6
|
+
*/
|
|
7
|
+
export interface Migration {
|
|
8
|
+
readonly version: number;
|
|
9
|
+
readonly description: string;
|
|
10
|
+
readonly sql: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Information about an applied migration.
|
|
14
|
+
*/
|
|
15
|
+
export interface AppliedMigration {
|
|
16
|
+
readonly version: number;
|
|
17
|
+
readonly appliedAt: Date;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Migration status including current version and pending migrations.
|
|
21
|
+
*/
|
|
22
|
+
export interface MigrationStatus {
|
|
23
|
+
readonly currentVersion: number;
|
|
24
|
+
readonly latestVersion: number;
|
|
25
|
+
readonly pendingCount: number;
|
|
26
|
+
readonly appliedMigrations: readonly AppliedMigration[];
|
|
27
|
+
readonly pendingMigrations: readonly Migration[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* All migrations loaded from the migrations/ directory.
|
|
31
|
+
* Sorted by version number.
|
|
32
|
+
*/
|
|
33
|
+
export declare const MIGRATIONS: readonly Migration[];
|
|
34
|
+
/**
|
|
35
|
+
* Get the latest migration version.
|
|
36
|
+
*/
|
|
37
|
+
export declare const getLatestVersion: () => number;
|
|
38
|
+
declare const MigrationService_base: Context.TagClass<MigrationService, "MigrationService", {
|
|
39
|
+
/**
|
|
40
|
+
* Get the current migration status.
|
|
41
|
+
* Returns current version, latest version, and pending migrations.
|
|
42
|
+
*/
|
|
43
|
+
readonly getStatus: () => Effect.Effect<MigrationStatus, DatabaseError>;
|
|
44
|
+
/**
|
|
45
|
+
* Apply all pending migrations.
|
|
46
|
+
* Returns the number of migrations applied.
|
|
47
|
+
* Note: Migrations are also applied automatically when the database is opened.
|
|
48
|
+
*/
|
|
49
|
+
readonly run: () => Effect.Effect<number, DatabaseError>;
|
|
50
|
+
/**
|
|
51
|
+
* Get the current schema version from the database.
|
|
52
|
+
*/
|
|
53
|
+
readonly getCurrentVersion: () => Effect.Effect<number, DatabaseError>;
|
|
54
|
+
/**
|
|
55
|
+
* Get all applied migrations.
|
|
56
|
+
*/
|
|
57
|
+
readonly getAppliedMigrations: () => Effect.Effect<readonly AppliedMigration[], DatabaseError>;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* MigrationService manages database schema migrations.
|
|
61
|
+
* Follows Effect-TS patterns per DD-002.
|
|
62
|
+
*/
|
|
63
|
+
export declare class MigrationService extends MigrationService_base {
|
|
64
|
+
}
|
|
65
|
+
export declare const MigrationServiceLive: Layer.Layer<MigrationService, never, SqliteClient>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=migration-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-service.d.ts","sourceRoot":"","sources":["../../src/services/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAI/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACvD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,SAAS,EAAE,CAAA;CACjD;AAkED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAA4B,CAAA;AAEvE;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,MAGnC,CAAA;;IASG;;;OAGG;wBACiB,MAAM,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;IAEvE;;;;OAIG;kBACW,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAExD;;OAEG;gCACyB,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEtE;;OAEG;mCAC4B,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,gBAAgB,EAAE,EAAE,aAAa,CAAC;;AA5BlG;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBA0BnC;CAAG;AAEN,eAAO,MAAM,oBAAoB,oDAyEhC,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { SqliteClient } from "../db.js";
|
|
6
|
+
import { DatabaseError } from "../errors.js";
|
|
7
|
+
/**
|
|
8
|
+
* Get the migrations directory path.
|
|
9
|
+
* Looks for migrations/ relative to the package root.
|
|
10
|
+
*/
|
|
11
|
+
const getMigrationsDir = () => {
|
|
12
|
+
// When running from source (src/services/migration-service.ts)
|
|
13
|
+
// or from dist (dist/services/migration-service.js),
|
|
14
|
+
// we need to go up to the package root and then into migrations/
|
|
15
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
// Go up to packages/core, then up to monorepo root
|
|
17
|
+
const packageRoot = resolve(currentDir, "..", "..", "..", "..");
|
|
18
|
+
return join(packageRoot, "migrations");
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Parse a migration filename to extract version and description.
|
|
22
|
+
* Expected format: NNN_description.sql (e.g., 001_initial.sql)
|
|
23
|
+
*/
|
|
24
|
+
const parseMigrationFilename = (filename) => {
|
|
25
|
+
const match = filename.match(/^(\d{3})_(.+)\.sql$/);
|
|
26
|
+
if (!match)
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
version: parseInt(match[1], 10),
|
|
30
|
+
description: match[2].replace(/_/g, " ")
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Load all migrations from the migrations/ directory.
|
|
35
|
+
* Migrations are sorted by version number.
|
|
36
|
+
*/
|
|
37
|
+
const loadMigrationsFromDir = () => {
|
|
38
|
+
const migrationsDir = getMigrationsDir();
|
|
39
|
+
let files;
|
|
40
|
+
try {
|
|
41
|
+
files = readdirSync(migrationsDir);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Migrations directory doesn't exist - return empty array
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const migrations = [];
|
|
48
|
+
for (const filename of files) {
|
|
49
|
+
if (!filename.endsWith(".sql"))
|
|
50
|
+
continue;
|
|
51
|
+
const parsed = parseMigrationFilename(filename);
|
|
52
|
+
if (!parsed)
|
|
53
|
+
continue;
|
|
54
|
+
const sql = readFileSync(join(migrationsDir, filename), "utf-8");
|
|
55
|
+
migrations.push({
|
|
56
|
+
version: parsed.version,
|
|
57
|
+
description: parsed.description,
|
|
58
|
+
sql
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Sort by version number
|
|
62
|
+
migrations.sort((a, b) => a.version - b.version);
|
|
63
|
+
return migrations;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* All migrations loaded from the migrations/ directory.
|
|
67
|
+
* Sorted by version number.
|
|
68
|
+
*/
|
|
69
|
+
export const MIGRATIONS = loadMigrationsFromDir();
|
|
70
|
+
/**
|
|
71
|
+
* Get the latest migration version.
|
|
72
|
+
*/
|
|
73
|
+
export const getLatestVersion = () => {
|
|
74
|
+
if (MIGRATIONS.length === 0)
|
|
75
|
+
return 0;
|
|
76
|
+
return MIGRATIONS[MIGRATIONS.length - 1].version;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* MigrationService manages database schema migrations.
|
|
80
|
+
* Follows Effect-TS patterns per DD-002.
|
|
81
|
+
*/
|
|
82
|
+
export class MigrationService extends Context.Tag("MigrationService")() {
|
|
83
|
+
}
|
|
84
|
+
export const MigrationServiceLive = Layer.effect(MigrationService, Effect.gen(function* () {
|
|
85
|
+
const db = yield* SqliteClient;
|
|
86
|
+
const getCurrentVersion = () => Effect.try({
|
|
87
|
+
try: () => {
|
|
88
|
+
try {
|
|
89
|
+
const row = db.prepare("SELECT MAX(version) as version FROM schema_version").get();
|
|
90
|
+
return row?.version ?? 0;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Table doesn't exist yet
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
98
|
+
});
|
|
99
|
+
const getAppliedMigrations = () => Effect.try({
|
|
100
|
+
try: () => {
|
|
101
|
+
try {
|
|
102
|
+
const rows = db.prepare("SELECT version, applied_at FROM schema_version ORDER BY version").all();
|
|
103
|
+
return rows.map(row => ({
|
|
104
|
+
version: row.version,
|
|
105
|
+
appliedAt: new Date(row.applied_at)
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Table doesn't exist yet
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
getCurrentVersion,
|
|
117
|
+
getAppliedMigrations,
|
|
118
|
+
getStatus: () => Effect.gen(function* () {
|
|
119
|
+
const currentVersion = yield* getCurrentVersion();
|
|
120
|
+
const latestVersion = getLatestVersion();
|
|
121
|
+
const appliedMigrations = yield* getAppliedMigrations();
|
|
122
|
+
const pendingMigrations = MIGRATIONS.filter(m => m.version > currentVersion);
|
|
123
|
+
return {
|
|
124
|
+
currentVersion,
|
|
125
|
+
latestVersion,
|
|
126
|
+
pendingCount: pendingMigrations.length,
|
|
127
|
+
appliedMigrations,
|
|
128
|
+
pendingMigrations
|
|
129
|
+
};
|
|
130
|
+
}),
|
|
131
|
+
run: () => Effect.gen(function* () {
|
|
132
|
+
const currentVersion = yield* getCurrentVersion();
|
|
133
|
+
const pendingMigrations = MIGRATIONS.filter(m => m.version > currentVersion);
|
|
134
|
+
for (const migration of pendingMigrations) {
|
|
135
|
+
yield* Effect.try({
|
|
136
|
+
try: () => db.exec(migration.sql),
|
|
137
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return pendingMigrations.length;
|
|
141
|
+
})
|
|
142
|
+
};
|
|
143
|
+
}));
|
|
144
|
+
//# sourceMappingURL=migration-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-service.js","sourceRoot":"","sources":["../../src/services/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AA8B5C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,GAAW,EAAE;IACpC,+DAA+D;IAC/D,qDAAqD;IACrD,iEAAiE;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,mDAAmD;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC/D,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;AACxC,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAmD,EAAE;IACnG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/B,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;KACzC,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,qBAAqB,GAAG,GAAgB,EAAE;IAC9C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,IAAI,KAAe,CAAA;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;QAC1D,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAQ;QAExC,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;QAChE,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;IAED,yBAAyB;IACzB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;IAEhD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAyB,qBAAqB,EAAE,CAAA;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrC,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;AAClD,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EA0BlE;CAAG;AAEN,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAC9C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IAE9B,MAAM,iBAAiB,GAAG,GAAyC,EAAE,CACnE,MAAM,CAAC,GAAG,CAAC;QACT,GAAG,EAAE,GAAG,EAAE;YACR,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,EAAqC,CAAA;gBACrH,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;KAC/C,CAAC,CAAA;IAEJ,MAAM,oBAAoB,GAAG,GAA8D,EAAE,CAC3F,MAAM,CAAC,GAAG,CAAC;QACT,GAAG,EAAE,GAAG,EAAE;YACR,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,EAAoD,CAAA;gBAClJ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;iBACpC,CAAC,CAAC,CAAA;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;gBAC1B,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;KAC/C,CAAC,CAAA;IAEJ,OAAO;QACL,iBAAiB;QAEjB,oBAAoB;QAEpB,SAAS,EAAE,GAAG,EAAE,CACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,iBAAiB,EAAE,CAAA;YACjD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;YACxC,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAA;YACvD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAA;YAE5E,OAAO;gBACL,cAAc;gBACd,aAAa;gBACb,YAAY,EAAE,iBAAiB,CAAC,MAAM;gBACtC,iBAAiB;gBACjB,iBAAiB;aAClB,CAAA;QACH,CAAC,CAAC;QAEJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,iBAAiB,EAAE,CAAA;YACjD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAA;YAE5E,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;gBAC1C,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;oBAChB,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;oBACjC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;iBAC/C,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,iBAAiB,CAAC,MAAM,CAAA;QACjC,CAAC,CAAC;KACL,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrchestratorService - PRD-018
|
|
3
|
+
*
|
|
4
|
+
* Manages orchestrator lifecycle and reconciliation loop.
|
|
5
|
+
* Uses Effect-TS patterns per DD-002.
|
|
6
|
+
*/
|
|
7
|
+
import { Context, Effect, Layer } from "effect";
|
|
8
|
+
import { OrchestratorStateRepository } from "../repo/orchestrator-state-repo.js";
|
|
9
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
10
|
+
import { ClaimRepository } from "../repo/claim-repo.js";
|
|
11
|
+
import { WorkerService } from "./worker-service.js";
|
|
12
|
+
import { ClaimService } from "./claim-service.js";
|
|
13
|
+
import { DatabaseError, OrchestratorError } from "../errors.js";
|
|
14
|
+
import type { OrchestratorState, ReconciliationResult } from "../schemas/worker.js";
|
|
15
|
+
/**
|
|
16
|
+
* Configuration options for the orchestrator.
|
|
17
|
+
*/
|
|
18
|
+
export interface OrchestratorConfig {
|
|
19
|
+
readonly workerPoolSize?: number;
|
|
20
|
+
readonly heartbeatIntervalSeconds?: number;
|
|
21
|
+
readonly leaseDurationMinutes?: number;
|
|
22
|
+
readonly reconcileIntervalSeconds?: number;
|
|
23
|
+
readonly shutdownTimeoutSeconds?: number;
|
|
24
|
+
readonly maxClaimRenewals?: number;
|
|
25
|
+
}
|
|
26
|
+
declare const OrchestratorService_base: Context.TagClass<OrchestratorService, "OrchestratorService", {
|
|
27
|
+
/**
|
|
28
|
+
* Start the orchestrator with the given configuration.
|
|
29
|
+
* Sets status to 'running' and initializes the orchestrator state.
|
|
30
|
+
*/
|
|
31
|
+
readonly start: (config?: OrchestratorConfig) => Effect.Effect<void, OrchestratorError | DatabaseError>;
|
|
32
|
+
/**
|
|
33
|
+
* Stop the orchestrator.
|
|
34
|
+
* If graceful is true, waits for workers to finish current tasks.
|
|
35
|
+
*/
|
|
36
|
+
readonly stop: (graceful: boolean) => Effect.Effect<void, OrchestratorError | DatabaseError>;
|
|
37
|
+
/**
|
|
38
|
+
* Get the current orchestrator status.
|
|
39
|
+
*/
|
|
40
|
+
readonly status: () => Effect.Effect<OrchestratorState, DatabaseError>;
|
|
41
|
+
/**
|
|
42
|
+
* Run a single reconciliation pass.
|
|
43
|
+
* Detects dead workers, expires claims, recovers orphaned tasks,
|
|
44
|
+
* and fixes state inconsistencies.
|
|
45
|
+
*/
|
|
46
|
+
readonly reconcile: () => Effect.Effect<ReconciliationResult, DatabaseError>;
|
|
47
|
+
}>;
|
|
48
|
+
export declare class OrchestratorService extends OrchestratorService_base {
|
|
49
|
+
}
|
|
50
|
+
export declare const OrchestratorServiceLive: Layer.Layer<OrchestratorService, never, TaskRepository | ClaimRepository | OrchestratorStateRepository | WorkerService | ClaimService>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=orchestrator-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-service.d.ts","sourceRoot":"","sources":["../../src/services/orchestrator-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAEnF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAC1C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAC1C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;;IAiBG;;;OAGG;oBACa,CACd,MAAM,CAAC,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAE3D;;;OAGG;mBACY,CACb,QAAQ,EAAE,OAAO,KACd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAE3D;;OAEG;qBACc,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;IAEtE;;;;OAIG;wBACiB,MAAM,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,aAAa,CAAC;;AA7BhF,qBAAa,mBAAoB,SAAQ,wBA+BtC;CAAG;AAEN,eAAO,MAAM,uBAAuB,wIAkPnC,CAAA"}
|