Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ const seedProjectAndThread = (harness: OrchestrationIntegrationHarness) =>
projectId: PROJECT_ID,
title: "Integration Project",
workspaceRoot: harness.workspaceDir,
pinned: false,
defaultModelSelection: {
provider,
model: defaultModel,
Expand All @@ -129,6 +130,7 @@ const seedProjectAndThread = (harness: OrchestrationIntegrationHarness) =>
threadId: THREAD_ID,
projectId: PROJECT_ID,
title: "Integration Thread",
pinned: false,
modelSelection: {
provider,
model: defaultModel,
Expand Down Expand Up @@ -265,6 +267,7 @@ it.live.skipIf(!process.env.CODEX_BINARY_PATH)(
projectId: PROJECT_ID,
title: "Integration Project",
workspaceRoot: harness.workspaceDir,
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5.3-codex",
Expand All @@ -278,6 +281,7 @@ it.live.skipIf(!process.env.CODEX_BINARY_PATH)(
threadId: THREAD_ID,
projectId: PROJECT_ID,
title: "Integration Thread",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5.3-codex",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ function makeSnapshot(input: {
id: input.projectId,
title: "Project",
workspaceRoot: input.workspaceRoot,
pinnedAt: null,
defaultModelSelection: null,
scripts: [],
createdAt: "2026-01-01T00:00:00.000Z",
Expand All @@ -43,6 +44,7 @@ function makeSnapshot(input: {
id: input.threadId,
projectId: input.projectId,
title: "Thread",
pinnedAt: null,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ describe("CheckpointReactor", () => {
projectId: asProjectId("project-1"),
title: "Test Project",
workspaceRoot: options?.projectWorkspaceRoot ?? cwd,
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -296,6 +297,7 @@ describe("CheckpointReactor", () => {
threadId: ThreadId.makeUnsafe("thread-1"),
projectId: asProjectId("project-1"),
title: "Thread",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down
20 changes: 20 additions & 0 deletions apps/server/src/orchestration/Layers/OrchestrationEngine.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-1"),
title: "Project 1",
workspaceRoot: "/tmp/project-1",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -86,6 +87,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-1"),
projectId: asProjectId("project-1"),
title: "Thread",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -132,6 +134,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-archive"),
title: "Project Archive",
workspaceRoot: "/tmp/project-archive",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -146,6 +149,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-archive"),
projectId: asProjectId("project-archive"),
title: "Archive me",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -199,6 +203,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-replay"),
title: "Replay Project",
workspaceRoot: "/tmp/project-replay",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -213,6 +218,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-replay"),
projectId: asProjectId("project-replay"),
title: "replay",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -257,6 +263,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-stream"),
title: "Stream Project",
workspaceRoot: "/tmp/project-stream",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -281,6 +288,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-stream"),
projectId: asProjectId("project-stream"),
title: "domain-stream",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -318,6 +326,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-turn-diff"),
title: "Turn Diff Project",
workspaceRoot: "/tmp/project-turn-diff",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -332,6 +341,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-turn-diff"),
projectId: asProjectId("project-turn-diff"),
title: "Turn diff thread",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -435,6 +445,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-flaky"),
title: "Flaky Project",
workspaceRoot: "/tmp/project-flaky",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -451,6 +462,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-flaky-fail"),
projectId: asProjectId("project-flaky"),
title: "flaky-fail",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -471,6 +483,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-flaky-ok"),
projectId: asProjectId("project-flaky"),
title: "flaky-ok",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -528,6 +541,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-atomic"),
title: "Atomic Project",
workspaceRoot: "/tmp/project-atomic",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -542,6 +556,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-atomic"),
projectId: asProjectId("project-atomic"),
title: "atomic",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -669,6 +684,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-sync"),
title: "Sync Project",
workspaceRoot: "/tmp/project-sync",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -683,6 +699,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-sync"),
projectId: asProjectId("project-sync"),
title: "sync-before",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -754,6 +771,7 @@ describe("OrchestrationEngine", () => {
projectId: asProjectId("project-duplicate"),
title: "Duplicate Project",
workspaceRoot: "/tmp/project-duplicate",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -769,6 +787,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-duplicate"),
projectId: asProjectId("project-duplicate"),
title: "duplicate",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -789,6 +808,7 @@ describe("OrchestrationEngine", () => {
threadId: ThreadId.makeUnsafe("thread-duplicate"),
projectId: asProjectId("project-duplicate"),
title: "duplicate",
pinned: false,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1867,6 +1867,7 @@ engineLayer("OrchestrationProjectionPipeline via engine dispatch", (it) => {
projectId: ProjectId.makeUnsafe("project-live"),
title: "Live Project",
workspaceRoot: "/tmp/project-live",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down Expand Up @@ -1905,6 +1906,7 @@ engineLayer("OrchestrationProjectionPipeline via engine dispatch", (it) => {
projectId: ProjectId.makeUnsafe("project-scripts"),
title: "Scripts Project",
workspaceRoot: "/tmp/project-scripts",
pinned: false,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down
4 changes: 4 additions & 0 deletions apps/server/src/orchestration/Layers/ProjectionPipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ const makeOrchestrationProjectionPipeline = Effect.fn("makeOrchestrationProjecti
projectId: event.payload.projectId,
title: event.payload.title,
workspaceRoot: event.payload.workspaceRoot,
pinnedAt: event.payload.pinnedAt,
defaultModelSelection: event.payload.defaultModelSelection,
scripts: event.payload.scripts,
createdAt: event.payload.createdAt,
Expand All @@ -404,6 +405,7 @@ const makeOrchestrationProjectionPipeline = Effect.fn("makeOrchestrationProjecti
...(event.payload.workspaceRoot !== undefined
? { workspaceRoot: event.payload.workspaceRoot }
: {}),
...(event.payload.pinnedAt !== undefined ? { pinnedAt: event.payload.pinnedAt } : {}),
...(event.payload.defaultModelSelection !== undefined
? { defaultModelSelection: event.payload.defaultModelSelection }
: {}),
Expand Down Expand Up @@ -442,6 +444,7 @@ const makeOrchestrationProjectionPipeline = Effect.fn("makeOrchestrationProjecti
threadId: event.payload.threadId,
projectId: event.payload.projectId,
title: event.payload.title,
pinnedAt: event.payload.pinnedAt,
modelSelection: event.payload.modelSelection,
runtimeMode: event.payload.runtimeMode,
interactionMode: event.payload.interactionMode,
Expand Down Expand Up @@ -495,6 +498,7 @@ const makeOrchestrationProjectionPipeline = Effect.fn("makeOrchestrationProjecti
yield* projectionThreadRepository.upsert({
...existingRow.value,
...(event.payload.title !== undefined ? { title: event.payload.title } : {}),
...(event.payload.pinnedAt !== undefined ? { pinnedAt: event.payload.pinnedAt } : {}),
...(event.payload.modelSelection !== undefined
? { modelSelection: event.payload.modelSelection }
: {}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
id: asProjectId("project-1"),
title: "Project 1",
workspaceRoot: "/tmp/project-1",
pinnedAt: null,
defaultModelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand All @@ -257,6 +258,7 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
id: ThreadId.makeUnsafe("thread-1"),
projectId: asProjectId("project-1"),
title: "Thread 1",
pinnedAt: null,
modelSelection: {
provider: "codex",
model: "gpt-5-codex",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import {
const decodeReadModel = Schema.decodeUnknownEffect(OrchestrationReadModel);
const ProjectionProjectDbRowSchema = ProjectionProject.mapFields(
Struct.assign({
pinnedAt: Schema.NullOr(IsoDateTime),
defaultModelSelection: Schema.NullOr(Schema.fromJsonString(ModelSelection)),
scripts: Schema.fromJsonString(Schema.Array(ProjectScript)),
}),
Expand All @@ -59,6 +60,7 @@ const ProjectionThreadMessageDbRowSchema = ProjectionThreadMessage.mapFields(
const ProjectionThreadProposedPlanDbRowSchema = ProjectionThreadProposedPlan;
const ProjectionThreadDbRowSchema = ProjectionThread.mapFields(
Struct.assign({
pinnedAt: Schema.NullOr(IsoDateTime),
modelSelection: Schema.fromJsonString(ModelSelection),
}),
);
Expand Down Expand Up @@ -147,6 +149,7 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
project_id AS "projectId",
title,
workspace_root AS "workspaceRoot",
pinned_at AS "pinnedAt",
default_model_selection_json AS "defaultModelSelection",
scripts_json AS "scripts",
created_at AS "createdAt",
Expand All @@ -166,6 +169,7 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
thread_id AS "threadId",
project_id AS "projectId",
title,
pinned_at AS "pinnedAt",
model_selection_json AS "modelSelection",
runtime_mode AS "runtimeMode",
interaction_mode AS "interactionMode",
Expand Down Expand Up @@ -542,6 +546,7 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
id: row.projectId,
title: row.title,
workspaceRoot: row.workspaceRoot,
pinnedAt: row.pinnedAt,
defaultModelSelection: row.defaultModelSelection,
scripts: row.scripts,
createdAt: row.createdAt,
Expand All @@ -553,6 +558,7 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
id: row.threadId,
projectId: row.projectId,
title: row.title,
pinnedAt: row.pinnedAt,
modelSelection: row.modelSelection,
runtimeMode: row.runtimeMode,
interactionMode: row.interactionMode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ describe("ProviderCommandReactor", () => {
projectId: asProjectId("project-1"),
title: "Provider Project",
workspaceRoot: "/tmp/provider-project",
pinned: false,
defaultModelSelection: modelSelection,
createdAt: now,
}),
Expand All @@ -256,6 +257,7 @@ describe("ProviderCommandReactor", () => {
threadId: ThreadId.makeUnsafe("thread-1"),
projectId: asProjectId("project-1"),
title: "Thread",
pinned: false,
modelSelection: modelSelection,
interactionMode: DEFAULT_PROVIDER_INTERACTION_MODE,
runtimeMode: "approval-required",
Expand Down
Loading
Loading