@jamesaphoenix/tx-core 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +480 -0
- package/dist/db.d.ts +28 -14
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +102 -14
- package/dist/db.js.map +1 -1
- package/dist/errors.d.ts +178 -34
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +119 -26
- package/dist/errors.js.map +1 -1
- package/dist/id.d.ts +10 -0
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +17 -1
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +15 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -8
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +23 -14
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +75 -76
- package/dist/layer.js.map +1 -1
- package/dist/mappers/anchor.d.ts +15 -1
- package/dist/mappers/anchor.d.ts.map +1 -1
- package/dist/mappers/anchor.js +95 -28
- package/dist/mappers/anchor.js.map +1 -1
- package/dist/mappers/attempt.d.ts +3 -1
- package/dist/mappers/attempt.d.ts.map +1 -1
- package/dist/mappers/attempt.js +23 -9
- package/dist/mappers/attempt.js.map +1 -1
- package/dist/mappers/candidate.d.ts +3 -1
- package/dist/mappers/candidate.d.ts.map +1 -1
- package/dist/mappers/candidate.js +46 -16
- package/dist/mappers/candidate.js.map +1 -1
- package/dist/mappers/claim.d.ts +1 -1
- package/dist/mappers/claim.d.ts.map +1 -1
- package/dist/mappers/claim.js +11 -4
- package/dist/mappers/claim.js.map +1 -1
- package/dist/mappers/deduplication.d.ts +13 -1
- package/dist/mappers/deduplication.d.ts.map +1 -1
- package/dist/mappers/deduplication.js +22 -3
- package/dist/mappers/deduplication.js.map +1 -1
- package/dist/mappers/doc.d.ts +24 -0
- package/dist/mappers/doc.d.ts.map +1 -0
- package/dist/mappers/doc.js +161 -0
- package/dist/mappers/doc.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -1
- package/dist/mappers/edge.d.ts.map +1 -1
- package/dist/mappers/edge.js +74 -12
- package/dist/mappers/edge.js.map +1 -1
- package/dist/mappers/file-learning.d.ts.map +1 -1
- package/dist/mappers/file-learning.js +2 -1
- package/dist/mappers/file-learning.js.map +1 -1
- package/dist/mappers/index.d.ts +6 -7
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +10 -12
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/learning.d.ts +9 -1
- package/dist/mappers/learning.d.ts.map +1 -1
- package/dist/mappers/learning.js +94 -14
- package/dist/mappers/learning.js.map +1 -1
- package/dist/mappers/orchestrator-state.d.ts +1 -1
- package/dist/mappers/orchestrator-state.d.ts.map +1 -1
- package/dist/mappers/orchestrator-state.js +31 -5
- package/dist/mappers/orchestrator-state.js.map +1 -1
- package/dist/mappers/parse-date.d.ts +11 -0
- package/dist/mappers/parse-date.d.ts.map +1 -0
- package/dist/mappers/parse-date.js +18 -0
- package/dist/mappers/parse-date.js.map +1 -0
- package/dist/mappers/run.d.ts +14 -4
- package/dist/mappers/run.d.ts.map +1 -1
- package/dist/mappers/run.js +49 -18
- package/dist/mappers/run.js.map +1 -1
- package/dist/mappers/task.d.ts +5 -1
- package/dist/mappers/task.d.ts.map +1 -1
- package/dist/mappers/task.js +66 -16
- package/dist/mappers/task.js.map +1 -1
- package/dist/mappers/tracked-project.d.ts +3 -1
- package/dist/mappers/tracked-project.d.ts.map +1 -1
- package/dist/mappers/tracked-project.js +23 -9
- package/dist/mappers/tracked-project.js.map +1 -1
- package/dist/mappers/worker.d.ts +1 -1
- package/dist/mappers/worker.d.ts.map +1 -1
- package/dist/mappers/worker.js +44 -6
- package/dist/mappers/worker.js.map +1 -1
- package/dist/repo/anchor-repo.d.ts +2 -2
- package/dist/repo/anchor-repo.d.ts.map +1 -1
- package/dist/repo/anchor-repo.js +46 -5
- package/dist/repo/anchor-repo.js.map +1 -1
- package/dist/repo/attempt-repo.d.ts +2 -2
- package/dist/repo/attempt-repo.d.ts.map +1 -1
- package/dist/repo/attempt-repo.js +16 -6
- package/dist/repo/attempt-repo.js.map +1 -1
- package/dist/repo/candidate-repo.d.ts.map +1 -1
- package/dist/repo/candidate-repo.js +22 -1
- package/dist/repo/candidate-repo.js.map +1 -1
- package/dist/repo/claim-repo.d.ts +46 -2
- package/dist/repo/claim-repo.d.ts.map +1 -1
- package/dist/repo/claim-repo.js +113 -6
- package/dist/repo/claim-repo.js.map +1 -1
- package/dist/repo/compaction-repo.d.ts +41 -0
- package/dist/repo/compaction-repo.d.ts.map +1 -0
- package/dist/repo/compaction-repo.js +84 -0
- package/dist/repo/compaction-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +9 -1
- package/dist/repo/deduplication-repo.d.ts.map +1 -1
- package/dist/repo/deduplication-repo.js +46 -9
- package/dist/repo/deduplication-repo.js.map +1 -1
- package/dist/repo/dep-repo.d.ts +27 -3
- package/dist/repo/dep-repo.d.ts.map +1 -1
- package/dist/repo/dep-repo.js +166 -39
- package/dist/repo/dep-repo.js.map +1 -1
- package/dist/repo/doc-repo.d.ts +59 -0
- package/dist/repo/doc-repo.d.ts.map +1 -0
- package/dist/repo/doc-repo.js +276 -0
- package/dist/repo/doc-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +1 -1
- package/dist/repo/edge-repo.d.ts.map +1 -1
- package/dist/repo/edge-repo.js +65 -34
- package/dist/repo/edge-repo.js.map +1 -1
- package/dist/repo/file-learning-repo.d.ts +3 -3
- package/dist/repo/file-learning-repo.d.ts.map +1 -1
- package/dist/repo/file-learning-repo.js +19 -8
- package/dist/repo/file-learning-repo.js.map +1 -1
- package/dist/repo/index.d.ts +4 -6
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +3 -5
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/learning-repo.d.ts +10 -3
- package/dist/repo/learning-repo.d.ts.map +1 -1
- package/dist/repo/learning-repo.js +68 -11
- package/dist/repo/learning-repo.js.map +1 -1
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
- package/dist/repo/orchestrator-state-repo.js +8 -1
- package/dist/repo/orchestrator-state-repo.js.map +1 -1
- package/dist/repo/run-repo.d.ts +3 -3
- package/dist/repo/run-repo.d.ts.map +1 -1
- package/dist/repo/run-repo.js +40 -19
- package/dist/repo/run-repo.js.map +1 -1
- package/dist/repo/task-repo.d.ts +14 -3
- package/dist/repo/task-repo.d.ts.map +1 -1
- package/dist/repo/task-repo.js +194 -20
- package/dist/repo/task-repo.js.map +1 -1
- package/dist/repo/tracked-project-repo.d.ts.map +1 -1
- package/dist/repo/tracked-project-repo.js +15 -1
- package/dist/repo/tracked-project-repo.js.map +1 -1
- package/dist/repo/worker-repo.d.ts +3 -2
- package/dist/repo/worker-repo.d.ts.map +1 -1
- package/dist/repo/worker-repo.js +54 -8
- package/dist/repo/worker-repo.js.map +1 -1
- package/dist/schemas/sync.js +2 -2
- package/dist/schemas/sync.js.map +1 -1
- package/dist/schemas/worker.d.ts +1 -0
- package/dist/schemas/worker.d.ts.map +1 -1
- package/dist/schemas/worker.js +1 -0
- package/dist/schemas/worker.js.map +1 -1
- package/dist/services/agent-service.d.ts +57 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +81 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/anchor-service.js +1 -1
- package/dist/services/anchor-service.js.map +1 -1
- package/dist/services/anchor-verification.d.ts +8 -0
- package/dist/services/anchor-verification.d.ts.map +1 -1
- package/dist/services/anchor-verification.js +237 -37
- package/dist/services/anchor-verification.js.map +1 -1
- package/dist/services/ast-grep-service.d.ts.map +1 -1
- package/dist/services/ast-grep-service.js +93 -22
- package/dist/services/ast-grep-service.js.map +1 -1
- package/dist/services/attempt-service.d.ts.map +1 -1
- package/dist/services/attempt-service.js +1 -4
- package/dist/services/attempt-service.js.map +1 -1
- package/dist/services/auto-sync-service.d.ts +1 -1
- package/dist/services/auto-sync-service.d.ts.map +1 -1
- package/dist/services/auto-sync-service.js +18 -10
- package/dist/services/auto-sync-service.js.map +1 -1
- package/dist/services/claim-service.d.ts +8 -2
- package/dist/services/claim-service.d.ts.map +1 -1
- package/dist/services/claim-service.js +37 -23
- package/dist/services/claim-service.js.map +1 -1
- package/dist/services/compaction-service.d.ts +105 -0
- package/dist/services/compaction-service.d.ts.map +1 -0
- package/dist/services/compaction-service.js +369 -0
- package/dist/services/compaction-service.js.map +1 -0
- package/dist/services/cycle-scan-service.d.ts +32 -0
- package/dist/services/cycle-scan-service.d.ts.map +1 -0
- package/dist/services/cycle-scan-service.js +542 -0
- package/dist/services/cycle-scan-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +40 -2
- package/dist/services/daemon-service.d.ts.map +1 -1
- package/dist/services/daemon-service.js +199 -52
- package/dist/services/daemon-service.js.map +1 -1
- package/dist/services/deduplication-service.d.ts +8 -4
- package/dist/services/deduplication-service.d.ts.map +1 -1
- package/dist/services/deduplication-service.js +79 -25
- package/dist/services/deduplication-service.js.map +1 -1
- package/dist/services/dep-service.d.ts +2 -2
- package/dist/services/dep-service.d.ts.map +1 -1
- package/dist/services/dep-service.js +9 -5
- package/dist/services/dep-service.js.map +1 -1
- package/dist/services/diversifier-service.d.ts +2 -1
- package/dist/services/diversifier-service.d.ts.map +1 -1
- package/dist/services/diversifier-service.js +37 -43
- package/dist/services/diversifier-service.js.map +1 -1
- package/dist/services/doc-service.d.ts +49 -0
- package/dist/services/doc-service.d.ts.map +1 -0
- package/dist/services/doc-service.js +605 -0
- package/dist/services/doc-service.js.map +1 -0
- package/dist/services/edge-service.js +2 -2
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/embedding-service.d.ts +66 -2
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +138 -24
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/file-learning-service.d.ts.map +1 -1
- package/dist/services/file-learning-service.js +8 -7
- package/dist/services/file-learning-service.js.map +1 -1
- package/dist/services/file-watcher-service.d.ts.map +1 -1
- package/dist/services/file-watcher-service.js +58 -11
- package/dist/services/file-watcher-service.js.map +1 -1
- package/dist/services/graph-expansion.d.ts +3 -0
- package/dist/services/graph-expansion.d.ts.map +1 -1
- package/dist/services/graph-expansion.js +28 -7
- package/dist/services/graph-expansion.js.map +1 -1
- package/dist/services/hierarchy-service.d.ts +1 -1
- package/dist/services/hierarchy-service.d.ts.map +1 -1
- package/dist/services/hierarchy-service.js +50 -32
- package/dist/services/hierarchy-service.js.map +1 -1
- package/dist/services/index.d.ts +13 -15
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +13 -15
- package/dist/services/index.js.map +1 -1
- package/dist/services/learning-service.d.ts +4 -4
- package/dist/services/learning-service.d.ts.map +1 -1
- package/dist/services/learning-service.js +75 -42
- package/dist/services/learning-service.js.map +1 -1
- package/dist/services/llm-service.d.ts +62 -0
- package/dist/services/llm-service.d.ts.map +1 -0
- package/dist/services/llm-service.js +172 -0
- package/dist/services/llm-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +1 -1
- package/dist/services/migration-service.d.ts.map +1 -1
- package/dist/services/migration-service.js +18 -7
- package/dist/services/migration-service.js.map +1 -1
- package/dist/services/orchestrator-service.d.ts +4 -3
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js +67 -29
- package/dist/services/orchestrator-service.js.map +1 -1
- package/dist/services/promotion-service.d.ts +1 -1
- package/dist/services/promotion-service.js +1 -1
- package/dist/services/promotion-service.js.map +1 -1
- package/dist/services/query-expansion-service.d.ts +30 -9
- package/dist/services/query-expansion-service.d.ts.map +1 -1
- package/dist/services/query-expansion-service.js +54 -63
- package/dist/services/query-expansion-service.js.map +1 -1
- package/dist/services/ready-service.d.ts +21 -1
- package/dist/services/ready-service.d.ts.map +1 -1
- package/dist/services/ready-service.js +44 -21
- package/dist/services/ready-service.js.map +1 -1
- package/dist/services/retriever-service.d.ts +10 -10
- package/dist/services/retriever-service.d.ts.map +1 -1
- package/dist/services/retriever-service.js +53 -161
- package/dist/services/retriever-service.js.map +1 -1
- package/dist/services/swarm-verification.d.ts +2 -2
- package/dist/services/swarm-verification.d.ts.map +1 -1
- package/dist/services/swarm-verification.js +12 -6
- package/dist/services/swarm-verification.js.map +1 -1
- package/dist/services/sync-service.d.ts +17 -4
- package/dist/services/sync-service.d.ts.map +1 -1
- package/dist/services/sync-service.js +378 -114
- package/dist/services/sync-service.js.map +1 -1
- package/dist/services/task-service.d.ts +6 -4
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +162 -33
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/tracing-service.d.ts +55 -0
- package/dist/services/tracing-service.d.ts.map +1 -0
- package/dist/services/tracing-service.js +99 -0
- package/dist/services/tracing-service.js.map +1 -0
- package/dist/services/transcript-adapter.d.ts +99 -0
- package/dist/services/transcript-adapter.d.ts.map +1 -0
- package/dist/services/transcript-adapter.js +283 -0
- package/dist/services/transcript-adapter.js.map +1 -0
- package/dist/services/validation-service.d.ts +85 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +289 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +23 -4
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +159 -70
- package/dist/services/worker-process.js.map +1 -1
- package/dist/services/worker-service.d.ts.map +1 -1
- package/dist/services/worker-service.js +7 -12
- package/dist/services/worker-service.js.map +1 -1
- package/dist/sync/claude-task-writer.d.ts +49 -0
- package/dist/sync/claude-task-writer.d.ts.map +1 -0
- package/dist/sync/claude-task-writer.js +135 -0
- package/dist/sync/claude-task-writer.js.map +1 -0
- package/dist/utils/doc-hash.d.ts +10 -0
- package/dist/utils/doc-hash.d.ts.map +1 -0
- package/dist/utils/doc-hash.js +14 -0
- package/dist/utils/doc-hash.js.map +1 -0
- package/dist/utils/doc-renderer.d.ts +44 -0
- package/dist/utils/doc-renderer.d.ts.map +1 -0
- package/dist/utils/doc-renderer.js +202 -0
- package/dist/utils/doc-renderer.js.map +1 -0
- package/dist/utils/math.d.ts +5 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +12 -4
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/sql.d.ts +9 -0
- package/dist/utils/sql.d.ts.map +1 -0
- package/dist/utils/sql.js +9 -0
- package/dist/utils/sql.js.map +1 -0
- package/dist/utils/toml-config.d.ts +22 -0
- package/dist/utils/toml-config.d.ts.map +1 -0
- package/dist/utils/toml-config.js +75 -0
- package/dist/utils/toml-config.js.map +1 -0
- package/dist/worker/hooks.d.ts +102 -0
- package/dist/worker/hooks.d.ts.map +1 -0
- package/dist/worker/hooks.js +11 -0
- package/dist/worker/hooks.js.map +1 -0
- package/dist/worker/index.d.ts +9 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/run-worker.d.ts +33 -0
- package/dist/worker/run-worker.d.ts.map +1 -0
- package/dist/worker/run-worker.js +265 -0
- package/dist/worker/run-worker.js.map +1 -0
- package/package.json +14 -12
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
* Manages orchestrator lifecycle and reconciliation loop.
|
|
5
5
|
* Uses Effect-TS patterns per DD-002.
|
|
6
6
|
*/
|
|
7
|
-
import { Context, Effect, Layer } from "effect";
|
|
7
|
+
import { Context, Effect, Exit, Layer } from "effect";
|
|
8
|
+
import { SqliteClient } from "../db.js";
|
|
8
9
|
import { OrchestratorStateRepository } from "../repo/orchestrator-state-repo.js";
|
|
9
10
|
import { TaskRepository } from "../repo/task-repo.js";
|
|
10
11
|
import { ClaimRepository } from "../repo/claim-repo.js";
|
|
11
12
|
import { WorkerService } from "./worker-service.js";
|
|
12
13
|
import { ClaimService } from "./claim-service.js";
|
|
13
|
-
import { OrchestratorError } from "../errors.js";
|
|
14
|
+
import { DatabaseError, OrchestratorError } from "../errors.js";
|
|
14
15
|
/**
|
|
15
16
|
* Default orchestrator configuration values.
|
|
16
17
|
*/
|
|
@@ -25,11 +26,37 @@ const DEFAULT_CONFIG = {
|
|
|
25
26
|
export class OrchestratorService extends Context.Tag("OrchestratorService")() {
|
|
26
27
|
}
|
|
27
28
|
export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.gen(function* () {
|
|
29
|
+
const db = yield* SqliteClient;
|
|
28
30
|
const stateRepo = yield* OrchestratorStateRepository;
|
|
29
31
|
const workerService = yield* WorkerService;
|
|
30
32
|
const claimService = yield* ClaimService;
|
|
31
33
|
const taskRepo = yield* TaskRepository;
|
|
32
34
|
const claimRepo = yield* ClaimRepository;
|
|
35
|
+
/**
|
|
36
|
+
* Helper to wrap an Effect in a database transaction.
|
|
37
|
+
* Ensures atomicity: either all operations succeed and COMMIT,
|
|
38
|
+
* or any failure triggers ROLLBACK.
|
|
39
|
+
*/
|
|
40
|
+
const withTransaction = (effect) => Effect.acquireUseRelease(
|
|
41
|
+
// Acquire: Begin transaction
|
|
42
|
+
Effect.try({
|
|
43
|
+
try: () => {
|
|
44
|
+
db.exec("BEGIN IMMEDIATE");
|
|
45
|
+
return undefined;
|
|
46
|
+
},
|
|
47
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
48
|
+
}),
|
|
49
|
+
// Use: Run the wrapped effect
|
|
50
|
+
() => effect,
|
|
51
|
+
// Release: Commit on success, rollback on failure
|
|
52
|
+
(_, exit) => Effect.sync(() => {
|
|
53
|
+
if (Exit.isSuccess(exit)) {
|
|
54
|
+
db.exec("COMMIT");
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
db.exec("ROLLBACK");
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
33
60
|
return {
|
|
34
61
|
start: (config) => Effect.gen(function* () {
|
|
35
62
|
const currentState = yield* stateRepo.get();
|
|
@@ -107,36 +134,38 @@ export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.
|
|
|
107
134
|
yield* Effect.log("Orchestrator stopped");
|
|
108
135
|
}),
|
|
109
136
|
status: () => stateRepo.get(),
|
|
110
|
-
reconcile: () =>
|
|
137
|
+
reconcile: () =>
|
|
138
|
+
// Wrap entire reconciliation in a transaction for atomicity.
|
|
139
|
+
// Prevents race conditions where state changes between steps.
|
|
140
|
+
// See: tx-a1c2b151 - OrchestratorService missing transaction boundaries
|
|
141
|
+
withTransaction(Effect.gen(function* () {
|
|
111
142
|
const startTime = Date.now();
|
|
112
143
|
let deadWorkersFound = 0;
|
|
113
144
|
let expiredClaimsReleased = 0;
|
|
114
145
|
let orphanedTasksRecovered = 0;
|
|
146
|
+
let orphanedClaimsReleased = 0;
|
|
115
147
|
let staleStatesFixed = 0;
|
|
116
|
-
// 1. Detect dead workers (missed
|
|
148
|
+
// 1. Detect dead workers (missed 1+ heartbeats)
|
|
149
|
+
// Changed from 2 to 1 to reduce worst-case detection time from ~90s to ~60s.
|
|
150
|
+
// With missedHeartbeats: 2, if worker dies at t=1 after heartbeat at t=0,
|
|
151
|
+
// detection doesn't occur until t=90+ (60s threshold + 30s reconcile delay).
|
|
117
152
|
const deadWorkers = yield* workerService.findDead({
|
|
118
|
-
missedHeartbeats:
|
|
153
|
+
missedHeartbeats: 1
|
|
119
154
|
});
|
|
120
155
|
for (const worker of deadWorkers) {
|
|
121
|
-
yield* workerService.markDead(worker.id).pipe(Effect.catchAll(() => Effect.
|
|
156
|
+
yield* workerService.markDead(worker.id).pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to mark worker ${worker.id} as dead: ${error}`)));
|
|
122
157
|
// Release any claims held by this dead worker
|
|
123
|
-
yield* claimService.releaseByWorker(worker.id).pipe(Effect.catchAll(() => Effect.
|
|
158
|
+
yield* claimService.releaseByWorker(worker.id).pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to release claims for dead worker ${worker.id}: ${error}`).pipe(Effect.as(0))));
|
|
124
159
|
deadWorkersFound++;
|
|
125
160
|
}
|
|
126
161
|
// 2. Expire stale claims (past lease expiration)
|
|
127
162
|
const expiredClaims = yield* claimService.getExpired();
|
|
128
163
|
for (const claim of expiredClaims) {
|
|
129
|
-
yield* claimService.expire(claim.id).pipe(Effect.catchAll(() => Effect.
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
yield* taskRepo.update({
|
|
135
|
-
...task,
|
|
136
|
-
status: "ready",
|
|
137
|
-
updatedAt: now
|
|
138
|
-
});
|
|
139
|
-
}
|
|
164
|
+
yield* claimService.expire(claim.id).pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to expire claim ${claim.id}: ${error}`)));
|
|
165
|
+
// Atomically recover task status based on blocker states.
|
|
166
|
+
// Single UPDATE with subquery eliminates TOCTOU race between
|
|
167
|
+
// reading blocker statuses and writing the new task status.
|
|
168
|
+
yield* taskRepo.recoverTaskStatus(claim.taskId, "active");
|
|
140
169
|
expiredClaimsReleased++;
|
|
141
170
|
}
|
|
142
171
|
// 3. Find orphaned tasks (status='active' but no active claim)
|
|
@@ -144,21 +173,19 @@ export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.
|
|
|
144
173
|
for (const task of activeTasks) {
|
|
145
174
|
const activeClaim = yield* claimRepo.findActiveByTaskId(task.id);
|
|
146
175
|
if (!activeClaim) {
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
yield* taskRepo.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
});
|
|
154
|
-
orphanedTasksRecovered++;
|
|
176
|
+
// Atomically recover orphaned task status based on blocker states.
|
|
177
|
+
// Single UPDATE with subquery eliminates TOCTOU race.
|
|
178
|
+
const updated = yield* taskRepo.recoverTaskStatus(task.id, "active");
|
|
179
|
+
if (updated) {
|
|
180
|
+
orphanedTasksRecovered++;
|
|
181
|
+
}
|
|
155
182
|
}
|
|
156
183
|
}
|
|
157
184
|
// 4. Fix workers marked busy but with no current_task_id
|
|
158
185
|
const busyWorkers = yield* workerService.list({ status: ["busy"] });
|
|
159
186
|
for (const worker of busyWorkers) {
|
|
160
187
|
if (worker.currentTaskId === null) {
|
|
161
|
-
yield* workerService.updateStatus(worker.id, "idle").pipe(Effect.catchAll(() => Effect.
|
|
188
|
+
yield* workerService.updateStatus(worker.id, "idle").pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to fix stale busy worker ${worker.id}: ${error}`)));
|
|
162
189
|
staleStatesFixed++;
|
|
163
190
|
}
|
|
164
191
|
}
|
|
@@ -167,11 +194,19 @@ export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.
|
|
|
167
194
|
if (worker.currentTaskId) {
|
|
168
195
|
const task = yield* taskRepo.findById(worker.currentTaskId);
|
|
169
196
|
if (!task || task.status !== "active") {
|
|
170
|
-
yield* workerService.updateStatus(worker.id, "idle").pipe(Effect.catchAll(() => Effect.
|
|
197
|
+
yield* workerService.updateStatus(worker.id, "idle").pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to fix stale worker ${worker.id} with task ${worker.currentTaskId}: ${error}`)));
|
|
171
198
|
staleStatesFixed++;
|
|
172
199
|
}
|
|
173
200
|
}
|
|
174
201
|
}
|
|
202
|
+
// 6. Find orphaned claims (active claims on non-active tasks)
|
|
203
|
+
// This catches claims that weren't released after task completion
|
|
204
|
+
// (e.g., if claim release failed after tx done)
|
|
205
|
+
const orphanedClaims = yield* claimService.getOrphanedClaims();
|
|
206
|
+
for (const claim of orphanedClaims) {
|
|
207
|
+
yield* claimService.expire(claim.id).pipe(Effect.catchAll((error) => Effect.log(`Reconciliation: failed to expire orphaned claim ${claim.id}: ${error}`)));
|
|
208
|
+
orphanedClaimsReleased++;
|
|
209
|
+
}
|
|
175
210
|
const reconcileTime = Date.now() - startTime;
|
|
176
211
|
// Update last reconcile timestamp
|
|
177
212
|
yield* stateRepo.update({
|
|
@@ -181,10 +216,12 @@ export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.
|
|
|
181
216
|
if (deadWorkersFound > 0 ||
|
|
182
217
|
expiredClaimsReleased > 0 ||
|
|
183
218
|
orphanedTasksRecovered > 0 ||
|
|
219
|
+
orphanedClaimsReleased > 0 ||
|
|
184
220
|
staleStatesFixed > 0) {
|
|
185
221
|
yield* Effect.log(`Reconciliation: ${deadWorkersFound} dead workers, ` +
|
|
186
222
|
`${expiredClaimsReleased} expired claims, ` +
|
|
187
223
|
`${orphanedTasksRecovered} orphaned tasks, ` +
|
|
224
|
+
`${orphanedClaimsReleased} orphaned claims, ` +
|
|
188
225
|
`${staleStatesFixed} stale states fixed ` +
|
|
189
226
|
`(${reconcileTime}ms)`);
|
|
190
227
|
}
|
|
@@ -193,11 +230,12 @@ export const OrchestratorServiceLive = Layer.effect(OrchestratorService, Effect.
|
|
|
193
230
|
deadWorkersFound,
|
|
194
231
|
expiredClaimsReleased,
|
|
195
232
|
orphanedTasksRecovered,
|
|
233
|
+
orphanedClaimsReleased,
|
|
196
234
|
staleStatesFixed,
|
|
197
235
|
reconcileTime
|
|
198
236
|
};
|
|
199
237
|
return result;
|
|
200
|
-
})
|
|
238
|
+
}))
|
|
201
239
|
};
|
|
202
240
|
}));
|
|
203
241
|
//# sourceMappingURL=orchestrator-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-service.js","sourceRoot":"","sources":["../../src/services/orchestrator-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"orchestrator-service.js","sourceRoot":"","sources":["../../src/services/orchestrator-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,6 @@ declare const PromotionService_base: Context.TagClass<PromotionService, "Promoti
|
|
|
62
62
|
*/
|
|
63
63
|
export declare class PromotionService extends PromotionService_base {
|
|
64
64
|
}
|
|
65
|
-
export declare const PromotionServiceLive: Layer.Layer<PromotionService, never,
|
|
65
|
+
export declare const PromotionServiceLive: Layer.Layer<PromotionService, never, LearningService | CandidateRepository | EdgeService>;
|
|
66
66
|
export {};
|
|
67
67
|
//# sourceMappingURL=promotion-service.d.ts.map
|
|
@@ -30,7 +30,7 @@ export const PromotionServiceLive = Layer.effect(PromotionService, Effect.gen(fu
|
|
|
30
30
|
sourceRef: candidate.sourceRunId ?? candidate.sourceFile,
|
|
31
31
|
category: candidate.category
|
|
32
32
|
}), (error) => error._tag === "ValidationError"
|
|
33
|
-
? new DatabaseError({ cause: error
|
|
33
|
+
? new DatabaseError({ cause: error })
|
|
34
34
|
: error);
|
|
35
35
|
// Create DERIVED_FROM edge for provenance tracking
|
|
36
36
|
// Link the learning back to its source (run or task)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promotion-service.js","sourceRoot":"","sources":["../../src/services/promotion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgC/C;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAkClE;CAAG;AAEN,gFAAgF;AAChF,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAEhC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAC9C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAA;IAChD,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAA;IAEtC;;;OAGG;IACH,MAAM,gBAAgB,GAAG,CACvB,SAA4B,EAC5B,UAAkB,EACsD,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,yCAAyC;QACzC,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACrC,eAAe,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,UAAU;YACxD,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B,CAAC,EACF,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAC9B,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"promotion-service.js","sourceRoot":"","sources":["../../src/services/promotion-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { LlmService } from "./llm-service.js";
|
|
2
3
|
declare const QueryExpansionUnavailableError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
3
4
|
readonly _tag: "QueryExpansionUnavailableError";
|
|
4
5
|
} & Readonly<A>;
|
|
@@ -13,6 +14,14 @@ export declare class QueryExpansionUnavailableError extends QueryExpansionUnavai
|
|
|
13
14
|
/**
|
|
14
15
|
* Result of query expansion.
|
|
15
16
|
*/
|
|
17
|
+
export declare const QueryExpansionResultSchema: {
|
|
18
|
+
/** Original query */
|
|
19
|
+
original: string;
|
|
20
|
+
/** Expanded queries (includes original plus alternatives) */
|
|
21
|
+
expanded: readonly string[];
|
|
22
|
+
/** Whether expansion was performed (false if using noop) */
|
|
23
|
+
wasExpanded: boolean;
|
|
24
|
+
};
|
|
16
25
|
export interface QueryExpansionResult {
|
|
17
26
|
/** Original query */
|
|
18
27
|
readonly original: string;
|
|
@@ -21,6 +30,10 @@ export interface QueryExpansionResult {
|
|
|
21
30
|
/** Whether expansion was performed (false if using noop) */
|
|
22
31
|
readonly wasExpanded: boolean;
|
|
23
32
|
}
|
|
33
|
+
/** Maximum number of expanded queries (excluding original) to prevent unbounded generation */
|
|
34
|
+
export declare const MAX_EXPANSION_QUERIES = 5;
|
|
35
|
+
/** Maximum character length for any single expanded query */
|
|
36
|
+
export declare const MAX_QUERY_LENGTH = 200;
|
|
24
37
|
declare const QueryExpansionService_base: Context.TagClass<QueryExpansionService, "QueryExpansionService", {
|
|
25
38
|
/** Expand a search query into multiple alternative phrasings */
|
|
26
39
|
readonly expand: (query: string) => Effect.Effect<QueryExpansionResult, QueryExpansionUnavailableError>;
|
|
@@ -31,25 +44,33 @@ declare const QueryExpansionService_base: Context.TagClass<QueryExpansionService
|
|
|
31
44
|
* QueryExpansionService uses an LLM to generate alternative phrasings of search queries.
|
|
32
45
|
* This improves recall by searching for semantically equivalent but differently worded queries.
|
|
33
46
|
*
|
|
34
|
-
* Design: Following DD-006 patterns for LLM integration.
|
|
35
|
-
* The service gracefully degrades when
|
|
47
|
+
* Design: Following DD-006 patterns for LLM integration, DD-022 for centralized LLM service.
|
|
48
|
+
* The service gracefully degrades when no LLM backend is available.
|
|
36
49
|
*/
|
|
37
50
|
export declare class QueryExpansionService extends QueryExpansionService_base {
|
|
38
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Validate and limit expanded query alternatives.
|
|
54
|
+
* Filters out empty, overly long, duplicate, and non-string entries,
|
|
55
|
+
* then caps the total number of expansions.
|
|
56
|
+
*
|
|
57
|
+
* @returns Array with original query first, followed by up to MAX_EXPANSION_QUERIES alternatives
|
|
58
|
+
*/
|
|
59
|
+
export declare const validateExpansions: (query: string, alternatives: unknown[]) => string[];
|
|
39
60
|
/**
|
|
40
61
|
* Noop implementation - returns original query only.
|
|
41
|
-
* Used when
|
|
62
|
+
* Used when no LLM backend is available or LLM features are disabled.
|
|
42
63
|
*/
|
|
43
64
|
export declare const QueryExpansionServiceNoop: Layer.Layer<QueryExpansionService, never, never>;
|
|
44
65
|
/**
|
|
45
|
-
* Live implementation using
|
|
46
|
-
*
|
|
66
|
+
* Live implementation using centralized LlmService (DD-022).
|
|
67
|
+
* Delegates all LLM calls to LlmService instead of calling Anthropic SDK directly.
|
|
47
68
|
*/
|
|
48
|
-
export declare const QueryExpansionServiceLive: Layer.Layer<QueryExpansionService,
|
|
69
|
+
export declare const QueryExpansionServiceLive: Layer.Layer<QueryExpansionService, never, LlmService>;
|
|
49
70
|
/**
|
|
50
|
-
* Auto-detecting layer that uses Live if
|
|
51
|
-
* This allows graceful degradation when
|
|
71
|
+
* Auto-detecting layer that uses Live if LlmService is available, Noop otherwise.
|
|
72
|
+
* This allows graceful degradation when no LLM backend is configured.
|
|
52
73
|
*/
|
|
53
|
-
export declare const QueryExpansionServiceAuto: Layer.Layer<QueryExpansionService,
|
|
74
|
+
export declare const QueryExpansionServiceAuto: Layer.Layer<QueryExpansionService, never, LlmService>;
|
|
54
75
|
export {};
|
|
55
76
|
//# sourceMappingURL=query-expansion-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-expansion-service.d.ts","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"query-expansion-service.d.ts","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;;;;AAE7C;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,oCAAmD;IACrG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,CAAC;IACA,IAAI,OAAO,WAEV;CACF;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B;IACrC,qBAAqB;cACL,MAAM;IACtB,6DAA6D;cAC7C,SAAS,MAAM,EAAE;IACjC,4DAA4D;iBACtC,OAAO;CAC9B,CAAA;AAGD,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;AAED,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,MAAM,CAAA;;IAY/B,gEAAgE;qBAC/C,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;IACvG,4CAA4C;0BACtB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AAbtD;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,0BAQxC;CAAG;AAyDN;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EACb,cAAc,OAAO,EAAE,KACtB,MAAM,EAYR,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kDAUrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uDAwCrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uDAMrC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Context, Effect, Layer
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
2
|
import { Data } from "effect";
|
|
3
|
+
import { LlmService } from "./llm-service.js";
|
|
3
4
|
/**
|
|
4
5
|
* Error indicating query expansion is unavailable.
|
|
5
6
|
*/
|
|
@@ -8,12 +9,27 @@ export class QueryExpansionUnavailableError extends Data.TaggedError("QueryExpan
|
|
|
8
9
|
return `Query expansion unavailable: ${this.reason}`;
|
|
9
10
|
}
|
|
10
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Result of query expansion.
|
|
14
|
+
*/
|
|
15
|
+
export const QueryExpansionResultSchema = {
|
|
16
|
+
/** Original query */
|
|
17
|
+
original: "",
|
|
18
|
+
/** Expanded queries (includes original plus alternatives) */
|
|
19
|
+
expanded: [],
|
|
20
|
+
/** Whether expansion was performed (false if using noop) */
|
|
21
|
+
wasExpanded: false
|
|
22
|
+
};
|
|
23
|
+
/** Maximum number of expanded queries (excluding original) to prevent unbounded generation */
|
|
24
|
+
export const MAX_EXPANSION_QUERIES = 5;
|
|
25
|
+
/** Maximum character length for any single expanded query */
|
|
26
|
+
export const MAX_QUERY_LENGTH = 200;
|
|
11
27
|
/**
|
|
12
28
|
* QueryExpansionService uses an LLM to generate alternative phrasings of search queries.
|
|
13
29
|
* This improves recall by searching for semantically equivalent but differently worded queries.
|
|
14
30
|
*
|
|
15
|
-
* Design: Following DD-006 patterns for LLM integration.
|
|
16
|
-
* The service gracefully degrades when
|
|
31
|
+
* Design: Following DD-006 patterns for LLM integration, DD-022 for centralized LLM service.
|
|
32
|
+
* The service gracefully degrades when no LLM backend is available.
|
|
17
33
|
*/
|
|
18
34
|
export class QueryExpansionService extends Context.Tag("QueryExpansionService")() {
|
|
19
35
|
}
|
|
@@ -78,9 +94,26 @@ const parseLlmJson = (raw) => {
|
|
|
78
94
|
}
|
|
79
95
|
return null;
|
|
80
96
|
};
|
|
97
|
+
/**
|
|
98
|
+
* Validate and limit expanded query alternatives.
|
|
99
|
+
* Filters out empty, overly long, duplicate, and non-string entries,
|
|
100
|
+
* then caps the total number of expansions.
|
|
101
|
+
*
|
|
102
|
+
* @returns Array with original query first, followed by up to MAX_EXPANSION_QUERIES alternatives
|
|
103
|
+
*/
|
|
104
|
+
export const validateExpansions = (query, alternatives) => {
|
|
105
|
+
const uniqueAlternatives = [...new Set(alternatives
|
|
106
|
+
.filter((alt) => typeof alt === "string" && alt.trim().length > 0)
|
|
107
|
+
.map(alt => alt.trim())
|
|
108
|
+
.filter(alt => alt.length <= MAX_QUERY_LENGTH))];
|
|
109
|
+
return [query, ...uniqueAlternatives
|
|
110
|
+
.filter(alt => alt.toLowerCase() !== query.toLowerCase())
|
|
111
|
+
.slice(0, MAX_EXPANSION_QUERIES)
|
|
112
|
+
];
|
|
113
|
+
};
|
|
81
114
|
/**
|
|
82
115
|
* Noop implementation - returns original query only.
|
|
83
|
-
* Used when
|
|
116
|
+
* Used when no LLM backend is available or LLM features are disabled.
|
|
84
117
|
*/
|
|
85
118
|
export const QueryExpansionServiceNoop = Layer.succeed(QueryExpansionService, {
|
|
86
119
|
expand: (query) => Effect.succeed({
|
|
@@ -91,84 +124,42 @@ export const QueryExpansionServiceNoop = Layer.succeed(QueryExpansionService, {
|
|
|
91
124
|
isAvailable: () => Effect.succeed(false)
|
|
92
125
|
});
|
|
93
126
|
/**
|
|
94
|
-
* Live implementation using
|
|
95
|
-
*
|
|
127
|
+
* Live implementation using centralized LlmService (DD-022).
|
|
128
|
+
* Delegates all LLM calls to LlmService instead of calling Anthropic SDK directly.
|
|
96
129
|
*/
|
|
97
130
|
export const QueryExpansionServiceLive = Layer.effect(QueryExpansionService, Effect.gen(function* () {
|
|
98
|
-
|
|
99
|
-
const apiKey = yield* Config.string("ANTHROPIC_API_KEY").pipe(Effect.mapError(() => new QueryExpansionUnavailableError({
|
|
100
|
-
reason: "ANTHROPIC_API_KEY environment variable is not set"
|
|
101
|
-
})));
|
|
102
|
-
// Lazy-load client
|
|
103
|
-
let client = null;
|
|
104
|
-
const ensureClient = Effect.gen(function* () {
|
|
105
|
-
if (client)
|
|
106
|
-
return client;
|
|
107
|
-
// Dynamic import of Anthropic SDK (optional peer dependency)
|
|
108
|
-
const Anthropic = yield* Effect.tryPromise({
|
|
109
|
-
try: async () => {
|
|
110
|
-
// @ts-expect-error - @anthropic-ai/sdk is an optional peer dependency
|
|
111
|
-
const mod = await import("@anthropic-ai/sdk");
|
|
112
|
-
return mod.default;
|
|
113
|
-
},
|
|
114
|
-
catch: () => new QueryExpansionUnavailableError({
|
|
115
|
-
reason: "@anthropic-ai/sdk is not installed"
|
|
116
|
-
})
|
|
117
|
-
});
|
|
118
|
-
client = new Anthropic({ apiKey });
|
|
119
|
-
return client;
|
|
120
|
-
});
|
|
131
|
+
const llm = yield* LlmService;
|
|
121
132
|
return {
|
|
122
133
|
expand: (query) => Effect.gen(function* () {
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
max_tokens: 256,
|
|
128
|
-
messages: [{
|
|
129
|
-
role: "user",
|
|
130
|
-
content: EXPANSION_PROMPT + JSON.stringify(query)
|
|
131
|
-
}]
|
|
132
|
-
}),
|
|
133
|
-
catch: (e) => new QueryExpansionUnavailableError({
|
|
134
|
-
reason: `API call failed: ${String(e)}`
|
|
135
|
-
})
|
|
136
|
-
});
|
|
137
|
-
// Extract text from response
|
|
138
|
-
const textContent = response.content.find(c => c.type === "text");
|
|
139
|
-
if (!textContent || !textContent.text) {
|
|
134
|
+
const text = yield* llm.complete(EXPANSION_PROMPT + JSON.stringify(query), { model: "claude-haiku-4-5-20251001", maxTokens: 256 }).pipe(Effect.mapError((e) => new QueryExpansionUnavailableError({
|
|
135
|
+
reason: e.reason
|
|
136
|
+
})));
|
|
137
|
+
if (!text) {
|
|
140
138
|
return { original: query, expanded: [query], wasExpanded: false };
|
|
141
139
|
}
|
|
142
140
|
// Parse the JSON array of expanded queries
|
|
143
|
-
const alternatives = parseLlmJson(
|
|
141
|
+
const alternatives = parseLlmJson(text);
|
|
144
142
|
if (!alternatives || !Array.isArray(alternatives)) {
|
|
145
143
|
return { original: query, expanded: [query], wasExpanded: false };
|
|
146
144
|
}
|
|
147
|
-
//
|
|
148
|
-
const
|
|
149
|
-
.filter((alt) => typeof alt === "string" && alt.trim().length > 0)
|
|
150
|
-
.map(alt => alt.trim()))];
|
|
151
|
-
// Always include original query first
|
|
152
|
-
const expanded = [query, ...uniqueAlternatives.filter(alt => alt.toLowerCase() !== query.toLowerCase())];
|
|
145
|
+
// Validate and limit expansion results
|
|
146
|
+
const expanded = validateExpansions(query, alternatives);
|
|
153
147
|
return {
|
|
154
148
|
original: query,
|
|
155
149
|
expanded,
|
|
156
|
-
wasExpanded:
|
|
150
|
+
wasExpanded: expanded.length > 1
|
|
157
151
|
};
|
|
158
152
|
}),
|
|
159
|
-
isAvailable: () =>
|
|
153
|
+
isAvailable: () => llm.isAvailable()
|
|
160
154
|
};
|
|
161
155
|
}));
|
|
162
156
|
/**
|
|
163
|
-
* Auto-detecting layer that uses Live if
|
|
164
|
-
* This allows graceful degradation when
|
|
157
|
+
* Auto-detecting layer that uses Live if LlmService is available, Noop otherwise.
|
|
158
|
+
* This allows graceful degradation when no LLM backend is configured.
|
|
165
159
|
*/
|
|
166
160
|
export const QueryExpansionServiceAuto = Layer.unwrapEffect(Effect.gen(function* () {
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
return QueryExpansionServiceLive;
|
|
171
|
-
}
|
|
172
|
-
return QueryExpansionServiceNoop;
|
|
161
|
+
const llm = yield* LlmService;
|
|
162
|
+
const available = yield* llm.isAvailable();
|
|
163
|
+
return available ? QueryExpansionServiceLive : QueryExpansionServiceNoop;
|
|
173
164
|
}));
|
|
174
165
|
//# sourceMappingURL=query-expansion-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-expansion-service.js","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"query-expansion-service.js","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,29 @@ import { TaskRepository } from "../repo/task-repo.js";
|
|
|
3
3
|
import { DependencyRepository } from "../repo/dep-repo.js";
|
|
4
4
|
import { DatabaseError } from "../errors.js";
|
|
5
5
|
import type { Task, TaskId, TaskWithDeps } from "@jamesaphoenix/tx-types";
|
|
6
|
+
/**
|
|
7
|
+
* Result of checking whether a task is ready to be worked on.
|
|
8
|
+
* Replaces silent `false` with an explicit reason for not-ready states.
|
|
9
|
+
*/
|
|
10
|
+
export type ReadyCheckResult = {
|
|
11
|
+
readonly _tag: "Ready";
|
|
12
|
+
} | {
|
|
13
|
+
readonly _tag: "TaskNotFound";
|
|
14
|
+
readonly id: TaskId;
|
|
15
|
+
} | {
|
|
16
|
+
readonly _tag: "WrongStatus";
|
|
17
|
+
readonly id: TaskId;
|
|
18
|
+
readonly status: string;
|
|
19
|
+
} | {
|
|
20
|
+
readonly _tag: "Blocked";
|
|
21
|
+
readonly id: TaskId;
|
|
22
|
+
readonly pendingBlockerIds: readonly string[];
|
|
23
|
+
};
|
|
24
|
+
/** Helper to check if a ReadyCheckResult indicates the task is ready. */
|
|
25
|
+
export declare const isReadyResult: (result: ReadyCheckResult) => boolean;
|
|
6
26
|
declare const ReadyService_base: Context.TagClass<ReadyService, "ReadyService", {
|
|
7
27
|
readonly getReady: (limit?: number) => Effect.Effect<readonly TaskWithDeps[], DatabaseError>;
|
|
8
|
-
readonly isReady: (id: TaskId) => Effect.Effect<
|
|
28
|
+
readonly isReady: (id: TaskId) => Effect.Effect<ReadyCheckResult, DatabaseError>;
|
|
9
29
|
readonly getBlockers: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
10
30
|
readonly getBlocking: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
11
31
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;;
|
|
1
|
+
{"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEzE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAEpG,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,QAAQ,gBAAgB,KAAG,OAAkC,CAAA;;uBAKpE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;sBAC1E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;0BAC1D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC7D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AANvF,qBAAa,YAAa,SAAQ,iBAQ/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,yEAqG5B,CAAA"}
|