ralph-research 0.1.0 → 0.1.2

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 (90) hide show
  1. package/README.md +69 -0
  2. package/dist/adapters/extractor/command-extractor.js +46 -4
  3. package/dist/adapters/extractor/command-extractor.js.map +1 -1
  4. package/dist/adapters/fs/json-file-frontier-store.js +4 -2
  5. package/dist/adapters/fs/json-file-frontier-store.js.map +1 -1
  6. package/dist/adapters/fs/lockfile.d.ts +21 -1
  7. package/dist/adapters/fs/lockfile.js +65 -11
  8. package/dist/adapters/fs/lockfile.js.map +1 -1
  9. package/dist/adapters/fs/manifest-loader.d.ts +5 -1
  10. package/dist/adapters/fs/manifest-loader.js +15 -2
  11. package/dist/adapters/fs/manifest-loader.js.map +1 -1
  12. package/dist/adapters/git/git-client.d.ts +2 -0
  13. package/dist/adapters/git/git-client.js +19 -0
  14. package/dist/adapters/git/git-client.js.map +1 -1
  15. package/dist/app/services/manual-decision-service.js +76 -25
  16. package/dist/app/services/manual-decision-service.js.map +1 -1
  17. package/dist/app/services/project-state-service.d.ts +26 -1
  18. package/dist/app/services/project-state-service.js +172 -14
  19. package/dist/app/services/project-state-service.js.map +1 -1
  20. package/dist/app/services/run-admission-service.d.ts +20 -0
  21. package/dist/app/services/run-admission-service.js +30 -0
  22. package/dist/app/services/run-admission-service.js.map +1 -0
  23. package/dist/app/services/run-cycle-service.d.ts +5 -4
  24. package/dist/app/services/run-cycle-service.js +175 -14
  25. package/dist/app/services/run-cycle-service.js.map +1 -1
  26. package/dist/app/services/run-loop-service.d.ts +21 -0
  27. package/dist/app/services/run-loop-service.js +155 -0
  28. package/dist/app/services/run-loop-service.js.map +1 -0
  29. package/dist/cli/commands/demo.js +1 -0
  30. package/dist/cli/commands/demo.js.map +1 -1
  31. package/dist/cli/commands/doctor.d.ts +8 -0
  32. package/dist/cli/commands/doctor.js +59 -0
  33. package/dist/cli/commands/doctor.js.map +1 -0
  34. package/dist/cli/commands/init.js +1 -0
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/inspect.js +4 -0
  37. package/dist/cli/commands/inspect.js.map +1 -1
  38. package/dist/cli/commands/run.d.ts +3 -1
  39. package/dist/cli/commands/run.js +31 -28
  40. package/dist/cli/commands/run.js.map +1 -1
  41. package/dist/cli/commands/status.js +35 -4
  42. package/dist/cli/commands/status.js.map +1 -1
  43. package/dist/cli/commands/validate.js +21 -18
  44. package/dist/cli/commands/validate.js.map +1 -1
  45. package/dist/cli/main.js +3 -10
  46. package/dist/cli/main.js.map +1 -1
  47. package/dist/core/engine/cycle-runner.d.ts +2 -0
  48. package/dist/core/engine/cycle-runner.js +504 -34
  49. package/dist/core/engine/cycle-runner.js.map +1 -1
  50. package/dist/core/engine/promotion-artifact.d.ts +23 -0
  51. package/dist/core/engine/promotion-artifact.js +58 -0
  52. package/dist/core/engine/promotion-artifact.js.map +1 -0
  53. package/dist/core/engine/workspace-manager.d.ts +10 -1
  54. package/dist/core/engine/workspace-manager.js +70 -3
  55. package/dist/core/engine/workspace-manager.js.map +1 -1
  56. package/dist/core/manifest/admission.d.ts +16 -0
  57. package/dist/core/manifest/admission.js +64 -0
  58. package/dist/core/manifest/admission.js.map +1 -0
  59. package/dist/core/manifest/schema.d.ts +47 -0
  60. package/dist/core/manifest/schema.js +18 -1
  61. package/dist/core/manifest/schema.js.map +1 -1
  62. package/dist/core/model/decision-record.d.ts +4 -0
  63. package/dist/core/model/decision-record.js +6 -0
  64. package/dist/core/model/decision-record.js.map +1 -1
  65. package/dist/core/model/metric-diagnostics.d.ts +7 -0
  66. package/dist/core/model/metric-diagnostics.js +51 -0
  67. package/dist/core/model/metric-diagnostics.js.map +1 -0
  68. package/dist/core/model/run-record.d.ts +6 -0
  69. package/dist/core/model/run-record.js +4 -0
  70. package/dist/core/model/run-record.js.map +1 -1
  71. package/dist/core/state/frontier-materializer.d.ts +12 -0
  72. package/dist/core/state/frontier-materializer.js +74 -0
  73. package/dist/core/state/frontier-materializer.js.map +1 -0
  74. package/dist/core/state/frontier-semantics.d.ts +12 -0
  75. package/dist/core/state/frontier-semantics.js +26 -0
  76. package/dist/core/state/frontier-semantics.js.map +1 -0
  77. package/dist/core/state/ratchet-engine.js +29 -21
  78. package/dist/core/state/ratchet-engine.js.map +1 -1
  79. package/dist/core/state/recovery-classifier.d.ts +17 -0
  80. package/dist/core/state/recovery-classifier.js +150 -0
  81. package/dist/core/state/recovery-classifier.js.map +1 -0
  82. package/dist/core/state/run-state-machine.js +33 -23
  83. package/dist/core/state/run-state-machine.js.map +1 -1
  84. package/dist/core/state/stopping-target.d.ts +14 -0
  85. package/dist/core/state/stopping-target.js +67 -0
  86. package/dist/core/state/stopping-target.js.map +1 -0
  87. package/dist/mcp/server.js +17 -23
  88. package/dist/mcp/server.js.map +1 -1
  89. package/package.json +2 -2
  90. package/templates/writing/ralph.yaml +7 -0
