feat(server): add typed list session gql (#12979)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Introduced new API endpoints and GraphQL queries to retrieve Copilot
chat sessions by workspace, document, and pinned status, with detailed
session and message information.
* Added support for filtering and querying Copilot chat histories with
new options such as pinned status and message ordering.

* **Bug Fixes**
* Improved filtering logic for listing and retrieving chat sessions,
ensuring accurate results for workspace, document, and pinned session
queries.

* **Tests**
* Expanded and refactored test coverage for session listing, filtering,
and new query options to ensure reliability and correctness of Copilot
session retrieval.
* Updated snapshot data to reflect new session types and filtering
capabilities.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-07-01 19:31:37 +08:00
committed by GitHub
parent 6e9487a9e1
commit 0326da0806
13 changed files with 704 additions and 152 deletions
@@ -262,16 +262,53 @@ Generated by [AVA](https://avajs.dev).
{
all_workspace_sessions: {
count: 2,
count: 7,
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: true,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: true,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'pinned',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'workspace',
@@ -283,30 +320,35 @@ Generated by [AVA](https://avajs.dev).
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: true,
messageCount: 0,
type: 'doc',
},
{
hasMessages: true,
isAction: false,
isFork: false,
messageCount: 1,
type: 'doc',
},
{
hasMessages: true,
isAction: false,
isFork: false,
messageCount: 1,
type: 'doc',
},
{
hasMessages: false,
isAction: true,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: true,
isAction: false,
isFork: false,
messageCount: 1,
type: 'doc',
@@ -318,6 +360,7 @@ Generated by [AVA](https://avajs.dev).
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
@@ -325,28 +368,39 @@ Generated by [AVA](https://avajs.dev).
],
},
non_action_sessions: {
count: 4,
count: 5,
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: true,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: true,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
@@ -354,28 +408,25 @@ Generated by [AVA](https://avajs.dev).
],
},
non_fork_sessions: {
count: 4,
count: 3,
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
@@ -383,16 +434,44 @@ Generated by [AVA](https://avajs.dev).
],
},
recent_top3_sessions: {
count: 3,
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: true,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'doc',
},
],
},
workspace_sessions_with_messages: {
count: 2,
sessionTypes: [
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'pinned',
},
{
hasMessages: false,
isAction: false,
isFork: false,
messageCount: 0,
type: 'workspace',
@@ -486,102 +565,3 @@ Generated by [AVA](https://avajs.dev).
workspaceSessionExists: true,
},
}
## should handle session updates and validations
> should unpin existing when pinning new session
[
{
docId: null,
id: 'session-update-id',
pinned: true,
},
{
docId: null,
id: 'existing-pinned-session-id',
pinned: false,
},
]
> session type conversion steps
[
{
session: {
docId: 'doc-update-id',
pinned: false,
},
step: 'workspace_to_doc',
type: 'doc',
},
{
session: {
docId: null,
pinned: false,
},
step: 'doc_to_workspace',
type: 'workspace',
},
{
session: {
docId: null,
pinned: true,
},
step: 'workspace_to_pinned',
type: 'pinned',
},
]
## should create multiple doc sessions and query latest
> multiple doc sessions for same document with order verification
[
{
docId: 'multi-session-doc',
hasMessages: true,
isFirstSession: false,
isSecondSession: false,
isThirdSession: true,
messageCount: 1,
},
{
docId: 'multi-session-doc',
hasMessages: true,
isFirstSession: false,
isSecondSession: true,
isThirdSession: false,
messageCount: 1,
},
{
docId: 'multi-session-doc',
hasMessages: true,
isFirstSession: true,
isSecondSession: false,
isThirdSession: false,
messageCount: 1,
},
]
## should query recent topK sessions of different types
> should include different session types in recent topK query
[
{
docId: null,
pinned: false,
type: 'workspace',
},
{
docId: null,
pinned: true,
type: 'pinned',
},
{
docId: null,
pinned: false,
type: 'workspace',
},
]
@@ -169,6 +169,7 @@ test('should list and filter session type', async t => {
const workspaceSessions = await copilotSession.list({
userId: user.id,
workspaceId: workspace.id,
docId: null,
});
t.snapshot(
@@ -575,6 +576,10 @@ test('should handle session queries, ordering, and filtering', async t => {
const docParams = { ...baseParams, docId };
const queryTestCases = [
{ name: 'all_workspace_sessions', params: baseParams },
{
name: 'workspace_sessions_with_messages',
params: { ...baseParams, docId: null, withMessages: true },
},
{
name: 'doc_sessions_with_messages',
params: { ...docParams, withMessages: true },
@@ -609,6 +614,7 @@ test('should handle session queries, ordering, and filtering', async t => {
type: copilotSession.getSessionType(s),
hasMessages: !!s.messages?.length,
messageCount: s.messages?.length || 0,
isAction: s.promptName === TEST_PROMPTS.ACTION,
isFork: !!s.parentSessionId,
})),
};