diff --git a/README.md b/README.md index 2dc49f6..392194b 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ This is an experimental project intended to demonstrate JFrog's capabilities wit - **Artifact Search**: Execute powerful AQL queries to search for artifacts and builds - **Catalog and Curation**: Access package information, versions, vulnerabilities, and check curation status - **Xray**: Access scan artifacts summary, group by severity per artifact +- **Workers**: Access all workers ## Tools diff --git a/schemas/workers.ts b/schemas/workers.ts new file mode 100644 index 0000000..8f4d7bb --- /dev/null +++ b/schemas/workers.ts @@ -0,0 +1,35 @@ +import { z } from "zod"; + +export const JFrogWorkerReadinessSchema = z.object({ + code: z.string(), +}); + +export const WorkersList = z.object({ + workers: z.array( + z.object({ + key: z.string(), + application: z.string(), + description: z.string(), + enabled: z.boolean(), + sourceCode: z.string(), + action: z.string(), + filterCriteria: z + .object({ + artifactFilterCriteria: z.object({ + repoKeys: z.array(z.string()), + }), + }) + .optional(), + secrets: z.array(z.any()).optional(), + shared: z.boolean(), + debug: z.boolean(), + projectKey: z.string().optional(), + currentVersion: z + .object({ + modifiedAt: z.number(), + modifiedBy: z.string(), + }) + .optional(), + }) + ), +}); diff --git a/tools/index.ts b/tools/index.ts index c0a662a..95d48e4 100644 --- a/tools/index.ts +++ b/tools/index.ts @@ -9,6 +9,7 @@ import { CatalogTools } from "./catalog.js"; import { CurationTools } from "./curation.js"; import { PermissionsTools } from "./permissions.js"; import { ArtifactSecurityTools } from "./security.js"; +import { WorkerTools } from "./worker.js"; export const tools =[ ...RepositoryTools, @@ -20,6 +21,7 @@ export const tools =[ ...CurationTools, ...PermissionsTools, ...ArtifactSecurityTools, + ...WorkerTools ]; // A function that given a tool name, executes the handler with the arguments and returns the result diff --git a/tools/worker.ts b/tools/worker.ts new file mode 100644 index 0000000..f1b38fa --- /dev/null +++ b/tools/worker.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; +import { zodToJsonSchema } from "zod-to-json-schema"; +import { jfrogRequest } from "../common/utils.js"; +import { JFrogWorkerReadinessSchema } from "../schemas/workers.js"; +import { WorkersList } from "../schemas/workers.js"; + +async function fetchWorkersList() { + const response = await jfrogRequest("/worker/api/v1/workers", { + method: "GET", + }); + + return WorkersList.parse(response); +} + +async function checkWorkerReadiness() { + const response = await jfrogRequest("/worker/api/v1/system/liveness", { + method: "GET", + }); + + return JFrogWorkerReadinessSchema.parse(response); +} + +const getWorkerLiveliness = { + name: "jfrog_get_worker_liveliness", + description: "Useful for checking the liveliness of a worker status. Returns OK when the worker is alive.", + inputSchema: zodToJsonSchema(z.object({})), + outputSchema: zodToJsonSchema(JFrogWorkerReadinessSchema), + handler: async () => { + return await checkWorkerReadiness(); + } +}; + +const getWorkerList = { + name: "jfrog_get_worker_list", + description: "Useful for getting the list of workers.", + inputSchema: zodToJsonSchema(z.object({})), + outputSchema: zodToJsonSchema(WorkersList), + handler: async () => { + return await fetchWorkersList(); + } +}; + +export const WorkerTools = [ + getWorkerLiveliness, + getWorkerList +]; \ No newline at end of file