Skip to content

Commit dc0b535

Browse files
committed
feat(ai): Implement State Provider Inspection & Modification (#8187)
- ComponentService: Include stateProviderId in component tree (own provider only) - DataService: Add inspectStateProvider and modifyStateProvider (client & server) - Expose new tools via MCP and update OpenAPI spec
1 parent 6bad751 commit dc0b535

6 files changed

Lines changed: 143 additions & 0 deletions

File tree

ai/mcp/server/neural-link/openapi.yaml

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,64 @@ paths:
319319
schema:
320320
type: object
321321

322+
/data/state/inspect:
323+
post:
324+
summary: Inspect State Provider
325+
operationId: inspect_state_provider
326+
x-pass-as-object: true
327+
description: |
328+
Inspects a specific state provider.
329+
330+
**When to Use:**
331+
To view the hierarchical data of a StateProvider.
332+
tags: [Data]
333+
requestBody:
334+
required: true
335+
content:
336+
application/json:
337+
schema:
338+
$ref: '#/components/schemas/InspectStateProviderRequest'
339+
responses:
340+
'200':
341+
description: State provider data
342+
content:
343+
application/json:
344+
schema:
345+
type: object
346+
properties:
347+
id:
348+
type: string
349+
data:
350+
type: object
351+
352+
/data/state/modify:
353+
post:
354+
summary: Modify State Provider
355+
operationId: modify_state_provider
356+
x-pass-as-object: true
357+
description: |
358+
Modifies the data of a specific state provider.
359+
360+
**When to Use:**
361+
To update application state stored in a StateProvider.
362+
tags: [Data]
363+
requestBody:
364+
required: true
365+
content:
366+
application/json:
367+
schema:
368+
$ref: '#/components/schemas/ModifyStateProviderRequest'
369+
responses:
370+
'200':
371+
description: Modification successful
372+
content:
373+
application/json:
374+
schema:
375+
type: object
376+
properties:
377+
success:
378+
type: boolean
379+
322380
/drag/state:
323381
post:
324382
summary: Get Drag State
@@ -830,6 +888,34 @@ components:
830888
type: string
831889
description: The target App Worker Session ID
832890

891+
InspectStateProviderRequest:
892+
type: object
893+
required:
894+
- providerId
895+
properties:
896+
providerId:
897+
type: string
898+
description: The ID of the state provider to inspect
899+
sessionId:
900+
type: string
901+
description: The target App Worker Session ID
902+
903+
ModifyStateProviderRequest:
904+
type: object
905+
required:
906+
- providerId
907+
- data
908+
properties:
909+
providerId:
910+
type: string
911+
description: The ID of the state provider to modify
912+
data:
913+
type: object
914+
description: The data object to merge into the provider
915+
sessionId:
916+
type: string
917+
description: The target App Worker Session ID
918+
833919
ErrorResponse:
834920
type: object
835921
properties:

ai/mcp/server/neural-link/services/DataService.mjs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ class DataService extends Base {
2525
singleton: true
2626
}
2727

28+
/**
29+
* Inspects a specific state provider.
30+
* @param {Object} opts The options object.
31+
* @param {String} opts.providerId The ID of the provider to inspect.
32+
* @param {String} [opts.sessionId] The target session ID.
33+
* @returns {Promise<Object>} The state data.
34+
*/
35+
async inspectStateProvider({providerId, sessionId}) {
36+
return await ConnectionService.call(sessionId, 'inspect_state_provider', {providerId});
37+
}
38+
2839
/**
2940
* Inspects a specific data store.
3041
* @param {Object} opts The options object.
@@ -57,6 +68,18 @@ class DataService extends Base {
5768
async getRecord({recordId, storeId, sessionId}) {
5869
return await ConnectionService.call(sessionId, 'get_record', {recordId, storeId});
5970
}
71+
72+
/**
73+
* Modifies the data of a specific state provider.
74+
* @param {Object} opts The options object.
75+
* @param {String} opts.providerId The ID of the provider to modify.
76+
* @param {Object} opts.data The data object to merge into the provider.
77+
* @param {String} [opts.sessionId] The target session ID.
78+
* @returns {Promise<void>}
79+
*/
80+
async modifyStateProvider({data, providerId, sessionId}) {
81+
return await ConnectionService.call(sessionId, 'modify_state_provider', {data, providerId});
82+
}
6083
}
6184

6285
export default Neo.setupClass(DataService);

ai/mcp/server/neural-link/services/toolService.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ const serviceMapping = {
2424
get_window_topology : RuntimeService .getWindowTopology .bind(RuntimeService),
2525
get_worker_topology : RuntimeService .getWorkerTopology .bind(RuntimeService),
2626
healthcheck : HealthService .healthcheck .bind(HealthService),
27+
inspect_state_provider: DataService .inspectStateProvider.bind(DataService),
2728
inspect_store : DataService .inspectStore .bind(DataService),
2829
list_stores : DataService .listStores .bind(DataService),
30+
modify_state_provider : DataService .modifyStateProvider .bind(DataService),
2931
query_component : ComponentService .queryComponent .bind(ComponentService),
3032
reload_page : RuntimeService .reloadPage .bind(RuntimeService),
3133
set_component_property: ComponentService .setComponentProperty.bind(ComponentService),

src/ai/Client.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ class Client extends Base {
8282
set_component : me.services.component,
8383

8484
get_record : me.services.data,
85+
inspect_state_provider: me.services.data,
8586
inspect_store : me.services.data,
8687
list_stores : me.services.data,
88+
modify_state_provider: me.services.data,
8789

8890
get_drag : me.services.runtime,
8991
get_route : me.services.runtime,

src/ai/client/ComponentService.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ class ComponentService extends Service {
150150
ntype : component.ntype
151151
};
152152

153+
if (component.stateProvider) {
154+
result.stateProviderId = component.stateProvider.id
155+
}
156+
153157
if (maxDepth === -1 || currentDepth < maxDepth) {
154158
const children = Neo.manager.Component.getChildren(component);
155159

src/ai/client/DataService.mjs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ class DataService extends Service {
4646
return record.toJSON();
4747
}
4848

49+
/**
50+
* @param {Object} params
51+
* @returns {Object}
52+
*/
53+
inspectStateProvider(params) {
54+
const provider = Neo.get(params.providerId);
55+
if (!provider) throw new Error(`StateProvider not found: ${params.providerId}`);
56+
57+
return {
58+
id : provider.id,
59+
data: provider.getHierarchyData()
60+
}
61+
}
62+
4963
/**
5064
* @param {Object} params
5165
* @returns {Object}
@@ -88,6 +102,18 @@ class DataService extends Service {
88102
}))
89103
};
90104
}
105+
106+
/**
107+
* @param {Object} params
108+
* @returns {Object}
109+
*/
110+
modifyStateProvider(params) {
111+
const provider = Neo.get(params.providerId);
112+
if (!provider) throw new Error(`StateProvider not found: ${params.providerId}`);
113+
114+
provider.setData(params.data);
115+
return {success: true}
116+
}
91117
}
92118

93119
export default Neo.setupClass(DataService);

0 commit comments

Comments
 (0)