Skip to content
Merged
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
4 changes: 4 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions apps/web/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ without changing the active route. Backend registration still verifies account
ownership. Cancel, logout, and the ten-minute timeout retire pending callbacks.

### General
- Enable persisted email/calendar review controls only for the review’s saved acting account; historical reviews fall back to the session owner. Require session edit access on desktop and mobile.
- Email draft reads compare server generations before choosing cached delivery state over a restored working copy; only a definitive first-submission rejection permits local send recovery without server cancellation.
- Compose settings pages with `features/settings/primitives.tsx` so section headings,
raised composer cards (`SettingsSurface`), row spacing, and control shapes stay
Expand Down
1 change: 1 addition & 0 deletions apps/web/src/features/agent-reviews/core/review.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
export type Review = {
id: string;
sessionId: string;
actingUser?: string | null;
executionId?: string | null;
kind: 'email' | 'calendar';
title: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useUserId } from '@core/context/user';
import { fireAndForget } from '@core/util/fireAndForget';
import { createEffect, on, Show, Suspense } from 'solid-js';
import { useReview, useReviewActions } from '../queries/reviews';
Expand All @@ -8,10 +9,12 @@ export function PersistedReview(props: {
sessionId: string;
reviewId: string;
canAct: boolean;
ownerId?: string;
eventId?: string;
onDecision?: () => void;
onDecisionFailed?: () => void;
}) {
const userId = useUserId();
const query = useReview(
() => props.sessionId,
() => props.reviewId
Expand Down Expand Up @@ -58,7 +61,10 @@ export function PersistedReview(props: {
{(record) => (
<ReviewStack
review={record()}
canAct={props.canAct}
canAct={
props.canAct &&
userId() === (record().actingUser ?? props.ownerId)
}
actions={decisions}
/>
)}
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/features/agent-reviews/views/review-stack.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export function ReviewStack(props: {
record().items.find((item) => item.id === id)?.status === 'pending',
lockedNotice: () =>
!props.canAct
? 'Only the session owner can submit this review.'
? 'Only the person whose account this review uses can submit it.'
: undefined,
onEdit: (draft) => {
controller.edit(id, draft);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ export function PresentedReviewPart(props: {
Boolean(
session?.sessionId() === props.sessionId &&
session.userId() &&
session.userId() === session.session()?.ownerId &&
session.session()?.canEdit &&
!session.session()?.isArchived
);
Expand All @@ -66,6 +65,7 @@ export function PresentedReviewPart(props: {
sessionId={props.sessionId}
reviewId={props.reviewId}
canAct={canAct()}
ownerId={session?.session()?.ownerId}
eventId={latestNotification()?.id}
onDecision={() =>
setPendingDecision({ previousEvent: latestNotification()?.id })
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading