@jamesaphoenix/tx-core 0.9.0 → 0.10.0

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 (121) hide show
  1. package/README.md +11 -11
  2. package/dist/errors.d.ts +18 -1
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +11 -0
  5. package/dist/errors.js.map +1 -1
  6. package/dist/index.d.ts +5 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal/doc-service-impl.d.ts.map +1 -1
  11. package/dist/internal/doc-service-impl.js +104 -11
  12. package/dist/internal/doc-service-impl.js.map +1 -1
  13. package/dist/internal/sync/service-impl.d.ts +3 -1
  14. package/dist/internal/sync/service-impl.d.ts.map +1 -1
  15. package/dist/internal/sync/service-impl.js +191 -1
  16. package/dist/internal/sync/service-impl.js.map +1 -1
  17. package/dist/layer.d.ts +7 -5
  18. package/dist/layer.d.ts.map +1 -1
  19. package/dist/layer.js +27 -11
  20. package/dist/layer.js.map +1 -1
  21. package/dist/mappers/decision.d.ts +8 -0
  22. package/dist/mappers/decision.d.ts.map +1 -0
  23. package/dist/mappers/decision.js +32 -0
  24. package/dist/mappers/decision.js.map +1 -0
  25. package/dist/mappers/doc.d.ts +4 -2
  26. package/dist/mappers/doc.d.ts.map +1 -1
  27. package/dist/mappers/doc.js +29 -2
  28. package/dist/mappers/doc.js.map +1 -1
  29. package/dist/mappers/process-registry.d.ts +18 -0
  30. package/dist/mappers/process-registry.d.ts.map +1 -0
  31. package/dist/mappers/process-registry.js +32 -0
  32. package/dist/mappers/process-registry.js.map +1 -0
  33. package/dist/migrations-embedded.d.ts.map +1 -1
  34. package/dist/migrations-embedded.js +15 -0
  35. package/dist/migrations-embedded.js.map +1 -1
  36. package/dist/repo/decision-repo.d.ts +58 -0
  37. package/dist/repo/decision-repo.d.ts.map +1 -0
  38. package/dist/repo/decision-repo.js +162 -0
  39. package/dist/repo/decision-repo.js.map +1 -0
  40. package/dist/repo/doc-repo.d.ts.map +1 -1
  41. package/dist/repo/doc-repo.js +14 -3
  42. package/dist/repo/doc-repo.js.map +1 -1
  43. package/dist/repo/doc-repo.types.d.ts +11 -0
  44. package/dist/repo/doc-repo.types.d.ts.map +1 -1
  45. package/dist/repo/index.d.ts +2 -0
  46. package/dist/repo/index.d.ts.map +1 -1
  47. package/dist/repo/index.js +2 -0
  48. package/dist/repo/index.js.map +1 -1
  49. package/dist/repo/process-registry-repo.d.ts +27 -0
  50. package/dist/repo/process-registry-repo.d.ts.map +1 -0
  51. package/dist/repo/process-registry-repo.js +91 -0
  52. package/dist/repo/process-registry-repo.js.map +1 -0
  53. package/dist/schemas/index.d.ts +2 -2
  54. package/dist/schemas/index.d.ts.map +1 -1
  55. package/dist/schemas/index.js +1 -1
  56. package/dist/schemas/index.js.map +1 -1
  57. package/dist/schemas/sync-events.d.ts +2 -2
  58. package/dist/schemas/sync-events.d.ts.map +1 -1
  59. package/dist/schemas/sync-events.js +1 -1
  60. package/dist/schemas/sync-events.js.map +1 -1
  61. package/dist/schemas/sync.d.ts +129 -10
  62. package/dist/schemas/sync.d.ts.map +1 -1
  63. package/dist/schemas/sync.js +49 -2
  64. package/dist/schemas/sync.js.map +1 -1
  65. package/dist/schemas/worker.d.ts +16 -0
  66. package/dist/schemas/worker.d.ts.map +1 -1
  67. package/dist/schemas/worker.js +15 -0
  68. package/dist/schemas/worker.js.map +1 -1
  69. package/dist/services/decision-service.d.ts +41 -0
  70. package/dist/services/decision-service.d.ts.map +1 -0
  71. package/dist/services/decision-service.js +139 -0
  72. package/dist/services/decision-service.js.map +1 -0
  73. package/dist/services/dep-service.d.ts.map +1 -1
  74. package/dist/services/dep-service.js +14 -1
  75. package/dist/services/dep-service.js.map +1 -1
  76. package/dist/services/index.d.ts +3 -1
  77. package/dist/services/index.d.ts.map +1 -1
  78. package/dist/services/index.js +3 -1
  79. package/dist/services/index.js.map +1 -1
  80. package/dist/services/orchestrator-service.d.ts +1 -1
  81. package/dist/services/process-registry-service.d.ts +27 -0
  82. package/dist/services/process-registry-service.d.ts.map +1 -0
  83. package/dist/services/process-registry-service.js +19 -0
  84. package/dist/services/process-registry-service.js.map +1 -0
  85. package/dist/services/ready-service.d.ts +12 -2
  86. package/dist/services/ready-service.d.ts.map +1 -1
  87. package/dist/services/ready-service.js +99 -83
  88. package/dist/services/ready-service.js.map +1 -1
  89. package/dist/services/sync/converters.d.ts +7 -2
  90. package/dist/services/sync/converters.d.ts.map +1 -1
  91. package/dist/services/sync/converters.js +29 -0
  92. package/dist/services/sync/converters.js.map +1 -1
  93. package/dist/services/sync/entity-export.d.ts +2 -1
  94. package/dist/services/sync/entity-export.d.ts.map +1 -1
  95. package/dist/services/sync/entity-export.js +1 -0
  96. package/dist/services/sync/entity-export.js.map +1 -1
  97. package/dist/services/sync/entity-import.d.ts +2 -1
  98. package/dist/services/sync/entity-import.d.ts.map +1 -1
  99. package/dist/services/sync/entity-import.js +1 -0
  100. package/dist/services/sync/entity-import.js.map +1 -1
  101. package/dist/services/task-service.d.ts.map +1 -1
  102. package/dist/services/task-service.js +14 -0
  103. package/dist/services/task-service.js.map +1 -1
  104. package/dist/services/transcript-adapter.d.ts +14 -0
  105. package/dist/services/transcript-adapter.d.ts.map +1 -1
  106. package/dist/services/transcript-adapter.js +113 -1
  107. package/dist/services/transcript-adapter.js.map +1 -1
  108. package/dist/services/worker-process.d.ts +1 -1
  109. package/dist/utils/doc-renderer.d.ts +7 -0
  110. package/dist/utils/doc-renderer.d.ts.map +1 -1
  111. package/dist/utils/doc-renderer.js +45 -0
  112. package/dist/utils/doc-renderer.js.map +1 -1
  113. package/dist/utils/toml-config.d.ts +0 -1
  114. package/dist/utils/toml-config.d.ts.map +1 -1
  115. package/dist/utils/toml-config.js +3 -6
  116. package/dist/utils/toml-config.js.map +1 -1
  117. package/dist/worker/run-worker.d.ts +1 -1
  118. package/migrations/036_unified_invariants.sql +72 -0
  119. package/migrations/037_decisions.sql +35 -0
  120. package/migrations/038_process_registry.sql +26 -0
  121. package/package.json +2 -2
