ralph-research 0.1.2 → 0.1.3

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 (127) hide show
  1. package/README.md +127 -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/manifest-loader.js +8 -1
  9. package/dist/adapters/fs/manifest-loader.js.map +1 -1
  10. package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
  11. package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
  12. package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
  13. package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
  14. package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
  15. package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
  16. package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
  17. package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
  18. package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
  19. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
  20. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
  21. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
  22. package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
  23. package/dist/adapters/proposer/proposer-factory.js +19 -0
  24. package/dist/adapters/proposer/proposer-factory.js.map +1 -0
  25. package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
  26. package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
  27. package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
  28. package/dist/app/services/research-project-defaults-service.d.ts +18 -0
  29. package/dist/app/services/research-project-defaults-service.js +175 -0
  30. package/dist/app/services/research-project-defaults-service.js.map +1 -0
  31. package/dist/app/services/research-session-draft-service.d.ts +121 -0
  32. package/dist/app/services/research-session-draft-service.js +846 -0
  33. package/dist/app/services/research-session-draft-service.js.map +1 -0
  34. package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
  35. package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
  36. package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
  37. package/dist/app/services/research-session-interactive-service.d.ts +35 -0
  38. package/dist/app/services/research-session-interactive-service.js +295 -0
  39. package/dist/app/services/research-session-interactive-service.js.map +1 -0
  40. package/dist/app/services/research-session-launch-service.d.ts +46 -0
  41. package/dist/app/services/research-session-launch-service.js +389 -0
  42. package/dist/app/services/research-session-launch-service.js.map +1 -0
  43. package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
  44. package/dist/app/services/research-session-orchestrator-service.js +614 -0
  45. package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
  46. package/dist/app/services/research-session-recovery-service.d.ts +30 -0
  47. package/dist/app/services/research-session-recovery-service.js +110 -0
  48. package/dist/app/services/research-session-recovery-service.js.map +1 -0
  49. package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
  50. package/dist/app/services/research-session-wizard-controller.js +220 -0
  51. package/dist/app/services/research-session-wizard-controller.js.map +1 -0
  52. package/dist/app/services/run-cycle-service.d.ts +2 -0
  53. package/dist/app/services/run-cycle-service.js +2 -0
  54. package/dist/app/services/run-cycle-service.js.map +1 -1
  55. package/dist/cli/commands/inspect.js +2 -0
  56. package/dist/cli/commands/inspect.js.map +1 -1
  57. package/dist/cli/commands/launch.d.ts +16 -0
  58. package/dist/cli/commands/launch.js +68 -0
  59. package/dist/cli/commands/launch.js.map +1 -0
  60. package/dist/cli/commands/proposer-display.d.ts +2 -0
  61. package/dist/cli/commands/proposer-display.js +18 -0
  62. package/dist/cli/commands/proposer-display.js.map +1 -0
  63. package/dist/cli/commands/resume.d.ts +14 -0
  64. package/dist/cli/commands/resume.js +134 -0
  65. package/dist/cli/commands/resume.js.map +1 -0
  66. package/dist/cli/commands/run.d.ts +1 -1
  67. package/dist/cli/commands/run.js +2 -2
  68. package/dist/cli/commands/run.js.map +1 -1
  69. package/dist/cli/commands/status.js +4 -0
  70. package/dist/cli/commands/status.js.map +1 -1
  71. package/dist/cli/main.js +2 -29
  72. package/dist/cli/main.js.map +1 -1
  73. package/dist/cli/program.d.ts +15 -0
  74. package/dist/cli/program.js +54 -0
  75. package/dist/cli/program.js.map +1 -0
  76. package/dist/cli/tui/research-session-shell.d.ts +22 -0
  77. package/dist/cli/tui/research-session-shell.js +719 -0
  78. package/dist/cli/tui/research-session-shell.js.map +1 -0
  79. package/dist/core/engine/cycle-runner.d.ts +4 -0
  80. package/dist/core/engine/cycle-runner.js +15 -9
  81. package/dist/core/engine/cycle-runner.js.map +1 -1
  82. package/dist/core/manifest/admission.d.ts +1 -0
  83. package/dist/core/manifest/admission.js +50 -0
  84. package/dist/core/manifest/admission.js.map +1 -1
  85. package/dist/core/manifest/defaults.d.ts +21 -0
  86. package/dist/core/manifest/defaults.js +21 -0
  87. package/dist/core/manifest/defaults.js.map +1 -1
  88. package/dist/core/manifest/schema.d.ts +170 -0
  89. package/dist/core/manifest/schema.js +21 -1
  90. package/dist/core/manifest/schema.js.map +1 -1
  91. package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
  92. package/dist/core/model/codex-cli-cycle-session.js +2 -0
  93. package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
  94. package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
  95. package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
  96. package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
  97. package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
  98. package/dist/core/model/codex-cli-session-outcome.js +70 -0
  99. package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
  100. package/dist/core/model/research-project-defaults.d.ts +48 -0
  101. package/dist/core/model/research-project-defaults.js +46 -0
  102. package/dist/core/model/research-project-defaults.js.map +1 -0
  103. package/dist/core/model/research-session.d.ts +1143 -0
  104. package/dist/core/model/research-session.js +689 -0
  105. package/dist/core/model/research-session.js.map +1 -0
  106. package/dist/core/model/run-record.d.ts +56 -6
  107. package/dist/core/model/run-record.js +28 -0
  108. package/dist/core/model/run-record.js.map +1 -1
  109. package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
  110. package/dist/core/ports/research-project-defaults-store.js +2 -0
  111. package/dist/core/ports/research-project-defaults-store.js.map +1 -0
  112. package/dist/core/ports/research-session-repository.d.ts +25 -0
  113. package/dist/core/ports/research-session-repository.js +2 -0
  114. package/dist/core/ports/research-session-repository.js.map +1 -0
  115. package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
  116. package/dist/core/state/research-session-recovery-classifier.js +236 -0
  117. package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
  118. package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
  119. package/dist/core/state/research-session-resume-candidate.js +62 -0
  120. package/dist/core/state/research-session-resume-candidate.js.map +1 -0
  121. package/dist/core/state/research-session-state-machine.d.ts +62 -0
  122. package/dist/core/state/research-session-state-machine.js +443 -0
  123. package/dist/core/state/research-session-state-machine.js.map +1 -0
  124. package/dist/mcp/server.d.ts +4 -0
  125. package/dist/mcp/server.js +192 -1
  126. package/dist/mcp/server.js.map +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,389 @@
