Convex-only Slice 1: clients talk to Convex, Flue is a private worker (#20)

This commit is contained in:
2026-07-27 16:03:36 +00:00
parent cc47007fa9
commit cb7484912c
141 changed files with 1547 additions and 17812 deletions

View File

@@ -55,7 +55,7 @@ const attachSignal = async (
organizationId: String(signal.organizationId),
projectId: String(signal.projectId),
signalId: String(signal._id),
title: signal.problemStatement.title,
title: signal.title,
},
work: {
organizationId: String(work.organizationId),
@@ -81,18 +81,14 @@ const attachSignal = async (
const createdAt = Date.now();
await ctx.db.insert("signalWorkAttachments", {
createdAt,
organizationId: work.organizationId,
projectId: work.projectId,
signalId: signal._id,
workId: work._id,
});
await ctx.db.insert("workEvents", {
createdAt,
data: event.data,
idempotencyKey: event.idempotencyKey,
kind: event.kind,
organizationId: work.organizationId,
projectId: work.projectId,
signalId: signal._id,
workId: work._id,
});
await ctx.db.patch(work._id, { updatedAt: createdAt });
@@ -138,8 +134,19 @@ export const createFromSignal = mutation({
return { created: false, workId: existingAttachment.workId };
}
const constraints = await ctx.db
.query("signalConstraints")
.withIndex("by_signalId_and_ordinal", (q) => q.eq("signalId", signal._id))
.collect();
const draft = await Effect.runPromise(
workDraftFromSignal(signal.problemStatement)
workDraftFromSignal({
constraints: constraints
.sort((left, right) => left.ordinal - right.ordinal)
.map((constraint) => constraint.value),
desiredOutcome: signal.desiredOutcome,
summary: signal.summary,
title: signal.title,
})
).catch((error: unknown) => {
throw new ConvexError(
error instanceof Error ? error.message : "Invalid Work proposal"
@@ -169,18 +176,14 @@ export const createFromSignal = mutation({
});
await ctx.db.insert("signalWorkAttachments", {
createdAt,
organizationId: signal.organizationId,
projectId: signal.projectId as Id<"projects">,
signalId: signal._id,
workId,
});
await ctx.db.insert("workEvents", {
createdAt,
data: event.data,
idempotencyKey: event.idempotencyKey,
kind: event.kind,
organizationId: signal.organizationId,
projectId: signal.projectId as Id<"projects">,
signalId: signal._id,
workId,
});
return { created: true, workId };
@@ -231,23 +234,23 @@ export const listForProject = query({
}
const sources = await ctx.db
.query("signalSources")
.withIndex("by_signal_and_ordinal", (q) =>
.withIndex("by_signalId_and_ordinal", (q) =>
q.eq("signalId", signal._id)
)
.collect();
return {
createdAt: signal.createdAt,
signalId: signal._id,
summary: signal.problemStatement.summary,
summary: signal.summary,
sources: sources
.sort((a, b) => a.ordinal - b.ordinal)
.map((source) => ({
createdAt: source.sourceCreatedAt,
messageId: source.messageId,
messageId: String(source.messageId),
rawText: source.rawTextSnapshot,
submissionId: source.submissionId ?? null,
submissionId: null,
})),
title: signal.problemStatement.title,
title: signal.title,
};
})
);