import assert from "node:assert/strict"; import { it } from "@effect/vitest"; import { Effect, Schema } from "effect"; import { DEFAULT_PROVIDER_INTERACTION_MODE, DEFAULT_RUNTIME_MODE, OrchestrationGetTurnDiffInput, OrchestrationLatestTurn, OrchestrationProposedPlan, OrchestrationSession, OrchestrationThread, OrchestrationThreadActivity, ProjectCreateCommand, ThreadTurnStartCommand, ThreadCreatedPayload, ThreadTurnDiff, ThreadTurnStartRequestedPayload, } from "./orchestration"; const decodeTurnDiffInput = Schema.decodeUnknownEffect(OrchestrationGetTurnDiffInput); const decodeThreadTurnDiff = Schema.decodeUnknownEffect(ThreadTurnDiff); const decodeProjectCreateCommand = Schema.decodeUnknownEffect(ProjectCreateCommand); const decodeThreadTurnStartCommand = Schema.decodeUnknownEffect(ThreadTurnStartCommand); const decodeThreadTurnStartRequestedPayload = Schema.decodeUnknownEffect( ThreadTurnStartRequestedPayload, ); const decodeOrchestrationLatestTurn = Schema.decodeUnknownEffect(OrchestrationLatestTurn); const decodeOrchestrationProposedPlan = Schema.decodeUnknownEffect(OrchestrationProposedPlan); const decodeOrchestrationSession = Schema.decodeUnknownEffect(OrchestrationSession); const decodeOrchestrationThread = Schema.decodeUnknownEffect(OrchestrationThread); const decodeOrchestrationThreadActivity = Schema.decodeUnknownEffect(OrchestrationThreadActivity); const decodeThreadCreatedPayload = Schema.decodeUnknownEffect(ThreadCreatedPayload); it.effect("parses turn diff input when fromTurnCount <= toTurnCount", () => Effect.gen(function* () { const parsed = yield* decodeTurnDiffInput({ threadId: "thread-1", fromTurnCount: 1, toTurnCount: 2, }); assert.strictEqual(parsed.fromTurnCount, 1); assert.strictEqual(parsed.toTurnCount, 2); }), ); it.effect("rejects turn diff input when fromTurnCount > toTurnCount", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeTurnDiffInput({ threadId: "thread-1", fromTurnCount: 3, toTurnCount: 2, }), ); assert.strictEqual(result._tag, "Failure"); }), ); it.effect("rejects thread turn diff when fromTurnCount > toTurnCount", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeThreadTurnDiff({ threadId: "thread-1", fromTurnCount: 3, toTurnCount: 2, diff: "patch", }), ); assert.strictEqual(result._tag, "Failure"); }), ); it.effect("trims branded ids and command string fields at decode boundaries", () => Effect.gen(function* () { const parsed = yield* decodeProjectCreateCommand({ type: "project.create", commandId: " cmd-1 ", projectId: " project-1 ", title: " Project Title ", workspaceRoot: " /tmp/workspace ", defaultModel: " gpt-5.2 ", createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.commandId, "cmd-1"); assert.strictEqual(parsed.projectId, "project-1"); assert.strictEqual(parsed.title, "Project Title"); assert.strictEqual(parsed.workspaceRoot, "/tmp/workspace"); assert.strictEqual(parsed.defaultModel, "gpt-5.2"); }), ); it.effect("rejects command fields that become empty after trim", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeProjectCreateCommand({ type: "project.create", commandId: "cmd-1", projectId: "project-1", title: " ", workspaceRoot: "/tmp/workspace", createdAt: "2026-01-01T00:00:00.000Z", }), ); assert.strictEqual(result._tag, "Failure"); }), ); it.effect("decodes thread.turn.start defaults for provider and runtime mode", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartCommand({ type: "thread.turn.start", commandId: "cmd-turn-1", threadId: "thread-1", message: { messageId: "msg-1", role: "user", text: "hello", attachments: [], }, createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.provider, undefined); assert.strictEqual(parsed.runtimeMode, DEFAULT_RUNTIME_MODE); assert.strictEqual(parsed.interactionMode, DEFAULT_PROVIDER_INTERACTION_MODE); }), ); it.effect("preserves explicit provider and runtime mode in thread.turn.start", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartCommand({ type: "thread.turn.start", commandId: "cmd-turn-2", threadId: "thread-1", message: { messageId: "msg-2", role: "user", text: "hello", attachments: [], }, provider: "codex", runtimeMode: "full-access", createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.provider, "codex"); assert.strictEqual(parsed.runtimeMode, "full-access"); assert.strictEqual(parsed.interactionMode, DEFAULT_PROVIDER_INTERACTION_MODE); }), ); it.effect("decodes thread.created runtime mode for historical events", () => Effect.gen(function* () { const parsed = yield* decodeThreadCreatedPayload({ threadId: "thread-1", projectId: "project-1", title: "Thread title", model: "gpt-5.4", interactionMode: "default", branch: null, worktreePath: null, createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.runtimeMode, DEFAULT_RUNTIME_MODE); }), ); it.effect("accepts provider-scoped model options in thread.turn.start", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartCommand({ type: "thread.turn.start", commandId: "cmd-turn-options", threadId: "thread-1", message: { messageId: "msg-options", role: "user", text: "hello", attachments: [], }, provider: "codex", model: "gpt-5.3-codex", modelOptions: { codex: { reasoningEffort: "high", fastMode: true, }, }, createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.provider, "codex"); assert.strictEqual(parsed.modelOptions?.codex?.reasoningEffort, "high"); assert.strictEqual(parsed.modelOptions?.codex?.fastMode, true); }), ); it.effect("accepts a source proposed plan reference in thread.turn.start", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartCommand({ type: "thread.turn.start", commandId: "cmd-turn-source-plan", threadId: "thread-2", message: { messageId: "msg-source-plan", role: "user", text: "implement this", attachments: [], }, sourceProposedPlan: { threadId: "thread-1", planId: "plan-1", }, createdAt: "2026-01-01T00:00:00.000Z", }); assert.deepStrictEqual(parsed.sourceProposedPlan, { threadId: "thread-1", planId: "plan-1", }); }), ); it.effect( "decodes thread.turn-start-requested defaults for provider, runtime mode, and interaction mode", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartRequestedPayload({ threadId: "thread-1", messageId: "msg-1", createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.provider, undefined); assert.strictEqual(parsed.runtimeMode, DEFAULT_RUNTIME_MODE); assert.strictEqual(parsed.interactionMode, DEFAULT_PROVIDER_INTERACTION_MODE); assert.strictEqual(parsed.sourceProposedPlan, undefined); }), ); it.effect("decodes thread.turn-start-requested source proposed plan metadata when present", () => Effect.gen(function* () { const parsed = yield* decodeThreadTurnStartRequestedPayload({ threadId: "thread-2", messageId: "msg-2", sourceProposedPlan: { threadId: "thread-1", planId: "plan-1", }, createdAt: "2026-01-01T00:00:00.000Z", }); assert.deepStrictEqual(parsed.sourceProposedPlan, { threadId: "thread-1", planId: "plan-1", }); }), ); it.effect("decodes latest turn source proposed plan metadata when present", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationLatestTurn({ turnId: "turn-2", state: "running", requestedAt: "2026-01-01T00:00:00.000Z", startedAt: "2026-01-01T00:00:01.000Z", completedAt: null, assistantMessageId: null, sourceProposedPlan: { threadId: "thread-1", planId: "plan-1", }, }); assert.deepStrictEqual(parsed.sourceProposedPlan, { threadId: "thread-1", planId: "plan-1", }); }), ); it.effect("decodes orchestration session runtime mode defaults", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationSession({ threadId: "thread-1", status: "idle", providerName: null, providerSessionId: null, providerThreadId: null, activeTurnId: null, lastError: null, updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.runtimeMode, DEFAULT_RUNTIME_MODE); }), ); it.effect("defaults proposed plan implementation metadata for historical rows", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationProposedPlan({ id: "plan-1", turnId: "turn-1", planMarkdown: "# Plan", createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.implementedAt, null); assert.strictEqual(parsed.implementationThreadId, null); }), ); it.effect("preserves proposed plan implementation metadata when present", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationProposedPlan({ id: "plan-2", turnId: "turn-2", planMarkdown: "# Plan", implementedAt: "2026-01-02T00:00:00.000Z", implementationThreadId: "thread-2", createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-02T00:00:00.000Z", }); assert.strictEqual(parsed.implementedAt, "2026-01-02T00:00:00.000Z"); assert.strictEqual(parsed.implementationThreadId, "thread-2"); }), ); it.effect("defaults activity work unit ids for historical rows", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationThreadActivity({ id: "activity-1", tone: "info", kind: "runtime.note", summary: "Runtime note", payload: {}, turnId: null, createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.workUnitId, null); }), ); it.effect("defaults thread work units for historical rows", () => Effect.gen(function* () { const parsed = yield* decodeOrchestrationThread({ id: "thread-1", projectId: "project-1", title: "Thread", model: "gpt-5-codex", runtimeMode: "full-access", interactionMode: "default", branch: null, worktreePath: null, latestTurn: null, createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", deletedAt: null, messages: [], proposedPlans: [], activities: [], checkpoints: [], session: null, }); assert.deepStrictEqual(parsed.workUnits, []); }), );