History

refactor: extract encodeJsonStringForDiagnostics into @t3tools/shared/schemaJson

The identical helper function was duplicated across ClaudeAdapter.ts, CursorAdapter.ts, and opencodeRuntime.ts. Consolidate into the shared schemaJson module and import from there.

Cursor Agent committed 6 months ago

Commit a4a23021 parent e9f54904 files · +14 −19Browse files

Unified · Split

4 files
  1. apps/server/src/provider/Layers/ClaudeAdapter.ts +1 −6
  2. apps/server/src/provider/Layers/CursorAdapter.ts +1 −6
  3. apps/server/src/provider/opencodeRuntime.ts +1 −7
  4. packages/shared/src/schemaJson.ts +11 −0
apps/server/src/provider/Layers/ClaudeAdapter.ts+1−6
@@ -82,9 +82,9 @@ import { · 81 unmodified lines
8282 ProviderAdapterValidationError,
8383 type ProviderAdapterError,
8484 } from "../Errors.ts";
85+import { encodeJsonStringForDiagnostics } from "@t3tools/shared/schemaJson";
8586 import { type ClaudeAdapterShape } from "../Services/ClaudeAdapter.ts";
8687 import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";
87−const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);
8888 const decodeUnknownJsonStringExit = Schema.decodeUnknownExit(Schema.UnknownFromJsonString);
8989
9090 const PROVIDER = ProviderDriverKind.make("claudeAgent");
@@ -95,11 +95,6 @@ type ClaudeToolResultStreamKind = Extract< · 4 unmodified lines
9595 >;
9696 type ClaudeSdkEffort = NonNullable<ClaudeQueryOptions["effort"]>;
9797
98−function encodeJsonStringForDiagnostics(input: unknown): string | undefined {
99− const result = encodeUnknownJsonStringExit(input);
100− return Exit.isSuccess(result) ? result.value : undefined;
101−}
102−
10398 type PromptQueueItem =
10499 | {
105100 readonly type: "message";
apps/server/src/provider/Layers/CursorAdapter.ts+1−6
@@ -72,10 +72,10 @@ import { · 71 unmodified lines
7272 extractPlanMarkdown,
7373 extractTodosAsPlan,
7474 } from "../acp/CursorAcpExtension.ts";
75+import { encodeJsonStringForDiagnostics } from "@t3tools/shared/schemaJson";
7576 import { type CursorAdapterShape } from "../Services/CursorAdapter.ts";
7677 import { resolveCursorAcpBaseModelId } from "./CursorProvider.ts";
7778 import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";
78−const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);
7979
8080 const PROVIDER = ProviderDriverKind.make("cursor");
8181 const CURSOR_RESUME_VERSION = 1 as const;
@@ -83,11 +83,6 @@ const ACP_PLAN_MODE_ALIASES = ["plan", "architect"]; · 1 unmodified line
8383 const ACP_IMPLEMENT_MODE_ALIASES = ["code", "agent", "default", "chat", "implement"];
8484 const ACP_APPROVAL_MODE_ALIASES = ["ask"];
8585
86−function encodeJsonStringForDiagnostics(input: unknown): string | undefined {
87− const result = encodeUnknownJsonStringExit(input);
88− return Exit.isSuccess(result) ? result.value : undefined;
89−}
90−
9186 export interface CursorAdapterLiveOptions {
9287 readonly environment?: NodeJS.ProcessEnv;
9388 readonly nativeEventLogPath?: string;
apps/server/src/provider/opencodeRuntime.ts+1−7
@@ -24,14 +24,13 @@ import * as P from "effect/Predicate"; · 23 unmodified lines
2424 import * as Ref from "effect/Ref";
2525 import * as Result from "effect/Result";
2626 import * as Scope from "effect/Scope";
27−import * as Schema from "effect/Schema";
2827 import * as Stream from "effect/Stream";
2928 import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
3029
30+import { encodeJsonStringForDiagnostics } from "@t3tools/shared/schemaJson";
3131 import { isWindowsCommandNotFound } from "../processRunner.ts";
3232 import { collectStreamAsString } from "./providerSnapshot.ts";
3333 import * as NetService from "@t3tools/shared/Net";
34−const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);
3534 const OPENCODE_EMPTY_CONFIG_CONTENT = "{}";
3635
3736 const OPENCODE_SERVER_READY_PREFIX = "opencode server listening";
@@ -58,11 +57,6 @@ export class OpenCodeRuntimeError extends Data.TaggedError(OPENCODE_RUNTIME_ERRO · 20 unmodified lines
5857 P.isTagged(u, OPENCODE_RUNTIME_ERROR_TAG);
5958 }
6059
61−function encodeJsonStringForDiagnostics(input: unknown): string | undefined {
62− const result = encodeUnknownJsonStringExit(input);
63− return Exit.isSuccess(result) ? result.value : undefined;
64−}
65−
6660 export function openCodeRuntimeErrorDetail(cause: unknown): string {
6761 if (OpenCodeRuntimeError.is(cause)) return cause.detail;
6862 if (cause instanceof Error && cause.message.trim().length > 0) return cause.message.trim();
packages/shared/src/schemaJson.ts+11−0
@@ -84,6 +84,17 @@ export const fromLenientJsonString = new SchemaTransformation.Transformation( · 83 unmodified lines
8484 SchemaGetter.stringifyJson(),
8585 );
8686
87+const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);
88+
89+/**
90+ * Attempt to encode an unknown value to a JSON string for diagnostic output.
91+ * Returns `undefined` on encoding failure instead of throwing.
92+ */
93+export function encodeJsonStringForDiagnostics(input: unknown): string | undefined {
94+ const result = encodeUnknownJsonStringExit(input);
95+ return Exit.isSuccess(result) ? result.value : undefined;
96+}
97+
8798 export const prettyJsonString = SchemaGetter.parseJson<string>().compose(
8899 SchemaGetter.stringifyJson({ space: 2 }),
89100 );