@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.
Files changed (289) hide show
  1. package/dist/db.d.ts +42 -0
  2. package/dist/db.d.ts.map +1 -0
  3. package/dist/db.js +46 -0
  4. package/dist/db.js.map +1 -0
  5. package/dist/errors.d.ts +231 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +139 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/id.d.ts +6 -0
  10. package/dist/id.d.ts.map +1 -0
  11. package/dist/id.js +21 -0
  12. package/dist/id.js.map +1 -0
  13. package/dist/index.d.ts +25 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +56 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/layer.d.ts +50 -0
  18. package/dist/layer.d.ts.map +1 -0
  19. package/dist/layer.js +155 -0
  20. package/dist/layer.js.map +1 -0
  21. package/dist/mappers/anchor.d.ts +14 -0
  22. package/dist/mappers/anchor.d.ts.map +1 -0
  23. package/dist/mappers/anchor.js +38 -0
  24. package/dist/mappers/anchor.js.map +1 -0
  25. package/dist/mappers/attempt.d.ts +15 -0
  26. package/dist/mappers/attempt.d.ts.map +1 -0
  27. package/dist/mappers/attempt.js +23 -0
  28. package/dist/mappers/attempt.js.map +1 -0
  29. package/dist/mappers/candidate.d.ts +23 -0
  30. package/dist/mappers/candidate.d.ts.map +1 -0
  31. package/dist/mappers/candidate.js +53 -0
  32. package/dist/mappers/candidate.js.map +1 -0
  33. package/dist/mappers/claim.d.ts +30 -0
  34. package/dist/mappers/claim.d.ts.map +1 -0
  35. package/dist/mappers/claim.js +32 -0
  36. package/dist/mappers/claim.js.map +1 -0
  37. package/dist/mappers/deduplication.d.ts +39 -0
  38. package/dist/mappers/deduplication.d.ts.map +1 -0
  39. package/dist/mappers/deduplication.js +53 -0
  40. package/dist/mappers/deduplication.js.map +1 -0
  41. package/dist/mappers/edge.d.ts +10 -0
  42. package/dist/mappers/edge.d.ts.map +1 -0
  43. package/dist/mappers/edge.js +19 -0
  44. package/dist/mappers/edge.js.map +1 -0
  45. package/dist/mappers/file-learning.d.ts +14 -0
  46. package/dist/mappers/file-learning.d.ts.map +1 -0
  47. package/dist/mappers/file-learning.js +75 -0
  48. package/dist/mappers/file-learning.js.map +1 -0
  49. package/dist/mappers/index.d.ts +17 -0
  50. package/dist/mappers/index.d.ts.map +1 -0
  51. package/dist/mappers/index.js +30 -0
  52. package/dist/mappers/index.js.map +1 -0
  53. package/dist/mappers/learning.d.ts +19 -0
  54. package/dist/mappers/learning.d.ts.map +1 -0
  55. package/dist/mappers/learning.js +41 -0
  56. package/dist/mappers/learning.js.map +1 -0
  57. package/dist/mappers/orchestrator-state.d.ts +33 -0
  58. package/dist/mappers/orchestrator-state.d.ts.map +1 -0
  59. package/dist/mappers/orchestrator-state.js +34 -0
  60. package/dist/mappers/orchestrator-state.js.map +1 -0
  61. package/dist/mappers/run.d.ts +32 -0
  62. package/dist/mappers/run.d.ts.map +1 -0
  63. package/dist/mappers/run.js +64 -0
  64. package/dist/mappers/run.js.map +1 -0
  65. package/dist/mappers/task.d.ts +23 -0
  66. package/dist/mappers/task.d.ts.map +1 -0
  67. package/dist/mappers/task.js +54 -0
  68. package/dist/mappers/task.js.map +1 -0
  69. package/dist/mappers/tracked-project.d.ts +15 -0
  70. package/dist/mappers/tracked-project.d.ts.map +1 -0
  71. package/dist/mappers/tracked-project.js +23 -0
  72. package/dist/mappers/tracked-project.js.map +1 -0
  73. package/dist/mappers/worker.d.ts +33 -0
  74. package/dist/mappers/worker.d.ts.map +1 -0
  75. package/dist/mappers/worker.js +35 -0
  76. package/dist/mappers/worker.js.map +1 -0
  77. package/dist/repo/anchor-repo.d.ts +52 -0
  78. package/dist/repo/anchor-repo.d.ts.map +1 -0
  79. package/dist/repo/anchor-repo.js +204 -0
  80. package/dist/repo/anchor-repo.js.map +1 -0
  81. package/dist/repo/attempt-repo.d.ts +25 -0
  82. package/dist/repo/attempt-repo.d.ts.map +1 -0
  83. package/dist/repo/attempt-repo.js +78 -0
  84. package/dist/repo/attempt-repo.js.map +1 -0
  85. package/dist/repo/candidate-repo.d.ts +16 -0
  86. package/dist/repo/candidate-repo.d.ts.map +1 -0
  87. package/dist/repo/candidate-repo.js +143 -0
  88. package/dist/repo/candidate-repo.js.map +1 -0
  89. package/dist/repo/claim-repo.d.ts +17 -0
  90. package/dist/repo/claim-repo.d.ts.map +1 -0
  91. package/dist/repo/claim-repo.js +62 -0
  92. package/dist/repo/claim-repo.js.map +1 -0
  93. package/dist/repo/deduplication-repo.d.ts +37 -0
  94. package/dist/repo/deduplication-repo.d.ts.map +1 -0
  95. package/dist/repo/deduplication-repo.js +133 -0
  96. package/dist/repo/deduplication-repo.js.map +1 -0
  97. package/dist/repo/dep-repo.d.ts +19 -0
  98. package/dist/repo/dep-repo.d.ts.map +1 -0
  99. package/dist/repo/dep-repo.js +104 -0
  100. package/dist/repo/dep-repo.js.map +1 -0
  101. package/dist/repo/edge-repo.d.ts +26 -0
  102. package/dist/repo/edge-repo.d.ts.map +1 -0
  103. package/dist/repo/edge-repo.js +227 -0
  104. package/dist/repo/edge-repo.js.map +1 -0
  105. package/dist/repo/file-learning-repo.d.ts +17 -0
  106. package/dist/repo/file-learning-repo.d.ts.map +1 -0
  107. package/dist/repo/file-learning-repo.js +60 -0
  108. package/dist/repo/file-learning-repo.js.map +1 -0
  109. package/dist/repo/index.d.ts +18 -0
  110. package/dist/repo/index.d.ts.map +1 -0
  111. package/dist/repo/index.js +18 -0
  112. package/dist/repo/index.js.map +1 -0
  113. package/dist/repo/learning-repo.d.ts +31 -0
  114. package/dist/repo/learning-repo.d.ts.map +1 -0
  115. package/dist/repo/learning-repo.js +165 -0
  116. package/dist/repo/learning-repo.js.map +1 -0
  117. package/dist/repo/orchestrator-state-repo.d.ts +27 -0
  118. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
  119. package/dist/repo/orchestrator-state-repo.js +96 -0
  120. package/dist/repo/orchestrator-state-repo.js.map +1 -0
  121. package/dist/repo/run-repo.d.ts +31 -0
  122. package/dist/repo/run-repo.d.ts.map +1 -0
  123. package/dist/repo/run-repo.js +132 -0
  124. package/dist/repo/run-repo.js.map +1 -0
  125. package/dist/repo/task-repo.d.ts +21 -0
  126. package/dist/repo/task-repo.d.ts.map +1 -0
  127. package/dist/repo/task-repo.js +169 -0
  128. package/dist/repo/task-repo.js.map +1 -0
  129. package/dist/repo/tracked-project-repo.d.ts +16 -0
  130. package/dist/repo/tracked-project-repo.d.ts.map +1 -0
  131. package/dist/repo/tracked-project-repo.js +54 -0
  132. package/dist/repo/tracked-project-repo.js.map +1 -0
  133. package/dist/repo/worker-repo.d.ts +19 -0
  134. package/dist/repo/worker-repo.d.ts.map +1 -0
  135. package/dist/repo/worker-repo.js +72 -0
  136. package/dist/repo/worker-repo.js.map +1 -0
  137. package/dist/schemas/index.d.ts +8 -0
  138. package/dist/schemas/index.d.ts.map +1 -0
  139. package/dist/schemas/index.js +7 -0
  140. package/dist/schemas/index.js.map +1 -0
  141. package/dist/schemas/sync.d.ts +296 -0
  142. package/dist/schemas/sync.d.ts.map +1 -0
  143. package/dist/schemas/sync.js +146 -0
  144. package/dist/schemas/sync.js.map +1 -0
  145. package/dist/schemas/worker.d.ts +77 -0
  146. package/dist/schemas/worker.d.ts.map +1 -0
  147. package/dist/schemas/worker.js +80 -0
  148. package/dist/schemas/worker.js.map +1 -0
  149. package/dist/services/anchor-service.d.ts +147 -0
  150. package/dist/services/anchor-service.d.ts.map +1 -0
  151. package/dist/services/anchor-service.js +540 -0
  152. package/dist/services/anchor-service.js.map +1 -0
  153. package/dist/services/anchor-verification.d.ts +94 -0
  154. package/dist/services/anchor-verification.d.ts.map +1 -0
  155. package/dist/services/anchor-verification.js +617 -0
  156. package/dist/services/anchor-verification.js.map +1 -0
  157. package/dist/services/ast-grep-service.d.ts +58 -0
  158. package/dist/services/ast-grep-service.d.ts.map +1 -0
  159. package/dist/services/ast-grep-service.js +356 -0
  160. package/dist/services/ast-grep-service.js.map +1 -0
  161. package/dist/services/attempt-service.d.ts +24 -0
  162. package/dist/services/attempt-service.d.ts.map +1 -0
  163. package/dist/services/attempt-service.js +55 -0
  164. package/dist/services/attempt-service.js.map +1 -0
  165. package/dist/services/auto-sync-service.d.ts +56 -0
  166. package/dist/services/auto-sync-service.d.ts.map +1 -0
  167. package/dist/services/auto-sync-service.js +66 -0
  168. package/dist/services/auto-sync-service.js.map +1 -0
  169. package/dist/services/candidate-extractor-service.d.ts +56 -0
  170. package/dist/services/candidate-extractor-service.d.ts.map +1 -0
  171. package/dist/services/candidate-extractor-service.js +365 -0
  172. package/dist/services/candidate-extractor-service.js.map +1 -0
  173. package/dist/services/claim-service.d.ts +52 -0
  174. package/dist/services/claim-service.d.ts.map +1 -0
  175. package/dist/services/claim-service.js +134 -0
  176. package/dist/services/claim-service.js.map +1 -0
  177. package/dist/services/daemon-service.d.ts +214 -0
  178. package/dist/services/daemon-service.d.ts.map +1 -0
  179. package/dist/services/daemon-service.js +522 -0
  180. package/dist/services/daemon-service.js.map +1 -0
  181. package/dist/services/deduplication-service.d.ts +67 -0
  182. package/dist/services/deduplication-service.d.ts.map +1 -0
  183. package/dist/services/deduplication-service.js +145 -0
  184. package/dist/services/deduplication-service.js.map +1 -0
  185. package/dist/services/dep-service.d.ts +14 -0
  186. package/dist/services/dep-service.d.ts.map +1 -0
  187. package/dist/services/dep-service.js +34 -0
  188. package/dist/services/dep-service.js.map +1 -0
  189. package/dist/services/diversifier-service.d.ts +46 -0
  190. package/dist/services/diversifier-service.d.ts.map +1 -0
  191. package/dist/services/diversifier-service.js +197 -0
  192. package/dist/services/diversifier-service.js.map +1 -0
  193. package/dist/services/edge-service.d.ts +78 -0
  194. package/dist/services/edge-service.d.ts.map +1 -0
  195. package/dist/services/edge-service.js +158 -0
  196. package/dist/services/edge-service.js.map +1 -0
  197. package/dist/services/embedding-service.d.ts +138 -0
  198. package/dist/services/embedding-service.d.ts.map +1 -0
  199. package/dist/services/embedding-service.js +318 -0
  200. package/dist/services/embedding-service.js.map +1 -0
  201. package/dist/services/feedback-tracker.d.ts +64 -0
  202. package/dist/services/feedback-tracker.d.ts.map +1 -0
  203. package/dist/services/feedback-tracker.js +110 -0
  204. package/dist/services/feedback-tracker.js.map +1 -0
  205. package/dist/services/file-learning-service.d.ts +17 -0
  206. package/dist/services/file-learning-service.d.ts.map +1 -0
  207. package/dist/services/file-learning-service.js +41 -0
  208. package/dist/services/file-learning-service.js.map +1 -0
  209. package/dist/services/file-watcher-service.d.ts +141 -0
  210. package/dist/services/file-watcher-service.d.ts.map +1 -0
  211. package/dist/services/file-watcher-service.js +278 -0
  212. package/dist/services/file-watcher-service.js.map +1 -0
  213. package/dist/services/graph-expansion.d.ts +155 -0
  214. package/dist/services/graph-expansion.d.ts.map +1 -0
  215. package/dist/services/graph-expansion.js +466 -0
  216. package/dist/services/graph-expansion.js.map +1 -0
  217. package/dist/services/hierarchy-service.d.ts +16 -0
  218. package/dist/services/hierarchy-service.d.ts.map +1 -0
  219. package/dist/services/hierarchy-service.js +66 -0
  220. package/dist/services/hierarchy-service.js.map +1 -0
  221. package/dist/services/index.d.ts +36 -0
  222. package/dist/services/index.d.ts.map +1 -0
  223. package/dist/services/index.js +36 -0
  224. package/dist/services/index.js.map +1 -0
  225. package/dist/services/learning-service.d.ts +39 -0
  226. package/dist/services/learning-service.d.ts.map +1 -0
  227. package/dist/services/learning-service.js +151 -0
  228. package/dist/services/learning-service.js.map +1 -0
  229. package/dist/services/migration-service.d.ts +67 -0
  230. package/dist/services/migration-service.d.ts.map +1 -0
  231. package/dist/services/migration-service.js +144 -0
  232. package/dist/services/migration-service.js.map +1 -0
  233. package/dist/services/orchestrator-service.d.ts +52 -0
  234. package/dist/services/orchestrator-service.d.ts.map +1 -0
  235. package/dist/services/orchestrator-service.js +203 -0
  236. package/dist/services/orchestrator-service.js.map +1 -0
  237. package/dist/services/promotion-service.d.ts +67 -0
  238. package/dist/services/promotion-service.d.ts.map +1 -0
  239. package/dist/services/promotion-service.js +151 -0
  240. package/dist/services/promotion-service.js.map +1 -0
  241. package/dist/services/query-expansion-service.d.ts +55 -0
  242. package/dist/services/query-expansion-service.d.ts.map +1 -0
  243. package/dist/services/query-expansion-service.js +174 -0
  244. package/dist/services/query-expansion-service.js.map +1 -0
  245. package/dist/services/ready-service.d.ts +16 -0
  246. package/dist/services/ready-service.d.ts.map +1 -0
  247. package/dist/services/ready-service.js +70 -0
  248. package/dist/services/ready-service.js.map +1 -0
  249. package/dist/services/reranker-service.d.ts +51 -0
  250. package/dist/services/reranker-service.d.ts.map +1 -0
  251. package/dist/services/reranker-service.js +128 -0
  252. package/dist/services/reranker-service.js.map +1 -0
  253. package/dist/services/retriever-service.d.ts +49 -0
  254. package/dist/services/retriever-service.d.ts.map +1 -0
  255. package/dist/services/retriever-service.js +419 -0
  256. package/dist/services/retriever-service.js.map +1 -0
  257. package/dist/services/score-service.d.ts +43 -0
  258. package/dist/services/score-service.d.ts.map +1 -0
  259. package/dist/services/score-service.js +82 -0
  260. package/dist/services/score-service.js.map +1 -0
  261. package/dist/services/swarm-verification.d.ts +104 -0
  262. package/dist/services/swarm-verification.d.ts.map +1 -0
  263. package/dist/services/swarm-verification.js +400 -0
  264. package/dist/services/swarm-verification.js.map +1 -0
  265. package/dist/services/sync-service.d.ts +115 -0
  266. package/dist/services/sync-service.d.ts.map +1 -0
  267. package/dist/services/sync-service.js +350 -0
  268. package/dist/services/sync-service.js.map +1 -0
  269. package/dist/services/task-service.d.ts +22 -0
  270. package/dist/services/task-service.d.ts.map +1 -0
  271. package/dist/services/task-service.js +221 -0
  272. package/dist/services/task-service.js.map +1 -0
  273. package/dist/services/worker-process.d.ts +41 -0
  274. package/dist/services/worker-process.d.ts.map +1 -0
  275. package/dist/services/worker-process.js +280 -0
  276. package/dist/services/worker-process.js.map +1 -0
  277. package/dist/services/worker-service.d.ts +74 -0
  278. package/dist/services/worker-service.d.ts.map +1 -0
  279. package/dist/services/worker-service.js +148 -0
  280. package/dist/services/worker-service.js.map +1 -0
  281. package/dist/utils/glob.d.ts +15 -0
  282. package/dist/utils/glob.d.ts.map +1 -0
  283. package/dist/utils/glob.js +27 -0
  284. package/dist/utils/glob.js.map +1 -0
  285. package/dist/utils/math.d.ts +6 -0
  286. package/dist/utils/math.d.ts.map +1 -0
  287. package/dist/utils/math.js +21 -0
  288. package/dist/utils/math.js.map +1 -0
  289. package/package.json +72 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ClaimService - PRD-018
