History

prevent squashing some know errors

Julius Marminge committed 8 months ago

Commit 13eeb071 parent 1e9bac74 files · +22 −43Browse files

Unified · Split

4 files
  1. apps/server/src/orchestration/Layers/OrchestrationEngine.ts +1 −8
  2. apps/server/src/orchestration/Layers/ProviderCommandReactor.ts +7 −20
  3. apps/server/src/provider/Layers/CodexAdapter.ts +11 −5
  4. apps/server/src/wsServer.ts +3 −10
apps/server/src/orchestration/Layers/OrchestrationEngine.ts+1−8
@@ -49,13 +49,6 @@ function commandToAggregateRef(command: OrchestrationCommand): { · 48 unmodified lines
4949 }
5050 }
5151
52−function formatDispatchError(error: OrchestrationDispatchError): string {
53− if (error instanceof Error && error.message.length > 0) {
54− return error.message;
55− }
56− return String(error);
57−}
58−
5952 const makeOrchestrationEngine = Effect.gen(function* () {
6053 const sql = yield* SqlClient.SqlClient;
6154 const eventStore = yield* OrchestrationEventStore;
@@ -191,7 +184,7 @@ const makeOrchestrationEngine = Effect.gen(function* () { · 129 unmodified lines
191184 acceptedAt: new Date().toISOString(),
192185 resultSequence: readModel.snapshotSequence,
193186 status: "rejected",
194− error: formatDispatchError(error),
187+ error: error.message,
195188 })
196189 .pipe(Effect.catch(() => Effect.void));
197190 }
apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+7−20
@@ -16,7 +16,7 @@ import { Cache, Cause, Duration, Effect, Layer, Option, Queue, Schema, Stream } · 15 unmodified lines
1616
1717 import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
1818 import { GitCore } from "../../git/Services/GitCore.ts";
19−import { ProviderAdapterRequestError } from "../../provider/Errors.ts";
19+import { ProviderAdapterRequestError, ProviderServiceError } from "../../provider/Errors.ts";
2020 import { TextGeneration } from "../../git/Services/TextGeneration.ts";
2121 import { ProviderService } from "../../provider/Services/ProviderService.ts";
2222 import { OrchestrationEngineService } from "../Services/OrchestrationEngine.ts";
@@ -73,18 +73,8 @@ const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access"; · 50 unmodified lines
7373 const WORKTREE_BRANCH_PREFIX = "t3code";
7474 const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
7575
76−function toErrorMessage(error: unknown): string {
77− if (error instanceof Error && error.message.trim().length > 0) {
78− return error.message;
79− }
80− try {
81− return JSON.stringify(error);
82− } catch {
83− return String(error);
84− }
85−}
86−
87−function isUnknownPendingApprovalRequestError(error: unknown): boolean {
76+function isUnknownPendingApprovalRequestError(cause: Cause.Cause<ProviderServiceError>): boolean {
77+ const error = Cause.squash(cause);
8878 if (Schema.is(ProviderAdapterRequestError)(error)) {
8979 const detail = error.detail.toLowerCase();
9080 return (
@@ -92,7 +82,7 @@ function isUnknownPendingApprovalRequestError(error: unknown): boolean { · 1 unmodified line
9282 detail.includes("unknown pending permission request")
9383 );
9484 }
95− const message = toErrorMessage(error).toLowerCase();
85+ const message = Cause.pretty(cause);
9686 return (
9787 message.includes("unknown pending approval request") ||
9888 message.includes("unknown pending permission request")
@@ -539,19 +529,17 @@ const make = Effect.gen(function* () { · 440 unmodified lines
539529 .pipe(
540530 Effect.catchCause((cause) =>
541531 Effect.gen(function* () {
542− const error = Cause.squash(cause);
543− const detail = toErrorMessage(error);
544532 yield* appendProviderFailureActivity({
545533 threadId: event.payload.threadId,
546534 kind: "provider.approval.respond.failed",
547535 summary: "Provider approval response failed",
548− detail,
536+ detail: Cause.pretty(cause),
549537 turnId: null,
550538 createdAt: event.payload.createdAt,
551539 requestId: event.payload.requestId,
552540 });
553541
554− if (!isUnknownPendingApprovalRequestError(error)) return;
542+ if (!isUnknownPendingApprovalRequestError(cause)) return;
555543 }),
556544 ),
557545 );
@@ -586,12 +574,11 @@ const make = Effect.gen(function* () { · 28 unmodified lines
586574 .pipe(
587575 Effect.catchCause((cause) =>
588576 Effect.gen(function* () {
589− const error = Cause.squash(cause);
590577 yield* appendProviderFailureActivity({
591578 threadId: event.payload.threadId,
592579 kind: "provider.user-input.respond.failed",
593580 summary: "Provider user input response failed",
594− detail: toErrorMessage(error),
581+ detail: Cause.pretty(cause),
595582 turnId: null,
596583 createdAt: event.payload.createdAt,
597584 requestId: event.payload.requestId,
apps/server/src/provider/Layers/CodexAdapter.ts+11−5
@@ -1338,11 +1338,17 @@ const makeCodexAdapter = (options?: CodexAdapterLiveOptions) => · 1337 unmodified lines
13381338 new Error(`Invalid attachment id '${attachment.id}'.`),
13391339 );
13401340 }
1341− const bytes = yield* fileSystem
1342− .readFile(attachmentPath)
1343− .pipe(
1344− Effect.mapError((cause) => toRequestError(input.threadId, "turn/start", cause)),
1345− );
1341+ const bytes = yield* fileSystem.readFile(attachmentPath).pipe(
1342+ Effect.mapError(
1343+ (cause) =>
1344+ new ProviderAdapterRequestError({
1345+ provider: PROVIDER,
1346+ method: "turn/start",
1347+ detail: toMessage(cause, "Failed to read attachment file."),
1348+ cause,
1349+ }),
1350+ ),
1351+ );
13461352 return {
13471353 type: "image" as const,
13481354 url: `data:${attachment.mimeType};base64,${Buffer.from(bytes).toString("base64")}`,
apps/server/src/wsServer.ts+3−10
@@ -99,8 +99,7 @@ export interface ServerShape { · 98 unmodified lines
9999 */
100100 export class Server extends ServiceMap.Service<Server, ServerShape>()("t3/wsServer/Server") {}
101101
102−const isServerNotRunningError = (error: unknown): boolean => {
103− if (!(error instanceof Error)) return false;
102+const isServerNotRunningError = (error: Error): boolean => {
104103 const maybeCode = (error as NodeJS.ErrnoException).code;
105104 return (
106105 maybeCode === "ERR_SERVER_NOT_RUNNING" || error.message.toLowerCase().includes("not running")
@@ -196,12 +195,6 @@ function stripRequestTag<T extends { _tag: string }>(body: T) { · 89 unmodified lines
196195 return Struct.omit(body, ["_tag"]);
197196 }
198197
199−function messageFromCause(cause: Cause.Cause<unknown>): string {
200− const squashed = Cause.squash(cause);
201− const message = squashed instanceof Error ? squashed.message.trim() : String(squashed).trim();
202− return message.length > 0 ? message : Cause.pretty(cause);
203−}
204−
205198 export type ServerCoreRuntimeServices =
206199 | OrchestrationEngineService
207200 | ProjectionSnapshotQuery
@@ -943,7 +936,7 @@ export const createServer = Effect.fn(function* (): Effect.fn.Return< · 735 unmodified lines
943936 if (request._tag === "Failure") {
944937 const errorResponse = yield* encodeResponse({
945938 id: "unknown",
946− error: { message: `Invalid request format: ${messageFromCause(request.cause)}` },
939+ error: { message: `Invalid request format: ${Cause.pretty(request.cause)}` },
947940 });
948941 ws.send(errorResponse);
949942 return;
@@ -953,7 +946,7 @@ export const createServer = Effect.fn(function* (): Effect.fn.Return< · 3 unmodified lines
953946 if (result._tag === "Failure") {
954947 const errorResponse = yield* encodeResponse({
955948 id: request.value.id,
956− error: { message: messageFromCause(result.cause) },
949+ error: { message: Cause.pretty(result.cause) },
957950 });
958951 ws.send(errorResponse);
959952 return;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t