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.
Files changed (138) hide show
  1. package/README.md +132 -101
  2. package/dist/adapters/fs/json-file-research-project-defaults-store.d.ts +8 -0
  3. package/dist/adapters/fs/json-file-research-project-defaults-store.js +30 -0
  4. package/dist/adapters/fs/json-file-research-project-defaults-store.js.map +1 -0
  5. package/dist/adapters/fs/json-file-research-session-repository.d.ts +24 -0
  6. package/dist/adapters/fs/json-file-research-session-repository.js +199 -0
  7. package/dist/adapters/fs/json-file-research-session-repository.js.map +1 -0
  8. package/dist/adapters/fs/lockfile.js +142 -57
  9. package/dist/adapters/fs/lockfile.js.map +1 -1
  10. package/dist/adapters/fs/manifest-loader.js +8 -1
  11. package/dist/adapters/fs/manifest-loader.js.map +1 -1
  12. package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
  13. package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
  14. package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
  15. package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
  16. package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
  17. package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
  18. package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
  19. package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
  20. package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
  21. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
  22. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
  23. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
  24. package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
  25. package/dist/adapters/proposer/proposer-factory.js +19 -0
  26. package/dist/adapters/proposer/proposer-factory.js.map +1 -0
  27. package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
  28. package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
  29. package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
  30. package/dist/app/services/manual-decision-service.js +20 -9
  31. package/dist/app/services/manual-decision-service.js.map +1 -1
  32. package/dist/app/services/project-state-service.js +5 -3
  33. package/dist/app/services/project-state-service.js.map +1 -1
  34. package/dist/app/services/research-project-defaults-service.d.ts +18 -0
  35. package/dist/app/services/research-project-defaults-service.js +175 -0
  36. package/dist/app/services/research-project-defaults-service.js.map +1 -0
  37. package/dist/app/services/research-session-draft-service.d.ts +121 -0
  38. package/dist/app/services/research-session-draft-service.js +846 -0
  39. package/dist/app/services/research-session-draft-service.js.map +1 -0
  40. package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
  41. package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
  42. package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
  43. package/dist/app/services/research-session-interactive-service.d.ts +35 -0
  44. package/dist/app/services/research-session-interactive-service.js +295 -0
  45. package/dist/app/services/research-session-interactive-service.js.map +1 -0
  46. package/dist/app/services/research-session-launch-service.d.ts +46 -0
  47. package/dist/app/services/research-session-launch-service.js +389 -0
  48. package/dist/app/services/research-session-launch-service.js.map +1 -0
  49. package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
  50. package/dist/app/services/research-session-orchestrator-service.js +614 -0
  51. package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
  52. package/dist/app/services/research-session-recovery-service.d.ts +30 -0
  53. package/dist/app/services/research-session-recovery-service.js +110 -0
  54. package/dist/app/services/research-session-recovery-service.js.map +1 -0
  55. package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
  56. package/dist/app/services/research-session-wizard-controller.js +220 -0
  57. package/dist/app/services/research-session-wizard-controller.js.map +1 -0
  58. package/dist/app/services/run-cycle-service.d.ts +2 -0
  59. package/dist/app/services/run-cycle-service.js +8 -6
  60. package/dist/app/services/run-cycle-service.js.map +1 -1
  61. package/dist/app/services/run-loop-service.js +11 -3
  62. package/dist/app/services/run-loop-service.js.map +1 -1
  63. package/dist/cli/commands/inspect.js +2 -0
  64. package/dist/cli/commands/inspect.js.map +1 -1
  65. package/dist/cli/commands/launch.d.ts +16 -0
  66. package/dist/cli/commands/launch.js +68 -0
  67. package/dist/cli/commands/launch.js.map +1 -0
  68. package/dist/cli/commands/proposer-display.d.ts +2 -0
  69. package/dist/cli/commands/proposer-display.js +18 -0
  70. package/dist/cli/commands/proposer-display.js.map +1 -0
  71. package/dist/cli/commands/resume.d.ts +14 -0
  72. package/dist/cli/commands/resume.js +134 -0
  73. package/dist/cli/commands/resume.js.map +1 -0
  74. package/dist/cli/commands/run.d.ts +2 -2
  75. package/dist/cli/commands/run.js +15 -4
  76. package/dist/cli/commands/run.js.map +1 -1
  77. package/dist/cli/commands/status.js +4 -0
  78. package/dist/cli/commands/status.js.map +1 -1
  79. package/dist/cli/main.js +2 -29
  80. package/dist/cli/main.js.map +1 -1
  81. package/dist/cli/program.d.ts +15 -0
  82. package/dist/cli/program.js +54 -0
  83. package/dist/cli/program.js.map +1 -0
  84. package/dist/cli/tui/research-session-shell.d.ts +22 -0
  85. package/dist/cli/tui/research-session-shell.js +719 -0
  86. package/dist/cli/tui/research-session-shell.js.map +1 -0
  87. package/dist/core/engine/cycle-runner.d.ts +4 -0
  88. package/dist/core/engine/cycle-runner.js +15 -9
  89. package/dist/core/engine/cycle-runner.js.map +1 -1
  90. package/dist/core/manifest/admission.d.ts +1 -0
  91. package/dist/core/manifest/admission.js +50 -0
  92. package/dist/core/manifest/admission.js.map +1 -1
  93. package/dist/core/manifest/defaults.d.ts +21 -0
  94. package/dist/core/manifest/defaults.js +21 -0
  95. package/dist/core/manifest/defaults.js.map +1 -1
  96. package/dist/core/manifest/schema.d.ts +170 -0
  97. package/dist/core/manifest/schema.js +21 -1
  98. package/dist/core/manifest/schema.js.map +1 -1
  99. package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
  100. package/dist/core/model/codex-cli-cycle-session.js +2 -0
  101. package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
  102. package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
  103. package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
  104. package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
  105. package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
  106. package/dist/core/model/codex-cli-session-outcome.js +70 -0
  107. package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
  108. package/dist/core/model/research-project-defaults.d.ts +48 -0
  109. package/dist/core/model/research-project-defaults.js +46 -0
  110. package/dist/core/model/research-project-defaults.js.map +1 -0
  111. package/dist/core/model/research-session.d.ts +1143 -0
  112. package/dist/core/model/research-session.js +689 -0
  113. package/dist/core/model/research-session.js.map +1 -0
  114. package/dist/core/model/run-record.d.ts +56 -6
  115. package/dist/core/model/run-record.js +28 -0
  116. package/dist/core/model/run-record.js.map +1 -1
  117. package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
  118. package/dist/core/ports/research-project-defaults-store.js +2 -0
  119. package/dist/core/ports/research-project-defaults-store.js.map +1 -0
  120. package/dist/core/ports/research-session-repository.d.ts +25 -0
  121. package/dist/core/ports/research-session-repository.js +2 -0
  122. package/dist/core/ports/research-session-repository.js.map +1 -0
  123. package/dist/core/state/frontier-materializer.d.ts +2 -0
  124. package/dist/core/state/frontier-materializer.js +11 -2
  125. package/dist/core/state/frontier-materializer.js.map +1 -1
  126. package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
  127. package/dist/core/state/research-session-recovery-classifier.js +236 -0
  128. package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
  129. package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
  130. package/dist/core/state/research-session-resume-candidate.js +62 -0
  131. package/dist/core/state/research-session-resume-candidate.js.map +1 -0
  132. package/dist/core/state/research-session-state-machine.d.ts +62 -0
  133. package/dist/core/state/research-session-state-machine.js +443 -0
  134. package/dist/core/state/research-session-state-machine.js.map +1 -0
  135. package/dist/mcp/server.d.ts +4 -0
  136. package/dist/mcp/server.js +192 -1
  137. package/dist/mcp/server.js.map +1 -1
  138. package/package.json +1 -1
