Skip to content

Commit 08339fb

Browse files
committed
refactor(server): simplify shared state and css payload
1 parent d74cd48 commit 08339fb

File tree

6 files changed

+33
-30
lines changed

6 files changed

+33
-30
lines changed

packages/server/src/__tests__/factories/shared-state-factory.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { RawPointedDOMElement, PointerMessageType } from '@mcp-pointer/shared/types';
22
import {
3-
SharedState, StateDataV2, ProcessedPointedDOMElement,
3+
SharedState, SharedStateData, ProcessedPointedDOMElement,
44
} from '../../types';
55

66
export const createProcessedElement = (
@@ -39,17 +39,16 @@ export const createRawElement = (
3939
...overrides,
4040
});
4141

42-
export const createStateV2 = (
42+
export const createSharedState = (
4343
rawOverrides: Partial<RawPointedDOMElement> = {},
4444
processedOverrides: Partial<ProcessedPointedDOMElement> = {},
4545
): SharedState => ({
46-
stateVersion: 2,
4746
data: {
4847
rawPointedDOMElement: createRawElement(rawOverrides),
4948
processedPointedDOMElement: createProcessedElement(processedOverrides),
5049
metadata: {
5150
receivedAt: '2023-01-01T00:00:00.000Z',
5251
messageType: PointerMessageType.DOM_ELEMENT_POINTED,
5352
},
54-
} as StateDataV2,
53+
} as SharedStateData,
5554
});

packages/server/src/__tests__/services/shared-state-service.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import fs from 'fs/promises';
22
import path from 'path';
33
import os from 'os';
44
import SharedStateService from '../../services/shared-state-service';
5-
import { createStateV2 } from '../factories/shared-state-factory';
5+
import { createSharedState } from '../factories/shared-state-factory';
66

77
jest.mock('../../logger', () => ({
88
debug: jest.fn(),
@@ -29,32 +29,30 @@ describe('SharedStateService', () => {
2929

3030
describe('saveState', () => {
3131
it('writes state to file', async () => {
32-
const state = createStateV2();
32+
const state = createSharedState();
3333

3434
await service.saveState(state);
3535

3636
const content = await fs.readFile(testPath, 'utf8');
3737
const parsed = JSON.parse(content);
38-
expect(parsed.stateVersion).toBe(state.stateVersion);
3938
expect(parsed.data.processedPointedDOMElement).toEqual(state.data.processedPointedDOMElement);
4039
});
4140

4241
it('overwrites corrupted file', async () => {
4342
await fs.writeFile(testPath, 'invalid json');
44-
const state = createStateV2();
43+
const state = createSharedState();
4544

4645
await service.saveState(state);
4746

4847
const content = await fs.readFile(testPath, 'utf8');
4948
const parsed = JSON.parse(content);
50-
expect(parsed.stateVersion).toBe(state.stateVersion);
5149
expect(parsed.data.processedPointedDOMElement).toEqual(state.data.processedPointedDOMElement);
5250
});
5351
});
5452

5553
describe('getPointedElement', () => {
5654
it('returns processed element from state', async () => {
57-
const state = createStateV2();
55+
const state = createSharedState();
5856
await fs.writeFile(testPath, JSON.stringify(state));
5957

6058
const result = await service.getPointedElement();

packages/server/src/message-handler.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { PointerMessageType, type RawPointedDOMElement } from '@mcp-pointer/shar
22
import logger from './logger';
33
import ElementProcessor from './services/element-processor';
44
import SharedStateService from './services/shared-state-service';
5-
import { SharedState, StateDataV2 } from './types';
5+
import { SharedState, SharedStateData } from './types';
66

77
function buildMetadata(messageType: string) {
88
const now = new Date().toISOString();
@@ -22,14 +22,13 @@ function buildState(
2222
const raw = data as RawPointedDOMElement;
2323
const processed = elementProcessor.processFromRaw(raw);
2424

25-
const stateData: StateDataV2 = {
25+
const stateData: SharedStateData = {
2626
rawPointedDOMElement: raw,
2727
processedPointedDOMElement: processed,
2828
metadata: buildMetadata(type),
2929
};
3030

3131
return {
32-
stateVersion: 2,
3332
data: stateData,
3433
};
3534
}

packages/server/src/services/element-processor.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Simple safe getter function (replaces lodash.get)
22
import {
3-
RawPointedDOMElement, ElementPosition, CSSProperties, ComponentInfo,
3+
RawPointedDOMElement, ElementPosition, ComponentInfo,
44
} from '@mcp-pointer/shared/types';
55
import { ProcessedPointedDOMElement } from '../types';
66
import { extractFromHTML, generateSelector } from '../utils/dom-extractor';
@@ -33,7 +33,6 @@ export default class ElementProcessor {
3333
url: raw.url,
3434
timestamp: new Date(raw.timestamp).toISOString(),
3535

36-
cssProperties: this.getRelevantStyles(raw.computedStyles),
3736
cssComputed: raw.computedStyles ? { ...raw.computedStyles } : undefined,
3837
componentInfo: this.getComponentInfo(raw.reactFiber),
3938

@@ -64,12 +63,6 @@ export default class ElementProcessor {
6463
};
6564
}
6665

67-
private getRelevantStyles(styles?: Record<string, string>): CSSProperties | undefined {
68-
if (!styles) return undefined;
69-
70-
return { ...styles };
71-
}
72-
7366
private getComponentInfo(reactFiber?: any): ComponentInfo | undefined {
7467
if (!reactFiber) return undefined;
7568

packages/server/src/services/mcp-service.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { CSS_DETAIL_OPTIONS, TEXT_DETAIL_OPTIONS } from '@mcp-pointer/shared/det
99
import SharedStateService from './shared-state-service';
1010
import {
1111
normalizeDetailParameters,
12-
shapeElementForDetail,
12+
serializeElement,
1313
type DetailParameters,
1414
type NormalizedDetailParameters,
1515
} from '../utils/element-detail';
@@ -54,14 +54,14 @@ export default class MCPService {
5454
tools: [
5555
{
5656
name: MCPToolName.GET_POINTED_ELEMENT,
57-
description: 'Get information about the currently pointed/shown DOM element. Control returned payload size with optional textDetail (full|visible|none) and cssLevel (0-3).',
57+
description: 'Get information about the currently pointed/shown DOM element. Control returned payload size with optional textDetail (0 none | 1 visible | 2 full) and cssLevel (0-3).',
5858
inputSchema: {
5959
type: 'object',
6060
properties: {
6161
textDetail: {
62-
type: 'string',
62+
type: 'integer',
6363
enum: [...TEXT_DETAIL_OPTIONS],
64-
description: 'Controls how much text is returned. full (default) includes hidden text fallback, visible uses only rendered text, none omits text fields.',
64+
description: 'Controls how much text is returned. 2 (default) includes hidden text fallback, 1 uses only rendered text, 0 omits text fields.',
6565
},
6666
cssLevel: {
6767
type: 'integer',
@@ -102,7 +102,7 @@ export default class MCPService {
102102
};
103103
}
104104

105-
const shapedElement = shapeElementForDetail(
105+
const shapedElement = serializeElement(
106106
processedElement,
107107
details.textDetail,
108108
details.cssLevel,

packages/server/src/types.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export interface ProcessedPointedDOMElement {
2121
timestamp: string; // ISO format
2222

2323
// Full CSS data for shaping
24-
cssProperties?: CSSProperties;
2524
cssComputed?: Record<string, string>; // Full computed styles
2625
componentInfo?: ComponentInfo;
2726

@@ -32,8 +31,24 @@ export interface ProcessedPointedDOMElement {
3231
warnings?: string[];
3332
}
3433

34+
export interface SerializedDOMElement {
35+
selector: string;
36+
tagName: string;
37+
id?: string;
38+
classes: string[];
39+
attributes: Record<string, string>;
40+
position: ElementPosition;
41+
url: string;
42+
timestamp: string;
43+
innerText: string;
44+
textContent?: string;
45+
cssProperties?: CSSProperties;
46+
componentInfo?: ComponentInfo;
47+
warnings?: string[];
48+
}
49+
3550
// State data structure
36-
export interface StateDataV2 {
51+
export interface SharedStateData {
3752
rawPointedDOMElement: RawPointedDOMElement;
3853
processedPointedDOMElement: ProcessedPointedDOMElement;
3954
metadata: {
@@ -44,6 +59,5 @@ export interface StateDataV2 {
4459

4560
// Storage format
4661
export interface SharedState {
47-
stateVersion: 2;
48-
data: StateDataV2;
62+
data: SharedStateData;
4963
}

0 commit comments

Comments
 (0)