Auth flow refactor, project requests, and routing updates

- Add server-side auth token loader (auth.server.ts) with SSR cookie forwarding
- Add project-requests client for explicit/signal/existing issue dispatch
- Refactor auth layout and app layout for SSR auth gating
- Update auth-client and auth-provider for convex token flow
- Extend project-issue primitives with request result schema
- Wire projectIssues backend mutation for request handling
- Update slice-one page and project-workspace hook
- Adjust routes (remove unused), Caddy config, and env templates
This commit is contained in:
Miniputer
2026-07-27 18:47:43 +05:30
parent cc47007fa9
commit 1855735245
24 changed files with 340 additions and 108 deletions

View File

@@ -29,6 +29,17 @@ describe("project issue primitives", () => {
});
});
it("accepts an existing issue request without creating a duplicate", () => {
const request = Effect.runSync(
decodeProjectIssueRequest({
issueId: "issue-1",
kind: "existing",
})
);
expect(request).toEqual({ issueId: "issue-1", kind: "existing" });
});
it("rejects invalid issue drafts before persistence", () => {
const error = Effect.runSync(
Effect.flip(

View File

@@ -35,6 +35,11 @@ export const ProjectIssueDraft = Schema.Struct({
});
export type ProjectIssueDraft = typeof ProjectIssueDraft.Type;
export const ExistingProjectIssueRequest = Schema.Struct({
issueId: ProjectIssueId,
kind: Schema.Literal("existing"),
});
export const ExplicitProjectIssueRequest = Schema.Struct({
body: Schema.String,
kind: Schema.Literal("explicit"),
@@ -48,6 +53,7 @@ export const SignalProjectIssueRequest = Schema.Struct({
});
export const ProjectIssueRequest = Schema.Union([
ExistingProjectIssueRequest,
ExplicitProjectIssueRequest,
SignalProjectIssueRequest,
]);
@@ -186,7 +192,7 @@ export const decodeProjectIssueRequest = (
() =>
new ProjectIssueRequestError({
message:
"Use a signal request or an explicit request with projectId, title, and body",
"Use an existing issue, signal request, or explicit request with projectId, title, and body",
reason: "InvalidInput",
})
)