Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions ide/base/server/src/lsp/dataset/service.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
import { DataSets } from '@blockception/ide-shared';
import { DataSetService } from './service';
import { WorkspaceProjectDataCollections } from '../language-model-tools/service';

const emptyCollection: { forEach(callbackfn: (item: { id?: string }) => void): void } = {
forEach(): void {
// no-op
},
};

function createProjectData(): WorkspaceProjectDataCollections {
return {
behaviorPacks: {
entities: emptyCollection,
items: emptyCollection,
blocks: emptyCollection,
biomes: emptyCollection,
features: emptyCollection,
featuresRules: emptyCollection,
functions: emptyCollection,
lootTables: emptyCollection,
recipes: emptyCollection,
trading: emptyCollection,
structures: emptyCollection,
animations: emptyCollection,
animationControllers: emptyCollection,
customCommands: emptyCollection,
itemGroups: emptyCollection,
},
resourcePacks: {
entities: emptyCollection,
animations: emptyCollection,
animationControllers: emptyCollection,
attachables: emptyCollection,
blockCullingRules: emptyCollection,
fogs: emptyCollection,
materials: emptyCollection,
models: emptyCollection,
particles: emptyCollection,
renderControllers: emptyCollection,
sounds: emptyCollection,
textures: emptyCollection,
itemTextures: emptyCollection,
terrainTextures: emptyCollection,
uiElements: emptyCollection,
},
general: {
fakeEntities: emptyCollection,
objectives: emptyCollection,
structures: emptyCollection,
tags: emptyCollection,
tickingAreas: emptyCollection,
},
};
}

function createService(projectData: WorkspaceProjectDataCollections): DataSetService {
const logger = {
withPrefix: () => logger,
debug: () => undefined,
};

const extension = {
database: {
ProjectData: projectData,
},
};

return new DataSetService(logger as never, extension as never);
}

describe('dataset service MCP endpoints', () => {
it('returns workspace entities for MCP project endpoint', () => {
const projectData = createProjectData();
projectData.behaviorPacks.entities = [{ id: 'example:zombie' }, { id: 'example:bee' }];
projectData.resourcePacks.entities = [{ id: 'example:bee' }, { id: 'example:creeper' }];

const service = createService(projectData);
const result = (service as never as { onDataSetRequest: (params: { datatype: string }) => unknown }).onDataSetRequest({
datatype: DataSets.MCP.Project.Entities,
});

expect(result).toEqual([
{ id: 'example:bee', source: 'behaviorPack', type: 'entities' },
{ id: 'example:bee', source: 'resourcePack', type: 'entities' },
{ id: 'example:creeper', source: 'resourcePack', type: 'entities' },
{ id: 'example:zombie', source: 'behaviorPack', type: 'entities' },
]);
});

it('supports id filtering for MCP project blocks endpoint', () => {
const projectData = createProjectData();
projectData.behaviorPacks.blocks = [{ id: 'example:stone' }, { id: 'example:wood' }];

const service = createService(projectData);
const result = (
service as never as { onDataSetRequest: (params: { datatype: string; id?: string }) => unknown }
).onDataSetRequest({
datatype: DataSets.MCP.Project.Blocks,
id: 'example:wood',
});

expect(result).toEqual([{ id: 'example:wood', source: 'behaviorPack', type: 'blocks' }]);
});

it('returns vanilla command ids for MCP commands endpoint', () => {
const service = createService(createProjectData());
const result = (
service as never as { onDataSetRequest: (params: { datatype: string; id?: string }) => unknown }
).onDataSetRequest({
datatype: DataSets.MCP.Vanilla.Commands,
});

expect(Array.isArray(result)).toBe(true);
expect(result).toContain('say');
});
});
14 changes: 12 additions & 2 deletions ide/base/server/src/lsp/dataset/service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { DataSets, RequestTypes } from '@blockception/ide-shared';
import { CommandData } from 'bc-minecraft-bedrock-command';
import { MinecraftData } from 'bc-minecraft-bedrock-vanilla-data';
import { Connection } from 'vscode-languageserver';
import { ExtensionContext } from '../extension';
import { getWorkspaceResourceSummaries, WorkspaceProjectDataCollections } from '../language-model-tools/service';
import { IExtendedLogger } from '../logger/logger';
import { BaseService } from '../services/base';
import { IService } from '../services/service';
Expand Down Expand Up @@ -32,7 +34,7 @@ export class DataSetService extends BaseService implements IService {

private onDataSetRequest(params: DataSetRequestParams): unknown {
this.logger.debug('dataset request', params);
const data = getDataSet(params.datatype);
const data = getDataSet(params.datatype, this.extension.database.ProjectData as WorkspaceProjectDataCollections);

if (params.id === undefined || data === undefined) return data;
return filterDataSet(data, params.id);
Expand All @@ -59,8 +61,16 @@ function filterDataSet(data: unknown, id: string): unknown {
* Returns the dataset for the given datatype identifier, or undefined if not found.
* @param datatype The dataset type identifier (e.g. 'vanilla/behavior_pack/blocks')
*/
function getDataSet(datatype: string): unknown {
function getDataSet(datatype: string, projectData?: WorkspaceProjectDataCollections): unknown {
switch (datatype) {
// MCP Endpoints
case DataSets.MCP.Project.Entities:
return projectData ? getWorkspaceResourceSummaries(projectData, 'entities') : undefined;
case DataSets.MCP.Project.Blocks:
return projectData ? getWorkspaceResourceSummaries(projectData, 'blocks') : undefined;
case DataSets.MCP.Vanilla.Commands:
return CommandData.VanillaCommands;

// Vanilla Behavior Pack
case DataSets.Vanilla.BehaviorPack.Biomes:
return MinecraftData.vanilla.BehaviorPack.biomes;
Expand Down
17 changes: 17 additions & 0 deletions ide/shared/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,23 @@ export interface WorkspaceResourceSummary {

/** Dataset identifiers for use with RequestTypes.DataSet */
export namespace DataSets {
/** MCP-compatible dataset endpoints */
export namespace MCP {
/** Project-scoped datasets */
export namespace Project {
/** Workspace project entities */
export const Entities: string = 'bedrock://project/entities';
/** Workspace project blocks */
export const Blocks: string = 'bedrock://project/blocks';
}

/** Vanilla scoped datasets */
export namespace Vanilla {
/** Vanilla command identifiers */
export const Commands: string = 'bedrock://vanilla/commands';
}
}

/** Vanilla behavior pack datasets */
export namespace Vanilla {
/** Vanilla behavior pack datasets */
Expand Down