@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
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { MIGRATIONS, getLatestVersion } from "./migration-service.js";
|
|
5
|
+
import { TASK_STATUSES } from "@jamesaphoenix/tx-types";
|
|
6
|
+
/**
|
|
7
|
+
* ValidationService performs pre-flight database checks.
|
|
8
|
+
* Follows Effect-TS patterns per DD-002.
|
|
9
|
+
*/
|
|
10
|
+
export class ValidationService extends Context.Tag("ValidationService")() {
|
|
11
|
+
}
|
|
12
|
+
export const ValidationServiceLive = Layer.effect(ValidationService, Effect.gen(function* () {
|
|
13
|
+
const db = yield* SqliteClient;
|
|
14
|
+
const checkIntegrity = () => Effect.try({
|
|
15
|
+
try: () => {
|
|
16
|
+
const rows = db.prepare("PRAGMA integrity_check").all();
|
|
17
|
+
const issues = [];
|
|
18
|
+
for (const row of rows) {
|
|
19
|
+
if (row.integrity_check !== "ok") {
|
|
20
|
+
issues.push({
|
|
21
|
+
check: "integrity",
|
|
22
|
+
severity: "error",
|
|
23
|
+
message: row.integrity_check
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
name: "Database Integrity",
|
|
29
|
+
passed: issues.length === 0,
|
|
30
|
+
issues,
|
|
31
|
+
fixable: false
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
35
|
+
});
|
|
36
|
+
const checkSchemaVersion = () => Effect.try({
|
|
37
|
+
try: () => {
|
|
38
|
+
const issues = [];
|
|
39
|
+
const latestVersion = getLatestVersion();
|
|
40
|
+
// Get current schema version
|
|
41
|
+
let currentVersion = 0;
|
|
42
|
+
try {
|
|
43
|
+
const row = db.prepare("SELECT MAX(version) as version FROM schema_version").get();
|
|
44
|
+
currentVersion = row?.version ?? 0;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Table doesn't exist
|
|
48
|
+
issues.push({
|
|
49
|
+
check: "schema_version",
|
|
50
|
+
severity: "error",
|
|
51
|
+
message: "schema_version table does not exist"
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
name: "Schema Version",
|
|
55
|
+
passed: false,
|
|
56
|
+
issues,
|
|
57
|
+
fixable: true
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (currentVersion < latestVersion) {
|
|
61
|
+
issues.push({
|
|
62
|
+
check: "schema_version",
|
|
63
|
+
severity: "warning",
|
|
64
|
+
message: `Schema is outdated: current=${currentVersion}, latest=${latestVersion}`,
|
|
65
|
+
details: {
|
|
66
|
+
currentVersion,
|
|
67
|
+
latestVersion,
|
|
68
|
+
pendingMigrations: MIGRATIONS.filter(m => m.version > currentVersion).length
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (currentVersion > latestVersion) {
|
|
73
|
+
issues.push({
|
|
74
|
+
check: "schema_version",
|
|
75
|
+
severity: "error",
|
|
76
|
+
message: `Schema version is ahead of known migrations: current=${currentVersion}, latest=${latestVersion}`,
|
|
77
|
+
details: { currentVersion, latestVersion }
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
name: "Schema Version",
|
|
82
|
+
passed: issues.filter(i => i.severity === "error").length === 0,
|
|
83
|
+
issues,
|
|
84
|
+
fixable: currentVersion < latestVersion
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
88
|
+
});
|
|
89
|
+
const checkForeignKeys = () => Effect.try({
|
|
90
|
+
try: () => {
|
|
91
|
+
const issues = [];
|
|
92
|
+
// Check if foreign keys are enabled
|
|
93
|
+
const fkEnabled = db.prepare("PRAGMA foreign_keys").get();
|
|
94
|
+
if (!fkEnabled || fkEnabled.foreign_keys !== 1) {
|
|
95
|
+
issues.push({
|
|
96
|
+
check: "foreign_keys",
|
|
97
|
+
severity: "warning",
|
|
98
|
+
message: "Foreign keys are not enabled"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Run foreign key check
|
|
102
|
+
const violations = db.prepare("PRAGMA foreign_key_check").all();
|
|
103
|
+
for (const violation of violations) {
|
|
104
|
+
issues.push({
|
|
105
|
+
check: "foreign_keys",
|
|
106
|
+
severity: "error",
|
|
107
|
+
message: `Foreign key violation in ${violation.table} row ${violation.rowid} referencing ${violation.parent}`,
|
|
108
|
+
details: violation
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
name: "Foreign Key Constraints",
|
|
113
|
+
passed: violations.length === 0,
|
|
114
|
+
issues,
|
|
115
|
+
fixable: false
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
119
|
+
});
|
|
120
|
+
const checkOrphanedDependencies = (fix = false) => Effect.try({
|
|
121
|
+
try: () => {
|
|
122
|
+
const issues = [];
|
|
123
|
+
let fixed = 0;
|
|
124
|
+
// Find dependencies where blocker or blocked task doesn't exist
|
|
125
|
+
// This shouldn't happen with ON DELETE CASCADE, but can occur from manual edits or corruption
|
|
126
|
+
const orphanedBlockers = db.prepare(`
|
|
127
|
+
SELECT td.id, td.blocker_id, td.blocked_id
|
|
128
|
+
FROM task_dependencies td
|
|
129
|
+
LEFT JOIN tasks t ON t.id = td.blocker_id
|
|
130
|
+
WHERE t.id IS NULL
|
|
131
|
+
`).all();
|
|
132
|
+
const orphanedBlocked = db.prepare(`
|
|
133
|
+
SELECT td.id, td.blocker_id, td.blocked_id
|
|
134
|
+
FROM task_dependencies td
|
|
135
|
+
LEFT JOIN tasks t ON t.id = td.blocked_id
|
|
136
|
+
WHERE t.id IS NULL
|
|
137
|
+
`).all();
|
|
138
|
+
for (const row of orphanedBlockers) {
|
|
139
|
+
issues.push({
|
|
140
|
+
check: "orphaned_dependencies",
|
|
141
|
+
severity: "error",
|
|
142
|
+
message: `Dependency ${row.id} references non-existent blocker task ${row.blocker_id}`,
|
|
143
|
+
details: row
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
for (const row of orphanedBlocked) {
|
|
147
|
+
issues.push({
|
|
148
|
+
check: "orphaned_dependencies",
|
|
149
|
+
severity: "error",
|
|
150
|
+
message: `Dependency ${row.id} references non-existent blocked task ${row.blocked_id}`,
|
|
151
|
+
details: row
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (fix && issues.length > 0) {
|
|
155
|
+
// Delete orphaned dependencies
|
|
156
|
+
const orphanedIds = [...orphanedBlockers, ...orphanedBlocked].map(r => r.id);
|
|
157
|
+
const uniqueIds = [...new Set(orphanedIds)];
|
|
158
|
+
if (uniqueIds.length > 0) {
|
|
159
|
+
const result = db.prepare(`
|
|
160
|
+
DELETE FROM task_dependencies
|
|
161
|
+
WHERE id IN (${uniqueIds.map(() => "?").join(",")})
|
|
162
|
+
`).run(...uniqueIds);
|
|
163
|
+
fixed = result.changes;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
name: "Orphaned Dependencies",
|
|
168
|
+
passed: issues.length === 0,
|
|
169
|
+
issues,
|
|
170
|
+
fixable: true,
|
|
171
|
+
fixed: fix ? fixed : undefined
|
|
172
|
+
};
|
|
173
|
+
},
|
|
174
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
175
|
+
});
|
|
176
|
+
const checkInvalidStatuses = (fix = false) => Effect.try({
|
|
177
|
+
try: () => {
|
|
178
|
+
const issues = [];
|
|
179
|
+
let fixed = 0;
|
|
180
|
+
// Find tasks with invalid status values
|
|
181
|
+
const validStatuses = TASK_STATUSES;
|
|
182
|
+
const placeholders = validStatuses.map(() => "?").join(",");
|
|
183
|
+
const invalidTasks = db.prepare(`
|
|
184
|
+
SELECT id, status FROM tasks WHERE status NOT IN (${placeholders})
|
|
185
|
+
`).all(...validStatuses);
|
|
186
|
+
for (const task of invalidTasks) {
|
|
187
|
+
issues.push({
|
|
188
|
+
check: "invalid_status",
|
|
189
|
+
severity: "error",
|
|
190
|
+
message: `Task ${task.id} has invalid status '${task.status}'`,
|
|
191
|
+
details: { id: task.id, status: task.status, validStatuses }
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
if (fix && issues.length > 0) {
|
|
195
|
+
// Reset invalid statuses to 'backlog' (safe default)
|
|
196
|
+
const result = db.prepare(`
|
|
197
|
+
UPDATE tasks SET status = 'backlog', updated_at = datetime('now')
|
|
198
|
+
WHERE status NOT IN (${placeholders})
|
|
199
|
+
`).run(...validStatuses);
|
|
200
|
+
fixed = result.changes;
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
name: "Task Status Values",
|
|
204
|
+
passed: issues.length === 0,
|
|
205
|
+
issues,
|
|
206
|
+
fixable: true,
|
|
207
|
+
fixed: fix ? fixed : undefined
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
211
|
+
});
|
|
212
|
+
const checkMissingParentRefs = (fix = false) => Effect.try({
|
|
213
|
+
try: () => {
|
|
214
|
+
const issues = [];
|
|
215
|
+
let fixed = 0;
|
|
216
|
+
// Find tasks referencing non-existent parents
|
|
217
|
+
const orphanedChildren = db.prepare(`
|
|
218
|
+
SELECT t.id, t.parent_id
|
|
219
|
+
FROM tasks t
|
|
220
|
+
LEFT JOIN tasks p ON p.id = t.parent_id
|
|
221
|
+
WHERE t.parent_id IS NOT NULL AND p.id IS NULL
|
|
222
|
+
`).all();
|
|
223
|
+
for (const task of orphanedChildren) {
|
|
224
|
+
issues.push({
|
|
225
|
+
check: "missing_parent_refs",
|
|
226
|
+
severity: "error",
|
|
227
|
+
message: `Task ${task.id} references non-existent parent ${task.parent_id}`,
|
|
228
|
+
details: { id: task.id, parentId: task.parent_id }
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
if (fix && issues.length > 0) {
|
|
232
|
+
// Clear orphaned parent references
|
|
233
|
+
const result = db.prepare(`
|
|
234
|
+
UPDATE tasks SET parent_id = NULL, updated_at = datetime('now')
|
|
235
|
+
WHERE parent_id IS NOT NULL
|
|
236
|
+
AND parent_id NOT IN (SELECT id FROM tasks)
|
|
237
|
+
`).run();
|
|
238
|
+
fixed = result.changes;
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
name: "Missing Parent References",
|
|
242
|
+
passed: issues.length === 0,
|
|
243
|
+
issues,
|
|
244
|
+
fixable: true,
|
|
245
|
+
fixed: fix ? fixed : undefined
|
|
246
|
+
};
|
|
247
|
+
},
|
|
248
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
249
|
+
});
|
|
250
|
+
const validate = (options) => Effect.gen(function* () {
|
|
251
|
+
const fix = options?.fix ?? false;
|
|
252
|
+
// Run all checks
|
|
253
|
+
const checks = [];
|
|
254
|
+
checks.push(yield* checkIntegrity());
|
|
255
|
+
checks.push(yield* checkSchemaVersion());
|
|
256
|
+
checks.push(yield* checkForeignKeys());
|
|
257
|
+
checks.push(yield* checkOrphanedDependencies(fix));
|
|
258
|
+
checks.push(yield* checkInvalidStatuses(fix));
|
|
259
|
+
checks.push(yield* checkMissingParentRefs(fix));
|
|
260
|
+
// Count issues by severity
|
|
261
|
+
const issueCount = { error: 0, warning: 0, info: 0 };
|
|
262
|
+
let fixedCount = 0;
|
|
263
|
+
for (const check of checks) {
|
|
264
|
+
for (const issue of check.issues) {
|
|
265
|
+
issueCount[issue.severity]++;
|
|
266
|
+
}
|
|
267
|
+
if (check.fixed !== undefined) {
|
|
268
|
+
fixedCount += check.fixed;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const valid = issueCount.error === 0;
|
|
272
|
+
return {
|
|
273
|
+
valid,
|
|
274
|
+
checks,
|
|
275
|
+
issueCount,
|
|
276
|
+
fixedCount
|
|
277
|
+
};
|
|
278
|
+
});
|
|
279
|
+
return {
|
|
280
|
+
validate,
|
|
281
|
+
checkIntegrity,
|
|
282
|
+
checkSchemaVersion,
|
|
283
|
+
checkForeignKeys,
|
|
284
|
+
checkOrphanedDependencies,
|
|
285
|
+
checkInvalidStatuses,
|
|
286
|
+
checkMissingParentRefs
|
|
287
|
+
};
|
|
288
|
+
}));
|
|
289
|
+
//# sourceMappingURL=validation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-service.js","sourceRoot":"","sources":["../../src/services/validation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,31 @@
|
|
|
2
2
|
* WorkerProcess - PRD-018
|
|
3
3
|
*
|
|
4
4
|
* Implements the worker process with heartbeat fiber, lease renewal,
|
|
5
|
-
*
|
|
5
|
+
* agent subprocess management, and graceful shutdown handling.
|
|
6
6
|
* Uses Effect-TS patterns per DD-002.
|
|
7
7
|
*/
|
|
8
8
|
import { Effect } from "effect";
|
|
9
|
+
import { type ChildProcess } from "child_process";
|
|
9
10
|
import { WorkerService } from "./worker-service.js";
|
|
10
11
|
import { ClaimService } from "./claim-service.js";
|
|
11
12
|
import { ReadyService } from "./ready-service.js";
|
|
12
13
|
import { TaskService } from "./task-service.js";
|
|
14
|
+
import { AttemptService } from "./attempt-service.js";
|
|
15
|
+
/**
|
|
16
|
+
* Timeout in milliseconds to wait after SIGTERM before escalating to SIGKILL.
|
|
17
|
+
* If the agent subprocess doesn't exit within this window, it will be forcefully killed.
|
|
18
|
+
*/
|
|
19
|
+
export declare const SIGKILL_ESCALATION_TIMEOUT_MS = 5000;
|
|
20
|
+
/**
|
|
21
|
+
* Kill a child process with SIGTERM, escalating to SIGKILL after a timeout.
|
|
22
|
+
*
|
|
23
|
+
* If the process ignores SIGTERM (e.g., traps the signal), it would become orphaned.
|
|
24
|
+
* This function ensures cleanup by sending SIGKILL after SIGKILL_ESCALATION_TIMEOUT_MS.
|
|
25
|
+
*
|
|
26
|
+
* Uses setTimeout with .unref() so the escalation timer doesn't keep the event loop alive
|
|
27
|
+
* during graceful shutdown.
|
|
28
|
+
*/
|
|
29
|
+
export declare const killWithEscalation: (proc: ChildProcess) => void;
|
|
13
30
|
/**
|
|
14
31
|
* Configuration for the worker process.
|
|
15
32
|
*/
|
|
@@ -20,9 +37,11 @@ export interface WorkerProcessConfig {
|
|
|
20
37
|
readonly capabilities: readonly string[];
|
|
21
38
|
/** Heartbeat interval in seconds. Should match orchestrator config. */
|
|
22
39
|
readonly heartbeatIntervalSeconds: number;
|
|
23
|
-
/**
|
|
40
|
+
/** Lease duration in minutes. Should match orchestrator config. Defaults to 30. */
|
|
41
|
+
readonly leaseDurationMinutes?: number;
|
|
42
|
+
/** How often to renew the lease (in seconds). Should be < lease duration. Defaults to 1/3 of leaseDurationMinutes. */
|
|
24
43
|
readonly leaseRenewalIntervalSeconds?: number;
|
|
25
|
-
/** Working directory for
|
|
44
|
+
/** Working directory for agent subprocess. Defaults to process.cwd() */
|
|
26
45
|
readonly workingDirectory?: string;
|
|
27
46
|
}
|
|
28
47
|
/**
|
|
@@ -37,5 +56,5 @@ export interface WorkerProcessConfig {
|
|
|
37
56
|
* @param config Worker process configuration
|
|
38
57
|
* @returns Effect that runs until shutdown is requested
|
|
39
58
|
*/
|
|
40
|
-
export declare const runWorkerProcess: (config: WorkerProcessConfig) => Effect.Effect<void, import("../errors.js").TaskNotFoundError | import("../errors.js").
|
|
59
|
+
export declare const runWorkerProcess: (config: WorkerProcessConfig) => Effect.Effect<void, import("../errors.js").DatabaseError | import("../errors.js").TaskNotFoundError | import("../errors.js").StaleDataError | import("../errors.js").ValidationError | import("../errors.js").RegistrationError | import("../errors.js").WorkerNotFoundError, TaskService | ReadyService | AttemptService | ClaimService | WorkerService>;
|
|
41
60
|
//# sourceMappingURL=worker-process.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-process.d.ts","sourceRoot":"","sources":["../../src/services/worker-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"worker-process.d.ts","sourceRoot":"","sources":["../../src/services/worker-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAkC,MAAM,QAAQ,CAAA;AAC/D,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AASrD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,OAAQ,CAAA;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,YAAY,KAAG,IAoBvD,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAA;IACzC,mFAAmF;IACnF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,sHAAsH;IACtH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAoCD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,mBAAmB,8VAkPxD,CAAA"}
|