feat(server): skip cleanup for stale workspace (#13418)

fix AI-408

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

* **New Features**
* Added a new field to workspaces to track the last time embeddings were
checked.
* Cleanup jobs for workspace embeddings now skip workspaces that haven't
changed in over 30 days or have no embeddings, improving efficiency.
* Cleanup jobs are now automatically triggered when a workspace is
updated.

* **Improvements**
* Enhanced workspace selection for cleanup and indexing tasks to use
more precise filters and batching.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-08-06 16:11:50 +08:00
committed by GitHub
parent 713f926247
commit 9677bdf50d
6 changed files with 83 additions and 31 deletions
+12 -15
View File
@@ -24,6 +24,7 @@ export type UpdateWorkspaceInput = Pick<
| 'name'
| 'avatarKey'
| 'indexed'
| 'lastCheckEmbeddings'
>;
@Injectable()
@@ -49,7 +50,11 @@ export class WorkspaceModel extends BaseModel {
/**
* Update the workspace with the given data.
*/
async update(workspaceId: string, data: UpdateWorkspaceInput) {
async update(
workspaceId: string,
data: UpdateWorkspaceInput,
notifyUpdate = true
) {
const workspace = await this.db.workspace.update({
where: {
id: workspaceId,
@@ -60,7 +65,9 @@ export class WorkspaceModel extends BaseModel {
`Updated workspace ${workspaceId} with data ${JSON.stringify(data)}`
);
this.event.emit('workspace.updated', workspace);
if (notifyUpdate) {
this.event.emit('workspace.updated', workspace);
}
return workspace;
}
@@ -81,25 +88,15 @@ export class WorkspaceModel extends BaseModel {
});
}
async listAfterSid(sid: number, limit: number) {
return await this.db.workspace.findMany({
where: {
sid: { gt: sid },
},
take: limit,
orderBy: {
sid: 'asc',
},
});
}
async list<S extends Prisma.WorkspaceSelect>(
where: Prisma.WorkspaceWhereInput = {},
select?: S
select?: S,
limit?: number
) {
return (await this.db.workspace.findMany({
where,
select,
take: limit,
orderBy: {
sid: 'asc',
},