diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_agents.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_agents.yaml index 7926eb81..413510e8 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_agents.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_agents.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: agents.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailconnections.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailconnections.yaml index 1bf86fb1..e021e5fe 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailconnections.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailconnections.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: guardrailconnections.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -112,7 +112,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailpolicies.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailpolicies.yaml index 0713ff24..a797163e 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailpolicies.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_guardrailpolicies.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: guardrailpolicies.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -198,7 +198,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferencepools.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferencepools.yaml index c628cc1c..c4769030 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferencepools.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferencepools.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: inferencepools.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -375,7 +375,6 @@ spec: x-kubernetes-list-type: map type: object required: - - metadata - spec type: object served: true diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferenceproviders.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferenceproviders.yaml index cc91fb7f..95746dc2 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferenceproviders.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_inferenceproviders.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: inferenceproviders.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -651,7 +651,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_mcpconnections.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_mcpconnections.yaml index 7ec7b7a7..7e7b1515 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_mcpconnections.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_mcpconnections.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: mcpconnections.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_sandboxes.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_sandboxes.yaml index a7f056f6..5468b5d1 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_sandboxes.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_sandboxes.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: sandboxes.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_secrets.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_secrets.yaml index 851454ac..cc896e15 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_secrets.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_secrets.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: secrets.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_skills.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_skills.yaml index 8222c85c..f7151d1d 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_skills.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_skills.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: skills.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_tenants.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_tenants.yaml index 5bf28d8e..71402671 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_tenants.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_tenants.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: tenants.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowruns.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowruns.yaml index 77217888..535c2e87 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowruns.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowruns.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workflowruns.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowschedules.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowschedules.yaml index df41fad8..ddcc341f 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowschedules.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workflowschedules.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workflowschedules.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workspaces.yaml b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workspaces.yaml index 0e84fb35..a75b6af1 100644 --- a/deploy/helm/charts/manager/crds/agentz.accuknox.com_workspaces.yaml +++ b/deploy/helm/charts/manager/crds/agentz.accuknox.com_workspaces.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workspaces.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_agents.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_agents.yaml index 6d1aea4b..35fbbf39 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_agents.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_agents.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: agents.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailconnections.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailconnections.yaml index dbecaa07..9bfca51e 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailconnections.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailconnections.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: guardrailconnections.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -104,7 +104,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailpolicies.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailpolicies.yaml index 463d8388..f29919bc 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailpolicies.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_guardrailpolicies.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: guardrailpolicies.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -184,7 +184,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_inferencepools.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_inferencepools.yaml index 1464cd85..b226a138 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_inferencepools.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_inferencepools.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: inferencepools.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -354,7 +354,6 @@ spec: x-kubernetes-list-type: map type: object required: - - metadata - spec type: object served: true diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_inferenceproviders.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_inferenceproviders.yaml index 643f3cf4..7914d223 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_inferenceproviders.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_inferenceproviders.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: inferenceproviders.agentz.accuknox.com spec: group: agentz.accuknox.com @@ -589,7 +589,6 @@ spec: type: string type: object required: - - metadata - spec type: object served: true diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_mcpconnections.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_mcpconnections.yaml index b74058d1..70ee472b 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_mcpconnections.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_mcpconnections.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: mcpconnections.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_sandboxes.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_sandboxes.yaml index a98c1792..fd2e4889 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_sandboxes.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_sandboxes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: sandboxes.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_secrets.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_secrets.yaml index 7fbfde56..56073adb 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_secrets.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_secrets.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: secrets.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_skills.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_skills.yaml index 597bbe04..776fe5bf 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_skills.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_skills.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: skills.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_tenants.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_tenants.yaml index 6db8d28b..569fa513 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_tenants.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_tenants.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: tenants.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowruns.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowruns.yaml index cf073ef3..edbe43ce 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowruns.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowruns.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workflowruns.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowschedules.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowschedules.yaml index ae7711d9..9b209f2b 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowschedules.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_workflowschedules.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workflowschedules.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/deploy/kustomize/crd/bases/agentz.accuknox.com_workspaces.yaml b/deploy/kustomize/crd/bases/agentz.accuknox.com_workspaces.yaml index a79bdd77..a167c4a9 100644 --- a/deploy/kustomize/crd/bases/agentz.accuknox.com_workspaces.yaml +++ b/deploy/kustomize/crd/bases/agentz.accuknox.com_workspaces.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.1 + controller-gen.kubebuilder.io/version: v0.22.0 name: workspaces.agentz.accuknox.com spec: group: agentz.accuknox.com diff --git a/hack/openapi/generate_opencode_gateway.go b/hack/openapi/generate_opencode_gateway.go index 44a71a8a..2947e392 100644 --- a/hack/openapi/generate_opencode_gateway.go +++ b/hack/openapi/generate_opencode_gateway.go @@ -56,6 +56,7 @@ var baseOperationCapabilities = map[string][]string{ "listChatBackground", "listChatInputs", "updateChatSession", + "getChatSessionState", "submitChatInput", "updateChatInput", "listCodingProjects", diff --git a/internal/gateway/agents.go b/internal/gateway/agents.go index 468d1136..a8d740fe 100644 --- a/internal/gateway/agents.go +++ b/internal/gateway/agents.go @@ -846,6 +846,17 @@ func (s *Service) DeleteAgent(w http.ResponseWriter, r *http.Request, agentName } q := gatewaydb.New(tx) + threads, err := q.GatewayLockAgentChatSessions(r.Context(), gatewaydb.GatewayLockAgentChatSessionsParams{ + WorkspaceID: access.workspaceID, AgentName: agentName, + }) + if err != nil { + apiutil.WriteInternalError(w, r, err) + return + } + if slices.Contains(threads, true) { + apiutil.WriteError(w, r, apiutil.NewError(http.StatusConflict, "thread_locked", "Unlock this agent's chats before deleting it", nil)) + return + } row, err := q.GatewayGetAgent( r.Context(), gatewaydb.GatewayGetAgentParams{ diff --git a/internal/gateway/chat.go b/internal/gateway/chat.go index a4213749..fdf10ece 100644 --- a/internal/gateway/chat.go +++ b/internal/gateway/chat.go @@ -92,6 +92,9 @@ func (s *Service) ListChatSessions(w http.ResponseWriter, r *http.Request, param if params.GroupBy != nil { groupBy = *params.GroupBy } + if shelf == gatewayapi.ChatSessionShelfPinned { + groupBy = gatewayapi.ChatSessionGroupByNone + } search := "" if params.Search != nil { search = strings.TrimSpace(*params.Search) @@ -302,6 +305,7 @@ func (s *Service) ListChatSessions(w http.ResponseWriter, r *http.Request, param includeFilterOptions := params.IncludeFilterOptions == nil || *params.IncludeFilterOptions if includeFilterOptions && shelf == gatewayapi.ChatSessionShelfActive && len(agentNames) > 0 { query := gatewaydb.GatewayCountChatSessionShelvesParams{ + ViewerID: access.userID, WorkspaceID: access.workspaceID, AgentNames: agentNames, OwnerID: ownerID, @@ -404,6 +408,7 @@ func (s *Service) ListChatSessions(w http.ResponseWriter, r *http.Request, param groups, searchErr := s.searchChatSessionGroups( r.Context(), gatewaydb.GatewaySearchGroupedChatSessionsParams{ + ViewerID: access.userID, Shelf: string(shelf), OwnerID: ownerID, PageSize: limit + 1, @@ -437,6 +442,7 @@ func (s *Service) ListChatSessions(w http.ResponseWriter, r *http.Request, param values, err = s.queries.GatewayListChatSessionDateGroups( r.Context(), gatewaydb.GatewayListChatSessionDateGroupsParams{ + ViewerID: access.userID, Shelf: string(shelf), OwnerID: ownerID, TodayStart: today, @@ -460,6 +466,7 @@ func (s *Service) ListChatSessions(w http.ResponseWriter, r *http.Request, param sessions, next, listErr := s.listChatSessionPage( r.Context(), gatewaydb.GatewayListChatSessionsParams{ + ViewerID: access.userID, Shelf: string(shelf), ProjectID: projectID, OwnerID: ownerID, @@ -570,10 +577,16 @@ func (s *Service) listChatSessionPage(ctx context.Context, q gatewaydb.GatewayLi snoozedUntil = &row.SnoozedUntil.Time } sessions = append(sessions, gatewayapi.ChatSession{ - ProjectId: projectID, - AgentName: row.AgentName, - SessionId: row.SessionID, - Title: row.Title, + ProjectId: projectID, + AgentName: row.AgentName, + SessionId: row.SessionID, + Title: row.Title, + State: gatewayapi.ChatSessionState{ + Pinned: row.Pinned, + Locked: row.Locked, + Version: row.StateVersion, + IsParticipant: row.IsParticipant, + }, Archived: row.ArchivedAt.Valid, SnoozedUntil: snoozedUntil, WokeAt: wokeAt, @@ -632,9 +645,15 @@ func (s *Service) searchChatSessionGroups(ctx context.Context, q gatewaydb.Gatew snoozedUntil = &row.SnoozedUntil.Time } group.Sessions = append(group.Sessions, gatewayapi.ChatSession{ - AgentName: row.AgentName, - SessionId: row.SessionID, - Title: row.Title, + AgentName: row.AgentName, + SessionId: row.SessionID, + Title: row.Title, + State: gatewayapi.ChatSessionState{ + Pinned: row.Pinned, + Locked: row.Locked, + Version: row.StateVersion, + IsParticipant: row.IsParticipant, + }, Archived: row.ArchivedAt.Valid, SnoozedUntil: snoozedUntil, WokeAt: wokeAt, @@ -1095,7 +1114,15 @@ func (s *Service) UpdateChatSession(w http.ResponseWriter, r *http.Request, agen return } var until pgtype.Timestamptz - switch body.Shelf { + if body.Pinned != nil || body.Locked != nil { + s.setChatSessionState(w, r, access, agent, session, body) + return + } + if body.Shelf == nil || body.ExpectedVersion != nil { + apiutil.WriteError(w, r, apiutil.NewError(http.StatusBadRequest, "invalid_request", "Choose a shelf or a pin/lock update", nil)) + return + } + switch *body.Shelf { case gatewayapi.ChatSessionShelfActive, gatewayapi.ChatSessionShelfArchived: if body.SnoozedUntil != nil { apiutil.WriteError(w, r, apiutil.NewError( @@ -1140,7 +1167,7 @@ func (s *Service) UpdateChatSession(w http.ResponseWriter, r *http.Request, agen AgentName: agent, SessionID: session, OwnerID: owner, - Shelf: string(body.Shelf), + Shelf: string(*body.Shelf), SnoozedUntil: until, }) if err != nil { @@ -1148,10 +1175,14 @@ func (s *Service) UpdateChatSession(w http.ResponseWriter, r *http.Request, agen return } if !result.Allowed { + message := "Wake or unarchive this chat before snoozing it" + if result.Protected { + message = "Pinned or locked chats cannot be archived or snoozed" + } apiutil.WriteError(w, r, apiutil.NewError( http.StatusConflict, "invalid_transition", - "Wake or unarchive this chat before snoozing it", + message, nil, )) return @@ -1200,3 +1231,196 @@ func (s *Service) runChatSessionExpiry(ctx context.Context) { timer.Reset(max(time.Millisecond, delay)) } } + +// GetChatSessionState reads shared state without relying on sidebar filters. +func (s *Service) GetChatSessionState(w http.ResponseWriter, r *http.Request, agent string, session string) { + access, apiErr := s.resolveAgentAccess(r.Context(), agent, authorization.OperationUseSharedAgent) + if apiErr != nil { + apiutil.WriteError(w, r, apiErr) + return + } + auth, _ := requestAuthState(r.Context()) + if auth.workspaceType == agentzv1alpha1.WorkspaceTypeCoding { + if _, err := s.resolveCodingSession(r.Context(), access, agent, session); err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("get chat", err)) + return + } + } + row, err := s.queries.GatewayGetChatSessionState(r.Context(), gatewaydb.GatewayGetChatSessionStateParams{ + WorkspaceID: access.workspaceID, + AgentName: agent, + SessionID: session, + ViewerID: access.userID, + }) + if err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("get chat state", err)) + return + } + state := gatewayapi.ChatSessionState{ + Pinned: row.Pinned, + Locked: row.Locked, + Version: row.StateVersion, + IsParticipant: row.IsParticipant, + } + if row.StateChangedAt.Valid { + state.ChangedAt = &row.StateChangedAt.Time + } + if row.StateChangedBy.Valid { + actors, err := s.resourceActors(r.Context(), row.StateChangedBy.String) + if err != nil { + apiutil.WriteInternalError(w, r, err) + return + } + actor := actors[row.StateChangedBy.String] + state.Actor = &actor + } + apiutil.WriteJSON(w, http.StatusOK, state) +} + +func (s *Service) setChatSessionState(w http.ResponseWriter, r *http.Request, access resourceAccess, agent string, session string, body gatewayapi.UpdateChatSessionRequest) { + if body.ExpectedVersion == nil || body.Shelf != nil || body.SnoozedUntil != nil { + apiutil.WriteError(w, r, apiutil.NewError( + http.StatusBadRequest, "invalid_request", + "Pin and lock updates require expected_version and cannot change shelves", nil, + )) + return + } + auth, _ := requestAuthState(r.Context()) + if auth.actorType != requestActorUser || auth.claims == nil || auth.claims.BrowserSessionID == "" { + apiutil.WriteError(w, r, resourceForbidden(errors.New("thread pins and locks can only be changed by a browser user"))) + return + } + expiry, err := s.queries.GatewayGetBrowserSessionExpiry(r.Context(), gatewaydb.GatewayGetBrowserSessionExpiryParams{ + ID: auth.claims.BrowserSessionID, UserID: access.userID, + }) + if errors.Is(err, pgx.ErrNoRows) || err == nil && !expiry.After(time.Now()) { + apiutil.WriteError(w, r, apiutil.NewError(http.StatusUnauthorized, "unauthorized", "browser session has expired", nil)) + return + } + if err != nil { + apiutil.WriteInternalError(w, r, err) + return + } + if auth.workspaceType == agentzv1alpha1.WorkspaceTypeCoding { + if body.Locked != nil { + apiutil.WriteError(w, r, apiutil.NewError(http.StatusBadRequest, "invalid_request", "Coding threads do not support locking", nil)) + return + } + if _, err := s.resolveCodingSession(r.Context(), access, agent, session); err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("update chat", err)) + return + } + } + release, err := s.lockChatInputs(r.Context(), access.workspaceID, agent, session, "") + if err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("update chat", err)) + return + } + defer release() + row, err := s.queries.GatewayGetChatSession(r.Context(), gatewaydb.GatewayGetChatSessionParams{ + WorkspaceID: access.workspaceID, + AgentName: agent, + SessionID: session, + }) + if err != nil || row.Deleting || row.ParentSessionID.Valid { + if err == nil { + err = pgx.ErrNoRows + } + apiutil.WriteError(w, r, mapGatewayStoreError("update chat", err)) + return + } + if body.Locked != nil && !*body.Locked { + state, err := s.queries.GatewayGetChatSessionState(r.Context(), gatewaydb.GatewayGetChatSessionStateParams{ + WorkspaceID: access.workspaceID, + AgentName: agent, + SessionID: session, + ViewerID: access.userID, + }) + if err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("get chat state", err)) + return + } + if !state.IsParticipant { + apiutil.WriteError(w, r, apiutil.NewError( + http.StatusForbidden, "thread_participant_required", + "Only participants can unlock this chat", nil, + )) + return + } + } + if row.StateVersion != *body.ExpectedVersion { + apiutil.WriteError(w, r, apiutil.NewError( + http.StatusConflict, "thread_state_conflict", + "This chat changed. Review its current state and try again.", nil, + )) + return + } + samePin := body.Pinned == nil || *body.Pinned == row.Pinned + sameLock := body.Locked == nil || *body.Locked == row.Locked + if samePin && sameLock { + w.WriteHeader(http.StatusNoContent) + return + } + change := gatewaydb.GatewaySetChatSessionStateParams{ + WorkspaceID: access.workspaceID, + AgentName: agent, + SessionID: session, + ActorID: pgtype.Text{String: access.userID, Valid: true}, + ExpectedVersion: *body.ExpectedVersion, + } + if body.Pinned != nil { + change.Pinned = pgtype.Bool{Bool: *body.Pinned, Valid: true} + } + if body.Locked != nil { + change.Locked = pgtype.Bool{Bool: *body.Locked, Valid: true} + } + _, err = s.queries.GatewaySetChatSessionState(r.Context(), change) + if err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("update chat state", err)) + return + } + w.WriteHeader(http.StatusNoContent) +} + +// guardThread protects a conversation's membership and deletion at admission. +// The caller supplies the conversation authorized under its admission lock. +// Accepted inputs and internal notifications may finish after locking. +func (s *Service) guardThread(ctx context.Context, access resourceAccess, root gatewaydb.ChatSession, deleting bool) error { + if root.ParentSessionID.Valid { + var err error + root, err = s.queries.GatewayChatRoot(ctx, gatewaydb.GatewayChatRootParams{ + WorkspaceID: root.WorkspaceID, + AgentName: root.AgentName, + SessionID: root.SessionID, + }) + if errors.Is(err, pgx.ErrNoRows) { + return nil + } + if err != nil { + return err + } + } + if !root.Locked { + return nil + } + if deleting { + return apiutil.NewError(http.StatusConflict, "thread_locked", "Unlock this chat before deleting it", nil) + } + auth, _ := requestAuthState(ctx) + if auth.actorType == requestActorSystem { + return nil + } + state, err := s.queries.GatewayGetChatSessionState(ctx, gatewaydb.GatewayGetChatSessionStateParams{ + WorkspaceID: access.workspaceID, + AgentName: root.AgentName, + SessionID: root.SessionID, + ViewerID: access.userID, + }) + if err != nil { + return err + } + if !state.IsParticipant { + return apiutil.NewError(http.StatusForbidden, "thread_locked", "This chat is locked. Only existing participants can send messages.", nil) + } + return nil +} diff --git a/internal/gateway/db/migrations/00005_thread_state.sql b/internal/gateway/db/migrations/00005_thread_state.sql new file mode 100644 index 00000000..a3ffb08c --- /dev/null +++ b/internal/gateway/db/migrations/00005_thread_state.sql @@ -0,0 +1,10 @@ +-- +goose Up +ALTER TABLE chat_sessions + ADD COLUMN pinned boolean NOT NULL DEFAULT false, + ADD COLUMN locked boolean NOT NULL DEFAULT false, + ADD COLUMN state_version bigint NOT NULL DEFAULT 0, + ADD COLUMN state_changed_by text REFERENCES users(id) ON DELETE SET NULL, + ADD COLUMN state_changed_at timestamptz; + +-- +goose Down +ALTER TABLE chat_sessions DROP COLUMN pinned, DROP COLUMN locked, DROP COLUMN state_version, DROP COLUMN state_changed_by, DROP COLUMN state_changed_at; diff --git a/internal/gateway/db/models.go b/internal/gateway/db/models.go index 8c89a392..3556cb84 100644 --- a/internal/gateway/db/models.go +++ b/internal/gateway/db/models.go @@ -930,6 +930,11 @@ type ChatInput struct { } type ChatSession struct { + Pinned bool `json:"pinned"` + Locked bool `json:"locked"` + StateVersion int64 `json:"state_version"` + StateChangedBy pgtype.Text `json:"state_changed_by"` + StateChangedAt pgtype.Timestamptz `json:"state_changed_at"` WorkspaceID string `json:"workspace_id"` AgentName string `json:"agent_name"` SessionID string `json:"session_id"` diff --git a/internal/gateway/db/querier.go b/internal/gateway/db/querier.go index e3e87f2d..82aebb20 100644 --- a/internal/gateway/db/querier.go +++ b/internal/gateway/db/querier.go @@ -83,6 +83,7 @@ type Querier interface { GatewayGetChatInput(ctx context.Context, arg GatewayGetChatInputParams) (ChatInput, error) GatewayGetChatSession(ctx context.Context, arg GatewayGetChatSessionParams) (ChatSession, error) GatewayGetChatSessionGroup(ctx context.Context, arg GatewayGetChatSessionGroupParams) (GatewayGetChatSessionGroupRow, error) + GatewayGetChatSessionState(ctx context.Context, arg GatewayGetChatSessionStateParams) (GatewayGetChatSessionStateRow, error) GatewayGetCodingOperation(ctx context.Context, arg GatewayGetCodingOperationParams) (CodingOperation, error) GatewayGetCodingProject(ctx context.Context, arg GatewayGetCodingProjectParams) (CodingProject, error) GatewayGetCodingThread(ctx context.Context, arg GatewayGetCodingThreadParams) (GatewayGetCodingThreadRow, error) @@ -159,6 +160,7 @@ type Querier interface { GatewayListenStreamAuthorization(ctx context.Context) error GatewayLockActiveOrganizationMember(ctx context.Context, arg GatewayLockActiveOrganizationMemberParams) (string, error) GatewayLockActiveWorkspace(ctx context.Context, arg GatewayLockActiveWorkspaceParams) (string, error) + GatewayLockAgentChatSessions(ctx context.Context, arg GatewayLockAgentChatSessionsParams) ([]bool, error) GatewayLockAgentOwner(ctx context.Context, arg GatewayLockAgentOwnerParams) (AgentOwner, error) GatewayLockAgentShares(ctx context.Context, arg GatewayLockAgentSharesParams) ([]AgentShare, error) GatewayLockCodingIdentity(ctx context.Context, id string) (string, error) @@ -193,6 +195,7 @@ type Querier interface { GatewaySaveDelegationMCPSession(ctx context.Context, arg GatewaySaveDelegationMCPSessionParams) (int64, error) GatewaySearchGroupedChatSessions(ctx context.Context, arg GatewaySearchGroupedChatSessionsParams) ([]GatewaySearchGroupedChatSessionsRow, error) GatewaySeedCodingSnapshots(ctx context.Context) error + GatewaySetChatSessionState(ctx context.Context, arg GatewaySetChatSessionStateParams) (interface{}, error) GatewayStopChatInputs(ctx context.Context, arg GatewayStopChatInputsParams) error GatewaySyncAgentChatSessionStatuses(ctx context.Context, arg GatewaySyncAgentChatSessionStatusesParams) error GatewayTeamExists(ctx context.Context, arg GatewayTeamExistsParams) (bool, error) diff --git a/internal/gateway/db/query.sql b/internal/gateway/db/query.sql index 731718f8..3e37c903 100644 --- a/internal/gateway/db/query.sql +++ b/internal/gateway/db/query.sql @@ -417,6 +417,8 @@ SELECT sessions.agent_name, sessions.session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + (viewer.user_id IS NOT NULL)::boolean AS is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -441,6 +443,9 @@ SELECT AND participants.session_id = sessions.session_id ), '[]'::jsonb)::text AS participants_json FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = @viewer_id LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id @@ -449,11 +454,13 @@ WHERE (sqlc.narg(project_id)::text IS NULL OR project.id = sqlc.narg(project_id) AND sessions.workspace_id = sqlc.arg(workspace_id) AND sessions.agent_name = ANY(sqlc.arg(agent_names)::text[]) AND sessions.parent_session_id IS NULL - AND CASE sqlc.arg(shelf)::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN sqlc.arg(shelf)::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE sqlc.arg(shelf)::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END AND (sqlc.narg(owner_id)::text IS NULL OR project.owner_id = sqlc.narg(owner_id)) AND NOT sessions.deleting @@ -527,6 +534,9 @@ SELECT CASE ELSE 'older' END::text AS group_value FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = @viewer_id LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id @@ -534,11 +544,13 @@ LEFT JOIN coding_projects AS project ON project.id = tree.project_id WHERE sessions.workspace_id = sqlc.arg(workspace_id) AND sessions.agent_name = ANY(sqlc.arg(agent_names)::text[]) AND sessions.parent_session_id IS NULL - AND CASE sqlc.arg(shelf)::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN sqlc.arg(shelf)::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE sqlc.arg(shelf)::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END AND (sqlc.narg(owner_id)::text IS NULL OR project.owner_id = sqlc.narg(owner_id)) AND NOT sessions.deleting @@ -569,6 +581,8 @@ WITH filtered_sessions AS ( sessions.session_id, sessions.parent_session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + (viewer.user_id IS NOT NULL)::boolean AS is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -588,6 +602,9 @@ WITH filtered_sessions AS ( END END)::text AS group_value FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = @viewer_id LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id @@ -595,11 +612,13 @@ LEFT JOIN coding_projects AS project ON project.id = tree.project_id WHERE sessions.workspace_id = sqlc.arg(workspace_id) AND sessions.agent_name = ANY(sqlc.arg(agent_names)::text[]) AND sessions.parent_session_id IS NULL - AND CASE sqlc.arg(shelf)::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN sqlc.arg(shelf)::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE sqlc.arg(shelf)::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END AND (sqlc.narg(owner_id)::text IS NULL OR project.owner_id = sqlc.narg(owner_id)) AND NOT sessions.deleting @@ -635,6 +654,8 @@ SELECT sessions.agent_name, sessions.session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + sessions.is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -710,6 +731,9 @@ SELECT count(*) FILTER (WHERE sessions.archived_at IS NOT NULL) AS archived, count(*) FILTER (WHERE sessions.snoozed_until > now()) AS snoozed FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = @viewer_id LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id @@ -717,6 +741,7 @@ LEFT JOIN coding_projects AS project ON project.id = tree.project_id WHERE sessions.workspace_id = sqlc.arg(workspace_id) AND sessions.agent_name = ANY(sqlc.arg(agent_names)::text[]) AND sessions.parent_session_id IS NULL + AND NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND NOT sessions.deleting AND (sessions.archived_at IS NOT NULL OR sessions.snoozed_until > now()) AND (sqlc.narg(owner_id)::text IS NULL OR project.owner_id = sqlc.narg(owner_id)) @@ -3362,8 +3387,9 @@ LIMIT 2; -- name: GatewayUpdateChatSession :one WITH target AS MATERIALIZED ( SELECT sessions.workspace_id, sessions.agent_name, sessions.session_id, - sessions.archived_at, sessions.snoozed_until, - (@shelf::text <> 'snoozed' OR (sessions.archived_at IS NULL AND ( + sessions.archived_at, sessions.snoozed_until, sessions.pinned, sessions.locked, + (@shelf::text = 'active' OR NOT (sessions.pinned OR sessions.locked)) + AND (@shelf::text <> 'snoozed' OR (sessions.archived_at IS NULL AND ( sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now() OR sessions.snoozed_until IS NOT DISTINCT FROM sqlc.narg(snoozed_until)::timestamptz ))) AS allowed @@ -3400,6 +3426,7 @@ WITH target AS MATERIALIZED ( LEFT JOIN coding_projects project ON project.id = tree.project_id ) SELECT COALESCE(target.allowed::boolean, false)::boolean AS allowed, + (target.pinned OR target.locked)::boolean AS protected, (SELECT COUNT(*) FROM notified) AS notifications FROM target; -- name: GatewayExpireChatSessions :one @@ -3418,6 +3445,7 @@ WITH RECURSIVE policies AS ( JOIN chat_sessions sessions ON sessions.workspace_id = w.id AND sessions.agent_name = policies.agent_name WHERE policies.hours > 0 AND sessions.archived_at IS NULL + AND NOT sessions.pinned AND NOT sessions.locked AND sessions.parent_session_id IS NULL AND sessions.snoozed_until IS NULL AND sessions.status = 'idle' AND GREATEST(sessions.source_updated_at, sessions.resumed_at) < now() - make_interval(hours => policies.hours) @@ -3450,6 +3478,7 @@ WITH RECURSIVE policies AS ( AND ( sessions.snoozed_until <= now() OR (sessions.snoozed_until IS NULL AND sessions.status = 'idle' AND candidates.hours > 0 + AND NOT sessions.pinned AND NOT sessions.locked AND GREATEST(sessions.source_updated_at, sessions.resumed_at) < now() - make_interval(hours => candidates.hours) AND NOT EXISTS (SELECT 1 FROM active WHERE active.workspace_id = sessions.workspace_id @@ -3484,7 +3513,7 @@ WITH RECURSIVE lineage AS ( WHERE p.workspace_id = @workspace_id AND p.agent_name = @agent_name ) SELECT s.* FROM chat_sessions s JOIN lineage l ON l.session_id = s.session_id -WHERE s.workspace_id = @workspace_id AND s.agent_name = @agent_name AND s.kind = 'chat' AND s.parent_session_id IS NULL LIMIT 1; +WHERE s.workspace_id = @workspace_id AND s.agent_name = @agent_name AND s.parent_session_id IS NULL LIMIT 1; -- name: GatewayCompleteBackgroundInput :one UPDATE chat_inputs SET completed_at = now(), outcome = @outcome, content = '{}'::jsonb, @@ -3546,3 +3575,32 @@ WHERE workspace_id = @workspace_id AND agent_name = @agent_name AND session_id = SELECT session_id, generation FROM chat_sessions WHERE workspace_id = @workspace_id AND agent_name = @agent_name AND kind = 'chat' AND parent_session_id IS NULL AND NOT deleting; + +-- name: GatewayGetChatSessionState :one +SELECT sessions.pinned, sessions.locked, sessions.state_version, + sessions.state_changed_by, sessions.state_changed_at, + EXISTS (SELECT 1 FROM chat_session_participants member + WHERE member.workspace_id = sessions.workspace_id AND member.agent_name = sessions.agent_name + AND member.session_id = sessions.session_id AND member.user_id = @viewer_id) AS is_participant +FROM chat_sessions sessions +WHERE sessions.workspace_id = @workspace_id AND sessions.agent_name = @agent_name + AND sessions.session_id = @session_id AND NOT sessions.deleting; + +-- name: GatewaySetChatSessionState :one +WITH changed AS ( + UPDATE chat_sessions SET + pinned = COALESCE(sqlc.narg(pinned)::boolean, pinned), + locked = COALESCE(sqlc.narg(locked)::boolean, locked), + state_version = state_version + 1, + state_changed_by = CASE WHEN sqlc.narg(locked)::boolean IS NOT NULL THEN @actor_id ELSE state_changed_by END, + state_changed_at = CASE WHEN sqlc.narg(locked)::boolean IS NOT NULL THEN now() ELSE state_changed_at END + WHERE workspace_id = @workspace_id AND agent_name = @agent_name AND session_id = @session_id + AND state_version = @expected_version AND NOT deleting + RETURNING workspace_id +) +SELECT pg_notify('agentz_chat_sessions', workspace_id) FROM changed; + +-- name: GatewayLockAgentChatSessions :many +SELECT locked FROM chat_sessions +WHERE workspace_id = @workspace_id AND agent_name = @agent_name +FOR UPDATE; diff --git a/internal/gateway/db/query.sql.go b/internal/gateway/db/query.sql.go index 01896471..1e6d1f2e 100644 --- a/internal/gateway/db/query.sql.go +++ b/internal/gateway/db/query.sql.go @@ -227,8 +227,8 @@ WITH RECURSIVE lineage AS ( JOIN lineage c ON p.session_id = c.parent_session_id WHERE p.workspace_id = $1 AND p.agent_name = $2 ) -SELECT s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation FROM chat_sessions s JOIN lineage l ON l.session_id = s.session_id -WHERE s.workspace_id = $1 AND s.agent_name = $2 AND s.kind = 'chat' AND s.parent_session_id IS NULL LIMIT 1 +SELECT s.pinned, s.locked, s.state_version, s.state_changed_by, s.state_changed_at, s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation FROM chat_sessions s JOIN lineage l ON l.session_id = s.session_id +WHERE s.workspace_id = $1 AND s.agent_name = $2 AND s.parent_session_id IS NULL LIMIT 1 ` type GatewayChatRootParams struct { @@ -241,6 +241,11 @@ func (q *Queries) GatewayChatRoot(ctx context.Context, arg GatewayChatRootParams row := q.db.QueryRow(ctx, gatewayChatRoot, arg.WorkspaceID, arg.AgentName, arg.SessionID) var i ChatSession err := row.Scan( + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.StateChangedBy, + &i.StateChangedAt, &i.WorkspaceID, &i.AgentName, &i.SessionID, @@ -668,40 +673,45 @@ SELECT count(*) FILTER (WHERE sessions.archived_at IS NOT NULL) AS archived, count(*) FILTER (WHERE sessions.snoozed_until > now()) AS snoozed FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = $1 LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id LEFT JOIN coding_projects AS project ON project.id = tree.project_id -WHERE sessions.workspace_id = $1 - AND sessions.agent_name = ANY($2::text[]) +WHERE sessions.workspace_id = $2 + AND sessions.agent_name = ANY($3::text[]) AND sessions.parent_session_id IS NULL + AND NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND NOT sessions.deleting AND (sessions.archived_at IS NOT NULL OR sessions.snoozed_until > now()) - AND ($3::text IS NULL OR project.owner_id = $3) + AND ($4::text IS NULL OR project.owner_id = $4) AND ( - $4::boolean + $5::boolean OR sessions.kind <> 'workflow_run' ) AND ( - NOT $5::boolean + NOT $6::boolean OR sessions.title ILIKE - '%' || REPLACE(REPLACE(REPLACE($6::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' + '%' || REPLACE(REPLACE(REPLACE($7::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\' ) AND ( - cardinality($7::text[]) = 0 + cardinality($8::text[]) = 0 OR ( SELECT COUNT(DISTINCT participants.user_id) FROM chat_session_participants AS participants WHERE participants.workspace_id = sessions.workspace_id AND participants.agent_name = sessions.agent_name AND participants.session_id = sessions.session_id - AND participants.user_id = ANY($7::text[]) - ) = cardinality($7::text[]) + AND participants.user_id = ANY($8::text[]) + ) = cardinality($8::text[]) ) ` type GatewayCountChatSessionShelvesParams struct { + ViewerID string `json:"viewer_id"` WorkspaceID string `json:"workspace_id"` AgentNames []string `json:"agent_names"` OwnerID pgtype.Text `json:"owner_id"` @@ -718,6 +728,7 @@ type GatewayCountChatSessionShelvesRow struct { func (q *Queries) GatewayCountChatSessionShelves(ctx context.Context, arg GatewayCountChatSessionShelvesParams) (GatewayCountChatSessionShelvesRow, error) { row := q.db.QueryRow(ctx, gatewayCountChatSessionShelves, + arg.ViewerID, arg.WorkspaceID, arg.AgentNames, arg.OwnerID, @@ -1707,6 +1718,7 @@ WITH RECURSIVE policies AS ( JOIN chat_sessions sessions ON sessions.workspace_id = w.id AND sessions.agent_name = policies.agent_name WHERE policies.hours > 0 AND sessions.archived_at IS NULL + AND NOT sessions.pinned AND NOT sessions.locked AND sessions.parent_session_id IS NULL AND sessions.snoozed_until IS NULL AND sessions.status = 'idle' AND GREATEST(sessions.source_updated_at, sessions.resumed_at) < now() - make_interval(hours => policies.hours) @@ -1739,6 +1751,7 @@ WITH RECURSIVE policies AS ( AND ( sessions.snoozed_until <= now() OR (sessions.snoozed_until IS NULL AND sessions.status = 'idle' AND candidates.hours > 0 + AND NOT sessions.pinned AND NOT sessions.locked AND GREATEST(sessions.source_updated_at, sessions.resumed_at) < now() - make_interval(hours => candidates.hours) AND NOT EXISTS (SELECT 1 FROM active WHERE active.workspace_id = sessions.workspace_id @@ -2507,7 +2520,7 @@ func (q *Queries) GatewayGetChatInput(ctx context.Context, arg GatewayGetChatInp } const gatewayGetChatSession = `-- name: GatewayGetChatSession :one -SELECT workspace_id, agent_name, session_id, parent_session_id, title, archived_at, snoozed_until, resumed_at, woke_at, kind, status, source_created_at, source_updated_at, created_at, updated_at, deleting, cleanup_completed_at, generation FROM chat_sessions +SELECT pinned, locked, state_version, state_changed_by, state_changed_at, workspace_id, agent_name, session_id, parent_session_id, title, archived_at, snoozed_until, resumed_at, woke_at, kind, status, source_created_at, source_updated_at, created_at, updated_at, deleting, cleanup_completed_at, generation FROM chat_sessions WHERE workspace_id = $1 AND agent_name = $2 AND session_id = $3 ` @@ -2521,6 +2534,11 @@ func (q *Queries) GatewayGetChatSession(ctx context.Context, arg GatewayGetChatS row := q.db.QueryRow(ctx, gatewayGetChatSession, arg.WorkspaceID, arg.AgentName, arg.SessionID) var i ChatSession err := row.Scan( + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.StateChangedBy, + &i.StateChangedAt, &i.WorkspaceID, &i.AgentName, &i.SessionID, @@ -2583,6 +2601,52 @@ func (q *Queries) GatewayGetChatSessionGroup(ctx context.Context, arg GatewayGet return i, err } +const gatewayGetChatSessionState = `-- name: GatewayGetChatSessionState :one +SELECT sessions.pinned, sessions.locked, sessions.state_version, + sessions.state_changed_by, sessions.state_changed_at, + EXISTS (SELECT 1 FROM chat_session_participants member + WHERE member.workspace_id = sessions.workspace_id AND member.agent_name = sessions.agent_name + AND member.session_id = sessions.session_id AND member.user_id = $1) AS is_participant +FROM chat_sessions sessions +WHERE sessions.workspace_id = $2 AND sessions.agent_name = $3 + AND sessions.session_id = $4 AND NOT sessions.deleting +` + +type GatewayGetChatSessionStateParams struct { + ViewerID string `json:"viewer_id"` + WorkspaceID string `json:"workspace_id"` + AgentName string `json:"agent_name"` + SessionID string `json:"session_id"` +} + +type GatewayGetChatSessionStateRow struct { + Pinned bool `json:"pinned"` + Locked bool `json:"locked"` + StateVersion int64 `json:"state_version"` + StateChangedBy pgtype.Text `json:"state_changed_by"` + StateChangedAt pgtype.Timestamptz `json:"state_changed_at"` + IsParticipant bool `json:"is_participant"` +} + +func (q *Queries) GatewayGetChatSessionState(ctx context.Context, arg GatewayGetChatSessionStateParams) (GatewayGetChatSessionStateRow, error) { + row := q.db.QueryRow(ctx, gatewayGetChatSessionState, + arg.ViewerID, + arg.WorkspaceID, + arg.AgentName, + arg.SessionID, + ) + var i GatewayGetChatSessionStateRow + err := row.Scan( + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.StateChangedBy, + &i.StateChangedAt, + &i.IsParticipant, + ) + return i, err +} + const gatewayGetCodingOperation = `-- name: GatewayGetCodingOperation :one SELECT id, workspace_id, organization_id, owner_id, project_id, worktree_id, request, result, lease_token, lease_until, created_at FROM coding_operations WHERE id = $1 AND workspace_id = $2 AND owner_id = $3 ` @@ -4675,36 +4739,41 @@ SELECT CASE ELSE 'older' END::text AS group_value FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = $4 LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id LEFT JOIN coding_projects AS project ON project.id = tree.project_id -WHERE sessions.workspace_id = $4 - AND sessions.agent_name = ANY($5::text[]) +WHERE sessions.workspace_id = $5 + AND sessions.agent_name = ANY($6::text[]) AND sessions.parent_session_id IS NULL - AND CASE $6::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN $7::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE $7::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END - AND ($7::text IS NULL OR project.owner_id = $7) + AND ($8::text IS NULL OR project.owner_id = $8) AND NOT sessions.deleting AND ( - $8::boolean + $9::boolean OR sessions.kind <> 'workflow_run' ) AND ( - cardinality($9::text[]) = 0 + cardinality($10::text[]) = 0 OR ( SELECT COUNT(DISTINCT participants.user_id) FROM chat_session_participants AS participants WHERE participants.workspace_id = sessions.workspace_id AND participants.agent_name = sessions.agent_name AND participants.session_id = sessions.session_id - AND participants.user_id = ANY($9::text[]) - ) = cardinality($9::text[]) + AND participants.user_id = ANY($10::text[]) + ) = cardinality($10::text[]) ) GROUP BY group_value ORDER BY MAX(sessions.source_updated_at) DESC @@ -4714,6 +4783,7 @@ type GatewayListChatSessionDateGroupsParams struct { TodayStart time.Time `json:"today_start"` YesterdayStart time.Time `json:"yesterday_start"` PreviousWeekStart time.Time `json:"previous_week_start"` + ViewerID string `json:"viewer_id"` WorkspaceID string `json:"workspace_id"` AgentNames []string `json:"agent_names"` Shelf string `json:"shelf"` @@ -4727,6 +4797,7 @@ func (q *Queries) GatewayListChatSessionDateGroups(ctx context.Context, arg Gate arg.TodayStart, arg.YesterdayStart, arg.PreviousWeekStart, + arg.ViewerID, arg.WorkspaceID, arg.AgentNames, arg.Shelf, @@ -4828,6 +4899,8 @@ SELECT sessions.agent_name, sessions.session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + (viewer.user_id IS NOT NULL)::boolean AS is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -4852,85 +4925,91 @@ SELECT AND participants.session_id = sessions.session_id ), '[]'::jsonb)::text AS participants_json FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = $1 LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id LEFT JOIN coding_projects AS project ON project.id = tree.project_id -WHERE ($1::text IS NULL OR project.id = $1) - AND sessions.workspace_id = $2 - AND sessions.agent_name = ANY($3::text[]) +WHERE ($2::text IS NULL OR project.id = $2) + AND sessions.workspace_id = $3 + AND sessions.agent_name = ANY($4::text[]) AND sessions.parent_session_id IS NULL - AND CASE $4::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN $5::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE $5::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END - AND ($5::text IS NULL OR project.owner_id = $5) + AND ($6::text IS NULL OR project.owner_id = $6) AND NOT sessions.deleting AND ( - $6::boolean + $7::boolean OR sessions.kind <> 'workflow_run' ) AND ( - $7::text IS NULL - OR sessions.agent_name = $7::text + $8::text IS NULL + OR sessions.agent_name = $8::text ) AND ( - NOT $8::boolean + NOT $9::boolean OR sessions.title ILIKE - '%' || REPLACE(REPLACE(REPLACE($9::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' + '%' || REPLACE(REPLACE(REPLACE($10::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\' ) AND ( - $10::text IS NULL - OR sessions.agent_name = $10::text + $11::text IS NULL + OR sessions.agent_name = $11::text ) AND ( - $11::chat_session_status IS NULL - OR sessions.status = $11::chat_session_status + $12::chat_session_status IS NULL + OR sessions.status = $12::chat_session_status ) AND ( - $12::timestamptz IS NULL - OR sessions.source_updated_at >= $12::timestamptz + $13::timestamptz IS NULL + OR sessions.source_updated_at >= $13::timestamptz ) AND ( - $13::timestamptz IS NULL - OR sessions.source_updated_at < $13::timestamptz + $14::timestamptz IS NULL + OR sessions.source_updated_at < $14::timestamptz ) AND ( - cardinality($14::text[]) = 0 + cardinality($15::text[]) = 0 OR ( SELECT COUNT(DISTINCT participants.user_id) FROM chat_session_participants AS participants WHERE participants.workspace_id = sessions.workspace_id AND participants.agent_name = sessions.agent_name AND participants.session_id = sessions.session_id - AND participants.user_id = ANY($14::text[]) - ) = cardinality($14::text[]) + AND participants.user_id = ANY($15::text[]) + ) = cardinality($15::text[]) ) AND ( - NOT $15::boolean - OR sessions.source_updated_at < $16 + NOT $16::boolean + OR sessions.source_updated_at < $17 OR ( - sessions.source_updated_at = $16 - AND sessions.agent_name > $17 + sessions.source_updated_at = $17 + AND sessions.agent_name > $18 ) OR ( - sessions.source_updated_at = $16 - AND sessions.agent_name = $17 - AND sessions.session_id > $18 + sessions.source_updated_at = $17 + AND sessions.agent_name = $18 + AND sessions.session_id > $19 ) ) ORDER BY sessions.source_updated_at DESC NULLS LAST, sessions.agent_name ASC, sessions.session_id ASC -LIMIT $19 +LIMIT $20 ` type GatewayListChatSessionsParams struct { + ViewerID string `json:"viewer_id"` ProjectID pgtype.Text `json:"project_id"` WorkspaceID string `json:"workspace_id"` AgentNames []string `json:"agent_names"` @@ -4958,6 +5037,10 @@ type GatewayListChatSessionsRow struct { AgentName string `json:"agent_name"` SessionID string `json:"session_id"` Title string `json:"title"` + Pinned bool `json:"pinned"` + Locked bool `json:"locked"` + StateVersion int64 `json:"state_version"` + IsParticipant bool `json:"is_participant"` ArchivedAt pgtype.Timestamptz `json:"archived_at"` SnoozedUntil pgtype.Timestamptz `json:"snoozed_until"` WokeAt pgtype.Timestamptz `json:"woke_at"` @@ -4970,6 +5053,7 @@ type GatewayListChatSessionsRow struct { func (q *Queries) GatewayListChatSessions(ctx context.Context, arg GatewayListChatSessionsParams) ([]GatewayListChatSessionsRow, error) { rows, err := q.db.Query(ctx, gatewayListChatSessions, + arg.ViewerID, arg.ProjectID, arg.WorkspaceID, arg.AgentNames, @@ -5003,6 +5087,10 @@ func (q *Queries) GatewayListChatSessions(ctx context.Context, arg GatewayListCh &i.AgentName, &i.SessionID, &i.Title, + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.IsParticipant, &i.ArchivedAt, &i.SnoozedUntil, &i.WokeAt, @@ -7301,6 +7389,37 @@ func (q *Queries) GatewayLockActiveWorkspace(ctx context.Context, arg GatewayLoc return id, err } +const gatewayLockAgentChatSessions = `-- name: GatewayLockAgentChatSessions :many +SELECT locked FROM chat_sessions +WHERE workspace_id = $1 AND agent_name = $2 +FOR UPDATE +` + +type GatewayLockAgentChatSessionsParams struct { + WorkspaceID string `json:"workspace_id"` + AgentName string `json:"agent_name"` +} + +func (q *Queries) GatewayLockAgentChatSessions(ctx context.Context, arg GatewayLockAgentChatSessionsParams) ([]bool, error) { + rows, err := q.db.Query(ctx, gatewayLockAgentChatSessions, arg.WorkspaceID, arg.AgentName) + if err != nil { + return nil, err + } + defer rows.Close() + items := []bool{} + for rows.Next() { + var locked bool + if err := rows.Scan(&locked); err != nil { + return nil, err + } + items = append(items, locked) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const gatewayLockAgentOwner = `-- name: GatewayLockAgentOwner :one SELECT organization_id, @@ -7473,12 +7592,12 @@ WITH changed AS ( generation = generation + 1, updated_at = now() WHERE s.workspace_id = $1 AND s.agent_name = $2 AND s.session_id = $3 AND kind = 'chat' AND parent_session_id IS NULL AND NOT deleting - RETURNING s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation + RETURNING s.pinned, s.locked, s.state_version, s.state_changed_by, s.state_changed_at, s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation ), removed AS ( DELETE FROM chat_inputs i USING changed c WHERE i.workspace_id=c.workspace_id AND i.agent_name=c.agent_name AND i.session_id=c.session_id ) -SELECT workspace_id, agent_name, session_id, parent_session_id, title, archived_at, snoozed_until, resumed_at, woke_at, kind, status, source_created_at, source_updated_at, created_at, updated_at, deleting, cleanup_completed_at, generation FROM changed +SELECT pinned, locked, state_version, state_changed_by, state_changed_at, workspace_id, agent_name, session_id, parent_session_id, title, archived_at, snoozed_until, resumed_at, woke_at, kind, status, source_created_at, source_updated_at, created_at, updated_at, deleting, cleanup_completed_at, generation FROM changed ` type GatewayMarkChatDeletingParams struct { @@ -7488,6 +7607,11 @@ type GatewayMarkChatDeletingParams struct { } type GatewayMarkChatDeletingRow struct { + Pinned bool `json:"pinned"` + Locked bool `json:"locked"` + StateVersion int64 `json:"state_version"` + StateChangedBy pgtype.Text `json:"state_changed_by"` + StateChangedAt pgtype.Timestamptz `json:"state_changed_at"` WorkspaceID string `json:"workspace_id"` AgentName string `json:"agent_name"` SessionID string `json:"session_id"` @@ -7512,6 +7636,11 @@ func (q *Queries) GatewayMarkChatDeleting(ctx context.Context, arg GatewayMarkCh row := q.db.QueryRow(ctx, gatewayMarkChatDeleting, arg.WorkspaceID, arg.AgentName, arg.SessionID) var i GatewayMarkChatDeletingRow err := row.Scan( + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.StateChangedBy, + &i.StateChangedAt, &i.WorkspaceID, &i.AgentName, &i.SessionID, @@ -7620,7 +7749,7 @@ func (q *Queries) GatewayOwnedCodingDirectory(ctx context.Context, arg GatewayOw } const gatewayPendingChatCleanup = `-- name: GatewayPendingChatCleanup :many -SELECT s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation, w.organization_id, w.namespace, COALESCE(o.owner_user_id, '')::text AS author_id +SELECT s.pinned, s.locked, s.state_version, s.state_changed_by, s.state_changed_at, s.workspace_id, s.agent_name, s.session_id, s.parent_session_id, s.title, s.archived_at, s.snoozed_until, s.resumed_at, s.woke_at, s.kind, s.status, s.source_created_at, s.source_updated_at, s.created_at, s.updated_at, s.deleting, s.cleanup_completed_at, s.generation, w.organization_id, w.namespace, COALESCE(o.owner_user_id, '')::text AS author_id FROM chat_sessions s JOIN workspaces w ON w.id = s.workspace_id LEFT JOIN agent_owners o ON o.workspace_id = s.workspace_id AND o.agent_name = s.agent_name LEFT JOIN chat_input_sessions i ON i.workspace_id = s.workspace_id @@ -7647,6 +7776,11 @@ func (q *Queries) GatewayPendingChatCleanup(ctx context.Context, afterKey string for rows.Next() { var i GatewayPendingChatCleanupRow if err := rows.Scan( + &i.ChatSession.Pinned, + &i.ChatSession.Locked, + &i.ChatSession.StateVersion, + &i.ChatSession.StateChangedBy, + &i.ChatSession.StateChangedAt, &i.ChatSession.WorkspaceID, &i.ChatSession.AgentName, &i.ChatSession.SessionID, @@ -8401,6 +8535,8 @@ WITH filtered_sessions AS ( sessions.session_id, sessions.parent_session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + (viewer.user_id IS NOT NULL)::boolean AS is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -8420,43 +8556,48 @@ WITH filtered_sessions AS ( END END)::text AS group_value FROM chat_sessions AS sessions +LEFT JOIN chat_session_participants viewer ON viewer.workspace_id = sessions.workspace_id + AND viewer.agent_name = sessions.agent_name AND viewer.session_id = sessions.session_id + AND viewer.user_id = $6 LEFT JOIN coding_threads AS coding ON coding.workspace_id = sessions.workspace_id AND coding.agent_name = sessions.agent_name AND coding.session_id = sessions.session_id LEFT JOIN coding_worktrees AS tree ON tree.id = coding.worktree_id LEFT JOIN coding_projects AS project ON project.id = tree.project_id - WHERE sessions.workspace_id = $6 - AND sessions.agent_name = ANY($7::text[]) + WHERE sessions.workspace_id = $7 + AND sessions.agent_name = ANY($8::text[]) AND sessions.parent_session_id IS NULL - AND CASE $8::text - WHEN 'archived' THEN sessions.archived_at IS NOT NULL - WHEN 'snoozed' THEN sessions.snoozed_until > now() - ELSE sessions.archived_at IS NULL - AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + AND CASE WHEN $9::text = 'pinned' THEN (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) + ELSE NOT (sessions.pinned OR (sessions.locked AND viewer.user_id IS NOT NULL)) AND CASE $9::text + WHEN 'archived' THEN sessions.archived_at IS NOT NULL + WHEN 'snoozed' THEN sessions.snoozed_until > now() + ELSE sessions.archived_at IS NULL + AND (sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now()) + END END - AND ($9::text IS NULL OR project.owner_id = $9) + AND ($10::text IS NULL OR project.owner_id = $10) AND NOT sessions.deleting AND ( - $10::boolean + $11::boolean OR sessions.kind <> 'workflow_run' ) AND ( - $11::text IS NULL - OR sessions.agent_name = $11::text + $12::text IS NULL + OR sessions.agent_name = $12::text ) AND sessions.title ILIKE - '%' || REPLACE(REPLACE(REPLACE($12::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' + '%' || REPLACE(REPLACE(REPLACE($13::text, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\' AND ( - cardinality($13::text[]) = 0 + cardinality($14::text[]) = 0 OR ( SELECT COUNT(DISTINCT participants.user_id) FROM chat_session_participants AS participants WHERE participants.workspace_id = sessions.workspace_id AND participants.agent_name = sessions.agent_name AND participants.session_id = sessions.session_id - AND participants.user_id = ANY($13::text[]) - ) = cardinality($13::text[]) + AND participants.user_id = ANY($14::text[]) + ) = cardinality($14::text[]) ) ), group_values AS ( SELECT DISTINCT group_value @@ -8467,6 +8608,8 @@ SELECT sessions.agent_name, sessions.session_id, sessions.title, + sessions.pinned, sessions.locked, sessions.state_version, + sessions.is_participant, sessions.archived_at, sessions.snoozed_until, sessions.woke_at, @@ -8493,7 +8636,7 @@ SELECT ), '[]'::jsonb)::text AS participants_json FROM group_values CROSS JOIN LATERAL ( - SELECT filtered_sessions.workspace_id, filtered_sessions.agent_name, filtered_sessions.session_id, filtered_sessions.parent_session_id, filtered_sessions.title, filtered_sessions.archived_at, filtered_sessions.snoozed_until, filtered_sessions.woke_at, filtered_sessions.kind, filtered_sessions.status, filtered_sessions.source_created_at, filtered_sessions.source_updated_at, filtered_sessions.group_value + SELECT filtered_sessions.workspace_id, filtered_sessions.agent_name, filtered_sessions.session_id, filtered_sessions.parent_session_id, filtered_sessions.title, filtered_sessions.pinned, filtered_sessions.locked, filtered_sessions.state_version, filtered_sessions.is_participant, filtered_sessions.archived_at, filtered_sessions.snoozed_until, filtered_sessions.woke_at, filtered_sessions.kind, filtered_sessions.status, filtered_sessions.source_created_at, filtered_sessions.source_updated_at, filtered_sessions.group_value FROM filtered_sessions WHERE filtered_sessions.group_value = group_values.group_value ORDER BY @@ -8529,6 +8672,7 @@ type GatewaySearchGroupedChatSessionsParams struct { TodayStart time.Time `json:"today_start"` YesterdayStart time.Time `json:"yesterday_start"` PreviousWeekStart time.Time `json:"previous_week_start"` + ViewerID string `json:"viewer_id"` WorkspaceID string `json:"workspace_id"` AgentNames []string `json:"agent_names"` Shelf string `json:"shelf"` @@ -8544,6 +8688,10 @@ type GatewaySearchGroupedChatSessionsRow struct { AgentName string `json:"agent_name"` SessionID string `json:"session_id"` Title string `json:"title"` + Pinned bool `json:"pinned"` + Locked bool `json:"locked"` + StateVersion int64 `json:"state_version"` + IsParticipant bool `json:"is_participant"` ArchivedAt pgtype.Timestamptz `json:"archived_at"` SnoozedUntil pgtype.Timestamptz `json:"snoozed_until"` WokeAt pgtype.Timestamptz `json:"woke_at"` @@ -8562,6 +8710,7 @@ func (q *Queries) GatewaySearchGroupedChatSessions(ctx context.Context, arg Gate arg.TodayStart, arg.YesterdayStart, arg.PreviousWeekStart, + arg.ViewerID, arg.WorkspaceID, arg.AgentNames, arg.Shelf, @@ -8583,6 +8732,10 @@ func (q *Queries) GatewaySearchGroupedChatSessions(ctx context.Context, arg Gate &i.AgentName, &i.SessionID, &i.Title, + &i.Pinned, + &i.Locked, + &i.StateVersion, + &i.IsParticipant, &i.ArchivedAt, &i.SnoozedUntil, &i.WokeAt, @@ -8616,6 +8769,46 @@ func (q *Queries) GatewaySeedCodingSnapshots(ctx context.Context) error { return err } +const gatewaySetChatSessionState = `-- name: GatewaySetChatSessionState :one +WITH changed AS ( + UPDATE chat_sessions SET + pinned = COALESCE($1::boolean, pinned), + locked = COALESCE($2::boolean, locked), + state_version = state_version + 1, + state_changed_by = CASE WHEN $2::boolean IS NOT NULL THEN $3 ELSE state_changed_by END, + state_changed_at = CASE WHEN $2::boolean IS NOT NULL THEN now() ELSE state_changed_at END + WHERE workspace_id = $4 AND agent_name = $5 AND session_id = $6 + AND state_version = $7 AND NOT deleting + RETURNING workspace_id +) +SELECT pg_notify('agentz_chat_sessions', workspace_id) FROM changed +` + +type GatewaySetChatSessionStateParams struct { + Pinned pgtype.Bool `json:"pinned"` + Locked pgtype.Bool `json:"locked"` + ActorID pgtype.Text `json:"actor_id"` + WorkspaceID string `json:"workspace_id"` + AgentName string `json:"agent_name"` + SessionID string `json:"session_id"` + ExpectedVersion int64 `json:"expected_version"` +} + +func (q *Queries) GatewaySetChatSessionState(ctx context.Context, arg GatewaySetChatSessionStateParams) (interface{}, error) { + row := q.db.QueryRow(ctx, gatewaySetChatSessionState, + arg.Pinned, + arg.Locked, + arg.ActorID, + arg.WorkspaceID, + arg.AgentName, + arg.SessionID, + arg.ExpectedVersion, + ) + var pg_notify interface{} + err := row.Scan(&pg_notify) + return pg_notify, err +} + const gatewayStopChatInputs = `-- name: GatewayStopChatInputs :exec INSERT INTO chat_input_sessions (workspace_id, agent_name, session_id, stopping) VALUES ($1, $2, $3, $4) @@ -9072,8 +9265,9 @@ func (q *Queries) GatewayUpdateChatInput(ctx context.Context, arg GatewayUpdateC const gatewayUpdateChatSession = `-- name: GatewayUpdateChatSession :one WITH target AS MATERIALIZED ( SELECT sessions.workspace_id, sessions.agent_name, sessions.session_id, - sessions.archived_at, sessions.snoozed_until, - ($1::text <> 'snoozed' OR (sessions.archived_at IS NULL AND ( + sessions.archived_at, sessions.snoozed_until, sessions.pinned, sessions.locked, + ($1::text = 'active' OR NOT (sessions.pinned OR sessions.locked)) + AND ($1::text <> 'snoozed' OR (sessions.archived_at IS NULL AND ( sessions.snoozed_until IS NULL OR sessions.snoozed_until <= now() OR sessions.snoozed_until IS NOT DISTINCT FROM $2::timestamptz ))) AS allowed @@ -9110,6 +9304,7 @@ WITH target AS MATERIALIZED ( LEFT JOIN coding_projects project ON project.id = tree.project_id ) SELECT COALESCE(target.allowed::boolean, false)::boolean AS allowed, + (target.pinned OR target.locked)::boolean AS protected, (SELECT COUNT(*) FROM notified) AS notifications FROM target ` @@ -9124,6 +9319,7 @@ type GatewayUpdateChatSessionParams struct { type GatewayUpdateChatSessionRow struct { Allowed bool `json:"allowed"` + Protected bool `json:"protected"` Notifications int64 `json:"notifications"` } @@ -9137,7 +9333,7 @@ func (q *Queries) GatewayUpdateChatSession(ctx context.Context, arg GatewayUpdat arg.OwnerID, ) var i GatewayUpdateChatSessionRow - err := row.Scan(&i.Allowed, &i.Notifications) + err := row.Scan(&i.Allowed, &i.Protected, &i.Notifications) return i, err } diff --git a/internal/gateway/db/schema.sql b/internal/gateway/db/schema.sql index 156774b8..bd2f7048 100644 --- a/internal/gateway/db/schema.sql +++ b/internal/gateway/db/schema.sql @@ -21,6 +21,11 @@ CREATE TYPE chat_session_status AS ENUM('idle', 'busy', 'retry'); CREATE TYPE chat_session_group_by AS ENUM('none', 'agent', 'status', 'date', 'project'); CREATE TABLE chat_sessions ( + pinned boolean NOT NULL DEFAULT false, + locked boolean NOT NULL DEFAULT false, + state_version bigint NOT NULL DEFAULT 0, + state_changed_by text REFERENCES users(id) ON DELETE SET NULL, + state_changed_at timestamptz, workspace_id TEXT NOT NULL, agent_name TEXT NOT NULL, session_id TEXT NOT NULL, diff --git a/internal/gateway/openapi/gateway.gen.go b/internal/gateway/openapi/gateway.gen.go index b27fb748..69ce559a 100644 --- a/internal/gateway/openapi/gateway.gen.go +++ b/internal/gateway/openapi/gateway.gen.go @@ -188,6 +188,7 @@ const ( const ( ChatSessionShelfActive ChatSessionShelf = "active" ChatSessionShelfArchived ChatSessionShelf = "archived" + ChatSessionShelfPinned ChatSessionShelf = "pinned" ChatSessionShelfSnoozed ChatSessionShelf = "snoozed" ) @@ -4639,6 +4640,7 @@ type ChatSession struct { ProjectId *string `json:"project_id,omitempty"` SessionId string `json:"session_id"` SnoozedUntil *time.Time `json:"snoozed_until,omitempty"` + State ChatSessionState `json:"state"` Status ChatSessionStatus `json:"status"` Title string `json:"title"` UpdatedAt time.Time `json:"updated_at"` @@ -4691,6 +4693,16 @@ type ChatSessionPreference struct { // ChatSessionShelf defines model for ChatSessionShelf. type ChatSessionShelf string +// ChatSessionState defines model for ChatSessionState. +type ChatSessionState struct { + Actor *ResourceActor `json:"actor,omitempty"` + ChangedAt *time.Time `json:"changed_at,omitempty"` + IsParticipant bool `json:"is_participant"` + Locked bool `json:"locked"` + Pinned bool `json:"pinned"` + Version int64 `json:"version"` +} + // ChatSessionStatus defines model for ChatSessionStatus. type ChatSessionStatus string @@ -16220,8 +16232,11 @@ type UpdateAgentRequest struct { // UpdateChatSessionRequest defines model for UpdateChatSessionRequest. type UpdateChatSessionRequest struct { - Shelf ChatSessionShelf `json:"shelf"` - SnoozedUntil *time.Time `json:"snoozed_until,omitempty"` + ExpectedVersion *int64 `json:"expected_version,omitempty"` + Locked *bool `json:"locked,omitempty"` + Pinned *bool `json:"pinned,omitempty"` + Shelf *ChatSessionShelf `json:"shelf,omitempty"` + SnoozedUntil *time.Time `json:"snoozed_until,omitempty"` } // UpdateInferencePoolRequest defines model for UpdateInferencePoolRequest. @@ -36728,6 +36743,9 @@ type ClientInterface interface { // WatchChatSessions request WatchChatSessions(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetChatSessionState request + GetChatSessionState(ctx context.Context, agentName string, sessionId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateChatSessionWithBody request with any body UpdateChatSessionWithBody(ctx context.Context, agentName string, sessionId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -38272,6 +38290,18 @@ func (c *Client) WatchChatSessions(ctx context.Context, reqEditors ...RequestEdi return c.Client.Do(req) } +func (c *Client) GetChatSessionState(ctx context.Context, agentName string, sessionId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetChatSessionStateRequest(c.Server, agentName, sessionId) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) UpdateChatSessionWithBody(ctx context.Context, agentName string, sessionId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewUpdateChatSessionRequestWithBody(c.Server, agentName, sessionId, contentType, body) if err != nil { @@ -44414,6 +44444,47 @@ func NewWatchChatSessionsRequest(server string) (*http.Request, error) { return req, nil } +// NewGetChatSessionStateRequest generates requests for GetChatSessionState +func NewGetChatSessionStateRequest(server string, agentName string, sessionId string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "agentName", runtime.ParamLocationPath, agentName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "sessionId", runtime.ParamLocationPath, sessionId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/chat-session/%s/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewUpdateChatSessionRequest calls the generic UpdateChatSession builder with application/json body func NewUpdateChatSessionRequest(server string, agentName string, sessionId string, body UpdateChatSessionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -59659,6 +59730,9 @@ type ClientWithResponsesInterface interface { // WatchChatSessionsWithResponse request WatchChatSessionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*WatchChatSessionsResp, error) + // GetChatSessionStateWithResponse request + GetChatSessionStateWithResponse(ctx context.Context, agentName string, sessionId string, reqEditors ...RequestEditorFn) (*GetChatSessionStateResp, error) + // UpdateChatSessionWithBodyWithResponse request with any body UpdateChatSessionWithBodyWithResponse(ctx context.Context, agentName string, sessionId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateChatSessionResp, error) @@ -61615,6 +61689,31 @@ func (r WatchChatSessionsResp) StatusCode() int { return 0 } +type GetChatSessionStateResp struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ChatSessionState + JSON403 *Forbidden + JSON404 *NotFound + JSON500 *InternalError +} + +// Status returns HTTPResponse.Status +func (r GetChatSessionStateResp) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetChatSessionStateResp) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type UpdateChatSessionResp struct { Body []byte HTTPResponse *http.Response @@ -67855,6 +67954,15 @@ func (c *ClientWithResponses) WatchChatSessionsWithResponse(ctx context.Context, return ParseWatchChatSessionsResp(rsp) } +// GetChatSessionStateWithResponse request returning *GetChatSessionStateResp +func (c *ClientWithResponses) GetChatSessionStateWithResponse(ctx context.Context, agentName string, sessionId string, reqEditors ...RequestEditorFn) (*GetChatSessionStateResp, error) { + rsp, err := c.GetChatSessionState(ctx, agentName, sessionId, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetChatSessionStateResp(rsp) +} + // UpdateChatSessionWithBodyWithResponse request with arbitrary body returning *UpdateChatSessionResp func (c *ClientWithResponses) UpdateChatSessionWithBodyWithResponse(ctx context.Context, agentName string, sessionId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateChatSessionResp, error) { rsp, err := c.UpdateChatSessionWithBody(ctx, agentName, sessionId, contentType, body, reqEditors...) @@ -72984,6 +73092,53 @@ func ParseWatchChatSessionsResp(rsp *http.Response) (*WatchChatSessionsResp, err return response, nil } +// ParseGetChatSessionStateResp parses an HTTP response from a GetChatSessionStateWithResponse call +func ParseGetChatSessionStateResp(rsp *http.Response) (*GetChatSessionStateResp, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetChatSessionStateResp{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ChatSessionState + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest Forbidden + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest NotFound + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest InternalError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON500 = &dest + + } + + return response, nil +} + // ParseUpdateChatSessionResp parses an HTTP response from a UpdateChatSessionWithResponse call func ParseUpdateChatSessionResp(rsp *http.Response) (*UpdateChatSessionResp, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -83360,7 +83515,10 @@ type ServerInterface interface { // Watch the current Workspace chat inbox. // (GET /api/chat-session/watch) WatchChatSessions(w http.ResponseWriter, r *http.Request) - // Move a session between inbox shelves. + // Read shared thread pin and lock state. + // (GET /api/chat-session/{agentName}/{sessionId}) + GetChatSessionState(w http.ResponseWriter, r *http.Request, agentName string, sessionId string) + // Update a thread shelf, shared pin, or lock. // (PATCH /api/chat-session/{agentName}/{sessionId}) UpdateChatSession(w http.ResponseWriter, r *http.Request, agentName string, sessionId string) // Read conversation background activity. @@ -84292,7 +84450,13 @@ func (_ Unimplemented) WatchChatSessions(w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusNotImplemented) } -// Move a session between inbox shelves. +// Read shared thread pin and lock state. +// (GET /api/chat-session/{agentName}/{sessionId}) +func (_ Unimplemented) GetChatSessionState(w http.ResponseWriter, r *http.Request, agentName string, sessionId string) { + w.WriteHeader(http.StatusNotImplemented) +} + +// Update a thread shelf, shared pin, or lock. // (PATCH /api/chat-session/{agentName}/{sessionId}) func (_ Unimplemented) UpdateChatSession(w http.ResponseWriter, r *http.Request, agentName string, sessionId string) { w.WriteHeader(http.StatusNotImplemented) @@ -87592,6 +87756,46 @@ func (siw *ServerInterfaceWrapper) WatchChatSessions(w http.ResponseWriter, r *h handler.ServeHTTP(w, r) } +// GetChatSessionState operation middleware +func (siw *ServerInterfaceWrapper) GetChatSessionState(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "agentName" ------------- + var agentName string + + err = runtime.BindStyledParameterWithOptions("simple", "agentName", chi.URLParam(r, "agentName"), &agentName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "agentName", Err: err}) + return + } + + // ------------- Path parameter "sessionId" ------------- + var sessionId string + + err = runtime.BindStyledParameterWithOptions("simple", "sessionId", chi.URLParam(r, "sessionId"), &sessionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "sessionId", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, GatewayBearerScopes, []string{"agent.use_shared"}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetChatSessionState(w, r, agentName, sessionId) + })) + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + handler = siw.HandlerMiddlewares[i](handler) + } + + handler.ServeHTTP(w, r) +} + // UpdateChatSession operation middleware func (siw *ServerInterfaceWrapper) UpdateChatSession(w http.ResponseWriter, r *http.Request) { @@ -99494,6 +99698,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/chat-session/watch", wrapper.WatchChatSessions) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/chat-session/{agentName}/{sessionId}", wrapper.GetChatSessionState) + }) r.Group(func(r chi.Router) { r.Patch(options.BaseURL+"/api/chat-session/{agentName}/{sessionId}", wrapper.UpdateChatSession) }) @@ -100272,1092 +100479,1099 @@ var swaggerSpec = []string{ "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", - "6AsA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/gateway/opencode.go b/internal/gateway/opencode.go index 9142f5ea..d7a90fe1 100644 --- a/internal/gateway/opencode.go +++ b/internal/gateway/opencode.go @@ -188,7 +188,7 @@ func (s *Service) handleOpenCodeProxy(w http.ResponseWriter, r *http.Request) { input := false switch route.ID { case "session.prompt", "session.prompt_async", "session.command", - "session.shell", "v2.session.prompt": + "session.shell", "session.init", "v2.session.prompt": input = true ctx, release, err := gatewayLocks(r.Context(), s.lockDB) if err != nil { @@ -245,6 +245,14 @@ func (s *Service) handleOpenCodeProxy(w http.ResponseWriter, r *http.Request) { apiutil.WriteError(w, r, mapGatewayStoreError("get conversation", guardErr)) return } + if input || route.ID == "session.delete" { + guardErr := s.guardThread(r.Context(), access, root, route.ID == "session.delete") + if guardErr != nil { + release() + apiutil.WriteError(w, r, mapGatewayStoreError("update chat", guardErr)) + return + } + } if route.ID == "session.delete" && eligible && root.SessionID == sessionID { _, err := s.queries.GatewayMarkChatDeleting(r.Context(), gatewaydb.GatewayMarkChatDeletingParams{ WorkspaceID: access.workspaceID, diff --git a/internal/gateway/queue.go b/internal/gateway/queue.go index 22e8c6cc..4f733736 100644 --- a/internal/gateway/queue.go +++ b/internal/gateway/queue.go @@ -226,7 +226,12 @@ func (s *Service) SubmitChatInput(w http.ResponseWriter, r *http.Request, agent } defer release() // Deletion can commit while admission waits for the lock. - if _, _, err := s.authorizeChat(r.Context(), access, agent, session); err != nil { + root, _, err := s.authorizeChat(r.Context(), access, agent, session) + if err != nil { + apiutil.WriteError(w, r, mapGatewayStoreError("submit message", err)) + return + } + if err := s.guardThread(r.Context(), access, root, false); err != nil { apiutil.WriteError(w, r, mapGatewayStoreError("submit message", err)) return } diff --git a/openapi/base.yaml b/openapi/base.yaml index 93ce539e..589f03fe 100644 --- a/openapi/base.yaml +++ b/openapi/base.yaml @@ -681,6 +681,9 @@ paths: description: > Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. + The pinned shelf includes shared pins and the viewer's locked conversations, + regardless of archive or snooze state, and always returns an ungrouped list. + These conversations are excluded from the other shelves for that viewer. tags: [chat-sessions] parameters: - {name: shelf, in: query, schema: {$ref: '#/components/schemas/ChatSessionShelf'}} @@ -733,13 +736,36 @@ paths: '500': {$ref: '#/components/responses/InternalError'} /api/chat-session/{agentName}/{sessionId}: + get: + operationId: getChatSessionState + summary: Read shared thread pin and lock state. + tags: [chat-sessions] + parameters: + - {name: agentName, in: path, required: true, schema: {type: string}} + - {name: sessionId, in: path, required: true, schema: {type: string}} + responses: + '200': + description: Authorized thread state. + content: + application/json: + schema: {$ref: '#/components/schemas/ChatSessionState'} + '403': {$ref: '#/components/responses/Forbidden'} + '404': {$ref: '#/components/responses/NotFound'} + '500': {$ref: '#/components/responses/InternalError'} patch: operationId: updateChatSession - summary: Move a session between inbox shelves. + summary: Update a thread shelf, shared pin, or lock. description: > Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. - Repeating an identical update succeeds without changing activity times. + Pinned or locked threads cannot be archived or snoozed and are excluded from automatic archival. + Existing archived or snoozed threads can still be restored. + Repeating an identical permitted update succeeds without changing activity times. + Pin and lock updates require expected_version and cannot be combined with shelf changes. + Pins are shared across authorized users. Locking independently pins a thread for its participants. + Removing a shared pin while locked unpins the thread only for non-participants. + Locked threads cannot be deleted, and only existing participants can submit new messages or unlock them. + Coding threads support shared pins only. tags: [chat-sessions] parameters: - {name: agentName, in: path, required: true, schema: {type: string}} @@ -6524,16 +6550,30 @@ components: ChatSessionShelf: type: string - enum: [active, archived, snoozed] - x-enum-varnames: [ChatSessionShelfActive, ChatSessionShelfArchived, ChatSessionShelfSnoozed] + enum: [active, archived, snoozed, pinned] + x-enum-varnames: [ChatSessionShelfActive, ChatSessionShelfArchived, ChatSessionShelfSnoozed, ChatSessionShelfPinned] UpdateChatSessionRequest: type: object additionalProperties: false - required: [shelf] properties: + pinned: {type: boolean} + locked: {type: boolean} + expected_version: {type: integer, format: int64, minimum: 0} shelf: {$ref: '#/components/schemas/ChatSessionShelf'} snoozed_until: {type: string, format: date-time} + ChatSessionState: + type: object + additionalProperties: false + required: [pinned, locked, version, is_participant] + properties: + pinned: {type: boolean} + locked: {type: boolean} + version: {type: integer, format: int64} + is_participant: {type: boolean} + changed_at: {type: string, format: date-time} + actor: {$ref: '#/components/schemas/ResourceActor'} + ChatSessionStatus: type: string enum: [idle, busy, retry] @@ -6594,6 +6634,7 @@ components: type: object additionalProperties: false properties: + state: {$ref: "#/components/schemas/ChatSessionState"} has_workflow_schedule_subscription: type: boolean description: Whether a workflow schedule delivers results to this thread, including paused schedules. @@ -6626,6 +6667,7 @@ components: items: $ref: '#/components/schemas/ChatSessionParticipant' required: + - state - has_workflow_schedule_subscription - archived - agent_name diff --git a/openapi/gateway.yaml b/openapi/gateway.yaml index 7ff5fae2..7b3ebb4f 100644 --- a/openapi/gateway.yaml +++ b/openapi/gateway.yaml @@ -1727,6 +1727,8 @@ components: snoozed_until: format: date-time type: string + state: + $ref: '#/components/schemas/ChatSessionState' status: $ref: '#/components/schemas/ChatSessionStatus' title: @@ -1739,6 +1741,7 @@ components: format: date-time type: string required: + - state - has_workflow_schedule_subscription - archived - agent_name @@ -1873,11 +1876,36 @@ components: - active - archived - snoozed + - pinned type: string x-enum-varnames: - ChatSessionShelfActive - ChatSessionShelfArchived - ChatSessionShelfSnoozed + - ChatSessionShelfPinned + ChatSessionState: + additionalProperties: false + properties: + actor: + $ref: '#/components/schemas/ResourceActor' + changed_at: + format: date-time + type: string + is_participant: + type: boolean + locked: + type: boolean + pinned: + type: boolean + version: + format: int64 + type: integer + required: + - pinned + - locked + - version + - is_participant + type: object ChatSessionStatus: enum: - idle @@ -26701,13 +26729,19 @@ components: UpdateChatSessionRequest: additionalProperties: false properties: + expected_version: + format: int64 + minimum: 0 + type: integer + locked: + type: boolean + pinned: + type: boolean shelf: $ref: '#/components/schemas/ChatSessionShelf' snoozed_until: format: date-time type: string - required: - - shelf type: object UpdateInferencePoolRequest: additionalProperties: false @@ -29129,7 +29163,7 @@ paths: /api/chat-session: get: description: | - Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. + Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. The pinned shelf includes shared pins and the viewer's locked conversations, regardless of archive or snooze state, and always returns an ungrouped list. These conversations are excluded from the other shelves for that viewer. operationId: listChatSessions parameters: - in: query @@ -29229,9 +29263,41 @@ paths: tags: - chat-sessions /api/chat-session/{agentName}/{sessionId}: + get: + operationId: getChatSessionState + parameters: + - in: path + name: agentName + required: true + schema: + type: string + - in: path + name: sessionId + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/ChatSessionState' + description: Authorized thread state. + "403": + $ref: '#/components/responses/Forbidden' + "404": + $ref: '#/components/responses/NotFound' + "500": + $ref: '#/components/responses/InternalError' + security: + - GatewayBearer: + - agent.use_shared + summary: Read shared thread pin and lock state. + tags: + - chat-sessions patch: description: | - Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Repeating an identical update succeeds without changing activity times. + Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Pinned or locked threads cannot be archived or snoozed and are excluded from automatic archival. Existing archived or snoozed threads can still be restored. Repeating an identical permitted update succeeds without changing activity times. Pin and lock updates require expected_version and cannot be combined with shelf changes. Pins are shared across authorized users. Locking independently pins a thread for its participants. Removing a shared pin while locked unpins the thread only for non-participants. Locked threads cannot be deleted, and only existing participants can submit new messages or unlock them. Coding threads support shared pins only. operationId: updateChatSession parameters: - in: path @@ -29266,7 +29332,7 @@ paths: security: - GatewayBearer: - agent.use_shared - summary: Move a session between inbox shelves. + summary: Update a thread shelf, shared pin, or lock. tags: - chat-sessions /api/chat-session/{agentName}/{sessionId}/background: diff --git a/opencode/config/lib/gateway/client/index.ts b/opencode/config/lib/gateway/client/index.ts index 1b286205..5d458805 100644 --- a/opencode/config/lib/gateway/client/index.ts +++ b/opencode/config/lib/gateway/client/index.ts @@ -52,6 +52,7 @@ export { getAppOperation, getAppTraceChart, getChatSessionPreference, + getChatSessionState, getCodingOperation, getCodingProject, getCodingThread, @@ -274,6 +275,7 @@ export type { ChatSessionPreference, ChatSessionSearchQuery, ChatSessionShelf, + ChatSessionState, ChatSessionStatus, ChatSessionTimeZoneQuery, ClientOptions, @@ -649,6 +651,11 @@ export type { GetChatSessionPreferenceErrors, GetChatSessionPreferenceResponse, GetChatSessionPreferenceResponses, + GetChatSessionStateData, + GetChatSessionStateError, + GetChatSessionStateErrors, + GetChatSessionStateResponse, + GetChatSessionStateResponses, GetCodingOperationData, GetCodingOperationError, GetCodingOperationErrors, diff --git a/opencode/config/lib/gateway/client/sdk.gen.ts b/opencode/config/lib/gateway/client/sdk.gen.ts index 4c7dc465..cfdfc350 100644 --- a/opencode/config/lib/gateway/client/sdk.gen.ts +++ b/opencode/config/lib/gateway/client/sdk.gen.ts @@ -161,6 +161,9 @@ import type { GetChatSessionPreferenceData, GetChatSessionPreferenceErrors, GetChatSessionPreferenceResponses, + GetChatSessionStateData, + GetChatSessionStateErrors, + GetChatSessionStateResponses, GetCodingOperationData, GetCodingOperationErrors, GetCodingOperationResponses, @@ -966,7 +969,7 @@ export const watchCoding = ( /** * List the current Workspace chat inbox. * - * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. + * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. The pinned shelf includes shared pins and the viewer's locked conversations, regardless of archive or snooze state, and always returns an ungrouped list. These conversations are excluded from the other shelves for that viewer. * */ export const listChatSessions = ( @@ -995,9 +998,25 @@ export const listChatBackground = ( }) /** - * Move a session between inbox shelves. + * Read shared thread pin and lock state. + */ +export const getChatSessionState = ( + options: Options +) => + (options.client ?? client).get< + GetChatSessionStateResponses, + GetChatSessionStateErrors, + ThrowOnError + >({ + security: [{ scheme: "bearer", type: "http" }], + url: "/api/chat-session/{agentName}/{sessionId}", + ...options, + }) + +/** + * Update a thread shelf, shared pin, or lock. * - * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Repeating an identical update succeeds without changing activity times. + * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Pinned or locked threads cannot be archived or snoozed and are excluded from automatic archival. Existing archived or snoozed threads can still be restored. Repeating an identical permitted update succeeds without changing activity times. Pin and lock updates require expected_version and cannot be combined with shelf changes. Pins are shared across authorized users. Locking independently pins a thread for its participants. Removing a shared pin while locked unpins the thread only for non-participants. Locked threads cannot be deleted, and only existing participants can submit new messages or unlock them. Coding threads support shared pins only. * */ export const updateChatSession = ( diff --git a/opencode/config/lib/gateway/client/types.gen.ts b/opencode/config/lib/gateway/client/types.gen.ts index 161af05b..e6a84ed1 100644 --- a/opencode/config/lib/gateway/client/types.gen.ts +++ b/opencode/config/lib/gateway/client/types.gen.ts @@ -300,13 +300,25 @@ export type DelegationCatalog = { export type ChatSessionKind = "chat" | "workflow_run" -export type ChatSessionShelf = "active" | "archived" | "snoozed" +export type ChatSessionShelf = "active" | "archived" | "snoozed" | "pinned" export type UpdateChatSessionRequest = { - shelf: ChatSessionShelf + pinned?: boolean + locked?: boolean + expected_version?: number + shelf?: ChatSessionShelf snoozed_until?: string } +export type ChatSessionState = { + pinned: boolean + locked: boolean + version: number + is_participant: boolean + changed_at?: string + actor?: ResourceActor +} + export type ChatSessionStatus = "idle" | "busy" | "retry" export type ChatSessionGroupBy = "none" | "agent" | "status" | "date" | "project" @@ -331,6 +343,7 @@ export type ChatBackground = { } export type ChatSession = { + state: ChatSessionState /** * Whether a workflow schedule delivers results to this thread, including paused schedules. */ @@ -5107,6 +5120,44 @@ export type ListChatBackgroundResponses = { export type ListChatBackgroundResponse = ListChatBackgroundResponses[keyof ListChatBackgroundResponses] +export type GetChatSessionStateData = { + body?: never + path: { + agentName: string + sessionId: string + } + query?: never + url: "/api/chat-session/{agentName}/{sessionId}" +} + +export type GetChatSessionStateErrors = { + /** + * The authenticated principal lacks authority for this operation. + */ + 403: Error + /** + * Requested resource was not found. For tenant-gated APIs this can also mean the current tenant is not initialized and the error code is `tenant_not_found`. + * + */ + 404: Error + /** + * Unexpected server error. + */ + 500: Error +} + +export type GetChatSessionStateError = GetChatSessionStateErrors[keyof GetChatSessionStateErrors] + +export type GetChatSessionStateResponses = { + /** + * Authorized thread state. + */ + 200: ChatSessionState +} + +export type GetChatSessionStateResponse = + GetChatSessionStateResponses[keyof GetChatSessionStateResponses] + export type UpdateChatSessionData = { body: UpdateChatSessionRequest path: { diff --git a/opencode/config/lib/gateway/client/zod.gen.ts b/opencode/config/lib/gateway/client/zod.gen.ts index 063fa9a5..4e856199 100644 --- a/opencode/config/lib/gateway/client/zod.gen.ts +++ b/opencode/config/lib/gateway/client/zod.gen.ts @@ -110,10 +110,19 @@ export const zDelegationMcp = z.object({ export const zChatSessionKind = z.enum(["chat", "workflow_run"]) -export const zChatSessionShelf = z.enum(["active", "archived", "snoozed"]) +export const zChatSessionShelf = z.enum(["active", "archived", "snoozed", "pinned"]) export const zUpdateChatSessionRequest = z.object({ - shelf: zChatSessionShelf, + pinned: z.boolean().optional(), + locked: z.boolean().optional(), + expected_version: z.coerce + .bigint() + .gte(BigInt(0)) + .max(BigInt("9223372036854775807"), { + error: "Invalid value: Expected int64 to be <= 9223372036854775807", + }) + .optional(), + shelf: zChatSessionShelf.optional(), snoozed_until: z.iso.datetime({ offset: true }).optional(), }) @@ -505,6 +514,22 @@ export const zListLensAppsResponse = z.object({ apps: z.array(zLensApp), }) +export const zChatSessionState = z.object({ + pinned: z.boolean(), + locked: z.boolean(), + version: z.coerce + .bigint() + .min(BigInt("-9223372036854775808"), { + error: "Invalid value: Expected int64 to be >= -9223372036854775808", + }) + .max(BigInt("9223372036854775807"), { + error: "Invalid value: Expected int64 to be <= 9223372036854775807", + }), + is_participant: z.boolean(), + changed_at: z.iso.datetime({ offset: true }).optional(), + actor: zResourceActor.optional(), +}) + export const zChatInput = z.object({ id: z.uuid(), author: zResourceActor, @@ -678,6 +703,7 @@ export const zAgentName = z .regex(/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/) export const zChatSession = z.object({ + state: zChatSessionState, has_workflow_schedule_subscription: z.boolean(), archived: z.boolean(), snoozed_until: z.iso.datetime({ offset: true }).optional(), @@ -4765,6 +4791,16 @@ export const zListChatBackgroundPath = z.object({ */ export const zListChatBackgroundResponse = zChatBackgroundList +export const zGetChatSessionStatePath = z.object({ + agentName: z.string(), + sessionId: z.string(), +}) + +/** + * Authorized thread state. + */ +export const zGetChatSessionStateResponse = zChatSessionState + export const zUpdateChatSessionBody = zUpdateChatSessionRequest export const zUpdateChatSessionPath = z.object({ diff --git a/web/app/(app)/guardrails/settings.tsx b/web/app/(app)/guardrails/settings.tsx index 75393d8d..9ccf8fb1 100644 --- a/web/app/(app)/guardrails/settings.tsx +++ b/web/app/(app)/guardrails/settings.tsx @@ -1,8 +1,27 @@ "use client" -import { useState, useTransition } from "react" +import { useId, useState, useTransition } from "react" import { useRouter } from "next/navigation" -import { ArrowDown, ArrowUp, BrickWallShield, CircleAlert, Save } from "lucide-react" +import { + closestCenter, + DndContext, + KeyboardSensor, + MouseSensor, + TouchSensor, + useSensor, + useSensors, + type DragEndEvent, +} from "@dnd-kit/core" +import { restrictToParentElement, restrictToVerticalAxis } from "@dnd-kit/modifiers" +import { + arrayMove, + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy, +} from "@dnd-kit/sortable" +import { CSS } from "@dnd-kit/utilities" +import { BrickWallShield, CircleAlert, GripVertical, Save, Trash2 } from "lucide-react" import { toast } from "sonner" import type { GuardrailPolicy, GuardrailSettings } from "@/lib/gateway/client" import { saveGuardrailSettingsAction } from "@/data/guardrail.actions" @@ -20,11 +39,30 @@ type GuardrailOrganizationSettingsProps = { export function GuardrailOrganizationSettings(props: GuardrailOrganizationSettingsProps) { const { initial, policies } = props + const id = useId() const router = useRouter() const [settings, setSettings] = useState(initial) const [error, setError] = useState("") const [pending, startTransition] = useTransition() const organizationPolicies = policies.filter((policy) => policy.scope === "Organisation") + const sensors = useSensors( + useSensor(MouseSensor, { activationConstraint: { distance: 6 } }), + useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 5 } }), + useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }) + ) + + function reorder({ active, over }: DragEndEvent) { + if (pending || !over || active.id === over.id) return + setSettings((current) => { + const from = current.mandatoryPolicies.findIndex((name) => name === active.id) + const to = current.mandatoryPolicies.findIndex((name) => name === over.id) + if (from < 0 || to < 0) return current + return { + ...current, + mandatoryPolicies: arrayMove(current.mandatoryPolicies, from, to), + } + }) + } return (
) : null} - - {settings.mandatoryPolicies.length > 1 ? ( -
- Baseline execution order - {settings.mandatoryPolicies.map((name, index) => ( -
- - {index + 1}. {policies.find((policy) => policy.name === name)?.displayName ?? name} - -
- {([-1, 1] as const).map((direction) => ( - + /> ))} -
-
- ))} -
- ) : null} + + + + ) : null} + {error ? ( @@ -135,3 +168,70 @@ export function GuardrailOrganizationSettings(props: GuardrailOrganizationSettin ) } + +function SortablePolicy({ + name, + policy, + disabled, + reorderable, + onRemove, +}: { + name: string + policy: GuardrailPolicy | undefined + disabled: boolean + reorderable: boolean + onRemove: () => void +}) { + const { setNodeRef, setActivatorNodeRef, transform, transition, attributes, listeners } = + useSortable({ id: name, disabled: disabled || !reorderable }) + const label = policy?.displayName ?? name + + return ( +
  • + +
    +
    {label}
    +
    + {name} + {policy ? ( + <> + ยท + + {policy.checks.length} {policy.checks.length === 1 ? "check" : "checks"} + + + ) : null} +
    +
    + +
  • + ) +} diff --git a/web/components/blocks/chat/chat.tsx b/web/components/blocks/chat/chat.tsx index b04643ce..74ebcf69 100644 --- a/web/components/blocks/chat/chat.tsx +++ b/web/components/blocks/chat/chat.tsx @@ -1,5 +1,7 @@ "use client" +import { chatSessionWatchOptions, threadStateOptions } from "./thread" + import styles from "./composer.module.css" import { WorkGroup } from "./activity" import { ChatActivityContext, ChatFollowUpContext } from "./display" @@ -109,6 +111,7 @@ import { type QueryKey, } from "@tanstack/react-query" import { + LockKeyhole, CheckIcon, ChevronDownIcon, DownloadIcon, @@ -1676,7 +1679,16 @@ export default function Chat({ profiles.set(user.id, { id: user.id, name: user.name, image: user.image ?? null }) return profiles }, [actorProfilesQuery.data, authSession?.user]) + const threadUserId = authSession?.user.id ?? "" + const thread = useQuery(threadStateOptions(workspaceId, agentName, sessionId ?? "", threadUserId)) + useQuery({ + ...chatSessionWatchOptions(workspaceId, threadUserId), + enabled: Boolean(sessionId && threadUserId), + notifyOnChangeProps: [], + }) + const lockedOut = !coding && thread.data?.locked && !thread.data.is_participant const inputDisabled = + lockedOut || sessionUnavailable || agentReadiness.isGettingReady || navigationPending || @@ -2188,6 +2200,14 @@ export default function Chat({ ) : null} + {lockedOut ? ( + + + + This chat is locked. You can read it, but not participate. + + + ) : null} { + const result = await getChatSessionState({ + baseUrl: await getGatewayBaseURL(), + headers: { "X-AgentZ-Workspace-ID": workspaceId }, + path: { agentName, sessionId }, + signal, + }) + if (result.error) throw new Error(result.error.message) + return result.data + }, + enabled: Boolean(sessionId && userId), + staleTime: Infinity, + }) +} + +export function chatSessionWatchOptions(workspaceId: string, userId: string) { + return queryOptions({ + queryKey: ["watchChatSessions", workspaceId, userId], + queryFn: streamedQuery({ + initialValue: 0, + refetchMode: "append", + reducer: (revision) => revision + 1, + streamFn: async function* ({ signal, client }) { + const result = await watchChatSessions({ + baseUrl: await getGatewayBaseURL(), + headers: { "X-AgentZ-Workspace-ID": workspaceId }, + signal, + }) + for await (const event of result.stream) { + const queryKey = ["chatSessionState", workspaceId] + void client.cancelQueries({ queryKey }).then(() => client.invalidateQueries({ queryKey })) + if (event.revision === "0") { + void client.invalidateQueries({ + queryKey: watchAgentsQueryOptions(workspaceId).queryKey, + }) + } + yield event + } + if (!signal.aborted) throw new Error("Chat session watch closed") + }, + }), + refetchOnMount: "always", + refetchOnReconnect: "always", + refetchOnWindowFocus: false, + retry: true, + retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10_000), + staleTime: Infinity, + }) +} diff --git a/web/components/blocks/sidebar/sessions.tsx b/web/components/blocks/sidebar/sessions.tsx index cb2ab607..d9a036ce 100644 --- a/web/components/blocks/sidebar/sessions.tsx +++ b/web/components/blocks/sidebar/sessions.tsx @@ -11,7 +11,6 @@ import Link from "next/link" import { useRouter } from "@bprogress/next/app" import { GitHubDark, GitHubLight } from "@ridemountainpig/svgl-react" import { - experimental_streamedQuery as streamedQuery, infiniteQueryOptions, hashKey, queryOptions, @@ -48,6 +47,10 @@ import { Settings2, SquarePen, Trash2, + Pin, + PinOff, + LockKeyhole, + LockKeyholeOpen, Users, X, CircleAlert, @@ -73,6 +76,8 @@ import { codingGitOptions, codingThreadOptions } from "@/lib/coding/review" import { createAgentOpencodeClient } from "@/lib/opencode/client" import { sessionDrafts, useSessionDrafts, type SessionDraft } from "@/components/blocks/chat/drafts" +import { chatSessionWatchOptions, threadStateOptions } from "@/components/blocks/chat/thread" + import { deleteAgentSessionAction } from "@/data/opencode.actions" import type { DeleteSessionFormState, ListAgentActionResponse, WorkspacePath } from "@/data/types" import { @@ -151,7 +156,6 @@ import { getCodingThread, listCodingProjects, updateChatSessionPreference, - watchChatSessions, type CodingProject, type ChatSession, type ChatSessionGroup, @@ -160,7 +164,6 @@ import { type AgentStatus, type Workspace, type ListChatSessionsResponse, - type WatchChatSessionsEvent, } from "@/lib/gateway/client" type PreferenceMutation = { @@ -176,6 +179,7 @@ type NavSessionsProps = { agents: ListAgentActionResponse initialPreferences: ChatSessionPreference initialSessions: ListChatSessionsResponse + initialPinnedSessions?: ListChatSessionsResponse workspaceId: string workspacePath: WorkspacePath } @@ -338,6 +342,7 @@ export function NavSessions({ agents, initialPreferences, initialSessions, + initialPinnedSessions, workspaceId, workspaceType, workspacePath, @@ -359,6 +364,7 @@ export function NavSessions({ agents={agents} initialPreferences={initialPreferences} initialSessions={initialSessions} + initialPinnedSessions={initialPinnedSessions} workspaceId={workspaceId} workspacePath={workspacePath} projectActions={actions} @@ -374,6 +380,7 @@ export function NavSessions({ agents={agents} initialPreferences={initialPreferences} initialSessions={initialSessions} + initialPinnedSessions={initialPinnedSessions} workspaceId={workspaceId} workspacePath={workspacePath} /> @@ -417,6 +424,7 @@ function NavSessionsContent({ agents, initialPreferences, initialSessions, + initialPinnedSessions, workspaceId, workspaceType, workspacePath, @@ -590,6 +598,36 @@ function NavSessionsContent({ ? { pages: [{ ...initialSessions, search: "" }], pageParams: [undefined] } : undefined, }) + const pinned = useInfiniteQuery({ + ...chatSessionsOptions( + workspaceId, + { ...preferences, group_by: "none" }, + querySearch, + timeZone, + undefined, + undefined, + userId, + "pinned" + ), + enabled: + trimmedSearch === querySearch && + (searchLength === 0 || (searchLength >= 3 && searchLength <= 200)), + initialData: + !watch.data && + path === initialPath && + matchesInitialPreferences && + querySearch === "" && + initialPinnedSessions + ? { pages: [{ ...initialPinnedSessions, search: "" }], pageParams: [undefined] } + : undefined, + }) + const pinnedSessions = pinned.data?.pages.flatMap((page) => page.sessions) ?? [] + const activePinned = pinnedSessions.some( + (session) => session.agent_name === activeAgentName && session.session_id === activeSessionId + ) + const pinnedList = useSessionListMotion( + pinnedSessions.map((session) => `${session.agent_name}:${session.session_id}`).join("\0") + ) const mutation = useMutation({ scope: { id: `chat-preferences:${userId}:${workspaceId}` }, mutationFn: async ({ next, key }: PreferenceMutation) => { @@ -696,6 +734,9 @@ function NavSessionsContent({ const searchTooLong = searchLength > 200 const searchInvalid = searchTooShort || searchTooLong const searchSettling = searchLength >= 3 && searchLength <= 200 && trimmedSearch !== querySearch + let emptyMessage = "No active chats" + if (querySearch !== "" || activeFilterCount > 0) emptyMessage = "No matching chats" + if (searchSettling || sessions.isPlaceholderData) emptyMessage = "Searching chats..." const list = useSessionListMotion( rows.map((session) => `${session.agent_name}:${session.session_id}`).join("\0"), preferences.group_by === "none" && !sessions.isPending && !searchInvalid @@ -1007,6 +1048,46 @@ function NavSessionsContent({
    + + {searchOpen ? ( + + + ) : null} + {drafts.length > 0 ? (
      ) : null} - - {searchOpen ? ( - - - ) : null} - + Load more pinned chats + + ) : null} + + ) : null}
      Could not load chats ) : null} - {!searchInvalid && - !sessions.isPending && - preferences.group_by === "none" && - rows.length === 0 && - drafts.length === 0 ? ( -
      -
      - ) : null}
        {preferences.group_by === "none" && !searchInvalid ? rows.map((session) => ( @@ -1252,9 +1326,10 @@ function NavSessionsContent({ open={ group.project ? (projectExpansion[group.project.id] ?? - (group.contains_active || query.get("project") === group.project.id)) + ((group.contains_active && !activePinned) || + query.get("project") === group.project.id)) : (groupExpansion.get(`${group.group_by}:${group.key}`) ?? - group.contains_active) + (group.contains_active && !activePinned)) } path={path} preferences={preferences} @@ -1266,16 +1341,17 @@ function NavSessionsContent({ /> )) : null} - {!sessions.isPending && - !searchInvalid && - preferences.group_by !== "none" && - groups.length === 0 && - drafts.length === 0 ? ( + {!searchInvalid && + !sessions.isPending && + !sessions.isError && + !pinned.isPending && + !pinned.isError && + pinnedSessions.length === 0 && + drafts.length === 0 && + (preferences.group_by === "none" ? rows.length === 0 : groups.length === 0) ? (
        ) : null} {preferences.group_by === "none" && @@ -1340,7 +1416,7 @@ function SessionShelf({ workspacePath, path, }: Pick & { - shelf: Exclude + shelf: "snoozed" | "archived" count: number preferences: ChatSessionPreference search: string @@ -1676,7 +1752,7 @@ function SessionGroup({ {!pages.isPending && !pages.isError && sessions.length === 0 ? (

        - {search ? "No matching chats" : "No chats yet"} + {search ? "No matching chats" : "No other chats"}

        ) : null} @@ -2203,6 +2279,12 @@ function SessionCardView({ workspaceType: Workspace["type"] workspacePath: WorkspacePath }) { + const pinned = session.state.pinned || (session.state.locked && session.state.is_participant) + const shelvingDisabled = session.state.pinned || session.state.locked + const shelvingHint = session.state.locked ? "Unlock first" : "Unpin first" + let pinAction = "Pin for everyone" + if (session.state.pinned) pinAction = "Unpin for everyone" + if (session.state.pinned && session.state.locked) pinAction = "Unpin for non-participants" const coding = workspaceType === "coding" const href = `${workspacePath}/agents/${encodeURIComponent(session.agent_name)}/sessions/${encodeURIComponent(session.session_id)}` as Route @@ -2210,6 +2292,8 @@ function SessionCardView({ const queryClient = useQueryClient() const [pendingState, action, isPending] = useActionState( async (state, formData) => { + if (session.state.locked) + return { error: { code: "thread_locked", message: "Unlock this chat before deleting it" } } const result = await deleteAgentSessionAction( session.agent_name, workspaceId, @@ -2249,29 +2333,55 @@ function SessionCardView({ sessionID: session.session_id, title: change.title, }) - if (result.error) throw result.error + if (result.error) throw new Error("Could not rename chat. Try again.") return } const result = await updateChatSession({ baseUrl: await getGatewayBaseURL(), headers: { "X-AgentZ-Workspace-ID": workspaceId }, path: { agentName: session.agent_name, sessionId: session.session_id }, - body: change, + body: + "pinned" in change || "locked" in change + ? { ...change, expected_version: session.state.version } + : change, }) - if (result.error) throw result.error + if (result.error) throw new Error(result.error.message) }, onSuccess: async (_, change) => { setRenaming(false) // SSE may already have populated the destination before this acknowledgement. - if ("shelf" in change) + if ("shelf" in change && !pinned) await removeChatSessionFromCache(queryClient, workspaceId, session, change.shelf) - void queryClient.invalidateQueries({ queryKey: chatSessionKeys.workspace(workspaceId) }) - void queryClient.invalidateQueries({ - queryKey: sessionInfoQueryOptions(session.agent_name, workspaceId, session.session_id) - .queryKey, - }) + if ("title" in change) + void queryClient.invalidateQueries({ + queryKey: sessionInfoQueryOptions(session.agent_name, workspaceId, session.session_id) + .queryKey, + }) + }, + onError: (error) => toast.error(error.message), + onSettled: (_, _error, change) => { + const stateChange = "pinned" in change || "locked" in change + const refresh = Promise.all([ + queryClient.invalidateQueries( + { queryKey: chatSessionKeys.workspace(workspaceId) }, + { cancelRefetch: !stateChange } + ), + stateChange + ? queryClient.invalidateQueries( + { + queryKey: threadStateOptions( + workspaceId, + session.agent_name, + session.session_id, + userId + ).queryKey, + }, + { cancelRefetch: false } + ) + : undefined, + ]) + return stateChange ? refresh : undefined }, - onError: () => toast.error("Could not update chat. Try again."), }) const { setOpenMobile } = useSidebar() const openSession = (event: MouseEvent) => { @@ -2344,6 +2454,33 @@ function SessionCardView({ ) + const indicators = ( + <> + {pinned ? ( + + + + ) : null} + {session.state.locked ? ( + + + + ) : null} + + ) const status = ( {sessionTitle} {subscription} + {indicators} {status} @@ -2477,6 +2615,9 @@ function SessionCardView({ {showAgent ? session.agent_name : null} + {session.archived && pinned ? ( + + ) : null} {status} @@ -2491,6 +2632,7 @@ function SessionCardView({ > {sessionTitle} {subscription} + {indicators} {avatars}
      @@ -2519,6 +2661,25 @@ function SessionCardView({ Copy session ID + edit.mutate({ pinned: !session.state.pinned })} + > + {session.state.pinned ? : } + {pinAction} + + {!coding ? ( + edit.mutate({ locked: !session.state.locked })} + > + {session.state.locked ? : } + {session.state.locked ? "Unlock" : "Lock"} + {session.state.locked && !session.state.is_participant ? ( + Participants only + ) : null} + + ) : null} { @@ -2531,11 +2692,14 @@ function SessionCardView({ Rename edit.mutate({ shelf: session.archived ? "active" : "archived" })} > {session.archived ? : } {session.archived ? "Unarchive" : "Archive"} + {!session.archived && shelvingDisabled ? ( + {shelvingHint} + ) : null} {snoozed ? ( ) : !session.archived ? ( - + Snooze + {shelvingDisabled ? ( + {shelvingHint} + ) : null} @@ -2572,7 +2739,12 @@ function SessionCardView({ ) : null} - setConfirmingDelete(true)}> + setConfirmingDelete(true)} + > Delete chat @@ -2612,6 +2784,7 @@ function SessionCardView({ replaceEqualDeep(previous, next) === previous ) - -function chatSessionWatchOptions(workspaceId: string, userId: string) { - return queryOptions({ - queryKey: ["watchChatSessions", workspaceId, userId], - queryFn: streamedQuery({ - initialValue: 0, - refetchMode: "append", - reducer: (revision) => revision + 1, - streamFn: async function* ({ signal, client }) { - const result = await watchChatSessions({ - baseUrl: await getGatewayBaseURL(), - headers: { "X-AgentZ-Workspace-ID": workspaceId }, - signal, - }) - for await (const event of result.stream) { - if (event.revision === "0") { - void client.invalidateQueries({ - queryKey: watchAgentsQueryOptions(workspaceId).queryKey, - }) - } - yield event - } - if (!signal.aborted) throw new Error("Chat session watch closed") - }, - }), - refetchOnMount: "always", - refetchOnReconnect: "always", - refetchOnWindowFocus: false, - retry: true, - retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10_000), - staleTime: Infinity, - }) -} diff --git a/web/components/blocks/sidebar/sidebar.tsx b/web/components/blocks/sidebar/sidebar.tsx index 2384cd39..29985007 100644 --- a/web/components/blocks/sidebar/sidebar.tsx +++ b/web/components/blocks/sidebar/sidebar.tsx @@ -285,21 +285,26 @@ async function WorkspaceChatSessions(props: WorkspaceChatSessionsProps) { } const preferences = preference.data - const [sessions, actor] = await Promise.all([ + const query = { + agent_name: preferences.agent_name ?? undefined, + include_workflow_runs: preferences.include_workflow_runs, + limit: 10, + participant_user_id: + preferences.participant_user_ids.length > 0 ? preferences.participant_user_ids : undefined, + } + const [sessions, pinned, actor] = await Promise.all([ listChatSessions({ client: getGatewayServerClient(workspaceId), query: { - agent_name: preferences.agent_name ?? undefined, + ...query, group_by: preferences.group_by, - include_workflow_runs: preferences.include_workflow_runs, - limit: 10, - participant_user_id: - preferences.participant_user_ids.length > 0 - ? preferences.participant_user_ids - : undefined, time_zone: preferences.group_by === "date" ? "UTC" : undefined, }, }), + listChatSessions({ + client: getGatewayServerClient(workspaceId), + query: { ...query, shelf: "pinned", group_by: "none", include_filter_options: false }, + }), currentGatewayAuthContext(), ]) if (sessions.error) { @@ -319,6 +324,7 @@ async function WorkspaceChatSessions(props: WorkspaceChatSessionsProps) { agents={agents} initialPreferences={preferences} initialSessions={sessions.data} + initialPinnedSessions={pinned.data} workspaceType={workspaceType} workspaceId={workspaceId} workspacePath={workspacePath} diff --git a/web/lib/gateway/client/@tanstack/react-query.gen.ts b/web/lib/gateway/client/@tanstack/react-query.gen.ts index b0c63cb9..fc7e83da 100644 --- a/web/lib/gateway/client/@tanstack/react-query.gen.ts +++ b/web/lib/gateway/client/@tanstack/react-query.gen.ts @@ -60,6 +60,7 @@ import { getAppOperation, getAppTraceChart, getChatSessionPreference, + getChatSessionState, getCodingOperation, getCodingProject, getCodingThread, @@ -341,6 +342,9 @@ import type { GetChatSessionPreferenceData, GetChatSessionPreferenceError, GetChatSessionPreferenceResponse, + GetChatSessionStateData, + GetChatSessionStateError, + GetChatSessionStateResponse, GetCodingOperationData, GetCodingOperationError, GetCodingOperationResponse, @@ -1480,7 +1484,7 @@ export const listChatSessionsQueryKey = (options?: Options /** * List the current Workspace chat inbox. * - * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. + * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. The pinned shelf includes shared pins and the viewer's locked conversations, regardless of archive or snooze state, and always returns an ungrouped list. These conversations are excluded from the other shelves for that viewer. * */ export const listChatSessionsOptions = (options?: Options) => @@ -1527,10 +1531,35 @@ export const listChatBackgroundOptions = (options: Options) => + createQueryKey("getChatSessionState", options) + +/** + * Read shared thread pin and lock state. + */ +export const getChatSessionStateOptions = (options: Options) => + queryOptions< + GetChatSessionStateResponse, + GetChatSessionStateError, + GetChatSessionStateResponse, + ReturnType + >({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getChatSessionState({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }) + return data + }, + queryKey: getChatSessionStateQueryKey(options), + }) + /** - * Move a session between inbox shelves. + * Update a thread shelf, shared pin, or lock. * - * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Repeating an identical update succeeds without changing activity times. + * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Pinned or locked threads cannot be archived or snoozed and are excluded from automatic archival. Existing archived or snoozed threads can still be restored. Repeating an identical permitted update succeeds without changing activity times. Pin and lock updates require expected_version and cannot be combined with shelf changes. Pins are shared across authorized users. Locking independently pins a thread for its participants. Removing a shared pin while locked unpins the thread only for non-participants. Locked threads cannot be deleted, and only existing participants can submit new messages or unlock them. Coding threads support shared pins only. * */ export const updateChatSessionMutation = ( diff --git a/web/lib/gateway/client/index.ts b/web/lib/gateway/client/index.ts index 1b286205..5d458805 100644 --- a/web/lib/gateway/client/index.ts +++ b/web/lib/gateway/client/index.ts @@ -52,6 +52,7 @@ export { getAppOperation, getAppTraceChart, getChatSessionPreference, + getChatSessionState, getCodingOperation, getCodingProject, getCodingThread, @@ -274,6 +275,7 @@ export type { ChatSessionPreference, ChatSessionSearchQuery, ChatSessionShelf, + ChatSessionState, ChatSessionStatus, ChatSessionTimeZoneQuery, ClientOptions, @@ -649,6 +651,11 @@ export type { GetChatSessionPreferenceErrors, GetChatSessionPreferenceResponse, GetChatSessionPreferenceResponses, + GetChatSessionStateData, + GetChatSessionStateError, + GetChatSessionStateErrors, + GetChatSessionStateResponse, + GetChatSessionStateResponses, GetCodingOperationData, GetCodingOperationError, GetCodingOperationErrors, diff --git a/web/lib/gateway/client/sdk.gen.ts b/web/lib/gateway/client/sdk.gen.ts index 4c7dc465..cfdfc350 100644 --- a/web/lib/gateway/client/sdk.gen.ts +++ b/web/lib/gateway/client/sdk.gen.ts @@ -161,6 +161,9 @@ import type { GetChatSessionPreferenceData, GetChatSessionPreferenceErrors, GetChatSessionPreferenceResponses, + GetChatSessionStateData, + GetChatSessionStateErrors, + GetChatSessionStateResponses, GetCodingOperationData, GetCodingOperationErrors, GetCodingOperationResponses, @@ -966,7 +969,7 @@ export const watchCoding = ( /** * List the current Workspace chat inbox. * - * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. + * Returns root sessions in descending update order. Participant filters use ALL semantics and are evaluated by the database before pagination. The pinned shelf includes shared pins and the viewer's locked conversations, regardless of archive or snooze state, and always returns an ungrouped list. These conversations are excluded from the other shelves for that viewer. * */ export const listChatSessions = ( @@ -995,9 +998,25 @@ export const listChatBackground = ( }) /** - * Move a session between inbox shelves. + * Read shared thread pin and lock state. + */ +export const getChatSessionState = ( + options: Options +) => + (options.client ?? client).get< + GetChatSessionStateResponses, + GetChatSessionStateErrors, + ThrowOnError + >({ + security: [{ scheme: "bearer", type: "http" }], + url: "/api/chat-session/{agentName}/{sessionId}", + ...options, + }) + +/** + * Update a thread shelf, shared pin, or lock. * - * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Repeating an identical update succeeds without changing activity times. + * Active sessions can be snoozed or archived. Snoozed sessions can be woken or archived. Archived sessions must be unarchived before snoozing. Pinned or locked threads cannot be archived or snoozed and are excluded from automatic archival. Existing archived or snoozed threads can still be restored. Repeating an identical permitted update succeeds without changing activity times. Pin and lock updates require expected_version and cannot be combined with shelf changes. Pins are shared across authorized users. Locking independently pins a thread for its participants. Removing a shared pin while locked unpins the thread only for non-participants. Locked threads cannot be deleted, and only existing participants can submit new messages or unlock them. Coding threads support shared pins only. * */ export const updateChatSession = ( diff --git a/web/lib/gateway/client/types.gen.ts b/web/lib/gateway/client/types.gen.ts index bf3f5491..ecab59a4 100644 --- a/web/lib/gateway/client/types.gen.ts +++ b/web/lib/gateway/client/types.gen.ts @@ -300,13 +300,25 @@ export type DelegationCatalog = { export type ChatSessionKind = "chat" | "workflow_run" -export type ChatSessionShelf = "active" | "archived" | "snoozed" +export type ChatSessionShelf = "active" | "archived" | "snoozed" | "pinned" export type UpdateChatSessionRequest = { - shelf: ChatSessionShelf + pinned?: boolean + locked?: boolean + expected_version?: number + shelf?: ChatSessionShelf snoozed_until?: string } +export type ChatSessionState = { + pinned: boolean + locked: boolean + version: number + is_participant: boolean + changed_at?: string + actor?: ResourceActor +} + export type ChatSessionStatus = "idle" | "busy" | "retry" export type ChatSessionGroupBy = "none" | "agent" | "status" | "date" | "project" @@ -331,6 +343,7 @@ export type ChatBackground = { } export type ChatSession = { + state: ChatSessionState /** * Whether a workflow schedule delivers results to this thread, including paused schedules. */ @@ -5134,6 +5147,44 @@ export type ListChatBackgroundResponses = { export type ListChatBackgroundResponse = ListChatBackgroundResponses[keyof ListChatBackgroundResponses] +export type GetChatSessionStateData = { + body?: never + path: { + agentName: string + sessionId: string + } + query?: never + url: "/api/chat-session/{agentName}/{sessionId}" +} + +export type GetChatSessionStateErrors = { + /** + * The authenticated principal lacks authority for this operation. + */ + 403: Error + /** + * Requested resource was not found. For tenant-gated APIs this can also mean the current tenant is not initialized and the error code is `tenant_not_found`. + * + */ + 404: Error + /** + * Unexpected server error. + */ + 500: Error +} + +export type GetChatSessionStateError = GetChatSessionStateErrors[keyof GetChatSessionStateErrors] + +export type GetChatSessionStateResponses = { + /** + * Authorized thread state. + */ + 200: ChatSessionState +} + +export type GetChatSessionStateResponse = + GetChatSessionStateResponses[keyof GetChatSessionStateResponses] + export type UpdateChatSessionData = { body: UpdateChatSessionRequest path: { diff --git a/web/lib/gateway/client/zod.gen.ts b/web/lib/gateway/client/zod.gen.ts index 34eddb3f..1d08fd17 100644 --- a/web/lib/gateway/client/zod.gen.ts +++ b/web/lib/gateway/client/zod.gen.ts @@ -110,10 +110,19 @@ export const zDelegationMcp = z.object({ export const zChatSessionKind = z.enum(["chat", "workflow_run"]) -export const zChatSessionShelf = z.enum(["active", "archived", "snoozed"]) +export const zChatSessionShelf = z.enum(["active", "archived", "snoozed", "pinned"]) export const zUpdateChatSessionRequest = z.object({ - shelf: zChatSessionShelf, + pinned: z.boolean().optional(), + locked: z.boolean().optional(), + expected_version: z.coerce + .bigint() + .gte(BigInt(0)) + .max(BigInt("9223372036854775807"), { + error: "Invalid value: Expected int64 to be <= 9223372036854775807", + }) + .optional(), + shelf: zChatSessionShelf.optional(), snoozed_until: z.iso.datetime({ offset: true }).optional(), }) @@ -505,6 +514,22 @@ export const zListLensAppsResponse = z.object({ apps: z.array(zLensApp), }) +export const zChatSessionState = z.object({ + pinned: z.boolean(), + locked: z.boolean(), + version: z.coerce + .bigint() + .min(BigInt("-9223372036854775808"), { + error: "Invalid value: Expected int64 to be >= -9223372036854775808", + }) + .max(BigInt("9223372036854775807"), { + error: "Invalid value: Expected int64 to be <= 9223372036854775807", + }), + is_participant: z.boolean(), + changed_at: z.iso.datetime({ offset: true }).optional(), + actor: zResourceActor.optional(), +}) + export const zChatInput = z.object({ id: z.uuid(), author: zResourceActor, @@ -678,6 +703,7 @@ export const zAgentName = z .regex(/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/) export const zChatSession = z.object({ + state: zChatSessionState, has_workflow_schedule_subscription: z.boolean(), archived: z.boolean(), snoozed_until: z.iso.datetime({ offset: true }).optional(), @@ -4586,6 +4612,11 @@ export const zListChatSessionsResponse2 = zListChatSessionsResponse */ export const zListChatBackgroundResponse = zChatBackgroundList +/** + * Authorized thread state. + */ +export const zGetChatSessionStateResponse = zChatSessionState + /** * Session updated. */