2091 extensibility twenty sdk add command twenty app function logs and twenty app function test (#17278)

add `function:logs` and `function:execute` cli commands
This commit is contained in:
martmull
2026-01-20 15:10:01 +01:00
committed by GitHub
parent f9c400cd78
commit 801878cb2b
18 changed files with 400 additions and 35 deletions
@@ -237,6 +237,135 @@ export class ApiService {
}
}
async findServerlessFunctions(): Promise<
ApiResponse<
Array<{
id: string;
name: string;
universalIdentifier: string;
applicationId: string | null;
}>
>
> {
try {
const query = `
query FindManyServerlessFunctions {
findManyServerlessFunctions {
id
name
universalIdentifier
applicationId
}
}
`;
const response = await this.client.post(
'/metadata',
{ query },
{
headers: {
'Content-Type': 'application/json',
Accept: '*/*',
},
},
);
if (response.data.errors) {
return {
success: false,
error: response.data.errors[0]?.message || 'Failed to fetch functions',
};
}
return {
success: true,
data: response.data.data.findManyServerlessFunctions,
};
} catch (error) {
return {
success: false,
error,
};
}
}
async executeServerlessFunction({
functionId,
payload,
version = 'latest',
}: {
functionId: string;
payload: Record<string, unknown>;
version?: string;
}): Promise<
ApiResponse<{
data: unknown;
logs: string;
duration: number;
status: string;
error?: {
errorType: string;
errorMessage: string;
stackTrace: string;
};
}>
> {
try {
const mutation = `
mutation ExecuteOneServerlessFunction($input: ExecuteServerlessFunctionInput!) {
executeOneServerlessFunction(input: $input) {
data
logs
duration
status
error
}
}
`;
const variables = {
input: {
id: functionId,
payload,
version,
},
};
const response = await this.client.post(
'/metadata',
{
query: mutation,
variables,
},
{
headers: {
'Content-Type': 'application/json',
Accept: '*/*',
},
},
);
if (response.data.errors) {
return {
success: false,
error:
response.data.errors[0]?.message ||
'Failed to execute serverless function',
};
}
return {
success: true,
data: response.data.data.executeOneServerlessFunction,
};
} catch (error) {
return {
success: false,
error,
};
}
}
async subscribeToLogs({
applicationUniversalIdentifier,
functionUniversalIdentifier,