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, ProjectCreatedPayload, ProjectMetaUpdatedPayload, OrchestrationProposedPlan, OrchestrationSession, ProjectCreateCommand, ThreadMetaUpdatedPayload, ThreadTurnStartCommand, ThreadCreatedPayload, ThreadTurnDiff, ThreadTurnStartRequestedPayload,} from "./orchestration"; const decodeTurnDiffInput = Schema.decodeUnknownEffect(OrchestrationGetTurnDiffInput);const decodeThreadTurnDiff = Schema.decodeUnknownEffect(ThreadTurnDiff);const decodeProjectCreateCommand = Schema.decodeUnknownEffect(ProjectCreateCommand);const decodeProjectCreatedPayload = Schema.decodeUnknownEffect(ProjectCreatedPayload);const decodeProjectMetaUpdatedPayload = Schema.decodeUnknownEffect(ProjectMetaUpdatedPayload);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 decodeThreadCreatedPayload = Schema.decodeUnknownEffect(ThreadCreatedPayload);const decodeThreadMetaUpdatedPayload = Schema.decodeUnknownEffect(ThreadMetaUpdatedPayload); 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 ", defaultModelSelection: { provider: "codex", model: " 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.deepStrictEqual(parsed.defaultModelSelection, { provider: "codex", model: "gpt-5.2", }); }),); it.effect("decodes historical project.created payloads with a default provider", () => Effect.gen(function* () { const parsed = yield* decodeProjectCreatedPayload({ projectId: "project-1", title: "Project Title", workspaceRoot: "/tmp/workspace", defaultModelSelection: { provider: "codex", model: "gpt-5.4", }, scripts: [], createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.defaultModelSelection?.provider, "codex"); }),); it.effect("decodes project.meta-updated payloads with explicit default provider", () => Effect.gen(function* () { const parsed = yield* decodeProjectMetaUpdatedPayload({ projectId: "project-1", defaultModelSelection: { provider: "claudeAgent", model: "claude-opus-4-6", }, updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.defaultModelSelection?.provider, "claudeAgent"); }),); 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.modelSelection, 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: [], }, modelSelection: { provider: "codex", model: "gpt-5.4", }, runtimeMode: "full-access", createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.modelSelection?.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", modelSelection: { provider: "codex", 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); assert.strictEqual(parsed.modelSelection.provider, "codex"); }),); it.effect("decodes thread.meta-updated payloads with explicit provider", () => Effect.gen(function* () { const parsed = yield* decodeThreadMetaUpdatedPayload({ threadId: "thread-1", modelSelection: { provider: "claudeAgent", model: "claude-opus-4-6", }, updatedAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.modelSelection?.provider, "claudeAgent"); }),); 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: [], }, modelSelection: { provider: "codex", model: "gpt-5.3-codex", options: { reasoningEffort: "high", fastMode: true, }, }, createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.modelSelection?.provider, "codex"); assert.strictEqual(parsed.modelSelection?.options?.reasoningEffort, "high"); assert.strictEqual(parsed.modelSelection?.options?.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.modelSelection, 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"); }),);
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,
ProjectCreatedPayload,
ProjectMetaUpdatedPayload,
OrchestrationProposedPlan,
OrchestrationSession,
ProjectCreateCommand,
ThreadMetaUpdatedPayload,
ThreadTurnStartCommand,
ThreadCreatedPayload,
ThreadTurnDiff,
ThreadTurnStartRequestedPayload,
} from "./orchestration";
const decodeTurnDiffInput = Schema.decodeUnknownEffect(OrchestrationGetTurnDiffInput);
const decodeThreadTurnDiff = Schema.decodeUnknownEffect(ThreadTurnDiff);
const decodeProjectCreateCommand = Schema.decodeUnknownEffect(ProjectCreateCommand);
const decodeProjectCreatedPayload = Schema.decodeUnknownEffect(ProjectCreatedPayload);
const decodeProjectMetaUpdatedPayload = Schema.decodeUnknownEffect(ProjectMetaUpdatedPayload);
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 decodeThreadCreatedPayload = Schema.decodeUnknownEffect(ThreadCreatedPayload);
const decodeThreadMetaUpdatedPayload = Schema.decodeUnknownEffect(ThreadMetaUpdatedPayload);
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 ",
defaultModelSelection: {
provider: "codex",
model: " 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.deepStrictEqual(parsed.defaultModelSelection, {
provider: "codex",
model: "gpt-5.2",
});
}),
);
it.effect("decodes historical project.created payloads with a default provider", () =>
Effect.gen(function* () {
const parsed = yield* decodeProjectCreatedPayload({
projectId: "project-1",
title: "Project Title",
workspaceRoot: "/tmp/workspace",
defaultModelSelection: {
provider: "codex",
model: "gpt-5.4",
},
scripts: [],
createdAt: "2026-01-01T00:00:00.000Z",
updatedAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.defaultModelSelection?.provider, "codex");
}),
);
it.effect("decodes project.meta-updated payloads with explicit default provider", () =>
Effect.gen(function* () {
const parsed = yield* decodeProjectMetaUpdatedPayload({
projectId: "project-1",
defaultModelSelection: {
provider: "claudeAgent",
model: "claude-opus-4-6",
},
updatedAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.defaultModelSelection?.provider, "claudeAgent");
}),
);
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.modelSelection, 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: [],
},
modelSelection: {
provider: "codex",
model: "gpt-5.4",
},
runtimeMode: "full-access",
createdAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.modelSelection?.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",
modelSelection: {
provider: "codex",
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);
assert.strictEqual(parsed.modelSelection.provider, "codex");
}),
);
it.effect("decodes thread.meta-updated payloads with explicit provider", () =>
Effect.gen(function* () {
const parsed = yield* decodeThreadMetaUpdatedPayload({
threadId: "thread-1",
modelSelection: {
provider: "claudeAgent",
model: "claude-opus-4-6",
},
updatedAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.modelSelection?.provider, "claudeAgent");
}),
);
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: [],
},
modelSelection: {
provider: "codex",
model: "gpt-5.3-codex",
options: {
reasoningEffort: "high",
fastMode: true,
},
},
createdAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.modelSelection?.provider, "codex");
assert.strictEqual(parsed.modelSelection?.options?.reasoningEffort, "high");
assert.strictEqual(parsed.modelSelection?.options?.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.modelSelection, 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");
}),
);