feat(agents): add nodes notifications_list action

This commit is contained in:
Ayaan Zaidi
2026-02-26 14:02:51 +05:30
committed by Ayaan Zaidi
parent e6a5d5784c
commit c0073b3d47
2 changed files with 49 additions and 1 deletions

View File

@@ -138,6 +138,42 @@ describe("nodes camera_snap", () => {
});
});
describe("nodes notifications_list", () => {
it("invokes notifications.list and returns payload", async () => {
callGateway.mockImplementation(async ({ method, params }) => {
if (method === "node.list") {
return mockNodeList(["notifications.list"]);
}
if (method === "node.invoke") {
expect(params).toMatchObject({
nodeId: NODE_ID,
command: "notifications.list",
params: {},
});
return {
payload: {
enabled: true,
connected: true,
count: 1,
notifications: [{ key: "n1", packageName: "com.example.app" }],
},
};
}
return unexpectedGatewayMethod(method);
});
const result = await executeNodes({
action: "notifications_list",
node: NODE_ID,
});
expect(result.content?.[0]).toMatchObject({
type: "text",
text: expect.stringContaining('"notifications"'),
});
});
});
describe("nodes run", () => {
it("passes invoke and command timeouts", async () => {
callGateway.mockImplementation(async ({ method, params }) => {

View File

@@ -40,6 +40,7 @@ const NODES_TOOL_ACTIONS = [
"camera_clip",
"screen_record",
"location_get",
"notifications_list",
"run",
"invoke",
] as const;
@@ -122,7 +123,7 @@ export function createNodesTool(options?: {
label: "Nodes",
name: "nodes",
description:
"Discover and control paired nodes (status/describe/pairing/notify/camera/screen/location/run/invoke).",
"Discover and control paired nodes (status/describe/pairing/notify/camera/screen/location/notifications/run/invoke).",
parameters: NodesToolSchema,
execute: async (_toolCallId, args) => {
const params = args as Record<string, unknown>;
@@ -406,6 +407,17 @@ export function createNodesTool(options?: {
});
return jsonResult(raw?.payload ?? {});
}
case "notifications_list": {
const node = readStringParam(params, "node", { required: true });
const nodeId = await resolveNodeId(gatewayOpts, node);
const raw = await callGatewayTool<{ payload: unknown }>("node.invoke", gatewayOpts, {
nodeId,
command: "notifications.list",
params: {},
idempotencyKey: crypto.randomUUID(),
});
return jsonResult(raw?.payload ?? {});
}
case "run": {
const node = readStringParam(params, "node", { required: true });
const nodes = await listNodes(gatewayOpts);