@@ -0,0 +1,139 @@
1
+ /**
2
+ * DecisionService — business logic for decisions as first-class artifacts.
3
+ *
4
+ * Manages the decision lifecycle: capture, review, sync to docs.
5
+ * Part of the spec-driven development triangle.
6
+ */
7
+ import { Context, Effect, Layer } from "effect";
8
+ import { DecisionRepository } from "../repo/decision-repo.js";
9
+ import { DecisionNotFoundError, DecisionAlreadyReviewedError, } from "../errors.js";
10
+ import { createHash } from "node:crypto";
11
+ const computeContentHash = (content) => {
12
+ return createHash("sha256").update(content).digest("hex");
13
+ };
14
+ const generateDecisionId = (contentHash) => {
15
+ return `dec-${contentHash.slice(0, 12)}`;
16
+ };
17
+ export class DecisionService extends Context.Tag("DecisionService")() {
18
+ }
19
+ export const DecisionServiceLive = Layer.effect(DecisionService, Effect.gen(function* () {
20
+ const repo = yield* DecisionRepository;
21
+ return {
22
+ add: (input) => Effect.gen(function* () {
23
+ const contentHash = computeContentHash(input.content);
24
+ // Dedup: check if identical content already exists
25
+ const existing = yield* repo.findByContentHash(contentHash);
26
+ if (existing) {
27
+ return existing;
28
+ }
29
+ const id = generateDecisionId(contentHash);
30
+ return yield* repo.insert({
31
+ id,
32
+ content: input.content,
33
+ question: input.question,
34
+ source: input.source ?? "manual",
35
+ commitSha: input.commitSha,
36
+ runId: input.runId,
37
+ taskId: input.taskId,
38
+ docId: input.docId,
39
+ contentHash,
40
+ });
41
+ }),
42
+ list: (filter) => repo.findAll(filter),
43
+ show: (id) => Effect.gen(function* () {
44
+ const decision = yield* repo.findById(id);
45
+ if (!decision) {
46
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
47
+ }
48
+ return decision;
49
+ }),
50
+ approve: (id, reviewer, note) => Effect.gen(function* () {
51
+ const decision = yield* repo.findById(id);
52
+ if (!decision) {
53
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
54
+ }
55
+ if (decision.status !== "pending") {
56
+ return yield* Effect.fail(new DecisionAlreadyReviewedError({ id, status: decision.status }));
57
+ }
58
+ const result = yield* repo.updateStatus(id, "approved", {
59
+ reviewedBy: reviewer,
60
+ reviewNote: note,
61
+ reviewedAt: new Date().toISOString(),
62
+ });
63
+ if (!result) {
64
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
65
+ }
66
+ return result;
67
+ }),
68
+ reject: (id, reviewer, reason) => Effect.gen(function* () {
69
+ const decision = yield* repo.findById(id);
70
+ if (!decision) {
71
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
72
+ }
73
+ if (decision.status !== "pending") {
74
+ return yield* Effect.fail(new DecisionAlreadyReviewedError({ id, status: decision.status }));
75
+ }
76
+ const result = yield* repo.updateStatus(id, "rejected", {
77
+ reviewedBy: reviewer,
78
+ reviewNote: reason,
79
+ reviewedAt: new Date().toISOString(),
80
+ });
81
+ if (!result) {
82
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
83
+ }
84
+ return result;
85
+ }),
86
+ edit: (id, content, reviewer) => Effect.gen(function* () {
87
+ const decision = yield* repo.findById(id);
88
+ if (!decision) {
89
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
90
+ }
91
+ if (decision.status !== "pending") {
92
+ return yield* Effect.fail(new DecisionAlreadyReviewedError({ id, status: decision.status }));
93
+ }
94
+ const result = yield* repo.updateStatus(id, "edited", {
95
+ editedContent: content,
96
+ reviewedBy: reviewer,
97
+ reviewedAt: new Date().toISOString(),
98
+ });
99
+ if (!result) {
100
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
101
+ }
102
+ return result;
103
+ }),
104
+ supersede: (id, newContent) => Effect.gen(function* () {
105
+ const old = yield* repo.findById(id);
106
+ if (!old) {
107
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
108
+ }
109
+ // Dedup: check if identical content already exists
110
+ const contentHash = computeContentHash(newContent);
111
+ const existing = yield* repo.findByContentHash(contentHash);
112
+ if (existing) {
113
+ // Mark old as superseded pointing to existing
114
+ const superseded = yield* repo.updateStatus(id, "superseded", {
115
+ supersededBy: existing.id,
116
+ });
117
+ if (!superseded) {
118
+ return yield* Effect.fail(new DecisionNotFoundError({ id }));
119
+ }
120
+ return { old: superseded, new: existing };
121
+ }
122
+ // Atomic: insert new + mark old as superseded in one transaction
123
+ const newId = generateDecisionId(contentHash);
124
+ return yield* repo.supersedeAtomic(id, {
125
+ id: newId,
126
+ content: newContent,
127
+ question: old.question,
128
+ source: old.source,
129
+ commitSha: old.commitSha,
130
+ runId: old.runId,
131
+ taskId: old.taskId,
132
+ docId: old.docId,
133
+ contentHash,
134
+ });
135
+ }),
136
+ pending: () => repo.findAll({ status: "pending" }),
137
+ };
138
+ }));
139
+ //# sourceMappingURL=decision-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-service.js","sourceRoot":"","sources":["../../src/services/decision-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dep-service.d.ts","sourceRoot":"","sources":["../../src/services/dep-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAClI,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;;yBAK5B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,aAAa,CAAC;4BACtI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,uBAAuB,CAAC;;AAJ/H,qBAAa,iBAAkB,SAAQ,sBAMpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,8EAwCjC,CAAA"}
1
+ {"version":3,"file":"dep-service.d.ts","sourceRoot":"","sources":["../../src/services/dep-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAClI,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;;yBAK5B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,aAAa,CAAC;4BACtI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,uBAAuB,CAAC;;AAJ/H,qBAAa,iBAAkB,SAAQ,sBAMpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,8EAwDjC,CAAA"}
@@ -7,6 +7,13 @@ export class DependencyService extends Context.Tag("DependencyService")() {
7
7
  export const DependencyServiceLive = Layer.effect(DependencyService, Effect.gen(function* () {
8
8
  const depRepo = yield* DependencyRepository;
9
9
  const taskRepo = yield* TaskRepository;
10
+ const reconcileBlockedStatus = (taskId) => Effect.gen(function* () {
11
+ // Keep stored status consistent with dependency graph for workable states.
12
+ // This prevents status='ready' while effective readiness is false.
13
+ for (const expectedStatus of ["ready", "backlog", "planning", "blocked"]) {
14
+ yield* taskRepo.recoverTaskStatus(taskId, expectedStatus);
15
+ }
16
+ });
10
17
  return {
11
18
  addBlocker: (taskId, blockerId) => Effect.gen(function* () {
12
19
  if (taskId === blockerId) {
@@ -31,8 +38,14 @@ export const DependencyServiceLive = Layer.effect(DependencyService, Effect.gen(
31
38
  if (result._tag === "alreadyExists") {
32
39
  return;
33
40
  }
41
+ // Synchronize persisted status with dependency graph after mutation.
42
+ yield* reconcileBlockedStatus(taskId);
34
43
  }),
35
- removeBlocker: (taskId, blockerId) => depRepo.remove(blockerId, taskId)
44
+ removeBlocker: (taskId, blockerId) => Effect.gen(function* () {
45
+ yield* depRepo.remove(blockerId, taskId);
46
+ // Task may become ready when last blocker is removed.
47
+ yield* reconcileBlockedStatus(taskId);
48
+ })
36
49
  };
37
50
  }));
38
51
  //# sourceMappingURL=dep-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dep-service.js","sourceRoot":"","sources":["../../src/services/dep-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAA0C,MAAM,cAAc,CAAA;AAGlI,MAAM,OAAO,iBAAkB,SAAQ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAMpE;CAAG;AAEN,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAC/C,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAA;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IAEtC,OAAO;QACL,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAChC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAA;YAC1F,CAAC;YAED,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,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YACrE,CAAC;YAED,6EAA6E;YAC7E,4EAA4E;YAC5E,qEAAqE;YACrE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YACrE,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YAC/E,CAAC;YACD,uDAAuD;YACvD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACpC,OAAM;YACR,CAAC;QACH,CAAC,CAAC;QAEJ,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CACnC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;KACpC,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
1
+ {"version":3,"file":"dep-service.js","sourceRoot":"","sources":["../../src/services/dep-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAA0C,MAAM,cAAc,CAAA;AAGlI,MAAM,OAAO,iBAAkB,SAAQ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAMpE;CAAG;AAEN,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAC/C,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAA;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IAEtC,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,2EAA2E;QAC3E,mEAAmE;QACnE,KAAK,MAAM,cAAc,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAU,EAAE,CAAC;YAClF,KAAK,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAChC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAA;YAC1F,CAAC;YAED,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,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YACrE,CAAC;YAED,6EAA6E;YAC7E,4EAA4E;YAC5E,qEAAqE;YACrE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YACrE,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YAC/E,CAAC;YACD,uDAAuD;YACvD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACpC,OAAM;YACR,CAAC;YAED,qEAAqE;YACrE,KAAK,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC,CAAC;QAEJ,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YACxC,sDAAsD;YACtD,KAAK,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC,CAAC;KACL,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
@@ -34,10 +34,11 @@ export { FeedbackTrackerService, FeedbackTrackerServiceNoop, FeedbackTrackerServ
34
34
  export { WorkerService, WorkerServiceLive, type WorkerRegistration, type WorkerFilter, type FindDeadConfig } from "./worker-service.js";
35
35
  export { RunHeartbeatService, RunHeartbeatServiceLive, type RunHeartbeatInput, type StalledRun, type StalledRunQuery, type ReapStalledOptions, type ReapedRun } from "./run-heartbeat-service.js";
36
36
  export { ClaimService, ClaimServiceLive } from "./claim-service.js";
37
+ export { ProcessRegistryService, ProcessRegistryServiceLive } from "./process-registry-service.js";
37
38
  export { OrchestratorService, OrchestratorServiceLive, type OrchestratorConfig } from "./orchestrator-service.js";
38
39
  export { runWorkerProcess, killWithEscalation, SIGKILL_ESCALATION_TIMEOUT_MS, type WorkerProcessConfig } from "./worker-process.js";
39
40
  export { TracingService, TracingServiceLive, TracingServiceNoop, type SpanOptions } from "./tracing-service.js";
40
- export { ClaudeCodeAdapter, GenericJSONLAdapter, getAdapter, registerAdapter, type TranscriptAdapter, type ToolCall, type Message } from "./transcript-adapter.js";
41
+ export { ClaudeCodeAdapter, CodexAdapter, GenericJSONLAdapter, getAdapter, detectAdapter, registerAdapter, type TranscriptAdapter, type ToolCall, type Message } from "./transcript-adapter.js";
41
42
  export { CompactionService, CompactionServiceNoop, CompactionServiceLive, CompactionServiceAuto, type CompactionResult, type CompactionOptions, type CompactionPreview } from "./compaction-service.js";
42
43
  export { ValidationService, ValidationServiceLive, type ValidationSeverity, type ValidationIssue, type CheckResult, type ValidationResult, type ValidateOptions } from "./validation-service.js";
43
44
  export { MessageService, MessageServiceLive } from "./message-service.js";
@@ -50,4 +51,5 @@ export { GuardService, GuardServiceLive, type GuardCheckResult } from "./guard-s
50
51
  export { VerifyService, VerifyServiceLive, type VerifyResult } from "./verify-service.js";
51
52
  export { ReflectService, ReflectServiceLive, type ReflectResult, type ReflectSignal, type StuckTask } from "./reflect-service.js";
52
53
  export { SPEC_BATCH_MAX_BYTES, SPEC_BATCH_MAX_RECORDS, SpecTraceService, SpecTraceServiceLive, parseBatchRunInput, type BatchSource, type BatchRunResult, type SpecTraceStatus, } from "./spec-trace-service.js";
54
+ export { DecisionService, DecisionServiceLive } from "./decision-service.js";
53
55
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
@@ -34,10 +34,11 @@ export { FeedbackTrackerService, FeedbackTrackerServiceNoop, FeedbackTrackerServ
34
34
  export { WorkerService, WorkerServiceLive } from "./worker-service.js";
35
35
  export { RunHeartbeatService, RunHeartbeatServiceLive } from "./run-heartbeat-service.js";
36
36
  export { ClaimService, ClaimServiceLive } from "./claim-service.js";
37
+ export { ProcessRegistryService, ProcessRegistryServiceLive } from "./process-registry-service.js";
37
38
  export { OrchestratorService, OrchestratorServiceLive } from "./orchestrator-service.js";
38
39
  export { runWorkerProcess, killWithEscalation, SIGKILL_ESCALATION_TIMEOUT_MS } from "./worker-process.js";
39
40
  export { TracingService, TracingServiceLive, TracingServiceNoop } from "./tracing-service.js";
40
- export { ClaudeCodeAdapter, GenericJSONLAdapter, getAdapter, registerAdapter } from "./transcript-adapter.js";
41
+ export { ClaudeCodeAdapter, CodexAdapter, GenericJSONLAdapter, getAdapter, detectAdapter, registerAdapter } from "./transcript-adapter.js";
41
42
  export { CompactionService, CompactionServiceNoop, CompactionServiceLive, CompactionServiceAuto } from "./compaction-service.js";
42
43
  export { ValidationService, ValidationServiceLive } from "./validation-service.js";
43
44
  export { MessageService, MessageServiceLive } from "./message-service.js";
@@ -50,4 +51,5 @@ export { GuardService, GuardServiceLive } from "./guard-service.js";
50
51
  export { VerifyService, VerifyServiceLive } from "./verify-service.js";
51
52
  export { ReflectService, ReflectServiceLive } from "./reflect-service.js";
52
53
  export { SPEC_BATCH_MAX_BYTES, SPEC_BATCH_MAX_RECORDS, SpecTraceService, SpecTraceServiceLive, parseBatchRunInput, } from "./spec-trace-service.js";
54
+ export { DecisionService, DecisionServiceLive } from "./decision-service.js";
53
55
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,6 @@ declare const OrchestratorService_base: Context.TagClass<OrchestratorService, "O
48
48
  }>;
49
49
  export declare class OrchestratorService extends OrchestratorService_base {
50
50
  }
51
- export declare const OrchestratorServiceLive: Layer.Layer<OrchestratorService, never, SqliteClient | TaskRepository | ClaimRepository | OrchestratorStateRepository | WorkerService | ClaimService>;
51
+ export declare const OrchestratorServiceLive: Layer.Layer<OrchestratorService, never, SqliteClient | TaskRepository | ClaimRepository | OrchestratorStateRepository | ClaimService | WorkerService>;
52
52
  export {};
53
53
  //# sourceMappingURL=orchestrator-service.d.ts.map
@@ -0,0 +1,27 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import type { DatabaseError, EntityFetchError } from "../errors.js";
3
+ import { ProcessRegistryRepository } from "../repo/process-registry-repo.js";
4
+ import type { ProcessEntry, ProcessRole } from "../schemas/worker.js";
5
+ declare const ProcessRegistryService_base: Context.TagClass<ProcessRegistryService, "ProcessRegistryService", {
6
+ readonly register: (opts: {
7
+ pid: number;
8
+ parentPid: number | null;
9
+ workerId: string | null;
10
+ runId: string | null;
11
+ role: ProcessRole;
12
+ commandHint: string | null;
13
+ }) => Effect.Effect<ProcessEntry, DatabaseError | EntityFetchError>;
14
+ readonly heartbeat: (pid: number) => Effect.Effect<number, DatabaseError>;
15
+ readonly deregister: (pid: number) => Effect.Effect<number, DatabaseError>;
16
+ readonly findAlive: () => Effect.Effect<readonly ProcessEntry[], DatabaseError>;
17
+ readonly findByWorker: (workerId: string) => Effect.Effect<readonly ProcessEntry[], DatabaseError>;
18
+ readonly findByRun: (runId: string) => Effect.Effect<readonly ProcessEntry[], DatabaseError>;
19
+ readonly findByRole: (role: ProcessRole) => Effect.Effect<readonly ProcessEntry[], DatabaseError>;
20
+ readonly findOrphans: (heartbeatThresholdSeconds: number) => Effect.Effect<readonly ProcessEntry[], DatabaseError>;
21
+ readonly deregisterByWorker: (workerId: string) => Effect.Effect<number, DatabaseError>;
22
+ }>;
23
+ export declare class ProcessRegistryService extends ProcessRegistryService_base {
24
+ }
25
+ export declare const ProcessRegistryServiceLive: Layer.Layer<ProcessRegistryService, never, ProcessRegistryRepository>;
26
+ export {};
27
+ //# sourceMappingURL=process-registry-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-registry-service.d.ts","sourceRoot":"","sources":["../../src/services/process-registry-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;;uBAK9C,CAAC,IAAI,EAAE;QACxB,GAAG,EAAE,MAAM,CAAA;QACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,IAAI,EAAE,WAAW,CAAA;QACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAC3B,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,CAAC;wBAE/C,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;yBAEpD,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;wBAEtD,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;2BAExD,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;wBAE9E,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;yBAEvE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;0BAE3E,CAAC,yBAAyB,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;iCAErF,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AA1B3F,qBAAa,sBAAuB,SAAQ,2BA4BzC;CAAG;AAEN,eAAO,MAAM,0BAA0B,uEAyBtC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { ProcessRegistryRepository } from "../repo/process-registry-repo.js";
3
+ export class ProcessRegistryService extends Context.Tag("ProcessRegistryService")() {
4
+ }
5
+ export const ProcessRegistryServiceLive = Layer.effect(ProcessRegistryService, Effect.gen(function* () {
6
+ const repo = yield* ProcessRegistryRepository;
7
+ return {
8
+ register: (opts) => repo.register(opts),
9
+ heartbeat: (pid) => repo.heartbeat(pid),
10
+ deregister: (pid) => repo.deregister(pid),
11
+ findAlive: () => repo.findAlive(),
12
+ findByWorker: (workerId) => repo.findByWorker(workerId),
13
+ findByRun: (runId) => repo.findByRun(runId),
14
+ findByRole: (role) => repo.findByRole(role),
15
+ findOrphans: (heartbeatThresholdSeconds) => repo.findOrphans(heartbeatThresholdSeconds),
16
+ deregisterByWorker: (workerId) => repo.deregisterByWorker(workerId)
17
+ };
18
+ }));
19
+ //# sourceMappingURL=process-registry-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-registry-service.js","sourceRoot":"","sources":["../../src/services/process-registry-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAG5E,MAAM,OAAO,sBAAuB,SAAQ,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EA4B9E;CAAG;AAEN,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC,MAAM,CACpD,sBAAsB,EACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,yBAAyB,CAAA;IAE7C,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEvC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAEvC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAEzC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;QAEjC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAEvD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAE3C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAE3C,WAAW,EAAE,CAAC,yBAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC;QAEvF,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;KACpE,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
@@ -1,7 +1,9 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
- import { DatabaseError } from "../errors.js";
4
+ import { AlreadyClaimedError, DatabaseError, TaskNotFoundError } from "../errors.js";
5
+ import { ClaimService } from "./claim-service.js";
6
+ import type { TaskClaim } from "../schemas/worker.js";
5
7
  import type { Task, TaskId, TaskWithDeps } from "@jamesaphoenix/tx-types";
6
8
  /**
7
9
  * Result of checking whether a task is ready to be worked on.
@@ -23,6 +25,10 @@ export type ReadyCheckResult = {
23
25
  };
24
26
  /** Helper to check if a ReadyCheckResult indicates the task is ready. */
25
27
  export declare const isReadyResult: (result: ReadyCheckResult) => boolean;
28
+ export type ReadyAndClaimResult = {
29
+ readonly task: TaskWithDeps;
30
+ readonly claim: TaskClaim;
31
+ };
26
32
  declare const ReadyService_base: Context.TagClass<ReadyService, "ReadyService", {
27
33
  readonly getReady: (limit?: number, options?: {
28
34
  labels?: string[];
@@ -31,9 +37,13 @@ declare const ReadyService_base: Context.TagClass<ReadyService, "ReadyService",
31
37
  readonly isReady: (id: TaskId) => Effect.Effect<ReadyCheckResult, DatabaseError>;
32
38
  readonly getBlockers: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
33
39
  readonly getBlocking: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
40
+ readonly readyAndClaim: (workerId: string, leaseDurationMinutes?: number, options?: {
41
+ labels?: string[];
42
+ excludeLabels?: string[];
43
+ }) => Effect.Effect<ReadyAndClaimResult | null, DatabaseError | TaskNotFoundError | AlreadyClaimedError>;
34
44
  }>;
35
45
  export declare class ReadyService extends ReadyService_base {
36
46
  }
37
- export declare const ReadyServiceLive: Layer.Layer<ReadyService, never, TaskRepository | DependencyRepository>;
47
+ export declare const ReadyServiceLive: Layer.Layer<ReadyService, never, TaskRepository | DependencyRepository | ClaimService>;
38
48
  export {};
39
49
  //# sourceMappingURL=ready-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEzE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAEpG,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,QAAQ,gBAAgB,KAAG,OAAkC,CAAA;;uBAKpE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;sBACrI,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;0BAC1D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC7D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AANvF,qBAAa,YAAa,SAAQ,iBAQ/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,yEAkJ5B,CAAA"}
1
+ {"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEzE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAEpG,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,QAAQ,gBAAgB,KAAG,OAAkC,CAAA;AAE3F,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAC1B,CAAA;;uBAKsB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;sBACrI,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;0BAC1D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC7D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;4BAC3D,CACtB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,GAAG,IAAI,EAAE,aAAa,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;AAX3G,qBAAa,YAAa,SAAQ,iBAa/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,wFAuK5B,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
+ import { ClaimService } from "./claim-service.js";
4
5
  /** Helper to check if a ReadyCheckResult indicates the task is ready. */
5
6
  export const isReadyResult = (result) => result._tag === "Ready";
6
7
  export class ReadyService extends Context.Tag("ReadyService")() {
@@ -8,98 +9,100 @@ export class ReadyService extends Context.Tag("ReadyService")() {
8
9
  export const ReadyServiceLive = Layer.effect(ReadyService, Effect.gen(function* () {
9
10
  const taskRepo = yield* TaskRepository;
10
11
  const depRepo = yield* DependencyRepository;
11
- return {
12
- getReady: (limit = 100, options) => Effect.gen(function* () {
13
- const safeLimit = Math.max(0, Math.floor(limit));
14
- if (safeLimit === 0) {
15
- return [];
12
+ const claimService = yield* ClaimService;
13
+ const getReadyImpl = (limit = 100, options) => Effect.gen(function* () {
14
+ const safeLimit = Math.max(0, Math.floor(limit));
15
+ if (safeLimit === 0) {
16
+ return [];
17
+ }
18
+ // Page through candidates ordered by score/id to avoid loading the
19
+ // entire backlog when only a small ready set is requested.
20
+ const ready = [];
21
+ let cursor;
22
+ while (ready.length < safeLimit) {
23
+ const remaining = safeLimit - ready.length;
24
+ const pageSize = Math.min(Math.max(remaining * 4, 200), 1000);
25
+ const candidates = yield* taskRepo.findAll({
26
+ status: ["backlog", "ready", "planning"],
27
+ excludeClaimed: true,
28
+ cursor,
29
+ limit: pageSize,
30
+ labels: options?.labels,
31
+ excludeLabels: options?.excludeLabels,
32
+ });
33
+ if (candidates.length === 0) {
34
+ break;
16
35
  }
17
- // Page through candidates ordered by score/id to avoid loading the
18
- // entire backlog when only a small ready set is requested.
19
- const ready = [];
20
- let cursor;
21
- while (ready.length < safeLimit) {
22
- const remaining = safeLimit - ready.length;
23
- const pageSize = Math.min(Math.max(remaining * 4, 200), 1000);
24
- const candidates = yield* taskRepo.findAll({
25
- status: ["backlog", "ready", "planning"],
26
- excludeClaimed: true,
27
- cursor,
28
- limit: pageSize,
29
- labels: options?.labels,
30
- excludeLabels: options?.excludeLabels,
31
- });
32
- if (candidates.length === 0) {
33
- break;
34
- }
35
- const candidateIds = candidates.map(t => t.id);
36
- // Batch dependency lookups for each page.
37
- const blockerIdsMap = yield* depRepo.getBlockerIdsForMany(candidateIds);
38
- const blockingIdsMap = yield* depRepo.getBlockingIdsForMany(candidateIds);
39
- const childIdsMap = yield* taskRepo.getChildIdsForMany(candidateIds);
40
- const allBlockerIds = new Set();
41
- for (const blockerIds of blockerIdsMap.values()) {
42
- for (const id of blockerIds) {
43
- allBlockerIds.add(id);
44
- }
36
+ const candidateIds = candidates.map(t => t.id);
37
+ // Batch dependency lookups for each page.
38
+ const blockerIdsMap = yield* depRepo.getBlockerIdsForMany(candidateIds);
39
+ const blockingIdsMap = yield* depRepo.getBlockingIdsForMany(candidateIds);
40
+ const childIdsMap = yield* taskRepo.getChildIdsForMany(candidateIds);
41
+ const allBlockerIds = new Set();
42
+ for (const blockerIds of blockerIdsMap.values()) {
43
+ for (const id of blockerIds) {
44
+ allBlockerIds.add(id);
45
45
  }
46
- const blockerTasks = allBlockerIds.size > 0
47
- ? yield* taskRepo.findByIds([...allBlockerIds])
48
- : [];
49
- const blockerStatusMap = new Map(blockerTasks.map(t => [t.id, t.status]));
50
- for (const task of candidates) {
51
- const blockerIds = blockerIdsMap.get(task.id) ?? [];
52
- const blockingIds = blockingIdsMap.get(task.id) ?? [];
53
- const childIds = childIdsMap.get(task.id) ?? [];
54
- const allDone = blockerIds.length === 0 ||
55
- blockerIds.every(id => blockerStatusMap.get(id) === "done");
56
- if (allDone) {
57
- ready.push({
58
- ...task,
59
- blockedBy: blockerIds,
60
- blocks: blockingIds,
61
- children: childIds,
62
- isReady: true,
63
- groupContext: null,
64
- effectiveGroupContext: null,
65
- effectiveGroupContextSourceTaskId: null
66
- });
67
- }
68
- }
69
- const lastCandidate = candidates[candidates.length - 1];
70
- if (!lastCandidate) {
71
- break;
72
- }
73
- cursor = { score: lastCandidate.score, id: lastCandidate.id };
74
- if (candidates.length < pageSize) {
75
- break;
46
+ }
47
+ const blockerTasks = allBlockerIds.size > 0
48
+ ? yield* taskRepo.findByIds([...allBlockerIds])
49
+ : [];
50
+ const blockerStatusMap = new Map(blockerTasks.map(t => [t.id, t.status]));
51
+ for (const task of candidates) {
52
+ const blockerIds = blockerIdsMap.get(task.id) ?? [];
53
+ const blockingIds = blockingIdsMap.get(task.id) ?? [];
54
+ const childIds = childIdsMap.get(task.id) ?? [];
55
+ const allDone = blockerIds.length === 0 ||
56
+ blockerIds.every(id => blockerStatusMap.get(id) === "done");
57
+ if (allDone) {
58
+ ready.push({
59
+ ...task,
60
+ blockedBy: blockerIds,
61
+ blocks: blockingIds,
62
+ children: childIds,
63
+ isReady: true,
64
+ groupContext: null,
65
+ effectiveGroupContext: null,
66
+ effectiveGroupContextSourceTaskId: null
67
+ });
76
68
  }
77
69
  }
78
- ready.sort((a, b) => b.score - a.score);
79
- const limited = ready.slice(0, safeLimit);
80
- if (limited.length === 0) {
81
- return limited;
70
+ const lastCandidate = candidates[candidates.length - 1];
71
+ if (!lastCandidate) {
72
+ break;
82
73
  }
83
- // Resolve context only for the final response set to avoid expensive
84
- // graph traversal across the full candidate backlog.
85
- const limitedIds = limited.map(task => task.id);
86
- const directContextMap = yield* taskRepo.getGroupContextForMany(limitedIds);
87
- const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany(limitedIds);
88
- return limited.map((task) => {
89
- const effective = effectiveContextMap.get(task.id);
90
- return {
91
- ...task,
92
- groupContext: directContextMap.get(task.id) ?? null,
93
- effectiveGroupContext: effective?.context ?? null,
94
- effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
95
- };
96
- });
97
- }),
74
+ cursor = { score: lastCandidate.score, id: lastCandidate.id };
75
+ if (candidates.length < pageSize) {
76
+ break;
77
+ }
78
+ }
79
+ ready.sort((a, b) => b.score - a.score);
80
+ const limited = ready.slice(0, safeLimit);
81
+ if (limited.length === 0) {
82
+ return limited;
83
+ }
84
+ // Resolve context only for the final response set to avoid expensive
85
+ // graph traversal across the full candidate backlog.
86
+ const limitedIds = limited.map(task => task.id);
87
+ const directContextMap = yield* taskRepo.getGroupContextForMany(limitedIds);
88
+ const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany(limitedIds);
89
+ return limited.map((task) => {
90
+ const effective = effectiveContextMap.get(task.id);
91
+ return {
92
+ ...task,
93
+ groupContext: directContextMap.get(task.id) ?? null,
94
+ effectiveGroupContext: effective?.context ?? null,
95
+ effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
96
+ };
97
+ });
98
+ });
99
+ return {
100
+ getReady: getReadyImpl,
98
101
  isReady: (id) => Effect.gen(function* () {
99
102
  const task = yield* taskRepo.findById(id);
100
103
  if (!task)
101
104
  return { _tag: "TaskNotFound", id };
102
- if (!["backlog", "ready", "planning", "active"].includes(task.status)) {
105
+ if (!["backlog", "ready", "planning", "active", "blocked"].includes(task.status)) {
103
106
  return { _tag: "WrongStatus", id, status: task.status };
104
107
  }
105
108
  const blockerIds = yield* depRepo.getBlockerIds(id);
@@ -124,6 +127,19 @@ export const ReadyServiceLive = Layer.effect(ReadyService, Effect.gen(function*
124
127
  if (blockingIds.length === 0)
125
128
  return [];
126
129
  return yield* taskRepo.findByIds(blockingIds);
130
+ }),
131
+ readyAndClaim: (workerId, leaseDurationMinutes, options) => Effect.gen(function* () {
132
+ // Fetch a small batch of candidates to try claiming
133
+ const candidates = yield* getReadyImpl(5, options);
134
+ if (candidates.length === 0)
135
+ return null;
136
+ // Try to claim each candidate in priority order
137
+ for (const task of candidates) {
138
+ const claimResult = yield* claimService.claim(task.id, workerId, leaseDurationMinutes).pipe(Effect.map((claim) => ({ task, claim })), Effect.catchTag("AlreadyClaimedError", () => Effect.succeed(null)), Effect.catchTag("TaskNotFoundError", () => Effect.succeed(null)));
139
+ if (claimResult !== null)
140
+ return claimResult;
141
+ }
142
+ return null;
127
143
  })
128
144
  };
129
145
  }));