3
+ *
4
+ * Manages task claims with lease-based expiration.
5
+ * Uses Effect-TS patterns per DD-002.
6
+ */
7
+ import { Context, Effect, Layer } from "effect";
8
+ import { ClaimRepository } from "../repo/claim-repo.js";
9
+ import { TaskRepository } from "../repo/task-repo.js";
10
+ import { OrchestratorStateRepository } from "../repo/orchestrator-state-repo.js";
11
+ import { AlreadyClaimedError, ClaimIdNotFoundError, ClaimNotFoundError, LeaseExpiredError, MaxRenewalsExceededError, TaskNotFoundError } from "../errors.js";
12
+ /**
13
+ * Default maximum number of times a lease can be renewed.
14
+ * This is a safeguard to prevent indefinite claim holding.
15
+ */
16
+ const DEFAULT_MAX_RENEWALS = 10;
17
+ export class ClaimService extends Context.Tag("ClaimService")() {
18
+ }
19
+ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function* () {
20
+ const claimRepo = yield* ClaimRepository;
21
+ const taskRepo = yield* TaskRepository;
22
+ const orchestratorRepo = yield* OrchestratorStateRepository;
23
+ return {
24
+ claim: (taskId, workerId, leaseDurationMinutes) => Effect.gen(function* () {
25
+ // Verify task exists
26
+ const task = yield* taskRepo.findById(taskId);
27
+ if (!task) {
28
+ return yield* Effect.fail(new TaskNotFoundError({ id: taskId }));
29
+ }
30
+ // Check if task is already claimed
31
+ const existingClaim = yield* claimRepo.findActiveByTaskId(taskId);
32
+ if (existingClaim) {
33
+ return yield* Effect.fail(new AlreadyClaimedError({
34
+ taskId,
35
+ claimedByWorkerId: existingClaim.workerId
36
+ }));
37
+ }
38
+ // Get lease duration from config or use provided/default
39
+ const state = yield* orchestratorRepo.get();
40
+ const duration = leaseDurationMinutes ?? state.leaseDurationMinutes;
41
+ const now = new Date();
42
+ const leaseExpiresAt = new Date(now.getTime() + duration * 60 * 1000);
43
+ const claim = yield* claimRepo.insert({
44
+ taskId,
45
+ workerId,
46
+ claimedAt: now,
47
+ leaseExpiresAt,
48
+ renewedCount: 0,
49
+ status: "active"
50
+ });
51
+ yield* Effect.log(`Task ${taskId} claimed by worker ${workerId}, expires at ${leaseExpiresAt.toISOString()}`);
52
+ return claim;
53
+ }),
54
+ release: (taskId, workerId) => Effect.gen(function* () {
55
+ const claim = yield* claimRepo.findActiveByTaskId(taskId);
56
+ if (!claim) {
57
+ return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
58
+ }
59
+ // Verify the worker owns this claim
60
+ if (claim.workerId !== workerId) {
61
+ return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
62
+ }
63
+ // Update claim status to released
64
+ yield* claimRepo.update({
65
+ ...claim,
66
+ status: "released"
67
+ });
68
+ yield* Effect.log(`Task ${taskId} claim released by worker ${workerId}`);
69
+ }),
70
+ renew: (taskId, workerId) => Effect.gen(function* () {
71
+ const claim = yield* claimRepo.findActiveByTaskId(taskId);
72
+ if (!claim) {
73
+ return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
74
+ }
75
+ // Verify the worker owns this claim
76
+ if (claim.workerId !== workerId) {
77
+ return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
78
+ }
79
+ // Check if claim has already expired
80
+ const now = new Date();
81
+ if (claim.leaseExpiresAt < now) {
82
+ return yield* Effect.fail(new LeaseExpiredError({
83
+ taskId,
84
+ expiredAt: claim.leaseExpiresAt.toISOString()
85
+ }));
86
+ }
87
+ // Check max renewals
88
+ if (claim.renewedCount >= DEFAULT_MAX_RENEWALS) {
89
+ return yield* Effect.fail(new MaxRenewalsExceededError({
90
+ taskId,
91
+ renewalCount: claim.renewedCount,
92
+ maxRenewals: DEFAULT_MAX_RENEWALS
93
+ }));
94
+ }
95
+ // Get lease duration from config
96
+ const state = yield* orchestratorRepo.get();
97
+ const newLeaseExpiresAt = new Date(now.getTime() + state.leaseDurationMinutes * 60 * 1000);
98
+ const updatedClaim = {
99
+ ...claim,
100
+ leaseExpiresAt: newLeaseExpiresAt,
101
+ renewedCount: claim.renewedCount + 1
102
+ };
103
+ yield* claimRepo.update(updatedClaim);
104
+ yield* Effect.log(`Task ${taskId} lease renewed (${updatedClaim.renewedCount}/${DEFAULT_MAX_RENEWALS}), new expiry: ${newLeaseExpiresAt.toISOString()}`);
105
+ return updatedClaim;
106
+ }),
107
+ getExpired: () => Effect.gen(function* () {
108
+ const now = new Date();
109
+ return yield* claimRepo.findExpired(now);
110
+ }),
111
+ expire: (claimId) => Effect.gen(function* () {
112
+ const claim = yield* claimRepo.findById(claimId);
113
+ if (!claim) {
114
+ return yield* Effect.fail(new ClaimIdNotFoundError({ claimId }));
115
+ }
116
+ yield* claimRepo.update({
117
+ ...claim,
118
+ status: "expired"
119
+ });
120
+ yield* Effect.log(`Claim ${claimId} for task ${claim.taskId} marked as expired`);
121
+ }),
122
+ releaseByWorker: (workerId) => Effect.gen(function* () {
123
+ const count = yield* claimRepo.releaseAllByWorkerId(workerId);
124
+ if (count > 0) {
125
+ yield* Effect.log(`Released ${count} claims for worker ${workerId}`);
126
+ }
127
+ return count;
128
+ }),
129
+ getActiveClaim: (taskId) => Effect.gen(function* () {
130
+ return yield* claimRepo.findActiveByTaskId(taskId);
131
+ })
132
+ };
133
+ }));
134
+ //# sourceMappingURL=claim-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-service.js","sourceRoot":"","sources":["../../src/services/claim-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAChF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAElB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,cAAc,CAAA;AAGrB;;;GAGG;AACH,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAE/B,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EA2D1D;CAAG;AAEN,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAC1C,YAAY,EACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IACtC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,2BAA2B,CAAA;IAE3D,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,qBAAqB;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,mCAAmC;YACnC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACjE,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,mBAAmB,CAAC;oBACtB,MAAM;oBACN,iBAAiB,EAAE,aAAa,CAAC,QAAQ;iBAC1C,CAAC,CACH,CAAA;YACH,CAAC;YAED,yDAAyD;YACzD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;YAC3C,MAAM,QAAQ,GAAG,oBAAoB,IAAI,KAAK,CAAC,oBAAoB,CAAA;YAEnE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YAErE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACpC,MAAM;gBACN,QAAQ;gBACR,SAAS,EAAE,GAAG;gBACd,cAAc;gBACd,YAAY,EAAE,CAAC;gBACf,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,sBAAsB,QAAQ,gBAAgB,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAE7G,OAAO,KAAK,CAAA;QACd,CAAC,CAAC;QAEJ,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,kCAAkC;YAClC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtB,GAAG,KAAK;gBACR,MAAM,EAAE,UAAU;aACnB,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,6BAA6B,QAAQ,EAAE,CAAC,CAAA;QAC1E,CAAC,CAAC;QAEJ,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,qCAAqC;YACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,IAAI,KAAK,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,iBAAiB,CAAC;oBACpB,MAAM;oBACN,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE;iBAC9C,CAAC,CACH,CAAA;YACH,CAAC;YAED,qBAAqB;YACrB,IAAI,KAAK,CAAC,YAAY,IAAI,oBAAoB,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,wBAAwB,CAAC;oBAC3B,MAAM;oBACN,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,WAAW,EAAE,oBAAoB;iBAClC,CAAC,CACH,CAAA;YACH,CAAC;YAED,iCAAiC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;YAC3C,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAChC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CACvD,CAAA;YAED,MAAM,YAAY,GAAc;gBAC9B,GAAG,KAAK;gBACR,cAAc,EAAE,iBAAiB;gBACjC,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;aACrC,CAAA;YAED,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YACrC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,mBAAmB,YAAY,CAAC,YAAY,IAAI,oBAAoB,kBAAkB,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAExJ,OAAO,YAAY,CAAA;QACrB,CAAC,CAAC;QAEJ,UAAU,EAAE,GAAG,EAAE,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC1C,CAAC,CAAC;QAEJ,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtB,GAAG,KAAK;gBACR,MAAM,EAAE,SAAS;aAClB,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,OAAO,aAAa,KAAK,CAAC,MAAM,oBAAoB,CAAC,CAAA;QAClF,CAAC,CAAC;QAEJ,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YAC7D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,KAAK,sBAAsB,QAAQ,EAAE,CAAC,CAAA;YACtE,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC;QAEJ,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC,CAAC;KACL,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,214 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { DaemonError } from "../errors.js";
3
+ /**
4
+ * Default path for the daemon PID file.
5
+ */
6
+ export declare const PID_FILE_PATH = ".tx/daemon.pid";
7
+ /**
8
+ * Default install path for the launchd plist file.
9
+ * Located in the user's LaunchAgents directory for per-user daemons.
10
+ */
11
+ export declare const LAUNCHD_PLIST_PATH = "~/Library/LaunchAgents/com.tx.daemon.plist";
12
+ /**
13
+ * Default install path for the systemd service file.
14
+ * Located in the user's systemd user directory for per-user services.
15
+ */
16
+ export declare const SYSTEMD_SERVICE_PATH = "~/.config/systemd/user/tx-daemon.service";
17
+ /**
18
+ * Options for generating a launchd plist file.
19
+ */
20
+ export interface LaunchdPlistOptions {
21
+ /**
22
+ * The label for the launchd job (e.g., "com.tx.daemon").
23
+ * This must be unique among all launchd jobs.
24
+ */
25
+ readonly label: string;
26
+ /**
27
+ * The absolute path to the executable to run.
28
+ */
29
+ readonly executablePath: string;
30
+ /**
31
+ * Optional path for log output (both stdout and stderr).
32
+ * If not provided, defaults to ~/Library/Logs/tx-daemon.log
33
+ */
34
+ readonly logPath?: string;
35
+ }
36
+ /**
37
+ * Generate a macOS launchd plist file content.
38
+ * Creates a valid XML plist that can be used with launchctl to run the daemon.
39
+ *
40
+ * The generated plist configures the daemon to:
41
+ * - Run at load (start when user logs in)
42
+ * - Keep alive (restart if it crashes)
43
+ * - Log stdout and stderr to the specified log path
44
+ *
45
+ * @param options - Configuration options for the plist
46
+ * @returns The XML content for the launchd plist file
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const plist = generateLaunchdPlist({
51
+ * label: "com.tx.daemon",
52
+ * executablePath: "/usr/local/bin/tx",
53
+ * logPath: "~/Library/Logs/tx-daemon.log"
54
+ * })
55
+ * ```
56
+ */
57
+ export declare const generateLaunchdPlist: (options: LaunchdPlistOptions) => string;
58
+ /**
59
+ * Options for generating a systemd service file.
60
+ */
61
+ export interface SystemdServiceOptions {
62
+ /**
63
+ * The absolute path to the executable to run.
64
+ */
65
+ readonly executablePath: string;
66
+ /**
67
+ * Optional user to run the service as.
68
+ * If not provided, the service runs as the current user (for user services).
69
+ */
70
+ readonly user?: string;
71
+ }
72
+ /**
73
+ * Generate a Linux systemd service file content.
74
+ * Creates a valid systemd unit file for a user service.
75
+ *
76
+ * The generated service file configures the daemon to:
77
+ * - Start after the network is available
78
+ * - Run as Type=simple (foreground process)
79
+ * - Restart always on failure with 5 second delay
80
+ * - Be enabled for multi-user target
81
+ *
82
+ * @param options - Configuration options for the service file
83
+ * @returns The content for the systemd service file
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const service = generateSystemdService({
88
+ * executablePath: "/usr/local/bin/tx",
89
+ * user: "myuser"
90
+ * })
91
+ * ```
92
+ */
93
+ export declare const generateSystemdService: (options: SystemdServiceOptions) => string;
94
+ /**
95
+ * Status information for the daemon process.
96
+ */
97
+ export interface DaemonStatus {
98
+ readonly running: boolean;
99
+ readonly pid: number | null;
100
+ readonly uptime: number | null;
101
+ readonly startedAt: Date | null;
102
+ }
103
+ declare const DaemonService_base: Context.TagClass<DaemonService, "DaemonService", {
104
+ /**
105
+ * Start the daemon process.
106
+ * Creates PID file at .tx/daemon.pid on success.
107
+ */
108
+ readonly start: () => Effect.Effect<void, DaemonError>;
109
+ /**
110
+ * Stop the daemon process.
111
+ * Removes PID file on success.
112
+ */
113
+ readonly stop: () => Effect.Effect<void, DaemonError>;
114
+ /**
115
+ * Get the current status of the daemon.
116
+ */
117
+ readonly status: () => Effect.Effect<DaemonStatus, DaemonError>;
118
+ /**
119
+ * Restart the daemon process (stop then start).
120
+ */
121
+ readonly restart: () => Effect.Effect<void, DaemonError>;
122
+ }>;
123
+ /**
124
+ * DaemonService manages the lifecycle of the tx daemon process.
125
+ * The daemon runs in the background and provides:
126
+ * - File watching for auto-sync
127
+ * - JSONL promotion on git operations
128
+ * - Background task processing
129
+ *
130
+ * See DD-015 and PRD-015 for full specification.
131
+ */
132
+ export declare class DaemonService extends DaemonService_base {
133
+ }
134
+ /**
135
+ * Check if a process with the given PID is currently running.
136
+ * Uses kill signal 0 which doesn't actually send a signal but checks if the process exists.
137
+ *
138
+ * @param pid - The process ID to check
139
+ * @returns Effect that resolves to true if the process is running, false otherwise
140
+ */
141
+ export declare const isProcessRunning: (pid: number) => Effect.Effect<boolean, DaemonError>;
142
+ /**
143
+ * Write a PID to the daemon PID file.
144
+ * Creates the .tx directory if it doesn't exist.
145
+ *
146
+ * @param pid - The process ID to write
147
+ * @returns Effect that resolves to void on success
148
+ */
149
+ export declare const writePid: (pid: number) => Effect.Effect<void, DaemonError>;
150
+ /**
151
+ * Read the PID from the daemon PID file.
152
+ * Returns null if the file doesn't exist.
153
+ * Handles stale PID cleanup: if the PID file exists but the process is not running,
154
+ * the stale PID file is automatically removed and null is returned.
155
+ *
156
+ * @returns Effect that resolves to the PID number, or null if no valid PID file exists
157
+ */
158
+ export declare const readPid: () => Effect.Effect<number | null, DaemonError>;
159
+ /**
160
+ * Remove the daemon PID file.
161
+ * Does nothing if the file doesn't exist.
162
+ *
163
+ * @returns Effect that resolves to void on success
164
+ */
165
+ export declare const removePid: () => Effect.Effect<void, DaemonError>;
166
+ /**
167
+ * Configuration for the daemon service.
168
+ */
169
+ export interface DaemonConfig {
170
+ /**
171
+ * The command to run the daemon (e.g., "tx", "node").
172
+ * Defaults to "tx".
173
+ */
174
+ readonly command: string;
175
+ /**
176
+ * Arguments to pass to the command.
177
+ * Defaults to ["daemon", "run"].
178
+ */
179
+ readonly args: readonly string[];
180
+ /**
181
+ * Working directory for the daemon process.
182
+ * Defaults to current working directory.
183
+ */
184
+ readonly cwd?: string;
185
+ /**
186
+ * Environment variables for the daemon process.
187
+ * Defaults to current environment.
188
+ */
189
+ readonly env?: NodeJS.ProcessEnv;
190
+ /**
191
+ * Path to redirect stdout (optional).
192
+ */
193
+ readonly stdoutPath?: string;
194
+ /**
195
+ * Path to redirect stderr (optional).
196
+ */
197
+ readonly stderrPath?: string;
198
+ }
199
+ /**
200
+ * Default daemon configuration.
201
+ */
202
+ export declare const defaultDaemonConfig: DaemonConfig;
203
+ /**
204
+ * DaemonServiceLive implementation that manages a real daemon process.
205
+ * Uses child_process.spawn with detached:true to fork the daemon.
206
+ */
207
+ export declare const DaemonServiceLive: Layer.Layer<DaemonService, never, never>;
208
+ /**
209
+ * DaemonServiceNoop - no-op implementation for testing.
210
+ * All operations succeed but don't actually manage a process.
211
+ */
212
+ export declare const DaemonServiceNoop: Layer.Layer<DaemonService, never, never>;
213
+ export {};
214
+ //# sourceMappingURL=daemon-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-service.d.ts","sourceRoot":"","sources":["../../src/services/daemon-service.ts"],"names":[],"mappings":"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"}