ralph-research 0.1.2 → 0.1.4
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 +132 -101
- package/dist/adapters/fs/json-file-research-project-defaults-store.d.ts +8 -0
- package/dist/adapters/fs/json-file-research-project-defaults-store.js +30 -0
- package/dist/adapters/fs/json-file-research-project-defaults-store.js.map +1 -0
- package/dist/adapters/fs/json-file-research-session-repository.d.ts +24 -0
- package/dist/adapters/fs/json-file-research-session-repository.js +199 -0
- package/dist/adapters/fs/json-file-research-session-repository.js.map +1 -0
- package/dist/adapters/fs/lockfile.js +142 -57
- package/dist/adapters/fs/lockfile.js.map +1 -1
- package/dist/adapters/fs/manifest-loader.js +8 -1
- package/dist/adapters/fs/manifest-loader.js.map +1 -1
- package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
- package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
- package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
- package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
- package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
- package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
- package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
- package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
- package/dist/adapters/proposer/proposer-factory.js +19 -0
- package/dist/adapters/proposer/proposer-factory.js.map +1 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
- package/dist/app/services/manual-decision-service.js +20 -9
- package/dist/app/services/manual-decision-service.js.map +1 -1
- package/dist/app/services/project-state-service.js +5 -3
- package/dist/app/services/project-state-service.js.map +1 -1
- package/dist/app/services/research-project-defaults-service.d.ts +18 -0
- package/dist/app/services/research-project-defaults-service.js +175 -0
- package/dist/app/services/research-project-defaults-service.js.map +1 -0
- package/dist/app/services/research-session-draft-service.d.ts +121 -0
- package/dist/app/services/research-session-draft-service.js +846 -0
- package/dist/app/services/research-session-draft-service.js.map +1 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
- package/dist/app/services/research-session-interactive-service.d.ts +35 -0
- package/dist/app/services/research-session-interactive-service.js +295 -0
- package/dist/app/services/research-session-interactive-service.js.map +1 -0
- package/dist/app/services/research-session-launch-service.d.ts +46 -0
- package/dist/app/services/research-session-launch-service.js +389 -0
- package/dist/app/services/research-session-launch-service.js.map +1 -0
- package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
- package/dist/app/services/research-session-orchestrator-service.js +614 -0
- package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
- package/dist/app/services/research-session-recovery-service.d.ts +30 -0
- package/dist/app/services/research-session-recovery-service.js +110 -0
- package/dist/app/services/research-session-recovery-service.js.map +1 -0
- package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
- package/dist/app/services/research-session-wizard-controller.js +220 -0
- package/dist/app/services/research-session-wizard-controller.js.map +1 -0
- package/dist/app/services/run-cycle-service.d.ts +2 -0
- package/dist/app/services/run-cycle-service.js +8 -6
- package/dist/app/services/run-cycle-service.js.map +1 -1
- package/dist/app/services/run-loop-service.js +11 -3
- package/dist/app/services/run-loop-service.js.map +1 -1
- package/dist/cli/commands/inspect.js +2 -0
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/launch.d.ts +16 -0
- package/dist/cli/commands/launch.js +68 -0
- package/dist/cli/commands/launch.js.map +1 -0
- package/dist/cli/commands/proposer-display.d.ts +2 -0
- package/dist/cli/commands/proposer-display.js +18 -0
- package/dist/cli/commands/proposer-display.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +14 -0
- package/dist/cli/commands/resume.js +134 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -2
- package/dist/cli/commands/run.js +15 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.js +4 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/main.js +2 -29
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/program.d.ts +15 -0
- package/dist/cli/program.js +54 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/tui/research-session-shell.d.ts +22 -0
- package/dist/cli/tui/research-session-shell.js +719 -0
- package/dist/cli/tui/research-session-shell.js.map +1 -0
- package/dist/core/engine/cycle-runner.d.ts +4 -0
- package/dist/core/engine/cycle-runner.js +15 -9
- package/dist/core/engine/cycle-runner.js.map +1 -1
- package/dist/core/manifest/admission.d.ts +1 -0
- package/dist/core/manifest/admission.js +50 -0
- package/dist/core/manifest/admission.js.map +1 -1
- package/dist/core/manifest/defaults.d.ts +21 -0
- package/dist/core/manifest/defaults.js +21 -0
- package/dist/core/manifest/defaults.js.map +1 -1
- package/dist/core/manifest/schema.d.ts +170 -0
- package/dist/core/manifest/schema.js +21 -1
- package/dist/core/manifest/schema.js.map +1 -1
- package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
- package/dist/core/model/codex-cli-cycle-session.js +2 -0
- package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
- package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
- package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
- package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
- package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
- package/dist/core/model/codex-cli-session-outcome.js +70 -0
- package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
- package/dist/core/model/research-project-defaults.d.ts +48 -0
- package/dist/core/model/research-project-defaults.js +46 -0
- package/dist/core/model/research-project-defaults.js.map +1 -0
- package/dist/core/model/research-session.d.ts +1143 -0
- package/dist/core/model/research-session.js +689 -0
- package/dist/core/model/research-session.js.map +1 -0
- package/dist/core/model/run-record.d.ts +56 -6
- package/dist/core/model/run-record.js +28 -0
- package/dist/core/model/run-record.js.map +1 -1
- package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
- package/dist/core/ports/research-project-defaults-store.js +2 -0
- package/dist/core/ports/research-project-defaults-store.js.map +1 -0
- package/dist/core/ports/research-session-repository.d.ts +25 -0
- package/dist/core/ports/research-session-repository.js +2 -0
- package/dist/core/ports/research-session-repository.js.map +1 -0
- package/dist/core/state/frontier-materializer.d.ts +2 -0
- package/dist/core/state/frontier-materializer.js +11 -2
- package/dist/core/state/frontier-materializer.js.map +1 -1
- package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
- package/dist/core/state/research-session-recovery-classifier.js +236 -0
- package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
- package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
- package/dist/core/state/research-session-resume-candidate.js +62 -0
- package/dist/core/state/research-session-resume-candidate.js.map +1 -0
- package/dist/core/state/research-session-state-machine.d.ts +62 -0
- package/dist/core/state/research-session-state-machine.js +443 -0
- package/dist/core/state/research-session-state-machine.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +192 -1
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type CodexCliSessionLifecycleRecord } from "../../core/model/codex-cli-session-lifecycle.js";
|
|
2
|
+
import type { ResearchSessionRecord } from "../../core/model/research-session.js";
|
|
3
|
+
import type { PersistedCodexSessionReference, ResearchSessionRepository } from "../../core/ports/research-session-repository.js";
|
|
4
|
+
import { type ResearchSessionRecoveryStatus } from "../../core/state/research-session-recovery-classifier.js";
|
|
5
|
+
export type { ResearchSessionRecoveryStatus } from "../../core/state/research-session-recovery-classifier.js";
|
|
6
|
+
export interface ResearchSessionRecoveryServiceDependencies {
|
|
7
|
+
createRepository?: (sessionsRoot: string) => ResearchSessionRepository;
|
|
8
|
+
isProcessAlive?: (pid: number) => boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ResearchSessionRecoveryInput {
|
|
11
|
+
repoRoot: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ResearchSessionRecoveryInspection {
|
|
15
|
+
session: ResearchSessionRecord;
|
|
16
|
+
lifecycle: CodexCliSessionLifecycleRecord | null;
|
|
17
|
+
codexSessionReference: PersistedCodexSessionReference | null;
|
|
18
|
+
recovery: ResearchSessionRecoveryStatus;
|
|
19
|
+
}
|
|
20
|
+
export declare class ResearchSessionRecoveryService {
|
|
21
|
+
private readonly createRepository;
|
|
22
|
+
private readonly isProcessAliveFn;
|
|
23
|
+
constructor(dependencies?: ResearchSessionRecoveryServiceDependencies);
|
|
24
|
+
classifySession(input: ResearchSessionRecoveryInput): Promise<ResearchSessionRecoveryStatus>;
|
|
25
|
+
inspectSession(input: ResearchSessionRecoveryInput): Promise<ResearchSessionRecoveryInspection>;
|
|
26
|
+
private resolveRepository;
|
|
27
|
+
private loadSessionOrThrow;
|
|
28
|
+
private loadPersistedSession;
|
|
29
|
+
private loadLifecycle;
|
|
30
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFile, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { JsonFileResearchSessionRepository } from "../../adapters/fs/json-file-research-session-repository.js";
|
|
4
|
+
import { DEFAULT_STORAGE_ROOT } from "../../core/manifest/defaults.js";
|
|
5
|
+
import { parseCodexCliSessionLifecycleRecord, } from "../../core/model/codex-cli-session-lifecycle.js";
|
|
6
|
+
import { classifyResearchSessionRecovery, } from "../../core/state/research-session-recovery-classifier.js";
|
|
7
|
+
import { isMissingFileError } from "../../shared/fs-errors.js";
|
|
8
|
+
export class ResearchSessionRecoveryService {
|
|
9
|
+
createRepository;
|
|
10
|
+
isProcessAliveFn;
|
|
11
|
+
constructor(dependencies = {}) {
|
|
12
|
+
this.createRepository =
|
|
13
|
+
dependencies.createRepository ??
|
|
14
|
+
((sessionsRoot) => new JsonFileResearchSessionRepository(sessionsRoot));
|
|
15
|
+
this.isProcessAliveFn = dependencies.isProcessAlive ?? isProcessAlive;
|
|
16
|
+
}
|
|
17
|
+
async classifySession(input) {
|
|
18
|
+
const inspection = await this.inspectSession(input);
|
|
19
|
+
return inspection.recovery;
|
|
20
|
+
}
|
|
21
|
+
async inspectSession(input) {
|
|
22
|
+
const { canonicalRepoRoot, repository } = await this.resolveRepository(input.repoRoot);
|
|
23
|
+
const persisted = await this.loadPersistedSession(repository, canonicalRepoRoot, input.sessionId);
|
|
24
|
+
const { session, lifecycle } = persisted;
|
|
25
|
+
const processAlive = lifecycle?.pid !== undefined ? this.isProcessAliveFn(lifecycle.pid) : false;
|
|
26
|
+
return {
|
|
27
|
+
session,
|
|
28
|
+
lifecycle,
|
|
29
|
+
codexSessionReference: persisted.codexSessionReference,
|
|
30
|
+
recovery: classifyResearchSessionRecovery({
|
|
31
|
+
session,
|
|
32
|
+
lifecycle,
|
|
33
|
+
processAlive,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async resolveRepository(repoRoot) {
|
|
38
|
+
const resolvedRoot = resolve(repoRoot);
|
|
39
|
+
const repoStats = await stat(resolvedRoot).catch(() => null);
|
|
40
|
+
if (!repoStats?.isDirectory()) {
|
|
41
|
+
throw new Error(`Working directory is not a directory: ${resolvedRoot}`);
|
|
42
|
+
}
|
|
43
|
+
const canonicalRepoRoot = await realpath(resolvedRoot);
|
|
44
|
+
const sessionsRoot = join(canonicalRepoRoot, DEFAULT_STORAGE_ROOT, "sessions");
|
|
45
|
+
return {
|
|
46
|
+
canonicalRepoRoot,
|
|
47
|
+
repository: this.createRepository(sessionsRoot),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async loadSessionOrThrow(repository, sessionId) {
|
|
51
|
+
const session = await repository.loadSession(sessionId);
|
|
52
|
+
if (!session) {
|
|
53
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
54
|
+
}
|
|
55
|
+
return session;
|
|
56
|
+
}
|
|
57
|
+
async loadPersistedSession(repository, repoRoot, sessionId) {
|
|
58
|
+
if (repository.loadPersistedSession) {
|
|
59
|
+
const persisted = await repository.loadPersistedSession(sessionId);
|
|
60
|
+
if (!persisted) {
|
|
61
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
62
|
+
}
|
|
63
|
+
return persisted;
|
|
64
|
+
}
|
|
65
|
+
const session = await this.loadSessionOrThrow(repository, sessionId);
|
|
66
|
+
const lifecycle = await this.loadLifecycle(repoRoot, session.sessionId);
|
|
67
|
+
return {
|
|
68
|
+
session,
|
|
69
|
+
lifecycle,
|
|
70
|
+
codexSessionReference: lifecycle
|
|
71
|
+
? {
|
|
72
|
+
codexSessionId: lifecycle.identity.codexSessionId,
|
|
73
|
+
lifecyclePath: join(repoRoot, DEFAULT_STORAGE_ROOT, "sessions", session.sessionId, "codex-session.json"),
|
|
74
|
+
}
|
|
75
|
+
: null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async loadLifecycle(repoRoot, sessionId) {
|
|
79
|
+
const lifecyclePath = join(repoRoot, DEFAULT_STORAGE_ROOT, "sessions", sessionId, "codex-session.json");
|
|
80
|
+
try {
|
|
81
|
+
const raw = await readFile(lifecyclePath, "utf8");
|
|
82
|
+
return parseCodexCliSessionLifecycleRecord(raw);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (isMissingFileError(error)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function isProcessAlive(pid) {
|
|
93
|
+
try {
|
|
94
|
+
process.kill(pid, 0);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof Error && "code" in error) {
|
|
99
|
+
const code = error.code;
|
|
100
|
+
if (code === "ESRCH") {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
if (code === "EPERM") {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=research-session-recovery-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-session-recovery-service.js","sourceRoot":"","sources":["../../../src/app/services/research-session-recovery-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ResearchSessionDraft, type ResearchSessionDraftStep, type ResearchSessionDraftUpdate, type ResearchSessionDraftValidationResult } from "./research-session-draft-service.js";
|
|
2
|
+
export interface ResearchSessionWizardStepDefinition {
|
|
3
|
+
step: ResearchSessionDraftStep;
|
|
4
|
+
index: number;
|
|
5
|
+
total: number;
|
|
6
|
+
label: string;
|
|
7
|
+
title: string;
|
|
8
|
+
advanceCommand: "continue" | "submit";
|
|
9
|
+
helpText: string;
|
|
10
|
+
blockedMessage: string;
|
|
11
|
+
advanceMessage: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ResearchSessionWizardSectionStatus {
|
|
14
|
+
step: ResearchSessionDraftStep;
|
|
15
|
+
index: number;
|
|
16
|
+
total: number;
|
|
17
|
+
label: string;
|
|
18
|
+
title: string;
|
|
19
|
+
isCurrent: boolean;
|
|
20
|
+
isCompleted: boolean;
|
|
21
|
+
validation: ResearchSessionDraftValidationResult;
|
|
22
|
+
}
|
|
23
|
+
export interface ResearchSessionWizardBackResult {
|
|
24
|
+
transition: "blocked" | "step_changed";
|
|
25
|
+
message: string;
|
|
26
|
+
patch?: ResearchSessionDraftUpdate;
|
|
27
|
+
}
|
|
28
|
+
export interface ResearchSessionWizardNextResult {
|
|
29
|
+
transition: "blocked" | "step_changed";
|
|
30
|
+
message: string;
|
|
31
|
+
patch?: ResearchSessionDraftUpdate;
|
|
32
|
+
}
|
|
33
|
+
export interface ResearchSessionWizardReviewEditResult {
|
|
34
|
+
transition: "step_changed";
|
|
35
|
+
message: string;
|
|
36
|
+
patch: ResearchSessionDraftUpdate;
|
|
37
|
+
}
|
|
38
|
+
export interface ResearchSessionWizardAdvanceResult {
|
|
39
|
+
transition: "blocked" | "step_changed" | "ready_to_launch";
|
|
40
|
+
validation: ResearchSessionDraftValidationResult;
|
|
41
|
+
message: string;
|
|
42
|
+
patch?: ResearchSessionDraftUpdate;
|
|
43
|
+
}
|
|
44
|
+
export declare function getResearchSessionWizardStepDefinition(step: ResearchSessionDraftStep): ResearchSessionWizardStepDefinition;
|
|
45
|
+
export declare function validateResearchSessionWizardStep(draft: ResearchSessionDraft): ResearchSessionDraftValidationResult;
|
|
46
|
+
export declare function getResearchSessionWizardSectionStatuses(draft: ResearchSessionDraft): ResearchSessionWizardSectionStatus[];
|
|
47
|
+
export declare function isResearchSessionWizardAdvanceCommand(command: string, step: ResearchSessionDraftStep): boolean;
|
|
48
|
+
export declare function getResearchSessionWizardBackResult(step: ResearchSessionDraftStep): ResearchSessionWizardBackResult;
|
|
49
|
+
export declare function getResearchSessionWizardNextResult(step: ResearchSessionDraftStep): ResearchSessionWizardNextResult;
|
|
50
|
+
export declare function getResearchSessionWizardAdvanceResult(draft: ResearchSessionDraft): ResearchSessionWizardAdvanceResult;
|
|
51
|
+
export declare function getResearchSessionWizardReviewEditResult(targetStep: Exclude<ResearchSessionDraftStep, "review">): ResearchSessionWizardReviewEditResult;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { validateOutputsStepDraft, validatePermissionsStepDraft, validateReviewStepDraft, validateStopRulesStepDraft, } from "./research-session-draft-service.js";
|
|
2
|
+
const STEP_ORDER = [
|
|
3
|
+
"permissions",
|
|
4
|
+
"stopRules",
|
|
5
|
+
"outputs",
|
|
6
|
+
"review",
|
|
7
|
+
];
|
|
8
|
+
const STEP_DEFINITIONS = {
|
|
9
|
+
permissions: {
|
|
10
|
+
step: "permissions",
|
|
11
|
+
index: 0,
|
|
12
|
+
total: STEP_ORDER.length,
|
|
13
|
+
label: "Permissions",
|
|
14
|
+
title: "Step 1/4: Permissions",
|
|
15
|
+
advanceCommand: "continue",
|
|
16
|
+
helpText: "Commands: edit <1-6|working|directory|cwd|web|search|add|allow|remove|deny|block|approval|sandbox>, next, continue, back, help, quit",
|
|
17
|
+
blockedMessage: "Permissions step has validation errors. Fix them before continuing.",
|
|
18
|
+
advanceMessage: "Permissions step saved. Opening Stop Rules.",
|
|
19
|
+
},
|
|
20
|
+
stopRules: {
|
|
21
|
+
step: "stopRules",
|
|
22
|
+
index: 1,
|
|
23
|
+
total: STEP_ORDER.length,
|
|
24
|
+
label: "Stop Rules",
|
|
25
|
+
title: "Step 2/4: Stop Rules",
|
|
26
|
+
advanceCommand: "continue",
|
|
27
|
+
helpText: "Commands: edit <1-3|failures|progress|evidence>, next, continue, back, help, quit",
|
|
28
|
+
blockedMessage: "Stop Rules step has validation errors. Fix them before continuing.",
|
|
29
|
+
advanceMessage: "Stop Rules step saved. Opening Outputs.",
|
|
30
|
+
},
|
|
31
|
+
outputs: {
|
|
32
|
+
step: "outputs",
|
|
33
|
+
index: 2,
|
|
34
|
+
total: STEP_ORDER.length,
|
|
35
|
+
label: "Outputs",
|
|
36
|
+
title: "Step 3/4: Outputs",
|
|
37
|
+
advanceCommand: "continue",
|
|
38
|
+
helpText: "Commands: edit <1-7|goal|trackable|files|globs|baseline|base|agent|command|model|startup|turn>, next, continue, back, help, quit",
|
|
39
|
+
blockedMessage: "Outputs step has validation errors. Fix them before continuing.",
|
|
40
|
+
advanceMessage: "Outputs step saved. Opening Review.",
|
|
41
|
+
},
|
|
42
|
+
review: {
|
|
43
|
+
step: "review",
|
|
44
|
+
index: 3,
|
|
45
|
+
total: STEP_ORDER.length,
|
|
46
|
+
label: "Review",
|
|
47
|
+
title: "Step 4/4: Review",
|
|
48
|
+
advanceCommand: "submit",
|
|
49
|
+
helpText: "Commands: confirm, submit, help, quit",
|
|
50
|
+
blockedMessage: "Review has validation errors. Fix the highlighted section before submitting.",
|
|
51
|
+
advanceMessage: "Review complete. Starting the interactive Codex session.",
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
export function getResearchSessionWizardStepDefinition(step) {
|
|
55
|
+
return STEP_DEFINITIONS[step];
|
|
56
|
+
}
|
|
57
|
+
export function validateResearchSessionWizardStep(draft) {
|
|
58
|
+
return validateResearchSessionWizardSpecificStep(draft, draft.currentStep);
|
|
59
|
+
}
|
|
60
|
+
export function getResearchSessionWizardSectionStatuses(draft) {
|
|
61
|
+
const completedSteps = new Set(draft.completedSteps);
|
|
62
|
+
return STEP_ORDER.map((step) => {
|
|
63
|
+
const definition = STEP_DEFINITIONS[step];
|
|
64
|
+
return {
|
|
65
|
+
step,
|
|
66
|
+
index: definition.index,
|
|
67
|
+
total: definition.total,
|
|
68
|
+
label: definition.label,
|
|
69
|
+
title: definition.title,
|
|
70
|
+
isCurrent: draft.currentStep === step,
|
|
71
|
+
isCompleted: completedSteps.has(step),
|
|
72
|
+
validation: validateResearchSessionWizardSpecificStep(draft, step),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function validateResearchSessionWizardSpecificStep(draft, step) {
|
|
77
|
+
switch (step) {
|
|
78
|
+
case "permissions":
|
|
79
|
+
return validatePermissionsStepDraft(draft);
|
|
80
|
+
case "stopRules":
|
|
81
|
+
return validateStopRulesStepDraft(draft);
|
|
82
|
+
case "outputs":
|
|
83
|
+
return validateOutputsStepDraft(draft);
|
|
84
|
+
case "review":
|
|
85
|
+
return validateReviewStepDraft(draft);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function isResearchSessionWizardAdvanceCommand(command, step) {
|
|
89
|
+
const normalized = command.trim().toLowerCase();
|
|
90
|
+
if (!normalized) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return normalized === STEP_DEFINITIONS[step].advanceCommand;
|
|
94
|
+
}
|
|
95
|
+
export function getResearchSessionWizardBackResult(step) {
|
|
96
|
+
const previousStep = getResearchSessionWizardPreviousStep(step);
|
|
97
|
+
if (!previousStep) {
|
|
98
|
+
return {
|
|
99
|
+
transition: "blocked",
|
|
100
|
+
message: `Already at the first step: ${STEP_DEFINITIONS[step].label}.`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
transition: "step_changed",
|
|
105
|
+
message: `Returning to ${STEP_DEFINITIONS[previousStep].title}.`,
|
|
106
|
+
patch: {
|
|
107
|
+
currentStep: previousStep,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function getResearchSessionWizardNextResult(step) {
|
|
112
|
+
const nextStep = getResearchSessionWizardNextStep(step);
|
|
113
|
+
if (!nextStep) {
|
|
114
|
+
return {
|
|
115
|
+
transition: "blocked",
|
|
116
|
+
message: `Already at the last step: ${STEP_DEFINITIONS[step].label}.`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
transition: "step_changed",
|
|
121
|
+
message: `Opening ${STEP_DEFINITIONS[nextStep].title}.`,
|
|
122
|
+
patch: {
|
|
123
|
+
currentStep: nextStep,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function getResearchSessionWizardAdvanceResult(draft) {
|
|
128
|
+
const validation = validateResearchSessionWizardStep(draft);
|
|
129
|
+
const definition = STEP_DEFINITIONS[draft.currentStep];
|
|
130
|
+
const completedSteps = markResearchSessionWizardStepCompleted(draft.completedSteps, draft.currentStep);
|
|
131
|
+
const stepDataPatch = buildResearchSessionWizardAdvancePatch(draft);
|
|
132
|
+
const advanceMessage = draft.returnToReview && draft.currentStep !== "review"
|
|
133
|
+
? `${definition.label} step saved. Returning to Review.`
|
|
134
|
+
: definition.advanceMessage;
|
|
135
|
+
if (!validation.isValid) {
|
|
136
|
+
return {
|
|
137
|
+
transition: "blocked",
|
|
138
|
+
validation,
|
|
139
|
+
message: definition.blockedMessage,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (draft.currentStep === "review" && !draft.reviewConfirmed) {
|
|
143
|
+
return {
|
|
144
|
+
transition: "blocked",
|
|
145
|
+
validation,
|
|
146
|
+
message: "Review requires final confirmation before submitting.",
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const nextStep = getResearchSessionWizardNextStep(draft.currentStep);
|
|
150
|
+
const nextStepAfterAdvance = draft.returnToReview && draft.currentStep !== "review" ? "review" : nextStep;
|
|
151
|
+
if (!nextStepAfterAdvance) {
|
|
152
|
+
return {
|
|
153
|
+
transition: "ready_to_launch",
|
|
154
|
+
validation,
|
|
155
|
+
message: advanceMessage,
|
|
156
|
+
patch: {
|
|
157
|
+
...stepDataPatch,
|
|
158
|
+
completedSteps,
|
|
159
|
+
returnToReview: false,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
transition: "step_changed",
|
|
165
|
+
validation,
|
|
166
|
+
message: advanceMessage,
|
|
167
|
+
patch: {
|
|
168
|
+
...stepDataPatch,
|
|
169
|
+
currentStep: nextStepAfterAdvance,
|
|
170
|
+
completedSteps,
|
|
171
|
+
returnToReview: false,
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function getResearchSessionWizardReviewEditResult(targetStep) {
|
|
176
|
+
return {
|
|
177
|
+
transition: "step_changed",
|
|
178
|
+
message: `Review jump: reopening ${STEP_DEFINITIONS[targetStep].title}. Return here with continue when you are done editing.`,
|
|
179
|
+
patch: {
|
|
180
|
+
currentStep: targetStep,
|
|
181
|
+
returnToReview: true,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function getResearchSessionWizardPreviousStep(step) {
|
|
186
|
+
const stepIndex = STEP_ORDER.indexOf(step);
|
|
187
|
+
return stepIndex > 0 ? STEP_ORDER[stepIndex - 1] ?? null : null;
|
|
188
|
+
}
|
|
189
|
+
function getResearchSessionWizardNextStep(step) {
|
|
190
|
+
const stepIndex = STEP_ORDER.indexOf(step);
|
|
191
|
+
return stepIndex >= 0 && stepIndex < STEP_ORDER.length - 1
|
|
192
|
+
? STEP_ORDER[stepIndex + 1] ?? null
|
|
193
|
+
: null;
|
|
194
|
+
}
|
|
195
|
+
function buildResearchSessionWizardAdvancePatch(draft) {
|
|
196
|
+
if (draft.currentStep !== "outputs") {
|
|
197
|
+
return {};
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
goal: draft.goal,
|
|
201
|
+
contextSettings: {
|
|
202
|
+
trackableGlobs: draft.contextSettings.trackableGlobs,
|
|
203
|
+
},
|
|
204
|
+
workspaceSettings: {
|
|
205
|
+
baseRef: draft.workspaceSettings.baseRef,
|
|
206
|
+
},
|
|
207
|
+
agentCommand: draft.agentCommand,
|
|
208
|
+
agentSettings: {
|
|
209
|
+
model: draft.agentSettings.model,
|
|
210
|
+
startupTimeoutSec: draft.agentSettings.startupTimeoutSec,
|
|
211
|
+
turnTimeoutSec: draft.agentSettings.turnTimeoutSec,
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function markResearchSessionWizardStepCompleted(completedSteps, step) {
|
|
216
|
+
const nextCompletedSteps = new Set(completedSteps);
|
|
217
|
+
nextCompletedSteps.add(step);
|
|
218
|
+
return STEP_ORDER.filter((candidateStep) => nextCompletedSteps.has(candidateStep));
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=research-session-wizard-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-session-wizard-controller.js","sourceRoot":"","sources":["../../../src/app/services/research-session-wizard-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { JudgeProvider } from "../../adapters/judge/llm-judge-provider.js";
|
|
2
|
+
import type { CodexCliCycleSessionContext } from "../../core/model/codex-cli-cycle-session.js";
|
|
2
3
|
import { type RecoveryStatus } from "../../core/state/recovery-classifier.js";
|
|
3
4
|
import { type CycleRunResult } from "../../core/engine/cycle-runner.js";
|
|
4
5
|
export interface RunCycleServiceInput {
|
|
5
6
|
repoRoot: string;
|
|
6
7
|
manifestPath?: string;
|
|
7
8
|
fresh?: boolean;
|
|
9
|
+
codexSession?: CodexCliCycleSessionContext;
|
|
8
10
|
}
|
|
9
11
|
export interface RunCycleServiceResult {
|
|
10
12
|
status: CycleRunResult["status"];
|
|
@@ -7,7 +7,6 @@ import { GitClient } from "../../adapters/git/git-client.js";
|
|
|
7
7
|
import { acquireLock, releaseLock, renewLock } from "../../adapters/fs/lockfile.js";
|
|
8
8
|
import { loadManifestFromFile } from "../../adapters/fs/manifest-loader.js";
|
|
9
9
|
import { DEFAULT_MANIFEST_FILENAME } from "../../core/manifest/schema.js";
|
|
10
|
-
import { DEFAULT_STORAGE_ROOT } from "../../core/manifest/defaults.js";
|
|
11
10
|
import { materializeFrontier } from "../../core/state/frontier-materializer.js";
|
|
12
11
|
import { classifyRecovery } from "../../core/state/recovery-classifier.js";
|
|
13
12
|
import { GitWorktreeWorkspaceManager } from "../../core/engine/workspace-manager.js";
|
|
@@ -22,9 +21,10 @@ export class RunCycleService {
|
|
|
22
21
|
async run(input) {
|
|
23
22
|
const repoRoot = resolve(input.repoRoot);
|
|
24
23
|
const manifestPath = resolve(repoRoot, input.manifestPath ?? DEFAULT_MANIFEST_FILENAME);
|
|
25
|
-
const lockPath = join(repoRoot, DEFAULT_STORAGE_ROOT, "lock");
|
|
26
24
|
// Run the shared repo-aware admission check before taking locks or mutating storage.
|
|
27
25
|
const loadedManifest = await loadManifestFromFile(manifestPath, { repoRoot });
|
|
26
|
+
const storageRoot = join(repoRoot, loadedManifest.manifest.storage.root);
|
|
27
|
+
const lockPath = join(storageRoot, "lock");
|
|
28
28
|
const lock = await acquireLock(lockPath, {
|
|
29
29
|
owner: {
|
|
30
30
|
operation: "run-cycle",
|
|
@@ -32,7 +32,6 @@ export class RunCycleService {
|
|
|
32
32
|
});
|
|
33
33
|
const heartbeat = startLockHeartbeat(lock.path, lock.metadata.token, lock.metadata.ttlMs);
|
|
34
34
|
try {
|
|
35
|
-
const storageRoot = join(repoRoot, loadedManifest.manifest.storage.root);
|
|
36
35
|
const runStore = new JsonFileRunStore(join(storageRoot, "runs"));
|
|
37
36
|
const frontierStore = new JsonFileFrontierStore(join(storageRoot, "frontier.json"));
|
|
38
37
|
const decisionStore = new JsonFileDecisionStore(join(storageRoot, "decisions"));
|
|
@@ -44,6 +43,7 @@ export class RunCycleService {
|
|
|
44
43
|
frontierStore,
|
|
45
44
|
runs,
|
|
46
45
|
decisions,
|
|
46
|
+
mode: "repair",
|
|
47
47
|
});
|
|
48
48
|
const latestDecision = latestRun?.decisionId
|
|
49
49
|
? decisions.find((decision) => decision.decisionId === latestRun.decisionId) ?? await decisionStore.get(latestRun.decisionId)
|
|
@@ -58,6 +58,9 @@ export class RunCycleService {
|
|
|
58
58
|
if (workspaceWarning) {
|
|
59
59
|
warnings.push(workspaceWarning);
|
|
60
60
|
}
|
|
61
|
+
if (latestRun && recovery.classification === "manual_review_blocked") {
|
|
62
|
+
throw new Error(`Latest run ${latestRun.runId} is waiting for manual review`);
|
|
63
|
+
}
|
|
61
64
|
if (latestRun && !input.fresh) {
|
|
62
65
|
if (recovery.classification === "resumable") {
|
|
63
66
|
const workspaceManager = new GitWorktreeWorkspaceManager(repoRoot, storageRoot);
|
|
@@ -68,6 +71,7 @@ export class RunCycleService {
|
|
|
68
71
|
manifest: loadedManifest.manifest,
|
|
69
72
|
resolvedBaselineRef: loadedManifest.resolvedBaselineRef,
|
|
70
73
|
currentFrontier: frontier,
|
|
74
|
+
...(input.codexSession ? { codexSession: input.codexSession } : {}),
|
|
71
75
|
resumeRun: latestRun,
|
|
72
76
|
}, {
|
|
73
77
|
runStore,
|
|
@@ -87,9 +91,6 @@ export class RunCycleService {
|
|
|
87
91
|
...(warnings.length > 0 ? { warning: warnings.join("\n") } : {}),
|
|
88
92
|
};
|
|
89
93
|
}
|
|
90
|
-
if (recovery.classification === "manual_review_blocked") {
|
|
91
|
-
throw new Error(`Latest run ${latestRun.runId} is waiting for manual review`);
|
|
92
|
-
}
|
|
93
94
|
if (recovery.classification === "repair_required") {
|
|
94
95
|
warnings.push(`Latest run ${latestRun.runId} requires repair: ${recovery.reason}. Starting a fresh run.`);
|
|
95
96
|
}
|
|
@@ -102,6 +103,7 @@ export class RunCycleService {
|
|
|
102
103
|
manifest: loadedManifest.manifest,
|
|
103
104
|
resolvedBaselineRef: loadedManifest.resolvedBaselineRef,
|
|
104
105
|
currentFrontier: frontier,
|
|
106
|
+
...(input.codexSession ? { codexSession: input.codexSession } : {}),
|
|
105
107
|
}, {
|
|
106
108
|
runStore,
|
|
107
109
|
frontierStore,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cycle-service.js","sourceRoot":"","sources":["../../../src/app/services/run-cycle-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,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,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"run-cycle-service.js","sourceRoot":"","sources":["../../../src/app/services/run-cycle-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,12 +15,11 @@ export class RunLoopService {
|
|
|
15
15
|
async run(input) {
|
|
16
16
|
const repoRoot = resolve(input.repoRoot);
|
|
17
17
|
const manifestPath = resolve(repoRoot, input.manifestPath ?? DEFAULT_MANIFEST_FILENAME);
|
|
18
|
+
validatePositiveIntegerOption(input.cycles, "--cycles");
|
|
19
|
+
validatePositiveIntegerOption(input.untilNoImprove, "--until-no-improve");
|
|
18
20
|
const progressiveMode = Boolean(input.untilTarget) || input.untilNoImprove !== undefined;
|
|
19
21
|
const exactCycles = progressiveMode ? null : input.cycles ?? 1;
|
|
20
22
|
const maxCycles = progressiveMode ? input.cycles ?? null : exactCycles;
|
|
21
|
-
if (input.untilNoImprove !== undefined && input.untilNoImprove < 1) {
|
|
22
|
-
throw new Error("--until-no-improve requires a positive integer");
|
|
23
|
-
}
|
|
24
23
|
const manifestState = await loadManifestState(repoRoot, manifestPath);
|
|
25
24
|
const warnings = new Set();
|
|
26
25
|
const results = [];
|
|
@@ -135,6 +134,7 @@ async function loadManifestState(repoRoot, manifestPath) {
|
|
|
135
134
|
frontierStore,
|
|
136
135
|
runs: await runStore.list(),
|
|
137
136
|
decisions: await decisionStore.list(),
|
|
137
|
+
mode: "read_only",
|
|
138
138
|
});
|
|
139
139
|
return {
|
|
140
140
|
manifest: loadedManifest.manifest,
|
|
@@ -143,6 +143,14 @@ async function loadManifestState(repoRoot, manifestPath) {
|
|
|
143
143
|
: {}),
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
|
+
function validatePositiveIntegerOption(value, label) {
|
|
147
|
+
if (value === undefined) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
151
|
+
throw new Error(`${label} requires a positive integer`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
146
154
|
function buildMaxCycleStopReason(maxCycles, untilTarget, targetStatus) {
|
|
147
155
|
if (untilTarget) {
|
|
148
156
|
const targetText = targetStatus?.configured
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-loop-service.js","sourceRoot":"","sources":["../../../src/app/services/run-loop-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,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAA6B,MAAM,qCAAqC,CAAC;AAExG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAkBzD,MAAM,OAAO,cAAc;IACR,YAAY,CAAkB;IAE/C,YAAmB,eAA4C,EAAE;QAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,KAA0B;QACzC,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,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC;QACzF,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QAEvE,
|
|
1
|
+
{"version":3,"file":"run-loop-service.js","sourceRoot":"","sources":["../../../src/app/services/run-loop-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RunNotFoundError, inspectRun } from "../../app/services/project-state-service.js";
|
|
2
|
+
import { formatProposalDisplayLines } from "./proposer-display.js";
|
|
2
3
|
const defaultCommandIO = {
|
|
3
4
|
stdout: (message) => {
|
|
4
5
|
process.stdout.write(`${message}\n`);
|
|
@@ -21,6 +22,7 @@ export async function runInspectCommand(runId, options, io = defaultCommandIO) {
|
|
|
21
22
|
const selectedDiagnostics = result.decision?.diagnostics?.reasons.join(", ") ?? "n/a";
|
|
22
23
|
io.stdout([
|
|
23
24
|
`run: ${result.run.runId} (${result.run.status})`,
|
|
25
|
+
...formatProposalDisplayLines(result.run.proposal, "proposer"),
|
|
24
26
|
`recovery: ${result.recovery.classification} (${result.recovery.nextAction})`,
|
|
25
27
|
`decision: ${result.decision?.outcome ?? "n/a"}`,
|
|
26
28
|
`reason: ${result.explainability.decisionReason ?? "n/a"}`,
|