Prechádzať zdrojové kódy

feat: add resources api

Thomas Zhang 2 mesiacov pred
rodič
commit
79d8915c19

+ 15 - 0
src/params/resource.ts

@@ -0,0 +1,15 @@
+import type { ParamMatcher } from '@sveltejs/kit';
+
+export const match = ((
+	param: string,
+): param is 'models' | 'tools' | 'kbs' | 'documents' | 'agents' | 'stacks' | 'secrets' => {
+	return (
+		param === 'models' ||
+		param === 'tools' ||
+		param === 'kbs' ||
+		param === 'documents' ||
+		param === 'agents' ||
+		param === 'stacks' ||
+		param === 'secrets'
+	);
+}) satisfies ParamMatcher;

+ 57 - 0
src/routes/api/workspaces/[workspaceId]/[resource=resource]/+server.ts

@@ -0,0 +1,57 @@
+import { json } from '@sveltejs/kit';
+
+import { server } from '$lib/server';
+import type { AgentResources } from '$lib/server/resources/agents';
+import type { DocumentResources } from '$lib/server/resources/documents';
+import type { KBResources } from '$lib/server/resources/kbs';
+import type { ModelResources } from '$lib/server/resources/models';
+import type { ToolResources } from '$lib/server/resources/tools';
+import type {
+	AgentCR,
+	DocumentCR,
+	ExternalKBCR,
+	ExternalModelCR,
+	ExternalToolCR,
+	ManagedKBCR,
+	ManagedModelCR,
+	ManagedToolCR,
+} from '$lib/types/custom-resources';
+import type { KnowledgeBase, Model, Tool } from '$lib/types/entities';
+
+import type { RequestHandler } from './$types';
+
+const GET: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const items = await catalog.list();
+	return json(items);
+};
+
+const POST: RequestHandler = async ({ locals, params, request }) => {
+	const workspace = locals.workspace!;
+	const { resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const { entity: created, cr } = await catalog.create(await request.json());
+	const resources = server.resources.getWorkspaceResources(workspace.id)[resourceType];
+	if (resourceType === 'models') {
+		if ((created as Model).mode === 'external')
+			await (resources as ModelResources).applyExternalModel(cr as ExternalModelCR);
+		else await (resources as ModelResources).applyManagedModel(cr as ManagedModelCR);
+	} else if (resourceType === 'tools') {
+		if ((created as Tool).mode === 'external')
+			await (resources as ToolResources).applyExternalTool(cr as ExternalToolCR);
+		else await (resources as ToolResources).applyManagedTool(cr as ManagedToolCR);
+	} else if (resourceType === 'kbs') {
+		if ((created as KnowledgeBase).mode === 'external')
+			await (resources as KBResources).applyExternalKB(cr as ExternalKBCR);
+		else await (resources as KBResources).applyManagedKB(cr as ManagedKBCR);
+	} else if (resourceType === 'documents') {
+		await (resources as DocumentResources).applyDocument(cr as DocumentCR);
+	} else if (resourceType === 'agents') {
+		await (resources as AgentResources).applyAgent(cr as AgentCR);
+	}
+	return json(created, { status: 201 });
+};
+
+export { GET, POST };

+ 94 - 0
src/routes/api/workspaces/[workspaceId]/[resource=resource]/[id]/+server.ts

@@ -0,0 +1,94 @@
+import { json } from '@sveltejs/kit';
+
+import { server } from '$lib/server';
+import type { AgentResources } from '$lib/server/resources/agents';
+import type { DocumentResources } from '$lib/server/resources/documents';
+import type { KBResources } from '$lib/server/resources/kbs';
+import type { ModelResources } from '$lib/server/resources/models';
+import type { ToolResources } from '$lib/server/resources/tools';
+import type {
+	AgentCR,
+	DocumentCR,
+	ExternalKBCR,
+	ExternalModelCR,
+	ExternalToolCR,
+	ManagedKBCR,
+	ManagedModelCR,
+	ManagedToolCR,
+} from '$lib/types/custom-resources';
+import type { KnowledgeBase, Model, Tool } from '$lib/types/entities';
+
+import type { RequestHandler } from './$types';
+
+const GET: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const items = await catalog.list();
+	const item = items.find((r) => r.id === params.id);
+	if (!item)
+		return json({ code: 'NOT_FOUND', message: `${resourceType} not found` }, { status: 404 });
+	return json(item);
+};
+
+const PUT: RequestHandler = async ({ locals, params, request }) => {
+	const workspace = locals.workspace!;
+	const { id, resource: resourceType } = params;
+	const input = await request.json();
+	input.id = id;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const { entity: updated, cr } = await catalog.update(input);
+	const resources = server.resources.getWorkspaceResources(workspace.id)[resourceType];
+	if (updated) {
+		if (resourceType === 'models') {
+			if ((updated as Model).mode === 'external')
+				await (resources as ModelResources).applyExternalModel(cr as ExternalModelCR);
+			else await (resources as ModelResources).applyManagedModel(cr as ManagedModelCR);
+		} else if (resourceType === 'tools') {
+			if ((updated as Tool).mode === 'external')
+				await (resources as ToolResources).applyExternalTool(cr as ExternalToolCR);
+			else await (resources as ToolResources).applyManagedTool(cr as ManagedToolCR);
+		} else if (resourceType === 'kbs') {
+			if ((updated as KnowledgeBase).mode === 'external')
+				await (resources as KBResources).applyExternalKB(cr as ExternalKBCR);
+			else await (resources as KBResources).applyManagedKB(cr as ManagedKBCR);
+		} else if (resourceType === 'documents') {
+			await (resources as DocumentResources).applyDocument(cr as DocumentCR);
+		} else if (resourceType === 'agents') {
+			await (resources as AgentResources).applyAgent(cr as AgentCR);
+		}
+	}
+	return json(updated);
+};
+
+const DELETE: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { id, resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const items = await catalog.list();
+	const item = items.find((r) => r.id === id);
+	if (!item)
+		return json({ code: 'NOT_FOUND', message: `${resourceType} not found` }, { status: 404 });
+	await catalog.delete(id);
+	const resources = server.resources.getWorkspaceResources(workspace.id)[resourceType];
+	if (resourceType === 'models') {
+		if ((item as Model).mode === 'external')
+			await (resources as ModelResources).deleteExternalModel(id);
+		else await (resources as ModelResources).deleteManagedModel(id);
+	} else if (resourceType === 'tools') {
+		if ((item as Tool).mode === 'external')
+			await (resources as ToolResources).deleteExternalTool(id);
+		else await (resources as ToolResources).deleteManagedTool(id);
+	} else if (resourceType === 'kbs') {
+		if ((item as KnowledgeBase).mode === 'external')
+			await (resources as KBResources).deleteExternalKB(id);
+		else await (resources as KBResources).deleteManagedKB(id);
+	} else if (resourceType === 'documents') {
+		await (resources as DocumentResources).deleteDocument(id);
+	} else if (resourceType === 'agents') {
+		await (resources as AgentResources).deleteAgent(id);
+	}
+	return new Response(null, { status: 204 });
+};
+
+export { DELETE, GET, PUT };

+ 15 - 0
src/routes/api/workspaces/[workspaceId]/[resource=resource]/[id]/changes/+server.ts

@@ -0,0 +1,15 @@
+import { json } from '@sveltejs/kit';
+
+import { server } from '$lib/server';
+
+import type { RequestHandler } from './$types';
+
+const GET: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const changes = await catalog.listChanges(params.id);
+	return json(changes);
+};
+
+export { GET };

+ 33 - 0
src/routes/api/workspaces/[workspaceId]/[resource=resource]/[id]/resources/+server.ts

@@ -0,0 +1,33 @@
+import { error, json } from '@sveltejs/kit';
+
+import { server } from '$lib/server';
+import type { AgentResources } from '$lib/server/resources/agents';
+import type { DocumentResources } from '$lib/server/resources/documents';
+import type { KBResources } from '$lib/server/resources/kbs';
+import type { ModelResources } from '$lib/server/resources/models';
+import type { ToolResources } from '$lib/server/resources/tools';
+import type { CoreResources } from '$lib/types/workspace';
+
+import type { RequestHandler } from './$types';
+
+const GET: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { id, resource: resourceType } = params;
+	const resources = server.resources.getWorkspaceResources(workspace.id)[resourceType];
+	let childResources: CoreResources | undefined;
+	if (resourceType === 'models') {
+		childResources = await (resources as ModelResources).getManagedModelResources(id);
+	} else if (resourceType === 'tools') {
+		childResources = await (resources as ToolResources).getManagedToolResources(id);
+	} else if (resourceType === 'kbs') {
+		childResources = await (resources as KBResources).getManagedKBResources(id);
+	} else if (resourceType === 'documents') {
+		childResources = await (resources as DocumentResources).getDocumentResources(id);
+	} else if (resourceType === 'agents') {
+		childResources = await (resources as AgentResources).getAgentResources(id);
+	}
+	if (childResources === undefined) error(404);
+	return json(childResources);
+};
+
+export { GET };

+ 54 - 0
src/routes/api/workspaces/[workspaceId]/[resource=resource]/[id]/status/+server.ts

@@ -0,0 +1,54 @@
+import { error, json } from '@sveltejs/kit';
+
+import { server } from '$lib/server';
+import type { AgentResources } from '$lib/server/resources/agents';
+import type { DocumentResources } from '$lib/server/resources/documents';
+import type { KBResources } from '$lib/server/resources/kbs';
+import type { ModelResources } from '$lib/server/resources/models';
+import type { StackResources } from '$lib/server/resources/stacks/types';
+import type { ToolResources } from '$lib/server/resources/tools';
+import type { KnowledgeBase, Model, Tool } from '$lib/types/entities';
+
+import type { RequestHandler } from './$types';
+
+const GET: RequestHandler = async ({ locals, params }) => {
+	const workspace = locals.workspace!;
+	const { id, resource: resourceType } = params;
+	const catalog = server.catalog.getWorkspaceCatalog(workspace.id)[resourceType];
+	const items = await catalog.list();
+	const item = items.find((r) => r.id === params.id);
+	if (!item) {
+		return json({ code: 'NOT_FOUND', message: `${resourceType} not found` }, { status: 404 });
+	}
+	const resources = server.resources.getWorkspaceResources(workspace.id)[resourceType];
+	let status: unknown;
+	if (resourceType === 'models') {
+		if ((item as Model).mode === 'external') {
+			status = await (resources as ModelResources).getExternalModelStatus(id);
+		} else {
+			status = await (resources as ModelResources).getManagedModelStatus(id);
+		}
+	} else if (resourceType === 'tools') {
+		if ((item as Tool).mode === 'external') {
+			status = await (resources as ToolResources).getExternalToolStatus(id);
+		} else {
+			status = await (resources as ToolResources).getManagedToolStatus(id);
+		}
+	} else if (resourceType === 'kbs') {
+		if ((item as KnowledgeBase).mode === 'external') {
+			// status = await (resources as KBResources).getExternalKBStatus(id);
+		} else {
+			status = await (resources as KBResources).getManagedKBStatus(id);
+		}
+	} else if (resourceType === 'documents') {
+		status = await (resources as DocumentResources).getDocumentStatus(id);
+	} else if (resourceType === 'agents') {
+		status = await (resources as AgentResources).getAgentStatus(id);
+	} else if (resourceType === 'stacks') {
+		status = await (resources as StackResources).getStackStatus(id);
+	}
+	if (status === undefined) error(404);
+	return json(status);
+};
+
+export { GET };