From 03cc0d659f0776b39bb2812323d9679e5b80c2d9 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 12 Nov 2025 12:38:52 -0500 Subject: [PATCH 01/52] squash: starting --- .../src/service/api/v2.ts | 35 ++ .../src/service/router.ts | 68 +++ .../src/generated/.METADATA.sha1 | 2 +- .../src/generated/api/definition.ts | 2 +- .../src/generated/client/api.ts | 73 +++ .../docs/api-doc/orchestrator-api.yaml | 32 ++ .../src/generated/docs/html/index.html | 457 ++++++++++++++++++ .../docs/markdown/Apis/DefaultApi.md | 29 ++ .../src/generated/docs/markdown/README.md | 1 + .../src/openapi/openapi.yaml | 32 ++ 10 files changed, 729 insertions(+), 2 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts index 9793cf76ee..7e1bee1d62 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts @@ -180,6 +180,41 @@ export class V2 { return mapToProcessInstanceDTO(instance); } + public async getInstanceLogsById(instance: ProcessInstanceDTO): Promise { + // Fetch the logs, probably add something to that orchestrator service object? OR maybe a logViewerService object instead + // We are not querying actual orchestrator since the logs don't live there + // Query will be against the log provider, like Loki for example + // logViewerService is probably going to be the new class/interface that other providers can implement in the future + const baseURL = 'http://localhost:3100/loki/api/v1/query_range'; + const params = new URLSearchParams({ + query: `{service_name=~".+"} |="${instance.id}"`, + start: instance.start as string, + end: instance.end || '', + }); + + const urlToFetch = `${baseURL}?${params.toString()}`; + + const response = await fetch(urlToFetch); + + let allResults; + if (response.status !== 200) { + console.log('ERror', response.statusText, response); + } else { + const jsonResponse = await response.json(); + // Reduce the results into another array + allResults = jsonResponse.data.result.reduce( + (acc: any[], curr: { values: any[] }) => { + curr.values.reduce((_innerAcc: any, innerCurr: any) => { + acc.push(innerCurr); + }, acc); + return acc; + }, + [], + ); + } + return allResults; + } + public async executeWorkflow( executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO, workflowId: string, diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index eac669444e..51ab354726 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -944,6 +944,74 @@ function setupInternalRoutes( }, ); + // v2 + routerApi.openApiBackend.register( + 'getWorkflowLogById', + async (c, request: express.Request, res: express.Response, next) => { + const instanceId = c.request.params.instanceId as string; + // TODO: will probably have to get the raw log at some point + // const rawLog = c.request.query.instanceId as Boolean; + + const auditEvent = await auditor.createEvent({ + eventId: 'get-logs-by-instance', + request, + meta: { + actionType: 'by-id', + instanceId, + }, + }); + + try { + const instance = await routerApi.v2.getInstanceById(instanceId); + const workflowId = instance.processId; + + const decision = await authorize( + request, + [ + orchestratorWorkflowPermission, + orchestratorWorkflowSpecificPermission(workflowId), + ], + permissions, + httpAuth, + ); + if (decision.result === AuthorizeResult.DENY) { + manageDenyAuthorization(auditEvent); + } + + const credentials = await httpAuth.credentials(request); + const initiatorEntity = (await userInfo.getUserInfo(credentials)) + .userEntityRef; + // Check if user is authorized to view all instances + const isUserAuthorizedForInstanceAdminView = + await isUserAuthorizedForInstanceAdminViewPermission( + request, + permissions, + httpAuth, + ); + + // If not an admin, enforce initiatorEntity check + if (!isUserAuthorizedForInstanceAdminView) { + const instanceInitiatorEntity = instance.initiatorEntity; + if (instanceInitiatorEntity !== initiatorEntity) { + throw new Error( + `Unauthorized to access instance ${instanceId} not initiated by user.`, + ); + } + } + + // TODO: Using the instanceId, retrieve the log from Loki or some other log provider + const logs = await routerApi.v2.getInstanceLogsById(instance); + console.log(logs); + + auditEvent.success(); + res.status(200).json(instance); + } catch (error) { + auditEvent.fail({ error }); + next(error); + } + }, + ); + // v2 routerApi.openApiBackend.register( 'abortWorkflow', diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 index c362b953f6..56d80a0d0a 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 @@ -1 +1 @@ -512ca47fa107a0c403499906d014ca4269f4d1c1 +73a08e3205a43e0ec0b1eace083477e66a8a4dfa diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts index cd5a5050cd..828735bdc2 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts @@ -1,5 +1,5 @@ /* eslint-disable */ /* prettier-ignore */ // GENERATED FILE DO NOT EDIT. -const OPENAPI = `{"openapi":"3.1.0","info":{"title":"Orchestratorplugin","description":"APItointeractwithorchestratorplugin","license":{"name":"Apache2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"0.0.1"},"servers":[{"url":"/"}],"paths":{"/v2/workflows/overview":{"post":{"operationId":"getWorkflowsOverview","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Paginationandfilters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/overview/entity":{"post":{"operationId":"getWorkflowsOverviewForEntity","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Targetentityreferenceandannotationworkflowids","content":{"application/json":{"schema":{"type":"object","properties":{"targetEntity":{"type":"string"},"annotationWorkflowIds":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviewsforentity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/overview":{"get":{"operationId":"getWorkflowOverviewById","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","parameters":[{"name":"workflowId","in":"path","required":true,"description":"Uniqueidentifieroftheworkflow","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewDTO"}}}},"500":{"description":"Errorfetchingworkflowoverview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/source":{"get":{"operationId":"getWorkflowSourceById","description":"Gettheworkflow'sdefinition","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorfetchingworkflowsourcebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/inputSchema":{"get":{"operationId":"getWorkflowInputSchemaById","description":"Gettheworkflowinputschema.Itdefinestheinputfieldsoftheworkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"query","description":"IDofinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputSchemaResponseDTO"}}}},"500":{"description":"Errorfetchingworkflowinputschemabyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/pingWorkflowService":{"get":{"operationId":"pingWorkflowServiceById","description":"ReturnstrueiftheworkflowserviceisupforthegivenworkflowID.","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"boolean"}}}},"500":{"description":"Errorpingingworkflowservicebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances":{"post":{"operationId":"getInstances","summary":"Getinstances","description":"Retrieveanarrayofworkflowexecutions(instances)","requestBody":{"required":false,"description":"Parametersforretrievinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/instances":{"post":{"operationId":"getWorkflowInstances","summary":"Getinstancesforaspecificworkflow","description":"Retrieveanarrayofworkflowexecutions(instances)forthegivenworkflow","parameters":[{"name":"workflowId","in":"path","required":true,"description":"IDoftheworkflow","schema":{"type":"string"}}],"requestBody":{"required":false,"description":"Parametersforretrievingworkflowinstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}":{"get":{"summary":"GetWorkflowInstancebyID","description":"Getaworkflowexecution/run(instance)","operationId":"getInstanceById","parameters":[{"name":"instanceId","in":"path","required":true,"description":"IDoftheworkflowinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfulresponse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchinginstance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/statuses":{"get":{"operationId":"getWorkflowStatuses","summary":"Getworkflowstatuslist","description":"Retrievearraywiththestatusofallinstances","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowRunStatusDTO"}}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/execute":{"post":{"summary":"Executeaworkflow","description":"Executeaworkflow","operationId":"executeWorkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtoexecute","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowRequestDTO"}}}},"responses":{"200":{"description":"Successfulexecution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowResponseDTO"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/{instanceId}/retrigger":{"post":{"summary":"Retriggeraninstance","description":"Retriggeraninstance","operationId":"retriggerInstance","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflow","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"path","description":"IDoftheinstancetoretrigger","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetriggerInstanceRequestDTO"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/abort":{"delete":{"summary":"Abortaworkflowinstance","operationId":"abortWorkflow","description":"AbortsaworkflowinstanceidentifiedbytheprovidedinstanceId.","parameters":[{"name":"instanceId","in":"path","required":true,"description":"Theidentifieroftheworkflowinstancetoabort.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfuloperation","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorabortingworkflow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ErrorResponse":{"description":"TheErrorResponseobjectrepresentsacommonstructureforhandlingerrorsinAPIresponses.Itincludesessentialinformationabouttheerror,suchastheerrormessageandadditionaloptionaldetails.","type":"object","properties":{"message":{"description":"Astringprovidingaconciseandhuman-readabledescriptionoftheencounterederror.ThisfieldisrequiredintheErrorResponseobject.","type":"string","default":"internalservererror"},"additionalInfo":{"description":"Anoptionalfieldthatcancontainadditionalinformationorcontextabouttheerror.Itprovidesflexibilityforincludingextradetailsbasedonspecificerrorscenarios.","type":"string"}},"required":["message"]},"GetOverviewsRequestParams":{"type":"object","properties":{"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"},"filters":{"$ref":"#/components/schemas/SearchRequest"}}},"WorkflowOverviewListResultDTO":{"type":"object","properties":{"overviews":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOverviewDTO"},"minItems":0},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"WorkflowOverviewDTO":{"type":"object","properties":{"workflowId":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"lastRunId":{"type":"string"},"lastTriggeredMs":{"type":"number","minimum":0},"lastRunStatus":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"description":{"type":"string"},"isAvailable":{"type":"boolean"}},"required":["workflowId","format"]},"PaginationInfoDTO":{"type":"object","properties":{"pageSize":{"type":"number"},"offset":{"type":"number"},"orderDirection":{"enum":["ASC","DESC"]},"orderBy":{"type":"string"}},"additionalProperties":false},"WorkflowFormatDTO":{"type":"string","description":"Formatoftheworkflowdefinition","enum":["yaml","json"]},"WorkflowListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}},"required":["items","paginationInfo"]},"WorkflowDTO":{"type":"object","properties":{"id":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"description":{"type":"string","description":"Descriptionoftheworkflow"},"annotations":{"type":"array","items":{"type":"string"}}},"required":["id","format"]},"ProcessInstanceListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProcessInstanceDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"ProcessInstanceDTO":{"type":"object","properties":{"id":{"type":"string"},"processId":{"type":"string"},"processName":{"type":"string"},"state":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"endpoint":{"type":"string"},"serviceUrl":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"duration":{"type":"string"},"description":{"type":"string"},"workflowdata":{"$ref":"#/components/schemas/WorkflowDataDTO"},"initiatorEntity":{"type":"string"},"targetEntity":{"type":"string"},"executionSummary":{"type":"array","items":{"type":"string"}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInstanceDTO"}},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}},"required":["id","processId","nodes"]},"WorkflowDataDTO":{"type":"object","properties":{"result":{"$ref":"#/components/schemas/WorkflowResultDTO"}},"additionalProperties":true},"WorkflowResultDTO":{"description":"Resultofaworkflowexecution","type":"object","properties":{"message":{"description":"High-levelsummaryofthecurrentstatus,free-formtext,humanreadable.","type":"string"},"nextWorkflows":{"description":"Listofworkflowssuggestedtorunnext.Itemsatlowerindexesareofhigherpriority.","type":"array","items":{"type":"object","properties":{"id":{"description":"Workflowidentifier","type":"string"},"name":{"description":"Humanreadabletitledescribingtheworkflow.","type":"string"}},"required":["id","name"]}},"outputs":{"description":"Additionalstructuredoutputofworkflowprocessing.Thiscancontainidentifiersofcreatedresources,linkstoresources,logsorotheroutput.","type":"array","items":{"type":"object","properties":{"key":{"description":"Uniqueidentifieroftheoption.Preferablyhuman-readable.","type":"string"},"value":{"description":"Freeformvalueoftheoption.","anyOf":[{"type":"string"},{"type":"number"}]},"format":{"description":"Moredetailedtypeofthe'value'property.Defaultsto'text'.","enum":["text","number","link","markdown"]}},"required":["key","value"]}}}},"ProcessInstanceStatusDTO":{"type":"string","description":"Statusoftheworkflowrun","enum":["ACTIVE","ERROR","COMPLETED","ABORTED","SUSPENDED","PENDING"]},"WorkflowRunStatusDTO":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"ExecuteWorkflowRequestDTO":{"type":"object","properties":{"inputData":{"type":"object","additionalProperties":true},"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true},"targetEntity":{"type":"string","description":"Theentitystringidentifiertoexecutetheworkflowfor"}}},"RetriggerInstanceRequestDTO":{"type":"object","properties":{"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true}}},"AuthToken":{"type":"object","properties":{"provider":{"description":"Theauthtokenprovidername","type":"string"},"token":{"description":"Theauthtokenitselfretrievedfromtheabovespecifiedprovidername","type":"string"}},"required":["provider","token"],"additionalProperties":false},"ExecuteWorkflowResponseDTO":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"WorkflowProgressDTO":{"allOf":[{"$ref":"#/components/schemas/NodeInstanceDTO"},{"type":"object","properties":{"status":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}}}]},"NodeInstanceDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"NodeInstance","description":"Typename"},"id":{"type":"string","description":"NodeinstanceID"},"name":{"type":"string","description":"Nodename"},"type":{"type":"string","description":"Nodetype"},"enter":{"type":"string","description":"Datewhenthenodewasentered"},"exit":{"type":"string","description":"Datewhenthenodewasexited(optional)"},"definitionId":{"type":"string","description":"DefinitionID"},"nodeId":{"type":"string","description":"NodeID"}},"required":["id"]},"ProcessInstanceErrorDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"ProcessInstanceError","description":"Typename"},"nodeDefinitionId":{"type":"string","description":"NodedefinitionID"},"message":{"type":"string","description":"Errormessage(optional)"}},"required":["nodeDefinitionId"]},"SearchRequest":{"type":"object","properties":{"filters":{"$ref":"#/components/schemas/Filter"},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"Filter":{"oneOf":[{"$ref":"#/components/schemas/LogicalFilter"},{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]},"NestedFilter":{"type":"object","required":["field","nested"],"properties":{"field":{"type":"string"},"nested":{"oneOf":[{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]}}},"LogicalFilter":{"type":"object","required":["operator","filters"],"properties":{"operator":{"type":"string","enum":["AND","OR","NOT"]},"filters":{"type":"array","items":{"$ref":"#/components/schemas/Filter"}}}},"FieldFilter":{"type":"object","required":["field","operator","value"],"properties":{"field":{"type":"string"},"operator":{"type":"string","enum":["EQ","GT","GTE","LT","LTE","IN","IS_NULL","LIKE","BETWEEN"]},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}]}}},"InputSchemaResponseDTO":{"type":"object","properties":{"inputSchema":{"type":"object"},"data":{"type":"object"}}}}}}`; +const OPENAPI = `{"openapi":"3.1.0","info":{"title":"Orchestratorplugin","description":"APItointeractwithorchestratorplugin","license":{"name":"Apache2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"0.0.1"},"servers":[{"url":"/"}],"paths":{"/v2/workflows/overview":{"post":{"operationId":"getWorkflowsOverview","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Paginationandfilters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/overview/entity":{"post":{"operationId":"getWorkflowsOverviewForEntity","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Targetentityreferenceandannotationworkflowids","content":{"application/json":{"schema":{"type":"object","properties":{"targetEntity":{"type":"string"},"annotationWorkflowIds":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviewsforentity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/overview":{"get":{"operationId":"getWorkflowOverviewById","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","parameters":[{"name":"workflowId","in":"path","required":true,"description":"Uniqueidentifieroftheworkflow","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewDTO"}}}},"500":{"description":"Errorfetchingworkflowoverview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/source":{"get":{"operationId":"getWorkflowSourceById","description":"Gettheworkflow'sdefinition","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorfetchingworkflowsourcebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/inputSchema":{"get":{"operationId":"getWorkflowInputSchemaById","description":"Gettheworkflowinputschema.Itdefinestheinputfieldsoftheworkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"query","description":"IDofinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputSchemaResponseDTO"}}}},"500":{"description":"Errorfetchingworkflowinputschemabyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/pingWorkflowService":{"get":{"operationId":"pingWorkflowServiceById","description":"ReturnstrueiftheworkflowserviceisupforthegivenworkflowID.","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"boolean"}}}},"500":{"description":"Errorpingingworkflowservicebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances":{"post":{"operationId":"getInstances","summary":"Getinstances","description":"Retrieveanarrayofworkflowexecutions(instances)","requestBody":{"required":false,"description":"Parametersforretrievinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/instances":{"post":{"operationId":"getWorkflowInstances","summary":"Getinstancesforaspecificworkflow","description":"Retrieveanarrayofworkflowexecutions(instances)forthegivenworkflow","parameters":[{"name":"workflowId","in":"path","required":true,"description":"IDoftheworkflow","schema":{"type":"string"}}],"requestBody":{"required":false,"description":"Parametersforretrievingworkflowinstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}":{"get":{"summary":"GetWorkflowInstancebyID","description":"Getaworkflowexecution/run(instance)","operationId":"getInstanceById","parameters":[{"name":"instanceId","in":"path","required":true,"description":"IDoftheworkflowinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfulresponse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchinginstance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/logs":{"get":{"operationId":"getWorkflowLogById","description":"ReturnsthelogforagivenworkflowID.","parameters":[{"name":"instanceId","in":"path","description":"IDoftheworkflowinstance","required":true,"schema":{"type":"string"}},{"name":"rawlog","in":"query","description":"whethertoreturntherawlogornot","schema":{"type":"boolean","default":"false"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/statuses":{"get":{"operationId":"getWorkflowStatuses","summary":"Getworkflowstatuslist","description":"Retrievearraywiththestatusofallinstances","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowRunStatusDTO"}}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/execute":{"post":{"summary":"Executeaworkflow","description":"Executeaworkflow","operationId":"executeWorkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtoexecute","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowRequestDTO"}}}},"responses":{"200":{"description":"Successfulexecution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowResponseDTO"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/{instanceId}/retrigger":{"post":{"summary":"Retriggeraninstance","description":"Retriggeraninstance","operationId":"retriggerInstance","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflow","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"path","description":"IDoftheinstancetoretrigger","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetriggerInstanceRequestDTO"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/abort":{"delete":{"summary":"Abortaworkflowinstance","operationId":"abortWorkflow","description":"AbortsaworkflowinstanceidentifiedbytheprovidedinstanceId.","parameters":[{"name":"instanceId","in":"path","required":true,"description":"Theidentifieroftheworkflowinstancetoabort.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfuloperation","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorabortingworkflow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ErrorResponse":{"description":"TheErrorResponseobjectrepresentsacommonstructureforhandlingerrorsinAPIresponses.Itincludesessentialinformationabouttheerror,suchastheerrormessageandadditionaloptionaldetails.","type":"object","properties":{"message":{"description":"Astringprovidingaconciseandhuman-readabledescriptionoftheencounterederror.ThisfieldisrequiredintheErrorResponseobject.","type":"string","default":"internalservererror"},"additionalInfo":{"description":"Anoptionalfieldthatcancontainadditionalinformationorcontextabouttheerror.Itprovidesflexibilityforincludingextradetailsbasedonspecificerrorscenarios.","type":"string"}},"required":["message"]},"GetOverviewsRequestParams":{"type":"object","properties":{"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"},"filters":{"$ref":"#/components/schemas/SearchRequest"}}},"WorkflowOverviewListResultDTO":{"type":"object","properties":{"overviews":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOverviewDTO"},"minItems":0},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"WorkflowOverviewDTO":{"type":"object","properties":{"workflowId":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"lastRunId":{"type":"string"},"lastTriggeredMs":{"type":"number","minimum":0},"lastRunStatus":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"description":{"type":"string"},"isAvailable":{"type":"boolean"}},"required":["workflowId","format"]},"PaginationInfoDTO":{"type":"object","properties":{"pageSize":{"type":"number"},"offset":{"type":"number"},"orderDirection":{"enum":["ASC","DESC"]},"orderBy":{"type":"string"}},"additionalProperties":false},"WorkflowFormatDTO":{"type":"string","description":"Formatoftheworkflowdefinition","enum":["yaml","json"]},"WorkflowListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}},"required":["items","paginationInfo"]},"WorkflowDTO":{"type":"object","properties":{"id":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"description":{"type":"string","description":"Descriptionoftheworkflow"},"annotations":{"type":"array","items":{"type":"string"}}},"required":["id","format"]},"ProcessInstanceListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProcessInstanceDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"ProcessInstanceDTO":{"type":"object","properties":{"id":{"type":"string"},"processId":{"type":"string"},"processName":{"type":"string"},"state":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"endpoint":{"type":"string"},"serviceUrl":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"duration":{"type":"string"},"description":{"type":"string"},"workflowdata":{"$ref":"#/components/schemas/WorkflowDataDTO"},"initiatorEntity":{"type":"string"},"targetEntity":{"type":"string"},"executionSummary":{"type":"array","items":{"type":"string"}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInstanceDTO"}},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}},"required":["id","processId","nodes"]},"WorkflowDataDTO":{"type":"object","properties":{"result":{"$ref":"#/components/schemas/WorkflowResultDTO"}},"additionalProperties":true},"WorkflowResultDTO":{"description":"Resultofaworkflowexecution","type":"object","properties":{"message":{"description":"High-levelsummaryofthecurrentstatus,free-formtext,humanreadable.","type":"string"},"nextWorkflows":{"description":"Listofworkflowssuggestedtorunnext.Itemsatlowerindexesareofhigherpriority.","type":"array","items":{"type":"object","properties":{"id":{"description":"Workflowidentifier","type":"string"},"name":{"description":"Humanreadabletitledescribingtheworkflow.","type":"string"}},"required":["id","name"]}},"outputs":{"description":"Additionalstructuredoutputofworkflowprocessing.Thiscancontainidentifiersofcreatedresources,linkstoresources,logsorotheroutput.","type":"array","items":{"type":"object","properties":{"key":{"description":"Uniqueidentifieroftheoption.Preferablyhuman-readable.","type":"string"},"value":{"description":"Freeformvalueoftheoption.","anyOf":[{"type":"string"},{"type":"number"}]},"format":{"description":"Moredetailedtypeofthe'value'property.Defaultsto'text'.","enum":["text","number","link","markdown"]}},"required":["key","value"]}}}},"ProcessInstanceStatusDTO":{"type":"string","description":"Statusoftheworkflowrun","enum":["ACTIVE","ERROR","COMPLETED","ABORTED","SUSPENDED","PENDING"]},"WorkflowRunStatusDTO":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"ExecuteWorkflowRequestDTO":{"type":"object","properties":{"inputData":{"type":"object","additionalProperties":true},"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true},"targetEntity":{"type":"string","description":"Theentitystringidentifiertoexecutetheworkflowfor"}}},"RetriggerInstanceRequestDTO":{"type":"object","properties":{"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true}}},"AuthToken":{"type":"object","properties":{"provider":{"description":"Theauthtokenprovidername","type":"string"},"token":{"description":"Theauthtokenitselfretrievedfromtheabovespecifiedprovidername","type":"string"}},"required":["provider","token"],"additionalProperties":false},"ExecuteWorkflowResponseDTO":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"WorkflowProgressDTO":{"allOf":[{"$ref":"#/components/schemas/NodeInstanceDTO"},{"type":"object","properties":{"status":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}}}]},"NodeInstanceDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"NodeInstance","description":"Typename"},"id":{"type":"string","description":"NodeinstanceID"},"name":{"type":"string","description":"Nodename"},"type":{"type":"string","description":"Nodetype"},"enter":{"type":"string","description":"Datewhenthenodewasentered"},"exit":{"type":"string","description":"Datewhenthenodewasexited(optional)"},"definitionId":{"type":"string","description":"DefinitionID"},"nodeId":{"type":"string","description":"NodeID"}},"required":["id"]},"ProcessInstanceErrorDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"ProcessInstanceError","description":"Typename"},"nodeDefinitionId":{"type":"string","description":"NodedefinitionID"},"message":{"type":"string","description":"Errormessage(optional)"}},"required":["nodeDefinitionId"]},"SearchRequest":{"type":"object","properties":{"filters":{"$ref":"#/components/schemas/Filter"},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"Filter":{"oneOf":[{"$ref":"#/components/schemas/LogicalFilter"},{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]},"NestedFilter":{"type":"object","required":["field","nested"],"properties":{"field":{"type":"string"},"nested":{"oneOf":[{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]}}},"LogicalFilter":{"type":"object","required":["operator","filters"],"properties":{"operator":{"type":"string","enum":["AND","OR","NOT"]},"filters":{"type":"array","items":{"$ref":"#/components/schemas/Filter"}}}},"FieldFilter":{"type":"object","required":["field","operator","value"],"properties":{"field":{"type":"string"},"operator":{"type":"string","enum":["EQ","GT","GTE","LT","LTE","IN","IS_NULL","LIKE","BETWEEN"]},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}]}}},"InputSchemaResponseDTO":{"type":"object","properties":{"inputSchema":{"type":"object"},"data":{"type":"object"}}}}}}`; export const openApiDocument = JSON.parse(OPENAPI); diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts index eeb7096aa7..65a5109bfe 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts @@ -1114,6 +1114,44 @@ export const DefaultApiAxiosParamCreator = function (configuration?: Configurati options: localVarRequestOptions, }; }, + /** + * Returns the log for a given workflow ID. + * @param {string} instanceId ID of the workflow instance + * @param {boolean} [rawlog] whether to return the raw log or not + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getWorkflowLogById: async (instanceId: string, rawlog?: boolean, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'instanceId' is not null or undefined + assertParamExists('getWorkflowLogById', 'instanceId', instanceId) + const localVarPath = `/v2/workflows/instances/{instanceId}/logs` + .replace(`{${"instanceId"}}`, encodeURIComponent(String(instanceId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (rawlog !== undefined) { + localVarQueryParameter['rawlog'] = rawlog; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Returns the key fields of the workflow including data on the last run instance * @param {string} workflowId Unique identifier of the workflow @@ -1443,6 +1481,19 @@ export const DefaultApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['DefaultApi.getWorkflowInstances']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Returns the log for a given workflow ID. + * @param {string} instanceId ID of the workflow instance + * @param {boolean} [rawlog] whether to return the raw log or not + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getWorkflowLogById(instanceId, rawlog, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['DefaultApi.getWorkflowLogById']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Returns the key fields of the workflow including data on the last run instance * @param {string} workflowId Unique identifier of the workflow @@ -1602,6 +1653,16 @@ export const DefaultApiFactory = function (configuration?: Configuration, basePa getWorkflowInstances(workflowId: string, searchRequest?: SearchRequest, options?: any): AxiosPromise { return localVarFp.getWorkflowInstances(workflowId, searchRequest, options).then((request) => request(axios, basePath)); }, + /** + * Returns the log for a given workflow ID. + * @param {string} instanceId ID of the workflow instance + * @param {boolean} [rawlog] whether to return the raw log or not + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: any): AxiosPromise { + return localVarFp.getWorkflowLogById(instanceId, rawlog, options).then((request) => request(axios, basePath)); + }, /** * Returns the key fields of the workflow including data on the last run instance * @param {string} workflowId Unique identifier of the workflow @@ -1752,6 +1813,18 @@ export class DefaultApi extends BaseAPI { return DefaultApiFp(this.configuration).getWorkflowInstances(workflowId, searchRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns the log for a given workflow ID. + * @param {string} instanceId ID of the workflow instance + * @param {boolean} [rawlog] whether to return the raw log or not + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApi + */ + public getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig) { + return DefaultApiFp(this.configuration).getWorkflowLogById(instanceId, rawlog, options).then((request) => request(this.axios, this.basePath)); + } + /** * Returns the key fields of the workflow including data on the last run instance * @param {string} workflowId Unique identifier of the workflow diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml index 9900422974..0dd09042b9 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml @@ -259,6 +259,38 @@ spec: application/json: schema: $ref: '#/components/schemas/ErrorResponse' + # This might actually need to know the workflow instanceID to get the proper log + # TODO: also need a raw log endpoint, or just a parameter + /v2/workflows/instances/{instanceId}/logs: + get: + operationId: getWorkflowLogById + description: Returns the log for a given workflow ID. + parameters: + - name: instanceId + in: path + description: ID of the workflow instance + required: true + schema: + type: string + - name: rawlog + in: query + description: whether to return the raw log or not + schema: + type: boolean + default: 'false' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessInstanceDTO' # Need to create something new here + '500': + description: Error fetching workflow statuses + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' /v2/workflows/instances/statuses: get: operationId: getWorkflowStatuses diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html index 28dd508368..b25d4b797a 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html @@ -1408,6 +1408,9 @@
  • getWorkflowInstances
  • +
  • + getWorkflowLogById +
  • getWorkflowOverviewById
  • @@ -4165,6 +4168,460 @@


    +
    +
    +
    +

    getWorkflowLogById

    +

    +
    +
    +
    +

    +

    Returns the log for a given workflow ID.

    +

    +
    +
    /v2/workflows/instances/{instanceId}/logs
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET \
    + -H "Accept: application/json" \
    + "http://localhost/v2/workflows/instances/{instanceId}/logs?rawlog=true"
    +
    +
    +
    +
    import org.openapitools.client.*;
    +import org.openapitools.client.auth.*;
    +import org.openapitools.client.model.*;
    +import org.openapitools.client.api.DefaultApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class DefaultApiExample {
    +    public static void main(String[] args) {
    +
    +        // Create an instance of the API class
    +        DefaultApi apiInstance = new DefaultApi();
    +        String instanceId = instanceId_example; // String | ID of the workflow instance
    +        Boolean rawlog = true; // Boolean | whether to return the raw log or not
    +
    +        try {
    +            ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling DefaultApi#getWorkflowLogById");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    +
    + +
    +
    import 'package:openapi/api.dart';
    +
    +final api_instance = DefaultApi();
    +
    +final String instanceId = new String(); // String | ID of the workflow instance
    +final Boolean rawlog = new Boolean(); // Boolean | whether to return the raw log or not
    +
    +try {
    +    final result = await api_instance.getWorkflowLogById(instanceId, rawlog);
    +    print(result);
    +} catch (e) {
    +    print('Exception when calling DefaultApi->getWorkflowLogById: $e\n');
    +}
    +
    +
    +
    + +
    +
    import org.openapitools.client.api.DefaultApi;
    +
    +public class DefaultApiExample {
    +    public static void main(String[] args) {
    +        DefaultApi apiInstance = new DefaultApi();
    +        String instanceId = instanceId_example; // String | ID of the workflow instance
    +        Boolean rawlog = true; // Boolean | whether to return the raw log or not
    +
    +        try {
    +            ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling DefaultApi#getWorkflowLogById");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    
    +
    +// Create an instance of the API class
    +DefaultApi *apiInstance = [[DefaultApi alloc] init];
    +String *instanceId = instanceId_example; // ID of the workflow instance (default to null)
    +Boolean *rawlog = true; // whether to return the raw log or not (optional) (default to false)
    +
    +[apiInstance getWorkflowLogByIdWith:instanceId
    +    rawlog:rawlog
    +              completionHandler: ^(ProcessInstanceDTO output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
    +    if (error) {
    +        NSLog(@"Error: %@", error);
    +    }
    +}];
    +
    +
    + +
    +
    var OrchestratorPlugin = require('orchestrator_plugin');
    +
    +// Create an instance of the API class
    +var api = new OrchestratorPlugin.DefaultApi()
    +var instanceId = instanceId_example; // {String} ID of the workflow instance
    +var opts = {
    +  'rawlog': true // {Boolean} whether to return the raw log or not
    +};
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getWorkflowLogById(instanceId, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using Org.OpenAPITools.Api;
    +using Org.OpenAPITools.Client;
    +using Org.OpenAPITools.Model;
    +
    +namespace Example
    +{
    +    public class getWorkflowLogByIdExample
    +    {
    +        public void main()
    +        {
    +
    +            // Create an instance of the API class
    +            var apiInstance = new DefaultApi();
    +            var instanceId = instanceId_example;  // String | ID of the workflow instance (default to null)
    +            var rawlog = true;  // Boolean | whether to return the raw log or not (optional)  (default to false)
    +
    +            try {
    +                ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog);
    +                Debug.WriteLine(result);
    +            } catch (Exception e) {
    +                Debug.Print("Exception when calling DefaultApi.getWorkflowLogById: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +// Create an instance of the API class
    +$api_instance = new OpenAPITools\Client\Api\DefaultApi();
    +$instanceId = instanceId_example; // String | ID of the workflow instance
    +$rawlog = true; // Boolean | whether to return the raw log or not
    +
    +try {
    +    $result = $api_instance->getWorkflowLogById($instanceId, $rawlog);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling DefaultApi->getWorkflowLogById: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::OPenAPIClient::Configuration;
    +use WWW::OPenAPIClient::DefaultApi;
    +
    +# Create an instance of the API class
    +my $api_instance = WWW::OPenAPIClient::DefaultApi->new();
    +my $instanceId = instanceId_example; # String | ID of the workflow instance
    +my $rawlog = true; # Boolean | whether to return the raw log or not
    +
    +eval {
    +    my $result = $api_instance->getWorkflowLogById(instanceId => $instanceId, rawlog => $rawlog);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling DefaultApi->getWorkflowLogById: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import openapi_client
    +from openapi_client.rest import ApiException
    +from pprint import pprint
    +
    +# Create an instance of the API class
    +api_instance = openapi_client.DefaultApi()
    +instanceId = instanceId_example # String | ID of the workflow instance (default to null)
    +rawlog = true # Boolean | whether to return the raw log or not (optional) (default to false)
    +
    +try:
    +    api_response = api_instance.get_workflow_log_by_id(instanceId, rawlog=rawlog)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling DefaultApi->getWorkflowLogById: %s\n" % e)
    +
    + +
    +
    extern crate DefaultApi;
    +
    +pub fn main() {
    +    let instanceId = instanceId_example; // String
    +    let rawlog = true; // Boolean
    +
    +    let mut context = DefaultApi::Context::default();
    +    let result = client.getWorkflowLogById(instanceId, rawlog, &context).wait();
    +
    +    println!("{:?}", result);
    +}
    +
    +
    +
    + +

    Scopes

    + + +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + +
    NameDescription
    instanceId* + + +
    +
    +
    + + String + + +
    +ID of the workflow instance +
    +
    +
    + Required +
    +
    +
    +
    + + + + +
    Query parameters
    + + + + + + + + + +
    NameDescription
    rawlog + + +
    +
    +
    + + Boolean + + +
    +whether to return the raw log or not +
    +
    +
    +
    +
    + +

    Responses

    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md index 50e2c40d02..6c33adfb60 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md @@ -10,6 +10,7 @@ All URIs are relative to *http://localhost* | [**getInstances**](DefaultApi.md#getInstances) | **POST** /v2/workflows/instances | Get instances | | [**getWorkflowInputSchemaById**](DefaultApi.md#getWorkflowInputSchemaById) | **GET** /v2/workflows/{workflowId}/inputSchema | | | [**getWorkflowInstances**](DefaultApi.md#getWorkflowInstances) | **POST** /v2/workflows/{workflowId}/instances | Get instances for a specific workflow | +| [**getWorkflowLogById**](DefaultApi.md#getWorkflowLogById) | **GET** /v2/workflows/instances/{instanceId}/logs | | | [**getWorkflowOverviewById**](DefaultApi.md#getWorkflowOverviewById) | **GET** /v2/workflows/{workflowId}/overview | | | [**getWorkflowSourceById**](DefaultApi.md#getWorkflowSourceById) | **GET** /v2/workflows/{workflowId}/source | | | [**getWorkflowStatuses**](DefaultApi.md#getWorkflowStatuses) | **GET** /v2/workflows/instances/statuses | Get workflow status list | @@ -184,6 +185,34 @@ No authorization required - **Content-Type**: application/json - **Accept**: application/json + +# **getWorkflowLogById** +> ProcessInstanceDTO getWorkflowLogById(instanceId, rawlog) + + + + Returns the log for a given workflow ID. + +### Parameters + +|Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **instanceId** | **String**| ID of the workflow instance | [default to null] | +| **rawlog** | **Boolean**| whether to return the raw log or not | [optional] [default to false] | + +### Return type + +[**ProcessInstanceDTO**](../Models/ProcessInstanceDTO.md) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + # **getWorkflowOverviewById** > WorkflowOverviewDTO getWorkflowOverviewById(workflowId) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md index 4967cc5715..90f452bee8 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md @@ -13,6 +13,7 @@ All URIs are relative to *http://localhost* *DefaultApi* | [**getInstances**](Apis/DefaultApi.md#getinstances) | **POST** /v2/workflows/instances | Get instances | *DefaultApi* | [**getWorkflowInputSchemaById**](Apis/DefaultApi.md#getworkflowinputschemabyid) | **GET** /v2/workflows/{workflowId}/inputSchema | Get the workflow input schema. It defines the input fields of the workflow | *DefaultApi* | [**getWorkflowInstances**](Apis/DefaultApi.md#getworkflowinstances) | **POST** /v2/workflows/{workflowId}/instances | Get instances for a specific workflow | +*DefaultApi* | [**getWorkflowLogById**](Apis/DefaultApi.md#getworkflowlogbyid) | **GET** /v2/workflows/instances/{instanceId}/logs | Returns the log for a given workflow ID. | *DefaultApi* | [**getWorkflowOverviewById**](Apis/DefaultApi.md#getworkflowoverviewbyid) | **GET** /v2/workflows/{workflowId}/overview | Returns the key fields of the workflow including data on the last run instance | *DefaultApi* | [**getWorkflowSourceById**](Apis/DefaultApi.md#getworkflowsourcebyid) | **GET** /v2/workflows/{workflowId}/source | Get the workflow's definition | *DefaultApi* | [**getWorkflowStatuses**](Apis/DefaultApi.md#getworkflowstatuses) | **GET** /v2/workflows/instances/statuses | Get workflow status list | diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml index 2055925862..5c2f23cd54 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml @@ -247,6 +247,38 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorResponse' + # This might actually need to know the workflow instanceID to get the proper log + # TODO: also need a raw log endpoint, or just a parameter + /v2/workflows/instances/{instanceId}/logs: + get: + operationId: getWorkflowLogById + description: Returns the log for a given workflow ID. + parameters: + - name: instanceId + in: path + description: ID of the workflow instance + required: true + schema: + type: string + - name: rawlog + in: query + description: whether to return the raw log or not + schema: + type: boolean + default: 'false' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessInstanceDTO' # Need to create something new here + '500': + description: Error fetching workflow statuses + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' /v2/workflows/instances/statuses: get: operationId: getWorkflowStatuses From 2052ffa9795e1b7ba85d0198bfe6778b69dea71d Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 12 Nov 2025 13:22:04 -0500 Subject: [PATCH 02/52] squash: more things --- .../src/helpers/errorBuilder.ts | 11 ++++- .../src/service/OrchestratorService.ts | 9 +++++ .../src/service/WorkflowLoggerService.ts | 40 +++++++++++++++++++ .../src/service/router.ts | 11 ++++- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/helpers/errorBuilder.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/helpers/errorBuilder.ts index fd48657d6e..c61660b7d3 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/helpers/errorBuilder.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/helpers/errorBuilder.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright Red Hat, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +export const NO_LOG_STORAGE_URL = 'NO_LOG_STORAGE_URL'; export const NO_DATA_INDEX_URL = 'NO_DATA_INDEX_URL'; export const NO_BACKEND_EXEC_CTX = 'NO_BACKEND_EXEC_CTX'; export const NO_CLIENT_PROVIDED = 'NO_CLIENT_PROVIDED'; @@ -26,6 +28,13 @@ export class ErrorBuilder { return e; } + public static GET_NO_LOG_STORAGE_URL_ERR(): Error { + return this.NewBackendError( + NO_LOG_STORAGE_URL, + 'No log storage url specified or found', + ); + } + public static GET_NO_DATA_INDEX_URL_ERR(): Error { return this.NewBackendError( NO_DATA_INDEX_URL, diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts index 714112149e..4e4b95c97b 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts @@ -18,6 +18,7 @@ import { AuthToken, Filter, ProcessInstance, + ProcessInstanceDTO, ProcessInstanceVariables, WorkflowDefinition, WorkflowExecutionResponse, @@ -29,12 +30,14 @@ import { Pagination } from '../types/pagination'; import { DataIndexService } from './DataIndexService'; import { SonataFlowService } from './SonataFlowService'; import { WorkflowCacheService } from './WorkflowCacheService'; +import { WorkflowLoggerService } from './WorkflowLoggerService'; export class OrchestratorService { constructor( private readonly sonataFlowService: SonataFlowService, private readonly dataIndexService: DataIndexService, private readonly workflowCacheService: WorkflowCacheService, + private readonly workflowLoggerService: WorkflowLoggerService, ) {} // Data Index Service Wrapper @@ -171,6 +174,12 @@ export class OrchestratorService { return overview; } + public async fetchWorkflowLogsById(args: { + instance: ProcessInstanceDTO; + }): Promise { + return this.workflowLoggerService.fetchWorkflowLogsById(args.instance); + } + public async pingWorkflowService(args: { definitionId: string; serviceUrl: string; diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts new file mode 100644 index 0000000000..cfa075d6b4 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts @@ -0,0 +1,40 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LoggerService } from '@backstage/backend-plugin-api'; + +import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; + +import { ErrorBuilder } from '../helpers/errorBuilder'; + +export class WorkflowLoggerService { + private readonly logStorageURL: string; + public constructor( + // private readonly dataIndexUrl: string, + private readonly storageURL: string, + private readonly logger: LoggerService, + ) { + if (!storageURL.length) { + throw ErrorBuilder.GET_NO_LOG_STORAGE_URL_ERR(); + } + + this.logStorageURL = storageURL; + } + + public async fetchWorkflowLogsById(instance: ProcessInstanceDTO) { + console.log(instance); + } +} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 51ab354726..cb6b0f14ec 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -62,6 +62,7 @@ import { DataInputSchemaService } from './DataInputSchemaService'; import { OrchestratorService } from './OrchestratorService'; import { SonataFlowService } from './SonataFlowService'; import { WorkflowCacheService } from './WorkflowCacheService'; +import { WorkflowLoggerService } from './WorkflowLoggerService'; interface PublicServices { dataInputSchemaService: DataInputSchemaService; @@ -259,11 +260,19 @@ function initPublicServices( sonataFlowService, ); workflowCacheService.schedule({ scheduler: scheduler }); - + // Get the orchestrator logging config + // Create that workflow logging class/interface instance here + const logStorageUrl = config.getString(''); + const workflowLoggerService = new WorkflowLoggerService( + logStorageUrl, + logger, + ); + // ADD the workflow logging interface here const orchestratorService = new OrchestratorService( sonataFlowService, dataIndexService, workflowCacheService, + workflowLoggerService, ); const dataInputSchemaService = new DataInputSchemaService(); From d964d88cef172abe437d2df7a30f8c009479602d Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 14 Nov 2025 10:14:02 -0500 Subject: [PATCH 03/52] squash: sort of works? --- .../packages/backend/package.json | 1 + .../packages/backend/src/index.ts | 5 ++ .../.eslintrc.js | 16 ++++ .../README.md | 5 ++ .../package.json | 63 +++++++++++++++ .../src/index.ts | 23 ++++++ .../src/module.ts | 40 +++++++++ .../src/workflowLogsProviders/LokiProvider.ts | 81 +++++++++++++++++++ .../plugins/orchestrator-backend/package.json | 4 +- .../plugins/orchestrator-backend/src/index.ts | 3 +- .../orchestrator-backend/src/plugin.ts | 24 +++++- .../WorkflowLogsProvidersRegistry.ts | 43 ++++++++++ .../src/routerWrapper/index.ts | 3 + .../src/service/OrchestratorService.ts | 8 +- .../src/service/api/v2.ts | 38 ++------- .../src/service/router.ts | 33 +++++--- .../plugins/orchestrator-node/.eslintrc.js | 16 ++++ .../plugins/orchestrator-node/README.md | 5 ++ .../plugins/orchestrator-node/package.json | 66 +++++++++++++++ .../src/api/WorkflowLogProvider.ts | 28 +++++++ .../orchestrator-node/src/api/index.ts | 17 ++++ .../orchestrator-node/src/extensions.ts | 35 ++++++++ .../plugins/orchestrator-node/src/index.ts | 27 +++++++ .../orchestrator-node/src/setupTests.ts | 16 ++++ 24 files changed, 551 insertions(+), 49 deletions(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/.eslintrc.js create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/index.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/.eslintrc.js create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/README.md create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/package.json create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/api/index.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/extensions.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/index.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts diff --git a/workspaces/orchestrator/packages/backend/package.json b/workspaces/orchestrator/packages/backend/package.json index a2e1e0fa27..841716618c 100644 --- a/workspaces/orchestrator/packages/backend/package.json +++ b/workspaces/orchestrator/packages/backend/package.json @@ -51,6 +51,7 @@ "@backstage/plugin-signals-backend": "^0.3.10", "@backstage/plugin-techdocs-backend": "^2.1.2", "@red-hat-developer-hub/backstage-plugin-orchestrator-backend": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki": "workspace:^", "@red-hat-developer-hub/backstage-plugin-scaffolder-backend-module-orchestrator": "workspace:^", "app": "link:../app", "better-sqlite3": "^12.0.0", diff --git a/workspaces/orchestrator/packages/backend/src/index.ts b/workspaces/orchestrator/packages/backend/src/index.ts index 1c370ffd35..70d7f1cb00 100644 --- a/workspaces/orchestrator/packages/backend/src/index.ts +++ b/workspaces/orchestrator/packages/backend/src/index.ts @@ -75,4 +75,9 @@ backend.add(import('@backstage/plugin-scaffolder-backend-module-gitlab')); // custom authentication provider module backend.add(import('custom-authentication-provider-module-backend')); +backend.add( + import( + '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' + ), +); backend.start(); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/.eslintrc.js b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/.eslintrc.js new file mode 100644 index 0000000000..9184408ae4 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/.eslintrc.js @@ -0,0 +1,16 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md new file mode 100644 index 0000000000..0dae394303 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md @@ -0,0 +1,5 @@ +# @@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki + +The loki backend module for the orchestrator plugin. + +_This plugin was created through the Backstage CLI_ diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json new file mode 100644 index 0000000000..7ac8e6578e --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -0,0 +1,63 @@ +{ + "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki", + "version": "0.1.0", + "license": "Apache-2.0", + "description": "The loki backend module for the orchestrator plugin.", + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "access": "public" + }, + "backstage": { + "role": "backend-plugin-module", + "pluginId": "orchestrator", + "pluginPackage": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend" + }, + "exports": { + ".": "./src/index.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ] + } + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "tsc": "tsc", + "prettier:check": "prettier --ignore-unknown --check .", + "prettier:fix": "prettier --ignore-unknown --write ." + }, + "dependencies": { + "@backstage/backend-plugin-api": "^1.4.4", + "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^" + }, + "devDependencies": { + "@backstage/backend-test-utils": "^1.9.1", + "@backstage/cli": "^0.34.4" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/redhat-developer/rhdh-plugins", + "directory": "workspaces/orchestrator/plugins/orchestrator-backend-module-loki" + }, + "keywords": [ + "backstage", + "plugin" + ], + "homepage": "https://red.ht/rhdh", + "bugs": "https://github.com/redhat-developer/rhdh-plugins/issues", + "author": "Red Hat" +} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/index.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/index.ts new file mode 100644 index 0000000000..45bd2b273c --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The loki backend module for the orchestrator plugin. + * + * @packageDocumentation + */ + +export { orchestratorModuleLoki as default } from './module'; diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts new file mode 100644 index 0000000000..3a7bdd1f83 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts @@ -0,0 +1,40 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { workflowLogsExtensionEndpoint } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; +import { LokiProvider } from './workflowLogsProviders/LokiProvider'; + +export const orchestratorModuleLoki = createBackendModule({ + pluginId: 'orchestrator', + moduleId: 'loki', + register(reg) { + reg.registerInit({ + deps: { + config: coreServices.rootConfig, + logger: coreServices.logger, + workflowLogs: workflowLogsExtensionEndpoint, + }, + async init({ config, logger, workflowLogs }) { + logger.info('Hello World!'); + console.log('In the loki backend module'); + workflowLogs.addWorkflowLogProvider(LokiProvider.fromConfig(config)); + }, + }); + }, +}); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts new file mode 100644 index 0000000000..6ad5979ec7 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -0,0 +1,81 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Config } from '@backstage/config'; +import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; + +export class LokiProvider implements WorkflowLogProvider { + private readonly baseURL: string; + private constructor(config: Config) { + this.baseURL = config.getString('baseUrl'); + } + getBaseURL(): string { + return this.baseURL; + } + + getProviderId() { + return 'loki'; + } + + async fetchWorkflowLogsByIntance(instance: ProcessInstanceDTO) { + // Fetch the logs, probably add something to that orchestrator service object? OR maybe a logViewerService object instead + // We are not querying actual orchestrator since the logs don't live there + // Query will be against the log provider, like Loki for example + // logViewerService is probably going to be the new class/interface that other providers can implement in the future + + const lokiApiEndpoint = '/loki/api/v1/query_range'; + const params = new URLSearchParams({ + query: `{service_name=~".+"} |="${instance.id}"`, + start: instance.start as string, + end: instance.end || '', + }); + + const urlToFetch = `${this.baseURL}${lokiApiEndpoint}?${params.toString()}`; + + const response = await fetch(urlToFetch); + + let allResults; + if (response.status !== 200) { + console.log('ERror', response.statusText, response); + } else { + const jsonResponse = await response.json(); + // Reduce the results into another array + allResults = jsonResponse.data.result.reduce( + (acc: any[], curr: { values: any[] }) => { + curr.values.reduce((_innerAcc: any, innerCurr: any) => { + acc.push(innerCurr); + }, acc); + return acc; + }, + [], + ); + } + return allResults.sort((a: number[], b: number[]) => { + return a[0] - b[0]; + }); + } + + static fromConfig(config: Config): LokiProvider { + const lokiConfig = config.getConfig( + 'orchestrator.workflowLogProviders.loki', + ); + console.log(lokiConfig); + // const random = config.getString('orchestrator.workflowLogProviders.loki.thing'); + // console.log(random); + return new LokiProvider(lokiConfig); + } +} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/package.json b/workspaces/orchestrator/plugins/orchestrator-backend/package.json index c1328b6468..fcf3a45221 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend/package.json @@ -13,7 +13,8 @@ "pluginPackages": [ "@red-hat-developer-hub/backstage-plugin-orchestrator", "@red-hat-developer-hub/backstage-plugin-orchestrator-backend", - "@red-hat-developer-hub/backstage-plugin-orchestrator-common" + "@red-hat-developer-hub/backstage-plugin-orchestrator-common", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node" ] }, "exports": { @@ -74,6 +75,7 @@ "@backstage/plugin-scaffolder-backend": "^3.0.1", "@backstage/plugin-scaffolder-node": "^0.12.1", "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^", "@urql/core": "^4.1.4", "ajv-formats": "^2.1.1", "cloudevents": "^8.0.0", diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/index.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/index.ts index 70217b2016..4ca4f394cf 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/index.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright Red Hat, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export { orchestratorPlugin as default } from './plugin'; diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts index bd67340ff7..d4e9cf1092 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts @@ -20,6 +20,12 @@ import { } from '@backstage/backend-plugin-api'; import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; +import { + WorkflowLogProvider, + workflowLogsExtensionEndpoint, +} from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; + +import { WorkflowLogsProvidersRegistry } from './providers/WorkflowLogsProvidersRegistry'; import { createRouter } from './routerWrapper'; /** @@ -29,6 +35,19 @@ import { createRouter } from './routerWrapper'; export const orchestratorPlugin = createBackendPlugin({ pluginId: 'orchestrator', register(env) { + const workflowLogsProvidersRegistry = new WorkflowLogsProvidersRegistry(); + + env.registerExtensionPoint(workflowLogsExtensionEndpoint, { + addWorkflowLogProvider( + ...newWorkflowLogProviders: WorkflowLogProvider[] + ) { + newWorkflowLogProviders.forEach(workflowLogProvider => { + // TODO: add this workflow log provider to our list of providers + console.log(workflowLogProvider); + workflowLogsProvidersRegistry.register(workflowLogProvider); + }); + }, + }); env.registerInit({ deps: { logger: coreServices.logger, @@ -45,7 +64,10 @@ export const orchestratorPlugin = createBackendPlugin({ }, async init(props) { const { http } = props; - const router = await createRouter(props); + const router = await createRouter({ + ...props, + workflowLogsProvidersRegistry, + }); http.use(router); http.addAuthPolicy({ path: '/health', diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts new file mode 100644 index 0000000000..1ad5565ea3 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts @@ -0,0 +1,43 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ConflictError } from '@backstage/errors'; + +import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; + +export class WorkflowLogsProvidersRegistry { + private readonly workfLogsProviders = new Map(); + + register(workflowLogProvider: WorkflowLogProvider): void { + const providerId = workflowLogProvider.getProviderId(); + + if (this.workfLogsProviders.has(providerId)) { + throw new ConflictError( + `Workflow Log Provider with ID ${providerId} has already been registered`, + ); + } + + this.workfLogsProviders.set(providerId, workflowLogProvider); + } + + listProviders(): WorkflowLogProvider[] { + return Array.from(this.workfLogsProviders.values()); + } + + getProvider(providerId: string): WorkflowLogProvider | undefined { + return this.workfLogsProviders.get(providerId); + } +} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/routerWrapper/index.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/routerWrapper/index.ts index bf040c9adf..c30589a919 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/routerWrapper/index.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/routerWrapper/index.ts @@ -29,6 +29,7 @@ import type { Config } from '@backstage/config'; import express from 'express'; +import { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry'; import { DevModeService } from '../service/DevModeService'; import { createBackendRouter } from '../service/router'; @@ -43,6 +44,7 @@ export interface RouterOptions { permissions: PermissionsService; httpAuth: HttpAuthService; userInfo: UserInfoService; + workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry; } export async function createRouter( @@ -74,5 +76,6 @@ export async function createRouter( permissions: args.permissions, httpAuth: args.httpAuth, userInfo: args.userInfo, + workflowLogsProvidersRegistry: args.workflowLogsProvidersRegistry, }); } diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts index 4e4b95c97b..3537f1242d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts @@ -25,19 +25,19 @@ import { WorkflowInfo, WorkflowOverview, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; import { Pagination } from '../types/pagination'; import { DataIndexService } from './DataIndexService'; import { SonataFlowService } from './SonataFlowService'; import { WorkflowCacheService } from './WorkflowCacheService'; -import { WorkflowLoggerService } from './WorkflowLoggerService'; export class OrchestratorService { constructor( private readonly sonataFlowService: SonataFlowService, private readonly dataIndexService: DataIndexService, private readonly workflowCacheService: WorkflowCacheService, - private readonly workflowLoggerService: WorkflowLoggerService, + private readonly workflowLogProvider?: WorkflowLogProvider, ) {} // Data Index Service Wrapper @@ -174,10 +174,10 @@ export class OrchestratorService { return overview; } - public async fetchWorkflowLogsById(args: { + public async fetchWorkflowLogsByInstance(args: { instance: ProcessInstanceDTO; }): Promise { - return this.workflowLoggerService.fetchWorkflowLogsById(args.instance); + return this.workflowLogProvider?.fetchWorkflowLogsByIntance(args.instance); } public async pingWorkflowService(args: { diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts index 7e1bee1d62..c9696e00a5 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts @@ -180,39 +180,13 @@ export class V2 { return mapToProcessInstanceDTO(instance); } - public async getInstanceLogsById(instance: ProcessInstanceDTO): Promise { - // Fetch the logs, probably add something to that orchestrator service object? OR maybe a logViewerService object instead - // We are not querying actual orchestrator since the logs don't live there - // Query will be against the log provider, like Loki for example - // logViewerService is probably going to be the new class/interface that other providers can implement in the future - const baseURL = 'http://localhost:3100/loki/api/v1/query_range'; - const params = new URLSearchParams({ - query: `{service_name=~".+"} |="${instance.id}"`, - start: instance.start as string, - end: instance.end || '', + public async getInstanceLogsByInstance( + instance: ProcessInstanceDTO, + ): Promise { + const logs = await this.orchestratorService.fetchWorkflowLogsByInstance({ + instance, }); - - const urlToFetch = `${baseURL}?${params.toString()}`; - - const response = await fetch(urlToFetch); - - let allResults; - if (response.status !== 200) { - console.log('ERror', response.statusText, response); - } else { - const jsonResponse = await response.json(); - // Reduce the results into another array - allResults = jsonResponse.data.result.reduce( - (acc: any[], curr: { values: any[] }) => { - curr.values.reduce((_innerAcc: any, innerCurr: any) => { - acc.push(innerCurr); - }, acc); - return acc; - }, - [], - ); - } - return allResults; + return logs; } public async executeWorkflow( diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index cb6b0f14ec..9c491b1888 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -53,7 +53,9 @@ import { orchestratorWorkflowUseSpecificPermission, WorkflowOverviewListResultDTO, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; +import { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry'; import { RouterOptions } from '../routerWrapper'; import { buildPagination } from '../types/pagination'; import { V2 } from './api/v2'; @@ -185,8 +187,14 @@ export async function createBackendRouter( permissions, httpAuth, userInfo, + workflowLogsProvidersRegistry, } = options; - const publicServices = initPublicServices(logger, config, scheduler); + const publicServices = initPublicServices( + logger, + config, + scheduler, + workflowLogsProvidersRegistry, + ); const routerApi = await initRouterApi(publicServices.orchestratorService); @@ -249,6 +257,7 @@ function initPublicServices( logger: LoggerService, config: Config, scheduler: SchedulerService, + workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry, ): PublicServices { const dataIndexUrl = config.getString('orchestrator.dataIndexService.url'); const dataIndexService = new DataIndexService(dataIndexUrl, logger); @@ -260,19 +269,23 @@ function initPublicServices( sonataFlowService, ); workflowCacheService.schedule({ scheduler: scheduler }); + + // All the workflow logging related stuff should be moved to their respective backend module + // Probablt define that WorkflowLoggerService Class/type in the common or perhaps that -node package // Get the orchestrator logging config // Create that workflow logging class/interface instance here - const logStorageUrl = config.getString(''); - const workflowLoggerService = new WorkflowLoggerService( - logStorageUrl, - logger, - ); + const workflowLogProvider: WorkflowLogProvider | undefined = + workflowLogsProvidersRegistry.getProvider('loki'); + if (workflowLogProvider) { + console.log('There is a provider'); + } + // ADD the workflow logging interface here const orchestratorService = new OrchestratorService( sonataFlowService, dataIndexService, workflowCacheService, - workflowLoggerService, + workflowLogProvider, ); const dataInputSchemaService = new DataInputSchemaService(); @@ -1008,12 +1021,12 @@ function setupInternalRoutes( } } - // TODO: Using the instanceId, retrieve the log from Loki or some other log provider - const logs = await routerApi.v2.getInstanceLogsById(instance); + const logs = await routerApi.v2.getInstanceLogsByInstance(instance); + // Do something with the logs to send back console.log(logs); auditEvent.success(); - res.status(200).json(instance); + res.status(200).json(logs); } catch (error) { auditEvent.fail({ error }); next(error); diff --git a/workspaces/orchestrator/plugins/orchestrator-node/.eslintrc.js b/workspaces/orchestrator/plugins/orchestrator-node/.eslintrc.js new file mode 100644 index 0000000000..9184408ae4 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/.eslintrc.js @@ -0,0 +1,16 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/workspaces/orchestrator/plugins/orchestrator-node/README.md b/workspaces/orchestrator/plugins/orchestrator-node/README.md new file mode 100644 index 0000000000..dc73a610ce --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/README.md @@ -0,0 +1,5 @@ +# @@red-hat-developer-hub/backstage-plugin-orchestrator-node + +Welcome to the Node.js library package for the orchestrator plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/workspaces/orchestrator/plugins/orchestrator-node/package.json b/workspaces/orchestrator/plugins/orchestrator-node/package.json new file mode 100644 index 0000000000..0c6f5d9d46 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/package.json @@ -0,0 +1,66 @@ +{ + "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-node", + "version": "0.1.0", + "license": "Apache-2.0", + "description": "Node.js library for the orchestrator plugin", + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "access": "public" + }, + "backstage": { + "role": "node-library", + "pluginId": "orchestrator", + "pluginPackages": [ + "@red-hat-developer-hub/backstage-plugin-orchestrator", + "@red-hat-developer-hub/backstage-plugin-orchestrator-backend", + "@red-hat-developer-hub/backstage-plugin-orchestrator-common", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node" + ] + }, + "exports": { + ".": "./src/index.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ] + } + }, + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "tsc": "tsc", + "prettier:check": "prettier --ignore-unknown --check .", + "prettier:fix": "prettier --ignore-unknown --write ." + }, + "dependencies": { + "@backstage/backend-plugin-api": "^1.4.4", + "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^" + }, + "devDependencies": { + "@backstage/cli": "^0.34.4" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/redhat-developer/rhdh-plugins", + "directory": "workspaces/scorecard/plugins/scorecard-node" + }, + "keywords": [ + "backstage", + "plugin" + ], + "homepage": "https://red.ht/rhdh", + "bugs": "https://github.com/redhat-developer/rhdh-plugins/issues", + "author": "Red Hat" +} diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts new file mode 100644 index 0000000000..48f711c2bd --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts @@ -0,0 +1,28 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; + +/** + * @public + */ +export interface WorkflowLogProvider { + getProviderId(): string; + getBaseURL(): string; + fetchWorkflowLogsByIntance( + workflowInstance: ProcessInstanceDTO, + ): Promise; +} diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/api/index.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/api/index.ts new file mode 100644 index 0000000000..d1366ae8fb --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/api/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type { WorkflowLogProvider } from './WorkflowLogProvider'; diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/extensions.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/extensions.ts new file mode 100644 index 0000000000..204192a4ae --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/extensions.ts @@ -0,0 +1,35 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { WorkflowLogProvider } from './api'; + +/** + * @public + */ +export interface WorkflowLogsExtensionPoint { + addWorkflowLogProvider( + ...workflowLogProviders: Array + ): void; +} + +/** + * @public + */ +export const workflowLogsExtensionEndpoint = + createExtensionPoint({ + id: 'orchestrator.workflowlogs', + }); diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/index.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/index.ts new file mode 100644 index 0000000000..be45fd025a --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Node.js library for the orchestrator plugin. + * + * @packageDocumentation + */ + +// In this package you might for example export functions that +// help other plugins or modules interact with your plugin. + +export * from './extensions'; +export * from './api'; diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts new file mode 100644 index 0000000000..6f9349f324 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export {}; From 179a77a8dd7c944ef73bec3bf13b806df8c9d18c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 17 Nov 2025 14:02:54 -0500 Subject: [PATCH 04/52] squash: working but needs tests and cleanup --- workspaces/orchestrator/app-config.yaml | 16 ++++--- .../packages/backend/src/index.ts | 1 + .../package.json | 3 +- .../src/module.ts | 1 + .../src/workflowLogsProviders/LokiProvider.ts | 42 +++++++++++++------ .../orchestrator-backend/src/plugin.ts | 2 - .../src/service/OrchestratorService.ts | 14 ++++++- .../src/service/WorkflowLoggerService.ts | 40 ------------------ .../src/service/api/v2.ts | 3 +- .../src/service/router.ts | 13 +++--- .../src/generated/.METADATA.sha1 | 2 +- .../src/generated/api/definition.ts | 2 +- .../src/generated/client/api.ts | 23 +++++++++- .../docs/api-doc/orchestrator-api.yaml | 13 +++++- .../src/generated/docs/html/index.html | 20 +++++++-- .../docs/markdown/.openapi-generator/FILES | 1 + .../docs/markdown/Apis/DefaultApi.md | 4 +- .../markdown/Models/WorkflowLogsResponse.md | 10 +++++ .../src/generated/docs/markdown/README.md | 1 + .../src/openapi/openapi.yaml | 13 +++++- .../src/api/WorkflowLogProvider.ts | 7 +++- 21 files changed, 146 insertions(+), 85 deletions(-) delete mode 100644 workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowLogsResponse.md diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index 6d99881853..39707ca446 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -1,6 +1,8 @@ app: title: RHDH Plugins - baseUrl: http://localhost:3000 + baseUrl: http://localhost:3001 +listen: + port: 3001 organization: name: Red Hat @@ -23,7 +25,7 @@ backend: # Content-Security-Policy directives follow the Helmet format: https://helmetjs.github.io/#reference # Default Helmet Content-Security-Policy values can be removed by setting the key to false cors: - origin: http://localhost:3000 + origin: http://localhost:3001 methods: [GET, HEAD, PATCH, POST, PUT, DELETE] credentials: true # This is for local development only, it is not recommended to use this in production @@ -147,9 +149,13 @@ catalog: dynamicPlugins: frontend: {} orchestrator: + # Does more that one at a time make sense? + workflowLogProvider: + loki: + baseUrl: http://localhost:3100 sonataFlowService: # uncomment the next line to use podman instead of docker - # runtime: podman + runtime: podman baseUrl: http://localhost port: 8899 autoStart: true @@ -159,9 +165,9 @@ orchestrator: # container: registry.redhat.io/openshift-serverless-1/logic-swf-devmode-rhel8:1.35.0 # notsecret notificationsBearerToken: bXljdXJscGFzc3dkCg== - notificationsUrl: http://host.docker.internal:7007 + # notificationsUrl: http://host.docker.internal:7007 # uncomment the next line if you are using podman: - # notificationsUrl: http://host.containers.internal:7007 + notificationsUrl: http://host.containers.internal:7007 # By default the Dev Mode workflows are Ephemeral. If you want to persist the data across restarts, # uncomment the next two lines, read more: https://www.rhdhorchestrator.io/blog/devmode-vs-prodmode/ # persistence: diff --git a/workspaces/orchestrator/packages/backend/src/index.ts b/workspaces/orchestrator/packages/backend/src/index.ts index 70d7f1cb00..693fb13c66 100644 --- a/workspaces/orchestrator/packages/backend/src/index.ts +++ b/workspaces/orchestrator/packages/backend/src/index.ts @@ -75,6 +75,7 @@ backend.add(import('@backstage/plugin-scaffolder-backend-module-gitlab')); // custom authentication provider module backend.add(import('custom-authentication-provider-module-backend')); +// orchestrator Log Provider backend.add( import( '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index 7ac8e6578e..2dc8fc3d72 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -39,7 +39,8 @@ "dependencies": { "@backstage/backend-plugin-api": "^1.4.4", "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^", - "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^", + "luxon": "^3.7.2" }, "devDependencies": { "@backstage/backend-test-utils": "^1.9.1", diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts index 3a7bdd1f83..910aa7c378 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts @@ -34,6 +34,7 @@ export const orchestratorModuleLoki = createBackendModule({ logger.info('Hello World!'); console.log('In the loki backend module'); workflowLogs.addWorkflowLogProvider(LokiProvider.fromConfig(config)); + console.log('here'); }, }); }, diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 6ad5979ec7..ba88f58383 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -15,7 +15,11 @@ */ import type { Config } from '@backstage/config'; -import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { DateTime } from 'luxon'; +import { + ProcessInstanceDTO, + WorkflowLogsResponse, +} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; export class LokiProvider implements WorkflowLogProvider { @@ -31,17 +35,30 @@ export class LokiProvider implements WorkflowLogProvider { return 'loki'; } - async fetchWorkflowLogsByIntance(instance: ProcessInstanceDTO) { + async fetchWorkflowLogsByIntance( + instance: ProcessInstanceDTO, + ): Promise { // Fetch the logs, probably add something to that orchestrator service object? OR maybe a logViewerService object instead // We are not querying actual orchestrator since the logs don't live there // Query will be against the log provider, like Loki for example // logViewerService is probably going to be the new class/interface that other providers can implement in the future + // Becuase of timing issues, subtract 5 mintues from the start and add 5 minutes to the end + const startTime = DateTime.fromISO(instance.start as string, { + setZone: true, + }) + .minus({ minutes: 5 }) + .toISO(); + const endTime = instance.end + ? DateTime.fromISO(instance.end as string, { setZone: true }) + .plus({ minutes: 5 }) + .toISO() + : ''; const lokiApiEndpoint = '/loki/api/v1/query_range'; const params = new URLSearchParams({ query: `{service_name=~".+"} |="${instance.id}"`, - start: instance.start as string, - end: instance.end || '', + start: startTime as string, + end: endTime as string, }); const urlToFetch = `${this.baseURL}${lokiApiEndpoint}?${params.toString()}`; @@ -50,7 +67,7 @@ export class LokiProvider implements WorkflowLogProvider { let allResults; if (response.status !== 200) { - console.log('ERror', response.statusText, response); + console.log('Error', response.statusText, response); } else { const jsonResponse = await response.json(); // Reduce the results into another array @@ -64,18 +81,19 @@ export class LokiProvider implements WorkflowLogProvider { [], ); } - return allResults.sort((a: number[], b: number[]) => { - return a[0] - b[0]; - }); + const workflowLogsResponse: WorkflowLogsResponse = { + instanceId: instance.id, + logs: allResults.sort((a: number[], b: number[]) => { + return a[0] - b[0]; + }), + }; + return workflowLogsResponse; } static fromConfig(config: Config): LokiProvider { const lokiConfig = config.getConfig( - 'orchestrator.workflowLogProviders.loki', + 'orchestrator.workflowLogProvider.loki', ); - console.log(lokiConfig); - // const random = config.getString('orchestrator.workflowLogProviders.loki.thing'); - // console.log(random); return new LokiProvider(lokiConfig); } } diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts index d4e9cf1092..3e9cd76cc6 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/plugin.ts @@ -42,8 +42,6 @@ export const orchestratorPlugin = createBackendPlugin({ ...newWorkflowLogProviders: WorkflowLogProvider[] ) { newWorkflowLogProviders.forEach(workflowLogProvider => { - // TODO: add this workflow log provider to our list of providers - console.log(workflowLogProvider); workflowLogsProvidersRegistry.register(workflowLogProvider); }); }, diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts index 3537f1242d..7f279dd7b4 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts @@ -23,6 +23,7 @@ import { WorkflowDefinition, WorkflowExecutionResponse, WorkflowInfo, + WorkflowLogsResponse, WorkflowOverview, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; @@ -176,8 +177,17 @@ export class OrchestratorService { public async fetchWorkflowLogsByInstance(args: { instance: ProcessInstanceDTO; - }): Promise { - return this.workflowLogProvider?.fetchWorkflowLogsByIntance(args.instance); + }): Promise { + return this.workflowLogProvider?.fetchWorkflowLogsByIntance( + args.instance, + ) as WorkflowLogsResponse; + } + + public hasLogProvider(): boolean { + if (this.workflowLogProvider) { + return true; + } + return false; } public async pingWorkflowService(args: { diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts deleted file mode 100644 index cfa075d6b4..0000000000 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/WorkflowLoggerService.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Red Hat, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; - -import { ErrorBuilder } from '../helpers/errorBuilder'; - -export class WorkflowLoggerService { - private readonly logStorageURL: string; - public constructor( - // private readonly dataIndexUrl: string, - private readonly storageURL: string, - private readonly logger: LoggerService, - ) { - if (!storageURL.length) { - throw ErrorBuilder.GET_NO_LOG_STORAGE_URL_ERR(); - } - - this.logStorageURL = storageURL; - } - - public async fetchWorkflowLogsById(instance: ProcessInstanceDTO) { - console.log(instance); - } -} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts index c9696e00a5..7738d8d95c 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.ts @@ -27,6 +27,7 @@ import { RetriggerInstanceRequestDTO, WorkflowDTO, WorkflowInfo, + WorkflowLogsResponse, WorkflowOverviewDTO, WorkflowOverviewListResultDTO, WorkflowRunStatusDTO, @@ -182,7 +183,7 @@ export class V2 { public async getInstanceLogsByInstance( instance: ProcessInstanceDTO, - ): Promise { + ): Promise { const logs = await this.orchestratorService.fetchWorkflowLogsByInstance({ instance, }); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 9c491b1888..60df30b818 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -64,7 +64,6 @@ import { DataInputSchemaService } from './DataInputSchemaService'; import { OrchestratorService } from './OrchestratorService'; import { SonataFlowService } from './SonataFlowService'; import { WorkflowCacheService } from './WorkflowCacheService'; -import { WorkflowLoggerService } from './WorkflowLoggerService'; interface PublicServices { dataInputSchemaService: DataInputSchemaService; @@ -276,11 +275,7 @@ function initPublicServices( // Create that workflow logging class/interface instance here const workflowLogProvider: WorkflowLogProvider | undefined = workflowLogsProvidersRegistry.getProvider('loki'); - if (workflowLogProvider) { - console.log('There is a provider'); - } - // ADD the workflow logging interface here const orchestratorService = new OrchestratorService( sonataFlowService, dataIndexService, @@ -971,7 +966,7 @@ function setupInternalRoutes( 'getWorkflowLogById', async (c, request: express.Request, res: express.Response, next) => { const instanceId = c.request.params.instanceId as string; - // TODO: will probably have to get the raw log at some point + // will probably have to get the raw log at some point // const rawLog = c.request.query.instanceId as Boolean; const auditEvent = await auditor.createEvent({ @@ -984,6 +979,10 @@ function setupInternalRoutes( }); try { + // Check that a log provider has been setup + if (!services.orchestratorService.hasLogProvider()) { + throw new Error(`No log provider setup`); + } const instance = await routerApi.v2.getInstanceById(instanceId); const workflowId = instance.processId; @@ -1022,8 +1021,6 @@ function setupInternalRoutes( } const logs = await routerApi.v2.getInstanceLogsByInstance(instance); - // Do something with the logs to send back - console.log(logs); auditEvent.success(); res.status(200).json(logs); diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 index 56d80a0d0a..4addaae01d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 @@ -1 +1 @@ -73a08e3205a43e0ec0b1eace083477e66a8a4dfa +e0a54c3f43e5af770f273960e0a76017ff76bf7d diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts index 828735bdc2..ac97ddc863 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/api/definition.ts @@ -1,5 +1,5 @@ /* eslint-disable */ /* prettier-ignore */ // GENERATED FILE DO NOT EDIT. -const OPENAPI = `{"openapi":"3.1.0","info":{"title":"Orchestratorplugin","description":"APItointeractwithorchestratorplugin","license":{"name":"Apache2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"0.0.1"},"servers":[{"url":"/"}],"paths":{"/v2/workflows/overview":{"post":{"operationId":"getWorkflowsOverview","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Paginationandfilters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/overview/entity":{"post":{"operationId":"getWorkflowsOverviewForEntity","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Targetentityreferenceandannotationworkflowids","content":{"application/json":{"schema":{"type":"object","properties":{"targetEntity":{"type":"string"},"annotationWorkflowIds":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviewsforentity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/overview":{"get":{"operationId":"getWorkflowOverviewById","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","parameters":[{"name":"workflowId","in":"path","required":true,"description":"Uniqueidentifieroftheworkflow","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewDTO"}}}},"500":{"description":"Errorfetchingworkflowoverview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/source":{"get":{"operationId":"getWorkflowSourceById","description":"Gettheworkflow'sdefinition","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorfetchingworkflowsourcebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/inputSchema":{"get":{"operationId":"getWorkflowInputSchemaById","description":"Gettheworkflowinputschema.Itdefinestheinputfieldsoftheworkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"query","description":"IDofinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputSchemaResponseDTO"}}}},"500":{"description":"Errorfetchingworkflowinputschemabyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/pingWorkflowService":{"get":{"operationId":"pingWorkflowServiceById","description":"ReturnstrueiftheworkflowserviceisupforthegivenworkflowID.","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"boolean"}}}},"500":{"description":"Errorpingingworkflowservicebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances":{"post":{"operationId":"getInstances","summary":"Getinstances","description":"Retrieveanarrayofworkflowexecutions(instances)","requestBody":{"required":false,"description":"Parametersforretrievinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/instances":{"post":{"operationId":"getWorkflowInstances","summary":"Getinstancesforaspecificworkflow","description":"Retrieveanarrayofworkflowexecutions(instances)forthegivenworkflow","parameters":[{"name":"workflowId","in":"path","required":true,"description":"IDoftheworkflow","schema":{"type":"string"}}],"requestBody":{"required":false,"description":"Parametersforretrievingworkflowinstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}":{"get":{"summary":"GetWorkflowInstancebyID","description":"Getaworkflowexecution/run(instance)","operationId":"getInstanceById","parameters":[{"name":"instanceId","in":"path","required":true,"description":"IDoftheworkflowinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfulresponse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchinginstance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/logs":{"get":{"operationId":"getWorkflowLogById","description":"ReturnsthelogforagivenworkflowID.","parameters":[{"name":"instanceId","in":"path","description":"IDoftheworkflowinstance","required":true,"schema":{"type":"string"}},{"name":"rawlog","in":"query","description":"whethertoreturntherawlogornot","schema":{"type":"boolean","default":"false"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/statuses":{"get":{"operationId":"getWorkflowStatuses","summary":"Getworkflowstatuslist","description":"Retrievearraywiththestatusofallinstances","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowRunStatusDTO"}}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/execute":{"post":{"summary":"Executeaworkflow","description":"Executeaworkflow","operationId":"executeWorkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtoexecute","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowRequestDTO"}}}},"responses":{"200":{"description":"Successfulexecution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowResponseDTO"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/{instanceId}/retrigger":{"post":{"summary":"Retriggeraninstance","description":"Retriggeraninstance","operationId":"retriggerInstance","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflow","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"path","description":"IDoftheinstancetoretrigger","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetriggerInstanceRequestDTO"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/abort":{"delete":{"summary":"Abortaworkflowinstance","operationId":"abortWorkflow","description":"AbortsaworkflowinstanceidentifiedbytheprovidedinstanceId.","parameters":[{"name":"instanceId","in":"path","required":true,"description":"Theidentifieroftheworkflowinstancetoabort.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfuloperation","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorabortingworkflow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ErrorResponse":{"description":"TheErrorResponseobjectrepresentsacommonstructureforhandlingerrorsinAPIresponses.Itincludesessentialinformationabouttheerror,suchastheerrormessageandadditionaloptionaldetails.","type":"object","properties":{"message":{"description":"Astringprovidingaconciseandhuman-readabledescriptionoftheencounterederror.ThisfieldisrequiredintheErrorResponseobject.","type":"string","default":"internalservererror"},"additionalInfo":{"description":"Anoptionalfieldthatcancontainadditionalinformationorcontextabouttheerror.Itprovidesflexibilityforincludingextradetailsbasedonspecificerrorscenarios.","type":"string"}},"required":["message"]},"GetOverviewsRequestParams":{"type":"object","properties":{"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"},"filters":{"$ref":"#/components/schemas/SearchRequest"}}},"WorkflowOverviewListResultDTO":{"type":"object","properties":{"overviews":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOverviewDTO"},"minItems":0},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"WorkflowOverviewDTO":{"type":"object","properties":{"workflowId":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"lastRunId":{"type":"string"},"lastTriggeredMs":{"type":"number","minimum":0},"lastRunStatus":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"description":{"type":"string"},"isAvailable":{"type":"boolean"}},"required":["workflowId","format"]},"PaginationInfoDTO":{"type":"object","properties":{"pageSize":{"type":"number"},"offset":{"type":"number"},"orderDirection":{"enum":["ASC","DESC"]},"orderBy":{"type":"string"}},"additionalProperties":false},"WorkflowFormatDTO":{"type":"string","description":"Formatoftheworkflowdefinition","enum":["yaml","json"]},"WorkflowListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}},"required":["items","paginationInfo"]},"WorkflowDTO":{"type":"object","properties":{"id":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"description":{"type":"string","description":"Descriptionoftheworkflow"},"annotations":{"type":"array","items":{"type":"string"}}},"required":["id","format"]},"ProcessInstanceListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProcessInstanceDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"ProcessInstanceDTO":{"type":"object","properties":{"id":{"type":"string"},"processId":{"type":"string"},"processName":{"type":"string"},"state":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"endpoint":{"type":"string"},"serviceUrl":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"duration":{"type":"string"},"description":{"type":"string"},"workflowdata":{"$ref":"#/components/schemas/WorkflowDataDTO"},"initiatorEntity":{"type":"string"},"targetEntity":{"type":"string"},"executionSummary":{"type":"array","items":{"type":"string"}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInstanceDTO"}},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}},"required":["id","processId","nodes"]},"WorkflowDataDTO":{"type":"object","properties":{"result":{"$ref":"#/components/schemas/WorkflowResultDTO"}},"additionalProperties":true},"WorkflowResultDTO":{"description":"Resultofaworkflowexecution","type":"object","properties":{"message":{"description":"High-levelsummaryofthecurrentstatus,free-formtext,humanreadable.","type":"string"},"nextWorkflows":{"description":"Listofworkflowssuggestedtorunnext.Itemsatlowerindexesareofhigherpriority.","type":"array","items":{"type":"object","properties":{"id":{"description":"Workflowidentifier","type":"string"},"name":{"description":"Humanreadabletitledescribingtheworkflow.","type":"string"}},"required":["id","name"]}},"outputs":{"description":"Additionalstructuredoutputofworkflowprocessing.Thiscancontainidentifiersofcreatedresources,linkstoresources,logsorotheroutput.","type":"array","items":{"type":"object","properties":{"key":{"description":"Uniqueidentifieroftheoption.Preferablyhuman-readable.","type":"string"},"value":{"description":"Freeformvalueoftheoption.","anyOf":[{"type":"string"},{"type":"number"}]},"format":{"description":"Moredetailedtypeofthe'value'property.Defaultsto'text'.","enum":["text","number","link","markdown"]}},"required":["key","value"]}}}},"ProcessInstanceStatusDTO":{"type":"string","description":"Statusoftheworkflowrun","enum":["ACTIVE","ERROR","COMPLETED","ABORTED","SUSPENDED","PENDING"]},"WorkflowRunStatusDTO":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"ExecuteWorkflowRequestDTO":{"type":"object","properties":{"inputData":{"type":"object","additionalProperties":true},"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true},"targetEntity":{"type":"string","description":"Theentitystringidentifiertoexecutetheworkflowfor"}}},"RetriggerInstanceRequestDTO":{"type":"object","properties":{"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true}}},"AuthToken":{"type":"object","properties":{"provider":{"description":"Theauthtokenprovidername","type":"string"},"token":{"description":"Theauthtokenitselfretrievedfromtheabovespecifiedprovidername","type":"string"}},"required":["provider","token"],"additionalProperties":false},"ExecuteWorkflowResponseDTO":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"WorkflowProgressDTO":{"allOf":[{"$ref":"#/components/schemas/NodeInstanceDTO"},{"type":"object","properties":{"status":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}}}]},"NodeInstanceDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"NodeInstance","description":"Typename"},"id":{"type":"string","description":"NodeinstanceID"},"name":{"type":"string","description":"Nodename"},"type":{"type":"string","description":"Nodetype"},"enter":{"type":"string","description":"Datewhenthenodewasentered"},"exit":{"type":"string","description":"Datewhenthenodewasexited(optional)"},"definitionId":{"type":"string","description":"DefinitionID"},"nodeId":{"type":"string","description":"NodeID"}},"required":["id"]},"ProcessInstanceErrorDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"ProcessInstanceError","description":"Typename"},"nodeDefinitionId":{"type":"string","description":"NodedefinitionID"},"message":{"type":"string","description":"Errormessage(optional)"}},"required":["nodeDefinitionId"]},"SearchRequest":{"type":"object","properties":{"filters":{"$ref":"#/components/schemas/Filter"},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"Filter":{"oneOf":[{"$ref":"#/components/schemas/LogicalFilter"},{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]},"NestedFilter":{"type":"object","required":["field","nested"],"properties":{"field":{"type":"string"},"nested":{"oneOf":[{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]}}},"LogicalFilter":{"type":"object","required":["operator","filters"],"properties":{"operator":{"type":"string","enum":["AND","OR","NOT"]},"filters":{"type":"array","items":{"$ref":"#/components/schemas/Filter"}}}},"FieldFilter":{"type":"object","required":["field","operator","value"],"properties":{"field":{"type":"string"},"operator":{"type":"string","enum":["EQ","GT","GTE","LT","LTE","IN","IS_NULL","LIKE","BETWEEN"]},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}]}}},"InputSchemaResponseDTO":{"type":"object","properties":{"inputSchema":{"type":"object"},"data":{"type":"object"}}}}}}`; +const OPENAPI = `{"openapi":"3.1.0","info":{"title":"Orchestratorplugin","description":"APItointeractwithorchestratorplugin","license":{"name":"Apache2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"0.0.1"},"servers":[{"url":"/"}],"paths":{"/v2/workflows/overview":{"post":{"operationId":"getWorkflowsOverview","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Paginationandfilters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/overview/entity":{"post":{"operationId":"getWorkflowsOverviewForEntity","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","requestBody":{"required":false,"description":"Targetentityreferenceandannotationworkflowids","content":{"application/json":{"schema":{"type":"object","properties":{"targetEntity":{"type":"string"},"annotationWorkflowIds":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewListResultDTO"}}}},"500":{"description":"Errorfetchingworkflowoverviewsforentity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/overview":{"get":{"operationId":"getWorkflowOverviewById","description":"Returnsthekeyfieldsoftheworkflowincludingdataonthelastruninstance","parameters":[{"name":"workflowId","in":"path","required":true,"description":"Uniqueidentifieroftheworkflow","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOverviewDTO"}}}},"500":{"description":"Errorfetchingworkflowoverview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/source":{"get":{"operationId":"getWorkflowSourceById","description":"Gettheworkflow'sdefinition","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorfetchingworkflowsourcebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/inputSchema":{"get":{"operationId":"getWorkflowInputSchemaById","description":"Gettheworkflowinputschema.Itdefinestheinputfieldsoftheworkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"query","description":"IDofinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InputSchemaResponseDTO"}}}},"500":{"description":"Errorfetchingworkflowinputschemabyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/pingWorkflowService":{"get":{"operationId":"pingWorkflowServiceById","description":"ReturnstrueiftheworkflowserviceisupforthegivenworkflowID.","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtofetch","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"boolean"}}}},"500":{"description":"Errorpingingworkflowservicebyid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances":{"post":{"operationId":"getInstances","summary":"Getinstances","description":"Retrieveanarrayofworkflowexecutions(instances)","requestBody":{"required":false,"description":"Parametersforretrievinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/instances":{"post":{"operationId":"getWorkflowInstances","summary":"Getinstancesforaspecificworkflow","description":"Retrieveanarrayofworkflowexecutions(instances)forthegivenworkflow","parameters":[{"name":"workflowId","in":"path","required":true,"description":"IDoftheworkflow","schema":{"type":"string"}}],"requestBody":{"required":false,"description":"Parametersforretrievingworkflowinstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceListResultDTO"}}}},"500":{"description":"Errorfetchinginstances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}":{"get":{"summary":"GetWorkflowInstancebyID","description":"Getaworkflowexecution/run(instance)","operationId":"getInstanceById","parameters":[{"name":"instanceId","in":"path","required":true,"description":"IDoftheworkflowinstance","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfulresponse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessInstanceDTO"}}}},"500":{"description":"Errorfetchinginstance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/logs":{"get":{"operationId":"getWorkflowLogById","description":"ReturnsthelogforagivenworkflowID.","parameters":[{"name":"instanceId","in":"path","description":"IDoftheworkflowinstance","required":true,"schema":{"type":"string"}},{"name":"rawlog","in":"query","description":"whethertoreturntherawlogornot","schema":{"type":"boolean","default":"false"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowLogsResponse"}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/statuses":{"get":{"operationId":"getWorkflowStatuses","summary":"Getworkflowstatuslist","description":"Retrievearraywiththestatusofallinstances","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowRunStatusDTO"}}}}},"500":{"description":"Errorfetchingworkflowstatuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/execute":{"post":{"summary":"Executeaworkflow","description":"Executeaworkflow","operationId":"executeWorkflow","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflowtoexecute","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowRequestDTO"}}}},"responses":{"200":{"description":"Successfulexecution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkflowResponseDTO"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/{workflowId}/{instanceId}/retrigger":{"post":{"summary":"Retriggeraninstance","description":"Retriggeraninstance","operationId":"retriggerInstance","parameters":[{"name":"workflowId","in":"path","description":"IDoftheworkflow","required":true,"schema":{"type":"string"}},{"name":"instanceId","in":"path","description":"IDoftheinstancetoretrigger","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetriggerInstanceRequestDTO"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"InternalServerError","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v2/workflows/instances/{instanceId}/abort":{"delete":{"summary":"Abortaworkflowinstance","operationId":"abortWorkflow","description":"AbortsaworkflowinstanceidentifiedbytheprovidedinstanceId.","parameters":[{"name":"instanceId","in":"path","required":true,"description":"Theidentifieroftheworkflowinstancetoabort.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfuloperation","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Errorabortingworkflow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ErrorResponse":{"description":"TheErrorResponseobjectrepresentsacommonstructureforhandlingerrorsinAPIresponses.Itincludesessentialinformationabouttheerror,suchastheerrormessageandadditionaloptionaldetails.","type":"object","properties":{"message":{"description":"Astringprovidingaconciseandhuman-readabledescriptionoftheencounterederror.ThisfieldisrequiredintheErrorResponseobject.","type":"string","default":"internalservererror"},"additionalInfo":{"description":"Anoptionalfieldthatcancontainadditionalinformationorcontextabouttheerror.Itprovidesflexibilityforincludingextradetailsbasedonspecificerrorscenarios.","type":"string"}},"required":["message"]},"GetOverviewsRequestParams":{"type":"object","properties":{"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"},"filters":{"$ref":"#/components/schemas/SearchRequest"}}},"WorkflowOverviewListResultDTO":{"type":"object","properties":{"overviews":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOverviewDTO"},"minItems":0},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"WorkflowOverviewDTO":{"type":"object","properties":{"workflowId":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"lastRunId":{"type":"string"},"lastTriggeredMs":{"type":"number","minimum":0},"lastRunStatus":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"description":{"type":"string"},"isAvailable":{"type":"boolean"}},"required":["workflowId","format"]},"PaginationInfoDTO":{"type":"object","properties":{"pageSize":{"type":"number"},"offset":{"type":"number"},"orderDirection":{"enum":["ASC","DESC"]},"orderBy":{"type":"string"}},"additionalProperties":false},"WorkflowFormatDTO":{"type":"string","description":"Formatoftheworkflowdefinition","enum":["yaml","json"]},"WorkflowListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}},"required":["items","paginationInfo"]},"WorkflowDTO":{"type":"object","properties":{"id":{"type":"string","description":"Workflowuniqueidentifier","minLength":1},"name":{"type":"string","description":"Workflowname","minLength":1},"format":{"$ref":"#/components/schemas/WorkflowFormatDTO"},"description":{"type":"string","description":"Descriptionoftheworkflow"},"annotations":{"type":"array","items":{"type":"string"}}},"required":["id","format"]},"ProcessInstanceListResultDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProcessInstanceDTO"}},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"ProcessInstanceDTO":{"type":"object","properties":{"id":{"type":"string"},"processId":{"type":"string"},"processName":{"type":"string"},"state":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"endpoint":{"type":"string"},"serviceUrl":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"duration":{"type":"string"},"description":{"type":"string"},"workflowdata":{"$ref":"#/components/schemas/WorkflowDataDTO"},"initiatorEntity":{"type":"string"},"targetEntity":{"type":"string"},"executionSummary":{"type":"array","items":{"type":"string"}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInstanceDTO"}},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}},"required":["id","processId","nodes"]},"WorkflowDataDTO":{"type":"object","properties":{"result":{"$ref":"#/components/schemas/WorkflowResultDTO"}},"additionalProperties":true},"WorkflowResultDTO":{"description":"Resultofaworkflowexecution","type":"object","properties":{"message":{"description":"High-levelsummaryofthecurrentstatus,free-formtext,humanreadable.","type":"string"},"nextWorkflows":{"description":"Listofworkflowssuggestedtorunnext.Itemsatlowerindexesareofhigherpriority.","type":"array","items":{"type":"object","properties":{"id":{"description":"Workflowidentifier","type":"string"},"name":{"description":"Humanreadabletitledescribingtheworkflow.","type":"string"}},"required":["id","name"]}},"outputs":{"description":"Additionalstructuredoutputofworkflowprocessing.Thiscancontainidentifiersofcreatedresources,linkstoresources,logsorotheroutput.","type":"array","items":{"type":"object","properties":{"key":{"description":"Uniqueidentifieroftheoption.Preferablyhuman-readable.","type":"string"},"value":{"description":"Freeformvalueoftheoption.","anyOf":[{"type":"string"},{"type":"number"}]},"format":{"description":"Moredetailedtypeofthe'value'property.Defaultsto'text'.","enum":["text","number","link","markdown"]}},"required":["key","value"]}}}},"ProcessInstanceStatusDTO":{"type":"string","description":"Statusoftheworkflowrun","enum":["ACTIVE","ERROR","COMPLETED","ABORTED","SUSPENDED","PENDING"]},"WorkflowRunStatusDTO":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"ExecuteWorkflowRequestDTO":{"type":"object","properties":{"inputData":{"type":"object","additionalProperties":true},"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true},"targetEntity":{"type":"string","description":"Theentitystringidentifiertoexecutetheworkflowfor"}}},"RetriggerInstanceRequestDTO":{"type":"object","properties":{"authTokens":{"type":"array","items":{"$ref":"#/components/schemas/AuthToken"},"minItems":0,"additionalProperties":true}}},"AuthToken":{"type":"object","properties":{"provider":{"description":"Theauthtokenprovidername","type":"string"},"token":{"description":"Theauthtokenitselfretrievedfromtheabovespecifiedprovidername","type":"string"}},"required":["provider","token"],"additionalProperties":false},"ExecuteWorkflowResponseDTO":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"WorkflowProgressDTO":{"allOf":[{"$ref":"#/components/schemas/NodeInstanceDTO"},{"type":"object","properties":{"status":{"$ref":"#/components/schemas/ProcessInstanceStatusDTO"},"error":{"$ref":"#/components/schemas/ProcessInstanceErrorDTO"}}}]},"NodeInstanceDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"NodeInstance","description":"Typename"},"id":{"type":"string","description":"NodeinstanceID"},"name":{"type":"string","description":"Nodename"},"type":{"type":"string","description":"Nodetype"},"enter":{"type":"string","description":"Datewhenthenodewasentered"},"exit":{"type":"string","description":"Datewhenthenodewasexited(optional)"},"definitionId":{"type":"string","description":"DefinitionID"},"nodeId":{"type":"string","description":"NodeID"}},"required":["id"]},"ProcessInstanceErrorDTO":{"type":"object","properties":{"__typename":{"type":"string","default":"ProcessInstanceError","description":"Typename"},"nodeDefinitionId":{"type":"string","description":"NodedefinitionID"},"message":{"type":"string","description":"Errormessage(optional)"}},"required":["nodeDefinitionId"]},"SearchRequest":{"type":"object","properties":{"filters":{"$ref":"#/components/schemas/Filter"},"paginationInfo":{"$ref":"#/components/schemas/PaginationInfoDTO"}}},"Filter":{"oneOf":[{"$ref":"#/components/schemas/LogicalFilter"},{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]},"NestedFilter":{"type":"object","required":["field","nested"],"properties":{"field":{"type":"string"},"nested":{"oneOf":[{"$ref":"#/components/schemas/FieldFilter"},{"$ref":"#/components/schemas/NestedFilter"}]}}},"LogicalFilter":{"type":"object","required":["operator","filters"],"properties":{"operator":{"type":"string","enum":["AND","OR","NOT"]},"filters":{"type":"array","items":{"$ref":"#/components/schemas/Filter"}}}},"FieldFilter":{"type":"object","required":["field","operator","value"],"properties":{"field":{"type":"string"},"operator":{"type":"string","enum":["EQ","GT","GTE","LT","LTE","IN","IS_NULL","LIKE","BETWEEN"]},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}]}}},"InputSchemaResponseDTO":{"type":"object","properties":{"inputSchema":{"type":"object"},"data":{"type":"object"}}},"WorkflowLogsResponse":{"description":"Resultofworkflowlogquery","type":"object","properties":{"instanceId":{"description":"TheIDoftheworkflowinstance","type":"string"},"logs":{"description":"AnArrayofthelogstoreturn","type":"array"}}}}}}`; export const openApiDocument = JSON.parse(OPENAPI); diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts index 65a5109bfe..5bb5754951 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/client/api.ts @@ -639,6 +639,25 @@ export interface WorkflowListResultDTO { */ 'paginationInfo': PaginationInfoDTO; } +/** + * Result of workflow log query + * @export + * @interface WorkflowLogsResponse + */ +export interface WorkflowLogsResponse { + /** + * The ID of the workflow instance + * @type {string} + * @memberof WorkflowLogsResponse + */ + 'instanceId'?: string; + /** + * An Array of the logs to return + * @type {any} + * @memberof WorkflowLogsResponse + */ + 'logs'?: any; +} /** * * @export @@ -1488,7 +1507,7 @@ export const DefaultApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getWorkflowLogById(instanceId, rawlog, options); const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerBasePath = operationServerMap['DefaultApi.getWorkflowLogById']?.[localVarOperationServerIndex]?.url; @@ -1660,7 +1679,7 @@ export const DefaultApiFactory = function (configuration?: Configuration, basePa * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: any): AxiosPromise { + getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: any): AxiosPromise { return localVarFp.getWorkflowLogById(instanceId, rawlog, options).then((request) => request(axios, basePath)); }, /** diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml index 0dd09042b9..464238b508 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml @@ -284,7 +284,7 @@ spec: content: application/json: schema: - $ref: '#/components/schemas/ProcessInstanceDTO' # Need to create something new here + $ref: '#/components/schemas/WorkflowLogsResponse' # Need to create something new here '500': description: Error fetching workflow statuses content: @@ -820,3 +820,14 @@ spec: type: object data: type: object + + WorkflowLogsResponse: + description: Result of workflow log query + type: object + properties: + instanceId: + description: The ID of the workflow instance + type: string + logs: + description: An Array of the logs to return + type: array diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html index b25d4b797a..c83fff2cc5 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/html/index.html @@ -1237,6 +1237,18 @@ "$ref" : "#/components/schemas/PaginationInfoDTO" } } +}; + defs["WorkflowLogsResponse"] = { + "properties" : { + "instanceId" : { + "type" : "string", + "description" : "The ID of the workflow instance" + }, + "logs" : { + "description" : "An Array of the logs to return" + } + }, + "description" : "Result of workflow log query" }; defs["WorkflowOverviewDTO"] = { "required" : [ "format", "workflowId" ], @@ -4225,7 +4237,7 @@

    Usage and SDK Samples

    Boolean rawlog = true; // Boolean | whether to return the raw log or not try { - ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog); + WorkflowLogsResponse result = apiInstance.getWorkflowLogById(instanceId, rawlog); System.out.println(result); } catch (ApiException e) { System.err.println("Exception when calling DefaultApi#getWorkflowLogById"); @@ -4264,7 +4276,7 @@

    Usage and SDK Samples

    Boolean rawlog = true; // Boolean | whether to return the raw log or not try { - ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog); + WorkflowLogsResponse result = apiInstance.getWorkflowLogById(instanceId, rawlog); System.out.println(result); } catch (ApiException e) { System.err.println("Exception when calling DefaultApi#getWorkflowLogById"); @@ -4287,7 +4299,7 @@

    Usage and SDK Samples

    [apiInstance getWorkflowLogByIdWith:instanceId rawlog:rawlog - completionHandler: ^(ProcessInstanceDTO output, NSError* error) { + completionHandler: ^(WorkflowLogsResponse output, NSError* error) { if (output) { NSLog(@"%@", output); } @@ -4342,7 +4354,7 @@

    Usage and SDK Samples

    var rawlog = true; // Boolean | whether to return the raw log or not (optional) (default to false) try { - ProcessInstanceDTO result = apiInstance.getWorkflowLogById(instanceId, rawlog); + WorkflowLogsResponse result = apiInstance.getWorkflowLogById(instanceId, rawlog); Debug.WriteLine(result); } catch (Exception e) { Debug.Print("Exception when calling DefaultApi.getWorkflowLogById: " + e.Message ); diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/FILES b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/FILES index a054cd7b78..384b4f7f62 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/FILES +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/FILES @@ -24,6 +24,7 @@ Models/WorkflowDTO.md Models/WorkflowDataDTO.md Models/WorkflowFormatDTO.md Models/WorkflowListResultDTO.md +Models/WorkflowLogsResponse.md Models/WorkflowOverviewDTO.md Models/WorkflowOverviewListResultDTO.md Models/WorkflowProgressDTO.md diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md index 6c33adfb60..fd7a0e275d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Apis/DefaultApi.md @@ -187,7 +187,7 @@ No authorization required # **getWorkflowLogById** -> ProcessInstanceDTO getWorkflowLogById(instanceId, rawlog) +> WorkflowLogsResponse getWorkflowLogById(instanceId, rawlog) @@ -202,7 +202,7 @@ No authorization required ### Return type -[**ProcessInstanceDTO**](../Models/ProcessInstanceDTO.md) +[**WorkflowLogsResponse**](../Models/WorkflowLogsResponse.md) ### Authorization diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowLogsResponse.md b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowLogsResponse.md new file mode 100644 index 0000000000..333183d20b --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowLogsResponse.md @@ -0,0 +1,10 @@ +# WorkflowLogsResponse +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **instanceId** | **String** | The ID of the workflow instance | [optional] [default to null] | +| **logs** | [**oas_any_type_not_mapped**](.md) | An Array of the logs to return | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md index 90f452bee8..ea12698905 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/markdown/README.md @@ -50,6 +50,7 @@ All URIs are relative to *http://localhost* - [WorkflowDataDTO](./Models/WorkflowDataDTO.md) - [WorkflowFormatDTO](./Models/WorkflowFormatDTO.md) - [WorkflowListResultDTO](./Models/WorkflowListResultDTO.md) + - [WorkflowLogsResponse](./Models/WorkflowLogsResponse.md) - [WorkflowOverviewDTO](./Models/WorkflowOverviewDTO.md) - [WorkflowOverviewListResultDTO](./Models/WorkflowOverviewListResultDTO.md) - [WorkflowProgressDTO](./Models/WorkflowProgressDTO.md) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml index 5c2f23cd54..344c221106 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml @@ -272,7 +272,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ProcessInstanceDTO' # Need to create something new here + $ref: '#/components/schemas/WorkflowLogsResponse' # Need to create something new here '500': description: Error fetching workflow statuses content: @@ -808,3 +808,14 @@ components: type: object data: type: object + + WorkflowLogsResponse: + description: Result of workflow log query + type: object + properties: + instanceId: + description: The ID of the workflow instance + type: string + logs: + description: An Array of the logs to return + type: array diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts index 48f711c2bd..a2d3dabf7d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { + ProcessInstanceDTO, + WorkflowLogsResponse, +} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; /** * @public @@ -24,5 +27,5 @@ export interface WorkflowLogProvider { getBaseURL(): string; fetchWorkflowLogsByIntance( workflowInstance: ProcessInstanceDTO, - ): Promise; + ): Promise; } From 2ecef35a6d1af4dc63d5f8e4d9ab7d977ace8c3f Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 17 Nov 2025 14:31:06 -0500 Subject: [PATCH 05/52] squash: making things prettier --- workspaces/orchestrator/app-config.yaml | 2 +- .../plugins/orchestrator-common/src/openapi/openapi.yaml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index 39707ca446..ba0c75e5a2 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -2,7 +2,7 @@ app: title: RHDH Plugins baseUrl: http://localhost:3001 listen: - port: 3001 + port: 3001 organization: name: Red Hat diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml index 344c221106..131c97ea60 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/openapi/openapi.yaml @@ -247,8 +247,6 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorResponse' - # This might actually need to know the workflow instanceID to get the proper log - # TODO: also need a raw log endpoint, or just a parameter /v2/workflows/instances/{instanceId}/logs: get: operationId: getWorkflowLogById From 928831d7bb98d1456f95c9796746c386c447c4d5 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 17 Nov 2025 14:41:50 -0500 Subject: [PATCH 06/52] squash: api generate --- .../plugins/orchestrator-common/src/generated/.METADATA.sha1 | 2 +- .../src/generated/docs/api-doc/orchestrator-api.yaml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 index 4addaae01d..c7e1ca2c41 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/.METADATA.sha1 @@ -1 +1 @@ -e0a54c3f43e5af770f273960e0a76017ff76bf7d +29ca3997832aabcbc991d7ee209a2201c100b234 diff --git a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml index 464238b508..e93958fff7 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml +++ b/workspaces/orchestrator/plugins/orchestrator-common/src/generated/docs/api-doc/orchestrator-api.yaml @@ -259,8 +259,6 @@ spec: application/json: schema: $ref: '#/components/schemas/ErrorResponse' - # This might actually need to know the workflow instanceID to get the proper log - # TODO: also need a raw log endpoint, or just a parameter /v2/workflows/instances/{instanceId}/logs: get: operationId: getWorkflowLogById From 399d1789eea21916382c6a1c20bda821f7b64378 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 17 Nov 2025 14:48:10 -0500 Subject: [PATCH 07/52] squash: api docs --- .../report.api.md | 19 +++++++++ .../plugins/orchestrator-node/report.api.md | 40 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md create mode 100644 workspaces/orchestrator/plugins/orchestrator-node/report.api.md diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md new file mode 100644 index 0000000000..46642424c9 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md @@ -0,0 +1,19 @@ +## API Report File for "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// Warning: (ae-missing-release-tag) "orchestratorModuleLoki" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +const orchestratorModuleLoki: BackendFeature; +export default orchestratorModuleLoki; + +// Warnings were encountered during analysis: +// +// src/module.d.ts:1:22 - (ae-undocumented) Missing documentation for "orchestratorModuleLoki". + +``` diff --git a/workspaces/orchestrator/plugins/orchestrator-node/report.api.md b/workspaces/orchestrator/plugins/orchestrator-node/report.api.md new file mode 100644 index 0000000000..474ce436fd --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-node/report.api.md @@ -0,0 +1,40 @@ +## API Report File for "@red-hat-developer-hub/backstage-plugin-orchestrator-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { WorkflowLogsResponse } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; + +// @public (undocumented) +export interface WorkflowLogProvider { + // (undocumented) + fetchWorkflowLogsByIntance(workflowInstance: ProcessInstanceDTO): Promise; + // (undocumented) + getBaseURL(): string; + // (undocumented) + getProviderId(): string; +} + +// @public (undocumented) +export const workflowLogsExtensionEndpoint: ExtensionPoint; + +// @public (undocumented) +export interface WorkflowLogsExtensionPoint { + // (undocumented) + addWorkflowLogProvider(...workflowLogProviders: Array): void; +} + +// Warnings were encountered during analysis: +// +// src/api/WorkflowLogProvider.d.ts:5:1 - (ae-undocumented) Missing documentation for "WorkflowLogProvider". +// src/api/WorkflowLogProvider.d.ts:6:5 - (ae-undocumented) Missing documentation for "getProviderId". +// src/api/WorkflowLogProvider.d.ts:7:5 - (ae-undocumented) Missing documentation for "getBaseURL". +// src/api/WorkflowLogProvider.d.ts:8:5 - (ae-undocumented) Missing documentation for "fetchWorkflowLogsByIntance". +// src/extensions.d.ts:5:1 - (ae-undocumented) Missing documentation for "WorkflowLogsExtensionPoint". +// src/extensions.d.ts:6:5 - (ae-undocumented) Missing documentation for "addWorkflowLogProvider". +// src/extensions.d.ts:11:22 - (ae-undocumented) Missing documentation for "workflowLogsExtensionEndpoint". + +``` From 6820ac519861a6efaff2977a1b218b1b74288930 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 17 Nov 2025 20:48:41 -0500 Subject: [PATCH 08/52] squash: syncing --- .../orchestrator/plugins/orchestrator-common/package.json | 3 ++- workspaces/orchestrator/plugins/orchestrator-node/package.json | 2 +- workspaces/orchestrator/plugins/orchestrator/package.json | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/package.json b/workspaces/orchestrator/plugins/orchestrator-common/package.json index 167f15f695..c57a396ca8 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-common/package.json @@ -16,7 +16,8 @@ "pluginPackages": [ "@red-hat-developer-hub/backstage-plugin-orchestrator", "@red-hat-developer-hub/backstage-plugin-orchestrator-backend", - "@red-hat-developer-hub/backstage-plugin-orchestrator-common" + "@red-hat-developer-hub/backstage-plugin-orchestrator-common", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node" ] }, "homepage": "https://red.ht/rhdh", diff --git a/workspaces/orchestrator/plugins/orchestrator-node/package.json b/workspaces/orchestrator/plugins/orchestrator-node/package.json index 0c6f5d9d46..dfe0b5bb14 100644 --- a/workspaces/orchestrator/plugins/orchestrator-node/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-node/package.json @@ -54,7 +54,7 @@ "repository": { "type": "git", "url": "https://github.com/redhat-developer/rhdh-plugins", - "directory": "workspaces/scorecard/plugins/scorecard-node" + "directory": "workspaces/orchestrator/plugins/orchestrator-node" }, "keywords": [ "backstage", diff --git a/workspaces/orchestrator/plugins/orchestrator/package.json b/workspaces/orchestrator/plugins/orchestrator/package.json index e6ef65e35f..bbbf3a1c85 100644 --- a/workspaces/orchestrator/plugins/orchestrator/package.json +++ b/workspaces/orchestrator/plugins/orchestrator/package.json @@ -15,7 +15,8 @@ "pluginPackages": [ "@red-hat-developer-hub/backstage-plugin-orchestrator", "@red-hat-developer-hub/backstage-plugin-orchestrator-backend", - "@red-hat-developer-hub/backstage-plugin-orchestrator-common" + "@red-hat-developer-hub/backstage-plugin-orchestrator-common", + "@red-hat-developer-hub/backstage-plugin-orchestrator-node" ] }, "homepage": "https://red.ht/rhdh", From 81fc68c49d65ce812c1c35998fcd45f4059f53a8 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 19 Nov 2025 12:05:51 -0500 Subject: [PATCH 09/52] squash: . --- .../orchestrator-node/src/{setupTests.ts => setup.test.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename workspaces/orchestrator/plugins/orchestrator-node/src/{setupTests.ts => setup.test.ts} (100%) diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts similarity index 100% rename from workspaces/orchestrator/plugins/orchestrator-node/src/setupTests.ts rename to workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts From a96ed2c92d1a47a765829f47814f221454e574c0 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 19 Nov 2025 13:45:58 -0500 Subject: [PATCH 10/52] squash: trying this out --- .sonarcloud.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index ecd14a57c4..fffc56548a 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1 +1,3 @@ sonar.cpd.exclusions=workspaces/*/packages/app/**, workspaces/*/packages/backend/**, workspaces/*/plugins/*test*/**, **/*.test.*, **/translations/*.ts, **/__fixtures__/*, **/playwright.config.ts +sonar.exclusions=workspaces/*/plugins/orchestrator-common/src/generated/** + From f2deb6005ef537750ae8b6916d93067294548e49 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 3 Dec 2025 12:02:25 -0500 Subject: [PATCH 11/52] squash: updating the yan.lock --- workspaces/orchestrator/yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/orchestrator/yarn.lock b/workspaces/orchestrator/yarn.lock index 2da7e99ef4..69b20d7bfa 100644 --- a/workspaces/orchestrator/yarn.lock +++ b/workspaces/orchestrator/yarn.lock @@ -2949,7 +2949,7 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-test-utils@npm:^1.10.0": +"@backstage/backend-test-utils@npm:^1.10.0, @backstage/backend-test-utils@npm:^1.9.1": version: 1.10.0 resolution: "@backstage/backend-test-utils@npm:1.10.0" dependencies: @@ -3036,7 +3036,7 @@ __metadata: languageName: node linkType: hard -"@backstage/cli@npm:^0.34.5": +"@backstage/cli@npm:^0.34.4, @backstage/cli@npm:^0.34.5": version: 0.34.5 resolution: "@backstage/cli@npm:0.34.5" dependencies: From 3bbed50ef543a49d329f80d860a0adad4e75e52c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 5 Dec 2025 12:55:10 -0500 Subject: [PATCH 12/52] squash: starting testing - LokiProvider --- .../__fixtures__/mockWorkflowLogs.ts | 74 ++++++++++++ .../LokiProvider.test.ts | 114 ++++++++++++++++++ .../src/workflowLogsProviders/LokiProvider.ts | 36 ++++-- 3 files changed, 214 insertions(+), 10 deletions(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/__fixtures__/mockWorkflowLogs.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/__fixtures__/mockWorkflowLogs.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/__fixtures__/mockWorkflowLogs.ts new file mode 100644 index 0000000000..48351a3380 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/__fixtures__/mockWorkflowLogs.ts @@ -0,0 +1,74 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const mockWorkflowLog = { + status: 'success', + data: { + resultType: 'streams', + result: [ + { + stream: { + detected_level: 'error', + service_name: 'unknown_service', + }, + values: [ + [ + '1764952546330041000', + '2025-12-05 16:35:14,644 9eb78e04f727 ERROR [org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl:1316] (executor-thread-14) Unexpected error while executing node createNotification in process instance 7a6d2622-a315-4737-9278-36311ba4583a: org.jbpm.workflow.instance.WorkflowRuntimeException: [sendnotification:7a6d2622-a315-4737-9278-36311ba4583a - createNotification:[uuid=7]] -- RESTEASY004655: Unable to invoke request: org.apache.http.client.ClientProtocolException', + ], + ], + }, + { + stream: { + detected_level: 'info', + service_name: 'unknown_service', + }, + values: [ + [ + '1764952546332968000', + "2025-12-05 16:35:14,668 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:50] (executor-thread-14) Workflow 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a) was started, now 'Error'", + ], + [ + '1764952546327277000', + '2025-12-05 16:35:14,626 9eb78e04f727 INFO [org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler:105] (executor-thread-14) error workItem WorkItem 7ee1509a-03b4-47e2-891f-31f6d225e520 [name=notifications_createNotification, state=1, processInstanceId=7a6d2622-a315-4737-9278-36311ba4583a, parameters{Parameter={"recipients":["user:development/guest"],"title":"This is a notification","topic":"Manually sent"}, payload={severity=normal, link=https://www.redhat.com, description=Description of the notification, topic=Manually sent, title=This is a notification}, recipients={entityRef=[user:development/guest], type=entity}}] handled by notifications_createNotification transition DefaultWorkItemTransitionImpl [id=activate, data={}, policies=[], termination=null] : jakarta.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request: org.apache.http.client.ClientProtocolException', + ], + [ + '1764952546327248000', + "2025-12-05 16:35:13,632 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:64] (executor-thread-14) Triggered node 'createNotification' for process 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a)", + ], + [ + '1764952546327240000', + "2025-12-05 16:35:13,628 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:64] (executor-thread-14) Triggered node 'SendNotification' for process 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a)", + ], + [ + '1764952546327187000', + "2025-12-05 16:35:13,623 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:64] (executor-thread-14) Triggered node 'Prepare' for process 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a)", + ], + [ + '1764952546327177000', + "2025-12-05 16:35:13,622 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:64] (executor-thread-14) Triggered node 'Start' for process 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a)", + ], + [ + '1764952546327102000', + "2025-12-05 16:35:13,618 9eb78e04f727 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:40] (executor-thread-14) Starting workflow 'sendnotification' (7a6d2622-a315-4737-9278-36311ba4583a)", + ], + ], + }, + ], + }, +}; + +export default mockWorkflowLog; diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts new file mode 100644 index 0000000000..42ac301811 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts @@ -0,0 +1,114 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ConfigReader } from '@backstage/config'; +import { + ProcessInstanceDTO, + WorkflowLogsResponse, +} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { LokiProvider } from './LokiProvider'; +import mockWorkflowLog from '../../__fixtures__/mockWorkflowLogs'; + +describe('LokiProvider', () => { + describe('FromConfig', () => { + it('should do something when nothing in the app-config or it is configured wrong', () => { + // TODO + expect(true).toEqual(true); + }); + it('should create a provider when there is an entry in the app-config', () => { + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + + // Test for the baseUrl + expect(provider.getBaseURL()).toEqual( + lokiAppConfig.orchestrator.workflowLogProvider.loki.baseUrl, + ); + // Test the providerId + expect(provider.getProviderId()).toEqual('loki'); + }); + }); + describe('fetchWorkflowLogsByIntance', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it('should be somthing wrong', async () => { + // TODO + }); + it('should something good', async () => { + const mockResponse: Partial = { + ok: true, + status: 200, + json: jest.fn().mockResolvedValue(mockWorkflowLog), + }; + global.fetch = jest.fn().mockResolvedValue(mockResponse as any); + + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + const workflowInstance: ProcessInstanceDTO = { + id: '12345', + processId: '54321', + start: '2025-12-05T16:35:13.621Z', + end: '', + nodes: [], + }; + + const urlToFetch = + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + const workflowLogs = + await provider.fetchWorkflowLogsByIntance(workflowInstance); + + const parsedURLToFetch = new URL(urlToFetch); + expect(fetch).toHaveBeenCalledWith(urlToFetch); + expect(parsedURLToFetch.origin).toEqual(provider.getBaseURL()); + expect(parsedURLToFetch.pathname).toEqual('/loki/api/v1/query_range'); + expect(parsedURLToFetch.searchParams.get('end')).toEqual(''); + expect(parsedURLToFetch.searchParams.get('start')).toEqual( + '2025-12-05T16:30:13.621Z', + ); // should be 5 minutes before + expect(parsedURLToFetch.searchParams.get('query')).toEqual( + `{service_name=~".+"} |="${workflowInstance.id}"`, + ); + expect(workflowLogs).toHaveProperty('instanceId', workflowInstance.id); + expect(workflowLogs).toHaveProperty('logs'); + expect(workflowLogs.logs.length).toEqual(8); + + expect(workflowLogs.logs[0]).toHaveProperty('id'); + expect(workflowLogs.logs[0]).toHaveProperty('log'); + // Sorted correctly, this id is the last in the mockdata and should be first when returned + expect(workflowLogs.logs[0].id).toEqual('1764952546327102000'); + }); + }); +}); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index ba88f58383..c7da4ac1dd 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -25,6 +25,8 @@ import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orc export class LokiProvider implements WorkflowLogProvider { private readonly baseURL: string; private constructor(config: Config) { + // TODO: will probably also need information regarding auth tokens and stuff for loki + // Might Also make sense to separate out the loki http stuff to its own "client" this.baseURL = config.getString('baseUrl'); } getBaseURL(): string { @@ -38,11 +40,6 @@ export class LokiProvider implements WorkflowLogProvider { async fetchWorkflowLogsByIntance( instance: ProcessInstanceDTO, ): Promise { - // Fetch the logs, probably add something to that orchestrator service object? OR maybe a logViewerService object instead - // We are not querying actual orchestrator since the logs don't live there - // Query will be against the log provider, like Loki for example - // logViewerService is probably going to be the new class/interface that other providers can implement in the future - // Becuase of timing issues, subtract 5 mintues from the start and add 5 minutes to the end const startTime = DateTime.fromISO(instance.start as string, { setZone: true, @@ -66,25 +63,44 @@ export class LokiProvider implements WorkflowLogProvider { const response = await fetch(urlToFetch); let allResults; - if (response.status !== 200) { + if (response.status > 399) { + // TODO: These are errors, throw something here console.log('Error', response.statusText, response); } else { const jsonResponse = await response.json(); + + /** + Data should look like this + { + "instanceId": "efe0490f-6300-453b-bcb6-f47eb7efbb36", + "logs": [ + { + id: "1763129443414066000", + log: "2025-11-14 14:08:52,645 d5932f2cb566 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:40] (executor-thread-97) Starting workflow 'hello_world' (efe0490f-6300-453b-bcb6-f47eb7efbb36)" + }, + ... + ] + } + */ // Reduce the results into another array allResults = jsonResponse.data.result.reduce( (acc: any[], curr: { values: any[] }) => { - curr.values.reduce((_innerAcc: any, innerCurr: any) => { - acc.push(innerCurr); + curr.values.reduce((_: any, innerCurr: any) => { + acc.push({ + id: innerCurr[0], + log: innerCurr[1], + }); }, acc); return acc; }, [], ); } + const workflowLogsResponse: WorkflowLogsResponse = { instanceId: instance.id, - logs: allResults.sort((a: number[], b: number[]) => { - return a[0] - b[0]; + logs: allResults.sort((a: { id: number }, b: { id: number }) => { + return Number(a.id) - Number(b.id); }), }; return workflowLogsResponse; From 2033a5e0798cd3ddc973df1692aefe32c0a0a9cc Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 5 Dec 2025 12:57:19 -0500 Subject: [PATCH 13/52] squash: starting testing - LokiProvider --- .../plugins/orchestrator-backend-module-loki/package.json | 3 ++- .../src/workflowLogsProviders/LokiProvider.test.ts | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index 2dc8fc3d72..169755fc3a 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -44,7 +44,8 @@ }, "devDependencies": { "@backstage/backend-test-utils": "^1.9.1", - "@backstage/cli": "^0.34.4" + "@backstage/cli": "^0.34.4", + "@backstage/config": "^1.3.6" }, "files": [ "dist" diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts index 42ac301811..c003c9467c 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts @@ -15,10 +15,7 @@ */ import { ConfigReader } from '@backstage/config'; -import { - ProcessInstanceDTO, - WorkflowLogsResponse, -} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { ProcessInstanceDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; import { LokiProvider } from './LokiProvider'; import mockWorkflowLog from '../../__fixtures__/mockWorkflowLogs'; From 1f324e06ba270243a467901249885f721060d594 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 5 Dec 2025 13:08:38 -0500 Subject: [PATCH 14/52] squash: remove unneeded file --- .../plugins/orchestrator-node/src/setup.test.ts | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts deleted file mode 100644 index 6f9349f324..0000000000 --- a/workspaces/orchestrator/plugins/orchestrator-node/src/setup.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Red Hat, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export {}; From 7af1c22da4111f730d41f6779058d7ce9d89543a Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 5 Jan 2026 09:17:44 -0500 Subject: [PATCH 15/52] squash: update yarn lock after rebase --- workspaces/orchestrator/yarn.lock | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/workspaces/orchestrator/yarn.lock b/workspaces/orchestrator/yarn.lock index 69b20d7bfa..62e0b7a409 100644 --- a/workspaces/orchestrator/yarn.lock +++ b/workspaces/orchestrator/yarn.lock @@ -12411,6 +12411,20 @@ __metadata: languageName: node linkType: hard +"@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki@workspace:^, @red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki@workspace:plugins/orchestrator-backend-module-loki": + version: 0.0.0-use.local + resolution: "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki@workspace:plugins/orchestrator-backend-module-loki" + dependencies: + "@backstage/backend-plugin-api": ^1.4.4 + "@backstage/backend-test-utils": ^1.9.1 + "@backstage/cli": ^0.34.4 + "@backstage/config": ^1.3.6 + "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^" + luxon: ^3.7.2 + languageName: unknown + linkType: soft + "@red-hat-developer-hub/backstage-plugin-orchestrator-backend@workspace:^, @red-hat-developer-hub/backstage-plugin-orchestrator-backend@workspace:plugins/orchestrator-backend": version: 0.0.0-use.local resolution: "@red-hat-developer-hub/backstage-plugin-orchestrator-backend@workspace:plugins/orchestrator-backend" @@ -12432,6 +12446,7 @@ __metadata: "@janus-idp/backstage-plugin-audit-log-node": ^1.7.1 "@janus-idp/cli": 3.6.1 "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^" "@types/express": 4.17.25 "@types/fs-extra": 11.0.4 "@types/json-schema": 7.0.15 @@ -12566,6 +12581,16 @@ __metadata: languageName: unknown linkType: soft +"@red-hat-developer-hub/backstage-plugin-orchestrator-node@workspace:^, @red-hat-developer-hub/backstage-plugin-orchestrator-node@workspace:plugins/orchestrator-node": + version: 0.0.0-use.local + resolution: "@red-hat-developer-hub/backstage-plugin-orchestrator-node@workspace:plugins/orchestrator-node" + dependencies: + "@backstage/backend-plugin-api": ^1.4.4 + "@backstage/cli": ^0.34.4 + "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^" + languageName: unknown + linkType: soft + "@red-hat-developer-hub/backstage-plugin-orchestrator@workspace:^, @red-hat-developer-hub/backstage-plugin-orchestrator@workspace:plugins/orchestrator": version: 0.0.0-use.local resolution: "@red-hat-developer-hub/backstage-plugin-orchestrator@workspace:plugins/orchestrator" @@ -17998,6 +18023,7 @@ __metadata: "@backstage/plugin-signals-backend": ^0.3.10 "@backstage/plugin-techdocs-backend": ^2.1.2 "@red-hat-developer-hub/backstage-plugin-orchestrator-backend": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki": "workspace:^" "@red-hat-developer-hub/backstage-plugin-scaffolder-backend-module-orchestrator": "workspace:^" "@types/express": ^4.17.6 "@types/express-serve-static-core": ^4.17.5 From 2182500c7246f7d9d958927be4db9ce92887e39e Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 5 Jan 2026 10:28:15 -0500 Subject: [PATCH 16/52] squash: adding return value in reduce should help? --- .../src/workflowLogsProviders/LokiProvider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index c7da4ac1dd..ca21a24136 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -90,6 +90,7 @@ export class LokiProvider implements WorkflowLogProvider { id: innerCurr[0], log: innerCurr[1], }); + return; }, acc); return acc; }, From cddd72e9920792934fcf0691dd9cf8c0336042e4 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 5 Jan 2026 10:57:54 -0500 Subject: [PATCH 17/52] squash: use a flatmap instead? --- .../src/workflowLogsProviders/LokiProvider.ts | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index ca21a24136..9ffea8ce71 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -82,20 +82,32 @@ export class LokiProvider implements WorkflowLogProvider { ] } */ + // flatMap Instead? + allResults = jsonResponse.data.result + .flatMap((val: any[]) => { + return val.values; + }) + .map((val: any[]) => { + return { + id: val[0], + log: val[1], + }; + }); // Reduce the results into another array - allResults = jsonResponse.data.result.reduce( - (acc: any[], curr: { values: any[] }) => { - curr.values.reduce((_: any, innerCurr: any) => { - acc.push({ - id: innerCurr[0], - log: innerCurr[1], - }); - return; - }, acc); - return acc; - }, - [], - ); + // allResults = jsonResponse.data.result.reduce( + // (acc: any[], curr: { values: any[] }) => { + // const innerCurrValues = curr.values.reduce((innerAcc: any, innerCurr: any) => { + // acc.push({ + // id: innerCurr[0], + // log: innerCurr[1], + // }); + // return innerAcc; + // }, []); + // // acc.concat(innerCurrValues); + // return acc; + // }, + // [], + // ); } const workflowLogsResponse: WorkflowLogsResponse = { From 9ecf2974baceac7293155941593de66c54e65880 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 5 Jan 2026 11:38:25 -0500 Subject: [PATCH 18/52] squash: using flatmap --- .../src/workflowLogsProviders/LokiProvider.ts | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 9ffea8ce71..59d6127791 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -82,7 +82,13 @@ export class LokiProvider implements WorkflowLogProvider { ] } */ - // flatMap Instead? + // flatMap and map the results to an array like this: + /** + * { + * id: '123456', + * log: '2025-11-14 14:08:52,645 d5932f2cb566 INFO [org.kie.kogito.serverless.workflow.devservices.De....' + * } + */ allResults = jsonResponse.data.result .flatMap((val: any[]) => { return val.values; @@ -93,21 +99,6 @@ export class LokiProvider implements WorkflowLogProvider { log: val[1], }; }); - // Reduce the results into another array - // allResults = jsonResponse.data.result.reduce( - // (acc: any[], curr: { values: any[] }) => { - // const innerCurrValues = curr.values.reduce((innerAcc: any, innerCurr: any) => { - // acc.push({ - // id: innerCurr[0], - // log: innerCurr[1], - // }); - // return innerAcc; - // }, []); - // // acc.concat(innerCurrValues); - // return acc; - // }, - // [], - // ); } const workflowLogsResponse: WorkflowLogsResponse = { From 0f441fbcf98cfcdf19f07517a8ed7a72254ad613 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 09:37:28 -0500 Subject: [PATCH 19/52] squash: add use of custom selectors in the appconfig --- workspaces/orchestrator/app-config.yaml | 7 +- .../LokiProvider.test.ts | 141 +++++++++++++++++- .../src/workflowLogsProviders/LokiProvider.ts | 30 +++- 3 files changed, 175 insertions(+), 3 deletions(-) diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index ba0c75e5a2..4ba6797e36 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -149,10 +149,15 @@ catalog: dynamicPlugins: frontend: {} orchestrator: - # Does more that one at a time make sense? + # Does more than one at a time make sense? workflowLogProvider: loki: baseUrl: http://localhost:3100 + # logStreamSelectors: + # - label: 'selector' + # value: 'value' + # - label: 'selector-2' + # value: 'value' sonataFlowService: # uncomment the next line to use podman instead of docker runtime: podman diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts index c003c9467c..7d69c9563d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts @@ -45,6 +45,44 @@ describe('LokiProvider', () => { ); // Test the providerId expect(provider.getProviderId()).toEqual('loki'); + + // Test the selectors passed in + // Should be an empty array when nothing is passed in + expect(provider.getSelectors()).toEqual([]); + }); + it('should create a provider with custom selectors', () => { + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + logStreamSelectors: [ + { + label: 'custom-selector', + value: '=~".+"', + }, + { + label: 'custom-selector1', + value: '=~".+"', + }, + ], + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + + // Test the selectors passed in + expect(provider.getSelectors()[0]).toEqual( + lokiAppConfig.orchestrator.workflowLogProvider.loki + .logStreamSelectors[0], + ); + expect(provider.getSelectors()[1]).toEqual( + lokiAppConfig.orchestrator.workflowLogProvider.loki + .logStreamSelectors[1], + ); }); }); describe('fetchWorkflowLogsByIntance', () => { @@ -54,7 +92,7 @@ describe('LokiProvider', () => { it('should be somthing wrong', async () => { // TODO }); - it('should something good', async () => { + it('should pass with defaults', async () => { const mockResponse: Partial = { ok: true, status: 200, @@ -107,5 +145,106 @@ describe('LokiProvider', () => { // Sorted correctly, this id is the last in the mockdata and should be first when returned expect(workflowLogs.logs[0].id).toEqual('1764952546327102000'); }); + + it('should have a custom log selector and filter', async () => { + const mockResponse: Partial = { + ok: true, + status: 200, + json: jest.fn().mockResolvedValue(mockWorkflowLog), + }; + global.fetch = jest.fn().mockResolvedValue(mockResponse as any); + + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + logStreamSelectors: [ + { + label: 'custom-selector', + value: '=~".+"', + }, + { + label: 'custom-selector1', + value: '=~".+"', + }, + ], + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + const workflowInstance: ProcessInstanceDTO = { + id: '12345', + processId: '54321', + start: '2025-12-05T16:35:13.621Z', + end: '', + nodes: [], + }; + + const urlToFetch = + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bcustom-selector%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + + await provider.fetchWorkflowLogsByIntance(workflowInstance); + + const parsedURLToFetch = new URL(urlToFetch); + expect(fetch).toHaveBeenCalledWith(urlToFetch); + expect(parsedURLToFetch.origin).toEqual(provider.getBaseURL()); + expect(parsedURLToFetch.pathname).toEqual('/loki/api/v1/query_range'); + expect(parsedURLToFetch.searchParams.get('query')).toEqual( + `{custom-selector=~".+",custom-selector1=~".+"} |="${workflowInstance.id}"`, + ); + }); + + it('should have a custom log selector and filter, no label and no value, use defaults', async () => { + const mockResponse: Partial = { + ok: true, + status: 200, + json: jest.fn().mockResolvedValue(mockWorkflowLog), + }; + global.fetch = jest.fn().mockResolvedValue(mockResponse as any); + + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + logStreamSelectors: [ + { + value: '=~".+"', + }, + { + label: 'custom-selector1', + }, + ], + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + const workflowInstance: ProcessInstanceDTO = { + id: '12345', + processId: '54321', + start: '2025-12-05T16:35:13.621Z', + end: '', + nodes: [], + }; + + const urlToFetch = + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + + await provider.fetchWorkflowLogsByIntance(workflowInstance); + const parsedURLToFetch = new URL(urlToFetch); + expect(fetch).toHaveBeenCalledWith(urlToFetch); + expect(parsedURLToFetch.origin).toEqual(provider.getBaseURL()); + expect(parsedURLToFetch.pathname).toEqual('/loki/api/v1/query_range'); + expect(parsedURLToFetch.searchParams.get('query')).toEqual( + `{service_name=~".+",custom-selector1=~".+"} |="${workflowInstance.id}"`, + ); + }); }); }); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 59d6127791..49242b87ee 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -24,10 +24,12 @@ import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orc export class LokiProvider implements WorkflowLogProvider { private readonly baseURL: string; + private readonly selectors: any; private constructor(config: Config) { // TODO: will probably also need information regarding auth tokens and stuff for loki // Might Also make sense to separate out the loki http stuff to its own "client" this.baseURL = config.getString('baseUrl'); + this.selectors = config.getOptional('logStreamSelectors') || []; } getBaseURL(): string { return this.baseURL; @@ -37,6 +39,10 @@ export class LokiProvider implements WorkflowLogProvider { return 'loki'; } + getSelectors() { + return this.selectors; + } + async fetchWorkflowLogsByIntance( instance: ProcessInstanceDTO, ): Promise { @@ -52,8 +58,30 @@ export class LokiProvider implements WorkflowLogProvider { .toISO() : ''; const lokiApiEndpoint = '/loki/api/v1/query_range'; + // Query is created with a log stream selector and then a log pipeline for more filtering + // format looks like this: {stream-selector=expression} | log pipeline/log filter expression + // The log stream selector part of the query here is getting all service names + // This might need to be configurable, based on https://grafana.com/docs/loki/latest/query/log_queries/#log-stream-selector + // Log pipeline part looks for the workflow instance id in those logs + // Create the streamSelector + let streamSelector: string = ''; + if (this.selectors.length < 1) { + streamSelector = 'service_name=~".+"'; + } else { + this.selectors.forEach( + ( + entry: { label: any; value: any }, + index: number, + arr: string | any[], + ) => { + // somehting about that last comma + streamSelector += `${entry.label || 'service_name'}${entry.value || '=~".+"'}${index !== arr.length - 1 ? ',' : ''}`; + }, + ); + } + const logPipelineFilter = `|="${instance.id}"`; const params = new URLSearchParams({ - query: `{service_name=~".+"} |="${instance.id}"`, + query: `{${streamSelector}} ${logPipelineFilter}`, start: startTime as string, end: endTime as string, }); From 8f760565797657a871dded8f42b826b64bb5f179 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 10:01:48 -0500 Subject: [PATCH 20/52] squash: cleanup --- .../plugins/orchestrator-backend-module-loki/src/module.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts index 910aa7c378..2555341ca1 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts @@ -31,10 +31,8 @@ export const orchestratorModuleLoki = createBackendModule({ workflowLogs: workflowLogsExtensionEndpoint, }, async init({ config, logger, workflowLogs }) { - logger.info('Hello World!'); - console.log('In the loki backend module'); + logger.info('Initialize the Loki orchestrator backend module'); workflowLogs.addWorkflowLogProvider(LokiProvider.fromConfig(config)); - console.log('here'); }, }); }, From dfd8270fcb16eb76d6a6a3a9b8012cde39f79cb8 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 10:27:37 -0500 Subject: [PATCH 21/52] squash: update readme for loki provider --- .../README.md | 61 +++++++++++++++++- .../img/view-logs-button.png | Bin 0 -> 62953 bytes .../img/viewing-log.png | Bin 0 -> 428951 bytes 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/img/view-logs-button.png create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/img/viewing-log.png diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md index 0dae394303..a1cdfb5e09 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/README.md @@ -1,5 +1,60 @@ -# @@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki +# Orchestrator Backend Module for Loki -The loki backend module for the orchestrator plugin. +This is an extension module to the `backstage-plugin-orchestrator-backend` plugin. It provides access to the Loki log provider -_This plugin was created through the Backstage CLI_ +## Prerequisites + +Before installing this module, ensure that the Orchestrator backend plugin is integrated into your Backstage instance. Follow the [Orchestrator README](https://github.com/redhat-developer/rhdh-plugins/tree/main/workspaces/orchestrator) for setup instructions. + +This module also requires a Loki `workflowLogProvider` integration to be configured in your `app-config.yaml`. This will be added to the `orchestrator` section and might look something like this: + +``` +orchestrator: + workflowLogProvider: + loki: + baseUrl: http://localhost:3100 + # logStreamSelectors: + # - label: 'app' + # value: '=~".+"' +``` + +The `baseUrl` is required. + +Multiple Log Stream Selectors can be specified in the `logStreamSelectors` section. See the loki docs to learn more about log stream selectors and their values: https://grafana.com/docs/loki/latest/query/log_queries/#log-stream-selector + +## Installation + +To install this backend module: + +```bash +# From your root directory +yarn workspace backend add @red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki +``` + +```ts +// packages/backend/src/index.ts +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +// orchestrator +backend.add( + import('@red-hat-developer-hub/backstage-plugin-orchestrator-backend'), +); +// orchestrator Log Provider +backend.add( + import( + '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' + ), +); + +backend.start(); +``` + +## Usage + +Once the module is successfully setup, a user can view an orchestrator workflows log. This can be accessed by the new backend endpoint here: RHDH_BACK_END_URL/api/orchestrator/v2/workflows/instances/WORKFLOW_INSTANCE_ID/logs + +Or by clicking the "view log" link on the orchestrator front-end:![alt text](img/view-logs-button.png) + +![alt text](img/viewing-log.png) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/img/view-logs-button.png b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/img/view-logs-button.png new file mode 100644 index 0000000000000000000000000000000000000000..d69ebff4001409c1343fbfe3709ccddf98536a83 GIT binary patch literal 62953 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 z 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%0Dy~kaEH$LxDgwPh^q$m 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

    hWlt#5la_*gND0R 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�Mm$R`0;a6?vS?Mkx}-w{QOA9t3PqproC#A7xC&43u#|k%t>Xsux7)@<{^66 z_TLrHOW0TBMg|%-cWpS*$I#)<2?jKFV&whn9>+g_qzL=iUj&|?3POpwAwwSm#c)I} zV;J5Yx?<%%{1dr7qi<%cLh0@B#xTA$U-x~D()*Dxv+cUz6QnH_SFgNfTdQF@o=mR9 zLwLdCjJBa7Fg}EfQQ}DVD3@UM(*2^m9jE+06!FHh^~pCL_%Jc%aoCqTwc5fSDn;fE zi@?-T{Kun7m>H1hX0YqzXI=mZjxu8A;oZV!G27{nP~7)V1Ntj63Rznbi*&G1lss57 zd|{8OWN5+nwJv{<762+x+C|Jxg=QRY$O&eBba`4v&fv^*JD*7o9QNDCezpcpiiOS zi5NFy_J~n|gI00~alGaskTjC~mU)Y7(5Q(~RNBQ`E~7F`Iq1xS2erAUeZT2tuI4Hb zzWarP$~I_7!WDroqIT2z@0$Gwzon`cDz_HU$i%y=+Vkac2eSc|_9@2j%d zlUpCgof-D0Y(sD_vo)ww{OGH#1_Xn19suaKs}g~Yrzp27cqNf#L6Jc9DMpAhMK5o+R%up(NhuiB#kE=(wSwV?+ zaOq%-jv~}^sE5$c>13D4CF_~2?8pFk?OE^qq8l;vfKn5|5~?~_d#JA=A&)zR1! zcu-?C$|qFN<*L#Z^onO5vpi_Pwrb?2%jOJXQAEyrRdi}vh^A=XjBnjGa-Xk?TC52# z`T!a(i6`I<<@G-gbY9$OQ6m4$Abs{u>Zv@tK4=or)s(@bB=Ggsa(7zE2etOR)*vod zR96_8``}~O@;46v!1VXc5h{Q9Bo35Lqlom|eLUW8q$JD5Z1cG&v3DrS4m+P0DY}2K zp_uqlTkxlxfpJQ04oPzhY5!aEhn+8uhJ27D?Qn^GFOQ2?bu(%FPNB|R;3>WSt7T&K z-!!*r-&rqXhoy+!K1eQUc;lO6nTbPIWV<^}HdZAqxV5Yv<44-Jf2t!ue*w-` z7ufCD<_={$NZkFDiK|0}_g|%MEGxYSL=CgQ+6TpgThHezP3bK^b9D;< z>Ku+-n1I7Z?f#dRz|}$S$(-#jf^%VR?aqKyX^FW5BEPOIHmB;)eL5LPhtn2hT%WEi4!V<4KRV zHcyT?b4W^Ov#e~Wd0#wEem*#`z6O=O@8LYn+bhU;+;1oZhd~8nP1_eT)D7qG4Dk@| zE>XN1czw3hLbB3ALXEMe0HnOF(tam{*%OaslFPC}NA@Qip-kadwOtZVrcF%j@0~Y( z7&~eLQ$TvVvXxRBZvRJir6|%iV?1({A$1!NJ#N@<`BMDLMTIeF0y`yLDemZ_8SrZG zLfE@v-b*GZ)0Wx)lbmq7HnkG;wA0%D`sTxZM~UmY3oVh`LTSZ!YC-|xJC`?ap^l}k z4~~aKpKki8!ryQmpMQf$GHMVY<1v&c-%sVB!d$^&omkyJfS+CLhPiZ!@r+scn^FIR zZxjwYuNYJwq6<}3f);bxz4aTetKa~@X@8kS-Np_@X&^Xd4H6`|RvJdFc+$2HcRS%B zroL1(i6)|+oT5JF<)UggWKHlY(cD)A7{cKF zo}Sy<*H-^G;Y@ToERb zjxyKb##uynV65-CEV@5aa`gk35y8sTaPGG#$MWL{^=7Yb1^sdfLZUG4#~V-sKaz6A zxnF`3P$?`dNIE|%d7sgEZ)InUU;Od($s;$fzu2^F8!2;R2DYlwT&{6ME~ItVY)9d> z0tHJ7y3Wh%F_r1hDHv#WlwsgTFVlF}w__~anJd{WL)9ycIbcXguPK&T z(LCJ%qIgqYyr>}I>3`YH(YQ=nUo@hMNlO3MuD_d(_ga^w=$VWN0_QnXSHBeYKU8{g%p4~ipgn$^P(!DWmr^4@M z3DLB%1-gn*bIbxPld4Yw$1M=}#{I;i^{gudC^o$~ouU6?q%F~q{%jlJgGbCRC>?NJ za7Y=k`gq28=Yi+~Nw0j1tUF%;hrHNxL(vlX?!1aA8svZjji>-K{#Sgu-3Ke`$fbK~@GI8;}JM|4oAV4-Ld@@PuD)6c74wW7uj-_Pu2gtooY)&!Yv7;*s@<`uSORLj2|V zsmmd9e6qgIt{q^Yi{CX~%r3bg*#HgiXf@}9lk@jk{kaiuB^}LFkS!oR+icWRBGkOOLb?qpD7k+#56ZtlE``__lE>Zld z}YOqrlsNmjGli1OInYeu~J4U^sCIP3l{OX$?)v z$Q8NIU4znz|13N|y>_@7-i*g+6y|bH`nHvdJ9YGR#lwB+u18lclo&!t)uxiX1{ZxP zKiu}doKnVFwRo_zt}sgl77puZcTgb++73;dm}P7x?mtxhZq}GSCgtH!(h?+?<=S_T zt798kRntGq;ja}~C578HevT(e+5EB+j@;ec5+>H}-hVbk95eu)L*e)Q}~w_;v@+|9m^&I?fpeaw4PQ3t!qfw|@nbqJ@|XQF=A?xg0x{0Whp? zR+qaOQ#@)Q**uQIeJ|77GRtYs_@WJG@!Uj3oHS!8oj%Ly2PuppS9Zg%@mt>tg=nd& zeF7!zhs-jawrM5*Jw35;KVlEyQl$9E>4lUFwkO=qZ?R&IRHTGAoDm62Q@L23SPoko zO;|-Sy>xqtiy!bh2??#R=kT{mp%yQ9bR!RPGXKqxm=AI@?d=xdE2^8b`>dUNAI{oI z?o0zKmw`7KHSCk#eq4&{LRZsXqB+~n=0?Be+lH0+H`|-dF`==8;$=jdC)SE|*VcWJ z%wqimZ)5*_Nz;zvTIx-X+i0sAPqv~J?@23Vit7Q)t0J(LkEp-rQ3+;z4-H+K8+j5rW=Lh>2OVIM z?sih(ydT42W~Zn6vlW{ZW4IgGazP2=cdF!6N_1|h9|Bt=a|87Vp>yC$U zj7a^`?2-4v9fs?i<|*J1(xMjitJ~`)QW6BQuWljs4)4jABS5Sl#*v;jtpg7-+Cqsx z_5NTJrs(n3zrQ=~n@8}#edj!=UreAt5a<$^zz;%6#=iam&i|A>Tc5e+jcu{~BRhuG zb$1kN)V-PbfB-tskpv}#Mob`SC(_Q1?aaPNfzF#iinfBtMd1Dx{ymF$^7o=3Koq>= zXQMXmirZ5uee)^e4dM5s2DHqW@iHA47l-IO>|+gVG{(^o2ROUV5x>TTus;a`720b& zy@OBsF&(5(VoI-M>koGXDTZPg|!aT&r((MSIB%#{Ub z-Xgphm`amoar*9((UW#&E$_%N$nDa42k!UNEf)qTKa7ht8{*-)JLyo@_MNPIpBNi? z_eOA}iRBiT`0Yn@b#>N*4OEYu=vN$aR4)&HO4;v_VXq|P2z|gcS@jxX4f4YGwBIqY zSR*nD3VDxRRkl0!a)8zsZs-Y5@UAh|PY|Lc@S(nLM=2Z~zNJgVbao`130@ODvpp;#wed$wtp zzN)tC%O#eFHa#tkG;AF-ra_52dxZ^5Gg2E%Q(0;gWO)74E=zt@C zB}necax9Sk(-Z<3lKyGNg)v~Ld_rWIX5_zmMupIthW7h`BsNs)?oUtQUGLXuXtUpI zEqUP^TkU<_8UNVe#Y@q9d=h~9u(7Vxc8B5@!HJ3^m#4yQ1ff>IXWhrRn&U89CoCwV z=v&S8IbJu4bZa;Kwu(p(FiwPTz29?K#b(--@58eL`=oOfen(CRkGnMDhzUCliRNfr z!k9dkbD*?-G=RzD3)DCwxQG5@oApTFQ;QFed$c8<-fuFM`Zb@3_M14+OUakZ><~hP ze`V?s&EE`6; z;lOh=l`OB-q+QWu?0Zk6z#hCd`uZDj8##P0)y9nbVMAxGE6Sqtl;lQJ!A4@=Y8qr*b=0cYUoB40^;7=j>l*2Ls>tl^AdeNN z@C9dsz3r5wR1$Mg(~u&K2NPe4u!rDLNdQTFgVN1%YdSBUq1&3=f>#W-l41)z<+{%rt~q%AwH4UVQzgEb<5s}e zn><*YhuMJOe75x-ch`i(>nrWCLx7Ru3& z9yc?$FYu3bp@3}@aVlY@*@jJ#y`{N1>%tN0PY8|ij!bvn$zUuCW&Db1<4rUeVh)@Y zQQM#P&s}6O4Dx`fzQJnO<7b&?^8!I?^CA~e9rE;RS{$}d3}{}ex*n1WbM z`7t>kcGrCe1)7(E+EhPBpt@IU3#IAnC|(5rwKHwMqt;g(RSvuQCAAa*_lK>Ka;@`d zwb+*36JY}VM83_#>$zT9d`afGGN7QliTGUYB``pfLq*Gdv(A@d*FNen{C3Xn%N`US z;f-1Dd}fQzRWXC8X+6|FUHRt(d4+}cqe|#7zR{9-^WdBGnlUu(mE^alDo<2`Q<}r_ z^L2xbGf`da59rqadAp!f?`DYacjf4EE6s9JFXva{MTxa8^+j!TpZxlXPd4CoOo^b#i^`XXQO9 zKPg)i5?I)~bLWW}KOUf!7^Rx>;}}Pmmyv-81zZGNCw9%P%h3Hp5lJVfnO6G{U_%ck zrHT?{H2$+P<~rMotNjENjoO0)@Ei-~6g^x$Hbo421X=!nis0%GZzZRwh@SNaGOD^c z+rB1fD&-bv%*>|ah4*6=Jz{W#f-_MWrSG$+Ucx^CV5 z)Q<8cI&(tR>h&oK^_9F_!Zq!!_{X3OuuuB;u8dgqaj~by0j^$+MZvL}+5(|oktB)| zkly&{?S-ii|Dscfs^8+AvHzaXH>P=8C}TZH=V#j0sILO#`3i2jDpS+fPvrvrNe>IX zv=^=6a!tBj^J`&gp*G*~$jKI4=3MPO@m*%^xZ_$WC5EPbmx<~B^=={^v=fAbT+h7p zL)H9dYwMkP(3>TLoY#ahk#`DenC+JXXi%pZlkrsGoBmo&pFci+St6_KDZ8AYEi^y7W=^1=0u!T=JZ-Ve<46E7g7UV7%4)`RbqvX&$ ze9F++p^S3Ku)MA?*+v&rGIGCpi_Hr`XLEyI`coN^T2 z3EFeI1#X>OvShf7mGmI`BZKSk4+?9#TLbJBVXAypE(+NkcHf*dyZoA^92jg9JZVi@ zUuF?*SHHP-xo>><=2#bU$W!~LTJ#9{nTGsVe}V;KH;43lF`g?BEr<1J-cCZ3*+ zb%L2{R|jnmDQIAFardE3L{IQ$J3=NvNX{mx9|=~Hs02-`uki20s{$CuS`n|b4V%N3WPkA^kCC$hq0rHo0)N zSAgyj1GDqlWG1X1BlBaRS)WI3^Pbggo6IvALyY_ zS82?jN9>MczP#shf4`WXFf9E7H}T87K!rQ9s@luti5|=x$P) z?*Z%5W$e}cE}jVhSZbKGLF9e`C~X9VmjD-v{|U!wv3w2K-q;R^@D5NPxvWfWoqQg= z2X?*AzEIi^bL}Y#H5u7TPkqozz1rBuH4=64O;2=m#sSr+GTwIL&ft0sV!58d&xhTe zLe365x)>!XYzmJtBbPK|LEAc|z^*AVXgl&ZQO0<^!k9G=_+^%#cwn4*i`D^!iH@^LvYaB z39KLfxY?t>vofL4z{!$r$5lS@F1>#eWj(&VEje$v`R#56hKt>AeVX&$jO~>7yRrVI z?{+-7K-Dy7Bru8gf9$+*qK|;EbE`d#_G)O84NViDW zrb9v+q`SL+6QA=u=RIeP_v8P=e~kAdu=Zl@Ip@0X>#pnC%bPng*s?2LNbN|fp_&q- z=Kx{wE8#3ZW!icMYF0%(eEe{Q7Ln8#!s4#O-*^n$B%Ktob%a-j3|7<-baU;Kflybw z_U+4P&hXNce7w@|*)kp;tv#m_HCQSU zOCyj@%Bk>Sw;Rq1LVCw}c-vKzoI~lotX|LC6*1Yz6m9A5;ec}{rd2oH8G$a@of0Ka zR~ao!w}g65?lR;{eNEveW?|I##ul{kPPR};lBH8tA6c*wpM;gCFhz0ZQdC~;Qe4d~ z@cZN$g$q;}ps+3k*4Zos?s~uf?sof|IB3-G$t+9$Pz=Tco{d}Pqt@;TH_u(y^`^Dd zjcCmDy0wyp2Q9;u$dKL-J5qJKuX#D;n1Ik~OV6hhR0Fv37g63%4rM5`HzxHhfr@Bz zLlUk%qQz5_g;%mtpY}CBK6ROO=flJZ7?7v% z=w)seqX#j00*R7aeqIgHY8rfU2#&f5XI4&t!$-{ow|Bz`2|Rn;+C)-jva1;`svp_! ztIA6U;xZt=*Y2c6`)Ta76ovI9Uk81y4c%JLsx$CaFj2D5gzyp_sdmGg5D=(@Xc~NF z>Q?@$weT5$>>zRn89Q3L29|Optt_PBjuI2`bjsvYmasI#0En=08s(np_FgcUMo~9S zwU_!H4;dIe*ITlFrN=ZXVkB+F1WnlU+Vi0HgycJH+q=a~N8{N+2~;b8lTTqX-`Z!J z2$;*(B>I>;4a+i=Z500)j_spgjqTIWgvgT<<~&+_1=n}SlsMGtri zrk;*jbLN4_7p-dAO^h|A`q_00!5!eQaX6`kb~qBQEfy+OeAfda)2*Kk42KW9raE;| zC<31v0+H0kzUZe1Zq+X*Qa(PBMhfDxP9@@$ z4U@nlprM*_FJ;oSW&wUm`sf+en3Vu)OH7Eo$41GFN0pIVp^%0QE*3o5 zppyBCepodwo=*B9GwnUCCZW3gbXEl9(yPA-Cve92m(Eeaifx8aBB!*(E<`2Rjn#bY zm#hMX+_#1H@u}G+8A$`=0x0pL*biv9?b|5_+@@L8h8qIzTu#RsK zYxdU8e9rcUkN(1XV4+R*Op|6ZkCzmcXOf}cV_?f34iAb5?yTD-eMv(6bppVIZTzwJ zK!K#!M{MdmB#1SoEz1_q1#frmsE z6lI(y!*{4g#$Fj)jT>VQ%D7VwM|zRU1_xTC8H1Co?K3=Lvv;cFN&#CYjGEe+eU z>)m|fRaBLBJL$JI0u}%s{@TVfsn(dF~4!v1$N@gjYcn-(U01AJ1g@_Z%qajNjSJf7m&5oW0`V1ay6d zQib&(>cW`6dQrmllhx%m4*70DgGE2(%7*O2kC6raBmGYlfn7w0@>V;(L&HAPUNa_M zK`WupJPsvxcOJg%>zEmUC!1Nze0(EeJm~F~pWwA$t%>f|S>RZ|H3nI&Gw|?k$qF^% zT_|pvFgY*eT~>}^Jor_>J(HThbXaVl?~Xkwz*sing0H1)*b+kTTKn3T(%ZB`$a6=x_3=xO zZK*pNt9K~sFS=;Br%oA|6DG&|26Ofr7i5L;S`P@JgeAp(J#tpEt+EPclX;fxHT}Dt zt1;{c)<&z)I>-5?2-b!a1$L!4E^df?x&BCosOKK0yvDxc9D0-+!Pl=ud!T(N##o)> z%h+)yXgn;@(rY!zPqupo8#>Z#U>wkS=Xu!8AgK4^P%MDwdsselZYiMiYFVO$4)l%E99>7VUB! zg_i1Ac_UW@T81t@!Q)JuFPJZSJYc@GiP0_l@kl4n1M=j9ICU=l1VK4y@U1(ijFZ_l z>KKh0p2`!rwX5fjr0ZOs5bt<)-|l0r|HVqm%s{Z81jY|-YXnk!)I4O?JiVxj6tYY8 zB|bM>1_}yfov|BBd%T31FATEm7nh0}-k_Ri5gsu+4iJ}kiqAJs$`L0za3B*oes!Rr z{gr(QchWNxbctnzb<#sTnqV^ER2;J8MxCc88Hu0*$PvBAxXUk){~ySK)7OX{>Y(Yr}=C8{Y~>3_-eNJ!)bkAsgHJ z#&`Qcq8L!2DWsB1oj6oAYOU^scaN~ES`7<)-Fn*5Dc>LxZ6(JDk}3S8*^vd5Y(8Z5-{R9$R%%mQ*inNC~XxSx1-Tv3^k^Zg@oa1C_7J%3Lf)Em6Dd}NO48|I>&ktc<8gO zj&9cnTX?Rs!934{n(UpWNSN zos4hct8v;9@V)c9%ObATN?}3B#04CUVB-e`^>setCTvd5ek^ z9)v?8qI>$$Hdc?iK&B}xLtNyAWT-u1d}LCWSh{eXizDU5kR{BbRGII*B-4H`7YVJ*DUA^u0y1$+nLCHs*i5VZG2Z0$Fs)XOLSnxn^^Tnx;iA=yd8 zz?9{~8Bv|NncMD+%YYf#G~$p8X-^bUUdjPLT^q2sWt=`{^kN* zjOw;sx)S9BZ%CG(Kh$c{`TfWyW~0yk0EAM9&PUzMgQ^l|m`)>GJiomQJ#HF9J-YZc zMtO-yVZSA{kbGkQ<#*~j^5p5egL3Sd-ocq!8bk&3L$L@{)|}tg0W4}kRkW28C);?R zk=w~yg^DWlxE;w_yN(ZPw8}$8#*dA&BI?eZKe^?ky!62A>urN;QpSfz;2~5nlGBwwY!f2izOAc za4}Nf`^W)5mpu|&hFlg|xe9b*xd4ryIzY9a*#BFmqb&R=g7O;q@%v~&AQsogd7CW& z(SFk_?*WDwY#aa&w#&+x0S-N&t*@xK;;hW%yOX3`nm_Di>01tfQFp5#0Bu! z*DmP!#R@eO2GO!-_fs2ZbRWgc3qA$qb~rvr@!PJ#FNiN5Pc*NU(WSbY+3psyL<5>t%K5)ymQ+^mm}i{C zC+oouKZmh@%QFLgu`!CYQ;6rEjDnWJbHi2gwlXJhra``ZZ$Rj%uhbG2PU36#!2vO_ zBGPCz_?^Bbu1;57N+aw76yI)}L#<(Qmxz(3qyElE1)QZUV@#vYcJ-V}IIVt-A%<|& z54>G){EZ)y4}^jE)X8VO2+ zP`b$B)3v39#bFAhJBe1VfT8rj771IC z2+GHAdenFMcsV`@AQlp6VRHd@* zSLYY{ba6{_9(!q@$Us*cjyQGD$8^pxQ-;wYE3E9M1BKBhpF8Dto~jgAkpSWrp*LN2 z@LZ8FlkA5*T}cvT)wdXK=HU$Q55i5C%)qKl$@@I~^xeDH%VzQVTmbIb^RCxY?tX9k zDz*u|pE1MgLwaT2)Ms_#6u!Q`#)cLfK3_pRON7iT%hC4qnwZm(=o?9VLn`j=9zEdrl}8b7GP9 z;(8DJ-PoUxQX7K2-&Y~mDou}Wed|OFd(ckTR2Sd-Npp^Yz{Et!dx*KPo?M@P=5-;2 z+apG)qLis0_J;4wAThE#N4jD0Lb}*eoP)T$cR>#`+m>xsK}kou+|?UhGFCHJbVXu) zxfAuZ?M=k2^HoNQU}8izsZ>mTv@>P5yN=Mj(VZvWDL?mpiv(MHY|{h2l`PAd(03OF zed9VFX<~U=jzvHUoZm_fn1%fr&w{T+12b!%j`V>NE@xDKYEjeAuQvBh){Q0CuF0RS zo7HRg0(g~2%ao-vyvu2x=?-dq!E$)RH~%ydb0_k&=I2-8SzZrM>YBS*$%@&+HP~w7 zH0(zjZ{I6c_xp~CN#vIU-C&49*JxSX=n%!2JEL}_CTD#6aKW*tYW$75lI7ZICp4kR zMVO0mexiklqCrGcYPyqwwoox$2I^IQxb#8deDMynWXtgQgboddOBPkziBV_R2F8*j z(?mL^-k7l0??a-8BK5$?<{*iOjhOEeVCW#>o0O*^83vmj}k zvLFW2{>THdr|sYL%59+ZzuXnt#!syp?N&};me1_`1g=+xsyL=1RptyWPm2sir=YdFGt|LxqtLW zyE%j7m*gA35?a^{q)}H$o$aU#L?oPv;wj;e@aC?1mTBR<+Od`P~^X!Nj zig@Xn51WA#pz1gC!GSAcBlaK;vbUL@KnOg}TGmQP&@VazXm&y1kz|c3YuLG1hKY^; zs2?YiKeE=uwbZ=yLT0o@TKt#cYJ)Y+OH^&FpeB-=xZ92!l|h^|5+5pb)2fJ{>F423 zX2W?~jwl@+ugSZKr5It$70B%$t+R1ClOC%Dt3^H0mPYktB zNU=07avP2{ZN8+GrMiWfVxo`{A8mfJWjl48{88&Xcnh?x`)2LhFs-UfEvBUu%od)9 zo5uN@dca(_e8TyJT(X9eDs}owDhsrH15e*AWxm0FM9^ewb{9~X@_b{hjdefVa{Md# z@v|Q3*ERM@WkDD07Z^~9#I>1;<^dSXw5ZFjZcsV?&DZE;8eDU#L1SD6^pzG)^w)^a zdG+{hrCQ$4*$}6=;cu?ausiVX(*?57gu{K1I1s9j(?NOv9+9dt)mbf;xVa%pc-Q1& zUPbl^;($H!W8&5g9Pjn+xV7D7flD?-s2CnRCYX01Gh4Tju8pYUE%FN?lK|9st%#v) zmPHjdGJ&s52k={ud17ULSXJj>w>ip0>K@ekaPBWI@wo{ne!&6l57t1fPjP!mV$_Nv zAWwUy+q&p#X2nZ`UE-x&UKA&GE;ezcc<`tM;n4isXlLo ztxA?yWvS}xudQw^7C|2v>`$suFQ9|vCAHc9Kv00Pbb`s$5??KLBFk4UiSLxbtR|eY zP_Ihcftph>{)~L=n&Pr>L*wzY*qr@FSkDCA^yPbWJ$G1R=unKrXEzCGf(eU7Rlo?mG+F`rNUBg?a48y2 zRSZw3kuKKj$0)M&7Y=dn(Fs{l3QV+5knQQKK^?IRJC`%kfPDJYF!6w7jmaRG3SX@J zw_s%agk9q(Br8Cu)@PKMN_Ha5w2m;#*7ZOyG`4rZmtS0Xp|V9B@t27XhVwMLR#fo~`kE2j z{c_4j*lUwvw>+lWo{`o|3Ie}BAj~K?L0Y=x!goNv>R}FI>YE%L(t}XP79f46WG$YT z6(zF1r29n?Kh}M5t7rf?6w`;??IDI)K86a5)?0k$3l59#&8PX}mHk^oh|W}o7hV0D zr965!uYw*sYuSmxmKd;Bn{H1^Y~rFM!cquNLL~~4)Q9z#gn%uQG84~1e@G~U#MzBZ zt_)iEQ{G!mpSavNtz9O4aU77Fj#|QOMMT5UCf1o61Jt|1>d%{g#SB3Nh&_}ieHks5 z9$)2;BU89iF;*ClF>mOMOvMbfdT|gP)%(KB2n~)%+uMvN+Os4Yj-8IH7Jp0#G^K|< zMq!phqJF$dAFaKf%SgsKuF|P(%#dCXDSWCm?i2rot&wo>qmX{4Zu~Fa`%;0szgNA( zDqp%~e;#@lcHX+!Bc9K;mXCD4JA)`QE@!wb)sb_RTZWZWAmpafx~sV|7NYU;KD=ZE zGwwJGK&r`QO6}(A_XFN(@$pNSu_DYI-<{3 zg5Y!*ag1k1L9Q1B{Jj%-IPPVfj!@?8Ny)d5F<+^NMbXu$NL>TbDGEr43UYL?e8U}o z$$4$WnkFQ&8#Dxmf9Q_|!KO7U2>L1JXe#4^5>?TC#~%3NVTp8|93q-SrWMjf+8P#R zS>;79hk|A%yQ~+8YYFhbNC={9px79=G3)n9@EX*E_ai| zajgeCy8i1=L#>j$>odYQEQ^#odCg)d;`Y!|g|hyPQ>cg0z>xvbg0-?H=haNCE>)H1 z_hr@++VZTe?GWTor`xtcjv07+4Kq#eUngJ9O&82r;o=%OAlDD~R5IAuQ#PKNr~rna zc+e@kjIv{Nn%snB90Vxo`>ZQvOUQ9UmNE);clC(R*lQd*xa8*`_JRBIqx!>CMMn3rEEa5A_{&&-exHD>D2h{VXwI0 zvyPD`1W>$DO_5`#sz3(6_a`T1<}WZ7DH!H`)OR1EtdLfZqq?!1QR%S0zEo`P4`$Ku z8y7}ht_ns}1zp+398=GpvY3nx2JJPH1alvURE?W!d@AJuv51%KBYdq72tCipT(;5@ zk*`p!U%1k6GgT5l>d&C5qPV4ayBKU4JPOkMoa%T(P_(H|)z))V7ZBk36VI*D%))>s1i!$nWm; zP{Wf`*?UXzK=iV(%9eb@9P8j*r{K!jBT2u7xE1FG-4x$4&6LZRUzlEmD|~7x>s!Bn z{=`S3;yLR3mE%ZM^LD{c3_jnOEvv*Ip@)Qjw8fvZuxJX&spZ5?BoixXZR?_MOz)D} zt9q&|bsi}?#GD8yq&vioNLh^W<}HbMT_XBnB6d2gc3G@x2FvvgUTYYNtX-P75Ro5Yz<%N?m)_!k*G3fp~XjJN}mkPZ&mXU zPGd*hjQDV076KiXJ#BC9owuq5b?I}e(sUnbcc}hysbrLixbLzTE8q+|8yZon>u~ax zj%P`1ME5<76l()1yd)k~Nm5{W!y4}=(6J_dWsFto@D~_TbM<-L{>(IqQ5fkh2(j8w zmy8L7mwOHDj)(;zV?ItyZnV894tk&R2=R~3G66~KX-c2Z(TnEK)87s$geNbmi!R!U zL{+!zl0iVY(!n=mjO=06Tv3l8F_BrI_HM$Zkge-kfYT-YyRc#a%|fV9)ugIS0R`p3U%$tJhh*MR zHG4dJHCA_fx#h28c*T?^M}w$?43=L9dEBrT5Ts#bT`%!hOWRbuoDk>_3ilM1JYl}W z@WO+Kymb{5eiw!5pbL}O`l-{S7r(!lBNJ{ z?S1>tn%~UmC9)ssXc(ZOe%S-G0!ZmEJ}R}J3qgt8oi1Z-x)&4de=a^1k4NlCOuAOa zhM>RujBz8BpW}EYQfnux@oPnX9y1F%=Ves9)8qBIy*#Ir8jHjj8Fd2z%PVMS;fD=p zm-7{eDAYV9`Dy_6wE>C0m55Fq0f zBXZ&UuH?aVosAb#4I@IQ%CWYPPoUfclExb(`~`EhedI$n|kg2lwGWy64Xq47Zr<8F;{sN=QY1As}Cim&vE0`LUhF*;|Rn zK8tN+Sy%{Pt2lOT8&3F~x6ZFc&)AtXyl3M0zVYV}J7M}--bC6ZuXm(r)th_t=&<*;( z5B=ZE_ThdFGmWUJAo5dgNmH4J`RDB;B?PY+Y4xVl(m$K{pP$EBkG|i# z42%04ec$@_@5@kFEfDU1@(q*(_YW*`pZ)&7J;rldc$&)5+$q3tfxY|Ve>^QDZ0fHs zZ-9%Fm19t##|MI*|9XJG&X+G%$RC5u3tHa&>x!TLb6N1vXWl>7#Y_wFg_-%pxABPo zb%`Zt?w9x*IMDyM9N@(L-*Wti3;O@na!801Q2xyY@P9AP|JjlMGpmUI=VkuGb^g5^ z;X{Z1l-HRe4~NtP{&uavXTOaoepBbI*FU=l#wHey50*MLVV_cyZ6-U@OdMD{@r5&aNTo@{`{H$?M`M2 zz;Wj*HGs4R<&2a1KiE)=I%pK>&sV|>19!xHee%Qp-+%m{rdtf`N|qV6=at;>i@nhOVaw!A`F!RC^THEUP4Cn zzbuPb(2IMlrS=KLjxBFA|60xa|Np{Fh3pTI;b8$#h{tMd3--@u{CU2=cjf{05cNG4 z5*Y(f*~@PH-+Klg?*GH(Acga-8rPe~B;{e8+4w9OHUpZ-$KhON%WUm$PR3nk>s(yO ztV(@f8$~>8?XN!`mfyX{_!E3zhyMrK$_%{6iV_^XU2@O_u4Yx$f3_?0D@x(dD$DV2 zbCEmXyk&_kbw-t#x5Op?b*L)Yz^YWX6RqJ6h~Bzv{pzTr66pnF977i$KkE->dyZl{m&kwkP#w>}TAJ4|MM!ZfhOl^j=r76AwPZGTM^o#^<&zmZbgPsh`k;tBWQQO z-rk$6$Q3+*;>|`E1y%B&-rdgM^=|Q16~@Y4F)#J8)ol-dE(~zy;1jyLJ_?9Ydmp}r zcAIF}XIuF!oVWBOy2vrN;l%mXeBX|Y)d%%GR`;NW5?0s#h65Ox8iZD-Tmp_`*Z_N zkH{`TEm-2+MaCU!zR%I8`8a!xE7_+I`Kx^N_!s|r;l;k(2V!5wzVB+@|EBcb&K-Vg z1;jc_Sp2`?YBs)pTBQtbT#)$=9t(klc52qp5s+x^_Hhrs$9WYKC~*MNYJ=YYPnu@bf`L8QtoPN9uT^ZH=xt=%zNP+^j$JnFYH8=bBY1ZyN;J}C>^&Jq zBhZIH8h*iL)P+U#=DmuFkbvz{1fTO4=_qH9ohnT%GV&Gv%c-7k`Qr^|bJJ zXug~EM+3|$#Z!okeETtb%?Q{S*-X8AE=^Z&sB9Lo_EYi%~{oCag~)UO%pmGVaK$D{d=u8>_d9>wer%tye{H zB+P?a9KlD0@?GKDCNP~ud9yBEEFDGBUC7$g9)^S!eD?tV_9-lm@GLcq)!gsd<2x78pej;J9Q)e_@Tnl|fZ z_S7vJNjEu{MzLWAw|>e7+mG|lhTT0P-V+8v0^qFSY;9i<4IlViclsx2!|QavZE>vpOa+!$<4ec3Cqr(}nTI{`bwwiucM#TTC&@GY%g zEn1di+}G&-3Sfn)?n6rp@&67j(FC&p2~W2Jye$P%Uz2HFQAZf%5}u~*c`^{C_!89f z3!g{fVLe21woHQ8u-oYv1(`$u9a$|-!lOjKRC(qr3wgG=A8ACOi08OyijK2y^+pf$q zo}F%xFe_^`zp}Wfopax+1!}A#J56`D;*Y75UGkxXU6P>OYDGnggXT}Lgrk**r;&f; z_wmxE=pcviCjOS!VYy2zWqr2Je9S9c`Zb=88D1HlARGELBblzttW)=F?cT}mQQ0e! z9BLTb6x>;ds}b>t-tA#x6QYA$@%~RFYh)Vqr|P3BRx6KmHYdlO=iE%sR@i+6@O>^0 zS9Zaxg&B$!z7kEi!7u^L^#&~RFTLzwML=iKcq&)@o$;DXqG_IyW!kjK9Eul#^Hp2-O)dYZP`p+4&r5Jg6-T zLEoSzH)X`R9q|8C{p;YtA!ZMKcK-8|nKELZ`J4{c z+ONPdZ<%pWCVsVhd$nf^xKV=o4mv3*gW+a0e?2uCE;A&NM#EAlt%`ocuVuHMOnw9O z?&lymaBDlDjS|P$N+nS1yPW|=_?sW^QE3T0+#G>4PaOaReC(L|jK~J`(Icigf?4!2 zF|~2XxliR#4|?_plhw-*XwX72iNRQ!qzR5rBd84ql{;kIT{YcV1|5q05oOpV`;y8Z zaCJucTiw(>aL+mmw68X(o`NBePXStL*n&65BeRNvJ8^Y9)@~g=1On2IOyGQ>;$(5? zQRz8!)A{zr^p4v8o`GHPx*aaNy7X65SE^0xqkal8gpzojfUhxda`elgaq47y1YZY5 z{~%2Ny45-HWRl`i2+JWD6&p;45!=Qrp=I;n=Mk?_+1QuJ!ec8=0}`dqT92Up(+Q)f zS_v!x+U;H%`DMj@vYo6F@zo^};=1)GM0&0UdajRBhZ!}+A%@|%dv~{ceTfGL4e@nv zK+TzHJUpJMxc;z*P<1<6=Jsa(PT2TiHy-3wVJrO4-MaakyVmcDG^_s0*P3zyp*i^- zTItRawmw(W2KD}CXtMCkK|>CpF*(Q{`S4pnuw0#@z*Xp&EbFBu)5=9FQR8pW^426~ zb=9rp{YXY3Csp$$Y5K?QNjL(6E=uzRP;iwDU5otgHB}3a?J&MBO9muEh)DbcEXJUf zs>KTkefA4aSN-~~lIQuH{%@PrK-KIS6*BbbtyzWWDTN|H{QkN`kKq44eHy?IhNbx3 zBeYC$fJy0^7FCp5lH=ath@Jl&kh9Y0EGH!!ma`Jv{ceQP(%J~-Grk7UdTtwc$E0)` z9DoPzoLsejrHF#df28kqqJHLccjn{PdGSbaQ(k*#md2lS=X?R%hj>(r3hj5M!t?J< z2NAZ*C?Ye+XR$me5Pl!(WwAr?sz96v{GXM5n`=j=G{W4iu@#-|XkOr)9W92j{{XOq z9ZK{ZaMU_LedljaYmzMl0xLcmQjsa!222&Cz1kYoIo6D`u%lh#m!?MOK#}1ujO={= zC@V+!*bSeT$|6U=ujp1uaHmqteZeE8E#n~mAcAOw|1)*#&q1HNtN9?7=V)00$`SxV zSTG)0*US>ih%Cq-=W3Sd87TVxewBYD*u&;jQG~+!wXrox?1rxM(kN1ZJ~#7$x#K{p z0Ba8!^Hk;w9`EaOLi2C4Dq&?p+DO4V`j^9rGnM8eGkwY2{tg7@RF|9s35L8xe(2|; zt$*!$nFEB%j~u=Q*OQ8?DxhOf2Tac=bt*hV9g9Q7qpxJNu*B0@FIl^amKK^9N4lAw zzy0+YgHt8H3Kl^~G=}xJeb~YI6VovLcT5xgpBasG6t*Yy(FQffzXILfAx5oKS%!v&v?(LGTh$F0~v<8A9@wopovsn72u}Iw|q7 zmNXktYURNteBd7pFF?f$)_yTLs}=ZvzKQV}hAioOcr27Ul>&Gw-L2VyN>K?;5Fv|J zblZ1w2s##@#-zkP%}fhx%}h*h?l9)4yK*JR7b~2^Z&ijj@mrrU9@JvQkir_}fW%xd zYax~!t_?i03ul2wR!+n5h2dGZ{irY13j?6aqI6E#Sa>OM1?gYvX2`&JLFl|RvttH$ zEb^7}TJ6^HVwn4>mha;L=}k3iF9Y8013hKLu0 z0?K2+Rw06uq2J@Y4IL!yR58uc(Sjs0dvS#`E_uD1K5%sg+q8 zr*;#bj?(Mq!iAkHSHfFH*IfMlfjGJrJY9G|4Gi@t%^Z1^j>SjS5LbJYCnLqU~b6 zK3Ac#+TUuvaf%0SX-%gYUN*Qi5&D+)y=IyH7fGZk>VLiQZ=Z>OxS;5D&nO2kPS8^P z?ZTOim2*P~9s{hdcg~~*>(|ftn4BS1=dmrszfTY(Qx3QoRk{z)-`vCDAr;)x#NUr^ zf_Mh9tIGkt8;GC~ey+<#lJam3-hzPt1&SbO>c6Hg(E?aCQE($W)^7=y3oha7VvLI_ zjELNi|B$Nh-g~+Y^zoDTiQZid{w5yi`l{|i=`^Z>#fA2V^+Mp({`LSKIyS^_*n$9$ z@FGOD5U|cyeH%Z8n8~))fRmE-1clo7OH`u0cI0K{mhsNjhLR5{`LT2Tu(!e5v}x9@ zg?UWI7>m}eoi0zkrLMUzjFPA?S)e(7rd z&O6=ltL1oci;8ry>`LfBnjo?%Rzc6+kFDa=BWz^i$WjLkNmPxs#pSe%VFj0;9YiZ> z15aHw+Kj$pe878uAFPM5R-+&yLJBLZ5oobkV{|{-E-+BtW*YkXKMGe{2+|88{%w@xk^EP=zoAm*4-92q3tYt{B>)D0AaOd|c(uEgz@okA4Y+TE z3VA2q`e#}}1Wh~m(U|!;T^id-d`79UMGwO4>n()%cpOS3Rz-fBCqQkf^ckKNa^c1zo^9Ce8f!Hk?t zkRj%gOd{JG_+R&K=yl%fQ45wDzgJD8+>RUU-UneEiScq~23W@RJYT%2*IC~D;F*ct zsZoLjsBYzqJ};|B_tF^FXB9;$$Qx3j*!<*f%e*8IaX`tOeJZgINoU}|*SWnMZ~Ac$ zK(h43`s5xpf-WAzO^?2e==h3lD4wF-)pmsvzph+Tb0O&T{yR37mI4L@FN>~u$ixSn zBknvW>VFIcl`l9nsA9)|GG{}K_o*PgmrEFJlOK+v$L4)5M=}n%g4^h3z%0WqXlw6( zd{^Uh#mDEcEW>Be3M~a(vhnu-Y-lncgN0x z!A{mj(2NmE?AR`%}fC(KS2niGiIp(%*Fmr z&AcB;LlIh6| z+5$RGZx~uIioGid>@f_@PD#gOPxJi|x8xF!L^saJ;V+9|ei6+l|z?>cP;j?~7myO)ehX^V@AxQS?x1Mix#6 zW2T-LiI|_Hej%EU@|)EKVC0m>Dv1b0r%MWRN=qhM*70X(rOKLmhUfX4zNS_&vk!7$=z__TYO`6tZY=%7p!~+yhk1aeBW6Tz79Nw^{MoIOri5XVv0xLT*Sb=(EoE#BK&~C$QgfMFDGJ2a7p2@ zz0e3!K!FO@@gDV|pT?F!#>GnOO=S5)UdvxBE(-xffjg?VNzaiACfL9KhUc@Lt0&C$ z0uO@~%D_)-uLj|H`|tupsYJtzX00UB6U2p&;*;zQKZ^1z+M8qr!Wlf^Rz+5PrD3%+ zBm{=19vje>@&x$VQ61#|!4{fb%6TJ0NX_l!u(wdhP+qB7<(kSUkou(G{c+L={7%b3 z#7L4I9e+dyfUubq5RW$ADYGw`F=C8(EE?=6f~vP-4jeHAK^b7cbcjziCZVz*?lvV} z1-KS*f23N#DuK~Nhm3M`V@%{VurBDc3} z0|E@u@6kST4<9ln4h>UW>O@fp&tQA+`w!)=^(EuMF0`}*uEN`D_k~G9gTNRIQ?6YX z0s7#JF0x?iztFGZp^qU1eUoK5)>;0peU`7xxe! z8V{tnnU5&k=q22GS+GLlt?CkBB1_e&Uq?+hj+y>Os!sP6sLRpf|1P9}Y{x(Ov=?Sf zMVlY@M1fcK8;Km7fRb`?K~md5nt2f<5h_c2HTtHW?rx0a*4@L*1+98CzSF6eQ;~SC_Sla9Yd{^lto^%<-FI^xrLfN9dF*^Yr1&JUsSa< z){FnLi4aIrm7~B_#9v)G}6a*`C8E~ zz_6oiOn&vC=IchoHHmLx$*Av`E(xvau?SvmUpt_(b{tw3G)e_OMqlwCMhK;jrffC< z8Gc9p9BNy!=;oNG#GKuTD+x(B2n$TSQ^L>$T5U%9N_-mjN2d|aft(_EmtT`QmLpgQ zNPGPc9Yj<87fPkA&AL70b!&EKTlrs})5_4)%(+{l!$Xnr&)2xpVa*EQeMpU|O1%?TDxw8+$ENIc)(Z^<(Guo?Iz=41O!VqA+)pXRSk_@S|3cFflkK^%UuejKR8iqaY*MtM$|Gpc=BKNXXZ!iku1Ov+jGPNLkA z6o+}j)LBrH;cAimUHyK@(K+u_jsLhWI;2`;nNyAZhP&?3Y+Q5(hmJ6mV}|G~NW4)t zunh(Ik&hf*WoDB9$amc@#omXp8PE}(3cc7B_+0Os%YfPWtGP2jG&!!9mY(cELxv}E z0=EZIKHotdfxb#cW1c^+h%%eLaACmV((>24X`tv4&0T*E$ccPzugNEScC)5LY%eNd z4DWKAAR6cEU!wdVD73i_g}(qL+bp3M=2#YpLioGr&0(p2BV~6)Oz-Y1xf4WE~_Lu^09i zd2l3wIL2|RgS=`HGnNlthNczS;#Vfpjx((da%(7Va7y12qk4x)=cFb!L|(w@QQ~y9 zFQNxL8y!IUIqwm z?XZ>znJ1Y!H3nXv2TYK708|F`c#GjbgE#nz-%~n*lz^?X_oFK85TH!x2ZI2oTB!?q zg(MtB%Odxe%p)KNoq_)F1mvoCpJl5}xsC0Dq~{^1cRYi}{!R(#Auf>reO~3PVy#^< zz+Tg2vNA#eNJ|KEP}LaBKF#0Vo*kvrecL(G)>5m>C|lmH7<5KJ!ay0s&r{3lQz@=O z%E~FaBpuYwW6H$u&}y&XjkHIJ%G>!65x{F;wX8kb*JTtQl7mAj5H*h<-Uc{==tzdU zhW97uOYBzMCjd#=Zva8cO4CkELAYw*z3iHzDtjn|;&)ANi1p!nl9abWaTSh~>`A#+ zH@YO+RYPpO;-Mh5&$bR=1ruVBIL&_ZDiFYQI(8zII6??^>paNrNu(^>rY?t6p$Mqi zq|x>&7u>pcQ3vs_;$ytS!&jV|T0HGL()#5{IA{*$hGm_ecuQxowe7K@=;1UN(#TF7 zsRQku9am0rmiNR>{k6^s9Y_w{tn6jRXp60aKcHX6dLP;^prc?ten;8 zrxO3fWtlG!HOL_7*x#gdl7-wHv|22P#XLE>ZBNU%IOsp_b6KA6FHj3G>kEkTq9F56 zcQKepqq=VN^e!dki9Ofzq6pqw~e`c3~z8a5Cijn&CJIAu#Au0YQI#7;t^LKIGZjXGAg>tHq zNgiFhqHyHLuWAx(>CW)l=Ev(l7b+{a96mh1A9;e1-p+smYppdeRoPH6wFMofWQeAo z8(r>1v{3P00W#<@Fdl#MhfI{@3u=q9f&kRp{ID$C9OrO#AdM`TgdO4%4x1G3w0Uk?tDFm)vWz$a9gZ4WDM(>4Tx08795ZO>aS9EmzFzHW zQ;B*i%cSu%D<`f#G{-!`z5jXs2BRAkav`9trPT1ZVhKT+_{tZHobUE|XIoh&k-9ta=+^ zN2UtvOWM2Nmm<-XY1NaJS+Z=BMX5f0FscPC{=1+oj8n|Uirv~a1S?gAjN#}F21m)# zD02CDW8Z9QHlfw!DyD4$m{e{YGvhK26e!G?I*&kRLdZ#goTafy7d0;Z=JM0HmyBuM8;w#f70YQMH&L69MYp#~HXhDHVu47vt}RzhizZt0c~knRo< za0roZX^`#|L68zD0coW1yT<$ZJ@@lI@Av*Ahleq<_g?#2Yn|&n&jsAjJ5iYj4zR9~ zXx>K^XS5^xd-hWT86W?` zU6h;;f2hEMAY4uNOw`%BADZwHo*O$6EK~ubOjxLNl40O$Y&C*t9RzD0bIkWTBis+# zDZ~1+EjhO1OW|b;!0XBi94hvjCktzR&ToY#j6}_FgR2rh;enF(3?Y zK0Or)nnI9jlc*kc6p2FRwwu&Yqahxgs1&p_SFFe4AcPfuHN(%cD;7!Bl8HpnPYv#S_B0Lxt3j0GAU=8niCAQOa z&|Yc`KVa}0&*UvPy3@7v=()9Au7mMm{!B%aD7j95NdhGK-IYesm4XM?v$S%xM6V^M z38zMlKv<^gdP*#MUHtI#B=B_WcMCd058++d<=J-;x>|?j?Ehz?HJbUCSXIOHzll|A znB$S>#Sp%<$88Ohw5|=VEk&~D4%|z(d>3OVL!h)cfCAxrW?_BPeycqi9kH$=e9|62%$5QTzLSIfg<8fpbBuvj7Rx7LIAM z*3s)rUNo-Al9S_XB$c7eeCP;=Iyz4$(rwOFQ}*O0f|VS6yvAheE_NE88p$Jz;kWS` zm)*-0iCO|NLU^x`FBw*1;Kx^hY!YbOD@4vPydTUg62V;|rAH2QaKoFFiDkqhu3dw#^ZT5CuhWPbvNBHyY z#~;ry)RzGvv)OL6jChEM(_R-<3gvH>=MNPPTEU5~tJm2}9cu<^XZjUdH%DZtvLHJN zr#(>dw~L^H1#F$teJ?&|T|M}4FHOmp@8*I@JN~IA838kw!M70W8=N&9B**<5=8({e zu4R8f9pZ|qqs~{fqX~{web1Mm^mJecApA(P0Gu%7bp_+WUrp?M7Ix?ZYe&#GDQ>-u zmQrUKFbZcJ@x0dP=>vJ2OOviMDG(=H2#o~5i*r3M~zrm*^ z=vs;h3}tdH8@{6NBfGe z&KV~WP(6YRrtkOxY+z0tbGN;gntWS&>sbN3-_tJl;tAWN;kuU!n73PmX_YMcKBs3G zks&$%jF%6l*!9uKiy|FMtB*>|^abBIFN5o#FHGxY_eaA`?gA^|ju{r5$K586%8F|yb;Jfr%15!? z3`0$a!X8u<#&t2#$6emXA;OaS1igoI#*Qsx`BSM4teLo9r&}282RDRJV}l=~ArLM^ zucVUE7=z1~Kv0U^LmDj-$V`WkJ-Fyff&Tb`r0fwlcmB`|z36KK;W55y~Gu{~K?Z@)?$ zj18-lULy^FGSdZi^;qfK$r)#dX-^nzI4TvA=~N4|&BGt4N15HK;KL#%R7;d!kopAh z2ebZ@wqaw4^C1a2tJ3cF{D#!ZpCxTQLWXKC1i2-8Hxo!1ZULp7xxnPYm45GQMEj7tT0=9SXul|W;^`JHd{q6kW6ExN#~i|CiY!); zsFb$4HEatAj$-a7-$Tw{4uADs3S(PcrK=3qprBHn&$leAP*R6i-}{JMh2kgeJL%I~ ztwmPw#$$cAWMdcTidv51pQp~C$+bJEBP4TwyL`P8H#b5i;QTGHa6B{ACYY9S3_SkH z6G5i)@}+KqyUCr}<9RPHY?@`KUYh+&2BXxfJ5Igu`Ecd~xwHKyG3MXfZ$^<#yzZj0 z1@H!m-QdMYuMZ+%=ituzXKLASt&n%(hD}CF0kdQ}+)Sb^_MdS47e}azQL|si77V93 z?YBwXpyN`;PrkJ1t+Bb4hGpkx`8If+{meIMYtS!Ju;h5kYRYKlwUT}tN!BUc;#|J? zg+n`g09TSAMQSssW4!}RjeUmD;jLqItFt^rh5lIYrts!V6cC!er|6xDkc(xi zWg?0*bSQ^MsmXW$-^5m?60jU9w^Iz5k`!sfSZMtlq9p4LCc+Y_??%pnoK}C@Lwi7ve`PRtM z+AN?iz7n~R6~8O}q#i@16hZ`z9%q4K+G(1;EhjXfW*dzyUYN+)>6hU))0d#(i4pY5 zd+8Dg=RI;HO8aqv|7Oh2%E|y=e;G9{Fi3cCw?ex81j|v8 zqNj;OgT++r20Y^Qab_aCI@h`knoyC-7U0V4Sb)QE6Soy&7M%S^u^*~~;l(O%<&7BK zQSic3oPl`yzj)xVD3Qf%3*o2Wwc#)L*3_NS83EO)=A&m!_?S%HK_pU>Cyd`QtI|8K zmqVZ68+b~SYf8Gxr8P(XQ{Fa8km*3XKe;j|>%D!*GhVl?ueZl;ZN?sU@Q&edE`8bv zDSdqik5!bzV|t5PLH5;lectflK`w56&M5n}!*~7XybjT*=TA zbqe3NK|aG4EAuhl4cQ6gNtQHbMSXO8GWyv`-IJzip7Wr<9HS_?%Oc>ghR zq(s{XF+@O#1LTyb$sKC*^C$yhOAEk_&n6v_8lpA=ue~R3n)xZ!e{>iQ?drZx|LN)$ zCIes+fe$SfJe3--F>q}G61QYq@ZWzD{7DJti~=3hR}2+Xv8-rR);;q}WHgTrdKZ8# z3v)Cwh!_vr^JqC_b5R!7JRsq^|YX-l0;V0mPV4W?z&h+`Ea&Ap4B*(DGAJz zMVwvIktL3$DS=d0SQ z{JHw|P0uy0*3ocD`~m6!8hp14Ms{(_wdIH_nl@be!0Y>8@3t+G_v@1Gw|N9J!u+@V z0+O1#aF%ctF0$L7u+4MUJmb(z++vTaQ6c#xaomx3JzPRAwuEAO$bdO2bv#<6N|6?q zwY~20Y}4L_R7Kpt!ir^pKsD9w7E-bBcVSY9QA_(mthrHDV2I5QjvP+kY->FOGA^R&;Cyi*+3m9wOGx&*#J~$p>2>}C>ZBrB3lvPF51ui+lSOE+GgQwvetUR>caevQnPvV2!9+zgABvt zKh<_$ZX|YkcSkv`Dtp4hZlE#j-f%Y%m7F<+32%OorvpzYkt^ZZFZFV2@vG6&vucT_ z$zIFTg|aO)r<{z?4$~{$#8Kp>>D%!m&PR_nS~%TW<*rhx?zt!Icx3v2>S_oWoU?4L z7Jn?pMOGWc``@(<8Fq0aqm1R=z3N|Cz%uPd4U6f2vIR9Z7Pe3LC>fJbXdVeHz#*f3 z`z|cJa|SQ`5v)K9VkW8WCMYQarFy`gac?h^Wvd|t*BhqZg)ow{97}ky&k+8ULNeCA zUB9qXewNpW^sUPSI4b1xGKG(R)&ZhX26cEJ70SqQkI`06W{Vr;!8RY|B*k#YKLHx7 za;M6WE5aL*OQo-5(RQbuJhgwRS$X;Mt3=VGfXdNEQPU znE)xp7!-%Qewoa^+n_Y0ClhH2H&E|)9pI`xY-}^};Wi=G(sTWyKChz@D!H+sj?WdJ z1uBb|Y7yL;+mf*6{eI3%YHp*0=*zTG?6zyhJd;{3G?Y!2MRgs4C$Xrr_;T8(HJ%6` z2!6_0m`#C9|L11}P9+qRJ1}7qe6B;ZXkJNNioW|?jd_XOK1t?a1^ZK5EV=ET=uTWm ztWEChiDZYv?}MBbSBC(1n$YITwKeX-@<+(t%0^HjAya89TgH#a&M>PB;FQ{V$D}7^%Xofj3<~#iBh%?6 z7rqH6_s8uIQjrf(Bg2&?Wx2hVcF2vnwzK_!rfZ%=xU>q8nP+S`YLFk;mr!m~73+_$ zd&ycjFNr)P-bnxa8YU9xdH104MSZq+SJ%xW|H{S7t~`?P!uh+AMTwjyw@uhrXrh5k ze{LqpepP7D{sYw@ecI006GzF;w;#0&##htGBk9Fkl9>;5^g0h&K~A=v_gp(N8@P!5 z=>IKO28LBt{(h&eA7<8hL7(^N;M9Dsm=w?1=#2hqX8L)W4c|i77b+jTolox6&a3A8 z{^MEpLTAtVY2t7GV!6odZ;#(JJKt{-_>~EdCBy2*ZTXVBvtDxWJ~35G?>{ZkHAp!u z#&qbiJoGurw5qTZ{n%rMZ)^dy)ig1VUBK3%@ zYVU6acO!8F)QLeORW29a`T|kFpmn3K@|h%UDnh1uB`S7wAGkSvfmy3QutavXieJ<= z{umbCfYlu}LirnS!UxNlbljND>+g&Q!eHSh+k`5y>$t9$L=on(sC{N!na(mtW7X%d z4;6*4Po4YyGTae<%IS}Wc>Hp9jo|b}LPH4OkR2((@(&}?n$5bDWC~k3A0TM6)0LFt zPO9;jn_Lt(?I+?{=wKtHZeziX8K6mcU=Y-SS#a@PLXxaF)8~*p(@VBr0+g?g2OGrRi zD{6H2Ex>;4#CUB>tDB{;qW|=shL8s`??y;IbSZtNt4EJ`NF0OvNtm3xD2g=jwo^Sy3oO zT~VAf5J{KEn;qR*5CeU{kiZZd01AFwpKl44lh0}RC9~=}dKn!bFjmL97hlOW7b-HJ zkTNk*0z#jd|FYCe2zN#M+~t-IF28iIR*1HXaq=}Oqs^7a4f*8k@Z_Lxs(=D>o^gEAA?{^Ra$ zss5+6`2_tCD3Qffy@15a?KEx_7M&St@wLsq z``z{AHv82cO|%3tz@UY#xhZaw>UfyfuOvGw@-#ol&ouS_LQVSE(qAdZr=NsgY*rTr zM@Zj*2*$#s`(vN>i#(-d>f_-~UpA30waSkESj==>CCBDuK>sifpGtX=^35*2kjn>M z&?sG+)IADtAX8vM4qy`^7K3lntkUNUcNU)+>IXHvHly6gaJ!`ray>TGB9JKP=uYvJ z=+tg`4ehj^bR9xVE>c#Z;x(gXTT`YsK=Rn6>%3vOH$N%ez|YZJYW{X?)UREyE#XE;v6EL3lExwgrrrL!kJmR!~rzut%U>NoFq6Uo{8>Rob6Jpugy31Ah!R4v}v zz5eGrx?V1ndZ&5lIV|!&UI53>=k9BZmsa$*Hgbi!0~H7zb(m8{hM??#eueUH;BiBN(RvN zVp{aviSe%?KP7TJ-6*93-?#Q2C>0yL003|8xC}Hd)nAPx1lvPn@vfkcpKwT7#tE3n zhH~q)sp2w)(HjqgeLvPXM7_*_)lf9MZLZDMWI&kej6Dezbg)QdgZD{?3^7$pTx%18 z?wMQ$T}TlT;7-YMmQ=^L5@D@uH|~_;S_O|{lUj6!k`hPoc#<)_knGg~LMrb|yWi7I zyKZIfaBzL|>d%vP|9>w2zar{P_%C>N69nS_ncm+GK;%=7;{K>(84o?2I*eHWONi97 z<m^3t4b=#wZ9^U|aLeod}6yO!jU{iUw&}t`Q+4!dW>i#54=MlYhOccjv;91|K}5Ychbwd}fwA97OF64_Yu7+DkO(_Yz%{aEh z)BueGBTn}J7S{j1OaGkpuQ0G%28Sb4waX26#V`N9kZ0`Zyd>NRO5)jDl470!a?6qS z*Lc4`v$TDaS`sJilCY{#8*gx<W-~bEs!|dz5Smq_J4gNOnMdoiD!5M`~Uh*k)y`07+jRd z-#5aKROifg>{|rQ|MUMDu-qI;d>bEV&K|KGtyn0yajc z^XdW+sEf#=L~Z_g45Q|l=R&C z5+-%dz4;QtehmJjRi_I$Ps@pMz1++NMd^1;SY~bL+BdI&X>ZM=wRbgrN8Nl@T#PU; zHd5-!jacp(-(%V)z@u+|KeC?b)u=}4uW{T_xAXSZ)oC-Q@;EXR07Q0nB92G(vrYpj z1B;D`f^G1*k@K5nRA$`%fNl2RXEOxx@vE`e0l1#%A0wU6^*#s!ET5U@y1)I_Yv5Q$ zxx1=%*|rUr$|V9(Dfgi9g*7l$ydrP5p!yaA9??vUAjkiOUK_%6ii!WhvF$OB=tuTc zU@|x#C(%SG2Bs!pOBThnz6Qsfb9G}mvR)LJAxJ$&)Fuy|w#toQv@|61?+wnLYe$QoHh2QX#pUxr}`i;Iy*yX~W z&gSo3YCR3 zYOSDW+7}JoA)jsMEN2-@Qt7j`3d+lSodq4l!h=KiM?~&CD}G|Rzv|dSHx)G+u)+uT z+8+gUl5LIWo@RfVNOeSrT>pTtizi!lX#~9gQ0|?ivUS`8{bLZoTNgbB!?!vR``yhz zMKg9!^!t)~%K;s~<>)&djVA)%arl9M`;5Jyw%fEBMy9|iPG=guaIwl?v+zsA3J)FR zRxvEJSqEVEue!(mFU5<6ua>A<9d=s(_-a5KGa>#MF=j#`b3+hJrx)L`9l{l$Fe0E( z4}=bXLd`9s9!`cn=XtpY2v=o?H-rC(xbh^MltOuuD#k&5<+hXYmrxx=IU zf9oE0SueuBXU7{EaJojp!S)oB$bDpW_$Z(GAa!lq4Vsf&ZI!TJyMqIoY}+-+xS6oy zUWF=!w2Ngn@x9W5JH97I7!IyEi_z3g|8dAW9OGkf%qU2GWxMkNB`yLi7w|Yp1ThK; za%GXR2O4#cPTEL(7qh?zxu1Z;g)U*<1GlT0eaEi(NW*zC7Ok2DD!0*W%xwqS?SQ~0NAR_X#PDN z1@7Vy<0OAaZ8rTpFeaGQu_;*rpm}ROPr~H~LW7W3Wu&^dR$48NyX(AM_53_w{KOYu*7dhO*j>dbn+p^qz-Y z2L_A)LUe@?y+*i)AX0zZ1-sNs;&cR1X*8EVGYN!6J@Fcj0zBcj1G!*s!S_M^6@bgW z@K#g*kISURTxLkRs2S$Smnf6Pgh9k8_=UHh5QKT!dNndm=>G3{A9GO0==(Oqk3pMu zGjHNdY+Lg_X8iMQEF(lWw?yXZwFC5|FH77rO{!{Kb`98j1O)0 z`7!^IDYKktBClQ0K8{la>$R1j8n2(2=oLad?J*5Zo(P3Si~wndL#4{UsV(*nNZ+|V z6UP5MK21z()ZN8QSQID%ghH3w_1(%oWX6B90oTV=Dba2VeUTnd&&;dWG$1P(tD*evPRnG8#fI5qkF+Me+An# zWUuDhg6MKe5*fpv!3wn(*FwufV@~%}>ROlM70+HuTrv{5ZUXt!Vb4A9E%z@Cs(DJ5 zn)}hqwg94a1tf0|X@dE#heUz74O?h(|Kw9ge^urA8>6uPAQxxf~wW z^?jubEQ9_xB7`5CESPYWDUpPi%VhdK>}JT;E1qxb6} zcqDhW%rjgkZxcm2S2y0e|J-@X;7{X>tDsS&-81n5T{C@RUY>Wp@|U^#O0Ucs(uHgb zHD4%-Eq^U^N;(<1!;ubd+)VAm8T=o&Y$Ja!5TWy?e;1zLUc~|qE4@CrXBHa_m%K;9 zifYxTcYWATv6atg&Rovi0>y6GkW@eImR;3LV14XF?|Xu7Rem!ob^D9{66?)CkJOGJ zY+^%N0wa^}9S&#wzlbla><_!@OyR_5`HVi#zU(D6<+5vDK0%GpfPPPQq~1}~WlG=O zOh!5FfiQh?OAOe0ES|7Rbqp5X4(&0K+y9YZlm1-SkREyikfpK*nKxJa$cl$GM;w#Y3bQ%cX{Y76ba$dg$r#6-eedT>4z9$8plw0A8-MhH3;u6)3BkN~*FrDbkf!?{QUzx@Aq3v(WFMq-r<0~YpN>z~V=ueQpQ zS^$D0aj_?_5;!ai953Lx}jL|Ndd+0Cy3Giiwem9)_8E z1+z`K`sH_>csDop-o{0R1{Ko(0DA~vNo~p7+hWS3vgS*I{ErsAonedn9lR<3!^^_$Isg{kl{i zH33_1I8gc&XBo&(hoqT%XB*^amNsk@+JTqjNRk>X7VW5;G2W6|FN0?VGy2$jG>>VK z2OEIu>QXBvUYHeX%^=y?+n1>OW$z)XzI$K)P=^#yS~{2LE@`FZPlpLVvkTM1j;#;5 z4u2s72!5>bAN+z#1$!9t{J_Jx2VOH*;?f|7o<(Gs=MJK3a48z-G8cx!KvD9?mmBn( z2S)p-%LS17XnZ-JxqG0XmDIxbS;hUC~hLEqC{rVP-2=0d7 zomAojN#E(Nk!@F;SqA2JIE$jvef_Sz_j#S36k^^g412tR?pqW8(Y5=h75bBjijj!{ z0R*^oNSco9o5><7#5rGas5brxuD$)ysS`%>_GAGRP^%cnkaI27!U`LDGcjR(D-$jG zrAw9JP6~-c@kSTbukfbpzsQ2_H;(>PX2=~CTMwzrVtI-6C)Fg{5s%)xoGsOl%QbVZ zXM&uf7Z7zmXj6X$cg0&Q?EFJcbbt7K!V$xksPkW z42yx-iTh#r9#%*~S6>VQ6UdNh#>U!DbB5LHuo%yl{me{Lz_fx9Q!D>zVb@%DFEC(N z^pxG8Qm~!h3?SqVB`amuJYzfa-OW~N3lO>{M(FK{#c%mjvPC?_{pLXuWAwe@>{ifX zQPu*toRdXpX1LB%KM#EEy)d>+2aF*PSN*eJHT_>9ncAJmZOWe^RwmW9q%&N}FDwrx z;#9zdEq?GNx6uGp=aUCW?`22Mkq6bdGX%es_93^3_S57xoRT~S?x^0lUn-yFzk)Y| zf0~~$ra87+Q4H2LFjhaaDvLEM$CkP{w9zsO$3K9rYV@A2xsr0xm$2!)w=63-Q`u+l zcUnc0i0t~Y-5OmRANic(&-(-GlFJCL$0sB4U~vYV18exGPD=9fYvje`U@_Q;iKGZR zrcT<_ca{iXiaC8u2RIuz?H5sE$){r+`EQrFY~*xkIT8wg*n~TM@x1H&JP?qBppvQl z_j)WYNb>r50EG726$R$@jeG8lRpt?OZb}l2j7vPoe8Ho zgx>dS0xC#EuC<>(AerL82r;1&(#PfzM|>16gj$f&{}J;j?Wp8gO>;Qv_I%V%40W7- ztNWy9lG7K*WIBVQ$(w!PO}*=wltD6Za0a{}qGU#d^8d&VA|o&<(3CFPcc$}Sw28>y z4THqEW!qZ)B{7V?#-zj_?U)x8!lg6quSSCsia;}NnRhv1Y3SYNAaI#MlxJ^AlAeQ_ zUf$&@G|d9`jNW^_BULu4UTf|!zDEFKqfLB#_9~E}48ABGSmYV33Pn`& zqV7uLCU)1|4#*8e#bFrtZvuUH((M}h_SldYT6fzNAn|5ja@Ad>)=E^<aRab$nD@i@s8{H4m`L4%rF`H0SrKA> z7aQ9n3c-UAi1v$9^y0A(S0-w4EI~da&S>IqgxfN|Z;I)X680;WZ~hGPR{J=0*Tf{; zSHRo8Kh-Iqsp~{l2JnCal_av->)y{TsJH?7dkmZZD6AkW@|9e_6W2lM_xk|W*atg2 zUI9CudO&z8f#I~{o@BqHlH|Cf@a1>^Nryn-`b(PkRRFbX#JDMrXs#0;T|}32%-9r) zC0>9tmX{0xCooc1;JmU-hrXnC|G)_;HFS82rFxJvvi%j$=1WIt&}Y{Z}O84MIwrNg#D;Y_JP(W$L)?FEJSwMysAG9c#j<(9nN>7UNtvi4yUm1hkq zfPeDeG92ZVRM$Tovf}AOE9jKFV^a6N)xwopc!vnvdk6kf?|@3|GM~S5eG@fuOS4+; zrT2k4>9ok`H~wUR1}SirTl|k%01>83ef>t%I8G17KNC(z^^%jpf{6NMO1`E%&2TZ zH+7(bd`77Tg--8>rjB4;UMdh?{<-!Fv_`WQY^y7^~O&R;E zlsY^RkQU~ZocSuN5%0D4jNTk11z|fRckd>sRx>$t=!#966GWLbVkBVBj>`a zh&t1kX9FA5$DYFE_$b}f8#kaI6$(4S%Z5t&>MfW^v4 zf`$1XhbLPcorKe{%H59&tWO>+13fY%ri-mV$dmCP9kD5xd$axqU%p)7UX69Vf^Q)$ zm>)AlEJ2=k2=`u-$jjbBb&-7CqR12kW2M`QogZNn#i)ab5`(T}gdr1XE!`9Lzb20gd>8-r zu)ih}1L^bOf=Yez+heua3dD&#qA2$MF7`h3fud#GZR+J4%fPE6r}1o~D1!MZVS=@H ziB4$^k-C7961Oqh4A7ZefT3lnG6(bY`&1GWuE%c624G3%{M~3@u3pwd`N78WPr>RB z;{dDIHO*aRq?{m-QeoDPQ5zHxLm_Q6vvFT*)e3(rG#VUzc|2?+y8;}S>}s&#e`^#q z3|c-Bs^k3^4?85oOmXVo9kxFQ^Kwkb&|`;Uevn@FG(fLyi77rmb<%3BEC0u;HwH<< z%z-p_bEG3V&hXg?=D#v>9X}0atuFtT+J&NE*~&&rvh)v|f4-}b`3XB*i!Y7$$HQY_ zF!6=sr?xaq(((HD8-338jNj8mtxwYk%Ua_aQWv zibA+fw4LB)I7oVJ_5+W>p|UHZ+~X!(tX z-e+;-n|SxJ9mx|6Lib0q;S{K|v$}Hatm@2rW_BZcHI|t>NU;px1{brY3dNk~yuO-7@fOc`>&* z{p?p#9hAfpPwaq20+*6&xWTUjWk1|>&Rgn|ASyOHI8^uPK*#nDyx-wiNR^#g8? z=JF{^ULvytpxj(zGINJF5}5>42F?{Dwl*_DjkGd;18=Ogl9oUt`hV88UY2wSk+!E^ z*H&&cRG51{5FNE#W-YEni*^YZ4WLN|?i}Oa$FHN@lV4z*w1NBHVQo!UDaFd0B=h@I zHRnXU9mbN{2-S1|}!|q9jB>O;y?lXwx1zb_IV4154gLIQg^^`r_~YdT2(k za1}U;jXqw_d6k*8vhMnL>C>Bez?sq@WSg94kdxfzSelFuNoT3H)D(vcW+$h;O-TG< zljJniXZ&3kh0pcoBJbO?{?lDxjl9!`9oxY0$V!ub|7L)zT(>?KFOtwU!kaJop1tur zV`n1*sTh8`i=id=F%8Cb62uM{y&Xt}ooj&WWO*#OA9dq9-X@n;i=k+4r7qXshD*#<{1SMsm;u6CDPWohYTX5il4@;{&bR|4F$3`C9|;?|5Xr7Se0n ztW~~lE72R`a>puXL-=P@i z6UcZ#UB2srFoW*oBi~SY;x{ohnhg)_rP$%!-*W`#n1pv zzEWy5mH!*KO(tJ_1%jUfswul6JP+tuIWviF4Ny%zfHPE!Xw>Lcfg|(mYlVqVYu|nL zZn%55Y1Po9gPrzfko7B@kxypLQj}L67nyt#J~ED3a?9NrsGgbtzfa=ILlbrk)G!%tk!8S>ms!gfFpMSN zm9zS(`=?qSjGjn?8O?x6+XjqMS!7R|AGkqV*6l7~X5(|7W7t z5Vp>#Vu?q>K+=Ce+Q3uwnPqf8bk??IFh&W6u(m ztHpxP@ewooEHMCS@WcuxeyPU{3`ItnzPA>q?I;CVyduCaz@WQMYd%+e@y;^NPYC>>cE*AT@wQ=4Vg>~EL70;?>GW2zmZb&sNddC@BQk9n#`kq>bvPuJXscpLP#D3idgi}ir>Fhs2`R*2-@ zF<^-@A5hOMazZFr#tGqQt8w0bIueq`HoA6TixiKP^D-Bc^6jF`XmW?4QQILse^1Zy zYAd;hNKI|Vx}KIKoJ|Vn%;Lk9hQ%TK{mx_Z_y)bA$TBf0{XfiQLlZYMAJ08EyWj*} z(DC>G!o)D_^M0wx)I)*KX>Yaur^a&u1A)Ebbo4U#8>M2HDR@*-00_qFRASZZ@en64 z#XW7+B4Fp84vSo_pBuB{uTf@h1kj>hLgc!Vm_O@AM`58M$ybmXbsXH5lFf^_d8t0CG7YN9|9pa#XPlS}tAvxZGw)ZLlO_7L3o9c`$Zd+h9sX^7>=}tT_(W z6gYTYSDp-yZ?KbVqK!xn^OYF}iEEeEHuNLT^tExxWQgNtnnmWG22*8w64zAm$+D2} z6$if@yza#(*VnKp-OM2DOQrexM8|1dZ;EJk#r2VLYnMKj6oKaJCy7s=^i>lxDMXql zwNxBS8p+WIFu6|%&{vCsklT-a%y(4F{bEEDRP`pj) z7W6SzSWV@lk7)Nf4z2)j3y&YmAAQ2070Ov%yc7N`5P-Sg0n2N)aUcDH;m^2icc8ua zjPF*4TJ4n9nbYGl8{f^Hv56HOGw-CPi9a+IP{Bp zAV~O}ZY)FR6j!$rw^q#=0hpFwMNbxAI~7gvc44=4V!hw$w+IpGcis?EcvwO)l}1r3 zUCj$&hU)e!SR*6Y-GG}9zWb!M#fmxM5@F}fv%_p3eY?P0{8l^c)T;Z)@D7wz)wmLE zti?w_`eHQ^$L9e09svoXX_?uhEtCvH=ul0nXc9M7Ah8^W-y26Vcr6#4LV4mvp=oQhZNfy z$Z|wz6hPg+fiaEzc`hd}9(jMqePiz-XNk;8VHW2%62KMS0*uD_2Bx1~E!vpGUMc6b zm>%LrD3~F_sO^0AH~fq$SfzYTCJ*XLKZp5n=Gm3yrm@UiCeJfSoFx7ecPanGUBBK( zM4Rq>NKQA)$eUE(?%{8*F`UBJ&Z(d*KuT}b{)cx36diYN$pDlyA0gwL2)@3IZhlzM-T$O^S5RINBFAhCNTA0 zZ_JqP3&WI{zB(vNNi07`3NzBv*F+CYx`{GeRz2@8Va$G+#m|Uvr_Z0 zWKr1&jS79P74b{Tc9tNW3*&=fDl3p+E$5^1$00`Kndgka;LW&M5N1o&mlZtJ9tNy~<9s*ol@+`|b zU;7cd-p(GxY?RQqR$Vgy4P!93P|;sJX(v8lln?mU)^@>kJ@|IP3W{G0j~QZ>;pj(9 z0F@2(0uz0Qj^LXIeWr1>b@G2Yo750kPEnOgye%4Bn){4uAL&=U-~&j)A0#H?fu77o z%5tLg$&X^xCA%+xamU$j#RZD!kY!H5J?jFkd-zqb&;fWD!W%%vRT8!duuY0zNfo5y z^fd6wz?M+KTh14$>Ggl(^vkLJN4wn@g}?8f%JI@C*FBIF8)+yEtTj2uWbX6wNse1+ zRF2Wwzx=7uCm7J^Ni`SOKT!((8>Q4Qjmm&Lfiq3Z#k9>}wx@h?kb42ZJJW2mPw)Mt z{aKw3uZD)OGYDi&no$N+t8_2gWMs@OW2KO8Wk+z0@4uBRf^c=V0#5$v+!Z?^aA4g| zLZSH-_t7y!@oc7~bOWU9D-{melrxKdG`YYNt>;HzdJ=*|(c2LHNI6d7W#zR&&%rNY z8U(GNXqz7oWVcs|-T_0E`5D3y3sM2K$(!S(z|LY>FnT8O4A@C*4nUkjpt{B|$!g?l zq1So%6n6u0H^C%kgi|wA{Qo2Dz2m9=|NsB2IvjCqWp8rGNQ8{Tv1NthQ1(i8$Q~Vg z9g@i2DcM3+WM!}Hy%os_34I^u^?JWQulM`&`~H5ve_pT4<@KtZ&T~BO<955=l)f*0 zNUmH{Ys%3y#|t~Gp}f*7wHTYo_?cb6u9gHlB-nJQyWqqX*hoHpQ)ne_8NWk(T-PG; z5uT~%*+_hjqPzuXlMwj_=Ir~QYLW-|dpPD_zE{dXx-vc=18YR#pG!a~eH6tuQaG?F z?G`J8w+vODrq3_N*-8v}h!p}`z=QnTEhoN%DV!Ff-^k%Xa7=E&6t&;ZPGK$PviQ+t zL?cRqQ_GsBSo&rujYO9l`KqLM*3SEx0eMMSWc`5J)W5VD-dcAG*{c^z?fX)MWzd~` z5wS6&kd-fBps+Exmc#Oc$%mI9%^SQgU-DlDC%|Ut{)W>HLnBN*D;?1CI z43J@WH|n7kH^pWqlmw`hbN$h8c7GF77DCfy^DRs|Ew@R{qusO@ zL<8W)a36cEBepExCqNqA1Hzq3dzqvAv1R~(M#e9J)|R#`K+-m`s>!9u8HI`jWxQhN zRg(m7e!g&Do|13nLQ(pJCR~x)r463-)D}7P=B*6iiTbUb8yO)5`}HoK@2gUj$gp=V z+|^OxPRA-xD7c`+iHW#qd+xa?*x4?2+*3=s3t5u}&Hv)X!r6`3rLPY(KA$T>4%Fly`E5Qv-$#1EQ!UVq$tq!#6~JJt=1q z*^ne*h0>0=F=Pps+##%WnL-NN`b;+I6+|M3H&*o#0&2fGH!i73Er%md{p1Ravmm0( zh52ZkEGk9*IAmDWS#5*f+y;7WB#n9gU{1hLQEoboyl@Eq4Q{?=?9;aZ(=cU4r8Uc5 z`uRDJ??`YvRGw0V0O6~!cO6*4fpnsKaySAt`I?1nL4YR58VD5U(ZuJ5yuvSqs|&yz zVrGJ;O;46BEO*jISr(t-@^Mg-kp}J{Fisvq1j4#wMT92P>sc6>%tJyE9rMQjs)%+5km<0;&;^P`Bb0n zor=j41zlcUX>`3=QaRtor$w?>gLqqD;3)bfE=&!m6cx`m<9UYO|dpf;W18WK$pwzl{%MNSmM^1Cd`;wKR910UbWNuc2j!dNy z6(*;O;i67b(kr_6v#wA z1u?#*`Z)Z=5B+gF(raYq36*P6``4shmI@+uvf95kdXRUMY&U)}2wrWLp`^3Ig0XDn zy-0cbuOD&gi8E#M8Kqep(qHgp>JaG^8fgzoivCOk&PG$Ea36=20JSLm^60un2&HOL zPJba&v{q>a)hii_keq6k@>tMwgf-)PF~BbAn1r@DJ^FerO0oL}`s1ZFuJ+c+D(vti zP2Ac`xGF_>`vZf7o&(+_HZ4}z#p`G6Ni+w<)F@PO@a%IgpiFpCA#5!R-%SA-@qVy9 z`d#`fo8*c*EF9IaOdld|8vInunq-KF#OZ*vmr-%gi^CpD^i$f_5xkWuCw}ZaD?U!E zm#N*+82Mn|NVlLV%oSlqk!weLu_Ovcv99`C3ZIQ{Afn%g$u}Z5@_90z=sJ=v)hprV z1a~eh5L0ms;sfTx$`cfAxo65-Pr+j9OFiSr9#}BwB|A(7NC2%uR?yfd7EV$KT^~i1 z%9~$8_V(&JeKo8+(O;s3Zt@WePkKhxrth1Um6Gld z|3sIRcQ<@a2>1bV7Y^M+8=bqT*Lr*-j4N_?O!luarxi0SRq0Q^ZGZ7d2EONNMMf}{ zw)?0vywcr@sVKux!7Ne`{|0yy{J+>g!NH-07yJ=F71_;?cP~|ztzOPW*iD^V(eo2n z)cN3eS@tGEKIY^^@WN(_vv;<979J(r7tiNTw$p9A0_QFA18%R~QIn>fJ7gD4rkGrc ztz?4YovRAv3|jE5eZr@=qJ^tG$$i|je9ybGyk|gXDmA|NmrX(0*wrM;YB3@C)=y-C z4;Ioo3Z{M}U1{){(osK0R48QR_KT;HQ;+iAd7THWa0y;)L5MtvaM6@st)z55g^T%8 z*2VMp+y?j18J;~Se5Q~n-gNCkwXB4ipwiJoY413nU|rf}=%8L9@^?D5>!!5FY2)Zl z&FF5Hr2nbw^b`UrxH|uAZdODfy}EX*57;soL>a=d1Y&Jb!qi(Q`Cycsc~j zt8CGk9;FkNaT}0;+P~eDFt+y7G%B@Tkp1a?o8^K~r;}5Kgt4LzU-eB4kf|kg0C(a_ zOMi;3*;rZb*p7s!f*|Aa%6!4Wo* zw#Rb&aS8*_@6-;seS25?0StbdvvS8|O=rF;{egS=I{aV0no|;RcW-H^_DH6e@OX05 z{nvM+OnAza!xi5r;y*&lv-%?U1=~#-jv8v@a2wFm$??FjzVn}*_rEVr@C8V-0as-iVfSk|K42`B^uN9! zXNpZjOfr05m1J3!f8~2^&FI5f@Q0wIz;8m6I4g7fnca}t2qS0tj$3fz3^w8*iSh$5 z<#pf!N9XlNK-AAR4vQ4GK1>OuOa|irOU?UF4~4yq^Psd=OrgM4hg;Cj|MO{e*@m1U z0!EnUA_hj4AG^4Q+Z5=wJ*9}u3yt$VTXDZGI0|e<|CcH5AM(M!_5Psgw)2 zbFNc+{s$w$Q7PLLhPJRu250WareAF{nho?fbY-GT-e)ri4F-M4=8F{dpqL^5>+=1} zg*|2Y&xilZbo;L#^Y_1)aN-uG;5i^S_;1GFqDc#DH7R40Vr^x>QnLMAX~74qb#cK9 z`@)`v4xD1^{4XzUR^@x~|FE|HulpwZCa%^VNXi8l@4w~I=Rrf1RRber4t&D8>P05x z?|_lv`&-lVM-Tk};FL|7fD`t?;qF=&UCRlw762(HDi46UqyeasUmy8`a@q-m8oWDi z2GPH>z$gBw&X8)@y!51_}G1G2k?9iIk4zje_p*SUons)L(pI($PJa&Kt3VF&1O*y*Uh86LBgENZXh0Aq`(>}J zkgbfnB+NRb$&r^KemE{B@NZ?26Hy!hql5D^o~Q+zm~;T1pT)5ZWPk|n^a^lbv^3yA zY{r~GTsR`;@YQoF+#et;8y3p>!{lUOxXujjnr&mlM-|s}vrf1-*3%a!O1!URmv}Vh+fKPf^gMiRVa1Z?a!Mi|yMz46OkD}gxgrYd;-(}l?*^` zaAgI!kE@;y4L`>SKL(O88Fksy;rPTDW0(=H<^&-k94(XY7LMP~I7L&+;BuG6d*M}^ z*%xO(qvDB6eyja<_h*}~y1*JO$e_$>0_{%&;6#)a*?ig8rwqn%9>|bnJNG|qgyb(?I-0l-?y*4BYrbdc-W5P3gn_+`#W_)8YYP24pD=Rrhi3S+>@k`vC# zO=sc~oOa7zcgKGln5rEieZpOg-*JSDsW7WcQy)25f;DeXwL1cNVVv_K0lBo0tV?J^ z(p5rOHyPG-%a`>tLfQwo+vac%8AOGsRu1`waRBgO9^@C`Y`RXs%Uz#b8b*3;#PQ)M zZ!371c|^MrP=VEelTR!kz+Zgw9Os0^ilYUvH5mBFWAy3)Fwi<2RTO@D-bFwr@lne1~KFq!)oN1Vl7bn>x8vxEl{m4SgL0|^A95QbE_Zv~JMLAmwST2nm<;Amm zA4RFC+)ntWANQ({eQ)zg+i#Y}pTWLsOV=o?*OX~@Pq6WyanmQdaf@R~?;ZE7-zFKw zr?~Ca03yoBZp&&5HSJG~0}K?5JaGc?5@KGCpd}0Q1%DBerbVA`?>5RcLeoLatkZP0 z{Y7KZnFCP{kw`BHraj{q=`3$}P$DJ`WCP!ENm8{F3*a|67?{-610?93&bRYQb~z<{ z?u3bCv@;r~WcZ+~X!(Tb0o{JeFI}8TDs5V`8OQRsPBto}H5DB!s~V7W!g-7aJrn;n z{(_^>rbib_P`y~&c!PiZeU)$}YY)iI{9k;FjZ=6I z*AsE-M2$DJ0XibkElje-G}7)D;L(58=8Rap$@shj_CRrxID*(pU>k0kb00Hz3exEo zR&948_LGPtDf(E$WoC`4xn(p2t6VzS85>6D{f{5CK*Fb1U4%)p#&E7F#c#U~>I6V= z1bBOFrLXr!@vcXF?y0pN9c;#dCr7;LrqlZu@EzZpBNy)Zmdqk{TWxg zW4>0T@$i**nD8c6fow1S@V1Dn=&rr_D6UvYmAL-@bHzETlim>YV~tc;Nf!ib6+mbI zV2(^6DXorW#43R&%daxcAyjO_WOOOecooUhF8=;ozJPk1oBog6B}9#ZN0@_}bURzMfKnsNd=pz2bSgPOu0RAdQVADBKL036_& zP*w>SXLb2Avc6SI)$q{C5C@WO1R9KNyBXAIJ*_LX>8U(@=Ri#rO089~vGa-z8xG2{ z{h_UlW1Io7%;hOip3VZZ4Dk0YxnD`d5v6-68pLIsvZii?h1 zkuKZn<~SbjtAAZUw5FXo2hl>Z-;53MLZP25$Kxk;z|`G9)FC#5<6nuV3k^a(hogv= zq^Rxy&gdM#ZH)=UDbcy8D+k6E(5Xb5U$5A3rBVtU=!C+FBhxxjlLimKYwj&}Cv6X0 zF`N4TxolXm=}B&d`6qxV@%peWhelp?7vO;2QI|a~y#orv8y%y?;Xpdaw<_@9p9+4n ziWZHwrs3i&QlaUoxTs)*x>Xja2afk5UK7t}D==Z=9{b56T1CaKHJ8-Da-TCM5Aqj4z+)dQBE`qi ztY0w6kM}bH0!NMl_lU+)a*BG6j>HQ9RDE+`Zq`Rinq-nF$hi;+friL0x*~Y46L`e;4H}=MgN+Mn0D*@w^AE05q%ULLjxeiV%@8`sy=TV_<=z|i#3pQ%zTjKa@C>`NYMUxCD%(U683QJBwK;4x6til#fz>4CD+ zZ_FBRDGIW}_cQjGHGXV&t4za7uSj#prb2*UW}R`2e461Wfw=aWFwdf7$cwrm{PehZ zTehJQ13szDjf_@TEgnRQunyu%xwX9!W%#T-Ve54!4<W z@7~`LqxH&jI21Kwt^6M0F}G-a*>~Hr)NJcFJxg`F37NT0WB~Sqa;lCvw^nBQ%&uy> zu4!+~Fs1SrZ>pb(enLFiey^j)I69S2ciG*!_vIMPH0EqF5iIx4oy2mGF5OZhEUhEN zi01N<+|YVj!Dq1Bx8%6T+KvnA>X&@3@pJiwvkb58M?3G?WYVb{<{Nu_mt(ZX1iUQ? zrCkqLj*7erHY<4c&+l-Cd_hB&DrDj+Fg`R?)98}jm{3jO4OI%|FGsK5kPC=5KQh@m z&hOV#>ic7798>g;yEU1}&Fl+!gP15!8h?eCn;n*BoRyGFLPKsX#v%GoFE6geKM(pV&wxWjgC7Syj85M zZ6Vq4qpBZ5K8KqhLVp7HYoGau5hrK03lkTU6QA~*922X(XuqiPpgmlQ`ES|{G)U-p zn)TEg?y_^5t-HXptHsRbI7>0Sz*^NO5^bpAa!)p<%@BGn))0wI zc(>~sXYW5-xyHv#%wu3yZsRd+U-Tv6M%_((!6m09CBV*f5^f#DhpQ1SPY@Em!z4V} zj}zw7h5KDYK!2L&#opdufvvdm!lf;Zlp8*cmg2Fp(6G(GoX6dZLBSX92}Fk16I5EF zV}6gtO9%T!Suk+b(I&k_4JOEZ#U%j)tX37-@?a}fVyR~tZ!qZkWV%ks_y|55f3(%G zna_LCM@iljP}1I!^qn${!x8gf7m^&OO`4Z7Cdhc+UmCdGGw7zkYoNoqtw4Tv6$h31 zb?vT*^T(?&x2=Mg2AMa9ZpvZh?Uj6U=X&A-Mm9BR(TAm0-J>FgYj>kmfM}YLkrI|@ zIFJ3rc6T^j*V$s6c9S2huI_5JLuW|#@~XQWRr>Do9wS+45E5Olv^0Q#GSH9CE;51V z(EkqTgag0Nz)DMT5a9Z4RSB?XaoO=opz2hfBkvKlKGpU%V9~2FWU?JTz=0{=mA8=~ zpGlpHGz(W_tnrtKatRy_p(H+E??&}Y7mFxSIlu6xau--PX;0wt>o#f8A6|CY*8os}pJt={tp%r?ioxt~UA$!rhXGxfuqYru_C0Jd z&r&lbJ%Z`g2yJ|J>%ErzBH&(@Va5T>FiPT0wV`(wwZGlep8o#F+3(kv&-d)W>0@J`LuocM0ERk{5MOEsGNF<0Kf&lJ6RD3{!Il;s2OA z$l&`Y4~e)OQhGRFvZP@RlrPb58=1 zV3G#hB-#XU5CSGBTG(>47pcq>V93Jcp&nvxni`8JB79E-2b|Pm4e80f2ai5r=S@Pz ze5o8qJJbVEMvW(N?pV^$Tv{*ODr7uLK|Iu8@XPwl$n%oO|D>d#YUr(Yb_58Gp0!1Ik!cl{l{e=YZtCFu&~ zZivvhnYjYB7d9&YU8QfO|j# z=_vO3z4J5V$dL8K#m_%<-qYud9;$SplQ&$a4B>Gkp(Oap6oPFBYZvkEUU`=Y zp$Fv}ljWT#%JRH^2t}Xmjgz7mQoQ$AzmJ&0czSG-tY85;O1Th4Hu~p4g8^sC=|)bT zYhCD!niwNPwZ^E(Uy?MGr9IC3qx{v!^Azpf=7Wsg zvF@)h#&T-K26L0#CT&C3x>18_j9LTG;eMT|Ie>#rzaAO;;l!8`CLrzf8i}InX{dJ3 zVU9WD*}X3hEnUSwbe>(}mtsFGO2TvZn>OK1QdN00VcnKO5*#HdhdPzJtJDP##sHI1 z-rIpRjGwA3v_3>qqbdL4sI9I6ufvx5ma&3^SR-`dexKoM2Z)5()%c2t0LI2mg5r(* zQ9iI!rhxKSxL&m=KwVq&uhtjddU3fbtsn{@UQYP;MeIfD(fv5^{QK_jFpYp&DqR^*M%#X`{ai`3%7s}J3V`Frr%Xv6* zb3--ijuv<+yf*|wTz@-&_^Cg~yTZ8G8{7Q6p26dlYs`CjhNbv=6Db_Keu>)s(f9?c zJ)5Xabiy_j9Pl;?V7KnHdSfxgRf6gerYkgW;%aW(e;12tO))Zs?!Tc-+zTCWmR z9~Gp`iUh4JN`j7RpYiAOr-~NP6W$kW$-}o<>EzMDysU@|*1F+)bps7{M0uE% z*Ds{{__a$AuW2evFlkkK0O}REQBg)7RD^YOv5zj$65I2+MYh^>qJtglF(9ASzo&~OjeO6`aPcd35 zqO_rJ4s&FLf8Nyh)z?Xu>8~tFrppneYQteloBt%rXx|p^J|^>s->rf3NhuYjh!68v zRD|8piJ4VoDk|d%RNhywI5XV>a!ui8HRGH?%ec41 zNLVUcNY8o>d%lc!nN3{r>CzkbN7Sb%CPX=+>o~NJiXJ+tQXpPc<0CUm8b&*gyWJ_! zZ`e`az1L$^lGiHTDyH@RJwe88(QrU=%D;!mW|^t9YKXQd?kb3eIelpnYZb<|dU_2u zu54v7C}o#R)IuTixW?OnmZBm*m&h6>br~t-J@|bdThdDQ7{VZI&W5*4a`8bmp2&-q z+emRF_W+1BLUidv@zl7MIUV;yLe$hb5YXsj3~?yY-4fo2aumBD1tR7aIFn*-AIC}M zrM$RITl!IxvpSJuV#f}WgtKk@>?RI=hLr2R;gevD$mLb82nk7iP`UkK0@3m@M7Ax& zBBrG9Q`f-T_TV;~vy(j;v{AX$28)_L?FQQ|1f%&LUcqgWz$AP4k18QHMas5pm(}jL zE&8oUq;83Pd3Lnhr8TAGN>q}y6)6$fiB0HLVKBVa9+AJ5ofX~}6vD4WMzXT(RRmVs zW>-5=Q80_RfjkroB$Bmm&3smlEfSFBw6)k~wF7e8%5DH5s%s@Y)~-NLWq@s$Lpkn{ zRzpHLp-h0l^(uum(FSl3(yFq$1k*?jh*5;vzGi@FHv@F^577@C`aPKXt4}++Z^V4! z4Ps@M!w2gN20y|%`%;O=i)B2-eLaTSym19lFJ`cF>$9LR?F9bo=>d9qKh6E}% z*=y>_-O1*~4E|`Z=TPSaK9g_-W^k3;KJP+lHMSK3@>&%3jPL7yxw@VWGqj7wUT9}O z%7q$4+KpCx=<<8f93mN$NHQTTOaY~vjpj3$N+91NY9%2ZH><=*etepZH z<%d6EoNRgsMA&`CDCXL_31UFqyK&C%2!Ct3F-I@!5!mr`fYB*Zu%HIz5&V%idE=EU zvb&ME>7+oQ<=(?bWfMZa9RX;s;p9KR!M8IQwv~+4o$y^47*O%vjK@QJp)CPYNzSRAq!{64UiD={4fgT-mm`hc4YfFYCrQE-!a&n z>#4QvoBvyRc_<48H^rWgf;c9adpQ5-ifik1xBA-BM zPh5Pj51U~<#|zSp>UetQ6dmYBoybf1>10Z^bHJaLF-k=Z0bQl>d{+UzS|HDX3l!?Q zO_HrWY5oBW9LEHoiArT9NF$&PU)!Jf?JVH~YCDLIGlpWSS;ORn!3WWer;488Ept_H z|7u?}zHq;#eN~(UubaOT8ppaV*{&f?ski!@;p&BcBtZuml!I4ev%%#iXY?XG3GvjN z=MWUS4lQY>w0;$BF6~89>z|qZlTOfsdKh~mJQA+X#1uPgqrA{RKYn3{5DRf5Sr-{| z({+}k)-V~Ci|>Rvp>C~A5KH&uHRk*DMHHhS{1K4eRW$DQ@c=&U?}`cs3_gd zEp{v?QWG2QvcRDWlIZP|T}fNdFIg3)sHEnV%T2vOCRt#$wcm8~knb0v9Dx0N5t6z1 zs>U+w@X+bR1&^hT-wIDL33H*mn#GG}`5nbsC)hwgrP(GXS?O!Kj=~gd?^6$BC@4w& zDIHk~1QppzzOhx)Kmp6Umor)k?g zEp`x82|OG%ioP&%Jtjn`f04Q6R}1DpIJV0hOmc~EsApgsG0%zXmA1R*Cdn#+{pU8F zo74w|CDL2prtcc6EM~VzZ)QL9`vGsGu?(x5W;1I55~1moo0U48T9H~T9hYJ2y4CuM zr`qsM`2fqtvC^@7ch;!O%8!HHFNWjz%9K`Y?orn?6IxJkrscM;HcF(`zl<6hd3~4q z^K)+YTaQHbH>6kpemy(=tnr-l}LB z`dMZq0v!z9N{Un%aejisU^o=UFoa&+Rp>NpHN_B#!RsT;9?~DQZ{wQ_lbUZ_0NW~$ z{27G^G>S@-+kAp#FwdlQj!4Z?_ywqHK{DwR?R2?E6y{6uw{#{e<+@8nlIqyE&6>f` zb*%{cfGp>J44-|)QJbJ01+@y;E4}-Zs%&Sj%w#i%6jETBN##FYg9PNxCOLTCB7F1L zUSQLlLe;Z-(f15+jNcf)wr$nMJot#c0rSLns8u|SwV=UYTLQobWi3KQ3Y{lQEsq#^ z9a#mULWxxHumsvJqs|o&IEkN%H_kut-2hnlZh0eR<02d+BM5{Y#0bMqcvloNb&*Nd zX6#NDk0Qk+hB36AtSYy7cXWF8ONB)gA0}n6R%d^-nc$>EYYcl^KUQ1{vg^2|CKSOE zVet4{sEdgNZUZ9|gPIS<1|dwTs6hA)uX9h6j!|xeGF$v|w8+F7VFF=+Qf4BagHxqS zVZ|a*mCOFkvI~1JfhGLr_h@+;)>1WwFFP5VDHA`sP_Zw_iHj27aB!@>s0iTxQeSPk zoM-Y{L6}|8iWlNO7S8bj^7z$c(EgRisa7eVxRw;xZJz;E8cNZuLW*-|@17AbBVx(i z^{7Xa$o-`~V(NJ;6_f4SSbId~!rCNzQrah}t5(_bGvVK8jJA4zX37DfZ#Y1O=W_mjm!-dlHW-ap{}EWQv6bGo)$ z{zlb5*=In!7a@YeUR7pqs~|MjwR{JHQ1Qu5xNuB#a++Ky=|e`HmzKwf0@bDNddlrq4%;{4F~ zR$xC2{bscdHfB%1*?GJ7Pr4(^wkj(AdQLQ1 z*sSJUN=p_jap9c~CMFI){ZK^?8)0&9Da_*HH=VBsE{z8IJS%K|csL8MZch+Fs58*EmCv*R6GTQ)#KD`?GHTp@Zh74I9N%&ah z&1kV=@`FKMDjkc(FqP+5EQ{|)Dwx!meZl*71BA!I$(!c%Nl*LH zrC-76u@^E|1Nm-Ae_(;gNMQPj87{S9Rm*w$Od>MUgAgg!4oiA~T4}vO&YrAlk&FOO z!{m!thPO(DcqR2XwTF!Cv=2FnT16?lAj&U$G0T7&6MeX>6s^1uhb*DNhgPWzx;d_L z*3W$*PZF7+UE{U^bV3KoPhUm6*Bt^QoDX1>^Gm|+S#?K>T?jehd$2!#Px}}McJ_N# z;nCt?KEeLWhFQgzj~(ZQL|EkPM69*J(>*Q}y-Ui(B;)J3o;_7%X_aQNu&m0Ru}CH& zU8d$2#+E6(jhEDHa%YYf%c+zLe{n$V|GK@SLc{kxg;gcc3GNe-Zc#5|6(<6P-tnYJ!)#&hQ4?-fDkNwf|KcP#8c+D!zzRIQ;wjUNYM(!C64+F^-fJqK97NP|XJ(VOHHAUUaSBB zds!r(`E}lSBp&h9m63P|Nmt4>7i!3~*zj1fUS6^VC$rRb{C*rbF*U-TPKtLW6J!RY zin|YNvRFukpq{)8Ak#ZQZ%S2U;t~h9dgp+C2hW^*f*qHoaJMzsjrQQ@_E5XDxItBU zC##eUF5p}e!C|Ge^}CAt#41Ht5ngJSi#!nlZGUj7Kr3d+qD27#F8NuFjZAP~_`Wz!8roj*7Yu0kZ@T%SS1R87zJhX##va?DLwz-1d}~j{$sl< z{qfz6(pp*J$Ojdj*J&cnb_M8ZZXLxnS!@%jFVl%#|MN(jZbVMPtEinF!Mr5I1`Dz9Hx!p0B_u;q~FhSj5^U01!*9C;zc z0{u4(M{0l3Z=h~jbEqU^IB%a`fuzEs*uDxmi%uQ*id&fId3p;jB5E~O+1{5v+FNHz z72lV-?R+*ET{ORe1R3_v(xTt^9JKm=0q^;g18NFoot-a2Z;Qy+=GZ$885j;sh|w+M zBnb5;t3joWv64ITKji<)D5M!PRs1ulP2_sb{>V>44gC_4T@0CQl(fGahOy2mxbtJQ zh22K8=1wuM0UIkJCI|+@N610$vkL)R=gC;8LE1vU#D>=@wA7XB@Jl{lx`7I9aRG&h zI^%AVR#6>sUW>c^{e;NN&e=m|uC15{uXyc82-oOJc@a2Y{v1$LKm5=UQoQ3NICpkI zNMxaLXx2)EfJ#NeXk)dz1^Ds*FY8#|dBkdyJeJVGjdsV<4NN|~y*C>PS9P}sV zhdDiW+Px|{rfGEmx5?}izO7xy<&N7uwp4x3^4dFI;o}FuABRP!(i$kUY2UG_sIZ-=Kq^oxtm3!YzCcfTCDrbH~Tem&&D zEcUjGX!t&p1v2pqX|L_m$5(Q=?sJDKh6tIahxgce8dc7Ww0qX%&bB>@t2Z+15+{8A zmz}S_?d}`^EHxT)LkhrYX`eI{QgAKes<%|Nf*0R*;#Ioq{f~l-NJtKBH*(SnQikw@ zUw(+TqL4tfxBsM|yt#P1Gc#fSp84AC$EY_@2upTUV2&G)L7l;#kAi%OAWSuxC>t9@ zYjM5VR9z|MCSv|`q9+x)WDeT}|8{jroce)yL|Q$Mw|O(<7ehUmh@YK}m~x(p8WQsU z)LGP5=v0j;w7NqS9aZ=Ijs6=hExF`;tpWBo37&Up(NUWUpLU&WeXkz0dK+?8QwuvU z*Rt;HcgbE*hr z{HUY6yL(cS+(wqy$l2Ljpl@BD(FFL`oSVhqx$FF}&ZHdRTXE@c6a+3zicvWFR^r4X zVuAeO&Ge!Oi72}=wue8Da*#1)zy(_SM-$1=de!Px`i~}P*?@+f{gZqBK8buuRVD41 z_Eww0@X;QH<4`$K7%ZpY+UxZ$K7_iA5((S?-0Qcl1lzwFqI|9zB-AUZrhB5)4T49F zZS8N#ENf6wCvMM^sj{nn4_fw8c!`i!xI@A3#%8)$$V2NH5Kf})JJ7Zb7^RLc$qH^j zU9lqCA1V|eZA!e`_r<7+g@-RELZr$ywWle~DW*K*9`@L+~uMH*IoY0N-VD|n9*;xg?UNTpRtShsT zL`f&7)Se1Pt_Bh@BtpYS`?cb-yeWED@Tj<=Aj^Co7Zi0&(*MYFlcytzE_|m=aX8qT zm-2>DO*0%GW{+`X<5s~epFCP!%iEPJiWY+#;N9jQ1_d8^yhlEe_Ordi8 zxSN`W*Rassfl}%9ThbgU@bZS>{rx7lBf}pB6VdKRTuGSxWTnqM<|YPyMwshRy}^VB zXq%|i z6Rij2Q6SV4f6}RcigTUbzOHO;PDzC>?+f{}e=8Uh(h%pOYz{htI&I0S#m@-!WVvzk z;E>7$NH9AE_@IoM0obb1tIOBbvVFWhz3f7JTSt#zW&3`rS-;+vGIGU4$&Q%i@XXdc zR)o!_mH?IHoKPmj7xN5pqe~ZKpLpnE!7JUx<7npamz$wP&b>xHhEI~ z?w_-R0O>xGXyj!R;+%+{%16OzJQ0N|kM}NH6RN?JdSiAm&mf<{26v{^VgH!}QFs1$ z=ch&x;OYYr$oZLh>#Uockhyb}lS|S-PkU3rE$1DV(It{Og?0>W^OcU9gskv!ticHV z=K&A*tMoS)^I%G!l^<46hFd>Z%73_aFP+=tdPpQO#vp>;h;sRAq2uO&jAA`VNlIo=6hpg!HbTz*9*_Gd(-BmV}=yHsl?7anrz?g<|?9jChfkvB) zFrwRErL69ED&MxoSO_lHy;Kr{ehNQ`f)UK-%;rWP);iTh+D9B@!@UV2MiD9K#n&&r1g5jN&XnB5ip z5_i@dF73dT-+^cIj}@0SLz9^?qe_^CY>4|zDQ{mdtdl14@1o_e`yL(n@s^gID*Fqo zdS-mTd3o-pqg2`P1LwkenDKe zdpvn_>aK{nZHoYXCx$kO9IGXi&>QlaIQls+nGUu+YWES~LJ(Y>OR5OKhjKPaLo;3h zqe!|hAQQcL2)Vj2Q4i}@_?R^J;5_`6ViY@}1KoPqyI07-(>G7|FrMk}^{~<-@tHs` zPga0@_4!C?h4pF=bphWwwVKH6K?;H>5w8bQN}Q(XCzl$cPIszvYCB66TDo#VyDYzl z2+$d;e4Wl+81rasO&I8E^l)n|*2x5g+6;TB9h&Uz|97P4SmaCa*A2 zl^|bM<8Fnv&z_r{f@J9NFg`6_Gc5bUoRe!{07%g@5(x^qm&Gkxs2D zN|j70QP9-fspg<$AtOBM@`5`Xqn9zrzcqXm0)HDqhwO3{w5OTqAe zP7=9qu#|OT0l90&_Dc_$i$jHCRdiqVR}PG*$fW%egzmv(@(z)Ec=9X2WbhhA=xo5O zP5=CMbkz2uP3ukjD_%8QRgg<~q0WeFgnT>?h2GsRm0)zuW8`+CWz>0E&db10x_taZ zfbhD!941-qP}@!JsT^K#19Qo9Oq4OT3-+@1NHe(bG|5y?JDsGu39%c9HE}2IQxDkW z*-WUaq$($6($t~2%5^@rCsG&&h7z|_e8ygSoP5wLL!Qy-d)U)?pww{9 zgLlr6^`NN*c!MfW*TFN8!%i0R8Az!0D-Glq`s=9F>g+WC1c31DdYnu2N-%FQV$x)t zD?tuI|ABQ$vid!&AvTzk#QsJy*j-3|*{t! zHTsS10ACP;=Krw#upFqbf9=i8QgKtDd3UKKzY4EN+aCywStog{;)N0)3&iCU`Av(G z$j7bH^iplVCf^`Qn!!=_RNv)OP}z3NjzqX^G|)HyW}zgg(-X)Ey$JOjOurH>&Z}!r z4oMc9oYPzgS$q}M{El|32a`PH(`{s%u{P(n=I=}4@yv&`_0`2CO4aQ`QO@7m$4Z_k z*+{N!TW#H?uPgm=4<@<$Y5)i8gOU+(Fxz)uNCU7GN}7fn2A~0a3Z&b?9^;f`Ea~6CTP}u$cg;S}PpT(yee3pajb%zW`>A$x+3TZ6 zdtz>+-*_x{G{xsu1&l-8v6 z#VCzCa|BsjKH`z_Q$YyXshzO-eQ!v5P)X}`JL;6w*Rh=1_?;n?E+;>h{ts_&9S~*v zZ4C>8l)_LW(%m5_B|Q>SQVK)rP!iGt(%~T84bmY>NGT0ck^&+ijdX{EDEVDC{+`Ek z&ikJC&+jh-ow?(>uD$o#d##mT&~__snVrj6MpuCvhA=_#pZAGvJ-d8Jy+X&r^L_7< z3PUuK+LIu}yE{sVXsnaDizH0KTDHc-!M-SQprx+z;Tp5jHS`fS#&rUDZ9aMsOgc3y zj}miy43h_1UL)!Dfrylc0BYYYI5B)Eyp%4GI@mgmnV*I2Ai~iNP`)|+zt}wmguOh+ zfJ(X3bkxfmVn=f|%7<>mg}RDpIPT@B6#9mwfxyvUSXtQ3Eu=Oqa9~PJ<7&Xcvo;LC z>ZPv=e)se{^q7Azhle|O?z^#%7ngkMXGoDjN9KKz9Gc^L+o0zePMhqCHY5FnGfTv% z#hw;CFbIOfGrAUG0oJ*<5qB_e5NYC=@~!d3$XfWFAZ9GL##fr$BE8e@bjf3MB7`z5 zuVk?>7yJ%eI?4HLqRXn-B6_Xg@+*6>r8Vx1Keom=Dj|vGYRk=hgnfxZuMP1kYL$U+ z%6+h4Db0mgFX^>3K5hX2@IB42*9^o7_HjgurkZU~9ZhNT?x#ff&#dsUcME+RV)dtew3S+z&v-=GN>05p9EAWcc=hR z!<>j4>IYs#I-6qYb83PRY?s(bO2O_1Ky@~YT+Z|PfesWAPFk#N zx}m|XpS}SjvYMIr-qR!`3Z-F=%Fn=d#IhE!{LL9NfY5s!Omc0JN~|FIHiDr4o)6^5 z#mrWsT0j)_g5H)wu|0h(y4}sdMqMG+z*#zbb*$pG4pt8AeheeX@In~_Y08m&!SRF0 z^k#%g0s-CJcZu%nRo+7$E<-u$fpKU7OlvVPA$g5#v+YZv4xd_qU)x>kjnRN8%pX^p z+kviq2#4$`o`AO#vS; z=B4nTevY7=#OLY}cFTZ_ z9*?Kk?{}`#vQhy73`;yHnoQcJv+?z=KF3*`vhg4CL%oV(2hkN?4 zAP3?gL55G?z>Gq#5yu9SIV(Vg|8PzpA#hvi7&KOn-1Nt(2PJVysCbK30+Xr`j;g8p zqhg8*-8fb8Fk~UaO}2K8p$4$-Tii_E&&0@5vK#kl$x??`>Kvaj9u2sE(oxP}axz|0 zSpW%1!F=^dYdGDWROdYdh*2fQxBDo%t%Y%E==;a*(49jzCmQZYGHb2=WHAqfuO-U& zw9P>WJU+$}P7p2+?aPEy(yTl)buNZ~p;LN9<^)Xd*Vb)KWny%!`6rtAWZnP>R1Kh~ z2e?z%Mvz=|=Y46ok~%)nSzxPC!XUe}K_bf`N6oI`7D)r-yguDjkZU9U^sQ6WO$MX; zzQQgMKfUFlCzIu~D%Uq!>_O^6ey=z4H>^Z5pXHVC-8{#%-35I7U7UjkZJFPnc%Nuh z%iw=x#PauGjeG9q@5nSM+E*ezF&rrvw4i}X;_XI2f#shDgn$B@M! zf4e@I-?ugZTVzQY z##ETb7ckQT+Pg~Pb}rS+*>v082-aI>eX`cijS`Z|&h^G{AY z{Zns7hplONf*``Nk9%XuJsfY6gaMV7k7BkR}lHe zgU3VWN&6-*y8Fkp7U`7EOzdOIV1;db2(wBF_5~KhvN{d~7z|MXA0aCSpvJ0v2x(a* zKJp%`=TfjK(svEu`XcZ@XD{_MMmP8X6X7c#P z4KspT$M%Wz#F&4BQX%o5r(b+#o5yzX^jV>&Pdc?@15KxGJf*nMpT9>>sanpt|P!#I~P7{8K9mTpq9EpQ>IF zg;|gvCzP_jLGAxV=3tngW&b>}+j~^xfaeW9br@i|gH~-#%4(1-U&({NE5PBzeCfH9Pla?Zq9eghBuPhO(R+3Fg#gKhdS6*5VK2R@22W zZCyyR19Bz)rus_ci@vqncR!p-P!(n1ePRsdp3~N|WU2Z!7g|@dl+yDV)SJ`T#17vz zm%u7_f;=9~somM3XLRxYz;a|%zepZZeuszXU+fSoXom>S&E&Bmls)Wq-v0ZX!OIMG zzT`-N*^JE}17^`knMym~M=@mQfX_0#1{O%IUNA?~-+%s}uYgtp_`a2C=#J8NuV>{+ zRC7K2^Ow*?py9(8|3tb<4&=zT`uj)re}DKd_<3=;&lI6+Q!4`*7wu&H+rM9c2wl6l zqs$3L@Gh%(+`X#*{t){1KX(g#Pc1W88=7jJaH2EsNc;0=-n ze}4$B^S}Jzf7=d01KD@}-0TPFW^F=^=y?C@w+~=q0S?(Lpz>eXN`HeKRJXvJbS2Py zNb=7&L{8>1h|GD0{Q8Mrd*h+-1pZ~r*H0xqU*uh zwFP=as;Yc^j%yu|CKcpoAUyT#>+kQ7faUSGrnC6Nx9J3amb89-BSvCW-ytEIRLlHi zPam14FH?Xp|2sGpw4A4a7|kRQ%tjtA3y%}=m3J~qZUPYxv9sEWn~mcX6A#xHuHNeX zo`5vQdlc3?k<|2F3sQTj0z+7J5DNwpSl%kS+5fna|8)QBu?U#X;yMHbtznu+OniM{ zkw%=+ym9XPYT;4LG6QM)b%eT{0?ChWyH-{BJtt7F`x$^Y6OX~%^h(odteT_)Pz2Mc zYLTJS50>Vdur^z(Wx^^4FOG#O!(4(qD^ItR)9Bx2L{H>L_w2;t^pR0!(K6V{2VgM% zOSQ=t~q5i9Fx=o&tCAINaKFKUiB_N^>=OM}2g%*FOb{ zgtckUJyl4fJpdEL$V%8J1Funy=vItXdeQ*u!PXP0<7B{B z{5A~r>e z3do+!e?0?z&&l)Cne+E7bjMwk~jfg1F<$UEH&Ey=-cb4X<`j zU-CR5ilt2=u-OUJ2O5Jk2cb2m z(4an^+`FbT_s?kYQs3KBQ$+brGiTfShrPG@hZ2(g5qC|&Z8&?TvZ-ZF0t{vgJQh4V za+kAty7N(tXu5Jk9==u-RA*(NL%2{{qx`eNZLepV3NR{6W6T*YVj0Fx#0$nWrP>k zInqz00OdgHTY*rCOXWAKCXHFNF9SUyl;O*G4lYk|yZ#$I=xDe&C$zvKGUJ5bA;kn6 z@);M{i(PzMprf!MG6Npi6cDkAPq`Et%>Eh4-A6*^)%2^K&lA==bPlnQ@u%NpWQC!c zQv%MxW~tt)cY$O7HuBh9)CL+j=QKzY)ZsghGe}MPJk8lB*N6=BD=ubQUW1FaNF8HV zUP0q40nj_vl$8?af$4>ClM?HNZ1P;85$`v9&lCgFmUz8IJ5<%&g!;(8!h1~Oy* zrO|%ywBqy9(ZTxi@=tmCS>a|o@4eKJ(&B22ur(i{l6U@qR+OIAx)vs3$a7 zghA{{yXH94kS6OCg~ZWH4&mJ0gdz|{Asv-N8LRiOSaLhDbQ*9JcrVYce958G{P^q& z_HRh004P(QyEtvBqav_&H`3L9Miy!acj4TJKrAaFjtZdCu)(fpO&h(iimpt z+DXBGUEod8J_Eeo*)o1YiaMo(gTuL<0v8=n$O4c-8ikVmT!L17QZ_&`@&#y{RPbgO za>N5_j_#DFCs4Ru0*gJp zEx*Oi_tDvIqAjrceTHPi%S%JUy$NQSSuHb>5JWfn7s4XYf)ke7p#$S8kyhqp{tf4pBVrvzI^hk_-EsUe}T8QF7oN zv}%3f0-`{IBPAXH(c+n~YiiI3hiF4jtklUY5&2%T73>V0&D*6XI`0A!tp*F&REmMS z-TQA~{G+-8l8jI)x$E!_E4dwui|H76K)R;AG$S2sZMWd=o%H~L+wQKAFImN?v4mLA z)}Gt0j2L%iFOYBF%8k9h>((+zgx)hJKquVl6KRzIVQyN9B{x+4BW_H$aVXD{oyli` zU{hSb7eWDx3iivw*KL^N=+1Tmr%A3RsD7*`#}o|`Qa+>4C=12_@~lN5LT-Toc=$VV z4-W%B8^0P=e5J}PYQlJRrm1NHq<|+j2GMEYu$T0tAk-vik~#ko>4UB!?VlJnBE6N9 zilD!YvCcJEG&)CFO&n}UrSHCv3J*GHkT0-hE^(>nLMV%=>!kdXbD%GQy_W5MaRjd9 zL;LR0&U={NsDm3|lDk#x471ZBUxjt?Iz-4?1QR=y++yz>GYbv2UjP||bCnXR(| z?lU{AJ9j-cds#pVcAA&t{hZSUOzyP%SM*6+_~Bv%W3*gO@UaCmvAZhTZq7%muRRu@ zGdVm+exTZH#Zn2DkC2i@^Y8%V_fytfj@|YGSzw3UG%+I5py8q@%dF4k-8sJGngh!M z8jv@?0mNl{Z5c4_f*x5O35Mu04ZZ?GX||Kq4ytOgSfv)w8I_wKK*ey60USALRX1Dg z3Xw-YH`iUpE!ljI!Kv^J64|28<@tsjUZ|P?svmR3kx(>}q+|Di1l&TzQ8hSn^)+s9 zaR(es072L($_N(32~NFisVX0sYr%3GcCy)MDJs}f_m@?~rq#RQ1yvMUI>?t;Mb-jO z!}6>Kls_Fvjtd0%BDi!xk2WlH>!Li$ce@BKb9%TuP})_2z3T1?XbKSl4y0sPAg{)z zHi<6_U9p?dQgfu*0^xm(i4g=~S z1ZSOuO7N#+f?=K@x3KL^;x|iBLbkCGu>yYo(J>g2a862%#I6|4@cOCiSvOZpgTIS? z-JsM|GyQ5Ym{p9J3hjgpmGPZc?CO8WxA)zn`*rLS_X8>}RD*NAKMv$H^PdPWlCufT znHDHJq!Kl*edQh;wX7J+>Q=Fm?}OO3?k#{37YuNzQWHzRQ^KdEr})GEL(hvo&J8Cn24kKo5nB3m5GX1M2$9!ZycuxzX8RrUE)2v!<4;nQ)<;837o)URcbkoC& z-nf2`)~0Lm9M)$YS+b1eYuJz3?x|MrGV2f&dpEYIBGFIk@^p{Z`7(>JbFeG8U|{1G z?yiU&C$DRKLsuyrrvu;>eUK_T7zuff4_zzF2xHq;ecs>jV~MJf=Cz!<>7)A-#?(Op zF5MJSEZVH_{Ah0qYJi3#Jo+^&Kh4(UpJ&Zve(neI2#rRXv~kJ_9!c__Rv3HGAIwbL zPP{DlLPcK9s;fyoUDT7+ukh4>cThWpHRYbmj!jqrp~pzqH*&SZG1vvMKqTjxu6Eg( zpEytwB!}O&5bk}mi*{FR!sZR*3FAWEXm)IeWEy+Fy_wh--KVO*dwyUZIQUA^W*}4M z%&;h-?RTl;`%Ws$cW?y>lV_lDJd=B#OZ3=aNq;5MfhCSPDp6yLNjHHc`TPa>eC25) z{(NirH=rZs`N;NAA4vLa^-X?7pFIb$@Gudg%x1hBy%n+lsQRN~tb50|%3m$V=E=CB zEI^@s`O|(HEU2Krw+!gyku;8faI)U3jMY+;7}iheVyb))I|jJ>!<&FVE6Kjt_K3Z* z7>HASovHoqPoUH^+;Y=x`Lo44H_Npe7&|7$(#Zdc%Yo>D3p2dfNVNo*AHI(dtEQE& zjB&pS7--2}guEClTDFv3mWMg38OMR>T%mV(yE%N+q`96qbcbE@D;8-jz=I7-Zft?V zy1N);P%N=4P@VD!DOW~`AKJHpe;b?c0DsZuJrGY!e6Fct^h=&>!Oh{dgm4vxW&iv! z5L>;Uo#BB?0;SZhgAH<3vu3S}e&SiC!xcWy`#y-PH3RHP&7 zE@Ac)x#Y&7D$_8esr=ipQnA}TE--4c+(jzqfjr7Dn@1HYEfl7dVj1UvSlaaQ!3SW8 zuG;}zOwEHAm5d5-*n>@2tdjcWyW7Ua4+z^ucwrz7ues^2Hd+f}9Stw>AeJM1-oGZL z)Sf+il@FYE`f8v2MLs%nvu~>3DLNn`4C^wlJ9S%vFAoh==J6QCu>JvCEpo`vz2t5{e=f?Kb=e8O8AD2wrGFD{elmTP*$QqrY;BbcpHwV8Kx4tj$}G!pRrVW{rq*bWbi4 zh~O%23oHZAz}-lIQEQj{sI&a0yBY7gMw0_(uSYZ>GJ@LGt9uw6R6WVSLey0BErc=lTq3D7cZ3w+-h+O4f!Av{d7FVb`p^ zEi~95$xZncO4v#vU2{wFR-)Pcp3z5u#84ARJW;xjexI-YT%Ka79td0-V|PhjO?5GP z=Ao*r0A?D$fbgJsJA1etKrhZB9C80=OoV+`;rP?g|a1deUiTH&rZUUhQy)mEVHP=-$|-m(z%F+e7Z;5OQ1!y|S^UfTxzO{=Mu) zoZ%3z7?lR2x$Yg@E>cLOuYsI0jv2Z1n2j@+JT4D_YCyrv?z3;TD^R5^r`bVHK6d5V z&Z-Z?HnS3Jd*M#L;Nbq=z{GL7C}xLNEPm{B&|^_%?O&)ET1;8)4=cT1E;|*#qa?Il z#6^sWU1roq$t_Q@!7K*;i0AMwq6g$>n_cXlp}M^wq=+>WcU}QjyTu>bRQQ-HGoMn5 z*k{@avnLc(A*C|CHC%D2Ql7q!(E3JfkKSqah$HHTlU=QB27!}ZYpkEp?4CUC4=t(U z6ZR+FI4xIaTJCQlg{GgIs69Y5tNxBA+9ecy=_zfV8DRh_-{4#xm&Ke>#x$sS(l>0; zyS7R4^NY-WK zg-y(=SC3PUnQ=GG8o3uA{0)8Dz;d*Z5+~C^-Y~(@_+3KLw!>)lh&R`VxYo!H{A)ka z{a7T{gPN|N1=hLqO81F|oYoWRJHNZI(lUK~!H=bkKSFC!xPOYY%4`_?1e-Kv4ri15 zxrpS*Oixu$2vZ&gMd4bYBGoR%L04O+5*Qt~uw&mVo-yZMqAH*Z3mCCO)`fKh$#*~@ zruJ&{C#=C(-KTF}4h&jI8Gry&KT&oIrWaQ9F$rClY=yp41G+MC*m>JB1^Sf}>J%Qa zo$P4Th6vEQ^~z`#)MiQokL{Fw{`Ntf10_OXK*l57H~66ayYv}DxAb(@JE$Z!kkOL>E{OHR)St`^R6f~^*|+i#&xGwv zF!YoMH<&o1#ghXRJVwHpOh~YVNRPa`Nl{_RC;g6GQ6?P`&QY-@md`xH=R@CF;+#xp z8gzauon16l^H#g5Al++4IM3f?Q}DI7iNd;K>5D^3xY0yCwX#yLXf!kg5>M}4(cY9r zf3h=mLW@cd9{qK{A&+;^2fg=%j{TR8smHbK;WsdgJD5VR;{p=$?;0k6vc=4P1@SM= zXTbm=g|MeAED$oVqH>WIQ*yghWQKfSVzha}+OJ_=QP7Ey@}KiFd{$l9$r$$QBgeVA z>Gw#QGP#MkOtY$EP+ad_lkt^1LaG~~hB0eE#XAW!j>vF03?~?QLbKUr)kBOAFx!Lh zD2Ul88pg^@L=@FOWUEj}xK~!OMv>*Gc)$XmK9MM4uz&c~3dQdOa@m8f?C%9HtI>0$ zi$aLB$IW5}21Z~+k2*x6)br#=#}qUK+sb;%^;RWjuCMMoi5_lf`RoZnADU%J2edv3_2v%o)zEEA^%c0pCFwM2`nL&07b1+?inzNAr|5}pz%X%$`la-Q^9Bgiv*(%du08$sJ0lYQhk zC_NkTFdGcHIHa$w2F{CA=WnJuCxM~#EI~nB9UUV#GdYPoT7f>z!1>14kNiw-�Rw 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�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%0A@)wD^fwUy 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 ad8q*B=z+H%YgpF7zvFUhvRN{wSN Date: Tue, 6 Jan 2026 11:02:29 -0500 Subject: [PATCH 22/52] squash: add config definition to the loki module --- .../config.d.ts | 37 +++++++++++++++++++ .../package.json | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend-module-loki/config.d.ts diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/config.d.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/config.d.ts new file mode 100644 index 0000000000..8014863d53 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/config.d.ts @@ -0,0 +1,37 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface Config { + /** + * Configuration for the Orchestrator plugin. + */ + orchestrator?: { + workflowLogProvider?: { + loki?: { + /** + * Base URL of the Loki service. + */ + baseUrl: string; + logStreamSelectors?: Array<{ + // label is the selector, something like 'app' or 'service_name', etc... + label: string; + // value is the label matching operator, so something like: '=~".+"' + value: string; + }>; + }; + }; + }; +} diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index 169755fc3a..a7aad7c480 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -48,7 +48,8 @@ "@backstage/config": "^1.3.6" }, "files": [ - "dist" + "dist", + "config.d.ts" ], "repository": { "type": "git", From 4e2c8b52abd0e0fcc746a452f0190f0c515f6a85 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 11:10:34 -0500 Subject: [PATCH 23/52] squash: app-config update --- workspaces/orchestrator/app-config.yaml | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index 4ba6797e36..3e6a810bd8 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -1,8 +1,6 @@ app: title: RHDH Plugins - baseUrl: http://localhost:3001 -listen: - port: 3001 + baseUrl: http://localhost:3000 organization: name: Red Hat @@ -25,7 +23,6 @@ backend: # Content-Security-Policy directives follow the Helmet format: https://helmetjs.github.io/#reference # Default Helmet Content-Security-Policy values can be removed by setting the key to false cors: - origin: http://localhost:3001 methods: [GET, HEAD, PATCH, POST, PUT, DELETE] credentials: true # This is for local development only, it is not recommended to use this in production @@ -149,18 +146,17 @@ catalog: dynamicPlugins: frontend: {} orchestrator: - # Does more than one at a time make sense? - workflowLogProvider: - loki: - baseUrl: http://localhost:3100 + # Uncomment and configure to use the log viewer + # workflowLogProvider: + # loki: + # baseUrl: http://localhost:3100 + # Uncomment if using a custom log stream selector # logStreamSelectors: # - label: 'selector' # value: 'value' - # - label: 'selector-2' - # value: 'value' sonataFlowService: # uncomment the next line to use podman instead of docker - runtime: podman + # runtime: podman baseUrl: http://localhost port: 8899 autoStart: true @@ -170,9 +166,9 @@ orchestrator: # container: registry.redhat.io/openshift-serverless-1/logic-swf-devmode-rhel8:1.35.0 # notsecret notificationsBearerToken: bXljdXJscGFzc3dkCg== - # notificationsUrl: http://host.docker.internal:7007 + notificationsUrl: http://host.docker.internal:7007 # uncomment the next line if you are using podman: - notificationsUrl: http://host.containers.internal:7007 + # notificationsUrl: http://host.containers.internal:7007 # By default the Dev Mode workflows are Ephemeral. If you want to persist the data across restarts, # uncomment the next two lines, read more: https://www.rhdhorchestrator.io/blog/devmode-vs-prodmode/ # persistence: From d4be6caa2210cd9efe68b47eafedb5b5e6aa9a65 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 11:11:55 -0500 Subject: [PATCH 24/52] squash: . --- workspaces/orchestrator/app-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index 3e6a810bd8..3961b8ff92 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -23,6 +23,7 @@ backend: # Content-Security-Policy directives follow the Helmet format: https://helmetjs.github.io/#reference # Default Helmet Content-Security-Policy values can be removed by setting the key to false cors: + origin: http://localhost:3000 methods: [GET, HEAD, PATCH, POST, PUT, DELETE] credentials: true # This is for local development only, it is not recommended to use this in production From 54650a14fbf7fdf6bbba6e70a5b6414b730410d6 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 12:07:59 -0500 Subject: [PATCH 25/52] squash: some cleanup and code dedupe and better error handles --- .../src/workflowLogsProviders/LokiProvider.ts | 14 +++--- .../src/service/router.ts | 46 ++++++++++++------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 49242b87ee..e2c59ebfc9 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -88,13 +88,13 @@ export class LokiProvider implements WorkflowLogProvider { const urlToFetch = `${this.baseURL}${lokiApiEndpoint}?${params.toString()}`; - const response = await fetch(urlToFetch); - let allResults; - if (response.status > 399) { - // TODO: These are errors, throw something here - console.log('Error', response.statusText, response); - } else { + try { + const response = await fetch(urlToFetch); + if (!response.ok) { + throw new Error(await response.text()); + } + const jsonResponse = await response.json(); /** @@ -127,6 +127,8 @@ export class LokiProvider implements WorkflowLogProvider { log: val[1], }; }); + } catch (error) { + throw new Error(`Problem fetching loki logs: ${error.message}`); } const workflowLogsResponse: WorkflowLogsResponse = { diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 60df30b818..7097729ee4 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -51,6 +51,7 @@ import { orchestratorWorkflowSpecificPermission, orchestratorWorkflowUsePermission, orchestratorWorkflowUseSpecificPermission, + ProcessInstanceDTO, WorkflowOverviewListResultDTO, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; @@ -101,6 +102,23 @@ const authorize = async ( ); }; +const enforceInitiatorEntityCheck = ( + isUserAuthorizedForInstanceAdminView: boolean, + instance: ProcessInstanceDTO, + initiatorEntity: string, + instanceId: string, +) => { + // If not an admin, enforce initiatorEntity check + if (!isUserAuthorizedForInstanceAdminView) { + const instanceInitiatorEntity = instance.initiatorEntity; + if (instanceInitiatorEntity !== initiatorEntity) { + throw new Error( + `Unauthorized to access instance ${instanceId} not initiated by user.`, + ); + } + } +}; + const isUserAuthorizedForInstanceAdminViewPermission = async ( request: HttpRequest, permissionsSvc: PermissionsService, @@ -943,14 +961,12 @@ function setupInternalRoutes( ); // If not an admin, enforce initiatorEntity check - if (!isUserAuthorizedForInstanceAdminView) { - const instanceInitiatorEntity = instance.initiatorEntity; - if (instanceInitiatorEntity !== initiatorEntity) { - throw new Error( - `Unauthorized to access instance ${instanceId} not initiated by user.`, - ); - } - } + enforceInitiatorEntityCheck( + isUserAuthorizedForInstanceAdminView, + instance, + initiatorEntity, + instanceId, + ); auditEvent.success(); res.status(200).json(instance); @@ -1011,14 +1027,12 @@ function setupInternalRoutes( ); // If not an admin, enforce initiatorEntity check - if (!isUserAuthorizedForInstanceAdminView) { - const instanceInitiatorEntity = instance.initiatorEntity; - if (instanceInitiatorEntity !== initiatorEntity) { - throw new Error( - `Unauthorized to access instance ${instanceId} not initiated by user.`, - ); - } - } + enforceInitiatorEntityCheck( + isUserAuthorizedForInstanceAdminView, + instance, + initiatorEntity, + instanceId, + ); const logs = await routerApi.v2.getInstanceLogsByInstance(instance); From 7048c5eac4be99fa1b50054d25633015a264344a Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 12:13:26 -0500 Subject: [PATCH 26/52] squash: . --- .../src/service/router.ts | 46 +++++++------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 7097729ee4..60df30b818 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -51,7 +51,6 @@ import { orchestratorWorkflowSpecificPermission, orchestratorWorkflowUsePermission, orchestratorWorkflowUseSpecificPermission, - ProcessInstanceDTO, WorkflowOverviewListResultDTO, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; @@ -102,23 +101,6 @@ const authorize = async ( ); }; -const enforceInitiatorEntityCheck = ( - isUserAuthorizedForInstanceAdminView: boolean, - instance: ProcessInstanceDTO, - initiatorEntity: string, - instanceId: string, -) => { - // If not an admin, enforce initiatorEntity check - if (!isUserAuthorizedForInstanceAdminView) { - const instanceInitiatorEntity = instance.initiatorEntity; - if (instanceInitiatorEntity !== initiatorEntity) { - throw new Error( - `Unauthorized to access instance ${instanceId} not initiated by user.`, - ); - } - } -}; - const isUserAuthorizedForInstanceAdminViewPermission = async ( request: HttpRequest, permissionsSvc: PermissionsService, @@ -961,12 +943,14 @@ function setupInternalRoutes( ); // If not an admin, enforce initiatorEntity check - enforceInitiatorEntityCheck( - isUserAuthorizedForInstanceAdminView, - instance, - initiatorEntity, - instanceId, - ); + if (!isUserAuthorizedForInstanceAdminView) { + const instanceInitiatorEntity = instance.initiatorEntity; + if (instanceInitiatorEntity !== initiatorEntity) { + throw new Error( + `Unauthorized to access instance ${instanceId} not initiated by user.`, + ); + } + } auditEvent.success(); res.status(200).json(instance); @@ -1027,12 +1011,14 @@ function setupInternalRoutes( ); // If not an admin, enforce initiatorEntity check - enforceInitiatorEntityCheck( - isUserAuthorizedForInstanceAdminView, - instance, - initiatorEntity, - instanceId, - ); + if (!isUserAuthorizedForInstanceAdminView) { + const instanceInitiatorEntity = instance.initiatorEntity; + if (instanceInitiatorEntity !== initiatorEntity) { + throw new Error( + `Unauthorized to access instance ${instanceId} not initiated by user.`, + ); + } + } const logs = await routerApi.v2.getInstanceLogsByInstance(instance); From bced3b05e7302d84ce986cdbbec30f9fbdc4d135 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 12:23:55 -0500 Subject: [PATCH 27/52] squash: fix code style --- workspaces/orchestrator/app-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/orchestrator/app-config.yaml b/workspaces/orchestrator/app-config.yaml index 3961b8ff92..f48392273b 100644 --- a/workspaces/orchestrator/app-config.yaml +++ b/workspaces/orchestrator/app-config.yaml @@ -151,10 +151,10 @@ orchestrator: # workflowLogProvider: # loki: # baseUrl: http://localhost:3100 - # Uncomment if using a custom log stream selector - # logStreamSelectors: - # - label: 'selector' - # value: 'value' + # Uncomment if using a custom log stream selector + # logStreamSelectors: + # - label: 'selector' + # value: 'value' sonataFlowService: # uncomment the next line to use podman instead of docker # runtime: podman From e36cf0afb14157ae21e6d88e270056e5d8ac6e8a Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Jan 2026 12:51:04 -0500 Subject: [PATCH 28/52] squash: adding a changeset --- .../orchestrator/.changeset/green-readers-visit.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 workspaces/orchestrator/.changeset/green-readers-visit.md diff --git a/workspaces/orchestrator/.changeset/green-readers-visit.md b/workspaces/orchestrator/.changeset/green-readers-visit.md new file mode 100644 index 0000000000..b8aeaa3f73 --- /dev/null +++ b/workspaces/orchestrator/.changeset/green-readers-visit.md @@ -0,0 +1,9 @@ +--- +'@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki': major +'@red-hat-developer-hub/backstage-plugin-orchestrator-backend': minor +'@red-hat-developer-hub/backstage-plugin-orchestrator-common': minor +'@red-hat-developer-hub/backstage-plugin-orchestrator-node': major +'@red-hat-developer-hub/backstage-plugin-orchestrator': minor +--- + +Adding Workflow Logs endpoint. Loki provider added From f861b26d5d672343fbbdd837e2272d1caf273bad Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 13 Jan 2026 18:08:30 -0500 Subject: [PATCH 29/52] squash: update reports --- .../plugins/orchestrator-common/report.api.md | 655 ++++++++++-------- .../plugins/orchestrator/report.api.md | 54 +- 2 files changed, 386 insertions(+), 323 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/report.api.md b/workspaces/orchestrator/plugins/orchestrator-common/report.api.md index 4b2205cb81..5c22c0e1e6 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/report.api.md @@ -141,7 +141,7 @@ export interface ConfigurationParameters { export const DEFAULT_SONATAFLOW_BASE_URL = "http://localhost"; // @public -export const DEFAULT_SONATAFLOW_CONTAINER_IMAGE = "quay.io/kubesmarts/incubator-kie-sonataflow-devmode:main"; +export const DEFAULT_SONATAFLOW_CONTAINER_IMAGE = "quay.io/kubesmarts/incubator-kie-sonataflow-devmode:9.103.x-prod"; // Warning: (ae-missing-release-tag) "DEFAULT_SONATAFLOW_PERSISTENCE_PATH" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -236,6 +236,18 @@ export class DefaultApi extends BaseAPI { // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // Warning: (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' + // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen + // Warning: (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. + // Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' + // Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag + // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" + // Warning: (tsdoc-undefined-tag) The TSDoc tag "@memberof" is not defined in this configuration + getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig): Promise>; + // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen + // Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' + // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen + // Warning: (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. + // Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" // Warning: (tsdoc-undefined-tag) The TSDoc tag "@memberof" is not defined in this configuration @@ -313,6 +325,7 @@ export const DefaultApiAxiosParamCreator: (configuration?: Configuration) => { getInstances: (searchRequest?: SearchRequest, options?: RawAxiosRequestConfig) => Promise; getWorkflowInputSchemaById: (workflowId: string, instanceId?: string, options?: RawAxiosRequestConfig) => Promise; getWorkflowInstances: (workflowId: string, searchRequest?: SearchRequest, options?: RawAxiosRequestConfig) => Promise; + getWorkflowLogById: (instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig) => Promise; getWorkflowOverviewById: (workflowId: string, options?: RawAxiosRequestConfig) => Promise; getWorkflowSourceById: (workflowId: string, options?: RawAxiosRequestConfig) => Promise; getWorkflowStatuses: (options?: RawAxiosRequestConfig) => Promise; @@ -333,6 +346,7 @@ export const DefaultApiFactory: (configuration?: Configuration, basePath?: strin getInstances(searchRequest?: SearchRequest, options?: any): AxiosPromise; getWorkflowInputSchemaById(workflowId: string, instanceId?: string, options?: any): AxiosPromise; getWorkflowInstances(workflowId: string, searchRequest?: SearchRequest, options?: any): AxiosPromise; + getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: any): AxiosPromise; getWorkflowOverviewById(workflowId: string, options?: any): AxiosPromise; getWorkflowSourceById(workflowId: string, options?: any): AxiosPromise; getWorkflowStatuses(options?: any): AxiosPromise>; @@ -353,6 +367,7 @@ export const DefaultApiFp: (configuration?: Configuration) => { getInstances(searchRequest?: SearchRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; getWorkflowInputSchemaById(workflowId: string, instanceId?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; getWorkflowInstances(workflowId: string, searchRequest?: SearchRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; + getWorkflowLogById(instanceId: string, rawlog?: boolean, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; getWorkflowOverviewById(workflowId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; getWorkflowSourceById(workflowId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>; getWorkflowStatuses(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>>; @@ -1386,6 +1401,24 @@ export interface WorkflowLogEntry { log: string; } +// Warning: (tsdoc-undefined-tag) The TSDoc tag "@export" is not defined in this configuration +// Warning: (tsdoc-undefined-tag) The TSDoc tag "@interface" is not defined in this configuration +// Warning: (ae-missing-release-tag) "WorkflowLogsResponse" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface WorkflowLogsResponse { + // Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag + // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" + // Warning: (tsdoc-undefined-tag) The TSDoc tag "@type" is not defined in this configuration + // Warning: (tsdoc-undefined-tag) The TSDoc tag "@memberof" is not defined in this configuration + 'instanceId'?: string; + // Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag + // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" + // Warning: (tsdoc-undefined-tag) The TSDoc tag "@type" is not defined in this configuration + // Warning: (tsdoc-undefined-tag) The TSDoc tag "@memberof" is not defined in this configuration + 'logs'?: any; +} + // Warning: (ae-missing-release-tag) "WorkflowOverview" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1662,206 +1695,190 @@ export interface WorkflowRunStatusDTO { // src/generated/client/api.d.ts:335:1 - (ae-undocumented) Missing documentation for "PaginationInfoDTOOrderDirectionEnum". // src/generated/client/api.d.ts:496:1 - (ae-undocumented) Missing documentation for "ProcessInstanceStatusDTO". // src/generated/client/api.d.ts:588:1 - (ae-undocumented) Missing documentation for "WorkflowFormatDTO". -// src/generated/client/api.d.ts:818:22 - (ae-undocumented) Missing documentation for "WorkflowResultDTOOutputsInnerFormatEnum". -// src/generated/client/api.d.ts:824:1 - (ae-undocumented) Missing documentation for "WorkflowResultDTOOutputsInnerFormatEnum". -// src/generated/client/api.d.ts:858:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:859:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:859:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:860:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:860:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:860:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:861:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:861:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:863:5 - (ae-forgotten-export) The symbol "RequestArgs" needs to be exported by the entry point index.d.ts -// src/generated/client/api.d.ts:866:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:867:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:867:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:868:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:868:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:869:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:869:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:869:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:870:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:870:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:875:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:876:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:876:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:877:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:877:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:877:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:878:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:878:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:883:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:884:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:884:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:884:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:885:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:885:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:885:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:886:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:886:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:891:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:891:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:892:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:892:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:892:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:893:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:893:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:893:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:894:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:894:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:899:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:900:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:900:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:901:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:901:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:901:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:902:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:902:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:902:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:903:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:903:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:908:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:908:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:909:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:909:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:909:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:910:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:910:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:915:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:915:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:916:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:916:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:916:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:917:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:917:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:922:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:923:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:923:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:923:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:924:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:924:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:837:22 - (ae-undocumented) Missing documentation for "WorkflowResultDTOOutputsInnerFormatEnum". +// src/generated/client/api.d.ts:843:1 - (ae-undocumented) Missing documentation for "WorkflowResultDTOOutputsInnerFormatEnum". +// src/generated/client/api.d.ts:877:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:878:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:878:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:879:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:879:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:879:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:880:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:880:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:882:5 - (ae-forgotten-export) The symbol "RequestArgs" needs to be exported by the entry point index.d.ts +// src/generated/client/api.d.ts:885:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:886:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:886:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:887:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:887:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:888:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:888:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:888:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:889:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:889:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:894:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:895:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:895:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:896:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:896:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:896:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:897:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:897:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:902:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:903:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:903:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:903:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:904:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:904:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:904:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:905:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:905:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:910:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:910:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:911:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:911:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:911:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:912:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:912:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:912:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:913:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:913:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:918:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:919:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:919:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:920:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:920:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:920:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:921:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:921:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:921:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:922:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:922:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:927:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:927:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:928:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:928:25 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:928:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:929:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:929:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:929:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:929:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:930:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:930:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:930:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:931:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:931:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:930:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:930:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:935:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:935:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:936:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:936:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:936:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:936:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:937:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:937:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:937:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:938:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:938:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:937:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:937:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:942:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:942:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:943:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:943:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:943:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:944:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:944:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:944:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:945:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:945:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:950:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:951:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:951:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:952:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:952:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:953:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:953:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:954:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:954:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:954:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:955:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:955:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:966:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:967:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:967:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:968:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:968:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:968:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:969:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:969:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:974:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:975:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:975:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:976:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:976:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:977:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:977:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:977:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:978:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:978:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:983:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:984:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:984:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:985:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:985:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:985:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:986:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:986:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:991:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:992:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:992:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:992:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:993:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:993:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:993:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:994:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:994:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:999:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:999:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1000:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1000:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1000:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1001:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1001:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1001:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1002:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1002:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1007:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1008:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1008:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1009:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1009:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1009:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1010:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1010:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1010:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1011:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1011:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1016:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1016:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1017:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1017:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1017:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1018:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1018:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1023:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1023:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1024:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1024:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1024:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1025:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1025:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1030:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1031:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1031:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1031:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1032:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1032:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:944:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:944:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:949:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:950:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:950:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:950:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:951:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:951:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:956:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:956:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:956:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:957:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:957:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:957:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:958:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:958:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:963:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:963:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:963:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:964:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:964:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:964:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:965:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:965:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:970:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:970:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:971:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:971:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:971:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:972:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:972:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:977:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:978:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:978:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:979:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:979:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:980:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:980:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:981:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:981:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:981:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:982:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:982:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:993:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:994:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:994:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:995:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:995:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:995:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:996:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:996:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1001:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1002:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1002:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1003:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1003:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1004:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1004:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1004:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1005:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1005:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1010:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1011:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1011:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1012:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1012:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1012:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1013:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1013:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1018:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1019:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1019:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1019:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1020:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1020:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1020:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1021:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1021:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1026:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1026:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1027:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1027:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1027:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1028:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1028:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1028:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1029:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1029:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1034:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1035:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1035:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1036:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1036:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1036:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1037:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1037:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1037:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1037:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1038:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1038:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1038:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1039:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1039:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1038:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1038:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1043:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1043:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1044:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1044:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1044:25 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1044:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1045:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/generated/client/api.d.ts:1045:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. @@ -1875,104 +1892,104 @@ export interface WorkflowRunStatusDTO { // src/generated/client/api.d.ts:1052:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1053:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag // src/generated/client/api.d.ts:1053:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1058:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1058:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1058:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1059:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1059:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1059:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1060:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1060:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1061:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1061:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1062:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1062:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1062:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1063:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1063:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1074:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1075:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1075:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1076:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1076:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1076:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1077:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1077:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1082:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1083:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1083:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1084:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1084:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1085:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1085:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1085:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1086:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1086:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1091:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1092:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1092:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1093:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1093:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1093:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1094:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1094:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1099:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1100:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1100:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1100:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1101:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1101:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1101:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1102:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1102:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1107:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1107:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1108:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1108:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1108:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1109:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1109:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1109:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1110:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1110:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1115:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1116:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1116:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1117:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1117:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1117:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1060:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1060:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1065:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1066:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1066:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1066:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1067:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1067:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1072:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1072:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1072:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1073:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1073:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1073:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1074:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1074:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1079:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1079:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1079:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1080:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1080:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1080:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1081:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1081:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1086:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1086:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1087:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1087:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1087:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1088:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1088:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1093:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1094:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1094:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1095:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1095:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1096:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1096:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1097:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1097:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1097:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1098:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1098:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1109:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1110:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1110:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1111:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1111:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1111:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1112:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1112:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1117:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration // src/generated/client/api.d.ts:1118:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1118:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1118:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1119:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1119:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1124:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1124:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1125:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1125:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1125:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1126:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1126:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1131:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1131:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1132:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1132:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1132:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1133:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1133:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1138:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration -// src/generated/client/api.d.ts:1139:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1139:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1139:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1140:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1140:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1145:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1145:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1145:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1146:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1146:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1146:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1147:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1147:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1119:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1119:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1120:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1120:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1120:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1121:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1121:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1126:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1127:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1127:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1128:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1128:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1128:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1129:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1129:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1134:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1135:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1135:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1135:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1136:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1136:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1136:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1137:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1137:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1142:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1142:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1143:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1143:24 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1143:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1144:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1144:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1144:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1145:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1145:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1150:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1151:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1151:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1152:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1152:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1152:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1152:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1153:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/generated/client/api.d.ts:1153:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. @@ -1982,22 +1999,68 @@ export interface WorkflowRunStatusDTO { // src/generated/client/api.d.ts:1159:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/generated/client/api.d.ts:1159:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1160:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1160:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1160:25 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1160:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1161:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1161:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// src/generated/client/api.d.ts:1166:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1161:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1161:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1161:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1162:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1162:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" // src/generated/client/api.d.ts:1167:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/generated/client/api.d.ts:1167:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' // src/generated/client/api.d.ts:1168:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1168:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. // src/generated/client/api.d.ts:1168:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1169:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1169:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1170:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/generated/client/api.d.ts:1170:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. -// src/generated/client/api.d.ts:1170:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// src/generated/client/api.d.ts:1171:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// src/generated/client/api.d.ts:1171:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1169:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1169:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1174:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1174:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1175:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1175:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1175:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1176:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1176:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1181:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1182:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1182:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1182:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1183:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1183:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1188:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1188:31 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1188:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1189:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1189:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1189:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1190:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1190:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1195:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1195:54 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1195:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1196:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1196:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1196:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1197:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1197:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1202:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1202:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1203:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1203:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1203:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1204:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1204:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" +// src/generated/client/api.d.ts:1209:8 - (tsdoc-undefined-tag) The TSDoc tag "@summary" is not defined in this configuration +// src/generated/client/api.d.ts:1210:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1210:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1211:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1211:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1212:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1212:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1213:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// src/generated/client/api.d.ts:1213:19 - (tsdoc-param-tag-with-invalid-optional-name) The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets. +// src/generated/client/api.d.ts:1213:15 - (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' +// src/generated/client/api.d.ts:1214:30 - (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag +// src/generated/client/api.d.ts:1214:16 - (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" // src/generated/client/base.d.ts:27:4 - (tsdoc-undefined-tag) The TSDoc tag "@export" is not defined in this configuration // src/generated/client/base.d.ts:28:4 - (tsdoc-undefined-tag) The TSDoc tag "@interface" is not defined in this configuration // src/generated/client/base.d.ts:36:4 - (tsdoc-undefined-tag) The TSDoc tag "@export" is not defined in this configuration diff --git a/workspaces/orchestrator/plugins/orchestrator/report.api.md b/workspaces/orchestrator/plugins/orchestrator/report.api.md index 380cb0cbc8..90f444e153 100644 --- a/workspaces/orchestrator/plugins/orchestrator/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator/report.api.md @@ -36,22 +36,35 @@ root: RouteRef; // // @public (undocumented) export const orchestratorTranslationRef: TranslationRef<"plugin.orchestrator", { +readonly "common.values": string; +readonly "common.close": string; +readonly "common.run": string; +readonly "common.details": string; +readonly "common.unavailable": string; +readonly "common.cancel": string; +readonly "common.execute": string; +readonly "common.links": string; +readonly "common.back": string; +readonly "common.next": string; +readonly "common.review": string; +readonly "page.title": string; +readonly "page.tabs.workflows": string; +readonly "page.tabs.allRuns": string; +readonly "page.tabs.workflowDetails": string; +readonly "page.tabs.workflowRuns": string; readonly "table.title.workflows": string; readonly "table.title.allRuns": string; readonly "table.title.allWorkflowRuns": string; -readonly "table.headers.name": string; readonly "table.headers.description": string; -readonly "table.headers.duration": string; +readonly "table.headers.name": string; readonly "table.headers.runStatus": string; readonly "table.headers.started": string; readonly "table.headers.status": string; readonly "table.headers.workflowStatus": string; +readonly "table.headers.duration": string; readonly "table.headers.lastRun": string; readonly "table.headers.lastRunStatus": string; readonly "table.headers.workflowName": string; -readonly "table.actions.run": string; -readonly "table.actions.viewRuns": string; -readonly "table.actions.viewInputSchema": string; readonly "table.filters.started": string; readonly "table.filters.status": string; readonly "table.filters.startedOptions.today": string; @@ -64,17 +77,9 @@ readonly "table.status.completed": string; readonly "table.status.aborted": string; readonly "table.status.pending": string; readonly "table.status.active": string; -readonly "common.details": string; -readonly "common.values": string; -readonly "common.execute": string; -readonly "common.close": string; -readonly "common.run": string; -readonly "common.unavailable": string; -readonly "common.cancel": string; -readonly "common.links": string; -readonly "common.back": string; -readonly "common.next": string; -readonly "common.review": string; +readonly "table.actions.run": string; +readonly "table.actions.viewRuns": string; +readonly "table.actions.viewInputSchema": string; readonly "duration.aFewSeconds": string; readonly "duration.aSecond": string; readonly "duration.seconds": string; @@ -88,13 +93,7 @@ readonly "duration.aMonth": string; readonly "duration.months": string; readonly "duration.aYear": string; readonly "duration.years": string; -readonly "page.title": string; -readonly "page.tabs.workflows": string; -readonly "page.tabs.allRuns": string; -readonly "page.tabs.workflowDetails": string; -readonly "page.tabs.workflowRuns": string; readonly "run.title": string; -readonly "run.results": string; readonly "run.status.running": string; readonly "run.status.failed": string; readonly "run.status.completed": string; @@ -109,34 +108,35 @@ readonly "run.status.resultsWillBeDisplayedHereOnceTheRunIsComplete": string; readonly "run.pageTitle": string; readonly "run.variables": string; readonly "run.inputs": string; +readonly "run.results": string; readonly "run.logs.title": string; readonly "run.logs.viewLogs": string; readonly "run.logs.noLogsAvailable": string; -readonly "run.abort.button": string; readonly "run.abort.title": string; readonly "run.abort.completed.title": string; readonly "run.abort.completed.message": string; +readonly "run.abort.button": string; readonly "run.abort.warning": string; readonly "run.retrigger": string; readonly "run.viewVariables": string; readonly "run.suggestedNextWorkflow": string; readonly "run.suggestedNextWorkflows": string; -readonly "workflow.details": string; -readonly "workflow.progress": string; readonly "workflow.errors.retriggerFailed": string; readonly "workflow.errors.abortFailed": string; readonly "workflow.errors.abortFailedWithReason": string; readonly "workflow.errors.failedToLoadDetails": string; readonly "workflow.status.available": string; readonly "workflow.status.unavailable": string; +readonly "workflow.details": string; readonly "workflow.definition": string; +readonly "workflow.progress": string; readonly "workflow.fields.description": string; -readonly "workflow.fields.workflowId": string; -readonly "workflow.fields.duration": string; readonly "workflow.fields.runStatus": string; readonly "workflow.fields.started": string; readonly "workflow.fields.workflowStatus": string; +readonly "workflow.fields.duration": string; readonly "workflow.fields.workflow": string; +readonly "workflow.fields.workflowId": string; readonly "workflow.fields.workflowIdCopied": string; readonly "workflow.messages.areYouSureYouWantToRunThisWorkflow": string; readonly "workflow.messages.userNotAuthorizedExecute": string; From d4cb9875a00b87477343c10710db7828558205f6 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 13 Jan 2026 18:27:04 -0500 Subject: [PATCH 30/52] squash: . --- .../orchestrator/plugins/orchestrator-common/report.api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-common/report.api.md b/workspaces/orchestrator/plugins/orchestrator-common/report.api.md index 5c22c0e1e6..5129f65819 100644 --- a/workspaces/orchestrator/plugins/orchestrator-common/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator-common/report.api.md @@ -141,7 +141,7 @@ export interface ConfigurationParameters { export const DEFAULT_SONATAFLOW_BASE_URL = "http://localhost"; // @public -export const DEFAULT_SONATAFLOW_CONTAINER_IMAGE = "quay.io/kubesmarts/incubator-kie-sonataflow-devmode:9.103.x-prod"; +export const DEFAULT_SONATAFLOW_CONTAINER_IMAGE = "quay.io/kubesmarts/incubator-kie-sonataflow-devmode:main"; // Warning: (ae-missing-release-tag) "DEFAULT_SONATAFLOW_PERSISTENCE_PATH" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // From b8a33e9c5bf3dbe58cfb128c400c5575e1d97d84 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 13 Jan 2026 19:08:01 -0500 Subject: [PATCH 31/52] squash: . --- .../plugins/orchestrator/report.api.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator/report.api.md b/workspaces/orchestrator/plugins/orchestrator/report.api.md index 90f444e153..380cb0cbc8 100644 --- a/workspaces/orchestrator/plugins/orchestrator/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator/report.api.md @@ -36,35 +36,22 @@ root: RouteRef; // // @public (undocumented) export const orchestratorTranslationRef: TranslationRef<"plugin.orchestrator", { -readonly "common.values": string; -readonly "common.close": string; -readonly "common.run": string; -readonly "common.details": string; -readonly "common.unavailable": string; -readonly "common.cancel": string; -readonly "common.execute": string; -readonly "common.links": string; -readonly "common.back": string; -readonly "common.next": string; -readonly "common.review": string; -readonly "page.title": string; -readonly "page.tabs.workflows": string; -readonly "page.tabs.allRuns": string; -readonly "page.tabs.workflowDetails": string; -readonly "page.tabs.workflowRuns": string; readonly "table.title.workflows": string; readonly "table.title.allRuns": string; readonly "table.title.allWorkflowRuns": string; -readonly "table.headers.description": string; readonly "table.headers.name": string; +readonly "table.headers.description": string; +readonly "table.headers.duration": string; readonly "table.headers.runStatus": string; readonly "table.headers.started": string; readonly "table.headers.status": string; readonly "table.headers.workflowStatus": string; -readonly "table.headers.duration": string; readonly "table.headers.lastRun": string; readonly "table.headers.lastRunStatus": string; readonly "table.headers.workflowName": string; +readonly "table.actions.run": string; +readonly "table.actions.viewRuns": string; +readonly "table.actions.viewInputSchema": string; readonly "table.filters.started": string; readonly "table.filters.status": string; readonly "table.filters.startedOptions.today": string; @@ -77,9 +64,17 @@ readonly "table.status.completed": string; readonly "table.status.aborted": string; readonly "table.status.pending": string; readonly "table.status.active": string; -readonly "table.actions.run": string; -readonly "table.actions.viewRuns": string; -readonly "table.actions.viewInputSchema": string; +readonly "common.details": string; +readonly "common.values": string; +readonly "common.execute": string; +readonly "common.close": string; +readonly "common.run": string; +readonly "common.unavailable": string; +readonly "common.cancel": string; +readonly "common.links": string; +readonly "common.back": string; +readonly "common.next": string; +readonly "common.review": string; readonly "duration.aFewSeconds": string; readonly "duration.aSecond": string; readonly "duration.seconds": string; @@ -93,7 +88,13 @@ readonly "duration.aMonth": string; readonly "duration.months": string; readonly "duration.aYear": string; readonly "duration.years": string; +readonly "page.title": string; +readonly "page.tabs.workflows": string; +readonly "page.tabs.allRuns": string; +readonly "page.tabs.workflowDetails": string; +readonly "page.tabs.workflowRuns": string; readonly "run.title": string; +readonly "run.results": string; readonly "run.status.running": string; readonly "run.status.failed": string; readonly "run.status.completed": string; @@ -108,35 +109,34 @@ readonly "run.status.resultsWillBeDisplayedHereOnceTheRunIsComplete": string; readonly "run.pageTitle": string; readonly "run.variables": string; readonly "run.inputs": string; -readonly "run.results": string; readonly "run.logs.title": string; readonly "run.logs.viewLogs": string; readonly "run.logs.noLogsAvailable": string; +readonly "run.abort.button": string; readonly "run.abort.title": string; readonly "run.abort.completed.title": string; readonly "run.abort.completed.message": string; -readonly "run.abort.button": string; readonly "run.abort.warning": string; readonly "run.retrigger": string; readonly "run.viewVariables": string; readonly "run.suggestedNextWorkflow": string; readonly "run.suggestedNextWorkflows": string; +readonly "workflow.details": string; +readonly "workflow.progress": string; readonly "workflow.errors.retriggerFailed": string; readonly "workflow.errors.abortFailed": string; readonly "workflow.errors.abortFailedWithReason": string; readonly "workflow.errors.failedToLoadDetails": string; readonly "workflow.status.available": string; readonly "workflow.status.unavailable": string; -readonly "workflow.details": string; readonly "workflow.definition": string; -readonly "workflow.progress": string; readonly "workflow.fields.description": string; +readonly "workflow.fields.workflowId": string; +readonly "workflow.fields.duration": string; readonly "workflow.fields.runStatus": string; readonly "workflow.fields.started": string; readonly "workflow.fields.workflowStatus": string; -readonly "workflow.fields.duration": string; readonly "workflow.fields.workflow": string; -readonly "workflow.fields.workflowId": string; readonly "workflow.fields.workflowIdCopied": string; readonly "workflow.messages.areYouSureYouWantToRunThisWorkflow": string; readonly "workflow.messages.userNotAuthorizedExecute": string; From 36b1defbfad6629355fcbe9bc7205fd05b8773bb Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 12:10:12 -0500 Subject: [PATCH 32/52] squash: adding tests --- .../src/service/api/v2.test.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.test.ts index fcb2e4b67a..8657517137 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/api/v2.test.ts @@ -23,6 +23,7 @@ import { ProcessInstanceListResultDTO, SearchRequest, toWorkflowYaml, + WorkflowLogsResponse, WorkflowOverview, WorkflowOverviewDTO, WorkflowOverviewListResultDTO, @@ -57,6 +58,7 @@ const createMockOrchestratorService = (): OrchestratorService => { {} as any, // Mock sonataFlowService {} as any, // Mock dataIndexService {} as any, // Mock workflowCacheService + {} as any, // Mock WorkflowProvider ); mockOrchestratorService.fetchWorkflowOverviews = jest.fn(); @@ -69,6 +71,7 @@ const createMockOrchestratorService = (): OrchestratorService => { mockOrchestratorService.executeWorkflow = jest.fn(); mockOrchestratorService.abortWorkflowInstance = jest.fn(); mockOrchestratorService.pingWorkflowService = jest.fn(); + mockOrchestratorService.fetchWorkflowLogsByInstance = jest.fn(); return mockOrchestratorService; }; @@ -549,3 +552,38 @@ describe('abortWorkflow', () => { await expect(promise).rejects.toThrow('Simulated abort workflow error'); }); }); + +describe('getInstanceLogsByInstance', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('Has logs', async () => { + // Create the process instance for the log? + // Probably need a generate log or something + const processInstance = generateProcessInstance(1); + const mockedLog = { + instanceId: '123456', + logs: [ + '2025-11-14 14:08:52,645 d5932f2cb566 INFO [org.kie.kogito.serverless.workflow.devservices.De....', + ], + }; + + // Mock return value + ( + mockOrchestratorService.fetchWorkflowLogsByInstance as jest.Mock + ).mockResolvedValue(mockedLog); + + // Act - call the function to get the logs + const instanceLogs: WorkflowLogsResponse = + await v2.getInstanceLogsByInstance(processInstance); + + // Assert + expect( + mockOrchestratorService.fetchWorkflowLogsByInstance, + ).toHaveBeenCalledTimes(1); + expect(instanceLogs).toBeDefined(); + expect(instanceLogs.instanceId).toEqual('123456'); + expect(instanceLogs.logs.length).toEqual(1); + }); +}); From 6d2f291db98fe958d395fa110316fc9e2ae94df4 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 14:44:21 -0500 Subject: [PATCH 33/52] squash: more tests --- .../__fixtures__/mockProviders.ts | 49 +++++++++++ .../WorkflowLogsProviderRegistry.test.ts | 87 +++++++++++++++++++ .../WorkflowLogsProvidersRegistry.ts | 8 +- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts create mode 100644 workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts new file mode 100644 index 0000000000..645538d474 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts @@ -0,0 +1,49 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + ProcessInstanceDTO, + WorkflowLogsResponse, +} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; +import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; + +export class MockWorkflowLogProviders implements WorkflowLogProvider { + constructor( + protected providerId: string, + protected baseURL: string, + ) {} + getProviderId(): string { + return this.providerId; + } + getBaseURL(): string { + return this.baseURL; + } + fetchWorkflowLogsByIntance( + workflowInstance: ProcessInstanceDTO, + ): Promise { + throw new Error('Method not implemented.'); + } +} + +export const lokiLogProvider = new MockWorkflowLogProviders( + 'loki', + 'http://localhost:9092', +); + +export const randomLogProviderThatDoesntExist = new MockWorkflowLogProviders( + 'random', + 'http://localhost:random', +); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts new file mode 100644 index 0000000000..ec6a57f8e5 --- /dev/null +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts @@ -0,0 +1,87 @@ +/* + * Copyright Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ConflictError, NotFoundError } from '@backstage/errors'; + +import { + lokiLogProvider, + MockWorkflowLogProviders, + randomLogProviderThatDoesntExist, +} from '../../__fixtures__/mockProviders'; +import { WorkflowLogsProvidersRegistry } from './WorkflowLogsProvidersRegistry'; + +describe('WorkflowLogsProviderRegistry', () => { + let registry: WorkflowLogsProvidersRegistry; + + beforeEach(() => { + registry = new WorkflowLogsProvidersRegistry(); + }); + // listProviders + describe('register providers', () => { + it('should register log providers with different IDs successfully', () => { + expect(() => registry.register(lokiLogProvider)).not.toThrow(); + expect(() => + registry.register(randomLogProviderThatDoesntExist), + ).not.toThrow(); + }); + + it('should throw a ConflictError when registring providers with duplicate names', () => { + const provider1 = new MockWorkflowLogProviders('loki', 'url'); + const provider2 = new MockWorkflowLogProviders('loki', 'url'); + + registry.register(provider1); + expect(() => registry.register(provider2)).toThrow( + new ConflictError( + 'Workflow Log Provider with ID loki has already been registered', + ), + ); + }); + }); + + describe('getProvider', () => { + it('should return provider for registered provider', () => { + registry.register(lokiLogProvider); + const provider = registry.getProvider('loki'); + expect(provider).toEqual(lokiLogProvider); + }); + + it('should throw NotFoundError for unregistered provider', () => { + expect(() => registry.getProvider('nope')).toThrow( + new NotFoundError( + "Workflow Log Provider with ID 'nope' is not registered", + ), + ); + }); + }); + + describe('listProviders', () => { + it('should return an empty array when no providers are registered', () => { + const providers = registry.listProviders(); + expect(providers).toEqual([]); + }); + + it('should return all registered providers', () => { + registry.register(lokiLogProvider); + registry.register(randomLogProviderThatDoesntExist); + + const providers = registry.listProviders(); + + expect(providers).toHaveLength(2); + expect(providers).toContain(lokiLogProvider); + expect(providers).toContain(randomLogProviderThatDoesntExist); + }); + }); +}); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts index 1ad5565ea3..856b315c1d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ConflictError } from '@backstage/errors'; +import { ConflictError, NotFoundError } from '@backstage/errors'; import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; @@ -38,6 +38,12 @@ export class WorkflowLogsProvidersRegistry { } getProvider(providerId: string): WorkflowLogProvider | undefined { + const provider = this.workfLogsProviders.get(providerId); + if (!provider) { + throw new NotFoundError( + `Workflow Log Provider with ID \'${providerId}\' is not registered`, + ); + } return this.workfLogsProviders.get(providerId); } } From 83039d34b9ef0a3433218ca4e90207fde25b02cf Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 14:48:53 -0500 Subject: [PATCH 34/52] squash: fixing tests --- .../orchestrator-backend/__fixtures__/mockProviders.ts | 4 ++-- .../src/providers/WorkflowLogsProviderRegistry.test.ts | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts index 645538d474..1a8b666c38 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts @@ -40,10 +40,10 @@ export class MockWorkflowLogProviders implements WorkflowLogProvider { export const lokiLogProvider = new MockWorkflowLogProviders( 'loki', - 'http://localhost:9092', + 'https://loki', ); export const randomLogProviderThatDoesntExist = new MockWorkflowLogProviders( 'random', - 'http://localhost:random', + 'https://random', ); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts index ec6a57f8e5..8229abe4fb 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProviderRegistry.test.ts @@ -36,6 +36,16 @@ describe('WorkflowLogsProviderRegistry', () => { expect(() => registry.register(randomLogProviderThatDoesntExist), ).not.toThrow(); + expect(registry.listProviders()).toEqual([ + { + providerId: 'loki', + baseURL: 'https://loki', + }, + { + providerId: 'random', + baseURL: 'https://random', + }, + ]); }); it('should throw a ConflictError when registring providers with duplicate names', () => { From 11c8feea51970f6996fa44462ab9fb7d559eb157 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 14:54:02 -0500 Subject: [PATCH 35/52] squash: fixes --- .../src/workflowLogsProviders/LokiProvider.ts | 2 -- .../src/providers/WorkflowLogsProvidersRegistry.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index e2c59ebfc9..6e0936b5f8 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -26,8 +26,6 @@ export class LokiProvider implements WorkflowLogProvider { private readonly baseURL: string; private readonly selectors: any; private constructor(config: Config) { - // TODO: will probably also need information regarding auth tokens and stuff for loki - // Might Also make sense to separate out the loki http stuff to its own "client" this.baseURL = config.getString('baseUrl'); this.selectors = config.getOptional('logStreamSelectors') || []; } diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts index 856b315c1d..7eaddd825e 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/providers/WorkflowLogsProvidersRegistry.ts @@ -41,7 +41,7 @@ export class WorkflowLogsProvidersRegistry { const provider = this.workfLogsProviders.get(providerId); if (!provider) { throw new NotFoundError( - `Workflow Log Provider with ID \'${providerId}\' is not registered`, + `Workflow Log Provider with ID '${providerId}' is not registered`, ); } return this.workfLogsProviders.get(providerId); From 495ecd23847f72bcef7beb049a2002704cf9c278 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 15:46:29 -0500 Subject: [PATCH 36/52] squash: tests --- .../LokiProvider.test.ts | 56 +++++++++++++++---- .../src/workflowLogsProviders/LokiProvider.ts | 7 ++- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts index 7d69c9563d..9f35dde9c3 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts @@ -21,10 +21,6 @@ import mockWorkflowLog from '../../__fixtures__/mockWorkflowLogs'; describe('LokiProvider', () => { describe('FromConfig', () => { - it('should do something when nothing in the app-config or it is configured wrong', () => { - // TODO - expect(true).toEqual(true); - }); it('should create a provider when there is an entry in the app-config', () => { const lokiAppConfig = { orchestrator: { @@ -89,9 +85,6 @@ describe('LokiProvider', () => { beforeEach(() => { jest.clearAllMocks(); }); - it('should be somthing wrong', async () => { - // TODO - }); it('should pass with defaults', async () => { const mockResponse: Partial = { ok: true, @@ -121,7 +114,7 @@ describe('LokiProvider', () => { }; const urlToFetch = - 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; const workflowLogs = await provider.fetchWorkflowLogsByIntance(workflowInstance); @@ -129,7 +122,9 @@ describe('LokiProvider', () => { expect(fetch).toHaveBeenCalledWith(urlToFetch); expect(parsedURLToFetch.origin).toEqual(provider.getBaseURL()); expect(parsedURLToFetch.pathname).toEqual('/loki/api/v1/query_range'); - expect(parsedURLToFetch.searchParams.get('end')).toEqual(''); + expect(parsedURLToFetch.searchParams.get('end')).toEqual( + '2026-01-03T16:35:13.621Z', + ); expect(parsedURLToFetch.searchParams.get('start')).toEqual( '2025-12-05T16:30:13.621Z', ); // should be 5 minutes before @@ -146,6 +141,45 @@ describe('LokiProvider', () => { expect(workflowLogs.logs[0].id).toEqual('1764952546327102000'); }); + it('should have an enddate that had 5 minutes added to it', async () => { + const mockResponse: Partial = { + ok: true, + status: 200, + json: jest.fn().mockResolvedValue(mockWorkflowLog), + }; + global.fetch = jest.fn().mockResolvedValue(mockResponse as any); + + const lokiAppConfig = { + orchestrator: { + workflowLogProvider: { + loki: { + baseUrl: 'http://localhost:3100', + }, + }, + }, + }; + + const lokiConfig = new ConfigReader(lokiAppConfig); + const provider = LokiProvider.fromConfig(lokiConfig); + const workflowInstance: ProcessInstanceDTO = { + id: '12345', + processId: '54321', + start: '2025-12-05T16:35:13.621Z', + end: '2025-12-05T17:35:13.621Z', + nodes: [], + }; + + const urlToFetch = + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2025-12-05T17%3A40%3A13.621Z'; + + await provider.fetchWorkflowLogsByIntance(workflowInstance); + const parsedURLToFetch = new URL(urlToFetch); + expect(fetch).toHaveBeenCalledWith(urlToFetch); + expect(parsedURLToFetch.searchParams.get('end')).toEqual( + '2025-12-05T17:40:13.621Z', + ); // Should be 5 minutes after + }); + it('should have a custom log selector and filter', async () => { const mockResponse: Partial = { ok: true, @@ -185,7 +219,7 @@ describe('LokiProvider', () => { }; const urlToFetch = - 'http://localhost:3100/loki/api/v1/query_range?query=%7Bcustom-selector%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bcustom-selector%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; await provider.fetchWorkflowLogsByIntance(workflowInstance); @@ -235,7 +269,7 @@ describe('LokiProvider', () => { }; const urlToFetch = - 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end='; + 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; await provider.fetchWorkflowLogsByIntance(workflowInstance); const parsedURLToFetch = new URL(urlToFetch); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 6e0936b5f8..7d633ea839 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -50,11 +50,16 @@ export class LokiProvider implements WorkflowLogProvider { }) .minus({ minutes: 5 }) .toISO(); + // Loki queries time range can't exceeds the limit (query length: 959h37m33.575s, limit: 30d1h) + // If there is no end date specified, then just add 29 days to the start date + // Assume that if there is an end date the range between start and end isn't more than 30 days const endTime = instance.end ? DateTime.fromISO(instance.end as string, { setZone: true }) .plus({ minutes: 5 }) .toISO() - : ''; + : DateTime.fromISO(instance.start as string, { setZone: true }) + .plus({ days: 29 }) + .toISO(); const lokiApiEndpoint = '/loki/api/v1/query_range'; // Query is created with a log stream selector and then a log pipeline for more filtering // format looks like this: {stream-selector=expression} | log pipeline/log filter expression From 75b5fd08bb67573e80ad877a59ef01d4e8d7f857 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 15:54:59 -0500 Subject: [PATCH 37/52] squash: update yarn.lock after the rebase --- workspaces/orchestrator/yarn.lock | 55 +++++++++++++++++-------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/workspaces/orchestrator/yarn.lock b/workspaces/orchestrator/yarn.lock index 62e0b7a409..f9c836b38d 100644 --- a/workspaces/orchestrator/yarn.lock +++ b/workspaces/orchestrator/yarn.lock @@ -2927,16 +2927,16 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-plugin-api@npm:^1.5.0": - version: 1.5.0 - resolution: "@backstage/backend-plugin-api@npm:1.5.0" +"@backstage/backend-plugin-api@npm:^1.4.4, @backstage/backend-plugin-api@npm:^1.5.0, @backstage/backend-plugin-api@npm:^1.6.0": + version: 1.6.0 + resolution: "@backstage/backend-plugin-api@npm:1.6.0" dependencies: - "@backstage/cli-common": ^0.1.15 + "@backstage/cli-common": ^0.1.16 "@backstage/config": ^1.3.6 "@backstage/errors": ^1.2.7 - "@backstage/plugin-auth-node": ^0.6.9 + "@backstage/plugin-auth-node": ^0.6.10 "@backstage/plugin-permission-common": ^0.9.3 - "@backstage/plugin-permission-node": ^0.10.6 + "@backstage/plugin-permission-node": ^0.10.7 "@backstage/types": ^1.2.2 "@types/express": ^4.17.6 "@types/json-schema": ^7.0.6 @@ -2945,7 +2945,7 @@ __metadata: knex: ^3.0.0 luxon: ^3.0.0 zod: ^3.22.4 - checksum: 2994e06a6833178da5c6eaea33889102f654bbaf73c3915af4b19f117f615a74c7d44d7458165c45add32d14455ad2ebbd35d93330181d945049b936724d6932 + checksum: 547bbef0db45cbc3ff2ddeaf19c8358ea537ebc62632fbe8413742a441896371970a2f4d56245f1f66eed204636f294e6c51cc3cc1ed669b18c44be616bdbe51 languageName: node linkType: hard @@ -3013,10 +3013,15 @@ __metadata: languageName: node linkType: hard -"@backstage/cli-common@npm:^0.1.15": - version: 0.1.15 - resolution: "@backstage/cli-common@npm:0.1.15" - checksum: fbfded2ff0122c28c2104fa40703486c0fe5c43acd68de2659533d46ebc11f296a06c45499d0ced1579a75ee6002739d2cb90f08fe2587e887d79b82d4f91515 +"@backstage/cli-common@npm:^0.1.15, @backstage/cli-common@npm:^0.1.16": + version: 0.1.16 + resolution: "@backstage/cli-common@npm:0.1.16" + dependencies: + "@backstage/errors": ^1.2.7 + cross-spawn: ^7.0.3 + global-agent: ^3.0.0 + undici: ^7.2.3 + checksum: 8fba4579aa834a22786df220985a90ef68308c3be9a5ee89b416d69aec4e575551192eb4936175c858bb45418a3c9a6b269742c42798bc39cd00bcb051eabe67 languageName: node linkType: hard @@ -3776,11 +3781,11 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-auth-node@npm:^0.6.9": - version: 0.6.9 - resolution: "@backstage/plugin-auth-node@npm:0.6.9" +"@backstage/plugin-auth-node@npm:^0.6.10, @backstage/plugin-auth-node@npm:^0.6.9": + version: 0.6.10 + resolution: "@backstage/plugin-auth-node@npm:0.6.10" dependencies: - "@backstage/backend-plugin-api": ^1.5.0 + "@backstage/backend-plugin-api": ^1.6.0 "@backstage/catalog-client": ^1.12.1 "@backstage/catalog-model": ^1.7.6 "@backstage/config": ^1.3.6 @@ -3788,14 +3793,14 @@ __metadata: "@backstage/types": ^1.2.2 "@types/express": ^4.17.6 "@types/passport": ^1.0.3 - express: ^4.17.1 + express: ^4.22.0 jose: ^5.0.0 lodash: ^4.17.21 passport: ^0.7.0 zod: ^3.22.4 zod-to-json-schema: ^3.21.4 zod-validation-error: ^3.4.0 - checksum: a69d61db47ef088daa25d2bfd134c6225235bee4277cec4fa22befb13d1a40fa50f8481432edb9a7f3601e20c15fa31b894184ff1875331d42f281b170076e87 + checksum: d94c2e6652ea3e05dc7899c3c94b6293950f067bd9c4dcf71072e6d3f754043448248e2805e6145a06ea5f7abcb6036249e4324c22af6456282a827f6dbf673e languageName: node linkType: hard @@ -4341,21 +4346,21 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-permission-node@npm:^0.10.6": - version: 0.10.6 - resolution: "@backstage/plugin-permission-node@npm:0.10.6" +"@backstage/plugin-permission-node@npm:^0.10.6, @backstage/plugin-permission-node@npm:^0.10.7": + version: 0.10.7 + resolution: "@backstage/plugin-permission-node@npm:0.10.7" dependencies: - "@backstage/backend-plugin-api": ^1.5.0 + "@backstage/backend-plugin-api": ^1.6.0 "@backstage/config": ^1.3.6 "@backstage/errors": ^1.2.7 - "@backstage/plugin-auth-node": ^0.6.9 + "@backstage/plugin-auth-node": ^0.6.10 "@backstage/plugin-permission-common": ^0.9.3 "@types/express": ^4.17.6 - express: ^4.17.1 + express: ^4.22.0 express-promise-router: ^4.1.0 zod: ^3.22.4 zod-to-json-schema: ^3.20.4 - checksum: b29c79b3d563fb2712767e50a8e0a026257df88acbeb260d666c7062fe007ea4174f142b305b6e63f159f85f20b6603bcf2df53fdd46573702df9e3b3174dcff + checksum: 645e3a2278885dab0f642ce48139cdf20df45b195e604905092e158e42827b0517d69d7f0f98a9cfbd738d7482727cc0b1bc34a79e86f95ff60f85b0d008f4f3 languageName: node linkType: hard @@ -22676,7 +22681,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.2, express@npm:^4.21.2": +"express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.2, express@npm:^4.21.2, express@npm:^4.22.0": version: 4.22.1 resolution: "express@npm:4.22.1" dependencies: From 2e34ceef580fbf5ab1191d574c09d695caeaa08f Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 14 Jan 2026 16:05:06 -0500 Subject: [PATCH 38/52] squash: fix tsc errors --- .../plugins/orchestrator-backend/__fixtures__/mockProviders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts index 1a8b666c38..c4d9066417 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts @@ -32,7 +32,7 @@ export class MockWorkflowLogProviders implements WorkflowLogProvider { return this.baseURL; } fetchWorkflowLogsByIntance( - workflowInstance: ProcessInstanceDTO, + _workflowInstance: ProcessInstanceDTO, ): Promise { throw new Error('Method not implemented.'); } From f4e3325b2f843366d33990ee92ece65e43d03533 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 10:46:11 -0500 Subject: [PATCH 39/52] squash: fixing resolutions --- workspaces/orchestrator/package.json | 3 ++- workspaces/orchestrator/yarn.lock | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/workspaces/orchestrator/package.json b/workspaces/orchestrator/package.json index 1c6097b1e6..235b4f52af 100644 --- a/workspaces/orchestrator/package.json +++ b/workspaces/orchestrator/package.json @@ -55,7 +55,8 @@ "react": "^18", "react-dom": "^18", "refractor@npm:3.6.0/prismjs": "^1.30.0", - "zod-to-json-schema": "3.24.6" + "zod-to-json-schema": "3.24.6", + "@backstage/backend-plugin-api": "1.5.0" }, "prettier": "@backstage/cli/config/prettier", "lint-staged": { diff --git a/workspaces/orchestrator/yarn.lock b/workspaces/orchestrator/yarn.lock index f9c836b38d..3902764352 100644 --- a/workspaces/orchestrator/yarn.lock +++ b/workspaces/orchestrator/yarn.lock @@ -2927,16 +2927,16 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-plugin-api@npm:^1.4.4, @backstage/backend-plugin-api@npm:^1.5.0, @backstage/backend-plugin-api@npm:^1.6.0": - version: 1.6.0 - resolution: "@backstage/backend-plugin-api@npm:1.6.0" +"@backstage/backend-plugin-api@npm:1.5.0": + version: 1.5.0 + resolution: "@backstage/backend-plugin-api@npm:1.5.0" dependencies: - "@backstage/cli-common": ^0.1.16 + "@backstage/cli-common": ^0.1.15 "@backstage/config": ^1.3.6 "@backstage/errors": ^1.2.7 - "@backstage/plugin-auth-node": ^0.6.10 + "@backstage/plugin-auth-node": ^0.6.9 "@backstage/plugin-permission-common": ^0.9.3 - "@backstage/plugin-permission-node": ^0.10.7 + "@backstage/plugin-permission-node": ^0.10.6 "@backstage/types": ^1.2.2 "@types/express": ^4.17.6 "@types/json-schema": ^7.0.6 @@ -2945,7 +2945,7 @@ __metadata: knex: ^3.0.0 luxon: ^3.0.0 zod: ^3.22.4 - checksum: 547bbef0db45cbc3ff2ddeaf19c8358ea537ebc62632fbe8413742a441896371970a2f4d56245f1f66eed204636f294e6c51cc3cc1ed669b18c44be616bdbe51 + checksum: 2994e06a6833178da5c6eaea33889102f654bbaf73c3915af4b19f117f615a74c7d44d7458165c45add32d14455ad2ebbd35d93330181d945049b936724d6932 languageName: node linkType: hard @@ -3013,7 +3013,7 @@ __metadata: languageName: node linkType: hard -"@backstage/cli-common@npm:^0.1.15, @backstage/cli-common@npm:^0.1.16": +"@backstage/cli-common@npm:^0.1.15": version: 0.1.16 resolution: "@backstage/cli-common@npm:0.1.16" dependencies: @@ -4346,7 +4346,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-permission-node@npm:^0.10.6, @backstage/plugin-permission-node@npm:^0.10.7": +"@backstage/plugin-permission-node@npm:^0.10.6": version: 0.10.7 resolution: "@backstage/plugin-permission-node@npm:0.10.7" dependencies: From d8aa1e293f88aa4315d1626644e3ee014dc87f40 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 11:07:15 -0500 Subject: [PATCH 40/52] squash: fix issue with starting when we just want the defaults --- .../packages/backend/src/index.ts | 24 ++++++++++++++----- .../src/service/router.ts | 9 +++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/workspaces/orchestrator/packages/backend/src/index.ts b/workspaces/orchestrator/packages/backend/src/index.ts index 693fb13c66..0a439431e2 100644 --- a/workspaces/orchestrator/packages/backend/src/index.ts +++ b/workspaces/orchestrator/packages/backend/src/index.ts @@ -75,10 +75,22 @@ backend.add(import('@backstage/plugin-scaffolder-backend-module-gitlab')); // custom authentication provider module backend.add(import('custom-authentication-provider-module-backend')); -// orchestrator Log Provider -backend.add( - import( - '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' - ), -); +// orchestrator Log Provider, uncomment to use +// If using this, make sure to add something similar to the below in the app-config +/* +``` +orchestrator: + workflowLogProvider: + loki: + baseUrl: http://localhost:3100 + # logStreamSelectors: + # - label: 'app' + # value: '=~".+"' +``` +*/ +// backend.add( +// import( +// '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' +// ), +// ); backend.start(); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 60df30b818..8ef2c0620f 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -273,8 +273,13 @@ function initPublicServices( // Probablt define that WorkflowLoggerService Class/type in the common or perhaps that -node package // Get the orchestrator logging config // Create that workflow logging class/interface instance here - const workflowLogProvider: WorkflowLogProvider | undefined = - workflowLogsProvidersRegistry.getProvider('loki'); + const isWorkflowLogProviderAdded = config.getOptional( + 'orchestrator.workflowLogProvider', + ); + let workflowLogProvider; + if (isWorkflowLogProviderAdded) { + workflowLogProvider = workflowLogsProvidersRegistry.getProvider('loki'); + } const orchestratorService = new OrchestratorService( sonataFlowService, From f4e101cf85b1be0d73686244b3efd5d121c84183 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 11:15:03 -0500 Subject: [PATCH 41/52] squash: fix tsc error --- .../plugins/orchestrator-backend/src/service/router.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index 8ef2c0620f..a68760c1f0 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -53,7 +53,6 @@ import { orchestratorWorkflowUseSpecificPermission, WorkflowOverviewListResultDTO, } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common'; -import { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; import { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry'; import { RouterOptions } from '../routerWrapper'; From 5da89ed9ed0fcaf076784a692d61e0a2ac829c7e Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 14:17:59 -0500 Subject: [PATCH 42/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../src/workflowLogsProviders/LokiProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 7d633ea839..69b6691970 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -44,7 +44,7 @@ export class LokiProvider implements WorkflowLogProvider { async fetchWorkflowLogsByIntance( instance: ProcessInstanceDTO, ): Promise { - // Becuase of timing issues, subtract 5 mintues from the start and add 5 minutes to the end + // Because of timing issues, subtract 5 mintues from the start and add 5 minutes to the end const startTime = DateTime.fromISO(instance.start as string, { setZone: true, }) From 2d643534c9a9a98832a66a972a2f2f2c64c13356 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 14:18:58 -0500 Subject: [PATCH 43/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../src/workflowLogsProviders/LokiProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 69b6691970..22e459caa2 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -77,7 +77,7 @@ export class LokiProvider implements WorkflowLogProvider { index: number, arr: string | any[], ) => { - // somehting about that last comma + // something about that last comma streamSelector += `${entry.label || 'service_name'}${entry.value || '=~".+"'}${index !== arr.length - 1 ? ',' : ''}`; }, ); From beeb16c507efa66bdbd819fda7ffdab26873526a Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Jan 2026 14:27:33 -0500 Subject: [PATCH 44/52] squash: spelling changes --- .../src/workflowLogsProviders/LokiProvider.test.ts | 10 +++++----- .../src/workflowLogsProviders/LokiProvider.ts | 2 +- .../orchestrator-backend/__fixtures__/mockProviders.ts | 2 +- .../src/service/OrchestratorService.ts | 2 +- .../plugins/orchestrator-node/report.api.md | 4 ++-- .../orchestrator-node/src/api/WorkflowLogProvider.ts | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts index 9f35dde9c3..bacb1fdd31 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.test.ts @@ -81,7 +81,7 @@ describe('LokiProvider', () => { ); }); }); - describe('fetchWorkflowLogsByIntance', () => { + describe('fetchWorkflowLogsByInstance', () => { beforeEach(() => { jest.clearAllMocks(); }); @@ -116,7 +116,7 @@ describe('LokiProvider', () => { const urlToFetch = 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; const workflowLogs = - await provider.fetchWorkflowLogsByIntance(workflowInstance); + await provider.fetchWorkflowLogsByInstance(workflowInstance); const parsedURLToFetch = new URL(urlToFetch); expect(fetch).toHaveBeenCalledWith(urlToFetch); @@ -172,7 +172,7 @@ describe('LokiProvider', () => { const urlToFetch = 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2025-12-05T17%3A40%3A13.621Z'; - await provider.fetchWorkflowLogsByIntance(workflowInstance); + await provider.fetchWorkflowLogsByInstance(workflowInstance); const parsedURLToFetch = new URL(urlToFetch); expect(fetch).toHaveBeenCalledWith(urlToFetch); expect(parsedURLToFetch.searchParams.get('end')).toEqual( @@ -221,7 +221,7 @@ describe('LokiProvider', () => { const urlToFetch = 'http://localhost:3100/loki/api/v1/query_range?query=%7Bcustom-selector%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; - await provider.fetchWorkflowLogsByIntance(workflowInstance); + await provider.fetchWorkflowLogsByInstance(workflowInstance); const parsedURLToFetch = new URL(urlToFetch); expect(fetch).toHaveBeenCalledWith(urlToFetch); @@ -271,7 +271,7 @@ describe('LokiProvider', () => { const urlToFetch = 'http://localhost:3100/loki/api/v1/query_range?query=%7Bservice_name%3D%7E%22.%2B%22%2Ccustom-selector1%3D%7E%22.%2B%22%7D+%7C%3D%2212345%22&start=2025-12-05T16%3A30%3A13.621Z&end=2026-01-03T16%3A35%3A13.621Z'; - await provider.fetchWorkflowLogsByIntance(workflowInstance); + await provider.fetchWorkflowLogsByInstance(workflowInstance); const parsedURLToFetch = new URL(urlToFetch); expect(fetch).toHaveBeenCalledWith(urlToFetch); expect(parsedURLToFetch.origin).toEqual(provider.getBaseURL()); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts index 22e459caa2..70f915bc1c 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/workflowLogsProviders/LokiProvider.ts @@ -41,7 +41,7 @@ export class LokiProvider implements WorkflowLogProvider { return this.selectors; } - async fetchWorkflowLogsByIntance( + async fetchWorkflowLogsByInstance( instance: ProcessInstanceDTO, ): Promise { // Because of timing issues, subtract 5 mintues from the start and add 5 minutes to the end diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts index c4d9066417..8dcab88c2a 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/__fixtures__/mockProviders.ts @@ -31,7 +31,7 @@ export class MockWorkflowLogProviders implements WorkflowLogProvider { getBaseURL(): string { return this.baseURL; } - fetchWorkflowLogsByIntance( + fetchWorkflowLogsByInstance( _workflowInstance: ProcessInstanceDTO, ): Promise { throw new Error('Method not implemented.'); diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts index 7f279dd7b4..86b7edba19 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/OrchestratorService.ts @@ -178,7 +178,7 @@ export class OrchestratorService { public async fetchWorkflowLogsByInstance(args: { instance: ProcessInstanceDTO; }): Promise { - return this.workflowLogProvider?.fetchWorkflowLogsByIntance( + return this.workflowLogProvider?.fetchWorkflowLogsByInstance( args.instance, ) as WorkflowLogsResponse; } diff --git a/workspaces/orchestrator/plugins/orchestrator-node/report.api.md b/workspaces/orchestrator/plugins/orchestrator-node/report.api.md index 474ce436fd..1925582852 100644 --- a/workspaces/orchestrator/plugins/orchestrator-node/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator-node/report.api.md @@ -11,7 +11,7 @@ import { WorkflowLogsResponse } from '@red-hat-developer-hub/backstage-plugin-or // @public (undocumented) export interface WorkflowLogProvider { // (undocumented) - fetchWorkflowLogsByIntance(workflowInstance: ProcessInstanceDTO): Promise; + fetchWorkflowLogsByInstance(workflowInstance: ProcessInstanceDTO): Promise; // (undocumented) getBaseURL(): string; // (undocumented) @@ -32,7 +32,7 @@ export interface WorkflowLogsExtensionPoint { // src/api/WorkflowLogProvider.d.ts:5:1 - (ae-undocumented) Missing documentation for "WorkflowLogProvider". // src/api/WorkflowLogProvider.d.ts:6:5 - (ae-undocumented) Missing documentation for "getProviderId". // src/api/WorkflowLogProvider.d.ts:7:5 - (ae-undocumented) Missing documentation for "getBaseURL". -// src/api/WorkflowLogProvider.d.ts:8:5 - (ae-undocumented) Missing documentation for "fetchWorkflowLogsByIntance". +// src/api/WorkflowLogProvider.d.ts:8:5 - (ae-undocumented) Missing documentation for "fetchWorkflowLogsByInstance". // src/extensions.d.ts:5:1 - (ae-undocumented) Missing documentation for "WorkflowLogsExtensionPoint". // src/extensions.d.ts:6:5 - (ae-undocumented) Missing documentation for "addWorkflowLogProvider". // src/extensions.d.ts:11:22 - (ae-undocumented) Missing documentation for "workflowLogsExtensionEndpoint". diff --git a/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts index a2d3dabf7d..e96bf56602 100644 --- a/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts +++ b/workspaces/orchestrator/plugins/orchestrator-node/src/api/WorkflowLogProvider.ts @@ -25,7 +25,7 @@ import { export interface WorkflowLogProvider { getProviderId(): string; getBaseURL(): string; - fetchWorkflowLogsByIntance( + fetchWorkflowLogsByInstance( workflowInstance: ProcessInstanceDTO, ): Promise; } From b00be991619388f72c1237b8243bdf917806556c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 06:58:04 -0500 Subject: [PATCH 45/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../plugins/orchestrator-backend/src/service/router.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts index a68760c1f0..c843f9856c 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend/src/service/router.ts @@ -268,10 +268,6 @@ function initPublicServices( ); workflowCacheService.schedule({ scheduler: scheduler }); - // All the workflow logging related stuff should be moved to their respective backend module - // Probablt define that WorkflowLoggerService Class/type in the common or perhaps that -node package - // Get the orchestrator logging config - // Create that workflow logging class/interface instance here const isWorkflowLogProviderAdded = config.getOptional( 'orchestrator.workflowLogProvider', ); From 064509e0b336c7fa7ec3b2e5b935f7b43e18d9d6 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:49:21 -0500 Subject: [PATCH 46/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../plugins/orchestrator-backend-module-loki/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index a7aad7c480..f87b91bdbd 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@backstage/backend-test-utils": "^1.9.1", - "@backstage/cli": "^0.34.4", + "@backstage/cli": "^0.34.5", "@backstage/config": "^1.3.6" }, "files": [ From 0b976110db0c1d46aeaa1423d8a16e1c74b8d719 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:50:38 -0500 Subject: [PATCH 47/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../plugins/orchestrator-backend-module-loki/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index f87b91bdbd..df134fc742 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -37,7 +37,7 @@ "prettier:fix": "prettier --ignore-unknown --write ." }, "dependencies": { - "@backstage/backend-plugin-api": "^1.4.4", + "@backstage/backend-plugin-api": "^1.5.0", "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^", "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^", "luxon": "^3.7.2" From 189201de8da1e64ec3f44f79b622dbb15295958c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:51:07 -0500 Subject: [PATCH 48/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../plugins/orchestrator-backend-module-loki/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json index df134fc742..59995dbc4a 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/package.json @@ -43,7 +43,7 @@ "luxon": "^3.7.2" }, "devDependencies": { - "@backstage/backend-test-utils": "^1.9.1", + "@backstage/backend-test-utils": "^1.10.0", "@backstage/cli": "^0.34.5", "@backstage/config": "^1.3.6" }, From 5e3be73d9dc9137076faf6273e51fad235c9c63b Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:52:00 -0500 Subject: [PATCH 49/52] squash: Update workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../plugins/orchestrator-backend-module-loki/src/module.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts index 2555341ca1..1bc6624772 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/src/module.ts @@ -19,7 +19,12 @@ import { } from '@backstage/backend-plugin-api'; import { workflowLogsExtensionEndpoint } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node'; import { LokiProvider } from './workflowLogsProviders/LokiProvider'; +/** + * Provides access to the Loki log provider for viewing Orchestrator workflow logs + * + * @public + */ export const orchestratorModuleLoki = createBackendModule({ pluginId: 'orchestrator', moduleId: 'loki', From 5ea51403052a48e9ab038ae978497ff2e2296289 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:53:03 -0500 Subject: [PATCH 50/52] squash: Update workspaces/orchestrator/packages/backend/src/index.ts Co-authored-by: Dominika Zemanovicova <36102317+dzemanov@users.noreply.github.com> --- .../packages/backend/src/index.ts | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/workspaces/orchestrator/packages/backend/src/index.ts b/workspaces/orchestrator/packages/backend/src/index.ts index 0a439431e2..70d7f1cb00 100644 --- a/workspaces/orchestrator/packages/backend/src/index.ts +++ b/workspaces/orchestrator/packages/backend/src/index.ts @@ -75,22 +75,9 @@ backend.add(import('@backstage/plugin-scaffolder-backend-module-gitlab')); // custom authentication provider module backend.add(import('custom-authentication-provider-module-backend')); -// orchestrator Log Provider, uncomment to use -// If using this, make sure to add something similar to the below in the app-config -/* -``` -orchestrator: - workflowLogProvider: - loki: - baseUrl: http://localhost:3100 - # logStreamSelectors: - # - label: 'app' - # value: '=~".+"' -``` -*/ -// backend.add( -// import( -// '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' -// ), -// ); +backend.add( + import( + '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki' + ), +); backend.start(); From 3e83f9e5ca25c09a8e4e73cfcc54fc539403fcdf Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 08:55:00 -0500 Subject: [PATCH 51/52] squash: updating yarn.lock after dep updates --- workspaces/orchestrator/yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/orchestrator/yarn.lock b/workspaces/orchestrator/yarn.lock index 3902764352..6b05b20133 100644 --- a/workspaces/orchestrator/yarn.lock +++ b/workspaces/orchestrator/yarn.lock @@ -2949,7 +2949,7 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-test-utils@npm:^1.10.0, @backstage/backend-test-utils@npm:^1.9.1": +"@backstage/backend-test-utils@npm:^1.10.0": version: 1.10.0 resolution: "@backstage/backend-test-utils@npm:1.10.0" dependencies: @@ -12420,9 +12420,9 @@ __metadata: version: 0.0.0-use.local resolution: "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki@workspace:plugins/orchestrator-backend-module-loki" dependencies: - "@backstage/backend-plugin-api": ^1.4.4 - "@backstage/backend-test-utils": ^1.9.1 - "@backstage/cli": ^0.34.4 + "@backstage/backend-plugin-api": ^1.5.0 + "@backstage/backend-test-utils": ^1.10.0 + "@backstage/cli": ^0.34.5 "@backstage/config": ^1.3.6 "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "workspace:^" "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "workspace:^" From 28c976f64c2e209beb84bcb754215e528edaa4ca Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Fri, 16 Jan 2026 09:06:20 -0500 Subject: [PATCH 52/52] squash: regenerate report --- .../orchestrator-backend-module-loki/report.api.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md index 46642424c9..4a68f9763d 100644 --- a/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md +++ b/workspaces/orchestrator/plugins/orchestrator-backend-module-loki/report.api.md @@ -6,14 +6,8 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; -// Warning: (ae-missing-release-tag) "orchestratorModuleLoki" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public const orchestratorModuleLoki: BackendFeature; export default orchestratorModuleLoki; -// Warnings were encountered during analysis: -// -// src/module.d.ts:1:22 - (ae-undocumented) Missing documentation for "orchestratorModuleLoki". - ```