mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-16 09:36:17 +08:00
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:
+88
-108
@@ -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',
|
||||
},
|
||||
]
|
||||
|
||||
BIN
Binary file not shown.
@@ -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,
|
||||
})),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user