Skip to content

Commit 04ffc57

Browse files
committed
fix: address mixed-provider review follow-ups
1 parent 315e0a0 commit 04ffc57

19 files changed

Lines changed: 293 additions & 64 deletions

File tree

apps/api/src/handlers/environments/__tests__/createEnvironment.validation.test.ts

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/api/src/handlers/environments/createEnvironment.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import {
1515
type TaskPayload,
1616
environmentConfigSchema,
17+
getAmbiguousEnvironmentRepositoryError,
1718
getMissingEnvironmentRepositoryError,
1819
getEnvironmentRepositoryInstallationError,
1920
} from '@roomote/types';
@@ -69,7 +70,10 @@ export function getEnvironmentRepositoryConfigError(
6970
installationId: string | number | null | undefined;
7071
}>,
7172
): string | null {
72-
return getEnvironmentRepositoryInstallationError(repositoryRows);
73+
return (
74+
getAmbiguousEnvironmentRepositoryError(repositoryRows) ??
75+
getEnvironmentRepositoryInstallationError(repositoryRows)
76+
);
7377
}
7478

7579
function extractRunId(auth: McpAuth): number | null {

apps/api/src/handlers/tasks/__tests__/manageSourceControl.test.ts

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/api/src/handlers/tasks/manageSourceControl.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import {
66
completeClaimedLatestUserMessageForReplyQuote,
77
restoreClaimedLatestUserMessageForReplyQuote,
88
} from '@roomote/communication/messages';
9+
import { resolveRepositoryProvidersFromPayload } from '@roomote/types';
910
import {
1011
createOrUpdateSourceControlPullRequestForTaskRun,
1112
findTaskRunForSourceControlMutation,
13+
getPayloadRecord,
1214
manageSourceControlIssueForTaskRun,
1315
readSourceControlPullRequestForTaskRun,
1416
resolveSourceControlProviderForRepositoryFromPayload,
@@ -92,18 +94,19 @@ export async function manageSourceControl(
9294
runId: auth.authContext.runId,
9395
taskId,
9496
});
95-
const payload =
96-
taskRun.payload &&
97-
typeof taskRun.payload === 'object' &&
98-
!Array.isArray(taskRun.payload)
99-
? (taskRun.payload as Record<string, unknown>)
100-
: {};
101-
const targetProvider =
102-
input.sourceControlProvider ??
103-
resolveSourceControlProviderForRepositoryFromPayload(
97+
const payload = getPayloadRecord(taskRun.payload);
98+
let targetProvider = input.sourceControlProvider;
99+
const repositoryProviders = resolveRepositoryProvidersFromPayload(payload);
100+
101+
if (
102+
!targetProvider &&
103+
(!repositoryProviders || input.repositoryFullName in repositoryProviders)
104+
) {
105+
targetProvider = resolveSourceControlProviderForRepositoryFromPayload(
104106
payload,
105107
input.repositoryFullName,
106108
);
109+
}
107110
const bodyInput = 'body' in input ? input : null;
108111
const shouldQuote =
109112
targetProvider === 'github' &&

apps/web/src/lib/server/source-control-provider.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ export function resolveSelectedRepositorySourceControlProvider(
3232
return undefined;
3333
}
3434

35-
export function resolvePrimarySourceControlProvider(
36-
providers: SourceControlProvider[],
37-
): SourceControlProvider | undefined {
38-
return providers[0];
39-
}
40-
4135
/**
4236
* Resolve the provider for an environment-backed launch by delegating to the
4337
* shared resolver (single source of truth for the environment-repository join).

apps/web/src/trpc/commands/environments/index.test.ts

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/web/src/trpc/commands/environments/index.ts

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { enqueueTask } from '@roomote/cloud-agents/server';
2+
import { TRPCError } from '@trpc/server';
23
import {
34
createEnvironmentConfigVersionSnapshot,
45
db,
@@ -37,6 +38,7 @@ import {
3738
type ComputeProvider,
3839
type EnvironmentConfig,
3940
environmentConfigSchema,
41+
getAmbiguousEnvironmentRepositoryError,
4042
getEnvironmentRepositoryInstallationError,
4143
getMissingEnvironmentRepositoryError,
4244
isExitedRunStatus,
@@ -140,14 +142,17 @@ type EnvironmentRepositoryRow = {
140142
installationId: string | null;
141143
};
142144

143-
function getEnvironmentRepositoryConfigError(
145+
export function getEnvironmentRepositoryConfigError(
144146
repositoriesToValidate: EnvironmentRepositoryRow[],
145147
): string | null {
146-
return getEnvironmentRepositoryInstallationError(
147-
repositoriesToValidate.map((repository) => ({
148-
fullName: repository.fullName,
149-
installationId: repository.installationId,
150-
})),
148+
return (
149+
getAmbiguousEnvironmentRepositoryError(repositoriesToValidate) ??
150+
getEnvironmentRepositoryInstallationError(
151+
repositoriesToValidate.map((repository) => ({
152+
fullName: repository.fullName,
153+
installationId: repository.installationId,
154+
})),
155+
)
151156
);
152157
}
153158

@@ -197,7 +202,10 @@ async function resolveSelectedRepositories(
197202
const repository = repositoriesById.get(repositoryId);
198203

199204
if (!repository) {
200-
throw new Error('Selected repositories are no longer available.');
205+
throw new TRPCError({
206+
code: 'BAD_REQUEST',
207+
message: 'Selected repositories are no longer available.',
208+
});
201209
}
202210

203211
return {
@@ -211,7 +219,10 @@ async function resolveSelectedRepositories(
211219
getEnvironmentRepositoryConfigError(selectedRepositories);
212220

213221
if (repositoryConfigError) {
214-
throw new Error(repositoryConfigError);
222+
throw new TRPCError({
223+
code: 'BAD_REQUEST',
224+
message: repositoryConfigError,
225+
});
215226
}
216227

217228
return {
@@ -815,9 +826,23 @@ export async function startEnvironmentDefinitionTaskCommand(
815826
(repository) => repository.fullName,
816827
);
817828
const title = buildSetupEnvironmentTaskTitle(selectedRepositoryFullNames);
818-
const workspacePayload = buildEnvironmentDefinitionWorkspacePayload(
819-
selectedRepositoryFullNames,
820-
);
829+
let workspacePayload: ReturnType<
830+
typeof buildEnvironmentDefinitionWorkspacePayload
831+
>;
832+
try {
833+
workspacePayload = buildEnvironmentDefinitionWorkspacePayload(
834+
selectedRepositoryFullNames,
835+
);
836+
} catch (error) {
837+
throw new TRPCError({
838+
code: 'BAD_REQUEST',
839+
message:
840+
error instanceof Error
841+
? error.message
842+
: 'The selected repositories are invalid.',
843+
cause: error,
844+
});
845+
}
821846
const modelSelection = resolveEvalHarnessSelection({
822847
model: input.selectedModelId,
823848
});

apps/web/src/trpc/commands/setup-new/index.test.ts

Lines changed: 22 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)