@@ -0,0 +1,62 @@
1
+ export function selectResearchSessionResumeCandidate(input) {
2
+ const normalizedGoal = normalizeGoal(input.goal);
3
+ const goalMatches = input.sessions.filter((session) => normalizeGoal(session.goal) === normalizedGoal);
4
+ const candidatePool = goalMatches.length > 0 ? goalMatches : input.sessions;
5
+ return [...candidatePool].sort(compareResumeCandidates)[0];
6
+ }
7
+ function compareResumeCandidates(left, right) {
8
+ const statusPriorityDelta = getStatusPriority(right) - getStatusPriority(left);
9
+ if (statusPriorityDelta !== 0) {
10
+ return statusPriorityDelta;
11
+ }
12
+ const completedCyclesDelta = getCompletedCycles(right) - getCompletedCycles(left);
13
+ if (completedCyclesDelta !== 0) {
14
+ return completedCyclesDelta;
15
+ }
16
+ const checkpointDelta = parseTimestamp(getLastCheckpointAt(right)) - parseTimestamp(getLastCheckpointAt(left));
17
+ if (checkpointDelta !== 0) {
18
+ return checkpointDelta;
19
+ }
20
+ const updatedAtDelta = parseTimestamp(right.updatedAt) - parseTimestamp(left.updatedAt);
21
+ if (updatedAtDelta !== 0) {
22
+ return updatedAtDelta;
23
+ }
24
+ const createdAtDelta = parseTimestamp(right.createdAt) - parseTimestamp(left.createdAt);
25
+ if (createdAtDelta !== 0) {
26
+ return createdAtDelta;
27
+ }
28
+ return right.sessionId.localeCompare(left.sessionId);
29
+ }
30
+ function getStatusPriority(session) {
31
+ switch (session.status) {
32
+ case "halted":
33
+ return 1;
34
+ case "running":
35
+ return 0;
36
+ default:
37
+ return -1;
38
+ }
39
+ }
40
+ function normalizeGoal(goal) {
41
+ return goal.trim();
42
+ }
43
+ function getCompletedCycles(session) {
44
+ if ("progress" in session) {
45
+ return session.progress.completedCycles;
46
+ }
47
+ return session.completedCycles;
48
+ }
49
+ function getLastCheckpointAt(session) {
50
+ if ("progress" in session) {
51
+ return session.progress.lastCheckpointAt;
52
+ }
53
+ return session.lastCheckpointAt;
54
+ }
55
+ function parseTimestamp(value) {
56
+ if (!value) {
57
+ return Number.NEGATIVE_INFINITY;
58
+ }
59
+ const parsed = Date.parse(value);
60
+ return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;
61
+ }
62
+ //# sourceMappingURL=research-session-resume-candidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-session-resume-candidate.js","sourceRoot":"","sources":["../../../src/core/state/research-session-resume-candidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { DecisionRecord } from "../model/decision-record.js";
2
+ import { type ResearchSessionProgressSignal, type ResearchSessionRecord, type ResearchSessionStopCondition } from "../model/research-session.js";
3
+ import type { RunRecord } from "../model/run-record.js";
4
+ export interface AdvanceResearchSessionCompletedCycleInput {
5
+ current: ResearchSessionRecord;
6
+ run: RunRecord;
7
+ decision: DecisionRecord | null;
8
+ frontierIds: string[];
9
+ signal: Omit<ResearchSessionProgressSignal, "cycle">;
10
+ at: string;
11
+ }
12
+ export interface AdvanceResearchSessionCompletedCycleResult {
13
+ transition: "cycle_checkpointed" | "session_halted";
14
+ session: ResearchSessionRecord;
15
+ }
16
+ export declare function startResearchSessionFromDraft(input: {
17
+ draft: ResearchSessionRecord;
18
+ sessionId: string;
19
+ at: string;
20
+ }): ResearchSessionRecord;
21
+ export declare function resumeResearchSession(input: {
22
+ current: ResearchSessionRecord;
23
+ at: string;
24
+ }): ResearchSessionRecord;
25
+ export declare function advanceResearchSessionCompletedCycle(input: AdvanceResearchSessionCompletedCycleInput): AdvanceResearchSessionCompletedCycleResult;
26
+ export declare function interruptResearchSession(input: {
27
+ current: ResearchSessionRecord;
28
+ at: string;
29
+ note?: string;
30
+ }): ResearchSessionRecord;
31
+ export declare function haltResearchSession(input: {
32
+ current: ResearchSessionRecord;
33
+ stopCondition: Extract<ResearchSessionStopCondition, {
34
+ type: "repeated_failures" | "no_meaningful_progress" | "insufficient_evidence" | "operator_stop";
35
+ }>;
36
+ at: string;
37
+ }): ResearchSessionRecord;
38
+ export declare function completeResearchSession(input: {
39
+ current: ResearchSessionRecord;
40
+ summary: string;
41
+ evidenceBundlePath: string;
42
+ achievedAtCycle?: number;
43
+ promotion?: {
44
+ promotedRunId: string;
45
+ promotedDecisionId: string;
46
+ promotedCommitSha: string;
47
+ };
48
+ at: string;
49
+ }): ResearchSessionRecord;
50
+ export declare function failResearchSession(input: {
51
+ current: ResearchSessionRecord;
52
+ message: string;
53
+ stack?: string;
54
+ at: string;
55
+ }): ResearchSessionRecord;
56
+ export declare function deriveResearchSessionCompletedCycleStopCondition(input: {
57
+ session: ResearchSessionRecord;
58
+ run: RunRecord;
59
+ decision: DecisionRecord | null;
60
+ }): Extract<ResearchSessionStopCondition, {
61
+ type: "repeated_failures" | "no_meaningful_progress" | "insufficient_evidence" | "operator_stop";
62
+ }> | null;
@@ -0,0 +1,443 @@
1
+ import { isResumableResearchSessionStatus, researchSessionRecordSchema, } from "../model/research-session.js";
2
+ export function startResearchSessionFromDraft(input) {
3
+ if (input.draft.status !== "draft") {
4
+ throw new Error(`Session ${input.draft.sessionId} is not a launch draft`);
5
+ }
6
+ const started = researchSessionRecordSchema.parse({
7
+ sessionId: normalizeRequiredString(input.sessionId, "Session id"),
8
+ goal: input.draft.goal,
9
+ workingDirectory: input.draft.workingDirectory,
10
+ status: "running",
11
+ agent: {
12
+ ...input.draft.agent,
13
+ ttySession: {
14
+ ...input.draft.agent.ttySession,
15
+ },
16
+ },
17
+ context: {
18
+ trackableGlobs: [...input.draft.context.trackableGlobs],
19
+ webSearch: input.draft.context.webSearch,
20
+ shellCommandAllowlistAdditions: [...input.draft.context.shellCommandAllowlistAdditions],
21
+ shellCommandAllowlistRemovals: [...input.draft.context.shellCommandAllowlistRemovals],
22
+ },
23
+ workspace: {
24
+ strategy: "git_worktree",
25
+ ...(input.draft.workspace.baseRef ? { baseRef: input.draft.workspace.baseRef } : {}),
26
+ promoted: false,
27
+ },
28
+ stopPolicy: {
29
+ ...input.draft.stopPolicy,
30
+ },
31
+ progress: {
32
+ completedCycles: 0,
33
+ nextCycle: 1,
34
+ latestFrontierIds: [],
35
+ repeatedFailureStreak: 0,
36
+ noMeaningfulProgressStreak: 0,
37
+ insufficientEvidenceStreak: 0,
38
+ },
39
+ stopCondition: {
40
+ type: "none",
41
+ },
42
+ resume: {
43
+ resumable: true,
44
+ checkpointType: "completed_cycle_boundary",
45
+ resumeFromCycle: 1,
46
+ requiresUserConfirmation: false,
47
+ },
48
+ ...(input.draft.draftState
49
+ ? {
50
+ draftState: cloneResearchSessionDraftState(input.draft.draftState),
51
+ }
52
+ : {}),
53
+ createdAt: input.at,
54
+ updatedAt: input.at,
55
+ });
56
+ return researchSessionRecordSchema.parse({
57
+ ...started,
58
+ submittedSnapshot: createResearchSessionSubmittedSnapshot(started),
59
+ });
60
+ }
61
+ export function resumeResearchSession(input) {
62
+ if (!isResumableResearchSessionStatus(input.current.status)) {
63
+ throw new Error(`Session ${input.current.sessionId} cannot resume from status ${input.current.status}`);
64
+ }
65
+ const nextRecord = researchSessionRecordSchema.parse({
66
+ ...input.current,
67
+ status: "running",
68
+ stopCondition: {
69
+ type: "none",
70
+ },
71
+ resume: {
72
+ ...input.current.resume,
73
+ resumable: true,
74
+ requiresUserConfirmation: false,
75
+ },
76
+ updatedAt: input.at,
77
+ });
78
+ delete nextRecord.resume.interruptionDetectedAt;
79
+ delete nextRecord.resume.interruptedDuringCycle;
80
+ delete nextRecord.resume.note;
81
+ delete nextRecord.endedAt;
82
+ return researchSessionRecordSchema.parse(nextRecord);
83
+ }
84
+ export function advanceResearchSessionCompletedCycle(input) {
85
+ const checkpointed = checkpointResearchSessionCompletedCycle(input);
86
+ const stopCondition = deriveResearchSessionCompletedCycleStopCondition({
87
+ session: checkpointed,
88
+ run: input.run,
89
+ decision: input.decision,
90
+ });
91
+ if (!stopCondition) {
92
+ return {
93
+ transition: "cycle_checkpointed",
94
+ session: checkpointed,
95
+ };
96
+ }
97
+ return {
98
+ transition: "session_halted",
99
+ session: haltResearchSession({
100
+ current: checkpointed,
101
+ stopCondition,
102
+ at: input.at,
103
+ }),
104
+ };
105
+ }
106
+ export function interruptResearchSession(input) {
107
+ if (input.current.status !== "running") {
108
+ throw new Error(`Session ${input.current.sessionId} cannot record an interruption from status ${input.current.status}`);
109
+ }
110
+ const nextRecord = researchSessionRecordSchema.parse({
111
+ ...input.current,
112
+ status: "awaiting_resume",
113
+ stopCondition: {
114
+ type: "none",
115
+ },
116
+ resume: {
117
+ ...input.current.resume,
118
+ resumable: true,
119
+ requiresUserConfirmation: true,
120
+ interruptionDetectedAt: input.at,
121
+ interruptedDuringCycle: input.current.progress.nextCycle,
122
+ ...(input.note ? { note: normalizeRequiredString(input.note, "Resume note") } : {}),
123
+ },
124
+ updatedAt: input.at,
125
+ });
126
+ delete nextRecord.endedAt;
127
+ return researchSessionRecordSchema.parse(nextRecord);
128
+ }
129
+ export function haltResearchSession(input) {
130
+ if (input.current.status !== "running") {
131
+ throw new Error(`Session ${input.current.sessionId} cannot halt from status ${input.current.status}`);
132
+ }
133
+ const nextRecord = researchSessionRecordSchema.parse({
134
+ ...input.current,
135
+ status: "halted",
136
+ stopCondition: input.stopCondition,
137
+ resume: {
138
+ ...input.current.resume,
139
+ resumable: true,
140
+ requiresUserConfirmation: true,
141
+ },
142
+ updatedAt: input.at,
143
+ });
144
+ delete nextRecord.endedAt;
145
+ return researchSessionRecordSchema.parse(nextRecord);
146
+ }
147
+ export function completeResearchSession(input) {
148
+ if (input.current.status !== "running") {
149
+ throw new Error(`Session ${input.current.sessionId} cannot complete from status ${input.current.status}`);
150
+ }
151
+ const achievedAtCycle = input.achievedAtCycle ?? input.current.progress.completedCycles;
152
+ if (achievedAtCycle < 1) {
153
+ throw new Error("Goal completion requires at least one completed cycle");
154
+ }
155
+ const nextRecord = researchSessionRecordSchema.parse({
156
+ ...input.current,
157
+ status: "goal_achieved",
158
+ stopCondition: {
159
+ type: "goal_achieved",
160
+ summary: normalizeRequiredString(input.summary, "Goal summary"),
161
+ achievedAtCycle,
162
+ },
163
+ resume: {
164
+ ...input.current.resume,
165
+ resumable: false,
166
+ requiresUserConfirmation: false,
167
+ },
168
+ evidenceBundlePath: normalizeRequiredString(input.evidenceBundlePath, "Evidence bundle path"),
169
+ updatedAt: input.at,
170
+ endedAt: input.at,
171
+ });
172
+ delete nextRecord.resume.interruptionDetectedAt;
173
+ delete nextRecord.resume.interruptedDuringCycle;
174
+ delete nextRecord.resume.note;
175
+ if (input.promotion) {
176
+ nextRecord.workspace = {
177
+ ...input.current.workspace,
178
+ promoted: true,
179
+ promotedAt: input.at,
180
+ promotedRunId: input.promotion.promotedRunId,
181
+ promotedDecisionId: input.promotion.promotedDecisionId,
182
+ promotedCommitSha: input.promotion.promotedCommitSha,
183
+ };
184
+ }
185
+ return researchSessionRecordSchema.parse(nextRecord);
186
+ }
187
+ export function failResearchSession(input) {
188
+ if (!["running", "awaiting_resume", "halted"].includes(input.current.status)) {
189
+ throw new Error(`Session ${input.current.sessionId} cannot fail from status ${input.current.status}`);
190
+ }
191
+ const nextRecord = researchSessionRecordSchema.parse({
192
+ ...input.current,
193
+ status: "failed",
194
+ stopCondition: {
195
+ type: "unrecoverable_error",
196
+ message: normalizeRequiredString(input.message, "Failure message"),
197
+ ...(input.stack ? { stack: normalizeRequiredString(input.stack, "Failure stack") } : {}),
198
+ },
199
+ resume: {
200
+ ...input.current.resume,
201
+ resumable: false,
202
+ requiresUserConfirmation: false,
203
+ },
204
+ updatedAt: input.at,
205
+ endedAt: input.at,
206
+ });
207
+ delete nextRecord.resume.interruptionDetectedAt;
208
+ delete nextRecord.resume.interruptedDuringCycle;
209
+ delete nextRecord.resume.note;
210
+ return researchSessionRecordSchema.parse(nextRecord);
211
+ }
212
+ export function deriveResearchSessionCompletedCycleStopCondition(input) {
213
+ if (input.run.status === "needs_human" || input.decision?.outcome === "needs_human") {
214
+ return {
215
+ type: "operator_stop",
216
+ note: `Cycle ${input.run.cycle} requires manual review before continuing.`,
217
+ };
218
+ }
219
+ if (input.session.progress.repeatedFailureStreak >= input.session.stopPolicy.repeatedFailures) {
220
+ return {
221
+ type: "repeated_failures",
222
+ count: input.session.progress.repeatedFailureStreak,
223
+ threshold: input.session.stopPolicy.repeatedFailures,
224
+ };
225
+ }
226
+ if (input.session.progress.noMeaningfulProgressStreak >= input.session.stopPolicy.noMeaningfulProgress) {
227
+ return {
228
+ type: "no_meaningful_progress",
229
+ count: input.session.progress.noMeaningfulProgressStreak,
230
+ threshold: input.session.stopPolicy.noMeaningfulProgress,
231
+ };
232
+ }
233
+ if (input.session.progress.insufficientEvidenceStreak >= input.session.stopPolicy.insufficientEvidence) {
234
+ return {
235
+ type: "insufficient_evidence",
236
+ count: input.session.progress.insufficientEvidenceStreak,
237
+ threshold: input.session.stopPolicy.insufficientEvidence,
238
+ };
239
+ }
240
+ return null;
241
+ }
242
+ function checkpointResearchSessionCompletedCycle(input) {
243
+ if (input.current.status !== "running") {
244
+ throw new Error(`Session ${input.current.sessionId} cannot checkpoint a cycle from status ${input.current.status}`);
245
+ }
246
+ if (input.run.cycle !== input.current.progress.nextCycle) {
247
+ throw new Error(`Run ${input.run.runId} cycle ${input.run.cycle} does not match next resumable cycle ${input.current.progress.nextCycle}`);
248
+ }
249
+ const frontierIds = [...new Set(input.frontierIds)];
250
+ const nextRecord = researchSessionRecordSchema.parse({
251
+ ...input.current,
252
+ workspace: {
253
+ ...input.current.workspace,
254
+ currentRef: input.run.workspaceRef,
255
+ ...(input.run.workspacePath ? { currentPath: input.run.workspacePath } : {}),
256
+ },
257
+ progress: {
258
+ completedCycles: input.run.cycle,
259
+ nextCycle: input.run.cycle + 1,
260
+ latestRunId: input.run.runId,
261
+ ...(input.decision ? { latestDecisionId: input.decision.decisionId } : {}),
262
+ latestFrontierIds: frontierIds,
263
+ repeatedFailureStreak: input.signal.outcome === "failed" ? input.current.progress.repeatedFailureStreak + 1 : 0,
264
+ noMeaningfulProgressStreak: input.signal.meaningfulProgress ? 0 : input.current.progress.noMeaningfulProgressStreak + 1,
265
+ insufficientEvidenceStreak: input.signal.insufficientEvidence ? input.current.progress.insufficientEvidenceStreak + 1 : 0,
266
+ ...(input.signal.meaningfulProgress ? { lastMeaningfulProgressCycle: input.run.cycle } : {}),
267
+ lastCheckpointAt: input.at,
268
+ lastSignals: {
269
+ cycle: input.run.cycle,
270
+ ...input.signal,
271
+ },
272
+ },
273
+ stopCondition: {
274
+ type: "none",
275
+ },
276
+ resume: {
277
+ resumable: true,
278
+ checkpointType: "completed_cycle_boundary",
279
+ resumeFromCycle: input.run.cycle + 1,
280
+ requiresUserConfirmation: false,
281
+ checkpointRunId: input.run.runId,
282
+ ...(input.decision ? { checkpointDecisionId: input.decision.decisionId } : {}),
283
+ },
284
+ updatedAt: input.at,
285
+ });
286
+ if (!input.signal.meaningfulProgress && input.current.progress.lastMeaningfulProgressCycle !== undefined) {
287
+ nextRecord.progress.lastMeaningfulProgressCycle = input.current.progress.lastMeaningfulProgressCycle;
288
+ }
289
+ delete nextRecord.resume.interruptionDetectedAt;
290
+ delete nextRecord.resume.interruptedDuringCycle;
291
+ delete nextRecord.resume.note;
292
+ delete nextRecord.progress.latestDecisionId;
293
+ delete nextRecord.resume.checkpointDecisionId;
294
+ delete nextRecord.workspace.currentPath;
295
+ if (input.decision) {
296
+ nextRecord.progress.latestDecisionId = input.decision.decisionId;
297
+ nextRecord.resume.checkpointDecisionId = input.decision.decisionId;
298
+ }
299
+ if (input.run.workspacePath) {
300
+ nextRecord.workspace.currentPath = input.run.workspacePath;
301
+ }
302
+ delete nextRecord.endedAt;
303
+ return researchSessionRecordSchema.parse(nextRecord);
304
+ }
305
+ function normalizeRequiredString(value, label) {
306
+ const normalized = value.trim();
307
+ if (!normalized) {
308
+ throw new Error(`${label} is required`);
309
+ }
310
+ return normalized;
311
+ }
312
+ function cloneResearchSessionDraftState(draftState) {
313
+ return {
314
+ currentStep: draftState.currentStep,
315
+ completedSteps: [...draftState.completedSteps],
316
+ returnToReview: draftState.returnToReview,
317
+ reviewConfirmed: draftState.reviewConfirmed,
318
+ ...(draftState.flowState
319
+ ? {
320
+ flowState: {
321
+ ...(draftState.flowState.permissions
322
+ ? {
323
+ permissions: {
324
+ ...draftState.flowState.permissions,
325
+ },
326
+ }
327
+ : {}),
328
+ ...(draftState.flowState.stopRules
329
+ ? {
330
+ stopRules: {
331
+ ...draftState.flowState.stopRules,
332
+ },
333
+ }
334
+ : {}),
335
+ ...(draftState.flowState.outputs
336
+ ? {
337
+ outputs: {
338
+ ...draftState.flowState.outputs,
339
+ },
340
+ }
341
+ : {}),
342
+ ...(draftState.flowState.review
343
+ ? {
344
+ review: {
345
+ sections: draftState.flowState.review.sections.map((section) => ({
346
+ index: section.index,
347
+ label: section.label,
348
+ step: section.step,
349
+ fields: section.fields.map((field) => ({
350
+ label: field.label,
351
+ value: field.value,
352
+ })),
353
+ })),
354
+ },
355
+ }
356
+ : {}),
357
+ },
358
+ }
359
+ : {}),
360
+ ...(draftState.goalStep
361
+ ? {
362
+ goalStep: {
363
+ ...draftState.goalStep,
364
+ },
365
+ }
366
+ : {}),
367
+ ...(draftState.contextStep
368
+ ? {
369
+ contextStep: {
370
+ ...draftState.contextStep,
371
+ },
372
+ }
373
+ : {}),
374
+ ...(draftState.workspaceStep
375
+ ? {
376
+ workspaceStep: {
377
+ ...draftState.workspaceStep,
378
+ },
379
+ }
380
+ : {}),
381
+ ...(draftState.agentStep
382
+ ? {
383
+ agentStep: {
384
+ ...draftState.agentStep,
385
+ },
386
+ }
387
+ : {}),
388
+ };
389
+ }
390
+ function createResearchSessionSubmittedSnapshot(session) {
391
+ return {
392
+ sessionId: session.sessionId,
393
+ goal: session.goal,
394
+ workingDirectory: session.workingDirectory,
395
+ status: session.status,
396
+ agent: {
397
+ ...session.agent,
398
+ ttySession: {
399
+ ...session.agent.ttySession,
400
+ },
401
+ },
402
+ context: {
403
+ trackableGlobs: [...session.context.trackableGlobs],
404
+ webSearch: session.context.webSearch,
405
+ shellCommandAllowlistAdditions: [...session.context.shellCommandAllowlistAdditions],
406
+ shellCommandAllowlistRemovals: [...session.context.shellCommandAllowlistRemovals],
407
+ },
408
+ workspace: {
409
+ ...session.workspace,
410
+ },
411
+ stopPolicy: {
412
+ ...session.stopPolicy,
413
+ },
414
+ progress: {
415
+ ...session.progress,
416
+ latestFrontierIds: [...session.progress.latestFrontierIds],
417
+ ...(session.progress.lastSignals
418
+ ? {
419
+ lastSignals: {
420
+ ...session.progress.lastSignals,
421
+ newArtifacts: [...session.progress.lastSignals.newArtifacts],
422
+ reasons: [...session.progress.lastSignals.reasons],
423
+ },
424
+ }
425
+ : {}),
426
+ },
427
+ stopCondition: {
428
+ ...session.stopCondition,
429
+ },
430
+ resume: {
431
+ ...session.resume,
432
+ },
433
+ ...(session.draftState
434
+ ? {
435
+ draftState: cloneResearchSessionDraftState(session.draftState),
436
+ }
437
+ : {}),
438
+ createdAt: session.createdAt,
439
+ updatedAt: session.updatedAt,
440
+ ...(session.endedAt ? { endedAt: session.endedAt } : {}),
441
+ };
442
+ }
443
+ //# sourceMappingURL=research-session-state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-session-state-machine.js","sourceRoot":"","sources":["../../../src/core/state/research-session-state-machine.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ResearchSessionOrchestratorService } from "../app/services/research-session-orchestrator-service.js";
3
+ import { ResearchSessionRecoveryService } from "../app/services/research-session-recovery-service.js";
2
4
  export interface RalphResearchMcpServerOptions {
3
5
  repoRoot?: string;
6
+ createResearchSessionOrchestratorService?: () => Pick<ResearchSessionOrchestratorService, "startSession" | "continueSession">;
7
+ createResearchSessionRecoveryService?: () => Pick<ResearchSessionRecoveryService, "inspectSession">;
4
8
  }
5
9
  export declare function createRalphResearchMcpServer(options?: RalphResearchMcpServerOptions): McpServer;
6
10
  export declare function startMcpServer(options?: RalphResearchMcpServerOptions): Promise<McpServer>;