mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-02 09:59:55 +08:00
@@ -29,6 +29,7 @@ test-results
|
|||||||
tools/cli/src/webpack/error-handler.js
|
tools/cli/src/webpack/error-handler.js
|
||||||
packages/backend/native/index.d.ts
|
packages/backend/native/index.d.ts
|
||||||
packages/backend/server/src/__tests__/__snapshots__
|
packages/backend/server/src/__tests__/__snapshots__
|
||||||
|
packages/common/native/fixtures/**
|
||||||
packages/frontend/native/index.d.ts
|
packages/frontend/native/index.d.ts
|
||||||
packages/frontend/native/index.js
|
packages/frontend/native/index.js
|
||||||
packages/frontend/graphql/src/graphql/index.ts
|
packages/frontend/graphql/src/graphql/index.ts
|
||||||
|
|||||||
+1
-1
@@ -19,6 +19,7 @@ chrono = "0.4"
|
|||||||
criterion2 = { version = "2", default-features = false }
|
criterion2 = { version = "2", default-features = false }
|
||||||
dotenvy = "0.15"
|
dotenvy = "0.15"
|
||||||
file-format = { version = "0.26", features = ["reader"] }
|
file-format = { version = "0.26", features = ["reader"] }
|
||||||
|
homedir = "0.3"
|
||||||
mimalloc = "0.1"
|
mimalloc = "0.1"
|
||||||
napi = { version = "3.0.0-alpha.12", features = ["async", "chrono_date", "error_anyhow", "napi9", "serde"] }
|
napi = { version = "3.0.0-alpha.12", features = ["async", "chrono_date", "error_anyhow", "napi9", "serde"] }
|
||||||
napi-build = { version = "2" }
|
napi-build = { version = "2" }
|
||||||
@@ -28,7 +29,6 @@ objc2 = "0.6"
|
|||||||
objc2-foundation = "0.3"
|
objc2-foundation = "0.3"
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
homedir = "0.3"
|
|
||||||
rand = "0.9"
|
rand = "0.9"
|
||||||
rayon = "1.10"
|
rayon = "1.10"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "ai_contexts" (
|
||||||
|
"id" VARCHAR NOT NULL,
|
||||||
|
"session_id" VARCHAR NOT NULL,
|
||||||
|
"config" JSON NOT NULL,
|
||||||
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updated_at" TIMESTAMPTZ(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "ai_contexts_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "ai_contexts" ADD CONSTRAINT "ai_contexts_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "ai_sessions_metadata"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
"nestjs-cls": "^5.0.0",
|
"nestjs-cls": "^5.0.0",
|
||||||
"nodemailer": "^6.9.16",
|
"nodemailer": "^6.9.16",
|
||||||
"on-headers": "^1.0.2",
|
"on-headers": "^1.0.2",
|
||||||
"openai": "^4.76.2",
|
"openai": "^4.83.0",
|
||||||
"piscina": "^5.0.0-alpha.0",
|
"piscina": "^5.0.0-alpha.0",
|
||||||
"prisma": "^5.22.0",
|
"prisma": "^5.22.0",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
|
|||||||
@@ -402,12 +402,26 @@ model AiSession {
|
|||||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||||
prompt AiPrompt @relation(fields: [promptName], references: [name], onDelete: Cascade)
|
prompt AiPrompt @relation(fields: [promptName], references: [name], onDelete: Cascade)
|
||||||
messages AiSessionMessage[]
|
messages AiSessionMessage[]
|
||||||
|
context AiContext[]
|
||||||
|
|
||||||
@@index([userId])
|
@@index([userId])
|
||||||
@@index([userId, workspaceId])
|
@@index([userId, workspaceId])
|
||||||
@@map("ai_sessions_metadata")
|
@@map("ai_sessions_metadata")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model AiContext {
|
||||||
|
id String @id @default(uuid()) @db.VarChar
|
||||||
|
sessionId String @map("session_id") @db.VarChar
|
||||||
|
config Json @db.Json
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
|
||||||
|
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
|
||||||
|
|
||||||
|
session AiSession @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
||||||
|
|
||||||
|
@@map("ai_contexts")
|
||||||
|
}
|
||||||
|
|
||||||
model DataMigration {
|
model DataMigration {
|
||||||
id String @id @default(uuid()) @db.VarChar
|
id String @id @default(uuid()) @db.VarChar
|
||||||
name String @unique @db.VarChar
|
name String @unique @db.VarChar
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Snapshot report for `src/__tests__/copilot.e2e.ts`
|
||||||
|
|
||||||
|
The actual snapshot is saved in `copilot.e2e.ts.snap`.
|
||||||
|
|
||||||
|
Generated by [AVA](https://avajs.dev).
|
||||||
|
|
||||||
|
## should be able to manage context
|
||||||
|
|
||||||
|
> should list context files
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: 'docId1',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
> should list context docs
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
blobId: 'fileId1',
|
||||||
|
chunkSize: 3,
|
||||||
|
name: 'sample.pdf',
|
||||||
|
status: 'finished',
|
||||||
|
},
|
||||||
|
]
|
||||||
Binary file not shown.
@@ -8,6 +8,7 @@ import { ConfigModule } from '../base/config';
|
|||||||
import { AuthService } from '../core/auth';
|
import { AuthService } from '../core/auth';
|
||||||
import { WorkspaceModule } from '../core/workspaces';
|
import { WorkspaceModule } from '../core/workspaces';
|
||||||
import { CopilotModule } from '../plugins/copilot';
|
import { CopilotModule } from '../plugins/copilot';
|
||||||
|
import { CopilotContextService } from '../plugins/copilot/context';
|
||||||
import { prompts, PromptService } from '../plugins/copilot/prompt';
|
import { prompts, PromptService } from '../plugins/copilot/prompt';
|
||||||
import {
|
import {
|
||||||
CopilotProviderService,
|
CopilotProviderService,
|
||||||
@@ -27,15 +28,19 @@ import {
|
|||||||
TestUser,
|
TestUser,
|
||||||
} from './utils';
|
} from './utils';
|
||||||
import {
|
import {
|
||||||
|
addContextDoc,
|
||||||
array2sse,
|
array2sse,
|
||||||
chatWithImages,
|
chatWithImages,
|
||||||
chatWithText,
|
chatWithText,
|
||||||
chatWithTextStream,
|
chatWithTextStream,
|
||||||
chatWithWorkflow,
|
chatWithWorkflow,
|
||||||
|
createCopilotContext,
|
||||||
createCopilotMessage,
|
createCopilotMessage,
|
||||||
createCopilotSession,
|
createCopilotSession,
|
||||||
forkCopilotSession,
|
forkCopilotSession,
|
||||||
getHistories,
|
getHistories,
|
||||||
|
listContext,
|
||||||
|
listContextFiles,
|
||||||
MockCopilotTestProvider,
|
MockCopilotTestProvider,
|
||||||
sse2array,
|
sse2array,
|
||||||
textToEventStream,
|
textToEventStream,
|
||||||
@@ -46,6 +51,7 @@ import {
|
|||||||
const test = ava as TestFn<{
|
const test = ava as TestFn<{
|
||||||
auth: AuthService;
|
auth: AuthService;
|
||||||
app: TestingApp;
|
app: TestingApp;
|
||||||
|
context: CopilotContextService;
|
||||||
prompt: PromptService;
|
prompt: PromptService;
|
||||||
provider: CopilotProviderService;
|
provider: CopilotProviderService;
|
||||||
storage: CopilotStorage;
|
storage: CopilotStorage;
|
||||||
@@ -77,11 +83,13 @@ test.before(async t => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const auth = app.get(AuthService);
|
const auth = app.get(AuthService);
|
||||||
|
const context = app.get(CopilotContextService);
|
||||||
const prompt = app.get(PromptService);
|
const prompt = app.get(PromptService);
|
||||||
const storage = app.get(CopilotStorage);
|
const storage = app.get(CopilotStorage);
|
||||||
|
|
||||||
t.context.app = app;
|
t.context.app = app;
|
||||||
t.context.auth = auth;
|
t.context.auth = auth;
|
||||||
|
t.context.context = context;
|
||||||
t.context.prompt = prompt;
|
t.context.prompt = prompt;
|
||||||
t.context.storage = storage;
|
t.context.storage = storage;
|
||||||
});
|
});
|
||||||
@@ -678,3 +686,46 @@ test('should be able to search image from unsplash', async t => {
|
|||||||
const resp = await unsplashSearch(app);
|
const resp = await unsplashSearch(app);
|
||||||
t.not(resp.status, 404, 'route should be exists');
|
t.not(resp.status, 404, 'route should be exists');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should be able to manage context', async t => {
|
||||||
|
const { app } = t.context;
|
||||||
|
|
||||||
|
const { id: workspaceId } = await createWorkspace(app);
|
||||||
|
const sessionId = await createCopilotSession(
|
||||||
|
app,
|
||||||
|
workspaceId,
|
||||||
|
randomUUID(),
|
||||||
|
promptName
|
||||||
|
);
|
||||||
|
|
||||||
|
{
|
||||||
|
await t.throwsAsync(
|
||||||
|
createCopilotContext(app, workspaceId, randomUUID()),
|
||||||
|
{ instanceOf: Error },
|
||||||
|
'should throw error if create context with invalid session id'
|
||||||
|
);
|
||||||
|
|
||||||
|
const context = createCopilotContext(app, workspaceId, sessionId);
|
||||||
|
await t.notThrowsAsync(context, 'should create context with chat session');
|
||||||
|
|
||||||
|
const list = await listContext(app, workspaceId, sessionId);
|
||||||
|
t.deepEqual(
|
||||||
|
list.map(f => ({ id: f.id })),
|
||||||
|
[{ id: await context }],
|
||||||
|
'should list context'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const contextId = await createCopilotContext(app, workspaceId, sessionId);
|
||||||
|
|
||||||
|
await addContextDoc(app, contextId, 'docId1');
|
||||||
|
|
||||||
|
const { docs } =
|
||||||
|
(await listContextFiles(app, workspaceId, sessionId, contextId)) || {};
|
||||||
|
t.snapshot(
|
||||||
|
docs?.map(({ createdAt: _, ...d }) => d),
|
||||||
|
'should list context files'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { randomUUID } from 'node:crypto';
|
||||||
|
|
||||||
import type { TestFn } from 'ava';
|
import type { TestFn } from 'ava';
|
||||||
import ava from 'ava';
|
import ava from 'ava';
|
||||||
import Sinon from 'sinon';
|
import Sinon from 'sinon';
|
||||||
@@ -6,6 +8,7 @@ import { ConfigModule } from '../base/config';
|
|||||||
import { AuthService } from '../core/auth';
|
import { AuthService } from '../core/auth';
|
||||||
import { QuotaModule } from '../core/quota';
|
import { QuotaModule } from '../core/quota';
|
||||||
import { CopilotModule } from '../plugins/copilot';
|
import { CopilotModule } from '../plugins/copilot';
|
||||||
|
import { CopilotContextService } from '../plugins/copilot/context';
|
||||||
import { prompts, PromptService } from '../plugins/copilot/prompt';
|
import { prompts, PromptService } from '../plugins/copilot/prompt';
|
||||||
import {
|
import {
|
||||||
CopilotProviderService,
|
CopilotProviderService,
|
||||||
@@ -44,6 +47,7 @@ import { MockCopilotTestProvider, WorkflowTestCases } from './utils/copilot';
|
|||||||
const test = ava as TestFn<{
|
const test = ava as TestFn<{
|
||||||
auth: AuthService;
|
auth: AuthService;
|
||||||
module: TestingModule;
|
module: TestingModule;
|
||||||
|
context: CopilotContextService;
|
||||||
prompt: PromptService;
|
prompt: PromptService;
|
||||||
provider: CopilotProviderService;
|
provider: CopilotProviderService;
|
||||||
session: ChatSessionService;
|
session: ChatSessionService;
|
||||||
@@ -81,6 +85,7 @@ test.before(async t => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const auth = module.get(AuthService);
|
const auth = module.get(AuthService);
|
||||||
|
const context = module.get(CopilotContextService);
|
||||||
const prompt = module.get(PromptService);
|
const prompt = module.get(PromptService);
|
||||||
const provider = module.get(CopilotProviderService);
|
const provider = module.get(CopilotProviderService);
|
||||||
const session = module.get(ChatSessionService);
|
const session = module.get(ChatSessionService);
|
||||||
@@ -88,6 +93,7 @@ test.before(async t => {
|
|||||||
|
|
||||||
t.context.module = module;
|
t.context.module = module;
|
||||||
t.context.auth = auth;
|
t.context.auth = auth;
|
||||||
|
t.context.context = context;
|
||||||
t.context.prompt = prompt;
|
t.context.prompt = prompt;
|
||||||
t.context.provider = provider;
|
t.context.provider = provider;
|
||||||
t.context.session = session;
|
t.context.session = session;
|
||||||
@@ -1247,3 +1253,52 @@ test('CitationParser should not replace chunks of citation already with URLs', t
|
|||||||
].join('\n');
|
].join('\n');
|
||||||
t.is(result, expected);
|
t.is(result, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ==================== context ====================
|
||||||
|
test('should be able to manage context', async t => {
|
||||||
|
const { context, prompt, session } = t.context;
|
||||||
|
|
||||||
|
await prompt.set('prompt', 'model', [
|
||||||
|
{ role: 'system', content: 'hello {{word}}' },
|
||||||
|
]);
|
||||||
|
const chatSession = await session.create({
|
||||||
|
docId: 'test',
|
||||||
|
workspaceId: 'test',
|
||||||
|
userId,
|
||||||
|
promptName: 'prompt',
|
||||||
|
});
|
||||||
|
|
||||||
|
{
|
||||||
|
await t.throwsAsync(
|
||||||
|
context.create(randomUUID()),
|
||||||
|
{ instanceOf: Error },
|
||||||
|
'should throw error if create context with invalid session id'
|
||||||
|
);
|
||||||
|
|
||||||
|
const session = context.create(chatSession);
|
||||||
|
await t.notThrowsAsync(session, 'should create context with chat session');
|
||||||
|
|
||||||
|
await t.notThrowsAsync(
|
||||||
|
context.get((await session).id),
|
||||||
|
'should get context after create'
|
||||||
|
);
|
||||||
|
|
||||||
|
await t.throwsAsync(
|
||||||
|
context.get(randomUUID()),
|
||||||
|
{ instanceOf: Error },
|
||||||
|
'should throw error if get context with invalid id'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const session = await context.create(chatSession);
|
||||||
|
|
||||||
|
const docId = randomUUID();
|
||||||
|
await session.addDocRecord(docId);
|
||||||
|
const docs = session.listDocs().map(d => d.id);
|
||||||
|
t.deepEqual(docs, [docId], 'should list doc id');
|
||||||
|
|
||||||
|
await session.removeDocRecord(docId);
|
||||||
|
t.deepEqual(session.listDocs(), [], 'should remove doc id');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import {
|
|||||||
WorkflowNodeType,
|
WorkflowNodeType,
|
||||||
WorkflowParams,
|
WorkflowParams,
|
||||||
} from '../../plugins/copilot/workflow/types';
|
} from '../../plugins/copilot/workflow/types';
|
||||||
|
import { gql } from './common';
|
||||||
import { TestingApp } from './testing-app';
|
import { TestingApp } from './testing-app';
|
||||||
import { sleep } from './utils';
|
import { sleep } from './utils';
|
||||||
|
|
||||||
@@ -209,6 +210,216 @@ export async function forkCopilotSession(
|
|||||||
return res.forkCopilotSession;
|
return res.forkCopilotSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function createCopilotContext(
|
||||||
|
app: TestingApp,
|
||||||
|
workspaceId: string,
|
||||||
|
sessionId: string
|
||||||
|
): Promise<string> {
|
||||||
|
const res = await app.gql(`
|
||||||
|
mutation {
|
||||||
|
createCopilotContext(workspaceId: "${workspaceId}", sessionId: "${sessionId}")
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
return res.createCopilotContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function matchContext(
|
||||||
|
app: TestingApp,
|
||||||
|
contextId: string,
|
||||||
|
content: string,
|
||||||
|
limit: number
|
||||||
|
): Promise<
|
||||||
|
| {
|
||||||
|
fileId: string;
|
||||||
|
chunk: number;
|
||||||
|
content: string;
|
||||||
|
distance: number | null;
|
||||||
|
}[]
|
||||||
|
| undefined
|
||||||
|
> {
|
||||||
|
const res = await app.gql(
|
||||||
|
`
|
||||||
|
mutation matchContext($content: String!, $contextId: String!, $limit: SafeInt) {
|
||||||
|
matchContext(content: $content, contextId: $contextId, limit: $limit) {
|
||||||
|
fileId
|
||||||
|
chunk
|
||||||
|
content
|
||||||
|
distance
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ contextId, content, limit }
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.matchContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function listContext(
|
||||||
|
app: TestingApp,
|
||||||
|
workspaceId: string,
|
||||||
|
sessionId: string
|
||||||
|
): Promise<
|
||||||
|
{
|
||||||
|
id: string;
|
||||||
|
workspaceId: string;
|
||||||
|
}[]
|
||||||
|
> {
|
||||||
|
const res = await app.gql(`
|
||||||
|
query {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: "${workspaceId}") {
|
||||||
|
contexts(sessionId: "${sessionId}") {
|
||||||
|
id
|
||||||
|
workspaceId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
return res.currentUser?.copilot?.contexts;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addContextFile(
|
||||||
|
app: TestingApp,
|
||||||
|
contextId: string,
|
||||||
|
blobId: string,
|
||||||
|
fileName: string,
|
||||||
|
content: Buffer
|
||||||
|
): Promise<{ id: string }[]> {
|
||||||
|
const res = await app
|
||||||
|
.POST(gql)
|
||||||
|
.set({ 'x-request-id': 'test', 'x-operation-name': 'test' })
|
||||||
|
.field(
|
||||||
|
'operations',
|
||||||
|
JSON.stringify({
|
||||||
|
query: `
|
||||||
|
mutation addContextFile($options: AddContextFileInput!, $content: Upload!) {
|
||||||
|
addContextFile(content: $content, options: $options) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
content: null,
|
||||||
|
options: { contextId, blobId, fileName },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.field('map', JSON.stringify({ '0': ['variables.content'] }))
|
||||||
|
.attach('0', content, {
|
||||||
|
filename: fileName,
|
||||||
|
contentType: 'application/octet-stream',
|
||||||
|
})
|
||||||
|
.expect(200);
|
||||||
|
|
||||||
|
return res.body.data.addContextFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function removeContextFile(
|
||||||
|
app: TestingApp,
|
||||||
|
contextId: string,
|
||||||
|
fileId: string
|
||||||
|
): Promise<string> {
|
||||||
|
const res = await app.gql(
|
||||||
|
`
|
||||||
|
mutation removeContextFile($options: RemoveContextFileInput!) {
|
||||||
|
removeContextFile(options: $options)
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ options: { contextId, fileId } }
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.removeContextFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addContextDoc(
|
||||||
|
app: TestingApp,
|
||||||
|
contextId: string,
|
||||||
|
docId: string
|
||||||
|
): Promise<{ id: string }[]> {
|
||||||
|
const res = await app.gql(
|
||||||
|
`
|
||||||
|
mutation addContextDoc($options: AddContextDocInput!) {
|
||||||
|
addContextDoc(options: $options) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ options: { contextId, docId } }
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.addContextDoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function removeContextDoc(
|
||||||
|
app: TestingApp,
|
||||||
|
contextId: string,
|
||||||
|
docId: string
|
||||||
|
): Promise<string> {
|
||||||
|
const res = await app.gql(
|
||||||
|
`
|
||||||
|
mutation removeContextDoc($options: RemoveContextFileInput!) {
|
||||||
|
removeContextDoc(options: $options)
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ options: { contextId, docId } }
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.removeContextDoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function listContextFiles(
|
||||||
|
app: TestingApp,
|
||||||
|
workspaceId: string,
|
||||||
|
sessionId: string,
|
||||||
|
contextId: string
|
||||||
|
): Promise<
|
||||||
|
| {
|
||||||
|
docs: {
|
||||||
|
id: string;
|
||||||
|
createdAt: number;
|
||||||
|
}[];
|
||||||
|
files: {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
blobId: string;
|
||||||
|
chunkSize: number;
|
||||||
|
status: string;
|
||||||
|
createdAt: number;
|
||||||
|
}[];
|
||||||
|
}
|
||||||
|
| undefined
|
||||||
|
> {
|
||||||
|
const res = await app.gql(`
|
||||||
|
query {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: "${workspaceId}") {
|
||||||
|
contexts(sessionId: "${sessionId}", contextId: "${contextId}") {
|
||||||
|
docs {
|
||||||
|
id
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
files {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
blobId
|
||||||
|
chunkSize
|
||||||
|
status
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
const { docs, files } = res.currentUser?.copilot?.contexts?.[0] || {};
|
||||||
|
|
||||||
|
return { docs, files };
|
||||||
|
}
|
||||||
|
|
||||||
export async function createCopilotMessage(
|
export async function createCopilotMessage(
|
||||||
app: TestingApp,
|
app: TestingApp,
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { STATUS_CODES } from 'node:http';
|
import { STATUS_CODES } from 'node:http';
|
||||||
|
import { escape } from 'node:querystring';
|
||||||
|
|
||||||
import { HttpStatus, Logger } from '@nestjs/common';
|
import { HttpStatus, Logger } from '@nestjs/common';
|
||||||
import { ClsServiceManager } from 'nestjs-cls';
|
import { ClsServiceManager } from 'nestjs-cls';
|
||||||
@@ -605,6 +606,29 @@ export const USER_FRIENDLY_ERRORS = {
|
|||||||
message: ({ provider, kind, message }) =>
|
message: ({ provider, kind, message }) =>
|
||||||
`Provider ${provider} failed with ${kind} error: ${message || 'unknown'}`,
|
`Provider ${provider} failed with ${kind} error: ${message || 'unknown'}`,
|
||||||
},
|
},
|
||||||
|
copilot_invalid_context: {
|
||||||
|
type: 'invalid_input',
|
||||||
|
args: { contextId: 'string' },
|
||||||
|
message: ({ contextId }) => `Invalid copilot context ${contextId}.`,
|
||||||
|
},
|
||||||
|
copilot_context_file_not_supported: {
|
||||||
|
type: 'bad_request',
|
||||||
|
args: { fileName: 'string', message: 'string' },
|
||||||
|
message: ({ fileName, message }) =>
|
||||||
|
`File ${fileName} is not supported to use as context: ${message}`,
|
||||||
|
},
|
||||||
|
copilot_failed_to_modify_context: {
|
||||||
|
type: 'internal_server_error',
|
||||||
|
args: { contextId: 'string', message: 'string' },
|
||||||
|
message: ({ contextId, message }) =>
|
||||||
|
`Failed to modify context ${contextId}: ${message}`,
|
||||||
|
},
|
||||||
|
copilot_failed_to_match_context: {
|
||||||
|
type: 'internal_server_error',
|
||||||
|
args: { contextId: 'string', content: 'string', message: 'string' },
|
||||||
|
message: ({ contextId, content, message }) =>
|
||||||
|
`Failed to match context ${contextId} with "${escape(content)}": ${message}`,
|
||||||
|
},
|
||||||
|
|
||||||
// Quota & Limit errors
|
// Quota & Limit errors
|
||||||
blob_quota_exceeded: {
|
blob_quota_exceeded: {
|
||||||
|
|||||||
@@ -608,6 +608,50 @@ export class CopilotProviderSideError extends UserFriendlyError {
|
|||||||
super('internal_server_error', 'copilot_provider_side_error', message, args);
|
super('internal_server_error', 'copilot_provider_side_error', message, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotInvalidContextDataType {
|
||||||
|
@Field() contextId!: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CopilotInvalidContext extends UserFriendlyError {
|
||||||
|
constructor(args: CopilotInvalidContextDataType, message?: string | ((args: CopilotInvalidContextDataType) => string)) {
|
||||||
|
super('invalid_input', 'copilot_invalid_context', message, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotContextFileNotSupportedDataType {
|
||||||
|
@Field() fileName!: string
|
||||||
|
@Field() message!: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CopilotContextFileNotSupported extends UserFriendlyError {
|
||||||
|
constructor(args: CopilotContextFileNotSupportedDataType, message?: string | ((args: CopilotContextFileNotSupportedDataType) => string)) {
|
||||||
|
super('bad_request', 'copilot_context_file_not_supported', message, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotFailedToModifyContextDataType {
|
||||||
|
@Field() contextId!: string
|
||||||
|
@Field() message!: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CopilotFailedToModifyContext extends UserFriendlyError {
|
||||||
|
constructor(args: CopilotFailedToModifyContextDataType, message?: string | ((args: CopilotFailedToModifyContextDataType) => string)) {
|
||||||
|
super('internal_server_error', 'copilot_failed_to_modify_context', message, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotFailedToMatchContextDataType {
|
||||||
|
@Field() contextId!: string
|
||||||
|
@Field() content!: string
|
||||||
|
@Field() message!: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CopilotFailedToMatchContext extends UserFriendlyError {
|
||||||
|
constructor(args: CopilotFailedToMatchContextDataType, message?: string | ((args: CopilotFailedToMatchContextDataType) => string)) {
|
||||||
|
super('internal_server_error', 'copilot_failed_to_match_context', message, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class BlobQuotaExceeded extends UserFriendlyError {
|
export class BlobQuotaExceeded extends UserFriendlyError {
|
||||||
constructor(message?: string) {
|
constructor(message?: string) {
|
||||||
@@ -801,6 +845,10 @@ export enum ErrorNames {
|
|||||||
COPILOT_PROMPT_NOT_FOUND,
|
COPILOT_PROMPT_NOT_FOUND,
|
||||||
COPILOT_PROMPT_INVALID,
|
COPILOT_PROMPT_INVALID,
|
||||||
COPILOT_PROVIDER_SIDE_ERROR,
|
COPILOT_PROVIDER_SIDE_ERROR,
|
||||||
|
COPILOT_INVALID_CONTEXT,
|
||||||
|
COPILOT_CONTEXT_FILE_NOT_SUPPORTED,
|
||||||
|
COPILOT_FAILED_TO_MODIFY_CONTEXT,
|
||||||
|
COPILOT_FAILED_TO_MATCH_CONTEXT,
|
||||||
BLOB_QUOTA_EXCEEDED,
|
BLOB_QUOTA_EXCEEDED,
|
||||||
MEMBER_QUOTA_EXCEEDED,
|
MEMBER_QUOTA_EXCEEDED,
|
||||||
COPILOT_QUOTA_EXCEEDED,
|
COPILOT_QUOTA_EXCEEDED,
|
||||||
@@ -825,5 +873,5 @@ registerEnumType(ErrorNames, {
|
|||||||
export const ErrorDataUnionType = createUnionType({
|
export const ErrorDataUnionType = createUnionType({
|
||||||
name: 'ErrorDataUnion',
|
name: 'ErrorDataUnion',
|
||||||
types: () =>
|
types: () =>
|
||||||
[QueryTooLongDataType, WrongSignInCredentialsDataType, UnknownOauthProviderDataType, MissingOauthQueryParameterDataType, InvalidEmailDataType, InvalidPasswordLengthDataType, WorkspacePermissionNotFoundDataType, SpaceNotFoundDataType, MemberNotFoundInSpaceDataType, NotInSpaceDataType, AlreadyInSpaceDataType, SpaceAccessDeniedDataType, SpaceOwnerNotFoundDataType, SpaceShouldHaveOnlyOneOwnerDataType, DocNotFoundDataType, DocAccessDeniedDataType, VersionRejectedDataType, InvalidHistoryTimestampDataType, DocHistoryNotFoundDataType, BlobNotFoundDataType, ExpectToGrantDocUserRolesDataType, ExpectToRevokeDocUserRolesDataType, ExpectToUpdateDocUserRoleDataType, UnsupportedSubscriptionPlanDataType, SubscriptionAlreadyExistsDataType, SubscriptionNotExistsDataType, SameSubscriptionRecurringDataType, SubscriptionPlanNotFoundDataType, CopilotMessageNotFoundDataType, CopilotPromptNotFoundDataType, CopilotProviderSideErrorDataType, RuntimeConfigNotFoundDataType, InvalidRuntimeConfigTypeDataType, InvalidLicenseUpdateParamsDataType, WorkspaceMembersExceedLimitToDowngradeDataType] as const,
|
[QueryTooLongDataType, WrongSignInCredentialsDataType, UnknownOauthProviderDataType, MissingOauthQueryParameterDataType, InvalidEmailDataType, InvalidPasswordLengthDataType, WorkspacePermissionNotFoundDataType, SpaceNotFoundDataType, MemberNotFoundInSpaceDataType, NotInSpaceDataType, AlreadyInSpaceDataType, SpaceAccessDeniedDataType, SpaceOwnerNotFoundDataType, SpaceShouldHaveOnlyOneOwnerDataType, DocNotFoundDataType, DocAccessDeniedDataType, VersionRejectedDataType, InvalidHistoryTimestampDataType, DocHistoryNotFoundDataType, BlobNotFoundDataType, ExpectToGrantDocUserRolesDataType, ExpectToRevokeDocUserRolesDataType, ExpectToUpdateDocUserRoleDataType, UnsupportedSubscriptionPlanDataType, SubscriptionAlreadyExistsDataType, SubscriptionNotExistsDataType, SameSubscriptionRecurringDataType, SubscriptionPlanNotFoundDataType, CopilotMessageNotFoundDataType, CopilotPromptNotFoundDataType, CopilotProviderSideErrorDataType, CopilotInvalidContextDataType, CopilotContextFileNotSupportedDataType, CopilotFailedToModifyContextDataType, CopilotFailedToMatchContextDataType, RuntimeConfigNotFoundDataType, InvalidRuntimeConfigTypeDataType, InvalidLicenseUpdateParamsDataType, WorkspaceMembersExceedLimitToDowngradeDataType] as const,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export { CopilotContextResolver, CopilotContextRootResolver } from './resolver';
|
||||||
|
export { CopilotContextService } from './service';
|
||||||
|
export { type ContextFile, ContextFileStatus } from './types';
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
import {
|
||||||
|
Args,
|
||||||
|
Field,
|
||||||
|
ID,
|
||||||
|
InputType,
|
||||||
|
Mutation,
|
||||||
|
ObjectType,
|
||||||
|
Parent,
|
||||||
|
registerEnumType,
|
||||||
|
ResolveField,
|
||||||
|
Resolver,
|
||||||
|
} from '@nestjs/graphql';
|
||||||
|
import { SafeIntResolver } from 'graphql-scalars';
|
||||||
|
|
||||||
|
import {
|
||||||
|
CallMetric,
|
||||||
|
CopilotFailedToModifyContext,
|
||||||
|
CopilotSessionNotFound,
|
||||||
|
RequestMutex,
|
||||||
|
Throttle,
|
||||||
|
TooManyRequest,
|
||||||
|
} from '../../../base';
|
||||||
|
import { CurrentUser } from '../../../core/auth';
|
||||||
|
import { COPILOT_LOCKER, CopilotType } from '../resolver';
|
||||||
|
import { ChatSessionService } from '../session';
|
||||||
|
import { CopilotContextService } from './service';
|
||||||
|
import { ContextDoc, type ContextFile, ContextFileStatus } from './types';
|
||||||
|
|
||||||
|
@InputType()
|
||||||
|
class AddContextDocInput {
|
||||||
|
@Field(() => String)
|
||||||
|
contextId!: string;
|
||||||
|
|
||||||
|
@Field(() => String)
|
||||||
|
docId!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@InputType()
|
||||||
|
class RemoveContextFileInput {
|
||||||
|
@Field(() => String)
|
||||||
|
contextId!: string;
|
||||||
|
|
||||||
|
@Field(() => String)
|
||||||
|
fileId!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ObjectType('CopilotContext')
|
||||||
|
export class CopilotContextType {
|
||||||
|
@Field(() => ID)
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@Field(() => String)
|
||||||
|
workspaceId!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerEnumType(ContextFileStatus, { name: 'ContextFileStatus' });
|
||||||
|
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotContextDoc implements ContextDoc {
|
||||||
|
@Field(() => ID)
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@Field(() => SafeIntResolver)
|
||||||
|
createdAt!: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotContextFile implements ContextFile {
|
||||||
|
@Field(() => ID)
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@Field(() => String)
|
||||||
|
name!: string;
|
||||||
|
|
||||||
|
@Field(() => SafeIntResolver)
|
||||||
|
chunkSize!: number;
|
||||||
|
|
||||||
|
@Field(() => ContextFileStatus)
|
||||||
|
status!: ContextFileStatus;
|
||||||
|
|
||||||
|
@Field(() => String)
|
||||||
|
blobId!: string;
|
||||||
|
|
||||||
|
@Field(() => SafeIntResolver)
|
||||||
|
createdAt!: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ObjectType()
|
||||||
|
class CopilotContextListItem {
|
||||||
|
@Field(() => ID)
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@Field(() => SafeIntResolver)
|
||||||
|
createdAt!: number;
|
||||||
|
|
||||||
|
@Field(() => String, { nullable: true })
|
||||||
|
name!: string;
|
||||||
|
|
||||||
|
@Field(() => SafeIntResolver, { nullable: true })
|
||||||
|
chunkSize!: number;
|
||||||
|
|
||||||
|
@Field(() => ContextFileStatus, { nullable: true })
|
||||||
|
status!: ContextFileStatus;
|
||||||
|
|
||||||
|
@Field(() => String, { nullable: true })
|
||||||
|
blobId!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throttle()
|
||||||
|
@Resolver(() => CopilotType)
|
||||||
|
export class CopilotContextRootResolver {
|
||||||
|
constructor(
|
||||||
|
private readonly mutex: RequestMutex,
|
||||||
|
private readonly chatSession: ChatSessionService,
|
||||||
|
private readonly context: CopilotContextService
|
||||||
|
) {}
|
||||||
|
|
||||||
|
private async checkChatSession(
|
||||||
|
user: CurrentUser,
|
||||||
|
sessionId: string,
|
||||||
|
workspaceId?: string
|
||||||
|
): Promise<void> {
|
||||||
|
const session = await this.chatSession.get(sessionId);
|
||||||
|
if (
|
||||||
|
!session ||
|
||||||
|
session.config.workspaceId !== workspaceId ||
|
||||||
|
session.config.userId !== user.id
|
||||||
|
) {
|
||||||
|
throw new CopilotSessionNotFound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResolveField(() => [CopilotContextType], {
|
||||||
|
description: 'Get the context list of a session',
|
||||||
|
complexity: 2,
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_create')
|
||||||
|
async contexts(
|
||||||
|
@Parent() copilot: CopilotType,
|
||||||
|
@CurrentUser() user: CurrentUser,
|
||||||
|
@Args('sessionId') sessionId: string,
|
||||||
|
@Args('contextId', { nullable: true }) contextId?: string
|
||||||
|
) {
|
||||||
|
const lockFlag = `${COPILOT_LOCKER}:context:${sessionId}`;
|
||||||
|
await using lock = await this.mutex.acquire(lockFlag);
|
||||||
|
if (!lock) {
|
||||||
|
return new TooManyRequest('Server is busy');
|
||||||
|
}
|
||||||
|
await this.checkChatSession(user, sessionId, copilot.workspaceId);
|
||||||
|
|
||||||
|
if (contextId) {
|
||||||
|
const context = await this.context.get(contextId);
|
||||||
|
if (context) return [context];
|
||||||
|
} else {
|
||||||
|
const context = await this.context.getBySessionId(sessionId);
|
||||||
|
if (context) return [context];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation(() => String, {
|
||||||
|
description: 'Create a context session',
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_create')
|
||||||
|
async createCopilotContext(
|
||||||
|
@CurrentUser() user: CurrentUser,
|
||||||
|
@Args('workspaceId') workspaceId: string,
|
||||||
|
@Args('sessionId') sessionId: string
|
||||||
|
) {
|
||||||
|
const lockFlag = `${COPILOT_LOCKER}:context:${sessionId}`;
|
||||||
|
await using lock = await this.mutex.acquire(lockFlag);
|
||||||
|
if (!lock) {
|
||||||
|
return new TooManyRequest('Server is busy');
|
||||||
|
}
|
||||||
|
await this.checkChatSession(user, sessionId, workspaceId);
|
||||||
|
|
||||||
|
const context = await this.context.create(sessionId);
|
||||||
|
return context.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throttle()
|
||||||
|
@Resolver(() => CopilotContextType)
|
||||||
|
export class CopilotContextResolver {
|
||||||
|
constructor(
|
||||||
|
private readonly mutex: RequestMutex,
|
||||||
|
|
||||||
|
private readonly context: CopilotContextService
|
||||||
|
) {}
|
||||||
|
|
||||||
|
@ResolveField(() => [CopilotContextDoc], {
|
||||||
|
description: 'list files in context',
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_file_list')
|
||||||
|
async docs(@Parent() context: CopilotContextType): Promise<ContextDoc[]> {
|
||||||
|
const session = await this.context.get(context.id);
|
||||||
|
return session.listDocs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation(() => [CopilotContextListItem], {
|
||||||
|
description: 'add a doc to context',
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_doc_add')
|
||||||
|
async addContextDoc(
|
||||||
|
@Args({ name: 'options', type: () => AddContextDocInput })
|
||||||
|
options: AddContextDocInput
|
||||||
|
) {
|
||||||
|
const lockFlag = `${COPILOT_LOCKER}:context:${options.contextId}`;
|
||||||
|
await using lock = await this.mutex.acquire(lockFlag);
|
||||||
|
if (!lock) {
|
||||||
|
return new TooManyRequest('Server is busy');
|
||||||
|
}
|
||||||
|
const session = await this.context.get(options.contextId);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return await session.addDocRecord(options.docId);
|
||||||
|
} catch (e: any) {
|
||||||
|
throw new CopilotFailedToModifyContext({
|
||||||
|
contextId: options.contextId,
|
||||||
|
message: e.message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation(() => Boolean, {
|
||||||
|
description: 'remove a doc from context',
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_doc_remove')
|
||||||
|
async removeContextDoc(
|
||||||
|
@Args({ name: 'options', type: () => RemoveContextFileInput })
|
||||||
|
options: RemoveContextFileInput
|
||||||
|
) {
|
||||||
|
const lockFlag = `${COPILOT_LOCKER}:context:${options.contextId}`;
|
||||||
|
await using lock = await this.mutex.acquire(lockFlag);
|
||||||
|
if (!lock) {
|
||||||
|
return new TooManyRequest('Server is busy');
|
||||||
|
}
|
||||||
|
const session = await this.context.get(options.contextId);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return await session.removeDocRecord(options.fileId);
|
||||||
|
} catch (e: any) {
|
||||||
|
throw new CopilotFailedToModifyContext({
|
||||||
|
contextId: options.contextId,
|
||||||
|
message: e.message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResolveField(() => [CopilotContextFile], {
|
||||||
|
description: 'list files in context',
|
||||||
|
})
|
||||||
|
@CallMetric('ai', 'context_file_list')
|
||||||
|
async files(
|
||||||
|
@Parent() context: CopilotContextType
|
||||||
|
): Promise<CopilotContextFile[]> {
|
||||||
|
const session = await this.context.get(context.id);
|
||||||
|
return session.listFiles();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { PrismaClient } from '@prisma/client';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Cache,
|
||||||
|
CopilotInvalidContext,
|
||||||
|
CopilotSessionNotFound,
|
||||||
|
} from '../../../base';
|
||||||
|
import { ContextSession } from './session';
|
||||||
|
import { ContextConfig, ContextConfigSchema } from './types';
|
||||||
|
|
||||||
|
const CONTEXT_SESSION_KEY = 'context-session';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class CopilotContextService {
|
||||||
|
constructor(
|
||||||
|
private readonly cache: Cache,
|
||||||
|
private readonly db: PrismaClient
|
||||||
|
) {}
|
||||||
|
|
||||||
|
private async saveConfig(
|
||||||
|
contextId: string,
|
||||||
|
config: ContextConfig,
|
||||||
|
refreshCache = false
|
||||||
|
): Promise<void> {
|
||||||
|
if (!refreshCache) {
|
||||||
|
await this.db.aiContext.update({
|
||||||
|
where: { id: contextId },
|
||||||
|
data: { config },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
await this.cache.set(`${CONTEXT_SESSION_KEY}:${contextId}`, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getCachedSession(
|
||||||
|
contextId: string
|
||||||
|
): Promise<ContextSession | undefined> {
|
||||||
|
const cachedSession = await this.cache.get(
|
||||||
|
`${CONTEXT_SESSION_KEY}:${contextId}`
|
||||||
|
);
|
||||||
|
if (cachedSession) {
|
||||||
|
const config = ContextConfigSchema.safeParse(cachedSession);
|
||||||
|
if (config.success) {
|
||||||
|
return new ContextSession(
|
||||||
|
contextId,
|
||||||
|
config.data,
|
||||||
|
this.saveConfig.bind(this, contextId)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: we only cache config to avoid frequent database queries
|
||||||
|
// but we do not need to cache session instances because a distributed
|
||||||
|
// lock is already apply to mutation operation for the same context in
|
||||||
|
// the resolver, so there will be no simultaneous writing to the config
|
||||||
|
private async cacheSession(
|
||||||
|
contextId: string,
|
||||||
|
config: ContextConfig
|
||||||
|
): Promise<ContextSession> {
|
||||||
|
const dispatcher = this.saveConfig.bind(this, contextId);
|
||||||
|
await dispatcher(config, true);
|
||||||
|
return new ContextSession(contextId, config, dispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
async create(sessionId: string): Promise<ContextSession> {
|
||||||
|
const session = await this.db.aiSession.findFirst({
|
||||||
|
where: { id: sessionId },
|
||||||
|
select: { workspaceId: true },
|
||||||
|
});
|
||||||
|
if (!session) {
|
||||||
|
throw new CopilotSessionNotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep the context unique per session
|
||||||
|
const existsContext = await this.getBySessionId(sessionId);
|
||||||
|
if (existsContext) return existsContext;
|
||||||
|
|
||||||
|
const context = await this.db.aiContext.create({
|
||||||
|
data: {
|
||||||
|
sessionId,
|
||||||
|
config: { workspaceId: session.workspaceId, docs: [], files: [] },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const config = ContextConfigSchema.parse(context.config);
|
||||||
|
return await this.cacheSession(context.id, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
async get(id: string): Promise<ContextSession> {
|
||||||
|
const context = await this.getCachedSession(id);
|
||||||
|
if (context) return context;
|
||||||
|
const ret = await this.db.aiContext.findUnique({
|
||||||
|
where: { id },
|
||||||
|
select: { config: true },
|
||||||
|
});
|
||||||
|
if (ret) {
|
||||||
|
const config = ContextConfigSchema.safeParse(ret.config);
|
||||||
|
if (config.success) return this.cacheSession(id, config.data);
|
||||||
|
}
|
||||||
|
throw new CopilotInvalidContext({ contextId: id });
|
||||||
|
}
|
||||||
|
|
||||||
|
async getBySessionId(sessionId: string): Promise<ContextSession | null> {
|
||||||
|
const existsContext = await this.db.aiContext.findFirst({
|
||||||
|
where: { sessionId },
|
||||||
|
select: { id: true },
|
||||||
|
});
|
||||||
|
if (existsContext) return this.get(existsContext.id);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import { ContextConfig, ContextDoc, ContextList } from './types';
|
||||||
|
|
||||||
|
export class ContextSession implements AsyncDisposable {
|
||||||
|
constructor(
|
||||||
|
private readonly contextId: string,
|
||||||
|
private readonly config: ContextConfig,
|
||||||
|
private readonly dispatcher?: (config: ContextConfig) => Promise<void>
|
||||||
|
) {}
|
||||||
|
|
||||||
|
get id() {
|
||||||
|
return this.contextId;
|
||||||
|
}
|
||||||
|
|
||||||
|
get workspaceId() {
|
||||||
|
return this.config.workspaceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
listDocs(): ContextDoc[] {
|
||||||
|
return [...this.config.docs];
|
||||||
|
}
|
||||||
|
|
||||||
|
listFiles() {
|
||||||
|
return this.config.files.map(f => ({ ...f }));
|
||||||
|
}
|
||||||
|
|
||||||
|
get sortedList(): ContextList {
|
||||||
|
const { docs, files } = this.config;
|
||||||
|
return [...docs, ...files].toSorted(
|
||||||
|
(a, b) => a.createdAt - b.createdAt
|
||||||
|
) as ContextList;
|
||||||
|
}
|
||||||
|
|
||||||
|
async addDocRecord(docId: string): Promise<ContextList> {
|
||||||
|
if (!this.config.docs.some(f => f.id === docId)) {
|
||||||
|
this.config.docs.push({ id: docId, createdAt: Date.now() });
|
||||||
|
await this.save();
|
||||||
|
}
|
||||||
|
return this.sortedList;
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeDocRecord(docId: string): Promise<boolean> {
|
||||||
|
const index = this.config.docs.findIndex(f => f.id === docId);
|
||||||
|
if (index >= 0) {
|
||||||
|
this.config.docs.splice(index, 1);
|
||||||
|
await this.save();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async save() {
|
||||||
|
await this.dispatcher?.(this.config);
|
||||||
|
}
|
||||||
|
|
||||||
|
async [Symbol.asyncDispose]() {
|
||||||
|
await this.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Events {
|
||||||
|
'workspace.doc.embedding': {
|
||||||
|
workspaceId: string;
|
||||||
|
docId: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ContextFileStatus {
|
||||||
|
processing = 'processing',
|
||||||
|
finished = 'finished',
|
||||||
|
failed = 'failed',
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ContextConfigSchema = z.object({
|
||||||
|
workspaceId: z.string(),
|
||||||
|
files: z
|
||||||
|
.object({
|
||||||
|
id: z.string(),
|
||||||
|
chunkSize: z.number(),
|
||||||
|
name: z.string(),
|
||||||
|
status: z.enum([
|
||||||
|
ContextFileStatus.processing,
|
||||||
|
ContextFileStatus.finished,
|
||||||
|
ContextFileStatus.failed,
|
||||||
|
]),
|
||||||
|
blobId: z.string(),
|
||||||
|
createdAt: z.number(),
|
||||||
|
})
|
||||||
|
.array(),
|
||||||
|
docs: z
|
||||||
|
.object({
|
||||||
|
id: z.string(),
|
||||||
|
createdAt: z.number(),
|
||||||
|
})
|
||||||
|
.array(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type ContextConfig = z.infer<typeof ContextConfigSchema>;
|
||||||
|
export type ContextDoc = z.infer<typeof ContextConfigSchema>['docs'][number];
|
||||||
|
export type ContextFile = z.infer<typeof ContextConfigSchema>['files'][number];
|
||||||
|
export type ContextListItem = ContextDoc | ContextFile;
|
||||||
|
export type ContextList = ContextListItem[];
|
||||||
|
|
||||||
|
export type ChunkSimilarity = {
|
||||||
|
chunk: number;
|
||||||
|
content: string;
|
||||||
|
distance: number | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type FileChunkSimilarity = ChunkSimilarity & {
|
||||||
|
fileId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type DocChunkSimilarity = ChunkSimilarity & {
|
||||||
|
docId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Embedding = {
|
||||||
|
/**
|
||||||
|
* The index of the embedding in the list of embeddings.
|
||||||
|
*/
|
||||||
|
index: number;
|
||||||
|
content: string;
|
||||||
|
embedding: Array<number>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export class GqlSignal implements AsyncDisposable {
|
||||||
|
readonly abortController = new AbortController();
|
||||||
|
|
||||||
|
get signal() {
|
||||||
|
return this.abortController.signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
async [Symbol.asyncDispose]() {
|
||||||
|
this.abortController.abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,11 @@ import { FeatureModule } from '../../core/features';
|
|||||||
import { PermissionModule } from '../../core/permission';
|
import { PermissionModule } from '../../core/permission';
|
||||||
import { QuotaModule } from '../../core/quota';
|
import { QuotaModule } from '../../core/quota';
|
||||||
import { Plugin } from '../registry';
|
import { Plugin } from '../registry';
|
||||||
|
import {
|
||||||
|
CopilotContextResolver,
|
||||||
|
CopilotContextRootResolver,
|
||||||
|
CopilotContextService,
|
||||||
|
} from './context';
|
||||||
import { CopilotController } from './controller';
|
import { CopilotController } from './controller';
|
||||||
import { ChatMessageCache } from './message';
|
import { ChatMessageCache } from './message';
|
||||||
import { PromptService } from './prompt';
|
import { PromptService } from './prompt';
|
||||||
@@ -41,8 +46,13 @@ registerCopilotProvider(PerplexityProvider);
|
|||||||
CopilotProviderService,
|
CopilotProviderService,
|
||||||
CopilotStorage,
|
CopilotStorage,
|
||||||
PromptsManagementResolver,
|
PromptsManagementResolver,
|
||||||
|
// workflow
|
||||||
CopilotWorkflowService,
|
CopilotWorkflowService,
|
||||||
...CopilotWorkflowExecutors,
|
...CopilotWorkflowExecutors,
|
||||||
|
// context
|
||||||
|
CopilotContextRootResolver,
|
||||||
|
CopilotContextResolver,
|
||||||
|
CopilotContextService,
|
||||||
],
|
],
|
||||||
controllers: [CopilotController],
|
controllers: [CopilotController],
|
||||||
contributesTo: ServerFeature.Copilot,
|
contributesTo: ServerFeature.Copilot,
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export class OpenAIProvider
|
|||||||
|
|
||||||
private readonly logger = new Logger(OpenAIProvider.type);
|
private readonly logger = new Logger(OpenAIProvider.type);
|
||||||
private readonly instance: OpenAI;
|
private readonly instance: OpenAI;
|
||||||
|
|
||||||
private existsModels: string[] | undefined;
|
private existsModels: string[] | undefined;
|
||||||
|
|
||||||
constructor(config: ClientOptions) {
|
constructor(config: ClientOptions) {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import {
|
|||||||
CallMetric,
|
CallMetric,
|
||||||
CopilotFailedToCreateMessage,
|
CopilotFailedToCreateMessage,
|
||||||
CopilotSessionNotFound,
|
CopilotSessionNotFound,
|
||||||
FileUpload,
|
type FileUpload,
|
||||||
RequestMutex,
|
RequestMutex,
|
||||||
Throttle,
|
Throttle,
|
||||||
TooManyRequest,
|
TooManyRequest,
|
||||||
|
|||||||
@@ -198,6 +198,13 @@ const CopilotImageOptionsSchema = CopilotProviderOptionsSchema.merge(
|
|||||||
|
|
||||||
export type CopilotImageOptions = z.infer<typeof CopilotImageOptionsSchema>;
|
export type CopilotImageOptions = z.infer<typeof CopilotImageOptionsSchema>;
|
||||||
|
|
||||||
|
export type CopilotContextFile = {
|
||||||
|
id: string; // fileId
|
||||||
|
created_at: number;
|
||||||
|
// embedding status
|
||||||
|
status: 'in_progress' | 'completed' | 'failed';
|
||||||
|
};
|
||||||
|
|
||||||
export interface CopilotProvider {
|
export interface CopilotProvider {
|
||||||
readonly type: CopilotProviderType;
|
readonly type: CopilotProviderType;
|
||||||
getCapabilities(): CopilotCapability[];
|
getCapabilities(): CopilotCapability[];
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
|
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
|
||||||
# ------------------------------------------------------
|
# ------------------------------------------------------
|
||||||
|
|
||||||
|
input AddContextDocInput {
|
||||||
|
contextId: String!
|
||||||
|
docId: String!
|
||||||
|
}
|
||||||
|
|
||||||
type AlreadyInSpaceDataType {
|
type AlreadyInSpaceDataType {
|
||||||
spaceId: String!
|
spaceId: String!
|
||||||
}
|
}
|
||||||
@@ -25,12 +30,21 @@ type ChatMessage {
|
|||||||
role: String!
|
role: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ContextFileStatus {
|
||||||
|
failed
|
||||||
|
finished
|
||||||
|
processing
|
||||||
|
}
|
||||||
|
|
||||||
type Copilot {
|
type Copilot {
|
||||||
"""Get the session list of actions in the workspace"""
|
"""Get the session list of actions in the workspace"""
|
||||||
actions: [String!]!
|
actions: [String!]!
|
||||||
|
|
||||||
"""Get the session list of chats in the workspace"""
|
"""Get the session list of chats in the workspace"""
|
||||||
chats: [String!]!
|
chats: [String!]!
|
||||||
|
|
||||||
|
"""Get the context list of a session"""
|
||||||
|
contexts(contextId: String, sessionId: String!): [CopilotContext!]!
|
||||||
histories(docId: String, options: QueryChatHistoriesInput): [CopilotHistories!]!
|
histories(docId: String, options: QueryChatHistoriesInput): [CopilotHistories!]!
|
||||||
|
|
||||||
"""Get the quota of the user in the workspace"""
|
"""Get the quota of the user in the workspace"""
|
||||||
@@ -38,6 +52,55 @@ type Copilot {
|
|||||||
workspaceId: ID
|
workspaceId: ID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CopilotContext {
|
||||||
|
"""list files in context"""
|
||||||
|
docs: [CopilotContextDoc!]!
|
||||||
|
|
||||||
|
"""list files in context"""
|
||||||
|
files: [CopilotContextFile!]!
|
||||||
|
id: ID!
|
||||||
|
workspaceId: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotContextDoc {
|
||||||
|
createdAt: SafeInt!
|
||||||
|
id: ID!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotContextFile {
|
||||||
|
blobId: String!
|
||||||
|
chunkSize: SafeInt!
|
||||||
|
createdAt: SafeInt!
|
||||||
|
id: ID!
|
||||||
|
name: String!
|
||||||
|
status: ContextFileStatus!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotContextFileNotSupportedDataType {
|
||||||
|
fileName: String!
|
||||||
|
message: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotContextListItem {
|
||||||
|
blobId: String
|
||||||
|
chunkSize: SafeInt
|
||||||
|
createdAt: SafeInt!
|
||||||
|
id: ID!
|
||||||
|
name: String
|
||||||
|
status: ContextFileStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotFailedToMatchContextDataType {
|
||||||
|
content: String!
|
||||||
|
contextId: String!
|
||||||
|
message: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopilotFailedToModifyContextDataType {
|
||||||
|
contextId: String!
|
||||||
|
message: String!
|
||||||
|
}
|
||||||
|
|
||||||
type CopilotHistories {
|
type CopilotHistories {
|
||||||
"""An mark identifying which view to use to display the session"""
|
"""An mark identifying which view to use to display the session"""
|
||||||
action: String
|
action: String
|
||||||
@@ -49,6 +112,10 @@ type CopilotHistories {
|
|||||||
tokens: Int!
|
tokens: Int!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CopilotInvalidContextDataType {
|
||||||
|
contextId: String!
|
||||||
|
}
|
||||||
|
|
||||||
type CopilotMessageNotFoundDataType {
|
type CopilotMessageNotFoundDataType {
|
||||||
messageId: String!
|
messageId: String!
|
||||||
}
|
}
|
||||||
@@ -244,7 +311,7 @@ type EditorType {
|
|||||||
name: String!
|
name: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
union ErrorDataUnion = AlreadyInSpaceDataType | BlobNotFoundDataType | CopilotMessageNotFoundDataType | CopilotPromptNotFoundDataType | CopilotProviderSideErrorDataType | DocAccessDeniedDataType | DocHistoryNotFoundDataType | DocNotFoundDataType | ExpectToGrantDocUserRolesDataType | ExpectToRevokeDocUserRolesDataType | ExpectToUpdateDocUserRoleDataType | InvalidEmailDataType | InvalidHistoryTimestampDataType | InvalidLicenseUpdateParamsDataType | InvalidPasswordLengthDataType | InvalidRuntimeConfigTypeDataType | MemberNotFoundInSpaceDataType | MissingOauthQueryParameterDataType | NotInSpaceDataType | QueryTooLongDataType | RuntimeConfigNotFoundDataType | SameSubscriptionRecurringDataType | SpaceAccessDeniedDataType | SpaceNotFoundDataType | SpaceOwnerNotFoundDataType | SpaceShouldHaveOnlyOneOwnerDataType | SubscriptionAlreadyExistsDataType | SubscriptionNotExistsDataType | SubscriptionPlanNotFoundDataType | UnknownOauthProviderDataType | UnsupportedSubscriptionPlanDataType | VersionRejectedDataType | WorkspaceMembersExceedLimitToDowngradeDataType | WorkspacePermissionNotFoundDataType | WrongSignInCredentialsDataType
|
union ErrorDataUnion = AlreadyInSpaceDataType | BlobNotFoundDataType | CopilotContextFileNotSupportedDataType | CopilotFailedToMatchContextDataType | CopilotFailedToModifyContextDataType | CopilotInvalidContextDataType | CopilotMessageNotFoundDataType | CopilotPromptNotFoundDataType | CopilotProviderSideErrorDataType | DocAccessDeniedDataType | DocHistoryNotFoundDataType | DocNotFoundDataType | ExpectToGrantDocUserRolesDataType | ExpectToRevokeDocUserRolesDataType | ExpectToUpdateDocUserRoleDataType | InvalidEmailDataType | InvalidHistoryTimestampDataType | InvalidLicenseUpdateParamsDataType | InvalidPasswordLengthDataType | InvalidRuntimeConfigTypeDataType | MemberNotFoundInSpaceDataType | MissingOauthQueryParameterDataType | NotInSpaceDataType | QueryTooLongDataType | RuntimeConfigNotFoundDataType | SameSubscriptionRecurringDataType | SpaceAccessDeniedDataType | SpaceNotFoundDataType | SpaceOwnerNotFoundDataType | SpaceShouldHaveOnlyOneOwnerDataType | SubscriptionAlreadyExistsDataType | SubscriptionNotExistsDataType | SubscriptionPlanNotFoundDataType | UnknownOauthProviderDataType | UnsupportedSubscriptionPlanDataType | VersionRejectedDataType | WorkspaceMembersExceedLimitToDowngradeDataType | WorkspacePermissionNotFoundDataType | WrongSignInCredentialsDataType
|
||||||
|
|
||||||
enum ErrorNames {
|
enum ErrorNames {
|
||||||
ACCESS_DENIED
|
ACCESS_DENIED
|
||||||
@@ -260,8 +327,12 @@ enum ErrorNames {
|
|||||||
CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS
|
CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS
|
||||||
CAPTCHA_VERIFICATION_FAILED
|
CAPTCHA_VERIFICATION_FAILED
|
||||||
COPILOT_ACTION_TAKEN
|
COPILOT_ACTION_TAKEN
|
||||||
|
COPILOT_CONTEXT_FILE_NOT_SUPPORTED
|
||||||
COPILOT_FAILED_TO_CREATE_MESSAGE
|
COPILOT_FAILED_TO_CREATE_MESSAGE
|
||||||
COPILOT_FAILED_TO_GENERATE_TEXT
|
COPILOT_FAILED_TO_GENERATE_TEXT
|
||||||
|
COPILOT_FAILED_TO_MATCH_CONTEXT
|
||||||
|
COPILOT_FAILED_TO_MODIFY_CONTEXT
|
||||||
|
COPILOT_INVALID_CONTEXT
|
||||||
COPILOT_MESSAGE_NOT_FOUND
|
COPILOT_MESSAGE_NOT_FOUND
|
||||||
COPILOT_PROMPT_INVALID
|
COPILOT_PROMPT_INVALID
|
||||||
COPILOT_PROMPT_NOT_FOUND
|
COPILOT_PROMPT_NOT_FOUND
|
||||||
@@ -574,6 +645,9 @@ type MissingOauthQueryParameterDataType {
|
|||||||
type Mutation {
|
type Mutation {
|
||||||
acceptInviteById(inviteId: String!, sendAcceptMail: Boolean, workspaceId: String!): Boolean!
|
acceptInviteById(inviteId: String!, sendAcceptMail: Boolean, workspaceId: String!): Boolean!
|
||||||
activateLicense(license: String!, workspaceId: String!): License!
|
activateLicense(license: String!, workspaceId: String!): License!
|
||||||
|
|
||||||
|
"""add a doc to context"""
|
||||||
|
addContextDoc(options: AddContextDocInput!): [CopilotContextListItem!]!
|
||||||
addWorkspaceFeature(feature: FeatureType!, workspaceId: String!): Boolean!
|
addWorkspaceFeature(feature: FeatureType!, workspaceId: String!): Boolean!
|
||||||
approveMember(userId: String!, workspaceId: String!): String!
|
approveMember(userId: String!, workspaceId: String!): String!
|
||||||
cancelSubscription(idempotencyKey: String @deprecated(reason: "use header `Idempotency-Key`"), plan: SubscriptionPlan = Pro, workspaceId: String): SubscriptionType!
|
cancelSubscription(idempotencyKey: String @deprecated(reason: "use header `Idempotency-Key`"), plan: SubscriptionPlan = Pro, workspaceId: String): SubscriptionType!
|
||||||
@@ -589,6 +663,9 @@ type Mutation {
|
|||||||
"""Create a subscription checkout link of stripe"""
|
"""Create a subscription checkout link of stripe"""
|
||||||
createCheckoutSession(input: CreateCheckoutSessionInput!): String!
|
createCheckoutSession(input: CreateCheckoutSessionInput!): String!
|
||||||
|
|
||||||
|
"""Create a context session"""
|
||||||
|
createCopilotContext(sessionId: String!, workspaceId: String!): String!
|
||||||
|
|
||||||
"""Create a chat message"""
|
"""Create a chat message"""
|
||||||
createCopilotMessage(options: CreateChatMessageInput!): String!
|
createCopilotMessage(options: CreateChatMessageInput!): String!
|
||||||
|
|
||||||
@@ -631,6 +708,9 @@ type Mutation {
|
|||||||
|
|
||||||
"""Remove user avatar"""
|
"""Remove user avatar"""
|
||||||
removeAvatar: RemoveAvatar!
|
removeAvatar: RemoveAvatar!
|
||||||
|
|
||||||
|
"""remove a doc from context"""
|
||||||
|
removeContextDoc(options: RemoveContextFileInput!): Boolean!
|
||||||
removeWorkspaceFeature(feature: FeatureType!, workspaceId: String!): Boolean!
|
removeWorkspaceFeature(feature: FeatureType!, workspaceId: String!): Boolean!
|
||||||
resumeSubscription(idempotencyKey: String @deprecated(reason: "use header `Idempotency-Key`"), plan: SubscriptionPlan = Pro, workspaceId: String): SubscriptionType!
|
resumeSubscription(idempotencyKey: String @deprecated(reason: "use header `Idempotency-Key`"), plan: SubscriptionPlan = Pro, workspaceId: String): SubscriptionType!
|
||||||
revoke(userId: String!, workspaceId: String!): Boolean!
|
revoke(userId: String!, workspaceId: String!): Boolean!
|
||||||
@@ -808,6 +888,11 @@ type RemoveAvatar {
|
|||||||
success: Boolean!
|
success: Boolean!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input RemoveContextFileInput {
|
||||||
|
contextId: String!
|
||||||
|
fileId: String!
|
||||||
|
}
|
||||||
|
|
||||||
input RevokeDocUserRoleInput {
|
input RevokeDocUserRoleInput {
|
||||||
docId: String!
|
docId: String!
|
||||||
userId: String!
|
userId: String!
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
mutation createCopilotContext($workspaceId: String!, $sessionId: String!) {
|
||||||
|
createCopilotContext(workspaceId: $workspaceId, sessionId: $sessionId)
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
mutation addContextDoc($options: AddContextDocInput!) {
|
||||||
|
addContextDoc(options: $options) {
|
||||||
|
id
|
||||||
|
createdAt
|
||||||
|
name
|
||||||
|
chunkSize
|
||||||
|
status
|
||||||
|
blobId
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
mutation removeContextDoc($options: RemoveContextFileInput!) {
|
||||||
|
removeContextDoc(options: $options)
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
query listContext($workspaceId: String!, $sessionId: String!) {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: $workspaceId) {
|
||||||
|
contexts(sessionId: $sessionId) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -158,6 +158,177 @@ mutation changePassword($token: String!, $userId: String!, $newPassword: String!
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const createCopilotContextMutation = {
|
||||||
|
id: 'createCopilotContextMutation' as const,
|
||||||
|
operationName: 'createCopilotContext',
|
||||||
|
definitionName: 'createCopilotContext',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation createCopilotContext($workspaceId: String!, $sessionId: String!) {
|
||||||
|
createCopilotContext(workspaceId: $workspaceId, sessionId: $sessionId)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addContextDocMutation = {
|
||||||
|
id: 'addContextDocMutation' as const,
|
||||||
|
operationName: 'addContextDoc',
|
||||||
|
definitionName: 'addContextDoc',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation addContextDoc($options: AddContextDocInput!) {
|
||||||
|
addContextDoc(options: $options) {
|
||||||
|
id
|
||||||
|
createdAt
|
||||||
|
name
|
||||||
|
chunkSize
|
||||||
|
status
|
||||||
|
blobId
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const removeContextDocMutation = {
|
||||||
|
id: 'removeContextDocMutation' as const,
|
||||||
|
operationName: 'removeContextDoc',
|
||||||
|
definitionName: 'removeContextDoc',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation removeContextDoc($options: RemoveContextFileInput!) {
|
||||||
|
removeContextDoc(options: $options)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const listContextQuery = {
|
||||||
|
id: 'listContextQuery' as const,
|
||||||
|
operationName: 'listContext',
|
||||||
|
definitionName: 'currentUser',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
query listContext($workspaceId: String!, $sessionId: String!) {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: $workspaceId) {
|
||||||
|
contexts(sessionId: $sessionId) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getCopilotHistoryIdsQuery = {
|
||||||
|
id: 'getCopilotHistoryIdsQuery' as const,
|
||||||
|
operationName: 'getCopilotHistoryIds',
|
||||||
|
definitionName: 'currentUser',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
query getCopilotHistoryIds($workspaceId: String!, $docId: String, $options: QueryChatHistoriesInput) {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: $workspaceId) {
|
||||||
|
histories(docId: $docId, options: $options) {
|
||||||
|
sessionId
|
||||||
|
messages {
|
||||||
|
id
|
||||||
|
role
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getCopilotHistoriesQuery = {
|
||||||
|
id: 'getCopilotHistoriesQuery' as const,
|
||||||
|
operationName: 'getCopilotHistories',
|
||||||
|
definitionName: 'currentUser',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
query getCopilotHistories($workspaceId: String!, $docId: String, $options: QueryChatHistoriesInput) {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: $workspaceId) {
|
||||||
|
histories(docId: $docId, options: $options) {
|
||||||
|
sessionId
|
||||||
|
tokens
|
||||||
|
action
|
||||||
|
createdAt
|
||||||
|
messages {
|
||||||
|
id
|
||||||
|
role
|
||||||
|
content
|
||||||
|
attachments
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createCopilotMessageMutation = {
|
||||||
|
id: 'createCopilotMessageMutation' as const,
|
||||||
|
operationName: 'createCopilotMessage',
|
||||||
|
definitionName: 'createCopilotMessage',
|
||||||
|
containsFile: true,
|
||||||
|
query: `
|
||||||
|
mutation createCopilotMessage($options: CreateChatMessageInput!) {
|
||||||
|
createCopilotMessage(options: $options)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getPromptsQuery = {
|
||||||
|
id: 'getPromptsQuery' as const,
|
||||||
|
operationName: 'getPrompts',
|
||||||
|
definitionName: 'listCopilotPrompts',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
query getPrompts {
|
||||||
|
listCopilotPrompts {
|
||||||
|
name
|
||||||
|
model
|
||||||
|
action
|
||||||
|
config {
|
||||||
|
jsonMode
|
||||||
|
frequencyPenalty
|
||||||
|
presencePenalty
|
||||||
|
temperature
|
||||||
|
topP
|
||||||
|
}
|
||||||
|
messages {
|
||||||
|
role
|
||||||
|
content
|
||||||
|
params
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updatePromptMutation = {
|
||||||
|
id: 'updatePromptMutation' as const,
|
||||||
|
operationName: 'updatePrompt',
|
||||||
|
definitionName: 'updateCopilotPrompt',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation updatePrompt($name: String!, $messages: [CopilotPromptMessageInput!]!) {
|
||||||
|
updateCopilotPrompt(name: $name, messages: $messages) {
|
||||||
|
name
|
||||||
|
model
|
||||||
|
action
|
||||||
|
config {
|
||||||
|
jsonMode
|
||||||
|
frequencyPenalty
|
||||||
|
presencePenalty
|
||||||
|
temperature
|
||||||
|
topP
|
||||||
|
}
|
||||||
|
messages {
|
||||||
|
role
|
||||||
|
content
|
||||||
|
params
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
export const copilotQuotaQuery = {
|
export const copilotQuotaQuery = {
|
||||||
id: 'copilotQuotaQuery' as const,
|
id: 'copilotQuotaQuery' as const,
|
||||||
operationName: 'copilotQuota',
|
operationName: 'copilotQuota',
|
||||||
@@ -187,28 +358,6 @@ mutation cleanupCopilotSession($input: DeleteSessionInput!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createCheckoutSessionMutation = {
|
|
||||||
id: 'createCheckoutSessionMutation' as const,
|
|
||||||
operationName: 'createCheckoutSession',
|
|
||||||
definitionName: 'createCheckoutSession',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
mutation createCheckoutSession($input: CreateCheckoutSessionInput!) {
|
|
||||||
createCheckoutSession(input: $input)
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const createCopilotMessageMutation = {
|
|
||||||
id: 'createCopilotMessageMutation' as const,
|
|
||||||
operationName: 'createCopilotMessage',
|
|
||||||
definitionName: 'createCopilotMessage',
|
|
||||||
containsFile: true,
|
|
||||||
query: `
|
|
||||||
mutation createCopilotMessage($options: CreateChatMessageInput!) {
|
|
||||||
createCopilotMessage(options: $options)
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const createCopilotSessionMutation = {
|
export const createCopilotSessionMutation = {
|
||||||
id: 'createCopilotSessionMutation' as const,
|
id: 'createCopilotSessionMutation' as const,
|
||||||
operationName: 'createCopilotSession',
|
operationName: 'createCopilotSession',
|
||||||
@@ -220,6 +369,55 @@ mutation createCopilotSession($options: CreateChatSessionInput!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const forkCopilotSessionMutation = {
|
||||||
|
id: 'forkCopilotSessionMutation' as const,
|
||||||
|
operationName: 'forkCopilotSession',
|
||||||
|
definitionName: 'forkCopilotSession',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation forkCopilotSession($options: ForkChatSessionInput!) {
|
||||||
|
forkCopilotSession(options: $options)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateCopilotSessionMutation = {
|
||||||
|
id: 'updateCopilotSessionMutation' as const,
|
||||||
|
operationName: 'updateCopilotSession',
|
||||||
|
definitionName: 'updateCopilotSession',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation updateCopilotSession($options: UpdateChatSessionInput!) {
|
||||||
|
updateCopilotSession(options: $options)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getCopilotSessionsQuery = {
|
||||||
|
id: 'getCopilotSessionsQuery' as const,
|
||||||
|
operationName: 'getCopilotSessions',
|
||||||
|
definitionName: 'currentUser',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
query getCopilotSessions($workspaceId: String!) {
|
||||||
|
currentUser {
|
||||||
|
copilot(workspaceId: $workspaceId) {
|
||||||
|
actions
|
||||||
|
chats
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createCheckoutSessionMutation = {
|
||||||
|
id: 'createCheckoutSessionMutation' as const,
|
||||||
|
operationName: 'createCheckoutSession',
|
||||||
|
definitionName: 'createCheckoutSession',
|
||||||
|
containsFile: false,
|
||||||
|
query: `
|
||||||
|
mutation createCheckoutSession($input: CreateCheckoutSessionInput!) {
|
||||||
|
createCheckoutSession(input: $input)
|
||||||
|
}`,
|
||||||
|
};
|
||||||
|
|
||||||
export const createCustomerPortalMutation = {
|
export const createCustomerPortalMutation = {
|
||||||
id: 'createCustomerPortalMutation' as const,
|
id: 'createCustomerPortalMutation' as const,
|
||||||
operationName: 'createCustomerPortal',
|
operationName: 'createCustomerPortal',
|
||||||
@@ -347,17 +545,6 @@ query getDocRolePermissions($workspaceId: String!, $docId: String!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const forkCopilotSessionMutation = {
|
|
||||||
id: 'forkCopilotSessionMutation' as const,
|
|
||||||
operationName: 'forkCopilotSession',
|
|
||||||
definitionName: 'forkCopilotSession',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
mutation forkCopilotSession($options: ForkChatSessionInput!) {
|
|
||||||
forkCopilotSession(options: $options)
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const generateLicenseKeyMutation = {
|
export const generateLicenseKeyMutation = {
|
||||||
id: 'generateLicenseKeyMutation' as const,
|
id: 'generateLicenseKeyMutation' as const,
|
||||||
operationName: 'generateLicenseKey',
|
operationName: 'generateLicenseKey',
|
||||||
@@ -369,71 +556,6 @@ mutation generateLicenseKey($sessionId: String!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getCopilotHistoriesQuery = {
|
|
||||||
id: 'getCopilotHistoriesQuery' as const,
|
|
||||||
operationName: 'getCopilotHistories',
|
|
||||||
definitionName: 'currentUser',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
query getCopilotHistories($workspaceId: String!, $docId: String, $options: QueryChatHistoriesInput) {
|
|
||||||
currentUser {
|
|
||||||
copilot(workspaceId: $workspaceId) {
|
|
||||||
histories(docId: $docId, options: $options) {
|
|
||||||
sessionId
|
|
||||||
tokens
|
|
||||||
action
|
|
||||||
createdAt
|
|
||||||
messages {
|
|
||||||
id
|
|
||||||
role
|
|
||||||
content
|
|
||||||
attachments
|
|
||||||
createdAt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getCopilotHistoryIdsQuery = {
|
|
||||||
id: 'getCopilotHistoryIdsQuery' as const,
|
|
||||||
operationName: 'getCopilotHistoryIds',
|
|
||||||
definitionName: 'currentUser',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
query getCopilotHistoryIds($workspaceId: String!, $docId: String, $options: QueryChatHistoriesInput) {
|
|
||||||
currentUser {
|
|
||||||
copilot(workspaceId: $workspaceId) {
|
|
||||||
histories(docId: $docId, options: $options) {
|
|
||||||
sessionId
|
|
||||||
messages {
|
|
||||||
id
|
|
||||||
role
|
|
||||||
createdAt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getCopilotSessionsQuery = {
|
|
||||||
id: 'getCopilotSessionsQuery' as const,
|
|
||||||
operationName: 'getCopilotSessions',
|
|
||||||
definitionName: 'currentUser',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
query getCopilotSessions($workspaceId: String!) {
|
|
||||||
currentUser {
|
|
||||||
copilot(workspaceId: $workspaceId) {
|
|
||||||
actions
|
|
||||||
chats
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getCurrentUserFeaturesQuery = {
|
export const getCurrentUserFeaturesQuery = {
|
||||||
id: 'getCurrentUserFeaturesQuery' as const,
|
id: 'getCurrentUserFeaturesQuery' as const,
|
||||||
operationName: 'getCurrentUserFeatures',
|
operationName: 'getCurrentUserFeatures',
|
||||||
@@ -616,33 +738,6 @@ query getPageGrantedUsersList($pagination: PaginationInput!, $docId: String!, $w
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getPromptsQuery = {
|
|
||||||
id: 'getPromptsQuery' as const,
|
|
||||||
operationName: 'getPrompts',
|
|
||||||
definitionName: 'listCopilotPrompts',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
query getPrompts {
|
|
||||||
listCopilotPrompts {
|
|
||||||
name
|
|
||||||
model
|
|
||||||
action
|
|
||||||
config {
|
|
||||||
jsonMode
|
|
||||||
frequencyPenalty
|
|
||||||
presencePenalty
|
|
||||||
temperature
|
|
||||||
topP
|
|
||||||
}
|
|
||||||
messages {
|
|
||||||
role
|
|
||||||
content
|
|
||||||
params
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getServerRuntimeConfigQuery = {
|
export const getServerRuntimeConfigQuery = {
|
||||||
id: 'getServerRuntimeConfigQuery' as const,
|
id: 'getServerRuntimeConfigQuery' as const,
|
||||||
operationName: 'getServerRuntimeConfig',
|
operationName: 'getServerRuntimeConfig',
|
||||||
@@ -1268,17 +1363,6 @@ mutation updateAccount($id: String!, $input: ManageUserInput!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateCopilotSessionMutation = {
|
|
||||||
id: 'updateCopilotSessionMutation' as const,
|
|
||||||
operationName: 'updateCopilotSession',
|
|
||||||
definitionName: 'updateCopilotSession',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
mutation updateCopilotSession($options: UpdateChatSessionInput!) {
|
|
||||||
updateCopilotSession(options: $options)
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateDocUserRoleMutation = {
|
export const updateDocUserRoleMutation = {
|
||||||
id: 'updateDocUserRoleMutation' as const,
|
id: 'updateDocUserRoleMutation' as const,
|
||||||
operationName: 'updateDocUserRole',
|
operationName: 'updateDocUserRole',
|
||||||
@@ -1290,33 +1374,6 @@ mutation updateDocUserRole($input: UpdateDocUserRoleInput!) {
|
|||||||
}`,
|
}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updatePromptMutation = {
|
|
||||||
id: 'updatePromptMutation' as const,
|
|
||||||
operationName: 'updatePrompt',
|
|
||||||
definitionName: 'updateCopilotPrompt',
|
|
||||||
containsFile: false,
|
|
||||||
query: `
|
|
||||||
mutation updatePrompt($name: String!, $messages: [CopilotPromptMessageInput!]!) {
|
|
||||||
updateCopilotPrompt(name: $name, messages: $messages) {
|
|
||||||
name
|
|
||||||
model
|
|
||||||
action
|
|
||||||
config {
|
|
||||||
jsonMode
|
|
||||||
frequencyPenalty
|
|
||||||
presencePenalty
|
|
||||||
temperature
|
|
||||||
topP
|
|
||||||
}
|
|
||||||
messages {
|
|
||||||
role
|
|
||||||
content
|
|
||||||
params
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateServerRuntimeConfigsMutation = {
|
export const updateServerRuntimeConfigsMutation = {
|
||||||
id: 'updateServerRuntimeConfigsMutation' as const,
|
id: 'updateServerRuntimeConfigsMutation' as const,
|
||||||
operationName: 'updateServerRuntimeConfigs',
|
operationName: 'updateServerRuntimeConfigs',
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ export interface Scalars {
|
|||||||
Upload: { input: File; output: File };
|
Upload: { input: File; output: File };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AddContextDocInput {
|
||||||
|
contextId: Scalars['String']['input'];
|
||||||
|
docId: Scalars['String']['input'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface AlreadyInSpaceDataType {
|
export interface AlreadyInSpaceDataType {
|
||||||
__typename?: 'AlreadyInSpaceDataType';
|
__typename?: 'AlreadyInSpaceDataType';
|
||||||
spaceId: Scalars['String']['output'];
|
spaceId: Scalars['String']['output'];
|
||||||
@@ -63,23 +68,91 @@ export interface ChatMessage {
|
|||||||
role: Scalars['String']['output'];
|
role: Scalars['String']['output'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum ContextFileStatus {
|
||||||
|
failed = 'failed',
|
||||||
|
finished = 'finished',
|
||||||
|
processing = 'processing',
|
||||||
|
}
|
||||||
|
|
||||||
export interface Copilot {
|
export interface Copilot {
|
||||||
__typename?: 'Copilot';
|
__typename?: 'Copilot';
|
||||||
/** Get the session list of actions in the workspace */
|
/** Get the session list of actions in the workspace */
|
||||||
actions: Array<Scalars['String']['output']>;
|
actions: Array<Scalars['String']['output']>;
|
||||||
/** Get the session list of chats in the workspace */
|
/** Get the session list of chats in the workspace */
|
||||||
chats: Array<Scalars['String']['output']>;
|
chats: Array<Scalars['String']['output']>;
|
||||||
|
/** Get the context list of a session */
|
||||||
|
contexts: Array<CopilotContext>;
|
||||||
histories: Array<CopilotHistories>;
|
histories: Array<CopilotHistories>;
|
||||||
/** Get the quota of the user in the workspace */
|
/** Get the quota of the user in the workspace */
|
||||||
quota: CopilotQuota;
|
quota: CopilotQuota;
|
||||||
workspaceId: Maybe<Scalars['ID']['output']>;
|
workspaceId: Maybe<Scalars['ID']['output']>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CopilotContextsArgs {
|
||||||
|
contextId?: InputMaybe<Scalars['String']['input']>;
|
||||||
|
sessionId: Scalars['String']['input'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface CopilotHistoriesArgs {
|
export interface CopilotHistoriesArgs {
|
||||||
docId?: InputMaybe<Scalars['String']['input']>;
|
docId?: InputMaybe<Scalars['String']['input']>;
|
||||||
options?: InputMaybe<QueryChatHistoriesInput>;
|
options?: InputMaybe<QueryChatHistoriesInput>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CopilotContext {
|
||||||
|
__typename?: 'CopilotContext';
|
||||||
|
/** list files in context */
|
||||||
|
docs: Array<CopilotContextDoc>;
|
||||||
|
/** list files in context */
|
||||||
|
files: Array<CopilotContextFile>;
|
||||||
|
id: Scalars['ID']['output'];
|
||||||
|
workspaceId: Scalars['String']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotContextDoc {
|
||||||
|
__typename?: 'CopilotContextDoc';
|
||||||
|
createdAt: Scalars['SafeInt']['output'];
|
||||||
|
id: Scalars['ID']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotContextFile {
|
||||||
|
__typename?: 'CopilotContextFile';
|
||||||
|
blobId: Scalars['String']['output'];
|
||||||
|
chunkSize: Scalars['SafeInt']['output'];
|
||||||
|
createdAt: Scalars['SafeInt']['output'];
|
||||||
|
id: Scalars['ID']['output'];
|
||||||
|
name: Scalars['String']['output'];
|
||||||
|
status: ContextFileStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotContextFileNotSupportedDataType {
|
||||||
|
__typename?: 'CopilotContextFileNotSupportedDataType';
|
||||||
|
fileName: Scalars['String']['output'];
|
||||||
|
message: Scalars['String']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotContextListItem {
|
||||||
|
__typename?: 'CopilotContextListItem';
|
||||||
|
blobId: Maybe<Scalars['String']['output']>;
|
||||||
|
chunkSize: Maybe<Scalars['SafeInt']['output']>;
|
||||||
|
createdAt: Scalars['SafeInt']['output'];
|
||||||
|
id: Scalars['ID']['output'];
|
||||||
|
name: Maybe<Scalars['String']['output']>;
|
||||||
|
status: Maybe<ContextFileStatus>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotFailedToMatchContextDataType {
|
||||||
|
__typename?: 'CopilotFailedToMatchContextDataType';
|
||||||
|
content: Scalars['String']['output'];
|
||||||
|
contextId: Scalars['String']['output'];
|
||||||
|
message: Scalars['String']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CopilotFailedToModifyContextDataType {
|
||||||
|
__typename?: 'CopilotFailedToModifyContextDataType';
|
||||||
|
contextId: Scalars['String']['output'];
|
||||||
|
message: Scalars['String']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface CopilotHistories {
|
export interface CopilotHistories {
|
||||||
__typename?: 'CopilotHistories';
|
__typename?: 'CopilotHistories';
|
||||||
/** An mark identifying which view to use to display the session */
|
/** An mark identifying which view to use to display the session */
|
||||||
@@ -91,6 +164,11 @@ export interface CopilotHistories {
|
|||||||
tokens: Scalars['Int']['output'];
|
tokens: Scalars['Int']['output'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CopilotInvalidContextDataType {
|
||||||
|
__typename?: 'CopilotInvalidContextDataType';
|
||||||
|
contextId: Scalars['String']['output'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface CopilotMessageNotFoundDataType {
|
export interface CopilotMessageNotFoundDataType {
|
||||||
__typename?: 'CopilotMessageNotFoundDataType';
|
__typename?: 'CopilotMessageNotFoundDataType';
|
||||||
messageId: Scalars['String']['output'];
|
messageId: Scalars['String']['output'];
|
||||||
@@ -303,6 +381,10 @@ export interface EditorType {
|
|||||||
export type ErrorDataUnion =
|
export type ErrorDataUnion =
|
||||||
| AlreadyInSpaceDataType
|
| AlreadyInSpaceDataType
|
||||||
| BlobNotFoundDataType
|
| BlobNotFoundDataType
|
||||||
|
| CopilotContextFileNotSupportedDataType
|
||||||
|
| CopilotFailedToMatchContextDataType
|
||||||
|
| CopilotFailedToModifyContextDataType
|
||||||
|
| CopilotInvalidContextDataType
|
||||||
| CopilotMessageNotFoundDataType
|
| CopilotMessageNotFoundDataType
|
||||||
| CopilotPromptNotFoundDataType
|
| CopilotPromptNotFoundDataType
|
||||||
| CopilotProviderSideErrorDataType
|
| CopilotProviderSideErrorDataType
|
||||||
@@ -351,8 +433,12 @@ export enum ErrorNames {
|
|||||||
CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS = 'CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS',
|
CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS = 'CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS',
|
||||||
CAPTCHA_VERIFICATION_FAILED = 'CAPTCHA_VERIFICATION_FAILED',
|
CAPTCHA_VERIFICATION_FAILED = 'CAPTCHA_VERIFICATION_FAILED',
|
||||||
COPILOT_ACTION_TAKEN = 'COPILOT_ACTION_TAKEN',
|
COPILOT_ACTION_TAKEN = 'COPILOT_ACTION_TAKEN',
|
||||||
|
COPILOT_CONTEXT_FILE_NOT_SUPPORTED = 'COPILOT_CONTEXT_FILE_NOT_SUPPORTED',
|
||||||
COPILOT_FAILED_TO_CREATE_MESSAGE = 'COPILOT_FAILED_TO_CREATE_MESSAGE',
|
COPILOT_FAILED_TO_CREATE_MESSAGE = 'COPILOT_FAILED_TO_CREATE_MESSAGE',
|
||||||
COPILOT_FAILED_TO_GENERATE_TEXT = 'COPILOT_FAILED_TO_GENERATE_TEXT',
|
COPILOT_FAILED_TO_GENERATE_TEXT = 'COPILOT_FAILED_TO_GENERATE_TEXT',
|
||||||
|
COPILOT_FAILED_TO_MATCH_CONTEXT = 'COPILOT_FAILED_TO_MATCH_CONTEXT',
|
||||||
|
COPILOT_FAILED_TO_MODIFY_CONTEXT = 'COPILOT_FAILED_TO_MODIFY_CONTEXT',
|
||||||
|
COPILOT_INVALID_CONTEXT = 'COPILOT_INVALID_CONTEXT',
|
||||||
COPILOT_MESSAGE_NOT_FOUND = 'COPILOT_MESSAGE_NOT_FOUND',
|
COPILOT_MESSAGE_NOT_FOUND = 'COPILOT_MESSAGE_NOT_FOUND',
|
||||||
COPILOT_PROMPT_INVALID = 'COPILOT_PROMPT_INVALID',
|
COPILOT_PROMPT_INVALID = 'COPILOT_PROMPT_INVALID',
|
||||||
COPILOT_PROMPT_NOT_FOUND = 'COPILOT_PROMPT_NOT_FOUND',
|
COPILOT_PROMPT_NOT_FOUND = 'COPILOT_PROMPT_NOT_FOUND',
|
||||||
@@ -668,6 +754,8 @@ export interface Mutation {
|
|||||||
__typename?: 'Mutation';
|
__typename?: 'Mutation';
|
||||||
acceptInviteById: Scalars['Boolean']['output'];
|
acceptInviteById: Scalars['Boolean']['output'];
|
||||||
activateLicense: License;
|
activateLicense: License;
|
||||||
|
/** add a doc to context */
|
||||||
|
addContextDoc: Array<CopilotContextListItem>;
|
||||||
addWorkspaceFeature: Scalars['Boolean']['output'];
|
addWorkspaceFeature: Scalars['Boolean']['output'];
|
||||||
approveMember: Scalars['String']['output'];
|
approveMember: Scalars['String']['output'];
|
||||||
cancelSubscription: SubscriptionType;
|
cancelSubscription: SubscriptionType;
|
||||||
@@ -679,6 +767,8 @@ export interface Mutation {
|
|||||||
createChangePasswordUrl: Scalars['String']['output'];
|
createChangePasswordUrl: Scalars['String']['output'];
|
||||||
/** Create a subscription checkout link of stripe */
|
/** Create a subscription checkout link of stripe */
|
||||||
createCheckoutSession: Scalars['String']['output'];
|
createCheckoutSession: Scalars['String']['output'];
|
||||||
|
/** Create a context session */
|
||||||
|
createCopilotContext: Scalars['String']['output'];
|
||||||
/** Create a chat message */
|
/** Create a chat message */
|
||||||
createCopilotMessage: Scalars['String']['output'];
|
createCopilotMessage: Scalars['String']['output'];
|
||||||
/** Create a copilot prompt */
|
/** Create a copilot prompt */
|
||||||
@@ -714,6 +804,8 @@ export interface Mutation {
|
|||||||
releaseDeletedBlobs: Scalars['Boolean']['output'];
|
releaseDeletedBlobs: Scalars['Boolean']['output'];
|
||||||
/** Remove user avatar */
|
/** Remove user avatar */
|
||||||
removeAvatar: RemoveAvatar;
|
removeAvatar: RemoveAvatar;
|
||||||
|
/** remove a doc from context */
|
||||||
|
removeContextDoc: Scalars['Boolean']['output'];
|
||||||
removeWorkspaceFeature: Scalars['Boolean']['output'];
|
removeWorkspaceFeature: Scalars['Boolean']['output'];
|
||||||
resumeSubscription: SubscriptionType;
|
resumeSubscription: SubscriptionType;
|
||||||
revoke: Scalars['Boolean']['output'];
|
revoke: Scalars['Boolean']['output'];
|
||||||
@@ -762,6 +854,10 @@ export interface MutationActivateLicenseArgs {
|
|||||||
workspaceId: Scalars['String']['input'];
|
workspaceId: Scalars['String']['input'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MutationAddContextDocArgs {
|
||||||
|
options: AddContextDocInput;
|
||||||
|
}
|
||||||
|
|
||||||
export interface MutationAddWorkspaceFeatureArgs {
|
export interface MutationAddWorkspaceFeatureArgs {
|
||||||
feature: FeatureType;
|
feature: FeatureType;
|
||||||
workspaceId: Scalars['String']['input'];
|
workspaceId: Scalars['String']['input'];
|
||||||
@@ -802,6 +898,11 @@ export interface MutationCreateCheckoutSessionArgs {
|
|||||||
input: CreateCheckoutSessionInput;
|
input: CreateCheckoutSessionInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MutationCreateCopilotContextArgs {
|
||||||
|
sessionId: Scalars['String']['input'];
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface MutationCreateCopilotMessageArgs {
|
export interface MutationCreateCopilotMessageArgs {
|
||||||
options: CreateChatMessageInput;
|
options: CreateChatMessageInput;
|
||||||
}
|
}
|
||||||
@@ -909,6 +1010,10 @@ export interface MutationReleaseDeletedBlobsArgs {
|
|||||||
workspaceId: Scalars['String']['input'];
|
workspaceId: Scalars['String']['input'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MutationRemoveContextDocArgs {
|
||||||
|
options: RemoveContextFileInput;
|
||||||
|
}
|
||||||
|
|
||||||
export interface MutationRemoveWorkspaceFeatureArgs {
|
export interface MutationRemoveWorkspaceFeatureArgs {
|
||||||
feature: FeatureType;
|
feature: FeatureType;
|
||||||
workspaceId: Scalars['String']['input'];
|
workspaceId: Scalars['String']['input'];
|
||||||
@@ -1203,6 +1308,11 @@ export interface RemoveAvatar {
|
|||||||
success: Scalars['Boolean']['output'];
|
success: Scalars['Boolean']['output'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface RemoveContextFileInput {
|
||||||
|
contextId: Scalars['String']['input'];
|
||||||
|
fileId: Scalars['String']['input'];
|
||||||
|
}
|
||||||
|
|
||||||
export interface RevokeDocUserRoleInput {
|
export interface RevokeDocUserRoleInput {
|
||||||
docId: Scalars['String']['input'];
|
docId: Scalars['String']['input'];
|
||||||
userId: Scalars['String']['input'];
|
userId: Scalars['String']['input'];
|
||||||
@@ -1832,6 +1942,179 @@ export type ChangePasswordMutation = {
|
|||||||
changePassword: boolean;
|
changePassword: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type CreateCopilotContextMutationVariables = Exact<{
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
sessionId: Scalars['String']['input'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type CreateCopilotContextMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
createCopilotContext: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type AddContextDocMutationVariables = Exact<{
|
||||||
|
options: AddContextDocInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type AddContextDocMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
addContextDoc: Array<{
|
||||||
|
__typename?: 'CopilotContextListItem';
|
||||||
|
id: string;
|
||||||
|
createdAt: number;
|
||||||
|
name: string | null;
|
||||||
|
chunkSize: number | null;
|
||||||
|
status: ContextFileStatus | null;
|
||||||
|
blobId: string | null;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type RemoveContextDocMutationVariables = Exact<{
|
||||||
|
options: RemoveContextFileInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type RemoveContextDocMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
removeContextDoc: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ListContextQueryVariables = Exact<{
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
sessionId: Scalars['String']['input'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type ListContextQuery = {
|
||||||
|
__typename?: 'Query';
|
||||||
|
currentUser: {
|
||||||
|
__typename?: 'UserType';
|
||||||
|
copilot: {
|
||||||
|
__typename?: 'Copilot';
|
||||||
|
contexts: Array<{ __typename?: 'CopilotContext'; id: string }>;
|
||||||
|
};
|
||||||
|
} | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GetCopilotHistoryIdsQueryVariables = Exact<{
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
docId?: InputMaybe<Scalars['String']['input']>;
|
||||||
|
options?: InputMaybe<QueryChatHistoriesInput>;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type GetCopilotHistoryIdsQuery = {
|
||||||
|
__typename?: 'Query';
|
||||||
|
currentUser: {
|
||||||
|
__typename?: 'UserType';
|
||||||
|
copilot: {
|
||||||
|
__typename?: 'Copilot';
|
||||||
|
histories: Array<{
|
||||||
|
__typename?: 'CopilotHistories';
|
||||||
|
sessionId: string;
|
||||||
|
messages: Array<{
|
||||||
|
__typename?: 'ChatMessage';
|
||||||
|
id: string | null;
|
||||||
|
role: string;
|
||||||
|
createdAt: string;
|
||||||
|
}>;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
} | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GetCopilotHistoriesQueryVariables = Exact<{
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
docId?: InputMaybe<Scalars['String']['input']>;
|
||||||
|
options?: InputMaybe<QueryChatHistoriesInput>;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type GetCopilotHistoriesQuery = {
|
||||||
|
__typename?: 'Query';
|
||||||
|
currentUser: {
|
||||||
|
__typename?: 'UserType';
|
||||||
|
copilot: {
|
||||||
|
__typename?: 'Copilot';
|
||||||
|
histories: Array<{
|
||||||
|
__typename?: 'CopilotHistories';
|
||||||
|
sessionId: string;
|
||||||
|
tokens: number;
|
||||||
|
action: string | null;
|
||||||
|
createdAt: string;
|
||||||
|
messages: Array<{
|
||||||
|
__typename?: 'ChatMessage';
|
||||||
|
id: string | null;
|
||||||
|
role: string;
|
||||||
|
content: string;
|
||||||
|
attachments: Array<string> | null;
|
||||||
|
createdAt: string;
|
||||||
|
}>;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
} | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type CreateCopilotMessageMutationVariables = Exact<{
|
||||||
|
options: CreateChatMessageInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type CreateCopilotMessageMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
createCopilotMessage: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GetPromptsQueryVariables = Exact<{ [key: string]: never }>;
|
||||||
|
|
||||||
|
export type GetPromptsQuery = {
|
||||||
|
__typename?: 'Query';
|
||||||
|
listCopilotPrompts: Array<{
|
||||||
|
__typename?: 'CopilotPromptType';
|
||||||
|
name: string;
|
||||||
|
model: string;
|
||||||
|
action: string | null;
|
||||||
|
config: {
|
||||||
|
__typename?: 'CopilotPromptConfigType';
|
||||||
|
jsonMode: boolean | null;
|
||||||
|
frequencyPenalty: number | null;
|
||||||
|
presencePenalty: number | null;
|
||||||
|
temperature: number | null;
|
||||||
|
topP: number | null;
|
||||||
|
} | null;
|
||||||
|
messages: Array<{
|
||||||
|
__typename?: 'CopilotPromptMessageType';
|
||||||
|
role: CopilotPromptMessageRole;
|
||||||
|
content: string;
|
||||||
|
params: Record<string, string> | null;
|
||||||
|
}>;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type UpdatePromptMutationVariables = Exact<{
|
||||||
|
name: Scalars['String']['input'];
|
||||||
|
messages: Array<CopilotPromptMessageInput> | CopilotPromptMessageInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type UpdatePromptMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
updateCopilotPrompt: {
|
||||||
|
__typename?: 'CopilotPromptType';
|
||||||
|
name: string;
|
||||||
|
model: string;
|
||||||
|
action: string | null;
|
||||||
|
config: {
|
||||||
|
__typename?: 'CopilotPromptConfigType';
|
||||||
|
jsonMode: boolean | null;
|
||||||
|
frequencyPenalty: number | null;
|
||||||
|
presencePenalty: number | null;
|
||||||
|
temperature: number | null;
|
||||||
|
topP: number | null;
|
||||||
|
} | null;
|
||||||
|
messages: Array<{
|
||||||
|
__typename?: 'CopilotPromptMessageType';
|
||||||
|
role: CopilotPromptMessageRole;
|
||||||
|
content: string;
|
||||||
|
params: Record<string, string> | null;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export type CopilotQuotaQueryVariables = Exact<{ [key: string]: never }>;
|
export type CopilotQuotaQueryVariables = Exact<{ [key: string]: never }>;
|
||||||
|
|
||||||
export type CopilotQuotaQuery = {
|
export type CopilotQuotaQuery = {
|
||||||
@@ -1858,24 +2141,6 @@ export type CleanupCopilotSessionMutation = {
|
|||||||
cleanupCopilotSession: Array<string>;
|
cleanupCopilotSession: Array<string>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CreateCheckoutSessionMutationVariables = Exact<{
|
|
||||||
input: CreateCheckoutSessionInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type CreateCheckoutSessionMutation = {
|
|
||||||
__typename?: 'Mutation';
|
|
||||||
createCheckoutSession: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type CreateCopilotMessageMutationVariables = Exact<{
|
|
||||||
options: CreateChatMessageInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type CreateCopilotMessageMutation = {
|
|
||||||
__typename?: 'Mutation';
|
|
||||||
createCopilotMessage: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type CreateCopilotSessionMutationVariables = Exact<{
|
export type CreateCopilotSessionMutationVariables = Exact<{
|
||||||
options: CreateChatSessionInput;
|
options: CreateChatSessionInput;
|
||||||
}>;
|
}>;
|
||||||
@@ -1885,6 +2150,49 @@ export type CreateCopilotSessionMutation = {
|
|||||||
createCopilotSession: string;
|
createCopilotSession: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ForkCopilotSessionMutationVariables = Exact<{
|
||||||
|
options: ForkChatSessionInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type ForkCopilotSessionMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
forkCopilotSession: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type UpdateCopilotSessionMutationVariables = Exact<{
|
||||||
|
options: UpdateChatSessionInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type UpdateCopilotSessionMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
updateCopilotSession: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GetCopilotSessionsQueryVariables = Exact<{
|
||||||
|
workspaceId: Scalars['String']['input'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type GetCopilotSessionsQuery = {
|
||||||
|
__typename?: 'Query';
|
||||||
|
currentUser: {
|
||||||
|
__typename?: 'UserType';
|
||||||
|
copilot: {
|
||||||
|
__typename?: 'Copilot';
|
||||||
|
actions: Array<string>;
|
||||||
|
chats: Array<string>;
|
||||||
|
};
|
||||||
|
} | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type CreateCheckoutSessionMutationVariables = Exact<{
|
||||||
|
input: CreateCheckoutSessionInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type CreateCheckoutSessionMutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
createCheckoutSession: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type CreateCustomerPortalMutationVariables = Exact<{
|
export type CreateCustomerPortalMutationVariables = Exact<{
|
||||||
[key: string]: never;
|
[key: string]: never;
|
||||||
}>;
|
}>;
|
||||||
@@ -1989,15 +2297,6 @@ export type GetDocRolePermissionsQuery = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ForkCopilotSessionMutationVariables = Exact<{
|
|
||||||
options: ForkChatSessionInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type ForkCopilotSessionMutation = {
|
|
||||||
__typename?: 'Mutation';
|
|
||||||
forkCopilotSession: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type CredentialsRequirementsFragment = {
|
export type CredentialsRequirementsFragment = {
|
||||||
__typename?: 'CredentialsRequirementType';
|
__typename?: 'CredentialsRequirementType';
|
||||||
password: {
|
password: {
|
||||||
@@ -2022,79 +2321,6 @@ export type GenerateLicenseKeyMutation = {
|
|||||||
generateLicenseKey: string;
|
generateLicenseKey: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GetCopilotHistoriesQueryVariables = Exact<{
|
|
||||||
workspaceId: Scalars['String']['input'];
|
|
||||||
docId?: InputMaybe<Scalars['String']['input']>;
|
|
||||||
options?: InputMaybe<QueryChatHistoriesInput>;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type GetCopilotHistoriesQuery = {
|
|
||||||
__typename?: 'Query';
|
|
||||||
currentUser: {
|
|
||||||
__typename?: 'UserType';
|
|
||||||
copilot: {
|
|
||||||
__typename?: 'Copilot';
|
|
||||||
histories: Array<{
|
|
||||||
__typename?: 'CopilotHistories';
|
|
||||||
sessionId: string;
|
|
||||||
tokens: number;
|
|
||||||
action: string | null;
|
|
||||||
createdAt: string;
|
|
||||||
messages: Array<{
|
|
||||||
__typename?: 'ChatMessage';
|
|
||||||
id: string | null;
|
|
||||||
role: string;
|
|
||||||
content: string;
|
|
||||||
attachments: Array<string> | null;
|
|
||||||
createdAt: string;
|
|
||||||
}>;
|
|
||||||
}>;
|
|
||||||
};
|
|
||||||
} | null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type GetCopilotHistoryIdsQueryVariables = Exact<{
|
|
||||||
workspaceId: Scalars['String']['input'];
|
|
||||||
docId?: InputMaybe<Scalars['String']['input']>;
|
|
||||||
options?: InputMaybe<QueryChatHistoriesInput>;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type GetCopilotHistoryIdsQuery = {
|
|
||||||
__typename?: 'Query';
|
|
||||||
currentUser: {
|
|
||||||
__typename?: 'UserType';
|
|
||||||
copilot: {
|
|
||||||
__typename?: 'Copilot';
|
|
||||||
histories: Array<{
|
|
||||||
__typename?: 'CopilotHistories';
|
|
||||||
sessionId: string;
|
|
||||||
messages: Array<{
|
|
||||||
__typename?: 'ChatMessage';
|
|
||||||
id: string | null;
|
|
||||||
role: string;
|
|
||||||
createdAt: string;
|
|
||||||
}>;
|
|
||||||
}>;
|
|
||||||
};
|
|
||||||
} | null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type GetCopilotSessionsQueryVariables = Exact<{
|
|
||||||
workspaceId: Scalars['String']['input'];
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type GetCopilotSessionsQuery = {
|
|
||||||
__typename?: 'Query';
|
|
||||||
currentUser: {
|
|
||||||
__typename?: 'UserType';
|
|
||||||
copilot: {
|
|
||||||
__typename?: 'Copilot';
|
|
||||||
actions: Array<string>;
|
|
||||||
chats: Array<string>;
|
|
||||||
};
|
|
||||||
} | null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type GetCurrentUserFeaturesQueryVariables = Exact<{
|
export type GetCurrentUserFeaturesQueryVariables = Exact<{
|
||||||
[key: string]: never;
|
[key: string]: never;
|
||||||
}>;
|
}>;
|
||||||
@@ -2265,32 +2491,6 @@ export type GetPageGrantedUsersListQuery = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GetPromptsQueryVariables = Exact<{ [key: string]: never }>;
|
|
||||||
|
|
||||||
export type GetPromptsQuery = {
|
|
||||||
__typename?: 'Query';
|
|
||||||
listCopilotPrompts: Array<{
|
|
||||||
__typename?: 'CopilotPromptType';
|
|
||||||
name: string;
|
|
||||||
model: string;
|
|
||||||
action: string | null;
|
|
||||||
config: {
|
|
||||||
__typename?: 'CopilotPromptConfigType';
|
|
||||||
jsonMode: boolean | null;
|
|
||||||
frequencyPenalty: number | null;
|
|
||||||
presencePenalty: number | null;
|
|
||||||
temperature: number | null;
|
|
||||||
topP: number | null;
|
|
||||||
} | null;
|
|
||||||
messages: Array<{
|
|
||||||
__typename?: 'CopilotPromptMessageType';
|
|
||||||
role: CopilotPromptMessageRole;
|
|
||||||
content: string;
|
|
||||||
params: Record<string, string> | null;
|
|
||||||
}>;
|
|
||||||
}>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type GetServerRuntimeConfigQueryVariables = Exact<{
|
export type GetServerRuntimeConfigQueryVariables = Exact<{
|
||||||
[key: string]: never;
|
[key: string]: never;
|
||||||
}>;
|
}>;
|
||||||
@@ -2855,15 +3055,6 @@ export type UpdateAccountMutation = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export type UpdateCopilotSessionMutationVariables = Exact<{
|
|
||||||
options: UpdateChatSessionInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type UpdateCopilotSessionMutation = {
|
|
||||||
__typename?: 'Mutation';
|
|
||||||
updateCopilotSession: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type UpdateDocUserRoleMutationVariables = Exact<{
|
export type UpdateDocUserRoleMutationVariables = Exact<{
|
||||||
input: UpdateDocUserRoleInput;
|
input: UpdateDocUserRoleInput;
|
||||||
}>;
|
}>;
|
||||||
@@ -2873,35 +3064,6 @@ export type UpdateDocUserRoleMutation = {
|
|||||||
updateDocUserRole: boolean;
|
updateDocUserRole: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type UpdatePromptMutationVariables = Exact<{
|
|
||||||
name: Scalars['String']['input'];
|
|
||||||
messages: Array<CopilotPromptMessageInput> | CopilotPromptMessageInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export type UpdatePromptMutation = {
|
|
||||||
__typename?: 'Mutation';
|
|
||||||
updateCopilotPrompt: {
|
|
||||||
__typename?: 'CopilotPromptType';
|
|
||||||
name: string;
|
|
||||||
model: string;
|
|
||||||
action: string | null;
|
|
||||||
config: {
|
|
||||||
__typename?: 'CopilotPromptConfigType';
|
|
||||||
jsonMode: boolean | null;
|
|
||||||
frequencyPenalty: number | null;
|
|
||||||
presencePenalty: number | null;
|
|
||||||
temperature: number | null;
|
|
||||||
topP: number | null;
|
|
||||||
} | null;
|
|
||||||
messages: Array<{
|
|
||||||
__typename?: 'CopilotPromptMessageType';
|
|
||||||
role: CopilotPromptMessageRole;
|
|
||||||
content: string;
|
|
||||||
params: Record<string, string> | null;
|
|
||||||
}>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export type UpdateServerRuntimeConfigsMutationVariables = Exact<{
|
export type UpdateServerRuntimeConfigsMutationVariables = Exact<{
|
||||||
updates: Scalars['JSONObject']['input'];
|
updates: Scalars['JSONObject']['input'];
|
||||||
}>;
|
}>;
|
||||||
@@ -3191,30 +3353,40 @@ export type Queries =
|
|||||||
response: ListBlobsQuery;
|
response: ListBlobsQuery;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: 'copilotQuotaQuery';
|
name: 'listContextQuery';
|
||||||
variables: CopilotQuotaQueryVariables;
|
variables: ListContextQueryVariables;
|
||||||
response: CopilotQuotaQuery;
|
response: ListContextQuery;
|
||||||
}
|
|
||||||
| {
|
|
||||||
name: 'getDocRolePermissionsQuery';
|
|
||||||
variables: GetDocRolePermissionsQueryVariables;
|
|
||||||
response: GetDocRolePermissionsQuery;
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
name: 'getCopilotHistoriesQuery';
|
|
||||||
variables: GetCopilotHistoriesQueryVariables;
|
|
||||||
response: GetCopilotHistoriesQuery;
|
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: 'getCopilotHistoryIdsQuery';
|
name: 'getCopilotHistoryIdsQuery';
|
||||||
variables: GetCopilotHistoryIdsQueryVariables;
|
variables: GetCopilotHistoryIdsQueryVariables;
|
||||||
response: GetCopilotHistoryIdsQuery;
|
response: GetCopilotHistoryIdsQuery;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
name: 'getCopilotHistoriesQuery';
|
||||||
|
variables: GetCopilotHistoriesQueryVariables;
|
||||||
|
response: GetCopilotHistoriesQuery;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'getPromptsQuery';
|
||||||
|
variables: GetPromptsQueryVariables;
|
||||||
|
response: GetPromptsQuery;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'copilotQuotaQuery';
|
||||||
|
variables: CopilotQuotaQueryVariables;
|
||||||
|
response: CopilotQuotaQuery;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
name: 'getCopilotSessionsQuery';
|
name: 'getCopilotSessionsQuery';
|
||||||
variables: GetCopilotSessionsQueryVariables;
|
variables: GetCopilotSessionsQueryVariables;
|
||||||
response: GetCopilotSessionsQuery;
|
response: GetCopilotSessionsQuery;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
name: 'getDocRolePermissionsQuery';
|
||||||
|
variables: GetDocRolePermissionsQueryVariables;
|
||||||
|
response: GetDocRolePermissionsQuery;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
name: 'getCurrentUserFeaturesQuery';
|
name: 'getCurrentUserFeaturesQuery';
|
||||||
variables: GetCurrentUserFeaturesQueryVariables;
|
variables: GetCurrentUserFeaturesQueryVariables;
|
||||||
@@ -3265,11 +3437,6 @@ export type Queries =
|
|||||||
variables: GetPageGrantedUsersListQueryVariables;
|
variables: GetPageGrantedUsersListQueryVariables;
|
||||||
response: GetPageGrantedUsersListQuery;
|
response: GetPageGrantedUsersListQuery;
|
||||||
}
|
}
|
||||||
| {
|
|
||||||
name: 'getPromptsQuery';
|
|
||||||
variables: GetPromptsQueryVariables;
|
|
||||||
response: GetPromptsQuery;
|
|
||||||
}
|
|
||||||
| {
|
| {
|
||||||
name: 'getServerRuntimeConfigQuery';
|
name: 'getServerRuntimeConfigQuery';
|
||||||
variables: GetServerRuntimeConfigQueryVariables;
|
variables: GetServerRuntimeConfigQueryVariables;
|
||||||
@@ -3443,25 +3610,55 @@ export type Mutations =
|
|||||||
response: ChangePasswordMutation;
|
response: ChangePasswordMutation;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: 'cleanupCopilotSessionMutation';
|
name: 'createCopilotContextMutation';
|
||||||
variables: CleanupCopilotSessionMutationVariables;
|
variables: CreateCopilotContextMutationVariables;
|
||||||
response: CleanupCopilotSessionMutation;
|
response: CreateCopilotContextMutation;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: 'createCheckoutSessionMutation';
|
name: 'addContextDocMutation';
|
||||||
variables: CreateCheckoutSessionMutationVariables;
|
variables: AddContextDocMutationVariables;
|
||||||
response: CreateCheckoutSessionMutation;
|
response: AddContextDocMutation;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'removeContextDocMutation';
|
||||||
|
variables: RemoveContextDocMutationVariables;
|
||||||
|
response: RemoveContextDocMutation;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: 'createCopilotMessageMutation';
|
name: 'createCopilotMessageMutation';
|
||||||
variables: CreateCopilotMessageMutationVariables;
|
variables: CreateCopilotMessageMutationVariables;
|
||||||
response: CreateCopilotMessageMutation;
|
response: CreateCopilotMessageMutation;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
name: 'updatePromptMutation';
|
||||||
|
variables: UpdatePromptMutationVariables;
|
||||||
|
response: UpdatePromptMutation;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'cleanupCopilotSessionMutation';
|
||||||
|
variables: CleanupCopilotSessionMutationVariables;
|
||||||
|
response: CleanupCopilotSessionMutation;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
name: 'createCopilotSessionMutation';
|
name: 'createCopilotSessionMutation';
|
||||||
variables: CreateCopilotSessionMutationVariables;
|
variables: CreateCopilotSessionMutationVariables;
|
||||||
response: CreateCopilotSessionMutation;
|
response: CreateCopilotSessionMutation;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
name: 'forkCopilotSessionMutation';
|
||||||
|
variables: ForkCopilotSessionMutationVariables;
|
||||||
|
response: ForkCopilotSessionMutation;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'updateCopilotSessionMutation';
|
||||||
|
variables: UpdateCopilotSessionMutationVariables;
|
||||||
|
response: UpdateCopilotSessionMutation;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
name: 'createCheckoutSessionMutation';
|
||||||
|
variables: CreateCheckoutSessionMutationVariables;
|
||||||
|
response: CreateCheckoutSessionMutation;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
name: 'createCustomerPortalMutation';
|
name: 'createCustomerPortalMutation';
|
||||||
variables: CreateCustomerPortalMutationVariables;
|
variables: CreateCustomerPortalMutationVariables;
|
||||||
@@ -3502,11 +3699,6 @@ export type Mutations =
|
|||||||
variables: DeleteWorkspaceMutationVariables;
|
variables: DeleteWorkspaceMutationVariables;
|
||||||
response: DeleteWorkspaceMutation;
|
response: DeleteWorkspaceMutation;
|
||||||
}
|
}
|
||||||
| {
|
|
||||||
name: 'forkCopilotSessionMutation';
|
|
||||||
variables: ForkCopilotSessionMutationVariables;
|
|
||||||
response: ForkCopilotSessionMutation;
|
|
||||||
}
|
|
||||||
| {
|
| {
|
||||||
name: 'generateLicenseKeyMutation';
|
name: 'generateLicenseKeyMutation';
|
||||||
variables: GenerateLicenseKeyMutationVariables;
|
variables: GenerateLicenseKeyMutationVariables;
|
||||||
@@ -3597,21 +3789,11 @@ export type Mutations =
|
|||||||
variables: UpdateAccountMutationVariables;
|
variables: UpdateAccountMutationVariables;
|
||||||
response: UpdateAccountMutation;
|
response: UpdateAccountMutation;
|
||||||
}
|
}
|
||||||
| {
|
|
||||||
name: 'updateCopilotSessionMutation';
|
|
||||||
variables: UpdateCopilotSessionMutationVariables;
|
|
||||||
response: UpdateCopilotSessionMutation;
|
|
||||||
}
|
|
||||||
| {
|
| {
|
||||||
name: 'updateDocUserRoleMutation';
|
name: 'updateDocUserRoleMutation';
|
||||||
variables: UpdateDocUserRoleMutationVariables;
|
variables: UpdateDocUserRoleMutationVariables;
|
||||||
response: UpdateDocUserRoleMutation;
|
response: UpdateDocUserRoleMutation;
|
||||||
}
|
}
|
||||||
| {
|
|
||||||
name: 'updatePromptMutation';
|
|
||||||
variables: UpdatePromptMutationVariables;
|
|
||||||
response: UpdatePromptMutation;
|
|
||||||
}
|
|
||||||
| {
|
| {
|
||||||
name: 'updateServerRuntimeConfigsMutation';
|
name: 'updateServerRuntimeConfigsMutation';
|
||||||
variables: UpdateServerRuntimeConfigsMutationVariables;
|
variables: UpdateServerRuntimeConfigsMutationVariables;
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ anyhow = { workspace = true }
|
|||||||
chrono = { workspace = true }
|
chrono = { workspace = true }
|
||||||
napi = { workspace = true }
|
napi = { workspace = true }
|
||||||
napi-derive = { workspace = true }
|
napi-derive = { workspace = true }
|
||||||
thiserror = { workspace = true }
|
|
||||||
sqlx = { workspace = true, default-features = false, features = ["chrono", "macros", "migrate", "runtime-tokio", "sqlite", "tls-rustls"] }
|
sqlx = { workspace = true, default-features = false, features = ["chrono", "macros", "migrate", "runtime-tokio", "sqlite", "tls-rustls"] }
|
||||||
|
thiserror = { workspace = true }
|
||||||
tokio = { workspace = true, features = ["full"] }
|
tokio = { workspace = true, features = ["full"] }
|
||||||
|
|
||||||
[target.'cfg(any(target_os = "ios", target_os = "android"))'.dependencies]
|
[target.'cfg(any(target_os = "ios", target_os = "android"))'.dependencies]
|
||||||
|
|||||||
@@ -852,7 +852,7 @@ __metadata:
|
|||||||
nodemailer: "npm:^6.9.16"
|
nodemailer: "npm:^6.9.16"
|
||||||
nodemon: "npm:^3.1.7"
|
nodemon: "npm:^3.1.7"
|
||||||
on-headers: "npm:^1.0.2"
|
on-headers: "npm:^1.0.2"
|
||||||
openai: "npm:^4.76.2"
|
openai: "npm:^4.83.0"
|
||||||
piscina: "npm:^5.0.0-alpha.0"
|
piscina: "npm:^5.0.0-alpha.0"
|
||||||
prisma: "npm:^5.22.0"
|
prisma: "npm:^5.22.0"
|
||||||
react: "npm:19.0.0"
|
react: "npm:19.0.0"
|
||||||
@@ -28122,7 +28122,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"openai@npm:^4.76.2":
|
"openai@npm:^4.83.0":
|
||||||
version: 4.83.0
|
version: 4.83.0
|
||||||
resolution: "openai@npm:4.83.0"
|
resolution: "openai@npm:4.83.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
Reference in New Issue
Block a user