authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-10 10:38:11-07:00
committergravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-10 10:38:11-07:00
log13eeb07f5f4b582e2ff824db382ff8917489c5c6
tree8978958fc97729744578a5ba50c9889d194a99ed
parent1e9bac7f6e783fe0498ddeb8392c5f4b50aad19d

prevent squashing some know errors


4 files changed, 22 insertions(+), 43 deletions(-)

apps/server/src/orchestration/Layers/OrchestrationEngine.ts+1-8
......@@ -49,13 +49,6 @@ function commandToAggregateRef(command: OrchestrationCommand): {
4949 }
5050}
5151
52function formatDispatchError(error: OrchestrationDispatchError): string {
53 if (error instanceof Error && error.message.length > 0) {
54 return error.message;
55 }
56 return String(error);
57}
58
5952const makeOrchestrationEngine = Effect.gen(function* () {
6053 const sql = yield* SqlClient.SqlClient;
6154 const eventStore = yield* OrchestrationEventStore;
......@@ -191,7 +184,7 @@ const makeOrchestrationEngine = Effect.gen(function* () {
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 }
1616
1717import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
1818import { GitCore } from "../../git/Services/GitCore.ts";
19import { ProviderAdapterRequestError } from "../../provider/Errors.ts";
19import { ProviderAdapterRequestError, ProviderServiceError } from "../../provider/Errors.ts";
2020import { TextGeneration } from "../../git/Services/TextGeneration.ts";
2121import { ProviderService } from "../../provider/Services/ProviderService.ts";
2222import { OrchestrationEngineService } from "../Services/OrchestrationEngine.ts";
......@@ -73,18 +73,8 @@ const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
7373const WORKTREE_BRANCH_PREFIX = "t3code";
7474const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
7575
76function 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
87function isUnknownPendingApprovalRequestError(error: unknown): boolean {
76function 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 {
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* () {
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* () {
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) =>
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 {
9999 */
100100export class Server extends ServiceMap.Service<Server, ServerShape>()("t3/wsServer/Server") {}
101101
102const isServerNotRunningError = (error: unknown): boolean => {
103 if (!(error instanceof Error)) return false;
102const 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) {
196195 return Struct.omit(body, ["_tag"]);
197196}
198197
199function 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
205198export type ServerCoreRuntimeServices =
206199 | OrchestrationEngineService
207200 | ProjectionSnapshotQuery
......@@ -943,7 +936,7 @@ export const createServer = Effect.fn(function* (): Effect.fn.Return<
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<
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;