@@ -7,8 +7,11 @@ import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
7
7
  import { GitClient } from "../../adapters/git/git-client.js";
8
8
  import { DEFAULT_STORAGE_ROOT } from "../../core/manifest/defaults.js";
9
9
  import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
10
+ import { ensurePromotionArtifact, requirePromotionPatch, requirePromotionPaths } from "../../core/engine/promotion-artifact.js";
10
11
  import { advanceRunPhase } from "../../core/state/run-state-machine.js";
11
12
  import { GitWorktreeWorkspaceManager } from "../../core/engine/workspace-manager.js";
13
+ import { attachCommitShaToFrontierEntries, buildAcceptedFrontierEntry, updateAcceptedFrontier, } from "../../core/state/frontier-semantics.js";
14
+ import { materializeFrontier } from "../../core/state/frontier-materializer.js";
12
15
  export class ManualDecisionService {
13
16
  async accept(input) {
14
17
  const repoRoot = resolve(input.repoRoot);
@@ -25,31 +28,75 @@ export class ManualDecisionService {
25
28
  const gitClient = new GitClient(repoRoot);
26
29
  const run = await requirePendingHumanRun(runStore, input.runId);
27
30
  const decision = await requireDecision(decisionStore, run);
28
- const promoted = await workspaceManager.promoteWorkspace(run.candidateId, {
29
- excludePaths: manifest.experiment.outputs.map((output) => output.path),
31
+ const runs = await runStore.list();
32
+ const decisions = await decisionStore.list();
33
+ const currentFrontier = await materializeFrontier({
34
+ manifest,
35
+ frontierStore,
36
+ runs,
37
+ decisions,
30
38
  });
31
- const commitResult = await gitClient.stageAndCommitPaths([...promoted.copiedPaths, ...promoted.deletedPaths], `rrx: accept ${run.runId}`);
32
- const acceptedDecision = {
39
+ const decisionCreatedAt = new Date().toISOString();
40
+ const runDir = join(storageRoot, "runs", run.runId);
41
+ const promotion = await ensurePromotionArtifact({
42
+ run,
43
+ runDir,
44
+ manifest,
45
+ workspaceManager,
46
+ });
47
+ let updatedRun = {
48
+ ...run,
49
+ proposal: {
50
+ ...run.proposal,
51
+ patchPath: promotion.patchPath,
52
+ changedPaths: promotion.changedPaths,
53
+ filesChanged: promotion.changedPaths.length,
54
+ },
55
+ };
56
+ const candidateFrontierEntry = buildAcceptedFrontierEntry({
57
+ runId: updatedRun.runId,
58
+ candidateId: updatedRun.candidateId,
59
+ acceptedAt: decisionCreatedAt,
60
+ metrics: updatedRun.metrics,
61
+ artifacts: updatedRun.artifacts,
62
+ });
63
+ const frontierUpdate = updateAcceptedFrontier(manifest, currentFrontier, candidateFrontierEntry);
64
+ let acceptedDecision = {
33
65
  ...decision,
34
66
  outcome: "accepted",
35
67
  actorType: "human",
36
68
  ...(input.by ? { actorId: input.by } : {}),
37
69
  reason: appendHumanDecisionReason(decision.reason, "accepted", input),
38
- frontierChanged: true,
39
- afterFrontierIds: [`frontier-${run.runId}`],
70
+ createdAt: decisionCreatedAt,
71
+ frontierChanged: frontierUpdate.comparison.frontierChanged,
72
+ beforeFrontierIds: currentFrontier.map((entry) => entry.frontierId),
73
+ afterFrontierIds: frontierUpdate.entries.map((entry) => entry.frontierId),
74
+ };
75
+ await decisionStore.put(acceptedDecision);
76
+ updatedRun = advanceRunPhase(updatedRun, "decision_written", {
77
+ status: "accepted",
78
+ decisionId: acceptedDecision.decisionId,
79
+ });
80
+ await runStore.put(updatedRun);
81
+ await gitClient.applyPatchIfNeeded(requirePromotionPatch(updatedRun));
82
+ const commitResult = await gitClient.stageAndCommitPaths(requirePromotionPaths(updatedRun), `rrx: accept ${updatedRun.runId}`);
83
+ acceptedDecision = {
84
+ ...acceptedDecision,
40
85
  commitSha: commitResult.commitSha,
41
86
  };
42
87
  await decisionStore.put(acceptedDecision);
43
- const acceptedFrontier = [
44
- buildManualFrontierEntry(run, commitResult.commitSha),
45
- ];
88
+ const acceptedFrontier = attachCommitShaToFrontierEntries(frontierUpdate.entries, updatedRun.runId, commitResult.commitSha);
89
+ updatedRun = advanceRunPhase(updatedRun, "committed");
90
+ await runStore.put(updatedRun);
46
91
  await frontierStore.save(acceptedFrontier);
47
- const updatedRun = advanceRunPhase(run, "completed", {
92
+ updatedRun = advanceRunPhase(updatedRun, "frontier_updated");
93
+ await runStore.put(updatedRun);
94
+ await workspaceManager.cleanupWorkspace(updatedRun.candidateId);
95
+ updatedRun = advanceRunPhase(updatedRun, "completed", {
48
96
  status: "accepted",
49
97
  decisionId: acceptedDecision.decisionId,
50
98
  });
51
99
  await runStore.put(updatedRun);
52
- await workspaceManager.cleanupWorkspace(run.candidateId);
53
100
  return {
54
101
  status: "accepted",
55
102
  run: updatedRun,
@@ -75,23 +122,38 @@ export class ManualDecisionService {
75
122
  const workspaceManager = new GitWorktreeWorkspaceManager(repoRoot, storageRoot);
76
123
  const run = await requirePendingHumanRun(runStore, input.runId);
77
124
  const decision = await requireDecision(decisionStore, run);
78
- const currentFrontier = await frontierStore.load();
125
+ const runs = await runStore.list();
126
+ const decisions = await decisionStore.list();
127
+ const currentFrontier = await materializeFrontier({
128
+ manifest,
129
+ frontierStore,
130
+ runs,
131
+ decisions,
132
+ });
133
+ const decisionCreatedAt = new Date().toISOString();
79
134
  const rejectedDecision = {
80
135
  ...decision,
81
136
  outcome: "rejected",
82
137
  actorType: "human",
83
138
  ...(input.by ? { actorId: input.by } : {}),
84
139
  reason: appendHumanDecisionReason(decision.reason, "rejected", input),
140
+ createdAt: decisionCreatedAt,
85
141
  frontierChanged: false,
142
+ beforeFrontierIds: currentFrontier.map((entry) => entry.frontierId),
86
143
  afterFrontierIds: currentFrontier.map((entry) => entry.frontierId),
87
144
  };
88
145
  await decisionStore.put(rejectedDecision);
89
- const updatedRun = advanceRunPhase(run, "completed", {
146
+ let updatedRun = advanceRunPhase(run, "decision_written", {
147
+ status: "rejected",
148
+ decisionId: rejectedDecision.decisionId,
149
+ });
150
+ await runStore.put(updatedRun);
151
+ await workspaceManager.cleanupWorkspace(updatedRun.candidateId);
152
+ updatedRun = advanceRunPhase(updatedRun, "completed", {
90
153
  status: "rejected",
91
154
  decisionId: rejectedDecision.decisionId,
92
155
  });
93
156
  await runStore.put(updatedRun);
94
- await workspaceManager.cleanupWorkspace(run.candidateId);
95
157
  return {
96
158
  status: "rejected",
97
159
  run: updatedRun,
@@ -129,15 +191,4 @@ function appendHumanDecisionReason(existingReason, outcome, input) {
129
191
  const note = input.note ? `; note=${input.note}` : "";
130
192
  return `${existingReason}; human ${outcome}${by}${note}`;
131
193
  }
132
- function buildManualFrontierEntry(run, commitSha) {
133
- return {
134
- frontierId: `frontier-${run.runId}`,
135
- runId: run.runId,
136
- candidateId: run.candidateId,
137
- acceptedAt: new Date().toISOString(),
138
- commitSha,
139
- metrics: run.metrics,
140
- artifacts: run.artifacts,
141
- };
142
- }
143
194
  //# sourceMappingURL=manual-decision-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manual-decision-service.js","sourceRoot":"","sources":["../../../src/app/services/manual-decision-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manual-decision-service.js","sourceRoot":"","sources":["../../../src/app/services/manual-decision-service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { DecisionRecord } from "../../core/model/decision-record.js";
2
2
  import type { FrontierEntry } from "../../core/model/frontier-entry.js";
3
- import type { RunRecord } from "../../core/model/run-record.js";
3
+ import type { PendingAction, RunRecord } from "../../core/model/run-record.js";
4
+ import { type RecoveryStatus } from "../../core/state/recovery-classifier.js";
4
5
  export interface ProjectStateInput {
5
6
  repoRoot: string;
6
7
  manifestPath?: string;
@@ -8,14 +9,32 @@ export interface ProjectStateInput {
8
9
  export interface ProjectStatus {
9
10
  manifestPath: string;
10
11
  latestRun: RunRecord | null;
12
+ recovery: RecoveryStatus;
13
+ runtime: ProjectRuntimeStatus;
11
14
  frontier: FrontierEntry[];
12
15
  pendingHumanRuns: RunRecord[];
13
16
  decisions: DecisionRecord[];
14
17
  }
18
+ export type RuntimeState = "idle" | "running" | "stale" | "stopped";
19
+ export interface ProjectRuntimeStatus {
20
+ state: RuntimeState;
21
+ processAlive: boolean;
22
+ stale: boolean;
23
+ resumable: boolean;
24
+ reason: string;
25
+ lockPath: string;
26
+ pid?: number;
27
+ lastHeartbeatAt?: string;
28
+ heartbeatAgeMs?: number;
29
+ currentStep: PendingAction;
30
+ currentStepStartedAt?: string;
31
+ lastProgressAt?: string;
32
+ }
15
33
  export interface InspectRunResult {
16
34
  manifestPath: string;
17
35
  run: RunRecord;
18
36
  decision: DecisionRecord | null;
37
+ recovery: RecoveryStatus;
19
38
  frontier: FrontierEntry[];
20
39
  explainability: {
21
40
  decisionReason: string | null;
@@ -30,6 +49,12 @@ export interface InspectRunResult {
30
49
  delta?: number;
31
50
  confidence?: number;
32
51
  direction: "maximize" | "minimize";
52
+ sourceMetricId?: string;
53
+ }>;
54
+ metricDiagnostics: Array<{
55
+ metricId: string;
56
+ sourceMetricId?: string;
57
+ reasons: string[];
33
58
  }>;
34
59
  diffSummary: {
35
60
  filesChanged?: number;
@@ -2,8 +2,13 @@ import { join, resolve } from "node:path";
2
2
  import { JsonFileDecisionStore } from "../../adapters/fs/json-file-decision-store.js";
3
3
  import { JsonFileFrontierStore } from "../../adapters/fs/json-file-frontier-store.js";
4
4
  import { JsonFileRunStore } from "../../adapters/fs/json-file-run-store.js";
5
+ import { inspectLock } from "../../adapters/fs/lockfile.js";
5
6
  import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
7
+ import { DEFAULT_STORAGE_ROOT } from "../../core/manifest/defaults.js";
6
8
  import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
9
+ import { summarizeMetricDiagnostics } from "../../core/model/metric-diagnostics.js";
10
+ import { materializeFrontier } from "../../core/state/frontier-materializer.js";
11
+ import { classifyRecovery, derivePendingAction } from "../../core/state/recovery-classifier.js";
7
12
  export class RunNotFoundError extends Error {
8
13
  constructor(runId) {
9
14
  super(`Run ${runId} was not found`);
@@ -11,33 +16,69 @@ export class RunNotFoundError extends Error {
11
16
  }
12
17
  }
13
18
  export async function getProjectStatus(input) {
14
- const { manifestPath, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
19
+ const { manifestPath, manifest, runStore, decisionStore, frontierStore, lockPath } = await loadProjectStores(input);
15
20
  const runs = await runStore.list();
16
21
  const decisions = await decisionStore.list();
17
- const frontier = await frontierStore.load();
22
+ const frontier = await materializeFrontier({
23
+ manifest,
24
+ frontierStore,
25
+ runs,
26
+ decisions,
27
+ });
28
+ const latestRun = runs.at(-1) ?? null;
29
+ const latestDecision = latestRun?.decisionId
30
+ ? decisions.find((decision) => decision.decisionId === latestRun.decisionId) ?? await decisionStore.get(latestRun.decisionId)
31
+ : null;
32
+ const recovery = classifyRecovery({
33
+ latestRun,
34
+ decision: latestDecision,
35
+ frontier,
36
+ });
37
+ const lockRuntime = await inspectLock(lockPath);
18
38
  return {
19
39
  manifestPath,
20
- latestRun: runs.at(-1) ?? null,
40
+ latestRun,
41
+ recovery,
42
+ runtime: describeRuntime({
43
+ latestRun,
44
+ recovery,
45
+ lockPath,
46
+ lockRuntime,
47
+ }),
21
48
  frontier,
22
49
  pendingHumanRuns: runs.filter((run) => run.status === "needs_human"),
23
50
  decisions,
24
51
  };
25
52
  }
26
53
  export async function getProjectFrontier(input) {
27
- const { manifestPath, frontierStore } = await loadProjectStores(input);
54
+ const { manifestPath, manifest, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
55
+ const runs = await runStore.list();
56
+ const decisions = await decisionStore.list();
28
57
  return {
29
58
  manifestPath,
30
- frontier: await frontierStore.load(),
59
+ frontier: await materializeFrontier({
60
+ manifest,
61
+ frontierStore,
62
+ runs,
63
+ decisions,
64
+ }),
31
65
  };
32
66
  }
33
67
  export async function inspectRun(input) {
34
- const { manifestPath, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
68
+ const { manifestPath, manifest, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
69
+ const runs = await runStore.list();
70
+ const decisions = await decisionStore.list();
35
71
  const run = await runStore.get(input.runId);
36
72
  if (!run) {
37
73
  throw new RunNotFoundError(input.runId);
38
74
  }
39
75
  const decision = run.decisionId ? await decisionStore.get(run.decisionId) : null;
40
- const frontier = await frontierStore.load();
76
+ const frontier = await materializeFrontier({
77
+ manifest,
78
+ frontierStore,
79
+ runs,
80
+ decisions,
81
+ });
41
82
  const judgeRationales = Object.values(run.metrics)
42
83
  .flatMap((metric) => {
43
84
  const rationale = typeof metric.details.rationale === "string" ? metric.details.rationale : null;
@@ -52,22 +93,45 @@ export async function inspectRun(input) {
52
93
  },
53
94
  ];
54
95
  });
55
- const metricDeltas = Object.values(run.metrics).map((metric) => ({
56
- metricId: metric.metricId,
57
- value: metric.value,
58
- direction: metric.direction,
59
- ...(metric.confidence === undefined ? {} : { confidence: metric.confidence }),
60
- ...(decision?.metricId === metric.metricId && decision.delta !== undefined ? { delta: decision.delta } : {}),
61
- }));
96
+ const metricDeltas = Object.values(run.metrics).map((metric) => {
97
+ const diagnostics = summarizeMetricDiagnostics(metric);
98
+ return {
99
+ metricId: metric.metricId,
100
+ value: metric.value,
101
+ direction: metric.direction,
102
+ ...(metric.confidence === undefined ? {} : { confidence: metric.confidence }),
103
+ ...(diagnostics?.sourceMetricId ? { sourceMetricId: diagnostics.sourceMetricId } : {}),
104
+ ...(decision?.metricId === metric.metricId && decision.delta !== undefined ? { delta: decision.delta } : {}),
105
+ };
106
+ });
107
+ const metricDiagnostics = Object.values(run.metrics)
108
+ .map((metric) => {
109
+ const diagnostics = summarizeMetricDiagnostics(metric);
110
+ if (!diagnostics) {
111
+ return null;
112
+ }
113
+ return {
114
+ metricId: metric.metricId,
115
+ reasons: diagnostics.reasons,
116
+ ...(diagnostics.sourceMetricId ? { sourceMetricId: diagnostics.sourceMetricId } : {}),
117
+ };
118
+ })
119
+ .filter((entry) => entry !== null);
62
120
  return {
63
121
  manifestPath,
64
122
  run,
65
123
  decision,
124
+ recovery: classifyRecovery({
125
+ latestRun: run,
126
+ decision,
127
+ frontier,
128
+ }),
66
129
  frontier,
67
130
  explainability: {
68
131
  decisionReason: decision?.reason ?? null,
69
132
  judgeRationales,
70
133
  metricDeltas,
134
+ metricDiagnostics,
71
135
  diffSummary: {
72
136
  ...(run.proposal.filesChanged === undefined ? {} : { filesChanged: run.proposal.filesChanged }),
73
137
  ...(run.proposal.diffLines === undefined ? {} : { lineDelta: run.proposal.diffLines }),
@@ -84,9 +148,103 @@ async function loadProjectStores(input) {
84
148
  const storageRoot = join(repoRoot, loadedManifest.manifest.storage.root);
85
149
  return {
86
150
  manifestPath: loadedManifest.path,
151
+ manifest: loadedManifest.manifest,
152
+ lockPath: join(repoRoot, DEFAULT_STORAGE_ROOT, "lock"),
87
153
  runStore: new JsonFileRunStore(join(storageRoot, "runs")),
88
154
  decisionStore: new JsonFileDecisionStore(join(storageRoot, "decisions")),
89
155
  frontierStore: new JsonFileFrontierStore(join(storageRoot, "frontier.json")),
90
156
  };
91
157
  }
158
+ function describeRuntime(input) {
159
+ const currentStep = getCurrentStep(input.latestRun);
160
+ const lastProgressAt = input.latestRun
161
+ ? input.latestRun.updatedAt ?? input.latestRun.endedAt ?? input.latestRun.startedAt
162
+ : undefined;
163
+ const currentStepStartedAt = input.latestRun
164
+ ? input.latestRun.currentStepStartedAt ?? input.latestRun.updatedAt ?? input.latestRun.startedAt
165
+ : undefined;
166
+ const processAlive = input.lockRuntime?.processAlive ?? false;
167
+ const stale = input.lockRuntime?.stale ?? false;
168
+ const runCycleLock = input.lockRuntime
169
+ ? (input.lockRuntime.metadata.owner?.operation ?? "run-cycle") === "run-cycle"
170
+ : false;
171
+ if (input.recovery.classification === "resumable") {
172
+ if (processAlive && !stale && runCycleLock) {
173
+ return {
174
+ state: "running",
175
+ processAlive,
176
+ stale: false,
177
+ resumable: true,
178
+ reason: "live run-cycle heartbeat present",
179
+ lockPath: input.lockPath,
180
+ currentStep,
181
+ ...(input.lockRuntime ? buildLockDetails(input.lockRuntime) : {}),
182
+ ...(currentStepStartedAt ? { currentStepStartedAt } : {}),
183
+ ...(lastProgressAt ? { lastProgressAt } : {}),
184
+ };
185
+ }
186
+ return {
187
+ state: "stale",
188
+ processAlive,
189
+ stale: true,
190
+ resumable: true,
191
+ reason: "latest run is resumable but no live run-cycle heartbeat is present",
192
+ lockPath: input.lockPath,
193
+ currentStep,
194
+ ...(input.lockRuntime ? buildLockDetails(input.lockRuntime) : {}),
195
+ ...(currentStepStartedAt ? { currentStepStartedAt } : {}),
196
+ ...(lastProgressAt ? { lastProgressAt } : {}),
197
+ };
198
+ }
199
+ if (input.recovery.classification === "manual_review_blocked") {
200
+ return {
201
+ state: "stopped",
202
+ processAlive,
203
+ stale,
204
+ resumable: false,
205
+ reason: "manual review blocked",
206
+ lockPath: input.lockPath,
207
+ currentStep: "none",
208
+ ...(input.lockRuntime ? buildLockDetails(input.lockRuntime) : {}),
209
+ ...(lastProgressAt ? { lastProgressAt } : {}),
210
+ };
211
+ }
212
+ if (input.recovery.classification === "repair_required") {
213
+ return {
214
+ state: "stopped",
215
+ processAlive,
216
+ stale,
217
+ resumable: false,
218
+ reason: "repair required",
219
+ lockPath: input.lockPath,
220
+ currentStep: "none",
221
+ ...(input.lockRuntime ? buildLockDetails(input.lockRuntime) : {}),
222
+ ...(lastProgressAt ? { lastProgressAt } : {}),
223
+ };
224
+ }
225
+ return {
226
+ state: "idle",
227
+ processAlive,
228
+ stale,
229
+ resumable: false,
230
+ reason: "no live run is expected",
231
+ lockPath: input.lockPath,
232
+ currentStep: "none",
233
+ ...(input.lockRuntime ? buildLockDetails(input.lockRuntime) : {}),
234
+ ...(lastProgressAt ? { lastProgressAt } : {}),
235
+ };
236
+ }
237
+ function getCurrentStep(run) {
238
+ if (!run) {
239
+ return "none";
240
+ }
241
+ return run.pendingAction !== "none" ? run.pendingAction : derivePendingAction(run);
242
+ }
243
+ function buildLockDetails(lockRuntime) {
244
+ return {
245
+ pid: lockRuntime.metadata.pid,
246
+ lastHeartbeatAt: lockRuntime.metadata.updatedAt,
247
+ heartbeatAgeMs: lockRuntime.heartbeatAgeMs,
248
+ };
249
+ }
92
250
  //# sourceMappingURL=project-state-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-state-service.js","sourceRoot":"","sources":["../../../src/app/services/project-state-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-state-service.js","sourceRoot":"","sources":["../../../src/app/services/project-state-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface RunAdmissionInput {
2
+ repoRoot: string;
3
+ manifestPath?: string;
4
+ }
5
+ export interface RunAdmissionSuccess {
6
+ ok: true;
7
+ executable: true;
8
+ path: string;
9
+ project: string;
10
+ schemaVersion: string;
11
+ }
12
+ export interface RunAdmissionFailure {
13
+ ok: false;
14
+ executable: false;
15
+ path: string;
16
+ error: string;
17
+ details?: unknown;
18
+ }
19
+ export type RunAdmissionResult = RunAdmissionSuccess | RunAdmissionFailure;
20
+ export declare function getRunAdmission(input: RunAdmissionInput): Promise<RunAdmissionResult>;
@@ -0,0 +1,30 @@
1
+ import { resolve } from "node:path";
2
+ import { loadManifestFromFile, ManifestLoadError } from "../../adapters/fs/manifest-loader.js";
3
+ import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
4
+ export async function getRunAdmission(input) {
5
+ const repoRoot = resolve(input.repoRoot);
6
+ const manifestPath = resolve(repoRoot, input.manifestPath ?? DEFAULT_MANIFEST_FILENAME);
7
+ try {
8
+ const loadedManifest = await loadManifestFromFile(manifestPath, { repoRoot });
9
+ return {
10
+ ok: true,
11
+ executable: true,
12
+ path: loadedManifest.path,
13
+ project: loadedManifest.manifest.project.name,
14
+ schemaVersion: loadedManifest.manifest.schemaVersion,
15
+ };
16
+ }
17
+ catch (error) {
18
+ if (error instanceof ManifestLoadError) {
19
+ return {
20
+ ok: false,
21
+ executable: false,
22
+ path: manifestPath,
23
+ error: error.message,
24
+ ...(error.causeValue === undefined ? {} : { details: error.causeValue }),
25
+ };
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ //# sourceMappingURL=run-admission-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-admission-service.js","sourceRoot":"","sources":["../../../src/app/services/run-admission-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAyB1E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAwB;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI;YAC7C,aAAa,EAAE,cAAc,CAAC,QAAQ,CAAC,aAAa;SACrD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;aACzE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,17 +1,18 @@
1
1
  import type { JudgeProvider } from "../../adapters/judge/llm-judge-provider.js";
2
- import { type RecoveryPlan } from "../../core/state/run-state-machine.js";
2
+ import { type RecoveryStatus } from "../../core/state/recovery-classifier.js";
3
3
  import { type CycleRunResult } from "../../core/engine/cycle-runner.js";
4
4
  export interface RunCycleServiceInput {
5
5
  repoRoot: string;
6
6
  manifestPath?: string;
7
- resume?: boolean;
7
+ fresh?: boolean;
8
8
  }
9
9
  export interface RunCycleServiceResult {
10
- status: CycleRunResult["status"] | "resume_required";
10
+ status: CycleRunResult["status"];
11
11
  manifestPath: string;
12
12
  lockPath: string;
13
13
  runResult?: CycleRunResult;
14
- recoveryPlan?: RecoveryPlan;
14
+ recovery?: RecoveryStatus;
15
+ warning?: string;
15
16
  }
16
17
  export interface RunCycleServiceDependencies {
17
18
  judgeProvider?: JudgeProvider;