ralph-research 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/dist/adapters/extractor/command-extractor.js +46 -4
- package/dist/adapters/extractor/command-extractor.js.map +1 -1
- package/dist/adapters/fs/json-file-frontier-store.js +4 -2
- package/dist/adapters/fs/json-file-frontier-store.js.map +1 -1
- package/dist/adapters/fs/lockfile.d.ts +14 -1
- package/dist/adapters/fs/lockfile.js +50 -6
- package/dist/adapters/fs/lockfile.js.map +1 -1
- package/dist/adapters/fs/manifest-loader.d.ts +5 -1
- package/dist/adapters/fs/manifest-loader.js +15 -2
- package/dist/adapters/fs/manifest-loader.js.map +1 -1
- package/dist/adapters/git/git-client.d.ts +2 -0
- package/dist/adapters/git/git-client.js +19 -0
- package/dist/adapters/git/git-client.js.map +1 -1
- package/dist/app/services/manual-decision-service.js +76 -25
- package/dist/app/services/manual-decision-service.js.map +1 -1
- package/dist/app/services/project-state-service.d.ts +9 -0
- package/dist/app/services/project-state-service.js +69 -14
- package/dist/app/services/project-state-service.js.map +1 -1
- package/dist/app/services/run-admission-service.d.ts +20 -0
- package/dist/app/services/run-admission-service.js +30 -0
- package/dist/app/services/run-admission-service.js.map +1 -0
- package/dist/app/services/run-cycle-service.d.ts +5 -4
- package/dist/app/services/run-cycle-service.js +175 -14
- package/dist/app/services/run-cycle-service.js.map +1 -1
- package/dist/app/services/run-loop-service.d.ts +21 -0
- package/dist/app/services/run-loop-service.js +155 -0
- package/dist/app/services/run-loop-service.js.map +1 -0
- package/dist/cli/commands/demo.js +1 -0
- package/dist/cli/commands/demo.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +8 -0
- package/dist/cli/commands/doctor.js +59 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +1 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/inspect.js +4 -0
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/run.d.ts +3 -1
- package/dist/cli/commands/run.js +31 -28
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.js +1 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/validate.js +21 -18
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/main.js +3 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/core/engine/cycle-runner.d.ts +2 -0
- package/dist/core/engine/cycle-runner.js +502 -34
- package/dist/core/engine/cycle-runner.js.map +1 -1
- package/dist/core/engine/promotion-artifact.d.ts +23 -0
- package/dist/core/engine/promotion-artifact.js +58 -0
- package/dist/core/engine/promotion-artifact.js.map +1 -0
- package/dist/core/engine/workspace-manager.d.ts +10 -1
- package/dist/core/engine/workspace-manager.js +70 -3
- package/dist/core/engine/workspace-manager.js.map +1 -1
- package/dist/core/manifest/admission.d.ts +16 -0
- package/dist/core/manifest/admission.js +64 -0
- package/dist/core/manifest/admission.js.map +1 -0
- package/dist/core/manifest/schema.d.ts +47 -0
- package/dist/core/manifest/schema.js +18 -1
- package/dist/core/manifest/schema.js.map +1 -1
- package/dist/core/model/decision-record.d.ts +4 -0
- package/dist/core/model/decision-record.js +6 -0
- package/dist/core/model/decision-record.js.map +1 -1
- package/dist/core/model/metric-diagnostics.d.ts +7 -0
- package/dist/core/model/metric-diagnostics.js +51 -0
- package/dist/core/model/metric-diagnostics.js.map +1 -0
- package/dist/core/model/run-record.d.ts +4 -0
- package/dist/core/model/run-record.js +2 -0
- package/dist/core/model/run-record.js.map +1 -1
- package/dist/core/state/frontier-materializer.d.ts +12 -0
- package/dist/core/state/frontier-materializer.js +74 -0
- package/dist/core/state/frontier-materializer.js.map +1 -0
- package/dist/core/state/frontier-semantics.d.ts +12 -0
- package/dist/core/state/frontier-semantics.js +26 -0
- package/dist/core/state/frontier-semantics.js.map +1 -0
- package/dist/core/state/ratchet-engine.js +29 -21
- package/dist/core/state/ratchet-engine.js.map +1 -1
- package/dist/core/state/recovery-classifier.d.ts +17 -0
- package/dist/core/state/recovery-classifier.js +150 -0
- package/dist/core/state/recovery-classifier.js.map +1 -0
- package/dist/core/state/run-state-machine.js +18 -22
- package/dist/core/state/run-state-machine.js.map +1 -1
- package/dist/core/state/stopping-target.d.ts +14 -0
- package/dist/core/state/stopping-target.js +67 -0
- package/dist/core/state/stopping-target.js.map +1 -0
- package/dist/mcp/server.js +17 -23
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -2
- 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
|
|
29
|
-
|
|
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
|
|
32
|
-
const
|
|
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
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"manual-decision-service.js","sourceRoot":"","sources":["../../../src/app/services/manual-decision-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAI1E,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChI,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,EACL,gCAAgC,EAChC,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAiBhF,MAAM,OAAO,qBAAqB;IACzB,KAAK,CAAC,MAAM,CAAC,KAA0B;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,IAAI,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE1C,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC;gBAChD,QAAQ;gBACR,aAAa;gBACb,IAAI;gBACJ,SAAS;aACV,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC;gBAC9C,GAAG;gBACH,MAAM;gBACN,QAAQ;gBACR,gBAAgB;aACjB,CAAC,CAAC;YACH,IAAI,UAAU,GAAc;gBAC1B,GAAG,GAAG;gBACN,QAAQ,EAAE;oBACR,GAAG,GAAG,CAAC,QAAQ;oBACf,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,YAAY,EAAE,SAAS,CAAC,YAAY;oBACpC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,MAAM;iBAC5C;aACF,CAAC;YACF,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;gBACxD,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,UAAU,EAAE,iBAAiB;gBAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;aAChC,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAC;YAEjG,IAAI,gBAAgB,GAAmB;gBACrC,GAAG,QAAQ;gBACX,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,OAAO;gBAClB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;gBACrE,SAAS,EAAE,iBAAiB;gBAC5B,eAAe,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe;gBAC1D,iBAAiB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;gBACnE,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;aAC1E,CAAC;YACF,MAAM,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAE1C,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,kBAAkB,EAAE;gBAC3D,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,gBAAgB,CAAC,UAAU;aACxC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,MAAM,SAAS,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,mBAAmB,CACtD,qBAAqB,CAAC,UAAU,CAAC,EACjC,eAAe,UAAU,CAAC,KAAK,EAAE,CAClC,CAAC;YAEF,gBAAgB,GAAG;gBACjB,GAAG,gBAAgB;gBACnB,SAAS,EAAE,YAAY,CAAC,SAAS;aAClC,CAAC;YACF,MAAM,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAE1C,MAAM,gBAAgB,GAAG,gCAAgC,CACvD,cAAc,CAAC,OAAO,EACtB,UAAU,CAAC,KAAK,EAChB,YAAY,CAAC,SAAS,CACvB,CAAC;YAEF,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACtD,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,MAAM,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;YAC7D,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAChE,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE;gBACpD,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,gBAAgB,CAAC,UAAU;aACxC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,GAAG,EAAE,UAAU;gBACf,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,gBAAgB;aAC3B,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,KAA0B;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,IAAI,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAEhF,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC;gBAChD,QAAQ;gBACR,aAAa;gBACb,IAAI;gBACJ,SAAS;aACV,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAEnD,MAAM,gBAAgB,GAAmB;gBACvC,GAAG,QAAQ;gBACX,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,OAAO;gBAClB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;gBACrE,SAAS,EAAE,iBAAiB;gBAC5B,eAAe,EAAE,KAAK;gBACtB,iBAAiB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;gBACnE,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;aACnE,CAAC;YACF,MAAM,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAE1C,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,kBAAkB,EAAE;gBACxD,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,gBAAgB,CAAC,UAAU;aACxC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAChE,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE;gBACpD,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,gBAAgB,CAAC,UAAU;aACxC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE/B,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,GAAG,EAAE,UAAU;gBACf,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,eAAe;aAC1B,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF;AAED,KAAK,UAAU,sBAAsB,CAAC,QAA0B,EAAE,KAAa;IAC7E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,aAAoC,EAAE,GAAc;IACjF,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,kCAAkC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,UAAU,gBAAgB,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,yBAAyB,CAChC,cAAsB,EACtB,OAAgC,EAChC,KAA0B;IAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,OAAO,GAAG,cAAc,WAAW,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -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
3
|
import type { 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,6 +9,7 @@ export interface ProjectStateInput {
|
|
|
8
9
|
export interface ProjectStatus {
|
|
9
10
|
manifestPath: string;
|
|
10
11
|
latestRun: RunRecord | null;
|
|
12
|
+
recovery: RecoveryStatus;
|
|
11
13
|
frontier: FrontierEntry[];
|
|
12
14
|
pendingHumanRuns: RunRecord[];
|
|
13
15
|
decisions: DecisionRecord[];
|
|
@@ -16,6 +18,7 @@ export interface InspectRunResult {
|
|
|
16
18
|
manifestPath: string;
|
|
17
19
|
run: RunRecord;
|
|
18
20
|
decision: DecisionRecord | null;
|
|
21
|
+
recovery: RecoveryStatus;
|
|
19
22
|
frontier: FrontierEntry[];
|
|
20
23
|
explainability: {
|
|
21
24
|
decisionReason: string | null;
|
|
@@ -30,6 +33,12 @@ export interface InspectRunResult {
|
|
|
30
33
|
delta?: number;
|
|
31
34
|
confidence?: number;
|
|
32
35
|
direction: "maximize" | "minimize";
|
|
36
|
+
sourceMetricId?: string;
|
|
37
|
+
}>;
|
|
38
|
+
metricDiagnostics: Array<{
|
|
39
|
+
metricId: string;
|
|
40
|
+
sourceMetricId?: string;
|
|
41
|
+
reasons: string[];
|
|
33
42
|
}>;
|
|
34
43
|
diffSummary: {
|
|
35
44
|
filesChanged?: number;
|
|
@@ -4,6 +4,9 @@ import { JsonFileFrontierStore } from "../../adapters/fs/json-file-frontier-stor
|
|
|
4
4
|
import { JsonFileRunStore } from "../../adapters/fs/json-file-run-store.js";
|
|
5
5
|
import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
|
|
6
6
|
import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
|
|
7
|
+
import { summarizeMetricDiagnostics } from "../../core/model/metric-diagnostics.js";
|
|
8
|
+
import { materializeFrontier } from "../../core/state/frontier-materializer.js";
|
|
9
|
+
import { classifyRecovery } from "../../core/state/recovery-classifier.js";
|
|
7
10
|
export class RunNotFoundError extends Error {
|
|
8
11
|
constructor(runId) {
|
|
9
12
|
super(`Run ${runId} was not found`);
|
|
@@ -11,33 +14,61 @@ export class RunNotFoundError extends Error {
|
|
|
11
14
|
}
|
|
12
15
|
}
|
|
13
16
|
export async function getProjectStatus(input) {
|
|
14
|
-
const { manifestPath, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
|
|
17
|
+
const { manifestPath, manifest, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
|
|
15
18
|
const runs = await runStore.list();
|
|
16
19
|
const decisions = await decisionStore.list();
|
|
17
|
-
const frontier = await
|
|
20
|
+
const frontier = await materializeFrontier({
|
|
21
|
+
manifest,
|
|
22
|
+
frontierStore,
|
|
23
|
+
runs,
|
|
24
|
+
decisions,
|
|
25
|
+
});
|
|
26
|
+
const latestRun = runs.at(-1) ?? null;
|
|
27
|
+
const latestDecision = latestRun?.decisionId
|
|
28
|
+
? decisions.find((decision) => decision.decisionId === latestRun.decisionId) ?? await decisionStore.get(latestRun.decisionId)
|
|
29
|
+
: null;
|
|
18
30
|
return {
|
|
19
31
|
manifestPath,
|
|
20
|
-
latestRun
|
|
32
|
+
latestRun,
|
|
33
|
+
recovery: classifyRecovery({
|
|
34
|
+
latestRun,
|
|
35
|
+
decision: latestDecision,
|
|
36
|
+
frontier,
|
|
37
|
+
}),
|
|
21
38
|
frontier,
|
|
22
39
|
pendingHumanRuns: runs.filter((run) => run.status === "needs_human"),
|
|
23
40
|
decisions,
|
|
24
41
|
};
|
|
25
42
|
}
|
|
26
43
|
export async function getProjectFrontier(input) {
|
|
27
|
-
const { manifestPath, frontierStore } = await loadProjectStores(input);
|
|
44
|
+
const { manifestPath, manifest, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
|
|
45
|
+
const runs = await runStore.list();
|
|
46
|
+
const decisions = await decisionStore.list();
|
|
28
47
|
return {
|
|
29
48
|
manifestPath,
|
|
30
|
-
frontier: await
|
|
49
|
+
frontier: await materializeFrontier({
|
|
50
|
+
manifest,
|
|
51
|
+
frontierStore,
|
|
52
|
+
runs,
|
|
53
|
+
decisions,
|
|
54
|
+
}),
|
|
31
55
|
};
|
|
32
56
|
}
|
|
33
57
|
export async function inspectRun(input) {
|
|
34
|
-
const { manifestPath, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
|
|
58
|
+
const { manifestPath, manifest, runStore, decisionStore, frontierStore } = await loadProjectStores(input);
|
|
59
|
+
const runs = await runStore.list();
|
|
60
|
+
const decisions = await decisionStore.list();
|
|
35
61
|
const run = await runStore.get(input.runId);
|
|
36
62
|
if (!run) {
|
|
37
63
|
throw new RunNotFoundError(input.runId);
|
|
38
64
|
}
|
|
39
65
|
const decision = run.decisionId ? await decisionStore.get(run.decisionId) : null;
|
|
40
|
-
const frontier = await
|
|
66
|
+
const frontier = await materializeFrontier({
|
|
67
|
+
manifest,
|
|
68
|
+
frontierStore,
|
|
69
|
+
runs,
|
|
70
|
+
decisions,
|
|
71
|
+
});
|
|
41
72
|
const judgeRationales = Object.values(run.metrics)
|
|
42
73
|
.flatMap((metric) => {
|
|
43
74
|
const rationale = typeof metric.details.rationale === "string" ? metric.details.rationale : null;
|
|
@@ -52,22 +83,45 @@ export async function inspectRun(input) {
|
|
|
52
83
|
},
|
|
53
84
|
];
|
|
54
85
|
});
|
|
55
|
-
const metricDeltas = Object.values(run.metrics).map((metric) =>
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
86
|
+
const metricDeltas = Object.values(run.metrics).map((metric) => {
|
|
87
|
+
const diagnostics = summarizeMetricDiagnostics(metric);
|
|
88
|
+
return {
|
|
89
|
+
metricId: metric.metricId,
|
|
90
|
+
value: metric.value,
|
|
91
|
+
direction: metric.direction,
|
|
92
|
+
...(metric.confidence === undefined ? {} : { confidence: metric.confidence }),
|
|
93
|
+
...(diagnostics?.sourceMetricId ? { sourceMetricId: diagnostics.sourceMetricId } : {}),
|
|
94
|
+
...(decision?.metricId === metric.metricId && decision.delta !== undefined ? { delta: decision.delta } : {}),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
const metricDiagnostics = Object.values(run.metrics)
|
|
98
|
+
.map((metric) => {
|
|
99
|
+
const diagnostics = summarizeMetricDiagnostics(metric);
|
|
100
|
+
if (!diagnostics) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
metricId: metric.metricId,
|
|
105
|
+
reasons: diagnostics.reasons,
|
|
106
|
+
...(diagnostics.sourceMetricId ? { sourceMetricId: diagnostics.sourceMetricId } : {}),
|
|
107
|
+
};
|
|
108
|
+
})
|
|
109
|
+
.filter((entry) => entry !== null);
|
|
62
110
|
return {
|
|
63
111
|
manifestPath,
|
|
64
112
|
run,
|
|
65
113
|
decision,
|
|
114
|
+
recovery: classifyRecovery({
|
|
115
|
+
latestRun: run,
|
|
116
|
+
decision,
|
|
117
|
+
frontier,
|
|
118
|
+
}),
|
|
66
119
|
frontier,
|
|
67
120
|
explainability: {
|
|
68
121
|
decisionReason: decision?.reason ?? null,
|
|
69
122
|
judgeRationales,
|
|
70
123
|
metricDeltas,
|
|
124
|
+
metricDiagnostics,
|
|
71
125
|
diffSummary: {
|
|
72
126
|
...(run.proposal.filesChanged === undefined ? {} : { filesChanged: run.proposal.filesChanged }),
|
|
73
127
|
...(run.proposal.diffLines === undefined ? {} : { lineDelta: run.proposal.diffLines }),
|
|
@@ -84,6 +138,7 @@ async function loadProjectStores(input) {
|
|
|
84
138
|
const storageRoot = join(repoRoot, loadedManifest.manifest.storage.root);
|
|
85
139
|
return {
|
|
86
140
|
manifestPath: loadedManifest.path,
|
|
141
|
+
manifest: loadedManifest.manifest,
|
|
87
142
|
runStore: new JsonFileRunStore(join(storageRoot, "runs")),
|
|
88
143
|
decisionStore: new JsonFileDecisionStore(join(storageRoot, "decisions")),
|
|
89
144
|
frontierStore: new JsonFileFrontierStore(join(storageRoot, "frontier.json")),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-state-service.js","sourceRoot":"","sources":["../../../src/app/services/project-state-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-state-service.js","sourceRoot":"","sources":["../../../src/app/services/project-state-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AAIpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAuB,MAAM,yCAAyC,CAAC;AAmDhG,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAmB,KAAa;QAC9B,KAAK,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAwB;IAC7D,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC;QACzC,QAAQ;QACR,aAAa;QACb,IAAI;QACJ,SAAS;KACV,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACtC,MAAM,cAAc,GAAG,SAAS,EAAE,UAAU;QAC1C,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7H,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,YAAY;QACZ,SAAS;QACT,QAAQ,EAAE,gBAAgB,CAAC;YACzB,SAAS;YACT,QAAQ,EAAE,cAAc;YACxB,QAAQ;SACT,CAAC;QACF,QAAQ;QACR,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC;QACpE,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAwB;IAI/D,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO;QACL,YAAY;QACZ,QAAQ,EAAE,MAAM,mBAAmB,CAAC;YAClC,QAAQ;YACR,aAAa;YACb,IAAI;YACJ,SAAS;SACV,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAA4C;IAC3E,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC;QACzC,QAAQ;QACR,aAAa;QACb,IAAI;QACJ,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;SAC/C,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAClB,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACjG,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS;gBACT,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5E;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7D,MAAM,WAAW,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAEvD,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;YAC7E,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7G,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;SACjD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,WAAW,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAEzE,OAAO;QACL,YAAY;QACZ,GAAG;QACH,QAAQ;QACR,QAAQ,EAAE,gBAAgB,CAAC;YACzB,SAAS,EAAE,GAAG;YACd,QAAQ;YACR,QAAQ;SACT,CAAC;QACF,QAAQ;QACR,cAAc,EAAE;YACd,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;YACxC,eAAe;YACf,YAAY;YACZ,iBAAiB;YACjB,WAAW,EAAE;gBACX,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC/F,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACtF,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;aAChG;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAwB;IACvD,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;IACxF,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO;QACL,YAAY,EAAE,cAAc,CAAC,IAAI;QACjC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,QAAQ,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACzD,aAAa,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACxE,aAAa,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC"}
|
|
@@ -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
|
|
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
|
-
|
|
7
|
+
fresh?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export interface RunCycleServiceResult {
|
|
10
|
-
status: CycleRunResult["status"]
|
|
10
|
+
status: CycleRunResult["status"];
|
|
11
11
|
manifestPath: string;
|
|
12
12
|
lockPath: string;
|
|
13
13
|
runResult?: CycleRunResult;
|
|
14
|
-
|
|
14
|
+
recovery?: RecoveryStatus;
|
|
15
|
+
warning?: string;
|
|
15
16
|
}
|
|
16
17
|
export interface RunCycleServiceDependencies {
|
|
17
18
|
judgeProvider?: JudgeProvider;
|