1
+ import { 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_ALLOWED_GLOBS, DEFAULT_CODEX_CLI_APPROVAL_POLICY, DEFAULT_CODEX_CLI_SANDBOX_MODE, DEFAULT_PROJECT_BASELINE_REF, DEFAULT_SESSION_INSUFFICIENT_EVIDENCE_LIMIT, DEFAULT_SESSION_NO_PROGRESS_LIMIT, DEFAULT_SESSION_REPEATED_FAILURE_LIMIT, DEFAULT_STORAGE_ROOT, DEFAULT_TTY_SESSION_STARTUP_TIMEOUT_SEC, DEFAULT_TTY_SESSION_TURN_TIMEOUT_SEC, } from "../../core/manifest/defaults.js";
5
+ import { selectResearchSessionResumeCandidate } from "../../core/state/research-session-resume-candidate.js";
6
+ import { buildResearchSessionReviewStateFromValues } from "./research-session-draft-service.js";
7
+ import { mapDetectedResearchSessionToEntryFlowSummary, } from "./research-session-entry-flow-summary-mapper.js";
8
+ import { ResearchProjectDefaultsService } from "./research-project-defaults-service.js";
9
+ import { ResearchSessionRecoveryService } from "./research-session-recovery-service.js";
10
+ const LAUNCH_DRAFT_SESSION_ID = "launch-draft";
11
+ const LAUNCH_DISCOVERY_SESSION_STATUSES = ["running", "halted"];
12
+ export class ResearchSessionLaunchService {
13
+ now;
14
+ createRepository;
15
+ recoveryService;
16
+ projectDefaultsService;
17
+ constructor(dependencies = {}) {
18
+ this.now = dependencies.now ?? (() => new Date());
19
+ this.createRepository =
20
+ dependencies.createRepository ??
21
+ ((sessionsRoot) => new JsonFileResearchSessionRepository(sessionsRoot));
22
+ this.recoveryService =
23
+ dependencies.recoveryService ??
24
+ dependencies.createRecoveryService?.() ??
25
+ new ResearchSessionRecoveryService({
26
+ createRepository: this.createRepository,
27
+ });
28
+ this.projectDefaultsService =
29
+ dependencies.projectDefaultsService ??
30
+ dependencies.createProjectDefaultsService?.() ??
31
+ new ResearchProjectDefaultsService({
32
+ ...(dependencies.now ? { now: dependencies.now } : {}),
33
+ });
34
+ }
35
+ async launch(input) {
36
+ const goal = input.goal.trim();
37
+ if (!goal) {
38
+ throw new Error("Goal is required");
39
+ }
40
+ const repoRoot = resolve(input.repoRoot);
41
+ const repoStats = await stat(repoRoot).catch(() => null);
42
+ if (!repoStats?.isDirectory()) {
43
+ throw new Error(`Working directory is not a directory: ${repoRoot}`);
44
+ }
45
+ const canonicalRepoRoot = await realpath(repoRoot);
46
+ const storageRoot = join(canonicalRepoRoot, DEFAULT_STORAGE_ROOT);
47
+ const sessionsRoot = join(storageRoot, "sessions");
48
+ const sessionPath = join(sessionsRoot, LAUNCH_DRAFT_SESSION_ID, "session.json");
49
+ const sessionRepository = this.createRepository(sessionsRoot);
50
+ const existingDraft = await sessionRepository.loadSession(LAUNCH_DRAFT_SESSION_ID);
51
+ const projectDefaults = await this.projectDefaultsService.loadForRepo(canonicalRepoRoot);
52
+ const draft = this.buildDraftRecord({
53
+ existingDraft,
54
+ goal,
55
+ projectDefaults,
56
+ repoRoot: canonicalRepoRoot,
57
+ });
58
+ await sessionRepository.saveSession(draft);
59
+ await this.projectDefaultsService.saveForSession({
60
+ repoRoot: canonicalRepoRoot,
61
+ session: draft,
62
+ });
63
+ const existingSession = await this.findExistingSession({
64
+ goal,
65
+ repoRoot: canonicalRepoRoot,
66
+ repository: sessionRepository,
67
+ });
68
+ return {
69
+ goal: draft.draftState?.flowState?.outputs?.goal ?? draft.draftState?.goalStep?.goal ?? draft.goal,
70
+ repoRoot: canonicalRepoRoot,
71
+ interface: "tui",
72
+ status: existingDraft ? "draft_refreshed" : "draft_created",
73
+ sessionId: draft.sessionId,
74
+ sessionPath,
75
+ ...(existingSession?.selectedCandidateSummary
76
+ ? {
77
+ selectedCandidateSummary: existingSession.selectedCandidateSummary,
78
+ }
79
+ : {}),
80
+ ...(existingSession ? { existingSession } : {}),
81
+ ...(existingSession?.resumableSession
82
+ ? {
83
+ resumableSession: existingSession.resumableSession,
84
+ }
85
+ : {}),
86
+ };
87
+ }
88
+ async findExistingSession(input) {
89
+ const sessions = await this.queryStartupSessionMetadata(input.repository, input.repoRoot);
90
+ const candidate = selectResearchSessionResumeCandidate({
91
+ goal: input.goal,
92
+ sessions,
93
+ });
94
+ if (!candidate) {
95
+ return undefined;
96
+ }
97
+ const inspection = await this.recoveryService.inspectSession({
98
+ repoRoot: input.repoRoot,
99
+ sessionId: candidate.sessionId,
100
+ });
101
+ const entryFlowSummary = mapDetectedResearchSessionToEntryFlowSummary(inspection);
102
+ return {
103
+ session: inspection.session,
104
+ lifecycle: inspection.lifecycle,
105
+ recovery: inspection.recovery,
106
+ selectedCandidateSummary: entryFlowSummary.selectedCandidateSummary,
107
+ ...(entryFlowSummary.resumableSession
108
+ ? { resumableSession: entryFlowSummary.resumableSession }
109
+ : {}),
110
+ };
111
+ }
112
+ async queryStartupSessionMetadata(repository, repoRoot) {
113
+ if (repository.querySessionMetadata) {
114
+ return repository.querySessionMetadata({
115
+ workingDirectory: repoRoot,
116
+ statuses: [...LAUNCH_DISCOVERY_SESSION_STATUSES],
117
+ });
118
+ }
119
+ const sessions = await repository.querySessions({
120
+ workingDirectory: repoRoot,
121
+ statuses: [...LAUNCH_DISCOVERY_SESSION_STATUSES],
122
+ });
123
+ return sessions.map((session) => ({
124
+ sessionId: session.sessionId,
125
+ goal: session.goal,
126
+ workingDirectory: session.workingDirectory,
127
+ status: session.status,
128
+ createdAt: session.createdAt,
129
+ updatedAt: session.updatedAt,
130
+ completedCycles: session.progress.completedCycles,
131
+ ...(session.progress.lastCheckpointAt
132
+ ? { lastCheckpointAt: session.progress.lastCheckpointAt }
133
+ : {}),
134
+ resumeFromCycle: session.resume.resumeFromCycle,
135
+ }));
136
+ }
137
+ buildDraftRecord(input) {
138
+ const timestamp = this.now().toISOString();
139
+ return {
140
+ sessionId: input.existingDraft?.sessionId ?? LAUNCH_DRAFT_SESSION_ID,
141
+ goal: input.existingDraft?.goal ?? input.goal,
142
+ workingDirectory: input.existingDraft?.workingDirectory ?? input.projectDefaults?.workingDirectory ?? input.repoRoot,
143
+ status: "draft",
144
+ agent: {
145
+ type: "codex_cli",
146
+ command: input.existingDraft?.agent.command ?? input.projectDefaults?.agent.command ?? "codex",
147
+ ...(input.existingDraft?.agent.model ?? input.projectDefaults?.agent.model
148
+ ? { model: input.existingDraft?.agent.model ?? input.projectDefaults?.agent.model }
149
+ : {}),
150
+ approvalPolicy: input.existingDraft?.agent.approvalPolicy ??
151
+ input.projectDefaults?.agent.approvalPolicy ??
152
+ DEFAULT_CODEX_CLI_APPROVAL_POLICY,
153
+ sandboxMode: input.existingDraft?.agent.sandboxMode ??
154
+ input.projectDefaults?.agent.sandboxMode ??
155
+ DEFAULT_CODEX_CLI_SANDBOX_MODE,
156
+ ttySession: {
157
+ startupTimeoutSec: input.existingDraft?.agent.ttySession.startupTimeoutSec ??
158
+ input.projectDefaults?.agent.ttySession.startupTimeoutSec ??
159
+ DEFAULT_TTY_SESSION_STARTUP_TIMEOUT_SEC,
160
+ turnTimeoutSec: input.existingDraft?.agent.ttySession.turnTimeoutSec ??
161
+ input.projectDefaults?.agent.ttySession.turnTimeoutSec ??
162
+ DEFAULT_TTY_SESSION_TURN_TIMEOUT_SEC,
163
+ },
164
+ },
165
+ context: {
166
+ trackableGlobs: input.existingDraft?.context.trackableGlobs ?? input.projectDefaults?.context.trackableGlobs ?? DEFAULT_ALLOWED_GLOBS,
167
+ webSearch: input.existingDraft?.context.webSearch ?? input.projectDefaults?.context.webSearch ?? true,
168
+ shellCommandAllowlistAdditions: input.existingDraft?.context.shellCommandAllowlistAdditions ??
169
+ input.projectDefaults?.context.shellCommandAllowlistAdditions ??
170
+ [],
171
+ shellCommandAllowlistRemovals: input.existingDraft?.context.shellCommandAllowlistRemovals ??
172
+ input.projectDefaults?.context.shellCommandAllowlistRemovals ??
173
+ [],
174
+ },
175
+ workspace: {
176
+ strategy: "git_worktree",
177
+ ...(input.existingDraft?.workspace.baseRef
178
+ ? { baseRef: input.existingDraft.workspace.baseRef }
179
+ : input.projectDefaults?.workspace.baseRef
180
+ ? { baseRef: input.projectDefaults.workspace.baseRef }
181
+ : {}),
182
+ promoted: false,
183
+ },
184
+ stopPolicy: input.existingDraft?.stopPolicy ??
185
+ input.projectDefaults?.stopPolicy ?? {
186
+ repeatedFailures: DEFAULT_SESSION_REPEATED_FAILURE_LIMIT,
187
+ noMeaningfulProgress: DEFAULT_SESSION_NO_PROGRESS_LIMIT,
188
+ insufficientEvidence: DEFAULT_SESSION_INSUFFICIENT_EVIDENCE_LIMIT,
189
+ },
190
+ progress: {
191
+ completedCycles: 0,
192
+ nextCycle: 1,
193
+ latestFrontierIds: [],
194
+ repeatedFailureStreak: 0,
195
+ noMeaningfulProgressStreak: 0,
196
+ insufficientEvidenceStreak: 0,
197
+ },
198
+ stopCondition: {
199
+ type: "none",
200
+ },
201
+ resume: {
202
+ resumable: true,
203
+ checkpointType: "completed_cycle_boundary",
204
+ resumeFromCycle: 1,
205
+ requiresUserConfirmation: false,
206
+ },
207
+ draftState: buildDraftState({
208
+ existingDraft: input.existingDraft,
209
+ goal: input.goal,
210
+ projectDefaults: input.projectDefaults,
211
+ repoRoot: input.repoRoot,
212
+ }),
213
+ createdAt: input.existingDraft?.createdAt ?? timestamp,
214
+ updatedAt: timestamp,
215
+ };
216
+ }
217
+ }
218
+ function buildDraftState(input) {
219
+ const currentStep = input.existingDraft?.draftState?.currentStep ?? "permissions";
220
+ const flowState = resolveDraftFlowState(input);
221
+ return {
222
+ currentStep,
223
+ completedSteps: resolveCompletedSteps({
224
+ completedSteps: input.existingDraft?.draftState?.completedSteps,
225
+ currentStep,
226
+ }),
227
+ returnToReview: input.existingDraft?.draftState?.returnToReview ?? false,
228
+ reviewConfirmed: input.existingDraft?.draftState?.reviewConfirmed ?? false,
229
+ flowState,
230
+ goalStep: {
231
+ goal: flowState.outputs.goal,
232
+ agentCommand: flowState.outputs.agentCommand,
233
+ repeatedFailures: flowState.stopRules.repeatedFailures,
234
+ noMeaningfulProgress: flowState.stopRules.noMeaningfulProgress,
235
+ insufficientEvidence: flowState.stopRules.insufficientEvidence,
236
+ },
237
+ contextStep: {
238
+ trackableGlobs: flowState.outputs.trackableGlobs,
239
+ webSearch: flowState.permissions.webSearch,
240
+ shellCommandAllowlistAdditions: flowState.permissions.shellCommandAllowlistAdditions,
241
+ shellCommandAllowlistRemovals: flowState.permissions.shellCommandAllowlistRemovals,
242
+ },
243
+ workspaceStep: {
244
+ workingDirectory: flowState.permissions.workingDirectory,
245
+ baseRef: flowState.outputs.baseRef,
246
+ },
247
+ agentStep: {
248
+ command: input.existingDraft?.draftState?.agentStep?.command ?? flowState.outputs.agentCommand,
249
+ model: flowState.outputs.model,
250
+ approvalPolicy: flowState.permissions.approvalPolicy,
251
+ sandboxMode: flowState.permissions.sandboxMode,
252
+ startupTimeoutSec: flowState.outputs.startupTimeoutSec,
253
+ turnTimeoutSec: flowState.outputs.turnTimeoutSec,
254
+ },
255
+ };
256
+ }
257
+ function resolveDraftFlowState(input) {
258
+ const permissions = input.existingDraft?.draftState?.flowState?.permissions;
259
+ const stopRules = input.existingDraft?.draftState?.flowState?.stopRules;
260
+ const outputs = input.existingDraft?.draftState?.flowState?.outputs;
261
+ const existingGoalStep = input.existingDraft?.draftState?.goalStep;
262
+ const existingContextStep = input.existingDraft?.draftState?.contextStep;
263
+ const existingWorkspaceStep = input.existingDraft?.draftState?.workspaceStep;
264
+ const existingAgentStep = input.existingDraft?.draftState?.agentStep;
265
+ const defaultContext = input.projectDefaults?.context;
266
+ const defaultWorkspace = input.projectDefaults?.workspace;
267
+ const defaultAgent = input.projectDefaults?.agent;
268
+ const defaultStopPolicy = input.projectDefaults?.stopPolicy;
269
+ const baseFlowState = {
270
+ permissions: {
271
+ workingDirectory: permissions?.workingDirectory ??
272
+ existingWorkspaceStep?.workingDirectory ??
273
+ input.existingDraft?.workingDirectory ??
274
+ input.projectDefaults?.workingDirectory ??
275
+ input.repoRoot,
276
+ webSearch: permissions?.webSearch ??
277
+ existingContextStep?.webSearch ??
278
+ (input.existingDraft?.context.webSearch ?? defaultContext?.webSearch ?? true ? "enabled" : "disabled"),
279
+ shellCommandAllowlistAdditions: permissions?.shellCommandAllowlistAdditions ??
280
+ existingContextStep?.shellCommandAllowlistAdditions ??
281
+ (input.existingDraft?.context.shellCommandAllowlistAdditions ??
282
+ defaultContext?.shellCommandAllowlistAdditions ??
283
+ []).join(", "),
284
+ shellCommandAllowlistRemovals: permissions?.shellCommandAllowlistRemovals ??
285
+ existingContextStep?.shellCommandAllowlistRemovals ??
286
+ (input.existingDraft?.context.shellCommandAllowlistRemovals ??
287
+ defaultContext?.shellCommandAllowlistRemovals ??
288
+ []).join(", "),
289
+ approvalPolicy: permissions?.approvalPolicy ??
290
+ existingAgentStep?.approvalPolicy ??
291
+ input.existingDraft?.agent.approvalPolicy ??
292
+ defaultAgent?.approvalPolicy ??
293
+ DEFAULT_CODEX_CLI_APPROVAL_POLICY,
294
+ sandboxMode: permissions?.sandboxMode ??
295
+ existingAgentStep?.sandboxMode ??
296
+ input.existingDraft?.agent.sandboxMode ??
297
+ defaultAgent?.sandboxMode ??
298
+ DEFAULT_CODEX_CLI_SANDBOX_MODE,
299
+ },
300
+ stopRules: {
301
+ repeatedFailures: stopRules?.repeatedFailures ??
302
+ existingGoalStep?.repeatedFailures ??
303
+ String(input.existingDraft?.stopPolicy.repeatedFailures ??
304
+ defaultStopPolicy?.repeatedFailures ??
305
+ DEFAULT_SESSION_REPEATED_FAILURE_LIMIT),
306
+ noMeaningfulProgress: stopRules?.noMeaningfulProgress ??
307
+ existingGoalStep?.noMeaningfulProgress ??
308
+ String(input.existingDraft?.stopPolicy.noMeaningfulProgress ??
309
+ defaultStopPolicy?.noMeaningfulProgress ??
310
+ DEFAULT_SESSION_NO_PROGRESS_LIMIT),
311
+ insufficientEvidence: stopRules?.insufficientEvidence ??
312
+ existingGoalStep?.insufficientEvidence ??
313
+ String(input.existingDraft?.stopPolicy.insufficientEvidence ??
314
+ defaultStopPolicy?.insufficientEvidence ??
315
+ DEFAULT_SESSION_INSUFFICIENT_EVIDENCE_LIMIT),
316
+ },
317
+ outputs: {
318
+ goal: outputs?.goal ?? existingGoalStep?.goal ?? input.existingDraft?.goal ?? input.goal,
319
+ trackableGlobs: outputs?.trackableGlobs ??
320
+ existingContextStep?.trackableGlobs ??
321
+ (input.existingDraft?.context.trackableGlobs ?? defaultContext?.trackableGlobs ?? DEFAULT_ALLOWED_GLOBS).join(", "),
322
+ baseRef: outputs?.baseRef ??
323
+ existingWorkspaceStep?.baseRef ??
324
+ input.existingDraft?.workspace.baseRef ??
325
+ defaultWorkspace?.baseRef ??
326
+ DEFAULT_PROJECT_BASELINE_REF,
327
+ agentCommand: outputs?.agentCommand ??
328
+ existingGoalStep?.agentCommand ??
329
+ existingAgentStep?.command ??
330
+ input.existingDraft?.agent.command ??
331
+ defaultAgent?.command ??
332
+ "codex",
333
+ model: outputs?.model ?? existingAgentStep?.model ?? input.existingDraft?.agent.model ?? defaultAgent?.model ?? "",
334
+ startupTimeoutSec: outputs?.startupTimeoutSec ??
335
+ existingAgentStep?.startupTimeoutSec ??
336
+ String(input.existingDraft?.agent.ttySession.startupTimeoutSec ??
337
+ defaultAgent?.ttySession.startupTimeoutSec ??
338
+ DEFAULT_TTY_SESSION_STARTUP_TIMEOUT_SEC),
339
+ turnTimeoutSec: outputs?.turnTimeoutSec ??
340
+ existingAgentStep?.turnTimeoutSec ??
341
+ String(input.existingDraft?.agent.ttySession.turnTimeoutSec ??
342
+ defaultAgent?.ttySession.turnTimeoutSec ??
343
+ DEFAULT_TTY_SESSION_TURN_TIMEOUT_SEC),
344
+ },
345
+ };
346
+ return {
347
+ ...baseFlowState,
348
+ review: input.existingDraft?.draftState?.flowState?.review ??
349
+ buildResearchSessionReviewStateFromValues({
350
+ workingDirectory: baseFlowState.permissions.workingDirectory,
351
+ webSearch: baseFlowState.permissions.webSearch,
352
+ shellCommandAllowlistAdditions: baseFlowState.permissions.shellCommandAllowlistAdditions,
353
+ shellCommandAllowlistRemovals: baseFlowState.permissions.shellCommandAllowlistRemovals,
354
+ approvalPolicy: baseFlowState.permissions.approvalPolicy,
355
+ sandboxMode: baseFlowState.permissions.sandboxMode,
356
+ repeatedFailures: baseFlowState.stopRules.repeatedFailures,
357
+ noMeaningfulProgress: baseFlowState.stopRules.noMeaningfulProgress,
358
+ insufficientEvidence: baseFlowState.stopRules.insufficientEvidence,
359
+ goal: baseFlowState.outputs.goal,
360
+ trackableGlobs: baseFlowState.outputs.trackableGlobs,
361
+ baseRef: baseFlowState.outputs.baseRef,
362
+ agentCommand: baseFlowState.outputs.agentCommand,
363
+ model: baseFlowState.outputs.model,
364
+ startupTimeoutSec: baseFlowState.outputs.startupTimeoutSec,
365
+ turnTimeoutSec: baseFlowState.outputs.turnTimeoutSec,
366
+ }),
367
+ };
368
+ }
369
+ function resolveCompletedSteps(input) {
370
+ if (input.completedSteps && input.completedSteps.length > 0) {
371
+ return normalizeCompletedSteps(input.completedSteps);
372
+ }
373
+ const currentIndex = DRAFT_STEP_ORDER.indexOf(input.currentStep);
374
+ if (currentIndex <= 0) {
375
+ return [];
376
+ }
377
+ return DRAFT_STEP_ORDER.slice(0, currentIndex);
378
+ }
379
+ function normalizeCompletedSteps(completedSteps) {
380
+ const completed = new Set(completedSteps);
381
+ return DRAFT_STEP_ORDER.filter((step) => completed.has(step));
382
+ }
383
+ const DRAFT_STEP_ORDER = [
384
+ "permissions",
385
+ "stopRules",
386
+ "outputs",
387
+ "review",
388
+ ];
389
+ //# sourceMappingURL=research-session-launch-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-session-launch-service.js","sourceRoot":"","sources":["../../../src/app/services/research-session-launch-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import type { DecisionRecord } from "../../core/model/decision-record.js";
2
+ import { CodexCliSessionLifecycleService, type CodexCliSessionReuseOrReplaceDecision } from "./codex-cli-session-lifecycle-service.js";
3
+ import { type CodexCliSessionLifecycleError, type CodexCliSessionLifecycleExit, type CodexCliSessionLifecyclePhase, type CodexCliSessionLifecycleRecord, type CodexCliSessionTty } from "../../core/model/codex-cli-session-lifecycle.js";
4
+ import { type ResearchSessionProgressSignal, type ResearchSessionRecord, type ResearchSessionStopCondition } from "../../core/model/research-session.js";
5
+ import type { RunRecord } from "../../core/model/run-record.js";
6
+ import type { ResearchSessionRepository } from "../../core/ports/research-session-repository.js";
7
+ import { ResearchSessionRecoveryService } from "./research-session-recovery-service.js";
8
+ import { RunCycleService, type RunCycleServiceResult } from "./run-cycle-service.js";
9
+ export type ResearchSessionOrchestratorStep = "session_started" | "session_resumed" | "cycle_executed" | "cycle_checkpointed" | "session_interrupted" | "session_halted" | "session_completed" | "session_failed";
10
+ export interface ResearchSessionCycleView {
11
+ completedCycles: number;
12
+ nextCycle: number;
13
+ latestRunId?: string;
14
+ latestDecisionId?: string;
15
+ latestFrontierIds: string[];
16
+ lastSignals?: ResearchSessionProgressSignal;
17
+ sessionResolution?: CodexCliSessionReuseOrReplaceDecision;
18
+ run?: RunRecord;
19
+ decision?: DecisionRecord | null;
20
+ runResult?: RunCycleServiceResult;
21
+ }
22
+ export interface ResearchSessionOrchestratorStepResult {
23
+ step: ResearchSessionOrchestratorStep;
24
+ session: ResearchSessionRecord;
25
+ cycle: ResearchSessionCycleView;
26
+ }
27
+ export interface ResearchSessionOrchestratorServiceDependencies {
28
+ now?: () => Date;
29
+ createSessionId?: () => string;
30
+ createRepository?: (sessionsRoot: string) => ResearchSessionRepository;
31
+ recoveryService?: Pick<ResearchSessionRecoveryService, "classifySession">;
32
+ createRecoveryService?: () => Pick<ResearchSessionRecoveryService, "classifySession">;
33
+ lifecycleService?: Pick<CodexCliSessionLifecycleService, "resolveCycleSession">;
34
+ createLifecycleService?: () => Pick<CodexCliSessionLifecycleService, "resolveCycleSession">;
35
+ runCycleService?: Pick<RunCycleService, "run">;
36
+ createRunCycleService?: () => Pick<RunCycleService, "run">;
37
+ }
38
+ export interface StartResearchSessionInput {
39
+ repoRoot: string;
40
+ draftSessionId: string;
41
+ }
42
+ export interface ResumeResearchSessionInput {
43
+ repoRoot: string;
44
+ sessionId: string;
45
+ }
46
+ export interface ContinueResearchSessionInput extends ResumeResearchSessionInput {
47
+ }
48
+ export interface RecordResearchCycleInput {
49
+ repoRoot: string;
50
+ sessionId: string;
51
+ run: RunRecord;
52
+ decision: DecisionRecord | null;
53
+ frontierIds: string[];
54
+ signal: Omit<ResearchSessionProgressSignal, "cycle">;
55
+ }
56
+ export interface RecordResearchSessionInterruptionInput {
57
+ repoRoot: string;
58
+ sessionId: string;
59
+ note?: string;
60
+ }
61
+ export interface ExecuteResearchSessionCycleInput {
62
+ repoRoot: string;
63
+ sessionId: string;
64
+ manifestPath?: string;
65
+ fresh?: boolean;
66
+ }
67
+ export interface StepResearchSessionInput extends ExecuteResearchSessionCycleInput {
68
+ }
69
+ export interface RunResearchSessionCyclesInput extends StepResearchSessionInput {
70
+ maxCycles?: number;
71
+ }
72
+ export interface RunResearchSessionCyclesResult {
73
+ cyclesExecuted: number;
74
+ steps: ResearchSessionOrchestratorStepResult[];
75
+ session: ResearchSessionRecord;
76
+ }
77
+ export interface HaltResearchSessionInput {
78
+ repoRoot: string;
79
+ sessionId: string;
80
+ stopCondition: Extract<ResearchSessionStopCondition, {
81
+ type: "repeated_failures" | "no_meaningful_progress" | "insufficient_evidence" | "operator_stop";
82
+ }>;
83
+ }
84
+ export interface CompleteResearchSessionInput {
85
+ repoRoot: string;
86
+ sessionId: string;
87
+ summary: string;
88
+ evidenceBundlePath: string;
89
+ achievedAtCycle?: number;
90
+ promotion?: {
91
+ promotedRunId: string;
92
+ promotedDecisionId: string;
93
+ promotedCommitSha: string;
94
+ };
95
+ }
96
+ export interface FailResearchSessionInput {
97
+ repoRoot: string;
98
+ sessionId: string;
99
+ message: string;
100
+ stack?: string;
101
+ }
102
+ export interface RecordCodexSessionLifecycleInput {
103
+ repoRoot: string;
104
+ sessionId: string;
105
+ at?: string;
106
+ phase?: CodexCliSessionLifecyclePhase;
107
+ command?: string;
108
+ args?: string[];
109
+ codexSessionId?: string;
110
+ pid?: number;
111
+ tty?: Partial<CodexCliSessionTty>;
112
+ exit?: CodexCliSessionLifecycleExit;
113
+ error?: CodexCliSessionLifecycleError;
114
+ attachmentStatus?: "bound" | "released" | "unknown";
115
+ }
116
+ export declare class ResearchSessionOrchestratorService {
117
+ private readonly now;
118
+ private readonly createSessionId;
119
+ private readonly createRepository;
120
+ private readonly recoveryService;
121
+ private readonly lifecycleService;
122
+ private readonly runCycleService;
123
+ constructor(dependencies?: ResearchSessionOrchestratorServiceDependencies);
124
+ startSession(input: StartResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
125
+ resumeSession(input: ResumeResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
126
+ continueSession(input: ContinueResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
127
+ executeCycle(input: ExecuteResearchSessionCycleInput): Promise<ResearchSessionOrchestratorStepResult>;
128
+ step(input: StepResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
129
+ runCycles(input: RunResearchSessionCyclesInput): Promise<RunResearchSessionCyclesResult>;
130
+ recordCompletedCycle(input: RecordResearchCycleInput): Promise<ResearchSessionOrchestratorStepResult>;
131
+ recordInterruption(input: RecordResearchSessionInterruptionInput): Promise<ResearchSessionOrchestratorStepResult>;
132
+ haltSession(input: HaltResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
133
+ completeSession(input: CompleteResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
134
+ failSession(input: FailResearchSessionInput): Promise<ResearchSessionOrchestratorStepResult>;
135
+ recordCodexSessionLifecycle(input: RecordCodexSessionLifecycleInput): Promise<CodexCliSessionLifecycleRecord>;
136
+ private resolveRepository;
137
+ private loadSessionOrThrow;
138
+ private assertResumeSafety;
139
+ private loadLifecycle;
140
+ }