@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,96 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToOrchestratorState } from "../mappers/orchestrator-state.js";
|
|
5
|
+
export class OrchestratorStateRepository extends Context.Tag("OrchestratorStateRepository")() {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Default values for orchestrator state initialization.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_STATE = {
|
|
11
|
+
status: "stopped",
|
|
12
|
+
pid: null,
|
|
13
|
+
startedAt: null,
|
|
14
|
+
lastReconcileAt: null,
|
|
15
|
+
workerPoolSize: 1,
|
|
16
|
+
reconcileIntervalSeconds: 60,
|
|
17
|
+
heartbeatIntervalSeconds: 30,
|
|
18
|
+
leaseDurationMinutes: 30,
|
|
19
|
+
metadata: {}
|
|
20
|
+
};
|
|
21
|
+
export const OrchestratorStateRepositoryLive = Layer.effect(OrchestratorStateRepository, Effect.gen(function* () {
|
|
22
|
+
const db = yield* SqliteClient;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the singleton row if it doesn't exist.
|
|
25
|
+
* Uses INSERT OR IGNORE to be idempotent.
|
|
26
|
+
*/
|
|
27
|
+
const ensureSingletonExists = () => {
|
|
28
|
+
db.prepare(`INSERT OR IGNORE INTO orchestrator_state
|
|
29
|
+
(id, status, pid, started_at, last_reconcile_at, worker_pool_size,
|
|
30
|
+
reconcile_interval_seconds, heartbeat_interval_seconds, lease_duration_minutes, metadata)
|
|
31
|
+
VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(DEFAULT_STATE.status, DEFAULT_STATE.pid, DEFAULT_STATE.startedAt?.toISOString() ?? null, DEFAULT_STATE.lastReconcileAt?.toISOString() ?? null, DEFAULT_STATE.workerPoolSize, DEFAULT_STATE.reconcileIntervalSeconds, DEFAULT_STATE.heartbeatIntervalSeconds, DEFAULT_STATE.leaseDurationMinutes, JSON.stringify(DEFAULT_STATE.metadata));
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
get: () => Effect.try({
|
|
35
|
+
try: () => {
|
|
36
|
+
// Ensure singleton exists before querying
|
|
37
|
+
ensureSingletonExists();
|
|
38
|
+
const row = db.prepare("SELECT * FROM orchestrator_state WHERE id = 1").get();
|
|
39
|
+
return rowToOrchestratorState(row);
|
|
40
|
+
},
|
|
41
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
42
|
+
}),
|
|
43
|
+
update: (partial) => Effect.try({
|
|
44
|
+
try: () => {
|
|
45
|
+
// Ensure singleton exists before updating
|
|
46
|
+
ensureSingletonExists();
|
|
47
|
+
// Build dynamic UPDATE based on provided fields
|
|
48
|
+
const setClauses = [];
|
|
49
|
+
const params = [];
|
|
50
|
+
if (partial.status !== undefined) {
|
|
51
|
+
setClauses.push("status = ?");
|
|
52
|
+
params.push(partial.status);
|
|
53
|
+
}
|
|
54
|
+
if (partial.pid !== undefined) {
|
|
55
|
+
setClauses.push("pid = ?");
|
|
56
|
+
params.push(partial.pid);
|
|
57
|
+
}
|
|
58
|
+
if (partial.startedAt !== undefined) {
|
|
59
|
+
setClauses.push("started_at = ?");
|
|
60
|
+
params.push(partial.startedAt?.toISOString() ?? null);
|
|
61
|
+
}
|
|
62
|
+
if (partial.lastReconcileAt !== undefined) {
|
|
63
|
+
setClauses.push("last_reconcile_at = ?");
|
|
64
|
+
params.push(partial.lastReconcileAt?.toISOString() ?? null);
|
|
65
|
+
}
|
|
66
|
+
if (partial.workerPoolSize !== undefined) {
|
|
67
|
+
setClauses.push("worker_pool_size = ?");
|
|
68
|
+
params.push(partial.workerPoolSize);
|
|
69
|
+
}
|
|
70
|
+
if (partial.reconcileIntervalSeconds !== undefined) {
|
|
71
|
+
setClauses.push("reconcile_interval_seconds = ?");
|
|
72
|
+
params.push(partial.reconcileIntervalSeconds);
|
|
73
|
+
}
|
|
74
|
+
if (partial.heartbeatIntervalSeconds !== undefined) {
|
|
75
|
+
setClauses.push("heartbeat_interval_seconds = ?");
|
|
76
|
+
params.push(partial.heartbeatIntervalSeconds);
|
|
77
|
+
}
|
|
78
|
+
if (partial.leaseDurationMinutes !== undefined) {
|
|
79
|
+
setClauses.push("lease_duration_minutes = ?");
|
|
80
|
+
params.push(partial.leaseDurationMinutes);
|
|
81
|
+
}
|
|
82
|
+
if (partial.metadata !== undefined) {
|
|
83
|
+
setClauses.push("metadata = ?");
|
|
84
|
+
params.push(JSON.stringify(partial.metadata));
|
|
85
|
+
}
|
|
86
|
+
// Only run UPDATE if there are fields to update
|
|
87
|
+
if (setClauses.length > 0) {
|
|
88
|
+
params.push(1); // WHERE id = 1
|
|
89
|
+
db.prepare(`UPDATE orchestrator_state SET ${setClauses.join(", ")} WHERE id = ?`).run(...params);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
}));
|
|
96
|
+
//# sourceMappingURL=orchestrator-state-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-state-repo.js","sourceRoot":"","sources":["../../src/repo/orchestrator-state-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { Run, RunId, RunStatus, CreateRunInput, UpdateRunInput } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const RunRepository_base: Context.TagClass<RunRepository, "RunRepository", {
|
|
6
|
+
/** Create a new run record */
|
|
7
|
+
readonly create: (input: CreateRunInput) => Effect.Effect<Run, DatabaseError>;
|
|
8
|
+
/** Find a run by ID */
|
|
9
|
+
readonly findById: (id: RunId) => Effect.Effect<Run | null, DatabaseError>;
|
|
10
|
+
/** Find runs by task ID */
|
|
11
|
+
readonly findByTaskId: (taskId: string) => Effect.Effect<readonly Run[], DatabaseError>;
|
|
12
|
+
/** Find runs by status */
|
|
13
|
+
readonly findByStatus: (status: RunStatus) => Effect.Effect<readonly Run[], DatabaseError>;
|
|
14
|
+
/** Get recent runs */
|
|
15
|
+
readonly findRecent: (limit: number) => Effect.Effect<readonly Run[], DatabaseError>;
|
|
16
|
+
/** Update a run */
|
|
17
|
+
readonly update: (id: RunId, input: UpdateRunInput) => Effect.Effect<void, DatabaseError>;
|
|
18
|
+
/** Mark a run as completed */
|
|
19
|
+
readonly complete: (id: RunId, exitCode: number, summary?: string) => Effect.Effect<void, DatabaseError>;
|
|
20
|
+
/** Mark a run as failed */
|
|
21
|
+
readonly fail: (id: RunId, errorMessage: string, exitCode?: number) => Effect.Effect<void, DatabaseError>;
|
|
22
|
+
/** Get currently running runs */
|
|
23
|
+
readonly getRunning: () => Effect.Effect<readonly Run[], DatabaseError>;
|
|
24
|
+
/** Count runs by status */
|
|
25
|
+
readonly countByStatus: () => Effect.Effect<Record<RunStatus, number>, DatabaseError>;
|
|
26
|
+
}>;
|
|
27
|
+
export declare class RunRepository extends RunRepository_base {
|
|
28
|
+
}
|
|
29
|
+
export declare const RunRepositoryLive: Layer.Layer<RunRepository, never, SqliteClient>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=run-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-repo.d.ts","sourceRoot":"","sources":["../../src/repo/run-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAU,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;;IAKxG,8BAA8B;qBACb,CAAC,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC;IAE7E,uBAAuB;uBACJ,CAAC,EAAE,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,aAAa,CAAC;IAE1E,2BAA2B;2BACJ,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,aAAa,CAAC;IAEvF,0BAA0B;2BACH,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,aAAa,CAAC;IAE1F,sBAAsB;yBACD,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,aAAa,CAAC;IAEpF,mBAAmB;qBACF,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAEzF,8BAA8B;uBACX,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAExG,2BAA2B;mBACZ,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAEzG,iCAAiC;yBACZ,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,aAAa,CAAC;IAEvE,2BAA2B;4BACH,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;;AA/BzF,qBAAa,aAAc,SAAQ,kBAiChC;CAAG;AAEN,eAAO,MAAM,iBAAiB,iDA6K7B,CAAA"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToRun, generateRunId } from "../mappers/run.js";
|
|
5
|
+
export class RunRepository extends Context.Tag("RunRepository")() {
|
|
6
|
+
}
|
|
7
|
+
export const RunRepositoryLive = Layer.effect(RunRepository, Effect.gen(function* () {
|
|
8
|
+
const db = yield* SqliteClient;
|
|
9
|
+
return {
|
|
10
|
+
create: (input) => Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const id = generateRunId();
|
|
13
|
+
const now = new Date().toISOString();
|
|
14
|
+
db.prepare(`
|
|
15
|
+
INSERT INTO runs (id, task_id, agent, started_at, status, pid, transcript_path, context_injected, metadata)
|
|
16
|
+
VALUES (?, ?, ?, ?, 'running', ?, ?, ?, ?)
|
|
17
|
+
`).run(id, input.taskId ?? null, input.agent, now, input.pid ?? null, input.transcriptPath ?? null, input.contextInjected ?? null, JSON.stringify(input.metadata ?? {}));
|
|
18
|
+
const row = db.prepare("SELECT * FROM runs WHERE id = ?").get(id);
|
|
19
|
+
return rowToRun(row);
|
|
20
|
+
},
|
|
21
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
22
|
+
}),
|
|
23
|
+
findById: (id) => Effect.try({
|
|
24
|
+
try: () => {
|
|
25
|
+
const row = db.prepare("SELECT * FROM runs WHERE id = ?").get(id);
|
|
26
|
+
return row ? rowToRun(row) : null;
|
|
27
|
+
},
|
|
28
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
29
|
+
}),
|
|
30
|
+
findByTaskId: (taskId) => Effect.try({
|
|
31
|
+
try: () => {
|
|
32
|
+
const rows = db.prepare("SELECT * FROM runs WHERE task_id = ? ORDER BY started_at DESC").all(taskId);
|
|
33
|
+
return rows.map(rowToRun);
|
|
34
|
+
},
|
|
35
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
36
|
+
}),
|
|
37
|
+
findByStatus: (status) => Effect.try({
|
|
38
|
+
try: () => {
|
|
39
|
+
const rows = db.prepare("SELECT * FROM runs WHERE status = ? ORDER BY started_at DESC").all(status);
|
|
40
|
+
return rows.map(rowToRun);
|
|
41
|
+
},
|
|
42
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
43
|
+
}),
|
|
44
|
+
findRecent: (limit) => Effect.try({
|
|
45
|
+
try: () => {
|
|
46
|
+
const rows = db.prepare("SELECT * FROM runs ORDER BY started_at DESC LIMIT ?").all(limit);
|
|
47
|
+
return rows.map(rowToRun);
|
|
48
|
+
},
|
|
49
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
50
|
+
}),
|
|
51
|
+
update: (id, input) => Effect.try({
|
|
52
|
+
try: () => {
|
|
53
|
+
const updates = [];
|
|
54
|
+
const values = [];
|
|
55
|
+
if (input.status !== undefined) {
|
|
56
|
+
updates.push("status = ?");
|
|
57
|
+
values.push(input.status);
|
|
58
|
+
}
|
|
59
|
+
if (input.endedAt !== undefined) {
|
|
60
|
+
updates.push("ended_at = ?");
|
|
61
|
+
values.push(input.endedAt.toISOString());
|
|
62
|
+
}
|
|
63
|
+
if (input.exitCode !== undefined) {
|
|
64
|
+
updates.push("exit_code = ?");
|
|
65
|
+
values.push(input.exitCode);
|
|
66
|
+
}
|
|
67
|
+
if (input.summary !== undefined) {
|
|
68
|
+
updates.push("summary = ?");
|
|
69
|
+
values.push(input.summary);
|
|
70
|
+
}
|
|
71
|
+
if (input.errorMessage !== undefined) {
|
|
72
|
+
updates.push("error_message = ?");
|
|
73
|
+
values.push(input.errorMessage);
|
|
74
|
+
}
|
|
75
|
+
if (input.transcriptPath !== undefined) {
|
|
76
|
+
updates.push("transcript_path = ?");
|
|
77
|
+
values.push(input.transcriptPath);
|
|
78
|
+
}
|
|
79
|
+
if (updates.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
values.push(id);
|
|
82
|
+
db.prepare(`UPDATE runs SET ${updates.join(", ")} WHERE id = ?`).run(...values);
|
|
83
|
+
},
|
|
84
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
85
|
+
}),
|
|
86
|
+
complete: (id, exitCode, summary) => Effect.try({
|
|
87
|
+
try: () => {
|
|
88
|
+
db.prepare(`
|
|
89
|
+
UPDATE runs
|
|
90
|
+
SET status = 'completed', ended_at = ?, exit_code = ?, summary = ?
|
|
91
|
+
WHERE id = ?
|
|
92
|
+
`).run(new Date().toISOString(), exitCode, summary ?? null, id);
|
|
93
|
+
},
|
|
94
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
95
|
+
}),
|
|
96
|
+
fail: (id, errorMessage, exitCode) => Effect.try({
|
|
97
|
+
try: () => {
|
|
98
|
+
db.prepare(`
|
|
99
|
+
UPDATE runs
|
|
100
|
+
SET status = 'failed', ended_at = ?, exit_code = ?, error_message = ?
|
|
101
|
+
WHERE id = ?
|
|
102
|
+
`).run(new Date().toISOString(), exitCode ?? null, errorMessage, id);
|
|
103
|
+
},
|
|
104
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
105
|
+
}),
|
|
106
|
+
getRunning: () => Effect.try({
|
|
107
|
+
try: () => {
|
|
108
|
+
const rows = db.prepare("SELECT * FROM runs WHERE status = 'running' ORDER BY started_at DESC").all();
|
|
109
|
+
return rows.map(rowToRun);
|
|
110
|
+
},
|
|
111
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
112
|
+
}),
|
|
113
|
+
countByStatus: () => Effect.try({
|
|
114
|
+
try: () => {
|
|
115
|
+
const rows = db.prepare("SELECT status, COUNT(*) as count FROM runs GROUP BY status").all();
|
|
116
|
+
const counts = {
|
|
117
|
+
running: 0,
|
|
118
|
+
completed: 0,
|
|
119
|
+
failed: 0,
|
|
120
|
+
timeout: 0,
|
|
121
|
+
cancelled: 0
|
|
122
|
+
};
|
|
123
|
+
for (const row of rows) {
|
|
124
|
+
counts[row.status] = row.count;
|
|
125
|
+
}
|
|
126
|
+
return counts;
|
|
127
|
+
},
|
|
128
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
129
|
+
})
|
|
130
|
+
};
|
|
131
|
+
}));
|
|
132
|
+
//# sourceMappingURL=run-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-repo.js","sourceRoot":"","sources":["../../src/repo/run-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { Task, TaskId, TaskFilter } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const TaskRepository_base: Context.TagClass<TaskRepository, "TaskRepository", {
|
|
6
|
+
readonly findById: (id: string) => Effect.Effect<Task | null, DatabaseError>;
|
|
7
|
+
readonly findByIds: (ids: readonly string[]) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
8
|
+
readonly findAll: (filter?: TaskFilter) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
9
|
+
readonly findByParent: (parentId: string | null) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
10
|
+
readonly getChildIds: (id: string) => Effect.Effect<readonly TaskId[], DatabaseError>;
|
|
11
|
+
readonly getChildIdsForMany: (ids: readonly string[]) => Effect.Effect<Map<string, readonly TaskId[]>, DatabaseError>;
|
|
12
|
+
readonly insert: (task: Task) => Effect.Effect<void, DatabaseError>;
|
|
13
|
+
readonly update: (task: Task) => Effect.Effect<void, DatabaseError>;
|
|
14
|
+
readonly remove: (id: string) => Effect.Effect<void, DatabaseError>;
|
|
15
|
+
readonly count: (filter?: TaskFilter) => Effect.Effect<number, DatabaseError>;
|
|
16
|
+
}>;
|
|
17
|
+
export declare class TaskRepository extends TaskRepository_base {
|
|
18
|
+
}
|
|
19
|
+
export declare const TaskRepositoryLive: Layer.Layer<TaskRepository, never, SqliteClient>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=task-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-repo.d.ts","sourceRoot":"","sources":["../../src/repo/task-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAW,MAAM,yBAAyB,CAAA;;uBAKzD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC;wBACxD,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;sBAC3E,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;2BACjE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC3E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,aAAa,CAAC;iCACxD,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,EAAE,aAAa,CAAC;qBACpG,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBAClD,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBAClD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oBACnD,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AAZjF,qBAAa,cAAe,SAAQ,mBAcjC;CAAG;AAEN,eAAO,MAAM,kBAAkB,kDA2N9B,CAAA"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToTask } from "../mappers/task.js";
|
|
5
|
+
export class TaskRepository extends Context.Tag("TaskRepository")() {
|
|
6
|
+
}
|
|
7
|
+
export const TaskRepositoryLive = Layer.effect(TaskRepository, Effect.gen(function* () {
|
|
8
|
+
const db = yield* SqliteClient;
|
|
9
|
+
return {
|
|
10
|
+
findById: (id) => Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const row = db.prepare("SELECT * FROM tasks WHERE id = ?").get(id);
|
|
13
|
+
return row ? rowToTask(row) : null;
|
|
14
|
+
},
|
|
15
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
16
|
+
}),
|
|
17
|
+
findByIds: (ids) => Effect.try({
|
|
18
|
+
try: () => {
|
|
19
|
+
if (ids.length === 0)
|
|
20
|
+
return [];
|
|
21
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
22
|
+
const rows = db.prepare(`SELECT * FROM tasks WHERE id IN (${placeholders})`).all(...ids);
|
|
23
|
+
return rows.map(rowToTask);
|
|
24
|
+
},
|
|
25
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
26
|
+
}),
|
|
27
|
+
findAll: (filter) => Effect.try({
|
|
28
|
+
try: () => {
|
|
29
|
+
const conditions = [];
|
|
30
|
+
const params = [];
|
|
31
|
+
if (filter?.status) {
|
|
32
|
+
if (Array.isArray(filter.status)) {
|
|
33
|
+
const placeholders = filter.status.map(() => "?").join(",");
|
|
34
|
+
conditions.push(`status IN (${placeholders})`);
|
|
35
|
+
params.push(...filter.status);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
conditions.push("status = ?");
|
|
39
|
+
params.push(filter.status);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (filter?.parentId !== undefined) {
|
|
43
|
+
if (filter.parentId === null) {
|
|
44
|
+
conditions.push("parent_id IS NULL");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
conditions.push("parent_id = ?");
|
|
48
|
+
params.push(filter.parentId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Search filter: case-insensitive search in title and description
|
|
52
|
+
if (filter?.search) {
|
|
53
|
+
const searchPattern = `%${filter.search}%`;
|
|
54
|
+
conditions.push("(title LIKE ? COLLATE NOCASE OR description LIKE ? COLLATE NOCASE)");
|
|
55
|
+
params.push(searchPattern, searchPattern);
|
|
56
|
+
}
|
|
57
|
+
// Cursor-based pagination: fetch tasks after the cursor position
|
|
58
|
+
// Order is score DESC, id ASC, so "after cursor" means:
|
|
59
|
+
// (score < cursor.score) OR (score = cursor.score AND id > cursor.id)
|
|
60
|
+
if (filter?.cursor) {
|
|
61
|
+
conditions.push("(score < ? OR (score = ? AND id > ?))");
|
|
62
|
+
params.push(filter.cursor.score, filter.cursor.score, filter.cursor.id);
|
|
63
|
+
}
|
|
64
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
65
|
+
const limit = filter?.limit ? `LIMIT ${filter.limit}` : "";
|
|
66
|
+
const sql = `SELECT * FROM tasks ${where} ORDER BY score DESC, id ASC ${limit}`;
|
|
67
|
+
const rows = db.prepare(sql).all(...params);
|
|
68
|
+
return rows.map(rowToTask);
|
|
69
|
+
},
|
|
70
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
71
|
+
}),
|
|
72
|
+
findByParent: (parentId) => Effect.try({
|
|
73
|
+
try: () => {
|
|
74
|
+
const rows = parentId === null
|
|
75
|
+
? db.prepare("SELECT * FROM tasks WHERE parent_id IS NULL ORDER BY score DESC").all()
|
|
76
|
+
: db.prepare("SELECT * FROM tasks WHERE parent_id = ? ORDER BY score DESC").all(parentId);
|
|
77
|
+
return rows.map(rowToTask);
|
|
78
|
+
},
|
|
79
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
80
|
+
}),
|
|
81
|
+
getChildIds: (id) => Effect.try({
|
|
82
|
+
try: () => {
|
|
83
|
+
const rows = db.prepare("SELECT id FROM tasks WHERE parent_id = ?").all(id);
|
|
84
|
+
return rows.map(r => r.id);
|
|
85
|
+
},
|
|
86
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
87
|
+
}),
|
|
88
|
+
getChildIdsForMany: (ids) => Effect.try({
|
|
89
|
+
try: () => {
|
|
90
|
+
const result = new Map();
|
|
91
|
+
if (ids.length === 0)
|
|
92
|
+
return result;
|
|
93
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
94
|
+
const rows = db.prepare(`SELECT id, parent_id FROM tasks WHERE parent_id IN (${placeholders})`).all(...ids);
|
|
95
|
+
// Initialize all requested IDs with empty arrays
|
|
96
|
+
for (const id of ids) {
|
|
97
|
+
result.set(id, []);
|
|
98
|
+
}
|
|
99
|
+
// Group by parent_id
|
|
100
|
+
for (const row of rows) {
|
|
101
|
+
const existing = result.get(row.parent_id) ?? [];
|
|
102
|
+
result.set(row.parent_id, [...existing, row.id]);
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
},
|
|
106
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
107
|
+
}),
|
|
108
|
+
insert: (task) => Effect.try({
|
|
109
|
+
try: () => {
|
|
110
|
+
db.prepare(`INSERT INTO tasks (id, title, description, status, parent_id, score, created_at, updated_at, completed_at, metadata)
|
|
111
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(task.id, task.title, task.description, task.status, task.parentId, task.score, task.createdAt.toISOString(), task.updatedAt.toISOString(), task.completedAt?.toISOString() ?? null, JSON.stringify(task.metadata));
|
|
112
|
+
},
|
|
113
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
114
|
+
}),
|
|
115
|
+
update: (task) => Effect.try({
|
|
116
|
+
try: () => {
|
|
117
|
+
db.prepare(`UPDATE tasks SET
|
|
118
|
+
title = ?, description = ?, status = ?, parent_id = ?,
|
|
119
|
+
score = ?, updated_at = ?, completed_at = ?, metadata = ?
|
|
120
|
+
WHERE id = ?`).run(task.title, task.description, task.status, task.parentId, task.score, task.updatedAt.toISOString(), task.completedAt?.toISOString() ?? null, JSON.stringify(task.metadata), task.id);
|
|
121
|
+
},
|
|
122
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
123
|
+
}),
|
|
124
|
+
remove: (id) => Effect.try({
|
|
125
|
+
try: () => {
|
|
126
|
+
db.prepare("DELETE FROM tasks WHERE id = ?").run(id);
|
|
127
|
+
},
|
|
128
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
129
|
+
}),
|
|
130
|
+
count: (filter) => Effect.try({
|
|
131
|
+
try: () => {
|
|
132
|
+
const conditions = [];
|
|
133
|
+
const params = [];
|
|
134
|
+
if (filter?.status) {
|
|
135
|
+
if (Array.isArray(filter.status)) {
|
|
136
|
+
const placeholders = filter.status.map(() => "?").join(",");
|
|
137
|
+
conditions.push(`status IN (${placeholders})`);
|
|
138
|
+
params.push(...filter.status);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
conditions.push("status = ?");
|
|
142
|
+
params.push(filter.status);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (filter?.parentId !== undefined) {
|
|
146
|
+
if (filter.parentId === null) {
|
|
147
|
+
conditions.push("parent_id IS NULL");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
conditions.push("parent_id = ?");
|
|
151
|
+
params.push(filter.parentId);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Search filter for count (same as findAll)
|
|
155
|
+
if (filter?.search) {
|
|
156
|
+
const searchPattern = `%${filter.search}%`;
|
|
157
|
+
conditions.push("(title LIKE ? COLLATE NOCASE OR description LIKE ? COLLATE NOCASE)");
|
|
158
|
+
params.push(searchPattern, searchPattern);
|
|
159
|
+
}
|
|
160
|
+
// Note: cursor is intentionally not included in count - we want total matching records
|
|
161
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
162
|
+
const result = db.prepare(`SELECT COUNT(*) as cnt FROM tasks ${where}`).get(...params);
|
|
163
|
+
return result.cnt;
|
|
164
|
+
},
|
|
165
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
166
|
+
})
|
|
167
|
+
};
|
|
168
|
+
}));
|
|
169
|
+
//# sourceMappingURL=task-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-repo.js","sourceRoot":"","sources":["../../src/repo/task-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { TrackedProject, CreateTrackedProjectInput } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const TrackedProjectRepository_base: Context.TagClass<TrackedProjectRepository, "TrackedProjectRepository", {
|
|
6
|
+
readonly insert: (input: CreateTrackedProjectInput) => Effect.Effect<TrackedProject, DatabaseError>;
|
|
7
|
+
readonly findAll: () => Effect.Effect<readonly TrackedProject[], DatabaseError>;
|
|
8
|
+
readonly findByPath: (projectPath: string) => Effect.Effect<TrackedProject | null, DatabaseError>;
|
|
9
|
+
readonly delete: (id: number) => Effect.Effect<boolean, DatabaseError>;
|
|
10
|
+
readonly setEnabled: (id: number, enabled: boolean) => Effect.Effect<TrackedProject | null, DatabaseError>;
|
|
11
|
+
}>;
|
|
12
|
+
export declare class TrackedProjectRepository extends TrackedProjectRepository_base {
|
|
13
|
+
}
|
|
14
|
+
export declare const TrackedProjectRepositoryLive: Layer.Layer<TrackedProjectRepository, never, SqliteClient>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=tracked-project-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracked-project-repo.d.ts","sourceRoot":"","sources":["../../src/repo/tracked-project-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EACV,cAAc,EAEd,yBAAyB,EAC1B,MAAM,yBAAyB,CAAA;;qBAKX,CAAC,KAAK,EAAE,yBAAyB,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC;sBACjF,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,cAAc,EAAE,EAAE,aAAa,CAAC;yBAC1D,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,aAAa,CAAC;qBAChF,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;yBACjD,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,aAAa,CAAC;;AAP9G,qBAAa,wBAAyB,SAAQ,6BAS3C;CAAG;AAEN,eAAO,MAAM,4BAA4B,4DA+ExC,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToTrackedProject } from "../mappers/tracked-project.js";
|
|
5
|
+
export class TrackedProjectRepository extends Context.Tag("TrackedProjectRepository")() {
|
|
6
|
+
}
|
|
7
|
+
export const TrackedProjectRepositoryLive = Layer.effect(TrackedProjectRepository, Effect.gen(function* () {
|
|
8
|
+
const db = yield* SqliteClient;
|
|
9
|
+
return {
|
|
10
|
+
insert: (input) => Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const result = db.prepare(`INSERT INTO daemon_tracked_projects
|
|
13
|
+
(project_path, project_id, source_type)
|
|
14
|
+
VALUES (?, ?, ?)`).run(input.projectPath, input.projectId ?? null, input.sourceType ?? "claude");
|
|
15
|
+
const row = db.prepare("SELECT * FROM daemon_tracked_projects WHERE id = ?").get(result.lastInsertRowid);
|
|
16
|
+
return rowToTrackedProject(row);
|
|
17
|
+
},
|
|
18
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
19
|
+
}),
|
|
20
|
+
findAll: () => Effect.try({
|
|
21
|
+
try: () => {
|
|
22
|
+
const rows = db.prepare("SELECT * FROM daemon_tracked_projects ORDER BY added_at DESC").all();
|
|
23
|
+
return rows.map(rowToTrackedProject);
|
|
24
|
+
},
|
|
25
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
26
|
+
}),
|
|
27
|
+
findByPath: (projectPath) => Effect.try({
|
|
28
|
+
try: () => {
|
|
29
|
+
const row = db.prepare("SELECT * FROM daemon_tracked_projects WHERE project_path = ?").get(projectPath);
|
|
30
|
+
return row ? rowToTrackedProject(row) : null;
|
|
31
|
+
},
|
|
32
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
33
|
+
}),
|
|
34
|
+
delete: (id) => Effect.try({
|
|
35
|
+
try: () => {
|
|
36
|
+
const result = db.prepare("DELETE FROM daemon_tracked_projects WHERE id = ?").run(id);
|
|
37
|
+
return result.changes > 0;
|
|
38
|
+
},
|
|
39
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
40
|
+
}),
|
|
41
|
+
setEnabled: (id, enabled) => Effect.try({
|
|
42
|
+
try: () => {
|
|
43
|
+
const result = db.prepare("UPDATE daemon_tracked_projects SET enabled = ? WHERE id = ?").run(enabled ? 1 : 0, id);
|
|
44
|
+
if (result.changes === 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const row = db.prepare("SELECT * FROM daemon_tracked_projects WHERE id = ?").get(id);
|
|
48
|
+
return rowToTrackedProject(row);
|
|
49
|
+
},
|
|
50
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
}));
|
|
54
|
+
//# sourceMappingURL=tracked-project-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracked-project-repo.js","sourceRoot":"","sources":["../../src/repo/tracked-project-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { Worker, WorkerStatus } from "../schemas/worker.js";
|
|
5
|
+
declare const WorkerRepository_base: Context.TagClass<WorkerRepository, "WorkerRepository", {
|
|
6
|
+
readonly insert: (worker: Worker) => Effect.Effect<void, DatabaseError>;
|
|
7
|
+
readonly update: (worker: Worker) => Effect.Effect<void, DatabaseError>;
|
|
8
|
+
readonly delete: (id: string) => Effect.Effect<boolean, DatabaseError>;
|
|
9
|
+
readonly findById: (id: string) => Effect.Effect<Worker | null, DatabaseError>;
|
|
10
|
+
readonly findByStatus: (status: WorkerStatus) => Effect.Effect<readonly Worker[], DatabaseError>;
|
|
11
|
+
readonly findByLastHeartbeatBefore: (threshold: Date) => Effect.Effect<readonly Worker[], DatabaseError>;
|
|
12
|
+
readonly countByStatus: (status: WorkerStatus) => Effect.Effect<number, DatabaseError>;
|
|
13
|
+
readonly findAll: () => Effect.Effect<readonly Worker[], DatabaseError>;
|
|
14
|
+
}>;
|
|
15
|
+
export declare class WorkerRepository extends WorkerRepository_base {
|
|
16
|
+
}
|
|
17
|
+
export declare const WorkerRepositoryLive: Layer.Layer<WorkerRepository, never, SqliteClient>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=worker-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-repo.d.ts","sourceRoot":"","sources":["../../src/repo/worker-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;;qBAK3C,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBACtD,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBACtD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;uBACnD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC;2BACvD,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,aAAa,CAAC;wCAC5D,CAAC,SAAS,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,aAAa,CAAC;4BAChF,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;sBACpE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,aAAa,CAAC;;AAV3E,qBAAa,gBAAiB,SAAQ,qBAYnC;CAAG;AAEN,eAAO,MAAM,oBAAoB,oDAqHhC,CAAA"}
|