Merge branch 'puter/issue-8-project-loop' into puter/issue-14-integration

# Conflicts:
#	apps/web/src/components/projects/project-workspace-page.tsx
#	packages/primitives/package.json
#	packages/primitives/src/index.ts
This commit is contained in:
-Puter
2026-07-24 02:34:01 +05:30
10 changed files with 1347 additions and 295 deletions
+22 -1
View File
@@ -4,6 +4,11 @@ import { useFlueClient } from "@flue/react";
import { useAction, useMutation, useQuery } from "convex/react";
import { useState } from "react";
import {
buildProjectLoopView,
summarizeProjectIssues,
} from "@/lib/projects/project-evidence";
const errorMessage = (error: unknown) =>
error instanceof Error ? error.message : String(error);
@@ -15,6 +20,8 @@ export const useProjectWorkspace = () => {
const [repository, setRepository] = useState("");
const [issueTitle, setIssueTitle] = useState("");
const [issueBody, setIssueBody] = useState("");
const [selectedIssueId, setSelectedIssueId] =
useState<Id<"projectIssues"> | null>(null);
const [pendingAction, setPendingAction] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const importPublicGit = useAction(api.projects.importPublicGit);
@@ -79,11 +86,12 @@ export const useProjectWorkspace = () => {
setPendingAction("issue");
setError(null);
try {
await createIssue({
const issueId = await createIssue({
body: issueBody,
projectId: activeProjectId,
title: issueTitle,
});
setSelectedIssueId(issueId);
setIssueTitle("");
setIssueBody("");
} catch (caughtError) {
@@ -118,6 +126,14 @@ export const useProjectWorkspace = () => {
projects?.find(
(project) => project.id === (activeProjectId as unknown as string)
) ?? null;
const selectedIssue =
issues?.find((issue) => issue._id === selectedIssueId) ?? issues?.[0];
const projectLoop = buildProjectLoopView({
artifacts,
issue: selectedIssue,
source: selectedProject?.sources[0],
});
const issueSummary = summarizeProjectIssues(issues);
return {
artifacts,
@@ -125,18 +141,23 @@ export const useProjectWorkspace = () => {
error,
events,
issueBody,
issueSummary,
issueTitle,
issues,
pendingAction,
projectLoop,
projects,
pullRequest,
raiseIssue,
repository,
selectedIssue,
selectedIssueId,
selectedProject,
selectedProjectId: activeProjectId,
setIssueBody,
setIssueTitle,
setRepository,
setSelectedIssueId,
setSelectedProjectId,
startIssue,
} as const;